From 3c9fc2e8aa6dba6993dc0907d042232ed898e2b1 Mon Sep 17 00:00:00 2001 From: "D. J. Hagberg" Date: Fri, 15 May 2020 13:31:16 -0600 Subject: [PATCH 1/4] Update dependencies to latest available versions as of May 2020 --- .snyk | 8 + build/jsforce-api-analytics.min.js | 2 +- build/jsforce-api-analytics.min.js.map | 2 +- build/jsforce-api-apex.js | 9 +- build/jsforce-api-apex.min.js | 2 +- build/jsforce-api-apex.min.js.map | 2 +- build/jsforce-api-bulk.min.js | 2 +- build/jsforce-api-bulk.min.js.map | 2 +- build/jsforce-api-chatter.js | 6 +- build/jsforce-api-chatter.min.js | 2 +- build/jsforce-api-chatter.min.js.map | 2 +- build/jsforce-api-metadata.js | 155 +- build/jsforce-api-metadata.min.js | 10 +- build/jsforce-api-metadata.min.js.map | 2 +- build/jsforce-api-soap.min.js | 2 +- build/jsforce-api-soap.min.js.map | 2 +- build/jsforce-api-streaming.js | 4 +- build/jsforce-api-streaming.min.js | 3 +- build/jsforce-api-streaming.min.js.map | 2 +- build/jsforce-api-tooling.min.js | 2 +- build/jsforce-api-tooling.min.js.map | 2 +- build/jsforce-core.js | 13874 ++++++++++++++-------- build/jsforce-core.min.js | 27 +- build/jsforce-core.min.js.map | 2 +- build/jsforce.js | 13893 +++++++++++++++-------- build/jsforce.min.js | 29 +- build/jsforce.min.js.map | 2 +- gulpfile.babel.js | 4 +- lib/VERSION.js | 2 +- lib/cli/cli.js | 2 +- package-lock.json | 9832 +++++++++++----- package.json | 68 +- 32 files changed, 25143 insertions(+), 12815 deletions(-) create mode 100644 .snyk diff --git a/.snyk b/.snyk new file mode 100644 index 00000000..76b6139e --- /dev/null +++ b/.snyk @@ -0,0 +1,8 @@ +# Snyk (https://snyk.io) policy file, patches or ignores known vulnerabilities. +version: v1.14.1 +ignore: {} +# patches apply the minimum changes required to fix a vulnerability +patch: + SNYK-JS-LODASH-567746: + - lodash: + patched: '2020-05-11T20:10:49.155Z' diff --git a/build/jsforce-api-analytics.min.js b/build/jsforce-api-analytics.min.js index 0891445a..b53d71e3 100644 --- a/build/jsforce-api-analytics.min.js +++ b/build/jsforce-api-analytics.min.js @@ -1,2 +1,2 @@ -!function(t){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var n;n="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,n=n.jsforce||(n.jsforce={}),n=n.modules||(n.modules={}),n=n.api||(n.api={}),n.Analytics=t()}}(function(){return function(){function t(n,e,o){function r(s,a){if(!e[s]){if(!n[s]){var c="function"==typeof require&&require;if(!a&&c)return c(s,!0);if(i)return i(s,!0);var u=new Error("Cannot find module '"+s+"'");throw u.code="MODULE_NOT_FOUND",u}var l=e[s]={exports:{}};n[s][0].call(l.exports,function(t){var e=n[s][1][t];return r(e||t)},l,l.exports,t,n,e,o)}return e[s].exports}for(var i="function"==typeof require&&require,s=0;s\n */\n\n'use strict';\n\nvar _ = window.jsforce.require('lodash/core'),\n jsforce = window.jsforce.require('./core'),\n Promise = window.jsforce.require('./promise');\n\n/**\n * Report instance to retrieving asynchronously executed result\n *\n * @protected\n * @class Analytics~ReportInstance\n * @param {Analytics~Report} report - Report\n * @param {String} id - Report instance id\n */\nvar ReportInstance = function(report, id) {\n this._report = report;\n this._conn = report._conn;\n this.id = id;\n};\n\n/**\n * Retrieve report result asynchronously executed\n *\n * @method Analytics~ReportInstance#retrieve\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\nReportInstance.prototype.retrieve = function(callback) {\n var conn = this._conn,\n report = this._report;\n var url = [ conn._baseUrl(), \"analytics\", \"reports\", report.id, \"instances\", this.id ].join('/');\n return conn.request(url).thenCall(callback);\n};\n\n/**\n * Report object in Analytics API\n *\n * @protected\n * @class Analytics~Report\n * @param {Connection} conn Connection\n */\nvar Report = function(conn, id) {\n this._conn = conn;\n this.id = id;\n};\n\n/**\n * Describe report metadata\n *\n * @method Analytics~Report#describe\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\nReport.prototype.describe = function(callback) {\n var url = [ this._conn._baseUrl(), \"analytics\", \"reports\", this.id, \"describe\" ].join('/');\n return this._conn.request(url).thenCall(callback);\n};\n\n/**\n * Synonym of Analytics~Report#destroy()\n *\n * @method Analytics~Report#delete\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\n/**\n * Synonym of Analytics~Report#destroy()\n *\n * @method Analytics~Report#del\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\n/**\n * Destroy a report\n *\n * @method Analytics~Report#destroy\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\nReport.prototype[\"delete\"] =\nReport.prototype.del =\nReport.prototype.destroy = function(callback) {\n var url = [ this._conn._baseUrl(), \"analytics\", \"reports\", this.id ].join('/');\n return this._conn.request({method: 'DELETE', url: url}).thenCall(callback);\n};\n\n/**\n * Clones a given report\n *\n * @method Analytics~Report#clone\n * @param {String} name - The name of the new report\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\nReport.prototype.clone = function(name, callback) {\n var url = [ this._conn._baseUrl(), \"analytics\", \"reports\" ].join('/');\n url += \"?cloneId=\" + this.id;\n var data = { reportMetadata: { name: name } };\n var params = { method : 'POST', url: url, headers: { \"Content-Type\" : \"application/json\" }, body: JSON.stringify(data)};\n\n return this._conn.request(params).thenCall(callback);\n};\n\n/**\n * Explain plan for executing report\n *\n * @method Analytics~Report#explain\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\nReport.prototype.explain = function(callback) {\n var url = \"/query/?explain=\" + this.id;\n return this._conn.request(url).thenCall(callback);\n};\n\n\n/**\n * Run report synchronously\n *\n * @method Analytics~Report#execute\n * @param {Object} [options] - Options\n * @param {Boolean} options.details - Flag if include detail in result\n * @param {Analytics~ReportMetadata} options.metadata - Overriding report metadata\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\nReport.prototype.run =\nReport.prototype.exec =\nReport.prototype.execute = function(options, callback) {\n options = options || {};\n if (_.isFunction(options)) {\n callback = options;\n options = {};\n }\n var url = [ this._conn._baseUrl(), \"analytics\", \"reports\", this.id ].join('/');\n url += \"?includeDetails=\" + (options.details ? \"true\" : \"false\");\n var params = { method : options.metadata ? 'POST' : 'GET', url : url };\n if (options.metadata) {\n params.headers = { \"Content-Type\" : \"application/json\" };\n params.body = JSON.stringify(options.metadata);\n }\n return this._conn.request(params).thenCall(callback);\n};\n\n\n/**\n * Run report asynchronously\n *\n * @method Analytics~Report#executeAsync\n * @param {Object} [options] - Options\n * @param {Boolean} options.details - Flag if include detail in result\n * @param {Analytics~ReportMetadata} options.metadata - Overriding report metadata\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\nReport.prototype.executeAsync = function(options, callback) {\n options = options || {};\n if (_.isFunction(options)) {\n callback = options;\n options = {};\n }\n var url = [ this._conn._baseUrl(), \"analytics\", \"reports\", this.id, \"instances\" ].join('/');\n if (options.details) {\n url += \"?includeDetails=true\";\n }\n var params = { method : 'POST', url : url, body: \"\" };\n if (options.metadata) {\n params.headers = { \"Content-Type\" : \"application/json\" };\n params.body = JSON.stringify(options.metadata);\n }\n return this._conn.request(params).thenCall(callback);\n};\n\n/**\n * Get report instance for specified instance ID\n *\n * @method Analytics~Report#instance\n * @param {String} id - Report instance ID\n * @returns {Analytics~ReportInstance}\n */\nReport.prototype.instance = function(id) {\n return new ReportInstance(this, id);\n};\n\n/**\n * List report instances which had been executed asynchronously\n *\n * @method Analytics~Report#instances\n * @param {Callback.>} [callback] - Callback function\n * @returns {Promise.>}\n */\nReport.prototype.instances = function(callback) {\n var url = [ this._conn._baseUrl(), \"analytics\", \"reports\", this.id, \"instances\" ].join('/');\n return this._conn.request(url).thenCall(callback);\n};\n\n/**\n * Dashboard object in the Analytics API\n *\n * @protected\n * @class Analytics-Dashboard\n * @param {Connection} conn Connection\n * @param {String} id - The Id\n */\n\nvar Dashboard = function(conn, id) {\n this._conn = conn;\n this.id = id;\n};\n\n/**\n * Describe dashboard metadata\n *\n * @method Analytics~Dashboard#describe\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\nDashboard.prototype.describe = function(callback) {\n var url = [ this._conn._baseUrl(), \"analytics\", \"dashboards\", this.id, \"describe\" ].join('/');\n return this._conn.request(url).thenCall(callback);\n};\n\n/**\n * Get details about dashboard components\n *\n * @method Analytics~Dashboard#components\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\nDashboard.prototype.components = function(componentIds, callback) {\n var url = [ this._conn._baseUrl(), \"analytics\", \"dashboards\", this.id].join('/');\n var data = {};\n if (_.isFunction(componentIds)) {\n callback = componentIds;\n } else if (_.isArray(componentIds)) {\n data.componentIds = componentIds;\n } else if (_.isString(componentIds)) {\n data.componentIds = [ componentIds ];\n }\n var params = { method : 'POST', url : url, headers : { \"Content-Type\" : \"application/json\" }, body : JSON.stringify(data)};\n return this._conn.request(params).thenCall(callback);\n};\n\n/**\n * Get dashboard status\n *\n * @method Analytics~Dashboard#status\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\nDashboard.prototype.status = function(callback) {\n var url = [ this._conn._baseUrl(), \"analytics\", \"dashboards\", this.id, \"status\" ].join('/');\n return this._conn.request(url).thenCall(callback);\n};\n\n/**\n * Refresh a dashboard\n *\n * @method Analytics~Dashboard#refresh\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\nDashboard.prototype.refresh = function(callback) {\n var url = [ this._conn._baseUrl(), \"analytics\", \"dashboards\", this.id ].join('/');\n var params = { method : 'PUT', url : url, body: '' };\n return this._conn.request(params).thenCall(callback);\n};\n\n/**\n * Clone a dashboard\n *\n * @method Analytics~Dashboard#clone\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\nDashboard.prototype.clone = function(name, folderid, callback) {\n var url = [ this._conn._baseUrl(), \"analytics\", \"dashboards\" ].join('/');\n url += \"?cloneId=\" + this.id;\n var data = {};\n\n if (_.isObject(name)) {\n data = name;\n callback = folderid;\n } else {\n data.name = name;\n data.folderId = folderid;\n }\n var params = { method : 'POST', url : url, headers : { \"Content-Type\" : \"application/json\" }, body : JSON.stringify(data)};\n\n return this._conn.request(params).thenCall(callback);\n};\n\n/**\n * Synonym of Analytics~Dashboard#destroy()\n *\n * @method Analytics~Dashboard#delete\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\n/**\n * Synonym of Analytics~Dashboard#destroy()\n *\n * @method Analytics~Dashboard#del\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\n/**\n * Destroy a dashboard\n *\n * @method Analytics~Dashboard#destroy\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\nDashboard.prototype[\"delete\"] =\nDashboard.prototype.del =\nDashboard.prototype.destroy = function(callback) {\n var url = [ this._conn._baseUrl(), \"analytics\", \"dashboards\", this.id ].join('/');\n return this._conn.request({method: 'DELETE', url: url}).thenCall(callback);\n};\n\n/**\n * API class for Analytics API\n *\n * @class\n * @param {Connection} conn Connection\n */\nvar Analytics = function(conn) {\n this._conn = conn;\n};\n\n/**\n * Get report object of Analytics API\n *\n * @param {String} id - Report Id\n * @returns {Analytics~Report}\n */\nAnalytics.prototype.report = function(id) {\n return new Report(this._conn, id);\n};\n\n/**\n * Get recent report list\n *\n * @param {Callback.>} [callback] - Callback function\n * @returns {Promise.>}\n */\nAnalytics.prototype.reports = function(callback) {\n var url = [ this._conn._baseUrl(), \"analytics\", \"reports\" ].join('/');\n return this._conn.request(url).thenCall(callback);\n};\n\n/**\n * Get dashboard object of Analytics API\n *\n * @param {String} id - Dashboard Id\n * @returns {Analytics~Dashboard}\n */\nAnalytics.prototype.dashboard = function(id) {\n return new Dashboard(this._conn, id);\n};\n\n/**\n * Get recent dashboard list\n *\n * @param {Callback.>} [callback] - Callback function\n * @returns {Promise.>}\n */\nAnalytics.prototype.dashboards = function(callback) {\n var url = [ this._conn._baseUrl(), \"analytics\", \"dashboards\" ].join('/');\n return this._conn.request(url).thenCall(callback);\n};\n\n/*--------------------------------------------*/\n/*\n * Register hook in connection instantiation for dynamically adding this API module features\n */\njsforce.on('connection:new', function(conn) {\n conn.analytics = new Analytics(conn);\n});\n\n\nmodule.exports = Analytics;\n","(function(f){if(typeof exports===\"object\"&&typeof module!==\"undefined\"){module.exports=f()}else if(typeof define===\"function\"&&define.amd){define([],f)}else{var g;if(typeof window!==\"undefined\"){g=window}else if(typeof global!==\"undefined\"){g=global}else if(typeof self!==\"undefined\"){g=self}else{g=this}g=(g.jsforce||(g.jsforce = {}));g=(g.modules||(g.modules = {}));g=(g.api||(g.api = {}));g.Analytics = f()}})(function(){var define,module,exports;return (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\n */\n\n'use strict';\n\nvar _ = window.jsforce.require('lodash/core'),\n jsforce = window.jsforce.require('./core'),\n Promise = window.jsforce.require('./promise');\n\n/**\n * Report instance to retrieving asynchronously executed result\n *\n * @protected\n * @class Analytics~ReportInstance\n * @param {Analytics~Report} report - Report\n * @param {String} id - Report instance id\n */\nvar ReportInstance = function(report, id) {\n this._report = report;\n this._conn = report._conn;\n this.id = id;\n};\n\n/**\n * Retrieve report result asynchronously executed\n *\n * @method Analytics~ReportInstance#retrieve\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\nReportInstance.prototype.retrieve = function(callback) {\n var conn = this._conn,\n report = this._report;\n var url = [ conn._baseUrl(), \"analytics\", \"reports\", report.id, \"instances\", this.id ].join('/');\n return conn.request(url).thenCall(callback);\n};\n\n/**\n * Report object in Analytics API\n *\n * @protected\n * @class Analytics~Report\n * @param {Connection} conn Connection\n */\nvar Report = function(conn, id) {\n this._conn = conn;\n this.id = id;\n};\n\n/**\n * Describe report metadata\n *\n * @method Analytics~Report#describe\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\nReport.prototype.describe = function(callback) {\n var url = [ this._conn._baseUrl(), \"analytics\", \"reports\", this.id, \"describe\" ].join('/');\n return this._conn.request(url).thenCall(callback);\n};\n\n/**\n * Synonym of Analytics~Report#destroy()\n *\n * @method Analytics~Report#delete\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\n/**\n * Synonym of Analytics~Report#destroy()\n *\n * @method Analytics~Report#del\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\n/**\n * Destroy a report\n *\n * @method Analytics~Report#destroy\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\nReport.prototype[\"delete\"] =\nReport.prototype.del =\nReport.prototype.destroy = function(callback) {\n var url = [ this._conn._baseUrl(), \"analytics\", \"reports\", this.id ].join('/');\n return this._conn.request({method: 'DELETE', url: url}).thenCall(callback);\n};\n\n/**\n * Clones a given report\n *\n * @method Analytics~Report#clone\n * @param {String} name - The name of the new report\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\nReport.prototype.clone = function(name, callback) {\n var url = [ this._conn._baseUrl(), \"analytics\", \"reports\" ].join('/');\n url += \"?cloneId=\" + this.id;\n var data = { reportMetadata: { name: name } };\n var params = { method : 'POST', url: url, headers: { \"Content-Type\" : \"application/json\" }, body: JSON.stringify(data)};\n\n return this._conn.request(params).thenCall(callback);\n};\n\n/**\n * Explain plan for executing report\n *\n * @method Analytics~Report#explain\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\nReport.prototype.explain = function(callback) {\n var url = \"/query/?explain=\" + this.id;\n return this._conn.request(url).thenCall(callback);\n};\n\n\n/**\n * Run report synchronously\n *\n * @method Analytics~Report#execute\n * @param {Object} [options] - Options\n * @param {Boolean} options.details - Flag if include detail in result\n * @param {Analytics~ReportMetadata} options.metadata - Overriding report metadata\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\nReport.prototype.run =\nReport.prototype.exec =\nReport.prototype.execute = function(options, callback) {\n options = options || {};\n if (_.isFunction(options)) {\n callback = options;\n options = {};\n }\n var url = [ this._conn._baseUrl(), \"analytics\", \"reports\", this.id ].join('/');\n url += \"?includeDetails=\" + (options.details ? \"true\" : \"false\");\n var params = { method : options.metadata ? 'POST' : 'GET', url : url };\n if (options.metadata) {\n params.headers = { \"Content-Type\" : \"application/json\" };\n params.body = JSON.stringify(options.metadata);\n }\n return this._conn.request(params).thenCall(callback);\n};\n\n\n/**\n * Run report asynchronously\n *\n * @method Analytics~Report#executeAsync\n * @param {Object} [options] - Options\n * @param {Boolean} options.details - Flag if include detail in result\n * @param {Analytics~ReportMetadata} options.metadata - Overriding report metadata\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\nReport.prototype.executeAsync = function(options, callback) {\n options = options || {};\n if (_.isFunction(options)) {\n callback = options;\n options = {};\n }\n var url = [ this._conn._baseUrl(), \"analytics\", \"reports\", this.id, \"instances\" ].join('/');\n if (options.details) {\n url += \"?includeDetails=true\";\n }\n var params = { method : 'POST', url : url, body: \"\" };\n if (options.metadata) {\n params.headers = { \"Content-Type\" : \"application/json\" };\n params.body = JSON.stringify(options.metadata);\n }\n return this._conn.request(params).thenCall(callback);\n};\n\n/**\n * Get report instance for specified instance ID\n *\n * @method Analytics~Report#instance\n * @param {String} id - Report instance ID\n * @returns {Analytics~ReportInstance}\n */\nReport.prototype.instance = function(id) {\n return new ReportInstance(this, id);\n};\n\n/**\n * List report instances which had been executed asynchronously\n *\n * @method Analytics~Report#instances\n * @param {Callback.>} [callback] - Callback function\n * @returns {Promise.>}\n */\nReport.prototype.instances = function(callback) {\n var url = [ this._conn._baseUrl(), \"analytics\", \"reports\", this.id, \"instances\" ].join('/');\n return this._conn.request(url).thenCall(callback);\n};\n\n/**\n * Dashboard object in the Analytics API\n *\n * @protected\n * @class Analytics-Dashboard\n * @param {Connection} conn Connection\n * @param {String} id - The Id\n */\n\nvar Dashboard = function(conn, id) {\n this._conn = conn;\n this.id = id;\n};\n\n/**\n * Describe dashboard metadata\n *\n * @method Analytics~Dashboard#describe\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\nDashboard.prototype.describe = function(callback) {\n var url = [ this._conn._baseUrl(), \"analytics\", \"dashboards\", this.id, \"describe\" ].join('/');\n return this._conn.request(url).thenCall(callback);\n};\n\n/**\n * Get details about dashboard components\n *\n * @method Analytics~Dashboard#components\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\nDashboard.prototype.components = function(componentIds, callback) {\n var url = [ this._conn._baseUrl(), \"analytics\", \"dashboards\", this.id].join('/');\n var data = {};\n if (_.isFunction(componentIds)) {\n callback = componentIds;\n } else if (_.isArray(componentIds)) {\n data.componentIds = componentIds;\n } else if (_.isString(componentIds)) {\n data.componentIds = [ componentIds ];\n }\n var params = { method : 'POST', url : url, headers : { \"Content-Type\" : \"application/json\" }, body : JSON.stringify(data)};\n return this._conn.request(params).thenCall(callback);\n};\n\n/**\n * Get dashboard status\n *\n * @method Analytics~Dashboard#status\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\nDashboard.prototype.status = function(callback) {\n var url = [ this._conn._baseUrl(), \"analytics\", \"dashboards\", this.id, \"status\" ].join('/');\n return this._conn.request(url).thenCall(callback);\n};\n\n/**\n * Refresh a dashboard\n *\n * @method Analytics~Dashboard#refresh\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\nDashboard.prototype.refresh = function(callback) {\n var url = [ this._conn._baseUrl(), \"analytics\", \"dashboards\", this.id ].join('/');\n var params = { method : 'PUT', url : url, body: '' };\n return this._conn.request(params).thenCall(callback);\n};\n\n/**\n * Clone a dashboard\n *\n * @method Analytics~Dashboard#clone\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\nDashboard.prototype.clone = function(name, folderid, callback) {\n var url = [ this._conn._baseUrl(), \"analytics\", \"dashboards\" ].join('/');\n url += \"?cloneId=\" + this.id;\n var data = {};\n\n if (_.isObject(name)) {\n data = name;\n callback = folderid;\n } else {\n data.name = name;\n data.folderId = folderid;\n }\n var params = { method : 'POST', url : url, headers : { \"Content-Type\" : \"application/json\" }, body : JSON.stringify(data)};\n\n return this._conn.request(params).thenCall(callback);\n};\n\n/**\n * Synonym of Analytics~Dashboard#destroy()\n *\n * @method Analytics~Dashboard#delete\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\n/**\n * Synonym of Analytics~Dashboard#destroy()\n *\n * @method Analytics~Dashboard#del\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\n/**\n * Destroy a dashboard\n *\n * @method Analytics~Dashboard#destroy\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\nDashboard.prototype[\"delete\"] =\nDashboard.prototype.del =\nDashboard.prototype.destroy = function(callback) {\n var url = [ this._conn._baseUrl(), \"analytics\", \"dashboards\", this.id ].join('/');\n return this._conn.request({method: 'DELETE', url: url}).thenCall(callback);\n};\n\n/**\n * API class for Analytics API\n *\n * @class\n * @param {Connection} conn Connection\n */\nvar Analytics = function(conn) {\n this._conn = conn;\n};\n\n/**\n * Get report object of Analytics API\n *\n * @param {String} id - Report Id\n * @returns {Analytics~Report}\n */\nAnalytics.prototype.report = function(id) {\n return new Report(this._conn, id);\n};\n\n/**\n * Get recent report list\n *\n * @param {Callback.>} [callback] - Callback function\n * @returns {Promise.>}\n */\nAnalytics.prototype.reports = function(callback) {\n var url = [ this._conn._baseUrl(), \"analytics\", \"reports\" ].join('/');\n return this._conn.request(url).thenCall(callback);\n};\n\n/**\n * Get dashboard object of Analytics API\n *\n * @param {String} id - Dashboard Id\n * @returns {Analytics~Dashboard}\n */\nAnalytics.prototype.dashboard = function(id) {\n return new Dashboard(this._conn, id);\n};\n\n/**\n * Get recent dashboard list\n *\n * @param {Callback.>} [callback] - Callback function\n * @returns {Promise.>}\n */\nAnalytics.prototype.dashboards = function(callback) {\n var url = [ this._conn._baseUrl(), \"analytics\", \"dashboards\" ].join('/');\n return this._conn.request(url).thenCall(callback);\n};\n\n/*--------------------------------------------*/\n/*\n * Register hook in connection instantiation for dynamically adding this API module features\n */\njsforce.on('connection:new', function(conn) {\n conn.analytics = new Analytics(conn);\n});\n\n\nmodule.exports = Analytics;\n\n},{}]},{},[1])(1)\n});\n\n"]} \ No newline at end of file +{"version":3,"sources":["node_modules/browser-pack/_prelude.js","lib/api/analytics.js","jsforce-api-analytics.min.js"],"names":["f","exports","module","define","amd","g","window","global","self","this","jsforce","modules","api","Analytics","r","e","n","t","o","i","c","require","u","a","Error","code","p","call","length","1","_","ReportInstance","report","id","_report","_conn","prototype","retrieve","callback","conn","url","_baseUrl","join","request","thenCall","Report","describe","del","destroy","method","clone","name","data","reportMetadata","params","headers","Content-Type","body","JSON","stringify","explain","run","exec","execute","options","isFunction","details","metadata","executeAsync","instance","instances","Dashboard","components","componentIds","isArray","isString","status","refresh","folderid","isObject","folderId","reports","dashboard","dashboards","on","analytics"],"mappings":"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","file":"jsforce-api-analytics.min.js","sourcesContent":["(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\n */\n\n'use strict';\n\nvar _ = window.jsforce.require('lodash/core'),\n jsforce = window.jsforce.require('./core'),\n Promise = window.jsforce.require('./promise');\n\n/**\n * Report instance to retrieving asynchronously executed result\n *\n * @protected\n * @class Analytics~ReportInstance\n * @param {Analytics~Report} report - Report\n * @param {String} id - Report instance id\n */\nvar ReportInstance = function(report, id) {\n this._report = report;\n this._conn = report._conn;\n this.id = id;\n};\n\n/**\n * Retrieve report result asynchronously executed\n *\n * @method Analytics~ReportInstance#retrieve\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\nReportInstance.prototype.retrieve = function(callback) {\n var conn = this._conn,\n report = this._report;\n var url = [ conn._baseUrl(), \"analytics\", \"reports\", report.id, \"instances\", this.id ].join('/');\n return conn.request(url).thenCall(callback);\n};\n\n/**\n * Report object in Analytics API\n *\n * @protected\n * @class Analytics~Report\n * @param {Connection} conn Connection\n */\nvar Report = function(conn, id) {\n this._conn = conn;\n this.id = id;\n};\n\n/**\n * Describe report metadata\n *\n * @method Analytics~Report#describe\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\nReport.prototype.describe = function(callback) {\n var url = [ this._conn._baseUrl(), \"analytics\", \"reports\", this.id, \"describe\" ].join('/');\n return this._conn.request(url).thenCall(callback);\n};\n\n/**\n * Synonym of Analytics~Report#destroy()\n *\n * @method Analytics~Report#delete\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\n/**\n * Synonym of Analytics~Report#destroy()\n *\n * @method Analytics~Report#del\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\n/**\n * Destroy a report\n *\n * @method Analytics~Report#destroy\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\nReport.prototype[\"delete\"] =\nReport.prototype.del =\nReport.prototype.destroy = function(callback) {\n var url = [ this._conn._baseUrl(), \"analytics\", \"reports\", this.id ].join('/');\n return this._conn.request({method: 'DELETE', url: url}).thenCall(callback);\n};\n\n/**\n * Clones a given report\n *\n * @method Analytics~Report#clone\n * @param {String} name - The name of the new report\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\nReport.prototype.clone = function(name, callback) {\n var url = [ this._conn._baseUrl(), \"analytics\", \"reports\" ].join('/');\n url += \"?cloneId=\" + this.id;\n var data = { reportMetadata: { name: name } };\n var params = { method : 'POST', url: url, headers: { \"Content-Type\" : \"application/json\" }, body: JSON.stringify(data)};\n\n return this._conn.request(params).thenCall(callback);\n};\n\n/**\n * Explain plan for executing report\n *\n * @method Analytics~Report#explain\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\nReport.prototype.explain = function(callback) {\n var url = \"/query/?explain=\" + this.id;\n return this._conn.request(url).thenCall(callback);\n};\n\n\n/**\n * Run report synchronously\n *\n * @method Analytics~Report#execute\n * @param {Object} [options] - Options\n * @param {Boolean} options.details - Flag if include detail in result\n * @param {Analytics~ReportMetadata} options.metadata - Overriding report metadata\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\nReport.prototype.run =\nReport.prototype.exec =\nReport.prototype.execute = function(options, callback) {\n options = options || {};\n if (_.isFunction(options)) {\n callback = options;\n options = {};\n }\n var url = [ this._conn._baseUrl(), \"analytics\", \"reports\", this.id ].join('/');\n url += \"?includeDetails=\" + (options.details ? \"true\" : \"false\");\n var params = { method : options.metadata ? 'POST' : 'GET', url : url };\n if (options.metadata) {\n params.headers = { \"Content-Type\" : \"application/json\" };\n params.body = JSON.stringify(options.metadata);\n }\n return this._conn.request(params).thenCall(callback);\n};\n\n\n/**\n * Run report asynchronously\n *\n * @method Analytics~Report#executeAsync\n * @param {Object} [options] - Options\n * @param {Boolean} options.details - Flag if include detail in result\n * @param {Analytics~ReportMetadata} options.metadata - Overriding report metadata\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\nReport.prototype.executeAsync = function(options, callback) {\n options = options || {};\n if (_.isFunction(options)) {\n callback = options;\n options = {};\n }\n var url = [ this._conn._baseUrl(), \"analytics\", \"reports\", this.id, \"instances\" ].join('/');\n if (options.details) {\n url += \"?includeDetails=true\";\n }\n var params = { method : 'POST', url : url, body: \"\" };\n if (options.metadata) {\n params.headers = { \"Content-Type\" : \"application/json\" };\n params.body = JSON.stringify(options.metadata);\n }\n return this._conn.request(params).thenCall(callback);\n};\n\n/**\n * Get report instance for specified instance ID\n *\n * @method Analytics~Report#instance\n * @param {String} id - Report instance ID\n * @returns {Analytics~ReportInstance}\n */\nReport.prototype.instance = function(id) {\n return new ReportInstance(this, id);\n};\n\n/**\n * List report instances which had been executed asynchronously\n *\n * @method Analytics~Report#instances\n * @param {Callback.>} [callback] - Callback function\n * @returns {Promise.>}\n */\nReport.prototype.instances = function(callback) {\n var url = [ this._conn._baseUrl(), \"analytics\", \"reports\", this.id, \"instances\" ].join('/');\n return this._conn.request(url).thenCall(callback);\n};\n\n/**\n * Dashboard object in the Analytics API\n *\n * @protected\n * @class Analytics-Dashboard\n * @param {Connection} conn Connection\n * @param {String} id - The Id\n */\n\nvar Dashboard = function(conn, id) {\n this._conn = conn;\n this.id = id;\n};\n\n/**\n * Describe dashboard metadata\n *\n * @method Analytics~Dashboard#describe\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\nDashboard.prototype.describe = function(callback) {\n var url = [ this._conn._baseUrl(), \"analytics\", \"dashboards\", this.id, \"describe\" ].join('/');\n return this._conn.request(url).thenCall(callback);\n};\n\n/**\n * Get details about dashboard components\n *\n * @method Analytics~Dashboard#components\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\nDashboard.prototype.components = function(componentIds, callback) {\n var url = [ this._conn._baseUrl(), \"analytics\", \"dashboards\", this.id].join('/');\n var data = {};\n if (_.isFunction(componentIds)) {\n callback = componentIds;\n } else if (_.isArray(componentIds)) {\n data.componentIds = componentIds;\n } else if (_.isString(componentIds)) {\n data.componentIds = [ componentIds ];\n }\n var params = { method : 'POST', url : url, headers : { \"Content-Type\" : \"application/json\" }, body : JSON.stringify(data)};\n return this._conn.request(params).thenCall(callback);\n};\n\n/**\n * Get dashboard status\n *\n * @method Analytics~Dashboard#status\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\nDashboard.prototype.status = function(callback) {\n var url = [ this._conn._baseUrl(), \"analytics\", \"dashboards\", this.id, \"status\" ].join('/');\n return this._conn.request(url).thenCall(callback);\n};\n\n/**\n * Refresh a dashboard\n *\n * @method Analytics~Dashboard#refresh\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\nDashboard.prototype.refresh = function(callback) {\n var url = [ this._conn._baseUrl(), \"analytics\", \"dashboards\", this.id ].join('/');\n var params = { method : 'PUT', url : url, body: '' };\n return this._conn.request(params).thenCall(callback);\n};\n\n/**\n * Clone a dashboard\n *\n * @method Analytics~Dashboard#clone\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\nDashboard.prototype.clone = function(name, folderid, callback) {\n var url = [ this._conn._baseUrl(), \"analytics\", \"dashboards\" ].join('/');\n url += \"?cloneId=\" + this.id;\n var data = {};\n\n if (_.isObject(name)) {\n data = name;\n callback = folderid;\n } else {\n data.name = name;\n data.folderId = folderid;\n }\n var params = { method : 'POST', url : url, headers : { \"Content-Type\" : \"application/json\" }, body : JSON.stringify(data)};\n\n return this._conn.request(params).thenCall(callback);\n};\n\n/**\n * Synonym of Analytics~Dashboard#destroy()\n *\n * @method Analytics~Dashboard#delete\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\n/**\n * Synonym of Analytics~Dashboard#destroy()\n *\n * @method Analytics~Dashboard#del\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\n/**\n * Destroy a dashboard\n *\n * @method Analytics~Dashboard#destroy\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\nDashboard.prototype[\"delete\"] =\nDashboard.prototype.del =\nDashboard.prototype.destroy = function(callback) {\n var url = [ this._conn._baseUrl(), \"analytics\", \"dashboards\", this.id ].join('/');\n return this._conn.request({method: 'DELETE', url: url}).thenCall(callback);\n};\n\n/**\n * API class for Analytics API\n *\n * @class\n * @param {Connection} conn Connection\n */\nvar Analytics = function(conn) {\n this._conn = conn;\n};\n\n/**\n * Get report object of Analytics API\n *\n * @param {String} id - Report Id\n * @returns {Analytics~Report}\n */\nAnalytics.prototype.report = function(id) {\n return new Report(this._conn, id);\n};\n\n/**\n * Get recent report list\n *\n * @param {Callback.>} [callback] - Callback function\n * @returns {Promise.>}\n */\nAnalytics.prototype.reports = function(callback) {\n var url = [ this._conn._baseUrl(), \"analytics\", \"reports\" ].join('/');\n return this._conn.request(url).thenCall(callback);\n};\n\n/**\n * Get dashboard object of Analytics API\n *\n * @param {String} id - Dashboard Id\n * @returns {Analytics~Dashboard}\n */\nAnalytics.prototype.dashboard = function(id) {\n return new Dashboard(this._conn, id);\n};\n\n/**\n * Get recent dashboard list\n *\n * @param {Callback.>} [callback] - Callback function\n * @returns {Promise.>}\n */\nAnalytics.prototype.dashboards = function(callback) {\n var url = [ this._conn._baseUrl(), \"analytics\", \"dashboards\" ].join('/');\n return this._conn.request(url).thenCall(callback);\n};\n\n/*--------------------------------------------*/\n/*\n * Register hook in connection instantiation for dynamically adding this API module features\n */\njsforce.on('connection:new', function(conn) {\n conn.analytics = new Analytics(conn);\n});\n\n\nmodule.exports = Analytics;\n","!function(t){var n;\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=t():\"function\"==typeof define&&define.amd?define([],t):(n=(n=(n=(n=\"undefined\"!=typeof window?window:\"undefined\"!=typeof global?global:\"undefined\"!=typeof self?self:this).jsforce||(n.jsforce={})).modules||(n.modules={})).api||(n.api={})).Analytics=t()}(function(){return function i(s,a,c){function u(n,t){if(!a[n]){if(!s[n]){var e=\"function\"==typeof require&&require;if(!t&&e)return e(n,!0);if(l)return l(n,!0);var o=new Error(\"Cannot find module '\"+n+\"'\");throw o.code=\"MODULE_NOT_FOUND\",o}var r=a[n]={exports:{}};s[n][0].call(r.exports,function(t){return u(s[n][1][t]||t)},r,r.exports,i,s,a,c)}return a[n].exports}for(var l=\"function\"==typeof require&&require,t=0;t\n */\n\n'use strict';\n\nvar jsforce = window.jsforce.require('./core');\n\n/**\n * API class for Apex REST endpoint call\n *\n * @class\n * @param {Connection} conn Connection\n */\nvar Apex = function(conn) {\n this._conn = conn;\n};\n\n/**\n * @private\n */\nApex.prototype._baseUrl = function() {\n return this._conn.instanceUrl + \"/services/apexrest\";\n};\n\n/**\n * @private\n */\nApex.prototype._createRequestParams = function(method, path, body, options) {\n var params = {\n method: method,\n url: this._baseUrl() + path\n },\n _headers = {};\n if(options && 'object' === typeof options['headers']){\n _headers = options['headers'];\n }\n if (!/^(GET|DELETE)$/i.test(method)) {\n _headers[\"Content-Type\"] = \"application/json\";\n }\n params.headers = _headers;\n if (body) {\n params.body = JSON.stringify(body);\n }\n return params;\n};\n\n/**\n * Call Apex REST service in GET request\n *\n * @param {String} path - URL path to Apex REST service\n * @param {Object} options - Holds headers and other meta data for the request.\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\nApex.prototype.get = function(path, options, callback) {\n if (typeof options === 'function') {\n callback = options;\n options = undefined;\n }\n return this._conn.request(this._createRequestParams('GET', path, undefined, options)).thenCall(callback);\n};\n\n/**\n * Call Apex REST service in POST request\n *\n * @param {String} path - URL path to Apex REST service\n * @param {Object} [body] - Request body\n * @param {Object} options - Holds headers and other meta data for the request.\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\nApex.prototype.post = function(path, body, options, callback) {\n if (typeof body === 'function') {\n callback = body;\n body = undefined;\n options = undefined;\n }\n if (typeof options === 'function') {\n callback = options;\n options = undefined;\n }\n var params = this._createRequestParams('POST', path, body, options);\n return this._conn.request(params).thenCall(callback);\n};\n\n/**\n * Call Apex REST service in PUT request\n *\n * @param {String} path - URL path to Apex REST service\n * @param {Object} [body] - Request body\n * @param {Object} [options] - Holds headers and other meta data for the request.\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\nApex.prototype.put = function(path, body, options, callback) {\n if (typeof body === 'function') {\n callback = body;\n body = undefined;\n options = undefined;\n }\n if (typeof options === 'function') {\n callback = options;\n options = undefined;\n }\n var params = this._createRequestParams('PUT', path, body, options);\n return this._conn.request(params).thenCall(callback);\n};\n\n/**\n * Call Apex REST service in PATCH request\n *\n * @param {String} path - URL path to Apex REST service\n * @param {Object} [body] - Request body\n * @param {Object} [options] - Holds headers and other meta data for the request.\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\nApex.prototype.patch = function(path, body, options, callback) {\n if (typeof body === 'function') {\n callback = body;\n body = undefined;\n options = undefined;\n }\n if (typeof options === 'function') {\n callback = options;\n options = undefined;\n }\n var params = this._createRequestParams('PATCH', path, body, options);\n return this._conn.request(params).thenCall(callback);\n};\n\n/**\n * Synonym of Apex#delete()\n *\n * @method Apex#del\n *\n * @param {String} path - URL path to Apex REST service\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\n/**\n * Call Apex REST service in DELETE request\n *\n * @method Apex#delete\n *\n * @param {String} path - URL path to Apex REST service\n * @param {Object} [options] - Holds headers and other meta data for the request.\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\nApex.prototype.del =\n Apex.prototype[\"delete\"] = function(path, options, callback) {\n if (typeof options === 'function') {\n callback = options;\n options = undefined;\n }\n return this._conn.request(this._createRequestParams('DELETE', path, undefined, options)).thenCall(callback);\n};\n\n\n/*--------------------------------------------*/\n/*\n * Register hook in connection instantiation for dynamically adding this API module features\n */\njsforce.on('connection:new', function(conn) {\n conn.apex = new Apex(conn);\n});\n\n\nmodule.exports = Apex;\n","(function(f){if(typeof exports===\"object\"&&typeof module!==\"undefined\"){module.exports=f()}else if(typeof define===\"function\"&&define.amd){define([],f)}else{var g;if(typeof window!==\"undefined\"){g=window}else if(typeof global!==\"undefined\"){g=global}else if(typeof self!==\"undefined\"){g=self}else{g=this}g=(g.jsforce||(g.jsforce = {}));g=(g.modules||(g.modules = {}));g=(g.api||(g.api = {}));g.Apex = f()}})(function(){var define,module,exports;return (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\n */\n\n'use strict';\n\nvar jsforce = window.jsforce.require('./core');\n\n/**\n * API class for Apex REST endpoint call\n *\n * @class\n * @param {Connection} conn Connection\n */\nvar Apex = function(conn) {\n this._conn = conn;\n};\n\n/**\n * @private\n */\nApex.prototype._baseUrl = function() {\n return this._conn.instanceUrl + \"/services/apexrest\";\n};\n\n/**\n * @private\n */\nApex.prototype._createRequestParams = function(method, path, body, options) {\n var params = {\n method: method,\n url: this._baseUrl() + path\n },\n _headers = {};\n if(options && 'object' === typeof options['headers']){\n _headers = options['headers'];\n }\n if (!/^(GET|DELETE)$/i.test(method)) {\n _headers[\"Content-Type\"] = \"application/json\";\n }\n params.headers = _headers;\n if (body) {\n params.body = JSON.stringify(body);\n }\n return params;\n};\n\n/**\n * Call Apex REST service in GET request\n *\n * @param {String} path - URL path to Apex REST service\n * @param {Object} options - Holds headers and other meta data for the request.\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\nApex.prototype.get = function(path, options, callback) {\n if (typeof options === 'function') {\n callback = options;\n options = undefined;\n }\n return this._conn.request(this._createRequestParams('GET', path, undefined, options)).thenCall(callback);\n};\n\n/**\n * Call Apex REST service in POST request\n *\n * @param {String} path - URL path to Apex REST service\n * @param {Object} [body] - Request body\n * @param {Object} options - Holds headers and other meta data for the request.\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\nApex.prototype.post = function(path, body, options, callback) {\n if (typeof body === 'function') {\n callback = body;\n body = undefined;\n options = undefined;\n }\n if (typeof options === 'function') {\n callback = options;\n options = undefined;\n }\n var params = this._createRequestParams('POST', path, body, options);\n return this._conn.request(params).thenCall(callback);\n};\n\n/**\n * Call Apex REST service in PUT request\n *\n * @param {String} path - URL path to Apex REST service\n * @param {Object} [body] - Request body\n * @param {Object} [options] - Holds headers and other meta data for the request.\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\nApex.prototype.put = function(path, body, options, callback) {\n if (typeof body === 'function') {\n callback = body;\n body = undefined;\n options = undefined;\n }\n if (typeof options === 'function') {\n callback = options;\n options = undefined;\n }\n var params = this._createRequestParams('PUT', path, body, options);\n return this._conn.request(params).thenCall(callback);\n};\n\n/**\n * Call Apex REST service in PATCH request\n *\n * @param {String} path - URL path to Apex REST service\n * @param {Object} [body] - Request body\n * @param {Object} [options] - Holds headers and other meta data for the request.\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\nApex.prototype.patch = function(path, body, options, callback) {\n if (typeof body === 'function') {\n callback = body;\n body = undefined;\n options = undefined;\n }\n if (typeof options === 'function') {\n callback = options;\n options = undefined;\n }\n var params = this._createRequestParams('PATCH', path, body, options);\n return this._conn.request(params).thenCall(callback);\n};\n\n/**\n * Synonym of Apex#delete()\n *\n * @method Apex#del\n *\n * @param {String} path - URL path to Apex REST service\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\n/**\n * Call Apex REST service in DELETE request\n *\n * @method Apex#delete\n *\n * @param {String} path - URL path to Apex REST service\n * @param {Object} [options] - Holds headers and other meta data for the request.\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\nApex.prototype.del =\n Apex.prototype[\"delete\"] = function(path, options, callback) {\n if (typeof options === 'function') {\n callback = options;\n options = undefined;\n }\n return this._conn.request(this._createRequestParams('DELETE', path, undefined, options)).thenCall(callback);\n};\n\n\n/*--------------------------------------------*/\n/*\n * Register hook in connection instantiation for dynamically adding this API module features\n */\njsforce.on('connection:new', function(conn) {\n conn.apex = new Apex(conn);\n});\n\n\nmodule.exports = Apex;\n\n},{}]},{},[1])(1)\n});\n\n"]} \ No newline at end of file +{"version":3,"sources":["node_modules/browser-pack/_prelude.js","lib/api/apex.js","jsforce-api-apex.min.js"],"names":["f","exports","module","define","amd","g","window","global","self","this","jsforce","modules","api","Apex","r","e","n","t","o","i","c","require","u","a","Error","code","p","call","length","1","conn","_conn","prototype","_baseUrl","instanceUrl","_createRequestParams","method","path","body","options","params","url","_headers","test","headers","contentType","JSON","stringify","get","callback","undefined","request","thenCall","post","put","patch","del","on","apex"],"mappings":"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","file":"jsforce-api-apex.min.js","sourcesContent":["(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\n */\n\n'use strict';\n\nvar jsforce = window.jsforce.require('./core');\n\n/**\n * API class for Apex REST endpoint call\n *\n * @class\n * @param {Connection} conn Connection\n */\nvar Apex = function(conn) {\n this._conn = conn;\n};\n\n/**\n * @private\n */\nApex.prototype._baseUrl = function() {\n return this._conn.instanceUrl + \"/services/apexrest\";\n};\n\n/**\n * @private\n */\nApex.prototype._createRequestParams = function(method, path, body, options) {\n var params = {\n method: method,\n url: this._baseUrl() + path\n },\n _headers = {};\n if(options && 'object' === typeof options['headers']){\n _headers = options['headers'];\n }\n if (!/^(GET|DELETE)$/i.test(method)) {\n _headers[\"Content-Type\"] = \"application/json\";\n }\n params.headers = _headers;\n if (body) {\n var contentType = params.headers[\"Content-Type\"];\n if (!contentType || contentType === \"application/json\") {\n params.body = JSON.stringify(body);\n } else {\n params.body = body;\n }\n }\n return params;\n};\n\n/**\n * Call Apex REST service in GET request\n *\n * @param {String} path - URL path to Apex REST service\n * @param {Object} options - Holds headers and other meta data for the request.\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\nApex.prototype.get = function(path, options, callback) {\n if (typeof options === 'function') {\n callback = options;\n options = undefined;\n }\n return this._conn.request(this._createRequestParams('GET', path, undefined, options)).thenCall(callback);\n};\n\n/**\n * Call Apex REST service in POST request\n *\n * @param {String} path - URL path to Apex REST service\n * @param {Object} [body] - Request body\n * @param {Object} options - Holds headers and other meta data for the request.\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\nApex.prototype.post = function(path, body, options, callback) {\n if (typeof body === 'function') {\n callback = body;\n body = undefined;\n options = undefined;\n }\n if (typeof options === 'function') {\n callback = options;\n options = undefined;\n }\n var params = this._createRequestParams('POST', path, body, options);\n return this._conn.request(params).thenCall(callback);\n};\n\n/**\n * Call Apex REST service in PUT request\n *\n * @param {String} path - URL path to Apex REST service\n * @param {Object} [body] - Request body\n * @param {Object} [options] - Holds headers and other meta data for the request.\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\nApex.prototype.put = function(path, body, options, callback) {\n if (typeof body === 'function') {\n callback = body;\n body = undefined;\n options = undefined;\n }\n if (typeof options === 'function') {\n callback = options;\n options = undefined;\n }\n var params = this._createRequestParams('PUT', path, body, options);\n return this._conn.request(params).thenCall(callback);\n};\n\n/**\n * Call Apex REST service in PATCH request\n *\n * @param {String} path - URL path to Apex REST service\n * @param {Object} [body] - Request body\n * @param {Object} [options] - Holds headers and other meta data for the request.\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\nApex.prototype.patch = function(path, body, options, callback) {\n if (typeof body === 'function') {\n callback = body;\n body = undefined;\n options = undefined;\n }\n if (typeof options === 'function') {\n callback = options;\n options = undefined;\n }\n var params = this._createRequestParams('PATCH', path, body, options);\n return this._conn.request(params).thenCall(callback);\n};\n\n/**\n * Synonym of Apex#delete()\n *\n * @method Apex#del\n *\n * @param {String} path - URL path to Apex REST service\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\n/**\n * Call Apex REST service in DELETE request\n *\n * @method Apex#delete\n *\n * @param {String} path - URL path to Apex REST service\n * @param {Object} [options] - Holds headers and other meta data for the request.\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\nApex.prototype.del =\n Apex.prototype[\"delete\"] = function(path, options, callback) {\n if (typeof options === 'function') {\n callback = options;\n options = undefined;\n }\n return this._conn.request(this._createRequestParams('DELETE', path, undefined, options)).thenCall(callback);\n};\n\n\n/*--------------------------------------------*/\n/*\n * Register hook in connection instantiation for dynamically adding this API module features\n */\njsforce.on('connection:new', function(conn) {\n conn.apex = new Apex(conn);\n});\n\n\nmodule.exports = Apex;\n","!function(e){var t;\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=e():\"function\"==typeof define&&define.amd?define([],e):(t=(t=(t=(t=\"undefined\"!=typeof window?window:\"undefined\"!=typeof global?global:\"undefined\"!=typeof self?self:this).jsforce||(t.jsforce={})).modules||(t.modules={})).api||(t.api={})).Apex=e()}(function(){return function i(u,f,s){function c(t,e){if(!f[t]){if(!u[t]){var n=\"function\"==typeof require&&require;if(!e&&n)return n(t,!0);if(a)return a(t,!0);var o=new Error(\"Cannot find module '\"+t+\"'\");throw o.code=\"MODULE_NOT_FOUND\",o}var r=f[t]={exports:{}};u[t][0].call(r.exports,function(e){return c(u[t][1][e]||e)},r,r.exports,i,u,f,s)}return f[t].exports}for(var a=\"function\"==typeof require&&require,e=0;e','',""+r+"",""+this.type+"",this.options.extIdField?""+this.options.extIdField+"":"",this.options.concurrencyMode?""+this.options.concurrencyMode+"":"",this.options.assignmentRuleId?""+this.options.assignmentRuleId+"":"","CSV",""].join("");this._jobInfo=n._request({method:"POST",path:"/job",body:o,headers:{"Content-Type":"application/xml; charset=utf-8"},responseType:"application/xml"}).then(function(e){return t.emit("open",e.jobInfo),t.id=e.jobInfo.id,t.state=e.jobInfo.state,e.jobInfo},function(e){throw t.emit("error",e),e})}return this._jobInfo.thenCall(e)},p.prototype.createBatch=function(){var e=new f(this),t=this;return e.on("queue",function(){t._batches[e.id]=e}),e},p.prototype.batch=function(e){var t=this._batches[e];return t||(t=new f(this,e),this._batches[e]=t),t},p.prototype.check=function(e){var t=this,n=this._bulk,r=n._logger;return this._jobInfo=this._waitAssign().then(function(){return n._request({method:"GET",path:"/job/"+t.id,responseType:"application/xml"})}).then(function(e){return r.debug(e.jobInfo),t.id=e.jobInfo.id,t.type=e.jobInfo.object,t.operation=e.jobInfo.operation,t.state=e.jobInfo.state,e.jobInfo}),this._jobInfo.thenCall(e)},p.prototype._waitAssign=function(e){return(this.id?h.resolve({id:this.id}):this.open()).thenCall(e)},p.prototype.list=function(e){var t=this,n=this._bulk,r=n._logger;return this._waitAssign().then(function(){return n._request({method:"GET",path:"/job/"+t.id+"/batch",responseType:"application/xml"})}).then(function(e){r.debug(e.batchInfoList.batchInfo);var t=e.batchInfoList;return t=s.isArray(t.batchInfo)?t.batchInfo:[t.batchInfo]}).thenCall(e)},p.prototype.close=function(){var e=this;return this._changeState("Closed").then(function(t){return e.id=null,e.emit("close",t),t},function(t){throw e.emit("error",t),t})},p.prototype.abort=function(){var e=this;return this._changeState("Aborted").then(function(t){return e.id=null,e.emit("abort",t),t},function(t){throw e.emit("error",t),t})},p.prototype._changeState=function(e,t){var n=this,r=this._bulk,o=r._logger;return this._jobInfo=this._waitAssign().then(function(){var t=['','',""+e+"",""].join("");return r._request({method:"POST",path:"/job/"+n.id,body:t,headers:{"Content-Type":"application/xml; charset=utf-8"},responseType:"application/xml"})}).then(function(e){return o.debug(e.jobInfo),n.state=e.jobInfo.state,e.jobInfo}),this._jobInfo.thenCall(t)};var f=function(e,t){f.super_.call(this,{objectMode:!0}),this.job=e,this.id=t,this._bulk=e._bulk,this._deferred=h.defer(),this._setupDataStreams()};n(f,r.Writable),f.prototype._setupDataStreams=function(){var e=this,t={nullValue:"#N/A"};this._uploadStream=new c.Serializable,this._uploadDataStream=this._uploadStream.stream("csv",t),this._downloadStream=new c.Parsable,this._downloadDataStream=this._downloadStream.stream("csv",t),this.on("finish",function(){e._uploadStream.end()}),this._uploadDataStream.once("readable",function(){e.job.open().then(function(){e._uploadDataStream.pipe(e._createRequestStream())})});var n=this._dataStream=new o;n._write=function(t,n,r){e._uploadDataStream.write(t,n,r)},n.on("finish",function(){e._uploadDataStream.end()}),this._downloadDataStream.on("readable",function(){n.read(0)}),this._downloadDataStream.on("end",function(){n.push(null)}),n._read=function(t){for(var r;null!==(r=e._downloadDataStream.read());)n.push(r)}},f.prototype._createRequestStream=function(){var e=this,t=e._bulk,n=t._logger;return t._request({method:"POST",path:"/job/"+e.job.id+"/batch",headers:{"Content-Type":"text/csv"},responseType:"application/xml"},function(t,r){t?e.emit("error",t):(n.debug(r.batchInfo),e.id=r.batchInfo.id,e.emit("queue",r.batchInfo))}).stream()},f.prototype._write=function(e,t,n){e=s.clone(e),"insert"===this.job.operation?delete e.Id:"delete"===this.job.operation&&(e={Id:e.Id}),delete e.type,delete e.attributes,this._uploadStream.write(e,t,n)},f.prototype.stream=function(){return this._dataStream},f.prototype.run=f.prototype.exec=f.prototype.execute=function(e,t){var n=this;if("function"==typeof e&&(t=e,e=null),this._result)throw new Error("Batch already executed.");var r=h.defer();if(this._result=r.promise,this._result.then(function(e){n._deferred.resolve(e)},function(e){n._deferred.reject(e)}),this.once("response",function(e){r.resolve(e)}),this.once("error",function(e){r.reject(e)}),s.isObject(e)&&s.isFunction(e.pipe))e.pipe(this._dataStream);else{var o;s.isArray(e)?(s.forEach(e,function(e){Object.keys(e).forEach(function(t){"boolean"==typeof e[t]&&(e[t]=String(e[t]))}),n.write(e)}),n.end()):s.isString(e)&&(o=e,this._dataStream.write(o,"utf8"),this._dataStream.end())}return this.thenCall(t)},f.prototype.then=function(e,t,n){return this._deferred.promise.then(e,t,n)},f.prototype.thenCall=function(t){return s.isFunction(t)&&this.then(function(n){e.nextTick(function(){t(null,n)})},function(n){e.nextTick(function(){t(n)})}),this},f.prototype.check=function(e){var t=this._bulk,n=t._logger,r=this.job.id,o=this.id;if(!r||!o)throw new Error("Batch not started.");return t._request({method:"GET",path:"/job/"+r+"/batch/"+o,responseType:"application/xml"}).then(function(e){return n.debug(e.batchInfo),e.batchInfo}).thenCall(e)},f.prototype.poll=function(e,t){var n=this,r=this.job.id,o=this.id;if(!r||!o)throw new Error("Batch not started.");var i=(new Date).getTime(),s=function(){var a=(new Date).getTime();if(i+t0?n.retrieve():n.emit("error",new Error(r.stateMessage)):"Completed"===r.state?n.retrieve():(n.emit("progress",r),setTimeout(s,e))})};setTimeout(s,e)},f.prototype.retrieve=function(e){var t=this,n=this._bulk,r=this.job.id,o=this.job,i=this.id;if(!r||!i)throw new Error("Batch not started.");return o.info().then(function(e){return n._request({method:"GET",path:"/job/"+r+"/batch/"+i+"/result"})}).then(function(e){var a;if("query"===o.operation){n._conn,e["result-list"].result;a=e["result-list"].result,a=s.map(s.isArray(a)?a:[a],function(e){return{id:e,batchId:i,jobId:r}})}else a=s.map(e,function(e){return{id:e.Id||null,success:"true"===e.Success,errors:e.Error?[e.Error]:[]}});return t.emit("response",a),a}).fail(function(e){throw t.emit("error",e),e}).thenCall(e)},f.prototype.result=function(e){var t=this.job.id,n=this.id;if(!t||!n)throw new Error("Batch not started.");var r=new c.Parsable,o=r.stream("csv");this._bulk._request({method:"GET",path:"/job/"+t+"/batch/"+n+"/result/"+e,responseType:"application/octet-stream"}).stream().pipe(o);return r};var d=function(){d.super_.apply(this,arguments)};n(d,l),d.prototype.beforeSend=function(e){e.headers=e.headers||{},e.headers["X-SFDC-SESSION"]=this._conn.accessToken},d.prototype.isSessionExpired=function(e){return 400===e.statusCode&&/InvalidSessionId<\/exceptionCode>/.test(e.body)},d.prototype.hasErrorInResponseBody=function(e){return!!e.error},d.prototype.parseError=function(e){return{errorCode:e.error.exceptionCode,message:e.error.exceptionMessage}};var b=function(e){this._conn=e,this._logger=e._logger};b.prototype.pollInterval=1e3,b.prototype.pollTimeout=1e4,b.prototype._request=function(e,t){var n=this._conn;e=s.clone(e);var r=[n.instanceUrl,"services/async",n.version].join("/");e.url=r+e.path;var o={responseType:e.responseType};return delete e.path,delete e.responseType,new d(this._conn,o).request(e).thenCall(t)},b.prototype.load=function(e,t,n,r,o){var i=this;if(!e||!t)throw new Error("Insufficient arguments. At least, 'type' and 'operation' are required.");s.isObject(n)&&n.constructor===Object||(o=r,r=n,n=null);var a=this.createJob(e,t,n);a.once("error",function(e){u&&u.emit("error",e)});var u=a.createBatch(),c=function(){u=null,a.close()},h=function(e){"PollingTimeout"!==e.name&&c()};return u.on("response",c),u.on("error",h),u.on("queue",function(){u.poll(i.pollInterval,i.pollTimeout)}),u.execute(r,o)},b.prototype.query=function(e){var t=e.replace(/\([\s\S]+\)/g,"").match(/FROM\s+(\w+)/i);if(!t)throw new Error("No sobject type found in query, maybe caused by invalid SOQL.");var n=t[1],r=this,o=new c.Parsable,i=o.stream("csv");return this.load(n,"query",e).then(function(e){var t=e.map(function(e){return r.job(e.jobId).batch(e.batchId).result(e.id).stream()});a(t).pipe(i)}).fail(function(e){o.emit("error",e)}),o},b.prototype.createJob=function(e,t,n){return new p(this,e,t,n)},b.prototype.job=function(e){return new p(this,null,null,null,e)},u.on("connection:new",function(e){e.bulk=new b(e)}),t.exports=b}).call(this,e("_process"))},{_process:2}],2:[function(e,t,n){function r(){throw new Error("setTimeout has not been defined")}function o(){throw new Error("clearTimeout has not been defined")}function i(e){if(l===setTimeout)return setTimeout(e,0);if((l===r||!l)&&setTimeout)return l=setTimeout,setTimeout(e,0);try{return l(e,0)}catch(t){try{return l.call(null,e,0)}catch(t){return l.call(this,e,0)}}}function s(e){if(p===clearTimeout)return clearTimeout(e);if((p===o||!p)&&clearTimeout)return p=clearTimeout,clearTimeout(e);try{return p(e)}catch(t){try{return p.call(null,e)}catch(t){return p.call(this,e)}}}function a(){m&&d&&(m=!1,d.length?b=d.concat(b):y=-1,b.length&&u())}function u(){if(!m){var e=i(a);m=!0;for(var t=b.length;t;){for(d=b,b=[];++y1)for(var n=1;n','',""+o+"",""+this.type+"",this.options.extIdField?""+this.options.extIdField+"":"",this.options.concurrencyMode?""+this.options.concurrencyMode+"":"",this.options.assignmentRuleId?""+this.options.assignmentRuleId+"":"","CSV",""].join("");this._jobInfo=n._request({method:"POST",path:"/job",body:r,headers:{"Content-Type":"application/xml; charset=utf-8"},responseType:"application/xml"}).then((function(t){return e.emit("open",t.jobInfo),e.id=t.jobInfo.id,e.state=t.jobInfo.state,t.jobInfo}),(function(t){throw e.emit("error",t),t}))}return this._jobInfo.thenCall(t)},p.prototype.createBatch=function(){var t=new f(this),e=this;return t.on("queue",(function(){e._batches[t.id]=t})),t},p.prototype.batch=function(t){var e=this._batches[t];return e||(e=new f(this,t),this._batches[t]=e),e},p.prototype.check=function(t){var e=this,n=this._bulk,o=n._logger;return this._jobInfo=this._waitAssign().then((function(){return n._request({method:"GET",path:"/job/"+e.id,responseType:"application/xml"})})).then((function(t){return o.debug(t.jobInfo),e.id=t.jobInfo.id,e.type=t.jobInfo.object,e.operation=t.jobInfo.operation,e.state=t.jobInfo.state,t.jobInfo})),this._jobInfo.thenCall(t)},p.prototype._waitAssign=function(t){return(this.id?h.resolve({id:this.id}):this.open()).thenCall(t)},p.prototype.list=function(t){var e=this,n=this._bulk,o=n._logger;return this._waitAssign().then((function(){return n._request({method:"GET",path:"/job/"+e.id+"/batch",responseType:"application/xml"})})).then((function(t){o.debug(t.batchInfoList.batchInfo);var e=t.batchInfoList;return e=s.isArray(e.batchInfo)?e.batchInfo:[e.batchInfo]})).thenCall(t)},p.prototype.close=function(){var t=this;return this._changeState("Closed").then((function(e){return t.id=null,t.emit("close",e),e}),(function(e){throw t.emit("error",e),e}))},p.prototype.abort=function(){var t=this;return this._changeState("Aborted").then((function(e){return t.id=null,t.emit("abort",e),e}),(function(e){throw t.emit("error",e),e}))},p.prototype._changeState=function(t,e){var n=this,o=this._bulk,r=o._logger;return this._jobInfo=this._waitAssign().then((function(){var e=['','',""+t+"",""].join("");return o._request({method:"POST",path:"/job/"+n.id,body:e,headers:{"Content-Type":"application/xml; charset=utf-8"},responseType:"application/xml"})})).then((function(t){return r.debug(t.jobInfo),n.state=t.jobInfo.state,t.jobInfo})),this._jobInfo.thenCall(e)};var f=function(t,e){f.super_.call(this,{objectMode:!0}),this.job=t,this.id=e,this._bulk=t._bulk,this._deferred=h.defer(),this._setupDataStreams()};n(f,o.Writable),f.prototype._setupDataStreams=function(){var t=this,e={nullValue:"#N/A"};this._uploadStream=new c.Serializable,this._uploadDataStream=this._uploadStream.stream("csv",e),this._downloadStream=new c.Parsable,this._downloadDataStream=this._downloadStream.stream("csv",e),this.on("finish",(function(){t._uploadStream.end()})),this._uploadDataStream.once("readable",(function(){t.job.open().then((function(){t._uploadDataStream.pipe(t._createRequestStream())}))}));var n=this._dataStream=new r;n._write=function(e,n,o){t._uploadDataStream.write(e,n,o)},n.on("finish",(function(){t._uploadDataStream.end()})),this._downloadDataStream.on("readable",(function(){n.read(0)})),this._downloadDataStream.on("end",(function(){n.push(null)})),n._read=function(e){for(var o;null!==(o=t._downloadDataStream.read());)n.push(o)}},f.prototype._createRequestStream=function(){var t=this,e=t._bulk,n=e._logger;return e._request({method:"POST",path:"/job/"+t.job.id+"/batch",headers:{"Content-Type":"text/csv"},responseType:"application/xml"},(function(e,o){e?t.emit("error",e):(n.debug(o.batchInfo),t.id=o.batchInfo.id,t.emit("queue",o.batchInfo))})).stream()},f.prototype._write=function(t,e,n){t=s.clone(t),"insert"===this.job.operation?delete t.Id:"delete"===this.job.operation&&(t={Id:t.Id}),delete t.type,delete t.attributes,this._uploadStream.write(t,e,n)},f.prototype.stream=function(){return this._dataStream},f.prototype.run=f.prototype.exec=f.prototype.execute=function(t,e){var n=this;if("function"==typeof t&&(e=t,t=null),this._result)throw new Error("Batch already executed.");var o,r=h.defer();(this._result=r.promise,this._result.then((function(t){n._deferred.resolve(t)}),(function(t){n._deferred.reject(t)})),this.once("response",(function(t){r.resolve(t)})),this.once("error",(function(t){r.reject(t)})),s.isObject(t)&&s.isFunction(t.pipe))?t.pipe(this._dataStream):s.isArray(t)?(s.forEach(t,(function(t){Object.keys(t).forEach((function(e){"boolean"==typeof t[e]&&(t[e]=String(t[e]))})),n.write(t)})),n.end()):s.isString(t)&&(o=t,this._dataStream.write(o,"utf8"),this._dataStream.end());return this.thenCall(e)},f.prototype.then=function(t,e,n){return this._deferred.promise.then(t,e,n)},f.prototype.thenCall=function(e){return s.isFunction(e)&&this.then((function(n){t.nextTick((function(){e(null,n)}))}),(function(n){t.nextTick((function(){e(n)}))})),this},f.prototype.check=function(t){var e=this._bulk,n=e._logger,o=this.job.id,r=this.id;if(!o||!r)throw new Error("Batch not started.");return e._request({method:"GET",path:"/job/"+o+"/batch/"+r,responseType:"application/xml"}).then((function(t){return n.debug(t.batchInfo),t.batchInfo})).thenCall(t)},f.prototype.poll=function(t,e){var n=this,o=this.job.id,r=this.id;if(!o||!r)throw new Error("Batch not started.");var i=(new Date).getTime(),s=function(){var a=(new Date).getTime();if(i+e0?n.retrieve():n.emit("error",new Error(o.stateMessage)):"Completed"===o.state?n.retrieve():(n.emit("progress",o),setTimeout(s,t))}))};setTimeout(s,t)},f.prototype.retrieve=function(t){var e=this,n=this._bulk,o=this.job.id,r=this.job,i=this.id;if(!o||!i)throw new Error("Batch not started.");return r.info().then((function(t){return n._request({method:"GET",path:"/job/"+o+"/batch/"+i+"/result"})})).then((function(t){var a;if("query"===r.operation){n._conn,t["result-list"].result;a=t["result-list"].result,a=s.map(s.isArray(a)?a:[a],(function(t){return{id:t,batchId:i,jobId:o}}))}else a=s.map(t,(function(t){return{id:t.Id||null,success:"true"===t.Success,errors:t.Error?[t.Error]:[]}}));return e.emit("response",a),a})).fail((function(t){throw e.emit("error",t),t})).thenCall(t)},f.prototype.result=function(t){var e=this.job.id,n=this.id;if(!e||!n)throw new Error("Batch not started.");var o=new c.Parsable,r=o.stream("csv");this._bulk._request({method:"GET",path:"/job/"+e+"/batch/"+n+"/result/"+t,responseType:"application/octet-stream"}).stream().pipe(r);return o};var d=function(){d.super_.apply(this,arguments)};n(d,l),d.prototype.beforeSend=function(t){t.headers=t.headers||{},t.headers["X-SFDC-SESSION"]=this._conn.accessToken},d.prototype.isSessionExpired=function(t){return 400===t.statusCode&&/InvalidSessionId<\/exceptionCode>/.test(t.body)},d.prototype.hasErrorInResponseBody=function(t){return!!t.error},d.prototype.parseError=function(t){return{errorCode:t.error.exceptionCode,message:t.error.exceptionMessage}};var b=function(t){this._conn=t,this._logger=t._logger};b.prototype.pollInterval=1e3,b.prototype.pollTimeout=1e4,b.prototype._request=function(t,e){var n=this._conn;t=s.clone(t);var o=[n.instanceUrl,"services/async",n.version].join("/");t.url=o+t.path;var r={responseType:t.responseType};return delete t.path,delete t.responseType,new d(this._conn,r).request(t).thenCall(e)},b.prototype.load=function(t,e,n,o,r){var i=this;if(!t||!e)throw new Error("Insufficient arguments. At least, 'type' and 'operation' are required.");s.isObject(n)&&n.constructor===Object||(r=o,o=n,n=null);var a=this.createJob(t,e,n);a.once("error",(function(t){u&&u.emit("error",t)}));var u=a.createBatch(),c=function(){u=null,a.close()};return u.on("response",c),u.on("error",(function(t){"PollingTimeout"!==t.name&&c()})),u.on("queue",(function(){u.poll(i.pollInterval,i.pollTimeout)})),u.execute(o,r)},b.prototype.query=function(t){var e=t.replace(/\([\s\S]+\)/g,"").match(/FROM\s+(\w+)/i);if(!e)throw new Error("No sobject type found in query, maybe caused by invalid SOQL.");var n=e[1],o=this,r=new c.Parsable,i=r.stream("csv");return this.load(n,"query",t).then((function(t){var e=t.map((function(t){return o.job(t.jobId).batch(t.batchId).result(t.id).stream()}));a(e).pipe(i)})).fail((function(t){r.emit("error",t)})),r},b.prototype.createJob=function(t,e,n){return new p(this,t,e,n)},b.prototype.job=function(t){return new p(this,null,null,null,t)},u.on("connection:new",(function(t){t.bulk=new b(t)})),e.exports=b}).call(this,t("_process"))},{_process:2}],2:[function(t,e,n){var o,r,i=e.exports={};function s(){throw new Error("setTimeout has not been defined")}function a(){throw new Error("clearTimeout has not been defined")}function u(t){if(o===setTimeout)return setTimeout(t,0);if((o===s||!o)&&setTimeout)return o=setTimeout,setTimeout(t,0);try{return o(t,0)}catch(e){try{return o.call(null,t,0)}catch(e){return o.call(this,t,0)}}}!function(){try{o="function"==typeof setTimeout?setTimeout:s}catch(t){o=s}try{r="function"==typeof clearTimeout?clearTimeout:a}catch(t){r=a}}();var c,h=[],l=!1,p=-1;function f(){l&&c&&(l=!1,c.length?h=c.concat(h):p=-1,h.length&&d())}function d(){if(!l){var t=u(f);l=!0;for(var e=h.length;e;){for(c=h,h=[];++p1)for(var n=1;n\n */\n\n'use strict';\n\nvar inherits = window.jsforce.require('inherits'),\n stream = window.jsforce.require('readable-stream'),\n Duplex = stream.Duplex,\n events = window.jsforce.require('events'),\n _ = window.jsforce.require('lodash/core'),\n joinStreams = window.jsforce.require('multistream'),\n jsforce = window.jsforce.require('./core'),\n RecordStream = window.jsforce.require('./record-stream'),\n Promise = window.jsforce.require('./promise'),\n HttpApi = window.jsforce.require('./http-api');\n\n/*--------------------------------------------*/\n\n/**\n * Class for Bulk API Job\n *\n * @protected\n * @class Bulk~Job\n * @extends events.EventEmitter\n *\n * @param {Bulk} bulk - Bulk API object\n * @param {String} [type] - SObject type\n * @param {String} [operation] - Bulk load operation ('insert', 'update', 'upsert', 'delete', or 'hardDelete')\n * @param {Object} [options] - Options for bulk loading operation\n * @param {String} [options.extIdField] - External ID field name (used when upsert operation).\n * @param {String} [options.concurrencyMode] - 'Serial' or 'Parallel'. Defaults to Parallel.\n * @param {String} [jobId] - Job ID (if already available)\n */\nvar Job = function(bulk, type, operation, options, jobId) {\n this._bulk = bulk;\n this.type = type;\n this.operation = operation;\n this.options = options || {};\n this.id = jobId;\n this.state = this.id ? 'Open' : 'Unknown';\n this._batches = {};\n};\n\ninherits(Job, events.EventEmitter);\n\n/**\n * @typedef {Object} Bulk~JobInfo\n * @prop {String} id - Job ID\n * @prop {String} object - Object type name\n * @prop {String} operation - Operation type of the job\n * @prop {String} state - Job status\n */\n\n/**\n * Return latest jobInfo from cache\n *\n * @method Bulk~Job#info\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\nJob.prototype.info = function(callback) {\n var self = this;\n // if cache is not available, check the latest\n if (!this._jobInfo) {\n this._jobInfo = this.check();\n }\n return this._jobInfo.thenCall(callback);\n};\n\n/**\n * Open new job and get jobinfo\n *\n * @method Bulk~Job#open\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\nJob.prototype.open = function(callback) {\n var self = this;\n var bulk = this._bulk;\n var logger = bulk._logger;\n\n // if not requested opening job\n if (!this._jobInfo) {\n var operation = this.operation.toLowerCase();\n if (operation === 'harddelete') { operation = 'hardDelete'; }\n var body = [\n '',\n '',\n '' + operation + '',\n '' + this.type + '',\n (this.options.extIdField ?\n ''+this.options.extIdField+'' :\n ''),\n (this.options.concurrencyMode ?\n ''+this.options.concurrencyMode+'' :\n ''),\n (this.options.assignmentRuleId ?\n '' + this.options.assignmentRuleId + '' :\n ''),\n 'CSV',\n ''\n ].join('');\n\n this._jobInfo = bulk._request({\n method : 'POST',\n path : \"/job\",\n body : body,\n headers : {\n \"Content-Type\" : \"application/xml; charset=utf-8\"\n },\n responseType: \"application/xml\"\n }).then(function(res) {\n self.emit(\"open\", res.jobInfo);\n self.id = res.jobInfo.id;\n self.state = res.jobInfo.state;\n return res.jobInfo;\n }, function(err) {\n self.emit(\"error\", err);\n throw err;\n });\n }\n return this._jobInfo.thenCall(callback);\n};\n\n/**\n * Create a new batch instance in the job\n *\n * @method Bulk~Job#createBatch\n * @returns {Bulk~Batch}\n */\nJob.prototype.createBatch = function() {\n var batch = new Batch(this);\n var self = this;\n batch.on('queue', function() {\n self._batches[batch.id] = batch;\n });\n return batch;\n};\n\n/**\n * Get a batch instance specified by given batch ID\n *\n * @method Bulk~Job#batch\n * @param {String} batchId - Batch ID\n * @returns {Bulk~Batch}\n */\nJob.prototype.batch = function(batchId) {\n var batch = this._batches[batchId];\n if (!batch) {\n batch = new Batch(this, batchId);\n this._batches[batchId] = batch;\n }\n return batch;\n};\n\n/**\n * Check the latest job status from server\n *\n * @method Bulk~Job#check\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\nJob.prototype.check = function(callback) {\n var self = this;\n var bulk = this._bulk;\n var logger = bulk._logger;\n\n this._jobInfo = this._waitAssign().then(function() {\n return bulk._request({\n method : 'GET',\n path : \"/job/\" + self.id,\n responseType: \"application/xml\"\n });\n }).then(function(res) {\n logger.debug(res.jobInfo);\n self.id = res.jobInfo.id;\n self.type = res.jobInfo.object;\n self.operation = res.jobInfo.operation;\n self.state = res.jobInfo.state;\n return res.jobInfo;\n });\n return this._jobInfo.thenCall(callback);\n};\n\n/**\n * Wait till the job is assigned to server\n *\n * @method Bulk~Job#info\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\nJob.prototype._waitAssign = function(callback) {\n return (this.id ? Promise.resolve({ id: this.id }) : this.open()).thenCall(callback);\n};\n\n\n/**\n * List all registered batch info in job\n *\n * @method Bulk~Job#list\n * @param {Callback.>} [callback] - Callback function\n * @returns {Promise.>}\n */\nJob.prototype.list = function(callback) {\n var self = this;\n var bulk = this._bulk;\n var logger = bulk._logger;\n\n return this._waitAssign().then(function() {\n return bulk._request({\n method : 'GET',\n path : \"/job/\" + self.id + \"/batch\",\n responseType: \"application/xml\"\n });\n }).then(function(res) {\n logger.debug(res.batchInfoList.batchInfo);\n var batchInfoList = res.batchInfoList;\n batchInfoList = _.isArray(batchInfoList.batchInfo) ? batchInfoList.batchInfo : [ batchInfoList.batchInfo ];\n return batchInfoList;\n }).thenCall(callback);\n\n};\n\n/**\n * Close opened job\n *\n * @method Bulk~Job#close\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\nJob.prototype.close = function() {\n var self = this;\n return this._changeState(\"Closed\").then(function(jobInfo) {\n self.id = null;\n self.emit(\"close\", jobInfo);\n return jobInfo;\n }, function(err) {\n self.emit(\"error\", err);\n throw err;\n });\n};\n\n/**\n * Set the status to abort\n *\n * @method Bulk~Job#abort\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\nJob.prototype.abort = function() {\n var self = this;\n return this._changeState(\"Aborted\").then(function(jobInfo) {\n self.id = null;\n self.emit(\"abort\", jobInfo);\n return jobInfo;\n }, function(err) {\n self.emit(\"error\", err);\n throw err;\n });\n};\n\n/**\n * @private\n */\nJob.prototype._changeState = function(state, callback) {\n var self = this;\n var bulk = this._bulk;\n var logger = bulk._logger;\n\n this._jobInfo = this._waitAssign().then(function() {\n var body = [\n '',\n '',\n '' + state + '',\n ''\n ].join('');\n return bulk._request({\n method : 'POST',\n path : \"/job/\" + self.id,\n body : body,\n headers : {\n \"Content-Type\" : \"application/xml; charset=utf-8\"\n },\n responseType: \"application/xml\"\n });\n }).then(function(res) {\n logger.debug(res.jobInfo);\n self.state = res.jobInfo.state;\n return res.jobInfo;\n });\n return this._jobInfo.thenCall(callback);\n\n};\n\n\n/*--------------------------------------------*/\n\n/**\n * Batch (extends RecordStream)\n *\n * @protected\n * @class Bulk~Batch\n * @extends {stream.Writable}\n * @implements {Promise.>}\n * @param {Bulk~Job} job - Bulk job object\n * @param {String} [batchId] - Batch ID (if already available)\n */\nvar Batch = function(job, batchId) {\n Batch.super_.call(this, { objectMode: true });\n this.job = job;\n this.id = batchId;\n this._bulk = job._bulk;\n this._deferred = Promise.defer();\n this._setupDataStreams();\n};\n\ninherits(Batch, stream.Writable);\n\n\n/**\n * @private\n */\nBatch.prototype._setupDataStreams = function() {\n var batch = this;\n var converterOptions = { nullValue : '#N/A' };\n this._uploadStream = new RecordStream.Serializable();\n this._uploadDataStream = this._uploadStream.stream('csv', converterOptions);\n this._downloadStream = new RecordStream.Parsable();\n this._downloadDataStream = this._downloadStream.stream('csv', converterOptions);\n\n this.on('finish', function() {\n batch._uploadStream.end();\n });\n this._uploadDataStream.once('readable', function() {\n batch.job.open().then(function() {\n // pipe upload data to batch API request stream\n batch._uploadDataStream.pipe(batch._createRequestStream());\n });\n });\n\n // duplex data stream, opened access to API programmers by Batch#stream()\n var dataStream = this._dataStream = new Duplex();\n dataStream._write = function(data, enc, cb) {\n batch._uploadDataStream.write(data, enc, cb);\n };\n dataStream.on('finish', function() {\n batch._uploadDataStream.end();\n });\n\n this._downloadDataStream.on('readable', function() {\n dataStream.read(0);\n });\n this._downloadDataStream.on('end', function() {\n dataStream.push(null);\n });\n dataStream._read = function(size) {\n var chunk;\n while ((chunk = batch._downloadDataStream.read()) !== null) {\n dataStream.push(chunk);\n }\n };\n};\n\n/**\n * Connect batch API and create stream instance of request/response\n *\n * @private\n * @returns {stream.Duplex}\n */\nBatch.prototype._createRequestStream = function() {\n var batch = this;\n var bulk = batch._bulk;\n var logger = bulk._logger;\n\n return bulk._request({\n method : 'POST',\n path : \"/job/\" + batch.job.id + \"/batch\",\n headers: {\n \"Content-Type\": \"text/csv\"\n },\n responseType: \"application/xml\"\n }, function(err, res) {\n if (err) {\n batch.emit('error', err);\n } else {\n logger.debug(res.batchInfo);\n batch.id = res.batchInfo.id;\n batch.emit('queue', res.batchInfo);\n }\n }).stream();\n};\n\n/**\n * Implementation of Writable\n *\n * @override\n * @private\n */\nBatch.prototype._write = function(record, enc, cb) {\n record = _.clone(record);\n if (this.job.operation === \"insert\") {\n delete record.Id;\n } else if (this.job.operation === \"delete\") {\n record = { Id: record.Id };\n }\n delete record.type;\n delete record.attributes;\n this._uploadStream.write(record, enc, cb);\n};\n\n/**\n * Returns duplex stream which accepts CSV data input and batch result output\n *\n * @returns {stream.Duplex}\n */\nBatch.prototype.stream = function() {\n return this._dataStream;\n};\n\n/**\n * Execute batch operation\n *\n * @method Bulk~Batch#execute\n * @param {Array.|stream.Stream|String} [input] - Input source for batch operation. Accepts array of records, CSV string, and CSV data input stream in insert/update/upsert/delete/hardDelete operation, SOQL string in query operation.\n * @param {Callback.|Array.>} [callback] - Callback function\n * @returns {Bulk~Batch}\n */\nBatch.prototype.run =\nBatch.prototype.exec =\nBatch.prototype.execute = function(input, callback) {\n var self = this;\n\n if (typeof input === 'function') { // if input argument is omitted\n callback = input;\n input = null;\n }\n\n // if batch is already executed\n if (this._result) {\n throw new Error(\"Batch already executed.\");\n }\n\n var rdeferred = Promise.defer();\n this._result = rdeferred.promise;\n this._result.then(function(res) {\n self._deferred.resolve(res);\n }, function(err) {\n self._deferred.reject(err);\n });\n this.once('response', function(res) {\n rdeferred.resolve(res);\n });\n this.once('error', function(err) {\n rdeferred.reject(err);\n });\n\n if (_.isObject(input) && _.isFunction(input.pipe)) { // if input has stream.Readable interface\n input.pipe(this._dataStream);\n } else {\n var data;\n if (_.isArray(input)) {\n _.forEach(input, function(record) {\n Object.keys(record).forEach(function(key) {\n if (typeof record[key] === 'boolean') {\n record[key] = String(record[key])\n }\n })\n self.write(record);\n });\n self.end();\n } else if (_.isString(input)){\n data = input;\n this._dataStream.write(data, 'utf8');\n this._dataStream.end();\n }\n }\n\n // return Batch instance for chaining\n return this.thenCall(callback);\n};\n\n/**\n * Promise/A+ interface\n * http://promises-aplus.github.io/promises-spec/\n *\n * Delegate to deferred promise, return promise instance for batch result\n *\n * @method Bulk~Batch#then\n */\nBatch.prototype.then = function(onResolved, onReject, onProgress) {\n return this._deferred.promise.then(onResolved, onReject, onProgress);\n};\n\n/**\n * Promise/A+ extension\n * Call \"then\" using given node-style callback function\n *\n * @method Bulk~Batch#thenCall\n */\nBatch.prototype.thenCall = function(callback) {\n if (_.isFunction(callback)) {\n this.then(function(res) {\n process.nextTick(function() {\n callback(null, res);\n });\n }, function(err) {\n process.nextTick(function() {\n callback(err);\n });\n });\n }\n return this;\n};\n\n/**\n * @typedef {Object} Bulk~BatchInfo\n * @prop {String} id - Batch ID\n * @prop {String} jobId - Job ID\n * @prop {String} state - Batch state\n * @prop {String} stateMessage - Batch state message\n */\n\n/**\n * Check the latest batch status in server\n *\n * @method Bulk~Batch#check\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\nBatch.prototype.check = function(callback) {\n var self = this;\n var bulk = this._bulk;\n var logger = bulk._logger;\n var jobId = this.job.id;\n var batchId = this.id;\n\n if (!jobId || !batchId) {\n throw new Error(\"Batch not started.\");\n }\n return bulk._request({\n method : 'GET',\n path : \"/job/\" + jobId + \"/batch/\" + batchId,\n responseType: \"application/xml\"\n }).then(function(res) {\n logger.debug(res.batchInfo);\n return res.batchInfo;\n }).thenCall(callback);\n};\n\n\n/**\n * Polling the batch result and retrieve\n *\n * @method Bulk~Batch#poll\n * @param {Number} interval - Polling interval in milliseconds\n * @param {Number} timeout - Polling timeout in milliseconds\n */\nBatch.prototype.poll = function(interval, timeout) {\n var self = this;\n var jobId = this.job.id;\n var batchId = this.id;\n\n if (!jobId || !batchId) {\n throw new Error(\"Batch not started.\");\n }\n var startTime = new Date().getTime();\n var poll = function() {\n var now = new Date().getTime();\n if (startTime + timeout < now) {\n var err = new Error(\"Polling time out. Job Id = \" + jobId + \" , batch Id = \" + batchId);\n err.name = 'PollingTimeout';\n err.jobId = jobId;\n err.batchId = batchId;\n self.emit('error', err);\n return;\n }\n self.check(function(err, res) {\n if (err) {\n self.emit('error', err);\n } else {\n if (res.state === \"Failed\") {\n if (parseInt(res.numberRecordsProcessed, 10) > 0) {\n self.retrieve();\n } else {\n self.emit('error', new Error(res.stateMessage));\n }\n } else if (res.state === \"Completed\") {\n self.retrieve();\n } else {\n self.emit('progress', res);\n setTimeout(poll, interval);\n }\n }\n });\n };\n setTimeout(poll, interval);\n};\n\n/**\n * @typedef {Object} Bulk~BatchResultInfo\n * @prop {String} id - Batch result ID\n * @prop {String} batchId - Batch ID which includes this batch result.\n * @prop {String} jobId - Job ID which includes this batch result.\n */\n\n/**\n * Retrieve batch result\n *\n * @method Bulk~Batch#retrieve\n * @param {Callback.|Array.>} [callback] - Callback function\n * @returns {Promise.|Array.>}\n */\nBatch.prototype.retrieve = function(callback) {\n var self = this;\n var bulk = this._bulk;\n var jobId = this.job.id;\n var job = this.job;\n var batchId = this.id;\n\n if (!jobId || !batchId) {\n throw new Error(\"Batch not started.\");\n }\n\n return job.info().then(function(jobInfo) {\n return bulk._request({\n method : 'GET',\n path : \"/job/\" + jobId + \"/batch/\" + batchId + \"/result\"\n });\n }).then(function(res) {\n var results;\n if (job.operation === 'query') {\n var conn = bulk._conn;\n var resultIds = res['result-list'].result;\n results = res['result-list'].result;\n results = _.map(_.isArray(results) ? results : [ results ], function(id) {\n return {\n id: id,\n batchId: batchId,\n jobId: jobId\n };\n });\n } else {\n results = _.map(res, function(ret) {\n return {\n id: ret.Id || null,\n success: ret.Success === \"true\",\n errors: ret.Error ? [ ret.Error ] : []\n };\n });\n }\n self.emit('response', results);\n return results;\n }).fail(function(err) {\n self.emit('error', err);\n throw err;\n }).thenCall(callback);\n};\n\n/**\n * Fetch query result as a record stream\n * @param {String} resultId - Result id\n * @returns {RecordStream} - Record stream, convertible to CSV data stream\n */\nBatch.prototype.result = function(resultId) {\n var jobId = this.job.id;\n var batchId = this.id;\n if (!jobId || !batchId) {\n throw new Error(\"Batch not started.\");\n }\n var resultStream = new RecordStream.Parsable();\n var resultDataStream = resultStream.stream('csv');\n var reqStream = this._bulk._request({\n method : 'GET',\n path : \"/job/\" + jobId + \"/batch/\" + batchId + \"/result/\" + resultId,\n responseType: \"application/octet-stream\"\n }).stream().pipe(resultDataStream);\n return resultStream;\n};\n\n/*--------------------------------------------*/\n/**\n * @private\n */\nvar BulkApi = function() {\n BulkApi.super_.apply(this, arguments);\n};\n\ninherits(BulkApi, HttpApi);\n\nBulkApi.prototype.beforeSend = function(request) {\n request.headers = request.headers || {};\n request.headers[\"X-SFDC-SESSION\"] = this._conn.accessToken;\n};\n\nBulkApi.prototype.isSessionExpired = function(response) {\n return response.statusCode === 400 &&\n /InvalidSessionId<\\/exceptionCode>/.test(response.body);\n};\n\nBulkApi.prototype.hasErrorInResponseBody = function(body) {\n return !!body.error;\n};\n\nBulkApi.prototype.parseError = function(body) {\n return {\n errorCode: body.error.exceptionCode,\n message: body.error.exceptionMessage\n };\n};\n\n/*--------------------------------------------*/\n\n/**\n * Class for Bulk API\n *\n * @class\n * @param {Connection} conn - Connection object\n */\nvar Bulk = function(conn) {\n this._conn = conn;\n this._logger = conn._logger;\n};\n\n/**\n * Polling interval in milliseconds\n * @type {Number}\n */\nBulk.prototype.pollInterval = 1000;\n\n/**\n * Polling timeout in milliseconds\n * @type {Number}\n */\nBulk.prototype.pollTimeout = 10000;\n\n/** @private **/\nBulk.prototype._request = function(request, callback) {\n var conn = this._conn;\n request = _.clone(request);\n var baseUrl = [ conn.instanceUrl, \"services/async\", conn.version ].join('/');\n request.url = baseUrl + request.path;\n var options = { responseType: request.responseType };\n delete request.path;\n delete request.responseType;\n return new BulkApi(this._conn, options).request(request).thenCall(callback);\n};\n\n/**\n * Create and start bulkload job and batch\n *\n * @param {String} type - SObject type\n * @param {String} operation - Bulk load operation ('insert', 'update', 'upsert', 'delete', or 'hardDelete')\n * @param {Object} [options] - Options for bulk loading operation\n * @param {String} [options.extIdField] - External ID field name (used when upsert operation).\n * @param {String} [options.concurrencyMode] - 'Serial' or 'Parallel'. Defaults to Parallel.\n * @param {Array.|stream.Stream|String} [input] - Input source for bulkload. Accepts array of records, CSV string, and CSV data input stream in insert/update/upsert/delete/hardDelete operation, SOQL string in query operation.\n * @param {Callback.|Array.>} [callback] - Callback function\n * @returns {Bulk~Batch}\n */\nBulk.prototype.load = function(type, operation, options, input, callback) {\n var self = this;\n if (!type || !operation) {\n throw new Error(\"Insufficient arguments. At least, 'type' and 'operation' are required.\");\n }\n if (!_.isObject(options) || options.constructor !== Object) { // when options is not plain hash object, it is omitted\n callback = input;\n input = options;\n options = null;\n }\n var job = this.createJob(type, operation, options);\n job.once('error', function (error) {\n if (batch) {\n batch.emit('error', error); // pass job error to batch\n }\n });\n var batch = job.createBatch();\n var cleanup = function() {\n batch = null;\n job.close();\n };\n var cleanupOnError = function(err) {\n if (err.name !== 'PollingTimeout') {\n cleanup();\n }\n };\n batch.on('response', cleanup);\n batch.on('error', cleanupOnError);\n batch.on('queue', function() { batch.poll(self.pollInterval, self.pollTimeout); });\n return batch.execute(input, callback);\n};\n\n/**\n * Execute bulk query and get record stream\n *\n * @param {String} soql - SOQL to execute in bulk job\n * @returns {RecordStream.Parsable} - Record stream, convertible to CSV data stream\n */\nBulk.prototype.query = function(soql) {\n var m = soql.replace(/\\([\\s\\S]+\\)/g, '').match(/FROM\\s+(\\w+)/i);\n if (!m) {\n throw new Error(\"No sobject type found in query, maybe caused by invalid SOQL.\");\n }\n var type = m[1];\n var self = this;\n var recordStream = new RecordStream.Parsable();\n var dataStream = recordStream.stream('csv');\n this.load(type, \"query\", soql).then(function(results) {\n var streams = results.map(function(result) {\n return self\n .job(result.jobId)\n .batch(result.batchId)\n .result(result.id)\n .stream();\n });\n\n joinStreams(streams).pipe(dataStream);\n }).fail(function(err) {\n recordStream.emit('error', err);\n });\n return recordStream;\n};\n\n\n/**\n * Create a new job instance\n *\n * @param {String} type - SObject type\n * @param {String} operation - Bulk load operation ('insert', 'update', 'upsert', 'delete', 'hardDelete', or 'query')\n * @param {Object} [options] - Options for bulk loading operation\n * @returns {Bulk~Job}\n */\nBulk.prototype.createJob = function(type, operation, options) {\n return new Job(this, type, operation, options);\n};\n\n/**\n * Get a job instance specified by given job ID\n *\n * @param {String} jobId - Job ID\n * @returns {Bulk~Job}\n */\nBulk.prototype.job = function(jobId) {\n return new Job(this, null, null, null, jobId);\n};\n\n\n/*--------------------------------------------*/\n/*\n * Register hook in connection instantiation for dynamically adding this API module features\n */\njsforce.on('connection:new', function(conn) {\n conn.bulk = new Bulk(conn);\n});\n\n\nmodule.exports = Bulk;\n\n}).call(this,require('_process'))\n\n},{\"_process\":2}],2:[function(require,module,exports){\n// shim for using process in browser\nvar process = module.exports = {};\n\n// cached from whatever global is present so that test runners that stub it\n// don't break things. But we need to wrap it in a try catch in case it is\n// wrapped in strict mode code which doesn't define any globals. It's inside a\n// function because try/catches deoptimize in certain engines.\n\nvar cachedSetTimeout;\nvar cachedClearTimeout;\n\nfunction defaultSetTimout() {\n throw new Error('setTimeout has not been defined');\n}\nfunction defaultClearTimeout () {\n throw new Error('clearTimeout has not been defined');\n}\n(function () {\n try {\n if (typeof setTimeout === 'function') {\n cachedSetTimeout = setTimeout;\n } else {\n cachedSetTimeout = defaultSetTimout;\n }\n } catch (e) {\n cachedSetTimeout = defaultSetTimout;\n }\n try {\n if (typeof clearTimeout === 'function') {\n cachedClearTimeout = clearTimeout;\n } else {\n cachedClearTimeout = defaultClearTimeout;\n }\n } catch (e) {\n cachedClearTimeout = defaultClearTimeout;\n }\n} ())\nfunction runTimeout(fun) {\n if (cachedSetTimeout === setTimeout) {\n //normal enviroments in sane situations\n return setTimeout(fun, 0);\n }\n // if setTimeout wasn't available but was latter defined\n if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n cachedSetTimeout = setTimeout;\n return setTimeout(fun, 0);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedSetTimeout(fun, 0);\n } catch(e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedSetTimeout.call(null, fun, 0);\n } catch(e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n return cachedSetTimeout.call(this, fun, 0);\n }\n }\n\n\n}\nfunction runClearTimeout(marker) {\n if (cachedClearTimeout === clearTimeout) {\n //normal enviroments in sane situations\n return clearTimeout(marker);\n }\n // if clearTimeout wasn't available but was latter defined\n if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n cachedClearTimeout = clearTimeout;\n return clearTimeout(marker);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedClearTimeout(marker);\n } catch (e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedClearTimeout.call(null, marker);\n } catch (e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n return cachedClearTimeout.call(this, marker);\n }\n }\n\n\n\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n if (!draining || !currentQueue) {\n return;\n }\n draining = false;\n if (currentQueue.length) {\n queue = currentQueue.concat(queue);\n } else {\n queueIndex = -1;\n }\n if (queue.length) {\n drainQueue();\n }\n}\n\nfunction drainQueue() {\n if (draining) {\n return;\n }\n var timeout = runTimeout(cleanUpNextTick);\n draining = true;\n\n var len = queue.length;\n while(len) {\n currentQueue = queue;\n queue = [];\n while (++queueIndex < len) {\n if (currentQueue) {\n currentQueue[queueIndex].run();\n }\n }\n queueIndex = -1;\n len = queue.length;\n }\n currentQueue = null;\n draining = false;\n runClearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n var args = new Array(arguments.length - 1);\n if (arguments.length > 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},{}]},{},[1])(1)\n});\n\n","/*global process*/\n/**\n * @file Manages Salesforce Bulk API related operations\n * @author Shinichi Tomita \n */\n\n'use strict';\n\nvar inherits = window.jsforce.require('inherits'),\n stream = window.jsforce.require('readable-stream'),\n Duplex = stream.Duplex,\n events = window.jsforce.require('events'),\n _ = window.jsforce.require('lodash/core'),\n joinStreams = window.jsforce.require('multistream'),\n jsforce = window.jsforce.require('./core'),\n RecordStream = window.jsforce.require('./record-stream'),\n Promise = window.jsforce.require('./promise'),\n HttpApi = window.jsforce.require('./http-api');\n\n/*--------------------------------------------*/\n\n/**\n * Class for Bulk API Job\n *\n * @protected\n * @class Bulk~Job\n * @extends events.EventEmitter\n *\n * @param {Bulk} bulk - Bulk API object\n * @param {String} [type] - SObject type\n * @param {String} [operation] - Bulk load operation ('insert', 'update', 'upsert', 'delete', or 'hardDelete')\n * @param {Object} [options] - Options for bulk loading operation\n * @param {String} [options.extIdField] - External ID field name (used when upsert operation).\n * @param {String} [options.concurrencyMode] - 'Serial' or 'Parallel'. Defaults to Parallel.\n * @param {String} [jobId] - Job ID (if already available)\n */\nvar Job = function(bulk, type, operation, options, jobId) {\n this._bulk = bulk;\n this.type = type;\n this.operation = operation;\n this.options = options || {};\n this.id = jobId;\n this.state = this.id ? 'Open' : 'Unknown';\n this._batches = {};\n};\n\ninherits(Job, events.EventEmitter);\n\n/**\n * @typedef {Object} Bulk~JobInfo\n * @prop {String} id - Job ID\n * @prop {String} object - Object type name\n * @prop {String} operation - Operation type of the job\n * @prop {String} state - Job status\n */\n\n/**\n * Return latest jobInfo from cache\n *\n * @method Bulk~Job#info\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\nJob.prototype.info = function(callback) {\n var self = this;\n // if cache is not available, check the latest\n if (!this._jobInfo) {\n this._jobInfo = this.check();\n }\n return this._jobInfo.thenCall(callback);\n};\n\n/**\n * Open new job and get jobinfo\n *\n * @method Bulk~Job#open\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\nJob.prototype.open = function(callback) {\n var self = this;\n var bulk = this._bulk;\n var logger = bulk._logger;\n\n // if not requested opening job\n if (!this._jobInfo) {\n var operation = this.operation.toLowerCase();\n if (operation === 'harddelete') { operation = 'hardDelete'; }\n var body = [\n '',\n '',\n '' + operation + '',\n '' + this.type + '',\n (this.options.extIdField ?\n ''+this.options.extIdField+'' :\n ''),\n (this.options.concurrencyMode ?\n ''+this.options.concurrencyMode+'' :\n ''),\n (this.options.assignmentRuleId ?\n '' + this.options.assignmentRuleId + '' :\n ''),\n 'CSV',\n ''\n ].join('');\n\n this._jobInfo = bulk._request({\n method : 'POST',\n path : \"/job\",\n body : body,\n headers : {\n \"Content-Type\" : \"application/xml; charset=utf-8\"\n },\n responseType: \"application/xml\"\n }).then(function(res) {\n self.emit(\"open\", res.jobInfo);\n self.id = res.jobInfo.id;\n self.state = res.jobInfo.state;\n return res.jobInfo;\n }, function(err) {\n self.emit(\"error\", err);\n throw err;\n });\n }\n return this._jobInfo.thenCall(callback);\n};\n\n/**\n * Create a new batch instance in the job\n *\n * @method Bulk~Job#createBatch\n * @returns {Bulk~Batch}\n */\nJob.prototype.createBatch = function() {\n var batch = new Batch(this);\n var self = this;\n batch.on('queue', function() {\n self._batches[batch.id] = batch;\n });\n return batch;\n};\n\n/**\n * Get a batch instance specified by given batch ID\n *\n * @method Bulk~Job#batch\n * @param {String} batchId - Batch ID\n * @returns {Bulk~Batch}\n */\nJob.prototype.batch = function(batchId) {\n var batch = this._batches[batchId];\n if (!batch) {\n batch = new Batch(this, batchId);\n this._batches[batchId] = batch;\n }\n return batch;\n};\n\n/**\n * Check the latest job status from server\n *\n * @method Bulk~Job#check\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\nJob.prototype.check = function(callback) {\n var self = this;\n var bulk = this._bulk;\n var logger = bulk._logger;\n\n this._jobInfo = this._waitAssign().then(function() {\n return bulk._request({\n method : 'GET',\n path : \"/job/\" + self.id,\n responseType: \"application/xml\"\n });\n }).then(function(res) {\n logger.debug(res.jobInfo);\n self.id = res.jobInfo.id;\n self.type = res.jobInfo.object;\n self.operation = res.jobInfo.operation;\n self.state = res.jobInfo.state;\n return res.jobInfo;\n });\n return this._jobInfo.thenCall(callback);\n};\n\n/**\n * Wait till the job is assigned to server\n *\n * @method Bulk~Job#info\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\nJob.prototype._waitAssign = function(callback) {\n return (this.id ? Promise.resolve({ id: this.id }) : this.open()).thenCall(callback);\n};\n\n\n/**\n * List all registered batch info in job\n *\n * @method Bulk~Job#list\n * @param {Callback.>} [callback] - Callback function\n * @returns {Promise.>}\n */\nJob.prototype.list = function(callback) {\n var self = this;\n var bulk = this._bulk;\n var logger = bulk._logger;\n\n return this._waitAssign().then(function() {\n return bulk._request({\n method : 'GET',\n path : \"/job/\" + self.id + \"/batch\",\n responseType: \"application/xml\"\n });\n }).then(function(res) {\n logger.debug(res.batchInfoList.batchInfo);\n var batchInfoList = res.batchInfoList;\n batchInfoList = _.isArray(batchInfoList.batchInfo) ? batchInfoList.batchInfo : [ batchInfoList.batchInfo ];\n return batchInfoList;\n }).thenCall(callback);\n\n};\n\n/**\n * Close opened job\n *\n * @method Bulk~Job#close\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\nJob.prototype.close = function() {\n var self = this;\n return this._changeState(\"Closed\").then(function(jobInfo) {\n self.id = null;\n self.emit(\"close\", jobInfo);\n return jobInfo;\n }, function(err) {\n self.emit(\"error\", err);\n throw err;\n });\n};\n\n/**\n * Set the status to abort\n *\n * @method Bulk~Job#abort\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\nJob.prototype.abort = function() {\n var self = this;\n return this._changeState(\"Aborted\").then(function(jobInfo) {\n self.id = null;\n self.emit(\"abort\", jobInfo);\n return jobInfo;\n }, function(err) {\n self.emit(\"error\", err);\n throw err;\n });\n};\n\n/**\n * @private\n */\nJob.prototype._changeState = function(state, callback) {\n var self = this;\n var bulk = this._bulk;\n var logger = bulk._logger;\n\n this._jobInfo = this._waitAssign().then(function() {\n var body = [\n '',\n '',\n '' + state + '',\n ''\n ].join('');\n return bulk._request({\n method : 'POST',\n path : \"/job/\" + self.id,\n body : body,\n headers : {\n \"Content-Type\" : \"application/xml; charset=utf-8\"\n },\n responseType: \"application/xml\"\n });\n }).then(function(res) {\n logger.debug(res.jobInfo);\n self.state = res.jobInfo.state;\n return res.jobInfo;\n });\n return this._jobInfo.thenCall(callback);\n\n};\n\n\n/*--------------------------------------------*/\n\n/**\n * Batch (extends RecordStream)\n *\n * @protected\n * @class Bulk~Batch\n * @extends {stream.Writable}\n * @implements {Promise.>}\n * @param {Bulk~Job} job - Bulk job object\n * @param {String} [batchId] - Batch ID (if already available)\n */\nvar Batch = function(job, batchId) {\n Batch.super_.call(this, { objectMode: true });\n this.job = job;\n this.id = batchId;\n this._bulk = job._bulk;\n this._deferred = Promise.defer();\n this._setupDataStreams();\n};\n\ninherits(Batch, stream.Writable);\n\n\n/**\n * @private\n */\nBatch.prototype._setupDataStreams = function() {\n var batch = this;\n var converterOptions = { nullValue : '#N/A' };\n this._uploadStream = new RecordStream.Serializable();\n this._uploadDataStream = this._uploadStream.stream('csv', converterOptions);\n this._downloadStream = new RecordStream.Parsable();\n this._downloadDataStream = this._downloadStream.stream('csv', converterOptions);\n\n this.on('finish', function() {\n batch._uploadStream.end();\n });\n this._uploadDataStream.once('readable', function() {\n batch.job.open().then(function() {\n // pipe upload data to batch API request stream\n batch._uploadDataStream.pipe(batch._createRequestStream());\n });\n });\n\n // duplex data stream, opened access to API programmers by Batch#stream()\n var dataStream = this._dataStream = new Duplex();\n dataStream._write = function(data, enc, cb) {\n batch._uploadDataStream.write(data, enc, cb);\n };\n dataStream.on('finish', function() {\n batch._uploadDataStream.end();\n });\n\n this._downloadDataStream.on('readable', function() {\n dataStream.read(0);\n });\n this._downloadDataStream.on('end', function() {\n dataStream.push(null);\n });\n dataStream._read = function(size) {\n var chunk;\n while ((chunk = batch._downloadDataStream.read()) !== null) {\n dataStream.push(chunk);\n }\n };\n};\n\n/**\n * Connect batch API and create stream instance of request/response\n *\n * @private\n * @returns {stream.Duplex}\n */\nBatch.prototype._createRequestStream = function() {\n var batch = this;\n var bulk = batch._bulk;\n var logger = bulk._logger;\n\n return bulk._request({\n method : 'POST',\n path : \"/job/\" + batch.job.id + \"/batch\",\n headers: {\n \"Content-Type\": \"text/csv\"\n },\n responseType: \"application/xml\"\n }, function(err, res) {\n if (err) {\n batch.emit('error', err);\n } else {\n logger.debug(res.batchInfo);\n batch.id = res.batchInfo.id;\n batch.emit('queue', res.batchInfo);\n }\n }).stream();\n};\n\n/**\n * Implementation of Writable\n *\n * @override\n * @private\n */\nBatch.prototype._write = function(record, enc, cb) {\n record = _.clone(record);\n if (this.job.operation === \"insert\") {\n delete record.Id;\n } else if (this.job.operation === \"delete\") {\n record = { Id: record.Id };\n }\n delete record.type;\n delete record.attributes;\n this._uploadStream.write(record, enc, cb);\n};\n\n/**\n * Returns duplex stream which accepts CSV data input and batch result output\n *\n * @returns {stream.Duplex}\n */\nBatch.prototype.stream = function() {\n return this._dataStream;\n};\n\n/**\n * Execute batch operation\n *\n * @method Bulk~Batch#execute\n * @param {Array.|stream.Stream|String} [input] - Input source for batch operation. Accepts array of records, CSV string, and CSV data input stream in insert/update/upsert/delete/hardDelete operation, SOQL string in query operation.\n * @param {Callback.|Array.>} [callback] - Callback function\n * @returns {Bulk~Batch}\n */\nBatch.prototype.run =\nBatch.prototype.exec =\nBatch.prototype.execute = function(input, callback) {\n var self = this;\n\n if (typeof input === 'function') { // if input argument is omitted\n callback = input;\n input = null;\n }\n\n // if batch is already executed\n if (this._result) {\n throw new Error(\"Batch already executed.\");\n }\n\n var rdeferred = Promise.defer();\n this._result = rdeferred.promise;\n this._result.then(function(res) {\n self._deferred.resolve(res);\n }, function(err) {\n self._deferred.reject(err);\n });\n this.once('response', function(res) {\n rdeferred.resolve(res);\n });\n this.once('error', function(err) {\n rdeferred.reject(err);\n });\n\n if (_.isObject(input) && _.isFunction(input.pipe)) { // if input has stream.Readable interface\n input.pipe(this._dataStream);\n } else {\n var data;\n if (_.isArray(input)) {\n _.forEach(input, function(record) {\n Object.keys(record).forEach(function(key) {\n if (typeof record[key] === 'boolean') {\n record[key] = String(record[key])\n }\n })\n self.write(record);\n });\n self.end();\n } else if (_.isString(input)){\n data = input;\n this._dataStream.write(data, 'utf8');\n this._dataStream.end();\n }\n }\n\n // return Batch instance for chaining\n return this.thenCall(callback);\n};\n\n/**\n * Promise/A+ interface\n * http://promises-aplus.github.io/promises-spec/\n *\n * Delegate to deferred promise, return promise instance for batch result\n *\n * @method Bulk~Batch#then\n */\nBatch.prototype.then = function(onResolved, onReject, onProgress) {\n return this._deferred.promise.then(onResolved, onReject, onProgress);\n};\n\n/**\n * Promise/A+ extension\n * Call \"then\" using given node-style callback function\n *\n * @method Bulk~Batch#thenCall\n */\nBatch.prototype.thenCall = function(callback) {\n if (_.isFunction(callback)) {\n this.then(function(res) {\n process.nextTick(function() {\n callback(null, res);\n });\n }, function(err) {\n process.nextTick(function() {\n callback(err);\n });\n });\n }\n return this;\n};\n\n/**\n * @typedef {Object} Bulk~BatchInfo\n * @prop {String} id - Batch ID\n * @prop {String} jobId - Job ID\n * @prop {String} state - Batch state\n * @prop {String} stateMessage - Batch state message\n */\n\n/**\n * Check the latest batch status in server\n *\n * @method Bulk~Batch#check\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\nBatch.prototype.check = function(callback) {\n var self = this;\n var bulk = this._bulk;\n var logger = bulk._logger;\n var jobId = this.job.id;\n var batchId = this.id;\n\n if (!jobId || !batchId) {\n throw new Error(\"Batch not started.\");\n }\n return bulk._request({\n method : 'GET',\n path : \"/job/\" + jobId + \"/batch/\" + batchId,\n responseType: \"application/xml\"\n }).then(function(res) {\n logger.debug(res.batchInfo);\n return res.batchInfo;\n }).thenCall(callback);\n};\n\n\n/**\n * Polling the batch result and retrieve\n *\n * @method Bulk~Batch#poll\n * @param {Number} interval - Polling interval in milliseconds\n * @param {Number} timeout - Polling timeout in milliseconds\n */\nBatch.prototype.poll = function(interval, timeout) {\n var self = this;\n var jobId = this.job.id;\n var batchId = this.id;\n\n if (!jobId || !batchId) {\n throw new Error(\"Batch not started.\");\n }\n var startTime = new Date().getTime();\n var poll = function() {\n var now = new Date().getTime();\n if (startTime + timeout < now) {\n var err = new Error(\"Polling time out. Job Id = \" + jobId + \" , batch Id = \" + batchId);\n err.name = 'PollingTimeout';\n err.jobId = jobId;\n err.batchId = batchId;\n self.emit('error', err);\n return;\n }\n self.check(function(err, res) {\n if (err) {\n self.emit('error', err);\n } else {\n if (res.state === \"Failed\") {\n if (parseInt(res.numberRecordsProcessed, 10) > 0) {\n self.retrieve();\n } else {\n self.emit('error', new Error(res.stateMessage));\n }\n } else if (res.state === \"Completed\") {\n self.retrieve();\n } else {\n self.emit('progress', res);\n setTimeout(poll, interval);\n }\n }\n });\n };\n setTimeout(poll, interval);\n};\n\n/**\n * @typedef {Object} Bulk~BatchResultInfo\n * @prop {String} id - Batch result ID\n * @prop {String} batchId - Batch ID which includes this batch result.\n * @prop {String} jobId - Job ID which includes this batch result.\n */\n\n/**\n * Retrieve batch result\n *\n * @method Bulk~Batch#retrieve\n * @param {Callback.|Array.>} [callback] - Callback function\n * @returns {Promise.|Array.>}\n */\nBatch.prototype.retrieve = function(callback) {\n var self = this;\n var bulk = this._bulk;\n var jobId = this.job.id;\n var job = this.job;\n var batchId = this.id;\n\n if (!jobId || !batchId) {\n throw new Error(\"Batch not started.\");\n }\n\n return job.info().then(function(jobInfo) {\n return bulk._request({\n method : 'GET',\n path : \"/job/\" + jobId + \"/batch/\" + batchId + \"/result\"\n });\n }).then(function(res) {\n var results;\n if (job.operation === 'query') {\n var conn = bulk._conn;\n var resultIds = res['result-list'].result;\n results = res['result-list'].result;\n results = _.map(_.isArray(results) ? results : [ results ], function(id) {\n return {\n id: id,\n batchId: batchId,\n jobId: jobId\n };\n });\n } else {\n results = _.map(res, function(ret) {\n return {\n id: ret.Id || null,\n success: ret.Success === \"true\",\n errors: ret.Error ? [ ret.Error ] : []\n };\n });\n }\n self.emit('response', results);\n return results;\n }).fail(function(err) {\n self.emit('error', err);\n throw err;\n }).thenCall(callback);\n};\n\n/**\n * Fetch query result as a record stream\n * @param {String} resultId - Result id\n * @returns {RecordStream} - Record stream, convertible to CSV data stream\n */\nBatch.prototype.result = function(resultId) {\n var jobId = this.job.id;\n var batchId = this.id;\n if (!jobId || !batchId) {\n throw new Error(\"Batch not started.\");\n }\n var resultStream = new RecordStream.Parsable();\n var resultDataStream = resultStream.stream('csv');\n var reqStream = this._bulk._request({\n method : 'GET',\n path : \"/job/\" + jobId + \"/batch/\" + batchId + \"/result/\" + resultId,\n responseType: \"application/octet-stream\"\n }).stream().pipe(resultDataStream);\n return resultStream;\n};\n\n/*--------------------------------------------*/\n/**\n * @private\n */\nvar BulkApi = function() {\n BulkApi.super_.apply(this, arguments);\n};\n\ninherits(BulkApi, HttpApi);\n\nBulkApi.prototype.beforeSend = function(request) {\n request.headers = request.headers || {};\n request.headers[\"X-SFDC-SESSION\"] = this._conn.accessToken;\n};\n\nBulkApi.prototype.isSessionExpired = function(response) {\n return response.statusCode === 400 &&\n /InvalidSessionId<\\/exceptionCode>/.test(response.body);\n};\n\nBulkApi.prototype.hasErrorInResponseBody = function(body) {\n return !!body.error;\n};\n\nBulkApi.prototype.parseError = function(body) {\n return {\n errorCode: body.error.exceptionCode,\n message: body.error.exceptionMessage\n };\n};\n\n/*--------------------------------------------*/\n\n/**\n * Class for Bulk API\n *\n * @class\n * @param {Connection} conn - Connection object\n */\nvar Bulk = function(conn) {\n this._conn = conn;\n this._logger = conn._logger;\n};\n\n/**\n * Polling interval in milliseconds\n * @type {Number}\n */\nBulk.prototype.pollInterval = 1000;\n\n/**\n * Polling timeout in milliseconds\n * @type {Number}\n */\nBulk.prototype.pollTimeout = 10000;\n\n/** @private **/\nBulk.prototype._request = function(request, callback) {\n var conn = this._conn;\n request = _.clone(request);\n var baseUrl = [ conn.instanceUrl, \"services/async\", conn.version ].join('/');\n request.url = baseUrl + request.path;\n var options = { responseType: request.responseType };\n delete request.path;\n delete request.responseType;\n return new BulkApi(this._conn, options).request(request).thenCall(callback);\n};\n\n/**\n * Create and start bulkload job and batch\n *\n * @param {String} type - SObject type\n * @param {String} operation - Bulk load operation ('insert', 'update', 'upsert', 'delete', or 'hardDelete')\n * @param {Object} [options] - Options for bulk loading operation\n * @param {String} [options.extIdField] - External ID field name (used when upsert operation).\n * @param {String} [options.concurrencyMode] - 'Serial' or 'Parallel'. Defaults to Parallel.\n * @param {Array.|stream.Stream|String} [input] - Input source for bulkload. Accepts array of records, CSV string, and CSV data input stream in insert/update/upsert/delete/hardDelete operation, SOQL string in query operation.\n * @param {Callback.|Array.>} [callback] - Callback function\n * @returns {Bulk~Batch}\n */\nBulk.prototype.load = function(type, operation, options, input, callback) {\n var self = this;\n if (!type || !operation) {\n throw new Error(\"Insufficient arguments. At least, 'type' and 'operation' are required.\");\n }\n if (!_.isObject(options) || options.constructor !== Object) { // when options is not plain hash object, it is omitted\n callback = input;\n input = options;\n options = null;\n }\n var job = this.createJob(type, operation, options);\n job.once('error', function (error) {\n if (batch) {\n batch.emit('error', error); // pass job error to batch\n }\n });\n var batch = job.createBatch();\n var cleanup = function() {\n batch = null;\n job.close();\n };\n var cleanupOnError = function(err) {\n if (err.name !== 'PollingTimeout') {\n cleanup();\n }\n };\n batch.on('response', cleanup);\n batch.on('error', cleanupOnError);\n batch.on('queue', function() { batch.poll(self.pollInterval, self.pollTimeout); });\n return batch.execute(input, callback);\n};\n\n/**\n * Execute bulk query and get record stream\n *\n * @param {String} soql - SOQL to execute in bulk job\n * @returns {RecordStream.Parsable} - Record stream, convertible to CSV data stream\n */\nBulk.prototype.query = function(soql) {\n var m = soql.replace(/\\([\\s\\S]+\\)/g, '').match(/FROM\\s+(\\w+)/i);\n if (!m) {\n throw new Error(\"No sobject type found in query, maybe caused by invalid SOQL.\");\n }\n var type = m[1];\n var self = this;\n var recordStream = new RecordStream.Parsable();\n var dataStream = recordStream.stream('csv');\n this.load(type, \"query\", soql).then(function(results) {\n var streams = results.map(function(result) {\n return self\n .job(result.jobId)\n .batch(result.batchId)\n .result(result.id)\n .stream();\n });\n\n joinStreams(streams).pipe(dataStream);\n }).fail(function(err) {\n recordStream.emit('error', err);\n });\n return recordStream;\n};\n\n\n/**\n * Create a new job instance\n *\n * @param {String} type - SObject type\n * @param {String} operation - Bulk load operation ('insert', 'update', 'upsert', 'delete', 'hardDelete', or 'query')\n * @param {Object} [options] - Options for bulk loading operation\n * @returns {Bulk~Job}\n */\nBulk.prototype.createJob = function(type, operation, options) {\n return new Job(this, type, operation, options);\n};\n\n/**\n * Get a job instance specified by given job ID\n *\n * @param {String} jobId - Job ID\n * @returns {Bulk~Job}\n */\nBulk.prototype.job = function(jobId) {\n return new Job(this, null, null, null, jobId);\n};\n\n\n/*--------------------------------------------*/\n/*\n * Register hook in connection instantiation for dynamically adding this API module features\n */\njsforce.on('connection:new', function(conn) {\n conn.bulk = new Bulk(conn);\n});\n\n\nmodule.exports = Bulk;\n","// shim for using process in browser\nvar process = module.exports = {};\n\n// cached from whatever global is present so that test runners that stub it\n// don't break things. But we need to wrap it in a try catch in case it is\n// wrapped in strict mode code which doesn't define any globals. It's inside a\n// function because try/catches deoptimize in certain engines.\n\nvar cachedSetTimeout;\nvar cachedClearTimeout;\n\nfunction defaultSetTimout() {\n throw new Error('setTimeout has not been defined');\n}\nfunction defaultClearTimeout () {\n throw new Error('clearTimeout has not been defined');\n}\n(function () {\n try {\n if (typeof setTimeout === 'function') {\n cachedSetTimeout = setTimeout;\n } else {\n cachedSetTimeout = defaultSetTimout;\n }\n } catch (e) {\n cachedSetTimeout = defaultSetTimout;\n }\n try {\n if (typeof clearTimeout === 'function') {\n cachedClearTimeout = clearTimeout;\n } else {\n cachedClearTimeout = defaultClearTimeout;\n }\n } catch (e) {\n cachedClearTimeout = defaultClearTimeout;\n }\n} ())\nfunction runTimeout(fun) {\n if (cachedSetTimeout === setTimeout) {\n //normal enviroments in sane situations\n return setTimeout(fun, 0);\n }\n // if setTimeout wasn't available but was latter defined\n if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n cachedSetTimeout = setTimeout;\n return setTimeout(fun, 0);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedSetTimeout(fun, 0);\n } catch(e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedSetTimeout.call(null, fun, 0);\n } catch(e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n return cachedSetTimeout.call(this, fun, 0);\n }\n }\n\n\n}\nfunction runClearTimeout(marker) {\n if (cachedClearTimeout === clearTimeout) {\n //normal enviroments in sane situations\n return clearTimeout(marker);\n }\n // if clearTimeout wasn't available but was latter defined\n if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n cachedClearTimeout = clearTimeout;\n return clearTimeout(marker);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedClearTimeout(marker);\n } catch (e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedClearTimeout.call(null, marker);\n } catch (e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n return cachedClearTimeout.call(this, marker);\n }\n }\n\n\n\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n if (!draining || !currentQueue) {\n return;\n }\n draining = false;\n if (currentQueue.length) {\n queue = currentQueue.concat(queue);\n } else {\n queueIndex = -1;\n }\n if (queue.length) {\n drainQueue();\n }\n}\n\nfunction drainQueue() {\n if (draining) {\n return;\n }\n var timeout = runTimeout(cleanUpNextTick);\n draining = true;\n\n var len = queue.length;\n while(len) {\n currentQueue = queue;\n queue = [];\n while (++queueIndex < len) {\n if (currentQueue) {\n currentQueue[queueIndex].run();\n }\n }\n queueIndex = -1;\n len = queue.length;\n }\n currentQueue = null;\n draining = false;\n runClearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n var args = new Array(arguments.length - 1);\n if (arguments.length > 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"]} \ No newline at end of file +{"version":3,"sources":["node_modules/browser-pack/_prelude.js","jsforce-api-bulk.min.js","lib/api/bulk.js","node_modules/process/browser.js"],"names":["f","exports","module","define","amd","g","window","global","self","this","jsforce","modules","api","Bulk","r","e","n","t","o","i","c","require","u","a","Error","code","p","call","length","1","process","inherits","stream","Duplex","events","_","joinStreams","RecordStream","Promise","HttpApi","Job","bulk","type","operation","options","jobId","_bulk","id","state","_batches","EventEmitter","prototype","info","callback","_jobInfo","check","thenCall","open","_logger","toLowerCase","body","extIdField","concurrencyMode","assignmentRuleId","join","_request","method","path","headers","Content-Type","responseType","then","res","emit","jobInfo","err","createBatch","batch","Batch","on","batchId","logger","_waitAssign","debug","object","resolve","list","batchInfoList","batchInfo","isArray","close","_changeState","abort","job","super_","objectMode","_deferred","defer","_setupDataStreams","Writable","converterOptions","nullValue","_uploadStream","Serializable","_uploadDataStream","_downloadStream","Parsable","_downloadDataStream","end","once","pipe","_createRequestStream","dataStream","_dataStream","_write","data","enc","cb","write","read","push","_read","size","chunk","record","clone","Id","attributes","run","exec","execute","input","_result","rdeferred","promise","reject","isObject","isFunction","forEach","Object","keys","key","String","isString","onResolved","onReject","onProgress","nextTick","poll","interval","timeout","startTime","Date","getTime","now","name","parseInt","numberRecordsProcessed","retrieve","stateMessage","setTimeout","results","_conn","result","map","ret","success","Success","errors","fail","resultId","resultStream","resultDataStream","BulkApi","apply","arguments","beforeSend","request","accessToken","isSessionExpired","response","statusCode","test","hasErrorInResponseBody","error","parseError","errorCode","exceptionCode","message","exceptionMessage","conn","pollInterval","pollTimeout","baseUrl","instanceUrl","version","url","load","constructor","createJob","cleanup","query","soql","m","replace","match","recordStream","streams","_process","2","cachedSetTimeout","cachedClearTimeout","defaultSetTimout","defaultClearTimeout","runTimeout","fun","clearTimeout","currentQueue","queue","draining","queueIndex","cleanUpNextTick","concat","drainQueue","len","marker","runClearTimeout","Item","array","noop","args","Array","title","browser","env","argv","versions","addListener","off","removeListener","removeAllListeners","prependListener","prependOnceListener","listeners","binding","cwd","chdir","dir","umask"],"mappings":"CAAA,SAAAA,GAAA,GAAA,iBAAAC,SAAA,oBAAAC,OAAAA,OAAAD,QAAAD,SAAA,GAAA,mBAAAG,QAAAA,OAAAC,IAAAD,OAAA,GAAAH,OAAA,CAAA,IAAAK,GAAAA,GAAAA,GAAAA,GAAAA,EAAA,oBAAAC,OAAAA,OAAA,oBAAAC,OAAAA,OAAA,oBAAAC,KAAAA,KAAAC,MAAAC,UAAAL,EAAAK,QAAA,KAAAC,UAAAN,EAAAM,QAAA,KAAAC,MAAAP,EAAAO,IAAA,KAAAC,KAAAb,KAAA,EAAA,WAAA,OAAA,SAAAc,EAAAC,EAAAC,EAAAC,GAAA,SAAAC,EAAAC,EAAAnB,GAAA,IAAAgB,EAAAG,GAAA,CAAA,IAAAJ,EAAAI,GAAA,CAAA,IAAAC,EAAA,mBAAAC,SAAAA,QAAA,IAAArB,GAAAoB,EAAA,OAAAA,EAAAD,GAAA,GAAA,GAAAG,EAAA,OAAAA,EAAAH,GAAA,GAAA,IAAAI,EAAA,IAAAC,MAAA,uBAAAL,EAAA,KAAA,MAAAI,EAAAE,KAAA,mBAAAF,EAAA,IAAAG,EAAAV,EAAAG,GAAA,CAAAlB,QAAA,IAAAc,EAAAI,GAAA,GAAAQ,KAAAD,EAAAzB,SAAA,SAAAa,GAAA,OAAAI,EAAAH,EAAAI,GAAA,GAAAL,IAAAA,KAAAY,EAAAA,EAAAzB,QAAAa,EAAAC,EAAAC,EAAAC,GAAA,OAAAD,EAAAG,GAAAlB,QAAA,IAAA,IAAAqB,EAAA,mBAAAD,SAAAA,QAAAF,EAAA,EAAAA,EAAAF,EAAAW,OAAAT,IAAAD,EAAAD,EAAAE,IAAA,OAAAD,EAAA,CAAA,CAAAW,EAAA,CAAA,SAAAR,EAAAnB,EAAAD,ICCA,SAAW6B,GCKX,aAEA,IAAAC,EAAAzB,OAAAI,QAAAW,QAAA,YACAW,EAAA1B,OAAAI,QAAAW,QAAA,mBACAY,EAAAD,EAAAC,OACAC,EAAA5B,OAAAI,QAAAW,QAAA,UACAc,EAAA7B,OAAAI,QAAAW,QAAA,eACAe,EAAA9B,OAAAI,QAAAW,QAAA,eACAX,EAAAJ,OAAAI,QAAAW,QAAA,UACAgB,EAAA/B,OAAAI,QAAAW,QAAA,mBACAiB,EAAAhC,OAAAI,QAAAW,QAAA,aACAkB,EAAAjC,OAAAI,QAAAW,QAAA,cAmBAmB,EAAA,SAAAC,EAAAC,EAAAC,EAAAC,EAAAC,GACApC,KAAAqC,MAAAL,EACAhC,KAAAiC,KAAAA,EACAjC,KAAAkC,UAAAA,EACAlC,KAAAmC,QAAAA,GAAA,GACAnC,KAAAsC,GAAAF,EACApC,KAAAuC,MAAAvC,KAAAsC,GAAA,OAAA,UACAtC,KAAAwC,SAAA,IAGAlB,EAAAS,EAAAN,EAAAgB,cAiBAV,EAAAW,UAAAC,KAAA,SAAAC,GAMA,OAHA5C,KAAA6C,WACA7C,KAAA6C,SAAA7C,KAAA8C,SAEA9C,KAAA6C,SAAAE,SAAAH,IAUAb,EAAAW,UAAAM,KAAA,SAAAJ,GACA,IAAA7C,EAAAC,KACAgC,EAAAhC,KAAAqC,MACAL,EAAAiB,QAGA,IAAAjD,KAAA6C,SAAA,CACA,IAAAX,EAAAlC,KAAAkC,UAAAgB,cACA,eAAAhB,IAAAA,EAAA,cACA,IAAAiB,EAAA,CACA,yCACA,oEACA,cAAAjB,EAAA,eACA,WAAAlC,KAAAiC,KAAA,YACAjC,KAAAmC,QAAAiB,WACA,wBAAApD,KAAAmC,QAAAiB,WAAA,yBACA,GACApD,KAAAmC,QAAAkB,gBACA,oBAAArD,KAAAmC,QAAAkB,gBAAA,qBACA,GACArD,KAAAmC,QAAAmB,iBACA,qBAAAtD,KAAAmC,QAAAmB,iBAAA,sBACA,GACA,iCACA,cACAC,KAAA,IAEAvD,KAAA6C,SAAAb,EAAAwB,SAAA,CACAC,OAAA,OACAC,KAAA,OACAP,KAAAA,EACAQ,QAAA,CACAC,eAAA,kCAEAC,aAAA,oBACAC,MAAA,SAAAC,GAIA,OAHAhE,EAAAiE,KAAA,OAAAD,EAAAE,SACAlE,EAAAuC,GAAAyB,EAAAE,QAAA3B,GACAvC,EAAAwC,MAAAwB,EAAAE,QAAA1B,MACAwB,EAAAE,WACA,SAAAC,GAEA,MADAnE,EAAAiE,KAAA,QAAAE,GACAA,KAGA,OAAAlE,KAAA6C,SAAAE,SAAAH,IASAb,EAAAW,UAAAyB,YAAA,WACA,IAAAC,EAAA,IAAAC,EAAArE,MACAD,EAAAC,KAIA,OAHAoE,EAAAE,GAAA,SAAA,WACAvE,EAAAyC,SAAA4B,EAAA9B,IAAA8B,KAEAA,GAUArC,EAAAW,UAAA0B,MAAA,SAAAG,GACA,IAAAH,EAAApE,KAAAwC,SAAA+B,GAKA,OAJAH,IACAA,EAAA,IAAAC,EAAArE,KAAAuE,GACAvE,KAAAwC,SAAA+B,GAAAH,GAEAA,GAUArC,EAAAW,UAAAI,MAAA,SAAAF,GACA,IAAA7C,EAAAC,KACAgC,EAAAhC,KAAAqC,MACAmC,EAAAxC,EAAAiB,QAgBA,OAdAjD,KAAA6C,SAAA7C,KAAAyE,cAAAX,MAAA,WACA,OAAA9B,EAAAwB,SAAA,CACAC,OAAA,MACAC,KAAA,QAAA3D,EAAAuC,GACAuB,aAAA,uBAEAC,MAAA,SAAAC,GAMA,OALAS,EAAAE,MAAAX,EAAAE,SACAlE,EAAAuC,GAAAyB,EAAAE,QAAA3B,GACAvC,EAAAkC,KAAA8B,EAAAE,QAAAU,OACA5E,EAAAmC,UAAA6B,EAAAE,QAAA/B,UACAnC,EAAAwC,MAAAwB,EAAAE,QAAA1B,MACAwB,EAAAE,WAEAjE,KAAA6C,SAAAE,SAAAH,IAUAb,EAAAW,UAAA+B,YAAA,SAAA7B,GACA,OAAA5C,KAAAsC,GAAAT,EAAA+C,QAAA,CAAAtC,GAAAtC,KAAAsC,KAAAtC,KAAAgD,QAAAD,SAAAH,IAWAb,EAAAW,UAAAmC,KAAA,SAAAjC,GACA,IAAA7C,EAAAC,KACAgC,EAAAhC,KAAAqC,MACAmC,EAAAxC,EAAAiB,QAEA,OAAAjD,KAAAyE,cAAAX,MAAA,WACA,OAAA9B,EAAAwB,SAAA,CACAC,OAAA,MACAC,KAAA,QAAA3D,EAAAuC,GAAA,SACAuB,aAAA,uBAEAC,MAAA,SAAAC,GACAS,EAAAE,MAAAX,EAAAe,cAAAC,WACA,IAAAD,EAAAf,EAAAe,cAEA,OADAA,EAAApD,EAAAsD,QAAAF,EAAAC,WAAAD,EAAAC,UAAA,CAAAD,EAAAC,cAEAhC,SAAAH,IAWAb,EAAAW,UAAAuC,MAAA,WACA,IAAAlF,EAAAC,KACA,OAAAA,KAAAkF,aAAA,UAAApB,MAAA,SAAAG,GAGA,OAFAlE,EAAAuC,GAAA,KACAvC,EAAAiE,KAAA,QAAAC,GACAA,KACA,SAAAC,GAEA,MADAnE,EAAAiE,KAAA,QAAAE,GACAA,MAWAnC,EAAAW,UAAAyC,MAAA,WACA,IAAApF,EAAAC,KACA,OAAAA,KAAAkF,aAAA,WAAApB,MAAA,SAAAG,GAGA,OAFAlE,EAAAuC,GAAA,KACAvC,EAAAiE,KAAA,QAAAC,GACAA,KACA,SAAAC,GAEA,MADAnE,EAAAiE,KAAA,QAAAE,GACAA,MAOAnC,EAAAW,UAAAwC,aAAA,SAAA3C,EAAAK,GACA,IAAA7C,EAAAC,KACAgC,EAAAhC,KAAAqC,MACAmC,EAAAxC,EAAAiB,QAuBA,OArBAjD,KAAA6C,SAAA7C,KAAAyE,cAAAX,MAAA,WACA,IAAAX,EAAA,CACA,yCACA,mEACA,UAAAZ,EAAA,WACA,cACAgB,KAAA,IACA,OAAAvB,EAAAwB,SAAA,CACAC,OAAA,OACAC,KAAA,QAAA3D,EAAAuC,GACAa,KAAAA,EACAQ,QAAA,CACAC,eAAA,kCAEAC,aAAA,uBAEAC,MAAA,SAAAC,GAGA,OAFAS,EAAAE,MAAAX,EAAAE,SACAlE,EAAAwC,MAAAwB,EAAAE,QAAA1B,MACAwB,EAAAE,WAEAjE,KAAA6C,SAAAE,SAAAH,IAiBA,IAAAyB,EAAA,SAAAe,EAAAb,GACAF,EAAAgB,OAAAnE,KAAAlB,KAAA,CAAAsF,YAAA,IACAtF,KAAAoF,IAAAA,EACApF,KAAAsC,GAAAiC,EACAvE,KAAAqC,MAAA+C,EAAA/C,MACArC,KAAAuF,UAAA1D,EAAA2D,QACAxF,KAAAyF,qBAGAnE,EAAA+C,EAAA9C,EAAAmE,UAMArB,EAAA3B,UAAA+C,kBAAA,WACA,IAAArB,EAAApE,KACA2F,EAAA,CAAAC,UAAA,QACA5F,KAAA6F,cAAA,IAAAjE,EAAAkE,aACA9F,KAAA+F,kBAAA/F,KAAA6F,cAAAtE,OAAA,MAAAoE,GACA3F,KAAAgG,gBAAA,IAAApE,EAAAqE,SACAjG,KAAAkG,oBAAAlG,KAAAgG,gBAAAzE,OAAA,MAAAoE,GAEA3F,KAAAsE,GAAA,UAAA,WACAF,EAAAyB,cAAAM,SAEAnG,KAAA+F,kBAAAK,KAAA,YAAA,WACAhC,EAAAgB,IAAApC,OAAAc,MAAA,WAEAM,EAAA2B,kBAAAM,KAAAjC,EAAAkC,8BAKA,IAAAC,EAAAvG,KAAAwG,YAAA,IAAAhF,EACA+E,EAAAE,OAAA,SAAAC,EAAAC,EAAAC,GACAxC,EAAA2B,kBAAAc,MAAAH,EAAAC,EAAAC,IAEAL,EAAAjC,GAAA,UAAA,WACAF,EAAA2B,kBAAAI,SAGAnG,KAAAkG,oBAAA5B,GAAA,YAAA,WACAiC,EAAAO,KAAA,MAEA9G,KAAAkG,oBAAA5B,GAAA,OAAA,WACAiC,EAAAQ,KAAA,SAEAR,EAAAS,MAAA,SAAAC,GAEA,IADA,IAAAC,EACA,QAAAA,EAAA9C,EAAA8B,oBAAAY,SACAP,EAAAQ,KAAAG,KAWA7C,EAAA3B,UAAA4D,qBAAA,WACA,IAAAlC,EAAApE,KACAgC,EAAAoC,EAAA/B,MACAmC,EAAAxC,EAAAiB,QAEA,OAAAjB,EAAAwB,SAAA,CACAC,OAAA,OACAC,KAAA,QAAAU,EAAAgB,IAAA9C,GAAA,SACAqB,QAAA,CACAC,eAAA,YAEAC,aAAA,oBACA,SAAAK,EAAAH,GACAG,EACAE,EAAAJ,KAAA,QAAAE,IAEAM,EAAAE,MAAAX,EAAAgB,WACAX,EAAA9B,GAAAyB,EAAAgB,UAAAzC,GACA8B,EAAAJ,KAAA,QAAAD,EAAAgB,eAEAxD,UASA8C,EAAA3B,UAAA+D,OAAA,SAAAU,EAAAR,EAAAC,GACAO,EAAAzF,EAAA0F,MAAAD,GACA,WAAAnH,KAAAoF,IAAAlD,iBACAiF,EAAAE,GACA,WAAArH,KAAAoF,IAAAlD,YACAiF,EAAA,CAAAE,GAAAF,EAAAE,YAEAF,EAAAlF,YACAkF,EAAAG,WACAtH,KAAA6F,cAAAgB,MAAAM,EAAAR,EAAAC,IAQAvC,EAAA3B,UAAAnB,OAAA,WACA,OAAAvB,KAAAwG,aAWAnC,EAAA3B,UAAA6E,IACAlD,EAAA3B,UAAA8E,KACAnD,EAAA3B,UAAA+E,QAAA,SAAAC,EAAA9E,GACA,IAAA7C,EAAAC,KAQA,GANA,mBAAA0H,IACA9E,EAAA8E,EACAA,EAAA,MAIA1H,KAAA2H,QACA,MAAA,IAAA5G,MAAA,2BAGA,IAiBA2F,EAjBAkB,EAAA/F,EAAA2D,SACAxF,KAAA2H,QAAAC,EAAAC,QACA7H,KAAA2H,QAAA7D,MAAA,SAAAC,GACAhE,EAAAwF,UAAAX,QAAAb,MACA,SAAAG,GACAnE,EAAAwF,UAAAuC,OAAA5D,MAEAlE,KAAAoG,KAAA,YAAA,SAAArC,GACA6D,EAAAhD,QAAAb,MAEA/D,KAAAoG,KAAA,SAAA,SAAAlC,GACA0D,EAAAE,OAAA5D,MAGAxC,EAAAqG,SAAAL,IAAAhG,EAAAsG,WAAAN,EAAArB,OACAqB,EAAArB,KAAArG,KAAAwG,aAGA9E,EAAAsD,QAAA0C,IACAhG,EAAAuG,QAAAP,GAAA,SAAAP,GACAe,OAAAC,KAAAhB,GAAAc,SAAA,SAAAG,GACA,kBAAAjB,EAAAiB,KACAjB,EAAAiB,GAAAC,OAAAlB,EAAAiB,QAGArI,EAAA8G,MAAAM,MAEApH,EAAAoG,OACAzE,EAAA4G,SAAAZ,KACAhB,EAAAgB,EACA1H,KAAAwG,YAAAK,MAAAH,EAAA,QACA1G,KAAAwG,YAAAL,OAKA,OAAAnG,KAAA+C,SAAAH,IAWAyB,EAAA3B,UAAAoB,KAAA,SAAAyE,EAAAC,EAAAC,GACA,OAAAzI,KAAAuF,UAAAsC,QAAA/D,KAAAyE,EAAAC,EAAAC,IASApE,EAAA3B,UAAAK,SAAA,SAAAH,GAYA,OAXAlB,EAAAsG,WAAApF,IACA5C,KAAA8D,MAAA,SAAAC,GACA1C,EAAAqH,UAAA,WACA9F,EAAA,KAAAmB,SAEA,SAAAG,GACA7C,EAAAqH,UAAA,WACA9F,EAAAsB,SAIAlE,MAkBAqE,EAAA3B,UAAAI,MAAA,SAAAF,GACA,IACAZ,EAAAhC,KAAAqC,MACAmC,EAAAxC,EAAAiB,QACAb,EAAApC,KAAAoF,IAAA9C,GACAiC,EAAAvE,KAAAsC,GAEA,IAAAF,IAAAmC,EACA,MAAA,IAAAxD,MAAA,sBAEA,OAAAiB,EAAAwB,SAAA,CACAC,OAAA,MACAC,KAAA,QAAAtB,EAAA,UAAAmC,EACAV,aAAA,oBACAC,MAAA,SAAAC,GAEA,OADAS,EAAAE,MAAAX,EAAAgB,WACAhB,EAAAgB,aACAhC,SAAAH,IAWAyB,EAAA3B,UAAAiG,KAAA,SAAAC,EAAAC,GACA,IAAA9I,EAAAC,KACAoC,EAAApC,KAAAoF,IAAA9C,GACAiC,EAAAvE,KAAAsC,GAEA,IAAAF,IAAAmC,EACA,MAAA,IAAAxD,MAAA,sBAEA,IAAA+H,GAAA,IAAAC,MAAAC,UACAL,EAAA,WACA,IAAAM,GAAA,IAAAF,MAAAC,UACA,GAAAF,EAAAD,EAAAI,EAAA,CACA,IAAA/E,EAAA,IAAAnD,MAAA,8BAAAqB,EAAA,iBAAAmC,GAKA,OAJAL,EAAAgF,KAAA,iBACAhF,EAAA9B,MAAAA,EACA8B,EAAAK,QAAAA,OACAxE,EAAAiE,KAAA,QAAAE,GAGAnE,EAAA+C,OAAA,SAAAoB,EAAAH,GACAG,EACAnE,EAAAiE,KAAA,QAAAE,GAEA,WAAAH,EAAAxB,MACA4G,SAAApF,EAAAqF,uBAAA,IAAA,EACArJ,EAAAsJ,WAEAtJ,EAAAiE,KAAA,QAAA,IAAAjD,MAAAgD,EAAAuF,eAEA,cAAAvF,EAAAxB,MACAxC,EAAAsJ,YAEAtJ,EAAAiE,KAAA,WAAAD,GACAwF,WAAAZ,EAAAC,QAKAW,WAAAZ,EAAAC,IAiBAvE,EAAA3B,UAAA2G,SAAA,SAAAzG,GACA,IAAA7C,EAAAC,KACAgC,EAAAhC,KAAAqC,MACAD,EAAApC,KAAAoF,IAAA9C,GACA8C,EAAApF,KAAAoF,IACAb,EAAAvE,KAAAsC,GAEA,IAAAF,IAAAmC,EACA,MAAA,IAAAxD,MAAA,sBAGA,OAAAqE,EAAAzC,OAAAmB,MAAA,SAAAG,GACA,OAAAjC,EAAAwB,SAAA,CACAC,OAAA,MACAC,KAAA,QAAAtB,EAAA,UAAAmC,EAAA,eAEAT,MAAA,SAAAC,GACA,IAAAyF,EACA,GAAA,UAAApE,EAAAlD,UAAA,CACAF,EAAAyH,MACA1F,EAAA,eAAA2F,OACAF,EAAAzF,EAAA,eAAA2F,OACAF,EAAA9H,EAAAiI,IAAAjI,EAAAsD,QAAAwE,GAAAA,EAAA,CAAAA,IAAA,SAAAlH,GACA,MAAA,CACAA,GAAAA,EACAiC,QAAAA,EACAnC,MAAAA,WAIAoH,EAAA9H,EAAAiI,IAAA5F,GAAA,SAAA6F,GACA,MAAA,CACAtH,GAAAsH,EAAAvC,IAAA,KACAwC,QAAA,SAAAD,EAAAE,QACAC,OAAAH,EAAA7I,MAAA,CAAA6I,EAAA7I,OAAA,OAKA,OADAhB,EAAAiE,KAAA,WAAAwF,GACAA,KACAQ,MAAA,SAAA9F,GAEA,MADAnE,EAAAiE,KAAA,QAAAE,GACAA,KACAnB,SAAAH,IAQAyB,EAAA3B,UAAAgH,OAAA,SAAAO,GACA,IAAA7H,EAAApC,KAAAoF,IAAA9C,GACAiC,EAAAvE,KAAAsC,GACA,IAAAF,IAAAmC,EACA,MAAA,IAAAxD,MAAA,sBAEA,IAAAmJ,EAAA,IAAAtI,EAAAqE,SACAkE,EAAAD,EAAA3I,OAAA,OACAvB,KAAAqC,MAAAmB,SAAA,CACAC,OAAA,MACAC,KAAA,QAAAtB,EAAA,UAAAmC,EAAA,WAAA0F,EACApG,aAAA,6BACAtC,SAAA8E,KAAA8D,GACA,OAAAD,GAOA,IAAAE,EAAA,WACAA,EAAA/E,OAAAgF,MAAArK,KAAAsK,YAGAhJ,EAAA8I,EAAAtI,GAEAsI,EAAA1H,UAAA6H,WAAA,SAAAC,GACAA,EAAA7G,QAAA6G,EAAA7G,SAAA,GACA6G,EAAA7G,QAAA,kBAAA3D,KAAAyJ,MAAAgB,aAGAL,EAAA1H,UAAAgI,iBAAA,SAAAC,GACA,OAAA,MAAAA,EAAAC,YACA,mDAAAC,KAAAF,EAAAxH,OAGAiH,EAAA1H,UAAAoI,uBAAA,SAAA3H,GACA,QAAAA,EAAA4H,OAGAX,EAAA1H,UAAAsI,WAAA,SAAA7H,GACA,MAAA,CACA8H,UAAA9H,EAAA4H,MAAAG,cACAC,QAAAhI,EAAA4H,MAAAK,mBAYA,IAAAhL,EAAA,SAAAiL,GACArL,KAAAyJ,MAAA4B,EACArL,KAAAiD,QAAAoI,EAAApI,SAOA7C,EAAAsC,UAAA4I,aAAA,IAMAlL,EAAAsC,UAAA6I,YAAA,IAGAnL,EAAAsC,UAAAc,SAAA,SAAAgH,EAAA5H,GACA,IAAAyI,EAAArL,KAAAyJ,MACAe,EAAA9I,EAAA0F,MAAAoD,GACA,IAAAgB,EAAA,CAAAH,EAAAI,YAAA,iBAAAJ,EAAAK,SAAAnI,KAAA,KACAiH,EAAAmB,IAAAH,EAAAhB,EAAA9G,KACA,IAAAvB,EAAA,CAAA0B,aAAA2G,EAAA3G,cAGA,cAFA2G,EAAA9G,YACA8G,EAAA3G,aACA,IAAAuG,EAAApK,KAAAyJ,MAAAtH,GAAAqI,QAAAA,GAAAzH,SAAAH,IAeAxC,EAAAsC,UAAAkJ,KAAA,SAAA3J,EAAAC,EAAAC,EAAAuF,EAAA9E,GACA,IAAA7C,EAAAC,KACA,IAAAiC,IAAAC,EACA,MAAA,IAAAnB,MAAA,0EAEAW,EAAAqG,SAAA5F,IAAAA,EAAA0J,cAAA3D,SACAtF,EAAA8E,EACAA,EAAAvF,EACAA,EAAA,MAEA,IAAAiD,EAAApF,KAAA8L,UAAA7J,EAAAC,EAAAC,GACAiD,EAAAgB,KAAA,SAAA,SAAA2E,GACA3G,GACAA,EAAAJ,KAAA,QAAA+G,MAGA,IAAA3G,EAAAgB,EAAAjB,cACA4H,EAAA,WACA3H,EAAA,KACAgB,EAAAH,SAUA,OAHAb,EAAAE,GAAA,WAAAyH,GACA3H,EAAAE,GAAA,SANA,SAAAJ,GACA,mBAAAA,EAAAgF,MACA6C,OAKA3H,EAAAE,GAAA,SAAA,WAAAF,EAAAuE,KAAA5I,EAAAuL,aAAAvL,EAAAwL,gBACAnH,EAAAqD,QAAAC,EAAA9E,IASAxC,EAAAsC,UAAAsJ,MAAA,SAAAC,GACA,IAAAC,EAAAD,EAAAE,QAAA,eAAA,IAAAC,MAAA,iBACA,IAAAF,EACA,MAAA,IAAAnL,MAAA,iEAEA,IAAAkB,EAAAiK,EAAA,GACAnM,EAAAC,KACAqM,EAAA,IAAAzK,EAAAqE,SACAM,EAAA8F,EAAA9K,OAAA,OAcA,OAbAvB,KAAA4L,KAAA3J,EAAA,QAAAgK,GAAAnI,MAAA,SAAA0F,GACA,IAAA8C,EAAA9C,EAAAG,KAAA,SAAAD,GACA,OAAA3J,EACAqF,IAAAsE,EAAAtH,OACAgC,MAAAsF,EAAAnF,SACAmF,OAAAA,EAAApH,IACAf,YAGAI,EAAA2K,GAAAjG,KAAAE,MACAyD,MAAA,SAAA9F,GACAmI,EAAArI,KAAA,QAAAE,MAEAmI,GAYAjM,EAAAsC,UAAAoJ,UAAA,SAAA7J,EAAAC,EAAAC,GACA,OAAA,IAAAJ,EAAA/B,KAAAiC,EAAAC,EAAAC,IASA/B,EAAAsC,UAAA0C,IAAA,SAAAhD,GACA,OAAA,IAAAL,EAAA/B,KAAA,KAAA,KAAA,KAAAoC,IAQAnC,EAAAqE,GAAA,kBAAA,SAAA+G,GACAA,EAAArJ,KAAA,IAAA5B,EAAAiL,MAIA5L,EAAAD,QAAAY,IDIGc,KAAKlB,KAAKY,EAAQ,cAEnB,CAAC2L,SAAW,IAAIC,EAAE,CAAC,SAAS5L,EAAQnB,EAAOD,GE/1B7C,IAOAiN,EACAC,EARArL,EAAA5B,EAAAD,QAAA,GAUA,SAAAmN,IACA,MAAA,IAAA5L,MAAA,mCAEA,SAAA6L,IACA,MAAA,IAAA7L,MAAA,qCAsBA,SAAA8L,EAAAC,GACA,GAAAL,IAAAlD,WAEA,OAAAA,WAAAuD,EAAA,GAGA,IAAAL,IAAAE,IAAAF,IAAAlD,WAEA,OADAkD,EAAAlD,WACAA,WAAAuD,EAAA,GAEA,IAEA,OAAAL,EAAAK,EAAA,GACA,MAAAxM,GACA,IAEA,OAAAmM,EAAAvL,KAAA,KAAA4L,EAAA,GACA,MAAAxM,GAEA,OAAAmM,EAAAvL,KAAAlB,KAAA8M,EAAA,MAvCA,WACA,IAEAL,EADA,mBAAAlD,WACAA,WAEAoD,EAEA,MAAArM,GACAmM,EAAAE,EAEA,IAEAD,EADA,mBAAAK,aACAA,aAEAH,EAEA,MAAAtM,GACAoM,EAAAE,GAjBA,GAwEA,IAEAI,EAFAC,EAAA,GACAC,GAAA,EAEAC,GAAA,EAEA,SAAAC,IACAF,GAAAF,IAGAE,GAAA,EACAF,EAAA7L,OACA8L,EAAAD,EAAAK,OAAAJ,GAEAE,GAAA,EAEAF,EAAA9L,QACAmM,KAIA,SAAAA,IACA,IAAAJ,EAAA,CAGA,IAAArE,EAAAgE,EAAAO,GACAF,GAAA,EAGA,IADA,IAAAK,EAAAN,EAAA9L,OACAoM,GAAA,CAGA,IAFAP,EAAAC,EACAA,EAAA,KACAE,EAAAI,GACAP,GACAA,EAAAG,GAAA5F,MAGA4F,GAAA,EACAI,EAAAN,EAAA9L,OAEA6L,EAAA,KACAE,GAAA,EAnEA,SAAAM,GACA,GAAAd,IAAAK,aAEA,OAAAA,aAAAS,GAGA,IAAAd,IAAAE,IAAAF,IAAAK,aAEA,OADAL,EAAAK,aACAA,aAAAS,GAEA,IAEAd,EAAAc,GACA,MAAAlN,GACA,IAEA,OAAAoM,EAAAxL,KAAA,KAAAsM,GACA,MAAAlN,GAGA,OAAAoM,EAAAxL,KAAAlB,KAAAwN,KAgDAC,CAAA5E,IAiBA,SAAA6E,EAAAZ,EAAAa,GACA3N,KAAA8M,IAAAA,EACA9M,KAAA2N,MAAAA,EAYA,SAAAC,KA5BAvM,EAAAqH,SAAA,SAAAoE,GACA,IAAAe,EAAA,IAAAC,MAAAxD,UAAAnJ,OAAA,GACA,GAAAmJ,UAAAnJ,OAAA,EACA,IAAA,IAAAT,EAAA,EAAAA,EAAA4J,UAAAnJ,OAAAT,IACAmN,EAAAnN,EAAA,GAAA4J,UAAA5J,GAGAuM,EAAAlG,KAAA,IAAA2G,EAAAZ,EAAAe,IACA,IAAAZ,EAAA9L,QAAA+L,GACAL,EAAAS,IASAI,EAAAhL,UAAA6E,IAAA,WACAvH,KAAA8M,IAAAzC,MAAA,KAAArK,KAAA2N,QAEAtM,EAAA0M,MAAA,UACA1M,EAAA2M,SAAA,EACA3M,EAAA4M,IAAA,GACA5M,EAAA6M,KAAA,GACA7M,EAAAqK,QAAA,GACArK,EAAA8M,SAAA,GAIA9M,EAAAiD,GAAAsJ,EACAvM,EAAA+M,YAAAR,EACAvM,EAAA+E,KAAAwH,EACAvM,EAAAgN,IAAAT,EACAvM,EAAAiN,eAAAV,EACAvM,EAAAkN,mBAAAX,EACAvM,EAAA2C,KAAA4J,EACAvM,EAAAmN,gBAAAZ,EACAvM,EAAAoN,oBAAAb,EAEAvM,EAAAqN,UAAA,SAAAxF,GAAA,MAAA,IAEA7H,EAAAsN,QAAA,SAAAzF,GACA,MAAA,IAAAnI,MAAA,qCAGAM,EAAAuN,IAAA,WAAA,MAAA,KACAvN,EAAAwN,MAAA,SAAAC,GACA,MAAA,IAAA/N,MAAA,mCAEAM,EAAA0N,MAAA,WAAA,OAAA,IFm2BE,KAAK,GAAG,CAAC,GD1hCX,CC0hCe","file":"jsforce-api-bulk.min.js","sourcesContent":["(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','',\"\"+e+\"\",\"\"+this.type+\"\",this.options.extIdField?\"\"+this.options.extIdField+\"\":\"\",this.options.concurrencyMode?\"\"+this.options.concurrencyMode+\"\":\"\",this.options.assignmentRuleId?\"\"+this.options.assignmentRuleId+\"\":\"\",\"CSV\",\"\"].join(\"\"),this._jobInfo=r._request({method:\"POST\",path:\"/job\",body:n,headers:{\"Content-Type\":\"application/xml; charset=utf-8\"},responseType:\"application/xml\"}).then(function(t){return o.emit(\"open\",t.jobInfo),o.id=t.jobInfo.id,o.state=t.jobInfo.state,t.jobInfo},function(t){throw o.emit(\"error\",t),t})),this._jobInfo.thenCall(t)},o.prototype.createBatch=function(){var t=new p(this),e=this;return t.on(\"queue\",function(){e._batches[t.id]=t}),t},o.prototype.batch=function(t){var e=this._batches[t];return e||(e=new p(this,t),this._batches[t]=e),e},o.prototype.check=function(t){var e=this,n=this._bulk,o=n._logger;return this._jobInfo=this._waitAssign().then(function(){return n._request({method:\"GET\",path:\"/job/\"+e.id,responseType:\"application/xml\"})}).then(function(t){return o.debug(t.jobInfo),e.id=t.jobInfo.id,e.type=t.jobInfo.object,e.operation=t.jobInfo.operation,e.state=t.jobInfo.state,t.jobInfo}),this._jobInfo.thenCall(t)},o.prototype._waitAssign=function(t){return(this.id?h.resolve({id:this.id}):this.open()).thenCall(t)},o.prototype.list=function(t){var e=this,n=this._bulk,o=n._logger;return this._waitAssign().then(function(){return n._request({method:\"GET\",path:\"/job/\"+e.id+\"/batch\",responseType:\"application/xml\"})}).then(function(t){o.debug(t.batchInfoList.batchInfo);var e=t.batchInfoList;return e=c.isArray(e.batchInfo)?e.batchInfo:[e.batchInfo]}).thenCall(t)},o.prototype.close=function(){var e=this;return this._changeState(\"Closed\").then(function(t){return e.id=null,e.emit(\"close\",t),t},function(t){throw e.emit(\"error\",t),t})},o.prototype.abort=function(){var e=this;return this._changeState(\"Aborted\").then(function(t){return e.id=null,e.emit(\"abort\",t),t},function(t){throw e.emit(\"error\",t),t})},o.prototype._changeState=function(e,t){var n=this,o=this._bulk,r=o._logger;return this._jobInfo=this._waitAssign().then(function(){var t=['','',\"\"+e+\"\",\"\"].join(\"\");return o._request({method:\"POST\",path:\"/job/\"+n.id,body:t,headers:{\"Content-Type\":\"application/xml; charset=utf-8\"},responseType:\"application/xml\"})}).then(function(t){return r.debug(t.jobInfo),n.state=t.jobInfo.state,t.jobInfo}),this._jobInfo.thenCall(t)};var p=function(t,e){p.super_.call(this,{objectMode:!0}),this.job=t,this.id=e,this._bulk=t._bulk,this._deferred=h.defer(),this._setupDataStreams()};t(p,e.Writable),p.prototype._setupDataStreams=function(){var o=this,t={nullValue:\"#N/A\"};this._uploadStream=new u.Serializable,this._uploadDataStream=this._uploadStream.stream(\"csv\",t),this._downloadStream=new u.Parsable,this._downloadDataStream=this._downloadStream.stream(\"csv\",t),this.on(\"finish\",function(){o._uploadStream.end()}),this._uploadDataStream.once(\"readable\",function(){o.job.open().then(function(){o._uploadDataStream.pipe(o._createRequestStream())})});var n=this._dataStream=new r;n._write=function(t,e,n){o._uploadDataStream.write(t,e,n)},n.on(\"finish\",function(){o._uploadDataStream.end()}),this._downloadDataStream.on(\"readable\",function(){n.read(0)}),this._downloadDataStream.on(\"end\",function(){n.push(null)}),n._read=function(t){for(var e;null!==(e=o._downloadDataStream.read());)n.push(e)}},p.prototype._createRequestStream=function(){var n=this,t=n._bulk,o=t._logger;return t._request({method:\"POST\",path:\"/job/\"+n.job.id+\"/batch\",headers:{\"Content-Type\":\"text/csv\"},responseType:\"application/xml\"},function(t,e){t?n.emit(\"error\",t):(o.debug(e.batchInfo),n.id=e.batchInfo.id,n.emit(\"queue\",e.batchInfo))}).stream()},p.prototype._write=function(t,e,n){t=c.clone(t),\"insert\"===this.job.operation?delete t.Id:\"delete\"===this.job.operation&&(t={Id:t.Id}),delete t.type,delete t.attributes,this._uploadStream.write(t,e,n)},p.prototype.stream=function(){return this._dataStream},p.prototype.run=p.prototype.exec=p.prototype.execute=function(t,e){var n=this;if(\"function\"==typeof t&&(e=t,t=null),this._result)throw new Error(\"Batch already executed.\");var o=h.defer();return this._result=o.promise,this._result.then(function(t){n._deferred.resolve(t)},function(t){n._deferred.reject(t)}),this.once(\"response\",function(t){o.resolve(t)}),this.once(\"error\",function(t){o.reject(t)}),c.isObject(t)&&c.isFunction(t.pipe)?t.pipe(this._dataStream):c.isArray(t)?(c.forEach(t,function(e){Object.keys(e).forEach(function(t){\"boolean\"==typeof e[t]&&(e[t]=String(e[t]))}),n.write(e)}),n.end()):c.isString(t)&&(this._dataStream.write(t,\"utf8\"),this._dataStream.end()),this.thenCall(e)},p.prototype.then=function(t,e,n){return this._deferred.promise.then(t,e,n)},p.prototype.thenCall=function(e){return c.isFunction(e)&&this.then(function(t){n.nextTick(function(){e(null,t)})},function(t){n.nextTick(function(){e(t)})}),this},p.prototype.check=function(t){var e=this._bulk,n=e._logger,o=this.job.id,r=this.id;if(!o||!r)throw new Error(\"Batch not started.\");return e._request({method:\"GET\",path:\"/job/\"+o+\"/batch/\"+r,responseType:\"application/xml\"}).then(function(t){return n.debug(t.batchInfo),t.batchInfo}).thenCall(t)},p.prototype.poll=function(n,o){var r=this,i=this.job.id,s=this.id;if(!i||!s)throw new Error(\"Batch not started.\");var a=(new Date).getTime(),u=function(){var t=(new Date).getTime();if(a+oInvalidSessionId<\\/exceptionCode>/.test(t.body)},f.prototype.hasErrorInResponseBody=function(t){return!!t.error},f.prototype.parseError=function(t){return{errorCode:t.error.exceptionCode,message:t.error.exceptionMessage}};function d(t){this._conn=t,this._logger=t._logger}d.prototype.pollInterval=1e3,d.prototype.pollTimeout=1e4,d.prototype._request=function(t,e){var n=this._conn;t=c.clone(t);var o=[n.instanceUrl,\"services/async\",n.version].join(\"/\");t.url=o+t.path;var r={responseType:t.responseType};return delete t.path,delete t.responseType,new f(this._conn,r).request(t).thenCall(e)},d.prototype.load=function(t,e,n,o,r){var i=this;if(!t||!e)throw new Error(\"Insufficient arguments. At least, 'type' and 'operation' are required.\");c.isObject(n)&&n.constructor===Object||(r=o,o=n,n=null);var s=this.createJob(t,e,n);s.once(\"error\",function(t){u&&u.emit(\"error\",t)});function a(){u=null,s.close()}var u=s.createBatch();return u.on(\"response\",a),u.on(\"error\",function(t){\"PollingTimeout\"!==t.name&&a()}),u.on(\"queue\",function(){u.poll(i.pollInterval,i.pollTimeout)}),u.execute(o,r)},d.prototype.query=function(t){var e=t.replace(/\\([\\s\\S]+\\)/g,\"\").match(/FROM\\s+(\\w+)/i);if(!e)throw new Error(\"No sobject type found in query, maybe caused by invalid SOQL.\");var n=e[1],o=this,r=new u.Parsable,i=r.stream(\"csv\");return this.load(n,\"query\",t).then(function(t){var e=t.map(function(t){return o.job(t.jobId).batch(t.batchId).result(t.id).stream()});s(e).pipe(i)}).fail(function(t){r.emit(\"error\",t)}),r},d.prototype.createJob=function(t,e,n){return new o(this,t,e,n)},d.prototype.job=function(t){return new o(this,null,null,null,t)},a.on(\"connection:new\",function(t){t.bulk=new d(t)}),b.exports=d}).call(this,t(\"_process\"))},{_process:2}],2:[function(t,e,n){var o,r,i=e.exports={};function s(){throw new Error(\"setTimeout has not been defined\")}function a(){throw new Error(\"clearTimeout has not been defined\")}function u(e){if(o===setTimeout)return setTimeout(e,0);if((o===s||!o)&&setTimeout)return o=setTimeout,setTimeout(e,0);try{return o(e,0)}catch(t){try{return o.call(null,e,0)}catch(t){return o.call(this,e,0)}}}!function(){try{o=\"function\"==typeof setTimeout?setTimeout:s}catch(t){o=s}try{r=\"function\"==typeof clearTimeout?clearTimeout:a}catch(t){r=a}}();var c,h=[],l=!1,p=-1;function f(){l&&c&&(l=!1,c.length?h=c.concat(h):p=-1,h.length&&d())}function d(){if(!l){var t=u(f);l=!0;for(var e=h.length;e;){for(c=h,h=[];++p\n */\n\n'use strict';\n\nvar inherits = window.jsforce.require('inherits'),\n stream = window.jsforce.require('readable-stream'),\n Duplex = stream.Duplex,\n events = window.jsforce.require('events'),\n _ = window.jsforce.require('lodash/core'),\n joinStreams = window.jsforce.require('multistream'),\n jsforce = window.jsforce.require('./core'),\n RecordStream = window.jsforce.require('./record-stream'),\n Promise = window.jsforce.require('./promise'),\n HttpApi = window.jsforce.require('./http-api');\n\n/*--------------------------------------------*/\n\n/**\n * Class for Bulk API Job\n *\n * @protected\n * @class Bulk~Job\n * @extends events.EventEmitter\n *\n * @param {Bulk} bulk - Bulk API object\n * @param {String} [type] - SObject type\n * @param {String} [operation] - Bulk load operation ('insert', 'update', 'upsert', 'delete', or 'hardDelete')\n * @param {Object} [options] - Options for bulk loading operation\n * @param {String} [options.extIdField] - External ID field name (used when upsert operation).\n * @param {String} [options.concurrencyMode] - 'Serial' or 'Parallel'. Defaults to Parallel.\n * @param {String} [jobId] - Job ID (if already available)\n */\nvar Job = function(bulk, type, operation, options, jobId) {\n this._bulk = bulk;\n this.type = type;\n this.operation = operation;\n this.options = options || {};\n this.id = jobId;\n this.state = this.id ? 'Open' : 'Unknown';\n this._batches = {};\n};\n\ninherits(Job, events.EventEmitter);\n\n/**\n * @typedef {Object} Bulk~JobInfo\n * @prop {String} id - Job ID\n * @prop {String} object - Object type name\n * @prop {String} operation - Operation type of the job\n * @prop {String} state - Job status\n */\n\n/**\n * Return latest jobInfo from cache\n *\n * @method Bulk~Job#info\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\nJob.prototype.info = function(callback) {\n var self = this;\n // if cache is not available, check the latest\n if (!this._jobInfo) {\n this._jobInfo = this.check();\n }\n return this._jobInfo.thenCall(callback);\n};\n\n/**\n * Open new job and get jobinfo\n *\n * @method Bulk~Job#open\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\nJob.prototype.open = function(callback) {\n var self = this;\n var bulk = this._bulk;\n var logger = bulk._logger;\n\n // if not requested opening job\n if (!this._jobInfo) {\n var operation = this.operation.toLowerCase();\n if (operation === 'harddelete') { operation = 'hardDelete'; }\n var body = [\n '',\n '',\n '' + operation + '',\n '' + this.type + '',\n (this.options.extIdField ?\n ''+this.options.extIdField+'' :\n ''),\n (this.options.concurrencyMode ?\n ''+this.options.concurrencyMode+'' :\n ''),\n (this.options.assignmentRuleId ?\n '' + this.options.assignmentRuleId + '' :\n ''),\n 'CSV',\n ''\n ].join('');\n\n this._jobInfo = bulk._request({\n method : 'POST',\n path : \"/job\",\n body : body,\n headers : {\n \"Content-Type\" : \"application/xml; charset=utf-8\"\n },\n responseType: \"application/xml\"\n }).then(function(res) {\n self.emit(\"open\", res.jobInfo);\n self.id = res.jobInfo.id;\n self.state = res.jobInfo.state;\n return res.jobInfo;\n }, function(err) {\n self.emit(\"error\", err);\n throw err;\n });\n }\n return this._jobInfo.thenCall(callback);\n};\n\n/**\n * Create a new batch instance in the job\n *\n * @method Bulk~Job#createBatch\n * @returns {Bulk~Batch}\n */\nJob.prototype.createBatch = function() {\n var batch = new Batch(this);\n var self = this;\n batch.on('queue', function() {\n self._batches[batch.id] = batch;\n });\n return batch;\n};\n\n/**\n * Get a batch instance specified by given batch ID\n *\n * @method Bulk~Job#batch\n * @param {String} batchId - Batch ID\n * @returns {Bulk~Batch}\n */\nJob.prototype.batch = function(batchId) {\n var batch = this._batches[batchId];\n if (!batch) {\n batch = new Batch(this, batchId);\n this._batches[batchId] = batch;\n }\n return batch;\n};\n\n/**\n * Check the latest job status from server\n *\n * @method Bulk~Job#check\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\nJob.prototype.check = function(callback) {\n var self = this;\n var bulk = this._bulk;\n var logger = bulk._logger;\n\n this._jobInfo = this._waitAssign().then(function() {\n return bulk._request({\n method : 'GET',\n path : \"/job/\" + self.id,\n responseType: \"application/xml\"\n });\n }).then(function(res) {\n logger.debug(res.jobInfo);\n self.id = res.jobInfo.id;\n self.type = res.jobInfo.object;\n self.operation = res.jobInfo.operation;\n self.state = res.jobInfo.state;\n return res.jobInfo;\n });\n return this._jobInfo.thenCall(callback);\n};\n\n/**\n * Wait till the job is assigned to server\n *\n * @method Bulk~Job#info\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\nJob.prototype._waitAssign = function(callback) {\n return (this.id ? Promise.resolve({ id: this.id }) : this.open()).thenCall(callback);\n};\n\n\n/**\n * List all registered batch info in job\n *\n * @method Bulk~Job#list\n * @param {Callback.>} [callback] - Callback function\n * @returns {Promise.>}\n */\nJob.prototype.list = function(callback) {\n var self = this;\n var bulk = this._bulk;\n var logger = bulk._logger;\n\n return this._waitAssign().then(function() {\n return bulk._request({\n method : 'GET',\n path : \"/job/\" + self.id + \"/batch\",\n responseType: \"application/xml\"\n });\n }).then(function(res) {\n logger.debug(res.batchInfoList.batchInfo);\n var batchInfoList = res.batchInfoList;\n batchInfoList = _.isArray(batchInfoList.batchInfo) ? batchInfoList.batchInfo : [ batchInfoList.batchInfo ];\n return batchInfoList;\n }).thenCall(callback);\n\n};\n\n/**\n * Close opened job\n *\n * @method Bulk~Job#close\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\nJob.prototype.close = function() {\n var self = this;\n return this._changeState(\"Closed\").then(function(jobInfo) {\n self.id = null;\n self.emit(\"close\", jobInfo);\n return jobInfo;\n }, function(err) {\n self.emit(\"error\", err);\n throw err;\n });\n};\n\n/**\n * Set the status to abort\n *\n * @method Bulk~Job#abort\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\nJob.prototype.abort = function() {\n var self = this;\n return this._changeState(\"Aborted\").then(function(jobInfo) {\n self.id = null;\n self.emit(\"abort\", jobInfo);\n return jobInfo;\n }, function(err) {\n self.emit(\"error\", err);\n throw err;\n });\n};\n\n/**\n * @private\n */\nJob.prototype._changeState = function(state, callback) {\n var self = this;\n var bulk = this._bulk;\n var logger = bulk._logger;\n\n this._jobInfo = this._waitAssign().then(function() {\n var body = [\n '',\n '',\n '' + state + '',\n ''\n ].join('');\n return bulk._request({\n method : 'POST',\n path : \"/job/\" + self.id,\n body : body,\n headers : {\n \"Content-Type\" : \"application/xml; charset=utf-8\"\n },\n responseType: \"application/xml\"\n });\n }).then(function(res) {\n logger.debug(res.jobInfo);\n self.state = res.jobInfo.state;\n return res.jobInfo;\n });\n return this._jobInfo.thenCall(callback);\n\n};\n\n\n/*--------------------------------------------*/\n\n/**\n * Batch (extends RecordStream)\n *\n * @protected\n * @class Bulk~Batch\n * @extends {stream.Writable}\n * @implements {Promise.>}\n * @param {Bulk~Job} job - Bulk job object\n * @param {String} [batchId] - Batch ID (if already available)\n */\nvar Batch = function(job, batchId) {\n Batch.super_.call(this, { objectMode: true });\n this.job = job;\n this.id = batchId;\n this._bulk = job._bulk;\n this._deferred = Promise.defer();\n this._setupDataStreams();\n};\n\ninherits(Batch, stream.Writable);\n\n\n/**\n * @private\n */\nBatch.prototype._setupDataStreams = function() {\n var batch = this;\n var converterOptions = { nullValue : '#N/A' };\n this._uploadStream = new RecordStream.Serializable();\n this._uploadDataStream = this._uploadStream.stream('csv', converterOptions);\n this._downloadStream = new RecordStream.Parsable();\n this._downloadDataStream = this._downloadStream.stream('csv', converterOptions);\n\n this.on('finish', function() {\n batch._uploadStream.end();\n });\n this._uploadDataStream.once('readable', function() {\n batch.job.open().then(function() {\n // pipe upload data to batch API request stream\n batch._uploadDataStream.pipe(batch._createRequestStream());\n });\n });\n\n // duplex data stream, opened access to API programmers by Batch#stream()\n var dataStream = this._dataStream = new Duplex();\n dataStream._write = function(data, enc, cb) {\n batch._uploadDataStream.write(data, enc, cb);\n };\n dataStream.on('finish', function() {\n batch._uploadDataStream.end();\n });\n\n this._downloadDataStream.on('readable', function() {\n dataStream.read(0);\n });\n this._downloadDataStream.on('end', function() {\n dataStream.push(null);\n });\n dataStream._read = function(size) {\n var chunk;\n while ((chunk = batch._downloadDataStream.read()) !== null) {\n dataStream.push(chunk);\n }\n };\n};\n\n/**\n * Connect batch API and create stream instance of request/response\n *\n * @private\n * @returns {stream.Duplex}\n */\nBatch.prototype._createRequestStream = function() {\n var batch = this;\n var bulk = batch._bulk;\n var logger = bulk._logger;\n\n return bulk._request({\n method : 'POST',\n path : \"/job/\" + batch.job.id + \"/batch\",\n headers: {\n \"Content-Type\": \"text/csv\"\n },\n responseType: \"application/xml\"\n }, function(err, res) {\n if (err) {\n batch.emit('error', err);\n } else {\n logger.debug(res.batchInfo);\n batch.id = res.batchInfo.id;\n batch.emit('queue', res.batchInfo);\n }\n }).stream();\n};\n\n/**\n * Implementation of Writable\n *\n * @override\n * @private\n */\nBatch.prototype._write = function(record, enc, cb) {\n record = _.clone(record);\n if (this.job.operation === \"insert\") {\n delete record.Id;\n } else if (this.job.operation === \"delete\") {\n record = { Id: record.Id };\n }\n delete record.type;\n delete record.attributes;\n this._uploadStream.write(record, enc, cb);\n};\n\n/**\n * Returns duplex stream which accepts CSV data input and batch result output\n *\n * @returns {stream.Duplex}\n */\nBatch.prototype.stream = function() {\n return this._dataStream;\n};\n\n/**\n * Execute batch operation\n *\n * @method Bulk~Batch#execute\n * @param {Array.|stream.Stream|String} [input] - Input source for batch operation. Accepts array of records, CSV string, and CSV data input stream in insert/update/upsert/delete/hardDelete operation, SOQL string in query operation.\n * @param {Callback.|Array.>} [callback] - Callback function\n * @returns {Bulk~Batch}\n */\nBatch.prototype.run =\nBatch.prototype.exec =\nBatch.prototype.execute = function(input, callback) {\n var self = this;\n\n if (typeof input === 'function') { // if input argument is omitted\n callback = input;\n input = null;\n }\n\n // if batch is already executed\n if (this._result) {\n throw new Error(\"Batch already executed.\");\n }\n\n var rdeferred = Promise.defer();\n this._result = rdeferred.promise;\n this._result.then(function(res) {\n self._deferred.resolve(res);\n }, function(err) {\n self._deferred.reject(err);\n });\n this.once('response', function(res) {\n rdeferred.resolve(res);\n });\n this.once('error', function(err) {\n rdeferred.reject(err);\n });\n\n if (_.isObject(input) && _.isFunction(input.pipe)) { // if input has stream.Readable interface\n input.pipe(this._dataStream);\n } else {\n var data;\n if (_.isArray(input)) {\n _.forEach(input, function(record) {\n Object.keys(record).forEach(function(key) {\n if (typeof record[key] === 'boolean') {\n record[key] = String(record[key])\n }\n })\n self.write(record);\n });\n self.end();\n } else if (_.isString(input)){\n data = input;\n this._dataStream.write(data, 'utf8');\n this._dataStream.end();\n }\n }\n\n // return Batch instance for chaining\n return this.thenCall(callback);\n};\n\n/**\n * Promise/A+ interface\n * http://promises-aplus.github.io/promises-spec/\n *\n * Delegate to deferred promise, return promise instance for batch result\n *\n * @method Bulk~Batch#then\n */\nBatch.prototype.then = function(onResolved, onReject, onProgress) {\n return this._deferred.promise.then(onResolved, onReject, onProgress);\n};\n\n/**\n * Promise/A+ extension\n * Call \"then\" using given node-style callback function\n *\n * @method Bulk~Batch#thenCall\n */\nBatch.prototype.thenCall = function(callback) {\n if (_.isFunction(callback)) {\n this.then(function(res) {\n process.nextTick(function() {\n callback(null, res);\n });\n }, function(err) {\n process.nextTick(function() {\n callback(err);\n });\n });\n }\n return this;\n};\n\n/**\n * @typedef {Object} Bulk~BatchInfo\n * @prop {String} id - Batch ID\n * @prop {String} jobId - Job ID\n * @prop {String} state - Batch state\n * @prop {String} stateMessage - Batch state message\n */\n\n/**\n * Check the latest batch status in server\n *\n * @method Bulk~Batch#check\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\nBatch.prototype.check = function(callback) {\n var self = this;\n var bulk = this._bulk;\n var logger = bulk._logger;\n var jobId = this.job.id;\n var batchId = this.id;\n\n if (!jobId || !batchId) {\n throw new Error(\"Batch not started.\");\n }\n return bulk._request({\n method : 'GET',\n path : \"/job/\" + jobId + \"/batch/\" + batchId,\n responseType: \"application/xml\"\n }).then(function(res) {\n logger.debug(res.batchInfo);\n return res.batchInfo;\n }).thenCall(callback);\n};\n\n\n/**\n * Polling the batch result and retrieve\n *\n * @method Bulk~Batch#poll\n * @param {Number} interval - Polling interval in milliseconds\n * @param {Number} timeout - Polling timeout in milliseconds\n */\nBatch.prototype.poll = function(interval, timeout) {\n var self = this;\n var jobId = this.job.id;\n var batchId = this.id;\n\n if (!jobId || !batchId) {\n throw new Error(\"Batch not started.\");\n }\n var startTime = new Date().getTime();\n var poll = function() {\n var now = new Date().getTime();\n if (startTime + timeout < now) {\n var err = new Error(\"Polling time out. Job Id = \" + jobId + \" , batch Id = \" + batchId);\n err.name = 'PollingTimeout';\n err.jobId = jobId;\n err.batchId = batchId;\n self.emit('error', err);\n return;\n }\n self.check(function(err, res) {\n if (err) {\n self.emit('error', err);\n } else {\n if (res.state === \"Failed\") {\n if (parseInt(res.numberRecordsProcessed, 10) > 0) {\n self.retrieve();\n } else {\n self.emit('error', new Error(res.stateMessage));\n }\n } else if (res.state === \"Completed\") {\n self.retrieve();\n } else {\n self.emit('progress', res);\n setTimeout(poll, interval);\n }\n }\n });\n };\n setTimeout(poll, interval);\n};\n\n/**\n * @typedef {Object} Bulk~BatchResultInfo\n * @prop {String} id - Batch result ID\n * @prop {String} batchId - Batch ID which includes this batch result.\n * @prop {String} jobId - Job ID which includes this batch result.\n */\n\n/**\n * Retrieve batch result\n *\n * @method Bulk~Batch#retrieve\n * @param {Callback.|Array.>} [callback] - Callback function\n * @returns {Promise.|Array.>}\n */\nBatch.prototype.retrieve = function(callback) {\n var self = this;\n var bulk = this._bulk;\n var jobId = this.job.id;\n var job = this.job;\n var batchId = this.id;\n\n if (!jobId || !batchId) {\n throw new Error(\"Batch not started.\");\n }\n\n return job.info().then(function(jobInfo) {\n return bulk._request({\n method : 'GET',\n path : \"/job/\" + jobId + \"/batch/\" + batchId + \"/result\"\n });\n }).then(function(res) {\n var results;\n if (job.operation === 'query') {\n var conn = bulk._conn;\n var resultIds = res['result-list'].result;\n results = res['result-list'].result;\n results = _.map(_.isArray(results) ? results : [ results ], function(id) {\n return {\n id: id,\n batchId: batchId,\n jobId: jobId\n };\n });\n } else {\n results = _.map(res, function(ret) {\n return {\n id: ret.Id || null,\n success: ret.Success === \"true\",\n errors: ret.Error ? [ ret.Error ] : []\n };\n });\n }\n self.emit('response', results);\n return results;\n }).fail(function(err) {\n self.emit('error', err);\n throw err;\n }).thenCall(callback);\n};\n\n/**\n * Fetch query result as a record stream\n * @param {String} resultId - Result id\n * @returns {RecordStream} - Record stream, convertible to CSV data stream\n */\nBatch.prototype.result = function(resultId) {\n var jobId = this.job.id;\n var batchId = this.id;\n if (!jobId || !batchId) {\n throw new Error(\"Batch not started.\");\n }\n var resultStream = new RecordStream.Parsable();\n var resultDataStream = resultStream.stream('csv');\n var reqStream = this._bulk._request({\n method : 'GET',\n path : \"/job/\" + jobId + \"/batch/\" + batchId + \"/result/\" + resultId,\n responseType: \"application/octet-stream\"\n }).stream().pipe(resultDataStream);\n return resultStream;\n};\n\n/*--------------------------------------------*/\n/**\n * @private\n */\nvar BulkApi = function() {\n BulkApi.super_.apply(this, arguments);\n};\n\ninherits(BulkApi, HttpApi);\n\nBulkApi.prototype.beforeSend = function(request) {\n request.headers = request.headers || {};\n request.headers[\"X-SFDC-SESSION\"] = this._conn.accessToken;\n};\n\nBulkApi.prototype.isSessionExpired = function(response) {\n return response.statusCode === 400 &&\n /InvalidSessionId<\\/exceptionCode>/.test(response.body);\n};\n\nBulkApi.prototype.hasErrorInResponseBody = function(body) {\n return !!body.error;\n};\n\nBulkApi.prototype.parseError = function(body) {\n return {\n errorCode: body.error.exceptionCode,\n message: body.error.exceptionMessage\n };\n};\n\n/*--------------------------------------------*/\n\n/**\n * Class for Bulk API\n *\n * @class\n * @param {Connection} conn - Connection object\n */\nvar Bulk = function(conn) {\n this._conn = conn;\n this._logger = conn._logger;\n};\n\n/**\n * Polling interval in milliseconds\n * @type {Number}\n */\nBulk.prototype.pollInterval = 1000;\n\n/**\n * Polling timeout in milliseconds\n * @type {Number}\n */\nBulk.prototype.pollTimeout = 10000;\n\n/** @private **/\nBulk.prototype._request = function(request, callback) {\n var conn = this._conn;\n request = _.clone(request);\n var baseUrl = [ conn.instanceUrl, \"services/async\", conn.version ].join('/');\n request.url = baseUrl + request.path;\n var options = { responseType: request.responseType };\n delete request.path;\n delete request.responseType;\n return new BulkApi(this._conn, options).request(request).thenCall(callback);\n};\n\n/**\n * Create and start bulkload job and batch\n *\n * @param {String} type - SObject type\n * @param {String} operation - Bulk load operation ('insert', 'update', 'upsert', 'delete', or 'hardDelete')\n * @param {Object} [options] - Options for bulk loading operation\n * @param {String} [options.extIdField] - External ID field name (used when upsert operation).\n * @param {String} [options.concurrencyMode] - 'Serial' or 'Parallel'. Defaults to Parallel.\n * @param {Array.|stream.Stream|String} [input] - Input source for bulkload. Accepts array of records, CSV string, and CSV data input stream in insert/update/upsert/delete/hardDelete operation, SOQL string in query operation.\n * @param {Callback.|Array.>} [callback] - Callback function\n * @returns {Bulk~Batch}\n */\nBulk.prototype.load = function(type, operation, options, input, callback) {\n var self = this;\n if (!type || !operation) {\n throw new Error(\"Insufficient arguments. At least, 'type' and 'operation' are required.\");\n }\n if (!_.isObject(options) || options.constructor !== Object) { // when options is not plain hash object, it is omitted\n callback = input;\n input = options;\n options = null;\n }\n var job = this.createJob(type, operation, options);\n job.once('error', function (error) {\n if (batch) {\n batch.emit('error', error); // pass job error to batch\n }\n });\n var batch = job.createBatch();\n var cleanup = function() {\n batch = null;\n job.close();\n };\n var cleanupOnError = function(err) {\n if (err.name !== 'PollingTimeout') {\n cleanup();\n }\n };\n batch.on('response', cleanup);\n batch.on('error', cleanupOnError);\n batch.on('queue', function() { batch.poll(self.pollInterval, self.pollTimeout); });\n return batch.execute(input, callback);\n};\n\n/**\n * Execute bulk query and get record stream\n *\n * @param {String} soql - SOQL to execute in bulk job\n * @returns {RecordStream.Parsable} - Record stream, convertible to CSV data stream\n */\nBulk.prototype.query = function(soql) {\n var m = soql.replace(/\\([\\s\\S]+\\)/g, '').match(/FROM\\s+(\\w+)/i);\n if (!m) {\n throw new Error(\"No sobject type found in query, maybe caused by invalid SOQL.\");\n }\n var type = m[1];\n var self = this;\n var recordStream = new RecordStream.Parsable();\n var dataStream = recordStream.stream('csv');\n this.load(type, \"query\", soql).then(function(results) {\n var streams = results.map(function(result) {\n return self\n .job(result.jobId)\n .batch(result.batchId)\n .result(result.id)\n .stream();\n });\n\n joinStreams(streams).pipe(dataStream);\n }).fail(function(err) {\n recordStream.emit('error', err);\n });\n return recordStream;\n};\n\n\n/**\n * Create a new job instance\n *\n * @param {String} type - SObject type\n * @param {String} operation - Bulk load operation ('insert', 'update', 'upsert', 'delete', 'hardDelete', or 'query')\n * @param {Object} [options] - Options for bulk loading operation\n * @returns {Bulk~Job}\n */\nBulk.prototype.createJob = function(type, operation, options) {\n return new Job(this, type, operation, options);\n};\n\n/**\n * Get a job instance specified by given job ID\n *\n * @param {String} jobId - Job ID\n * @returns {Bulk~Job}\n */\nBulk.prototype.job = function(jobId) {\n return new Job(this, null, null, null, jobId);\n};\n\n\n/*--------------------------------------------*/\n/*\n * Register hook in connection instantiation for dynamically adding this API module features\n */\njsforce.on('connection:new', function(conn) {\n conn.bulk = new Bulk(conn);\n});\n\n\nmodule.exports = Bulk;\n","// shim for using process in browser\nvar process = module.exports = {};\n\n// cached from whatever global is present so that test runners that stub it\n// don't break things. But we need to wrap it in a try catch in case it is\n// wrapped in strict mode code which doesn't define any globals. It's inside a\n// function because try/catches deoptimize in certain engines.\n\nvar cachedSetTimeout;\nvar cachedClearTimeout;\n\nfunction defaultSetTimout() {\n throw new Error('setTimeout has not been defined');\n}\nfunction defaultClearTimeout () {\n throw new Error('clearTimeout has not been defined');\n}\n(function () {\n try {\n if (typeof setTimeout === 'function') {\n cachedSetTimeout = setTimeout;\n } else {\n cachedSetTimeout = defaultSetTimout;\n }\n } catch (e) {\n cachedSetTimeout = defaultSetTimout;\n }\n try {\n if (typeof clearTimeout === 'function') {\n cachedClearTimeout = clearTimeout;\n } else {\n cachedClearTimeout = defaultClearTimeout;\n }\n } catch (e) {\n cachedClearTimeout = defaultClearTimeout;\n }\n} ())\nfunction runTimeout(fun) {\n if (cachedSetTimeout === setTimeout) {\n //normal enviroments in sane situations\n return setTimeout(fun, 0);\n }\n // if setTimeout wasn't available but was latter defined\n if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n cachedSetTimeout = setTimeout;\n return setTimeout(fun, 0);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedSetTimeout(fun, 0);\n } catch(e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedSetTimeout.call(null, fun, 0);\n } catch(e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n return cachedSetTimeout.call(this, fun, 0);\n }\n }\n\n\n}\nfunction runClearTimeout(marker) {\n if (cachedClearTimeout === clearTimeout) {\n //normal enviroments in sane situations\n return clearTimeout(marker);\n }\n // if clearTimeout wasn't available but was latter defined\n if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n cachedClearTimeout = clearTimeout;\n return clearTimeout(marker);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedClearTimeout(marker);\n } catch (e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedClearTimeout.call(null, marker);\n } catch (e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n return cachedClearTimeout.call(this, marker);\n }\n }\n\n\n\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n if (!draining || !currentQueue) {\n return;\n }\n draining = false;\n if (currentQueue.length) {\n queue = currentQueue.concat(queue);\n } else {\n queueIndex = -1;\n }\n if (queue.length) {\n drainQueue();\n }\n}\n\nfunction drainQueue() {\n if (draining) {\n return;\n }\n var timeout = runTimeout(cleanUpNextTick);\n draining = true;\n\n var len = queue.length;\n while(len) {\n currentQueue = queue;\n queue = [];\n while (++queueIndex < len) {\n if (currentQueue) {\n currentQueue[queueIndex].run();\n }\n }\n queueIndex = -1;\n len = queue.length;\n }\n currentQueue = null;\n draining = false;\n runClearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n var args = new Array(arguments.length - 1);\n if (arguments.length > 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"]} \ No newline at end of file diff --git a/build/jsforce-api-chatter.js b/build/jsforce-api-chatter.js index a29fe657..ae87274a 100644 --- a/build/jsforce-api-chatter.js +++ b/build/jsforce-api-chatter.js @@ -271,13 +271,13 @@ Resource.prototype.retrieve = function(callback) { * Update specified resource * * @method Chatter~Resource#update - * @param {Obejct} data - Data to update + * @param {Object} data - Data to update * @param {Callback.} [callback] - Callback function * @returns {Chatter~Request} */ Resource.prototype.update = function(data, callback) { return this._chatter.request({ - method: 'POST', + method: 'PATCH', url: this._url, body: data }).thenCall(callback); @@ -317,4 +317,4 @@ jsforce.on('connection:new', function(conn) { },{}]},{},[1])(1) }); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJsaWIvYXBpL2NoYXR0ZXIuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbigpe2Z1bmN0aW9uIHIoZSxuLHQpe2Z1bmN0aW9uIG8oaSxmKXtpZighbltpXSl7aWYoIWVbaV0pe3ZhciBjPVwiZnVuY3Rpb25cIj09dHlwZW9mIHJlcXVpcmUmJnJlcXVpcmU7aWYoIWYmJmMpcmV0dXJuIGMoaSwhMCk7aWYodSlyZXR1cm4gdShpLCEwKTt2YXIgYT1uZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiK2krXCInXCIpO3Rocm93IGEuY29kZT1cIk1PRFVMRV9OT1RfRk9VTkRcIixhfXZhciBwPW5baV09e2V4cG9ydHM6e319O2VbaV1bMF0uY2FsbChwLmV4cG9ydHMsZnVuY3Rpb24ocil7dmFyIG49ZVtpXVsxXVtyXTtyZXR1cm4gbyhufHxyKX0scCxwLmV4cG9ydHMscixlLG4sdCl9cmV0dXJuIG5baV0uZXhwb3J0c31mb3IodmFyIHU9XCJmdW5jdGlvblwiPT10eXBlb2YgcmVxdWlyZSYmcmVxdWlyZSxpPTA7aTx0Lmxlbmd0aDtpKyspbyh0W2ldKTtyZXR1cm4gb31yZXR1cm4gcn0pKCkiLCIvKipcbiAqIEBmaWxlIE1hbmFnZXMgU2FsZXNmb3JjZSBDaGF0dGVyIFJFU1QgQVBJIGNhbGxzXG4gKiBAYXV0aG9yIFNoaW5pY2hpIFRvbWl0YSA8c2hpbmljaGkudG9taXRhQGdtYWlsLmNvbT5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBpbmhlcml0cyA9IHdpbmRvdy5qc2ZvcmNlLnJlcXVpcmUoJ2luaGVyaXRzJyksXG4gICAgXyAgICAgICA9IHdpbmRvdy5qc2ZvcmNlLnJlcXVpcmUoJ2xvZGFzaC9jb3JlJyksXG4gICAganNmb3JjZSA9IHdpbmRvdy5qc2ZvcmNlLnJlcXVpcmUoJy4vY29yZScpLFxuICAgIFByb21pc2UgPSB3aW5kb3cuanNmb3JjZS5yZXF1aXJlKCcuL3Byb21pc2UnKTtcblxuLyoqXG4gKiBBUEkgY2xhc3MgZm9yIENoYXR0ZXIgUkVTVCBBUEkgY2FsbFxuICpcbiAqIEBjbGFzc1xuICogQHBhcmFtIHtDb25uZWN0aW9ufSBjb25uIENvbm5lY3Rpb25cbiAqL1xudmFyIENoYXR0ZXIgPSBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGNvbm4pIHtcbiAgdGhpcy5fY29ubiA9IGNvbm47XG59O1xuXG4vKipcbiAqIFNlbmRpbmcgcmVxdWVzdCB0byBBUEkgZW5kcG9pbnRcbiAqIEBwcml2YXRlXG4gKi9cbkNoYXR0ZXIucHJvdG90eXBlLl9yZXF1ZXN0ID0gZnVuY3Rpb24ocGFyYW1zLCBjYWxsYmFjaykge1xuICBpZiAoL14ocHV0fHBvc3R8cGF0Y2gpJC9pLnRlc3QocGFyYW1zLm1ldGhvZCkpIHtcbiAgICBpZiAoXy5pc09iamVjdChwYXJhbXMuYm9keSkpIHtcbiAgICAgIHBhcmFtcy5oZWFkZXJzID0ge1xuICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIlxuICAgICAgfTtcbiAgICAgIHBhcmFtcy5ib2R5ID0gSlNPTi5zdHJpbmdpZnkocGFyYW1zLmJvZHkpO1xuICAgIH1cbiAgfVxuICBwYXJhbXMudXJsID0gdGhpcy5fbm9ybWFsaXplVXJsKHBhcmFtcy51cmwpO1xuICByZXR1cm4gdGhpcy5fY29ubi5yZXF1ZXN0KHBhcmFtcywgY2FsbGJhY2spO1xufTtcblxuLyoqXG4gKiBDb252ZXJ0IHBhdGggdG8gc2l0ZSByb290IHJlbGF0aXZlIHVybFxuICogQHByaXZhdGVcbiAqL1xuQ2hhdHRlci5wcm90b3R5cGUuX25vcm1hbGl6ZVVybCA9IGZ1bmN0aW9uKHVybCkge1xuICBpZiAodXJsLmluZGV4T2YoJy9jaGF0dGVyLycpID09PSAwIHx8IHVybC5pbmRleE9mKCcvY29ubmVjdC8nKSA9PT0gMCkge1xuICAgIHJldHVybiAnL3NlcnZpY2VzL2RhdGEvdicgKyB0aGlzLl9jb25uLnZlcnNpb24gKyB1cmw7XG4gIH0gZWxzZSBpZiAoL15cXC92W1xcZF0rXFwuW1xcZF0rXFwvLy50ZXN0KHVybCkpIHtcbiAgICByZXR1cm4gJy9zZXJ2aWNlcy9kYXRhJyArIHVybDtcbiAgfSBlbHNlIGlmICh1cmwuaW5kZXhPZignL3NlcnZpY2VzLycpICE9PSAwICYmIHVybFswXSA9PT0gJy8nKSB7XG4gICAgcmV0dXJuICcvc2VydmljZXMvZGF0YS92JyArIHRoaXMuX2Nvbm4udmVyc2lvbiArICcvY2hhdHRlcicgKyB1cmw7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHVybDtcbiAgfVxufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBDaGF0dGVyflJlcXVlc3RQYXJhbXNcbiAqIEBwcm9wIHtTdHJpbmd9IG1ldGhvZCAtIEhUVFAgbWV0aG9kXG4gKiBAcHJvcCB7U3RyaW5nfSB1cmwgLSBSZXNvdXJjZSBVUkxcbiAqIEBwcm9wIHtTdHJpbmd9IFtib2R5XSAtIEhUVFAgYm9keSAoaW4gUE9TVC9QVVQvUEFUQ0ggbWV0aG9kcylcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IENoYXR0ZXJ+UmVxdWVzdFJlc3VsdFxuICovXG5cbi8qKlxuICogTWFrZSBhIHJlcXVlc3QgZm9yIGNoYXR0ZXIgQVBJIHJlc291cmNlXG4gKlxuICogQHBhcmFtIHtDaGF0dGVyflJlcXVlc3RQYXJhbXN9IHBhcmFtcyAtIFBhcmFtdGVycyByZXByZXNlbnRpbmcgSFRUUCByZXF1ZXN0XG4gKiBAcGFyYW0ge0NhbGxiYWNrLjxDaGF0dGVyflJlcXVlc3RSZXN1bHQ+fSBbY2FsbGJhY2tdIC0gQ2FsbGJhY2sgZnVuY1xuICogQHJldHVybnMge0NoYXR0ZXJ+UmVxdWVzdH1cbiAqL1xuQ2hhdHRlci5wcm90b3R5cGUucmVxdWVzdCA9IGZ1bmN0aW9uKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcmV0dXJuIG5ldyBSZXF1ZXN0KHRoaXMsIHBhcmFtcykudGhlbkNhbGwoY2FsbGJhY2spO1xufTtcblxuLyoqXG4gKiBNYWtlIGEgcmVzb3VyY2UgcmVxdWVzdCB0byBjaGF0dGVyIEFQSVxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSB1cmwgLSBSZXNvdXJjZSBVUkxcbiAqIEBwYXJhbSB7T2JqZWN0fSBbcXVlcnlQYXJhbXNdIC0gUXVlcnkgcGFyYW1ldGVycyAoaW4gaGFzaCBvYmplY3QpXG4gKiBAcmV0dXJucyB7Q2hhdHRlcn5SZXNvdXJjZX1cbiAqL1xuQ2hhdHRlci5wcm90b3R5cGUucmVzb3VyY2UgPSBmdW5jdGlvbih1cmwsIHF1ZXJ5UGFyYW1zKSB7XG4gIHJldHVybiBuZXcgUmVzb3VyY2UodGhpcywgdXJsLCBxdWVyeVBhcmFtcyk7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IENoYXR0ZXJ+QmF0Y2hSZXF1ZXN0UmVzdWx0XG4gKiBAcHJvcCB7Qm9vbGVhbn0gaGFzRXJyb3IgLSBGbGFnIGlmIHRoZSBiYXRjaCBoYXMgb25lIG9yIG1vcmUgZXJyb3JzXG4gKiBAcHJvcCB7QXJyYXkuPE9iamVjdD59IHJlc3VsdHMgLSBCYXRjaCByZXF1ZXN0IHJlc3VsdHMgaW4gYXJyYXlcbiAqIEBwcm9wIHtOdW1iZXJ9IHJlc3VsdHMuc3RhdHVzQ29kZSAtIEhUVFAgcmVzcG9uc2Ugc3RhdHVzIGNvZGVcbiAqIEBwcm9wIHtDaGF0dGVyflJlcXVlc3RSZXN1bHR9IHJlc3VsdHMucmVzdWx0IC0gUGFyc2VkIEhUVFAgcmVzcG9uc2UgYm9keVxuICovXG5cbi8qKlxuICogTWFrZSBhIGJhdGNoIHJlcXVlc3QgdG8gY2hhdHRlciBBUElcbiAqXG4gKiBAcGFyYW1zIHtBcnJheS48Q2hhdHRlcn5SZXF1ZXN0Pn0gcmVxdWVzdHMgLSBDaGF0dGVyIEFQSSByZXF1ZXN0c1xuICogQHBhcmFtIHtDYWxsYmFjay48Q2hhdHRlcn5CYXRjaFJlcXVlc3RSZXN1bHQ+fSBbY2FsbGJhY2tdIC0gQ2FsbGJhY2sgZnVuY1xuICogQHJldHVybnMge1Byb21pc2UuPENoYXR0ZXJ+QmF0Y2hSZXF1ZXN0UmVzdWx0Pn1cbiAqL1xuQ2hhdHRlci5wcm90b3R5cGUuYmF0Y2ggPSBmdW5jdGlvbihyZXF1ZXN0cywgY2FsbGJhY2spIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgYmF0Y2hSZXF1ZXN0cyA9IFtdLCBiYXRjaERlZmVycmVkcyA9IFtdO1xuICBfLmZvckVhY2gocmVxdWVzdHMsIGZ1bmN0aW9uKHJlcXVlc3QpIHtcbiAgICB2YXIgZGVmZXJyZWQgPSBQcm9taXNlLmRlZmVyKCk7XG4gICAgcmVxdWVzdC5fcHJvbWlzZSA9IGRlZmVycmVkLnByb21pc2U7XG4gICAgYmF0Y2hSZXF1ZXN0cy5wdXNoKHJlcXVlc3QuYmF0Y2hQYXJhbXMoKSk7XG4gICAgYmF0Y2hEZWZlcnJlZHMucHVzaChkZWZlcnJlZCk7XG4gIH0pO1xuICB2YXIgcGFyYW1zID0ge1xuICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgIHVybDogdGhpcy5fbm9ybWFsaXplVXJsKCcvY29ubmVjdC9iYXRjaCcpLFxuICAgIGJvZHk6IHtcbiAgICAgIGJhdGNoUmVxdWVzdHM6IGJhdGNoUmVxdWVzdHNcbiAgICB9XG4gIH07XG4gIHJldHVybiB0aGlzLnJlcXVlc3QocGFyYW1zKS50aGVuKGZ1bmN0aW9uKHJlcykge1xuICAgIF8uZm9yRWFjaChyZXMucmVzdWx0cywgZnVuY3Rpb24ocmVzdWx0LCBpKSB7XG4gICAgICB2YXIgZGVmZXJyZWQgPSBiYXRjaERlZmVycmVkc1tpXTtcbiAgICAgIGlmIChyZXN1bHQuc3RhdHVzQ29kZSA+PSA0MDApIHtcbiAgICAgICAgZGVmZXJyZWQucmVqZWN0KHJlc3VsdC5yZXN1bHQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVmZXJyZWQucmVzb2x2ZShyZXN1bHQucmVzdWx0KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gcmVzO1xuICB9KS50aGVuQ2FsbChjYWxsYmFjayk7XG59O1xuXG5cbi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuLyoqXG4gKiBBIGNsYXNzIHJlcHJlc2VudGluZyBjaGF0dGVyIEFQSSByZXF1ZXN0XG4gKlxuICogQHByb3RlY3RlZFxuICogQGNsYXNzIENoYXR0ZXJ+UmVxdWVzdFxuICogQGltcGxlbWVudHMge1Byb21pc2UuPENoYXR0ZXJ+UmVxdWVzdFJlc3VsdD59XG4gKiBAcGFyYW0ge0NoYXR0ZXJ9IGNoYXR0ZXIgLSBDaGF0dGVyIEFQSSBvYmplY3RcbiAqIEBwYXJhbSB7Q2hhdHRlcn5SZXF1ZXN0UGFyYW1zfSBwYXJhbXMgLSBQYXJhbXRlcnMgcmVwcmVzZW50aW5nIEhUVFAgcmVxdWVzdFxuICovXG52YXIgUmVxdWVzdCA9IGZ1bmN0aW9uKGNoYXR0ZXIsIHBhcmFtcykge1xuICB0aGlzLl9jaGF0dGVyID0gY2hhdHRlcjtcbiAgdGhpcy5fcGFyYW1zID0gcGFyYW1zO1xuICB0aGlzLl9wcm9taXNlID0gbnVsbDtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gQ2hhdHRlcn5CYXRjaFJlcXVlc3RQYXJhbXNcbiAqIEBwcm9wIHtTdHJpbmd9IG1ldGhvZCAtIEhUVFAgbWV0aG9kXG4gKiBAcHJvcCB7U3RyaW5nfSB1cmwgLSBSZXNvdXJjZSBVUkxcbiAqIEBwcm9wIHtTdHJpbmd9IFtyaWNoSW5wdXRdIC0gSFRUUCBib2R5IChpbiBQT1NUL1BVVC9QQVRDSCBtZXRob2RzKVxuICovXG5cbi8qKlxuICogUmV0cmlldmUgcGFyYW1ldGVycyBpbiBiYXRjaCByZXF1ZXN0IGZvcm1cbiAqXG4gKiBAbWV0aG9kIENoYXR0ZXJ+UmVxdWVzdCNiYXRjaFBhcmFtc1xuICogQHJldHVybnMge0NoYXR0ZXJ+QmF0Y2hSZXF1ZXN0UGFyYW1zfVxuICovXG5SZXF1ZXN0LnByb3RvdHlwZS5iYXRjaFBhcmFtcyA9IGZ1bmN0aW9uKCkge1xuICB2YXIgcGFyYW1zID0gdGhpcy5fcGFyYW1zO1xuICB2YXIgYmF0Y2hQYXJhbXMgPSB7XG4gICAgbWV0aG9kOiBwYXJhbXMubWV0aG9kLFxuICAgIHVybDogdGhpcy5fY2hhdHRlci5fbm9ybWFsaXplVXJsKHBhcmFtcy51cmwpXG4gIH07XG4gIGlmICh0aGlzLl9wYXJhbXMuYm9keSkge1xuICAgIGJhdGNoUGFyYW1zLnJpY2hJbnB1dCA9IHRoaXMuX3BhcmFtcy5ib2R5O1xuICB9XG4gIHJldHVybiBiYXRjaFBhcmFtcztcbn07XG5cbi8qKlxuICogUmV0cmlldmUgcGFyYW1ldGVycyBpbiBiYXRjaCByZXF1ZXN0IGZvcm1cbiAqXG4gKiBAbWV0aG9kIENoYXR0ZXJ+UmVxdWVzdCNwcm9taXNlXG4gKiBAcmV0dXJucyB7UHJvbWlzZS48Q2hhdHRlcn5SZXF1ZXN0UmVzdWx0Pn1cbiAqL1xuUmVxdWVzdC5wcm90b3R5cGUucHJvbWlzZSA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5fcHJvbWlzZSB8fCB0aGlzLl9jaGF0dGVyLl9yZXF1ZXN0KHRoaXMuX3BhcmFtcyk7XG59O1xuXG4vKipcbiAqIFJldHVybnMgTm9kZS5qcyBTdHJlYW0gb2JqZWN0IGZvciByZXF1ZXN0XG4gKlxuICogQG1ldGhvZCBDaGF0dGVyflJlcXVlc3Qjc3RyZWFtXG4gKiBAcmV0dXJucyB7c3RyZWFtLlN0cmVhbX1cbiAqL1xuUmVxdWVzdC5wcm90b3R5cGUuc3RyZWFtID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLl9jaGF0dGVyLl9yZXF1ZXN0KHRoaXMuX3BhcmFtcykuc3RyZWFtKCk7XG59O1xuXG4vKipcbiAqIFByb21pc2UvQSsgaW50ZXJmYWNlXG4gKiBodHRwOi8vcHJvbWlzZXMtYXBsdXMuZ2l0aHViLmlvL3Byb21pc2VzLXNwZWMvXG4gKlxuICogRGVsZWdhdGUgdG8gZGVmZXJyZWQgcHJvbWlzZSwgcmV0dXJuIHByb21pc2UgaW5zdGFuY2UgZm9yIGJhdGNoIHJlc3VsdFxuICpcbiAqIEBtZXRob2QgQ2hhdHRlcn5SZXF1ZXN0I3RoZW5cbiAqL1xuUmVxdWVzdC5wcm90b3R5cGUudGhlbiA9IGZ1bmN0aW9uKG9uUmVzb2x2ZSwgb25SZWplY3QpIHtcbiAgcmV0dXJuIHRoaXMucHJvbWlzZSgpLnRoZW4ob25SZXNvbHZlLCBvblJlamVjdCk7XG59O1xuXG4vKipcbiAqIFByb21pc2UvQSsgZXh0ZW5zaW9uXG4gKiBDYWxsIFwidGhlblwiIHVzaW5nIGdpdmVuIG5vZGUtc3R5bGUgY2FsbGJhY2sgZnVuY3Rpb25cbiAqXG4gKiBAbWV0aG9kIENoYXR0ZXJ+UmVxdWVzdCN0aGVuQ2FsbFxuICovXG5SZXF1ZXN0LnByb3RvdHlwZS50aGVuQ2FsbCA9IGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG4gIHJldHVybiBfLmlzRnVuY3Rpb24oY2FsbGJhY2spID8gdGhpcy5wcm9taXNlKCkudGhlbkNhbGwoY2FsbGJhY2spIDogdGhpcztcbn07XG5cblxuLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG4vKipcbiAqIEEgY2xhc3MgcmVwcmVzZW50aW5nIGNoYXR0ZXIgQVBJIHJlc291cmNlXG4gKlxuICogQHByb3RlY3RlZFxuICogQGNsYXNzIENoYXR0ZXJ+UmVzb3VyY2VcbiAqIEBleHRlbmRzIENoYXR0ZXJ+UmVxdWVzdFxuICogQHBhcmFtIHtDaGF0dGVyfSBjaGF0dGVyIC0gQ2hhdHRlciBBUEkgb2JqZWN0XG4gKiBAcGFyYW0ge1N0cmluZ30gdXJsIC0gUmVzb3VyY2UgVVJMXG4gKiBAcGFyYW0ge09iamVjdH0gW3F1ZXJ5UGFyYW1zXSAtIFF1ZXJ5IHBhcmFtZXRlcnMgKGluIGhhc2ggb2JqZWN0KVxuICovXG52YXIgUmVzb3VyY2UgPSBmdW5jdGlvbihjaGF0dGVyLCB1cmwsIHF1ZXJ5UGFyYW1zKSB7XG4gIGlmIChxdWVyeVBhcmFtcykge1xuICAgIHZhciBxc3RyaW5nID0gXy5tYXAoXy5rZXlzKHF1ZXJ5UGFyYW1zKSwgZnVuY3Rpb24obmFtZSkge1xuICAgICAgcmV0dXJuIG5hbWUgKyBcIj1cIiArIGVuY29kZVVSSUNvbXBvbmVudChxdWVyeVBhcmFtc1tuYW1lXSk7XG4gICAgfSkuam9pbignJicpO1xuICAgIHVybCArPSAodXJsLmluZGV4T2YoJz8nKSA+IDAgPyAnJicgOiAnPycpICsgcXN0cmluZztcbiAgfVxuICBSZXNvdXJjZS5zdXBlcl8uY2FsbCh0aGlzLCBjaGF0dGVyLCB7IG1ldGhvZDogJ0dFVCcsIHVybDogdXJsIH0pO1xuICB0aGlzLl91cmwgPSB1cmw7XG59O1xuXG5pbmhlcml0cyhSZXNvdXJjZSwgUmVxdWVzdCk7XG5cbi8qKlxuICogQ3JlYXRlIGEgbmV3IHJlc291cmNlXG4gKlxuICogQG1ldGhvZCBDaGF0dGVyflJlc291cmNlI2NyZWF0ZVxuICogQHBhcmFtIHtPYmplY3R9IGRhdGEgLSBEYXRhIHRvIG5ld2x5IHBvc3RcbiAqIEBwYXJhbSB7Q2FsbGJhY2suPENoYXR0ZXJ+UmVxdWVzdFJlc3VsdD59IFtjYWxsYmFja10gLSBDYWxsYmFjayBmdW5jdGlvblxuICogQHJldHVybnMge0NoYXR0ZXJ+UmVxdWVzdH1cbiAqL1xuUmVzb3VyY2UucHJvdG90eXBlLmNyZWF0ZSA9IGZ1bmN0aW9uKGRhdGEsIGNhbGxiYWNrKSB7XG4gIHJldHVybiB0aGlzLl9jaGF0dGVyLnJlcXVlc3Qoe1xuICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgIHVybDogdGhpcy5fdXJsLFxuICAgIGJvZHk6IGRhdGFcbiAgfSkudGhlbkNhbGwoY2FsbGJhY2spO1xufTtcblxuLyoqXG4gKiBSZXRyaWV2ZSByZXNvdXJjZSBjb250ZW50XG4gKlxuICogQG1ldGhvZCBDaGF0dGVyflJlc291cmNlI3JldHJpZXZlXG4gKiBAcGFyYW0ge0NhbGxiYWNrLjxDaGF0dGVyflJlcXVlc3RSZXN1bHQ+fSBbY2FsbGJhY2tdIC0gQ2FsbGJhY2sgZnVuY3Rpb25cbiAqIEByZXR1cm5zIHtDaGF0dGVyflJlcXVlc3R9XG4gKi9cblJlc291cmNlLnByb3RvdHlwZS5yZXRyaWV2ZSA9IGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG4gIHJldHVybiB0aGlzLnRoZW5DYWxsKGNhbGxiYWNrKTtcbn07XG5cbi8qKlxuICogVXBkYXRlIHNwZWNpZmllZCByZXNvdXJjZVxuICpcbiAqIEBtZXRob2QgQ2hhdHRlcn5SZXNvdXJjZSN1cGRhdGVcbiAqIEBwYXJhbSB7T2JlamN0fSBkYXRhIC0gRGF0YSB0byB1cGRhdGVcbiAqIEBwYXJhbSB7Q2FsbGJhY2suPENoYXR0ZXJ+UmVxdWVzdFJlc3VsdD59IFtjYWxsYmFja10gLSBDYWxsYmFjayBmdW5jdGlvblxuICogQHJldHVybnMge0NoYXR0ZXJ+UmVxdWVzdH1cbiAqL1xuUmVzb3VyY2UucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uKGRhdGEsIGNhbGxiYWNrKSB7XG4gIHJldHVybiB0aGlzLl9jaGF0dGVyLnJlcXVlc3Qoe1xuICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgIHVybDogdGhpcy5fdXJsLFxuICAgIGJvZHk6IGRhdGFcbiAgfSkudGhlbkNhbGwoY2FsbGJhY2spO1xufTtcblxuLyoqXG4gKiBTeW5vbnltIG9mIFJlc291cmNlI2RlbGV0ZSgpXG4gKlxuICogQG1ldGhvZCBDaGF0dGVyflJlc291cmNlI2RlbFxuICogQHBhcmFtIHtDYWxsYmFjay48Q2hhdHRlcn5SZXF1ZXN0UmVzdWx0Pn0gW2NhbGxiYWNrXSAtIENhbGxiYWNrIGZ1bmN0aW9uXG4gKiBAcmV0dXJucyB7Q2hhdHRlcn5SZXF1ZXN0fVxuICovXG4vKipcbiAqIERlbGV0ZSBzcGVjaWZpZWQgcmVzb3VyY2VcbiAqXG4gKiBAbWV0aG9kIENoYXR0ZXJ+UmVzb3VyY2UjZGVsZXRlXG4gKiBAcGFyYW0ge0NhbGxiYWNrLjxDaGF0dGVyflJlcXVlc3RSZXN1bHQ+fSBbY2FsbGJhY2tdIC0gQ2FsbGJhY2sgZnVuY3Rpb25cbiAqIEByZXR1cm5zIHtDaGF0dGVyflJlcXVlc3R9XG4gKi9cblJlc291cmNlLnByb3RvdHlwZS5kZWwgPVxuUmVzb3VyY2UucHJvdG90eXBlW1wiZGVsZXRlXCJdID0gZnVuY3Rpb24oY2FsbGJhY2spIHtcbiAgcmV0dXJuIHRoaXMuX2NoYXR0ZXIucmVxdWVzdCh7XG4gICAgbWV0aG9kOiAnREVMRVRFJyxcbiAgICB1cmw6IHRoaXMuX3VybFxuICB9KS50aGVuQ2FsbChjYWxsYmFjayk7XG59O1xuXG5cbi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuLypcbiAqIFJlZ2lzdGVyIGhvb2sgaW4gY29ubmVjdGlvbiBpbnN0YW50aWF0aW9uIGZvciBkeW5hbWljYWxseSBhZGRpbmcgdGhpcyBBUEkgbW9kdWxlIGZlYXR1cmVzXG4gKi9cbmpzZm9yY2Uub24oJ2Nvbm5lY3Rpb246bmV3JywgZnVuY3Rpb24oY29ubikge1xuICBjb25uLmNoYXR0ZXIgPSBuZXcgQ2hhdHRlcihjb25uKTtcbn0pO1xuIl19 +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJsaWIvYXBpL2NoYXR0ZXIuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbigpe2Z1bmN0aW9uIHIoZSxuLHQpe2Z1bmN0aW9uIG8oaSxmKXtpZighbltpXSl7aWYoIWVbaV0pe3ZhciBjPVwiZnVuY3Rpb25cIj09dHlwZW9mIHJlcXVpcmUmJnJlcXVpcmU7aWYoIWYmJmMpcmV0dXJuIGMoaSwhMCk7aWYodSlyZXR1cm4gdShpLCEwKTt2YXIgYT1uZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiK2krXCInXCIpO3Rocm93IGEuY29kZT1cIk1PRFVMRV9OT1RfRk9VTkRcIixhfXZhciBwPW5baV09e2V4cG9ydHM6e319O2VbaV1bMF0uY2FsbChwLmV4cG9ydHMsZnVuY3Rpb24ocil7dmFyIG49ZVtpXVsxXVtyXTtyZXR1cm4gbyhufHxyKX0scCxwLmV4cG9ydHMscixlLG4sdCl9cmV0dXJuIG5baV0uZXhwb3J0c31mb3IodmFyIHU9XCJmdW5jdGlvblwiPT10eXBlb2YgcmVxdWlyZSYmcmVxdWlyZSxpPTA7aTx0Lmxlbmd0aDtpKyspbyh0W2ldKTtyZXR1cm4gb31yZXR1cm4gcn0pKCkiLCIvKipcbiAqIEBmaWxlIE1hbmFnZXMgU2FsZXNmb3JjZSBDaGF0dGVyIFJFU1QgQVBJIGNhbGxzXG4gKiBAYXV0aG9yIFNoaW5pY2hpIFRvbWl0YSA8c2hpbmljaGkudG9taXRhQGdtYWlsLmNvbT5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBpbmhlcml0cyA9IHdpbmRvdy5qc2ZvcmNlLnJlcXVpcmUoJ2luaGVyaXRzJyksXG4gICAgXyAgICAgICA9IHdpbmRvdy5qc2ZvcmNlLnJlcXVpcmUoJ2xvZGFzaC9jb3JlJyksXG4gICAganNmb3JjZSA9IHdpbmRvdy5qc2ZvcmNlLnJlcXVpcmUoJy4vY29yZScpLFxuICAgIFByb21pc2UgPSB3aW5kb3cuanNmb3JjZS5yZXF1aXJlKCcuL3Byb21pc2UnKTtcblxuLyoqXG4gKiBBUEkgY2xhc3MgZm9yIENoYXR0ZXIgUkVTVCBBUEkgY2FsbFxuICpcbiAqIEBjbGFzc1xuICogQHBhcmFtIHtDb25uZWN0aW9ufSBjb25uIENvbm5lY3Rpb25cbiAqL1xudmFyIENoYXR0ZXIgPSBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGNvbm4pIHtcbiAgdGhpcy5fY29ubiA9IGNvbm47XG59O1xuXG4vKipcbiAqIFNlbmRpbmcgcmVxdWVzdCB0byBBUEkgZW5kcG9pbnRcbiAqIEBwcml2YXRlXG4gKi9cbkNoYXR0ZXIucHJvdG90eXBlLl9yZXF1ZXN0ID0gZnVuY3Rpb24ocGFyYW1zLCBjYWxsYmFjaykge1xuICBpZiAoL14ocHV0fHBvc3R8cGF0Y2gpJC9pLnRlc3QocGFyYW1zLm1ldGhvZCkpIHtcbiAgICBpZiAoXy5pc09iamVjdChwYXJhbXMuYm9keSkpIHtcbiAgICAgIHBhcmFtcy5oZWFkZXJzID0ge1xuICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIlxuICAgICAgfTtcbiAgICAgIHBhcmFtcy5ib2R5ID0gSlNPTi5zdHJpbmdpZnkocGFyYW1zLmJvZHkpO1xuICAgIH1cbiAgfVxuICBwYXJhbXMudXJsID0gdGhpcy5fbm9ybWFsaXplVXJsKHBhcmFtcy51cmwpO1xuICByZXR1cm4gdGhpcy5fY29ubi5yZXF1ZXN0KHBhcmFtcywgY2FsbGJhY2spO1xufTtcblxuLyoqXG4gKiBDb252ZXJ0IHBhdGggdG8gc2l0ZSByb290IHJlbGF0aXZlIHVybFxuICogQHByaXZhdGVcbiAqL1xuQ2hhdHRlci5wcm90b3R5cGUuX25vcm1hbGl6ZVVybCA9IGZ1bmN0aW9uKHVybCkge1xuICBpZiAodXJsLmluZGV4T2YoJy9jaGF0dGVyLycpID09PSAwIHx8IHVybC5pbmRleE9mKCcvY29ubmVjdC8nKSA9PT0gMCkge1xuICAgIHJldHVybiAnL3NlcnZpY2VzL2RhdGEvdicgKyB0aGlzLl9jb25uLnZlcnNpb24gKyB1cmw7XG4gIH0gZWxzZSBpZiAoL15cXC92W1xcZF0rXFwuW1xcZF0rXFwvLy50ZXN0KHVybCkpIHtcbiAgICByZXR1cm4gJy9zZXJ2aWNlcy9kYXRhJyArIHVybDtcbiAgfSBlbHNlIGlmICh1cmwuaW5kZXhPZignL3NlcnZpY2VzLycpICE9PSAwICYmIHVybFswXSA9PT0gJy8nKSB7XG4gICAgcmV0dXJuICcvc2VydmljZXMvZGF0YS92JyArIHRoaXMuX2Nvbm4udmVyc2lvbiArICcvY2hhdHRlcicgKyB1cmw7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHVybDtcbiAgfVxufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBDaGF0dGVyflJlcXVlc3RQYXJhbXNcbiAqIEBwcm9wIHtTdHJpbmd9IG1ldGhvZCAtIEhUVFAgbWV0aG9kXG4gKiBAcHJvcCB7U3RyaW5nfSB1cmwgLSBSZXNvdXJjZSBVUkxcbiAqIEBwcm9wIHtTdHJpbmd9IFtib2R5XSAtIEhUVFAgYm9keSAoaW4gUE9TVC9QVVQvUEFUQ0ggbWV0aG9kcylcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IENoYXR0ZXJ+UmVxdWVzdFJlc3VsdFxuICovXG5cbi8qKlxuICogTWFrZSBhIHJlcXVlc3QgZm9yIGNoYXR0ZXIgQVBJIHJlc291cmNlXG4gKlxuICogQHBhcmFtIHtDaGF0dGVyflJlcXVlc3RQYXJhbXN9IHBhcmFtcyAtIFBhcmFtdGVycyByZXByZXNlbnRpbmcgSFRUUCByZXF1ZXN0XG4gKiBAcGFyYW0ge0NhbGxiYWNrLjxDaGF0dGVyflJlcXVlc3RSZXN1bHQ+fSBbY2FsbGJhY2tdIC0gQ2FsbGJhY2sgZnVuY1xuICogQHJldHVybnMge0NoYXR0ZXJ+UmVxdWVzdH1cbiAqL1xuQ2hhdHRlci5wcm90b3R5cGUucmVxdWVzdCA9IGZ1bmN0aW9uKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcmV0dXJuIG5ldyBSZXF1ZXN0KHRoaXMsIHBhcmFtcykudGhlbkNhbGwoY2FsbGJhY2spO1xufTtcblxuLyoqXG4gKiBNYWtlIGEgcmVzb3VyY2UgcmVxdWVzdCB0byBjaGF0dGVyIEFQSVxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSB1cmwgLSBSZXNvdXJjZSBVUkxcbiAqIEBwYXJhbSB7T2JqZWN0fSBbcXVlcnlQYXJhbXNdIC0gUXVlcnkgcGFyYW1ldGVycyAoaW4gaGFzaCBvYmplY3QpXG4gKiBAcmV0dXJucyB7Q2hhdHRlcn5SZXNvdXJjZX1cbiAqL1xuQ2hhdHRlci5wcm90b3R5cGUucmVzb3VyY2UgPSBmdW5jdGlvbih1cmwsIHF1ZXJ5UGFyYW1zKSB7XG4gIHJldHVybiBuZXcgUmVzb3VyY2UodGhpcywgdXJsLCBxdWVyeVBhcmFtcyk7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IENoYXR0ZXJ+QmF0Y2hSZXF1ZXN0UmVzdWx0XG4gKiBAcHJvcCB7Qm9vbGVhbn0gaGFzRXJyb3IgLSBGbGFnIGlmIHRoZSBiYXRjaCBoYXMgb25lIG9yIG1vcmUgZXJyb3JzXG4gKiBAcHJvcCB7QXJyYXkuPE9iamVjdD59IHJlc3VsdHMgLSBCYXRjaCByZXF1ZXN0IHJlc3VsdHMgaW4gYXJyYXlcbiAqIEBwcm9wIHtOdW1iZXJ9IHJlc3VsdHMuc3RhdHVzQ29kZSAtIEhUVFAgcmVzcG9uc2Ugc3RhdHVzIGNvZGVcbiAqIEBwcm9wIHtDaGF0dGVyflJlcXVlc3RSZXN1bHR9IHJlc3VsdHMucmVzdWx0IC0gUGFyc2VkIEhUVFAgcmVzcG9uc2UgYm9keVxuICovXG5cbi8qKlxuICogTWFrZSBhIGJhdGNoIHJlcXVlc3QgdG8gY2hhdHRlciBBUElcbiAqXG4gKiBAcGFyYW1zIHtBcnJheS48Q2hhdHRlcn5SZXF1ZXN0Pn0gcmVxdWVzdHMgLSBDaGF0dGVyIEFQSSByZXF1ZXN0c1xuICogQHBhcmFtIHtDYWxsYmFjay48Q2hhdHRlcn5CYXRjaFJlcXVlc3RSZXN1bHQ+fSBbY2FsbGJhY2tdIC0gQ2FsbGJhY2sgZnVuY1xuICogQHJldHVybnMge1Byb21pc2UuPENoYXR0ZXJ+QmF0Y2hSZXF1ZXN0UmVzdWx0Pn1cbiAqL1xuQ2hhdHRlci5wcm90b3R5cGUuYmF0Y2ggPSBmdW5jdGlvbihyZXF1ZXN0cywgY2FsbGJhY2spIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgYmF0Y2hSZXF1ZXN0cyA9IFtdLCBiYXRjaERlZmVycmVkcyA9IFtdO1xuICBfLmZvckVhY2gocmVxdWVzdHMsIGZ1bmN0aW9uKHJlcXVlc3QpIHtcbiAgICB2YXIgZGVmZXJyZWQgPSBQcm9taXNlLmRlZmVyKCk7XG4gICAgcmVxdWVzdC5fcHJvbWlzZSA9IGRlZmVycmVkLnByb21pc2U7XG4gICAgYmF0Y2hSZXF1ZXN0cy5wdXNoKHJlcXVlc3QuYmF0Y2hQYXJhbXMoKSk7XG4gICAgYmF0Y2hEZWZlcnJlZHMucHVzaChkZWZlcnJlZCk7XG4gIH0pO1xuICB2YXIgcGFyYW1zID0ge1xuICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgIHVybDogdGhpcy5fbm9ybWFsaXplVXJsKCcvY29ubmVjdC9iYXRjaCcpLFxuICAgIGJvZHk6IHtcbiAgICAgIGJhdGNoUmVxdWVzdHM6IGJhdGNoUmVxdWVzdHNcbiAgICB9XG4gIH07XG4gIHJldHVybiB0aGlzLnJlcXVlc3QocGFyYW1zKS50aGVuKGZ1bmN0aW9uKHJlcykge1xuICAgIF8uZm9yRWFjaChyZXMucmVzdWx0cywgZnVuY3Rpb24ocmVzdWx0LCBpKSB7XG4gICAgICB2YXIgZGVmZXJyZWQgPSBiYXRjaERlZmVycmVkc1tpXTtcbiAgICAgIGlmIChyZXN1bHQuc3RhdHVzQ29kZSA+PSA0MDApIHtcbiAgICAgICAgZGVmZXJyZWQucmVqZWN0KHJlc3VsdC5yZXN1bHQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVmZXJyZWQucmVzb2x2ZShyZXN1bHQucmVzdWx0KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gcmVzO1xuICB9KS50aGVuQ2FsbChjYWxsYmFjayk7XG59O1xuXG5cbi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuLyoqXG4gKiBBIGNsYXNzIHJlcHJlc2VudGluZyBjaGF0dGVyIEFQSSByZXF1ZXN0XG4gKlxuICogQHByb3RlY3RlZFxuICogQGNsYXNzIENoYXR0ZXJ+UmVxdWVzdFxuICogQGltcGxlbWVudHMge1Byb21pc2UuPENoYXR0ZXJ+UmVxdWVzdFJlc3VsdD59XG4gKiBAcGFyYW0ge0NoYXR0ZXJ9IGNoYXR0ZXIgLSBDaGF0dGVyIEFQSSBvYmplY3RcbiAqIEBwYXJhbSB7Q2hhdHRlcn5SZXF1ZXN0UGFyYW1zfSBwYXJhbXMgLSBQYXJhbXRlcnMgcmVwcmVzZW50aW5nIEhUVFAgcmVxdWVzdFxuICovXG52YXIgUmVxdWVzdCA9IGZ1bmN0aW9uKGNoYXR0ZXIsIHBhcmFtcykge1xuICB0aGlzLl9jaGF0dGVyID0gY2hhdHRlcjtcbiAgdGhpcy5fcGFyYW1zID0gcGFyYW1zO1xuICB0aGlzLl9wcm9taXNlID0gbnVsbDtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gQ2hhdHRlcn5CYXRjaFJlcXVlc3RQYXJhbXNcbiAqIEBwcm9wIHtTdHJpbmd9IG1ldGhvZCAtIEhUVFAgbWV0aG9kXG4gKiBAcHJvcCB7U3RyaW5nfSB1cmwgLSBSZXNvdXJjZSBVUkxcbiAqIEBwcm9wIHtTdHJpbmd9IFtyaWNoSW5wdXRdIC0gSFRUUCBib2R5IChpbiBQT1NUL1BVVC9QQVRDSCBtZXRob2RzKVxuICovXG5cbi8qKlxuICogUmV0cmlldmUgcGFyYW1ldGVycyBpbiBiYXRjaCByZXF1ZXN0IGZvcm1cbiAqXG4gKiBAbWV0aG9kIENoYXR0ZXJ+UmVxdWVzdCNiYXRjaFBhcmFtc1xuICogQHJldHVybnMge0NoYXR0ZXJ+QmF0Y2hSZXF1ZXN0UGFyYW1zfVxuICovXG5SZXF1ZXN0LnByb3RvdHlwZS5iYXRjaFBhcmFtcyA9IGZ1bmN0aW9uKCkge1xuICB2YXIgcGFyYW1zID0gdGhpcy5fcGFyYW1zO1xuICB2YXIgYmF0Y2hQYXJhbXMgPSB7XG4gICAgbWV0aG9kOiBwYXJhbXMubWV0aG9kLFxuICAgIHVybDogdGhpcy5fY2hhdHRlci5fbm9ybWFsaXplVXJsKHBhcmFtcy51cmwpXG4gIH07XG4gIGlmICh0aGlzLl9wYXJhbXMuYm9keSkge1xuICAgIGJhdGNoUGFyYW1zLnJpY2hJbnB1dCA9IHRoaXMuX3BhcmFtcy5ib2R5O1xuICB9XG4gIHJldHVybiBiYXRjaFBhcmFtcztcbn07XG5cbi8qKlxuICogUmV0cmlldmUgcGFyYW1ldGVycyBpbiBiYXRjaCByZXF1ZXN0IGZvcm1cbiAqXG4gKiBAbWV0aG9kIENoYXR0ZXJ+UmVxdWVzdCNwcm9taXNlXG4gKiBAcmV0dXJucyB7UHJvbWlzZS48Q2hhdHRlcn5SZXF1ZXN0UmVzdWx0Pn1cbiAqL1xuUmVxdWVzdC5wcm90b3R5cGUucHJvbWlzZSA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5fcHJvbWlzZSB8fCB0aGlzLl9jaGF0dGVyLl9yZXF1ZXN0KHRoaXMuX3BhcmFtcyk7XG59O1xuXG4vKipcbiAqIFJldHVybnMgTm9kZS5qcyBTdHJlYW0gb2JqZWN0IGZvciByZXF1ZXN0XG4gKlxuICogQG1ldGhvZCBDaGF0dGVyflJlcXVlc3Qjc3RyZWFtXG4gKiBAcmV0dXJucyB7c3RyZWFtLlN0cmVhbX1cbiAqL1xuUmVxdWVzdC5wcm90b3R5cGUuc3RyZWFtID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLl9jaGF0dGVyLl9yZXF1ZXN0KHRoaXMuX3BhcmFtcykuc3RyZWFtKCk7XG59O1xuXG4vKipcbiAqIFByb21pc2UvQSsgaW50ZXJmYWNlXG4gKiBodHRwOi8vcHJvbWlzZXMtYXBsdXMuZ2l0aHViLmlvL3Byb21pc2VzLXNwZWMvXG4gKlxuICogRGVsZWdhdGUgdG8gZGVmZXJyZWQgcHJvbWlzZSwgcmV0dXJuIHByb21pc2UgaW5zdGFuY2UgZm9yIGJhdGNoIHJlc3VsdFxuICpcbiAqIEBtZXRob2QgQ2hhdHRlcn5SZXF1ZXN0I3RoZW5cbiAqL1xuUmVxdWVzdC5wcm90b3R5cGUudGhlbiA9IGZ1bmN0aW9uKG9uUmVzb2x2ZSwgb25SZWplY3QpIHtcbiAgcmV0dXJuIHRoaXMucHJvbWlzZSgpLnRoZW4ob25SZXNvbHZlLCBvblJlamVjdCk7XG59O1xuXG4vKipcbiAqIFByb21pc2UvQSsgZXh0ZW5zaW9uXG4gKiBDYWxsIFwidGhlblwiIHVzaW5nIGdpdmVuIG5vZGUtc3R5bGUgY2FsbGJhY2sgZnVuY3Rpb25cbiAqXG4gKiBAbWV0aG9kIENoYXR0ZXJ+UmVxdWVzdCN0aGVuQ2FsbFxuICovXG5SZXF1ZXN0LnByb3RvdHlwZS50aGVuQ2FsbCA9IGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG4gIHJldHVybiBfLmlzRnVuY3Rpb24oY2FsbGJhY2spID8gdGhpcy5wcm9taXNlKCkudGhlbkNhbGwoY2FsbGJhY2spIDogdGhpcztcbn07XG5cblxuLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG4vKipcbiAqIEEgY2xhc3MgcmVwcmVzZW50aW5nIGNoYXR0ZXIgQVBJIHJlc291cmNlXG4gKlxuICogQHByb3RlY3RlZFxuICogQGNsYXNzIENoYXR0ZXJ+UmVzb3VyY2VcbiAqIEBleHRlbmRzIENoYXR0ZXJ+UmVxdWVzdFxuICogQHBhcmFtIHtDaGF0dGVyfSBjaGF0dGVyIC0gQ2hhdHRlciBBUEkgb2JqZWN0XG4gKiBAcGFyYW0ge1N0cmluZ30gdXJsIC0gUmVzb3VyY2UgVVJMXG4gKiBAcGFyYW0ge09iamVjdH0gW3F1ZXJ5UGFyYW1zXSAtIFF1ZXJ5IHBhcmFtZXRlcnMgKGluIGhhc2ggb2JqZWN0KVxuICovXG52YXIgUmVzb3VyY2UgPSBmdW5jdGlvbihjaGF0dGVyLCB1cmwsIHF1ZXJ5UGFyYW1zKSB7XG4gIGlmIChxdWVyeVBhcmFtcykge1xuICAgIHZhciBxc3RyaW5nID0gXy5tYXAoXy5rZXlzKHF1ZXJ5UGFyYW1zKSwgZnVuY3Rpb24obmFtZSkge1xuICAgICAgcmV0dXJuIG5hbWUgKyBcIj1cIiArIGVuY29kZVVSSUNvbXBvbmVudChxdWVyeVBhcmFtc1tuYW1lXSk7XG4gICAgfSkuam9pbignJicpO1xuICAgIHVybCArPSAodXJsLmluZGV4T2YoJz8nKSA+IDAgPyAnJicgOiAnPycpICsgcXN0cmluZztcbiAgfVxuICBSZXNvdXJjZS5zdXBlcl8uY2FsbCh0aGlzLCBjaGF0dGVyLCB7IG1ldGhvZDogJ0dFVCcsIHVybDogdXJsIH0pO1xuICB0aGlzLl91cmwgPSB1cmw7XG59O1xuXG5pbmhlcml0cyhSZXNvdXJjZSwgUmVxdWVzdCk7XG5cbi8qKlxuICogQ3JlYXRlIGEgbmV3IHJlc291cmNlXG4gKlxuICogQG1ldGhvZCBDaGF0dGVyflJlc291cmNlI2NyZWF0ZVxuICogQHBhcmFtIHtPYmplY3R9IGRhdGEgLSBEYXRhIHRvIG5ld2x5IHBvc3RcbiAqIEBwYXJhbSB7Q2FsbGJhY2suPENoYXR0ZXJ+UmVxdWVzdFJlc3VsdD59IFtjYWxsYmFja10gLSBDYWxsYmFjayBmdW5jdGlvblxuICogQHJldHVybnMge0NoYXR0ZXJ+UmVxdWVzdH1cbiAqL1xuUmVzb3VyY2UucHJvdG90eXBlLmNyZWF0ZSA9IGZ1bmN0aW9uKGRhdGEsIGNhbGxiYWNrKSB7XG4gIHJldHVybiB0aGlzLl9jaGF0dGVyLnJlcXVlc3Qoe1xuICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgIHVybDogdGhpcy5fdXJsLFxuICAgIGJvZHk6IGRhdGFcbiAgfSkudGhlbkNhbGwoY2FsbGJhY2spO1xufTtcblxuLyoqXG4gKiBSZXRyaWV2ZSByZXNvdXJjZSBjb250ZW50XG4gKlxuICogQG1ldGhvZCBDaGF0dGVyflJlc291cmNlI3JldHJpZXZlXG4gKiBAcGFyYW0ge0NhbGxiYWNrLjxDaGF0dGVyflJlcXVlc3RSZXN1bHQ+fSBbY2FsbGJhY2tdIC0gQ2FsbGJhY2sgZnVuY3Rpb25cbiAqIEByZXR1cm5zIHtDaGF0dGVyflJlcXVlc3R9XG4gKi9cblJlc291cmNlLnByb3RvdHlwZS5yZXRyaWV2ZSA9IGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG4gIHJldHVybiB0aGlzLnRoZW5DYWxsKGNhbGxiYWNrKTtcbn07XG5cbi8qKlxuICogVXBkYXRlIHNwZWNpZmllZCByZXNvdXJjZVxuICpcbiAqIEBtZXRob2QgQ2hhdHRlcn5SZXNvdXJjZSN1cGRhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhIC0gRGF0YSB0byB1cGRhdGVcbiAqIEBwYXJhbSB7Q2FsbGJhY2suPENoYXR0ZXJ+UmVxdWVzdFJlc3VsdD59IFtjYWxsYmFja10gLSBDYWxsYmFjayBmdW5jdGlvblxuICogQHJldHVybnMge0NoYXR0ZXJ+UmVxdWVzdH1cbiAqL1xuUmVzb3VyY2UucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uKGRhdGEsIGNhbGxiYWNrKSB7XG4gIHJldHVybiB0aGlzLl9jaGF0dGVyLnJlcXVlc3Qoe1xuICAgIG1ldGhvZDogJ1BBVENIJyxcbiAgICB1cmw6IHRoaXMuX3VybCxcbiAgICBib2R5OiBkYXRhXG4gIH0pLnRoZW5DYWxsKGNhbGxiYWNrKTtcbn07XG5cbi8qKlxuICogU3lub255bSBvZiBSZXNvdXJjZSNkZWxldGUoKVxuICpcbiAqIEBtZXRob2QgQ2hhdHRlcn5SZXNvdXJjZSNkZWxcbiAqIEBwYXJhbSB7Q2FsbGJhY2suPENoYXR0ZXJ+UmVxdWVzdFJlc3VsdD59IFtjYWxsYmFja10gLSBDYWxsYmFjayBmdW5jdGlvblxuICogQHJldHVybnMge0NoYXR0ZXJ+UmVxdWVzdH1cbiAqL1xuLyoqXG4gKiBEZWxldGUgc3BlY2lmaWVkIHJlc291cmNlXG4gKlxuICogQG1ldGhvZCBDaGF0dGVyflJlc291cmNlI2RlbGV0ZVxuICogQHBhcmFtIHtDYWxsYmFjay48Q2hhdHRlcn5SZXF1ZXN0UmVzdWx0Pn0gW2NhbGxiYWNrXSAtIENhbGxiYWNrIGZ1bmN0aW9uXG4gKiBAcmV0dXJucyB7Q2hhdHRlcn5SZXF1ZXN0fVxuICovXG5SZXNvdXJjZS5wcm90b3R5cGUuZGVsID1cblJlc291cmNlLnByb3RvdHlwZVtcImRlbGV0ZVwiXSA9IGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG4gIHJldHVybiB0aGlzLl9jaGF0dGVyLnJlcXVlc3Qoe1xuICAgIG1ldGhvZDogJ0RFTEVURScsXG4gICAgdXJsOiB0aGlzLl91cmxcbiAgfSkudGhlbkNhbGwoY2FsbGJhY2spO1xufTtcblxuXG4vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cbi8qXG4gKiBSZWdpc3RlciBob29rIGluIGNvbm5lY3Rpb24gaW5zdGFudGlhdGlvbiBmb3IgZHluYW1pY2FsbHkgYWRkaW5nIHRoaXMgQVBJIG1vZHVsZSBmZWF0dXJlc1xuICovXG5qc2ZvcmNlLm9uKCdjb25uZWN0aW9uOm5ldycsIGZ1bmN0aW9uKGNvbm4pIHtcbiAgY29ubi5jaGF0dGVyID0gbmV3IENoYXR0ZXIoY29ubik7XG59KTtcbiJdfQ== diff --git a/build/jsforce-api-chatter.min.js b/build/jsforce-api-chatter.min.js index ea69c9b0..44afbcf7 100644 --- a/build/jsforce-api-chatter.min.js +++ b/build/jsforce-api-chatter.min.js @@ -1,2 +1,2 @@ -!function(t){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var e;e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,e=e.jsforce||(e.jsforce={}),e=e.modules||(e.modules={}),e=e.api||(e.api={}),e.Chatter=t()}}(function(){return function(){function t(e,r,n){function o(s,u){if(!r[s]){if(!e[s]){var a="function"==typeof require&&require;if(!u&&a)return a(s,!0);if(i)return i(s,!0);var c=new Error("Cannot find module '"+s+"'");throw c.code="MODULE_NOT_FOUND",c}var h=r[s]={exports:{}};e[s][0].call(h.exports,function(t){var r=e[s][1][t];return o(r||t)},h,h.exports,t,e,r,n)}return r[s].exports}for(var i="function"==typeof require&&require,s=0;s=400?r.reject(t.result):r.resolve(t.result)}),t}).thenCall(e)};var a=function(t,e){this._chatter=t,this._params=e,this._promise=null};a.prototype.batchParams=function(){var t=this._params,e={method:t.method,url:this._chatter._normalizeUrl(t.url)};return this._params.body&&(e.richInput=this._params.body),e},a.prototype.promise=function(){return this._promise||this._chatter._request(this._params)},a.prototype.stream=function(){return this._chatter._request(this._params).stream()},a.prototype.then=function(t,e){return this.promise().then(t,e)},a.prototype.thenCall=function(t){return o.isFunction(t)?this.promise().thenCall(t):this};var c=function(t,e,r){if(r){var n=o.map(o.keys(r),function(t){return t+"="+encodeURIComponent(r[t])}).join("&");e+=(e.indexOf("?")>0?"&":"?")+n}c.super_.call(this,t,{method:"GET",url:e}),this._url=e};n(c,a),c.prototype.create=function(t,e){return this._chatter.request({method:"POST",url:this._url,body:t}).thenCall(e)},c.prototype.retrieve=function(t){return this.thenCall(t)},c.prototype.update=function(t,e){return this._chatter.request({method:"POST",url:this._url,body:t}).thenCall(e)},c.prototype.del=c.prototype["delete"]=function(t){return this._chatter.request({method:"DELETE",url:this._url}).thenCall(t)},i.on("connection:new",function(t){t.chatter=new u(t)})},{}]},{},[1])(1)}); +!function(t){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var e;(e=(e=(e=(e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this).jsforce||(e.jsforce={})).modules||(e.modules={})).api||(e.api={})).Chatter=t()}}((function(){return function t(e,r,n){function o(s,u){if(!r[s]){if(!e[s]){var a="function"==typeof require&&require;if(!u&&a)return a(s,!0);if(i)return i(s,!0);var c=new Error("Cannot find module '"+s+"'");throw c.code="MODULE_NOT_FOUND",c}var h=r[s]={exports:{}};e[s][0].call(h.exports,(function(t){return o(e[s][1][t]||t)}),h,h.exports,t,e,r,n)}return r[s].exports}for(var i="function"==typeof require&&require,s=0;s=400?r.reject(t.result):r.resolve(t.result)})),t})).thenCall(e)};var a=function(t,e){this._chatter=t,this._params=e,this._promise=null};a.prototype.batchParams=function(){var t=this._params,e={method:t.method,url:this._chatter._normalizeUrl(t.url)};return this._params.body&&(e.richInput=this._params.body),e},a.prototype.promise=function(){return this._promise||this._chatter._request(this._params)},a.prototype.stream=function(){return this._chatter._request(this._params).stream()},a.prototype.then=function(t,e){return this.promise().then(t,e)},a.prototype.thenCall=function(t){return o.isFunction(t)?this.promise().thenCall(t):this};var c=function(t,e,r){if(r){var n=o.map(o.keys(r),(function(t){return t+"="+encodeURIComponent(r[t])})).join("&");e+=(e.indexOf("?")>0?"&":"?")+n}c.super_.call(this,t,{method:"GET",url:e}),this._url=e};n(c,a),c.prototype.create=function(t,e){return this._chatter.request({method:"POST",url:this._url,body:t}).thenCall(e)},c.prototype.retrieve=function(t){return this.thenCall(t)},c.prototype.update=function(t,e){return this._chatter.request({method:"PATCH",url:this._url,body:t}).thenCall(e)},c.prototype.del=c.prototype.delete=function(t){return this._chatter.request({method:"DELETE",url:this._url}).thenCall(t)},i.on("connection:new",(function(t){t.chatter=new u(t)}))},{}]},{},[1])(1)})); //# sourceMappingURL=jsforce-api-chatter.min.js.map diff --git a/build/jsforce-api-chatter.min.js.map b/build/jsforce-api-chatter.min.js.map index a376167a..738a8b96 100644 --- a/build/jsforce-api-chatter.min.js.map +++ b/build/jsforce-api-chatter.min.js.map @@ -1 +1 @@ -{"version":3,"sources":["node_modules/browser-pack/_prelude.js","lib/api/chatter.js","jsforce-api-chatter.min.js"],"names":["f","exports","module","define","amd","g","window","global","self","this","jsforce","modules","api","Chatter","r","e","n","t","o","i","c","require","u","a","Error","code","p","call","length","1","inherits","_","Promise","conn","_conn","prototype","_request","params","callback","test","method","isObject","body","headers","Content-Type","JSON","stringify","url","_normalizeUrl","request","indexOf","version","Request","thenCall","resource","queryParams","Resource","batch","requests","batchRequests","batchDeferreds","forEach","deferred","defer","_promise","promise","push","batchParams","then","res","results","result","statusCode","reject","resolve","chatter","_chatter","_params","richInput","stream","onResolve","onReject","isFunction","qstring","map","keys","name","encodeURIComponent","join","super_","_url","create","data","retrieve","update","del","on"],"mappings":"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","file":"jsforce-api-chatter.min.js","sourcesContent":["(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\n */\n\n'use strict';\n\nvar inherits = window.jsforce.require('inherits'),\n _ = window.jsforce.require('lodash/core'),\n jsforce = window.jsforce.require('./core'),\n Promise = window.jsforce.require('./promise');\n\n/**\n * API class for Chatter REST API call\n *\n * @class\n * @param {Connection} conn Connection\n */\nvar Chatter = module.exports = function(conn) {\n this._conn = conn;\n};\n\n/**\n * Sending request to API endpoint\n * @private\n */\nChatter.prototype._request = function(params, callback) {\n if (/^(put|post|patch)$/i.test(params.method)) {\n if (_.isObject(params.body)) {\n params.headers = {\n \"Content-Type\": \"application/json\"\n };\n params.body = JSON.stringify(params.body);\n }\n }\n params.url = this._normalizeUrl(params.url);\n return this._conn.request(params, callback);\n};\n\n/**\n * Convert path to site root relative url\n * @private\n */\nChatter.prototype._normalizeUrl = function(url) {\n if (url.indexOf('/chatter/') === 0 || url.indexOf('/connect/') === 0) {\n return '/services/data/v' + this._conn.version + url;\n } else if (/^\\/v[\\d]+\\.[\\d]+\\//.test(url)) {\n return '/services/data' + url;\n } else if (url.indexOf('/services/') !== 0 && url[0] === '/') {\n return '/services/data/v' + this._conn.version + '/chatter' + url;\n } else {\n return url;\n }\n};\n\n/**\n * @typedef {Object} Chatter~RequestParams\n * @prop {String} method - HTTP method\n * @prop {String} url - Resource URL\n * @prop {String} [body] - HTTP body (in POST/PUT/PATCH methods)\n */\n\n/**\n * @typedef {Object} Chatter~RequestResult\n */\n\n/**\n * Make a request for chatter API resource\n *\n * @param {Chatter~RequestParams} params - Paramters representing HTTP request\n * @param {Callback.} [callback] - Callback func\n * @returns {Chatter~Request}\n */\nChatter.prototype.request = function(params, callback) {\n return new Request(this, params).thenCall(callback);\n};\n\n/**\n * Make a resource request to chatter API\n *\n * @param {String} url - Resource URL\n * @param {Object} [queryParams] - Query parameters (in hash object)\n * @returns {Chatter~Resource}\n */\nChatter.prototype.resource = function(url, queryParams) {\n return new Resource(this, url, queryParams);\n};\n\n/**\n * @typedef {Object} Chatter~BatchRequestResult\n * @prop {Boolean} hasError - Flag if the batch has one or more errors\n * @prop {Array.} results - Batch request results in array\n * @prop {Number} results.statusCode - HTTP response status code\n * @prop {Chatter~RequestResult} results.result - Parsed HTTP response body\n */\n\n/**\n * Make a batch request to chatter API\n *\n * @params {Array.} requests - Chatter API requests\n * @param {Callback.} [callback] - Callback func\n * @returns {Promise.}\n */\nChatter.prototype.batch = function(requests, callback) {\n var self = this;\n var batchRequests = [], batchDeferreds = [];\n _.forEach(requests, function(request) {\n var deferred = Promise.defer();\n request._promise = deferred.promise;\n batchRequests.push(request.batchParams());\n batchDeferreds.push(deferred);\n });\n var params = {\n method: 'POST',\n url: this._normalizeUrl('/connect/batch'),\n body: {\n batchRequests: batchRequests\n }\n };\n return this.request(params).then(function(res) {\n _.forEach(res.results, function(result, i) {\n var deferred = batchDeferreds[i];\n if (result.statusCode >= 400) {\n deferred.reject(result.result);\n } else {\n deferred.resolve(result.result);\n }\n });\n return res;\n }).thenCall(callback);\n};\n\n\n/*--------------------------------------------*/\n/**\n * A class representing chatter API request\n *\n * @protected\n * @class Chatter~Request\n * @implements {Promise.}\n * @param {Chatter} chatter - Chatter API object\n * @param {Chatter~RequestParams} params - Paramters representing HTTP request\n */\nvar Request = function(chatter, params) {\n this._chatter = chatter;\n this._params = params;\n this._promise = null;\n};\n\n/**\n * @typedef {Object} Chatter~BatchRequestParams\n * @prop {String} method - HTTP method\n * @prop {String} url - Resource URL\n * @prop {String} [richInput] - HTTP body (in POST/PUT/PATCH methods)\n */\n\n/**\n * Retrieve parameters in batch request form\n *\n * @method Chatter~Request#batchParams\n * @returns {Chatter~BatchRequestParams}\n */\nRequest.prototype.batchParams = function() {\n var params = this._params;\n var batchParams = {\n method: params.method,\n url: this._chatter._normalizeUrl(params.url)\n };\n if (this._params.body) {\n batchParams.richInput = this._params.body;\n }\n return batchParams;\n};\n\n/**\n * Retrieve parameters in batch request form\n *\n * @method Chatter~Request#promise\n * @returns {Promise.}\n */\nRequest.prototype.promise = function() {\n return this._promise || this._chatter._request(this._params);\n};\n\n/**\n * Returns Node.js Stream object for request\n *\n * @method Chatter~Request#stream\n * @returns {stream.Stream}\n */\nRequest.prototype.stream = function() {\n return this._chatter._request(this._params).stream();\n};\n\n/**\n * Promise/A+ interface\n * http://promises-aplus.github.io/promises-spec/\n *\n * Delegate to deferred promise, return promise instance for batch result\n *\n * @method Chatter~Request#then\n */\nRequest.prototype.then = function(onResolve, onReject) {\n return this.promise().then(onResolve, onReject);\n};\n\n/**\n * Promise/A+ extension\n * Call \"then\" using given node-style callback function\n *\n * @method Chatter~Request#thenCall\n */\nRequest.prototype.thenCall = function(callback) {\n return _.isFunction(callback) ? this.promise().thenCall(callback) : this;\n};\n\n\n/*--------------------------------------------*/\n/**\n * A class representing chatter API resource\n *\n * @protected\n * @class Chatter~Resource\n * @extends Chatter~Request\n * @param {Chatter} chatter - Chatter API object\n * @param {String} url - Resource URL\n * @param {Object} [queryParams] - Query parameters (in hash object)\n */\nvar Resource = function(chatter, url, queryParams) {\n if (queryParams) {\n var qstring = _.map(_.keys(queryParams), function(name) {\n return name + \"=\" + encodeURIComponent(queryParams[name]);\n }).join('&');\n url += (url.indexOf('?') > 0 ? '&' : '?') + qstring;\n }\n Resource.super_.call(this, chatter, { method: 'GET', url: url });\n this._url = url;\n};\n\ninherits(Resource, Request);\n\n/**\n * Create a new resource\n *\n * @method Chatter~Resource#create\n * @param {Object} data - Data to newly post\n * @param {Callback.} [callback] - Callback function\n * @returns {Chatter~Request}\n */\nResource.prototype.create = function(data, callback) {\n return this._chatter.request({\n method: 'POST',\n url: this._url,\n body: data\n }).thenCall(callback);\n};\n\n/**\n * Retrieve resource content\n *\n * @method Chatter~Resource#retrieve\n * @param {Callback.} [callback] - Callback function\n * @returns {Chatter~Request}\n */\nResource.prototype.retrieve = function(callback) {\n return this.thenCall(callback);\n};\n\n/**\n * Update specified resource\n *\n * @method Chatter~Resource#update\n * @param {Obejct} data - Data to update\n * @param {Callback.} [callback] - Callback function\n * @returns {Chatter~Request}\n */\nResource.prototype.update = function(data, callback) {\n return this._chatter.request({\n method: 'POST',\n url: this._url,\n body: data\n }).thenCall(callback);\n};\n\n/**\n * Synonym of Resource#delete()\n *\n * @method Chatter~Resource#del\n * @param {Callback.} [callback] - Callback function\n * @returns {Chatter~Request}\n */\n/**\n * Delete specified resource\n *\n * @method Chatter~Resource#delete\n * @param {Callback.} [callback] - Callback function\n * @returns {Chatter~Request}\n */\nResource.prototype.del =\nResource.prototype[\"delete\"] = function(callback) {\n return this._chatter.request({\n method: 'DELETE',\n url: this._url\n }).thenCall(callback);\n};\n\n\n/*--------------------------------------------*/\n/*\n * Register hook in connection instantiation for dynamically adding this API module features\n */\njsforce.on('connection:new', function(conn) {\n conn.chatter = new Chatter(conn);\n});\n","(function(f){if(typeof exports===\"object\"&&typeof module!==\"undefined\"){module.exports=f()}else if(typeof define===\"function\"&&define.amd){define([],f)}else{var g;if(typeof window!==\"undefined\"){g=window}else if(typeof global!==\"undefined\"){g=global}else if(typeof self!==\"undefined\"){g=self}else{g=this}g=(g.jsforce||(g.jsforce = {}));g=(g.modules||(g.modules = {}));g=(g.api||(g.api = {}));g.Chatter = f()}})(function(){var define,module,exports;return (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\n */\n\n'use strict';\n\nvar inherits = window.jsforce.require('inherits'),\n _ = window.jsforce.require('lodash/core'),\n jsforce = window.jsforce.require('./core'),\n Promise = window.jsforce.require('./promise');\n\n/**\n * API class for Chatter REST API call\n *\n * @class\n * @param {Connection} conn Connection\n */\nvar Chatter = module.exports = function(conn) {\n this._conn = conn;\n};\n\n/**\n * Sending request to API endpoint\n * @private\n */\nChatter.prototype._request = function(params, callback) {\n if (/^(put|post|patch)$/i.test(params.method)) {\n if (_.isObject(params.body)) {\n params.headers = {\n \"Content-Type\": \"application/json\"\n };\n params.body = JSON.stringify(params.body);\n }\n }\n params.url = this._normalizeUrl(params.url);\n return this._conn.request(params, callback);\n};\n\n/**\n * Convert path to site root relative url\n * @private\n */\nChatter.prototype._normalizeUrl = function(url) {\n if (url.indexOf('/chatter/') === 0 || url.indexOf('/connect/') === 0) {\n return '/services/data/v' + this._conn.version + url;\n } else if (/^\\/v[\\d]+\\.[\\d]+\\//.test(url)) {\n return '/services/data' + url;\n } else if (url.indexOf('/services/') !== 0 && url[0] === '/') {\n return '/services/data/v' + this._conn.version + '/chatter' + url;\n } else {\n return url;\n }\n};\n\n/**\n * @typedef {Object} Chatter~RequestParams\n * @prop {String} method - HTTP method\n * @prop {String} url - Resource URL\n * @prop {String} [body] - HTTP body (in POST/PUT/PATCH methods)\n */\n\n/**\n * @typedef {Object} Chatter~RequestResult\n */\n\n/**\n * Make a request for chatter API resource\n *\n * @param {Chatter~RequestParams} params - Paramters representing HTTP request\n * @param {Callback.} [callback] - Callback func\n * @returns {Chatter~Request}\n */\nChatter.prototype.request = function(params, callback) {\n return new Request(this, params).thenCall(callback);\n};\n\n/**\n * Make a resource request to chatter API\n *\n * @param {String} url - Resource URL\n * @param {Object} [queryParams] - Query parameters (in hash object)\n * @returns {Chatter~Resource}\n */\nChatter.prototype.resource = function(url, queryParams) {\n return new Resource(this, url, queryParams);\n};\n\n/**\n * @typedef {Object} Chatter~BatchRequestResult\n * @prop {Boolean} hasError - Flag if the batch has one or more errors\n * @prop {Array.} results - Batch request results in array\n * @prop {Number} results.statusCode - HTTP response status code\n * @prop {Chatter~RequestResult} results.result - Parsed HTTP response body\n */\n\n/**\n * Make a batch request to chatter API\n *\n * @params {Array.} requests - Chatter API requests\n * @param {Callback.} [callback] - Callback func\n * @returns {Promise.}\n */\nChatter.prototype.batch = function(requests, callback) {\n var self = this;\n var batchRequests = [], batchDeferreds = [];\n _.forEach(requests, function(request) {\n var deferred = Promise.defer();\n request._promise = deferred.promise;\n batchRequests.push(request.batchParams());\n batchDeferreds.push(deferred);\n });\n var params = {\n method: 'POST',\n url: this._normalizeUrl('/connect/batch'),\n body: {\n batchRequests: batchRequests\n }\n };\n return this.request(params).then(function(res) {\n _.forEach(res.results, function(result, i) {\n var deferred = batchDeferreds[i];\n if (result.statusCode >= 400) {\n deferred.reject(result.result);\n } else {\n deferred.resolve(result.result);\n }\n });\n return res;\n }).thenCall(callback);\n};\n\n\n/*--------------------------------------------*/\n/**\n * A class representing chatter API request\n *\n * @protected\n * @class Chatter~Request\n * @implements {Promise.}\n * @param {Chatter} chatter - Chatter API object\n * @param {Chatter~RequestParams} params - Paramters representing HTTP request\n */\nvar Request = function(chatter, params) {\n this._chatter = chatter;\n this._params = params;\n this._promise = null;\n};\n\n/**\n * @typedef {Object} Chatter~BatchRequestParams\n * @prop {String} method - HTTP method\n * @prop {String} url - Resource URL\n * @prop {String} [richInput] - HTTP body (in POST/PUT/PATCH methods)\n */\n\n/**\n * Retrieve parameters in batch request form\n *\n * @method Chatter~Request#batchParams\n * @returns {Chatter~BatchRequestParams}\n */\nRequest.prototype.batchParams = function() {\n var params = this._params;\n var batchParams = {\n method: params.method,\n url: this._chatter._normalizeUrl(params.url)\n };\n if (this._params.body) {\n batchParams.richInput = this._params.body;\n }\n return batchParams;\n};\n\n/**\n * Retrieve parameters in batch request form\n *\n * @method Chatter~Request#promise\n * @returns {Promise.}\n */\nRequest.prototype.promise = function() {\n return this._promise || this._chatter._request(this._params);\n};\n\n/**\n * Returns Node.js Stream object for request\n *\n * @method Chatter~Request#stream\n * @returns {stream.Stream}\n */\nRequest.prototype.stream = function() {\n return this._chatter._request(this._params).stream();\n};\n\n/**\n * Promise/A+ interface\n * http://promises-aplus.github.io/promises-spec/\n *\n * Delegate to deferred promise, return promise instance for batch result\n *\n * @method Chatter~Request#then\n */\nRequest.prototype.then = function(onResolve, onReject) {\n return this.promise().then(onResolve, onReject);\n};\n\n/**\n * Promise/A+ extension\n * Call \"then\" using given node-style callback function\n *\n * @method Chatter~Request#thenCall\n */\nRequest.prototype.thenCall = function(callback) {\n return _.isFunction(callback) ? this.promise().thenCall(callback) : this;\n};\n\n\n/*--------------------------------------------*/\n/**\n * A class representing chatter API resource\n *\n * @protected\n * @class Chatter~Resource\n * @extends Chatter~Request\n * @param {Chatter} chatter - Chatter API object\n * @param {String} url - Resource URL\n * @param {Object} [queryParams] - Query parameters (in hash object)\n */\nvar Resource = function(chatter, url, queryParams) {\n if (queryParams) {\n var qstring = _.map(_.keys(queryParams), function(name) {\n return name + \"=\" + encodeURIComponent(queryParams[name]);\n }).join('&');\n url += (url.indexOf('?') > 0 ? '&' : '?') + qstring;\n }\n Resource.super_.call(this, chatter, { method: 'GET', url: url });\n this._url = url;\n};\n\ninherits(Resource, Request);\n\n/**\n * Create a new resource\n *\n * @method Chatter~Resource#create\n * @param {Object} data - Data to newly post\n * @param {Callback.} [callback] - Callback function\n * @returns {Chatter~Request}\n */\nResource.prototype.create = function(data, callback) {\n return this._chatter.request({\n method: 'POST',\n url: this._url,\n body: data\n }).thenCall(callback);\n};\n\n/**\n * Retrieve resource content\n *\n * @method Chatter~Resource#retrieve\n * @param {Callback.} [callback] - Callback function\n * @returns {Chatter~Request}\n */\nResource.prototype.retrieve = function(callback) {\n return this.thenCall(callback);\n};\n\n/**\n * Update specified resource\n *\n * @method Chatter~Resource#update\n * @param {Obejct} data - Data to update\n * @param {Callback.} [callback] - Callback function\n * @returns {Chatter~Request}\n */\nResource.prototype.update = function(data, callback) {\n return this._chatter.request({\n method: 'POST',\n url: this._url,\n body: data\n }).thenCall(callback);\n};\n\n/**\n * Synonym of Resource#delete()\n *\n * @method Chatter~Resource#del\n * @param {Callback.} [callback] - Callback function\n * @returns {Chatter~Request}\n */\n/**\n * Delete specified resource\n *\n * @method Chatter~Resource#delete\n * @param {Callback.} [callback] - Callback function\n * @returns {Chatter~Request}\n */\nResource.prototype.del =\nResource.prototype[\"delete\"] = function(callback) {\n return this._chatter.request({\n method: 'DELETE',\n url: this._url\n }).thenCall(callback);\n};\n\n\n/*--------------------------------------------*/\n/*\n * Register hook in connection instantiation for dynamically adding this API module features\n */\njsforce.on('connection:new', function(conn) {\n conn.chatter = new Chatter(conn);\n});\n\n},{}]},{},[1])(1)\n});\n\n"]} \ No newline at end of file +{"version":3,"sources":["node_modules/browser-pack/_prelude.js","lib/api/chatter.js","jsforce-api-chatter.min.js"],"names":["f","exports","module","define","amd","g","window","global","self","this","jsforce","modules","api","Chatter","r","e","n","t","o","i","c","require","u","a","Error","code","p","call","length","1","inherits","_","Promise","conn","_conn","prototype","_request","params","callback","test","method","isObject","body","headers","Content-Type","JSON","stringify","url","_normalizeUrl","request","indexOf","version","Request","thenCall","resource","queryParams","Resource","batch","requests","batchRequests","batchDeferreds","forEach","deferred","defer","_promise","promise","push","batchParams","then","res","results","result","statusCode","reject","resolve","chatter","_chatter","_params","richInput","stream","onResolve","onReject","isFunction","qstring","map","keys","name","encodeURIComponent","join","super_","_url","create","data","retrieve","update","del","on"],"mappings":"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","file":"jsforce-api-chatter.min.js","sourcesContent":["(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\n */\n\n'use strict';\n\nvar inherits = window.jsforce.require('inherits'),\n _ = window.jsforce.require('lodash/core'),\n jsforce = window.jsforce.require('./core'),\n Promise = window.jsforce.require('./promise');\n\n/**\n * API class for Chatter REST API call\n *\n * @class\n * @param {Connection} conn Connection\n */\nvar Chatter = module.exports = function(conn) {\n this._conn = conn;\n};\n\n/**\n * Sending request to API endpoint\n * @private\n */\nChatter.prototype._request = function(params, callback) {\n if (/^(put|post|patch)$/i.test(params.method)) {\n if (_.isObject(params.body)) {\n params.headers = {\n \"Content-Type\": \"application/json\"\n };\n params.body = JSON.stringify(params.body);\n }\n }\n params.url = this._normalizeUrl(params.url);\n return this._conn.request(params, callback);\n};\n\n/**\n * Convert path to site root relative url\n * @private\n */\nChatter.prototype._normalizeUrl = function(url) {\n if (url.indexOf('/chatter/') === 0 || url.indexOf('/connect/') === 0) {\n return '/services/data/v' + this._conn.version + url;\n } else if (/^\\/v[\\d]+\\.[\\d]+\\//.test(url)) {\n return '/services/data' + url;\n } else if (url.indexOf('/services/') !== 0 && url[0] === '/') {\n return '/services/data/v' + this._conn.version + '/chatter' + url;\n } else {\n return url;\n }\n};\n\n/**\n * @typedef {Object} Chatter~RequestParams\n * @prop {String} method - HTTP method\n * @prop {String} url - Resource URL\n * @prop {String} [body] - HTTP body (in POST/PUT/PATCH methods)\n */\n\n/**\n * @typedef {Object} Chatter~RequestResult\n */\n\n/**\n * Make a request for chatter API resource\n *\n * @param {Chatter~RequestParams} params - Paramters representing HTTP request\n * @param {Callback.} [callback] - Callback func\n * @returns {Chatter~Request}\n */\nChatter.prototype.request = function(params, callback) {\n return new Request(this, params).thenCall(callback);\n};\n\n/**\n * Make a resource request to chatter API\n *\n * @param {String} url - Resource URL\n * @param {Object} [queryParams] - Query parameters (in hash object)\n * @returns {Chatter~Resource}\n */\nChatter.prototype.resource = function(url, queryParams) {\n return new Resource(this, url, queryParams);\n};\n\n/**\n * @typedef {Object} Chatter~BatchRequestResult\n * @prop {Boolean} hasError - Flag if the batch has one or more errors\n * @prop {Array.} results - Batch request results in array\n * @prop {Number} results.statusCode - HTTP response status code\n * @prop {Chatter~RequestResult} results.result - Parsed HTTP response body\n */\n\n/**\n * Make a batch request to chatter API\n *\n * @params {Array.} requests - Chatter API requests\n * @param {Callback.} [callback] - Callback func\n * @returns {Promise.}\n */\nChatter.prototype.batch = function(requests, callback) {\n var self = this;\n var batchRequests = [], batchDeferreds = [];\n _.forEach(requests, function(request) {\n var deferred = Promise.defer();\n request._promise = deferred.promise;\n batchRequests.push(request.batchParams());\n batchDeferreds.push(deferred);\n });\n var params = {\n method: 'POST',\n url: this._normalizeUrl('/connect/batch'),\n body: {\n batchRequests: batchRequests\n }\n };\n return this.request(params).then(function(res) {\n _.forEach(res.results, function(result, i) {\n var deferred = batchDeferreds[i];\n if (result.statusCode >= 400) {\n deferred.reject(result.result);\n } else {\n deferred.resolve(result.result);\n }\n });\n return res;\n }).thenCall(callback);\n};\n\n\n/*--------------------------------------------*/\n/**\n * A class representing chatter API request\n *\n * @protected\n * @class Chatter~Request\n * @implements {Promise.}\n * @param {Chatter} chatter - Chatter API object\n * @param {Chatter~RequestParams} params - Paramters representing HTTP request\n */\nvar Request = function(chatter, params) {\n this._chatter = chatter;\n this._params = params;\n this._promise = null;\n};\n\n/**\n * @typedef {Object} Chatter~BatchRequestParams\n * @prop {String} method - HTTP method\n * @prop {String} url - Resource URL\n * @prop {String} [richInput] - HTTP body (in POST/PUT/PATCH methods)\n */\n\n/**\n * Retrieve parameters in batch request form\n *\n * @method Chatter~Request#batchParams\n * @returns {Chatter~BatchRequestParams}\n */\nRequest.prototype.batchParams = function() {\n var params = this._params;\n var batchParams = {\n method: params.method,\n url: this._chatter._normalizeUrl(params.url)\n };\n if (this._params.body) {\n batchParams.richInput = this._params.body;\n }\n return batchParams;\n};\n\n/**\n * Retrieve parameters in batch request form\n *\n * @method Chatter~Request#promise\n * @returns {Promise.}\n */\nRequest.prototype.promise = function() {\n return this._promise || this._chatter._request(this._params);\n};\n\n/**\n * Returns Node.js Stream object for request\n *\n * @method Chatter~Request#stream\n * @returns {stream.Stream}\n */\nRequest.prototype.stream = function() {\n return this._chatter._request(this._params).stream();\n};\n\n/**\n * Promise/A+ interface\n * http://promises-aplus.github.io/promises-spec/\n *\n * Delegate to deferred promise, return promise instance for batch result\n *\n * @method Chatter~Request#then\n */\nRequest.prototype.then = function(onResolve, onReject) {\n return this.promise().then(onResolve, onReject);\n};\n\n/**\n * Promise/A+ extension\n * Call \"then\" using given node-style callback function\n *\n * @method Chatter~Request#thenCall\n */\nRequest.prototype.thenCall = function(callback) {\n return _.isFunction(callback) ? this.promise().thenCall(callback) : this;\n};\n\n\n/*--------------------------------------------*/\n/**\n * A class representing chatter API resource\n *\n * @protected\n * @class Chatter~Resource\n * @extends Chatter~Request\n * @param {Chatter} chatter - Chatter API object\n * @param {String} url - Resource URL\n * @param {Object} [queryParams] - Query parameters (in hash object)\n */\nvar Resource = function(chatter, url, queryParams) {\n if (queryParams) {\n var qstring = _.map(_.keys(queryParams), function(name) {\n return name + \"=\" + encodeURIComponent(queryParams[name]);\n }).join('&');\n url += (url.indexOf('?') > 0 ? '&' : '?') + qstring;\n }\n Resource.super_.call(this, chatter, { method: 'GET', url: url });\n this._url = url;\n};\n\ninherits(Resource, Request);\n\n/**\n * Create a new resource\n *\n * @method Chatter~Resource#create\n * @param {Object} data - Data to newly post\n * @param {Callback.} [callback] - Callback function\n * @returns {Chatter~Request}\n */\nResource.prototype.create = function(data, callback) {\n return this._chatter.request({\n method: 'POST',\n url: this._url,\n body: data\n }).thenCall(callback);\n};\n\n/**\n * Retrieve resource content\n *\n * @method Chatter~Resource#retrieve\n * @param {Callback.} [callback] - Callback function\n * @returns {Chatter~Request}\n */\nResource.prototype.retrieve = function(callback) {\n return this.thenCall(callback);\n};\n\n/**\n * Update specified resource\n *\n * @method Chatter~Resource#update\n * @param {Object} data - Data to update\n * @param {Callback.} [callback] - Callback function\n * @returns {Chatter~Request}\n */\nResource.prototype.update = function(data, callback) {\n return this._chatter.request({\n method: 'PATCH',\n url: this._url,\n body: data\n }).thenCall(callback);\n};\n\n/**\n * Synonym of Resource#delete()\n *\n * @method Chatter~Resource#del\n * @param {Callback.} [callback] - Callback function\n * @returns {Chatter~Request}\n */\n/**\n * Delete specified resource\n *\n * @method Chatter~Resource#delete\n * @param {Callback.} [callback] - Callback function\n * @returns {Chatter~Request}\n */\nResource.prototype.del =\nResource.prototype[\"delete\"] = function(callback) {\n return this._chatter.request({\n method: 'DELETE',\n url: this._url\n }).thenCall(callback);\n};\n\n\n/*--------------------------------------------*/\n/*\n * Register hook in connection instantiation for dynamically adding this API module features\n */\njsforce.on('connection:new', function(conn) {\n conn.chatter = new Chatter(conn);\n});\n","!function(t){var e;\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=t():\"function\"==typeof define&&define.amd?define([],t):(e=(e=(e=(e=\"undefined\"!=typeof window?window:\"undefined\"!=typeof global?global:\"undefined\"!=typeof self?self:this).jsforce||(e.jsforce={})).modules||(e.modules={})).api||(e.api={})).Chatter=t()}(function(){return function i(s,u,a){function c(e,t){if(!u[e]){if(!s[e]){var r=\"function\"==typeof require&&require;if(!t&&r)return r(e,!0);if(h)return h(e,!0);var n=new Error(\"Cannot find module '\"+e+\"'\");throw n.code=\"MODULE_NOT_FOUND\",n}var o=u[e]={exports:{}};s[e][0].call(o.exports,function(t){return c(s[e][1][t]||t)},o,o.exports,i,s,u,a)}return u[e].exports}for(var h=\"function\"==typeof require&&require,t=0;t K_MAX_LENGTH) { - throw new RangeError('Invalid typed array length') + throw new RangeError('The value "' + length + '" is invalid for option "size"') } // Return an augmented `Uint8Array` instance var buf = new Uint8Array(length) @@ -1102,8 +1102,8 @@ function Buffer (arg, encodingOrOffset, length) { // Common case. if (typeof arg === 'number') { if (typeof encodingOrOffset === 'string') { - throw new Error( - 'If encoding is specified then the first argument must be a string' + throw new TypeError( + 'The "string" argument must be of type string. Received type number' ) } return allocUnsafe(arg) @@ -1112,7 +1112,7 @@ function Buffer (arg, encodingOrOffset, length) { } // Fix subarray() in ES2016. See: https://github.com/feross/buffer/pull/97 -if (typeof Symbol !== 'undefined' && Symbol.species && +if (typeof Symbol !== 'undefined' && Symbol.species != null && Buffer[Symbol.species] === Buffer) { Object.defineProperty(Buffer, Symbol.species, { value: null, @@ -1125,19 +1125,51 @@ if (typeof Symbol !== 'undefined' && Symbol.species && Buffer.poolSize = 8192 // not used by this implementation function from (value, encodingOrOffset, length) { - if (typeof value === 'number') { - throw new TypeError('"value" argument must not be a number') + if (typeof value === 'string') { + return fromString(value, encodingOrOffset) + } + + if (ArrayBuffer.isView(value)) { + return fromArrayLike(value) } - if (isArrayBuffer(value) || (value && isArrayBuffer(value.buffer))) { + if (value == null) { + throw TypeError( + 'The first argument must be one of type string, Buffer, ArrayBuffer, Array, ' + + 'or Array-like Object. Received type ' + (typeof value) + ) + } + + if (isInstance(value, ArrayBuffer) || + (value && isInstance(value.buffer, ArrayBuffer))) { return fromArrayBuffer(value, encodingOrOffset, length) } - if (typeof value === 'string') { - return fromString(value, encodingOrOffset) + if (typeof value === 'number') { + throw new TypeError( + 'The "value" argument must not be of type number. Received type number' + ) + } + + var valueOf = value.valueOf && value.valueOf() + if (valueOf != null && valueOf !== value) { + return Buffer.from(valueOf, encodingOrOffset, length) } - return fromObject(value) + var b = fromObject(value) + if (b) return b + + if (typeof Symbol !== 'undefined' && Symbol.toPrimitive != null && + typeof value[Symbol.toPrimitive] === 'function') { + return Buffer.from( + value[Symbol.toPrimitive]('string'), encodingOrOffset, length + ) + } + + throw new TypeError( + 'The first argument must be one of type string, Buffer, ArrayBuffer, Array, ' + + 'or Array-like Object. Received type ' + (typeof value) + ) } /** @@ -1161,7 +1193,7 @@ function assertSize (size) { if (typeof size !== 'number') { throw new TypeError('"size" argument must be of type number') } else if (size < 0) { - throw new RangeError('"size" argument must not be negative') + throw new RangeError('The value "' + size + '" is invalid for option "size"') } } @@ -1276,20 +1308,16 @@ function fromObject (obj) { return buf } - if (obj) { - if (ArrayBuffer.isView(obj) || 'length' in obj) { - if (typeof obj.length !== 'number' || numberIsNaN(obj.length)) { - return createBuffer(0) - } - return fromArrayLike(obj) - } - - if (obj.type === 'Buffer' && Array.isArray(obj.data)) { - return fromArrayLike(obj.data) + if (obj.length !== undefined) { + if (typeof obj.length !== 'number' || numberIsNaN(obj.length)) { + return createBuffer(0) } + return fromArrayLike(obj) } - throw new TypeError('The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object.') + if (obj.type === 'Buffer' && Array.isArray(obj.data)) { + return fromArrayLike(obj.data) + } } function checked (length) { @@ -1310,12 +1338,17 @@ function SlowBuffer (length) { } Buffer.isBuffer = function isBuffer (b) { - return b != null && b._isBuffer === true + return b != null && b._isBuffer === true && + b !== Buffer.prototype // so Buffer.isBuffer(Buffer.prototype) will be false } Buffer.compare = function compare (a, b) { + if (isInstance(a, Uint8Array)) a = Buffer.from(a, a.offset, a.byteLength) + if (isInstance(b, Uint8Array)) b = Buffer.from(b, b.offset, b.byteLength) if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) { - throw new TypeError('Arguments must be Buffers') + throw new TypeError( + 'The "buf1", "buf2" arguments must be one of type Buffer or Uint8Array' + ) } if (a === b) return 0 @@ -1376,7 +1409,7 @@ Buffer.concat = function concat (list, length) { var pos = 0 for (i = 0; i < list.length; ++i) { var buf = list[i] - if (ArrayBuffer.isView(buf)) { + if (isInstance(buf, Uint8Array)) { buf = Buffer.from(buf) } if (!Buffer.isBuffer(buf)) { @@ -1392,15 +1425,19 @@ function byteLength (string, encoding) { if (Buffer.isBuffer(string)) { return string.length } - if (ArrayBuffer.isView(string) || isArrayBuffer(string)) { + if (ArrayBuffer.isView(string) || isInstance(string, ArrayBuffer)) { return string.byteLength } if (typeof string !== 'string') { - string = '' + string + throw new TypeError( + 'The "string" argument must be one of type string, Buffer, or ArrayBuffer. ' + + 'Received type ' + typeof string + ) } var len = string.length - if (len === 0) return 0 + var mustMatch = (arguments.length > 2 && arguments[2] === true) + if (!mustMatch && len === 0) return 0 // Use a for loop to avoid recursion var loweredCase = false @@ -1412,7 +1449,6 @@ function byteLength (string, encoding) { return len case 'utf8': case 'utf-8': - case undefined: return utf8ToBytes(string).length case 'ucs2': case 'ucs-2': @@ -1424,7 +1460,9 @@ function byteLength (string, encoding) { case 'base64': return base64ToBytes(string).length default: - if (loweredCase) return utf8ToBytes(string).length // assume utf8 + if (loweredCase) { + return mustMatch ? -1 : utf8ToBytes(string).length // assume utf8 + } encoding = ('' + encoding).toLowerCase() loweredCase = true } @@ -1571,16 +1609,20 @@ Buffer.prototype.equals = function equals (b) { Buffer.prototype.inspect = function inspect () { var str = '' var max = exports.INSPECT_MAX_BYTES - if (this.length > 0) { - str = this.toString('hex', 0, max).match(/.{2}/g).join(' ') - if (this.length > max) str += ' ... ' - } + str = this.toString('hex', 0, max).replace(/(.{2})/g, '$1 ').trim() + if (this.length > max) str += ' ... ' return '' } Buffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) { + if (isInstance(target, Uint8Array)) { + target = Buffer.from(target, target.offset, target.byteLength) + } if (!Buffer.isBuffer(target)) { - throw new TypeError('Argument must be a Buffer') + throw new TypeError( + 'The "target" argument must be one of type Buffer or Uint8Array. ' + + 'Received type ' + (typeof target) + ) } if (start === undefined) { @@ -1659,7 +1701,7 @@ function bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) { } else if (byteOffset < -0x80000000) { byteOffset = -0x80000000 } - byteOffset = +byteOffset // Coerce to Number. + byteOffset = +byteOffset // Coerce to Number. if (numberIsNaN(byteOffset)) { // byteOffset: it it's undefined, null, NaN, "foo", etc, search whole buffer byteOffset = dir ? 0 : (buffer.length - 1) @@ -1911,8 +1953,8 @@ function utf8Slice (buf, start, end) { var codePoint = null var bytesPerSequence = (firstByte > 0xEF) ? 4 : (firstByte > 0xDF) ? 3 - : (firstByte > 0xBF) ? 2 - : 1 + : (firstByte > 0xBF) ? 2 + : 1 if (i + bytesPerSequence <= end) { var secondByte, thirdByte, fourthByte, tempCodePoint @@ -2730,19 +2772,22 @@ function blitBuffer (src, dst, offset, length) { return i } -// ArrayBuffers from another context (i.e. an iframe) do not pass the `instanceof` check -// but they should be treated as valid. See: https://github.com/feross/buffer/issues/166 -function isArrayBuffer (obj) { - return obj instanceof ArrayBuffer || - (obj != null && obj.constructor != null && obj.constructor.name === 'ArrayBuffer' && - typeof obj.byteLength === 'number') +// ArrayBuffer or Uint8Array objects from other contexts (i.e. iframes) do not pass +// the `instanceof` check but they should be treated as of that type. +// See: https://github.com/feross/buffer/issues/166 +function isInstance (obj, type) { + return obj instanceof type || + (obj != null && obj.constructor != null && obj.constructor.name != null && + obj.constructor.name === type.name) } - function numberIsNaN (obj) { + // For IE11 support return obj !== obj // eslint-disable-line no-self-compare } -},{"base64-js":2,"ieee754":4}],4:[function(require,module,exports){ +}).call(this,require("buffer").Buffer) + +},{"base64-js":2,"buffer":3,"ieee754":4}],4:[function(require,module,exports){ exports.read = function (buffer, offset, isLE, mLen, nBytes) { var e, m var eLen = (nBytes * 8) - mLen - 1 @@ -3017,4 +3062,4 @@ process.umask = function() { return 0; }; },{}]},{},[1])(1) }); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJsaWIvYXBpL21ldGFkYXRhLmpzIiwibm9kZV9tb2R1bGVzL2Jhc2U2NC1qcy9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9idWZmZXIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvaWVlZTc1NC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9wcm9jZXNzL2Jyb3dzZXIuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDaDFCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeHNEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uKCl7ZnVuY3Rpb24gcihlLG4sdCl7ZnVuY3Rpb24gbyhpLGYpe2lmKCFuW2ldKXtpZighZVtpXSl7dmFyIGM9XCJmdW5jdGlvblwiPT10eXBlb2YgcmVxdWlyZSYmcmVxdWlyZTtpZighZiYmYylyZXR1cm4gYyhpLCEwKTtpZih1KXJldHVybiB1KGksITApO3ZhciBhPW5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIraStcIidcIik7dGhyb3cgYS5jb2RlPVwiTU9EVUxFX05PVF9GT1VORFwiLGF9dmFyIHA9bltpXT17ZXhwb3J0czp7fX07ZVtpXVswXS5jYWxsKHAuZXhwb3J0cyxmdW5jdGlvbihyKXt2YXIgbj1lW2ldWzFdW3JdO3JldHVybiBvKG58fHIpfSxwLHAuZXhwb3J0cyxyLGUsbix0KX1yZXR1cm4gbltpXS5leHBvcnRzfWZvcih2YXIgdT1cImZ1bmN0aW9uXCI9PXR5cGVvZiByZXF1aXJlJiZyZXF1aXJlLGk9MDtpPHQubGVuZ3RoO2krKylvKHRbaV0pO3JldHVybiBvfXJldHVybiByfSkoKSIsIi8qZ2xvYmFsIHByb2Nlc3MsIEJ1ZmZlciAqL1xuLyoqXG4gKiBAZmlsZSBNYW5hZ2VzIFNhbGVzZm9yY2UgTWV0YWRhdGEgQVBJXG4gKiBAYXV0aG9yIFNoaW5pY2hpIFRvbWl0YSA8c2hpbmljaGkudG9taXRhQGdtYWlsLmNvbT5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBpbmhlcml0cyA9IHdpbmRvdy5qc2ZvcmNlLnJlcXVpcmUoJ2luaGVyaXRzJyksXG4gICAgZXZlbnRzICA9IHdpbmRvdy5qc2ZvcmNlLnJlcXVpcmUoJ2V2ZW50cycpLFxuICAgIHN0cmVhbSAgPSB3aW5kb3cuanNmb3JjZS5yZXF1aXJlKCdyZWFkYWJsZS1zdHJlYW0nKSxcbiAgICBfICAgICAgID0gd2luZG93LmpzZm9yY2UucmVxdWlyZSgnbG9kYXNoL2NvcmUnKSxcbiAgICBqc2ZvcmNlID0gd2luZG93LmpzZm9yY2UucmVxdWlyZSgnLi9jb3JlJyksXG4gICAgUHJvbWlzZSA9IHdpbmRvdy5qc2ZvcmNlLnJlcXVpcmUoJy4vcHJvbWlzZScpLFxuICAgIFNPQVAgICAgPSB3aW5kb3cuanNmb3JjZS5yZXF1aXJlKCcuL3NvYXAnKTtcblxuLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG4vKipcbiAqIENsYXNzIGZvciBTYWxlc2ZvcmNlIE1ldGFkYXRhIEFQSVxuICpcbiAqIEBjbGFzc1xuICogQHBhcmFtIHtDb25uZWN0aW9ufSBjb25uIC0gQ29ubmVjdGlvbiBvYmplY3RcbiAqL1xudmFyIE1ldGFkYXRhID0gbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihjb25uKSB7XG4gIHRoaXMuX2Nvbm4gPSBjb25uO1xufTtcblxuXG4vKipcbiAqIFBvbGxpbmcgaW50ZXJ2YWwgaW4gbWlsbGlzZWNvbmRzXG4gKiBAdHlwZSB7TnVtYmVyfVxuICovXG5NZXRhZGF0YS5wcm90b3R5cGUucG9sbEludGVydmFsID0gMTAwMDtcblxuLyoqXG4gKiBQb2xsaW5nIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzXG4gKiBAdHlwZSB7TnVtYmVyfVxuICovXG5NZXRhZGF0YS5wcm90b3R5cGUucG9sbFRpbWVvdXQgPSAxMDAwMDtcblxuXG4vKipcbiAqIENhbGwgTWV0YWRhdGEgQVBJIFNPQVAgZW5kcG9pbnRcbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5NZXRhZGF0YS5wcm90b3R5cGUuX2ludm9rZSA9IGZ1bmN0aW9uKG1ldGhvZCwgbWVzc2FnZSwgY2FsbGJhY2spIHtcbiAgdmFyIHNvYXBFbmRwb2ludCA9IG5ldyBTT0FQKHRoaXMuX2Nvbm4sIHtcbiAgICB4bWxuczogXCJodHRwOi8vc29hcC5zZm9yY2UuY29tLzIwMDYvMDQvbWV0YWRhdGFcIixcbiAgICBlbmRwb2ludFVybDogdGhpcy5fY29ubi5pbnN0YW5jZVVybCArIFwiL3NlcnZpY2VzL1NvYXAvbS9cIiArIHRoaXMuX2Nvbm4udmVyc2lvblxuICB9KTtcbiAgcmV0dXJuIHNvYXBFbmRwb2ludC5pbnZva2UobWV0aG9kLCBtZXNzYWdlKS50aGVuKGZ1bmN0aW9uKHJlcykge1xuICAgIHJldHVybiByZXMucmVzdWx0O1xuICB9KS50aGVuQ2FsbChjYWxsYmFjayk7XG59O1xuXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gTWV0YWRhdGF+TWV0YWRhdGFJbmZvXG4gKiBAcHJvcCB7U3RyaW5nfSBmdWxsTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBjb21wb25lbnRcbiAqL1xuXG4vKipcbiAqIEFzeW5jaHJvbm91c2x5IGFkZHMgb25lIG9yIG1vcmUgbmV3IG1ldGFkYXRhIGNvbXBvbmVudHMgdG8gdGhlIG9yZ2FuaXphdGlvbi5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gdHlwZSAtIFRoZSB0eXBlIG9mIG1ldGFkYXRhIHRvIGNyZWF0ZVxuICogQHBhcmFtIHtNZXRhZGF0YX5NZXRhZGF0YUluZm98QXJyYXkuPE1ldGFkYXRhfk1ldGFkYXRhSW5mbz59IG1ldGFkYXRhIC0gTWV0YWRhdGEgdG8gY3JlYXRlXG4gKiBAcGFyYW0ge0NhbGxiYWNrLjxNZXRhZGF0YX5Bc3luY1Jlc3VsdHxBcnJheS48TWV0YWRhdGF+QXN5bmNSZXN1bHQ+Pn0gW2NhbGxiYWNrXSAtIENhbGxiYWNrIGZ1bmN0aW9uXG4gKiBAcmV0dXJucyB7TWV0YWRhdGF+QXN5bmNSZXN1bHRMb2NhdG9yfVxuICovXG5NZXRhZGF0YS5wcm90b3R5cGUuY3JlYXRlQXN5bmMgPSBmdW5jdGlvbih0eXBlLCBtZXRhZGF0YSwgY2FsbGJhY2spIHtcbiAgaWYgKE51bWJlcih0aGlzLl9jb25uLnZlcnNpb24pID4gMzApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJBc3luYyBtZXRhZGF0YSBDUlVEIGNhbGxzIGFyZSBub3Qgc3VwcG9ydGVkIG9uIHZlciAzMS4wIG9yIGxhdGVyLlwiKTtcbiAgfVxuICB2YXIgY29udmVydCA9IGZ1bmN0aW9uKG1kKSB7XG4gICAgbWRbXCJAeHNpOnR5cGVcIl0gPSB0eXBlO1xuICAgIHJldHVybiBtZDtcbiAgfTtcbiAgdmFyIGlzQXJyYXkgPSBfLmlzQXJyYXkobWV0YWRhdGEpO1xuICBtZXRhZGF0YSA9IGlzQXJyYXkgPyBfLm1hcChtZXRhZGF0YSwgY29udmVydCkgOiBjb252ZXJ0KG1ldGFkYXRhKTtcbiAgdmFyIHJlcyA9IHRoaXMuX2ludm9rZShcImNyZWF0ZVwiLCB7IG1ldGFkYXRhOiBtZXRhZGF0YSB9KTtcbiAgcmV0dXJuIG5ldyBBc3luY1Jlc3VsdExvY2F0b3IodGhpcywgcmVzLCBpc0FycmF5KS50aGVuQ2FsbChjYWxsYmFjayk7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IE1ldGFkYXRhflNhdmVSZXN1bHRcbiAqIEBwcm9wIHtCb29sZWFufSBzdWNjZXNzIC0gVHJ1ZSBpZiBtZXRhZGF0YSBpcyBzdWNjZXNzZnVsbHkgc2F2ZWRcbiAqIEBwcm9wIHtTdHJpbmd9IGZ1bGxOYW1lIC0gRnVsbCBuYW1lIG9mIG1ldGFkYXRhIG9iamVjdFxuICovXG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gY29udmVydFRvU2F2ZVJlc3VsdChyZXN1bHQpIHtcbiAgdmFyIHNhdmVSZXN1bHQgPSBfLmNsb25lKHJlc3VsdCk7XG4gIHNhdmVSZXN1bHQuc3VjY2VzcyA9IHNhdmVSZXN1bHQuc3VjY2VzcyA9PT0gJ3RydWUnO1xuICByZXR1cm4gc2F2ZVJlc3VsdDtcbn1cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBNZXRhZGF0YX5VcHNlcnRSZXN1bHRcbiAqIEBwcm9wIHtCb29sZWFufSBzdWNjZXNzIC0gVHJ1ZSBpZiBtZXRhZGF0YSBpcyBzdWNjZXNzZnVsbHkgc2F2ZWRcbiAqIEBwcm9wIHtTdHJpbmd9IGZ1bGxOYW1lIC0gRnVsbCBuYW1lIG9mIG1ldGFkYXRhIG9iamVjdFxuICogQHByb3Age0Jvb2xlYW59IGNyZWF0ZWQgLSBUcnVlIGlmIG1ldGFkYXRhIGlzIG5ld2x5IGNyZWF0ZWRcbiAqL1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGNvbnZlcnRUb1Vwc2VydFJlc3VsdChyZXN1bHQpIHtcbiAgdmFyIHVwc2VydFJlc3VsdCA9IGNvbnZlcnRUb1NhdmVSZXN1bHQocmVzdWx0KTtcbiAgdXBzZXJ0UmVzdWx0LmNyZWF0ZWQgPSB1cHNlcnRSZXN1bHQuY3JlYXRlZCA9PT0gJ3RydWUnO1xuICByZXR1cm4gdXBzZXJ0UmVzdWx0O1xufVxuXG4vKipcbiAqIFN5bm9ueW0gb2YgTWV0YWRhdGEjY3JlYXRlKCkuXG4gKlxuICogQG1ldGhvZCBNZXRhZGF0YSNjcmVhdGVTeW5jXG4gKiBAcGFyYW0ge1N0cmluZ30gdHlwZSAtIFRoZSB0eXBlIG9mIG1ldGFkYXRhIHRvIGNyZWF0ZVxuICogQHBhcmFtIHtNZXRhZGF0YX5NZXRhZGF0YUluZm98QXJyYXkuPE1ldGFkYXRhfk1ldGFkYXRhSW5mbz59IG1ldGFkYXRhIC0gTWV0YWRhdGEgdG8gY3JlYXRlXG4gKiBAcGFyYW0ge0NhbGxiYWNrLjxNZXRhZGF0YX5TYXZlUmVzdWx0fEFycmF5LjxNZXRhZGF0YX5TYXZlUmVzdWx0Pj59IFtjYWxsYmFja10gLSBDYWxsYmFjayBmdW5jdGlvblxuICogQHJldHVybnMge1Byb21pc2UuPE1ldGFkYXRhflNhdmVSZXN1bHR8QXJyYXkuPE1ldGFkYXRhflNhdmVSZXN1bHQ+Pn1cbiAqL1xuLyoqXG4gKiBTeW5jaHJvbm91c2x5IGFkZHMgb25lIG9yIG1vcmUgbmV3IG1ldGFkYXRhIGNvbXBvbmVudHMgdG8gdGhlIG9yZ2FuaXphdGlvbi5cbiAqXG4gKiBAbWV0aG9kIE1ldGFkYXRhI2NyZWF0ZVxuICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgLSBUaGUgdHlwZSBvZiBtZXRhZGF0YSB0byBjcmVhdGVcbiAqIEBwYXJhbSB7TWV0YWRhdGF+TWV0YWRhdGFJbmZvfEFycmF5LjxNZXRhZGF0YX5NZXRhZGF0YUluZm8+fSBtZXRhZGF0YSAtIE1ldGFkYXRhIHRvIGNyZWF0ZVxuICogQHBhcmFtIHtDYWxsYmFjay48TWV0YWRhdGF+U2F2ZVJlc3VsdHxBcnJheS48TWV0YWRhdGF+U2F2ZVJlc3VsdD4+fSBbY2FsbGJhY2tdIC0gQ2FsbGJhY2sgZnVuY3Rpb25cbiAqIEByZXR1cm5zIHtQcm9taXNlLjxNZXRhZGF0YX5TYXZlUmVzdWx0fEFycmF5LjxNZXRhZGF0YX5TYXZlUmVzdWx0Pj59XG4gKi9cbk1ldGFkYXRhLnByb3RvdHlwZS5jcmVhdGVTeW5jID1cbk1ldGFkYXRhLnByb3RvdHlwZS5jcmVhdGUgPSBmdW5jdGlvbih0eXBlLCBtZXRhZGF0YSwgY2FsbGJhY2spIHtcbiAgdmFyIGNvbnZlcnQgPSBmdW5jdGlvbihtZCkge1xuICAgIG1kW1wiQHhzaTp0eXBlXCJdID0gdHlwZTtcbiAgICByZXR1cm4gbWQ7XG4gIH07XG4gIHZhciBpc0FycmF5ID0gXy5pc0FycmF5KG1ldGFkYXRhKTtcbiAgbWV0YWRhdGEgPSBpc0FycmF5ID8gXy5tYXAobWV0YWRhdGEsIGNvbnZlcnQpIDogY29udmVydChtZXRhZGF0YSk7XG4gIHJldHVybiB0aGlzLl9pbnZva2UoXCJjcmVhdGVNZXRhZGF0YVwiLCB7IG1ldGFkYXRhOiBtZXRhZGF0YSB9KS50aGVuKGZ1bmN0aW9uKHJlc3VsdHMpIHtcbiAgICByZXR1cm4gXy5pc0FycmF5KHJlc3VsdHMpID8gXy5tYXAocmVzdWx0cywgY29udmVydFRvU2F2ZVJlc3VsdCkgOiBjb252ZXJ0VG9TYXZlUmVzdWx0KHJlc3VsdHMpO1xuICB9KS50aGVuQ2FsbChjYWxsYmFjayk7XG59O1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGNvbnZlcnRUb01ldGFkYXRhSW5mbyhyZWMpIHtcbiAgdmFyIG1ldGFkYXRhSW5mbyA9IF8uY2xvbmUocmVjKTtcbiAgZGVsZXRlIG1ldGFkYXRhSW5mby4kO1xuICByZXR1cm4gbWV0YWRhdGFJbmZvO1xufVxuXG4vKipcbiAqIFN5bm9ueW0gb2YgTWV0YWRhdGEjcmVhZCgpXG4gKlxuICogQG1ldGhvZCBNZXRhZGF0YSNyZWFkU3luY1xuICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgLSBUaGUgdHlwZSBvZiBtZXRhZGF0YSB0byByZWFkXG4gKiBAcGFyYW0ge1N0cmluZ3xBcnJheS48U3RyaW5nPn0gZnVsbE5hbWVzIC0gZnVsbCBuYW1lKHMpIG9mIG1ldGFkYXRhIG9iamVjdHMgdG8gcmVhZFxuICogQHBhcmFtIHtDYWxsYmFjay48TWV0YWRhdGF+TWV0YWRhdGFJbmZvfEFycmF5LjxNZXRhZGF0YX5NZXRhZGF0YUluZm8+Pn0gW2NhbGxiYWNrXSAtIENhbGxiYWNrIGZ1bmN0aW9uXG4gKiBAcmV0dXJucyB7UHJvbWlzZS48QXJyYXkuPE1ldGFkYXRhfk1ldGFkYXRhSW5mb3xBcnJheS48TWV0YWRhdGF+TWV0YWRhdGFJbmZvPj4+fVxuICovXG4vKipcbiAqIFN5bmNocm9ub3VzbHkgcmVhZCBzcGVjaWZpZWQgbWV0YWRhdGEgY29tcG9uZW50cyBpbiB0aGUgb3JnYW5pemF0aW9uLlxuICpcbiAqIEBtZXRob2QgTWV0YWRhdGEjcmVhZFxuICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgLSBUaGUgdHlwZSBvZiBtZXRhZGF0YSB0byByZWFkXG4gKiBAcGFyYW0ge1N0cmluZ3xBcnJheS48U3RyaW5nPn0gZnVsbE5hbWVzIC0gZnVsbCBuYW1lKHMpIG9mIG1ldGFkYXRhIG9iamVjdHMgdG8gcmVhZFxuICogQHBhcmFtIHtDYWxsYmFjay48TWV0YWRhdGF+TWV0YWRhdGFJbmZvfEFycmF5LjxNZXRhZGF0YX5NZXRhZGF0YUluZm8+Pn0gW2NhbGxiYWNrXSAtIENhbGxiYWNrIGZ1bmN0aW9uXG4gKiBAcmV0dXJucyB7UHJvbWlzZS48QXJyYXkuPE1ldGFkYXRhfk1ldGFkYXRhSW5mb3xBcnJheS48TWV0YWRhdGF+TWV0YWRhdGFJbmZvPj4+fVxuICovXG5NZXRhZGF0YS5wcm90b3R5cGUucmVhZFN5bmMgPVxuTWV0YWRhdGEucHJvdG90eXBlLnJlYWQgPSBmdW5jdGlvbih0eXBlLCBmdWxsTmFtZXMsIGNhbGxiYWNrKSB7XG4gIHJldHVybiB0aGlzLl9pbnZva2UoXCJyZWFkTWV0YWRhdGFcIiwgeyB0eXBlOiB0eXBlLCBmdWxsTmFtZXM6IGZ1bGxOYW1lcyB9KS50aGVuKGZ1bmN0aW9uKHJlcykge1xuICAgIHJldHVybiBfLmlzQXJyYXkocmVzLnJlY29yZHMpID8gXy5tYXAocmVzLnJlY29yZHMsIGNvbnZlcnRUb01ldGFkYXRhSW5mbykgOiBjb252ZXJ0VG9NZXRhZGF0YUluZm8ocmVzLnJlY29yZHMpO1xuICB9KS50aGVuQ2FsbChjYWxsYmFjayk7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IE1ldGFkYXRhflVwZGF0ZU1ldGFkYXRhSW5mb1xuICogQHByb3Age1N0cmluZ30gY3VycmVudE5hbWUgLSBUaGUgQVBJIG5hbWUgb2YgdGhlIGNvbXBvbmVudCBvciBmaWVsZCBiZWZvcmUgdGhlIHVwZGF0ZVxuICogQHByb3Age01ldGFkYXRhfk1ldGFkYXRhSW5mb30gbWV0YWRhdGEgLSBGdWxsIHNwZWNpZmljYXRpb24gb2YgdGhlIGNvbXBvbmVudCBvciBmaWVsZCB5b3Ugd2lzaCB0byB1cGRhdGVcbiAqL1xuXG4vKipcbiAqIEFzeW5jaHJvbm91c2x5IHVwZGF0ZXMgb25lIG9yIG1vcmUgbWV0YWRhdGEgY29tcG9uZW50cyBpbiB0aGUgb3JnYW5pemF0aW9uLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlIC0gVGhlIHR5cGUgb2YgbWV0YWRhdGEgdG8gdXBkYXRlXG4gKiBAcGFyYW0ge01ldGFkYXRhflVwZGF0ZU1ldGFkYXRhSW5mb3xBcnJheS48TWV0YWRhdGF+VXBkYXRlTWV0YWRhdGFJbmZvPn0gdXBkYXRlTWV0YWRhdGEgLSBVcGRhdGluZyBtZXRhZGF0YVxuICogQHBhcmFtIHtDYWxsYmFjay48TWV0YWRhdGF+QXN5bmNSZXN1bHR8QXJyYXkuPE1ldGFkYXRhfkFzeW5jUmVzdWx0Pj59IFtjYWxsYmFja10gLSBDYWxsYmFjayBmdW5jdGlvblxuICogQHJldHVybnMge01ldGFkYXRhfkFzeW5jUmVzdWx0TG9jYXRvcn1cbiAqL1xuTWV0YWRhdGEucHJvdG90eXBlLnVwZGF0ZUFzeW5jID0gZnVuY3Rpb24odHlwZSwgdXBkYXRlTWV0YWRhdGEsIGNhbGxiYWNrKSB7XG4gIGlmIChOdW1iZXIodGhpcy5fY29ubi52ZXJzaW9uKSA+IDMwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQXN5bmMgbWV0YWRhdGEgQ1JVRCBjYWxscyBhcmUgbm90IHN1cHBvcnRlZCBvbiB2ZXIgMzEuMCBvciBsYXRlci5cIik7XG4gIH1cbiAgdmFyIGNvbnZlcnQgPSBmdW5jdGlvbih1bWQpIHtcbiAgICB1bWQubWV0YWRhdGFbXCJAeHNpOnR5cGVcIl0gPSB0eXBlO1xuICAgIHJldHVybiB1bWQ7XG4gIH07XG4gIHZhciBpc0FycmF5ID0gXy5pc0FycmF5KHVwZGF0ZU1ldGFkYXRhKTtcbiAgdXBkYXRlTWV0YWRhdGEgPSBpc0FycmF5ID8gXy5tYXAodXBkYXRlTWV0YWRhdGEsIGNvbnZlcnQpIDogY29udmVydCh1cGRhdGVNZXRhZGF0YSk7XG4gIHZhciByZXMgPSB0aGlzLl9pbnZva2UoXCJ1cGRhdGVcIiwgeyB1cGRhdGVNZXRhZGF0YTogdXBkYXRlTWV0YWRhdGEgfSk7XG4gIHJldHVybiBuZXcgQXN5bmNSZXN1bHRMb2NhdG9yKHRoaXMsIHJlcywgaXNBcnJheSkudGhlbkNhbGwoY2FsbGJhY2spO1xufTtcblxuLyoqXG4gKiBTeW5vbnltIG9mIE1ldGFkYXRhI3VwZGF0ZSgpLlxuICpcbiAqIEBtZXRob2QgTWV0YWRhdGEjdXBkYXRlU3luY1xuICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgLSBUaGUgdHlwZSBvZiBtZXRhZGF0YSB0byB1cGRhdGVcbiAqIEBwYXJhbSB7TWV0YWRhdGF+TWV0YWRhdGFJbmZvfEFycmF5LjxNZXRhZGF0YX5NZXRhZGF0YUluZm8+fSB1cGRhdGVNZXRhZGF0YSAtIFVwZGF0aW5nIG1ldGFkYXRhXG4gKiBAcGFyYW0ge0NhbGxiYWNrLjxNZXRhZGF0YX5TYXZlUmVzdWx0fEFycmF5LjxNZXRhZGF0YX5TYXZlUmVzdWx0Pj59IFtjYWxsYmFja10gLSBDYWxsYmFjayBmdW5jdGlvblxuICogQHJldHVybnMge1Byb21pc2UuPE1ldGFkYXRhflNhdmVSZXN1bHR8QXJyYXkuPE1ldGFkYXRhflNhdmVSZXN1bHQ+Pn1cbiAqL1xuLyoqXG4gKiBTeW5jaHJvbm91c2x5IHVwZGF0ZXMgb25lIG9yIG1vcmUgbWV0YWRhdGEgY29tcG9uZW50cyBpbiB0aGUgb3JnYW5pemF0aW9uLlxuICpcbiAqIEBtZXRob2QgTWV0YWRhdGEjdXBkYXRlXG4gKiBAcGFyYW0ge1N0cmluZ30gdHlwZSAtIFRoZSB0eXBlIG9mIG1ldGFkYXRhIHRvIHVwZGF0ZVxuICogQHBhcmFtIHtNZXRhZGF0YX5NZXRhZGF0YUluZm98QXJyYXkuPE1ldGFkYXRhfk1ldGFkYXRhSW5mbz59IHVwZGF0ZU1ldGFkYXRhIC0gVXBkYXRpbmcgbWV0YWRhdGFcbiAqIEBwYXJhbSB7Q2FsbGJhY2suPE1ldGFkYXRhflNhdmVSZXN1bHR8QXJyYXkuPE1ldGFkYXRhflNhdmVSZXN1bHQ+Pn0gW2NhbGxiYWNrXSAtIENhbGxiYWNrIGZ1bmN0aW9uXG4gKiBAcmV0dXJucyB7UHJvbWlzZS48TWV0YWRhdGF+U2F2ZVJlc3VsdHxBcnJheS48TWV0YWRhdGF+U2F2ZVJlc3VsdD4+fVxuICovXG5NZXRhZGF0YS5wcm90b3R5cGUudXBkYXRlU3luYyA9XG5NZXRhZGF0YS5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24odHlwZSwgbWV0YWRhdGEsIGNhbGxiYWNrKSB7XG4gIHZhciBjb252ZXJ0ID0gZnVuY3Rpb24obWQpIHtcbiAgICBtZFtcIkB4c2k6dHlwZVwiXSA9IHR5cGU7XG4gICAgcmV0dXJuIG1kO1xuICB9O1xuICB2YXIgaXNBcnJheSA9IF8uaXNBcnJheShtZXRhZGF0YSk7XG4gIG1ldGFkYXRhID0gaXNBcnJheSA/IF8ubWFwKG1ldGFkYXRhLCBjb252ZXJ0KSA6IGNvbnZlcnQobWV0YWRhdGEpO1xuICByZXR1cm4gdGhpcy5faW52b2tlKFwidXBkYXRlTWV0YWRhdGFcIiwgeyBtZXRhZGF0YTogbWV0YWRhdGEgfSkudGhlbihmdW5jdGlvbihyZXN1bHRzKSB7XG4gICAgcmV0dXJuIF8uaXNBcnJheShyZXN1bHRzKSA/IF8ubWFwKHJlc3VsdHMsIGNvbnZlcnRUb1NhdmVSZXN1bHQpIDogY29udmVydFRvU2F2ZVJlc3VsdChyZXN1bHRzKTtcbiAgfSkudGhlbkNhbGwoY2FsbGJhY2spO1xufTtcblxuLyoqXG4gKiBTeW5vbnltIG9mIE1ldGFkYXRhI3Vwc2VydCgpLlxuICpcbiAqIEBtZXRob2QgTWV0YWRhdGEjdXBzZXJ0U3luY1xuICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgLSBUaGUgdHlwZSBvZiBtZXRhZGF0YSB0byB1cHNlcnRcbiAqIEBwYXJhbSB7TWV0YWRhdGF+TWV0YWRhdGFJbmZvfEFycmF5LjxNZXRhZGF0YX5NZXRhZGF0YUluZm8+fSBtZXRhZGF0YSAtIFVwc2VydGluZyBtZXRhZGF0YVxuICogQHBhcmFtIHtDYWxsYmFjay48TWV0YWRhdGF+VXBzZXJ0UmVzdWx0fEFycmF5LjxNZXRhZGF0YX5VcHNlcnRSZXN1bHQ+Pn0gW2NhbGxiYWNrXSAtIENhbGxiYWNrIGZ1bmN0aW9uXG4gKiBAcmV0dXJucyB7UHJvbWlzZS48TWV0YWRhdGF+VXBzZXJ0UmVzdWx0fEFycmF5LjxNZXRhZGF0YX5VcHNlcnRSZXN1bHQ+Pn1cbiAqL1xuLyoqXG4gKiBVcHNlcnRzIG9uZSBvciBtb3JlIGNvbXBvbmVudHMgaW4geW91ciBvcmdhbml6YXRpb24ncyBkYXRhLlxuICpcbiAqIEBtZXRob2QgTWV0YWRhdGEjdXBzZXJ0XG4gKiBAcGFyYW0ge1N0cmluZ30gdHlwZSAtIFRoZSB0eXBlIG9mIG1ldGFkYXRhIHRvIHVwc2VydFxuICogQHBhcmFtIHtNZXRhZGF0YX5NZXRhZGF0YUluZm98QXJyYXkuPE1ldGFkYXRhfk1ldGFkYXRhSW5mbz59IG1ldGFkYXRhIC0gVXBzZXJ0aW5nIG1ldGFkYXRhXG4gKiBAcGFyYW0ge0NhbGxiYWNrLjxNZXRhZGF0YX5VcHNlcnRSZXN1bHR8QXJyYXkuPE1ldGFkYXRhflVwc2VydFJlc3VsdD4+fSBbY2FsbGJhY2tdIC0gQ2FsbGJhY2sgZnVuY3Rpb25cbiAqIEByZXR1cm5zIHtQcm9taXNlLjxNZXRhZGF0YX5VcHNlcnRSZXN1bHR8QXJyYXkuPE1ldGFkYXRhflVwc2VydFJlc3VsdD4+fVxuICovXG5NZXRhZGF0YS5wcm90b3R5cGUudXBzZXJ0U3luYyA9XG5NZXRhZGF0YS5wcm90b3R5cGUudXBzZXJ0ID0gZnVuY3Rpb24odHlwZSwgbWV0YWRhdGEsIGNhbGxiYWNrKSB7XG4gIHZhciBjb252ZXJ0ID0gZnVuY3Rpb24obWQpIHtcbiAgICBtZFtcIkB4c2k6dHlwZVwiXSA9IHR5cGU7XG4gICAgcmV0dXJuIG1kO1xuICB9O1xuICB2YXIgaXNBcnJheSA9IF8uaXNBcnJheShtZXRhZGF0YSk7XG4gIG1ldGFkYXRhID0gaXNBcnJheSA/IF8ubWFwKG1ldGFkYXRhLCBjb252ZXJ0KSA6IGNvbnZlcnQobWV0YWRhdGEpO1xuICByZXR1cm4gdGhpcy5faW52b2tlKFwidXBzZXJ0TWV0YWRhdGFcIiwgeyBtZXRhZGF0YTogbWV0YWRhdGEgfSkudGhlbihmdW5jdGlvbihyZXN1bHRzKSB7XG4gICAgcmV0dXJuIF8uaXNBcnJheShyZXN1bHRzKSA/IF8ubWFwKHJlc3VsdHMsIGNvbnZlcnRUb1Vwc2VydFJlc3VsdCkgOiBjb252ZXJ0VG9VcHNlcnRSZXN1bHQocmVzdWx0cyk7XG4gIH0pLnRoZW5DYWxsKGNhbGxiYWNrKTtcbn07XG5cbi8qKlxuICogQXN5bmNocm9ub3VzbHkgZGVsZXRlcyBzcGVjaWZpZWQgbWV0YWRhdGEgY29tcG9uZW50cyBpbiB0aGUgb3JnYW5pemF0aW9uLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlIC0gVGhlIHR5cGUgb2YgbWV0YWRhdGEgdG8gZGVsZXRlXG4gKiBAcGFyYW0ge1N0cmluZ3xNZXRhZGF0YX5NZXRhZGF0YUluZm98QXJyYXkuPFN0cmluZz58QXJyYXkuPE1ldGFkYXRhfk1ldGFkYXRhSW5mbz59IG1ldGFkYXRhIC0gVGhlIGZ1bGxOYW1lIG9mIG1ldGFkYXRhIG9yIG1ldGFkYXRhIGluZm8gdG8gZGVsZXRlLiBJZiBpdCBpcyBwYXNzZWQgaW4gZnVsbE5hbWUsIHRoZSB0eXBlIHBhcmFtZXRlciBzaG91bGQgbm90IGJlIGVtcHR5LlxuICogQHBhcmFtIHtDYWxsYmFjay48TWV0YWRhdGF+QXN5bmNSZXN1bHR8QXJyYXkuPE1ldGFkYXRhfkFzeW5jUmVzdWx0Pj59IFtjYWxsYmFja10gLSBDYWxsYmFjayBmdW5jdGlvblxuICogQHJldHVybnMge01ldGFkYXRhfkFzeW5jUmVzdWx0TG9jYXRvcn1cbiAqL1xuTWV0YWRhdGEucHJvdG90eXBlLmRlbGV0ZUFzeW5jID0gZnVuY3Rpb24odHlwZSwgbWV0YWRhdGEsIGNhbGxiYWNrKSB7XG4gIGlmIChOdW1iZXIodGhpcy5fY29ubi52ZXJzaW9uKSA+IDMwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQXN5bmMgbWV0YWRhdGEgQ1JVRCBjYWxscyBhcmUgbm90IHN1cHBvcnRlZCBvbiB2ZXIgMzEuMCBvciBsYXRlci5cIik7XG4gIH1cbiAgdmFyIGNvbnZlcnQgPSBmdW5jdGlvbihtZCkge1xuICAgIGlmIChfLmlzU3RyaW5nKG1kKSkge1xuICAgICAgbWQgPSB7IGZ1bGxOYW1lIDogbWQgfTtcbiAgICB9XG4gICAgbWRbXCJAeHNpOnR5cGVcIl0gPSB0eXBlO1xuICAgIHJldHVybiBtZDtcbiAgfTtcbiAgdmFyIGlzQXJyYXkgPSBfLmlzQXJyYXkobWV0YWRhdGEpO1xuICBtZXRhZGF0YSA9IGlzQXJyYXkgPyBfLm1hcChtZXRhZGF0YSwgY29udmVydCkgOiBjb252ZXJ0KG1ldGFkYXRhKTtcbiAgdmFyIHJlcyA9IHRoaXMuX2ludm9rZShcImRlbGV0ZVwiLCB7IG1ldGFkYXRhOiBtZXRhZGF0YSB9KTtcbiAgcmV0dXJuIG5ldyBBc3luY1Jlc3VsdExvY2F0b3IodGhpcywgcmVzLCBpc0FycmF5KS50aGVuQ2FsbChjYWxsYmFjayk7XG59O1xuXG4vKipcbiAqIFN5bm9ueW0gb2YgTWV0YWRhdGEjZGVsZXRlKCkuXG4gKlxuICogQGRlcHJlY2F0ZWRcbiAqIEBtZXRob2QgTWV0YWRhdGEjZGVsXG4gKiBAcGFyYW0ge1N0cmluZ30gW3R5cGVdIC0gVGhlIHR5cGUgb2YgbWV0YWRhdGEgdG8gZGVsZXRlXG4gKiBAcGFyYW0ge1N0cmluZ3xNZXRhZGF0YX5NZXRhZGF0YUluZm98QXJyYXkuPFN0cmluZz58QXJyYXkuPE1ldGFkYXRhfk1ldGFkYXRhSW5mbz59IG1ldGFkYXRhIC0gVGhlIGZ1bGxOYW1lIG9mIG1ldGFkYXRhIG9yIG1ldGFkYXRhIGluZm8gdG8gZGVsZXRlLiBJZiBpdCBpcyBwYXNzZWQgaW4gZnVsbE5hbWUsIHRoZSB0eXBlIHBhcmFtZXRlciBzaG91bGQgbm90IGJlIGVtcHR5LlxuICogQHBhcmFtIHtDYWxsYmFjay48TWV0YWRhdGF+QXN5bmNSZXN1bHR8QXJyYXkuPE1ldGFkYXRhfkFzeW5jUmVzdWx0Pj59IFtjYWxsYmFja10gLSBDYWxsYmFjayBmdW5jdGlvblxuICogQHJldHVybnMge01ldGFkYXRhfkFzeW5jUmVzdWx0TG9jYXRvcn1cbiAqL1xuLyoqXG4gKiBTeW5vbnltIG9mIE1ldGFkYXRhI2RlbGV0ZSgpLlxuICpcbiAqIEBtZXRob2QgTWV0YWRhdGEjZGVsZXRlU3luY1xuICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgLSBUaGUgdHlwZSBvZiBtZXRhZGF0YSB0byBkZWxldGVcbiAqIEBwYXJhbSB7U3RyaW5nfEFycmF5LjxTdHJpbmc+fSBmdWxsTmFtZXMgLSBUaGUgZnVsbE5hbWUgb2YgbWV0YWRhdGEgdG8gZGVsZXRlLlxuICogQHBhcmFtIHtDYWxsYmFjay48TWV0YWRhdGF+U2F2ZVJlc3VsdHxBcnJheS48TWV0YWRhdGF+U2F2ZVJlc3VsdD4+fSBbY2FsbGJhY2tdIC0gQ2FsbGJhY2sgZnVuY3Rpb25cbiAqIEByZXR1cm5zIHtQcm9taXNlLjxNZXRhZGF0YX5TYXZlUmVzdWx0fEFycmF5LjxNZXRhZGF0YX5TYXZlUmVzdWx0Pj59XG4gKi9cblxuLyoqXG4gKiBTeW5jaHJvbm91c2x5IGRlbGV0ZXMgc3BlY2lmaWVkIG1ldGFkYXRhIGNvbXBvbmVudHMgaW4gdGhlIG9yZ2FuaXphdGlvbi5cbiAqXG4gKiBAbWV0aG9kIE1ldGFkYXRhI2RlbGV0ZVxuICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgLSBUaGUgdHlwZSBvZiBtZXRhZGF0YSB0byBkZWxldGVcbiAqIEBwYXJhbSB7U3RyaW5nfEFycmF5LjxTdHJpbmc+fSBmdWxsTmFtZXMgLSBUaGUgZnVsbE5hbWUgb2YgbWV0YWRhdGEgdG8gZGVsZXRlLlxuICogQHBhcmFtIHtDYWxsYmFjay48TWV0YWRhdGF+U2F2ZVJlc3VsdHxBcnJheS48TWV0YWRhdGF+U2F2ZVJlc3VsdD4+fSBbY2FsbGJhY2tdIC0gQ2FsbGJhY2sgZnVuY3Rpb25cbiAqIEByZXR1cm5zIHtQcm9taXNlLjxNZXRhZGF0YX5TYXZlUmVzdWx0fEFycmF5LjxNZXRhZGF0YX5TYXZlUmVzdWx0Pj59XG4gKi9cbk1ldGFkYXRhLnByb3RvdHlwZS5kZWwgPVxuTWV0YWRhdGEucHJvdG90eXBlLmRlbGV0ZVN5bmMgPVxuTWV0YWRhdGEucHJvdG90eXBlW1wiZGVsZXRlXCJdID0gZnVuY3Rpb24odHlwZSwgZnVsbE5hbWVzLCBjYWxsYmFjaykge1xuICByZXR1cm4gdGhpcy5faW52b2tlKFwiZGVsZXRlTWV0YWRhdGFcIiwgeyB0eXBlOiB0eXBlLCBmdWxsTmFtZXM6IGZ1bGxOYW1lcyB9KS50aGVuKGZ1bmN0aW9uKHJlc3VsdHMpIHtcbiAgICByZXR1cm4gXy5pc0FycmF5KHJlc3VsdHMpID8gXy5tYXAocmVzdWx0cywgY29udmVydFRvU2F2ZVJlc3VsdCkgOiBjb252ZXJ0VG9TYXZlUmVzdWx0KHJlc3VsdHMpO1xuICB9KS50aGVuQ2FsbChjYWxsYmFjayk7XG59O1xuXG4vKipcbiAqIFJlbmFtZSBmdWxsbmFtZSBvZiBhIG1ldGFkYXRhIGNvbXBvbmVudCBpbiB0aGUgb3JnYW5pemF0aW9uXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgLSBUaGUgdHlwZSBvZiBtZXRhZGF0YSB0byBkZWxldGVcbiAqIEBwYXJhbSB7U3RyaW5nfSBvbGRGdWxsTmFtZSAtIFRoZSBvcmlnaW5hbCBmdWxsTmFtZSBvZiBtZXRhZGF0YVxuICogQHBhcmFtIHtTdHJpbmd9IG5ld0Z1bGxOYW1lIC0gVGhlIG5ldyBmdWxsTmFtZSBvZiBtZXRhZGF0YVxuICogQHBhcmFtIHtDYWxsYmFjay48TWV0YWRhdGF+U2F2ZVJlc3VsdD59IFtjYWxsYmFja10gLSBDYWxsYmFjayBmdW5jdGlvblxuICogQHJldHVybnMge1Byb21pc2UuPE1ldGFkYXRhflNhdmVSZXN1bHQ+fVxuICovXG5NZXRhZGF0YS5wcm90b3R5cGUucmVuYW1lID0gZnVuY3Rpb24odHlwZSwgb2xkRnVsbE5hbWUsIG5ld0Z1bGxOYW1lLCBjYWxsYmFjaykge1xuICByZXR1cm4gdGhpcy5faW52b2tlKFwicmVuYW1lTWV0YWRhdGFcIiwgeyB0eXBlOiB0eXBlLCBvbGRGdWxsTmFtZTogb2xkRnVsbE5hbWUsIG5ld0Z1bGxOYW1lOiBuZXdGdWxsTmFtZSB9KS50aGVuKGZ1bmN0aW9uKHJlc3VsdCkge1xuICAgIHJldHVybiBjb252ZXJ0VG9TYXZlUmVzdWx0KHJlc3VsdCk7XG4gIH0pLnRoZW5DYWxsKGNhbGxiYWNrKTtcbn07XG5cbi8qKlxuICogQ2hlY2tzIHRoZSBzdGF0dXMgb2YgYXN5bmNocm9ub3VzIG1ldGFkYXRhIGNhbGxzXG4gKlxuICogQHBhcmFtIHtTdHJpbmd8QXJyYXkuPFN0cmluZz59IGlkcyAtIFRoZSBhc3luY2hyb25vdXMgcHJvY2VzcyBJRChzKVxuICogQHBhcmFtIHtDYWxsYmFjay48TWV0YWRhdGF+QXN5bmNSZXN1bHR8QXJyYXkuPE1ldGFkYXRhfkFzeW5jUmVzdWx0Pj59IFtjYWxsYmFja10gLSBDYWxsYmFjayBmdW5jdGlvblxuICogQHJldHVybnMge01ldGFkYXRhfkFzeW5jUmVzdWx0TG9jYXRvcn1cbiAqL1xuTWV0YWRhdGEucHJvdG90eXBlLmNoZWNrU3RhdHVzID0gZnVuY3Rpb24oaWRzLCBjYWxsYmFjaykge1xuICB2YXIgaXNBcnJheSA9IF8uaXNBcnJheShpZHMpO1xuICB2YXIgcmVzID0gdGhpcy5faW52b2tlKFwiY2hlY2tTdGF0dXNcIiwgeyBhc3luY1Byb2Nlc3NJZDogaWRzIH0pO1xuICByZXR1cm4gbmV3IEFzeW5jUmVzdWx0TG9jYXRvcih0aGlzLCByZXMsIGlzQXJyYXkpLnRoZW5DYWxsKGNhbGxiYWNrKTtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gTWV0YWRhdGF+RGVzY3JpYmVNZXRhZGF0YVJlc3VsdFxuICogQHByb3Age0FycmF5LjxPYmplY3Q+fSBtZXRhZGF0YU9iamVjdHMgLSBPbmUgb3IgbW9yZSBtZXRhZGF0YSBjb21wb25lbnRzIGFuZCB0aGVpciBhdHRyaWJ1dGVzXG4gKiBAcHJvcCB7QXJyYXkuPFN0cmluZz59IG1ldGFkYXRhT2JqZWN0cy5jaGlsZFhtbE5hbWVzIC0gTGlzdCBvZiBjaGlsZCBzdWItY29tcG9uZW50cyBmb3IgdGhpcyBjb21wb25lbnRcbiAqIEBwcm9wIHtTdHJpbmd9IG1ldGFkYXRhT2JqZWN0cy5kaXJlY3RvcnlOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGRpcmVjdG9yeSBpbiB0aGUgLnppcCBmaWxlIHRoYXQgY29udGFpbnMgdGhpcyBjb21wb25lbnRcbiAqIEBwcm9wIHtCb29sZWFufSBtZXRhZGF0YU9iamVjdHMuaW5Gb2xkZXIgLSBJbmRpY2F0ZXMgd2hldGhlciB0aGUgY29tcG9uZW50IGlzIGluIGEgZm9sZGVyIG9yIG5vdFxuICogQHByb3Age0Jvb2xlYW59IG1ldGFkYXRhT2JqZWN0cy5tZXRhRmlsZSAtIEluZGljYXRlcyB3aGV0aGVyIHRoZSBjb21wb25lbnQgcmVxdWlyZXMgYW4gYWNjb21wYW55aW5nIG1ldGFkYXRhIGZpbGVcbiAqIEBwcm9wIHtTdHJpbmd9IG1ldGFkYXRhT2JqZWN0cy5zdWZmaXggLSBUaGUgZmlsZSBzdWZmaXggZm9yIHRoaXMgY29tcG9uZW50XG4gKiBAcHJvcCB7U3RyaW5nfSBtZXRhZGF0YU9iamVjdHMueG1sTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSByb290IGVsZW1lbnQgaW4gdGhlIG1ldGFkYXRhIGZpbGUgZm9yIHRoaXMgY29tcG9uZW50XG4gKiBAcHJvcCB7U3RyaW5nfSBvcmdhbml6YXRpb25OYW1lc3BhY2UgLSBUaGUgbmFtZXNwYWNlIG9mIHRoZSBvcmdhbml6YXRpb25cbiAqIEBwcm9wIHtCb29sZWFufSBwYXJ0aWFsU2F2ZUFsbG93ZWQgLSBJbmRpY2F0ZXMgd2hldGhlciByb2xsYmFja09uRXJyb3IgaXMgYWxsb3dlZCBvciBub3RcbiAqIEBwcm9wIHtCb29sZWFufSB0ZXN0UmVxdWlyZWQgLSBJbmRpY2F0ZXMgd2hldGhlciB0ZXN0cyBhcmUgcmVxdWlyZWQgb3Igbm90XG4gKi9cblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIG1ldGFkYXRhIHdoaWNoIGRlc2NyaWJlcyB5b3VyIG9yZ2FuaXphdGlvbiwgaW5jbHVkaW5nIEFwZXggY2xhc3NlcyBhbmQgdHJpZ2dlcnMsXG4gKiBjdXN0b20gb2JqZWN0cywgY3VzdG9tIGZpZWxkcyBvbiBzdGFuZGFyZCBvYmplY3RzLCB0YWIgc2V0cyB0aGF0IGRlZmluZSBhbiBhcHAsXG4gKiBhbmQgbWFueSBvdGhlciBjb21wb25lbnRzLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBbdmVyc2lvbl0gLSBUaGUgQVBJIHZlcnNpb24gZm9yIHdoaWNoIHlvdSB3YW50IG1ldGFkYXRhOyBmb3IgZXhhbXBsZSwgMjkuMFxuICogQHBhcmFtIHtDYWxsYmFjay48TWV0YWRhdGF+RGVzY3JpYmVNZXRhZGF0YVJlc3VsdD59IFtjYWxsYmFja10gLSBDYWxsYmFjayBmdW5jdGlvblxuICogQHJldHVybnMge1Byb21pc2UuPE1ldGFkYXRhfkRlc2NyaWJlTWV0YWRhdGFSZXN1bHQ+fVxuICovXG5NZXRhZGF0YS5wcm90b3R5cGUuZGVzY3JpYmUgPSBmdW5jdGlvbih2ZXJzaW9uLCBjYWxsYmFjaykge1xuICBpZiAoIV8uaXNTdHJpbmcodmVyc2lvbikpIHtcbiAgICBjYWxsYmFjayA9IHZlcnNpb247XG4gICAgdmVyc2lvbiA9IHRoaXMuX2Nvbm4udmVyc2lvbjtcbiAgfVxuICByZXR1cm4gdGhpcy5faW52b2tlKFwiZGVzY3JpYmVNZXRhZGF0YVwiLCB7IGFzT2ZWZXJzaW9uOiB2ZXJzaW9uIH0pLnRoZW4oZnVuY3Rpb24ocmVzKSB7XG4gICAgcmVzLm1ldGFkYXRhT2JqZWN0cyA9IF8uaXNBcnJheShyZXMubWV0YWRhdGFPYmplY3RzKSA/IHJlcy5tZXRhZGF0YU9iamVjdHMgOiBbIHJlcy5tZXRhZGF0YU9iamVjdHMgXTtcbiAgICByZXMubWV0YWRhdGFPYmplY3RzID0gXy5tYXAocmVzLm1ldGFkYXRhT2JqZWN0cywgZnVuY3Rpb24obW8pIHtcbiAgICAgIGlmIChtby5jaGlsZFhtbE5hbWVzKSB7XG4gICAgICAgIG1vLmNoaWxkWG1sTmFtZXMgPSBfLmlzQXJyYXkobW8uY2hpbGRYbWxOYW1lcykgPyBtby5jaGlsZFhtbE5hbWVzOiBbIG1vLmNoaWxkWG1sTmFtZXMgXTtcbiAgICAgIH1cbiAgICAgIG1vLmluRm9sZGVyID0gbW8uaW5Gb2xkZXIgPT09ICd0cnVlJztcbiAgICAgIG1vLm1ldGFGaWxlID0gbW8ubWV0YUZpbGUgPT09ICd0cnVlJztcbiAgICAgIHJldHVybiBtbztcbiAgICB9KTtcbiAgICByZXMucGFydGlhbFNhdmVBbGxvd2VkID0gcmVzLnBhcnRpYWxTYXZlQWxsb3dlZCA9PT0gJ3RydWUnO1xuICAgIHJlcy50ZXN0UmVxdWlyZWQgPSByZXMudGVzdFJlcXVpcmVkID09PSAndHJ1ZSc7XG4gICAgcmV0dXJuIHJlcztcbiAgfSkudGhlbkNhbGwoY2FsbGJhY2spO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBNZXRhZGF0YX5MaXN0TWV0YWRhdGFRdWVyeVxuICogQHByb3Age1N0cmluZ30gdHlwZSAtIFRoZSBtZXRhZGF0YSB0eXBlLCBzdWNoIGFzIEN1c3RvbU9iamVjdCwgQ3VzdG9tRmllbGQsIG9yIEFwZXhDbGFzc1xuICogQHByb3Age1N0cmluZ30gW2ZvbGRlcl0gLSBUaGUgZm9sZGVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgY29tcG9uZW50LlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gTWV0YWRhdGF+RmlsZVByb3BlcnRpZXNcbiAqIEBwcm9wIHtTdHJpbmd9IHR5cGUgLSBUaGUgbWV0YWRhdGEgdHlwZSwgc3VjaCBhcyBDdXN0b21PYmplY3QsIEN1c3RvbUZpZWxkLCBvciBBcGV4Q2xhc3NcbiAqIEBwcm9wIHtTdHJpbmd9IGNyZWF0ZWRCeUlkIC0gSUQgb2YgdGhlIHVzZXIgd2hvIGNyZWF0ZWQgdGhlIGZpbGVcbiAqIEBwcm9wIHtTdHJpbmd9IGNyZWF0ZWRCeU5hbWUgLSBOYW1lIG9mIHRoZSB1c2VyIHdobyBjcmVhdGVkIHRoZSBmaWxlXG4gKiBAcHJvcCB7U3RyaW5nfSBjcmVhdGVkRGF0ZSAtIERhdGUgYW5kIHRpbWUgd2hlbiB0aGUgZmlsZSB3YXMgY3JlYXRlZFxuICogQHByb3Age1N0cmluZ30gZmlsZU5hbWUgLSBOYW1lIG9mIHRoZSBmaWxlXG4gKiBAcHJvcCB7U3RyaW5nfSBmdWxsTmFtZSAtIFRoZSBmaWxlIGRldmVsb3BlciBuYW1lIHVzZWQgYXMgYSB1bmlxdWUgaWRlbnRpZmllciBmb3IgQVBJIGFjY2Vzc1xuICogQHByb3Age1N0cmluZ30gaWQgLSBJRCBvZiB0aGUgZmlsZVxuICogQHByb3Age1N0cmluZ30gbGFzdE1vZGlmaWVkQnlJZCAtIElEIG9mIHRoZSB1c2VyIHdobyBsYXN0IG1vZGlmaWVkIHRoZSBmaWxlXG4gKiBAcHJvcCB7U3RyaW5nfSBsYXN0TW9kaWZpZWRCeU5hbWUgLSBOYW1lIG9mIHRoZSB1c2VyIHdobyBsYXN0IG1vZGlmaWVkIHRoZSBmaWxlXG4gKiBAcHJvcCB7U3RyaW5nfSBsYXN0TW9kaWZpZWREYXRlIC0gRGF0ZSBhbmQgdGltZSB0aGF0IHRoZSBmaWxlIHdhcyBsYXN0IG1vZGlmaWVkXG4gKiBAcHJvcCB7U3RyaW5nfSBbbWFuYWdlYWJsZVN0YXRlXSAtIEluZGljYXRlcyB0aGUgbWFuYWdlYWJsZSBzdGF0ZSBvZiB0aGUgc3BlY2lmaWVkIGNvbXBvbmVudCBpZiBpdCBpcyBjb250YWluZWQgaW4gYSBwYWNrYWdlXG4gKiBAcHJvcCB7U3RyaW5nfSBbbmFtZXNwYWNlUHJlZml4XSAtIFRoZSBuYW1lc3BhY2UgcHJlZml4IG9mIHRoZSBjb21wb25lbnRcbiAqL1xuXG4vKipcbiAqIFJldHJpZXZlcyBwcm9wZXJ0eSBpbmZvcm1hdGlvbiBhYm91dCBtZXRhZGF0YSBjb21wb25lbnRzIGluIHlvdXIgb3JnYW5pemF0aW9uXG4gKlxuICogQHBhcmFtIHtNZXRhZGF0YX5MaXN0TWV0YWRhdGFRdWVyeXxBcnJheS48TWV0YWRhdGF+TGlzdE1ldGFkYXRhUXVlcnk+fSBxdWVyaWVzIC0gVGhlIGNyaXRlcmlhIG9iamVjdChzKSBzcGVjaWZpbmcgbWV0YWRhdGEgdG8gbGlzdFxuICogQHBhcmFtIHtTdHJpbmd9IFt2ZXJzaW9uXSAtIFRoZSBBUEkgdmVyc2lvbiBmb3Igd2hpY2ggeW91IHdhbnQgbWV0YWRhdGE7IGZvciBleGFtcGxlLCAyOS4wXG4gKiBAcGFyYW0ge0NhbGxiYWNrLjxBcnJheS48TWV0YWRhdGF+RmlsZVByb3BlcnRpZXM+Pn0gW2NhbGxiYWNrXSAtIENhbGxiYWNrIGZ1bmN0aW9uXG4gKiBAcmV0dXJucyB7UHJvbWlzZS48QXJyYXkuPE1ldGFkYXRhfkZpbGVQcm9wZXJ0aWVzPj59XG4gKi9cbk1ldGFkYXRhLnByb3RvdHlwZS5saXN0ID0gZnVuY3Rpb24ocXVlcmllcywgdmVyc2lvbiwgY2FsbGJhY2spIHtcbiAgaWYgKCFfLmlzU3RyaW5nKHZlcnNpb24pKSB7XG4gICAgY2FsbGJhY2sgPSB2ZXJzaW9uO1xuICAgIHZlcnNpb24gPSB0aGlzLl9jb25uLnZlcnNpb247XG4gIH1cbiAgaWYgKCFfLmlzQXJyYXkocXVlcmllcykpIHtcbiAgICBxdWVyaWVzID0gWyBxdWVyaWVzIF07XG4gIH1cbiAgcmV0dXJuIHRoaXMuX2ludm9rZShcImxpc3RNZXRhZGF0YVwiLCB7IHF1ZXJpZXM6IHF1ZXJpZXMsIGFzT2ZWZXJzaW9uOiB2ZXJzaW9uIH0sIGNhbGxiYWNrKTtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gTWV0YWRhdGF+UmV0cmlldmVSZXF1ZXN0XG4gKi9cblxuLyoqXG4gKiBSZXRyaWV2ZXMgWE1MIGZpbGUgcmVwcmVzZW50YXRpb25zIG9mIGNvbXBvbmVudHMgaW4gYW4gb3JnYW5pemF0aW9uXG4gKlxuICogQHBhcmFtIHtNZXRhZGF0YX5SZXRyaWV2ZVJlcXVlc3R9IHJlcXVlc3QgLSBPcHRpb25zIGZvciBkZXRlcm1pbmluZyB3aGljaCBwYWNrYWdlcyBvciBmaWxlcyBhcmUgcmV0cmlldmVkXG4gKiBAcGFyYW0ge0NhbGxiYWNrLjxNZXRhZGF0YX5Bc3luY1Jlc3VsdD59IFtjYWxsYmFja10gLSBDYWxsYmFjayBmdW5jdGlvblxuICogQHJldHVybnMge01ldGFkYXRhflJldHJpZXZlUmVzdWx0TG9jYXRvcn1cbiAqL1xuTWV0YWRhdGEucHJvdG90eXBlLnJldHJpZXZlID0gZnVuY3Rpb24ocmVxdWVzdCwgY2FsbGJhY2spIHtcbiAgdmFyIHJlcyA9IHRoaXMuX2ludm9rZShcInJldHJpZXZlXCIsIHsgcmVxdWVzdDogcmVxdWVzdCB9KTtcbiAgcmV0dXJuIG5ldyBSZXRyaWV2ZVJlc3VsdExvY2F0b3IodGhpcywgcmVzKS50aGVuQ2FsbChjYWxsYmFjayk7XG59O1xuXG4vKipcbiAqIENoZWNrcyB0aGUgc3RhdHVzIG9mIGRlY2xhcmF0aXZlIG1ldGFkYXRhIGNhbGwgcmV0cmlldmUoKSBhbmQgcmV0dXJucyB0aGUgemlwIGZpbGUgY29udGVudHNcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gaWQgLSBBc3luYyBwcm9jZXNzIGlkIHJldHVybmVkIGZyb20gcHJldmlvdXMgcmV0cmlldmUgcmVxdWVzdFxuICogQHBhcmFtIHtDYWxsYmFjay48TWV0YWRhdGF+UmV0cmlldmVSZXN1bHQ+fSBbY2FsbGJhY2tdIC0gQ2FsbGJhY2sgZnVuY3Rpb25cbiAqIEByZXR1cm5zIHtQcm9taXNlLjxNZXRhZGF0YX5SZXRyaWV2ZVJlc3VsdD59XG4gKi9cbk1ldGFkYXRhLnByb3RvdHlwZS5jaGVja1JldHJpZXZlU3RhdHVzID0gZnVuY3Rpb24oaWQsIGNhbGxiYWNrKSB7XG4gIHJldHVybiB0aGlzLl9pbnZva2UoXCJjaGVja1JldHJpZXZlU3RhdHVzXCIsIHsgYXN5bmNQcm9jZXNzSWQ6IGlkIH0sIGNhbGxiYWNrKTtcbn07XG5cbi8qKlxuICogRGVwbG95IGNvbXBvbmVudHMgaW50byBhbiBvcmdhbml6YXRpb24gdXNpbmcgemlwcGVkIGZpbGUgcmVwcmVzZW50YXRpb25zXG4gKlxuICogQHBhcmFtIHtzdHJlYW0uU3RyZWFtfEJ1ZmZlcnxTdHJpbmd9IHppcElucHV0IC0gWmlwcGVkIGZpbGUgaW5wdXQgc291cmNlIGluIHJlYWRhYmxlIHN0cmVhbSwgYmluYXJ5IGJ1ZmZlciBvciBCYXNlNjQtZW5jb2RlZCBzdHJpbmdcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gLSBPcHRpb25zIHVzZWQgaW4gZGVwbG95bWVudFxuICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5hbGxvd01pc3NpbmdGaWxlc10gLSBTcGVjaWZpZXMgd2hldGhlciBhIGRlcGxveSBzdWNjZWVkcyBldmVuIGlmIGZpbGVzIHRoYXQgYXJlIHNwZWNpZmllZCBpbiBwYWNrYWdlLnhtbCBidXQgYXJlIG5vdCBpbiB0aGUgLnppcCBmaWxlIG9yIG5vdC5cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuYXV0b1VwZGF0ZVBhY2thZ2VdIC0gSWYgYSBmaWxlIGlzIGluIHRoZSAuemlwIGZpbGUgYnV0IG5vdCBzcGVjaWZpZWQgaW4gcGFja2FnZS54bWwsIHNwZWNpZmllcyB3aGV0aGVyIHRoZSBmaWxlIHNob3VsZCBiZSBhdXRvbWF0aWNhbGx5IGFkZGVkIHRvIHRoZSBwYWNrYWdlIG9yIG5vdC5cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuY2hlY2tPbmx5XSAtIEluZGljYXRlcyB3aGV0aGVyIEFwZXggY2xhc3NlcyBhbmQgdHJpZ2dlcnMgYXJlIHNhdmVkIHRvIHRoZSBvcmdhbml6YXRpb24gYXMgcGFydCBvZiB0aGUgZGVwbG95bWVudCAoZmFsc2UpIG9yIG5vdCAodHJ1ZSkuXG4gKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmlnbm9yZVdhcm5pbmdzXSAtIEluZGljYXRlcyB3aGV0aGVyIGEgd2FybmluZyBzaG91bGQgYWxsb3cgYSBkZXBsb3ltZW50IHRvIGNvbXBsZXRlIHN1Y2Nlc3NmdWxseSAodHJ1ZSkgb3Igbm90IChmYWxzZSkuIERlZmF1bHRzIHRvIGZhbHNlLlxuICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5wZXJmb3JtUmV0cmlldmVdIC0gSW5kaWNhdGVzIHdoZXRoZXIgYSByZXRyaWV2ZSgpIGNhbGwgaXMgcGVyZm9ybWVkIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBkZXBsb3ltZW50ICh0cnVlKSBvciBub3QgKGZhbHNlKS5cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMucHVyZ2VPbkRlbGV0ZV0gLSBJZiB0cnVlLCB0aGUgZGVsZXRlZCBjb21wb25lbnRzIGluIHRoZSBkZXN0cnVjdGl2ZUNoYW5nZXMueG1sIG1hbmlmZXN0IGZpbGUgYXJlbid0IHN0b3JlZCBpbiB0aGUgUmVjeWNsZSBCaW4uXG4gKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLnJvbGxiYWNrT25FcnJvcl0gLSBJbmRpY2F0ZXMgd2hldGhlciBhbnkgZmFpbHVyZSBjYXVzZXMgYSBjb21wbGV0ZSByb2xsYmFjayAodHJ1ZSkgb3Igbm90IChmYWxzZSkuXG4gKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLnJ1bkFsbFRlc3RzXSAtIElmIHRydWUsIGFsbCBBcGV4IHRlc3RzIGRlZmluZWQgaW4gdGhlIG9yZ2FuaXphdGlvbiBhcmUgcnVuLlxuICogQHBhcmFtIHtBcnJheS48U3RyaW5nPn0gW29wdGlvbnMucnVuVGVzdHNdIC0gQSBsaXN0IG9mIEFwZXggdGVzdHMgdG8gYmUgcnVuIGR1cmluZyBkZXBsb3ltZW50LlxuICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5zaW5nbGVQYWNrYWdlXSAtIEluZGljYXRlcyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgLnppcCBmaWxlIHBvaW50cyB0byBhIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgd2l0aCBhIHNpbmdsZSBwYWNrYWdlICh0cnVlKSBvciBhIHNldCBvZiBwYWNrYWdlcyAoZmFsc2UpLlxuICogQHBhcmFtIHtDYWxsYmFjay48TWV0YWRhdGF+QXN5bmNSZXN1bHQ+fSBbY2FsbGJhY2tdIC0gQ2FsbGJhY2sgZnVuY3Rpb25cbiAqIEByZXR1cm5zIHtNZXRhZGF0YX5EZXBsb3lSZXN1bHRMb2NhdG9yfVxuICovXG5NZXRhZGF0YS5wcm90b3R5cGUuZGVwbG95ID0gZnVuY3Rpb24oemlwSW5wdXQsIG9wdGlvbnMsIGNhbGxiYWNrKSB7XG4gIGlmICghb3B0aW9ucyB8fCBfLmlzRnVuY3Rpb24ob3B0aW9ucykpIHtcbiAgICBjYWxsYmFjayA9IG9wdGlvbnM7XG4gICAgb3B0aW9ucyA9IHt9O1xuICB9XG4gIHZhciBkZWZlcnJlZCA9IFByb21pc2UuZGVmZXIoKTtcbiAgaWYgKF8uaXNPYmplY3QoemlwSW5wdXQpICYmIF8uaXNGdW5jdGlvbih6aXBJbnB1dC5waXBlKSkge1xuICAgIHZhciBidWZzID0gW107XG4gICAgemlwSW5wdXQub24oJ2RhdGEnLCBmdW5jdGlvbihkKSB7XG4gICAgICBidWZzLnB1c2goZCk7XG4gICAgfSk7XG4gICAgemlwSW5wdXQub24oJ2VuZCcsIGZ1bmN0aW9uKCkge1xuICAgICAgZGVmZXJyZWQucmVzb2x2ZShCdWZmZXIuY29uY2F0KGJ1ZnMpLnRvU3RyaW5nKCdiYXNlNjQnKSk7XG4gICAgfSk7XG4gICAgLy8gemlwSW5wdXQucmVzdW1lKCk7XG4gIH0gZWxzZSBpZiAoemlwSW5wdXQgaW5zdGFuY2VvZiBCdWZmZXIpIHtcbiAgICBkZWZlcnJlZC5yZXNvbHZlKHppcElucHV0LnRvU3RyaW5nKCdiYXNlNjQnKSk7XG4gIH0gZWxzZSBpZiAoemlwSW5wdXQgaW5zdGFuY2VvZiBTdHJpbmcgfHwgdHlwZW9mIHppcElucHV0ID09PSAnc3RyaW5nJykge1xuICAgIGRlZmVycmVkLnJlc29sdmUoemlwSW5wdXQpO1xuICB9IGVsc2Uge1xuICAgIHRocm93IFwiVW5leHBlY3RlZCB6aXBJbnB1dCB0eXBlXCI7XG4gIH1cblxuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciByZXMgPSBkZWZlcnJlZC5wcm9taXNlLnRoZW4oZnVuY3Rpb24oemlwQ29udGVudEI2NCkge1xuICAgIHJldHVybiBzZWxmLl9pbnZva2UoXCJkZXBsb3lcIiwge1xuICAgICAgWmlwRmlsZTogemlwQ29udGVudEI2NCxcbiAgICAgIERlcGxveU9wdGlvbnM6IG9wdGlvbnNcbiAgICB9LCBjYWxsYmFjayk7XG4gIH0pO1xuICByZXR1cm4gbmV3IERlcGxveVJlc3VsdExvY2F0b3IodGhpcywgcmVzKS50aGVuQ2FsbChjYWxsYmFjayk7XG59O1xuXG4vKipcbiAqIENoZWNrcyB0aGUgc3RhdHVzIG9mIGRlY2xhcmF0aXZlIG1ldGFkYXRhIGNhbGwgZGVwbG95KClcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gaWQgLSBBc3luYyBwcm9jZXNzIGlkIHJldHVybmVkIGZyb20gcHJldmlvdXMgZGVwbG95IHJlcXVlc3RcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW2luY2x1ZGVEZXRhaWxzXSAtIFNldHMgdGhlIERlcGxveVJlc3VsdCBvYmplY3QgdG8gaW5jbHVkZSBkZXRhaWxzIGluZm9ybWF0aW9uIChkZWZhdWx0OiBmYWxzZSlcbiAqIEBwYXJhbSB7Q2FsbGJhY2suPE1ldGFkYXRhfkRlcGxveVJlc3VsdD59IFtjYWxsYmFja10gLSBDYWxsYmFjayBmdW5jdGlvblxuICogQHJldHVybnMge1Byb21pc2UuPE1ldGFkYXRhfkRlcGxveVJlc3VsdD59XG4gKi9cbk1ldGFkYXRhLnByb3RvdHlwZS5jaGVja0RlcGxveVN0YXR1cyA9IGZ1bmN0aW9uKGlkLCBpbmNsdWRlRGV0YWlscywgY2FsbGJhY2spIHtcbiAgaWYgKF8uaXNPYmplY3QoaW5jbHVkZURldGFpbHMpIHx8IF8uaXNCb29sZWFuKGluY2x1ZGVEZXRhaWxzKSkge1xuICAgIGluY2x1ZGVEZXRhaWxzID0gISFpbmNsdWRlRGV0YWlscztcbiAgfSBlbHNlIHtcbiAgICBjYWxsYmFjayA9IGluY2x1ZGVEZXRhaWxzO1xuICAgIGluY2x1ZGVEZXRhaWxzID0gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHRoaXMuX2ludm9rZShcImNoZWNrRGVwbG95U3RhdHVzXCIsIHtcbiAgICBhc3luY1Byb2Nlc3NJZDogaWQsXG4gICAgaW5jbHVkZURldGFpbHMgOiBpbmNsdWRlRGV0YWlsc1xuICB9KS50aGVuKGZ1bmN0aW9uKHJlcykge1xuICAgIHJlcy5kb25lID0gcmVzLmRvbmUgPT09ICd0cnVlJztcbiAgICByZXMuc3VjY2VzcyA9IHJlcy5zdWNjZXNzID09PSAndHJ1ZSc7XG4gICAgcmVzLmNoZWNrT25seSA9IHJlcy5jaGVja09ubHkgPT09ICd0cnVlJztcbiAgICByZXMucnVuVGVzdHNFbmFibGVkID0gcmVzLnJ1blRlc3RzRW5hYmxlZCA9PT0gJ3RydWUnO1xuICAgIGlmIChyZXMuaWdub3JlV2FybmluZ3MpIHtcbiAgICAgIHJlcy5pZ25vcmVXYXJuaW5ncyA9IHJlcy5pZ25vcmVXYXJuaW5ncyA9PT0gJ3RydWUnO1xuICAgIH1cbiAgICBpZiAocmVzLnJvbGxiYWNrT25FcnJvcikge1xuICAgICAgcmVzLnJvbGxiYWNrT25FcnJvciA9IHJlcy5yb2xsYmFja09uRXJyb3IgPT09ICd0cnVlJztcbiAgICB9XG4gICAgcmVzLm51bWJlckNvbXBvbmVudEVycm9ycyA9IE51bWJlcihyZXMubnVtYmVyQ29tcG9uZW50RXJyb3JzKTtcbiAgICByZXMubnVtYmVyQ29tcG9uZW50c0RlcGxveWVkID0gTnVtYmVyKHJlcy5udW1iZXJDb21wb25lbnRzRGVwbG95ZWQpO1xuICAgIHJlcy5udW1iZXJDb21wb25lbnRzVG90YWwgPSBOdW1iZXIocmVzLm51bWJlckNvbXBvbmVudHNUb3RhbCk7XG4gICAgcmVzLm51bWJlclRlc3RFcnJvcnMgPSBOdW1iZXIocmVzLm51bWJlclRlc3RFcnJvcnMpO1xuICAgIHJlcy5udW1iZXJUZXN0c0NvbXBsZXRlZCA9IE51bWJlcihyZXMubnVtYmVyVGVzdHNDb21wbGV0ZWQpO1xuICAgIHJlcy5udW1iZXJUZXN0c1RvdGFsID0gTnVtYmVyKHJlcy5udW1iZXJUZXN0c1RvdGFsKTtcblxuICAgIHJldHVybiByZXM7XG4gIH0pLnRoZW5DYWxsKGNhbGxiYWNrKTtcbn07XG5cblxuLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gTWV0YWRhdGF+QXN5bmNSZXN1bHRcbiAqIEBwcm9wIHtCb29sZWFufSBkb25lIC0gSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGNhbGwgaGFzIGNvbXBsZXRlZCBvciBub3RcbiAqIEBwcm9wIHtTdHJpbmd9IGlkIC0gSUQgb2YgdGhlIGNvbXBvbmVudCBiZWluZyBjcmVhdGVkLCB1cGRhdGVkLCBkZWxldGVkLCBkZXBsb3llZCwgb3IgcmV0cmlldmVkXG4gKiBAcHJvcCB7U3RyaW5nfSBzdGF0ZSAtIFRoZSBzdGF0ZSBmb3VyIHBvc3NpYmxlIHZhbHVlczogUXVldWVkLCBJblByb2dyZXNzLCBDb21wbGV0ZWQsIGFuZCBFcnJvci5cbiAqIEBwcm9wIHtTdHJpbmd9IFtzdGF0dXNDb2RlXSAtIElmIGFuIGVycm9yIG9jY3VycmVkIGR1cmluZyB0aGUgY3JlYXRlKCksIHVwZGF0ZSgpLCBvciBkZWxldGUoKSBjYWxsLCBhIHN0YXR1cyBjb2RlIGlzIHJldHVybmVkXG4gKiBAcHJvcCB7U3RyaW5nfSBbbWVzc2FnZV0gLSBNZXNzYWdlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHN0YXR1c0NvZGUgZmllbGQgcmV0dXJuZWRcbiAqL1xuXG4vKipcbiAqIFRoZSBsb2NhdG9yIGNsYXNzIGZvciBNZXRhZGF0YSBBUEkgYXN5bmNocm9ub3VzIGNhbGwgcmVzdWx0XG4gKlxuICogQHByb3RlY3RlZFxuICogQGNsYXNzIE1ldGFkYXRhfkFzeW5jUmVzdWx0TG9jYXRvclxuICogQGV4dGVuZHMgZXZlbnRzLkV2ZW50RW1pdHRlclxuICogQGltcGxlbWVudHMgUHJvbWlzZS48TWV0YWRhdGF+QXN5bmNSZXN1bHR8QXJyYXkuPE1ldGFkYXRhfkFzeW5jUmVzdWx0Pj5cbiAqIEBwYXJhbSB7TWV0YWRhdGF9IG1ldGEgLSBNZXRhZGF0YSBBUEkgb2JqZWN0XG4gKiBAcGFyYW0ge1Byb21pc2UuPE1ldGFkYXRhfkFzeW5jUmVzdWx0fEFycmF5LjxNZXRhZGF0YX5Bc3luY1Jlc3VsdD4+fSByZXN1bHRzIC0gUHJvbWlzZSBvYmplY3QgZm9yIGFzeW5jIHJlc3VsdCBpbmZvXG4gKiBAcGFyYW0ge0Jvb2xlYW59IFtpc0FycmF5XSAtIEluZGljYXRlcyB3aGV0aGVyIHRoZSBhc3luYyByZXF1ZXN0IGlzIGdpdmVuIGluIGFycmF5IG9yIHNpbmdsZSBvYmplY3RcbiAqL1xudmFyIEFzeW5jUmVzdWx0TG9jYXRvciA9IGZ1bmN0aW9uKG1ldGEsIHJlc3VsdHMsIGlzQXJyYXkpIHtcbiAgdGhpcy5fbWV0YSA9IG1ldGE7XG4gIHRoaXMuX3Jlc3VsdHMgPSByZXN1bHRzO1xuICB0aGlzLl9pc0FycmF5ID0gaXNBcnJheTtcbn07XG5cbmluaGVyaXRzKEFzeW5jUmVzdWx0TG9jYXRvciwgZXZlbnRzLkV2ZW50RW1pdHRlcik7XG5cbi8qKlxuICogUHJvbWlzZS9BKyBpbnRlcmZhY2VcbiAqIGh0dHA6Ly9wcm9taXNlcy1hcGx1cy5naXRodWIuaW8vcHJvbWlzZXMtc3BlYy9cbiAqXG4gKiBEZWxlZ2F0ZSB0byBkZWZlcnJlZCBwcm9taXNlLCByZXR1cm4gcHJvbWlzZSBpbnN0YW5jZSBmb3IgYmF0Y2ggcmVzdWx0XG4gKlxuICogQG1ldGhvZCBNZXRhZGF0YX5Bc3luY1Jlc3VsdExvY2F0b3IjdGhlblxuICovXG5Bc3luY1Jlc3VsdExvY2F0b3IucHJvdG90eXBlLnRoZW4gPSBmdW5jdGlvbihvblJlc29sdmUsIG9uUmVqZWN0KSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgcmV0dXJuIHRoaXMuX3Jlc3VsdHMudGhlbihmdW5jdGlvbihyZXN1bHRzKSB7XG4gICAgdmFyIGNvbnZlcnRUeXBlID0gZnVuY3Rpb24ocmVzKSB7XG4gICAgICBpZiAocmVzLiQgJiYgcmVzLiRbXCJ4c2k6bmlsXCJdID09PSAndHJ1ZScpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICByZXMuZG9uZSA9IHJlcy5kb25lID09PSAndHJ1ZSc7XG4gICAgICByZXR1cm4gcmVzO1xuICAgIH07XG4gICAgcmVzdWx0cyA9IF8uaXNBcnJheShyZXN1bHRzKSA/IF8ubWFwKHJlc3VsdHMsIGNvbnZlcnRUeXBlKSA6IGNvbnZlcnRUeXBlKHJlc3VsdHMpO1xuICAgIGlmIChzZWxmLl9pc0FycmF5ICYmICFfLmlzQXJyYXkocmVzdWx0cykpIHtcbiAgICAgIHJlc3VsdHMgPSBbIHJlc3VsdHMgXTtcbiAgICB9XG4gICAgcmV0dXJuIG9uUmVzb2x2ZShyZXN1bHRzKTtcbiAgfSwgb25SZWplY3QpO1xufTtcblxuLyoqXG4gKiBQcm9taXNlL0ErIGV4dGVuc2lvblxuICogQ2FsbCBcInRoZW5cIiB1c2luZyBnaXZlbiBub2RlLXN0eWxlIGNhbGxiYWNrIGZ1bmN0aW9uXG4gKlxuICogQG1ldGhvZCBNZXRhZGF0YX5Bc3luY1Jlc3VsdExvY2F0b3IjdGhlbkNhbGxcbiAqL1xuQXN5bmNSZXN1bHRMb2NhdG9yLnByb3RvdHlwZS50aGVuQ2FsbCA9IGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG4gIHJldHVybiBfLmlzRnVuY3Rpb24oY2FsbGJhY2spID8gdGhpcy50aGVuKGZ1bmN0aW9uKHJlcykge1xuICAgIHByb2Nlc3MubmV4dFRpY2soZnVuY3Rpb24oKSB7XG4gICAgICBjYWxsYmFjayhudWxsLCByZXMpO1xuICAgIH0pO1xuICB9LCBmdW5jdGlvbihlcnIpIHtcbiAgICBwcm9jZXNzLm5leHRUaWNrKGZ1bmN0aW9uKCkge1xuICAgICAgY2FsbGJhY2soZXJyKTtcbiAgICB9KTtcbiAgfSkgOiB0aGlzO1xufTtcblxuLyoqXG4gKiBDaGVjayB0aGUgc3RhdHVzIG9mIGFzeW5jIHJlcXVlc3RcbiAqXG4gKiBAbWV0aG9kIE1ldGFkYXRhfkFzeW5jUmVzdWx0TG9jYXRvciNjaGVja1xuICogQHBhcmFtIHtDYWxsYmFjay48TWV0YWRhdGF+QXN5bmNSZXN1bHR8QXJyYXkuPE1ldGFkYXRhfkFzeW5jUmVzdWx0Pj59IFtjYWxsYmFja10gLSBDYWxsYmFjayBmdW5jdGlvblxuICogQHJldHVybnMge1Byb21pc2UuPE1ldGFkYXRhfkFzeW5jUmVzdWx0fEFycmF5LjxNZXRhZGF0YX5Bc3luY1Jlc3VsdD4+fVxuICovXG5Bc3luY1Jlc3VsdExvY2F0b3IucHJvdG90eXBlLmNoZWNrID0gZnVuY3Rpb24oY2FsbGJhY2spIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgbWV0YSA9IHRoaXMuX21ldGE7XG4gIHJldHVybiB0aGlzLnRoZW4oZnVuY3Rpb24ocmVzdWx0cykge1xuICAgIHZhciBpZHMgPSBfLmlzQXJyYXkocmVzdWx0cykgPyBfLm1hcChyZXN1bHRzLCBmdW5jdGlvbihyZXMpeyByZXR1cm4gcmVzLmlkOyB9KSA6IHJlc3VsdHMuaWQ7XG4gICAgc2VsZi5faWRzID0gaWRzO1xuICAgIHJldHVybiBtZXRhLmNoZWNrU3RhdHVzKGlkcyk7XG4gIH0pLnRoZW5DYWxsKGNhbGxiYWNrKTtcbn07XG5cbi8qKlxuICogUG9sbGluZyB1bnRpbCBhc3luYyBjYWxsIHN0YXR1cyBiZWNvbWVzIGNvbXBsZXRlIG9yIGVycm9yXG4gKlxuICogQG1ldGhvZCBNZXRhZGF0YX5Bc3luY1Jlc3VsdExvY2F0b3IjcG9sbFxuICogQHBhcmFtIHtOdW1iZXJ9IGludGVydmFsIC0gUG9sbGluZyBpbnRlcnZhbCBpbiBtaWxsaXNlY29uZHNcbiAqIEBwYXJhbSB7TnVtYmVyfSB0aW1lb3V0IC0gUG9sbGluZyB0aW1lb3V0IGluIG1pbGxpc2Vjb25kc1xuICovXG5Bc3luY1Jlc3VsdExvY2F0b3IucHJvdG90eXBlLnBvbGwgPSBmdW5jdGlvbihpbnRlcnZhbCwgdGltZW91dCkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciBzdGFydFRpbWUgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgdmFyIHBvbGwgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgbm93ID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gICAgaWYgKHN0YXJ0VGltZSArIHRpbWVvdXQgPCBub3cpIHtcbiAgICAgIHZhciBlcnJNc2cgPSBcIlBvbGxpbmcgdGltZSBvdXQuXCI7XG4gICAgICBpZiAoc2VsZi5faWRzKSB7XG4gICAgICAgIGVyck1zZyArPSBcIiBQcm9jZXNzIElkID0gXCIgKyBzZWxmLl9pZHM7XG4gICAgICB9XG4gICAgICBzZWxmLmVtaXQoJ2Vycm9yJywgbmV3IEVycm9yKGVyck1zZykpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBzZWxmLmNoZWNrKCkudGhlbihmdW5jdGlvbihyZXN1bHRzKSB7XG4gICAgICB2YXIgZG9uZSA9IHRydWU7XG4gICAgICB2YXIgcmVzdWx0QXJyID0gXy5pc0FycmF5KHJlc3VsdHMpID8gcmVzdWx0cyA6IFsgcmVzdWx0cyBdO1xuICAgICAgZm9yICh2YXIgaT0wLCBsZW49cmVzdWx0QXJyLmxlbmd0aDsgaTxsZW47IGkrKykge1xuICAgICAgICB2YXIgcmVzdWx0ID0gcmVzdWx0QXJyW2ldO1xuICAgICAgICBpZiAocmVzdWx0ICYmICFyZXN1bHQuZG9uZSkge1xuICAgICAgICAgIHNlbGYuZW1pdCgncHJvZ3Jlc3MnLCByZXN1bHQpO1xuICAgICAgICAgIGRvbmUgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGRvbmUpIHtcbiAgICAgICAgc2VsZi5lbWl0KCdjb21wbGV0ZScsIHJlc3VsdHMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2V0VGltZW91dChwb2xsLCBpbnRlcnZhbCk7XG4gICAgICB9XG4gICAgfSwgZnVuY3Rpb24oZXJyKSB7XG4gICAgICBzZWxmLmVtaXQoJ2Vycm9yJywgZXJyKTtcbiAgICB9KTtcbiAgfTtcbiAgc2V0VGltZW91dChwb2xsLCBpbnRlcnZhbCk7XG59O1xuXG4vKipcbiAqIENoZWNrIGFuZCB3YWl0IHVudGlsIHRoZSBhc3luYyByZXF1ZXN0cyBiZWNvbWUgaW4gY29tcGxldGVkIHN0YXR1c1xuICpcbiAqIEBtZXRob2QgTWV0YWRhdGF+QXN5bmNSZXN1bHRMb2NhdG9yI2NvbXBsZXRlXG4gKiBAcGFyYW0ge0NhbGxiYWNrLjxNZXRhZGF0YX5Bc3luY1Jlc3VsdHxBcnJheS48TWV0YWRhdGF+QXN5bmNSZXN1bHQ+Pn0gW2NhbGxiYWNrXSAtIENhbGxiYWNrIGZ1bmN0aW9uXG4gKiBAcmV0dXJucyB7UHJvbWlzZS48TWV0YWRhdGF+QXN5bmNSZXN1bHR8QXJyYXkuPE1ldGFkYXRhfkFzeW5jUmVzdWx0Pj59XG4gKi9cbkFzeW5jUmVzdWx0TG9jYXRvci5wcm90b3R5cGUuY29tcGxldGUgPSBmdW5jdGlvbihjYWxsYmFjaykge1xuICB2YXIgZGVmZXJyZWQgPSBQcm9taXNlLmRlZmVyKCk7XG4gIHRoaXMub24oJ2NvbXBsZXRlJywgZnVuY3Rpb24ocmVzdWx0cykge1xuICAgIGRlZmVycmVkLnJlc29sdmUocmVzdWx0cyk7XG4gIH0pO1xuICB0aGlzLm9uKCdlcnJvcicsIGZ1bmN0aW9uKGVycikge1xuICAgIGRlZmVycmVkLnJlamVjdChlcnIpO1xuICB9KTtcbiAgdmFyIG1ldGEgPSB0aGlzLl9tZXRhO1xuICB0aGlzLnBvbGwobWV0YS5wb2xsSW50ZXJ2YWwsIG1ldGEucG9sbFRpbWVvdXQpO1xuICByZXR1cm4gZGVmZXJyZWQucHJvbWlzZS50aGVuQ2FsbChjYWxsYmFjayk7XG59O1xuXG4vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cbi8qKlxuICogVGhlIGxvY2F0b3IgY2xhc3MgdG8gdHJhY2sgcmV0cmVpdmUoKSBNZXRhZGF0YSBBUEkgY2FsbCByZXN1bHRcbiAqXG4gKiBAcHJvdGVjdGVkXG4gKiBAY2xhc3MgTWV0YWRhdGF+UmV0cmlldmVSZXN1bHRMb2NhdG9yXG4gKiBAZXh0ZW5kcyBNZXRhZGF0YX5Bc3luY1Jlc3VsdExvY2F0b3JcbiAqIEBwYXJhbSB7TWV0YWRhdGF9IG1ldGEgLSBNZXRhZGF0YSBBUEkgb2JqZWN0XG4gKiBAcGFyYW0ge1Byb21pc2UuPE1ldGFkYXRhfkFzeW5jUmVzdWx0Pn0gcmVzdWx0IC0gUHJvbWlzZSBvYmplY3QgZm9yIGFzeW5jIHJlc3VsdCBvZiByZXRyaWV2ZSBjYWxsKClcbiAqL1xudmFyIFJldHJpZXZlUmVzdWx0TG9jYXRvciA9IGZ1bmN0aW9uKG1ldGEsIHJlc3VsdCkge1xuICBSZXRyaWV2ZVJlc3VsdExvY2F0b3Iuc3VwZXJfLmNhbGwodGhpcywgbWV0YSwgcmVzdWx0KTtcbn07XG5cbmluaGVyaXRzKFJldHJpZXZlUmVzdWx0TG9jYXRvciwgQXN5bmNSZXN1bHRMb2NhdG9yKTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBNZXRhZGF0YX5SZXRyaWV2ZVJlc3VsdFxuICogQHByb3Age0FycmF5LjxNZXRhZGF0YX5GaWxlUHJvcGVydGllcz59IGZpbGVQcm9wZXJ0aWVzIC0gQ29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHByb3BlcnRpZXMgb2YgZWFjaCBjb21wb25lbnQgaW4gdGhlIC56aXAgZmlsZSwgYW5kIHRoZSBtYW5pZmVzdCBmaWxlIHBhY2thZ2UueG1sXG4gKiBAcHJvcCB7U3RyaW5nfSBpZCAtIElEIG9mIHRoZSBjb21wb25lbnQgYmVpbmcgcmV0cmlldmVkXG4gKiBAcHJvcCB7QXJyYXkuPE9iamVjdD59IG1lc3NhZ2VzIC0gQ29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN1Y2Nlc3Mgb3IgZmFpbHVyZSBvZiB0aGUgcmV0cmlldmUoKSBjYWxsXG4gKiBAcHJvcCB7U3RyaW5nfSB6aXBGaWxlIC0gVGhlIHppcCBmaWxlIHJldHVybmVkIGJ5IHRoZSByZXRyaWV2ZSByZXF1ZXN0LiBCYXNlIDY0LWVuY29kZWQgYmluYXJ5IGRhdGFcbiAqL1xuXG4vKipcbiAqIENoZWNrIGFuZCB3YWl0IHVudGlsIHRoZSBhc3luYyByZXF1ZXN0IGJlY29tZXMgaW4gY29tcGxldGVkIHN0YXR1cyxcbiAqIGFuZCByZXRyaWV2ZSB0aGUgcmVzdWx0IGRhdGEuXG4gKlxuICogQG1lbXRob2QgTWV0YWRhdGF+UmV0cmlldmVSZXN1bHRMb2NhdG9yI2NvbXBsZXRlXG4gKiBAcGFyYW0ge0NhbGxiYWNrLjxNZXRhZGF0YX5SZXRyaWV2ZVJlc3VsdD59IFtjYWxsYmFja10gLSBDYWxsYmFjayBmdW5jdGlvblxuICogQHJldHVybnMge1Byb21pc2UuPE1ldGFkYXRhflJldHJpZXZlUmVzdWx0Pn1cbiAqL1xuUmV0cmlldmVSZXN1bHRMb2NhdG9yLnByb3RvdHlwZS5jb21wbGV0ZSA9IGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG4gIHZhciBtZXRhID0gdGhpcy5fbWV0YTtcbiAgcmV0dXJuIFJldHJpZXZlUmVzdWx0TG9jYXRvci5zdXBlcl8ucHJvdG90eXBlLmNvbXBsZXRlLmNhbGwodGhpcykudGhlbihmdW5jdGlvbihyZXN1bHQpIHtcbiAgICByZXR1cm4gbWV0YS5jaGVja1JldHJpZXZlU3RhdHVzKHJlc3VsdC5pZCk7XG4gIH0pLnRoZW5DYWxsKGNhbGxiYWNrKTtcbn07XG5cbi8qKlxuICogQ2hhbmdlIHRoZSByZXRyaWV2ZWQgcmVzdWx0IHRvIE5vZGUuanMgcmVhZGFibGUgc3RyZWFtXG4gKlxuICogQG1ldGhvZCBNZXRhZGF0YX5SZXRyaWV2ZVJlc3VsdExvY2F0b3Ijc3RyZWFtXG4gKiBAcmV0dXJucyB7c3RyZWFtLlJlYWRhYmxlfVxuICovXG5SZXRyaWV2ZVJlc3VsdExvY2F0b3IucHJvdG90eXBlLnN0cmVhbSA9IGZ1bmN0aW9uKCkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciByZXN1bHRTdHJlYW0gPSBuZXcgc3RyZWFtLlJlYWRhYmxlKCk7XG4gIHZhciByZWFkaW5nID0gZmFsc2U7XG4gIHJlc3VsdFN0cmVhbS5fcmVhZCA9IGZ1bmN0aW9uKCkge1xuICAgIGlmIChyZWFkaW5nKSB7IHJldHVybjsgfVxuICAgIHJlYWRpbmcgPSB0cnVlO1xuICAgIHNlbGYuY29tcGxldGUoZnVuY3Rpb24oZXJyLCByZXN1bHQpIHtcbiAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgcmVzdWx0U3RyZWFtLmVtaXQoJ2Vycm9yJywgZXJyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VsdFN0cmVhbS5wdXNoKG5ldyBCdWZmZXIocmVzdWx0LnppcEZpbGUsICdiYXNlNjQnKSk7XG4gICAgICAgIHJlc3VsdFN0cmVhbS5wdXNoKG51bGwpO1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xuICByZXR1cm4gcmVzdWx0U3RyZWFtO1xufTtcblxuLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG4vKipcbiAqIFRoZSBsb2NhdG9yIGNsYXNzIHRvIHRyYWNrIGRlcGxveSgpIE1ldGFkYXRhIEFQSSBjYWxsIHJlc3VsdFxuICpcbiAqIEBwcm90ZWN0ZWRcbiAqIEBjbGFzcyBNZXRhZGF0YX5EZXBsb3lSZXN1bHRMb2NhdG9yXG4gKiBAZXh0ZW5kcyBNZXRhZGF0YX5Bc3luY1Jlc3VsdExvY2F0b3JcbiAqIEBwYXJhbSB7TWV0YWRhdGF9IG1ldGEgLSBNZXRhZGF0YSBBUEkgb2JqZWN0XG4gKiBAcGFyYW0ge1Byb21pc2UuPE1ldGFkYXRhfkFzeW5jUmVzdWx0Pn0gcmVzdWx0IC0gUHJvbWlzZSBvYmplY3QgZm9yIGFzeW5jIHJlc3VsdCBvZiBkZXBsb3koKSBjYWxsXG4gKi9cbnZhciBEZXBsb3lSZXN1bHRMb2NhdG9yID0gZnVuY3Rpb24obWV0YSwgcmVzdWx0KSB7XG4gIERlcGxveVJlc3VsdExvY2F0b3Iuc3VwZXJfLmNhbGwodGhpcywgbWV0YSwgcmVzdWx0KTtcbn07XG5cbmluaGVyaXRzKERlcGxveVJlc3VsdExvY2F0b3IsIEFzeW5jUmVzdWx0TG9jYXRvcik7XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gTWV0YWRhdGF+RGVwbG95UmVzdWx0XG4gKiBAcHJvcCB7U3RyaW5nfSBpZCAtIElEIG9mIHRoZSBjb21wb25lbnQgYmVpbmcgZGVwbG95ZWRcbiAqIEBwcm9wIHtCb29sZWFufSBjaGVja09ubHkgLSBJbmRpY2F0ZXMgd2hldGhlciB0aGlzIGRlcGxveW1lbnQgaXMgYmVpbmcgdXNlZCB0byBjaGVjayB0aGUgdmFsaWRpdHkgb2YgdGhlIGRlcGxveWVkIGZpbGVzIHdpdGhvdXQgbWFraW5nIGFueSBjaGFuZ2VzIGluIHRoZSBvcmdhbml6YXRpb24gb3Igbm90XG4gKiBAcHJvcCB7U3RyaW5nfSBjb21wbGV0ZWREYXRlIC0gVGltZXN0YW1wIGZvciB3aGVuIHRoZSBkZXBsb3ltZW50IHByb2Nlc3MgZW5kZWRcbiAqIEBwcm9wIHtTdHJpbmd9IGNyZWF0ZWREYXRlIC0gVGltZXN0YW1wIGZvciB3aGVuIHRoZSBkZXBsb3koKSBjYWxsIHdhcyByZWNlaXZlZFxuICogQHByb3Age0FycmF5LjxPYmplY3Q+fSBbZGV0YWlsc10gLSBQcm92aWRlcyB0aGUgZGV0YWlscyBvZiBhIGRlcGxveW1lbnQgdGhhdCBpcyBpbi1wcm9ncmVzcyBvciBlbmRlZCwgaWYgaW5jbHVkZURldGFpbHMgaXMgc2V0IHRvIHRydWUgaW4gY2hlY2tEZXBsb3lTdGF0dXMoKSBjYWxsXG4gKiBAcHJvcCB7Qm9vbGVhbn0gZG9uZSAtIEluZGljYXRlcyB3aGV0aGVyIHRoZSBzZXJ2ZXIgZmluaXNoZWQgcHJvY2Vzc2luZyB0aGUgZGVwbG95KCkgY2FsbCBmb3IgdGhlIHNwZWNpZmllZCBpZFxuICogQHByb3Age1N0cmluZ30gW2Vycm9yTWVzc2FnZV0gLSBNZXNzYWdlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHZhbHVlcyBpbiB0aGUgZXJyb3JTdGF0dXNDb2RlIGZpZWxkXG4gKiBAcHJvcCB7U3RyaW5nfSBbZXJyb3JTdGF0dXNDb2RlXSAtIElmIGFuIGVycm9yIG9jY3VycmVkIGR1cmluZyB0aGUgZGVwbG95KCkgY2FsbCwgYSBzdGF0dXMgY29kZSBpcyByZXR1cm5lZCwgYW5kIHRoZSBtZXNzYWdlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHN0YXR1cyBjb2RlIGlzIHJldHVybmVkIGluIHRoZSBlcnJvck1lc3NhZ2VmaWVsZFxuICogQHByb3Age0Jvb2xlYW59IFtpZ25vcmVXYXJuaW5nc10gLSBTcGVjaWZpZXMgd2hldGhlciBhIGRlcGxveW1lbnQgc2hvdWxkIGNvbnRpbnVlIGV2ZW4gaWYgdGhlIGRlcGxveW1lbnQgZ2VuZXJhdGVzIHdhcm5pbmdzXG4gKiBAcHJvcCB7U3RyaW5nfSBsYXN0TW9kaWZpZWREYXRlIC0gVGltZXN0YW1wIG9mIHRoZSBsYXN0IHVwZGF0ZSBmb3IgdGhlIGRlcGxveW1lbnQgcHJvY2Vzc1xuICogQHByb3Age051bWJlcn0gbnVtYmVyQ29tcG9uZW50RXJyb3JzIC0gVGhlIG51bWJlciBvZiBjb21wb25lbnRzIHRoYXQgZ2VuZXJhdGVkIGVycm9ycyBkdXJpbmcgdGhpcyBkZXBsb3ltZW50XG4gKiBAcHJvcCB7TnVtYmVyfSBudW1iZXJDb21wb25lbnRzRGVwbG95ZWQgLSBUaGUgbnVtYmVyIG9mIGNvbXBvbmVudHMgZGVwbG95ZWQgaW4gdGhlIGRlcGxveW1lbnQgcHJvY2Vzc1xuICogQHByb3Age051bWJlcn0gbnVtYmVyQ29tcG9uZW50c1RvdGFsIC0gVGhlIHRvdGFsIG51bWJlciBvZiBjb21wb25lbnRzIGluIHRoZSBkZXBsb3ltZW50XG4gKiBAcHJvcCB7TnVtYmVyfSBudW1iZXJUZXN0RXJyb3JzIC0gVGhlIG51bWJlciBvZiBBcGV4IHRlc3RzIHRoYXQgaGF2ZSBnZW5lcmF0ZWQgZXJyb3JzIGR1cmluZyB0aGlzIGRlcGxveW1lbnRcbiAqIEBwcm9wIHtOdW1iZXJ9IG51bWJlclRlc3RzQ29tcGxldGVkIC0gVGhlIG51bWJlciBvZiBjb21wbGV0ZWRBcGV4IHRlc3RzIGZvciB0aGlzIGRlcGxveW1lbnRcbiAqIEBwcm9wIHtOdW1iZXJ9IG51bWJlclRlc3RzVG90YWwgLSBUaGUgdG90YWwgbnVtYmVyIG9mIEFwZXggdGVzdHMgZm9yIHRoaXMgZGVwbG95bWVudFxuICogQHByb3Age0Jvb2xlYW59IFtyb2xsYmFja09uRXJyb3JdIC0gSW5kaWNhdGVzIHdoZXRoZXIgYW55IGZhaWx1cmUgY2F1c2VzIGEgY29tcGxldGUgcm9sbGJhY2sgb3Igbm90LiBEZWZhdWx0IGlzIHRydWUuXG4gKiBAcHJvcCB7U3RyaW5nfSBzdGFydERhdGUgLSBUaW1lc3RhbXAgZm9yIHdoZW4gdGhlIGRlcGxveW1lbnQgcHJvY2VzcyBiZWdhblxuICogQHByb3Age1N0cmluZ30gc3RhdHVzIC0gSW5kaWNhdGVzIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBkZXBsb3ltZW50XG4gKiBAcHJvcCB7Qm9vbGVhbn0gc3VjY2VzcyAtIEluZGljYXRlcyB3aGV0aGVyIHRoZSBkZXBsb3ltZW50IHdhcyBzdWNjZXNzZnVsIG9yIG5vdFxuICovXG5cbi8qKlxuICogQ2hlY2sgYW5kIHdhaXQgdW50aWwgdGhlIGFzeW5jIHJlcXVlc3QgYmVjb21lcyBpbiBjb21wbGV0ZWQgc3RhdHVzLFxuICogYW5kIHJldHJpZXZlIHRoZSByZXN1bHQgZGF0YS5cbiAqXG4gKiBAbWV0aG9kIE1ldGFkYXRhfkRlcGxveVJlc3VsdExvY2F0b3IjY29tcGxldGVcbiAqIEBwYXJhbSB7Q2FsbGJhY2suPE1ldGFkYXRhfkRlcGxveVJlc3VsdD59IFtjYWxsYmFja10gLSBDYWxsYmFjayBmdW5jdGlvblxuICogQHJldHVybnMge1Byb21pc2UuPE1ldGFkYXRhfkRlcGxveVJlc3VsdD59XG4gKi9cbkRlcGxveVJlc3VsdExvY2F0b3IucHJvdG90eXBlLmNvbXBsZXRlID0gZnVuY3Rpb24oaW5jbHVkZURldGFpbHMsIGNhbGxiYWNrKSB7XG4gIGlmIChfLmlzRnVuY3Rpb24oaW5jbHVkZURldGFpbHMpKSB7XG4gICAgY2FsbGJhY2sgPSBpbmNsdWRlRGV0YWlscztcbiAgICBpbmNsdWRlRGV0YWlscyA9IGZhbHNlO1xuICB9XG4gIHZhciBtZXRhID0gdGhpcy5fbWV0YTtcbiAgcmV0dXJuIERlcGxveVJlc3VsdExvY2F0b3Iuc3VwZXJfLnByb3RvdHlwZS5jb21wbGV0ZS5jYWxsKHRoaXMpLnRoZW4oZnVuY3Rpb24ocmVzdWx0KSB7XG4gICAgcmV0dXJuIG1ldGEuY2hlY2tEZXBsb3lTdGF0dXMocmVzdWx0LmlkLCBpbmNsdWRlRGV0YWlscyk7XG4gIH0pLnRoZW5DYWxsKGNhbGxiYWNrKTtcbn07XG5cblxuLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG4vKlxuICogUmVnaXN0ZXIgaG9vayBpbiBjb25uZWN0aW9uIGluc3RhbnRpYXRpb24gZm9yIGR5bmFtaWNhbGx5IGFkZGluZyB0aGlzIEFQSSBtb2R1bGUgZmVhdHVyZXNcbiAqL1xuanNmb3JjZS5vbignY29ubmVjdGlvbjpuZXcnLCBmdW5jdGlvbihjb25uKSB7XG4gIGNvbm4ubWV0YWRhdGEgPSBuZXcgTWV0YWRhdGEoY29ubik7XG59KTtcbiIsIid1c2Ugc3RyaWN0J1xuXG5leHBvcnRzLmJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoXG5leHBvcnRzLnRvQnl0ZUFycmF5ID0gdG9CeXRlQXJyYXlcbmV4cG9ydHMuZnJvbUJ5dGVBcnJheSA9IGZyb21CeXRlQXJyYXlcblxudmFyIGxvb2t1cCA9IFtdXG52YXIgcmV2TG9va3VwID0gW11cbnZhciBBcnIgPSB0eXBlb2YgVWludDhBcnJheSAhPT0gJ3VuZGVmaW5lZCcgPyBVaW50OEFycmF5IDogQXJyYXlcblxudmFyIGNvZGUgPSAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLydcbmZvciAodmFyIGkgPSAwLCBsZW4gPSBjb2RlLmxlbmd0aDsgaSA8IGxlbjsgKytpKSB7XG4gIGxvb2t1cFtpXSA9IGNvZGVbaV1cbiAgcmV2TG9va3VwW2NvZGUuY2hhckNvZGVBdChpKV0gPSBpXG59XG5cbi8vIFN1cHBvcnQgZGVjb2RpbmcgVVJMLXNhZmUgYmFzZTY0IHN0cmluZ3MsIGFzIE5vZGUuanMgZG9lcy5cbi8vIFNlZTogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQmFzZTY0I1VSTF9hcHBsaWNhdGlvbnNcbnJldkxvb2t1cFsnLScuY2hhckNvZGVBdCgwKV0gPSA2MlxucmV2TG9va3VwWydfJy5jaGFyQ29kZUF0KDApXSA9IDYzXG5cbmZ1bmN0aW9uIGdldExlbnMgKGI2NCkge1xuICB2YXIgbGVuID0gYjY0Lmxlbmd0aFxuXG4gIGlmIChsZW4gJSA0ID4gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBzdHJpbmcuIExlbmd0aCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCcpXG4gIH1cblxuICAvLyBUcmltIG9mZiBleHRyYSBieXRlcyBhZnRlciBwbGFjZWhvbGRlciBieXRlcyBhcmUgZm91bmRcbiAgLy8gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vYmVhdGdhbW1pdC9iYXNlNjQtanMvaXNzdWVzLzQyXG4gIHZhciB2YWxpZExlbiA9IGI2NC5pbmRleE9mKCc9JylcbiAgaWYgKHZhbGlkTGVuID09PSAtMSkgdmFsaWRMZW4gPSBsZW5cblxuICB2YXIgcGxhY2VIb2xkZXJzTGVuID0gdmFsaWRMZW4gPT09IGxlblxuICAgID8gMFxuICAgIDogNCAtICh2YWxpZExlbiAlIDQpXG5cbiAgcmV0dXJuIFt2YWxpZExlbiwgcGxhY2VIb2xkZXJzTGVuXVxufVxuXG4vLyBiYXNlNjQgaXMgNC8zICsgdXAgdG8gdHdvIGNoYXJhY3RlcnMgb2YgdGhlIG9yaWdpbmFsIGRhdGFcbmZ1bmN0aW9uIGJ5dGVMZW5ndGggKGI2NCkge1xuICB2YXIgbGVucyA9IGdldExlbnMoYjY0KVxuICB2YXIgdmFsaWRMZW4gPSBsZW5zWzBdXG4gIHZhciBwbGFjZUhvbGRlcnNMZW4gPSBsZW5zWzFdXG4gIHJldHVybiAoKHZhbGlkTGVuICsgcGxhY2VIb2xkZXJzTGVuKSAqIDMgLyA0KSAtIHBsYWNlSG9sZGVyc0xlblxufVxuXG5mdW5jdGlvbiBfYnl0ZUxlbmd0aCAoYjY0LCB2YWxpZExlbiwgcGxhY2VIb2xkZXJzTGVuKSB7XG4gIHJldHVybiAoKHZhbGlkTGVuICsgcGxhY2VIb2xkZXJzTGVuKSAqIDMgLyA0KSAtIHBsYWNlSG9sZGVyc0xlblxufVxuXG5mdW5jdGlvbiB0b0J5dGVBcnJheSAoYjY0KSB7XG4gIHZhciB0bXBcbiAgdmFyIGxlbnMgPSBnZXRMZW5zKGI2NClcbiAgdmFyIHZhbGlkTGVuID0gbGVuc1swXVxuICB2YXIgcGxhY2VIb2xkZXJzTGVuID0gbGVuc1sxXVxuXG4gIHZhciBhcnIgPSBuZXcgQXJyKF9ieXRlTGVuZ3RoKGI2NCwgdmFsaWRMZW4sIHBsYWNlSG9sZGVyc0xlbikpXG5cbiAgdmFyIGN1ckJ5dGUgPSAwXG5cbiAgLy8gaWYgdGhlcmUgYXJlIHBsYWNlaG9sZGVycywgb25seSBnZXQgdXAgdG8gdGhlIGxhc3QgY29tcGxldGUgNCBjaGFyc1xuICB2YXIgbGVuID0gcGxhY2VIb2xkZXJzTGVuID4gMFxuICAgID8gdmFsaWRMZW4gLSA0XG4gICAgOiB2YWxpZExlblxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpICs9IDQpIHtcbiAgICB0bXAgPVxuICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpKV0gPDwgMTgpIHxcbiAgICAgIChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDEpXSA8PCAxMikgfFxuICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMildIDw8IDYpIHxcbiAgICAgIHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMyldXG4gICAgYXJyW2N1ckJ5dGUrK10gPSAodG1wID4+IDE2KSAmIDB4RkZcbiAgICBhcnJbY3VyQnl0ZSsrXSA9ICh0bXAgPj4gOCkgJiAweEZGXG4gICAgYXJyW2N1ckJ5dGUrK10gPSB0bXAgJiAweEZGXG4gIH1cblxuICBpZiAocGxhY2VIb2xkZXJzTGVuID09PSAyKSB7XG4gICAgdG1wID1cbiAgICAgIChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSldIDw8IDIpIHxcbiAgICAgIChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDEpXSA+PiA0KVxuICAgIGFycltjdXJCeXRlKytdID0gdG1wICYgMHhGRlxuICB9XG5cbiAgaWYgKHBsYWNlSG9sZGVyc0xlbiA9PT0gMSkge1xuICAgIHRtcCA9XG4gICAgICAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkpXSA8PCAxMCkgfFxuICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMSldIDw8IDQpIHxcbiAgICAgIChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDIpXSA+PiAyKVxuICAgIGFycltjdXJCeXRlKytdID0gKHRtcCA+PiA4KSAmIDB4RkZcbiAgICBhcnJbY3VyQnl0ZSsrXSA9IHRtcCAmIDB4RkZcbiAgfVxuXG4gIHJldHVybiBhcnJcbn1cblxuZnVuY3Rpb24gdHJpcGxldFRvQmFzZTY0IChudW0pIHtcbiAgcmV0dXJuIGxvb2t1cFtudW0gPj4gMTggJiAweDNGXSArXG4gICAgbG9va3VwW251bSA+PiAxMiAmIDB4M0ZdICtcbiAgICBsb29rdXBbbnVtID4+IDYgJiAweDNGXSArXG4gICAgbG9va3VwW251bSAmIDB4M0ZdXG59XG5cbmZ1bmN0aW9uIGVuY29kZUNodW5rICh1aW50OCwgc3RhcnQsIGVuZCkge1xuICB2YXIgdG1wXG4gIHZhciBvdXRwdXQgPSBbXVxuICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkgKz0gMykge1xuICAgIHRtcCA9XG4gICAgICAoKHVpbnQ4W2ldIDw8IDE2KSAmIDB4RkYwMDAwKSArXG4gICAgICAoKHVpbnQ4W2kgKyAxXSA8PCA4KSAmIDB4RkYwMCkgK1xuICAgICAgKHVpbnQ4W2kgKyAyXSAmIDB4RkYpXG4gICAgb3V0cHV0LnB1c2godHJpcGxldFRvQmFzZTY0KHRtcCkpXG4gIH1cbiAgcmV0dXJuIG91dHB1dC5qb2luKCcnKVxufVxuXG5mdW5jdGlvbiBmcm9tQnl0ZUFycmF5ICh1aW50OCkge1xuICB2YXIgdG1wXG4gIHZhciBsZW4gPSB1aW50OC5sZW5ndGhcbiAgdmFyIGV4dHJhQnl0ZXMgPSBsZW4gJSAzIC8vIGlmIHdlIGhhdmUgMSBieXRlIGxlZnQsIHBhZCAyIGJ5dGVzXG4gIHZhciBwYXJ0cyA9IFtdXG4gIHZhciBtYXhDaHVua0xlbmd0aCA9IDE2MzgzIC8vIG11c3QgYmUgbXVsdGlwbGUgb2YgM1xuXG4gIC8vIGdvIHRocm91Z2ggdGhlIGFycmF5IGV2ZXJ5IHRocmVlIGJ5dGVzLCB3ZSdsbCBkZWFsIHdpdGggdHJhaWxpbmcgc3R1ZmYgbGF0ZXJcbiAgZm9yICh2YXIgaSA9IDAsIGxlbjIgPSBsZW4gLSBleHRyYUJ5dGVzOyBpIDwgbGVuMjsgaSArPSBtYXhDaHVua0xlbmd0aCkge1xuICAgIHBhcnRzLnB1c2goZW5jb2RlQ2h1bmsoXG4gICAgICB1aW50OCwgaSwgKGkgKyBtYXhDaHVua0xlbmd0aCkgPiBsZW4yID8gbGVuMiA6IChpICsgbWF4Q2h1bmtMZW5ndGgpXG4gICAgKSlcbiAgfVxuXG4gIC8vIHBhZCB0aGUgZW5kIHdpdGggemVyb3MsIGJ1dCBtYWtlIHN1cmUgdG8gbm90IGZvcmdldCB0aGUgZXh0cmEgYnl0ZXNcbiAgaWYgKGV4dHJhQnl0ZXMgPT09IDEpIHtcbiAgICB0bXAgPSB1aW50OFtsZW4gLSAxXVxuICAgIHBhcnRzLnB1c2goXG4gICAgICBsb29rdXBbdG1wID4+IDJdICtcbiAgICAgIGxvb2t1cFsodG1wIDw8IDQpICYgMHgzRl0gK1xuICAgICAgJz09J1xuICAgIClcbiAgfSBlbHNlIGlmIChleHRyYUJ5dGVzID09PSAyKSB7XG4gICAgdG1wID0gKHVpbnQ4W2xlbiAtIDJdIDw8IDgpICsgdWludDhbbGVuIC0gMV1cbiAgICBwYXJ0cy5wdXNoKFxuICAgICAgbG9va3VwW3RtcCA+PiAxMF0gK1xuICAgICAgbG9va3VwWyh0bXAgPj4gNCkgJiAweDNGXSArXG4gICAgICBsb29rdXBbKHRtcCA8PCAyKSAmIDB4M0ZdICtcbiAgICAgICc9J1xuICAgIClcbiAgfVxuXG4gIHJldHVybiBwYXJ0cy5qb2luKCcnKVxufVxuIiwiLyohXG4gKiBUaGUgYnVmZmVyIG1vZHVsZSBmcm9tIG5vZGUuanMsIGZvciB0aGUgYnJvd3Nlci5cbiAqXG4gKiBAYXV0aG9yICAgRmVyb3NzIEFib3VraGFkaWplaCA8aHR0cHM6Ly9mZXJvc3Mub3JnPlxuICogQGxpY2Vuc2UgIE1JVFxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1wcm90byAqL1xuXG4ndXNlIHN0cmljdCdcblxudmFyIGJhc2U2NCA9IHJlcXVpcmUoJ2Jhc2U2NC1qcycpXG52YXIgaWVlZTc1NCA9IHJlcXVpcmUoJ2llZWU3NTQnKVxuXG5leHBvcnRzLkJ1ZmZlciA9IEJ1ZmZlclxuZXhwb3J0cy5TbG93QnVmZmVyID0gU2xvd0J1ZmZlclxuZXhwb3J0cy5JTlNQRUNUX01BWF9CWVRFUyA9IDUwXG5cbnZhciBLX01BWF9MRU5HVEggPSAweDdmZmZmZmZmXG5leHBvcnRzLmtNYXhMZW5ndGggPSBLX01BWF9MRU5HVEhcblxuLyoqXG4gKiBJZiBgQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlRgOlxuICogICA9PT0gdHJ1ZSAgICBVc2UgVWludDhBcnJheSBpbXBsZW1lbnRhdGlvbiAoZmFzdGVzdClcbiAqICAgPT09IGZhbHNlICAgUHJpbnQgd2FybmluZyBhbmQgcmVjb21tZW5kIHVzaW5nIGBidWZmZXJgIHY0Lnggd2hpY2ggaGFzIGFuIE9iamVjdFxuICogICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiAobW9zdCBjb21wYXRpYmxlLCBldmVuIElFNilcbiAqXG4gKiBCcm93c2VycyB0aGF0IHN1cHBvcnQgdHlwZWQgYXJyYXlzIGFyZSBJRSAxMCssIEZpcmVmb3ggNCssIENocm9tZSA3KywgU2FmYXJpIDUuMSssXG4gKiBPcGVyYSAxMS42KywgaU9TIDQuMisuXG4gKlxuICogV2UgcmVwb3J0IHRoYXQgdGhlIGJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCB0eXBlZCBhcnJheXMgaWYgdGhlIGFyZSBub3Qgc3ViY2xhc3NhYmxlXG4gKiB1c2luZyBfX3Byb3RvX18uIEZpcmVmb3ggNC0yOSBsYWNrcyBzdXBwb3J0IGZvciBhZGRpbmcgbmV3IHByb3BlcnRpZXMgdG8gYFVpbnQ4QXJyYXlgXG4gKiAoU2VlOiBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD02OTU0MzgpLiBJRSAxMCBsYWNrcyBzdXBwb3J0XG4gKiBmb3IgX19wcm90b19fIGFuZCBoYXMgYSBidWdneSB0eXBlZCBhcnJheSBpbXBsZW1lbnRhdGlvbi5cbiAqL1xuQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQgPSB0eXBlZEFycmF5U3VwcG9ydCgpXG5cbmlmICghQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQgJiYgdHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnICYmXG4gICAgdHlwZW9mIGNvbnNvbGUuZXJyb3IgPT09ICdmdW5jdGlvbicpIHtcbiAgY29uc29sZS5lcnJvcihcbiAgICAnVGhpcyBicm93c2VyIGxhY2tzIHR5cGVkIGFycmF5IChVaW50OEFycmF5KSBzdXBwb3J0IHdoaWNoIGlzIHJlcXVpcmVkIGJ5ICcgK1xuICAgICdgYnVmZmVyYCB2NS54LiBVc2UgYGJ1ZmZlcmAgdjQueCBpZiB5b3UgcmVxdWlyZSBvbGQgYnJvd3NlciBzdXBwb3J0LidcbiAgKVxufVxuXG5mdW5jdGlvbiB0eXBlZEFycmF5U3VwcG9ydCAoKSB7XG4gIC8vIENhbiB0eXBlZCBhcnJheSBpbnN0YW5jZXMgY2FuIGJlIGF1Z21lbnRlZD9cbiAgdHJ5IHtcbiAgICB2YXIgYXJyID0gbmV3IFVpbnQ4QXJyYXkoMSlcbiAgICBhcnIuX19wcm90b19fID0ge19fcHJvdG9fXzogVWludDhBcnJheS5wcm90b3R5cGUsIGZvbzogZnVuY3Rpb24gKCkgeyByZXR1cm4gNDIgfX1cbiAgICByZXR1cm4gYXJyLmZvbygpID09PSA0MlxuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbn1cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KEJ1ZmZlci5wcm90b3R5cGUsICdwYXJlbnQnLCB7XG4gIGdldDogZnVuY3Rpb24gKCkge1xuICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBCdWZmZXIpKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgfVxuICAgIHJldHVybiB0aGlzLmJ1ZmZlclxuICB9XG59KVxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoQnVmZmVyLnByb3RvdHlwZSwgJ29mZnNldCcsIHtcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIEJ1ZmZlcikpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuYnl0ZU9mZnNldFxuICB9XG59KVxuXG5mdW5jdGlvbiBjcmVhdGVCdWZmZXIgKGxlbmd0aCkge1xuICBpZiAobGVuZ3RoID4gS19NQVhfTEVOR1RIKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0ludmFsaWQgdHlwZWQgYXJyYXkgbGVuZ3RoJylcbiAgfVxuICAvLyBSZXR1cm4gYW4gYXVnbWVudGVkIGBVaW50OEFycmF5YCBpbnN0YW5jZVxuICB2YXIgYnVmID0gbmV3IFVpbnQ4QXJyYXkobGVuZ3RoKVxuICBidWYuX19wcm90b19fID0gQnVmZmVyLnByb3RvdHlwZVxuICByZXR1cm4gYnVmXG59XG5cbi8qKlxuICogVGhlIEJ1ZmZlciBjb25zdHJ1Y3RvciByZXR1cm5zIGluc3RhbmNlcyBvZiBgVWludDhBcnJheWAgdGhhdCBoYXZlIHRoZWlyXG4gKiBwcm90b3R5cGUgY2hhbmdlZCB0byBgQnVmZmVyLnByb3RvdHlwZWAuIEZ1cnRoZXJtb3JlLCBgQnVmZmVyYCBpcyBhIHN1YmNsYXNzIG9mXG4gKiBgVWludDhBcnJheWAsIHNvIHRoZSByZXR1cm5lZCBpbnN0YW5jZXMgd2lsbCBoYXZlIGFsbCB0aGUgbm9kZSBgQnVmZmVyYCBtZXRob2RzXG4gKiBhbmQgdGhlIGBVaW50OEFycmF5YCBtZXRob2RzLiBTcXVhcmUgYnJhY2tldCBub3RhdGlvbiB3b3JrcyBhcyBleHBlY3RlZCAtLSBpdFxuICogcmV0dXJucyBhIHNpbmdsZSBvY3RldC5cbiAqXG4gKiBUaGUgYFVpbnQ4QXJyYXlgIHByb3RvdHlwZSByZW1haW5zIHVubW9kaWZpZWQuXG4gKi9cblxuZnVuY3Rpb24gQnVmZmVyIChhcmcsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aCkge1xuICAvLyBDb21tb24gY2FzZS5cbiAgaWYgKHR5cGVvZiBhcmcgPT09ICdudW1iZXInKSB7XG4gICAgaWYgKHR5cGVvZiBlbmNvZGluZ09yT2Zmc2V0ID09PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnSWYgZW5jb2RpbmcgaXMgc3BlY2lmaWVkIHRoZW4gdGhlIGZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYSBzdHJpbmcnXG4gICAgICApXG4gICAgfVxuICAgIHJldHVybiBhbGxvY1Vuc2FmZShhcmcpXG4gIH1cbiAgcmV0dXJuIGZyb20oYXJnLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpXG59XG5cbi8vIEZpeCBzdWJhcnJheSgpIGluIEVTMjAxNi4gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vZmVyb3NzL2J1ZmZlci9wdWxsLzk3XG5pZiAodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnNwZWNpZXMgJiZcbiAgICBCdWZmZXJbU3ltYm9sLnNwZWNpZXNdID09PSBCdWZmZXIpIHtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEJ1ZmZlciwgU3ltYm9sLnNwZWNpZXMsIHtcbiAgICB2YWx1ZTogbnVsbCxcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgd3JpdGFibGU6IGZhbHNlXG4gIH0pXG59XG5cbkJ1ZmZlci5wb29sU2l6ZSA9IDgxOTIgLy8gbm90IHVzZWQgYnkgdGhpcyBpbXBsZW1lbnRhdGlvblxuXG5mdW5jdGlvbiBmcm9tICh2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJ2YWx1ZVwiIGFyZ3VtZW50IG11c3Qgbm90IGJlIGEgbnVtYmVyJylcbiAgfVxuXG4gIGlmIChpc0FycmF5QnVmZmVyKHZhbHVlKSB8fCAodmFsdWUgJiYgaXNBcnJheUJ1ZmZlcih2YWx1ZS5idWZmZXIpKSkge1xuICAgIHJldHVybiBmcm9tQXJyYXlCdWZmZXIodmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbiAgfVxuXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGZyb21TdHJpbmcodmFsdWUsIGVuY29kaW5nT3JPZmZzZXQpXG4gIH1cblxuICByZXR1cm4gZnJvbU9iamVjdCh2YWx1ZSlcbn1cblxuLyoqXG4gKiBGdW5jdGlvbmFsbHkgZXF1aXZhbGVudCB0byBCdWZmZXIoYXJnLCBlbmNvZGluZykgYnV0IHRocm93cyBhIFR5cGVFcnJvclxuICogaWYgdmFsdWUgaXMgYSBudW1iZXIuXG4gKiBCdWZmZXIuZnJvbShzdHJbLCBlbmNvZGluZ10pXG4gKiBCdWZmZXIuZnJvbShhcnJheSlcbiAqIEJ1ZmZlci5mcm9tKGJ1ZmZlcilcbiAqIEJ1ZmZlci5mcm9tKGFycmF5QnVmZmVyWywgYnl0ZU9mZnNldFssIGxlbmd0aF1dKVxuICoqL1xuQnVmZmVyLmZyb20gPSBmdW5jdGlvbiAodmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gZnJvbSh2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxufVxuXG4vLyBOb3RlOiBDaGFuZ2UgcHJvdG90eXBlICphZnRlciogQnVmZmVyLmZyb20gaXMgZGVmaW5lZCB0byB3b3JrYXJvdW5kIENocm9tZSBidWc6XG4vLyBodHRwczovL2dpdGh1Yi5jb20vZmVyb3NzL2J1ZmZlci9wdWxsLzE0OFxuQnVmZmVyLnByb3RvdHlwZS5fX3Byb3RvX18gPSBVaW50OEFycmF5LnByb3RvdHlwZVxuQnVmZmVyLl9fcHJvdG9fXyA9IFVpbnQ4QXJyYXlcblxuZnVuY3Rpb24gYXNzZXJ0U2l6ZSAoc2l6ZSkge1xuICBpZiAodHlwZW9mIHNpemUgIT09ICdudW1iZXInKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJzaXplXCIgYXJndW1lbnQgbXVzdCBiZSBvZiB0eXBlIG51bWJlcicpXG4gIH0gZWxzZSBpZiAoc2l6ZSA8IDApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignXCJzaXplXCIgYXJndW1lbnQgbXVzdCBub3QgYmUgbmVnYXRpdmUnKVxuICB9XG59XG5cbmZ1bmN0aW9uIGFsbG9jIChzaXplLCBmaWxsLCBlbmNvZGluZykge1xuICBhc3NlcnRTaXplKHNpemUpXG4gIGlmIChzaXplIDw9IDApIHtcbiAgICByZXR1cm4gY3JlYXRlQnVmZmVyKHNpemUpXG4gIH1cbiAgaWYgKGZpbGwgIT09IHVuZGVmaW5lZCkge1xuICAgIC8vIE9ubHkgcGF5IGF0dGVudGlvbiB0byBlbmNvZGluZyBpZiBpdCdzIGEgc3RyaW5nLiBUaGlzXG4gICAgLy8gcHJldmVudHMgYWNjaWRlbnRhbGx5IHNlbmRpbmcgaW4gYSBudW1iZXIgdGhhdCB3b3VsZFxuICAgIC8vIGJlIGludGVycHJldHRlZCBhcyBhIHN0YXJ0IG9mZnNldC5cbiAgICByZXR1cm4gdHlwZW9mIGVuY29kaW5nID09PSAnc3RyaW5nJ1xuICAgICAgPyBjcmVhdGVCdWZmZXIoc2l6ZSkuZmlsbChmaWxsLCBlbmNvZGluZylcbiAgICAgIDogY3JlYXRlQnVmZmVyKHNpemUpLmZpbGwoZmlsbClcbiAgfVxuICByZXR1cm4gY3JlYXRlQnVmZmVyKHNpemUpXG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBmaWxsZWQgQnVmZmVyIGluc3RhbmNlLlxuICogYWxsb2Moc2l6ZVssIGZpbGxbLCBlbmNvZGluZ11dKVxuICoqL1xuQnVmZmVyLmFsbG9jID0gZnVuY3Rpb24gKHNpemUsIGZpbGwsIGVuY29kaW5nKSB7XG4gIHJldHVybiBhbGxvYyhzaXplLCBmaWxsLCBlbmNvZGluZylcbn1cblxuZnVuY3Rpb24gYWxsb2NVbnNhZmUgKHNpemUpIHtcbiAgYXNzZXJ0U2l6ZShzaXplKVxuICByZXR1cm4gY3JlYXRlQnVmZmVyKHNpemUgPCAwID8gMCA6IGNoZWNrZWQoc2l6ZSkgfCAwKVxufVxuXG4vKipcbiAqIEVxdWl2YWxlbnQgdG8gQnVmZmVyKG51bSksIGJ5IGRlZmF1bHQgY3JlYXRlcyBhIG5vbi16ZXJvLWZpbGxlZCBCdWZmZXIgaW5zdGFuY2UuXG4gKiAqL1xuQnVmZmVyLmFsbG9jVW5zYWZlID0gZnVuY3Rpb24gKHNpemUpIHtcbiAgcmV0dXJuIGFsbG9jVW5zYWZlKHNpemUpXG59XG4vKipcbiAqIEVxdWl2YWxlbnQgdG8gU2xvd0J1ZmZlcihudW0pLCBieSBkZWZhdWx0IGNyZWF0ZXMgYSBub24temVyby1maWxsZWQgQnVmZmVyIGluc3RhbmNlLlxuICovXG5CdWZmZXIuYWxsb2NVbnNhZmVTbG93ID0gZnVuY3Rpb24gKHNpemUpIHtcbiAgcmV0dXJuIGFsbG9jVW5zYWZlKHNpemUpXG59XG5cbmZ1bmN0aW9uIGZyb21TdHJpbmcgKHN0cmluZywgZW5jb2RpbmcpIHtcbiAgaWYgKHR5cGVvZiBlbmNvZGluZyAhPT0gJ3N0cmluZycgfHwgZW5jb2RpbmcgPT09ICcnKSB7XG4gICAgZW5jb2RpbmcgPSAndXRmOCdcbiAgfVxuXG4gIGlmICghQnVmZmVyLmlzRW5jb2RpbmcoZW5jb2RpbmcpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVW5rbm93biBlbmNvZGluZzogJyArIGVuY29kaW5nKVxuICB9XG5cbiAgdmFyIGxlbmd0aCA9IGJ5dGVMZW5ndGgoc3RyaW5nLCBlbmNvZGluZykgfCAwXG4gIHZhciBidWYgPSBjcmVhdGVCdWZmZXIobGVuZ3RoKVxuXG4gIHZhciBhY3R1YWwgPSBidWYud3JpdGUoc3RyaW5nLCBlbmNvZGluZylcblxuICBpZiAoYWN0dWFsICE9PSBsZW5ndGgpIHtcbiAgICAvLyBXcml0aW5nIGEgaGV4IHN0cmluZywgZm9yIGV4YW1wbGUsIHRoYXQgY29udGFpbnMgaW52YWxpZCBjaGFyYWN0ZXJzIHdpbGxcbiAgICAvLyBjYXVzZSBldmVyeXRoaW5nIGFmdGVyIHRoZSBmaXJzdCBpbnZhbGlkIGNoYXJhY3RlciB0byBiZSBpZ25vcmVkLiAoZS5nLlxuICAgIC8vICdhYnh4Y2QnIHdpbGwgYmUgdHJlYXRlZCBhcyAnYWInKVxuICAgIGJ1ZiA9IGJ1Zi5zbGljZSgwLCBhY3R1YWwpXG4gIH1cblxuICByZXR1cm4gYnVmXG59XG5cbmZ1bmN0aW9uIGZyb21BcnJheUxpa2UgKGFycmF5KSB7XG4gIHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGggPCAwID8gMCA6IGNoZWNrZWQoYXJyYXkubGVuZ3RoKSB8IDBcbiAgdmFyIGJ1ZiA9IGNyZWF0ZUJ1ZmZlcihsZW5ndGgpXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpICs9IDEpIHtcbiAgICBidWZbaV0gPSBhcnJheVtpXSAmIDI1NVxuICB9XG4gIHJldHVybiBidWZcbn1cblxuZnVuY3Rpb24gZnJvbUFycmF5QnVmZmVyIChhcnJheSwgYnl0ZU9mZnNldCwgbGVuZ3RoKSB7XG4gIGlmIChieXRlT2Zmc2V0IDwgMCB8fCBhcnJheS5ieXRlTGVuZ3RoIDwgYnl0ZU9mZnNldCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdcIm9mZnNldFwiIGlzIG91dHNpZGUgb2YgYnVmZmVyIGJvdW5kcycpXG4gIH1cblxuICBpZiAoYXJyYXkuYnl0ZUxlbmd0aCA8IGJ5dGVPZmZzZXQgKyAobGVuZ3RoIHx8IDApKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1wibGVuZ3RoXCIgaXMgb3V0c2lkZSBvZiBidWZmZXIgYm91bmRzJylcbiAgfVxuXG4gIHZhciBidWZcbiAgaWYgKGJ5dGVPZmZzZXQgPT09IHVuZGVmaW5lZCAmJiBsZW5ndGggPT09IHVuZGVmaW5lZCkge1xuICAgIGJ1ZiA9IG5ldyBVaW50OEFycmF5KGFycmF5KVxuICB9IGVsc2UgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgYnVmID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXksIGJ5dGVPZmZzZXQpXG4gIH0gZWxzZSB7XG4gICAgYnVmID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXksIGJ5dGVPZmZzZXQsIGxlbmd0aClcbiAgfVxuXG4gIC8vIFJldHVybiBhbiBhdWdtZW50ZWQgYFVpbnQ4QXJyYXlgIGluc3RhbmNlXG4gIGJ1Zi5fX3Byb3RvX18gPSBCdWZmZXIucHJvdG90eXBlXG4gIHJldHVybiBidWZcbn1cblxuZnVuY3Rpb24gZnJvbU9iamVjdCAob2JqKSB7XG4gIGlmIChCdWZmZXIuaXNCdWZmZXIob2JqKSkge1xuICAgIHZhciBsZW4gPSBjaGVja2VkKG9iai5sZW5ndGgpIHwgMFxuICAgIHZhciBidWYgPSBjcmVhdGVCdWZmZXIobGVuKVxuXG4gICAgaWYgKGJ1Zi5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBidWZcbiAgICB9XG5cbiAgICBvYmouY29weShidWYsIDAsIDAsIGxlbilcbiAgICByZXR1cm4gYnVmXG4gIH1cblxuICBpZiAob2JqKSB7XG4gICAgaWYgKEFycmF5QnVmZmVyLmlzVmlldyhvYmopIHx8ICdsZW5ndGgnIGluIG9iaikge1xuICAgICAgaWYgKHR5cGVvZiBvYmoubGVuZ3RoICE9PSAnbnVtYmVyJyB8fCBudW1iZXJJc05hTihvYmoubGVuZ3RoKSkge1xuICAgICAgICByZXR1cm4gY3JlYXRlQnVmZmVyKDApXG4gICAgICB9XG4gICAgICByZXR1cm4gZnJvbUFycmF5TGlrZShvYmopXG4gICAgfVxuXG4gICAgaWYgKG9iai50eXBlID09PSAnQnVmZmVyJyAmJiBBcnJheS5pc0FycmF5KG9iai5kYXRhKSkge1xuICAgICAgcmV0dXJuIGZyb21BcnJheUxpa2Uob2JqLmRhdGEpXG4gICAgfVxuICB9XG5cbiAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIGZpcnN0IGFyZ3VtZW50IG11c3QgYmUgb25lIG9mIHR5cGUgc3RyaW5nLCBCdWZmZXIsIEFycmF5QnVmZmVyLCBBcnJheSwgb3IgQXJyYXktbGlrZSBPYmplY3QuJylcbn1cblxuZnVuY3Rpb24gY2hlY2tlZCAobGVuZ3RoKSB7XG4gIC8vIE5vdGU6IGNhbm5vdCB1c2UgYGxlbmd0aCA8IEtfTUFYX0xFTkdUSGAgaGVyZSBiZWNhdXNlIHRoYXQgZmFpbHMgd2hlblxuICAvLyBsZW5ndGggaXMgTmFOICh3aGljaCBpcyBvdGhlcndpc2UgY29lcmNlZCB0byB6ZXJvLilcbiAgaWYgKGxlbmd0aCA+PSBLX01BWF9MRU5HVEgpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQXR0ZW1wdCB0byBhbGxvY2F0ZSBCdWZmZXIgbGFyZ2VyIHRoYW4gbWF4aW11bSAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAnc2l6ZTogMHgnICsgS19NQVhfTEVOR1RILnRvU3RyaW5nKDE2KSArICcgYnl0ZXMnKVxuICB9XG4gIHJldHVybiBsZW5ndGggfCAwXG59XG5cbmZ1bmN0aW9uIFNsb3dCdWZmZXIgKGxlbmd0aCkge1xuICBpZiAoK2xlbmd0aCAhPSBsZW5ndGgpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBlcWVxZXFcbiAgICBsZW5ndGggPSAwXG4gIH1cbiAgcmV0dXJuIEJ1ZmZlci5hbGxvYygrbGVuZ3RoKVxufVxuXG5CdWZmZXIuaXNCdWZmZXIgPSBmdW5jdGlvbiBpc0J1ZmZlciAoYikge1xuICByZXR1cm4gYiAhPSBudWxsICYmIGIuX2lzQnVmZmVyID09PSB0cnVlXG59XG5cbkJ1ZmZlci5jb21wYXJlID0gZnVuY3Rpb24gY29tcGFyZSAoYSwgYikge1xuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihhKSB8fCAhQnVmZmVyLmlzQnVmZmVyKGIpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnRzIG11c3QgYmUgQnVmZmVycycpXG4gIH1cblxuICBpZiAoYSA9PT0gYikgcmV0dXJuIDBcblxuICB2YXIgeCA9IGEubGVuZ3RoXG4gIHZhciB5ID0gYi5sZW5ndGhcblxuICBmb3IgKHZhciBpID0gMCwgbGVuID0gTWF0aC5taW4oeCwgeSk7IGkgPCBsZW47ICsraSkge1xuICAgIGlmIChhW2ldICE9PSBiW2ldKSB7XG4gICAgICB4ID0gYVtpXVxuICAgICAgeSA9IGJbaV1cbiAgICAgIGJyZWFrXG4gICAgfVxuICB9XG5cbiAgaWYgKHggPCB5KSByZXR1cm4gLTFcbiAgaWYgKHkgPCB4KSByZXR1cm4gMVxuICByZXR1cm4gMFxufVxuXG5CdWZmZXIuaXNFbmNvZGluZyA9IGZ1bmN0aW9uIGlzRW5jb2RpbmcgKGVuY29kaW5nKSB7XG4gIHN3aXRjaCAoU3RyaW5nKGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgY2FzZSAnaGV4JzpcbiAgICBjYXNlICd1dGY4JzpcbiAgICBjYXNlICd1dGYtOCc6XG4gICAgY2FzZSAnYXNjaWknOlxuICAgIGNhc2UgJ2xhdGluMSc6XG4gICAgY2FzZSAnYmluYXJ5JzpcbiAgICBjYXNlICdiYXNlNjQnOlxuICAgIGNhc2UgJ3VjczInOlxuICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICBjYXNlICd1dGYxNmxlJzpcbiAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuXG5CdWZmZXIuY29uY2F0ID0gZnVuY3Rpb24gY29uY2F0IChsaXN0LCBsZW5ndGgpIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KGxpc3QpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJsaXN0XCIgYXJndW1lbnQgbXVzdCBiZSBhbiBBcnJheSBvZiBCdWZmZXJzJylcbiAgfVxuXG4gIGlmIChsaXN0Lmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBCdWZmZXIuYWxsb2MoMClcbiAgfVxuXG4gIHZhciBpXG4gIGlmIChsZW5ndGggPT09IHVuZGVmaW5lZCkge1xuICAgIGxlbmd0aCA9IDBcbiAgICBmb3IgKGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7ICsraSkge1xuICAgICAgbGVuZ3RoICs9IGxpc3RbaV0ubGVuZ3RoXG4gICAgfVxuICB9XG5cbiAgdmFyIGJ1ZmZlciA9IEJ1ZmZlci5hbGxvY1Vuc2FmZShsZW5ndGgpXG4gIHZhciBwb3MgPSAwXG4gIGZvciAoaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgKytpKSB7XG4gICAgdmFyIGJ1ZiA9IGxpc3RbaV1cbiAgICBpZiAoQXJyYXlCdWZmZXIuaXNWaWV3KGJ1ZikpIHtcbiAgICAgIGJ1ZiA9IEJ1ZmZlci5mcm9tKGJ1ZilcbiAgICB9XG4gICAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoYnVmKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJsaXN0XCIgYXJndW1lbnQgbXVzdCBiZSBhbiBBcnJheSBvZiBCdWZmZXJzJylcbiAgICB9XG4gICAgYnVmLmNvcHkoYnVmZmVyLCBwb3MpXG4gICAgcG9zICs9IGJ1Zi5sZW5ndGhcbiAgfVxuICByZXR1cm4gYnVmZmVyXG59XG5cbmZ1bmN0aW9uIGJ5dGVMZW5ndGggKHN0cmluZywgZW5jb2RpbmcpIHtcbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihzdHJpbmcpKSB7XG4gICAgcmV0dXJuIHN0cmluZy5sZW5ndGhcbiAgfVxuICBpZiAoQXJyYXlCdWZmZXIuaXNWaWV3KHN0cmluZykgfHwgaXNBcnJheUJ1ZmZlcihzdHJpbmcpKSB7XG4gICAgcmV0dXJuIHN0cmluZy5ieXRlTGVuZ3RoXG4gIH1cbiAgaWYgKHR5cGVvZiBzdHJpbmcgIT09ICdzdHJpbmcnKSB7XG4gICAgc3RyaW5nID0gJycgKyBzdHJpbmdcbiAgfVxuXG4gIHZhciBsZW4gPSBzdHJpbmcubGVuZ3RoXG4gIGlmIChsZW4gPT09IDApIHJldHVybiAwXG5cbiAgLy8gVXNlIGEgZm9yIGxvb3AgdG8gYXZvaWQgcmVjdXJzaW9uXG4gIHZhciBsb3dlcmVkQ2FzZSA9IGZhbHNlXG4gIGZvciAoOzspIHtcbiAgICBzd2l0Y2ggKGVuY29kaW5nKSB7XG4gICAgICBjYXNlICdhc2NpaSc6XG4gICAgICBjYXNlICdsYXRpbjEnOlxuICAgICAgY2FzZSAnYmluYXJ5JzpcbiAgICAgICAgcmV0dXJuIGxlblxuICAgICAgY2FzZSAndXRmOCc6XG4gICAgICBjYXNlICd1dGYtOCc6XG4gICAgICBjYXNlIHVuZGVmaW5lZDpcbiAgICAgICAgcmV0dXJuIHV0ZjhUb0J5dGVzKHN0cmluZykubGVuZ3RoXG4gICAgICBjYXNlICd1Y3MyJzpcbiAgICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgICByZXR1cm4gbGVuICogMlxuICAgICAgY2FzZSAnaGV4JzpcbiAgICAgICAgcmV0dXJuIGxlbiA+Pj4gMVxuICAgICAgY2FzZSAnYmFzZTY0JzpcbiAgICAgICAgcmV0dXJuIGJhc2U2NFRvQnl0ZXMoc3RyaW5nKS5sZW5ndGhcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChsb3dlcmVkQ2FzZSkgcmV0dXJuIHV0ZjhUb0J5dGVzKHN0cmluZykubGVuZ3RoIC8vIGFzc3VtZSB1dGY4XG4gICAgICAgIGVuY29kaW5nID0gKCcnICsgZW5jb2RpbmcpLnRvTG93ZXJDYXNlKClcbiAgICAgICAgbG93ZXJlZENhc2UgPSB0cnVlXG4gICAgfVxuICB9XG59XG5CdWZmZXIuYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGhcblxuZnVuY3Rpb24gc2xvd1RvU3RyaW5nIChlbmNvZGluZywgc3RhcnQsIGVuZCkge1xuICB2YXIgbG93ZXJlZENhc2UgPSBmYWxzZVxuXG4gIC8vIE5vIG5lZWQgdG8gdmVyaWZ5IHRoYXQgXCJ0aGlzLmxlbmd0aCA8PSBNQVhfVUlOVDMyXCIgc2luY2UgaXQncyBhIHJlYWQtb25seVxuICAvLyBwcm9wZXJ0eSBvZiBhIHR5cGVkIGFycmF5LlxuXG4gIC8vIFRoaXMgYmVoYXZlcyBuZWl0aGVyIGxpa2UgU3RyaW5nIG5vciBVaW50OEFycmF5IGluIHRoYXQgd2Ugc2V0IHN0YXJ0L2VuZFxuICAvLyB0byB0aGVpciB1cHBlci9sb3dlciBib3VuZHMgaWYgdGhlIHZhbHVlIHBhc3NlZCBpcyBvdXQgb2YgcmFuZ2UuXG4gIC8vIHVuZGVmaW5lZCBpcyBoYW5kbGVkIHNwZWNpYWxseSBhcyBwZXIgRUNNQS0yNjIgNnRoIEVkaXRpb24sXG4gIC8vIFNlY3Rpb24gMTMuMy4zLjcgUnVudGltZSBTZW1hbnRpY3M6IEtleWVkQmluZGluZ0luaXRpYWxpemF0aW9uLlxuICBpZiAoc3RhcnQgPT09IHVuZGVmaW5lZCB8fCBzdGFydCA8IDApIHtcbiAgICBzdGFydCA9IDBcbiAgfVxuICAvLyBSZXR1cm4gZWFybHkgaWYgc3RhcnQgPiB0aGlzLmxlbmd0aC4gRG9uZSBoZXJlIHRvIHByZXZlbnQgcG90ZW50aWFsIHVpbnQzMlxuICAvLyBjb2VyY2lvbiBmYWlsIGJlbG93LlxuICBpZiAoc3RhcnQgPiB0aGlzLmxlbmd0aCkge1xuICAgIHJldHVybiAnJ1xuICB9XG5cbiAgaWYgKGVuZCA9PT0gdW5kZWZpbmVkIHx8IGVuZCA+IHRoaXMubGVuZ3RoKSB7XG4gICAgZW5kID0gdGhpcy5sZW5ndGhcbiAgfVxuXG4gIGlmIChlbmQgPD0gMCkge1xuICAgIHJldHVybiAnJ1xuICB9XG5cbiAgLy8gRm9yY2UgY29lcnNpb24gdG8gdWludDMyLiBUaGlzIHdpbGwgYWxzbyBjb2VyY2UgZmFsc2V5L05hTiB2YWx1ZXMgdG8gMC5cbiAgZW5kID4+Pj0gMFxuICBzdGFydCA+Pj49IDBcblxuICBpZiAoZW5kIDw9IHN0YXJ0KSB7XG4gICAgcmV0dXJuICcnXG4gIH1cblxuICBpZiAoIWVuY29kaW5nKSBlbmNvZGluZyA9ICd1dGY4J1xuXG4gIHdoaWxlICh0cnVlKSB7XG4gICAgc3dpdGNoIChlbmNvZGluZykge1xuICAgICAgY2FzZSAnaGV4JzpcbiAgICAgICAgcmV0dXJuIGhleFNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ3V0ZjgnOlxuICAgICAgY2FzZSAndXRmLTgnOlxuICAgICAgICByZXR1cm4gdXRmOFNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ2FzY2lpJzpcbiAgICAgICAgcmV0dXJuIGFzY2lpU2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAnbGF0aW4xJzpcbiAgICAgIGNhc2UgJ2JpbmFyeSc6XG4gICAgICAgIHJldHVybiBsYXRpbjFTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgICByZXR1cm4gYmFzZTY0U2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAndWNzMic6XG4gICAgICBjYXNlICd1Y3MtMic6XG4gICAgICBjYXNlICd1dGYxNmxlJzpcbiAgICAgIGNhc2UgJ3V0Zi0xNmxlJzpcbiAgICAgICAgcmV0dXJuIHV0ZjE2bGVTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAobG93ZXJlZENhc2UpIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmNvZGluZylcbiAgICAgICAgZW5jb2RpbmcgPSAoZW5jb2RpbmcgKyAnJykudG9Mb3dlckNhc2UoKVxuICAgICAgICBsb3dlcmVkQ2FzZSA9IHRydWVcbiAgICB9XG4gIH1cbn1cblxuLy8gVGhpcyBwcm9wZXJ0eSBpcyB1c2VkIGJ5IGBCdWZmZXIuaXNCdWZmZXJgIChhbmQgdGhlIGBpcy1idWZmZXJgIG5wbSBwYWNrYWdlKVxuLy8gdG8gZGV0ZWN0IGEgQnVmZmVyIGluc3RhbmNlLiBJdCdzIG5vdCBwb3NzaWJsZSB0byB1c2UgYGluc3RhbmNlb2YgQnVmZmVyYFxuLy8gcmVsaWFibHkgaW4gYSBicm93c2VyaWZ5IGNvbnRleHQgYmVjYXVzZSB0aGVyZSBjb3VsZCBiZSBtdWx0aXBsZSBkaWZmZXJlbnRcbi8vIGNvcGllcyBvZiB0aGUgJ2J1ZmZlcicgcGFja2FnZSBpbiB1c2UuIFRoaXMgbWV0aG9kIHdvcmtzIGV2ZW4gZm9yIEJ1ZmZlclxuLy8gaW5zdGFuY2VzIHRoYXQgd2VyZSBjcmVhdGVkIGZyb20gYW5vdGhlciBjb3B5IG9mIHRoZSBgYnVmZmVyYCBwYWNrYWdlLlxuLy8gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vZmVyb3NzL2J1ZmZlci9pc3N1ZXMvMTU0XG5CdWZmZXIucHJvdG90eXBlLl9pc0J1ZmZlciA9IHRydWVcblxuZnVuY3Rpb24gc3dhcCAoYiwgbiwgbSkge1xuICB2YXIgaSA9IGJbbl1cbiAgYltuXSA9IGJbbV1cbiAgYlttXSA9IGlcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5zd2FwMTYgPSBmdW5jdGlvbiBzd2FwMTYgKCkge1xuICB2YXIgbGVuID0gdGhpcy5sZW5ndGhcbiAgaWYgKGxlbiAlIDIgIT09IDApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LWJpdHMnKVxuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpICs9IDIpIHtcbiAgICBzd2FwKHRoaXMsIGksIGkgKyAxKVxuICB9XG4gIHJldHVybiB0aGlzXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuc3dhcDMyID0gZnVuY3Rpb24gc3dhcDMyICgpIHtcbiAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoXG4gIGlmIChsZW4gJSA0ICE9PSAwKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0J1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAzMi1iaXRzJylcbiAgfVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSArPSA0KSB7XG4gICAgc3dhcCh0aGlzLCBpLCBpICsgMylcbiAgICBzd2FwKHRoaXMsIGkgKyAxLCBpICsgMilcbiAgfVxuICByZXR1cm4gdGhpc1xufVxuXG5CdWZmZXIucHJvdG90eXBlLnN3YXA2NCA9IGZ1bmN0aW9uIHN3YXA2NCAoKSB7XG4gIHZhciBsZW4gPSB0aGlzLmxlbmd0aFxuICBpZiAobGVuICUgOCAhPT0gMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNjQtYml0cycpXG4gIH1cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkgKz0gOCkge1xuICAgIHN3YXAodGhpcywgaSwgaSArIDcpXG4gICAgc3dhcCh0aGlzLCBpICsgMSwgaSArIDYpXG4gICAgc3dhcCh0aGlzLCBpICsgMiwgaSArIDUpXG4gICAgc3dhcCh0aGlzLCBpICsgMywgaSArIDQpXG4gIH1cbiAgcmV0dXJuIHRoaXNcbn1cblxuQnVmZmVyLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nICgpIHtcbiAgdmFyIGxlbmd0aCA9IHRoaXMubGVuZ3RoXG4gIGlmIChsZW5ndGggPT09IDApIHJldHVybiAnJ1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHV0ZjhTbGljZSh0aGlzLCAwLCBsZW5ndGgpXG4gIHJldHVybiBzbG93VG9TdHJpbmcuYXBwbHkodGhpcywgYXJndW1lbnRzKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnRvTG9jYWxlU3RyaW5nID0gQnVmZmVyLnByb3RvdHlwZS50b1N0cmluZ1xuXG5CdWZmZXIucHJvdG90eXBlLmVxdWFscyA9IGZ1bmN0aW9uIGVxdWFscyAoYikge1xuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihiKSkgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlcicpXG4gIGlmICh0aGlzID09PSBiKSByZXR1cm4gdHJ1ZVxuICByZXR1cm4gQnVmZmVyLmNvbXBhcmUodGhpcywgYikgPT09IDBcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5pbnNwZWN0ID0gZnVuY3Rpb24gaW5zcGVjdCAoKSB7XG4gIHZhciBzdHIgPSAnJ1xuICB2YXIgbWF4ID0gZXhwb3J0cy5JTlNQRUNUX01BWF9CWVRFU1xuICBpZiAodGhpcy5sZW5ndGggPiAwKSB7XG4gICAgc3RyID0gdGhpcy50b1N0cmluZygnaGV4JywgMCwgbWF4KS5tYXRjaCgvLnsyfS9nKS5qb2luKCcgJylcbiAgICBpZiAodGhpcy5sZW5ndGggPiBtYXgpIHN0ciArPSAnIC4uLiAnXG4gIH1cbiAgcmV0dXJuICc8QnVmZmVyICcgKyBzdHIgKyAnPidcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5jb21wYXJlID0gZnVuY3Rpb24gY29tcGFyZSAodGFyZ2V0LCBzdGFydCwgZW5kLCB0aGlzU3RhcnQsIHRoaXNFbmQpIHtcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIodGFyZ2V0KSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXInKVxuICB9XG5cbiAgaWYgKHN0YXJ0ID09PSB1bmRlZmluZWQpIHtcbiAgICBzdGFydCA9IDBcbiAgfVxuICBpZiAoZW5kID09PSB1bmRlZmluZWQpIHtcbiAgICBlbmQgPSB0YXJnZXQgPyB0YXJnZXQubGVuZ3RoIDogMFxuICB9XG4gIGlmICh0aGlzU3RhcnQgPT09IHVuZGVmaW5lZCkge1xuICAgIHRoaXNTdGFydCA9IDBcbiAgfVxuICBpZiAodGhpc0VuZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhpc0VuZCA9IHRoaXMubGVuZ3RoXG4gIH1cblxuICBpZiAoc3RhcnQgPCAwIHx8IGVuZCA+IHRhcmdldC5sZW5ndGggfHwgdGhpc1N0YXJ0IDwgMCB8fCB0aGlzRW5kID4gdGhpcy5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignb3V0IG9mIHJhbmdlIGluZGV4JylcbiAgfVxuXG4gIGlmICh0aGlzU3RhcnQgPj0gdGhpc0VuZCAmJiBzdGFydCA+PSBlbmQpIHtcbiAgICByZXR1cm4gMFxuICB9XG4gIGlmICh0aGlzU3RhcnQgPj0gdGhpc0VuZCkge1xuICAgIHJldHVybiAtMVxuICB9XG4gIGlmIChzdGFydCA+PSBlbmQpIHtcbiAgICByZXR1cm4gMVxuICB9XG5cbiAgc3RhcnQgPj4+PSAwXG4gIGVuZCA+Pj49IDBcbiAgdGhpc1N0YXJ0ID4+Pj0gMFxuICB0aGlzRW5kID4+Pj0gMFxuXG4gIGlmICh0aGlzID09PSB0YXJnZXQpIHJldHVybiAwXG5cbiAgdmFyIHggPSB0aGlzRW5kIC0gdGhpc1N0YXJ0XG4gIHZhciB5ID0gZW5kIC0gc3RhcnRcbiAgdmFyIGxlbiA9IE1hdGgubWluKHgsIHkpXG5cbiAgdmFyIHRoaXNDb3B5ID0gdGhpcy5zbGljZSh0aGlzU3RhcnQsIHRoaXNFbmQpXG4gIHZhciB0YXJnZXRDb3B5ID0gdGFyZ2V0LnNsaWNlKHN0YXJ0LCBlbmQpXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47ICsraSkge1xuICAgIGlmICh0aGlzQ29weVtpXSAhPT0gdGFyZ2V0Q29weVtpXSkge1xuICAgICAgeCA9IHRoaXNDb3B5W2ldXG4gICAgICB5ID0gdGFyZ2V0Q29weVtpXVxuICAgICAgYnJlYWtcbiAgICB9XG4gIH1cblxuICBpZiAoeCA8IHkpIHJldHVybiAtMVxuICBpZiAoeSA8IHgpIHJldHVybiAxXG4gIHJldHVybiAwXG59XG5cbi8vIEZpbmRzIGVpdGhlciB0aGUgZmlyc3QgaW5kZXggb2YgYHZhbGAgaW4gYGJ1ZmZlcmAgYXQgb2Zmc2V0ID49IGBieXRlT2Zmc2V0YCxcbi8vIE9SIHRoZSBsYXN0IGluZGV4IG9mIGB2YWxgIGluIGBidWZmZXJgIGF0IG9mZnNldCA8PSBgYnl0ZU9mZnNldGAuXG4vL1xuLy8gQXJndW1lbnRzOlxuLy8gLSBidWZmZXIgLSBhIEJ1ZmZlciB0byBzZWFyY2hcbi8vIC0gdmFsIC0gYSBzdHJpbmcsIEJ1ZmZlciwgb3IgbnVtYmVyXG4vLyAtIGJ5dGVPZmZzZXQgLSBhbiBpbmRleCBpbnRvIGBidWZmZXJgOyB3aWxsIGJlIGNsYW1wZWQgdG8gYW4gaW50MzJcbi8vIC0gZW5jb2RpbmcgLSBhbiBvcHRpb25hbCBlbmNvZGluZywgcmVsZXZhbnQgaXMgdmFsIGlzIGEgc3RyaW5nXG4vLyAtIGRpciAtIHRydWUgZm9yIGluZGV4T2YsIGZhbHNlIGZvciBsYXN0SW5kZXhPZlxuZnVuY3Rpb24gYmlkaXJlY3Rpb25hbEluZGV4T2YgKGJ1ZmZlciwgdmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgZGlyKSB7XG4gIC8vIEVtcHR5IGJ1ZmZlciBtZWFucyBubyBtYXRjaFxuICBpZiAoYnVmZmVyLmxlbmd0aCA9PT0gMCkgcmV0dXJuIC0xXG5cbiAgLy8gTm9ybWFsaXplIGJ5dGVPZmZzZXRcbiAgaWYgKHR5cGVvZiBieXRlT2Zmc2V0ID09PSAnc3RyaW5nJykge1xuICAgIGVuY29kaW5nID0gYnl0ZU9mZnNldFxuICAgIGJ5dGVPZmZzZXQgPSAwXG4gIH0gZWxzZSBpZiAoYnl0ZU9mZnNldCA+IDB4N2ZmZmZmZmYpIHtcbiAgICBieXRlT2Zmc2V0ID0gMHg3ZmZmZmZmZlxuICB9IGVsc2UgaWYgKGJ5dGVPZmZzZXQgPCAtMHg4MDAwMDAwMCkge1xuICAgIGJ5dGVPZmZzZXQgPSAtMHg4MDAwMDAwMFxuICB9XG4gIGJ5dGVPZmZzZXQgPSArYnl0ZU9mZnNldCAgLy8gQ29lcmNlIHRvIE51bWJlci5cbiAgaWYgKG51bWJlcklzTmFOKGJ5dGVPZmZzZXQpKSB7XG4gICAgLy8gYnl0ZU9mZnNldDogaXQgaXQncyB1bmRlZmluZWQsIG51bGwsIE5hTiwgXCJmb29cIiwgZXRjLCBzZWFyY2ggd2hvbGUgYnVmZmVyXG4gICAgYnl0ZU9mZnNldCA9IGRpciA/IDAgOiAoYnVmZmVyLmxlbmd0aCAtIDEpXG4gIH1cblxuICAvLyBOb3JtYWxpemUgYnl0ZU9mZnNldDogbmVnYXRpdmUgb2Zmc2V0cyBzdGFydCBmcm9tIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlclxuICBpZiAoYnl0ZU9mZnNldCA8IDApIGJ5dGVPZmZzZXQgPSBidWZmZXIubGVuZ3RoICsgYnl0ZU9mZnNldFxuICBpZiAoYnl0ZU9mZnNldCA+PSBidWZmZXIubGVuZ3RoKSB7XG4gICAgaWYgKGRpcikgcmV0dXJuIC0xXG4gICAgZWxzZSBieXRlT2Zmc2V0ID0gYnVmZmVyLmxlbmd0aCAtIDFcbiAgfSBlbHNlIGlmIChieXRlT2Zmc2V0IDwgMCkge1xuICAgIGlmIChkaXIpIGJ5dGVPZmZzZXQgPSAwXG4gICAgZWxzZSByZXR1cm4gLTFcbiAgfVxuXG4gIC8vIE5vcm1hbGl6ZSB2YWxcbiAgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnKSB7XG4gICAgdmFsID0gQnVmZmVyLmZyb20odmFsLCBlbmNvZGluZylcbiAgfVxuXG4gIC8vIEZpbmFsbHksIHNlYXJjaCBlaXRoZXIgaW5kZXhPZiAoaWYgZGlyIGlzIHRydWUpIG9yIGxhc3RJbmRleE9mXG4gIGlmIChCdWZmZXIuaXNCdWZmZXIodmFsKSkge1xuICAgIC8vIFNwZWNpYWwgY2FzZTogbG9va2luZyBmb3IgZW1wdHkgc3RyaW5nL2J1ZmZlciBhbHdheXMgZmFpbHNcbiAgICBpZiAodmFsLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIC0xXG4gICAgfVxuICAgIHJldHVybiBhcnJheUluZGV4T2YoYnVmZmVyLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBkaXIpXG4gIH0gZWxzZSBpZiAodHlwZW9mIHZhbCA9PT0gJ251bWJlcicpIHtcbiAgICB2YWwgPSB2YWwgJiAweEZGIC8vIFNlYXJjaCBmb3IgYSBieXRlIHZhbHVlIFswLTI1NV1cbiAgICBpZiAodHlwZW9mIFVpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2YgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGlmIChkaXIpIHtcbiAgICAgICAgcmV0dXJuIFVpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2YuY2FsbChidWZmZXIsIHZhbCwgYnl0ZU9mZnNldClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBVaW50OEFycmF5LnByb3RvdHlwZS5sYXN0SW5kZXhPZi5jYWxsKGJ1ZmZlciwgdmFsLCBieXRlT2Zmc2V0KVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYXJyYXlJbmRleE9mKGJ1ZmZlciwgWyB2YWwgXSwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIGRpcilcbiAgfVxuXG4gIHRocm93IG5ldyBUeXBlRXJyb3IoJ3ZhbCBtdXN0IGJlIHN0cmluZywgbnVtYmVyIG9yIEJ1ZmZlcicpXG59XG5cbmZ1bmN0aW9uIGFycmF5SW5kZXhPZiAoYXJyLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBkaXIpIHtcbiAgdmFyIGluZGV4U2l6ZSA9IDFcbiAgdmFyIGFyckxlbmd0aCA9IGFyci5sZW5ndGhcbiAgdmFyIHZhbExlbmd0aCA9IHZhbC5sZW5ndGhcblxuICBpZiAoZW5jb2RpbmcgIT09IHVuZGVmaW5lZCkge1xuICAgIGVuY29kaW5nID0gU3RyaW5nKGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpXG4gICAgaWYgKGVuY29kaW5nID09PSAndWNzMicgfHwgZW5jb2RpbmcgPT09ICd1Y3MtMicgfHxcbiAgICAgICAgZW5jb2RpbmcgPT09ICd1dGYxNmxlJyB8fCBlbmNvZGluZyA9PT0gJ3V0Zi0xNmxlJykge1xuICAgICAgaWYgKGFyci5sZW5ndGggPCAyIHx8IHZhbC5sZW5ndGggPCAyKSB7XG4gICAgICAgIHJldHVybiAtMVxuICAgICAgfVxuICAgICAgaW5kZXhTaXplID0gMlxuICAgICAgYXJyTGVuZ3RoIC89IDJcbiAgICAgIHZhbExlbmd0aCAvPSAyXG4gICAgICBieXRlT2Zmc2V0IC89IDJcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiByZWFkIChidWYsIGkpIHtcbiAgICBpZiAoaW5kZXhTaXplID09PSAxKSB7XG4gICAgICByZXR1cm4gYnVmW2ldXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBidWYucmVhZFVJbnQxNkJFKGkgKiBpbmRleFNpemUpXG4gICAgfVxuICB9XG5cbiAgdmFyIGlcbiAgaWYgKGRpcikge1xuICAgIHZhciBmb3VuZEluZGV4ID0gLTFcbiAgICBmb3IgKGkgPSBieXRlT2Zmc2V0OyBpIDwgYXJyTGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChyZWFkKGFyciwgaSkgPT09IHJlYWQodmFsLCBmb3VuZEluZGV4ID09PSAtMSA/IDAgOiBpIC0gZm91bmRJbmRleCkpIHtcbiAgICAgICAgaWYgKGZvdW5kSW5kZXggPT09IC0xKSBmb3VuZEluZGV4ID0gaVxuICAgICAgICBpZiAoaSAtIGZvdW5kSW5kZXggKyAxID09PSB2YWxMZW5ndGgpIHJldHVybiBmb3VuZEluZGV4ICogaW5kZXhTaXplXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoZm91bmRJbmRleCAhPT0gLTEpIGkgLT0gaSAtIGZvdW5kSW5kZXhcbiAgICAgICAgZm91bmRJbmRleCA9IC0xXG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChieXRlT2Zmc2V0ICsgdmFsTGVuZ3RoID4gYXJyTGVuZ3RoKSBieXRlT2Zmc2V0ID0gYXJyTGVuZ3RoIC0gdmFsTGVuZ3RoXG4gICAgZm9yIChpID0gYnl0ZU9mZnNldDsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIHZhciBmb3VuZCA9IHRydWVcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgdmFsTGVuZ3RoOyBqKyspIHtcbiAgICAgICAgaWYgKHJlYWQoYXJyLCBpICsgaikgIT09IHJlYWQodmFsLCBqKSkge1xuICAgICAgICAgIGZvdW5kID0gZmFsc2VcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZm91bmQpIHJldHVybiBpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIC0xXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuaW5jbHVkZXMgPSBmdW5jdGlvbiBpbmNsdWRlcyAodmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZykge1xuICByZXR1cm4gdGhpcy5pbmRleE9mKHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcpICE9PSAtMVxufVxuXG5CdWZmZXIucHJvdG90eXBlLmluZGV4T2YgPSBmdW5jdGlvbiBpbmRleE9mICh2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nKSB7XG4gIHJldHVybiBiaWRpcmVjdGlvbmFsSW5kZXhPZih0aGlzLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCB0cnVlKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLmxhc3RJbmRleE9mID0gZnVuY3Rpb24gbGFzdEluZGV4T2YgKHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIGJpZGlyZWN0aW9uYWxJbmRleE9mKHRoaXMsIHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIGZhbHNlKVxufVxuXG5mdW5jdGlvbiBoZXhXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIG9mZnNldCA9IE51bWJlcihvZmZzZXQpIHx8IDBcbiAgdmFyIHJlbWFpbmluZyA9IGJ1Zi5sZW5ndGggLSBvZmZzZXRcbiAgaWYgKCFsZW5ndGgpIHtcbiAgICBsZW5ndGggPSByZW1haW5pbmdcbiAgfSBlbHNlIHtcbiAgICBsZW5ndGggPSBOdW1iZXIobGVuZ3RoKVxuICAgIGlmIChsZW5ndGggPiByZW1haW5pbmcpIHtcbiAgICAgIGxlbmd0aCA9IHJlbWFpbmluZ1xuICAgIH1cbiAgfVxuXG4gIHZhciBzdHJMZW4gPSBzdHJpbmcubGVuZ3RoXG5cbiAgaWYgKGxlbmd0aCA+IHN0ckxlbiAvIDIpIHtcbiAgICBsZW5ndGggPSBzdHJMZW4gLyAyXG4gIH1cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkge1xuICAgIHZhciBwYXJzZWQgPSBwYXJzZUludChzdHJpbmcuc3Vic3RyKGkgKiAyLCAyKSwgMTYpXG4gICAgaWYgKG51bWJlcklzTmFOKHBhcnNlZCkpIHJldHVybiBpXG4gICAgYnVmW29mZnNldCArIGldID0gcGFyc2VkXG4gIH1cbiAgcmV0dXJuIGlcbn1cblxuZnVuY3Rpb24gdXRmOFdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGJsaXRCdWZmZXIodXRmOFRvQnl0ZXMoc3RyaW5nLCBidWYubGVuZ3RoIC0gb2Zmc2V0KSwgYnVmLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuZnVuY3Rpb24gYXNjaWlXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBibGl0QnVmZmVyKGFzY2lpVG9CeXRlcyhzdHJpbmcpLCBidWYsIG9mZnNldCwgbGVuZ3RoKVxufVxuXG5mdW5jdGlvbiBsYXRpbjFXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBhc2NpaVdyaXRlKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuZnVuY3Rpb24gYmFzZTY0V3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYmxpdEJ1ZmZlcihiYXNlNjRUb0J5dGVzKHN0cmluZyksIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbmZ1bmN0aW9uIHVjczJXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBibGl0QnVmZmVyKHV0ZjE2bGVUb0J5dGVzKHN0cmluZywgYnVmLmxlbmd0aCAtIG9mZnNldCksIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbiB3cml0ZSAoc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCwgZW5jb2RpbmcpIHtcbiAgLy8gQnVmZmVyI3dyaXRlKHN0cmluZylcbiAgaWYgKG9mZnNldCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZW5jb2RpbmcgPSAndXRmOCdcbiAgICBsZW5ndGggPSB0aGlzLmxlbmd0aFxuICAgIG9mZnNldCA9IDBcbiAgLy8gQnVmZmVyI3dyaXRlKHN0cmluZywgZW5jb2RpbmcpXG4gIH0gZWxzZSBpZiAobGVuZ3RoID09PSB1bmRlZmluZWQgJiYgdHlwZW9mIG9mZnNldCA9PT0gJ3N0cmluZycpIHtcbiAgICBlbmNvZGluZyA9IG9mZnNldFxuICAgIGxlbmd0aCA9IHRoaXMubGVuZ3RoXG4gICAgb2Zmc2V0ID0gMFxuICAvLyBCdWZmZXIjd3JpdGUoc3RyaW5nLCBvZmZzZXRbLCBsZW5ndGhdWywgZW5jb2RpbmddKVxuICB9IGVsc2UgaWYgKGlzRmluaXRlKG9mZnNldCkpIHtcbiAgICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgICBpZiAoaXNGaW5pdGUobGVuZ3RoKSkge1xuICAgICAgbGVuZ3RoID0gbGVuZ3RoID4+PiAwXG4gICAgICBpZiAoZW5jb2RpbmcgPT09IHVuZGVmaW5lZCkgZW5jb2RpbmcgPSAndXRmOCdcbiAgICB9IGVsc2Uge1xuICAgICAgZW5jb2RpbmcgPSBsZW5ndGhcbiAgICAgIGxlbmd0aCA9IHVuZGVmaW5lZFxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAnQnVmZmVyLndyaXRlKHN0cmluZywgZW5jb2RpbmcsIG9mZnNldFssIGxlbmd0aF0pIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQnXG4gICAgKVxuICB9XG5cbiAgdmFyIHJlbWFpbmluZyA9IHRoaXMubGVuZ3RoIC0gb2Zmc2V0XG4gIGlmIChsZW5ndGggPT09IHVuZGVmaW5lZCB8fCBsZW5ndGggPiByZW1haW5pbmcpIGxlbmd0aCA9IHJlbWFpbmluZ1xuXG4gIGlmICgoc3RyaW5nLmxlbmd0aCA+IDAgJiYgKGxlbmd0aCA8IDAgfHwgb2Zmc2V0IDwgMCkpIHx8IG9mZnNldCA+IHRoaXMubGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0F0dGVtcHQgdG8gd3JpdGUgb3V0c2lkZSBidWZmZXIgYm91bmRzJylcbiAgfVxuXG4gIGlmICghZW5jb2RpbmcpIGVuY29kaW5nID0gJ3V0ZjgnXG5cbiAgdmFyIGxvd2VyZWRDYXNlID0gZmFsc2VcbiAgZm9yICg7Oykge1xuICAgIHN3aXRjaCAoZW5jb2RpbmcpIHtcbiAgICAgIGNhc2UgJ2hleCc6XG4gICAgICAgIHJldHVybiBoZXhXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICd1dGY4JzpcbiAgICAgIGNhc2UgJ3V0Zi04JzpcbiAgICAgICAgcmV0dXJuIHV0ZjhXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICdhc2NpaSc6XG4gICAgICAgIHJldHVybiBhc2NpaVdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ2xhdGluMSc6XG4gICAgICBjYXNlICdiaW5hcnknOlxuICAgICAgICByZXR1cm4gbGF0aW4xV3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAnYmFzZTY0JzpcbiAgICAgICAgLy8gV2FybmluZzogbWF4TGVuZ3RoIG5vdCB0YWtlbiBpbnRvIGFjY291bnQgaW4gYmFzZTY0V3JpdGVcbiAgICAgICAgcmV0dXJuIGJhc2U2NFdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ3VjczInOlxuICAgICAgY2FzZSAndWNzLTInOlxuICAgICAgY2FzZSAndXRmMTZsZSc6XG4gICAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICAgIHJldHVybiB1Y3MyV3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKGxvd2VyZWRDYXNlKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdVbmtub3duIGVuY29kaW5nOiAnICsgZW5jb2RpbmcpXG4gICAgICAgIGVuY29kaW5nID0gKCcnICsgZW5jb2RpbmcpLnRvTG93ZXJDYXNlKClcbiAgICAgICAgbG93ZXJlZENhc2UgPSB0cnVlXG4gICAgfVxuICB9XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gdG9KU09OICgpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAnQnVmZmVyJyxcbiAgICBkYXRhOiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0aGlzLl9hcnIgfHwgdGhpcywgMClcbiAgfVxufVxuXG5mdW5jdGlvbiBiYXNlNjRTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIGlmIChzdGFydCA9PT0gMCAmJiBlbmQgPT09IGJ1Zi5sZW5ndGgpIHtcbiAgICByZXR1cm4gYmFzZTY0LmZyb21CeXRlQXJyYXkoYnVmKVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBiYXNlNjQuZnJvbUJ5dGVBcnJheShidWYuc2xpY2Uoc3RhcnQsIGVuZCkpXG4gIH1cbn1cblxuZnVuY3Rpb24gdXRmOFNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgZW5kID0gTWF0aC5taW4oYnVmLmxlbmd0aCwgZW5kKVxuICB2YXIgcmVzID0gW11cblxuICB2YXIgaSA9IHN0YXJ0XG4gIHdoaWxlIChpIDwgZW5kKSB7XG4gICAgdmFyIGZpcnN0Qnl0ZSA9IGJ1ZltpXVxuICAgIHZhciBjb2RlUG9pbnQgPSBudWxsXG4gICAgdmFyIGJ5dGVzUGVyU2VxdWVuY2UgPSAoZmlyc3RCeXRlID4gMHhFRikgPyA0XG4gICAgICA6IChmaXJzdEJ5dGUgPiAweERGKSA/IDNcbiAgICAgIDogKGZpcnN0Qnl0ZSA+IDB4QkYpID8gMlxuICAgICAgOiAxXG5cbiAgICBpZiAoaSArIGJ5dGVzUGVyU2VxdWVuY2UgPD0gZW5kKSB7XG4gICAgICB2YXIgc2Vjb25kQnl0ZSwgdGhpcmRCeXRlLCBmb3VydGhCeXRlLCB0ZW1wQ29kZVBvaW50XG5cbiAgICAgIHN3aXRjaCAoYnl0ZXNQZXJTZXF1ZW5jZSkge1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgaWYgKGZpcnN0Qnl0ZSA8IDB4ODApIHtcbiAgICAgICAgICAgIGNvZGVQb2ludCA9IGZpcnN0Qnl0ZVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgc2Vjb25kQnl0ZSA9IGJ1ZltpICsgMV1cbiAgICAgICAgICBpZiAoKHNlY29uZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCkge1xuICAgICAgICAgICAgdGVtcENvZGVQb2ludCA9IChmaXJzdEJ5dGUgJiAweDFGKSA8PCAweDYgfCAoc2Vjb25kQnl0ZSAmIDB4M0YpXG4gICAgICAgICAgICBpZiAodGVtcENvZGVQb2ludCA+IDB4N0YpIHtcbiAgICAgICAgICAgICAgY29kZVBvaW50ID0gdGVtcENvZGVQb2ludFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgc2Vjb25kQnl0ZSA9IGJ1ZltpICsgMV1cbiAgICAgICAgICB0aGlyZEJ5dGUgPSBidWZbaSArIDJdXG4gICAgICAgICAgaWYgKChzZWNvbmRCeXRlICYgMHhDMCkgPT09IDB4ODAgJiYgKHRoaXJkQnl0ZSAmIDB4QzApID09PSAweDgwKSB7XG4gICAgICAgICAgICB0ZW1wQ29kZVBvaW50ID0gKGZpcnN0Qnl0ZSAmIDB4RikgPDwgMHhDIHwgKHNlY29uZEJ5dGUgJiAweDNGKSA8PCAweDYgfCAodGhpcmRCeXRlICYgMHgzRilcbiAgICAgICAgICAgIGlmICh0ZW1wQ29kZVBvaW50ID4gMHg3RkYgJiYgKHRlbXBDb2RlUG9pbnQgPCAweEQ4MDAgfHwgdGVtcENvZGVQb2ludCA+IDB4REZGRikpIHtcbiAgICAgICAgICAgICAgY29kZVBvaW50ID0gdGVtcENvZGVQb2ludFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgc2Vjb25kQnl0ZSA9IGJ1ZltpICsgMV1cbiAgICAgICAgICB0aGlyZEJ5dGUgPSBidWZbaSArIDJdXG4gICAgICAgICAgZm91cnRoQnl0ZSA9IGJ1ZltpICsgM11cbiAgICAgICAgICBpZiAoKHNlY29uZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCAmJiAodGhpcmRCeXRlICYgMHhDMCkgPT09IDB4ODAgJiYgKGZvdXJ0aEJ5dGUgJiAweEMwKSA9PT0gMHg4MCkge1xuICAgICAgICAgICAgdGVtcENvZGVQb2ludCA9IChmaXJzdEJ5dGUgJiAweEYpIDw8IDB4MTIgfCAoc2Vjb25kQnl0ZSAmIDB4M0YpIDw8IDB4QyB8ICh0aGlyZEJ5dGUgJiAweDNGKSA8PCAweDYgfCAoZm91cnRoQnl0ZSAmIDB4M0YpXG4gICAgICAgICAgICBpZiAodGVtcENvZGVQb2ludCA+IDB4RkZGRiAmJiB0ZW1wQ29kZVBvaW50IDwgMHgxMTAwMDApIHtcbiAgICAgICAgICAgICAgY29kZVBvaW50ID0gdGVtcENvZGVQb2ludFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY29kZVBvaW50ID09PSBudWxsKSB7XG4gICAgICAvLyB3ZSBkaWQgbm90IGdlbmVyYXRlIGEgdmFsaWQgY29kZVBvaW50IHNvIGluc2VydCBhXG4gICAgICAvLyByZXBsYWNlbWVudCBjaGFyIChVK0ZGRkQpIGFuZCBhZHZhbmNlIG9ubHkgMSBieXRlXG4gICAgICBjb2RlUG9pbnQgPSAweEZGRkRcbiAgICAgIGJ5dGVzUGVyU2VxdWVuY2UgPSAxXG4gICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPiAweEZGRkYpIHtcbiAgICAgIC8vIGVuY29kZSB0byB1dGYxNiAoc3Vycm9nYXRlIHBhaXIgZGFuY2UpXG4gICAgICBjb2RlUG9pbnQgLT0gMHgxMDAwMFxuICAgICAgcmVzLnB1c2goY29kZVBvaW50ID4+PiAxMCAmIDB4M0ZGIHwgMHhEODAwKVxuICAgICAgY29kZVBvaW50ID0gMHhEQzAwIHwgY29kZVBvaW50ICYgMHgzRkZcbiAgICB9XG5cbiAgICByZXMucHVzaChjb2RlUG9pbnQpXG4gICAgaSArPSBieXRlc1BlclNlcXVlbmNlXG4gIH1cblxuICByZXR1cm4gZGVjb2RlQ29kZVBvaW50c0FycmF5KHJlcylcbn1cblxuLy8gQmFzZWQgb24gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMjI3NDcyNzIvNjgwNzQyLCB0aGUgYnJvd3NlciB3aXRoXG4vLyB0aGUgbG93ZXN0IGxpbWl0IGlzIENocm9tZSwgd2l0aCAweDEwMDAwIGFyZ3MuXG4vLyBXZSBnbyAxIG1hZ25pdHVkZSBsZXNzLCBmb3Igc2FmZXR5XG52YXIgTUFYX0FSR1VNRU5UU19MRU5HVEggPSAweDEwMDBcblxuZnVuY3Rpb24gZGVjb2RlQ29kZVBvaW50c0FycmF5IChjb2RlUG9pbnRzKSB7XG4gIHZhciBsZW4gPSBjb2RlUG9pbnRzLmxlbmd0aFxuICBpZiAobGVuIDw9IE1BWF9BUkdVTUVOVFNfTEVOR1RIKSB7XG4gICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLCBjb2RlUG9pbnRzKSAvLyBhdm9pZCBleHRyYSBzbGljZSgpXG4gIH1cblxuICAvLyBEZWNvZGUgaW4gY2h1bmtzIHRvIGF2b2lkIFwiY2FsbCBzdGFjayBzaXplIGV4Y2VlZGVkXCIuXG4gIHZhciByZXMgPSAnJ1xuICB2YXIgaSA9IDBcbiAgd2hpbGUgKGkgPCBsZW4pIHtcbiAgICByZXMgKz0gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShcbiAgICAgIFN0cmluZyxcbiAgICAgIGNvZGVQb2ludHMuc2xpY2UoaSwgaSArPSBNQVhfQVJHVU1FTlRTX0xFTkdUSClcbiAgICApXG4gIH1cbiAgcmV0dXJuIHJlc1xufVxuXG5mdW5jdGlvbiBhc2NpaVNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIHJldCA9ICcnXG4gIGVuZCA9IE1hdGgubWluKGJ1Zi5sZW5ndGgsIGVuZClcblxuICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSkge1xuICAgIHJldCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ1ZltpXSAmIDB4N0YpXG4gIH1cbiAgcmV0dXJuIHJldFxufVxuXG5mdW5jdGlvbiBsYXRpbjFTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIHZhciByZXQgPSAnJ1xuICBlbmQgPSBNYXRoLm1pbihidWYubGVuZ3RoLCBlbmQpXG5cbiAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyArK2kpIHtcbiAgICByZXQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShidWZbaV0pXG4gIH1cbiAgcmV0dXJuIHJldFxufVxuXG5mdW5jdGlvbiBoZXhTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIHZhciBsZW4gPSBidWYubGVuZ3RoXG5cbiAgaWYgKCFzdGFydCB8fCBzdGFydCA8IDApIHN0YXJ0ID0gMFxuICBpZiAoIWVuZCB8fCBlbmQgPCAwIHx8IGVuZCA+IGxlbikgZW5kID0gbGVuXG5cbiAgdmFyIG91dCA9ICcnXG4gIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgKytpKSB7XG4gICAgb3V0ICs9IHRvSGV4KGJ1ZltpXSlcbiAgfVxuICByZXR1cm4gb3V0XG59XG5cbmZ1bmN0aW9uIHV0ZjE2bGVTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIHZhciBieXRlcyA9IGJ1Zi5zbGljZShzdGFydCwgZW5kKVxuICB2YXIgcmVzID0gJydcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBieXRlcy5sZW5ndGg7IGkgKz0gMikge1xuICAgIHJlcyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ5dGVzW2ldICsgKGJ5dGVzW2kgKyAxXSAqIDI1NikpXG4gIH1cbiAgcmV0dXJuIHJlc1xufVxuXG5CdWZmZXIucHJvdG90eXBlLnNsaWNlID0gZnVuY3Rpb24gc2xpY2UgKHN0YXJ0LCBlbmQpIHtcbiAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoXG4gIHN0YXJ0ID0gfn5zdGFydFxuICBlbmQgPSBlbmQgPT09IHVuZGVmaW5lZCA/IGxlbiA6IH5+ZW5kXG5cbiAgaWYgKHN0YXJ0IDwgMCkge1xuICAgIHN0YXJ0ICs9IGxlblxuICAgIGlmIChzdGFydCA8IDApIHN0YXJ0ID0gMFxuICB9IGVsc2UgaWYgKHN0YXJ0ID4gbGVuKSB7XG4gICAgc3RhcnQgPSBsZW5cbiAgfVxuXG4gIGlmIChlbmQgPCAwKSB7XG4gICAgZW5kICs9IGxlblxuICAgIGlmIChlbmQgPCAwKSBlbmQgPSAwXG4gIH0gZWxzZSBpZiAoZW5kID4gbGVuKSB7XG4gICAgZW5kID0gbGVuXG4gIH1cblxuICBpZiAoZW5kIDwgc3RhcnQpIGVuZCA9IHN0YXJ0XG5cbiAgdmFyIG5ld0J1ZiA9IHRoaXMuc3ViYXJyYXkoc3RhcnQsIGVuZClcbiAgLy8gUmV0dXJuIGFuIGF1Z21lbnRlZCBgVWludDhBcnJheWAgaW5zdGFuY2VcbiAgbmV3QnVmLl9fcHJvdG9fXyA9IEJ1ZmZlci5wcm90b3R5cGVcbiAgcmV0dXJuIG5ld0J1ZlxufVxuXG4vKlxuICogTmVlZCB0byBtYWtlIHN1cmUgdGhhdCBidWZmZXIgaXNuJ3QgdHJ5aW5nIHRvIHdyaXRlIG91dCBvZiBib3VuZHMuXG4gKi9cbmZ1bmN0aW9uIGNoZWNrT2Zmc2V0IChvZmZzZXQsIGV4dCwgbGVuZ3RoKSB7XG4gIGlmICgob2Zmc2V0ICUgMSkgIT09IDAgfHwgb2Zmc2V0IDwgMCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ29mZnNldCBpcyBub3QgdWludCcpXG4gIGlmIChvZmZzZXQgKyBleHQgPiBsZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdUcnlpbmcgdG8gYWNjZXNzIGJleW9uZCBidWZmZXIgbGVuZ3RoJylcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludExFID0gZnVuY3Rpb24gcmVhZFVJbnRMRSAob2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCBieXRlTGVuZ3RoLCB0aGlzLmxlbmd0aClcblxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXRdXG4gIHZhciBtdWwgPSAxXG4gIHZhciBpID0gMFxuICB3aGlsZSAoKytpIDwgYnl0ZUxlbmd0aCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHZhbCArPSB0aGlzW29mZnNldCArIGldICogbXVsXG4gIH1cblxuICByZXR1cm4gdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnRCRSA9IGZ1bmN0aW9uIHJlYWRVSW50QkUgKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICBjaGVja09mZnNldChvZmZzZXQsIGJ5dGVMZW5ndGgsIHRoaXMubGVuZ3RoKVxuICB9XG5cbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0ICsgLS1ieXRlTGVuZ3RoXVxuICB2YXIgbXVsID0gMVxuICB3aGlsZSAoYnl0ZUxlbmd0aCA+IDAgJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB2YWwgKz0gdGhpc1tvZmZzZXQgKyAtLWJ5dGVMZW5ndGhdICogbXVsXG4gIH1cblxuICByZXR1cm4gdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQ4ID0gZnVuY3Rpb24gcmVhZFVJbnQ4IChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDEsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gdGhpc1tvZmZzZXRdXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQxNkxFID0gZnVuY3Rpb24gcmVhZFVJbnQxNkxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDIsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gdGhpc1tvZmZzZXRdIHwgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgOClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDE2QkUgPSBmdW5jdGlvbiByZWFkVUludDE2QkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMiwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiAodGhpc1tvZmZzZXRdIDw8IDgpIHwgdGhpc1tvZmZzZXQgKyAxXVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MzJMRSA9IGZ1bmN0aW9uIHJlYWRVSW50MzJMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcblxuICByZXR1cm4gKCh0aGlzW29mZnNldF0pIHxcbiAgICAgICh0aGlzW29mZnNldCArIDFdIDw8IDgpIHxcbiAgICAgICh0aGlzW29mZnNldCArIDJdIDw8IDE2KSkgK1xuICAgICAgKHRoaXNbb2Zmc2V0ICsgM10gKiAweDEwMDAwMDApXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQzMkJFID0gZnVuY3Rpb24gcmVhZFVJbnQzMkJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuXG4gIHJldHVybiAodGhpc1tvZmZzZXRdICogMHgxMDAwMDAwKSArXG4gICAgKCh0aGlzW29mZnNldCArIDFdIDw8IDE2KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMl0gPDwgOCkgfFxuICAgIHRoaXNbb2Zmc2V0ICsgM10pXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludExFID0gZnVuY3Rpb24gcmVhZEludExFIChvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIGJ5dGVMZW5ndGgsIHRoaXMubGVuZ3RoKVxuXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldF1cbiAgdmFyIG11bCA9IDFcbiAgdmFyIGkgPSAwXG4gIHdoaWxlICgrK2kgPCBieXRlTGVuZ3RoICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdmFsICs9IHRoaXNbb2Zmc2V0ICsgaV0gKiBtdWxcbiAgfVxuICBtdWwgKj0gMHg4MFxuXG4gIGlmICh2YWwgPj0gbXVsKSB2YWwgLT0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGgpXG5cbiAgcmV0dXJuIHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnRCRSA9IGZ1bmN0aW9uIHJlYWRJbnRCRSAob2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCBieXRlTGVuZ3RoLCB0aGlzLmxlbmd0aClcblxuICB2YXIgaSA9IGJ5dGVMZW5ndGhcbiAgdmFyIG11bCA9IDFcbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0ICsgLS1pXVxuICB3aGlsZSAoaSA+IDAgJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB2YWwgKz0gdGhpc1tvZmZzZXQgKyAtLWldICogbXVsXG4gIH1cbiAgbXVsICo9IDB4ODBcblxuICBpZiAodmFsID49IG11bCkgdmFsIC09IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoKVxuXG4gIHJldHVybiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50OCA9IGZ1bmN0aW9uIHJlYWRJbnQ4IChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDEsIHRoaXMubGVuZ3RoKVxuICBpZiAoISh0aGlzW29mZnNldF0gJiAweDgwKSkgcmV0dXJuICh0aGlzW29mZnNldF0pXG4gIHJldHVybiAoKDB4ZmYgLSB0aGlzW29mZnNldF0gKyAxKSAqIC0xKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQxNkxFID0gZnVuY3Rpb24gcmVhZEludDE2TEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMiwgdGhpcy5sZW5ndGgpXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldF0gfCAodGhpc1tvZmZzZXQgKyAxXSA8PCA4KVxuICByZXR1cm4gKHZhbCAmIDB4ODAwMCkgPyB2YWwgfCAweEZGRkYwMDAwIDogdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDE2QkUgPSBmdW5jdGlvbiByZWFkSW50MTZCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAyLCB0aGlzLmxlbmd0aClcbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0ICsgMV0gfCAodGhpc1tvZmZzZXRdIDw8IDgpXG4gIHJldHVybiAodmFsICYgMHg4MDAwKSA/IHZhbCB8IDB4RkZGRjAwMDAgOiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50MzJMRSA9IGZ1bmN0aW9uIHJlYWRJbnQzMkxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuXG4gIHJldHVybiAodGhpc1tvZmZzZXRdKSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgOCkgfFxuICAgICh0aGlzW29mZnNldCArIDJdIDw8IDE2KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgM10gPDwgMjQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDMyQkUgPSBmdW5jdGlvbiByZWFkSW50MzJCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcblxuICByZXR1cm4gKHRoaXNbb2Zmc2V0XSA8PCAyNCkgfFxuICAgICh0aGlzW29mZnNldCArIDFdIDw8IDE2KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMl0gPDwgOCkgfFxuICAgICh0aGlzW29mZnNldCArIDNdKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRGbG9hdExFID0gZnVuY3Rpb24gcmVhZEZsb2F0TEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiBpZWVlNzU0LnJlYWQodGhpcywgb2Zmc2V0LCB0cnVlLCAyMywgNClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkRmxvYXRCRSA9IGZ1bmN0aW9uIHJlYWRGbG9hdEJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gaWVlZTc1NC5yZWFkKHRoaXMsIG9mZnNldCwgZmFsc2UsIDIzLCA0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWREb3VibGVMRSA9IGZ1bmN0aW9uIHJlYWREb3VibGVMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA4LCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIGllZWU3NTQucmVhZCh0aGlzLCBvZmZzZXQsIHRydWUsIDUyLCA4KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWREb3VibGVCRSA9IGZ1bmN0aW9uIHJlYWREb3VibGVCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA4LCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIGllZWU3NTQucmVhZCh0aGlzLCBvZmZzZXQsIGZhbHNlLCA1MiwgOClcbn1cblxuZnVuY3Rpb24gY2hlY2tJbnQgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgZXh0LCBtYXgsIG1pbikge1xuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihidWYpKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImJ1ZmZlclwiIGFyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXIgaW5zdGFuY2UnKVxuICBpZiAodmFsdWUgPiBtYXggfHwgdmFsdWUgPCBtaW4pIHRocm93IG5ldyBSYW5nZUVycm9yKCdcInZhbHVlXCIgYXJndW1lbnQgaXMgb3V0IG9mIGJvdW5kcycpXG4gIGlmIChvZmZzZXQgKyBleHQgPiBidWYubGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW5kZXggb3V0IG9mIHJhbmdlJylcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnRMRSA9IGZ1bmN0aW9uIHdyaXRlVUludExFICh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIHZhciBtYXhCeXRlcyA9IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoKSAtIDFcbiAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBtYXhCeXRlcywgMClcbiAgfVxuXG4gIHZhciBtdWwgPSAxXG4gIHZhciBpID0gMFxuICB0aGlzW29mZnNldF0gPSB2YWx1ZSAmIDB4RkZcbiAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB0aGlzW29mZnNldCArIGldID0gKHZhbHVlIC8gbXVsKSAmIDB4RkZcbiAgfVxuXG4gIHJldHVybiBvZmZzZXQgKyBieXRlTGVuZ3RoXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50QkUgPSBmdW5jdGlvbiB3cml0ZVVJbnRCRSAodmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICB2YXIgbWF4Qnl0ZXMgPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aCkgLSAxXG4gICAgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbWF4Qnl0ZXMsIDApXG4gIH1cblxuICB2YXIgaSA9IGJ5dGVMZW5ndGggLSAxXG4gIHZhciBtdWwgPSAxXG4gIHRoaXNbb2Zmc2V0ICsgaV0gPSB2YWx1ZSAmIDB4RkZcbiAgd2hpbGUgKC0taSA+PSAwICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdGhpc1tvZmZzZXQgKyBpXSA9ICh2YWx1ZSAvIG11bCkgJiAweEZGXG4gIH1cblxuICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDggPSBmdW5jdGlvbiB3cml0ZVVJbnQ4ICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMSwgMHhmZiwgMClcbiAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgcmV0dXJuIG9mZnNldCArIDFcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQxNkxFID0gZnVuY3Rpb24gd3JpdGVVSW50MTZMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDIsIDB4ZmZmZiwgMClcbiAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gOClcbiAgcmV0dXJuIG9mZnNldCArIDJcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQxNkJFID0gZnVuY3Rpb24gd3JpdGVVSW50MTZCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDIsIDB4ZmZmZiwgMClcbiAgdGhpc1tvZmZzZXRdID0gKHZhbHVlID4+PiA4KVxuICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlICYgMHhmZilcbiAgcmV0dXJuIG9mZnNldCArIDJcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQzMkxFID0gZnVuY3Rpb24gd3JpdGVVSW50MzJMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDQsIDB4ZmZmZmZmZmYsIDApXG4gIHRoaXNbb2Zmc2V0ICsgM10gPSAodmFsdWUgPj4+IDI0KVxuICB0aGlzW29mZnNldCArIDJdID0gKHZhbHVlID4+PiAxNilcbiAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gOClcbiAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQzMkJFID0gZnVuY3Rpb24gd3JpdGVVSW50MzJCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDQsIDB4ZmZmZmZmZmYsIDApXG4gIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSA+Pj4gMjQpXG4gIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDE2KVxuICB0aGlzW29mZnNldCArIDJdID0gKHZhbHVlID4+PiA4KVxuICB0aGlzW29mZnNldCArIDNdID0gKHZhbHVlICYgMHhmZilcbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludExFID0gZnVuY3Rpb24gd3JpdGVJbnRMRSAodmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICB2YXIgbGltaXQgPSBNYXRoLnBvdygyLCAoOCAqIGJ5dGVMZW5ndGgpIC0gMSlcblxuICAgIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIGxpbWl0IC0gMSwgLWxpbWl0KVxuICB9XG5cbiAgdmFyIGkgPSAwXG4gIHZhciBtdWwgPSAxXG4gIHZhciBzdWIgPSAwXG4gIHRoaXNbb2Zmc2V0XSA9IHZhbHVlICYgMHhGRlxuICB3aGlsZSAoKytpIDwgYnl0ZUxlbmd0aCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIGlmICh2YWx1ZSA8IDAgJiYgc3ViID09PSAwICYmIHRoaXNbb2Zmc2V0ICsgaSAtIDFdICE9PSAwKSB7XG4gICAgICBzdWIgPSAxXG4gICAgfVxuICAgIHRoaXNbb2Zmc2V0ICsgaV0gPSAoKHZhbHVlIC8gbXVsKSA+PiAwKSAtIHN1YiAmIDB4RkZcbiAgfVxuXG4gIHJldHVybiBvZmZzZXQgKyBieXRlTGVuZ3RoXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnRCRSA9IGZ1bmN0aW9uIHdyaXRlSW50QkUgKHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgdmFyIGxpbWl0ID0gTWF0aC5wb3coMiwgKDggKiBieXRlTGVuZ3RoKSAtIDEpXG5cbiAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBsaW1pdCAtIDEsIC1saW1pdClcbiAgfVxuXG4gIHZhciBpID0gYnl0ZUxlbmd0aCAtIDFcbiAgdmFyIG11bCA9IDFcbiAgdmFyIHN1YiA9IDBcbiAgdGhpc1tvZmZzZXQgKyBpXSA9IHZhbHVlICYgMHhGRlxuICB3aGlsZSAoLS1pID49IDAgJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICBpZiAodmFsdWUgPCAwICYmIHN1YiA9PT0gMCAmJiB0aGlzW29mZnNldCArIGkgKyAxXSAhPT0gMCkge1xuICAgICAgc3ViID0gMVxuICAgIH1cbiAgICB0aGlzW29mZnNldCArIGldID0gKCh2YWx1ZSAvIG11bCkgPj4gMCkgLSBzdWIgJiAweEZGXG4gIH1cblxuICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50OCA9IGZ1bmN0aW9uIHdyaXRlSW50OCAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDEsIDB4N2YsIC0weDgwKVxuICBpZiAodmFsdWUgPCAwKSB2YWx1ZSA9IDB4ZmYgKyB2YWx1ZSArIDFcbiAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgcmV0dXJuIG9mZnNldCArIDFcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDE2TEUgPSBmdW5jdGlvbiB3cml0ZUludDE2TEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCAweDdmZmYsIC0weDgwMDApXG4gIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDgpXG4gIHJldHVybiBvZmZzZXQgKyAyXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQxNkJFID0gZnVuY3Rpb24gd3JpdGVJbnQxNkJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMiwgMHg3ZmZmLCAtMHg4MDAwKVxuICB0aGlzW29mZnNldF0gPSAodmFsdWUgPj4+IDgpXG4gIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgJiAweGZmKVxuICByZXR1cm4gb2Zmc2V0ICsgMlxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50MzJMRSA9IGZ1bmN0aW9uIHdyaXRlSW50MzJMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDQsIDB4N2ZmZmZmZmYsIC0weDgwMDAwMDAwKVxuICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiA4KVxuICB0aGlzW29mZnNldCArIDJdID0gKHZhbHVlID4+PiAxNilcbiAgdGhpc1tvZmZzZXQgKyAzXSA9ICh2YWx1ZSA+Pj4gMjQpXG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQzMkJFID0gZnVuY3Rpb24gd3JpdGVJbnQzMkJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgNCwgMHg3ZmZmZmZmZiwgLTB4ODAwMDAwMDApXG4gIGlmICh2YWx1ZSA8IDApIHZhbHVlID0gMHhmZmZmZmZmZiArIHZhbHVlICsgMVxuICB0aGlzW29mZnNldF0gPSAodmFsdWUgPj4+IDI0KVxuICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiAxNilcbiAgdGhpc1tvZmZzZXQgKyAyXSA9ICh2YWx1ZSA+Pj4gOClcbiAgdGhpc1tvZmZzZXQgKyAzXSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbmZ1bmN0aW9uIGNoZWNrSUVFRTc1NCAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBleHQsIG1heCwgbWluKSB7XG4gIGlmIChvZmZzZXQgKyBleHQgPiBidWYubGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW5kZXggb3V0IG9mIHJhbmdlJylcbiAgaWYgKG9mZnNldCA8IDApIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbmRleCBvdXQgb2YgcmFuZ2UnKVxufVxuXG5mdW5jdGlvbiB3cml0ZUZsb2F0IChidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICBjaGVja0lFRUU3NTQoYnVmLCB2YWx1ZSwgb2Zmc2V0LCA0LCAzLjQwMjgyMzQ2NjM4NTI4ODZlKzM4LCAtMy40MDI4MjM0NjYzODUyODg2ZSszOClcbiAgfVxuICBpZWVlNzU0LndyaXRlKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCAyMywgNClcbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUZsb2F0TEUgPSBmdW5jdGlvbiB3cml0ZUZsb2F0TEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHJldHVybiB3cml0ZUZsb2F0KHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUsIG5vQXNzZXJ0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlRmxvYXRCRSA9IGZ1bmN0aW9uIHdyaXRlRmxvYXRCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgcmV0dXJuIHdyaXRlRmxvYXQodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UsIG5vQXNzZXJ0KVxufVxuXG5mdW5jdGlvbiB3cml0ZURvdWJsZSAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4sIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgY2hlY2tJRUVFNzU0KGJ1ZiwgdmFsdWUsIG9mZnNldCwgOCwgMS43OTc2OTMxMzQ4NjIzMTU3RSszMDgsIC0xLjc5NzY5MzEzNDg2MjMxNTdFKzMwOClcbiAgfVxuICBpZWVlNzU0LndyaXRlKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCA1MiwgOClcbiAgcmV0dXJuIG9mZnNldCArIDhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZURvdWJsZUxFID0gZnVuY3Rpb24gd3JpdGVEb3VibGVMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgcmV0dXJuIHdyaXRlRG91YmxlKHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUsIG5vQXNzZXJ0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlRG91YmxlQkUgPSBmdW5jdGlvbiB3cml0ZURvdWJsZUJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICByZXR1cm4gd3JpdGVEb3VibGUodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UsIG5vQXNzZXJ0KVxufVxuXG4vLyBjb3B5KHRhcmdldEJ1ZmZlciwgdGFyZ2V0U3RhcnQ9MCwgc291cmNlU3RhcnQ9MCwgc291cmNlRW5kPWJ1ZmZlci5sZW5ndGgpXG5CdWZmZXIucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiBjb3B5ICh0YXJnZXQsIHRhcmdldFN0YXJ0LCBzdGFydCwgZW5kKSB7XG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKHRhcmdldCkpIHRocm93IG5ldyBUeXBlRXJyb3IoJ2FyZ3VtZW50IHNob3VsZCBiZSBhIEJ1ZmZlcicpXG4gIGlmICghc3RhcnQpIHN0YXJ0ID0gMFxuICBpZiAoIWVuZCAmJiBlbmQgIT09IDApIGVuZCA9IHRoaXMubGVuZ3RoXG4gIGlmICh0YXJnZXRTdGFydCA+PSB0YXJnZXQubGVuZ3RoKSB0YXJnZXRTdGFydCA9IHRhcmdldC5sZW5ndGhcbiAgaWYgKCF0YXJnZXRTdGFydCkgdGFyZ2V0U3RhcnQgPSAwXG4gIGlmIChlbmQgPiAwICYmIGVuZCA8IHN0YXJ0KSBlbmQgPSBzdGFydFxuXG4gIC8vIENvcHkgMCBieXRlczsgd2UncmUgZG9uZVxuICBpZiAoZW5kID09PSBzdGFydCkgcmV0dXJuIDBcbiAgaWYgKHRhcmdldC5sZW5ndGggPT09IDAgfHwgdGhpcy5sZW5ndGggPT09IDApIHJldHVybiAwXG5cbiAgLy8gRmF0YWwgZXJyb3IgY29uZGl0aW9uc1xuICBpZiAodGFyZ2V0U3RhcnQgPCAwKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3RhcmdldFN0YXJ0IG91dCBvZiBib3VuZHMnKVxuICB9XG4gIGlmIChzdGFydCA8IDAgfHwgc3RhcnQgPj0gdGhpcy5sZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbmRleCBvdXQgb2YgcmFuZ2UnKVxuICBpZiAoZW5kIDwgMCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3NvdXJjZUVuZCBvdXQgb2YgYm91bmRzJylcblxuICAvLyBBcmUgd2Ugb29iP1xuICBpZiAoZW5kID4gdGhpcy5sZW5ndGgpIGVuZCA9IHRoaXMubGVuZ3RoXG4gIGlmICh0YXJnZXQubGVuZ3RoIC0gdGFyZ2V0U3RhcnQgPCBlbmQgLSBzdGFydCkge1xuICAgIGVuZCA9IHRhcmdldC5sZW5ndGggLSB0YXJnZXRTdGFydCArIHN0YXJ0XG4gIH1cblxuICB2YXIgbGVuID0gZW5kIC0gc3RhcnRcblxuICBpZiAodGhpcyA9PT0gdGFyZ2V0ICYmIHR5cGVvZiBVaW50OEFycmF5LnByb3RvdHlwZS5jb3B5V2l0aGluID09PSAnZnVuY3Rpb24nKSB7XG4gICAgLy8gVXNlIGJ1aWx0LWluIHdoZW4gYXZhaWxhYmxlLCBtaXNzaW5nIGZyb20gSUUxMVxuICAgIHRoaXMuY29weVdpdGhpbih0YXJnZXRTdGFydCwgc3RhcnQsIGVuZClcbiAgfSBlbHNlIGlmICh0aGlzID09PSB0YXJnZXQgJiYgc3RhcnQgPCB0YXJnZXRTdGFydCAmJiB0YXJnZXRTdGFydCA8IGVuZCkge1xuICAgIC8vIGRlc2NlbmRpbmcgY29weSBmcm9tIGVuZFxuICAgIGZvciAodmFyIGkgPSBsZW4gLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgdGFyZ2V0W2kgKyB0YXJnZXRTdGFydF0gPSB0aGlzW2kgKyBzdGFydF1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgVWludDhBcnJheS5wcm90b3R5cGUuc2V0LmNhbGwoXG4gICAgICB0YXJnZXQsXG4gICAgICB0aGlzLnN1YmFycmF5KHN0YXJ0LCBlbmQpLFxuICAgICAgdGFyZ2V0U3RhcnRcbiAgICApXG4gIH1cblxuICByZXR1cm4gbGVuXG59XG5cbi8vIFVzYWdlOlxuLy8gICAgYnVmZmVyLmZpbGwobnVtYmVyWywgb2Zmc2V0WywgZW5kXV0pXG4vLyAgICBidWZmZXIuZmlsbChidWZmZXJbLCBvZmZzZXRbLCBlbmRdXSlcbi8vICAgIGJ1ZmZlci5maWxsKHN0cmluZ1ssIG9mZnNldFssIGVuZF1dWywgZW5jb2RpbmddKVxuQnVmZmVyLnByb3RvdHlwZS5maWxsID0gZnVuY3Rpb24gZmlsbCAodmFsLCBzdGFydCwgZW5kLCBlbmNvZGluZykge1xuICAvLyBIYW5kbGUgc3RyaW5nIGNhc2VzOlxuICBpZiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycpIHtcbiAgICBpZiAodHlwZW9mIHN0YXJ0ID09PSAnc3RyaW5nJykge1xuICAgICAgZW5jb2RpbmcgPSBzdGFydFxuICAgICAgc3RhcnQgPSAwXG4gICAgICBlbmQgPSB0aGlzLmxlbmd0aFxuICAgIH0gZWxzZSBpZiAodHlwZW9mIGVuZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGVuY29kaW5nID0gZW5kXG4gICAgICBlbmQgPSB0aGlzLmxlbmd0aFxuICAgIH1cbiAgICBpZiAoZW5jb2RpbmcgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgZW5jb2RpbmcgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdlbmNvZGluZyBtdXN0IGJlIGEgc3RyaW5nJylcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBlbmNvZGluZyA9PT0gJ3N0cmluZycgJiYgIUJ1ZmZlci5pc0VuY29kaW5nKGVuY29kaW5nKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVW5rbm93biBlbmNvZGluZzogJyArIGVuY29kaW5nKVxuICAgIH1cbiAgICBpZiAodmFsLmxlbmd0aCA9PT0gMSkge1xuICAgICAgdmFyIGNvZGUgPSB2YWwuY2hhckNvZGVBdCgwKVxuICAgICAgaWYgKChlbmNvZGluZyA9PT0gJ3V0ZjgnICYmIGNvZGUgPCAxMjgpIHx8XG4gICAgICAgICAgZW5jb2RpbmcgPT09ICdsYXRpbjEnKSB7XG4gICAgICAgIC8vIEZhc3QgcGF0aDogSWYgYHZhbGAgZml0cyBpbnRvIGEgc2luZ2xlIGJ5dGUsIHVzZSB0aGF0IG51bWVyaWMgdmFsdWUuXG4gICAgICAgIHZhbCA9IGNvZGVcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSBpZiAodHlwZW9mIHZhbCA9PT0gJ251bWJlcicpIHtcbiAgICB2YWwgPSB2YWwgJiAyNTVcbiAgfVxuXG4gIC8vIEludmFsaWQgcmFuZ2VzIGFyZSBub3Qgc2V0IHRvIGEgZGVmYXVsdCwgc28gY2FuIHJhbmdlIGNoZWNrIGVhcmx5LlxuICBpZiAoc3RhcnQgPCAwIHx8IHRoaXMubGVuZ3RoIDwgc3RhcnQgfHwgdGhpcy5sZW5ndGggPCBlbmQpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignT3V0IG9mIHJhbmdlIGluZGV4JylcbiAgfVxuXG4gIGlmIChlbmQgPD0gc3RhcnQpIHtcbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgc3RhcnQgPSBzdGFydCA+Pj4gMFxuICBlbmQgPSBlbmQgPT09IHVuZGVmaW5lZCA/IHRoaXMubGVuZ3RoIDogZW5kID4+PiAwXG5cbiAgaWYgKCF2YWwpIHZhbCA9IDBcblxuICB2YXIgaVxuICBpZiAodHlwZW9mIHZhbCA9PT0gJ251bWJlcicpIHtcbiAgICBmb3IgKGkgPSBzdGFydDsgaSA8IGVuZDsgKytpKSB7XG4gICAgICB0aGlzW2ldID0gdmFsXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHZhciBieXRlcyA9IEJ1ZmZlci5pc0J1ZmZlcih2YWwpXG4gICAgICA/IHZhbFxuICAgICAgOiBuZXcgQnVmZmVyKHZhbCwgZW5jb2RpbmcpXG4gICAgdmFyIGxlbiA9IGJ5dGVzLmxlbmd0aFxuICAgIGlmIChsZW4gPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSB2YWx1ZSBcIicgKyB2YWwgK1xuICAgICAgICAnXCIgaXMgaW52YWxpZCBmb3IgYXJndW1lbnQgXCJ2YWx1ZVwiJylcbiAgICB9XG4gICAgZm9yIChpID0gMDsgaSA8IGVuZCAtIHN0YXJ0OyArK2kpIHtcbiAgICAgIHRoaXNbaSArIHN0YXJ0XSA9IGJ5dGVzW2kgJSBsZW5dXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRoaXNcbn1cblxuLy8gSEVMUEVSIEZVTkNUSU9OU1xuLy8gPT09PT09PT09PT09PT09PVxuXG52YXIgSU5WQUxJRF9CQVNFNjRfUkUgPSAvW14rLzAtOUEtWmEtei1fXS9nXG5cbmZ1bmN0aW9uIGJhc2U2NGNsZWFuIChzdHIpIHtcbiAgLy8gTm9kZSB0YWtlcyBlcXVhbCBzaWducyBhcyBlbmQgb2YgdGhlIEJhc2U2NCBlbmNvZGluZ1xuICBzdHIgPSBzdHIuc3BsaXQoJz0nKVswXVxuICAvLyBOb2RlIHN0cmlwcyBvdXQgaW52YWxpZCBjaGFyYWN0ZXJzIGxpa2UgXFxuIGFuZCBcXHQgZnJvbSB0aGUgc3RyaW5nLCBiYXNlNjQtanMgZG9lcyBub3RcbiAgc3RyID0gc3RyLnRyaW0oKS5yZXBsYWNlKElOVkFMSURfQkFTRTY0X1JFLCAnJylcbiAgLy8gTm9kZSBjb252ZXJ0cyBzdHJpbmdzIHdpdGggbGVuZ3RoIDwgMiB0byAnJ1xuICBpZiAoc3RyLmxlbmd0aCA8IDIpIHJldHVybiAnJ1xuICAvLyBOb2RlIGFsbG93cyBmb3Igbm9uLXBhZGRlZCBiYXNlNjQgc3RyaW5ncyAobWlzc2luZyB0cmFpbGluZyA9PT0pLCBiYXNlNjQtanMgZG9lcyBub3RcbiAgd2hpbGUgKHN0ci5sZW5ndGggJSA0ICE9PSAwKSB7XG4gICAgc3RyID0gc3RyICsgJz0nXG4gIH1cbiAgcmV0dXJuIHN0clxufVxuXG5mdW5jdGlvbiB0b0hleCAobikge1xuICBpZiAobiA8IDE2KSByZXR1cm4gJzAnICsgbi50b1N0cmluZygxNilcbiAgcmV0dXJuIG4udG9TdHJpbmcoMTYpXG59XG5cbmZ1bmN0aW9uIHV0ZjhUb0J5dGVzIChzdHJpbmcsIHVuaXRzKSB7XG4gIHVuaXRzID0gdW5pdHMgfHwgSW5maW5pdHlcbiAgdmFyIGNvZGVQb2ludFxuICB2YXIgbGVuZ3RoID0gc3RyaW5nLmxlbmd0aFxuICB2YXIgbGVhZFN1cnJvZ2F0ZSA9IG51bGxcbiAgdmFyIGJ5dGVzID0gW11cblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7XG4gICAgY29kZVBvaW50ID0gc3RyaW5nLmNoYXJDb2RlQXQoaSlcblxuICAgIC8vIGlzIHN1cnJvZ2F0ZSBjb21wb25lbnRcbiAgICBpZiAoY29kZVBvaW50ID4gMHhEN0ZGICYmIGNvZGVQb2ludCA8IDB4RTAwMCkge1xuICAgICAgLy8gbGFzdCBjaGFyIHdhcyBhIGxlYWRcbiAgICAgIGlmICghbGVhZFN1cnJvZ2F0ZSkge1xuICAgICAgICAvLyBubyBsZWFkIHlldFxuICAgICAgICBpZiAoY29kZVBvaW50ID4gMHhEQkZGKSB7XG4gICAgICAgICAgLy8gdW5leHBlY3RlZCB0cmFpbFxuICAgICAgICAgIGlmICgodW5pdHMgLT0gMykgPiAtMSkgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKVxuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH0gZWxzZSBpZiAoaSArIDEgPT09IGxlbmd0aCkge1xuICAgICAgICAgIC8vIHVucGFpcmVkIGxlYWRcbiAgICAgICAgICBpZiAoKHVuaXRzIC09IDMpID4gLTEpIGJ5dGVzLnB1c2goMHhFRiwgMHhCRiwgMHhCRClcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gdmFsaWQgbGVhZFxuICAgICAgICBsZWFkU3Vycm9nYXRlID0gY29kZVBvaW50XG5cbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgLy8gMiBsZWFkcyBpbiBhIHJvd1xuICAgICAgaWYgKGNvZGVQb2ludCA8IDB4REMwMCkge1xuICAgICAgICBpZiAoKHVuaXRzIC09IDMpID4gLTEpIGJ5dGVzLnB1c2goMHhFRiwgMHhCRiwgMHhCRClcbiAgICAgICAgbGVhZFN1cnJvZ2F0ZSA9IGNvZGVQb2ludFxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICAvLyB2YWxpZCBzdXJyb2dhdGUgcGFpclxuICAgICAgY29kZVBvaW50ID0gKGxlYWRTdXJyb2dhdGUgLSAweEQ4MDAgPDwgMTAgfCBjb2RlUG9pbnQgLSAweERDMDApICsgMHgxMDAwMFxuICAgIH0gZWxzZSBpZiAobGVhZFN1cnJvZ2F0ZSkge1xuICAgICAgLy8gdmFsaWQgYm1wIGNoYXIsIGJ1dCBsYXN0IGNoYXIgd2FzIGEgbGVhZFxuICAgICAgaWYgKCh1bml0cyAtPSAzKSA+IC0xKSBieXRlcy5wdXNoKDB4RUYsIDB4QkYsIDB4QkQpXG4gICAgfVxuXG4gICAgbGVhZFN1cnJvZ2F0ZSA9IG51bGxcblxuICAgIC8vIGVuY29kZSB1dGY4XG4gICAgaWYgKGNvZGVQb2ludCA8IDB4ODApIHtcbiAgICAgIGlmICgodW5pdHMgLT0gMSkgPCAwKSBicmVha1xuICAgICAgYnl0ZXMucHVzaChjb2RlUG9pbnQpXG4gICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPCAweDgwMCkge1xuICAgICAgaWYgKCh1bml0cyAtPSAyKSA8IDApIGJyZWFrXG4gICAgICBieXRlcy5wdXNoKFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHg2IHwgMHhDMCxcbiAgICAgICAgY29kZVBvaW50ICYgMHgzRiB8IDB4ODBcbiAgICAgIClcbiAgICB9IGVsc2UgaWYgKGNvZGVQb2ludCA8IDB4MTAwMDApIHtcbiAgICAgIGlmICgodW5pdHMgLT0gMykgPCAwKSBicmVha1xuICAgICAgYnl0ZXMucHVzaChcbiAgICAgICAgY29kZVBvaW50ID4+IDB4QyB8IDB4RTAsXG4gICAgICAgIGNvZGVQb2ludCA+PiAweDYgJiAweDNGIHwgMHg4MCxcbiAgICAgICAgY29kZVBvaW50ICYgMHgzRiB8IDB4ODBcbiAgICAgIClcbiAgICB9IGVsc2UgaWYgKGNvZGVQb2ludCA8IDB4MTEwMDAwKSB7XG4gICAgICBpZiAoKHVuaXRzIC09IDQpIDwgMCkgYnJlYWtcbiAgICAgIGJ5dGVzLnB1c2goXG4gICAgICAgIGNvZGVQb2ludCA+PiAweDEyIHwgMHhGMCxcbiAgICAgICAgY29kZVBvaW50ID4+IDB4QyAmIDB4M0YgfCAweDgwLFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHg2ICYgMHgzRiB8IDB4ODAsXG4gICAgICAgIGNvZGVQb2ludCAmIDB4M0YgfCAweDgwXG4gICAgICApXG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBjb2RlIHBvaW50JylcbiAgICB9XG4gIH1cblxuICByZXR1cm4gYnl0ZXNcbn1cblxuZnVuY3Rpb24gYXNjaWlUb0J5dGVzIChzdHIpIHtcbiAgdmFyIGJ5dGVBcnJheSA9IFtdXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgKytpKSB7XG4gICAgLy8gTm9kZSdzIGNvZGUgc2VlbXMgdG8gYmUgZG9pbmcgdGhpcyBhbmQgbm90ICYgMHg3Ri4uXG4gICAgYnl0ZUFycmF5LnB1c2goc3RyLmNoYXJDb2RlQXQoaSkgJiAweEZGKVxuICB9XG4gIHJldHVybiBieXRlQXJyYXlcbn1cblxuZnVuY3Rpb24gdXRmMTZsZVRvQnl0ZXMgKHN0ciwgdW5pdHMpIHtcbiAgdmFyIGMsIGhpLCBsb1xuICB2YXIgYnl0ZUFycmF5ID0gW11cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyArK2kpIHtcbiAgICBpZiAoKHVuaXRzIC09IDIpIDwgMCkgYnJlYWtcblxuICAgIGMgPSBzdHIuY2hhckNvZGVBdChpKVxuICAgIGhpID0gYyA+PiA4XG4gICAgbG8gPSBjICUgMjU2XG4gICAgYnl0ZUFycmF5LnB1c2gobG8pXG4gICAgYnl0ZUFycmF5LnB1c2goaGkpXG4gIH1cblxuICByZXR1cm4gYnl0ZUFycmF5XG59XG5cbmZ1bmN0aW9uIGJhc2U2NFRvQnl0ZXMgKHN0cikge1xuICByZXR1cm4gYmFzZTY0LnRvQnl0ZUFycmF5KGJhc2U2NGNsZWFuKHN0cikpXG59XG5cbmZ1bmN0aW9uIGJsaXRCdWZmZXIgKHNyYywgZHN0LCBvZmZzZXQsIGxlbmd0aCkge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7XG4gICAgaWYgKChpICsgb2Zmc2V0ID49IGRzdC5sZW5ndGgpIHx8IChpID49IHNyYy5sZW5ndGgpKSBicmVha1xuICAgIGRzdFtpICsgb2Zmc2V0XSA9IHNyY1tpXVxuICB9XG4gIHJldHVybiBpXG59XG5cbi8vIEFycmF5QnVmZmVycyBmcm9tIGFub3RoZXIgY29udGV4dCAoaS5lLiBhbiBpZnJhbWUpIGRvIG5vdCBwYXNzIHRoZSBgaW5zdGFuY2VvZmAgY2hlY2tcbi8vIGJ1dCB0aGV5IHNob3VsZCBiZSB0cmVhdGVkIGFzIHZhbGlkLiBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9mZXJvc3MvYnVmZmVyL2lzc3Vlcy8xNjZcbmZ1bmN0aW9uIGlzQXJyYXlCdWZmZXIgKG9iaikge1xuICByZXR1cm4gb2JqIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIgfHxcbiAgICAob2JqICE9IG51bGwgJiYgb2JqLmNvbnN0cnVjdG9yICE9IG51bGwgJiYgb2JqLmNvbnN0cnVjdG9yLm5hbWUgPT09ICdBcnJheUJ1ZmZlcicgJiZcbiAgICAgIHR5cGVvZiBvYmouYnl0ZUxlbmd0aCA9PT0gJ251bWJlcicpXG59XG5cbmZ1bmN0aW9uIG51bWJlcklzTmFOIChvYmopIHtcbiAgcmV0dXJuIG9iaiAhPT0gb2JqIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tc2VsZi1jb21wYXJlXG59XG4iLCJleHBvcnRzLnJlYWQgPSBmdW5jdGlvbiAoYnVmZmVyLCBvZmZzZXQsIGlzTEUsIG1MZW4sIG5CeXRlcykge1xuICB2YXIgZSwgbVxuICB2YXIgZUxlbiA9IChuQnl0ZXMgKiA4KSAtIG1MZW4gLSAxXG4gIHZhciBlTWF4ID0gKDEgPDwgZUxlbikgLSAxXG4gIHZhciBlQmlhcyA9IGVNYXggPj4gMVxuICB2YXIgbkJpdHMgPSAtN1xuICB2YXIgaSA9IGlzTEUgPyAobkJ5dGVzIC0gMSkgOiAwXG4gIHZhciBkID0gaXNMRSA/IC0xIDogMVxuICB2YXIgcyA9IGJ1ZmZlcltvZmZzZXQgKyBpXVxuXG4gIGkgKz0gZFxuXG4gIGUgPSBzICYgKCgxIDw8ICgtbkJpdHMpKSAtIDEpXG4gIHMgPj49ICgtbkJpdHMpXG4gIG5CaXRzICs9IGVMZW5cbiAgZm9yICg7IG5CaXRzID4gMDsgZSA9IChlICogMjU2KSArIGJ1ZmZlcltvZmZzZXQgKyBpXSwgaSArPSBkLCBuQml0cyAtPSA4KSB7fVxuXG4gIG0gPSBlICYgKCgxIDw8ICgtbkJpdHMpKSAtIDEpXG4gIGUgPj49ICgtbkJpdHMpXG4gIG5CaXRzICs9IG1MZW5cbiAgZm9yICg7IG5CaXRzID4gMDsgbSA9IChtICogMjU2KSArIGJ1ZmZlcltvZmZzZXQgKyBpXSwgaSArPSBkLCBuQml0cyAtPSA4KSB7fVxuXG4gIGlmIChlID09PSAwKSB7XG4gICAgZSA9IDEgLSBlQmlhc1xuICB9IGVsc2UgaWYgKGUgPT09IGVNYXgpIHtcbiAgICByZXR1cm4gbSA/IE5hTiA6ICgocyA/IC0xIDogMSkgKiBJbmZpbml0eSlcbiAgfSBlbHNlIHtcbiAgICBtID0gbSArIE1hdGgucG93KDIsIG1MZW4pXG4gICAgZSA9IGUgLSBlQmlhc1xuICB9XG4gIHJldHVybiAocyA/IC0xIDogMSkgKiBtICogTWF0aC5wb3coMiwgZSAtIG1MZW4pXG59XG5cbmV4cG9ydHMud3JpdGUgPSBmdW5jdGlvbiAoYnVmZmVyLCB2YWx1ZSwgb2Zmc2V0LCBpc0xFLCBtTGVuLCBuQnl0ZXMpIHtcbiAgdmFyIGUsIG0sIGNcbiAgdmFyIGVMZW4gPSAobkJ5dGVzICogOCkgLSBtTGVuIC0gMVxuICB2YXIgZU1heCA9ICgxIDw8IGVMZW4pIC0gMVxuICB2YXIgZUJpYXMgPSBlTWF4ID4+IDFcbiAgdmFyIHJ0ID0gKG1MZW4gPT09IDIzID8gTWF0aC5wb3coMiwgLTI0KSAtIE1hdGgucG93KDIsIC03NykgOiAwKVxuICB2YXIgaSA9IGlzTEUgPyAwIDogKG5CeXRlcyAtIDEpXG4gIHZhciBkID0gaXNMRSA/IDEgOiAtMVxuICB2YXIgcyA9IHZhbHVlIDwgMCB8fCAodmFsdWUgPT09IDAgJiYgMSAvIHZhbHVlIDwgMCkgPyAxIDogMFxuXG4gIHZhbHVlID0gTWF0aC5hYnModmFsdWUpXG5cbiAgaWYgKGlzTmFOKHZhbHVlKSB8fCB2YWx1ZSA9PT0gSW5maW5pdHkpIHtcbiAgICBtID0gaXNOYU4odmFsdWUpID8gMSA6IDBcbiAgICBlID0gZU1heFxuICB9IGVsc2Uge1xuICAgIGUgPSBNYXRoLmZsb29yKE1hdGgubG9nKHZhbHVlKSAvIE1hdGguTE4yKVxuICAgIGlmICh2YWx1ZSAqIChjID0gTWF0aC5wb3coMiwgLWUpKSA8IDEpIHtcbiAgICAgIGUtLVxuICAgICAgYyAqPSAyXG4gICAgfVxuICAgIGlmIChlICsgZUJpYXMgPj0gMSkge1xuICAgICAgdmFsdWUgKz0gcnQgLyBjXG4gICAgfSBlbHNlIHtcbiAgICAgIHZhbHVlICs9IHJ0ICogTWF0aC5wb3coMiwgMSAtIGVCaWFzKVxuICAgIH1cbiAgICBpZiAodmFsdWUgKiBjID49IDIpIHtcbiAgICAgIGUrK1xuICAgICAgYyAvPSAyXG4gICAgfVxuXG4gICAgaWYgKGUgKyBlQmlhcyA+PSBlTWF4KSB7XG4gICAgICBtID0gMFxuICAgICAgZSA9IGVNYXhcbiAgICB9IGVsc2UgaWYgKGUgKyBlQmlhcyA+PSAxKSB7XG4gICAgICBtID0gKCh2YWx1ZSAqIGMpIC0gMSkgKiBNYXRoLnBvdygyLCBtTGVuKVxuICAgICAgZSA9IGUgKyBlQmlhc1xuICAgIH0gZWxzZSB7XG4gICAgICBtID0gdmFsdWUgKiBNYXRoLnBvdygyLCBlQmlhcyAtIDEpICogTWF0aC5wb3coMiwgbUxlbilcbiAgICAgIGUgPSAwXG4gICAgfVxuICB9XG5cbiAgZm9yICg7IG1MZW4gPj0gODsgYnVmZmVyW29mZnNldCArIGldID0gbSAmIDB4ZmYsIGkgKz0gZCwgbSAvPSAyNTYsIG1MZW4gLT0gOCkge31cblxuICBlID0gKGUgPDwgbUxlbikgfCBtXG4gIGVMZW4gKz0gbUxlblxuICBmb3IgKDsgZUxlbiA+IDA7IGJ1ZmZlcltvZmZzZXQgKyBpXSA9IGUgJiAweGZmLCBpICs9IGQsIGUgLz0gMjU2LCBlTGVuIC09IDgpIHt9XG5cbiAgYnVmZmVyW29mZnNldCArIGkgLSBkXSB8PSBzICogMTI4XG59XG4iLCIvLyBzaGltIGZvciB1c2luZyBwcm9jZXNzIGluIGJyb3dzZXJcbnZhciBwcm9jZXNzID0gbW9kdWxlLmV4cG9ydHMgPSB7fTtcblxuLy8gY2FjaGVkIGZyb20gd2hhdGV2ZXIgZ2xvYmFsIGlzIHByZXNlbnQgc28gdGhhdCB0ZXN0IHJ1bm5lcnMgdGhhdCBzdHViIGl0XG4vLyBkb24ndCBicmVhayB0aGluZ3MuICBCdXQgd2UgbmVlZCB0byB3cmFwIGl0IGluIGEgdHJ5IGNhdGNoIGluIGNhc2UgaXQgaXNcbi8vIHdyYXBwZWQgaW4gc3RyaWN0IG1vZGUgY29kZSB3aGljaCBkb2Vzbid0IGRlZmluZSBhbnkgZ2xvYmFscy4gIEl0J3MgaW5zaWRlIGFcbi8vIGZ1bmN0aW9uIGJlY2F1c2UgdHJ5L2NhdGNoZXMgZGVvcHRpbWl6ZSBpbiBjZXJ0YWluIGVuZ2luZXMuXG5cbnZhciBjYWNoZWRTZXRUaW1lb3V0O1xudmFyIGNhY2hlZENsZWFyVGltZW91dDtcblxuZnVuY3Rpb24gZGVmYXVsdFNldFRpbW91dCgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3NldFRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQnKTtcbn1cbmZ1bmN0aW9uIGRlZmF1bHRDbGVhclRpbWVvdXQgKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignY2xlYXJUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkJyk7XG59XG4oZnVuY3Rpb24gKCkge1xuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2Ygc2V0VGltZW91dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IHNldFRpbWVvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gZGVmYXVsdFNldFRpbW91dDtcbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IGRlZmF1bHRTZXRUaW1vdXQ7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2YgY2xlYXJUaW1lb3V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBjbGVhclRpbWVvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuICAgIH1cbn0gKCkpXG5mdW5jdGlvbiBydW5UaW1lb3V0KGZ1bikge1xuICAgIGlmIChjYWNoZWRTZXRUaW1lb3V0ID09PSBzZXRUaW1lb3V0KSB7XG4gICAgICAgIC8vbm9ybWFsIGVudmlyb21lbnRzIGluIHNhbmUgc2l0dWF0aW9uc1xuICAgICAgICByZXR1cm4gc2V0VGltZW91dChmdW4sIDApO1xuICAgIH1cbiAgICAvLyBpZiBzZXRUaW1lb3V0IHdhc24ndCBhdmFpbGFibGUgYnV0IHdhcyBsYXR0ZXIgZGVmaW5lZFxuICAgIGlmICgoY2FjaGVkU2V0VGltZW91dCA9PT0gZGVmYXVsdFNldFRpbW91dCB8fCAhY2FjaGVkU2V0VGltZW91dCkgJiYgc2V0VGltZW91dCkge1xuICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gc2V0VGltZW91dDtcbiAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gd2hlbiB3aGVuIHNvbWVib2R5IGhhcyBzY3Jld2VkIHdpdGggc2V0VGltZW91dCBidXQgbm8gSS5FLiBtYWRkbmVzc1xuICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dChmdW4sIDApO1xuICAgIH0gY2F0Y2goZSl7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBXaGVuIHdlIGFyZSBpbiBJLkUuIGJ1dCB0aGUgc2NyaXB0IGhhcyBiZWVuIGV2YWxlZCBzbyBJLkUuIGRvZXNuJ3QgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0LmNhbGwobnVsbCwgZnVuLCAwKTtcbiAgICAgICAgfSBjYXRjaChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yXG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKHRoaXMsIGZ1biwgMCk7XG4gICAgICAgIH1cbiAgICB9XG5cblxufVxuZnVuY3Rpb24gcnVuQ2xlYXJUaW1lb3V0KG1hcmtlcikge1xuICAgIGlmIChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGNsZWFyVGltZW91dCkge1xuICAgICAgICAvL25vcm1hbCBlbnZpcm9tZW50cyBpbiBzYW5lIHNpdHVhdGlvbnNcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cbiAgICAvLyBpZiBjbGVhclRpbWVvdXQgd2Fzbid0IGF2YWlsYWJsZSBidXQgd2FzIGxhdHRlciBkZWZpbmVkXG4gICAgaWYgKChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGRlZmF1bHRDbGVhclRpbWVvdXQgfHwgIWNhY2hlZENsZWFyVGltZW91dCkgJiYgY2xlYXJUaW1lb3V0KSB7XG4gICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGNsZWFyVGltZW91dDtcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICAvLyB3aGVuIHdoZW4gc29tZWJvZHkgaGFzIHNjcmV3ZWQgd2l0aCBzZXRUaW1lb3V0IGJ1dCBubyBJLkUuIG1hZGRuZXNzXG4gICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFdoZW4gd2UgYXJlIGluIEkuRS4gYnV0IHRoZSBzY3JpcHQgaGFzIGJlZW4gZXZhbGVkIHNvIEkuRS4gZG9lc24ndCAgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQuY2FsbChudWxsLCBtYXJrZXIpO1xuICAgICAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yLlxuICAgICAgICAgICAgLy8gU29tZSB2ZXJzaW9ucyBvZiBJLkUuIGhhdmUgZGlmZmVyZW50IHJ1bGVzIGZvciBjbGVhclRpbWVvdXQgdnMgc2V0VGltZW91dFxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dC5jYWxsKHRoaXMsIG1hcmtlcik7XG4gICAgICAgIH1cbiAgICB9XG5cblxuXG59XG52YXIgcXVldWUgPSBbXTtcbnZhciBkcmFpbmluZyA9IGZhbHNlO1xudmFyIGN1cnJlbnRRdWV1ZTtcbnZhciBxdWV1ZUluZGV4ID0gLTE7XG5cbmZ1bmN0aW9uIGNsZWFuVXBOZXh0VGljaygpIHtcbiAgICBpZiAoIWRyYWluaW5nIHx8ICFjdXJyZW50UXVldWUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBkcmFpbmluZyA9IGZhbHNlO1xuICAgIGlmIChjdXJyZW50UXVldWUubGVuZ3RoKSB7XG4gICAgICAgIHF1ZXVlID0gY3VycmVudFF1ZXVlLmNvbmNhdChxdWV1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgIH1cbiAgICBpZiAocXVldWUubGVuZ3RoKSB7XG4gICAgICAgIGRyYWluUXVldWUoKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGRyYWluUXVldWUoKSB7XG4gICAgaWYgKGRyYWluaW5nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHRpbWVvdXQgPSBydW5UaW1lb3V0KGNsZWFuVXBOZXh0VGljayk7XG4gICAgZHJhaW5pbmcgPSB0cnVlO1xuXG4gICAgdmFyIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB3aGlsZShsZW4pIHtcbiAgICAgICAgY3VycmVudFF1ZXVlID0gcXVldWU7XG4gICAgICAgIHF1ZXVlID0gW107XG4gICAgICAgIHdoaWxlICgrK3F1ZXVlSW5kZXggPCBsZW4pIHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50UXVldWUpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50UXVldWVbcXVldWVJbmRleF0ucnVuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgICAgICBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gICAgfVxuICAgIGN1cnJlbnRRdWV1ZSA9IG51bGw7XG4gICAgZHJhaW5pbmcgPSBmYWxzZTtcbiAgICBydW5DbGVhclRpbWVvdXQodGltZW91dCk7XG59XG5cbnByb2Nlc3MubmV4dFRpY2sgPSBmdW5jdGlvbiAoZnVuKSB7XG4gICAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCAtIDEpO1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgYXJnc1tpIC0gMV0gPSBhcmd1bWVudHNbaV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcXVldWUucHVzaChuZXcgSXRlbShmdW4sIGFyZ3MpKTtcbiAgICBpZiAocXVldWUubGVuZ3RoID09PSAxICYmICFkcmFpbmluZykge1xuICAgICAgICBydW5UaW1lb3V0KGRyYWluUXVldWUpO1xuICAgIH1cbn07XG5cbi8vIHY4IGxpa2VzIHByZWRpY3RpYmxlIG9iamVjdHNcbmZ1bmN0aW9uIEl0ZW0oZnVuLCBhcnJheSkge1xuICAgIHRoaXMuZnVuID0gZnVuO1xuICAgIHRoaXMuYXJyYXkgPSBhcnJheTtcbn1cbkl0ZW0ucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmZ1bi5hcHBseShudWxsLCB0aGlzLmFycmF5KTtcbn07XG5wcm9jZXNzLnRpdGxlID0gJ2Jyb3dzZXInO1xucHJvY2Vzcy5icm93c2VyID0gdHJ1ZTtcbnByb2Nlc3MuZW52ID0ge307XG5wcm9jZXNzLmFyZ3YgPSBbXTtcbnByb2Nlc3MudmVyc2lvbiA9ICcnOyAvLyBlbXB0eSBzdHJpbmcgdG8gYXZvaWQgcmVnZXhwIGlzc3Vlc1xucHJvY2Vzcy52ZXJzaW9ucyA9IHt9O1xuXG5mdW5jdGlvbiBub29wKCkge31cblxucHJvY2Vzcy5vbiA9IG5vb3A7XG5wcm9jZXNzLmFkZExpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3Mub25jZSA9IG5vb3A7XG5wcm9jZXNzLm9mZiA9IG5vb3A7XG5wcm9jZXNzLnJlbW92ZUxpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3MucmVtb3ZlQWxsTGlzdGVuZXJzID0gbm9vcDtcbnByb2Nlc3MuZW1pdCA9IG5vb3A7XG5wcm9jZXNzLnByZXBlbmRMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLnByZXBlbmRPbmNlTGlzdGVuZXIgPSBub29wO1xuXG5wcm9jZXNzLmxpc3RlbmVycyA9IGZ1bmN0aW9uIChuYW1lKSB7IHJldHVybiBbXSB9XG5cbnByb2Nlc3MuYmluZGluZyA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmJpbmRpbmcgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcblxucHJvY2Vzcy5jd2QgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAnLycgfTtcbnByb2Nlc3MuY2hkaXIgPSBmdW5jdGlvbiAoZGlyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmNoZGlyIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn07XG5wcm9jZXNzLnVtYXNrID0gZnVuY3Rpb24oKSB7IHJldHVybiAwOyB9O1xuIl19 +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJsaWIvYXBpL21ldGFkYXRhLmpzIiwibm9kZV9tb2R1bGVzL2Jhc2U2NC1qcy9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9idWZmZXIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvaWVlZTc1NC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9wcm9jZXNzL2Jyb3dzZXIuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDaDFCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ3hKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDanZEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uKCl7ZnVuY3Rpb24gcihlLG4sdCl7ZnVuY3Rpb24gbyhpLGYpe2lmKCFuW2ldKXtpZighZVtpXSl7dmFyIGM9XCJmdW5jdGlvblwiPT10eXBlb2YgcmVxdWlyZSYmcmVxdWlyZTtpZighZiYmYylyZXR1cm4gYyhpLCEwKTtpZih1KXJldHVybiB1KGksITApO3ZhciBhPW5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIraStcIidcIik7dGhyb3cgYS5jb2RlPVwiTU9EVUxFX05PVF9GT1VORFwiLGF9dmFyIHA9bltpXT17ZXhwb3J0czp7fX07ZVtpXVswXS5jYWxsKHAuZXhwb3J0cyxmdW5jdGlvbihyKXt2YXIgbj1lW2ldWzFdW3JdO3JldHVybiBvKG58fHIpfSxwLHAuZXhwb3J0cyxyLGUsbix0KX1yZXR1cm4gbltpXS5leHBvcnRzfWZvcih2YXIgdT1cImZ1bmN0aW9uXCI9PXR5cGVvZiByZXF1aXJlJiZyZXF1aXJlLGk9MDtpPHQubGVuZ3RoO2krKylvKHRbaV0pO3JldHVybiBvfXJldHVybiByfSkoKSIsIi8qZ2xvYmFsIHByb2Nlc3MsIEJ1ZmZlciAqL1xuLyoqXG4gKiBAZmlsZSBNYW5hZ2VzIFNhbGVzZm9yY2UgTWV0YWRhdGEgQVBJXG4gKiBAYXV0aG9yIFNoaW5pY2hpIFRvbWl0YSA8c2hpbmljaGkudG9taXRhQGdtYWlsLmNvbT5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBpbmhlcml0cyA9IHdpbmRvdy5qc2ZvcmNlLnJlcXVpcmUoJ2luaGVyaXRzJyksXG4gICAgZXZlbnRzICA9IHdpbmRvdy5qc2ZvcmNlLnJlcXVpcmUoJ2V2ZW50cycpLFxuICAgIHN0cmVhbSAgPSB3aW5kb3cuanNmb3JjZS5yZXF1aXJlKCdyZWFkYWJsZS1zdHJlYW0nKSxcbiAgICBfICAgICAgID0gd2luZG93LmpzZm9yY2UucmVxdWlyZSgnbG9kYXNoL2NvcmUnKSxcbiAgICBqc2ZvcmNlID0gd2luZG93LmpzZm9yY2UucmVxdWlyZSgnLi9jb3JlJyksXG4gICAgUHJvbWlzZSA9IHdpbmRvdy5qc2ZvcmNlLnJlcXVpcmUoJy4vcHJvbWlzZScpLFxuICAgIFNPQVAgICAgPSB3aW5kb3cuanNmb3JjZS5yZXF1aXJlKCcuL3NvYXAnKTtcblxuLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG4vKipcbiAqIENsYXNzIGZvciBTYWxlc2ZvcmNlIE1ldGFkYXRhIEFQSVxuICpcbiAqIEBjbGFzc1xuICogQHBhcmFtIHtDb25uZWN0aW9ufSBjb25uIC0gQ29ubmVjdGlvbiBvYmplY3RcbiAqL1xudmFyIE1ldGFkYXRhID0gbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihjb25uKSB7XG4gIHRoaXMuX2Nvbm4gPSBjb25uO1xufTtcblxuXG4vKipcbiAqIFBvbGxpbmcgaW50ZXJ2YWwgaW4gbWlsbGlzZWNvbmRzXG4gKiBAdHlwZSB7TnVtYmVyfVxuICovXG5NZXRhZGF0YS5wcm90b3R5cGUucG9sbEludGVydmFsID0gMTAwMDtcblxuLyoqXG4gKiBQb2xsaW5nIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzXG4gKiBAdHlwZSB7TnVtYmVyfVxuICovXG5NZXRhZGF0YS5wcm90b3R5cGUucG9sbFRpbWVvdXQgPSAxMDAwMDtcblxuXG4vKipcbiAqIENhbGwgTWV0YWRhdGEgQVBJIFNPQVAgZW5kcG9pbnRcbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5NZXRhZGF0YS5wcm90b3R5cGUuX2ludm9rZSA9IGZ1bmN0aW9uKG1ldGhvZCwgbWVzc2FnZSwgY2FsbGJhY2spIHtcbiAgdmFyIHNvYXBFbmRwb2ludCA9IG5ldyBTT0FQKHRoaXMuX2Nvbm4sIHtcbiAgICB4bWxuczogXCJodHRwOi8vc29hcC5zZm9yY2UuY29tLzIwMDYvMDQvbWV0YWRhdGFcIixcbiAgICBlbmRwb2ludFVybDogdGhpcy5fY29ubi5pbnN0YW5jZVVybCArIFwiL3NlcnZpY2VzL1NvYXAvbS9cIiArIHRoaXMuX2Nvbm4udmVyc2lvblxuICB9KTtcbiAgcmV0dXJuIHNvYXBFbmRwb2ludC5pbnZva2UobWV0aG9kLCBtZXNzYWdlKS50aGVuKGZ1bmN0aW9uKHJlcykge1xuICAgIHJldHVybiByZXMucmVzdWx0O1xuICB9KS50aGVuQ2FsbChjYWxsYmFjayk7XG59O1xuXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gTWV0YWRhdGF+TWV0YWRhdGFJbmZvXG4gKiBAcHJvcCB7U3RyaW5nfSBmdWxsTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBjb21wb25lbnRcbiAqL1xuXG4vKipcbiAqIEFzeW5jaHJvbm91c2x5IGFkZHMgb25lIG9yIG1vcmUgbmV3IG1ldGFkYXRhIGNvbXBvbmVudHMgdG8gdGhlIG9yZ2FuaXphdGlvbi5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gdHlwZSAtIFRoZSB0eXBlIG9mIG1ldGFkYXRhIHRvIGNyZWF0ZVxuICogQHBhcmFtIHtNZXRhZGF0YX5NZXRhZGF0YUluZm98QXJyYXkuPE1ldGFkYXRhfk1ldGFkYXRhSW5mbz59IG1ldGFkYXRhIC0gTWV0YWRhdGEgdG8gY3JlYXRlXG4gKiBAcGFyYW0ge0NhbGxiYWNrLjxNZXRhZGF0YX5Bc3luY1Jlc3VsdHxBcnJheS48TWV0YWRhdGF+QXN5bmNSZXN1bHQ+Pn0gW2NhbGxiYWNrXSAtIENhbGxiYWNrIGZ1bmN0aW9uXG4gKiBAcmV0dXJucyB7TWV0YWRhdGF+QXN5bmNSZXN1bHRMb2NhdG9yfVxuICovXG5NZXRhZGF0YS5wcm90b3R5cGUuY3JlYXRlQXN5bmMgPSBmdW5jdGlvbih0eXBlLCBtZXRhZGF0YSwgY2FsbGJhY2spIHtcbiAgaWYgKE51bWJlcih0aGlzLl9jb25uLnZlcnNpb24pID4gMzApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJBc3luYyBtZXRhZGF0YSBDUlVEIGNhbGxzIGFyZSBub3Qgc3VwcG9ydGVkIG9uIHZlciAzMS4wIG9yIGxhdGVyLlwiKTtcbiAgfVxuICB2YXIgY29udmVydCA9IGZ1bmN0aW9uKG1kKSB7XG4gICAgbWRbXCJAeHNpOnR5cGVcIl0gPSB0eXBlO1xuICAgIHJldHVybiBtZDtcbiAgfTtcbiAgdmFyIGlzQXJyYXkgPSBfLmlzQXJyYXkobWV0YWRhdGEpO1xuICBtZXRhZGF0YSA9IGlzQXJyYXkgPyBfLm1hcChtZXRhZGF0YSwgY29udmVydCkgOiBjb252ZXJ0KG1ldGFkYXRhKTtcbiAgdmFyIHJlcyA9IHRoaXMuX2ludm9rZShcImNyZWF0ZVwiLCB7IG1ldGFkYXRhOiBtZXRhZGF0YSB9KTtcbiAgcmV0dXJuIG5ldyBBc3luY1Jlc3VsdExvY2F0b3IodGhpcywgcmVzLCBpc0FycmF5KS50aGVuQ2FsbChjYWxsYmFjayk7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IE1ldGFkYXRhflNhdmVSZXN1bHRcbiAqIEBwcm9wIHtCb29sZWFufSBzdWNjZXNzIC0gVHJ1ZSBpZiBtZXRhZGF0YSBpcyBzdWNjZXNzZnVsbHkgc2F2ZWRcbiAqIEBwcm9wIHtTdHJpbmd9IGZ1bGxOYW1lIC0gRnVsbCBuYW1lIG9mIG1ldGFkYXRhIG9iamVjdFxuICovXG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gY29udmVydFRvU2F2ZVJlc3VsdChyZXN1bHQpIHtcbiAgdmFyIHNhdmVSZXN1bHQgPSBfLmNsb25lKHJlc3VsdCk7XG4gIHNhdmVSZXN1bHQuc3VjY2VzcyA9IHNhdmVSZXN1bHQuc3VjY2VzcyA9PT0gJ3RydWUnO1xuICByZXR1cm4gc2F2ZVJlc3VsdDtcbn1cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBNZXRhZGF0YX5VcHNlcnRSZXN1bHRcbiAqIEBwcm9wIHtCb29sZWFufSBzdWNjZXNzIC0gVHJ1ZSBpZiBtZXRhZGF0YSBpcyBzdWNjZXNzZnVsbHkgc2F2ZWRcbiAqIEBwcm9wIHtTdHJpbmd9IGZ1bGxOYW1lIC0gRnVsbCBuYW1lIG9mIG1ldGFkYXRhIG9iamVjdFxuICogQHByb3Age0Jvb2xlYW59IGNyZWF0ZWQgLSBUcnVlIGlmIG1ldGFkYXRhIGlzIG5ld2x5IGNyZWF0ZWRcbiAqL1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGNvbnZlcnRUb1Vwc2VydFJlc3VsdChyZXN1bHQpIHtcbiAgdmFyIHVwc2VydFJlc3VsdCA9IGNvbnZlcnRUb1NhdmVSZXN1bHQocmVzdWx0KTtcbiAgdXBzZXJ0UmVzdWx0LmNyZWF0ZWQgPSB1cHNlcnRSZXN1bHQuY3JlYXRlZCA9PT0gJ3RydWUnO1xuICByZXR1cm4gdXBzZXJ0UmVzdWx0O1xufVxuXG4vKipcbiAqIFN5bm9ueW0gb2YgTWV0YWRhdGEjY3JlYXRlKCkuXG4gKlxuICogQG1ldGhvZCBNZXRhZGF0YSNjcmVhdGVTeW5jXG4gKiBAcGFyYW0ge1N0cmluZ30gdHlwZSAtIFRoZSB0eXBlIG9mIG1ldGFkYXRhIHRvIGNyZWF0ZVxuICogQHBhcmFtIHtNZXRhZGF0YX5NZXRhZGF0YUluZm98QXJyYXkuPE1ldGFkYXRhfk1ldGFkYXRhSW5mbz59IG1ldGFkYXRhIC0gTWV0YWRhdGEgdG8gY3JlYXRlXG4gKiBAcGFyYW0ge0NhbGxiYWNrLjxNZXRhZGF0YX5TYXZlUmVzdWx0fEFycmF5LjxNZXRhZGF0YX5TYXZlUmVzdWx0Pj59IFtjYWxsYmFja10gLSBDYWxsYmFjayBmdW5jdGlvblxuICogQHJldHVybnMge1Byb21pc2UuPE1ldGFkYXRhflNhdmVSZXN1bHR8QXJyYXkuPE1ldGFkYXRhflNhdmVSZXN1bHQ+Pn1cbiAqL1xuLyoqXG4gKiBTeW5jaHJvbm91c2x5IGFkZHMgb25lIG9yIG1vcmUgbmV3IG1ldGFkYXRhIGNvbXBvbmVudHMgdG8gdGhlIG9yZ2FuaXphdGlvbi5cbiAqXG4gKiBAbWV0aG9kIE1ldGFkYXRhI2NyZWF0ZVxuICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgLSBUaGUgdHlwZSBvZiBtZXRhZGF0YSB0byBjcmVhdGVcbiAqIEBwYXJhbSB7TWV0YWRhdGF+TWV0YWRhdGFJbmZvfEFycmF5LjxNZXRhZGF0YX5NZXRhZGF0YUluZm8+fSBtZXRhZGF0YSAtIE1ldGFkYXRhIHRvIGNyZWF0ZVxuICogQHBhcmFtIHtDYWxsYmFjay48TWV0YWRhdGF+U2F2ZVJlc3VsdHxBcnJheS48TWV0YWRhdGF+U2F2ZVJlc3VsdD4+fSBbY2FsbGJhY2tdIC0gQ2FsbGJhY2sgZnVuY3Rpb25cbiAqIEByZXR1cm5zIHtQcm9taXNlLjxNZXRhZGF0YX5TYXZlUmVzdWx0fEFycmF5LjxNZXRhZGF0YX5TYXZlUmVzdWx0Pj59XG4gKi9cbk1ldGFkYXRhLnByb3RvdHlwZS5jcmVhdGVTeW5jID1cbk1ldGFkYXRhLnByb3RvdHlwZS5jcmVhdGUgPSBmdW5jdGlvbih0eXBlLCBtZXRhZGF0YSwgY2FsbGJhY2spIHtcbiAgdmFyIGNvbnZlcnQgPSBmdW5jdGlvbihtZCkge1xuICAgIG1kW1wiQHhzaTp0eXBlXCJdID0gdHlwZTtcbiAgICByZXR1cm4gbWQ7XG4gIH07XG4gIHZhciBpc0FycmF5ID0gXy5pc0FycmF5KG1ldGFkYXRhKTtcbiAgbWV0YWRhdGEgPSBpc0FycmF5ID8gXy5tYXAobWV0YWRhdGEsIGNvbnZlcnQpIDogY29udmVydChtZXRhZGF0YSk7XG4gIHJldHVybiB0aGlzLl9pbnZva2UoXCJjcmVhdGVNZXRhZGF0YVwiLCB7IG1ldGFkYXRhOiBtZXRhZGF0YSB9KS50aGVuKGZ1bmN0aW9uKHJlc3VsdHMpIHtcbiAgICByZXR1cm4gXy5pc0FycmF5KHJlc3VsdHMpID8gXy5tYXAocmVzdWx0cywgY29udmVydFRvU2F2ZVJlc3VsdCkgOiBjb252ZXJ0VG9TYXZlUmVzdWx0KHJlc3VsdHMpO1xuICB9KS50aGVuQ2FsbChjYWxsYmFjayk7XG59O1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGNvbnZlcnRUb01ldGFkYXRhSW5mbyhyZWMpIHtcbiAgdmFyIG1ldGFkYXRhSW5mbyA9IF8uY2xvbmUocmVjKTtcbiAgZGVsZXRlIG1ldGFkYXRhSW5mby4kO1xuICByZXR1cm4gbWV0YWRhdGFJbmZvO1xufVxuXG4vKipcbiAqIFN5bm9ueW0gb2YgTWV0YWRhdGEjcmVhZCgpXG4gKlxuICogQG1ldGhvZCBNZXRhZGF0YSNyZWFkU3luY1xuICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgLSBUaGUgdHlwZSBvZiBtZXRhZGF0YSB0byByZWFkXG4gKiBAcGFyYW0ge1N0cmluZ3xBcnJheS48U3RyaW5nPn0gZnVsbE5hbWVzIC0gZnVsbCBuYW1lKHMpIG9mIG1ldGFkYXRhIG9iamVjdHMgdG8gcmVhZFxuICogQHBhcmFtIHtDYWxsYmFjay48TWV0YWRhdGF+TWV0YWRhdGFJbmZvfEFycmF5LjxNZXRhZGF0YX5NZXRhZGF0YUluZm8+Pn0gW2NhbGxiYWNrXSAtIENhbGxiYWNrIGZ1bmN0aW9uXG4gKiBAcmV0dXJucyB7UHJvbWlzZS48QXJyYXkuPE1ldGFkYXRhfk1ldGFkYXRhSW5mb3xBcnJheS48TWV0YWRhdGF+TWV0YWRhdGFJbmZvPj4+fVxuICovXG4vKipcbiAqIFN5bmNocm9ub3VzbHkgcmVhZCBzcGVjaWZpZWQgbWV0YWRhdGEgY29tcG9uZW50cyBpbiB0aGUgb3JnYW5pemF0aW9uLlxuICpcbiAqIEBtZXRob2QgTWV0YWRhdGEjcmVhZFxuICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgLSBUaGUgdHlwZSBvZiBtZXRhZGF0YSB0byByZWFkXG4gKiBAcGFyYW0ge1N0cmluZ3xBcnJheS48U3RyaW5nPn0gZnVsbE5hbWVzIC0gZnVsbCBuYW1lKHMpIG9mIG1ldGFkYXRhIG9iamVjdHMgdG8gcmVhZFxuICogQHBhcmFtIHtDYWxsYmFjay48TWV0YWRhdGF+TWV0YWRhdGFJbmZvfEFycmF5LjxNZXRhZGF0YX5NZXRhZGF0YUluZm8+Pn0gW2NhbGxiYWNrXSAtIENhbGxiYWNrIGZ1bmN0aW9uXG4gKiBAcmV0dXJucyB7UHJvbWlzZS48QXJyYXkuPE1ldGFkYXRhfk1ldGFkYXRhSW5mb3xBcnJheS48TWV0YWRhdGF+TWV0YWRhdGFJbmZvPj4+fVxuICovXG5NZXRhZGF0YS5wcm90b3R5cGUucmVhZFN5bmMgPVxuTWV0YWRhdGEucHJvdG90eXBlLnJlYWQgPSBmdW5jdGlvbih0eXBlLCBmdWxsTmFtZXMsIGNhbGxiYWNrKSB7XG4gIHJldHVybiB0aGlzLl9pbnZva2UoXCJyZWFkTWV0YWRhdGFcIiwgeyB0eXBlOiB0eXBlLCBmdWxsTmFtZXM6IGZ1bGxOYW1lcyB9KS50aGVuKGZ1bmN0aW9uKHJlcykge1xuICAgIHJldHVybiBfLmlzQXJyYXkocmVzLnJlY29yZHMpID8gXy5tYXAocmVzLnJlY29yZHMsIGNvbnZlcnRUb01ldGFkYXRhSW5mbykgOiBjb252ZXJ0VG9NZXRhZGF0YUluZm8ocmVzLnJlY29yZHMpO1xuICB9KS50aGVuQ2FsbChjYWxsYmFjayk7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IE1ldGFkYXRhflVwZGF0ZU1ldGFkYXRhSW5mb1xuICogQHByb3Age1N0cmluZ30gY3VycmVudE5hbWUgLSBUaGUgQVBJIG5hbWUgb2YgdGhlIGNvbXBvbmVudCBvciBmaWVsZCBiZWZvcmUgdGhlIHVwZGF0ZVxuICogQHByb3Age01ldGFkYXRhfk1ldGFkYXRhSW5mb30gbWV0YWRhdGEgLSBGdWxsIHNwZWNpZmljYXRpb24gb2YgdGhlIGNvbXBvbmVudCBvciBmaWVsZCB5b3Ugd2lzaCB0byB1cGRhdGVcbiAqL1xuXG4vKipcbiAqIEFzeW5jaHJvbm91c2x5IHVwZGF0ZXMgb25lIG9yIG1vcmUgbWV0YWRhdGEgY29tcG9uZW50cyBpbiB0aGUgb3JnYW5pemF0aW9uLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlIC0gVGhlIHR5cGUgb2YgbWV0YWRhdGEgdG8gdXBkYXRlXG4gKiBAcGFyYW0ge01ldGFkYXRhflVwZGF0ZU1ldGFkYXRhSW5mb3xBcnJheS48TWV0YWRhdGF+VXBkYXRlTWV0YWRhdGFJbmZvPn0gdXBkYXRlTWV0YWRhdGEgLSBVcGRhdGluZyBtZXRhZGF0YVxuICogQHBhcmFtIHtDYWxsYmFjay48TWV0YWRhdGF+QXN5bmNSZXN1bHR8QXJyYXkuPE1ldGFkYXRhfkFzeW5jUmVzdWx0Pj59IFtjYWxsYmFja10gLSBDYWxsYmFjayBmdW5jdGlvblxuICogQHJldHVybnMge01ldGFkYXRhfkFzeW5jUmVzdWx0TG9jYXRvcn1cbiAqL1xuTWV0YWRhdGEucHJvdG90eXBlLnVwZGF0ZUFzeW5jID0gZnVuY3Rpb24odHlwZSwgdXBkYXRlTWV0YWRhdGEsIGNhbGxiYWNrKSB7XG4gIGlmIChOdW1iZXIodGhpcy5fY29ubi52ZXJzaW9uKSA+IDMwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQXN5bmMgbWV0YWRhdGEgQ1JVRCBjYWxscyBhcmUgbm90IHN1cHBvcnRlZCBvbiB2ZXIgMzEuMCBvciBsYXRlci5cIik7XG4gIH1cbiAgdmFyIGNvbnZlcnQgPSBmdW5jdGlvbih1bWQpIHtcbiAgICB1bWQubWV0YWRhdGFbXCJAeHNpOnR5cGVcIl0gPSB0eXBlO1xuICAgIHJldHVybiB1bWQ7XG4gIH07XG4gIHZhciBpc0FycmF5ID0gXy5pc0FycmF5KHVwZGF0ZU1ldGFkYXRhKTtcbiAgdXBkYXRlTWV0YWRhdGEgPSBpc0FycmF5ID8gXy5tYXAodXBkYXRlTWV0YWRhdGEsIGNvbnZlcnQpIDogY29udmVydCh1cGRhdGVNZXRhZGF0YSk7XG4gIHZhciByZXMgPSB0aGlzLl9pbnZva2UoXCJ1cGRhdGVcIiwgeyB1cGRhdGVNZXRhZGF0YTogdXBkYXRlTWV0YWRhdGEgfSk7XG4gIHJldHVybiBuZXcgQXN5bmNSZXN1bHRMb2NhdG9yKHRoaXMsIHJlcywgaXNBcnJheSkudGhlbkNhbGwoY2FsbGJhY2spO1xufTtcblxuLyoqXG4gKiBTeW5vbnltIG9mIE1ldGFkYXRhI3VwZGF0ZSgpLlxuICpcbiAqIEBtZXRob2QgTWV0YWRhdGEjdXBkYXRlU3luY1xuICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgLSBUaGUgdHlwZSBvZiBtZXRhZGF0YSB0byB1cGRhdGVcbiAqIEBwYXJhbSB7TWV0YWRhdGF+TWV0YWRhdGFJbmZvfEFycmF5LjxNZXRhZGF0YX5NZXRhZGF0YUluZm8+fSB1cGRhdGVNZXRhZGF0YSAtIFVwZGF0aW5nIG1ldGFkYXRhXG4gKiBAcGFyYW0ge0NhbGxiYWNrLjxNZXRhZGF0YX5TYXZlUmVzdWx0fEFycmF5LjxNZXRhZGF0YX5TYXZlUmVzdWx0Pj59IFtjYWxsYmFja10gLSBDYWxsYmFjayBmdW5jdGlvblxuICogQHJldHVybnMge1Byb21pc2UuPE1ldGFkYXRhflNhdmVSZXN1bHR8QXJyYXkuPE1ldGFkYXRhflNhdmVSZXN1bHQ+Pn1cbiAqL1xuLyoqXG4gKiBTeW5jaHJvbm91c2x5IHVwZGF0ZXMgb25lIG9yIG1vcmUgbWV0YWRhdGEgY29tcG9uZW50cyBpbiB0aGUgb3JnYW5pemF0aW9uLlxuICpcbiAqIEBtZXRob2QgTWV0YWRhdGEjdXBkYXRlXG4gKiBAcGFyYW0ge1N0cmluZ30gdHlwZSAtIFRoZSB0eXBlIG9mIG1ldGFkYXRhIHRvIHVwZGF0ZVxuICogQHBhcmFtIHtNZXRhZGF0YX5NZXRhZGF0YUluZm98QXJyYXkuPE1ldGFkYXRhfk1ldGFkYXRhSW5mbz59IHVwZGF0ZU1ldGFkYXRhIC0gVXBkYXRpbmcgbWV0YWRhdGFcbiAqIEBwYXJhbSB7Q2FsbGJhY2suPE1ldGFkYXRhflNhdmVSZXN1bHR8QXJyYXkuPE1ldGFkYXRhflNhdmVSZXN1bHQ+Pn0gW2NhbGxiYWNrXSAtIENhbGxiYWNrIGZ1bmN0aW9uXG4gKiBAcmV0dXJucyB7UHJvbWlzZS48TWV0YWRhdGF+U2F2ZVJlc3VsdHxBcnJheS48TWV0YWRhdGF+U2F2ZVJlc3VsdD4+fVxuICovXG5NZXRhZGF0YS5wcm90b3R5cGUudXBkYXRlU3luYyA9XG5NZXRhZGF0YS5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24odHlwZSwgbWV0YWRhdGEsIGNhbGxiYWNrKSB7XG4gIHZhciBjb252ZXJ0ID0gZnVuY3Rpb24obWQpIHtcbiAgICBtZFtcIkB4c2k6dHlwZVwiXSA9IHR5cGU7XG4gICAgcmV0dXJuIG1kO1xuICB9O1xuICB2YXIgaXNBcnJheSA9IF8uaXNBcnJheShtZXRhZGF0YSk7XG4gIG1ldGFkYXRhID0gaXNBcnJheSA/IF8ubWFwKG1ldGFkYXRhLCBjb252ZXJ0KSA6IGNvbnZlcnQobWV0YWRhdGEpO1xuICByZXR1cm4gdGhpcy5faW52b2tlKFwidXBkYXRlTWV0YWRhdGFcIiwgeyBtZXRhZGF0YTogbWV0YWRhdGEgfSkudGhlbihmdW5jdGlvbihyZXN1bHRzKSB7XG4gICAgcmV0dXJuIF8uaXNBcnJheShyZXN1bHRzKSA/IF8ubWFwKHJlc3VsdHMsIGNvbnZlcnRUb1NhdmVSZXN1bHQpIDogY29udmVydFRvU2F2ZVJlc3VsdChyZXN1bHRzKTtcbiAgfSkudGhlbkNhbGwoY2FsbGJhY2spO1xufTtcblxuLyoqXG4gKiBTeW5vbnltIG9mIE1ldGFkYXRhI3Vwc2VydCgpLlxuICpcbiAqIEBtZXRob2QgTWV0YWRhdGEjdXBzZXJ0U3luY1xuICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgLSBUaGUgdHlwZSBvZiBtZXRhZGF0YSB0byB1cHNlcnRcbiAqIEBwYXJhbSB7TWV0YWRhdGF+TWV0YWRhdGFJbmZvfEFycmF5LjxNZXRhZGF0YX5NZXRhZGF0YUluZm8+fSBtZXRhZGF0YSAtIFVwc2VydGluZyBtZXRhZGF0YVxuICogQHBhcmFtIHtDYWxsYmFjay48TWV0YWRhdGF+VXBzZXJ0UmVzdWx0fEFycmF5LjxNZXRhZGF0YX5VcHNlcnRSZXN1bHQ+Pn0gW2NhbGxiYWNrXSAtIENhbGxiYWNrIGZ1bmN0aW9uXG4gKiBAcmV0dXJucyB7UHJvbWlzZS48TWV0YWRhdGF+VXBzZXJ0UmVzdWx0fEFycmF5LjxNZXRhZGF0YX5VcHNlcnRSZXN1bHQ+Pn1cbiAqL1xuLyoqXG4gKiBVcHNlcnRzIG9uZSBvciBtb3JlIGNvbXBvbmVudHMgaW4geW91ciBvcmdhbml6YXRpb24ncyBkYXRhLlxuICpcbiAqIEBtZXRob2QgTWV0YWRhdGEjdXBzZXJ0XG4gKiBAcGFyYW0ge1N0cmluZ30gdHlwZSAtIFRoZSB0eXBlIG9mIG1ldGFkYXRhIHRvIHVwc2VydFxuICogQHBhcmFtIHtNZXRhZGF0YX5NZXRhZGF0YUluZm98QXJyYXkuPE1ldGFkYXRhfk1ldGFkYXRhSW5mbz59IG1ldGFkYXRhIC0gVXBzZXJ0aW5nIG1ldGFkYXRhXG4gKiBAcGFyYW0ge0NhbGxiYWNrLjxNZXRhZGF0YX5VcHNlcnRSZXN1bHR8QXJyYXkuPE1ldGFkYXRhflVwc2VydFJlc3VsdD4+fSBbY2FsbGJhY2tdIC0gQ2FsbGJhY2sgZnVuY3Rpb25cbiAqIEByZXR1cm5zIHtQcm9taXNlLjxNZXRhZGF0YX5VcHNlcnRSZXN1bHR8QXJyYXkuPE1ldGFkYXRhflVwc2VydFJlc3VsdD4+fVxuICovXG5NZXRhZGF0YS5wcm90b3R5cGUudXBzZXJ0U3luYyA9XG5NZXRhZGF0YS5wcm90b3R5cGUudXBzZXJ0ID0gZnVuY3Rpb24odHlwZSwgbWV0YWRhdGEsIGNhbGxiYWNrKSB7XG4gIHZhciBjb252ZXJ0ID0gZnVuY3Rpb24obWQpIHtcbiAgICBtZFtcIkB4c2k6dHlwZVwiXSA9IHR5cGU7XG4gICAgcmV0dXJuIG1kO1xuICB9O1xuICB2YXIgaXNBcnJheSA9IF8uaXNBcnJheShtZXRhZGF0YSk7XG4gIG1ldGFkYXRhID0gaXNBcnJheSA/IF8ubWFwKG1ldGFkYXRhLCBjb252ZXJ0KSA6IGNvbnZlcnQobWV0YWRhdGEpO1xuICByZXR1cm4gdGhpcy5faW52b2tlKFwidXBzZXJ0TWV0YWRhdGFcIiwgeyBtZXRhZGF0YTogbWV0YWRhdGEgfSkudGhlbihmdW5jdGlvbihyZXN1bHRzKSB7XG4gICAgcmV0dXJuIF8uaXNBcnJheShyZXN1bHRzKSA/IF8ubWFwKHJlc3VsdHMsIGNvbnZlcnRUb1Vwc2VydFJlc3VsdCkgOiBjb252ZXJ0VG9VcHNlcnRSZXN1bHQocmVzdWx0cyk7XG4gIH0pLnRoZW5DYWxsKGNhbGxiYWNrKTtcbn07XG5cbi8qKlxuICogQXN5bmNocm9ub3VzbHkgZGVsZXRlcyBzcGVjaWZpZWQgbWV0YWRhdGEgY29tcG9uZW50cyBpbiB0aGUgb3JnYW5pemF0aW9uLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlIC0gVGhlIHR5cGUgb2YgbWV0YWRhdGEgdG8gZGVsZXRlXG4gKiBAcGFyYW0ge1N0cmluZ3xNZXRhZGF0YX5NZXRhZGF0YUluZm98QXJyYXkuPFN0cmluZz58QXJyYXkuPE1ldGFkYXRhfk1ldGFkYXRhSW5mbz59IG1ldGFkYXRhIC0gVGhlIGZ1bGxOYW1lIG9mIG1ldGFkYXRhIG9yIG1ldGFkYXRhIGluZm8gdG8gZGVsZXRlLiBJZiBpdCBpcyBwYXNzZWQgaW4gZnVsbE5hbWUsIHRoZSB0eXBlIHBhcmFtZXRlciBzaG91bGQgbm90IGJlIGVtcHR5LlxuICogQHBhcmFtIHtDYWxsYmFjay48TWV0YWRhdGF+QXN5bmNSZXN1bHR8QXJyYXkuPE1ldGFkYXRhfkFzeW5jUmVzdWx0Pj59IFtjYWxsYmFja10gLSBDYWxsYmFjayBmdW5jdGlvblxuICogQHJldHVybnMge01ldGFkYXRhfkFzeW5jUmVzdWx0TG9jYXRvcn1cbiAqL1xuTWV0YWRhdGEucHJvdG90eXBlLmRlbGV0ZUFzeW5jID0gZnVuY3Rpb24odHlwZSwgbWV0YWRhdGEsIGNhbGxiYWNrKSB7XG4gIGlmIChOdW1iZXIodGhpcy5fY29ubi52ZXJzaW9uKSA+IDMwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQXN5bmMgbWV0YWRhdGEgQ1JVRCBjYWxscyBhcmUgbm90IHN1cHBvcnRlZCBvbiB2ZXIgMzEuMCBvciBsYXRlci5cIik7XG4gIH1cbiAgdmFyIGNvbnZlcnQgPSBmdW5jdGlvbihtZCkge1xuICAgIGlmIChfLmlzU3RyaW5nKG1kKSkge1xuICAgICAgbWQgPSB7IGZ1bGxOYW1lIDogbWQgfTtcbiAgICB9XG4gICAgbWRbXCJAeHNpOnR5cGVcIl0gPSB0eXBlO1xuICAgIHJldHVybiBtZDtcbiAgfTtcbiAgdmFyIGlzQXJyYXkgPSBfLmlzQXJyYXkobWV0YWRhdGEpO1xuICBtZXRhZGF0YSA9IGlzQXJyYXkgPyBfLm1hcChtZXRhZGF0YSwgY29udmVydCkgOiBjb252ZXJ0KG1ldGFkYXRhKTtcbiAgdmFyIHJlcyA9IHRoaXMuX2ludm9rZShcImRlbGV0ZVwiLCB7IG1ldGFkYXRhOiBtZXRhZGF0YSB9KTtcbiAgcmV0dXJuIG5ldyBBc3luY1Jlc3VsdExvY2F0b3IodGhpcywgcmVzLCBpc0FycmF5KS50aGVuQ2FsbChjYWxsYmFjayk7XG59O1xuXG4vKipcbiAqIFN5bm9ueW0gb2YgTWV0YWRhdGEjZGVsZXRlKCkuXG4gKlxuICogQGRlcHJlY2F0ZWRcbiAqIEBtZXRob2QgTWV0YWRhdGEjZGVsXG4gKiBAcGFyYW0ge1N0cmluZ30gW3R5cGVdIC0gVGhlIHR5cGUgb2YgbWV0YWRhdGEgdG8gZGVsZXRlXG4gKiBAcGFyYW0ge1N0cmluZ3xNZXRhZGF0YX5NZXRhZGF0YUluZm98QXJyYXkuPFN0cmluZz58QXJyYXkuPE1ldGFkYXRhfk1ldGFkYXRhSW5mbz59IG1ldGFkYXRhIC0gVGhlIGZ1bGxOYW1lIG9mIG1ldGFkYXRhIG9yIG1ldGFkYXRhIGluZm8gdG8gZGVsZXRlLiBJZiBpdCBpcyBwYXNzZWQgaW4gZnVsbE5hbWUsIHRoZSB0eXBlIHBhcmFtZXRlciBzaG91bGQgbm90IGJlIGVtcHR5LlxuICogQHBhcmFtIHtDYWxsYmFjay48TWV0YWRhdGF+QXN5bmNSZXN1bHR8QXJyYXkuPE1ldGFkYXRhfkFzeW5jUmVzdWx0Pj59IFtjYWxsYmFja10gLSBDYWxsYmFjayBmdW5jdGlvblxuICogQHJldHVybnMge01ldGFkYXRhfkFzeW5jUmVzdWx0TG9jYXRvcn1cbiAqL1xuLyoqXG4gKiBTeW5vbnltIG9mIE1ldGFkYXRhI2RlbGV0ZSgpLlxuICpcbiAqIEBtZXRob2QgTWV0YWRhdGEjZGVsZXRlU3luY1xuICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgLSBUaGUgdHlwZSBvZiBtZXRhZGF0YSB0byBkZWxldGVcbiAqIEBwYXJhbSB7U3RyaW5nfEFycmF5LjxTdHJpbmc+fSBmdWxsTmFtZXMgLSBUaGUgZnVsbE5hbWUgb2YgbWV0YWRhdGEgdG8gZGVsZXRlLlxuICogQHBhcmFtIHtDYWxsYmFjay48TWV0YWRhdGF+U2F2ZVJlc3VsdHxBcnJheS48TWV0YWRhdGF+U2F2ZVJlc3VsdD4+fSBbY2FsbGJhY2tdIC0gQ2FsbGJhY2sgZnVuY3Rpb25cbiAqIEByZXR1cm5zIHtQcm9taXNlLjxNZXRhZGF0YX5TYXZlUmVzdWx0fEFycmF5LjxNZXRhZGF0YX5TYXZlUmVzdWx0Pj59XG4gKi9cblxuLyoqXG4gKiBTeW5jaHJvbm91c2x5IGRlbGV0ZXMgc3BlY2lmaWVkIG1ldGFkYXRhIGNvbXBvbmVudHMgaW4gdGhlIG9yZ2FuaXphdGlvbi5cbiAqXG4gKiBAbWV0aG9kIE1ldGFkYXRhI2RlbGV0ZVxuICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgLSBUaGUgdHlwZSBvZiBtZXRhZGF0YSB0byBkZWxldGVcbiAqIEBwYXJhbSB7U3RyaW5nfEFycmF5LjxTdHJpbmc+fSBmdWxsTmFtZXMgLSBUaGUgZnVsbE5hbWUgb2YgbWV0YWRhdGEgdG8gZGVsZXRlLlxuICogQHBhcmFtIHtDYWxsYmFjay48TWV0YWRhdGF+U2F2ZVJlc3VsdHxBcnJheS48TWV0YWRhdGF+U2F2ZVJlc3VsdD4+fSBbY2FsbGJhY2tdIC0gQ2FsbGJhY2sgZnVuY3Rpb25cbiAqIEByZXR1cm5zIHtQcm9taXNlLjxNZXRhZGF0YX5TYXZlUmVzdWx0fEFycmF5LjxNZXRhZGF0YX5TYXZlUmVzdWx0Pj59XG4gKi9cbk1ldGFkYXRhLnByb3RvdHlwZS5kZWwgPVxuTWV0YWRhdGEucHJvdG90eXBlLmRlbGV0ZVN5bmMgPVxuTWV0YWRhdGEucHJvdG90eXBlW1wiZGVsZXRlXCJdID0gZnVuY3Rpb24odHlwZSwgZnVsbE5hbWVzLCBjYWxsYmFjaykge1xuICByZXR1cm4gdGhpcy5faW52b2tlKFwiZGVsZXRlTWV0YWRhdGFcIiwgeyB0eXBlOiB0eXBlLCBmdWxsTmFtZXM6IGZ1bGxOYW1lcyB9KS50aGVuKGZ1bmN0aW9uKHJlc3VsdHMpIHtcbiAgICByZXR1cm4gXy5pc0FycmF5KHJlc3VsdHMpID8gXy5tYXAocmVzdWx0cywgY29udmVydFRvU2F2ZVJlc3VsdCkgOiBjb252ZXJ0VG9TYXZlUmVzdWx0KHJlc3VsdHMpO1xuICB9KS50aGVuQ2FsbChjYWxsYmFjayk7XG59O1xuXG4vKipcbiAqIFJlbmFtZSBmdWxsbmFtZSBvZiBhIG1ldGFkYXRhIGNvbXBvbmVudCBpbiB0aGUgb3JnYW5pemF0aW9uXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgLSBUaGUgdHlwZSBvZiBtZXRhZGF0YSB0byBkZWxldGVcbiAqIEBwYXJhbSB7U3RyaW5nfSBvbGRGdWxsTmFtZSAtIFRoZSBvcmlnaW5hbCBmdWxsTmFtZSBvZiBtZXRhZGF0YVxuICogQHBhcmFtIHtTdHJpbmd9IG5ld0Z1bGxOYW1lIC0gVGhlIG5ldyBmdWxsTmFtZSBvZiBtZXRhZGF0YVxuICogQHBhcmFtIHtDYWxsYmFjay48TWV0YWRhdGF+U2F2ZVJlc3VsdD59IFtjYWxsYmFja10gLSBDYWxsYmFjayBmdW5jdGlvblxuICogQHJldHVybnMge1Byb21pc2UuPE1ldGFkYXRhflNhdmVSZXN1bHQ+fVxuICovXG5NZXRhZGF0YS5wcm90b3R5cGUucmVuYW1lID0gZnVuY3Rpb24odHlwZSwgb2xkRnVsbE5hbWUsIG5ld0Z1bGxOYW1lLCBjYWxsYmFjaykge1xuICByZXR1cm4gdGhpcy5faW52b2tlKFwicmVuYW1lTWV0YWRhdGFcIiwgeyB0eXBlOiB0eXBlLCBvbGRGdWxsTmFtZTogb2xkRnVsbE5hbWUsIG5ld0Z1bGxOYW1lOiBuZXdGdWxsTmFtZSB9KS50aGVuKGZ1bmN0aW9uKHJlc3VsdCkge1xuICAgIHJldHVybiBjb252ZXJ0VG9TYXZlUmVzdWx0KHJlc3VsdCk7XG4gIH0pLnRoZW5DYWxsKGNhbGxiYWNrKTtcbn07XG5cbi8qKlxuICogQ2hlY2tzIHRoZSBzdGF0dXMgb2YgYXN5bmNocm9ub3VzIG1ldGFkYXRhIGNhbGxzXG4gKlxuICogQHBhcmFtIHtTdHJpbmd8QXJyYXkuPFN0cmluZz59IGlkcyAtIFRoZSBhc3luY2hyb25vdXMgcHJvY2VzcyBJRChzKVxuICogQHBhcmFtIHtDYWxsYmFjay48TWV0YWRhdGF+QXN5bmNSZXN1bHR8QXJyYXkuPE1ldGFkYXRhfkFzeW5jUmVzdWx0Pj59IFtjYWxsYmFja10gLSBDYWxsYmFjayBmdW5jdGlvblxuICogQHJldHVybnMge01ldGFkYXRhfkFzeW5jUmVzdWx0TG9jYXRvcn1cbiAqL1xuTWV0YWRhdGEucHJvdG90eXBlLmNoZWNrU3RhdHVzID0gZnVuY3Rpb24oaWRzLCBjYWxsYmFjaykge1xuICB2YXIgaXNBcnJheSA9IF8uaXNBcnJheShpZHMpO1xuICB2YXIgcmVzID0gdGhpcy5faW52b2tlKFwiY2hlY2tTdGF0dXNcIiwgeyBhc3luY1Byb2Nlc3NJZDogaWRzIH0pO1xuICByZXR1cm4gbmV3IEFzeW5jUmVzdWx0TG9jYXRvcih0aGlzLCByZXMsIGlzQXJyYXkpLnRoZW5DYWxsKGNhbGxiYWNrKTtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gTWV0YWRhdGF+RGVzY3JpYmVNZXRhZGF0YVJlc3VsdFxuICogQHByb3Age0FycmF5LjxPYmplY3Q+fSBtZXRhZGF0YU9iamVjdHMgLSBPbmUgb3IgbW9yZSBtZXRhZGF0YSBjb21wb25lbnRzIGFuZCB0aGVpciBhdHRyaWJ1dGVzXG4gKiBAcHJvcCB7QXJyYXkuPFN0cmluZz59IG1ldGFkYXRhT2JqZWN0cy5jaGlsZFhtbE5hbWVzIC0gTGlzdCBvZiBjaGlsZCBzdWItY29tcG9uZW50cyBmb3IgdGhpcyBjb21wb25lbnRcbiAqIEBwcm9wIHtTdHJpbmd9IG1ldGFkYXRhT2JqZWN0cy5kaXJlY3RvcnlOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGRpcmVjdG9yeSBpbiB0aGUgLnppcCBmaWxlIHRoYXQgY29udGFpbnMgdGhpcyBjb21wb25lbnRcbiAqIEBwcm9wIHtCb29sZWFufSBtZXRhZGF0YU9iamVjdHMuaW5Gb2xkZXIgLSBJbmRpY2F0ZXMgd2hldGhlciB0aGUgY29tcG9uZW50IGlzIGluIGEgZm9sZGVyIG9yIG5vdFxuICogQHByb3Age0Jvb2xlYW59IG1ldGFkYXRhT2JqZWN0cy5tZXRhRmlsZSAtIEluZGljYXRlcyB3aGV0aGVyIHRoZSBjb21wb25lbnQgcmVxdWlyZXMgYW4gYWNjb21wYW55aW5nIG1ldGFkYXRhIGZpbGVcbiAqIEBwcm9wIHtTdHJpbmd9IG1ldGFkYXRhT2JqZWN0cy5zdWZmaXggLSBUaGUgZmlsZSBzdWZmaXggZm9yIHRoaXMgY29tcG9uZW50XG4gKiBAcHJvcCB7U3RyaW5nfSBtZXRhZGF0YU9iamVjdHMueG1sTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSByb290IGVsZW1lbnQgaW4gdGhlIG1ldGFkYXRhIGZpbGUgZm9yIHRoaXMgY29tcG9uZW50XG4gKiBAcHJvcCB7U3RyaW5nfSBvcmdhbml6YXRpb25OYW1lc3BhY2UgLSBUaGUgbmFtZXNwYWNlIG9mIHRoZSBvcmdhbml6YXRpb25cbiAqIEBwcm9wIHtCb29sZWFufSBwYXJ0aWFsU2F2ZUFsbG93ZWQgLSBJbmRpY2F0ZXMgd2hldGhlciByb2xsYmFja09uRXJyb3IgaXMgYWxsb3dlZCBvciBub3RcbiAqIEBwcm9wIHtCb29sZWFufSB0ZXN0UmVxdWlyZWQgLSBJbmRpY2F0ZXMgd2hldGhlciB0ZXN0cyBhcmUgcmVxdWlyZWQgb3Igbm90XG4gKi9cblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIG1ldGFkYXRhIHdoaWNoIGRlc2NyaWJlcyB5b3VyIG9yZ2FuaXphdGlvbiwgaW5jbHVkaW5nIEFwZXggY2xhc3NlcyBhbmQgdHJpZ2dlcnMsXG4gKiBjdXN0b20gb2JqZWN0cywgY3VzdG9tIGZpZWxkcyBvbiBzdGFuZGFyZCBvYmplY3RzLCB0YWIgc2V0cyB0aGF0IGRlZmluZSBhbiBhcHAsXG4gKiBhbmQgbWFueSBvdGhlciBjb21wb25lbnRzLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBbdmVyc2lvbl0gLSBUaGUgQVBJIHZlcnNpb24gZm9yIHdoaWNoIHlvdSB3YW50IG1ldGFkYXRhOyBmb3IgZXhhbXBsZSwgMjkuMFxuICogQHBhcmFtIHtDYWxsYmFjay48TWV0YWRhdGF+RGVzY3JpYmVNZXRhZGF0YVJlc3VsdD59IFtjYWxsYmFja10gLSBDYWxsYmFjayBmdW5jdGlvblxuICogQHJldHVybnMge1Byb21pc2UuPE1ldGFkYXRhfkRlc2NyaWJlTWV0YWRhdGFSZXN1bHQ+fVxuICovXG5NZXRhZGF0YS5wcm90b3R5cGUuZGVzY3JpYmUgPSBmdW5jdGlvbih2ZXJzaW9uLCBjYWxsYmFjaykge1xuICBpZiAoIV8uaXNTdHJpbmcodmVyc2lvbikpIHtcbiAgICBjYWxsYmFjayA9IHZlcnNpb247XG4gICAgdmVyc2lvbiA9IHRoaXMuX2Nvbm4udmVyc2lvbjtcbiAgfVxuICByZXR1cm4gdGhpcy5faW52b2tlKFwiZGVzY3JpYmVNZXRhZGF0YVwiLCB7IGFzT2ZWZXJzaW9uOiB2ZXJzaW9uIH0pLnRoZW4oZnVuY3Rpb24ocmVzKSB7XG4gICAgcmVzLm1ldGFkYXRhT2JqZWN0cyA9IF8uaXNBcnJheShyZXMubWV0YWRhdGFPYmplY3RzKSA/IHJlcy5tZXRhZGF0YU9iamVjdHMgOiBbIHJlcy5tZXRhZGF0YU9iamVjdHMgXTtcbiAgICByZXMubWV0YWRhdGFPYmplY3RzID0gXy5tYXAocmVzLm1ldGFkYXRhT2JqZWN0cywgZnVuY3Rpb24obW8pIHtcbiAgICAgIGlmIChtby5jaGlsZFhtbE5hbWVzKSB7XG4gICAgICAgIG1vLmNoaWxkWG1sTmFtZXMgPSBfLmlzQXJyYXkobW8uY2hpbGRYbWxOYW1lcykgPyBtby5jaGlsZFhtbE5hbWVzOiBbIG1vLmNoaWxkWG1sTmFtZXMgXTtcbiAgICAgIH1cbiAgICAgIG1vLmluRm9sZGVyID0gbW8uaW5Gb2xkZXIgPT09ICd0cnVlJztcbiAgICAgIG1vLm1ldGFGaWxlID0gbW8ubWV0YUZpbGUgPT09ICd0cnVlJztcbiAgICAgIHJldHVybiBtbztcbiAgICB9KTtcbiAgICByZXMucGFydGlhbFNhdmVBbGxvd2VkID0gcmVzLnBhcnRpYWxTYXZlQWxsb3dlZCA9PT0gJ3RydWUnO1xuICAgIHJlcy50ZXN0UmVxdWlyZWQgPSByZXMudGVzdFJlcXVpcmVkID09PSAndHJ1ZSc7XG4gICAgcmV0dXJuIHJlcztcbiAgfSkudGhlbkNhbGwoY2FsbGJhY2spO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBNZXRhZGF0YX5MaXN0TWV0YWRhdGFRdWVyeVxuICogQHByb3Age1N0cmluZ30gdHlwZSAtIFRoZSBtZXRhZGF0YSB0eXBlLCBzdWNoIGFzIEN1c3RvbU9iamVjdCwgQ3VzdG9tRmllbGQsIG9yIEFwZXhDbGFzc1xuICogQHByb3Age1N0cmluZ30gW2ZvbGRlcl0gLSBUaGUgZm9sZGVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgY29tcG9uZW50LlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gTWV0YWRhdGF+RmlsZVByb3BlcnRpZXNcbiAqIEBwcm9wIHtTdHJpbmd9IHR5cGUgLSBUaGUgbWV0YWRhdGEgdHlwZSwgc3VjaCBhcyBDdXN0b21PYmplY3QsIEN1c3RvbUZpZWxkLCBvciBBcGV4Q2xhc3NcbiAqIEBwcm9wIHtTdHJpbmd9IGNyZWF0ZWRCeUlkIC0gSUQgb2YgdGhlIHVzZXIgd2hvIGNyZWF0ZWQgdGhlIGZpbGVcbiAqIEBwcm9wIHtTdHJpbmd9IGNyZWF0ZWRCeU5hbWUgLSBOYW1lIG9mIHRoZSB1c2VyIHdobyBjcmVhdGVkIHRoZSBmaWxlXG4gKiBAcHJvcCB7U3RyaW5nfSBjcmVhdGVkRGF0ZSAtIERhdGUgYW5kIHRpbWUgd2hlbiB0aGUgZmlsZSB3YXMgY3JlYXRlZFxuICogQHByb3Age1N0cmluZ30gZmlsZU5hbWUgLSBOYW1lIG9mIHRoZSBmaWxlXG4gKiBAcHJvcCB7U3RyaW5nfSBmdWxsTmFtZSAtIFRoZSBmaWxlIGRldmVsb3BlciBuYW1lIHVzZWQgYXMgYSB1bmlxdWUgaWRlbnRpZmllciBmb3IgQVBJIGFjY2Vzc1xuICogQHByb3Age1N0cmluZ30gaWQgLSBJRCBvZiB0aGUgZmlsZVxuICogQHByb3Age1N0cmluZ30gbGFzdE1vZGlmaWVkQnlJZCAtIElEIG9mIHRoZSB1c2VyIHdobyBsYXN0IG1vZGlmaWVkIHRoZSBmaWxlXG4gKiBAcHJvcCB7U3RyaW5nfSBsYXN0TW9kaWZpZWRCeU5hbWUgLSBOYW1lIG9mIHRoZSB1c2VyIHdobyBsYXN0IG1vZGlmaWVkIHRoZSBmaWxlXG4gKiBAcHJvcCB7U3RyaW5nfSBsYXN0TW9kaWZpZWREYXRlIC0gRGF0ZSBhbmQgdGltZSB0aGF0IHRoZSBmaWxlIHdhcyBsYXN0IG1vZGlmaWVkXG4gKiBAcHJvcCB7U3RyaW5nfSBbbWFuYWdlYWJsZVN0YXRlXSAtIEluZGljYXRlcyB0aGUgbWFuYWdlYWJsZSBzdGF0ZSBvZiB0aGUgc3BlY2lmaWVkIGNvbXBvbmVudCBpZiBpdCBpcyBjb250YWluZWQgaW4gYSBwYWNrYWdlXG4gKiBAcHJvcCB7U3RyaW5nfSBbbmFtZXNwYWNlUHJlZml4XSAtIFRoZSBuYW1lc3BhY2UgcHJlZml4IG9mIHRoZSBjb21wb25lbnRcbiAqL1xuXG4vKipcbiAqIFJldHJpZXZlcyBwcm9wZXJ0eSBpbmZvcm1hdGlvbiBhYm91dCBtZXRhZGF0YSBjb21wb25lbnRzIGluIHlvdXIgb3JnYW5pemF0aW9uXG4gKlxuICogQHBhcmFtIHtNZXRhZGF0YX5MaXN0TWV0YWRhdGFRdWVyeXxBcnJheS48TWV0YWRhdGF+TGlzdE1ldGFkYXRhUXVlcnk+fSBxdWVyaWVzIC0gVGhlIGNyaXRlcmlhIG9iamVjdChzKSBzcGVjaWZpbmcgbWV0YWRhdGEgdG8gbGlzdFxuICogQHBhcmFtIHtTdHJpbmd9IFt2ZXJzaW9uXSAtIFRoZSBBUEkgdmVyc2lvbiBmb3Igd2hpY2ggeW91IHdhbnQgbWV0YWRhdGE7IGZvciBleGFtcGxlLCAyOS4wXG4gKiBAcGFyYW0ge0NhbGxiYWNrLjxBcnJheS48TWV0YWRhdGF+RmlsZVByb3BlcnRpZXM+Pn0gW2NhbGxiYWNrXSAtIENhbGxiYWNrIGZ1bmN0aW9uXG4gKiBAcmV0dXJucyB7UHJvbWlzZS48QXJyYXkuPE1ldGFkYXRhfkZpbGVQcm9wZXJ0aWVzPj59XG4gKi9cbk1ldGFkYXRhLnByb3RvdHlwZS5saXN0ID0gZnVuY3Rpb24ocXVlcmllcywgdmVyc2lvbiwgY2FsbGJhY2spIHtcbiAgaWYgKCFfLmlzU3RyaW5nKHZlcnNpb24pKSB7XG4gICAgY2FsbGJhY2sgPSB2ZXJzaW9uO1xuICAgIHZlcnNpb24gPSB0aGlzLl9jb25uLnZlcnNpb247XG4gIH1cbiAgaWYgKCFfLmlzQXJyYXkocXVlcmllcykpIHtcbiAgICBxdWVyaWVzID0gWyBxdWVyaWVzIF07XG4gIH1cbiAgcmV0dXJuIHRoaXMuX2ludm9rZShcImxpc3RNZXRhZGF0YVwiLCB7IHF1ZXJpZXM6IHF1ZXJpZXMsIGFzT2ZWZXJzaW9uOiB2ZXJzaW9uIH0sIGNhbGxiYWNrKTtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gTWV0YWRhdGF+UmV0cmlldmVSZXF1ZXN0XG4gKi9cblxuLyoqXG4gKiBSZXRyaWV2ZXMgWE1MIGZpbGUgcmVwcmVzZW50YXRpb25zIG9mIGNvbXBvbmVudHMgaW4gYW4gb3JnYW5pemF0aW9uXG4gKlxuICogQHBhcmFtIHtNZXRhZGF0YX5SZXRyaWV2ZVJlcXVlc3R9IHJlcXVlc3QgLSBPcHRpb25zIGZvciBkZXRlcm1pbmluZyB3aGljaCBwYWNrYWdlcyBvciBmaWxlcyBhcmUgcmV0cmlldmVkXG4gKiBAcGFyYW0ge0NhbGxiYWNrLjxNZXRhZGF0YX5Bc3luY1Jlc3VsdD59IFtjYWxsYmFja10gLSBDYWxsYmFjayBmdW5jdGlvblxuICogQHJldHVybnMge01ldGFkYXRhflJldHJpZXZlUmVzdWx0TG9jYXRvcn1cbiAqL1xuTWV0YWRhdGEucHJvdG90eXBlLnJldHJpZXZlID0gZnVuY3Rpb24ocmVxdWVzdCwgY2FsbGJhY2spIHtcbiAgdmFyIHJlcyA9IHRoaXMuX2ludm9rZShcInJldHJpZXZlXCIsIHsgcmVxdWVzdDogcmVxdWVzdCB9KTtcbiAgcmV0dXJuIG5ldyBSZXRyaWV2ZVJlc3VsdExvY2F0b3IodGhpcywgcmVzKS50aGVuQ2FsbChjYWxsYmFjayk7XG59O1xuXG4vKipcbiAqIENoZWNrcyB0aGUgc3RhdHVzIG9mIGRlY2xhcmF0aXZlIG1ldGFkYXRhIGNhbGwgcmV0cmlldmUoKSBhbmQgcmV0dXJucyB0aGUgemlwIGZpbGUgY29udGVudHNcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gaWQgLSBBc3luYyBwcm9jZXNzIGlkIHJldHVybmVkIGZyb20gcHJldmlvdXMgcmV0cmlldmUgcmVxdWVzdFxuICogQHBhcmFtIHtDYWxsYmFjay48TWV0YWRhdGF+UmV0cmlldmVSZXN1bHQ+fSBbY2FsbGJhY2tdIC0gQ2FsbGJhY2sgZnVuY3Rpb25cbiAqIEByZXR1cm5zIHtQcm9taXNlLjxNZXRhZGF0YX5SZXRyaWV2ZVJlc3VsdD59XG4gKi9cbk1ldGFkYXRhLnByb3RvdHlwZS5jaGVja1JldHJpZXZlU3RhdHVzID0gZnVuY3Rpb24oaWQsIGNhbGxiYWNrKSB7XG4gIHJldHVybiB0aGlzLl9pbnZva2UoXCJjaGVja1JldHJpZXZlU3RhdHVzXCIsIHsgYXN5bmNQcm9jZXNzSWQ6IGlkIH0sIGNhbGxiYWNrKTtcbn07XG5cbi8qKlxuICogRGVwbG95IGNvbXBvbmVudHMgaW50byBhbiBvcmdhbml6YXRpb24gdXNpbmcgemlwcGVkIGZpbGUgcmVwcmVzZW50YXRpb25zXG4gKlxuICogQHBhcmFtIHtzdHJlYW0uU3RyZWFtfEJ1ZmZlcnxTdHJpbmd9IHppcElucHV0IC0gWmlwcGVkIGZpbGUgaW5wdXQgc291cmNlIGluIHJlYWRhYmxlIHN0cmVhbSwgYmluYXJ5IGJ1ZmZlciBvciBCYXNlNjQtZW5jb2RlZCBzdHJpbmdcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gLSBPcHRpb25zIHVzZWQgaW4gZGVwbG95bWVudFxuICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5hbGxvd01pc3NpbmdGaWxlc10gLSBTcGVjaWZpZXMgd2hldGhlciBhIGRlcGxveSBzdWNjZWVkcyBldmVuIGlmIGZpbGVzIHRoYXQgYXJlIHNwZWNpZmllZCBpbiBwYWNrYWdlLnhtbCBidXQgYXJlIG5vdCBpbiB0aGUgLnppcCBmaWxlIG9yIG5vdC5cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuYXV0b1VwZGF0ZVBhY2thZ2VdIC0gSWYgYSBmaWxlIGlzIGluIHRoZSAuemlwIGZpbGUgYnV0IG5vdCBzcGVjaWZpZWQgaW4gcGFja2FnZS54bWwsIHNwZWNpZmllcyB3aGV0aGVyIHRoZSBmaWxlIHNob3VsZCBiZSBhdXRvbWF0aWNhbGx5IGFkZGVkIHRvIHRoZSBwYWNrYWdlIG9yIG5vdC5cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuY2hlY2tPbmx5XSAtIEluZGljYXRlcyB3aGV0aGVyIEFwZXggY2xhc3NlcyBhbmQgdHJpZ2dlcnMgYXJlIHNhdmVkIHRvIHRoZSBvcmdhbml6YXRpb24gYXMgcGFydCBvZiB0aGUgZGVwbG95bWVudCAoZmFsc2UpIG9yIG5vdCAodHJ1ZSkuXG4gKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmlnbm9yZVdhcm5pbmdzXSAtIEluZGljYXRlcyB3aGV0aGVyIGEgd2FybmluZyBzaG91bGQgYWxsb3cgYSBkZXBsb3ltZW50IHRvIGNvbXBsZXRlIHN1Y2Nlc3NmdWxseSAodHJ1ZSkgb3Igbm90IChmYWxzZSkuIERlZmF1bHRzIHRvIGZhbHNlLlxuICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5wZXJmb3JtUmV0cmlldmVdIC0gSW5kaWNhdGVzIHdoZXRoZXIgYSByZXRyaWV2ZSgpIGNhbGwgaXMgcGVyZm9ybWVkIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBkZXBsb3ltZW50ICh0cnVlKSBvciBub3QgKGZhbHNlKS5cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMucHVyZ2VPbkRlbGV0ZV0gLSBJZiB0cnVlLCB0aGUgZGVsZXRlZCBjb21wb25lbnRzIGluIHRoZSBkZXN0cnVjdGl2ZUNoYW5nZXMueG1sIG1hbmlmZXN0IGZpbGUgYXJlbid0IHN0b3JlZCBpbiB0aGUgUmVjeWNsZSBCaW4uXG4gKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLnJvbGxiYWNrT25FcnJvcl0gLSBJbmRpY2F0ZXMgd2hldGhlciBhbnkgZmFpbHVyZSBjYXVzZXMgYSBjb21wbGV0ZSByb2xsYmFjayAodHJ1ZSkgb3Igbm90IChmYWxzZSkuXG4gKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLnJ1bkFsbFRlc3RzXSAtIElmIHRydWUsIGFsbCBBcGV4IHRlc3RzIGRlZmluZWQgaW4gdGhlIG9yZ2FuaXphdGlvbiBhcmUgcnVuLlxuICogQHBhcmFtIHtBcnJheS48U3RyaW5nPn0gW29wdGlvbnMucnVuVGVzdHNdIC0gQSBsaXN0IG9mIEFwZXggdGVzdHMgdG8gYmUgcnVuIGR1cmluZyBkZXBsb3ltZW50LlxuICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5zaW5nbGVQYWNrYWdlXSAtIEluZGljYXRlcyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgLnppcCBmaWxlIHBvaW50cyB0byBhIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgd2l0aCBhIHNpbmdsZSBwYWNrYWdlICh0cnVlKSBvciBhIHNldCBvZiBwYWNrYWdlcyAoZmFsc2UpLlxuICogQHBhcmFtIHtDYWxsYmFjay48TWV0YWRhdGF+QXN5bmNSZXN1bHQ+fSBbY2FsbGJhY2tdIC0gQ2FsbGJhY2sgZnVuY3Rpb25cbiAqIEByZXR1cm5zIHtNZXRhZGF0YX5EZXBsb3lSZXN1bHRMb2NhdG9yfVxuICovXG5NZXRhZGF0YS5wcm90b3R5cGUuZGVwbG95ID0gZnVuY3Rpb24oemlwSW5wdXQsIG9wdGlvbnMsIGNhbGxiYWNrKSB7XG4gIGlmICghb3B0aW9ucyB8fCBfLmlzRnVuY3Rpb24ob3B0aW9ucykpIHtcbiAgICBjYWxsYmFjayA9IG9wdGlvbnM7XG4gICAgb3B0aW9ucyA9IHt9O1xuICB9XG4gIHZhciBkZWZlcnJlZCA9IFByb21pc2UuZGVmZXIoKTtcbiAgaWYgKF8uaXNPYmplY3QoemlwSW5wdXQpICYmIF8uaXNGdW5jdGlvbih6aXBJbnB1dC5waXBlKSkge1xuICAgIHZhciBidWZzID0gW107XG4gICAgemlwSW5wdXQub24oJ2RhdGEnLCBmdW5jdGlvbihkKSB7XG4gICAgICBidWZzLnB1c2goZCk7XG4gICAgfSk7XG4gICAgemlwSW5wdXQub24oJ2VuZCcsIGZ1bmN0aW9uKCkge1xuICAgICAgZGVmZXJyZWQucmVzb2x2ZShCdWZmZXIuY29uY2F0KGJ1ZnMpLnRvU3RyaW5nKCdiYXNlNjQnKSk7XG4gICAgfSk7XG4gICAgLy8gemlwSW5wdXQucmVzdW1lKCk7XG4gIH0gZWxzZSBpZiAoemlwSW5wdXQgaW5zdGFuY2VvZiBCdWZmZXIpIHtcbiAgICBkZWZlcnJlZC5yZXNvbHZlKHppcElucHV0LnRvU3RyaW5nKCdiYXNlNjQnKSk7XG4gIH0gZWxzZSBpZiAoemlwSW5wdXQgaW5zdGFuY2VvZiBTdHJpbmcgfHwgdHlwZW9mIHppcElucHV0ID09PSAnc3RyaW5nJykge1xuICAgIGRlZmVycmVkLnJlc29sdmUoemlwSW5wdXQpO1xuICB9IGVsc2Uge1xuICAgIHRocm93IFwiVW5leHBlY3RlZCB6aXBJbnB1dCB0eXBlXCI7XG4gIH1cblxuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciByZXMgPSBkZWZlcnJlZC5wcm9taXNlLnRoZW4oZnVuY3Rpb24oemlwQ29udGVudEI2NCkge1xuICAgIHJldHVybiBzZWxmLl9pbnZva2UoXCJkZXBsb3lcIiwge1xuICAgICAgWmlwRmlsZTogemlwQ29udGVudEI2NCxcbiAgICAgIERlcGxveU9wdGlvbnM6IG9wdGlvbnNcbiAgICB9LCBjYWxsYmFjayk7XG4gIH0pO1xuICByZXR1cm4gbmV3IERlcGxveVJlc3VsdExvY2F0b3IodGhpcywgcmVzKS50aGVuQ2FsbChjYWxsYmFjayk7XG59O1xuXG4vKipcbiAqIENoZWNrcyB0aGUgc3RhdHVzIG9mIGRlY2xhcmF0aXZlIG1ldGFkYXRhIGNhbGwgZGVwbG95KClcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gaWQgLSBBc3luYyBwcm9jZXNzIGlkIHJldHVybmVkIGZyb20gcHJldmlvdXMgZGVwbG95IHJlcXVlc3RcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW2luY2x1ZGVEZXRhaWxzXSAtIFNldHMgdGhlIERlcGxveVJlc3VsdCBvYmplY3QgdG8gaW5jbHVkZSBkZXRhaWxzIGluZm9ybWF0aW9uIChkZWZhdWx0OiBmYWxzZSlcbiAqIEBwYXJhbSB7Q2FsbGJhY2suPE1ldGFkYXRhfkRlcGxveVJlc3VsdD59IFtjYWxsYmFja10gLSBDYWxsYmFjayBmdW5jdGlvblxuICogQHJldHVybnMge1Byb21pc2UuPE1ldGFkYXRhfkRlcGxveVJlc3VsdD59XG4gKi9cbk1ldGFkYXRhLnByb3RvdHlwZS5jaGVja0RlcGxveVN0YXR1cyA9IGZ1bmN0aW9uKGlkLCBpbmNsdWRlRGV0YWlscywgY2FsbGJhY2spIHtcbiAgaWYgKF8uaXNPYmplY3QoaW5jbHVkZURldGFpbHMpIHx8IF8uaXNCb29sZWFuKGluY2x1ZGVEZXRhaWxzKSkge1xuICAgIGluY2x1ZGVEZXRhaWxzID0gISFpbmNsdWRlRGV0YWlscztcbiAgfSBlbHNlIHtcbiAgICBjYWxsYmFjayA9IGluY2x1ZGVEZXRhaWxzO1xuICAgIGluY2x1ZGVEZXRhaWxzID0gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHRoaXMuX2ludm9rZShcImNoZWNrRGVwbG95U3RhdHVzXCIsIHtcbiAgICBhc3luY1Byb2Nlc3NJZDogaWQsXG4gICAgaW5jbHVkZURldGFpbHMgOiBpbmNsdWRlRGV0YWlsc1xuICB9KS50aGVuKGZ1bmN0aW9uKHJlcykge1xuICAgIHJlcy5kb25lID0gcmVzLmRvbmUgPT09ICd0cnVlJztcbiAgICByZXMuc3VjY2VzcyA9IHJlcy5zdWNjZXNzID09PSAndHJ1ZSc7XG4gICAgcmVzLmNoZWNrT25seSA9IHJlcy5jaGVja09ubHkgPT09ICd0cnVlJztcbiAgICByZXMucnVuVGVzdHNFbmFibGVkID0gcmVzLnJ1blRlc3RzRW5hYmxlZCA9PT0gJ3RydWUnO1xuICAgIGlmIChyZXMuaWdub3JlV2FybmluZ3MpIHtcbiAgICAgIHJlcy5pZ25vcmVXYXJuaW5ncyA9IHJlcy5pZ25vcmVXYXJuaW5ncyA9PT0gJ3RydWUnO1xuICAgIH1cbiAgICBpZiAocmVzLnJvbGxiYWNrT25FcnJvcikge1xuICAgICAgcmVzLnJvbGxiYWNrT25FcnJvciA9IHJlcy5yb2xsYmFja09uRXJyb3IgPT09ICd0cnVlJztcbiAgICB9XG4gICAgcmVzLm51bWJlckNvbXBvbmVudEVycm9ycyA9IE51bWJlcihyZXMubnVtYmVyQ29tcG9uZW50RXJyb3JzKTtcbiAgICByZXMubnVtYmVyQ29tcG9uZW50c0RlcGxveWVkID0gTnVtYmVyKHJlcy5udW1iZXJDb21wb25lbnRzRGVwbG95ZWQpO1xuICAgIHJlcy5udW1iZXJDb21wb25lbnRzVG90YWwgPSBOdW1iZXIocmVzLm51bWJlckNvbXBvbmVudHNUb3RhbCk7XG4gICAgcmVzLm51bWJlclRlc3RFcnJvcnMgPSBOdW1iZXIocmVzLm51bWJlclRlc3RFcnJvcnMpO1xuICAgIHJlcy5udW1iZXJUZXN0c0NvbXBsZXRlZCA9IE51bWJlcihyZXMubnVtYmVyVGVzdHNDb21wbGV0ZWQpO1xuICAgIHJlcy5udW1iZXJUZXN0c1RvdGFsID0gTnVtYmVyKHJlcy5udW1iZXJUZXN0c1RvdGFsKTtcblxuICAgIHJldHVybiByZXM7XG4gIH0pLnRoZW5DYWxsKGNhbGxiYWNrKTtcbn07XG5cblxuLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gTWV0YWRhdGF+QXN5bmNSZXN1bHRcbiAqIEBwcm9wIHtCb29sZWFufSBkb25lIC0gSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGNhbGwgaGFzIGNvbXBsZXRlZCBvciBub3RcbiAqIEBwcm9wIHtTdHJpbmd9IGlkIC0gSUQgb2YgdGhlIGNvbXBvbmVudCBiZWluZyBjcmVhdGVkLCB1cGRhdGVkLCBkZWxldGVkLCBkZXBsb3llZCwgb3IgcmV0cmlldmVkXG4gKiBAcHJvcCB7U3RyaW5nfSBzdGF0ZSAtIFRoZSBzdGF0ZSBmb3VyIHBvc3NpYmxlIHZhbHVlczogUXVldWVkLCBJblByb2dyZXNzLCBDb21wbGV0ZWQsIGFuZCBFcnJvci5cbiAqIEBwcm9wIHtTdHJpbmd9IFtzdGF0dXNDb2RlXSAtIElmIGFuIGVycm9yIG9jY3VycmVkIGR1cmluZyB0aGUgY3JlYXRlKCksIHVwZGF0ZSgpLCBvciBkZWxldGUoKSBjYWxsLCBhIHN0YXR1cyBjb2RlIGlzIHJldHVybmVkXG4gKiBAcHJvcCB7U3RyaW5nfSBbbWVzc2FnZV0gLSBNZXNzYWdlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHN0YXR1c0NvZGUgZmllbGQgcmV0dXJuZWRcbiAqL1xuXG4vKipcbiAqIFRoZSBsb2NhdG9yIGNsYXNzIGZvciBNZXRhZGF0YSBBUEkgYXN5bmNocm9ub3VzIGNhbGwgcmVzdWx0XG4gKlxuICogQHByb3RlY3RlZFxuICogQGNsYXNzIE1ldGFkYXRhfkFzeW5jUmVzdWx0TG9jYXRvclxuICogQGV4dGVuZHMgZXZlbnRzLkV2ZW50RW1pdHRlclxuICogQGltcGxlbWVudHMgUHJvbWlzZS48TWV0YWRhdGF+QXN5bmNSZXN1bHR8QXJyYXkuPE1ldGFkYXRhfkFzeW5jUmVzdWx0Pj5cbiAqIEBwYXJhbSB7TWV0YWRhdGF9IG1ldGEgLSBNZXRhZGF0YSBBUEkgb2JqZWN0XG4gKiBAcGFyYW0ge1Byb21pc2UuPE1ldGFkYXRhfkFzeW5jUmVzdWx0fEFycmF5LjxNZXRhZGF0YX5Bc3luY1Jlc3VsdD4+fSByZXN1bHRzIC0gUHJvbWlzZSBvYmplY3QgZm9yIGFzeW5jIHJlc3VsdCBpbmZvXG4gKiBAcGFyYW0ge0Jvb2xlYW59IFtpc0FycmF5XSAtIEluZGljYXRlcyB3aGV0aGVyIHRoZSBhc3luYyByZXF1ZXN0IGlzIGdpdmVuIGluIGFycmF5IG9yIHNpbmdsZSBvYmplY3RcbiAqL1xudmFyIEFzeW5jUmVzdWx0TG9jYXRvciA9IGZ1bmN0aW9uKG1ldGEsIHJlc3VsdHMsIGlzQXJyYXkpIHtcbiAgdGhpcy5fbWV0YSA9IG1ldGE7XG4gIHRoaXMuX3Jlc3VsdHMgPSByZXN1bHRzO1xuICB0aGlzLl9pc0FycmF5ID0gaXNBcnJheTtcbn07XG5cbmluaGVyaXRzKEFzeW5jUmVzdWx0TG9jYXRvciwgZXZlbnRzLkV2ZW50RW1pdHRlcik7XG5cbi8qKlxuICogUHJvbWlzZS9BKyBpbnRlcmZhY2VcbiAqIGh0dHA6Ly9wcm9taXNlcy1hcGx1cy5naXRodWIuaW8vcHJvbWlzZXMtc3BlYy9cbiAqXG4gKiBEZWxlZ2F0ZSB0byBkZWZlcnJlZCBwcm9taXNlLCByZXR1cm4gcHJvbWlzZSBpbnN0YW5jZSBmb3IgYmF0Y2ggcmVzdWx0XG4gKlxuICogQG1ldGhvZCBNZXRhZGF0YX5Bc3luY1Jlc3VsdExvY2F0b3IjdGhlblxuICovXG5Bc3luY1Jlc3VsdExvY2F0b3IucHJvdG90eXBlLnRoZW4gPSBmdW5jdGlvbihvblJlc29sdmUsIG9uUmVqZWN0KSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgcmV0dXJuIHRoaXMuX3Jlc3VsdHMudGhlbihmdW5jdGlvbihyZXN1bHRzKSB7XG4gICAgdmFyIGNvbnZlcnRUeXBlID0gZnVuY3Rpb24ocmVzKSB7XG4gICAgICBpZiAocmVzLiQgJiYgcmVzLiRbXCJ4c2k6bmlsXCJdID09PSAndHJ1ZScpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICByZXMuZG9uZSA9IHJlcy5kb25lID09PSAndHJ1ZSc7XG4gICAgICByZXR1cm4gcmVzO1xuICAgIH07XG4gICAgcmVzdWx0cyA9IF8uaXNBcnJheShyZXN1bHRzKSA/IF8ubWFwKHJlc3VsdHMsIGNvbnZlcnRUeXBlKSA6IGNvbnZlcnRUeXBlKHJlc3VsdHMpO1xuICAgIGlmIChzZWxmLl9pc0FycmF5ICYmICFfLmlzQXJyYXkocmVzdWx0cykpIHtcbiAgICAgIHJlc3VsdHMgPSBbIHJlc3VsdHMgXTtcbiAgICB9XG4gICAgcmV0dXJuIG9uUmVzb2x2ZShyZXN1bHRzKTtcbiAgfSwgb25SZWplY3QpO1xufTtcblxuLyoqXG4gKiBQcm9taXNlL0ErIGV4dGVuc2lvblxuICogQ2FsbCBcInRoZW5cIiB1c2luZyBnaXZlbiBub2RlLXN0eWxlIGNhbGxiYWNrIGZ1bmN0aW9uXG4gKlxuICogQG1ldGhvZCBNZXRhZGF0YX5Bc3luY1Jlc3VsdExvY2F0b3IjdGhlbkNhbGxcbiAqL1xuQXN5bmNSZXN1bHRMb2NhdG9yLnByb3RvdHlwZS50aGVuQ2FsbCA9IGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG4gIHJldHVybiBfLmlzRnVuY3Rpb24oY2FsbGJhY2spID8gdGhpcy50aGVuKGZ1bmN0aW9uKHJlcykge1xuICAgIHByb2Nlc3MubmV4dFRpY2soZnVuY3Rpb24oKSB7XG4gICAgICBjYWxsYmFjayhudWxsLCByZXMpO1xuICAgIH0pO1xuICB9LCBmdW5jdGlvbihlcnIpIHtcbiAgICBwcm9jZXNzLm5leHRUaWNrKGZ1bmN0aW9uKCkge1xuICAgICAgY2FsbGJhY2soZXJyKTtcbiAgICB9KTtcbiAgfSkgOiB0aGlzO1xufTtcblxuLyoqXG4gKiBDaGVjayB0aGUgc3RhdHVzIG9mIGFzeW5jIHJlcXVlc3RcbiAqXG4gKiBAbWV0aG9kIE1ldGFkYXRhfkFzeW5jUmVzdWx0TG9jYXRvciNjaGVja1xuICogQHBhcmFtIHtDYWxsYmFjay48TWV0YWRhdGF+QXN5bmNSZXN1bHR8QXJyYXkuPE1ldGFkYXRhfkFzeW5jUmVzdWx0Pj59IFtjYWxsYmFja10gLSBDYWxsYmFjayBmdW5jdGlvblxuICogQHJldHVybnMge1Byb21pc2UuPE1ldGFkYXRhfkFzeW5jUmVzdWx0fEFycmF5LjxNZXRhZGF0YX5Bc3luY1Jlc3VsdD4+fVxuICovXG5Bc3luY1Jlc3VsdExvY2F0b3IucHJvdG90eXBlLmNoZWNrID0gZnVuY3Rpb24oY2FsbGJhY2spIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgbWV0YSA9IHRoaXMuX21ldGE7XG4gIHJldHVybiB0aGlzLnRoZW4oZnVuY3Rpb24ocmVzdWx0cykge1xuICAgIHZhciBpZHMgPSBfLmlzQXJyYXkocmVzdWx0cykgPyBfLm1hcChyZXN1bHRzLCBmdW5jdGlvbihyZXMpeyByZXR1cm4gcmVzLmlkOyB9KSA6IHJlc3VsdHMuaWQ7XG4gICAgc2VsZi5faWRzID0gaWRzO1xuICAgIHJldHVybiBtZXRhLmNoZWNrU3RhdHVzKGlkcyk7XG4gIH0pLnRoZW5DYWxsKGNhbGxiYWNrKTtcbn07XG5cbi8qKlxuICogUG9sbGluZyB1bnRpbCBhc3luYyBjYWxsIHN0YXR1cyBiZWNvbWVzIGNvbXBsZXRlIG9yIGVycm9yXG4gKlxuICogQG1ldGhvZCBNZXRhZGF0YX5Bc3luY1Jlc3VsdExvY2F0b3IjcG9sbFxuICogQHBhcmFtIHtOdW1iZXJ9IGludGVydmFsIC0gUG9sbGluZyBpbnRlcnZhbCBpbiBtaWxsaXNlY29uZHNcbiAqIEBwYXJhbSB7TnVtYmVyfSB0aW1lb3V0IC0gUG9sbGluZyB0aW1lb3V0IGluIG1pbGxpc2Vjb25kc1xuICovXG5Bc3luY1Jlc3VsdExvY2F0b3IucHJvdG90eXBlLnBvbGwgPSBmdW5jdGlvbihpbnRlcnZhbCwgdGltZW91dCkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciBzdGFydFRpbWUgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgdmFyIHBvbGwgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgbm93ID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gICAgaWYgKHN0YXJ0VGltZSArIHRpbWVvdXQgPCBub3cpIHtcbiAgICAgIHZhciBlcnJNc2cgPSBcIlBvbGxpbmcgdGltZSBvdXQuXCI7XG4gICAgICBpZiAoc2VsZi5faWRzKSB7XG4gICAgICAgIGVyck1zZyArPSBcIiBQcm9jZXNzIElkID0gXCIgKyBzZWxmLl9pZHM7XG4gICAgICB9XG4gICAgICBzZWxmLmVtaXQoJ2Vycm9yJywgbmV3IEVycm9yKGVyck1zZykpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBzZWxmLmNoZWNrKCkudGhlbihmdW5jdGlvbihyZXN1bHRzKSB7XG4gICAgICB2YXIgZG9uZSA9IHRydWU7XG4gICAgICB2YXIgcmVzdWx0QXJyID0gXy5pc0FycmF5KHJlc3VsdHMpID8gcmVzdWx0cyA6IFsgcmVzdWx0cyBdO1xuICAgICAgZm9yICh2YXIgaT0wLCBsZW49cmVzdWx0QXJyLmxlbmd0aDsgaTxsZW47IGkrKykge1xuICAgICAgICB2YXIgcmVzdWx0ID0gcmVzdWx0QXJyW2ldO1xuICAgICAgICBpZiAocmVzdWx0ICYmICFyZXN1bHQuZG9uZSkge1xuICAgICAgICAgIHNlbGYuZW1pdCgncHJvZ3Jlc3MnLCByZXN1bHQpO1xuICAgICAgICAgIGRvbmUgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGRvbmUpIHtcbiAgICAgICAgc2VsZi5lbWl0KCdjb21wbGV0ZScsIHJlc3VsdHMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2V0VGltZW91dChwb2xsLCBpbnRlcnZhbCk7XG4gICAgICB9XG4gICAgfSwgZnVuY3Rpb24oZXJyKSB7XG4gICAgICBzZWxmLmVtaXQoJ2Vycm9yJywgZXJyKTtcbiAgICB9KTtcbiAgfTtcbiAgc2V0VGltZW91dChwb2xsLCBpbnRlcnZhbCk7XG59O1xuXG4vKipcbiAqIENoZWNrIGFuZCB3YWl0IHVudGlsIHRoZSBhc3luYyByZXF1ZXN0cyBiZWNvbWUgaW4gY29tcGxldGVkIHN0YXR1c1xuICpcbiAqIEBtZXRob2QgTWV0YWRhdGF+QXN5bmNSZXN1bHRMb2NhdG9yI2NvbXBsZXRlXG4gKiBAcGFyYW0ge0NhbGxiYWNrLjxNZXRhZGF0YX5Bc3luY1Jlc3VsdHxBcnJheS48TWV0YWRhdGF+QXN5bmNSZXN1bHQ+Pn0gW2NhbGxiYWNrXSAtIENhbGxiYWNrIGZ1bmN0aW9uXG4gKiBAcmV0dXJucyB7UHJvbWlzZS48TWV0YWRhdGF+QXN5bmNSZXN1bHR8QXJyYXkuPE1ldGFkYXRhfkFzeW5jUmVzdWx0Pj59XG4gKi9cbkFzeW5jUmVzdWx0TG9jYXRvci5wcm90b3R5cGUuY29tcGxldGUgPSBmdW5jdGlvbihjYWxsYmFjaykge1xuICB2YXIgZGVmZXJyZWQgPSBQcm9taXNlLmRlZmVyKCk7XG4gIHRoaXMub24oJ2NvbXBsZXRlJywgZnVuY3Rpb24ocmVzdWx0cykge1xuICAgIGRlZmVycmVkLnJlc29sdmUocmVzdWx0cyk7XG4gIH0pO1xuICB0aGlzLm9uKCdlcnJvcicsIGZ1bmN0aW9uKGVycikge1xuICAgIGRlZmVycmVkLnJlamVjdChlcnIpO1xuICB9KTtcbiAgdmFyIG1ldGEgPSB0aGlzLl9tZXRhO1xuICB0aGlzLnBvbGwobWV0YS5wb2xsSW50ZXJ2YWwsIG1ldGEucG9sbFRpbWVvdXQpO1xuICByZXR1cm4gZGVmZXJyZWQucHJvbWlzZS50aGVuQ2FsbChjYWxsYmFjayk7XG59O1xuXG4vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cbi8qKlxuICogVGhlIGxvY2F0b3IgY2xhc3MgdG8gdHJhY2sgcmV0cmVpdmUoKSBNZXRhZGF0YSBBUEkgY2FsbCByZXN1bHRcbiAqXG4gKiBAcHJvdGVjdGVkXG4gKiBAY2xhc3MgTWV0YWRhdGF+UmV0cmlldmVSZXN1bHRMb2NhdG9yXG4gKiBAZXh0ZW5kcyBNZXRhZGF0YX5Bc3luY1Jlc3VsdExvY2F0b3JcbiAqIEBwYXJhbSB7TWV0YWRhdGF9IG1ldGEgLSBNZXRhZGF0YSBBUEkgb2JqZWN0XG4gKiBAcGFyYW0ge1Byb21pc2UuPE1ldGFkYXRhfkFzeW5jUmVzdWx0Pn0gcmVzdWx0IC0gUHJvbWlzZSBvYmplY3QgZm9yIGFzeW5jIHJlc3VsdCBvZiByZXRyaWV2ZSBjYWxsKClcbiAqL1xudmFyIFJldHJpZXZlUmVzdWx0TG9jYXRvciA9IGZ1bmN0aW9uKG1ldGEsIHJlc3VsdCkge1xuICBSZXRyaWV2ZVJlc3VsdExvY2F0b3Iuc3VwZXJfLmNhbGwodGhpcywgbWV0YSwgcmVzdWx0KTtcbn07XG5cbmluaGVyaXRzKFJldHJpZXZlUmVzdWx0TG9jYXRvciwgQXN5bmNSZXN1bHRMb2NhdG9yKTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBNZXRhZGF0YX5SZXRyaWV2ZVJlc3VsdFxuICogQHByb3Age0FycmF5LjxNZXRhZGF0YX5GaWxlUHJvcGVydGllcz59IGZpbGVQcm9wZXJ0aWVzIC0gQ29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHByb3BlcnRpZXMgb2YgZWFjaCBjb21wb25lbnQgaW4gdGhlIC56aXAgZmlsZSwgYW5kIHRoZSBtYW5pZmVzdCBmaWxlIHBhY2thZ2UueG1sXG4gKiBAcHJvcCB7U3RyaW5nfSBpZCAtIElEIG9mIHRoZSBjb21wb25lbnQgYmVpbmcgcmV0cmlldmVkXG4gKiBAcHJvcCB7QXJyYXkuPE9iamVjdD59IG1lc3NhZ2VzIC0gQ29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN1Y2Nlc3Mgb3IgZmFpbHVyZSBvZiB0aGUgcmV0cmlldmUoKSBjYWxsXG4gKiBAcHJvcCB7U3RyaW5nfSB6aXBGaWxlIC0gVGhlIHppcCBmaWxlIHJldHVybmVkIGJ5IHRoZSByZXRyaWV2ZSByZXF1ZXN0LiBCYXNlIDY0LWVuY29kZWQgYmluYXJ5IGRhdGFcbiAqL1xuXG4vKipcbiAqIENoZWNrIGFuZCB3YWl0IHVudGlsIHRoZSBhc3luYyByZXF1ZXN0IGJlY29tZXMgaW4gY29tcGxldGVkIHN0YXR1cyxcbiAqIGFuZCByZXRyaWV2ZSB0aGUgcmVzdWx0IGRhdGEuXG4gKlxuICogQG1lbXRob2QgTWV0YWRhdGF+UmV0cmlldmVSZXN1bHRMb2NhdG9yI2NvbXBsZXRlXG4gKiBAcGFyYW0ge0NhbGxiYWNrLjxNZXRhZGF0YX5SZXRyaWV2ZVJlc3VsdD59IFtjYWxsYmFja10gLSBDYWxsYmFjayBmdW5jdGlvblxuICogQHJldHVybnMge1Byb21pc2UuPE1ldGFkYXRhflJldHJpZXZlUmVzdWx0Pn1cbiAqL1xuUmV0cmlldmVSZXN1bHRMb2NhdG9yLnByb3RvdHlwZS5jb21wbGV0ZSA9IGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG4gIHZhciBtZXRhID0gdGhpcy5fbWV0YTtcbiAgcmV0dXJuIFJldHJpZXZlUmVzdWx0TG9jYXRvci5zdXBlcl8ucHJvdG90eXBlLmNvbXBsZXRlLmNhbGwodGhpcykudGhlbihmdW5jdGlvbihyZXN1bHQpIHtcbiAgICByZXR1cm4gbWV0YS5jaGVja1JldHJpZXZlU3RhdHVzKHJlc3VsdC5pZCk7XG4gIH0pLnRoZW5DYWxsKGNhbGxiYWNrKTtcbn07XG5cbi8qKlxuICogQ2hhbmdlIHRoZSByZXRyaWV2ZWQgcmVzdWx0IHRvIE5vZGUuanMgcmVhZGFibGUgc3RyZWFtXG4gKlxuICogQG1ldGhvZCBNZXRhZGF0YX5SZXRyaWV2ZVJlc3VsdExvY2F0b3Ijc3RyZWFtXG4gKiBAcmV0dXJucyB7c3RyZWFtLlJlYWRhYmxlfVxuICovXG5SZXRyaWV2ZVJlc3VsdExvY2F0b3IucHJvdG90eXBlLnN0cmVhbSA9IGZ1bmN0aW9uKCkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciByZXN1bHRTdHJlYW0gPSBuZXcgc3RyZWFtLlJlYWRhYmxlKCk7XG4gIHZhciByZWFkaW5nID0gZmFsc2U7XG4gIHJlc3VsdFN0cmVhbS5fcmVhZCA9IGZ1bmN0aW9uKCkge1xuICAgIGlmIChyZWFkaW5nKSB7IHJldHVybjsgfVxuICAgIHJlYWRpbmcgPSB0cnVlO1xuICAgIHNlbGYuY29tcGxldGUoZnVuY3Rpb24oZXJyLCByZXN1bHQpIHtcbiAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgcmVzdWx0U3RyZWFtLmVtaXQoJ2Vycm9yJywgZXJyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VsdFN0cmVhbS5wdXNoKEJ1ZmZlci5mcm9tKHJlc3VsdC56aXBGaWxlLCAnYmFzZTY0JykpO1xuICAgICAgICByZXN1bHRTdHJlYW0ucHVzaChudWxsKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcbiAgcmV0dXJuIHJlc3VsdFN0cmVhbTtcbn07XG5cbi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuLyoqXG4gKiBUaGUgbG9jYXRvciBjbGFzcyB0byB0cmFjayBkZXBsb3koKSBNZXRhZGF0YSBBUEkgY2FsbCByZXN1bHRcbiAqXG4gKiBAcHJvdGVjdGVkXG4gKiBAY2xhc3MgTWV0YWRhdGF+RGVwbG95UmVzdWx0TG9jYXRvclxuICogQGV4dGVuZHMgTWV0YWRhdGF+QXN5bmNSZXN1bHRMb2NhdG9yXG4gKiBAcGFyYW0ge01ldGFkYXRhfSBtZXRhIC0gTWV0YWRhdGEgQVBJIG9iamVjdFxuICogQHBhcmFtIHtQcm9taXNlLjxNZXRhZGF0YX5Bc3luY1Jlc3VsdD59IHJlc3VsdCAtIFByb21pc2Ugb2JqZWN0IGZvciBhc3luYyByZXN1bHQgb2YgZGVwbG95KCkgY2FsbFxuICovXG52YXIgRGVwbG95UmVzdWx0TG9jYXRvciA9IGZ1bmN0aW9uKG1ldGEsIHJlc3VsdCkge1xuICBEZXBsb3lSZXN1bHRMb2NhdG9yLnN1cGVyXy5jYWxsKHRoaXMsIG1ldGEsIHJlc3VsdCk7XG59O1xuXG5pbmhlcml0cyhEZXBsb3lSZXN1bHRMb2NhdG9yLCBBc3luY1Jlc3VsdExvY2F0b3IpO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IE1ldGFkYXRhfkRlcGxveVJlc3VsdFxuICogQHByb3Age1N0cmluZ30gaWQgLSBJRCBvZiB0aGUgY29tcG9uZW50IGJlaW5nIGRlcGxveWVkXG4gKiBAcHJvcCB7Qm9vbGVhbn0gY2hlY2tPbmx5IC0gSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBkZXBsb3ltZW50IGlzIGJlaW5nIHVzZWQgdG8gY2hlY2sgdGhlIHZhbGlkaXR5IG9mIHRoZSBkZXBsb3llZCBmaWxlcyB3aXRob3V0IG1ha2luZyBhbnkgY2hhbmdlcyBpbiB0aGUgb3JnYW5pemF0aW9uIG9yIG5vdFxuICogQHByb3Age1N0cmluZ30gY29tcGxldGVkRGF0ZSAtIFRpbWVzdGFtcCBmb3Igd2hlbiB0aGUgZGVwbG95bWVudCBwcm9jZXNzIGVuZGVkXG4gKiBAcHJvcCB7U3RyaW5nfSBjcmVhdGVkRGF0ZSAtIFRpbWVzdGFtcCBmb3Igd2hlbiB0aGUgZGVwbG95KCkgY2FsbCB3YXMgcmVjZWl2ZWRcbiAqIEBwcm9wIHtBcnJheS48T2JqZWN0Pn0gW2RldGFpbHNdIC0gUHJvdmlkZXMgdGhlIGRldGFpbHMgb2YgYSBkZXBsb3ltZW50IHRoYXQgaXMgaW4tcHJvZ3Jlc3Mgb3IgZW5kZWQsIGlmIGluY2x1ZGVEZXRhaWxzIGlzIHNldCB0byB0cnVlIGluIGNoZWNrRGVwbG95U3RhdHVzKCkgY2FsbFxuICogQHByb3Age0Jvb2xlYW59IGRvbmUgLSBJbmRpY2F0ZXMgd2hldGhlciB0aGUgc2VydmVyIGZpbmlzaGVkIHByb2Nlc3NpbmcgdGhlIGRlcGxveSgpIGNhbGwgZm9yIHRoZSBzcGVjaWZpZWQgaWRcbiAqIEBwcm9wIHtTdHJpbmd9IFtlcnJvck1lc3NhZ2VdIC0gTWVzc2FnZSBjb3JyZXNwb25kaW5nIHRvIHRoZSB2YWx1ZXMgaW4gdGhlIGVycm9yU3RhdHVzQ29kZSBmaWVsZFxuICogQHByb3Age1N0cmluZ30gW2Vycm9yU3RhdHVzQ29kZV0gLSBJZiBhbiBlcnJvciBvY2N1cnJlZCBkdXJpbmcgdGhlIGRlcGxveSgpIGNhbGwsIGEgc3RhdHVzIGNvZGUgaXMgcmV0dXJuZWQsIGFuZCB0aGUgbWVzc2FnZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBzdGF0dXMgY29kZSBpcyByZXR1cm5lZCBpbiB0aGUgZXJyb3JNZXNzYWdlZmllbGRcbiAqIEBwcm9wIHtCb29sZWFufSBbaWdub3JlV2FybmluZ3NdIC0gU3BlY2lmaWVzIHdoZXRoZXIgYSBkZXBsb3ltZW50IHNob3VsZCBjb250aW51ZSBldmVuIGlmIHRoZSBkZXBsb3ltZW50IGdlbmVyYXRlcyB3YXJuaW5nc1xuICogQHByb3Age1N0cmluZ30gbGFzdE1vZGlmaWVkRGF0ZSAtIFRpbWVzdGFtcCBvZiB0aGUgbGFzdCB1cGRhdGUgZm9yIHRoZSBkZXBsb3ltZW50IHByb2Nlc3NcbiAqIEBwcm9wIHtOdW1iZXJ9IG51bWJlckNvbXBvbmVudEVycm9ycyAtIFRoZSBudW1iZXIgb2YgY29tcG9uZW50cyB0aGF0IGdlbmVyYXRlZCBlcnJvcnMgZHVyaW5nIHRoaXMgZGVwbG95bWVudFxuICogQHByb3Age051bWJlcn0gbnVtYmVyQ29tcG9uZW50c0RlcGxveWVkIC0gVGhlIG51bWJlciBvZiBjb21wb25lbnRzIGRlcGxveWVkIGluIHRoZSBkZXBsb3ltZW50IHByb2Nlc3NcbiAqIEBwcm9wIHtOdW1iZXJ9IG51bWJlckNvbXBvbmVudHNUb3RhbCAtIFRoZSB0b3RhbCBudW1iZXIgb2YgY29tcG9uZW50cyBpbiB0aGUgZGVwbG95bWVudFxuICogQHByb3Age051bWJlcn0gbnVtYmVyVGVzdEVycm9ycyAtIFRoZSBudW1iZXIgb2YgQXBleCB0ZXN0cyB0aGF0IGhhdmUgZ2VuZXJhdGVkIGVycm9ycyBkdXJpbmcgdGhpcyBkZXBsb3ltZW50XG4gKiBAcHJvcCB7TnVtYmVyfSBudW1iZXJUZXN0c0NvbXBsZXRlZCAtIFRoZSBudW1iZXIgb2YgY29tcGxldGVkQXBleCB0ZXN0cyBmb3IgdGhpcyBkZXBsb3ltZW50XG4gKiBAcHJvcCB7TnVtYmVyfSBudW1iZXJUZXN0c1RvdGFsIC0gVGhlIHRvdGFsIG51bWJlciBvZiBBcGV4IHRlc3RzIGZvciB0aGlzIGRlcGxveW1lbnRcbiAqIEBwcm9wIHtCb29sZWFufSBbcm9sbGJhY2tPbkVycm9yXSAtIEluZGljYXRlcyB3aGV0aGVyIGFueSBmYWlsdXJlIGNhdXNlcyBhIGNvbXBsZXRlIHJvbGxiYWNrIG9yIG5vdC4gRGVmYXVsdCBpcyB0cnVlLlxuICogQHByb3Age1N0cmluZ30gc3RhcnREYXRlIC0gVGltZXN0YW1wIGZvciB3aGVuIHRoZSBkZXBsb3ltZW50IHByb2Nlc3MgYmVnYW5cbiAqIEBwcm9wIHtTdHJpbmd9IHN0YXR1cyAtIEluZGljYXRlcyB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgZGVwbG95bWVudFxuICogQHByb3Age0Jvb2xlYW59IHN1Y2Nlc3MgLSBJbmRpY2F0ZXMgd2hldGhlciB0aGUgZGVwbG95bWVudCB3YXMgc3VjY2Vzc2Z1bCBvciBub3RcbiAqL1xuXG4vKipcbiAqIENoZWNrIGFuZCB3YWl0IHVudGlsIHRoZSBhc3luYyByZXF1ZXN0IGJlY29tZXMgaW4gY29tcGxldGVkIHN0YXR1cyxcbiAqIGFuZCByZXRyaWV2ZSB0aGUgcmVzdWx0IGRhdGEuXG4gKlxuICogQG1ldGhvZCBNZXRhZGF0YX5EZXBsb3lSZXN1bHRMb2NhdG9yI2NvbXBsZXRlXG4gKiBAcGFyYW0ge0NhbGxiYWNrLjxNZXRhZGF0YX5EZXBsb3lSZXN1bHQ+fSBbY2FsbGJhY2tdIC0gQ2FsbGJhY2sgZnVuY3Rpb25cbiAqIEByZXR1cm5zIHtQcm9taXNlLjxNZXRhZGF0YX5EZXBsb3lSZXN1bHQ+fVxuICovXG5EZXBsb3lSZXN1bHRMb2NhdG9yLnByb3RvdHlwZS5jb21wbGV0ZSA9IGZ1bmN0aW9uKGluY2x1ZGVEZXRhaWxzLCBjYWxsYmFjaykge1xuICBpZiAoXy5pc0Z1bmN0aW9uKGluY2x1ZGVEZXRhaWxzKSkge1xuICAgIGNhbGxiYWNrID0gaW5jbHVkZURldGFpbHM7XG4gICAgaW5jbHVkZURldGFpbHMgPSBmYWxzZTtcbiAgfVxuICB2YXIgbWV0YSA9IHRoaXMuX21ldGE7XG4gIHJldHVybiBEZXBsb3lSZXN1bHRMb2NhdG9yLnN1cGVyXy5wcm90b3R5cGUuY29tcGxldGUuY2FsbCh0aGlzKS50aGVuKGZ1bmN0aW9uKHJlc3VsdCkge1xuICAgIHJldHVybiBtZXRhLmNoZWNrRGVwbG95U3RhdHVzKHJlc3VsdC5pZCwgaW5jbHVkZURldGFpbHMpO1xuICB9KS50aGVuQ2FsbChjYWxsYmFjayk7XG59O1xuXG5cbi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuLypcbiAqIFJlZ2lzdGVyIGhvb2sgaW4gY29ubmVjdGlvbiBpbnN0YW50aWF0aW9uIGZvciBkeW5hbWljYWxseSBhZGRpbmcgdGhpcyBBUEkgbW9kdWxlIGZlYXR1cmVzXG4gKi9cbmpzZm9yY2Uub24oJ2Nvbm5lY3Rpb246bmV3JywgZnVuY3Rpb24oY29ubikge1xuICBjb25uLm1ldGFkYXRhID0gbmV3IE1ldGFkYXRhKGNvbm4pO1xufSk7XG4iLCIndXNlIHN0cmljdCdcblxuZXhwb3J0cy5ieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aFxuZXhwb3J0cy50b0J5dGVBcnJheSA9IHRvQnl0ZUFycmF5XG5leHBvcnRzLmZyb21CeXRlQXJyYXkgPSBmcm9tQnl0ZUFycmF5XG5cbnZhciBsb29rdXAgPSBbXVxudmFyIHJldkxvb2t1cCA9IFtdXG52YXIgQXJyID0gdHlwZW9mIFVpbnQ4QXJyYXkgIT09ICd1bmRlZmluZWQnID8gVWludDhBcnJheSA6IEFycmF5XG5cbnZhciBjb2RlID0gJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8nXG5mb3IgKHZhciBpID0gMCwgbGVuID0gY29kZS5sZW5ndGg7IGkgPCBsZW47ICsraSkge1xuICBsb29rdXBbaV0gPSBjb2RlW2ldXG4gIHJldkxvb2t1cFtjb2RlLmNoYXJDb2RlQXQoaSldID0gaVxufVxuXG4vLyBTdXBwb3J0IGRlY29kaW5nIFVSTC1zYWZlIGJhc2U2NCBzdHJpbmdzLCBhcyBOb2RlLmpzIGRvZXMuXG4vLyBTZWU6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0Jhc2U2NCNVUkxfYXBwbGljYXRpb25zXG5yZXZMb29rdXBbJy0nLmNoYXJDb2RlQXQoMCldID0gNjJcbnJldkxvb2t1cFsnXycuY2hhckNvZGVBdCgwKV0gPSA2M1xuXG5mdW5jdGlvbiBnZXRMZW5zIChiNjQpIHtcbiAgdmFyIGxlbiA9IGI2NC5sZW5ndGhcblxuICBpZiAobGVuICUgNCA+IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgc3RyaW5nLiBMZW5ndGggbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQnKVxuICB9XG5cbiAgLy8gVHJpbSBvZmYgZXh0cmEgYnl0ZXMgYWZ0ZXIgcGxhY2Vob2xkZXIgYnl0ZXMgYXJlIGZvdW5kXG4gIC8vIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2JlYXRnYW1taXQvYmFzZTY0LWpzL2lzc3Vlcy80MlxuICB2YXIgdmFsaWRMZW4gPSBiNjQuaW5kZXhPZignPScpXG4gIGlmICh2YWxpZExlbiA9PT0gLTEpIHZhbGlkTGVuID0gbGVuXG5cbiAgdmFyIHBsYWNlSG9sZGVyc0xlbiA9IHZhbGlkTGVuID09PSBsZW5cbiAgICA/IDBcbiAgICA6IDQgLSAodmFsaWRMZW4gJSA0KVxuXG4gIHJldHVybiBbdmFsaWRMZW4sIHBsYWNlSG9sZGVyc0xlbl1cbn1cblxuLy8gYmFzZTY0IGlzIDQvMyArIHVwIHRvIHR3byBjaGFyYWN0ZXJzIG9mIHRoZSBvcmlnaW5hbCBkYXRhXG5mdW5jdGlvbiBieXRlTGVuZ3RoIChiNjQpIHtcbiAgdmFyIGxlbnMgPSBnZXRMZW5zKGI2NClcbiAgdmFyIHZhbGlkTGVuID0gbGVuc1swXVxuICB2YXIgcGxhY2VIb2xkZXJzTGVuID0gbGVuc1sxXVxuICByZXR1cm4gKCh2YWxpZExlbiArIHBsYWNlSG9sZGVyc0xlbikgKiAzIC8gNCkgLSBwbGFjZUhvbGRlcnNMZW5cbn1cblxuZnVuY3Rpb24gX2J5dGVMZW5ndGggKGI2NCwgdmFsaWRMZW4sIHBsYWNlSG9sZGVyc0xlbikge1xuICByZXR1cm4gKCh2YWxpZExlbiArIHBsYWNlSG9sZGVyc0xlbikgKiAzIC8gNCkgLSBwbGFjZUhvbGRlcnNMZW5cbn1cblxuZnVuY3Rpb24gdG9CeXRlQXJyYXkgKGI2NCkge1xuICB2YXIgdG1wXG4gIHZhciBsZW5zID0gZ2V0TGVucyhiNjQpXG4gIHZhciB2YWxpZExlbiA9IGxlbnNbMF1cbiAgdmFyIHBsYWNlSG9sZGVyc0xlbiA9IGxlbnNbMV1cblxuICB2YXIgYXJyID0gbmV3IEFycihfYnl0ZUxlbmd0aChiNjQsIHZhbGlkTGVuLCBwbGFjZUhvbGRlcnNMZW4pKVxuXG4gIHZhciBjdXJCeXRlID0gMFxuXG4gIC8vIGlmIHRoZXJlIGFyZSBwbGFjZWhvbGRlcnMsIG9ubHkgZ2V0IHVwIHRvIHRoZSBsYXN0IGNvbXBsZXRlIDQgY2hhcnNcbiAgdmFyIGxlbiA9IHBsYWNlSG9sZGVyc0xlbiA+IDBcbiAgICA/IHZhbGlkTGVuIC0gNFxuICAgIDogdmFsaWRMZW5cblxuICB2YXIgaVxuICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpICs9IDQpIHtcbiAgICB0bXAgPVxuICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpKV0gPDwgMTgpIHxcbiAgICAgIChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDEpXSA8PCAxMikgfFxuICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMildIDw8IDYpIHxcbiAgICAgIHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMyldXG4gICAgYXJyW2N1ckJ5dGUrK10gPSAodG1wID4+IDE2KSAmIDB4RkZcbiAgICBhcnJbY3VyQnl0ZSsrXSA9ICh0bXAgPj4gOCkgJiAweEZGXG4gICAgYXJyW2N1ckJ5dGUrK10gPSB0bXAgJiAweEZGXG4gIH1cblxuICBpZiAocGxhY2VIb2xkZXJzTGVuID09PSAyKSB7XG4gICAgdG1wID1cbiAgICAgIChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSldIDw8IDIpIHxcbiAgICAgIChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDEpXSA+PiA0KVxuICAgIGFycltjdXJCeXRlKytdID0gdG1wICYgMHhGRlxuICB9XG5cbiAgaWYgKHBsYWNlSG9sZGVyc0xlbiA9PT0gMSkge1xuICAgIHRtcCA9XG4gICAgICAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkpXSA8PCAxMCkgfFxuICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMSldIDw8IDQpIHxcbiAgICAgIChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDIpXSA+PiAyKVxuICAgIGFycltjdXJCeXRlKytdID0gKHRtcCA+PiA4KSAmIDB4RkZcbiAgICBhcnJbY3VyQnl0ZSsrXSA9IHRtcCAmIDB4RkZcbiAgfVxuXG4gIHJldHVybiBhcnJcbn1cblxuZnVuY3Rpb24gdHJpcGxldFRvQmFzZTY0IChudW0pIHtcbiAgcmV0dXJuIGxvb2t1cFtudW0gPj4gMTggJiAweDNGXSArXG4gICAgbG9va3VwW251bSA+PiAxMiAmIDB4M0ZdICtcbiAgICBsb29rdXBbbnVtID4+IDYgJiAweDNGXSArXG4gICAgbG9va3VwW251bSAmIDB4M0ZdXG59XG5cbmZ1bmN0aW9uIGVuY29kZUNodW5rICh1aW50OCwgc3RhcnQsIGVuZCkge1xuICB2YXIgdG1wXG4gIHZhciBvdXRwdXQgPSBbXVxuICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkgKz0gMykge1xuICAgIHRtcCA9XG4gICAgICAoKHVpbnQ4W2ldIDw8IDE2KSAmIDB4RkYwMDAwKSArXG4gICAgICAoKHVpbnQ4W2kgKyAxXSA8PCA4KSAmIDB4RkYwMCkgK1xuICAgICAgKHVpbnQ4W2kgKyAyXSAmIDB4RkYpXG4gICAgb3V0cHV0LnB1c2godHJpcGxldFRvQmFzZTY0KHRtcCkpXG4gIH1cbiAgcmV0dXJuIG91dHB1dC5qb2luKCcnKVxufVxuXG5mdW5jdGlvbiBmcm9tQnl0ZUFycmF5ICh1aW50OCkge1xuICB2YXIgdG1wXG4gIHZhciBsZW4gPSB1aW50OC5sZW5ndGhcbiAgdmFyIGV4dHJhQnl0ZXMgPSBsZW4gJSAzIC8vIGlmIHdlIGhhdmUgMSBieXRlIGxlZnQsIHBhZCAyIGJ5dGVzXG4gIHZhciBwYXJ0cyA9IFtdXG4gIHZhciBtYXhDaHVua0xlbmd0aCA9IDE2MzgzIC8vIG11c3QgYmUgbXVsdGlwbGUgb2YgM1xuXG4gIC8vIGdvIHRocm91Z2ggdGhlIGFycmF5IGV2ZXJ5IHRocmVlIGJ5dGVzLCB3ZSdsbCBkZWFsIHdpdGggdHJhaWxpbmcgc3R1ZmYgbGF0ZXJcbiAgZm9yICh2YXIgaSA9IDAsIGxlbjIgPSBsZW4gLSBleHRyYUJ5dGVzOyBpIDwgbGVuMjsgaSArPSBtYXhDaHVua0xlbmd0aCkge1xuICAgIHBhcnRzLnB1c2goZW5jb2RlQ2h1bmsoXG4gICAgICB1aW50OCwgaSwgKGkgKyBtYXhDaHVua0xlbmd0aCkgPiBsZW4yID8gbGVuMiA6IChpICsgbWF4Q2h1bmtMZW5ndGgpXG4gICAgKSlcbiAgfVxuXG4gIC8vIHBhZCB0aGUgZW5kIHdpdGggemVyb3MsIGJ1dCBtYWtlIHN1cmUgdG8gbm90IGZvcmdldCB0aGUgZXh0cmEgYnl0ZXNcbiAgaWYgKGV4dHJhQnl0ZXMgPT09IDEpIHtcbiAgICB0bXAgPSB1aW50OFtsZW4gLSAxXVxuICAgIHBhcnRzLnB1c2goXG4gICAgICBsb29rdXBbdG1wID4+IDJdICtcbiAgICAgIGxvb2t1cFsodG1wIDw8IDQpICYgMHgzRl0gK1xuICAgICAgJz09J1xuICAgIClcbiAgfSBlbHNlIGlmIChleHRyYUJ5dGVzID09PSAyKSB7XG4gICAgdG1wID0gKHVpbnQ4W2xlbiAtIDJdIDw8IDgpICsgdWludDhbbGVuIC0gMV1cbiAgICBwYXJ0cy5wdXNoKFxuICAgICAgbG9va3VwW3RtcCA+PiAxMF0gK1xuICAgICAgbG9va3VwWyh0bXAgPj4gNCkgJiAweDNGXSArXG4gICAgICBsb29rdXBbKHRtcCA8PCAyKSAmIDB4M0ZdICtcbiAgICAgICc9J1xuICAgIClcbiAgfVxuXG4gIHJldHVybiBwYXJ0cy5qb2luKCcnKVxufVxuIiwiLyohXG4gKiBUaGUgYnVmZmVyIG1vZHVsZSBmcm9tIG5vZGUuanMsIGZvciB0aGUgYnJvd3Nlci5cbiAqXG4gKiBAYXV0aG9yICAgRmVyb3NzIEFib3VraGFkaWplaCA8aHR0cHM6Ly9mZXJvc3Mub3JnPlxuICogQGxpY2Vuc2UgIE1JVFxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1wcm90byAqL1xuXG4ndXNlIHN0cmljdCdcblxudmFyIGJhc2U2NCA9IHJlcXVpcmUoJ2Jhc2U2NC1qcycpXG52YXIgaWVlZTc1NCA9IHJlcXVpcmUoJ2llZWU3NTQnKVxuXG5leHBvcnRzLkJ1ZmZlciA9IEJ1ZmZlclxuZXhwb3J0cy5TbG93QnVmZmVyID0gU2xvd0J1ZmZlclxuZXhwb3J0cy5JTlNQRUNUX01BWF9CWVRFUyA9IDUwXG5cbnZhciBLX01BWF9MRU5HVEggPSAweDdmZmZmZmZmXG5leHBvcnRzLmtNYXhMZW5ndGggPSBLX01BWF9MRU5HVEhcblxuLyoqXG4gKiBJZiBgQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlRgOlxuICogICA9PT0gdHJ1ZSAgICBVc2UgVWludDhBcnJheSBpbXBsZW1lbnRhdGlvbiAoZmFzdGVzdClcbiAqICAgPT09IGZhbHNlICAgUHJpbnQgd2FybmluZyBhbmQgcmVjb21tZW5kIHVzaW5nIGBidWZmZXJgIHY0Lnggd2hpY2ggaGFzIGFuIE9iamVjdFxuICogICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiAobW9zdCBjb21wYXRpYmxlLCBldmVuIElFNilcbiAqXG4gKiBCcm93c2VycyB0aGF0IHN1cHBvcnQgdHlwZWQgYXJyYXlzIGFyZSBJRSAxMCssIEZpcmVmb3ggNCssIENocm9tZSA3KywgU2FmYXJpIDUuMSssXG4gKiBPcGVyYSAxMS42KywgaU9TIDQuMisuXG4gKlxuICogV2UgcmVwb3J0IHRoYXQgdGhlIGJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCB0eXBlZCBhcnJheXMgaWYgdGhlIGFyZSBub3Qgc3ViY2xhc3NhYmxlXG4gKiB1c2luZyBfX3Byb3RvX18uIEZpcmVmb3ggNC0yOSBsYWNrcyBzdXBwb3J0IGZvciBhZGRpbmcgbmV3IHByb3BlcnRpZXMgdG8gYFVpbnQ4QXJyYXlgXG4gKiAoU2VlOiBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD02OTU0MzgpLiBJRSAxMCBsYWNrcyBzdXBwb3J0XG4gKiBmb3IgX19wcm90b19fIGFuZCBoYXMgYSBidWdneSB0eXBlZCBhcnJheSBpbXBsZW1lbnRhdGlvbi5cbiAqL1xuQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQgPSB0eXBlZEFycmF5U3VwcG9ydCgpXG5cbmlmICghQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQgJiYgdHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnICYmXG4gICAgdHlwZW9mIGNvbnNvbGUuZXJyb3IgPT09ICdmdW5jdGlvbicpIHtcbiAgY29uc29sZS5lcnJvcihcbiAgICAnVGhpcyBicm93c2VyIGxhY2tzIHR5cGVkIGFycmF5IChVaW50OEFycmF5KSBzdXBwb3J0IHdoaWNoIGlzIHJlcXVpcmVkIGJ5ICcgK1xuICAgICdgYnVmZmVyYCB2NS54LiBVc2UgYGJ1ZmZlcmAgdjQueCBpZiB5b3UgcmVxdWlyZSBvbGQgYnJvd3NlciBzdXBwb3J0LidcbiAgKVxufVxuXG5mdW5jdGlvbiB0eXBlZEFycmF5U3VwcG9ydCAoKSB7XG4gIC8vIENhbiB0eXBlZCBhcnJheSBpbnN0YW5jZXMgY2FuIGJlIGF1Z21lbnRlZD9cbiAgdHJ5IHtcbiAgICB2YXIgYXJyID0gbmV3IFVpbnQ4QXJyYXkoMSlcbiAgICBhcnIuX19wcm90b19fID0geyBfX3Byb3RvX186IFVpbnQ4QXJyYXkucHJvdG90eXBlLCBmb286IGZ1bmN0aW9uICgpIHsgcmV0dXJuIDQyIH0gfVxuICAgIHJldHVybiBhcnIuZm9vKCkgPT09IDQyXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoQnVmZmVyLnByb3RvdHlwZSwgJ3BhcmVudCcsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCFCdWZmZXIuaXNCdWZmZXIodGhpcykpIHJldHVybiB1bmRlZmluZWRcbiAgICByZXR1cm4gdGhpcy5idWZmZXJcbiAgfVxufSlcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KEJ1ZmZlci5wcm90b3R5cGUsICdvZmZzZXQnLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gKCkge1xuICAgIGlmICghQnVmZmVyLmlzQnVmZmVyKHRoaXMpKSByZXR1cm4gdW5kZWZpbmVkXG4gICAgcmV0dXJuIHRoaXMuYnl0ZU9mZnNldFxuICB9XG59KVxuXG5mdW5jdGlvbiBjcmVhdGVCdWZmZXIgKGxlbmd0aCkge1xuICBpZiAobGVuZ3RoID4gS19NQVhfTEVOR1RIKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RoZSB2YWx1ZSBcIicgKyBsZW5ndGggKyAnXCIgaXMgaW52YWxpZCBmb3Igb3B0aW9uIFwic2l6ZVwiJylcbiAgfVxuICAvLyBSZXR1cm4gYW4gYXVnbWVudGVkIGBVaW50OEFycmF5YCBpbnN0YW5jZVxuICB2YXIgYnVmID0gbmV3IFVpbnQ4QXJyYXkobGVuZ3RoKVxuICBidWYuX19wcm90b19fID0gQnVmZmVyLnByb3RvdHlwZVxuICByZXR1cm4gYnVmXG59XG5cbi8qKlxuICogVGhlIEJ1ZmZlciBjb25zdHJ1Y3RvciByZXR1cm5zIGluc3RhbmNlcyBvZiBgVWludDhBcnJheWAgdGhhdCBoYXZlIHRoZWlyXG4gKiBwcm90b3R5cGUgY2hhbmdlZCB0byBgQnVmZmVyLnByb3RvdHlwZWAuIEZ1cnRoZXJtb3JlLCBgQnVmZmVyYCBpcyBhIHN1YmNsYXNzIG9mXG4gKiBgVWludDhBcnJheWAsIHNvIHRoZSByZXR1cm5lZCBpbnN0YW5jZXMgd2lsbCBoYXZlIGFsbCB0aGUgbm9kZSBgQnVmZmVyYCBtZXRob2RzXG4gKiBhbmQgdGhlIGBVaW50OEFycmF5YCBtZXRob2RzLiBTcXVhcmUgYnJhY2tldCBub3RhdGlvbiB3b3JrcyBhcyBleHBlY3RlZCAtLSBpdFxuICogcmV0dXJucyBhIHNpbmdsZSBvY3RldC5cbiAqXG4gKiBUaGUgYFVpbnQ4QXJyYXlgIHByb3RvdHlwZSByZW1haW5zIHVubW9kaWZpZWQuXG4gKi9cblxuZnVuY3Rpb24gQnVmZmVyIChhcmcsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aCkge1xuICAvLyBDb21tb24gY2FzZS5cbiAgaWYgKHR5cGVvZiBhcmcgPT09ICdudW1iZXInKSB7XG4gICAgaWYgKHR5cGVvZiBlbmNvZGluZ09yT2Zmc2V0ID09PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgJ1RoZSBcInN0cmluZ1wiIGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBzdHJpbmcuIFJlY2VpdmVkIHR5cGUgbnVtYmVyJ1xuICAgICAgKVxuICAgIH1cbiAgICByZXR1cm4gYWxsb2NVbnNhZmUoYXJnKVxuICB9XG4gIHJldHVybiBmcm9tKGFyZywgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxufVxuXG4vLyBGaXggc3ViYXJyYXkoKSBpbiBFUzIwMTYuIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2Zlcm9zcy9idWZmZXIvcHVsbC85N1xuaWYgKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC5zcGVjaWVzICE9IG51bGwgJiZcbiAgICBCdWZmZXJbU3ltYm9sLnNwZWNpZXNdID09PSBCdWZmZXIpIHtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEJ1ZmZlciwgU3ltYm9sLnNwZWNpZXMsIHtcbiAgICB2YWx1ZTogbnVsbCxcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgd3JpdGFibGU6IGZhbHNlXG4gIH0pXG59XG5cbkJ1ZmZlci5wb29sU2l6ZSA9IDgxOTIgLy8gbm90IHVzZWQgYnkgdGhpcyBpbXBsZW1lbnRhdGlvblxuXG5mdW5jdGlvbiBmcm9tICh2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGZyb21TdHJpbmcodmFsdWUsIGVuY29kaW5nT3JPZmZzZXQpXG4gIH1cblxuICBpZiAoQXJyYXlCdWZmZXIuaXNWaWV3KHZhbHVlKSkge1xuICAgIHJldHVybiBmcm9tQXJyYXlMaWtlKHZhbHVlKVxuICB9XG5cbiAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICB0aHJvdyBUeXBlRXJyb3IoXG4gICAgICAnVGhlIGZpcnN0IGFyZ3VtZW50IG11c3QgYmUgb25lIG9mIHR5cGUgc3RyaW5nLCBCdWZmZXIsIEFycmF5QnVmZmVyLCBBcnJheSwgJyArXG4gICAgICAnb3IgQXJyYXktbGlrZSBPYmplY3QuIFJlY2VpdmVkIHR5cGUgJyArICh0eXBlb2YgdmFsdWUpXG4gICAgKVxuICB9XG5cbiAgaWYgKGlzSW5zdGFuY2UodmFsdWUsIEFycmF5QnVmZmVyKSB8fFxuICAgICAgKHZhbHVlICYmIGlzSW5zdGFuY2UodmFsdWUuYnVmZmVyLCBBcnJheUJ1ZmZlcikpKSB7XG4gICAgcmV0dXJuIGZyb21BcnJheUJ1ZmZlcih2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxuICB9XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgJ1RoZSBcInZhbHVlXCIgYXJndW1lbnQgbXVzdCBub3QgYmUgb2YgdHlwZSBudW1iZXIuIFJlY2VpdmVkIHR5cGUgbnVtYmVyJ1xuICAgIClcbiAgfVxuXG4gIHZhciB2YWx1ZU9mID0gdmFsdWUudmFsdWVPZiAmJiB2YWx1ZS52YWx1ZU9mKClcbiAgaWYgKHZhbHVlT2YgIT0gbnVsbCAmJiB2YWx1ZU9mICE9PSB2YWx1ZSkge1xuICAgIHJldHVybiBCdWZmZXIuZnJvbSh2YWx1ZU9mLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpXG4gIH1cblxuICB2YXIgYiA9IGZyb21PYmplY3QodmFsdWUpXG4gIGlmIChiKSByZXR1cm4gYlxuXG4gIGlmICh0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9QcmltaXRpdmUgIT0gbnVsbCAmJlxuICAgICAgdHlwZW9mIHZhbHVlW1N5bWJvbC50b1ByaW1pdGl2ZV0gPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gQnVmZmVyLmZyb20oXG4gICAgICB2YWx1ZVtTeW1ib2wudG9QcmltaXRpdmVdKCdzdHJpbmcnKSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoXG4gICAgKVxuICB9XG5cbiAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAnVGhlIGZpcnN0IGFyZ3VtZW50IG11c3QgYmUgb25lIG9mIHR5cGUgc3RyaW5nLCBCdWZmZXIsIEFycmF5QnVmZmVyLCBBcnJheSwgJyArXG4gICAgJ29yIEFycmF5LWxpa2UgT2JqZWN0LiBSZWNlaXZlZCB0eXBlICcgKyAodHlwZW9mIHZhbHVlKVxuICApXG59XG5cbi8qKlxuICogRnVuY3Rpb25hbGx5IGVxdWl2YWxlbnQgdG8gQnVmZmVyKGFyZywgZW5jb2RpbmcpIGJ1dCB0aHJvd3MgYSBUeXBlRXJyb3JcbiAqIGlmIHZhbHVlIGlzIGEgbnVtYmVyLlxuICogQnVmZmVyLmZyb20oc3RyWywgZW5jb2RpbmddKVxuICogQnVmZmVyLmZyb20oYXJyYXkpXG4gKiBCdWZmZXIuZnJvbShidWZmZXIpXG4gKiBCdWZmZXIuZnJvbShhcnJheUJ1ZmZlclssIGJ5dGVPZmZzZXRbLCBsZW5ndGhdXSlcbiAqKi9cbkJ1ZmZlci5mcm9tID0gZnVuY3Rpb24gKHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGZyb20odmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbn1cblxuLy8gTm90ZTogQ2hhbmdlIHByb3RvdHlwZSAqYWZ0ZXIqIEJ1ZmZlci5mcm9tIGlzIGRlZmluZWQgdG8gd29ya2Fyb3VuZCBDaHJvbWUgYnVnOlxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2Zlcm9zcy9idWZmZXIvcHVsbC8xNDhcbkJ1ZmZlci5wcm90b3R5cGUuX19wcm90b19fID0gVWludDhBcnJheS5wcm90b3R5cGVcbkJ1ZmZlci5fX3Byb3RvX18gPSBVaW50OEFycmF5XG5cbmZ1bmN0aW9uIGFzc2VydFNpemUgKHNpemUpIHtcbiAgaWYgKHR5cGVvZiBzaXplICE9PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wic2l6ZVwiIGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBudW1iZXInKVxuICB9IGVsc2UgaWYgKHNpemUgPCAwKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RoZSB2YWx1ZSBcIicgKyBzaXplICsgJ1wiIGlzIGludmFsaWQgZm9yIG9wdGlvbiBcInNpemVcIicpXG4gIH1cbn1cblxuZnVuY3Rpb24gYWxsb2MgKHNpemUsIGZpbGwsIGVuY29kaW5nKSB7XG4gIGFzc2VydFNpemUoc2l6ZSlcbiAgaWYgKHNpemUgPD0gMCkge1xuICAgIHJldHVybiBjcmVhdGVCdWZmZXIoc2l6ZSlcbiAgfVxuICBpZiAoZmlsbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgLy8gT25seSBwYXkgYXR0ZW50aW9uIHRvIGVuY29kaW5nIGlmIGl0J3MgYSBzdHJpbmcuIFRoaXNcbiAgICAvLyBwcmV2ZW50cyBhY2NpZGVudGFsbHkgc2VuZGluZyBpbiBhIG51bWJlciB0aGF0IHdvdWxkXG4gICAgLy8gYmUgaW50ZXJwcmV0dGVkIGFzIGEgc3RhcnQgb2Zmc2V0LlxuICAgIHJldHVybiB0eXBlb2YgZW5jb2RpbmcgPT09ICdzdHJpbmcnXG4gICAgICA/IGNyZWF0ZUJ1ZmZlcihzaXplKS5maWxsKGZpbGwsIGVuY29kaW5nKVxuICAgICAgOiBjcmVhdGVCdWZmZXIoc2l6ZSkuZmlsbChmaWxsKVxuICB9XG4gIHJldHVybiBjcmVhdGVCdWZmZXIoc2l6ZSlcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IGZpbGxlZCBCdWZmZXIgaW5zdGFuY2UuXG4gKiBhbGxvYyhzaXplWywgZmlsbFssIGVuY29kaW5nXV0pXG4gKiovXG5CdWZmZXIuYWxsb2MgPSBmdW5jdGlvbiAoc2l6ZSwgZmlsbCwgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIGFsbG9jKHNpemUsIGZpbGwsIGVuY29kaW5nKVxufVxuXG5mdW5jdGlvbiBhbGxvY1Vuc2FmZSAoc2l6ZSkge1xuICBhc3NlcnRTaXplKHNpemUpXG4gIHJldHVybiBjcmVhdGVCdWZmZXIoc2l6ZSA8IDAgPyAwIDogY2hlY2tlZChzaXplKSB8IDApXG59XG5cbi8qKlxuICogRXF1aXZhbGVudCB0byBCdWZmZXIobnVtKSwgYnkgZGVmYXVsdCBjcmVhdGVzIGEgbm9uLXplcm8tZmlsbGVkIEJ1ZmZlciBpbnN0YW5jZS5cbiAqICovXG5CdWZmZXIuYWxsb2NVbnNhZmUgPSBmdW5jdGlvbiAoc2l6ZSkge1xuICByZXR1cm4gYWxsb2NVbnNhZmUoc2l6ZSlcbn1cbi8qKlxuICogRXF1aXZhbGVudCB0byBTbG93QnVmZmVyKG51bSksIGJ5IGRlZmF1bHQgY3JlYXRlcyBhIG5vbi16ZXJvLWZpbGxlZCBCdWZmZXIgaW5zdGFuY2UuXG4gKi9cbkJ1ZmZlci5hbGxvY1Vuc2FmZVNsb3cgPSBmdW5jdGlvbiAoc2l6ZSkge1xuICByZXR1cm4gYWxsb2NVbnNhZmUoc2l6ZSlcbn1cblxuZnVuY3Rpb24gZnJvbVN0cmluZyAoc3RyaW5nLCBlbmNvZGluZykge1xuICBpZiAodHlwZW9mIGVuY29kaW5nICE9PSAnc3RyaW5nJyB8fCBlbmNvZGluZyA9PT0gJycpIHtcbiAgICBlbmNvZGluZyA9ICd1dGY4J1xuICB9XG5cbiAgaWYgKCFCdWZmZXIuaXNFbmNvZGluZyhlbmNvZGluZykpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdVbmtub3duIGVuY29kaW5nOiAnICsgZW5jb2RpbmcpXG4gIH1cblxuICB2YXIgbGVuZ3RoID0gYnl0ZUxlbmd0aChzdHJpbmcsIGVuY29kaW5nKSB8IDBcbiAgdmFyIGJ1ZiA9IGNyZWF0ZUJ1ZmZlcihsZW5ndGgpXG5cbiAgdmFyIGFjdHVhbCA9IGJ1Zi53cml0ZShzdHJpbmcsIGVuY29kaW5nKVxuXG4gIGlmIChhY3R1YWwgIT09IGxlbmd0aCkge1xuICAgIC8vIFdyaXRpbmcgYSBoZXggc3RyaW5nLCBmb3IgZXhhbXBsZSwgdGhhdCBjb250YWlucyBpbnZhbGlkIGNoYXJhY3RlcnMgd2lsbFxuICAgIC8vIGNhdXNlIGV2ZXJ5dGhpbmcgYWZ0ZXIgdGhlIGZpcnN0IGludmFsaWQgY2hhcmFjdGVyIHRvIGJlIGlnbm9yZWQuIChlLmcuXG4gICAgLy8gJ2FieHhjZCcgd2lsbCBiZSB0cmVhdGVkIGFzICdhYicpXG4gICAgYnVmID0gYnVmLnNsaWNlKDAsIGFjdHVhbClcbiAgfVxuXG4gIHJldHVybiBidWZcbn1cblxuZnVuY3Rpb24gZnJvbUFycmF5TGlrZSAoYXJyYXkpIHtcbiAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCA8IDAgPyAwIDogY2hlY2tlZChhcnJheS5sZW5ndGgpIHwgMFxuICB2YXIgYnVmID0gY3JlYXRlQnVmZmVyKGxlbmd0aClcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKz0gMSkge1xuICAgIGJ1ZltpXSA9IGFycmF5W2ldICYgMjU1XG4gIH1cbiAgcmV0dXJuIGJ1ZlxufVxuXG5mdW5jdGlvbiBmcm9tQXJyYXlCdWZmZXIgKGFycmF5LCBieXRlT2Zmc2V0LCBsZW5ndGgpIHtcbiAgaWYgKGJ5dGVPZmZzZXQgPCAwIHx8IGFycmF5LmJ5dGVMZW5ndGggPCBieXRlT2Zmc2V0KSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1wib2Zmc2V0XCIgaXMgb3V0c2lkZSBvZiBidWZmZXIgYm91bmRzJylcbiAgfVxuXG4gIGlmIChhcnJheS5ieXRlTGVuZ3RoIDwgYnl0ZU9mZnNldCArIChsZW5ndGggfHwgMCkpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignXCJsZW5ndGhcIiBpcyBvdXRzaWRlIG9mIGJ1ZmZlciBib3VuZHMnKVxuICB9XG5cbiAgdmFyIGJ1ZlxuICBpZiAoYnl0ZU9mZnNldCA9PT0gdW5kZWZpbmVkICYmIGxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgYnVmID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXkpXG4gIH0gZWxzZSBpZiAobGVuZ3RoID09PSB1bmRlZmluZWQpIHtcbiAgICBidWYgPSBuZXcgVWludDhBcnJheShhcnJheSwgYnl0ZU9mZnNldClcbiAgfSBlbHNlIHtcbiAgICBidWYgPSBuZXcgVWludDhBcnJheShhcnJheSwgYnl0ZU9mZnNldCwgbGVuZ3RoKVxuICB9XG5cbiAgLy8gUmV0dXJuIGFuIGF1Z21lbnRlZCBgVWludDhBcnJheWAgaW5zdGFuY2VcbiAgYnVmLl9fcHJvdG9fXyA9IEJ1ZmZlci5wcm90b3R5cGVcbiAgcmV0dXJuIGJ1ZlxufVxuXG5mdW5jdGlvbiBmcm9tT2JqZWN0IChvYmopIHtcbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihvYmopKSB7XG4gICAgdmFyIGxlbiA9IGNoZWNrZWQob2JqLmxlbmd0aCkgfCAwXG4gICAgdmFyIGJ1ZiA9IGNyZWF0ZUJ1ZmZlcihsZW4pXG5cbiAgICBpZiAoYnVmLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIGJ1ZlxuICAgIH1cblxuICAgIG9iai5jb3B5KGJ1ZiwgMCwgMCwgbGVuKVxuICAgIHJldHVybiBidWZcbiAgfVxuXG4gIGlmIChvYmoubGVuZ3RoICE9PSB1bmRlZmluZWQpIHtcbiAgICBpZiAodHlwZW9mIG9iai5sZW5ndGggIT09ICdudW1iZXInIHx8IG51bWJlcklzTmFOKG9iai5sZW5ndGgpKSB7XG4gICAgICByZXR1cm4gY3JlYXRlQnVmZmVyKDApXG4gICAgfVxuICAgIHJldHVybiBmcm9tQXJyYXlMaWtlKG9iailcbiAgfVxuXG4gIGlmIChvYmoudHlwZSA9PT0gJ0J1ZmZlcicgJiYgQXJyYXkuaXNBcnJheShvYmouZGF0YSkpIHtcbiAgICByZXR1cm4gZnJvbUFycmF5TGlrZShvYmouZGF0YSlcbiAgfVxufVxuXG5mdW5jdGlvbiBjaGVja2VkIChsZW5ndGgpIHtcbiAgLy8gTm90ZTogY2Fubm90IHVzZSBgbGVuZ3RoIDwgS19NQVhfTEVOR1RIYCBoZXJlIGJlY2F1c2UgdGhhdCBmYWlscyB3aGVuXG4gIC8vIGxlbmd0aCBpcyBOYU4gKHdoaWNoIGlzIG90aGVyd2lzZSBjb2VyY2VkIHRvIHplcm8uKVxuICBpZiAobGVuZ3RoID49IEtfTUFYX0xFTkdUSCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdBdHRlbXB0IHRvIGFsbG9jYXRlIEJ1ZmZlciBsYXJnZXIgdGhhbiBtYXhpbXVtICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICdzaXplOiAweCcgKyBLX01BWF9MRU5HVEgudG9TdHJpbmcoMTYpICsgJyBieXRlcycpXG4gIH1cbiAgcmV0dXJuIGxlbmd0aCB8IDBcbn1cblxuZnVuY3Rpb24gU2xvd0J1ZmZlciAobGVuZ3RoKSB7XG4gIGlmICgrbGVuZ3RoICE9IGxlbmd0aCkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGVxZXFlcVxuICAgIGxlbmd0aCA9IDBcbiAgfVxuICByZXR1cm4gQnVmZmVyLmFsbG9jKCtsZW5ndGgpXG59XG5cbkJ1ZmZlci5pc0J1ZmZlciA9IGZ1bmN0aW9uIGlzQnVmZmVyIChiKSB7XG4gIHJldHVybiBiICE9IG51bGwgJiYgYi5faXNCdWZmZXIgPT09IHRydWUgJiZcbiAgICBiICE9PSBCdWZmZXIucHJvdG90eXBlIC8vIHNvIEJ1ZmZlci5pc0J1ZmZlcihCdWZmZXIucHJvdG90eXBlKSB3aWxsIGJlIGZhbHNlXG59XG5cbkJ1ZmZlci5jb21wYXJlID0gZnVuY3Rpb24gY29tcGFyZSAoYSwgYikge1xuICBpZiAoaXNJbnN0YW5jZShhLCBVaW50OEFycmF5KSkgYSA9IEJ1ZmZlci5mcm9tKGEsIGEub2Zmc2V0LCBhLmJ5dGVMZW5ndGgpXG4gIGlmIChpc0luc3RhbmNlKGIsIFVpbnQ4QXJyYXkpKSBiID0gQnVmZmVyLmZyb20oYiwgYi5vZmZzZXQsIGIuYnl0ZUxlbmd0aClcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoYSkgfHwgIUJ1ZmZlci5pc0J1ZmZlcihiKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAnVGhlIFwiYnVmMVwiLCBcImJ1ZjJcIiBhcmd1bWVudHMgbXVzdCBiZSBvbmUgb2YgdHlwZSBCdWZmZXIgb3IgVWludDhBcnJheSdcbiAgICApXG4gIH1cblxuICBpZiAoYSA9PT0gYikgcmV0dXJuIDBcblxuICB2YXIgeCA9IGEubGVuZ3RoXG4gIHZhciB5ID0gYi5sZW5ndGhcblxuICBmb3IgKHZhciBpID0gMCwgbGVuID0gTWF0aC5taW4oeCwgeSk7IGkgPCBsZW47ICsraSkge1xuICAgIGlmIChhW2ldICE9PSBiW2ldKSB7XG4gICAgICB4ID0gYVtpXVxuICAgICAgeSA9IGJbaV1cbiAgICAgIGJyZWFrXG4gICAgfVxuICB9XG5cbiAgaWYgKHggPCB5KSByZXR1cm4gLTFcbiAgaWYgKHkgPCB4KSByZXR1cm4gMVxuICByZXR1cm4gMFxufVxuXG5CdWZmZXIuaXNFbmNvZGluZyA9IGZ1bmN0aW9uIGlzRW5jb2RpbmcgKGVuY29kaW5nKSB7XG4gIHN3aXRjaCAoU3RyaW5nKGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgY2FzZSAnaGV4JzpcbiAgICBjYXNlICd1dGY4JzpcbiAgICBjYXNlICd1dGYtOCc6XG4gICAgY2FzZSAnYXNjaWknOlxuICAgIGNhc2UgJ2xhdGluMSc6XG4gICAgY2FzZSAnYmluYXJ5JzpcbiAgICBjYXNlICdiYXNlNjQnOlxuICAgIGNhc2UgJ3VjczInOlxuICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICBjYXNlICd1dGYxNmxlJzpcbiAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuXG5CdWZmZXIuY29uY2F0ID0gZnVuY3Rpb24gY29uY2F0IChsaXN0LCBsZW5ndGgpIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KGxpc3QpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJsaXN0XCIgYXJndW1lbnQgbXVzdCBiZSBhbiBBcnJheSBvZiBCdWZmZXJzJylcbiAgfVxuXG4gIGlmIChsaXN0Lmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBCdWZmZXIuYWxsb2MoMClcbiAgfVxuXG4gIHZhciBpXG4gIGlmIChsZW5ndGggPT09IHVuZGVmaW5lZCkge1xuICAgIGxlbmd0aCA9IDBcbiAgICBmb3IgKGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7ICsraSkge1xuICAgICAgbGVuZ3RoICs9IGxpc3RbaV0ubGVuZ3RoXG4gICAgfVxuICB9XG5cbiAgdmFyIGJ1ZmZlciA9IEJ1ZmZlci5hbGxvY1Vuc2FmZShsZW5ndGgpXG4gIHZhciBwb3MgPSAwXG4gIGZvciAoaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgKytpKSB7XG4gICAgdmFyIGJ1ZiA9IGxpc3RbaV1cbiAgICBpZiAoaXNJbnN0YW5jZShidWYsIFVpbnQ4QXJyYXkpKSB7XG4gICAgICBidWYgPSBCdWZmZXIuZnJvbShidWYpXG4gICAgfVxuICAgIGlmICghQnVmZmVyLmlzQnVmZmVyKGJ1ZikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wibGlzdFwiIGFyZ3VtZW50IG11c3QgYmUgYW4gQXJyYXkgb2YgQnVmZmVycycpXG4gICAgfVxuICAgIGJ1Zi5jb3B5KGJ1ZmZlciwgcG9zKVxuICAgIHBvcyArPSBidWYubGVuZ3RoXG4gIH1cbiAgcmV0dXJuIGJ1ZmZlclxufVxuXG5mdW5jdGlvbiBieXRlTGVuZ3RoIChzdHJpbmcsIGVuY29kaW5nKSB7XG4gIGlmIChCdWZmZXIuaXNCdWZmZXIoc3RyaW5nKSkge1xuICAgIHJldHVybiBzdHJpbmcubGVuZ3RoXG4gIH1cbiAgaWYgKEFycmF5QnVmZmVyLmlzVmlldyhzdHJpbmcpIHx8IGlzSW5zdGFuY2Uoc3RyaW5nLCBBcnJheUJ1ZmZlcikpIHtcbiAgICByZXR1cm4gc3RyaW5nLmJ5dGVMZW5ndGhcbiAgfVxuICBpZiAodHlwZW9mIHN0cmluZyAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgJ1RoZSBcInN0cmluZ1wiIGFyZ3VtZW50IG11c3QgYmUgb25lIG9mIHR5cGUgc3RyaW5nLCBCdWZmZXIsIG9yIEFycmF5QnVmZmVyLiAnICtcbiAgICAgICdSZWNlaXZlZCB0eXBlICcgKyB0eXBlb2Ygc3RyaW5nXG4gICAgKVxuICB9XG5cbiAgdmFyIGxlbiA9IHN0cmluZy5sZW5ndGhcbiAgdmFyIG11c3RNYXRjaCA9IChhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gPT09IHRydWUpXG4gIGlmICghbXVzdE1hdGNoICYmIGxlbiA9PT0gMCkgcmV0dXJuIDBcblxuICAvLyBVc2UgYSBmb3IgbG9vcCB0byBhdm9pZCByZWN1cnNpb25cbiAgdmFyIGxvd2VyZWRDYXNlID0gZmFsc2VcbiAgZm9yICg7Oykge1xuICAgIHN3aXRjaCAoZW5jb2RpbmcpIHtcbiAgICAgIGNhc2UgJ2FzY2lpJzpcbiAgICAgIGNhc2UgJ2xhdGluMSc6XG4gICAgICBjYXNlICdiaW5hcnknOlxuICAgICAgICByZXR1cm4gbGVuXG4gICAgICBjYXNlICd1dGY4JzpcbiAgICAgIGNhc2UgJ3V0Zi04JzpcbiAgICAgICAgcmV0dXJuIHV0ZjhUb0J5dGVzKHN0cmluZykubGVuZ3RoXG4gICAgICBjYXNlICd1Y3MyJzpcbiAgICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgICByZXR1cm4gbGVuICogMlxuICAgICAgY2FzZSAnaGV4JzpcbiAgICAgICAgcmV0dXJuIGxlbiA+Pj4gMVxuICAgICAgY2FzZSAnYmFzZTY0JzpcbiAgICAgICAgcmV0dXJuIGJhc2U2NFRvQnl0ZXMoc3RyaW5nKS5sZW5ndGhcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChsb3dlcmVkQ2FzZSkge1xuICAgICAgICAgIHJldHVybiBtdXN0TWF0Y2ggPyAtMSA6IHV0ZjhUb0J5dGVzKHN0cmluZykubGVuZ3RoIC8vIGFzc3VtZSB1dGY4XG4gICAgICAgIH1cbiAgICAgICAgZW5jb2RpbmcgPSAoJycgKyBlbmNvZGluZykudG9Mb3dlckNhc2UoKVxuICAgICAgICBsb3dlcmVkQ2FzZSA9IHRydWVcbiAgICB9XG4gIH1cbn1cbkJ1ZmZlci5ieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aFxuXG5mdW5jdGlvbiBzbG93VG9TdHJpbmcgKGVuY29kaW5nLCBzdGFydCwgZW5kKSB7XG4gIHZhciBsb3dlcmVkQ2FzZSA9IGZhbHNlXG5cbiAgLy8gTm8gbmVlZCB0byB2ZXJpZnkgdGhhdCBcInRoaXMubGVuZ3RoIDw9IE1BWF9VSU5UMzJcIiBzaW5jZSBpdCdzIGEgcmVhZC1vbmx5XG4gIC8vIHByb3BlcnR5IG9mIGEgdHlwZWQgYXJyYXkuXG5cbiAgLy8gVGhpcyBiZWhhdmVzIG5laXRoZXIgbGlrZSBTdHJpbmcgbm9yIFVpbnQ4QXJyYXkgaW4gdGhhdCB3ZSBzZXQgc3RhcnQvZW5kXG4gIC8vIHRvIHRoZWlyIHVwcGVyL2xvd2VyIGJvdW5kcyBpZiB0aGUgdmFsdWUgcGFzc2VkIGlzIG91dCBvZiByYW5nZS5cbiAgLy8gdW5kZWZpbmVkIGlzIGhhbmRsZWQgc3BlY2lhbGx5IGFzIHBlciBFQ01BLTI2MiA2dGggRWRpdGlvbixcbiAgLy8gU2VjdGlvbiAxMy4zLjMuNyBSdW50aW1lIFNlbWFudGljczogS2V5ZWRCaW5kaW5nSW5pdGlhbGl6YXRpb24uXG4gIGlmIChzdGFydCA9PT0gdW5kZWZpbmVkIHx8IHN0YXJ0IDwgMCkge1xuICAgIHN0YXJ0ID0gMFxuICB9XG4gIC8vIFJldHVybiBlYXJseSBpZiBzdGFydCA+IHRoaXMubGVuZ3RoLiBEb25lIGhlcmUgdG8gcHJldmVudCBwb3RlbnRpYWwgdWludDMyXG4gIC8vIGNvZXJjaW9uIGZhaWwgYmVsb3cuXG4gIGlmIChzdGFydCA+IHRoaXMubGVuZ3RoKSB7XG4gICAgcmV0dXJuICcnXG4gIH1cblxuICBpZiAoZW5kID09PSB1bmRlZmluZWQgfHwgZW5kID4gdGhpcy5sZW5ndGgpIHtcbiAgICBlbmQgPSB0aGlzLmxlbmd0aFxuICB9XG5cbiAgaWYgKGVuZCA8PSAwKSB7XG4gICAgcmV0dXJuICcnXG4gIH1cblxuICAvLyBGb3JjZSBjb2Vyc2lvbiB0byB1aW50MzIuIFRoaXMgd2lsbCBhbHNvIGNvZXJjZSBmYWxzZXkvTmFOIHZhbHVlcyB0byAwLlxuICBlbmQgPj4+PSAwXG4gIHN0YXJ0ID4+Pj0gMFxuXG4gIGlmIChlbmQgPD0gc3RhcnQpIHtcbiAgICByZXR1cm4gJydcbiAgfVxuXG4gIGlmICghZW5jb2RpbmcpIGVuY29kaW5nID0gJ3V0ZjgnXG5cbiAgd2hpbGUgKHRydWUpIHtcbiAgICBzd2l0Y2ggKGVuY29kaW5nKSB7XG4gICAgICBjYXNlICdoZXgnOlxuICAgICAgICByZXR1cm4gaGV4U2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAndXRmOCc6XG4gICAgICBjYXNlICd1dGYtOCc6XG4gICAgICAgIHJldHVybiB1dGY4U2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAnYXNjaWknOlxuICAgICAgICByZXR1cm4gYXNjaWlTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICdsYXRpbjEnOlxuICAgICAgY2FzZSAnYmluYXJ5JzpcbiAgICAgICAgcmV0dXJuIGxhdGluMVNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgICAgIHJldHVybiBiYXNlNjRTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICd1Y3MyJzpcbiAgICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgICByZXR1cm4gdXRmMTZsZVNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChsb3dlcmVkQ2FzZSkgdGhyb3cgbmV3IFR5cGVFcnJvcignVW5rbm93biBlbmNvZGluZzogJyArIGVuY29kaW5nKVxuICAgICAgICBlbmNvZGluZyA9IChlbmNvZGluZyArICcnKS50b0xvd2VyQ2FzZSgpXG4gICAgICAgIGxvd2VyZWRDYXNlID0gdHJ1ZVxuICAgIH1cbiAgfVxufVxuXG4vLyBUaGlzIHByb3BlcnR5IGlzIHVzZWQgYnkgYEJ1ZmZlci5pc0J1ZmZlcmAgKGFuZCB0aGUgYGlzLWJ1ZmZlcmAgbnBtIHBhY2thZ2UpXG4vLyB0byBkZXRlY3QgYSBCdWZmZXIgaW5zdGFuY2UuIEl0J3Mgbm90IHBvc3NpYmxlIHRvIHVzZSBgaW5zdGFuY2VvZiBCdWZmZXJgXG4vLyByZWxpYWJseSBpbiBhIGJyb3dzZXJpZnkgY29udGV4dCBiZWNhdXNlIHRoZXJlIGNvdWxkIGJlIG11bHRpcGxlIGRpZmZlcmVudFxuLy8gY29waWVzIG9mIHRoZSAnYnVmZmVyJyBwYWNrYWdlIGluIHVzZS4gVGhpcyBtZXRob2Qgd29ya3MgZXZlbiBmb3IgQnVmZmVyXG4vLyBpbnN0YW5jZXMgdGhhdCB3ZXJlIGNyZWF0ZWQgZnJvbSBhbm90aGVyIGNvcHkgb2YgdGhlIGBidWZmZXJgIHBhY2thZ2UuXG4vLyBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9mZXJvc3MvYnVmZmVyL2lzc3Vlcy8xNTRcbkJ1ZmZlci5wcm90b3R5cGUuX2lzQnVmZmVyID0gdHJ1ZVxuXG5mdW5jdGlvbiBzd2FwIChiLCBuLCBtKSB7XG4gIHZhciBpID0gYltuXVxuICBiW25dID0gYlttXVxuICBiW21dID0gaVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnN3YXAxNiA9IGZ1bmN0aW9uIHN3YXAxNiAoKSB7XG4gIHZhciBsZW4gPSB0aGlzLmxlbmd0aFxuICBpZiAobGVuICUgMiAhPT0gMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYtYml0cycpXG4gIH1cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkgKz0gMikge1xuICAgIHN3YXAodGhpcywgaSwgaSArIDEpXG4gIH1cbiAgcmV0dXJuIHRoaXNcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5zd2FwMzIgPSBmdW5jdGlvbiBzd2FwMzIgKCkge1xuICB2YXIgbGVuID0gdGhpcy5sZW5ndGhcbiAgaWYgKGxlbiAlIDQgIT09IDApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDMyLWJpdHMnKVxuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpICs9IDQpIHtcbiAgICBzd2FwKHRoaXMsIGksIGkgKyAzKVxuICAgIHN3YXAodGhpcywgaSArIDEsIGkgKyAyKVxuICB9XG4gIHJldHVybiB0aGlzXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuc3dhcDY0ID0gZnVuY3Rpb24gc3dhcDY0ICgpIHtcbiAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoXG4gIGlmIChsZW4gJSA4ICE9PSAwKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0J1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA2NC1iaXRzJylcbiAgfVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSArPSA4KSB7XG4gICAgc3dhcCh0aGlzLCBpLCBpICsgNylcbiAgICBzd2FwKHRoaXMsIGkgKyAxLCBpICsgNilcbiAgICBzd2FwKHRoaXMsIGkgKyAyLCBpICsgNSlcbiAgICBzd2FwKHRoaXMsIGkgKyAzLCBpICsgNClcbiAgfVxuICByZXR1cm4gdGhpc1xufVxuXG5CdWZmZXIucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcgKCkge1xuICB2YXIgbGVuZ3RoID0gdGhpcy5sZW5ndGhcbiAgaWYgKGxlbmd0aCA9PT0gMCkgcmV0dXJuICcnXG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSByZXR1cm4gdXRmOFNsaWNlKHRoaXMsIDAsIGxlbmd0aClcbiAgcmV0dXJuIHNsb3dUb1N0cmluZy5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUudG9Mb2NhbGVTdHJpbmcgPSBCdWZmZXIucHJvdG90eXBlLnRvU3RyaW5nXG5cbkJ1ZmZlci5wcm90b3R5cGUuZXF1YWxzID0gZnVuY3Rpb24gZXF1YWxzIChiKSB7XG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKGIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyJylcbiAgaWYgKHRoaXMgPT09IGIpIHJldHVybiB0cnVlXG4gIHJldHVybiBCdWZmZXIuY29tcGFyZSh0aGlzLCBiKSA9PT0gMFxufVxuXG5CdWZmZXIucHJvdG90eXBlLmluc3BlY3QgPSBmdW5jdGlvbiBpbnNwZWN0ICgpIHtcbiAgdmFyIHN0ciA9ICcnXG4gIHZhciBtYXggPSBleHBvcnRzLklOU1BFQ1RfTUFYX0JZVEVTXG4gIHN0ciA9IHRoaXMudG9TdHJpbmcoJ2hleCcsIDAsIG1heCkucmVwbGFjZSgvKC57Mn0pL2csICckMSAnKS50cmltKClcbiAgaWYgKHRoaXMubGVuZ3RoID4gbWF4KSBzdHIgKz0gJyAuLi4gJ1xuICByZXR1cm4gJzxCdWZmZXIgJyArIHN0ciArICc+J1xufVxuXG5CdWZmZXIucHJvdG90eXBlLmNvbXBhcmUgPSBmdW5jdGlvbiBjb21wYXJlICh0YXJnZXQsIHN0YXJ0LCBlbmQsIHRoaXNTdGFydCwgdGhpc0VuZCkge1xuICBpZiAoaXNJbnN0YW5jZSh0YXJnZXQsIFVpbnQ4QXJyYXkpKSB7XG4gICAgdGFyZ2V0ID0gQnVmZmVyLmZyb20odGFyZ2V0LCB0YXJnZXQub2Zmc2V0LCB0YXJnZXQuYnl0ZUxlbmd0aClcbiAgfVxuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcih0YXJnZXQpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICdUaGUgXCJ0YXJnZXRcIiBhcmd1bWVudCBtdXN0IGJlIG9uZSBvZiB0eXBlIEJ1ZmZlciBvciBVaW50OEFycmF5LiAnICtcbiAgICAgICdSZWNlaXZlZCB0eXBlICcgKyAodHlwZW9mIHRhcmdldClcbiAgICApXG4gIH1cblxuICBpZiAoc3RhcnQgPT09IHVuZGVmaW5lZCkge1xuICAgIHN0YXJ0ID0gMFxuICB9XG4gIGlmIChlbmQgPT09IHVuZGVmaW5lZCkge1xuICAgIGVuZCA9IHRhcmdldCA/IHRhcmdldC5sZW5ndGggOiAwXG4gIH1cbiAgaWYgKHRoaXNTdGFydCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhpc1N0YXJ0ID0gMFxuICB9XG4gIGlmICh0aGlzRW5kID09PSB1bmRlZmluZWQpIHtcbiAgICB0aGlzRW5kID0gdGhpcy5sZW5ndGhcbiAgfVxuXG4gIGlmIChzdGFydCA8IDAgfHwgZW5kID4gdGFyZ2V0Lmxlbmd0aCB8fCB0aGlzU3RhcnQgPCAwIHx8IHRoaXNFbmQgPiB0aGlzLmxlbmd0aCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdvdXQgb2YgcmFuZ2UgaW5kZXgnKVxuICB9XG5cbiAgaWYgKHRoaXNTdGFydCA+PSB0aGlzRW5kICYmIHN0YXJ0ID49IGVuZCkge1xuICAgIHJldHVybiAwXG4gIH1cbiAgaWYgKHRoaXNTdGFydCA+PSB0aGlzRW5kKSB7XG4gICAgcmV0dXJuIC0xXG4gIH1cbiAgaWYgKHN0YXJ0ID49IGVuZCkge1xuICAgIHJldHVybiAxXG4gIH1cblxuICBzdGFydCA+Pj49IDBcbiAgZW5kID4+Pj0gMFxuICB0aGlzU3RhcnQgPj4+PSAwXG4gIHRoaXNFbmQgPj4+PSAwXG5cbiAgaWYgKHRoaXMgPT09IHRhcmdldCkgcmV0dXJuIDBcblxuICB2YXIgeCA9IHRoaXNFbmQgLSB0aGlzU3RhcnRcbiAgdmFyIHkgPSBlbmQgLSBzdGFydFxuICB2YXIgbGVuID0gTWF0aC5taW4oeCwgeSlcblxuICB2YXIgdGhpc0NvcHkgPSB0aGlzLnNsaWNlKHRoaXNTdGFydCwgdGhpc0VuZClcbiAgdmFyIHRhcmdldENvcHkgPSB0YXJnZXQuc2xpY2Uoc3RhcnQsIGVuZClcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgKytpKSB7XG4gICAgaWYgKHRoaXNDb3B5W2ldICE9PSB0YXJnZXRDb3B5W2ldKSB7XG4gICAgICB4ID0gdGhpc0NvcHlbaV1cbiAgICAgIHkgPSB0YXJnZXRDb3B5W2ldXG4gICAgICBicmVha1xuICAgIH1cbiAgfVxuXG4gIGlmICh4IDwgeSkgcmV0dXJuIC0xXG4gIGlmICh5IDwgeCkgcmV0dXJuIDFcbiAgcmV0dXJuIDBcbn1cblxuLy8gRmluZHMgZWl0aGVyIHRoZSBmaXJzdCBpbmRleCBvZiBgdmFsYCBpbiBgYnVmZmVyYCBhdCBvZmZzZXQgPj0gYGJ5dGVPZmZzZXRgLFxuLy8gT1IgdGhlIGxhc3QgaW5kZXggb2YgYHZhbGAgaW4gYGJ1ZmZlcmAgYXQgb2Zmc2V0IDw9IGBieXRlT2Zmc2V0YC5cbi8vXG4vLyBBcmd1bWVudHM6XG4vLyAtIGJ1ZmZlciAtIGEgQnVmZmVyIHRvIHNlYXJjaFxuLy8gLSB2YWwgLSBhIHN0cmluZywgQnVmZmVyLCBvciBudW1iZXJcbi8vIC0gYnl0ZU9mZnNldCAtIGFuIGluZGV4IGludG8gYGJ1ZmZlcmA7IHdpbGwgYmUgY2xhbXBlZCB0byBhbiBpbnQzMlxuLy8gLSBlbmNvZGluZyAtIGFuIG9wdGlvbmFsIGVuY29kaW5nLCByZWxldmFudCBpcyB2YWwgaXMgYSBzdHJpbmdcbi8vIC0gZGlyIC0gdHJ1ZSBmb3IgaW5kZXhPZiwgZmFsc2UgZm9yIGxhc3RJbmRleE9mXG5mdW5jdGlvbiBiaWRpcmVjdGlvbmFsSW5kZXhPZiAoYnVmZmVyLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBkaXIpIHtcbiAgLy8gRW1wdHkgYnVmZmVyIG1lYW5zIG5vIG1hdGNoXG4gIGlmIChidWZmZXIubGVuZ3RoID09PSAwKSByZXR1cm4gLTFcblxuICAvLyBOb3JtYWxpemUgYnl0ZU9mZnNldFxuICBpZiAodHlwZW9mIGJ5dGVPZmZzZXQgPT09ICdzdHJpbmcnKSB7XG4gICAgZW5jb2RpbmcgPSBieXRlT2Zmc2V0XG4gICAgYnl0ZU9mZnNldCA9IDBcbiAgfSBlbHNlIGlmIChieXRlT2Zmc2V0ID4gMHg3ZmZmZmZmZikge1xuICAgIGJ5dGVPZmZzZXQgPSAweDdmZmZmZmZmXG4gIH0gZWxzZSBpZiAoYnl0ZU9mZnNldCA8IC0weDgwMDAwMDAwKSB7XG4gICAgYnl0ZU9mZnNldCA9IC0weDgwMDAwMDAwXG4gIH1cbiAgYnl0ZU9mZnNldCA9ICtieXRlT2Zmc2V0IC8vIENvZXJjZSB0byBOdW1iZXIuXG4gIGlmIChudW1iZXJJc05hTihieXRlT2Zmc2V0KSkge1xuICAgIC8vIGJ5dGVPZmZzZXQ6IGl0IGl0J3MgdW5kZWZpbmVkLCBudWxsLCBOYU4sIFwiZm9vXCIsIGV0Yywgc2VhcmNoIHdob2xlIGJ1ZmZlclxuICAgIGJ5dGVPZmZzZXQgPSBkaXIgPyAwIDogKGJ1ZmZlci5sZW5ndGggLSAxKVxuICB9XG5cbiAgLy8gTm9ybWFsaXplIGJ5dGVPZmZzZXQ6IG5lZ2F0aXZlIG9mZnNldHMgc3RhcnQgZnJvbSB0aGUgZW5kIG9mIHRoZSBidWZmZXJcbiAgaWYgKGJ5dGVPZmZzZXQgPCAwKSBieXRlT2Zmc2V0ID0gYnVmZmVyLmxlbmd0aCArIGJ5dGVPZmZzZXRcbiAgaWYgKGJ5dGVPZmZzZXQgPj0gYnVmZmVyLmxlbmd0aCkge1xuICAgIGlmIChkaXIpIHJldHVybiAtMVxuICAgIGVsc2UgYnl0ZU9mZnNldCA9IGJ1ZmZlci5sZW5ndGggLSAxXG4gIH0gZWxzZSBpZiAoYnl0ZU9mZnNldCA8IDApIHtcbiAgICBpZiAoZGlyKSBieXRlT2Zmc2V0ID0gMFxuICAgIGVsc2UgcmV0dXJuIC0xXG4gIH1cblxuICAvLyBOb3JtYWxpemUgdmFsXG4gIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykge1xuICAgIHZhbCA9IEJ1ZmZlci5mcm9tKHZhbCwgZW5jb2RpbmcpXG4gIH1cblxuICAvLyBGaW5hbGx5LCBzZWFyY2ggZWl0aGVyIGluZGV4T2YgKGlmIGRpciBpcyB0cnVlKSBvciBsYXN0SW5kZXhPZlxuICBpZiAoQnVmZmVyLmlzQnVmZmVyKHZhbCkpIHtcbiAgICAvLyBTcGVjaWFsIGNhc2U6IGxvb2tpbmcgZm9yIGVtcHR5IHN0cmluZy9idWZmZXIgYWx3YXlzIGZhaWxzXG4gICAgaWYgKHZhbC5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiAtMVxuICAgIH1cbiAgICByZXR1cm4gYXJyYXlJbmRleE9mKGJ1ZmZlciwgdmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgZGlyKVxuICB9IGVsc2UgaWYgKHR5cGVvZiB2YWwgPT09ICdudW1iZXInKSB7XG4gICAgdmFsID0gdmFsICYgMHhGRiAvLyBTZWFyY2ggZm9yIGEgYnl0ZSB2YWx1ZSBbMC0yNTVdXG4gICAgaWYgKHR5cGVvZiBVaW50OEFycmF5LnByb3RvdHlwZS5pbmRleE9mID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpZiAoZGlyKSB7XG4gICAgICAgIHJldHVybiBVaW50OEFycmF5LnByb3RvdHlwZS5pbmRleE9mLmNhbGwoYnVmZmVyLCB2YWwsIGJ5dGVPZmZzZXQpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gVWludDhBcnJheS5wcm90b3R5cGUubGFzdEluZGV4T2YuY2FsbChidWZmZXIsIHZhbCwgYnl0ZU9mZnNldClcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGFycmF5SW5kZXhPZihidWZmZXIsIFsgdmFsIF0sIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBkaXIpXG4gIH1cblxuICB0aHJvdyBuZXcgVHlwZUVycm9yKCd2YWwgbXVzdCBiZSBzdHJpbmcsIG51bWJlciBvciBCdWZmZXInKVxufVxuXG5mdW5jdGlvbiBhcnJheUluZGV4T2YgKGFyciwgdmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgZGlyKSB7XG4gIHZhciBpbmRleFNpemUgPSAxXG4gIHZhciBhcnJMZW5ndGggPSBhcnIubGVuZ3RoXG4gIHZhciB2YWxMZW5ndGggPSB2YWwubGVuZ3RoXG5cbiAgaWYgKGVuY29kaW5nICE9PSB1bmRlZmluZWQpIHtcbiAgICBlbmNvZGluZyA9IFN0cmluZyhlbmNvZGluZykudG9Mb3dlckNhc2UoKVxuICAgIGlmIChlbmNvZGluZyA9PT0gJ3VjczInIHx8IGVuY29kaW5nID09PSAndWNzLTInIHx8XG4gICAgICAgIGVuY29kaW5nID09PSAndXRmMTZsZScgfHwgZW5jb2RpbmcgPT09ICd1dGYtMTZsZScpIHtcbiAgICAgIGlmIChhcnIubGVuZ3RoIDwgMiB8fCB2YWwubGVuZ3RoIDwgMikge1xuICAgICAgICByZXR1cm4gLTFcbiAgICAgIH1cbiAgICAgIGluZGV4U2l6ZSA9IDJcbiAgICAgIGFyckxlbmd0aCAvPSAyXG4gICAgICB2YWxMZW5ndGggLz0gMlxuICAgICAgYnl0ZU9mZnNldCAvPSAyXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcmVhZCAoYnVmLCBpKSB7XG4gICAgaWYgKGluZGV4U2l6ZSA9PT0gMSkge1xuICAgICAgcmV0dXJuIGJ1ZltpXVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gYnVmLnJlYWRVSW50MTZCRShpICogaW5kZXhTaXplKVxuICAgIH1cbiAgfVxuXG4gIHZhciBpXG4gIGlmIChkaXIpIHtcbiAgICB2YXIgZm91bmRJbmRleCA9IC0xXG4gICAgZm9yIChpID0gYnl0ZU9mZnNldDsgaSA8IGFyckxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAocmVhZChhcnIsIGkpID09PSByZWFkKHZhbCwgZm91bmRJbmRleCA9PT0gLTEgPyAwIDogaSAtIGZvdW5kSW5kZXgpKSB7XG4gICAgICAgIGlmIChmb3VuZEluZGV4ID09PSAtMSkgZm91bmRJbmRleCA9IGlcbiAgICAgICAgaWYgKGkgLSBmb3VuZEluZGV4ICsgMSA9PT0gdmFsTGVuZ3RoKSByZXR1cm4gZm91bmRJbmRleCAqIGluZGV4U2l6ZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGZvdW5kSW5kZXggIT09IC0xKSBpIC09IGkgLSBmb3VuZEluZGV4XG4gICAgICAgIGZvdW5kSW5kZXggPSAtMVxuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAoYnl0ZU9mZnNldCArIHZhbExlbmd0aCA+IGFyckxlbmd0aCkgYnl0ZU9mZnNldCA9IGFyckxlbmd0aCAtIHZhbExlbmd0aFxuICAgIGZvciAoaSA9IGJ5dGVPZmZzZXQ7IGkgPj0gMDsgaS0tKSB7XG4gICAgICB2YXIgZm91bmQgPSB0cnVlXG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHZhbExlbmd0aDsgaisrKSB7XG4gICAgICAgIGlmIChyZWFkKGFyciwgaSArIGopICE9PSByZWFkKHZhbCwgaikpIHtcbiAgICAgICAgICBmb3VuZCA9IGZhbHNlXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGZvdW5kKSByZXR1cm4gaVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiAtMVxufVxuXG5CdWZmZXIucHJvdG90eXBlLmluY2x1ZGVzID0gZnVuY3Rpb24gaW5jbHVkZXMgKHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIHRoaXMuaW5kZXhPZih2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nKSAhPT0gLTFcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5pbmRleE9mID0gZnVuY3Rpb24gaW5kZXhPZiAodmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZykge1xuICByZXR1cm4gYmlkaXJlY3Rpb25hbEluZGV4T2YodGhpcywgdmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgdHJ1ZSlcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5sYXN0SW5kZXhPZiA9IGZ1bmN0aW9uIGxhc3RJbmRleE9mICh2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nKSB7XG4gIHJldHVybiBiaWRpcmVjdGlvbmFsSW5kZXhPZih0aGlzLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBmYWxzZSlcbn1cblxuZnVuY3Rpb24gaGV4V3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICBvZmZzZXQgPSBOdW1iZXIob2Zmc2V0KSB8fCAwXG4gIHZhciByZW1haW5pbmcgPSBidWYubGVuZ3RoIC0gb2Zmc2V0XG4gIGlmICghbGVuZ3RoKSB7XG4gICAgbGVuZ3RoID0gcmVtYWluaW5nXG4gIH0gZWxzZSB7XG4gICAgbGVuZ3RoID0gTnVtYmVyKGxlbmd0aClcbiAgICBpZiAobGVuZ3RoID4gcmVtYWluaW5nKSB7XG4gICAgICBsZW5ndGggPSByZW1haW5pbmdcbiAgICB9XG4gIH1cblxuICB2YXIgc3RyTGVuID0gc3RyaW5nLmxlbmd0aFxuXG4gIGlmIChsZW5ndGggPiBzdHJMZW4gLyAyKSB7XG4gICAgbGVuZ3RoID0gc3RyTGVuIC8gMlxuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHtcbiAgICB2YXIgcGFyc2VkID0gcGFyc2VJbnQoc3RyaW5nLnN1YnN0cihpICogMiwgMiksIDE2KVxuICAgIGlmIChudW1iZXJJc05hTihwYXJzZWQpKSByZXR1cm4gaVxuICAgIGJ1ZltvZmZzZXQgKyBpXSA9IHBhcnNlZFxuICB9XG4gIHJldHVybiBpXG59XG5cbmZ1bmN0aW9uIHV0ZjhXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBibGl0QnVmZmVyKHV0ZjhUb0J5dGVzKHN0cmluZywgYnVmLmxlbmd0aCAtIG9mZnNldCksIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbmZ1bmN0aW9uIGFzY2lpV3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYmxpdEJ1ZmZlcihhc2NpaVRvQnl0ZXMoc3RyaW5nKSwgYnVmLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuZnVuY3Rpb24gbGF0aW4xV3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYXNjaWlXcml0ZShidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbmZ1bmN0aW9uIGJhc2U2NFdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGJsaXRCdWZmZXIoYmFzZTY0VG9CeXRlcyhzdHJpbmcpLCBidWYsIG9mZnNldCwgbGVuZ3RoKVxufVxuXG5mdW5jdGlvbiB1Y3MyV3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYmxpdEJ1ZmZlcih1dGYxNmxlVG9CeXRlcyhzdHJpbmcsIGJ1Zi5sZW5ndGggLSBvZmZzZXQpLCBidWYsIG9mZnNldCwgbGVuZ3RoKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24gd3JpdGUgKHN0cmluZywgb2Zmc2V0LCBsZW5ndGgsIGVuY29kaW5nKSB7XG4gIC8vIEJ1ZmZlciN3cml0ZShzdHJpbmcpXG4gIGlmIChvZmZzZXQgPT09IHVuZGVmaW5lZCkge1xuICAgIGVuY29kaW5nID0gJ3V0ZjgnXG4gICAgbGVuZ3RoID0gdGhpcy5sZW5ndGhcbiAgICBvZmZzZXQgPSAwXG4gIC8vIEJ1ZmZlciN3cml0ZShzdHJpbmcsIGVuY29kaW5nKVxuICB9IGVsc2UgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkICYmIHR5cGVvZiBvZmZzZXQgPT09ICdzdHJpbmcnKSB7XG4gICAgZW5jb2RpbmcgPSBvZmZzZXRcbiAgICBsZW5ndGggPSB0aGlzLmxlbmd0aFxuICAgIG9mZnNldCA9IDBcbiAgLy8gQnVmZmVyI3dyaXRlKHN0cmluZywgb2Zmc2V0WywgbGVuZ3RoXVssIGVuY29kaW5nXSlcbiAgfSBlbHNlIGlmIChpc0Zpbml0ZShvZmZzZXQpKSB7XG4gICAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gICAgaWYgKGlzRmluaXRlKGxlbmd0aCkpIHtcbiAgICAgIGxlbmd0aCA9IGxlbmd0aCA+Pj4gMFxuICAgICAgaWYgKGVuY29kaW5nID09PSB1bmRlZmluZWQpIGVuY29kaW5nID0gJ3V0ZjgnXG4gICAgfSBlbHNlIHtcbiAgICAgIGVuY29kaW5nID0gbGVuZ3RoXG4gICAgICBsZW5ndGggPSB1bmRlZmluZWRcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgJ0J1ZmZlci53cml0ZShzdHJpbmcsIGVuY29kaW5nLCBvZmZzZXRbLCBsZW5ndGhdKSBpcyBubyBsb25nZXIgc3VwcG9ydGVkJ1xuICAgIClcbiAgfVxuXG4gIHZhciByZW1haW5pbmcgPSB0aGlzLmxlbmd0aCAtIG9mZnNldFxuICBpZiAobGVuZ3RoID09PSB1bmRlZmluZWQgfHwgbGVuZ3RoID4gcmVtYWluaW5nKSBsZW5ndGggPSByZW1haW5pbmdcblxuICBpZiAoKHN0cmluZy5sZW5ndGggPiAwICYmIChsZW5ndGggPCAwIHx8IG9mZnNldCA8IDApKSB8fCBvZmZzZXQgPiB0aGlzLmxlbmd0aCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdBdHRlbXB0IHRvIHdyaXRlIG91dHNpZGUgYnVmZmVyIGJvdW5kcycpXG4gIH1cblxuICBpZiAoIWVuY29kaW5nKSBlbmNvZGluZyA9ICd1dGY4J1xuXG4gIHZhciBsb3dlcmVkQ2FzZSA9IGZhbHNlXG4gIGZvciAoOzspIHtcbiAgICBzd2l0Y2ggKGVuY29kaW5nKSB7XG4gICAgICBjYXNlICdoZXgnOlxuICAgICAgICByZXR1cm4gaGV4V3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAndXRmOCc6XG4gICAgICBjYXNlICd1dGYtOCc6XG4gICAgICAgIHJldHVybiB1dGY4V3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAnYXNjaWknOlxuICAgICAgICByZXR1cm4gYXNjaWlXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICdsYXRpbjEnOlxuICAgICAgY2FzZSAnYmluYXJ5JzpcbiAgICAgICAgcmV0dXJuIGxhdGluMVdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgICAgIC8vIFdhcm5pbmc6IG1heExlbmd0aCBub3QgdGFrZW4gaW50byBhY2NvdW50IGluIGJhc2U2NFdyaXRlXG4gICAgICAgIHJldHVybiBiYXNlNjRXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICd1Y3MyJzpcbiAgICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgICByZXR1cm4gdWNzMldyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChsb3dlcmVkQ2FzZSkgdGhyb3cgbmV3IFR5cGVFcnJvcignVW5rbm93biBlbmNvZGluZzogJyArIGVuY29kaW5nKVxuICAgICAgICBlbmNvZGluZyA9ICgnJyArIGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpXG4gICAgICAgIGxvd2VyZWRDYXNlID0gdHJ1ZVxuICAgIH1cbiAgfVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uIHRvSlNPTiAoKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogJ0J1ZmZlcicsXG4gICAgZGF0YTogQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodGhpcy5fYXJyIHx8IHRoaXMsIDApXG4gIH1cbn1cblxuZnVuY3Rpb24gYmFzZTY0U2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICBpZiAoc3RhcnQgPT09IDAgJiYgZW5kID09PSBidWYubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGJhc2U2NC5mcm9tQnl0ZUFycmF5KGJ1ZilcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gYmFzZTY0LmZyb21CeXRlQXJyYXkoYnVmLnNsaWNlKHN0YXJ0LCBlbmQpKVxuICB9XG59XG5cbmZ1bmN0aW9uIHV0ZjhTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIGVuZCA9IE1hdGgubWluKGJ1Zi5sZW5ndGgsIGVuZClcbiAgdmFyIHJlcyA9IFtdXG5cbiAgdmFyIGkgPSBzdGFydFxuICB3aGlsZSAoaSA8IGVuZCkge1xuICAgIHZhciBmaXJzdEJ5dGUgPSBidWZbaV1cbiAgICB2YXIgY29kZVBvaW50ID0gbnVsbFxuICAgIHZhciBieXRlc1BlclNlcXVlbmNlID0gKGZpcnN0Qnl0ZSA+IDB4RUYpID8gNFxuICAgICAgOiAoZmlyc3RCeXRlID4gMHhERikgPyAzXG4gICAgICAgIDogKGZpcnN0Qnl0ZSA+IDB4QkYpID8gMlxuICAgICAgICAgIDogMVxuXG4gICAgaWYgKGkgKyBieXRlc1BlclNlcXVlbmNlIDw9IGVuZCkge1xuICAgICAgdmFyIHNlY29uZEJ5dGUsIHRoaXJkQnl0ZSwgZm91cnRoQnl0ZSwgdGVtcENvZGVQb2ludFxuXG4gICAgICBzd2l0Y2ggKGJ5dGVzUGVyU2VxdWVuY2UpIHtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIGlmIChmaXJzdEJ5dGUgPCAweDgwKSB7XG4gICAgICAgICAgICBjb2RlUG9pbnQgPSBmaXJzdEJ5dGVcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgIHNlY29uZEJ5dGUgPSBidWZbaSArIDFdXG4gICAgICAgICAgaWYgKChzZWNvbmRCeXRlICYgMHhDMCkgPT09IDB4ODApIHtcbiAgICAgICAgICAgIHRlbXBDb2RlUG9pbnQgPSAoZmlyc3RCeXRlICYgMHgxRikgPDwgMHg2IHwgKHNlY29uZEJ5dGUgJiAweDNGKVxuICAgICAgICAgICAgaWYgKHRlbXBDb2RlUG9pbnQgPiAweDdGKSB7XG4gICAgICAgICAgICAgIGNvZGVQb2ludCA9IHRlbXBDb2RlUG9pbnRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAzOlxuICAgICAgICAgIHNlY29uZEJ5dGUgPSBidWZbaSArIDFdXG4gICAgICAgICAgdGhpcmRCeXRlID0gYnVmW2kgKyAyXVxuICAgICAgICAgIGlmICgoc2Vjb25kQnl0ZSAmIDB4QzApID09PSAweDgwICYmICh0aGlyZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCkge1xuICAgICAgICAgICAgdGVtcENvZGVQb2ludCA9IChmaXJzdEJ5dGUgJiAweEYpIDw8IDB4QyB8IChzZWNvbmRCeXRlICYgMHgzRikgPDwgMHg2IHwgKHRoaXJkQnl0ZSAmIDB4M0YpXG4gICAgICAgICAgICBpZiAodGVtcENvZGVQb2ludCA+IDB4N0ZGICYmICh0ZW1wQ29kZVBvaW50IDwgMHhEODAwIHx8IHRlbXBDb2RlUG9pbnQgPiAweERGRkYpKSB7XG4gICAgICAgICAgICAgIGNvZGVQb2ludCA9IHRlbXBDb2RlUG9pbnRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSA0OlxuICAgICAgICAgIHNlY29uZEJ5dGUgPSBidWZbaSArIDFdXG4gICAgICAgICAgdGhpcmRCeXRlID0gYnVmW2kgKyAyXVxuICAgICAgICAgIGZvdXJ0aEJ5dGUgPSBidWZbaSArIDNdXG4gICAgICAgICAgaWYgKChzZWNvbmRCeXRlICYgMHhDMCkgPT09IDB4ODAgJiYgKHRoaXJkQnl0ZSAmIDB4QzApID09PSAweDgwICYmIChmb3VydGhCeXRlICYgMHhDMCkgPT09IDB4ODApIHtcbiAgICAgICAgICAgIHRlbXBDb2RlUG9pbnQgPSAoZmlyc3RCeXRlICYgMHhGKSA8PCAweDEyIHwgKHNlY29uZEJ5dGUgJiAweDNGKSA8PCAweEMgfCAodGhpcmRCeXRlICYgMHgzRikgPDwgMHg2IHwgKGZvdXJ0aEJ5dGUgJiAweDNGKVxuICAgICAgICAgICAgaWYgKHRlbXBDb2RlUG9pbnQgPiAweEZGRkYgJiYgdGVtcENvZGVQb2ludCA8IDB4MTEwMDAwKSB7XG4gICAgICAgICAgICAgIGNvZGVQb2ludCA9IHRlbXBDb2RlUG9pbnRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNvZGVQb2ludCA9PT0gbnVsbCkge1xuICAgICAgLy8gd2UgZGlkIG5vdCBnZW5lcmF0ZSBhIHZhbGlkIGNvZGVQb2ludCBzbyBpbnNlcnQgYVxuICAgICAgLy8gcmVwbGFjZW1lbnQgY2hhciAoVStGRkZEKSBhbmQgYWR2YW5jZSBvbmx5IDEgYnl0ZVxuICAgICAgY29kZVBvaW50ID0gMHhGRkZEXG4gICAgICBieXRlc1BlclNlcXVlbmNlID0gMVxuICAgIH0gZWxzZSBpZiAoY29kZVBvaW50ID4gMHhGRkZGKSB7XG4gICAgICAvLyBlbmNvZGUgdG8gdXRmMTYgKHN1cnJvZ2F0ZSBwYWlyIGRhbmNlKVxuICAgICAgY29kZVBvaW50IC09IDB4MTAwMDBcbiAgICAgIHJlcy5wdXNoKGNvZGVQb2ludCA+Pj4gMTAgJiAweDNGRiB8IDB4RDgwMClcbiAgICAgIGNvZGVQb2ludCA9IDB4REMwMCB8IGNvZGVQb2ludCAmIDB4M0ZGXG4gICAgfVxuXG4gICAgcmVzLnB1c2goY29kZVBvaW50KVxuICAgIGkgKz0gYnl0ZXNQZXJTZXF1ZW5jZVxuICB9XG5cbiAgcmV0dXJuIGRlY29kZUNvZGVQb2ludHNBcnJheShyZXMpXG59XG5cbi8vIEJhc2VkIG9uIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzIyNzQ3MjcyLzY4MDc0MiwgdGhlIGJyb3dzZXIgd2l0aFxuLy8gdGhlIGxvd2VzdCBsaW1pdCBpcyBDaHJvbWUsIHdpdGggMHgxMDAwMCBhcmdzLlxuLy8gV2UgZ28gMSBtYWduaXR1ZGUgbGVzcywgZm9yIHNhZmV0eVxudmFyIE1BWF9BUkdVTUVOVFNfTEVOR1RIID0gMHgxMDAwXG5cbmZ1bmN0aW9uIGRlY29kZUNvZGVQb2ludHNBcnJheSAoY29kZVBvaW50cykge1xuICB2YXIgbGVuID0gY29kZVBvaW50cy5sZW5ndGhcbiAgaWYgKGxlbiA8PSBNQVhfQVJHVU1FTlRTX0xFTkdUSCkge1xuICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZywgY29kZVBvaW50cykgLy8gYXZvaWQgZXh0cmEgc2xpY2UoKVxuICB9XG5cbiAgLy8gRGVjb2RlIGluIGNodW5rcyB0byBhdm9pZCBcImNhbGwgc3RhY2sgc2l6ZSBleGNlZWRlZFwiLlxuICB2YXIgcmVzID0gJydcbiAgdmFyIGkgPSAwXG4gIHdoaWxlIChpIDwgbGVuKSB7XG4gICAgcmVzICs9IFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoXG4gICAgICBTdHJpbmcsXG4gICAgICBjb2RlUG9pbnRzLnNsaWNlKGksIGkgKz0gTUFYX0FSR1VNRU5UU19MRU5HVEgpXG4gICAgKVxuICB9XG4gIHJldHVybiByZXNcbn1cblxuZnVuY3Rpb24gYXNjaWlTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIHZhciByZXQgPSAnJ1xuICBlbmQgPSBNYXRoLm1pbihidWYubGVuZ3RoLCBlbmQpXG5cbiAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyArK2kpIHtcbiAgICByZXQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShidWZbaV0gJiAweDdGKVxuICB9XG4gIHJldHVybiByZXRcbn1cblxuZnVuY3Rpb24gbGF0aW4xU2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICB2YXIgcmV0ID0gJydcbiAgZW5kID0gTWF0aC5taW4oYnVmLmxlbmd0aCwgZW5kKVxuXG4gIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgKytpKSB7XG4gICAgcmV0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnVmW2ldKVxuICB9XG4gIHJldHVybiByZXRcbn1cblxuZnVuY3Rpb24gaGV4U2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICB2YXIgbGVuID0gYnVmLmxlbmd0aFxuXG4gIGlmICghc3RhcnQgfHwgc3RhcnQgPCAwKSBzdGFydCA9IDBcbiAgaWYgKCFlbmQgfHwgZW5kIDwgMCB8fCBlbmQgPiBsZW4pIGVuZCA9IGxlblxuXG4gIHZhciBvdXQgPSAnJ1xuICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSkge1xuICAgIG91dCArPSB0b0hleChidWZbaV0pXG4gIH1cbiAgcmV0dXJuIG91dFxufVxuXG5mdW5jdGlvbiB1dGYxNmxlU2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICB2YXIgYnl0ZXMgPSBidWYuc2xpY2Uoc3RhcnQsIGVuZClcbiAgdmFyIHJlcyA9ICcnXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYnl0ZXMubGVuZ3RoOyBpICs9IDIpIHtcbiAgICByZXMgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShieXRlc1tpXSArIChieXRlc1tpICsgMV0gKiAyNTYpKVxuICB9XG4gIHJldHVybiByZXNcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5zbGljZSA9IGZ1bmN0aW9uIHNsaWNlIChzdGFydCwgZW5kKSB7XG4gIHZhciBsZW4gPSB0aGlzLmxlbmd0aFxuICBzdGFydCA9IH5+c3RhcnRcbiAgZW5kID0gZW5kID09PSB1bmRlZmluZWQgPyBsZW4gOiB+fmVuZFxuXG4gIGlmIChzdGFydCA8IDApIHtcbiAgICBzdGFydCArPSBsZW5cbiAgICBpZiAoc3RhcnQgPCAwKSBzdGFydCA9IDBcbiAgfSBlbHNlIGlmIChzdGFydCA+IGxlbikge1xuICAgIHN0YXJ0ID0gbGVuXG4gIH1cblxuICBpZiAoZW5kIDwgMCkge1xuICAgIGVuZCArPSBsZW5cbiAgICBpZiAoZW5kIDwgMCkgZW5kID0gMFxuICB9IGVsc2UgaWYgKGVuZCA+IGxlbikge1xuICAgIGVuZCA9IGxlblxuICB9XG5cbiAgaWYgKGVuZCA8IHN0YXJ0KSBlbmQgPSBzdGFydFxuXG4gIHZhciBuZXdCdWYgPSB0aGlzLnN1YmFycmF5KHN0YXJ0LCBlbmQpXG4gIC8vIFJldHVybiBhbiBhdWdtZW50ZWQgYFVpbnQ4QXJyYXlgIGluc3RhbmNlXG4gIG5ld0J1Zi5fX3Byb3RvX18gPSBCdWZmZXIucHJvdG90eXBlXG4gIHJldHVybiBuZXdCdWZcbn1cblxuLypcbiAqIE5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgYnVmZmVyIGlzbid0IHRyeWluZyB0byB3cml0ZSBvdXQgb2YgYm91bmRzLlxuICovXG5mdW5jdGlvbiBjaGVja09mZnNldCAob2Zmc2V0LCBleHQsIGxlbmd0aCkge1xuICBpZiAoKG9mZnNldCAlIDEpICE9PSAwIHx8IG9mZnNldCA8IDApIHRocm93IG5ldyBSYW5nZUVycm9yKCdvZmZzZXQgaXMgbm90IHVpbnQnKVxuICBpZiAob2Zmc2V0ICsgZXh0ID4gbGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignVHJ5aW5nIHRvIGFjY2VzcyBiZXlvbmQgYnVmZmVyIGxlbmd0aCcpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnRMRSA9IGZ1bmN0aW9uIHJlYWRVSW50TEUgKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgYnl0ZUxlbmd0aCwgdGhpcy5sZW5ndGgpXG5cbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0XVxuICB2YXIgbXVsID0gMVxuICB2YXIgaSA9IDBcbiAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB2YWwgKz0gdGhpc1tvZmZzZXQgKyBpXSAqIG11bFxuICB9XG5cbiAgcmV0dXJuIHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50QkUgPSBmdW5jdGlvbiByZWFkVUludEJFIChvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgY2hlY2tPZmZzZXQob2Zmc2V0LCBieXRlTGVuZ3RoLCB0aGlzLmxlbmd0aClcbiAgfVxuXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldCArIC0tYnl0ZUxlbmd0aF1cbiAgdmFyIG11bCA9IDFcbiAgd2hpbGUgKGJ5dGVMZW5ndGggPiAwICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdmFsICs9IHRoaXNbb2Zmc2V0ICsgLS1ieXRlTGVuZ3RoXSAqIG11bFxuICB9XG5cbiAgcmV0dXJuIHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50OCA9IGZ1bmN0aW9uIHJlYWRVSW50OCAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAxLCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIHRoaXNbb2Zmc2V0XVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MTZMRSA9IGZ1bmN0aW9uIHJlYWRVSW50MTZMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAyLCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIHRoaXNbb2Zmc2V0XSB8ICh0aGlzW29mZnNldCArIDFdIDw8IDgpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQxNkJFID0gZnVuY3Rpb24gcmVhZFVJbnQxNkJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDIsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gKHRoaXNbb2Zmc2V0XSA8PCA4KSB8IHRoaXNbb2Zmc2V0ICsgMV1cbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDMyTEUgPSBmdW5jdGlvbiByZWFkVUludDMyTEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG5cbiAgcmV0dXJuICgodGhpc1tvZmZzZXRdKSB8XG4gICAgICAodGhpc1tvZmZzZXQgKyAxXSA8PCA4KSB8XG4gICAgICAodGhpc1tvZmZzZXQgKyAyXSA8PCAxNikpICtcbiAgICAgICh0aGlzW29mZnNldCArIDNdICogMHgxMDAwMDAwKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MzJCRSA9IGZ1bmN0aW9uIHJlYWRVSW50MzJCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcblxuICByZXR1cm4gKHRoaXNbb2Zmc2V0XSAqIDB4MTAwMDAwMCkgK1xuICAgICgodGhpc1tvZmZzZXQgKyAxXSA8PCAxNikgfFxuICAgICh0aGlzW29mZnNldCArIDJdIDw8IDgpIHxcbiAgICB0aGlzW29mZnNldCArIDNdKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnRMRSA9IGZ1bmN0aW9uIHJlYWRJbnRMRSAob2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCBieXRlTGVuZ3RoLCB0aGlzLmxlbmd0aClcblxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXRdXG4gIHZhciBtdWwgPSAxXG4gIHZhciBpID0gMFxuICB3aGlsZSAoKytpIDwgYnl0ZUxlbmd0aCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHZhbCArPSB0aGlzW29mZnNldCArIGldICogbXVsXG4gIH1cbiAgbXVsICo9IDB4ODBcblxuICBpZiAodmFsID49IG11bCkgdmFsIC09IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoKVxuXG4gIHJldHVybiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50QkUgPSBmdW5jdGlvbiByZWFkSW50QkUgKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgYnl0ZUxlbmd0aCwgdGhpcy5sZW5ndGgpXG5cbiAgdmFyIGkgPSBieXRlTGVuZ3RoXG4gIHZhciBtdWwgPSAxXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldCArIC0taV1cbiAgd2hpbGUgKGkgPiAwICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdmFsICs9IHRoaXNbb2Zmc2V0ICsgLS1pXSAqIG11bFxuICB9XG4gIG11bCAqPSAweDgwXG5cbiAgaWYgKHZhbCA+PSBtdWwpIHZhbCAtPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aClcblxuICByZXR1cm4gdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDggPSBmdW5jdGlvbiByZWFkSW50OCAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAxLCB0aGlzLmxlbmd0aClcbiAgaWYgKCEodGhpc1tvZmZzZXRdICYgMHg4MCkpIHJldHVybiAodGhpc1tvZmZzZXRdKVxuICByZXR1cm4gKCgweGZmIC0gdGhpc1tvZmZzZXRdICsgMSkgKiAtMSlcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50MTZMRSA9IGZ1bmN0aW9uIHJlYWRJbnQxNkxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDIsIHRoaXMubGVuZ3RoKVxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXRdIHwgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgOClcbiAgcmV0dXJuICh2YWwgJiAweDgwMDApID8gdmFsIHwgMHhGRkZGMDAwMCA6IHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQxNkJFID0gZnVuY3Rpb24gcmVhZEludDE2QkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMiwgdGhpcy5sZW5ndGgpXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldCArIDFdIHwgKHRoaXNbb2Zmc2V0XSA8PCA4KVxuICByZXR1cm4gKHZhbCAmIDB4ODAwMCkgPyB2YWwgfCAweEZGRkYwMDAwIDogdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDMyTEUgPSBmdW5jdGlvbiByZWFkSW50MzJMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcblxuICByZXR1cm4gKHRoaXNbb2Zmc2V0XSkgfFxuICAgICh0aGlzW29mZnNldCArIDFdIDw8IDgpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAyXSA8PCAxNikgfFxuICAgICh0aGlzW29mZnNldCArIDNdIDw8IDI0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQzMkJFID0gZnVuY3Rpb24gcmVhZEludDMyQkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG5cbiAgcmV0dXJuICh0aGlzW29mZnNldF0gPDwgMjQpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAxXSA8PCAxNikgfFxuICAgICh0aGlzW29mZnNldCArIDJdIDw8IDgpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAzXSlcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkRmxvYXRMRSA9IGZ1bmN0aW9uIHJlYWRGbG9hdExFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gaWVlZTc1NC5yZWFkKHRoaXMsIG9mZnNldCwgdHJ1ZSwgMjMsIDQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEZsb2F0QkUgPSBmdW5jdGlvbiByZWFkRmxvYXRCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIGllZWU3NTQucmVhZCh0aGlzLCBvZmZzZXQsIGZhbHNlLCAyMywgNClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkRG91YmxlTEUgPSBmdW5jdGlvbiByZWFkRG91YmxlTEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgOCwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiBpZWVlNzU0LnJlYWQodGhpcywgb2Zmc2V0LCB0cnVlLCA1MiwgOClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkRG91YmxlQkUgPSBmdW5jdGlvbiByZWFkRG91YmxlQkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgOCwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiBpZWVlNzU0LnJlYWQodGhpcywgb2Zmc2V0LCBmYWxzZSwgNTIsIDgpXG59XG5cbmZ1bmN0aW9uIGNoZWNrSW50IChidWYsIHZhbHVlLCBvZmZzZXQsIGV4dCwgbWF4LCBtaW4pIHtcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoYnVmKSkgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJidWZmZXJcIiBhcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyIGluc3RhbmNlJylcbiAgaWYgKHZhbHVlID4gbWF4IHx8IHZhbHVlIDwgbWluKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignXCJ2YWx1ZVwiIGFyZ3VtZW50IGlzIG91dCBvZiBib3VuZHMnKVxuICBpZiAob2Zmc2V0ICsgZXh0ID4gYnVmLmxlbmd0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0luZGV4IG91dCBvZiByYW5nZScpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50TEUgPSBmdW5jdGlvbiB3cml0ZVVJbnRMRSAodmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICB2YXIgbWF4Qnl0ZXMgPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aCkgLSAxXG4gICAgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbWF4Qnl0ZXMsIDApXG4gIH1cblxuICB2YXIgbXVsID0gMVxuICB2YXIgaSA9IDBcbiAgdGhpc1tvZmZzZXRdID0gdmFsdWUgJiAweEZGXG4gIHdoaWxlICgrK2kgPCBieXRlTGVuZ3RoICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdGhpc1tvZmZzZXQgKyBpXSA9ICh2YWx1ZSAvIG11bCkgJiAweEZGXG4gIH1cblxuICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludEJFID0gZnVuY3Rpb24gd3JpdGVVSW50QkUgKHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgdmFyIG1heEJ5dGVzID0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGgpIC0gMVxuICAgIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG1heEJ5dGVzLCAwKVxuICB9XG5cbiAgdmFyIGkgPSBieXRlTGVuZ3RoIC0gMVxuICB2YXIgbXVsID0gMVxuICB0aGlzW29mZnNldCArIGldID0gdmFsdWUgJiAweEZGXG4gIHdoaWxlICgtLWkgPj0gMCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHRoaXNbb2Zmc2V0ICsgaV0gPSAodmFsdWUgLyBtdWwpICYgMHhGRlxuICB9XG5cbiAgcmV0dXJuIG9mZnNldCArIGJ5dGVMZW5ndGhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQ4ID0gZnVuY3Rpb24gd3JpdGVVSW50OCAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDEsIDB4ZmYsIDApXG4gIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIHJldHVybiBvZmZzZXQgKyAxXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MTZMRSA9IGZ1bmN0aW9uIHdyaXRlVUludDE2TEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCAweGZmZmYsIDApXG4gIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDgpXG4gIHJldHVybiBvZmZzZXQgKyAyXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MTZCRSA9IGZ1bmN0aW9uIHdyaXRlVUludDE2QkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCAweGZmZmYsIDApXG4gIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSA+Pj4gOClcbiAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIHJldHVybiBvZmZzZXQgKyAyXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MzJMRSA9IGZ1bmN0aW9uIHdyaXRlVUludDMyTEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCA0LCAweGZmZmZmZmZmLCAwKVxuICB0aGlzW29mZnNldCArIDNdID0gKHZhbHVlID4+PiAyNClcbiAgdGhpc1tvZmZzZXQgKyAyXSA9ICh2YWx1ZSA+Pj4gMTYpXG4gIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDgpXG4gIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MzJCRSA9IGZ1bmN0aW9uIHdyaXRlVUludDMyQkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCA0LCAweGZmZmZmZmZmLCAwKVxuICB0aGlzW29mZnNldF0gPSAodmFsdWUgPj4+IDI0KVxuICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiAxNilcbiAgdGhpc1tvZmZzZXQgKyAyXSA9ICh2YWx1ZSA+Pj4gOClcbiAgdGhpc1tvZmZzZXQgKyAzXSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnRMRSA9IGZ1bmN0aW9uIHdyaXRlSW50TEUgKHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgdmFyIGxpbWl0ID0gTWF0aC5wb3coMiwgKDggKiBieXRlTGVuZ3RoKSAtIDEpXG5cbiAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBsaW1pdCAtIDEsIC1saW1pdClcbiAgfVxuXG4gIHZhciBpID0gMFxuICB2YXIgbXVsID0gMVxuICB2YXIgc3ViID0gMFxuICB0aGlzW29mZnNldF0gPSB2YWx1ZSAmIDB4RkZcbiAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICBpZiAodmFsdWUgPCAwICYmIHN1YiA9PT0gMCAmJiB0aGlzW29mZnNldCArIGkgLSAxXSAhPT0gMCkge1xuICAgICAgc3ViID0gMVxuICAgIH1cbiAgICB0aGlzW29mZnNldCArIGldID0gKCh2YWx1ZSAvIG11bCkgPj4gMCkgLSBzdWIgJiAweEZGXG4gIH1cblxuICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50QkUgPSBmdW5jdGlvbiB3cml0ZUludEJFICh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIHZhciBsaW1pdCA9IE1hdGgucG93KDIsICg4ICogYnl0ZUxlbmd0aCkgLSAxKVxuXG4gICAgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbGltaXQgLSAxLCAtbGltaXQpXG4gIH1cblxuICB2YXIgaSA9IGJ5dGVMZW5ndGggLSAxXG4gIHZhciBtdWwgPSAxXG4gIHZhciBzdWIgPSAwXG4gIHRoaXNbb2Zmc2V0ICsgaV0gPSB2YWx1ZSAmIDB4RkZcbiAgd2hpbGUgKC0taSA+PSAwICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgaWYgKHZhbHVlIDwgMCAmJiBzdWIgPT09IDAgJiYgdGhpc1tvZmZzZXQgKyBpICsgMV0gIT09IDApIHtcbiAgICAgIHN1YiA9IDFcbiAgICB9XG4gICAgdGhpc1tvZmZzZXQgKyBpXSA9ICgodmFsdWUgLyBtdWwpID4+IDApIC0gc3ViICYgMHhGRlxuICB9XG5cbiAgcmV0dXJuIG9mZnNldCArIGJ5dGVMZW5ndGhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDggPSBmdW5jdGlvbiB3cml0ZUludDggKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAxLCAweDdmLCAtMHg4MClcbiAgaWYgKHZhbHVlIDwgMCkgdmFsdWUgPSAweGZmICsgdmFsdWUgKyAxXG4gIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIHJldHVybiBvZmZzZXQgKyAxXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQxNkxFID0gZnVuY3Rpb24gd3JpdGVJbnQxNkxFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMiwgMHg3ZmZmLCAtMHg4MDAwKVxuICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiA4KVxuICByZXR1cm4gb2Zmc2V0ICsgMlxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50MTZCRSA9IGZ1bmN0aW9uIHdyaXRlSW50MTZCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDIsIDB4N2ZmZiwgLTB4ODAwMClcbiAgdGhpc1tvZmZzZXRdID0gKHZhbHVlID4+PiA4KVxuICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlICYgMHhmZilcbiAgcmV0dXJuIG9mZnNldCArIDJcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDMyTEUgPSBmdW5jdGlvbiB3cml0ZUludDMyTEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCA0LCAweDdmZmZmZmZmLCAtMHg4MDAwMDAwMClcbiAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gOClcbiAgdGhpc1tvZmZzZXQgKyAyXSA9ICh2YWx1ZSA+Pj4gMTYpXG4gIHRoaXNbb2Zmc2V0ICsgM10gPSAodmFsdWUgPj4+IDI0KVxuICByZXR1cm4gb2Zmc2V0ICsgNFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50MzJCRSA9IGZ1bmN0aW9uIHdyaXRlSW50MzJCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDQsIDB4N2ZmZmZmZmYsIC0weDgwMDAwMDAwKVxuICBpZiAodmFsdWUgPCAwKSB2YWx1ZSA9IDB4ZmZmZmZmZmYgKyB2YWx1ZSArIDFcbiAgdGhpc1tvZmZzZXRdID0gKHZhbHVlID4+PiAyNClcbiAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gMTYpXG4gIHRoaXNbb2Zmc2V0ICsgMl0gPSAodmFsdWUgPj4+IDgpXG4gIHRoaXNbb2Zmc2V0ICsgM10gPSAodmFsdWUgJiAweGZmKVxuICByZXR1cm4gb2Zmc2V0ICsgNFxufVxuXG5mdW5jdGlvbiBjaGVja0lFRUU3NTQgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgZXh0LCBtYXgsIG1pbikge1xuICBpZiAob2Zmc2V0ICsgZXh0ID4gYnVmLmxlbmd0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0luZGV4IG91dCBvZiByYW5nZScpXG4gIGlmIChvZmZzZXQgPCAwKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW5kZXggb3V0IG9mIHJhbmdlJylcbn1cblxuZnVuY3Rpb24gd3JpdGVGbG9hdCAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4sIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgY2hlY2tJRUVFNzU0KGJ1ZiwgdmFsdWUsIG9mZnNldCwgNCwgMy40MDI4MjM0NjYzODUyODg2ZSszOCwgLTMuNDAyODIzNDY2Mzg1Mjg4NmUrMzgpXG4gIH1cbiAgaWVlZTc1NC53cml0ZShidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgMjMsIDQpXG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVGbG9hdExFID0gZnVuY3Rpb24gd3JpdGVGbG9hdExFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICByZXR1cm4gd3JpdGVGbG9hdCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlLCBub0Fzc2VydClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUZsb2F0QkUgPSBmdW5jdGlvbiB3cml0ZUZsb2F0QkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHJldHVybiB3cml0ZUZsb2F0KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlLCBub0Fzc2VydClcbn1cblxuZnVuY3Rpb24gd3JpdGVEb3VibGUgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIGNoZWNrSUVFRTc1NChidWYsIHZhbHVlLCBvZmZzZXQsIDgsIDEuNzk3NjkzMTM0ODYyMzE1N0UrMzA4LCAtMS43OTc2OTMxMzQ4NjIzMTU3RSszMDgpXG4gIH1cbiAgaWVlZTc1NC53cml0ZShidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgNTIsIDgpXG4gIHJldHVybiBvZmZzZXQgKyA4XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVEb3VibGVMRSA9IGZ1bmN0aW9uIHdyaXRlRG91YmxlTEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHJldHVybiB3cml0ZURvdWJsZSh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlLCBub0Fzc2VydClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZURvdWJsZUJFID0gZnVuY3Rpb24gd3JpdGVEb3VibGVCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgcmV0dXJuIHdyaXRlRG91YmxlKHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlLCBub0Fzc2VydClcbn1cblxuLy8gY29weSh0YXJnZXRCdWZmZXIsIHRhcmdldFN0YXJ0PTAsIHNvdXJjZVN0YXJ0PTAsIHNvdXJjZUVuZD1idWZmZXIubGVuZ3RoKVxuQnVmZmVyLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gY29weSAodGFyZ2V0LCB0YXJnZXRTdGFydCwgc3RhcnQsIGVuZCkge1xuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcih0YXJnZXQpKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdhcmd1bWVudCBzaG91bGQgYmUgYSBCdWZmZXInKVxuICBpZiAoIXN0YXJ0KSBzdGFydCA9IDBcbiAgaWYgKCFlbmQgJiYgZW5kICE9PSAwKSBlbmQgPSB0aGlzLmxlbmd0aFxuICBpZiAodGFyZ2V0U3RhcnQgPj0gdGFyZ2V0Lmxlbmd0aCkgdGFyZ2V0U3RhcnQgPSB0YXJnZXQubGVuZ3RoXG4gIGlmICghdGFyZ2V0U3RhcnQpIHRhcmdldFN0YXJ0ID0gMFxuICBpZiAoZW5kID4gMCAmJiBlbmQgPCBzdGFydCkgZW5kID0gc3RhcnRcblxuICAvLyBDb3B5IDAgYnl0ZXM7IHdlJ3JlIGRvbmVcbiAgaWYgKGVuZCA9PT0gc3RhcnQpIHJldHVybiAwXG4gIGlmICh0YXJnZXQubGVuZ3RoID09PSAwIHx8IHRoaXMubGVuZ3RoID09PSAwKSByZXR1cm4gMFxuXG4gIC8vIEZhdGFsIGVycm9yIGNvbmRpdGlvbnNcbiAgaWYgKHRhcmdldFN0YXJ0IDwgMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCd0YXJnZXRTdGFydCBvdXQgb2YgYm91bmRzJylcbiAgfVxuICBpZiAoc3RhcnQgPCAwIHx8IHN0YXJ0ID49IHRoaXMubGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW5kZXggb3V0IG9mIHJhbmdlJylcbiAgaWYgKGVuZCA8IDApIHRocm93IG5ldyBSYW5nZUVycm9yKCdzb3VyY2VFbmQgb3V0IG9mIGJvdW5kcycpXG5cbiAgLy8gQXJlIHdlIG9vYj9cbiAgaWYgKGVuZCA+IHRoaXMubGVuZ3RoKSBlbmQgPSB0aGlzLmxlbmd0aFxuICBpZiAodGFyZ2V0Lmxlbmd0aCAtIHRhcmdldFN0YXJ0IDwgZW5kIC0gc3RhcnQpIHtcbiAgICBlbmQgPSB0YXJnZXQubGVuZ3RoIC0gdGFyZ2V0U3RhcnQgKyBzdGFydFxuICB9XG5cbiAgdmFyIGxlbiA9IGVuZCAtIHN0YXJ0XG5cbiAgaWYgKHRoaXMgPT09IHRhcmdldCAmJiB0eXBlb2YgVWludDhBcnJheS5wcm90b3R5cGUuY29weVdpdGhpbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIC8vIFVzZSBidWlsdC1pbiB3aGVuIGF2YWlsYWJsZSwgbWlzc2luZyBmcm9tIElFMTFcbiAgICB0aGlzLmNvcHlXaXRoaW4odGFyZ2V0U3RhcnQsIHN0YXJ0LCBlbmQpXG4gIH0gZWxzZSBpZiAodGhpcyA9PT0gdGFyZ2V0ICYmIHN0YXJ0IDwgdGFyZ2V0U3RhcnQgJiYgdGFyZ2V0U3RhcnQgPCBlbmQpIHtcbiAgICAvLyBkZXNjZW5kaW5nIGNvcHkgZnJvbSBlbmRcbiAgICBmb3IgKHZhciBpID0gbGVuIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgIHRhcmdldFtpICsgdGFyZ2V0U3RhcnRdID0gdGhpc1tpICsgc3RhcnRdXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIFVpbnQ4QXJyYXkucHJvdG90eXBlLnNldC5jYWxsKFxuICAgICAgdGFyZ2V0LFxuICAgICAgdGhpcy5zdWJhcnJheShzdGFydCwgZW5kKSxcbiAgICAgIHRhcmdldFN0YXJ0XG4gICAgKVxuICB9XG5cbiAgcmV0dXJuIGxlblxufVxuXG4vLyBVc2FnZTpcbi8vICAgIGJ1ZmZlci5maWxsKG51bWJlclssIG9mZnNldFssIGVuZF1dKVxuLy8gICAgYnVmZmVyLmZpbGwoYnVmZmVyWywgb2Zmc2V0WywgZW5kXV0pXG4vLyAgICBidWZmZXIuZmlsbChzdHJpbmdbLCBvZmZzZXRbLCBlbmRdXVssIGVuY29kaW5nXSlcbkJ1ZmZlci5wcm90b3R5cGUuZmlsbCA9IGZ1bmN0aW9uIGZpbGwgKHZhbCwgc3RhcnQsIGVuZCwgZW5jb2RpbmcpIHtcbiAgLy8gSGFuZGxlIHN0cmluZyBjYXNlczpcbiAgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnKSB7XG4gICAgaWYgKHR5cGVvZiBzdGFydCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGVuY29kaW5nID0gc3RhcnRcbiAgICAgIHN0YXJ0ID0gMFxuICAgICAgZW5kID0gdGhpcy5sZW5ndGhcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBlbmQgPT09ICdzdHJpbmcnKSB7XG4gICAgICBlbmNvZGluZyA9IGVuZFxuICAgICAgZW5kID0gdGhpcy5sZW5ndGhcbiAgICB9XG4gICAgaWYgKGVuY29kaW5nICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIGVuY29kaW5nICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignZW5jb2RpbmcgbXVzdCBiZSBhIHN0cmluZycpXG4gICAgfVxuICAgIGlmICh0eXBlb2YgZW5jb2RpbmcgPT09ICdzdHJpbmcnICYmICFCdWZmZXIuaXNFbmNvZGluZyhlbmNvZGluZykpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmNvZGluZylcbiAgICB9XG4gICAgaWYgKHZhbC5sZW5ndGggPT09IDEpIHtcbiAgICAgIHZhciBjb2RlID0gdmFsLmNoYXJDb2RlQXQoMClcbiAgICAgIGlmICgoZW5jb2RpbmcgPT09ICd1dGY4JyAmJiBjb2RlIDwgMTI4KSB8fFxuICAgICAgICAgIGVuY29kaW5nID09PSAnbGF0aW4xJykge1xuICAgICAgICAvLyBGYXN0IHBhdGg6IElmIGB2YWxgIGZpdHMgaW50byBhIHNpbmdsZSBieXRlLCB1c2UgdGhhdCBudW1lcmljIHZhbHVlLlxuICAgICAgICB2YWwgPSBjb2RlXG4gICAgICB9XG4gICAgfVxuICB9IGVsc2UgaWYgKHR5cGVvZiB2YWwgPT09ICdudW1iZXInKSB7XG4gICAgdmFsID0gdmFsICYgMjU1XG4gIH1cblxuICAvLyBJbnZhbGlkIHJhbmdlcyBhcmUgbm90IHNldCB0byBhIGRlZmF1bHQsIHNvIGNhbiByYW5nZSBjaGVjayBlYXJseS5cbiAgaWYgKHN0YXJ0IDwgMCB8fCB0aGlzLmxlbmd0aCA8IHN0YXJ0IHx8IHRoaXMubGVuZ3RoIDwgZW5kKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ091dCBvZiByYW5nZSBpbmRleCcpXG4gIH1cblxuICBpZiAoZW5kIDw9IHN0YXJ0KSB7XG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIHN0YXJ0ID0gc3RhcnQgPj4+IDBcbiAgZW5kID0gZW5kID09PSB1bmRlZmluZWQgPyB0aGlzLmxlbmd0aCA6IGVuZCA+Pj4gMFxuXG4gIGlmICghdmFsKSB2YWwgPSAwXG5cbiAgdmFyIGlcbiAgaWYgKHR5cGVvZiB2YWwgPT09ICdudW1iZXInKSB7XG4gICAgZm9yIChpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSkge1xuICAgICAgdGhpc1tpXSA9IHZhbFxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB2YXIgYnl0ZXMgPSBCdWZmZXIuaXNCdWZmZXIodmFsKVxuICAgICAgPyB2YWxcbiAgICAgIDogQnVmZmVyLmZyb20odmFsLCBlbmNvZGluZylcbiAgICB2YXIgbGVuID0gYnl0ZXMubGVuZ3RoXG4gICAgaWYgKGxlbiA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIHZhbHVlIFwiJyArIHZhbCArXG4gICAgICAgICdcIiBpcyBpbnZhbGlkIGZvciBhcmd1bWVudCBcInZhbHVlXCInKVxuICAgIH1cbiAgICBmb3IgKGkgPSAwOyBpIDwgZW5kIC0gc3RhcnQ7ICsraSkge1xuICAgICAgdGhpc1tpICsgc3RhcnRdID0gYnl0ZXNbaSAlIGxlbl1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGhpc1xufVxuXG4vLyBIRUxQRVIgRlVOQ1RJT05TXG4vLyA9PT09PT09PT09PT09PT09XG5cbnZhciBJTlZBTElEX0JBU0U2NF9SRSA9IC9bXisvMC05QS1aYS16LV9dL2dcblxuZnVuY3Rpb24gYmFzZTY0Y2xlYW4gKHN0cikge1xuICAvLyBOb2RlIHRha2VzIGVxdWFsIHNpZ25zIGFzIGVuZCBvZiB0aGUgQmFzZTY0IGVuY29kaW5nXG4gIHN0ciA9IHN0ci5zcGxpdCgnPScpWzBdXG4gIC8vIE5vZGUgc3RyaXBzIG91dCBpbnZhbGlkIGNoYXJhY3RlcnMgbGlrZSBcXG4gYW5kIFxcdCBmcm9tIHRoZSBzdHJpbmcsIGJhc2U2NC1qcyBkb2VzIG5vdFxuICBzdHIgPSBzdHIudHJpbSgpLnJlcGxhY2UoSU5WQUxJRF9CQVNFNjRfUkUsICcnKVxuICAvLyBOb2RlIGNvbnZlcnRzIHN0cmluZ3Mgd2l0aCBsZW5ndGggPCAyIHRvICcnXG4gIGlmIChzdHIubGVuZ3RoIDwgMikgcmV0dXJuICcnXG4gIC8vIE5vZGUgYWxsb3dzIGZvciBub24tcGFkZGVkIGJhc2U2NCBzdHJpbmdzIChtaXNzaW5nIHRyYWlsaW5nID09PSksIGJhc2U2NC1qcyBkb2VzIG5vdFxuICB3aGlsZSAoc3RyLmxlbmd0aCAlIDQgIT09IDApIHtcbiAgICBzdHIgPSBzdHIgKyAnPSdcbiAgfVxuICByZXR1cm4gc3RyXG59XG5cbmZ1bmN0aW9uIHRvSGV4IChuKSB7XG4gIGlmIChuIDwgMTYpIHJldHVybiAnMCcgKyBuLnRvU3RyaW5nKDE2KVxuICByZXR1cm4gbi50b1N0cmluZygxNilcbn1cblxuZnVuY3Rpb24gdXRmOFRvQnl0ZXMgKHN0cmluZywgdW5pdHMpIHtcbiAgdW5pdHMgPSB1bml0cyB8fCBJbmZpbml0eVxuICB2YXIgY29kZVBvaW50XG4gIHZhciBsZW5ndGggPSBzdHJpbmcubGVuZ3RoXG4gIHZhciBsZWFkU3Vycm9nYXRlID0gbnVsbFxuICB2YXIgYnl0ZXMgPSBbXVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHtcbiAgICBjb2RlUG9pbnQgPSBzdHJpbmcuY2hhckNvZGVBdChpKVxuXG4gICAgLy8gaXMgc3Vycm9nYXRlIGNvbXBvbmVudFxuICAgIGlmIChjb2RlUG9pbnQgPiAweEQ3RkYgJiYgY29kZVBvaW50IDwgMHhFMDAwKSB7XG4gICAgICAvLyBsYXN0IGNoYXIgd2FzIGEgbGVhZFxuICAgICAgaWYgKCFsZWFkU3Vycm9nYXRlKSB7XG4gICAgICAgIC8vIG5vIGxlYWQgeWV0XG4gICAgICAgIGlmIChjb2RlUG9pbnQgPiAweERCRkYpIHtcbiAgICAgICAgICAvLyB1bmV4cGVjdGVkIHRyYWlsXG4gICAgICAgICAgaWYgKCh1bml0cyAtPSAzKSA+IC0xKSBieXRlcy5wdXNoKDB4RUYsIDB4QkYsIDB4QkQpXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfSBlbHNlIGlmIChpICsgMSA9PT0gbGVuZ3RoKSB7XG4gICAgICAgICAgLy8gdW5wYWlyZWQgbGVhZFxuICAgICAgICAgIGlmICgodW5pdHMgLT0gMykgPiAtMSkgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKVxuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cblxuICAgICAgICAvLyB2YWxpZCBsZWFkXG4gICAgICAgIGxlYWRTdXJyb2dhdGUgPSBjb2RlUG9pbnRcblxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICAvLyAyIGxlYWRzIGluIGEgcm93XG4gICAgICBpZiAoY29kZVBvaW50IDwgMHhEQzAwKSB7XG4gICAgICAgIGlmICgodW5pdHMgLT0gMykgPiAtMSkgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKVxuICAgICAgICBsZWFkU3Vycm9nYXRlID0gY29kZVBvaW50XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIC8vIHZhbGlkIHN1cnJvZ2F0ZSBwYWlyXG4gICAgICBjb2RlUG9pbnQgPSAobGVhZFN1cnJvZ2F0ZSAtIDB4RDgwMCA8PCAxMCB8IGNvZGVQb2ludCAtIDB4REMwMCkgKyAweDEwMDAwXG4gICAgfSBlbHNlIGlmIChsZWFkU3Vycm9nYXRlKSB7XG4gICAgICAvLyB2YWxpZCBibXAgY2hhciwgYnV0IGxhc3QgY2hhciB3YXMgYSBsZWFkXG4gICAgICBpZiAoKHVuaXRzIC09IDMpID4gLTEpIGJ5dGVzLnB1c2goMHhFRiwgMHhCRiwgMHhCRClcbiAgICB9XG5cbiAgICBsZWFkU3Vycm9nYXRlID0gbnVsbFxuXG4gICAgLy8gZW5jb2RlIHV0ZjhcbiAgICBpZiAoY29kZVBvaW50IDwgMHg4MCkge1xuICAgICAgaWYgKCh1bml0cyAtPSAxKSA8IDApIGJyZWFrXG4gICAgICBieXRlcy5wdXNoKGNvZGVQb2ludClcbiAgICB9IGVsc2UgaWYgKGNvZGVQb2ludCA8IDB4ODAwKSB7XG4gICAgICBpZiAoKHVuaXRzIC09IDIpIDwgMCkgYnJlYWtcbiAgICAgIGJ5dGVzLnB1c2goXG4gICAgICAgIGNvZGVQb2ludCA+PiAweDYgfCAweEMwLFxuICAgICAgICBjb2RlUG9pbnQgJiAweDNGIHwgMHg4MFxuICAgICAgKVxuICAgIH0gZWxzZSBpZiAoY29kZVBvaW50IDwgMHgxMDAwMCkge1xuICAgICAgaWYgKCh1bml0cyAtPSAzKSA8IDApIGJyZWFrXG4gICAgICBieXRlcy5wdXNoKFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHhDIHwgMHhFMCxcbiAgICAgICAgY29kZVBvaW50ID4+IDB4NiAmIDB4M0YgfCAweDgwLFxuICAgICAgICBjb2RlUG9pbnQgJiAweDNGIHwgMHg4MFxuICAgICAgKVxuICAgIH0gZWxzZSBpZiAoY29kZVBvaW50IDwgMHgxMTAwMDApIHtcbiAgICAgIGlmICgodW5pdHMgLT0gNCkgPCAwKSBicmVha1xuICAgICAgYnl0ZXMucHVzaChcbiAgICAgICAgY29kZVBvaW50ID4+IDB4MTIgfCAweEYwLFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHhDICYgMHgzRiB8IDB4ODAsXG4gICAgICAgIGNvZGVQb2ludCA+PiAweDYgJiAweDNGIHwgMHg4MCxcbiAgICAgICAgY29kZVBvaW50ICYgMHgzRiB8IDB4ODBcbiAgICAgIClcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGNvZGUgcG9pbnQnKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBieXRlc1xufVxuXG5mdW5jdGlvbiBhc2NpaVRvQnl0ZXMgKHN0cikge1xuICB2YXIgYnl0ZUFycmF5ID0gW11cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyArK2kpIHtcbiAgICAvLyBOb2RlJ3MgY29kZSBzZWVtcyB0byBiZSBkb2luZyB0aGlzIGFuZCBub3QgJiAweDdGLi5cbiAgICBieXRlQXJyYXkucHVzaChzdHIuY2hhckNvZGVBdChpKSAmIDB4RkYpXG4gIH1cbiAgcmV0dXJuIGJ5dGVBcnJheVxufVxuXG5mdW5jdGlvbiB1dGYxNmxlVG9CeXRlcyAoc3RyLCB1bml0cykge1xuICB2YXIgYywgaGksIGxvXG4gIHZhciBieXRlQXJyYXkgPSBbXVxuICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ci5sZW5ndGg7ICsraSkge1xuICAgIGlmICgodW5pdHMgLT0gMikgPCAwKSBicmVha1xuXG4gICAgYyA9IHN0ci5jaGFyQ29kZUF0KGkpXG4gICAgaGkgPSBjID4+IDhcbiAgICBsbyA9IGMgJSAyNTZcbiAgICBieXRlQXJyYXkucHVzaChsbylcbiAgICBieXRlQXJyYXkucHVzaChoaSlcbiAgfVxuXG4gIHJldHVybiBieXRlQXJyYXlcbn1cblxuZnVuY3Rpb24gYmFzZTY0VG9CeXRlcyAoc3RyKSB7XG4gIHJldHVybiBiYXNlNjQudG9CeXRlQXJyYXkoYmFzZTY0Y2xlYW4oc3RyKSlcbn1cblxuZnVuY3Rpb24gYmxpdEJ1ZmZlciAoc3JjLCBkc3QsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHtcbiAgICBpZiAoKGkgKyBvZmZzZXQgPj0gZHN0Lmxlbmd0aCkgfHwgKGkgPj0gc3JjLmxlbmd0aCkpIGJyZWFrXG4gICAgZHN0W2kgKyBvZmZzZXRdID0gc3JjW2ldXG4gIH1cbiAgcmV0dXJuIGlcbn1cblxuLy8gQXJyYXlCdWZmZXIgb3IgVWludDhBcnJheSBvYmplY3RzIGZyb20gb3RoZXIgY29udGV4dHMgKGkuZS4gaWZyYW1lcykgZG8gbm90IHBhc3Ncbi8vIHRoZSBgaW5zdGFuY2VvZmAgY2hlY2sgYnV0IHRoZXkgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgb2YgdGhhdCB0eXBlLlxuLy8gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vZmVyb3NzL2J1ZmZlci9pc3N1ZXMvMTY2XG5mdW5jdGlvbiBpc0luc3RhbmNlIChvYmosIHR5cGUpIHtcbiAgcmV0dXJuIG9iaiBpbnN0YW5jZW9mIHR5cGUgfHxcbiAgICAob2JqICE9IG51bGwgJiYgb2JqLmNvbnN0cnVjdG9yICE9IG51bGwgJiYgb2JqLmNvbnN0cnVjdG9yLm5hbWUgIT0gbnVsbCAmJlxuICAgICAgb2JqLmNvbnN0cnVjdG9yLm5hbWUgPT09IHR5cGUubmFtZSlcbn1cbmZ1bmN0aW9uIG51bWJlcklzTmFOIChvYmopIHtcbiAgLy8gRm9yIElFMTEgc3VwcG9ydFxuICByZXR1cm4gb2JqICE9PSBvYmogLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1zZWxmLWNvbXBhcmVcbn1cbiIsImV4cG9ydHMucmVhZCA9IGZ1bmN0aW9uIChidWZmZXIsIG9mZnNldCwgaXNMRSwgbUxlbiwgbkJ5dGVzKSB7XG4gIHZhciBlLCBtXG4gIHZhciBlTGVuID0gKG5CeXRlcyAqIDgpIC0gbUxlbiAtIDFcbiAgdmFyIGVNYXggPSAoMSA8PCBlTGVuKSAtIDFcbiAgdmFyIGVCaWFzID0gZU1heCA+PiAxXG4gIHZhciBuQml0cyA9IC03XG4gIHZhciBpID0gaXNMRSA/IChuQnl0ZXMgLSAxKSA6IDBcbiAgdmFyIGQgPSBpc0xFID8gLTEgOiAxXG4gIHZhciBzID0gYnVmZmVyW29mZnNldCArIGldXG5cbiAgaSArPSBkXG5cbiAgZSA9IHMgJiAoKDEgPDwgKC1uQml0cykpIC0gMSlcbiAgcyA+Pj0gKC1uQml0cylcbiAgbkJpdHMgKz0gZUxlblxuICBmb3IgKDsgbkJpdHMgPiAwOyBlID0gKGUgKiAyNTYpICsgYnVmZmVyW29mZnNldCArIGldLCBpICs9IGQsIG5CaXRzIC09IDgpIHt9XG5cbiAgbSA9IGUgJiAoKDEgPDwgKC1uQml0cykpIC0gMSlcbiAgZSA+Pj0gKC1uQml0cylcbiAgbkJpdHMgKz0gbUxlblxuICBmb3IgKDsgbkJpdHMgPiAwOyBtID0gKG0gKiAyNTYpICsgYnVmZmVyW29mZnNldCArIGldLCBpICs9IGQsIG5CaXRzIC09IDgpIHt9XG5cbiAgaWYgKGUgPT09IDApIHtcbiAgICBlID0gMSAtIGVCaWFzXG4gIH0gZWxzZSBpZiAoZSA9PT0gZU1heCkge1xuICAgIHJldHVybiBtID8gTmFOIDogKChzID8gLTEgOiAxKSAqIEluZmluaXR5KVxuICB9IGVsc2Uge1xuICAgIG0gPSBtICsgTWF0aC5wb3coMiwgbUxlbilcbiAgICBlID0gZSAtIGVCaWFzXG4gIH1cbiAgcmV0dXJuIChzID8gLTEgOiAxKSAqIG0gKiBNYXRoLnBvdygyLCBlIC0gbUxlbilcbn1cblxuZXhwb3J0cy53cml0ZSA9IGZ1bmN0aW9uIChidWZmZXIsIHZhbHVlLCBvZmZzZXQsIGlzTEUsIG1MZW4sIG5CeXRlcykge1xuICB2YXIgZSwgbSwgY1xuICB2YXIgZUxlbiA9IChuQnl0ZXMgKiA4KSAtIG1MZW4gLSAxXG4gIHZhciBlTWF4ID0gKDEgPDwgZUxlbikgLSAxXG4gIHZhciBlQmlhcyA9IGVNYXggPj4gMVxuICB2YXIgcnQgPSAobUxlbiA9PT0gMjMgPyBNYXRoLnBvdygyLCAtMjQpIC0gTWF0aC5wb3coMiwgLTc3KSA6IDApXG4gIHZhciBpID0gaXNMRSA/IDAgOiAobkJ5dGVzIC0gMSlcbiAgdmFyIGQgPSBpc0xFID8gMSA6IC0xXG4gIHZhciBzID0gdmFsdWUgPCAwIHx8ICh2YWx1ZSA9PT0gMCAmJiAxIC8gdmFsdWUgPCAwKSA/IDEgOiAwXG5cbiAgdmFsdWUgPSBNYXRoLmFicyh2YWx1ZSlcblxuICBpZiAoaXNOYU4odmFsdWUpIHx8IHZhbHVlID09PSBJbmZpbml0eSkge1xuICAgIG0gPSBpc05hTih2YWx1ZSkgPyAxIDogMFxuICAgIGUgPSBlTWF4XG4gIH0gZWxzZSB7XG4gICAgZSA9IE1hdGguZmxvb3IoTWF0aC5sb2codmFsdWUpIC8gTWF0aC5MTjIpXG4gICAgaWYgKHZhbHVlICogKGMgPSBNYXRoLnBvdygyLCAtZSkpIDwgMSkge1xuICAgICAgZS0tXG4gICAgICBjICo9IDJcbiAgICB9XG4gICAgaWYgKGUgKyBlQmlhcyA+PSAxKSB7XG4gICAgICB2YWx1ZSArPSBydCAvIGNcbiAgICB9IGVsc2Uge1xuICAgICAgdmFsdWUgKz0gcnQgKiBNYXRoLnBvdygyLCAxIC0gZUJpYXMpXG4gICAgfVxuICAgIGlmICh2YWx1ZSAqIGMgPj0gMikge1xuICAgICAgZSsrXG4gICAgICBjIC89IDJcbiAgICB9XG5cbiAgICBpZiAoZSArIGVCaWFzID49IGVNYXgpIHtcbiAgICAgIG0gPSAwXG4gICAgICBlID0gZU1heFxuICAgIH0gZWxzZSBpZiAoZSArIGVCaWFzID49IDEpIHtcbiAgICAgIG0gPSAoKHZhbHVlICogYykgLSAxKSAqIE1hdGgucG93KDIsIG1MZW4pXG4gICAgICBlID0gZSArIGVCaWFzXG4gICAgfSBlbHNlIHtcbiAgICAgIG0gPSB2YWx1ZSAqIE1hdGgucG93KDIsIGVCaWFzIC0gMSkgKiBNYXRoLnBvdygyLCBtTGVuKVxuICAgICAgZSA9IDBcbiAgICB9XG4gIH1cblxuICBmb3IgKDsgbUxlbiA+PSA4OyBidWZmZXJbb2Zmc2V0ICsgaV0gPSBtICYgMHhmZiwgaSArPSBkLCBtIC89IDI1NiwgbUxlbiAtPSA4KSB7fVxuXG4gIGUgPSAoZSA8PCBtTGVuKSB8IG1cbiAgZUxlbiArPSBtTGVuXG4gIGZvciAoOyBlTGVuID4gMDsgYnVmZmVyW29mZnNldCArIGldID0gZSAmIDB4ZmYsIGkgKz0gZCwgZSAvPSAyNTYsIGVMZW4gLT0gOCkge31cblxuICBidWZmZXJbb2Zmc2V0ICsgaSAtIGRdIHw9IHMgKiAxMjhcbn1cbiIsIi8vIHNoaW0gZm9yIHVzaW5nIHByb2Nlc3MgaW4gYnJvd3NlclxudmFyIHByb2Nlc3MgPSBtb2R1bGUuZXhwb3J0cyA9IHt9O1xuXG4vLyBjYWNoZWQgZnJvbSB3aGF0ZXZlciBnbG9iYWwgaXMgcHJlc2VudCBzbyB0aGF0IHRlc3QgcnVubmVycyB0aGF0IHN0dWIgaXRcbi8vIGRvbid0IGJyZWFrIHRoaW5ncy4gIEJ1dCB3ZSBuZWVkIHRvIHdyYXAgaXQgaW4gYSB0cnkgY2F0Y2ggaW4gY2FzZSBpdCBpc1xuLy8gd3JhcHBlZCBpbiBzdHJpY3QgbW9kZSBjb2RlIHdoaWNoIGRvZXNuJ3QgZGVmaW5lIGFueSBnbG9iYWxzLiAgSXQncyBpbnNpZGUgYVxuLy8gZnVuY3Rpb24gYmVjYXVzZSB0cnkvY2F0Y2hlcyBkZW9wdGltaXplIGluIGNlcnRhaW4gZW5naW5lcy5cblxudmFyIGNhY2hlZFNldFRpbWVvdXQ7XG52YXIgY2FjaGVkQ2xlYXJUaW1lb3V0O1xuXG5mdW5jdGlvbiBkZWZhdWx0U2V0VGltb3V0KCkge1xuICAgIHRocm93IG5ldyBFcnJvcignc2V0VGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCcpO1xufVxuZnVuY3Rpb24gZGVmYXVsdENsZWFyVGltZW91dCAoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdjbGVhclRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQnKTtcbn1cbihmdW5jdGlvbiAoKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKHR5cGVvZiBzZXRUaW1lb3V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gc2V0VGltZW91dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBkZWZhdWx0U2V0VGltb3V0O1xuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gZGVmYXVsdFNldFRpbW91dDtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKHR5cGVvZiBjbGVhclRpbWVvdXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGNsZWFyVGltZW91dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGRlZmF1bHRDbGVhclRpbWVvdXQ7XG4gICAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGRlZmF1bHRDbGVhclRpbWVvdXQ7XG4gICAgfVxufSAoKSlcbmZ1bmN0aW9uIHJ1blRpbWVvdXQoZnVuKSB7XG4gICAgaWYgKGNhY2hlZFNldFRpbWVvdXQgPT09IHNldFRpbWVvdXQpIHtcbiAgICAgICAgLy9ub3JtYWwgZW52aXJvbWVudHMgaW4gc2FuZSBzaXR1YXRpb25zXG4gICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1biwgMCk7XG4gICAgfVxuICAgIC8vIGlmIHNldFRpbWVvdXQgd2Fzbid0IGF2YWlsYWJsZSBidXQgd2FzIGxhdHRlciBkZWZpbmVkXG4gICAgaWYgKChjYWNoZWRTZXRUaW1lb3V0ID09PSBkZWZhdWx0U2V0VGltb3V0IHx8ICFjYWNoZWRTZXRUaW1lb3V0KSAmJiBzZXRUaW1lb3V0KSB7XG4gICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBzZXRUaW1lb3V0O1xuICAgICAgICByZXR1cm4gc2V0VGltZW91dChmdW4sIDApO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICAvLyB3aGVuIHdoZW4gc29tZWJvZHkgaGFzIHNjcmV3ZWQgd2l0aCBzZXRUaW1lb3V0IGJ1dCBubyBJLkUuIG1hZGRuZXNzXG4gICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0KGZ1biwgMCk7XG4gICAgfSBjYXRjaChlKXtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFdoZW4gd2UgYXJlIGluIEkuRS4gYnV0IHRoZSBzY3JpcHQgaGFzIGJlZW4gZXZhbGVkIHNvIEkuRS4gZG9lc24ndCB0cnVzdCB0aGUgZ2xvYmFsIG9iamVjdCB3aGVuIGNhbGxlZCBub3JtYWxseVxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQuY2FsbChudWxsLCBmdW4sIDApO1xuICAgICAgICB9IGNhdGNoKGUpe1xuICAgICAgICAgICAgLy8gc2FtZSBhcyBhYm92ZSBidXQgd2hlbiBpdCdzIGEgdmVyc2lvbiBvZiBJLkUuIHRoYXQgbXVzdCBoYXZlIHRoZSBnbG9iYWwgb2JqZWN0IGZvciAndGhpcycsIGhvcGZ1bGx5IG91ciBjb250ZXh0IGNvcnJlY3Qgb3RoZXJ3aXNlIGl0IHdpbGwgdGhyb3cgYSBnbG9iYWwgZXJyb3JcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0LmNhbGwodGhpcywgZnVuLCAwKTtcbiAgICAgICAgfVxuICAgIH1cblxuXG59XG5mdW5jdGlvbiBydW5DbGVhclRpbWVvdXQobWFya2VyKSB7XG4gICAgaWYgKGNhY2hlZENsZWFyVGltZW91dCA9PT0gY2xlYXJUaW1lb3V0KSB7XG4gICAgICAgIC8vbm9ybWFsIGVudmlyb21lbnRzIGluIHNhbmUgc2l0dWF0aW9uc1xuICAgICAgICByZXR1cm4gY2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfVxuICAgIC8vIGlmIGNsZWFyVGltZW91dCB3YXNuJ3QgYXZhaWxhYmxlIGJ1dCB3YXMgbGF0dGVyIGRlZmluZWRcbiAgICBpZiAoKGNhY2hlZENsZWFyVGltZW91dCA9PT0gZGVmYXVsdENsZWFyVGltZW91dCB8fCAhY2FjaGVkQ2xlYXJUaW1lb3V0KSAmJiBjbGVhclRpbWVvdXQpIHtcbiAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gY2xlYXJUaW1lb3V0O1xuICAgICAgICByZXR1cm4gY2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIC8vIHdoZW4gd2hlbiBzb21lYm9keSBoYXMgc2NyZXdlZCB3aXRoIHNldFRpbWVvdXQgYnV0IG5vIEkuRS4gbWFkZG5lc3NcbiAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH0gY2F0Y2ggKGUpe1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gV2hlbiB3ZSBhcmUgaW4gSS5FLiBidXQgdGhlIHNjcmlwdCBoYXMgYmVlbiBldmFsZWQgc28gSS5FLiBkb2Vzbid0ICB0cnVzdCB0aGUgZ2xvYmFsIG9iamVjdCB3aGVuIGNhbGxlZCBub3JtYWxseVxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dC5jYWxsKG51bGwsIG1hcmtlcik7XG4gICAgICAgIH0gY2F0Y2ggKGUpe1xuICAgICAgICAgICAgLy8gc2FtZSBhcyBhYm92ZSBidXQgd2hlbiBpdCdzIGEgdmVyc2lvbiBvZiBJLkUuIHRoYXQgbXVzdCBoYXZlIHRoZSBnbG9iYWwgb2JqZWN0IGZvciAndGhpcycsIGhvcGZ1bGx5IG91ciBjb250ZXh0IGNvcnJlY3Qgb3RoZXJ3aXNlIGl0IHdpbGwgdGhyb3cgYSBnbG9iYWwgZXJyb3IuXG4gICAgICAgICAgICAvLyBTb21lIHZlcnNpb25zIG9mIEkuRS4gaGF2ZSBkaWZmZXJlbnQgcnVsZXMgZm9yIGNsZWFyVGltZW91dCB2cyBzZXRUaW1lb3V0XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0LmNhbGwodGhpcywgbWFya2VyKTtcbiAgICAgICAgfVxuICAgIH1cblxuXG5cbn1cbnZhciBxdWV1ZSA9IFtdO1xudmFyIGRyYWluaW5nID0gZmFsc2U7XG52YXIgY3VycmVudFF1ZXVlO1xudmFyIHF1ZXVlSW5kZXggPSAtMTtcblxuZnVuY3Rpb24gY2xlYW5VcE5leHRUaWNrKCkge1xuICAgIGlmICghZHJhaW5pbmcgfHwgIWN1cnJlbnRRdWV1ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGRyYWluaW5nID0gZmFsc2U7XG4gICAgaWYgKGN1cnJlbnRRdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgcXVldWUgPSBjdXJyZW50UXVldWUuY29uY2F0KHF1ZXVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBxdWV1ZUluZGV4ID0gLTE7XG4gICAgfVxuICAgIGlmIChxdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgZHJhaW5RdWV1ZSgpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZHJhaW5RdWV1ZSgpIHtcbiAgICBpZiAoZHJhaW5pbmcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgdGltZW91dCA9IHJ1blRpbWVvdXQoY2xlYW5VcE5leHRUaWNrKTtcbiAgICBkcmFpbmluZyA9IHRydWU7XG5cbiAgICB2YXIgbGVuID0gcXVldWUubGVuZ3RoO1xuICAgIHdoaWxlKGxlbikge1xuICAgICAgICBjdXJyZW50UXVldWUgPSBxdWV1ZTtcbiAgICAgICAgcXVldWUgPSBbXTtcbiAgICAgICAgd2hpbGUgKCsrcXVldWVJbmRleCA8IGxlbikge1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRRdWV1ZSkge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRRdWV1ZVtxdWV1ZUluZGV4XS5ydW4oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBxdWV1ZUluZGV4ID0gLTE7XG4gICAgICAgIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB9XG4gICAgY3VycmVudFF1ZXVlID0gbnVsbDtcbiAgICBkcmFpbmluZyA9IGZhbHNlO1xuICAgIHJ1bkNsZWFyVGltZW91dCh0aW1lb3V0KTtcbn1cblxucHJvY2Vzcy5uZXh0VGljayA9IGZ1bmN0aW9uIChmdW4pIHtcbiAgICB2YXIgYXJncyA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoIC0gMSk7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBhcmdzW2kgLSAxXSA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBxdWV1ZS5wdXNoKG5ldyBJdGVtKGZ1biwgYXJncykpO1xuICAgIGlmIChxdWV1ZS5sZW5ndGggPT09IDEgJiYgIWRyYWluaW5nKSB7XG4gICAgICAgIHJ1blRpbWVvdXQoZHJhaW5RdWV1ZSk7XG4gICAgfVxufTtcblxuLy8gdjggbGlrZXMgcHJlZGljdGlibGUgb2JqZWN0c1xuZnVuY3Rpb24gSXRlbShmdW4sIGFycmF5KSB7XG4gICAgdGhpcy5mdW4gPSBmdW47XG4gICAgdGhpcy5hcnJheSA9IGFycmF5O1xufVxuSXRlbS5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuZnVuLmFwcGx5KG51bGwsIHRoaXMuYXJyYXkpO1xufTtcbnByb2Nlc3MudGl0bGUgPSAnYnJvd3Nlcic7XG5wcm9jZXNzLmJyb3dzZXIgPSB0cnVlO1xucHJvY2Vzcy5lbnYgPSB7fTtcbnByb2Nlc3MuYXJndiA9IFtdO1xucHJvY2Vzcy52ZXJzaW9uID0gJyc7IC8vIGVtcHR5IHN0cmluZyB0byBhdm9pZCByZWdleHAgaXNzdWVzXG5wcm9jZXNzLnZlcnNpb25zID0ge307XG5cbmZ1bmN0aW9uIG5vb3AoKSB7fVxuXG5wcm9jZXNzLm9uID0gbm9vcDtcbnByb2Nlc3MuYWRkTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5vbmNlID0gbm9vcDtcbnByb2Nlc3Mub2ZmID0gbm9vcDtcbnByb2Nlc3MucmVtb3ZlTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5yZW1vdmVBbGxMaXN0ZW5lcnMgPSBub29wO1xucHJvY2Vzcy5lbWl0ID0gbm9vcDtcbnByb2Nlc3MucHJlcGVuZExpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3MucHJlcGVuZE9uY2VMaXN0ZW5lciA9IG5vb3A7XG5cbnByb2Nlc3MubGlzdGVuZXJzID0gZnVuY3Rpb24gKG5hbWUpIHsgcmV0dXJuIFtdIH1cblxucHJvY2Vzcy5iaW5kaW5nID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuYmluZGluZyBpcyBub3Qgc3VwcG9ydGVkJyk7XG59O1xuXG5wcm9jZXNzLmN3ZCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuICcvJyB9O1xucHJvY2Vzcy5jaGRpciA9IGZ1bmN0aW9uIChkaXIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuY2hkaXIgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcbnByb2Nlc3MudW1hc2sgPSBmdW5jdGlvbigpIHsgcmV0dXJuIDA7IH07XG4iXX0= diff --git a/build/jsforce-api-metadata.min.js b/build/jsforce-api-metadata.min.js index 3f5229e9..96e6a346 100644 --- a/build/jsforce-api-metadata.min.js +++ b/build/jsforce-api-metadata.min.js @@ -1,3 +1,9 @@ -!function(t){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var e;e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,e=e.jsforce||(e.jsforce={}),e=e.modules||(e.modules={}),e=e.api||(e.api={}),e.Metadata=t()}}(function(){return function(){function t(e,r,n){function o(u,s){if(!r[u]){if(!e[u]){var a="function"==typeof require&&require;if(!s&&a)return a(u,!0);if(i)return i(u,!0);var f=new Error("Cannot find module '"+u+"'");throw f.code="MODULE_NOT_FOUND",f}var h=r[u]={exports:{}};e[u][0].call(h.exports,function(t){var r=e[u][1][t];return o(r||t)},h,h.exports,t,e,r,n)}return r[u].exports}for(var i="function"==typeof require&&require,u=0;u30)throw new Error("Async metadata CRUD calls are not supported on ver 31.0 or later.");var n=function(e){return e["@xsi:type"]=t,e},o=f.isArray(e);e=o?f.map(e,n):n(e);var i=this._invoke("create",{metadata:e});return new y(this,i,o).thenCall(r)},p.prototype.createSync=p.prototype.create=function(t,e,r){var o=function(e){return e["@xsi:type"]=t,e},i=f.isArray(e);return e=i?f.map(e,o):o(e),this._invoke("createMetadata",{metadata:e}).then(function(t){return f.isArray(t)?f.map(t,n):n(t)}).thenCall(r)},p.prototype.readSync=p.prototype.read=function(t,e,r){return this._invoke("readMetadata",{type:t,fullNames:e}).then(function(t){return f.isArray(t.records)?f.map(t.records,i):i(t.records)}).thenCall(r)},p.prototype.updateAsync=function(t,e,r){if(Number(this._conn.version)>30)throw new Error("Async metadata CRUD calls are not supported on ver 31.0 or later.");var n=function(e){return e.metadata["@xsi:type"]=t,e},o=f.isArray(e);e=o?f.map(e,n):n(e);var i=this._invoke("update",{updateMetadata:e});return new y(this,i,o).thenCall(r)},p.prototype.updateSync=p.prototype.update=function(t,e,r){var o=function(e){return e["@xsi:type"]=t,e},i=f.isArray(e);return e=i?f.map(e,o):o(e),this._invoke("updateMetadata",{metadata:e}).then(function(t){return f.isArray(t)?f.map(t,n):n(t)}).thenCall(r)},p.prototype.upsertSync=p.prototype.upsert=function(t,e,r){var n=function(e){return e["@xsi:type"]=t,e},i=f.isArray(e);return e=i?f.map(e,n):n(e),this._invoke("upsertMetadata",{metadata:e}).then(function(t){return f.isArray(t)?f.map(t,o):o(t)}).thenCall(r)},p.prototype.deleteAsync=function(t,e,r){if(Number(this._conn.version)>30)throw new Error("Async metadata CRUD calls are not supported on ver 31.0 or later.");var n=function(e){return f.isString(e)&&(e={fullName:e}),e["@xsi:type"]=t,e},o=f.isArray(e);e=o?f.map(e,n):n(e);var i=this._invoke("delete",{metadata:e});return new y(this,i,o).thenCall(r)},p.prototype.del=p.prototype.deleteSync=p.prototype["delete"]=function(t,e,r){return this._invoke("deleteMetadata",{type:t,fullNames:e}).then(function(t){return f.isArray(t)?f.map(t,n):n(t)}).thenCall(r)},p.prototype.rename=function(t,e,r,o){return this._invoke("renameMetadata",{type:t,oldFullName:e,newFullName:r}).then(function(t){return n(t)}).thenCall(o)},p.prototype.checkStatus=function(t,e){var r=f.isArray(t),n=this._invoke("checkStatus",{asyncProcessId:t});return new y(this,n,r).thenCall(e)},p.prototype.describe=function(t,e){return f.isString(t)||(e=t,t=this._conn.version),this._invoke("describeMetadata",{asOfVersion:t}).then(function(t){return t.metadataObjects=f.isArray(t.metadataObjects)?t.metadataObjects:[t.metadataObjects],t.metadataObjects=f.map(t.metadataObjects,function(t){return t.childXmlNames&&(t.childXmlNames=f.isArray(t.childXmlNames)?t.childXmlNames:[t.childXmlNames]),t.inFolder="true"===t.inFolder,t.metaFile="true"===t.metaFile,t}),t.partialSaveAllowed="true"===t.partialSaveAllowed,t.testRequired="true"===t.testRequired,t}).thenCall(e)},p.prototype.list=function(t,e,r){return f.isString(e)||(r=e,e=this._conn.version),f.isArray(t)||(t=[t]),this._invoke("listMetadata",{queries:t,asOfVersion:e},r)},p.prototype.retrieve=function(t,e){var r=this._invoke("retrieve",{request:t});return new d(this,r).thenCall(e)},p.prototype.checkRetrieveStatus=function(t,e){return this._invoke("checkRetrieveStatus",{asyncProcessId:t},e)},p.prototype.deploy=function(t,e,n){e&&!f.isFunction(e)||(n=e,e={});var o=c.defer();if(f.isObject(t)&&f.isFunction(t.pipe)){var i=[];t.on("data",function(t){i.push(t)}),t.on("end",function(){o.resolve(r.concat(i).toString("base64"))})}else if(t instanceof r)o.resolve(t.toString("base64"));else{if(!(t instanceof String||"string"==typeof t))throw"Unexpected zipInput type";o.resolve(t)}var u=this,s=o.promise.then(function(t){return u._invoke("deploy",{ZipFile:t,DeployOptions:e},n)});return new g(this,s).thenCall(n)},p.prototype.checkDeployStatus=function(t,e,r){return f.isObject(e)||f.isBoolean(e)?e=!!e:(r=e,e=!1),this._invoke("checkDeployStatus",{asyncProcessId:t,includeDetails:e}).then(function(t){return t.done="true"===t.done,t.success="true"===t.success,t.checkOnly="true"===t.checkOnly,t.runTestsEnabled="true"===t.runTestsEnabled,t.ignoreWarnings&&(t.ignoreWarnings="true"===t.ignoreWarnings),t.rollbackOnError&&(t.rollbackOnError="true"===t.rollbackOnError),t.numberComponentErrors=Number(t.numberComponentErrors),t.numberComponentsDeployed=Number(t.numberComponentsDeployed),t.numberComponentsTotal=Number(t.numberComponentsTotal),t.numberTestErrors=Number(t.numberTestErrors),t.numberTestsCompleted=Number(t.numberTestsCompleted),t.numberTestsTotal=Number(t.numberTestsTotal),t}).thenCall(r)};var y=function(t,e,r){this._meta=t,this._results=e,this._isArray=r};u(y,s.EventEmitter),y.prototype.then=function(t,e){var r=this;return this._results.then(function(e){var n=function(t){return t.$&&"true"===t.$["xsi:nil"]?null:(t.done="true"===t.done,t)};return e=f.isArray(e)?f.map(e,n):n(e),r._isArray&&!f.isArray(e)&&(e=[e]),t(e)},e)},y.prototype.thenCall=function(e){return f.isFunction(e)?this.then(function(r){t.nextTick(function(){e(null,r)})},function(r){t.nextTick(function(){e(r)})}):this},y.prototype.check=function(t){var e=this,r=this._meta;return this.then(function(t){var n=f.isArray(t)?f.map(t,function(t){return t.id}):t.id;return e._ids=n,r.checkStatus(n)}).thenCall(t)},y.prototype.poll=function(t,e){var r=this,n=(new Date).getTime(),o=function(){var i=(new Date).getTime();if(n+e0)throw new Error("Invalid string. Length must be a multiple of 4");var r=t.indexOf("=");r===-1&&(r=e);var n=r===e?0:4-r%4;return[r,n]}function o(t){var e=n(t),r=e[0],o=e[1];return 3*(r+o)/4-o}function i(t,e,r){return 3*(e+r)/4-r}function u(t){for(var e,r=n(t),o=r[0],u=r[1],s=new l(i(t,o,u)),a=0,f=u>0?o-4:o,h=0;h>16&255,s[a++]=e>>8&255,s[a++]=255&e;return 2===u&&(e=c[t.charCodeAt(h)]<<2|c[t.charCodeAt(h+1)]>>4,s[a++]=255&e),1===u&&(e=c[t.charCodeAt(h)]<<10|c[t.charCodeAt(h+1)]<<4|c[t.charCodeAt(h+2)]>>2,s[a++]=e>>8&255,s[a++]=255&e),s}function s(t){return h[t>>18&63]+h[t>>12&63]+h[t>>6&63]+h[63&t]}function a(t,e,r){for(var n,o=[],i=e;is?s:u+i));return 1===n?(e=t[r-1],o.push(h[e>>2]+h[e<<4&63]+"==")):2===n&&(e=(t[r-2]<<8)+t[r-1],o.push(h[e>>10]+h[e>>4&63]+h[e<<2&63]+"=")),o.join("")}r.byteLength=o,r.toByteArray=u,r.fromByteArray=f;for(var h=[],c=[],l="undefined"!=typeof Uint8Array?Uint8Array:Array,p="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",y=0,d=p.length;yG)throw new RangeError("Invalid typed array length");var e=new Uint8Array(t);return e.__proto__=i.prototype,e}function i(t,e,r){if("number"==typeof t){if("string"==typeof e)throw new Error("If encoding is specified then the first argument must be a string");return f(t)}return u(t,e,r)}function u(t,e,r){if("number"==typeof t)throw new TypeError('"value" argument must not be a number');return W(t)||t&&W(t.buffer)?l(t,e,r):"string"==typeof t?h(t,e):p(t)}function s(t){if("number"!=typeof t)throw new TypeError('"size" argument must be of type number');if(t<0)throw new RangeError('"size" argument must not be negative')}function a(t,e,r){return s(t),t<=0?o(t):void 0!==e?"string"==typeof r?o(t).fill(e,r):o(t).fill(e):o(t)}function f(t){return s(t),o(t<0?0:0|y(t))}function h(t,e){if("string"==typeof e&&""!==e||(e="utf8"),!i.isEncoding(e))throw new TypeError("Unknown encoding: "+e);var r=0|g(t,e),n=o(r),u=n.write(t,e);return u!==r&&(n=n.slice(0,u)),n}function c(t){for(var e=t.length<0?0:0|y(t.length),r=o(e),n=0;n=G)throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+G.toString(16)+" bytes");return 0|t}function d(t){return+t!=t&&(t=0),i.alloc(+t)}function g(t,e){if(i.isBuffer(t))return t.length;if(ArrayBuffer.isView(t)||W(t))return t.byteLength;"string"!=typeof t&&(t=""+t);var r=t.length;if(0===r)return 0;for(var n=!1;;)switch(e){case"ascii":case"latin1":case"binary":return r;case"utf8":case"utf-8":case void 0:return P(t).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*r;case"hex":return r>>>1;case"base64":return Y(t).length;default:if(n)return P(t).length;e=(""+e).toLowerCase(),n=!0}}function m(t,e,r){var n=!1;if((void 0===e||e<0)&&(e=0),e>this.length)return"";if((void 0===r||r>this.length)&&(r=this.length),r<=0)return"";if(r>>>=0,e>>>=0,r<=e)return"";for(t||(t="utf8");;)switch(t){case"hex":return M(this,e,r);case"utf8":case"utf-8":return S(this,e,r);case"ascii":return U(this,e,r);case"latin1":case"binary":return x(this,e,r);case"base64":return k(this,e,r);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return L(this,e,r);default:if(n)throw new TypeError("Unknown encoding: "+t);t=(t+"").toLowerCase(),n=!0}}function v(t,e,r){var n=t[e];t[e]=t[r],t[r]=n}function w(t,e,r,n,o){if(0===t.length)return-1;if("string"==typeof r?(n=r,r=0):r>2147483647?r=2147483647:r<-2147483648&&(r=-2147483648),r=+r,Z(r)&&(r=o?0:t.length-1),r<0&&(r=t.length+r),r>=t.length){if(o)return-1;r=t.length-1}else if(r<0){if(!o)return-1;r=0}if("string"==typeof e&&(e=i.from(e,n)),i.isBuffer(e))return 0===e.length?-1:b(t,e,r,n,o);if("number"==typeof e)return e=255&e,"function"==typeof Uint8Array.prototype.indexOf?o?Uint8Array.prototype.indexOf.call(t,e,r):Uint8Array.prototype.lastIndexOf.call(t,e,r):b(t,[e],r,n,o);throw new TypeError("val must be string, number or Buffer")}function b(t,e,r,n,o){function i(t,e){return 1===u?t[e]:t.readUInt16BE(e*u)}var u=1,s=t.length,a=e.length;if(void 0!==n&&(n=String(n).toLowerCase(),"ucs2"===n||"ucs-2"===n||"utf16le"===n||"utf-16le"===n)){if(t.length<2||e.length<2)return-1;u=2,s/=2,a/=2,r/=2}var f;if(o){var h=-1;for(f=r;fs&&(r=s-a),f=r;f>=0;f--){for(var c=!0,l=0;lo&&(n=o)):n=o;var i=e.length;n>i/2&&(n=i/2);for(var u=0;u239?4:i>223?3:i>191?2:1;if(o+s<=r){var a,f,h,c;switch(s){case 1:i<128&&(u=i);break;case 2:a=t[o+1],128===(192&a)&&(c=(31&i)<<6|63&a,c>127&&(u=c));break;case 3:a=t[o+1],f=t[o+2],128===(192&a)&&128===(192&f)&&(c=(15&i)<<12|(63&a)<<6|63&f,c>2047&&(c<55296||c>57343)&&(u=c));break;case 4:a=t[o+1],f=t[o+2],h=t[o+3],128===(192&a)&&128===(192&f)&&128===(192&h)&&(c=(15&i)<<18|(63&a)<<12|(63&f)<<6|63&h,c>65535&&c<1114112&&(u=c))}}null===u?(u=65533,s=1):u>65535&&(u-=65536,n.push(u>>>10&1023|55296),u=56320|1023&u),n.push(u),o+=s}return I(n)}function I(t){var e=t.length;if(e<=H)return String.fromCharCode.apply(String,t);for(var r="",n=0;nn)&&(r=n);for(var o="",i=e;ir)throw new RangeError("Trying to access beyond buffer length")}function R(t,e,r,n,o,u){if(!i.isBuffer(t))throw new TypeError('"buffer" argument must be a Buffer instance');if(e>o||et.length)throw new RangeError("Index out of range")}function N(t,e,r,n,o,i){if(r+n>t.length)throw new RangeError("Index out of range");if(r<0)throw new RangeError("Index out of range")}function j(t,e,r,n,o){return e=+e,r>>>=0,o||N(t,e,r,4,3.4028234663852886e38,-3.4028234663852886e38),J.write(t,e,r,n,23,4),r+4}function D(t,e,r,n,o){return e=+e,r>>>=0,o||N(t,e,r,8,1.7976931348623157e308,-1.7976931348623157e308),J.write(t,e,r,n,52,8),r+8}function F(t){if(t=t.split("=")[0],t=t.trim().replace(K,""),t.length<2)return"";for(;t.length%4!==0;)t+="=";return t}function q(t){return t<16?"0"+t.toString(16):t.toString(16)}function P(t,e){e=e||1/0;for(var r,n=t.length,o=null,i=[],u=0;u55295&&r<57344){if(!o){if(r>56319){(e-=3)>-1&&i.push(239,191,189);continue}if(u+1===n){(e-=3)>-1&&i.push(239,191,189);continue}o=r;continue}if(r<56320){(e-=3)>-1&&i.push(239,191,189),o=r;continue}r=(o-55296<<10|r-56320)+65536}else o&&(e-=3)>-1&&i.push(239,191,189);if(o=null,r<128){if((e-=1)<0)break;i.push(r)}else if(r<2048){if((e-=2)<0)break;i.push(r>>6|192,63&r|128)}else if(r<65536){if((e-=3)<0)break;i.push(r>>12|224,r>>6&63|128,63&r|128)}else{if(!(r<1114112))throw new Error("Invalid code point");if((e-=4)<0)break;i.push(r>>18|240,r>>12&63|128,r>>6&63|128,63&r|128)}}return i}function z(t){for(var e=[],r=0;r>8,o=r%256,i.push(o),i.push(n);return i}function Y(t){return $.toByteArray(F(t))}function V(t,e,r,n){for(var o=0;o=e.length||o>=t.length);++o)e[o+r]=t[o];return o}function W(t){return t instanceof ArrayBuffer||null!=t&&null!=t.constructor&&"ArrayBuffer"===t.constructor.name&&"number"==typeof t.byteLength}function Z(t){return t!==t}var $=t("base64-js"),J=t("ieee754");r.Buffer=i,r.SlowBuffer=d,r.INSPECT_MAX_BYTES=50;var G=2147483647;r.kMaxLength=G,i.TYPED_ARRAY_SUPPORT=n(),i.TYPED_ARRAY_SUPPORT||"undefined"==typeof console||"function"!=typeof console.error||console.error("This browser lacks typed array (Uint8Array) support which is required by `buffer` v5.x. Use `buffer` v4.x if you require old browser support."),Object.defineProperty(i.prototype,"parent",{get:function(){if(this instanceof i)return this.buffer}}),Object.defineProperty(i.prototype,"offset",{get:function(){if(this instanceof i)return this.byteOffset}}),"undefined"!=typeof Symbol&&Symbol.species&&i[Symbol.species]===i&&Object.defineProperty(i,Symbol.species,{value:null,configurable:!0,enumerable:!1,writable:!1}),i.poolSize=8192,i.from=function(t,e,r){return u(t,e,r)},i.prototype.__proto__=Uint8Array.prototype,i.__proto__=Uint8Array,i.alloc=function(t,e,r){return a(t,e,r)},i.allocUnsafe=function(t){return f(t)},i.allocUnsafeSlow=function(t){return f(t)},i.isBuffer=function(t){return null!=t&&t._isBuffer===!0},i.compare=function(t,e){if(!i.isBuffer(t)||!i.isBuffer(e))throw new TypeError("Arguments must be Buffers");if(t===e)return 0;for(var r=t.length,n=e.length,o=0,u=Math.min(r,n);o0&&(t=this.toString("hex",0,e).match(/.{2}/g).join(" "),this.length>e&&(t+=" ... ")),""},i.prototype.compare=function(t,e,r,n,o){if(!i.isBuffer(t))throw new TypeError("Argument must be a Buffer");if(void 0===e&&(e=0),void 0===r&&(r=t?t.length:0),void 0===n&&(n=0),void 0===o&&(o=this.length),e<0||r>t.length||n<0||o>this.length)throw new RangeError("out of range index");if(n>=o&&e>=r)return 0;if(n>=o)return-1;if(e>=r)return 1;if(e>>>=0,r>>>=0,n>>>=0,o>>>=0,this===t)return 0;for(var u=o-n,s=r-e,a=Math.min(u,s),f=this.slice(n,o),h=t.slice(e,r),c=0;c>>=0,isFinite(r)?(r>>>=0,void 0===n&&(n="utf8")):(n=r,r=void 0)}var o=this.length-e;if((void 0===r||r>o)&&(r=o),t.length>0&&(r<0||e<0)||e>this.length)throw new RangeError("Attempt to write outside buffer bounds");n||(n="utf8");for(var i=!1;;)switch(n){case"hex":return E(this,t,e,r);case"utf8":case"utf-8":return A(this,t,e,r);case"ascii":return _(this,t,e,r);case"latin1":case"binary":return T(this,t,e,r);case"base64":return B(this,t,e,r);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return C(this,t,e,r);default:if(i)throw new TypeError("Unknown encoding: "+n);n=(""+n).toLowerCase(),i=!0}},i.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};var H=4096;i.prototype.slice=function(t,e){var r=this.length;t=~~t,e=void 0===e?r:~~e,t<0?(t+=r,t<0&&(t=0)):t>r&&(t=r),e<0?(e+=r,e<0&&(e=0)):e>r&&(e=r),e>>=0,e>>>=0,r||O(t,e,this.length);for(var n=this[t],o=1,i=0;++i>>=0,e>>>=0,r||O(t,e,this.length);for(var n=this[t+--e],o=1;e>0&&(o*=256);)n+=this[t+--e]*o;return n},i.prototype.readUInt8=function(t,e){return t>>>=0,e||O(t,1,this.length),this[t]},i.prototype.readUInt16LE=function(t,e){return t>>>=0,e||O(t,2,this.length),this[t]|this[t+1]<<8},i.prototype.readUInt16BE=function(t,e){return t>>>=0,e||O(t,2,this.length),this[t]<<8|this[t+1]},i.prototype.readUInt32LE=function(t,e){return t>>>=0,e||O(t,4,this.length),(this[t]|this[t+1]<<8|this[t+2]<<16)+16777216*this[t+3]},i.prototype.readUInt32BE=function(t,e){return t>>>=0,e||O(t,4,this.length),16777216*this[t]+(this[t+1]<<16|this[t+2]<<8|this[t+3])},i.prototype.readIntLE=function(t,e,r){t>>>=0,e>>>=0,r||O(t,e,this.length);for(var n=this[t],o=1,i=0;++i=o&&(n-=Math.pow(2,8*e)),n},i.prototype.readIntBE=function(t,e,r){t>>>=0,e>>>=0,r||O(t,e,this.length);for(var n=e,o=1,i=this[t+--n];n>0&&(o*=256);)i+=this[t+--n]*o;return o*=128,i>=o&&(i-=Math.pow(2,8*e)),i},i.prototype.readInt8=function(t,e){return t>>>=0,e||O(t,1,this.length),128&this[t]?(255-this[t]+1)*-1:this[t]},i.prototype.readInt16LE=function(t,e){t>>>=0,e||O(t,2,this.length);var r=this[t]|this[t+1]<<8;return 32768&r?4294901760|r:r},i.prototype.readInt16BE=function(t,e){t>>>=0,e||O(t,2,this.length);var r=this[t+1]|this[t]<<8;return 32768&r?4294901760|r:r},i.prototype.readInt32LE=function(t,e){return t>>>=0,e||O(t,4,this.length),this[t]|this[t+1]<<8|this[t+2]<<16|this[t+3]<<24},i.prototype.readInt32BE=function(t,e){return t>>>=0,e||O(t,4,this.length),this[t]<<24|this[t+1]<<16|this[t+2]<<8|this[t+3]},i.prototype.readFloatLE=function(t,e){return t>>>=0,e||O(t,4,this.length),J.read(this,t,!0,23,4)},i.prototype.readFloatBE=function(t,e){return t>>>=0,e||O(t,4,this.length),J.read(this,t,!1,23,4)},i.prototype.readDoubleLE=function(t,e){return t>>>=0,e||O(t,8,this.length),J.read(this,t,!0,52,8)},i.prototype.readDoubleBE=function(t,e){return t>>>=0,e||O(t,8,this.length),J.read(this,t,!1,52,8)},i.prototype.writeUIntLE=function(t,e,r,n){if(t=+t,e>>>=0,r>>>=0,!n){var o=Math.pow(2,8*r)-1;R(this,t,e,r,o,0)}var i=1,u=0;for(this[e]=255&t;++u>>=0,r>>>=0,!n){var o=Math.pow(2,8*r)-1;R(this,t,e,r,o,0)}var i=r-1,u=1;for(this[e+i]=255&t;--i>=0&&(u*=256);)this[e+i]=t/u&255;return e+r},i.prototype.writeUInt8=function(t,e,r){return t=+t,e>>>=0,r||R(this,t,e,1,255,0),this[e]=255&t,e+1},i.prototype.writeUInt16LE=function(t,e,r){return t=+t,e>>>=0,r||R(this,t,e,2,65535,0),this[e]=255&t,this[e+1]=t>>>8,e+2},i.prototype.writeUInt16BE=function(t,e,r){return t=+t,e>>>=0,r||R(this,t,e,2,65535,0),this[e]=t>>>8,this[e+1]=255&t,e+2},i.prototype.writeUInt32LE=function(t,e,r){return t=+t,e>>>=0,r||R(this,t,e,4,4294967295,0),this[e+3]=t>>>24,this[e+2]=t>>>16,this[e+1]=t>>>8,this[e]=255&t,e+4},i.prototype.writeUInt32BE=function(t,e,r){return t=+t,e>>>=0,r||R(this,t,e,4,4294967295,0),this[e]=t>>>24,this[e+1]=t>>>16,this[e+2]=t>>>8,this[e+3]=255&t,e+4},i.prototype.writeIntLE=function(t,e,r,n){if(t=+t,e>>>=0,!n){var o=Math.pow(2,8*r-1);R(this,t,e,r,o-1,-o)}var i=0,u=1,s=0;for(this[e]=255&t;++i>0)-s&255;return e+r},i.prototype.writeIntBE=function(t,e,r,n){if(t=+t,e>>>=0,!n){var o=Math.pow(2,8*r-1);R(this,t,e,r,o-1,-o)}var i=r-1,u=1,s=0;for(this[e+i]=255&t;--i>=0&&(u*=256);)t<0&&0===s&&0!==this[e+i+1]&&(s=1),this[e+i]=(t/u>>0)-s&255;return e+r},i.prototype.writeInt8=function(t,e,r){return t=+t,e>>>=0,r||R(this,t,e,1,127,-128),t<0&&(t=255+t+1),this[e]=255&t,e+1},i.prototype.writeInt16LE=function(t,e,r){return t=+t,e>>>=0,r||R(this,t,e,2,32767,-32768),this[e]=255&t,this[e+1]=t>>>8,e+2},i.prototype.writeInt16BE=function(t,e,r){return t=+t,e>>>=0,r||R(this,t,e,2,32767,-32768),this[e]=t>>>8,this[e+1]=255&t,e+2},i.prototype.writeInt32LE=function(t,e,r){return t=+t,e>>>=0,r||R(this,t,e,4,2147483647,-2147483648),this[e]=255&t,this[e+1]=t>>>8,this[e+2]=t>>>16,this[e+3]=t>>>24,e+4},i.prototype.writeInt32BE=function(t,e,r){return t=+t,e>>>=0,r||R(this,t,e,4,2147483647,-2147483648),t<0&&(t=4294967295+t+1),this[e]=t>>>24,this[e+1]=t>>>16,this[e+2]=t>>>8,this[e+3]=255&t,e+4},i.prototype.writeFloatLE=function(t,e,r){return j(this,t,e,!0,r)},i.prototype.writeFloatBE=function(t,e,r){return j(this,t,e,!1,r)},i.prototype.writeDoubleLE=function(t,e,r){return D(this,t,e,!0,r)},i.prototype.writeDoubleBE=function(t,e,r){return D(this,t,e,!1,r)},i.prototype.copy=function(t,e,r,n){if(!i.isBuffer(t))throw new TypeError("argument should be a Buffer");if(r||(r=0),n||0===n||(n=this.length),e>=t.length&&(e=t.length),e||(e=0),n>0&&n=this.length)throw new RangeError("Index out of range");if(n<0)throw new RangeError("sourceEnd out of bounds");n>this.length&&(n=this.length),t.length-e=0;--u)t[u+e]=this[u+r];else Uint8Array.prototype.set.call(t,this.subarray(r,n),e);return o},i.prototype.fill=function(t,e,r,n){if("string"==typeof t){if("string"==typeof e?(n=e,e=0,r=this.length):"string"==typeof r&&(n=r,r=this.length),void 0!==n&&"string"!=typeof n)throw new TypeError("encoding must be a string");if("string"==typeof n&&!i.isEncoding(n))throw new TypeError("Unknown encoding: "+n);if(1===t.length){var o=t.charCodeAt(0);("utf8"===n&&o<128||"latin1"===n)&&(t=o)}}else"number"==typeof t&&(t=255&t);if(e<0||this.length>>=0,r=void 0===r?this.length:r>>>0,t||(t=0);var u;if("number"==typeof t)for(u=e;u>1,h=-7,c=r?o-1:0,l=r?-1:1,p=t[e+c];for(c+=l,i=p&(1<<-h)-1,p>>=-h,h+=s;h>0;i=256*i+t[e+c],c+=l,h-=8);for(u=i&(1<<-h)-1,i>>=-h,h+=n;h>0;u=256*u+t[e+c],c+=l,h-=8);if(0===i)i=1-f;else{if(i===a)return u?NaN:(p?-1:1)*(1/0);u+=Math.pow(2,n),i-=f}return(p?-1:1)*u*Math.pow(2,i-n)},r.write=function(t,e,r,n,o,i){var u,s,a,f=8*i-o-1,h=(1<>1,l=23===o?Math.pow(2,-24)-Math.pow(2,-77):0,p=n?0:i-1,y=n?1:-1,d=e<0||0===e&&1/e<0?1:0;for(e=Math.abs(e),isNaN(e)||e===1/0?(s=isNaN(e)?1:0,u=h):(u=Math.floor(Math.log(e)/Math.LN2),e*(a=Math.pow(2,-u))<1&&(u--,a*=2),e+=u+c>=1?l/a:l*Math.pow(2,1-c),e*a>=2&&(u++,a/=2),u+c>=h?(s=0,u=h):u+c>=1?(s=(e*a-1)*Math.pow(2,o),u+=c):(s=e*Math.pow(2,c-1)*Math.pow(2,o),u=0));o>=8;t[r+p]=255&s,p+=y,s/=256,o-=8);for(u=u<0;t[r+p]=255&u,p+=y,u/=256,f-=8);t[r+p-y]|=128*d}},{}],5:[function(t,e,r){function n(){throw new Error("setTimeout has not been defined")}function o(){throw new Error("clearTimeout has not been defined")}function i(t){if(c===setTimeout)return setTimeout(t,0);if((c===n||!c)&&setTimeout)return c=setTimeout,setTimeout(t,0);try{return c(t,0)}catch(e){try{return c.call(null,t,0)}catch(e){return c.call(this,t,0)}}}function u(t){if(l===clearTimeout)return clearTimeout(t);if((l===o||!l)&&clearTimeout)return l=clearTimeout,clearTimeout(t);try{return l(t)}catch(e){try{return l.call(null,t)}catch(e){return l.call(this,t)}}}function s(){g&&y&&(g=!1,y.length?d=y.concat(d):m=-1,d.length&&a())}function a(){if(!g){var t=i(s);g=!0;for(var e=d.length;e;){for(y=d,d=[];++m1)for(var r=1;r30)throw new Error("Async metadata CRUD calls are not supported on ver 31.0 or later.");var n=function(e){return e["@xsi:type"]=t,e},o=u.isArray(e);e=o?u.map(e,n):n(e);var i=this._invoke("create",{metadata:e});return new y(this,i,o).thenCall(r)},h.prototype.createSync=h.prototype.create=function(t,e,r){var n=function(e){return e["@xsi:type"]=t,e};return e=u.isArray(e)?u.map(e,n):n(e),this._invoke("createMetadata",{metadata:e}).then((function(t){return u.isArray(t)?u.map(t,c):c(t)})).thenCall(r)},h.prototype.readSync=h.prototype.read=function(t,e,r){return this._invoke("readMetadata",{type:t,fullNames:e}).then((function(t){return u.isArray(t.records)?u.map(t.records,p):p(t.records)})).thenCall(r)},h.prototype.updateAsync=function(t,e,r){if(Number(this._conn.version)>30)throw new Error("Async metadata CRUD calls are not supported on ver 31.0 or later.");var n=function(e){return e.metadata["@xsi:type"]=t,e},o=u.isArray(e);e=o?u.map(e,n):n(e);var i=this._invoke("update",{updateMetadata:e});return new y(this,i,o).thenCall(r)},h.prototype.updateSync=h.prototype.update=function(t,e,r){var n=function(e){return e["@xsi:type"]=t,e};return e=u.isArray(e)?u.map(e,n):n(e),this._invoke("updateMetadata",{metadata:e}).then((function(t){return u.isArray(t)?u.map(t,c):c(t)})).thenCall(r)},h.prototype.upsertSync=h.prototype.upsert=function(t,e,r){var n=function(e){return e["@xsi:type"]=t,e};return e=u.isArray(e)?u.map(e,n):n(e),this._invoke("upsertMetadata",{metadata:e}).then((function(t){return u.isArray(t)?u.map(t,l):l(t)})).thenCall(r)},h.prototype.deleteAsync=function(t,e,r){if(Number(this._conn.version)>30)throw new Error("Async metadata CRUD calls are not supported on ver 31.0 or later.");var n=function(e){return u.isString(e)&&(e={fullName:e}),e["@xsi:type"]=t,e},o=u.isArray(e);e=o?u.map(e,n):n(e);var i=this._invoke("delete",{metadata:e});return new y(this,i,o).thenCall(r)},h.prototype.del=h.prototype.deleteSync=h.prototype.delete=function(t,e,r){return this._invoke("deleteMetadata",{type:t,fullNames:e}).then((function(t){return u.isArray(t)?u.map(t,c):c(t)})).thenCall(r)},h.prototype.rename=function(t,e,r,n){return this._invoke("renameMetadata",{type:t,oldFullName:e,newFullName:r}).then((function(t){return c(t)})).thenCall(n)},h.prototype.checkStatus=function(t,e){var r=u.isArray(t),n=this._invoke("checkStatus",{asyncProcessId:t});return new y(this,n,r).thenCall(e)},h.prototype.describe=function(t,e){return u.isString(t)||(e=t,t=this._conn.version),this._invoke("describeMetadata",{asOfVersion:t}).then((function(t){return t.metadataObjects=u.isArray(t.metadataObjects)?t.metadataObjects:[t.metadataObjects],t.metadataObjects=u.map(t.metadataObjects,(function(t){return t.childXmlNames&&(t.childXmlNames=u.isArray(t.childXmlNames)?t.childXmlNames:[t.childXmlNames]),t.inFolder="true"===t.inFolder,t.metaFile="true"===t.metaFile,t})),t.partialSaveAllowed="true"===t.partialSaveAllowed,t.testRequired="true"===t.testRequired,t})).thenCall(e)},h.prototype.list=function(t,e,r){return u.isString(e)||(r=e,e=this._conn.version),u.isArray(t)||(t=[t]),this._invoke("listMetadata",{queries:t,asOfVersion:e},r)},h.prototype.retrieve=function(t,e){var r=this._invoke("retrieve",{request:t});return new d(this,r).thenCall(e)},h.prototype.checkRetrieveStatus=function(t,e){return this._invoke("checkRetrieveStatus",{asyncProcessId:t},e)},h.prototype.deploy=function(t,e,n){e&&!u.isFunction(e)||(n=e,e={});var o=a.defer();if(u.isObject(t)&&u.isFunction(t.pipe)){var i=[];t.on("data",(function(t){i.push(t)})),t.on("end",(function(){o.resolve(r.concat(i).toString("base64"))}))}else if(t instanceof r)o.resolve(t.toString("base64"));else{if(!(t instanceof String||"string"==typeof t))throw"Unexpected zipInput type";o.resolve(t)}var s=this,f=o.promise.then((function(t){return s._invoke("deploy",{ZipFile:t,DeployOptions:e},n)}));return new g(this,f).thenCall(n)},h.prototype.checkDeployStatus=function(t,e,r){return u.isObject(e)||u.isBoolean(e)?e=!!e:(r=e,e=!1),this._invoke("checkDeployStatus",{asyncProcessId:t,includeDetails:e}).then((function(t){return t.done="true"===t.done,t.success="true"===t.success,t.checkOnly="true"===t.checkOnly,t.runTestsEnabled="true"===t.runTestsEnabled,t.ignoreWarnings&&(t.ignoreWarnings="true"===t.ignoreWarnings),t.rollbackOnError&&(t.rollbackOnError="true"===t.rollbackOnError),t.numberComponentErrors=Number(t.numberComponentErrors),t.numberComponentsDeployed=Number(t.numberComponentsDeployed),t.numberComponentsTotal=Number(t.numberComponentsTotal),t.numberTestErrors=Number(t.numberTestErrors),t.numberTestsCompleted=Number(t.numberTestsCompleted),t.numberTestsTotal=Number(t.numberTestsTotal),t})).thenCall(r)};var y=function(t,e,r){this._meta=t,this._results=e,this._isArray=r};n(y,o.EventEmitter),y.prototype.then=function(t,e){var r=this;return this._results.then((function(e){var n=function(t){return t.$&&"true"===t.$["xsi:nil"]?null:(t.done="true"===t.done,t)};return e=u.isArray(e)?u.map(e,n):n(e),r._isArray&&!u.isArray(e)&&(e=[e]),t(e)}),e)},y.prototype.thenCall=function(e){return u.isFunction(e)?this.then((function(r){t.nextTick((function(){e(null,r)}))}),(function(r){t.nextTick((function(){e(r)}))})):this},y.prototype.check=function(t){var e=this,r=this._meta;return this.then((function(t){var n=u.isArray(t)?u.map(t,(function(t){return t.id})):t.id;return e._ids=n,r.checkStatus(n)})).thenCall(t)},y.prototype.poll=function(t,e){var r=this,n=(new Date).getTime(),o=function(){var i=(new Date).getTime();if(n+e0?u-4:u;for(r=0;r>16&255,a[h++]=e>>8&255,a[h++]=255&e;2===s&&(e=o[t.charCodeAt(r)]<<2|o[t.charCodeAt(r+1)]>>4,a[h++]=255&e);1===s&&(e=o[t.charCodeAt(r)]<<10|o[t.charCodeAt(r+1)]<<4|o[t.charCodeAt(r+2)]>>2,a[h++]=e>>8&255,a[h++]=255&e);return a},r.fromByteArray=function(t){for(var e,r=t.length,o=r%3,i=[],u=0,s=r-o;us?s:u+16383));1===o?(e=t[r-1],i.push(n[e>>2]+n[e<<4&63]+"==")):2===o&&(e=(t[r-2]<<8)+t[r-1],i.push(n[e>>10]+n[e>>4&63]+n[e<<2&63]+"="));return i.join("")};for(var n=[],o=[],i="undefined"!=typeof Uint8Array?Uint8Array:Array,u="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",s=0,a=u.length;s0)throw new Error("Invalid string. Length must be a multiple of 4");var r=t.indexOf("=");return-1===r&&(r=e),[r,r===e?0:4-r%4]}function h(t,e,r){for(var o,i,u=[],s=e;s>18&63]+n[i>>12&63]+n[i>>6&63]+n[63&i]);return u.join("")}o["-".charCodeAt(0)]=62,o["_".charCodeAt(0)]=63},{}],3:[function(t,e,r){(function(e){ +/*! + * The buffer module from node.js, for the browser. + * + * @author Feross Aboukhadijeh + * @license MIT + */ +"use strict";var n=t("base64-js"),o=t("ieee754");r.Buffer=e,r.SlowBuffer=function(t){+t!=t&&(t=0);return e.alloc(+t)},r.INSPECT_MAX_BYTES=50;function i(t){if(t>2147483647)throw new RangeError('The value "'+t+'" is invalid for option "size"');var r=new Uint8Array(t);return r.__proto__=e.prototype,r}function e(t,e,r){if("number"==typeof t){if("string"==typeof e)throw new TypeError('The "string" argument must be of type string. Received type number');return a(t)}return u(t,e,r)}function u(t,r,n){if("string"==typeof t)return function(t,r){"string"==typeof r&&""!==r||(r="utf8");if(!e.isEncoding(r))throw new TypeError("Unknown encoding: "+r);var n=0|c(t,r),o=i(n),u=o.write(t,r);u!==n&&(o=o.slice(0,u));return o}(t,r);if(ArrayBuffer.isView(t))return f(t);if(null==t)throw TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type "+typeof t);if(D(t,ArrayBuffer)||t&&D(t.buffer,ArrayBuffer))return function(t,r,n){if(r<0||t.byteLength=2147483647)throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+2147483647..toString(16)+" bytes");return 0|t}function c(t,r){if(e.isBuffer(t))return t.length;if(ArrayBuffer.isView(t)||D(t,ArrayBuffer))return t.byteLength;if("string"!=typeof t)throw new TypeError('The "string" argument must be one of type string, Buffer, or ArrayBuffer. Received type '+typeof t);var n=t.length,o=arguments.length>2&&!0===arguments[2];if(!o&&0===n)return 0;for(var i=!1;;)switch(r){case"ascii":case"latin1":case"binary":return n;case"utf8":case"utf-8":return M(t).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*n;case"hex":return n>>>1;case"base64":return N(t).length;default:if(i)return o?-1:M(t).length;r=(""+r).toLowerCase(),i=!0}}function l(t,e,r){var n=!1;if((void 0===e||e<0)&&(e=0),e>this.length)return"";if((void 0===r||r>this.length)&&(r=this.length),r<=0)return"";if((r>>>=0)<=(e>>>=0))return"";for(t||(t="utf8");;)switch(t){case"hex":return C(this,e,r);case"utf8":case"utf-8":return _(this,e,r);case"ascii":return T(this,e,r);case"latin1":case"binary":return B(this,e,r);case"base64":return A(this,e,r);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return S(this,e,r);default:if(n)throw new TypeError("Unknown encoding: "+t);t=(t+"").toLowerCase(),n=!0}}function p(t,e,r){var n=t[e];t[e]=t[r],t[r]=n}function y(t,r,n,o,i){if(0===t.length)return-1;if("string"==typeof n?(o=n,n=0):n>2147483647?n=2147483647:n<-2147483648&&(n=-2147483648),F(n=+n)&&(n=i?0:t.length-1),n<0&&(n=t.length+n),n>=t.length){if(i)return-1;n=t.length-1}else if(n<0){if(!i)return-1;n=0}if("string"==typeof r&&(r=e.from(r,o)),e.isBuffer(r))return 0===r.length?-1:d(t,r,n,o,i);if("number"==typeof r)return r&=255,"function"==typeof Uint8Array.prototype.indexOf?i?Uint8Array.prototype.indexOf.call(t,r,n):Uint8Array.prototype.lastIndexOf.call(t,r,n):d(t,[r],n,o,i);throw new TypeError("val must be string, number or Buffer")}function d(t,e,r,n,o){var i,u=1,s=t.length,a=e.length;if(void 0!==n&&("ucs2"===(n=String(n).toLowerCase())||"ucs-2"===n||"utf16le"===n||"utf-16le"===n)){if(t.length<2||e.length<2)return-1;u=2,s/=2,a/=2,r/=2}function f(t,e){return 1===u?t[e]:t.readUInt16BE(e*u)}if(o){var h=-1;for(i=r;is&&(r=s-a),i=r;i>=0;i--){for(var c=!0,l=0;lo&&(n=o):n=o;var i=e.length;n>i/2&&(n=i/2);for(var u=0;u>8,o=r%256,i.push(o),i.push(n);return i}(e,t.length-r),t,r,n)}function A(t,e,r){return 0===e&&r===t.length?n.fromByteArray(t):n.fromByteArray(t.slice(e,r))}function _(t,e,r){r=Math.min(t.length,r);for(var n=[],o=e;o239?4:f>223?3:f>191?2:1;if(o+c<=r)switch(c){case 1:f<128&&(h=f);break;case 2:128==(192&(i=t[o+1]))&&(a=(31&f)<<6|63&i)>127&&(h=a);break;case 3:i=t[o+1],u=t[o+2],128==(192&i)&&128==(192&u)&&(a=(15&f)<<12|(63&i)<<6|63&u)>2047&&(a<55296||a>57343)&&(h=a);break;case 4:i=t[o+1],u=t[o+2],s=t[o+3],128==(192&i)&&128==(192&u)&&128==(192&s)&&(a=(15&f)<<18|(63&i)<<12|(63&u)<<6|63&s)>65535&&a<1114112&&(h=a)}null===h?(h=65533,c=1):h>65535&&(h-=65536,n.push(h>>>10&1023|55296),h=56320|1023&h),n.push(h),o+=c}return function(t){var e=t.length;if(e<=4096)return String.fromCharCode.apply(String,t);var r="",n=0;for(;ne&&(t+=" ... "),""},e.prototype.compare=function(t,r,n,o,i){if(D(t,Uint8Array)&&(t=e.from(t,t.offset,t.byteLength)),!e.isBuffer(t))throw new TypeError('The "target" argument must be one of type Buffer or Uint8Array. Received type '+typeof t);if(void 0===r&&(r=0),void 0===n&&(n=t?t.length:0),void 0===o&&(o=0),void 0===i&&(i=this.length),r<0||n>t.length||o<0||i>this.length)throw new RangeError("out of range index");if(o>=i&&r>=n)return 0;if(o>=i)return-1;if(r>=n)return 1;if(this===t)return 0;for(var u=(i>>>=0)-(o>>>=0),s=(n>>>=0)-(r>>>=0),a=Math.min(u,s),f=this.slice(o,i),h=t.slice(r,n),c=0;c>>=0,isFinite(r)?(r>>>=0,void 0===n&&(n="utf8")):(n=r,r=void 0)}var o=this.length-e;if((void 0===r||r>o)&&(r=o),t.length>0&&(r<0||e<0)||e>this.length)throw new RangeError("Attempt to write outside buffer bounds");n||(n="utf8");for(var i=!1;;)switch(n){case"hex":return g(this,t,e,r);case"utf8":case"utf-8":return m(this,t,e,r);case"ascii":return v(this,t,e,r);case"latin1":case"binary":return w(this,t,e,r);case"base64":return b(this,t,e,r);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return E(this,t,e,r);default:if(i)throw new TypeError("Unknown encoding: "+n);n=(""+n).toLowerCase(),i=!0}},e.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};function T(t,e,r){var n="";r=Math.min(t.length,r);for(var o=e;on)&&(r=n);for(var o="",i=e;ir)throw new RangeError("Trying to access beyond buffer length")}function U(t,r,n,o,i,u){if(!e.isBuffer(t))throw new TypeError('"buffer" argument must be a Buffer instance');if(r>i||rt.length)throw new RangeError("Index out of range")}function I(t,e,r,n,o,i){if(r+n>t.length)throw new RangeError("Index out of range");if(r<0)throw new RangeError("Index out of range")}function x(t,e,r,n,i){return e=+e,r>>>=0,i||I(t,0,r,4),o.write(t,e,r,n,23,4),r+4}function R(t,e,r,n,i){return e=+e,r>>>=0,i||I(t,0,r,8),o.write(t,e,r,n,52,8),r+8}e.prototype.slice=function(t,r){var n=this.length;(t=~~t)<0?(t+=n)<0&&(t=0):t>n&&(t=n),(r=void 0===r?n:~~r)<0?(r+=n)<0&&(r=0):r>n&&(r=n),r>>=0,e>>>=0,r||k(t,e,this.length);for(var n=this[t],o=1,i=0;++i>>=0,e>>>=0,r||k(t,e,this.length);for(var n=this[t+--e],o=1;e>0&&(o*=256);)n+=this[t+--e]*o;return n},e.prototype.readUInt8=function(t,e){return t>>>=0,e||k(t,1,this.length),this[t]},e.prototype.readUInt16LE=function(t,e){return t>>>=0,e||k(t,2,this.length),this[t]|this[t+1]<<8},e.prototype.readUInt16BE=function(t,e){return t>>>=0,e||k(t,2,this.length),this[t]<<8|this[t+1]},e.prototype.readUInt32LE=function(t,e){return t>>>=0,e||k(t,4,this.length),(this[t]|this[t+1]<<8|this[t+2]<<16)+16777216*this[t+3]},e.prototype.readUInt32BE=function(t,e){return t>>>=0,e||k(t,4,this.length),16777216*this[t]+(this[t+1]<<16|this[t+2]<<8|this[t+3])},e.prototype.readIntLE=function(t,e,r){t>>>=0,e>>>=0,r||k(t,e,this.length);for(var n=this[t],o=1,i=0;++i=(o*=128)&&(n-=Math.pow(2,8*e)),n},e.prototype.readIntBE=function(t,e,r){t>>>=0,e>>>=0,r||k(t,e,this.length);for(var n=e,o=1,i=this[t+--n];n>0&&(o*=256);)i+=this[t+--n]*o;return i>=(o*=128)&&(i-=Math.pow(2,8*e)),i},e.prototype.readInt8=function(t,e){return t>>>=0,e||k(t,1,this.length),128&this[t]?-1*(255-this[t]+1):this[t]},e.prototype.readInt16LE=function(t,e){t>>>=0,e||k(t,2,this.length);var r=this[t]|this[t+1]<<8;return 32768&r?4294901760|r:r},e.prototype.readInt16BE=function(t,e){t>>>=0,e||k(t,2,this.length);var r=this[t+1]|this[t]<<8;return 32768&r?4294901760|r:r},e.prototype.readInt32LE=function(t,e){return t>>>=0,e||k(t,4,this.length),this[t]|this[t+1]<<8|this[t+2]<<16|this[t+3]<<24},e.prototype.readInt32BE=function(t,e){return t>>>=0,e||k(t,4,this.length),this[t]<<24|this[t+1]<<16|this[t+2]<<8|this[t+3]},e.prototype.readFloatLE=function(t,e){return t>>>=0,e||k(t,4,this.length),o.read(this,t,!0,23,4)},e.prototype.readFloatBE=function(t,e){return t>>>=0,e||k(t,4,this.length),o.read(this,t,!1,23,4)},e.prototype.readDoubleLE=function(t,e){return t>>>=0,e||k(t,8,this.length),o.read(this,t,!0,52,8)},e.prototype.readDoubleBE=function(t,e){return t>>>=0,e||k(t,8,this.length),o.read(this,t,!1,52,8)},e.prototype.writeUIntLE=function(t,e,r,n){(t=+t,e>>>=0,r>>>=0,n)||U(this,t,e,r,Math.pow(2,8*r)-1,0);var o=1,i=0;for(this[e]=255&t;++i>>=0,r>>>=0,n)||U(this,t,e,r,Math.pow(2,8*r)-1,0);var o=r-1,i=1;for(this[e+o]=255&t;--o>=0&&(i*=256);)this[e+o]=t/i&255;return e+r},e.prototype.writeUInt8=function(t,e,r){return t=+t,e>>>=0,r||U(this,t,e,1,255,0),this[e]=255&t,e+1},e.prototype.writeUInt16LE=function(t,e,r){return t=+t,e>>>=0,r||U(this,t,e,2,65535,0),this[e]=255&t,this[e+1]=t>>>8,e+2},e.prototype.writeUInt16BE=function(t,e,r){return t=+t,e>>>=0,r||U(this,t,e,2,65535,0),this[e]=t>>>8,this[e+1]=255&t,e+2},e.prototype.writeUInt32LE=function(t,e,r){return t=+t,e>>>=0,r||U(this,t,e,4,4294967295,0),this[e+3]=t>>>24,this[e+2]=t>>>16,this[e+1]=t>>>8,this[e]=255&t,e+4},e.prototype.writeUInt32BE=function(t,e,r){return t=+t,e>>>=0,r||U(this,t,e,4,4294967295,0),this[e]=t>>>24,this[e+1]=t>>>16,this[e+2]=t>>>8,this[e+3]=255&t,e+4},e.prototype.writeIntLE=function(t,e,r,n){if(t=+t,e>>>=0,!n){var o=Math.pow(2,8*r-1);U(this,t,e,r,o-1,-o)}var i=0,u=1,s=0;for(this[e]=255&t;++i>0)-s&255;return e+r},e.prototype.writeIntBE=function(t,e,r,n){if(t=+t,e>>>=0,!n){var o=Math.pow(2,8*r-1);U(this,t,e,r,o-1,-o)}var i=r-1,u=1,s=0;for(this[e+i]=255&t;--i>=0&&(u*=256);)t<0&&0===s&&0!==this[e+i+1]&&(s=1),this[e+i]=(t/u>>0)-s&255;return e+r},e.prototype.writeInt8=function(t,e,r){return t=+t,e>>>=0,r||U(this,t,e,1,127,-128),t<0&&(t=255+t+1),this[e]=255&t,e+1},e.prototype.writeInt16LE=function(t,e,r){return t=+t,e>>>=0,r||U(this,t,e,2,32767,-32768),this[e]=255&t,this[e+1]=t>>>8,e+2},e.prototype.writeInt16BE=function(t,e,r){return t=+t,e>>>=0,r||U(this,t,e,2,32767,-32768),this[e]=t>>>8,this[e+1]=255&t,e+2},e.prototype.writeInt32LE=function(t,e,r){return t=+t,e>>>=0,r||U(this,t,e,4,2147483647,-2147483648),this[e]=255&t,this[e+1]=t>>>8,this[e+2]=t>>>16,this[e+3]=t>>>24,e+4},e.prototype.writeInt32BE=function(t,e,r){return t=+t,e>>>=0,r||U(this,t,e,4,2147483647,-2147483648),t<0&&(t=4294967295+t+1),this[e]=t>>>24,this[e+1]=t>>>16,this[e+2]=t>>>8,this[e+3]=255&t,e+4},e.prototype.writeFloatLE=function(t,e,r){return x(this,t,e,!0,r)},e.prototype.writeFloatBE=function(t,e,r){return x(this,t,e,!1,r)},e.prototype.writeDoubleLE=function(t,e,r){return R(this,t,e,!0,r)},e.prototype.writeDoubleBE=function(t,e,r){return R(this,t,e,!1,r)},e.prototype.copy=function(t,r,n,o){if(!e.isBuffer(t))throw new TypeError("argument should be a Buffer");if(n||(n=0),o||0===o||(o=this.length),r>=t.length&&(r=t.length),r||(r=0),o>0&&o=this.length)throw new RangeError("Index out of range");if(o<0)throw new RangeError("sourceEnd out of bounds");o>this.length&&(o=this.length),t.length-r=0;--u)t[u+r]=this[u+n];else Uint8Array.prototype.set.call(t,this.subarray(n,o),r);return i},e.prototype.fill=function(t,r,n,o){if("string"==typeof t){if("string"==typeof r?(o=r,r=0,n=this.length):"string"==typeof n&&(o=n,n=this.length),void 0!==o&&"string"!=typeof o)throw new TypeError("encoding must be a string");if("string"==typeof o&&!e.isEncoding(o))throw new TypeError("Unknown encoding: "+o);if(1===t.length){var i=t.charCodeAt(0);("utf8"===o&&i<128||"latin1"===o)&&(t=i)}}else"number"==typeof t&&(t&=255);if(r<0||this.length>>=0,n=void 0===n?this.length:n>>>0,t||(t=0),"number"==typeof t)for(u=r;u55295&&r<57344){if(!o){if(r>56319){(e-=3)>-1&&i.push(239,191,189);continue}if(u+1===n){(e-=3)>-1&&i.push(239,191,189);continue}o=r;continue}if(r<56320){(e-=3)>-1&&i.push(239,191,189),o=r;continue}r=65536+(o-55296<<10|r-56320)}else o&&(e-=3)>-1&&i.push(239,191,189);if(o=null,r<128){if((e-=1)<0)break;i.push(r)}else if(r<2048){if((e-=2)<0)break;i.push(r>>6|192,63&r|128)}else if(r<65536){if((e-=3)<0)break;i.push(r>>12|224,r>>6&63|128,63&r|128)}else{if(!(r<1114112))throw new Error("Invalid code point");if((e-=4)<0)break;i.push(r>>18|240,r>>12&63|128,r>>6&63|128,63&r|128)}}return i}function N(t){return n.toByteArray(function(t){if((t=(t=t.split("=")[0]).trim().replace(L,"")).length<2)return"";for(;t.length%4!=0;)t+="=";return t}(t))}function j(t,e,r,n){for(var o=0;o=e.length||o>=t.length);++o)e[o+r]=t[o];return o}function D(t,e){return t instanceof e||null!=t&&null!=t.constructor&&null!=t.constructor.name&&t.constructor.name===e.name}function F(t){return t!=t}}).call(this,t("buffer").Buffer)},{"base64-js":2,buffer:3,ieee754:4}],4:[function(t,e,r){r.read=function(t,e,r,n,o){var i,u,s=8*o-n-1,a=(1<>1,h=-7,c=r?o-1:0,l=r?-1:1,p=t[e+c];for(c+=l,i=p&(1<<-h)-1,p>>=-h,h+=s;h>0;i=256*i+t[e+c],c+=l,h-=8);for(u=i&(1<<-h)-1,i>>=-h,h+=n;h>0;u=256*u+t[e+c],c+=l,h-=8);if(0===i)i=1-f;else{if(i===a)return u?NaN:1/0*(p?-1:1);u+=Math.pow(2,n),i-=f}return(p?-1:1)*u*Math.pow(2,i-n)},r.write=function(t,e,r,n,o,i){var u,s,a,f=8*i-o-1,h=(1<>1,l=23===o?Math.pow(2,-24)-Math.pow(2,-77):0,p=n?0:i-1,y=n?1:-1,d=e<0||0===e&&1/e<0?1:0;for(e=Math.abs(e),isNaN(e)||e===1/0?(s=isNaN(e)?1:0,u=h):(u=Math.floor(Math.log(e)/Math.LN2),e*(a=Math.pow(2,-u))<1&&(u--,a*=2),(e+=u+c>=1?l/a:l*Math.pow(2,1-c))*a>=2&&(u++,a/=2),u+c>=h?(s=0,u=h):u+c>=1?(s=(e*a-1)*Math.pow(2,o),u+=c):(s=e*Math.pow(2,c-1)*Math.pow(2,o),u=0));o>=8;t[r+p]=255&s,p+=y,s/=256,o-=8);for(u=u<0;t[r+p]=255&u,p+=y,u/=256,f-=8);t[r+p-y]|=128*d}},{}],5:[function(t,e,r){var n,o,i=e.exports={};function u(){throw new Error("setTimeout has not been defined")}function s(){throw new Error("clearTimeout has not been defined")}function a(t){if(n===setTimeout)return setTimeout(t,0);if((n===u||!n)&&setTimeout)return n=setTimeout,setTimeout(t,0);try{return n(t,0)}catch(e){try{return n.call(null,t,0)}catch(e){return n.call(this,t,0)}}}!function(){try{n="function"==typeof setTimeout?setTimeout:u}catch(t){n=u}try{o="function"==typeof clearTimeout?clearTimeout:s}catch(t){o=s}}();var f,h=[],c=!1,l=-1;function p(){c&&f&&(c=!1,f.length?h=f.concat(h):l=-1,h.length&&y())}function y(){if(!c){var t=a(p);c=!0;for(var e=h.length;e;){for(f=h,h=[];++l1)for(var r=1;r\n */\n\n'use strict';\n\nvar inherits = window.jsforce.require('inherits'),\n events = window.jsforce.require('events'),\n stream = window.jsforce.require('readable-stream'),\n _ = window.jsforce.require('lodash/core'),\n jsforce = window.jsforce.require('./core'),\n Promise = window.jsforce.require('./promise'),\n SOAP = window.jsforce.require('./soap');\n\n/*--------------------------------------------*/\n/**\n * Class for Salesforce Metadata API\n *\n * @class\n * @param {Connection} conn - Connection object\n */\nvar Metadata = module.exports = function(conn) {\n this._conn = conn;\n};\n\n\n/**\n * Polling interval in milliseconds\n * @type {Number}\n */\nMetadata.prototype.pollInterval = 1000;\n\n/**\n * Polling timeout in milliseconds\n * @type {Number}\n */\nMetadata.prototype.pollTimeout = 10000;\n\n\n/**\n * Call Metadata API SOAP endpoint\n *\n * @private\n */\nMetadata.prototype._invoke = function(method, message, callback) {\n var soapEndpoint = new SOAP(this._conn, {\n xmlns: \"http://soap.sforce.com/2006/04/metadata\",\n endpointUrl: this._conn.instanceUrl + \"/services/Soap/m/\" + this._conn.version\n });\n return soapEndpoint.invoke(method, message).then(function(res) {\n return res.result;\n }).thenCall(callback);\n};\n\n\n/**\n * @typedef {Object} Metadata~MetadataInfo\n * @prop {String} fullName - The name of the component\n */\n\n/**\n * Asynchronously adds one or more new metadata components to the organization.\n *\n * @param {String} type - The type of metadata to create\n * @param {Metadata~MetadataInfo|Array.} metadata - Metadata to create\n * @param {Callback.>} [callback] - Callback function\n * @returns {Metadata~AsyncResultLocator}\n */\nMetadata.prototype.createAsync = function(type, metadata, callback) {\n if (Number(this._conn.version) > 30) {\n throw new Error(\"Async metadata CRUD calls are not supported on ver 31.0 or later.\");\n }\n var convert = function(md) {\n md[\"@xsi:type\"] = type;\n return md;\n };\n var isArray = _.isArray(metadata);\n metadata = isArray ? _.map(metadata, convert) : convert(metadata);\n var res = this._invoke(\"create\", { metadata: metadata });\n return new AsyncResultLocator(this, res, isArray).thenCall(callback);\n};\n\n/**\n * @typedef {Object} Metadata~SaveResult\n * @prop {Boolean} success - True if metadata is successfully saved\n * @prop {String} fullName - Full name of metadata object\n */\n\n/**\n * @private\n */\nfunction convertToSaveResult(result) {\n var saveResult = _.clone(result);\n saveResult.success = saveResult.success === 'true';\n return saveResult;\n}\n\n/**\n * @typedef {Object} Metadata~UpsertResult\n * @prop {Boolean} success - True if metadata is successfully saved\n * @prop {String} fullName - Full name of metadata object\n * @prop {Boolean} created - True if metadata is newly created\n */\n\n/**\n * @private\n */\nfunction convertToUpsertResult(result) {\n var upsertResult = convertToSaveResult(result);\n upsertResult.created = upsertResult.created === 'true';\n return upsertResult;\n}\n\n/**\n * Synonym of Metadata#create().\n *\n * @method Metadata#createSync\n * @param {String} type - The type of metadata to create\n * @param {Metadata~MetadataInfo|Array.} metadata - Metadata to create\n * @param {Callback.>} [callback] - Callback function\n * @returns {Promise.>}\n */\n/**\n * Synchronously adds one or more new metadata components to the organization.\n *\n * @method Metadata#create\n * @param {String} type - The type of metadata to create\n * @param {Metadata~MetadataInfo|Array.} metadata - Metadata to create\n * @param {Callback.>} [callback] - Callback function\n * @returns {Promise.>}\n */\nMetadata.prototype.createSync =\nMetadata.prototype.create = function(type, metadata, callback) {\n var convert = function(md) {\n md[\"@xsi:type\"] = type;\n return md;\n };\n var isArray = _.isArray(metadata);\n metadata = isArray ? _.map(metadata, convert) : convert(metadata);\n return this._invoke(\"createMetadata\", { metadata: metadata }).then(function(results) {\n return _.isArray(results) ? _.map(results, convertToSaveResult) : convertToSaveResult(results);\n }).thenCall(callback);\n};\n\n/**\n * @private\n */\nfunction convertToMetadataInfo(rec) {\n var metadataInfo = _.clone(rec);\n delete metadataInfo.$;\n return metadataInfo;\n}\n\n/**\n * Synonym of Metadata#read()\n *\n * @method Metadata#readSync\n * @param {String} type - The type of metadata to read\n * @param {String|Array.} fullNames - full name(s) of metadata objects to read\n * @param {Callback.>} [callback] - Callback function\n * @returns {Promise.>>}\n */\n/**\n * Synchronously read specified metadata components in the organization.\n *\n * @method Metadata#read\n * @param {String} type - The type of metadata to read\n * @param {String|Array.} fullNames - full name(s) of metadata objects to read\n * @param {Callback.>} [callback] - Callback function\n * @returns {Promise.>>}\n */\nMetadata.prototype.readSync =\nMetadata.prototype.read = function(type, fullNames, callback) {\n return this._invoke(\"readMetadata\", { type: type, fullNames: fullNames }).then(function(res) {\n return _.isArray(res.records) ? _.map(res.records, convertToMetadataInfo) : convertToMetadataInfo(res.records);\n }).thenCall(callback);\n};\n\n/**\n * @typedef {Object} Metadata~UpdateMetadataInfo\n * @prop {String} currentName - The API name of the component or field before the update\n * @prop {Metadata~MetadataInfo} metadata - Full specification of the component or field you wish to update\n */\n\n/**\n * Asynchronously updates one or more metadata components in the organization.\n *\n * @param {String} type - The type of metadata to update\n * @param {Metadata~UpdateMetadataInfo|Array.} updateMetadata - Updating metadata\n * @param {Callback.>} [callback] - Callback function\n * @returns {Metadata~AsyncResultLocator}\n */\nMetadata.prototype.updateAsync = function(type, updateMetadata, callback) {\n if (Number(this._conn.version) > 30) {\n throw new Error(\"Async metadata CRUD calls are not supported on ver 31.0 or later.\");\n }\n var convert = function(umd) {\n umd.metadata[\"@xsi:type\"] = type;\n return umd;\n };\n var isArray = _.isArray(updateMetadata);\n updateMetadata = isArray ? _.map(updateMetadata, convert) : convert(updateMetadata);\n var res = this._invoke(\"update\", { updateMetadata: updateMetadata });\n return new AsyncResultLocator(this, res, isArray).thenCall(callback);\n};\n\n/**\n * Synonym of Metadata#update().\n *\n * @method Metadata#updateSync\n * @param {String} type - The type of metadata to update\n * @param {Metadata~MetadataInfo|Array.} updateMetadata - Updating metadata\n * @param {Callback.>} [callback] - Callback function\n * @returns {Promise.>}\n */\n/**\n * Synchronously updates one or more metadata components in the organization.\n *\n * @method Metadata#update\n * @param {String} type - The type of metadata to update\n * @param {Metadata~MetadataInfo|Array.} updateMetadata - Updating metadata\n * @param {Callback.>} [callback] - Callback function\n * @returns {Promise.>}\n */\nMetadata.prototype.updateSync =\nMetadata.prototype.update = function(type, metadata, callback) {\n var convert = function(md) {\n md[\"@xsi:type\"] = type;\n return md;\n };\n var isArray = _.isArray(metadata);\n metadata = isArray ? _.map(metadata, convert) : convert(metadata);\n return this._invoke(\"updateMetadata\", { metadata: metadata }).then(function(results) {\n return _.isArray(results) ? _.map(results, convertToSaveResult) : convertToSaveResult(results);\n }).thenCall(callback);\n};\n\n/**\n * Synonym of Metadata#upsert().\n *\n * @method Metadata#upsertSync\n * @param {String} type - The type of metadata to upsert\n * @param {Metadata~MetadataInfo|Array.} metadata - Upserting metadata\n * @param {Callback.>} [callback] - Callback function\n * @returns {Promise.>}\n */\n/**\n * Upserts one or more components in your organization's data.\n *\n * @method Metadata#upsert\n * @param {String} type - The type of metadata to upsert\n * @param {Metadata~MetadataInfo|Array.} metadata - Upserting metadata\n * @param {Callback.>} [callback] - Callback function\n * @returns {Promise.>}\n */\nMetadata.prototype.upsertSync =\nMetadata.prototype.upsert = function(type, metadata, callback) {\n var convert = function(md) {\n md[\"@xsi:type\"] = type;\n return md;\n };\n var isArray = _.isArray(metadata);\n metadata = isArray ? _.map(metadata, convert) : convert(metadata);\n return this._invoke(\"upsertMetadata\", { metadata: metadata }).then(function(results) {\n return _.isArray(results) ? _.map(results, convertToUpsertResult) : convertToUpsertResult(results);\n }).thenCall(callback);\n};\n\n/**\n * Asynchronously deletes specified metadata components in the organization.\n *\n * @param {String} type - The type of metadata to delete\n * @param {String|Metadata~MetadataInfo|Array.|Array.} metadata - The fullName of metadata or metadata info to delete. If it is passed in fullName, the type parameter should not be empty.\n * @param {Callback.>} [callback] - Callback function\n * @returns {Metadata~AsyncResultLocator}\n */\nMetadata.prototype.deleteAsync = function(type, metadata, callback) {\n if (Number(this._conn.version) > 30) {\n throw new Error(\"Async metadata CRUD calls are not supported on ver 31.0 or later.\");\n }\n var convert = function(md) {\n if (_.isString(md)) {\n md = { fullName : md };\n }\n md[\"@xsi:type\"] = type;\n return md;\n };\n var isArray = _.isArray(metadata);\n metadata = isArray ? _.map(metadata, convert) : convert(metadata);\n var res = this._invoke(\"delete\", { metadata: metadata });\n return new AsyncResultLocator(this, res, isArray).thenCall(callback);\n};\n\n/**\n * Synonym of Metadata#delete().\n *\n * @deprecated\n * @method Metadata#del\n * @param {String} [type] - The type of metadata to delete\n * @param {String|Metadata~MetadataInfo|Array.|Array.} metadata - The fullName of metadata or metadata info to delete. If it is passed in fullName, the type parameter should not be empty.\n * @param {Callback.>} [callback] - Callback function\n * @returns {Metadata~AsyncResultLocator}\n */\n/**\n * Synonym of Metadata#delete().\n *\n * @method Metadata#deleteSync\n * @param {String} type - The type of metadata to delete\n * @param {String|Array.} fullNames - The fullName of metadata to delete.\n * @param {Callback.>} [callback] - Callback function\n * @returns {Promise.>}\n */\n\n/**\n * Synchronously deletes specified metadata components in the organization.\n *\n * @method Metadata#delete\n * @param {String} type - The type of metadata to delete\n * @param {String|Array.} fullNames - The fullName of metadata to delete.\n * @param {Callback.>} [callback] - Callback function\n * @returns {Promise.>}\n */\nMetadata.prototype.del =\nMetadata.prototype.deleteSync =\nMetadata.prototype[\"delete\"] = function(type, fullNames, callback) {\n return this._invoke(\"deleteMetadata\", { type: type, fullNames: fullNames }).then(function(results) {\n return _.isArray(results) ? _.map(results, convertToSaveResult) : convertToSaveResult(results);\n }).thenCall(callback);\n};\n\n/**\n * Rename fullname of a metadata component in the organization\n *\n * @param {String} type - The type of metadata to delete\n * @param {String} oldFullName - The original fullName of metadata\n * @param {String} newFullName - The new fullName of metadata\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\nMetadata.prototype.rename = function(type, oldFullName, newFullName, callback) {\n return this._invoke(\"renameMetadata\", { type: type, oldFullName: oldFullName, newFullName: newFullName }).then(function(result) {\n return convertToSaveResult(result);\n }).thenCall(callback);\n};\n\n/**\n * Checks the status of asynchronous metadata calls\n *\n * @param {String|Array.} ids - The asynchronous process ID(s)\n * @param {Callback.>} [callback] - Callback function\n * @returns {Metadata~AsyncResultLocator}\n */\nMetadata.prototype.checkStatus = function(ids, callback) {\n var isArray = _.isArray(ids);\n var res = this._invoke(\"checkStatus\", { asyncProcessId: ids });\n return new AsyncResultLocator(this, res, isArray).thenCall(callback);\n};\n\n/**\n * @typedef {Object} Metadata~DescribeMetadataResult\n * @prop {Array.} metadataObjects - One or more metadata components and their attributes\n * @prop {Array.} metadataObjects.childXmlNames - List of child sub-components for this component\n * @prop {String} metadataObjects.directoryName - The name of the directory in the .zip file that contains this component\n * @prop {Boolean} metadataObjects.inFolder - Indicates whether the component is in a folder or not\n * @prop {Boolean} metadataObjects.metaFile - Indicates whether the component requires an accompanying metadata file\n * @prop {String} metadataObjects.suffix - The file suffix for this component\n * @prop {String} metadataObjects.xmlName - The name of the root element in the metadata file for this component\n * @prop {String} organizationNamespace - The namespace of the organization\n * @prop {Boolean} partialSaveAllowed - Indicates whether rollbackOnError is allowed or not\n * @prop {Boolean} testRequired - Indicates whether tests are required or not\n */\n\n/**\n * Retrieves the metadata which describes your organization, including Apex classes and triggers,\n * custom objects, custom fields on standard objects, tab sets that define an app,\n * and many other components.\n *\n * @param {String} [version] - The API version for which you want metadata; for example, 29.0\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\nMetadata.prototype.describe = function(version, callback) {\n if (!_.isString(version)) {\n callback = version;\n version = this._conn.version;\n }\n return this._invoke(\"describeMetadata\", { asOfVersion: version }).then(function(res) {\n res.metadataObjects = _.isArray(res.metadataObjects) ? res.metadataObjects : [ res.metadataObjects ];\n res.metadataObjects = _.map(res.metadataObjects, function(mo) {\n if (mo.childXmlNames) {\n mo.childXmlNames = _.isArray(mo.childXmlNames) ? mo.childXmlNames: [ mo.childXmlNames ];\n }\n mo.inFolder = mo.inFolder === 'true';\n mo.metaFile = mo.metaFile === 'true';\n return mo;\n });\n res.partialSaveAllowed = res.partialSaveAllowed === 'true';\n res.testRequired = res.testRequired === 'true';\n return res;\n }).thenCall(callback);\n};\n\n/**\n * @typedef {Object} Metadata~ListMetadataQuery\n * @prop {String} type - The metadata type, such as CustomObject, CustomField, or ApexClass\n * @prop {String} [folder] - The folder associated with the component.\n */\n\n/**\n * @typedef {Object} Metadata~FileProperties\n * @prop {String} type - The metadata type, such as CustomObject, CustomField, or ApexClass\n * @prop {String} createdById - ID of the user who created the file\n * @prop {String} createdByName - Name of the user who created the file\n * @prop {String} createdDate - Date and time when the file was created\n * @prop {String} fileName - Name of the file\n * @prop {String} fullName - The file developer name used as a unique identifier for API access\n * @prop {String} id - ID of the file\n * @prop {String} lastModifiedById - ID of the user who last modified the file\n * @prop {String} lastModifiedByName - Name of the user who last modified the file\n * @prop {String} lastModifiedDate - Date and time that the file was last modified\n * @prop {String} [manageableState] - Indicates the manageable state of the specified component if it is contained in a package\n * @prop {String} [namespacePrefix] - The namespace prefix of the component\n */\n\n/**\n * Retrieves property information about metadata components in your organization\n *\n * @param {Metadata~ListMetadataQuery|Array.} queries - The criteria object(s) specifing metadata to list\n * @param {String} [version] - The API version for which you want metadata; for example, 29.0\n * @param {Callback.>} [callback] - Callback function\n * @returns {Promise.>}\n */\nMetadata.prototype.list = function(queries, version, callback) {\n if (!_.isString(version)) {\n callback = version;\n version = this._conn.version;\n }\n if (!_.isArray(queries)) {\n queries = [ queries ];\n }\n return this._invoke(\"listMetadata\", { queries: queries, asOfVersion: version }, callback);\n};\n\n/**\n * @typedef {Object} Metadata~RetrieveRequest\n */\n\n/**\n * Retrieves XML file representations of components in an organization\n *\n * @param {Metadata~RetrieveRequest} request - Options for determining which packages or files are retrieved\n * @param {Callback.} [callback] - Callback function\n * @returns {Metadata~RetrieveResultLocator}\n */\nMetadata.prototype.retrieve = function(request, callback) {\n var res = this._invoke(\"retrieve\", { request: request });\n return new RetrieveResultLocator(this, res).thenCall(callback);\n};\n\n/**\n * Checks the status of declarative metadata call retrieve() and returns the zip file contents\n *\n * @param {String} id - Async process id returned from previous retrieve request\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\nMetadata.prototype.checkRetrieveStatus = function(id, callback) {\n return this._invoke(\"checkRetrieveStatus\", { asyncProcessId: id }, callback);\n};\n\n/**\n * Deploy components into an organization using zipped file representations\n *\n * @param {stream.Stream|Buffer|String} zipInput - Zipped file input source in readable stream, binary buffer or Base64-encoded string\n * @param {Object} [options] - Options used in deployment\n * @param {Boolean} [options.allowMissingFiles] - Specifies whether a deploy succeeds even if files that are specified in package.xml but are not in the .zip file or not.\n * @param {Boolean} [options.autoUpdatePackage] - If a file is in the .zip file but not specified in package.xml, specifies whether the file should be automatically added to the package or not.\n * @param {Boolean} [options.checkOnly] - Indicates whether Apex classes and triggers are saved to the organization as part of the deployment (false) or not (true).\n * @param {Boolean} [options.ignoreWarnings] - Indicates whether a warning should allow a deployment to complete successfully (true) or not (false). Defaults to false.\n * @param {Boolean} [options.performRetrieve] - Indicates whether a retrieve() call is performed immediately after the deployment (true) or not (false).\n * @param {Boolean} [options.purgeOnDelete] - If true, the deleted components in the destructiveChanges.xml manifest file aren't stored in the Recycle Bin.\n * @param {Boolean} [options.rollbackOnError] - Indicates whether any failure causes a complete rollback (true) or not (false).\n * @param {Boolean} [options.runAllTests] - If true, all Apex tests defined in the organization are run.\n * @param {Array.} [options.runTests] - A list of Apex tests to be run during deployment.\n * @param {Boolean} [options.singlePackage] - Indicates whether the specified .zip file points to a directory structure with a single package (true) or a set of packages (false).\n * @param {Callback.} [callback] - Callback function\n * @returns {Metadata~DeployResultLocator}\n */\nMetadata.prototype.deploy = function(zipInput, options, callback) {\n if (!options || _.isFunction(options)) {\n callback = options;\n options = {};\n }\n var deferred = Promise.defer();\n if (_.isObject(zipInput) && _.isFunction(zipInput.pipe)) {\n var bufs = [];\n zipInput.on('data', function(d) {\n bufs.push(d);\n });\n zipInput.on('end', function() {\n deferred.resolve(Buffer.concat(bufs).toString('base64'));\n });\n // zipInput.resume();\n } else if (zipInput instanceof Buffer) {\n deferred.resolve(zipInput.toString('base64'));\n } else if (zipInput instanceof String || typeof zipInput === 'string') {\n deferred.resolve(zipInput);\n } else {\n throw \"Unexpected zipInput type\";\n }\n\n var self = this;\n var res = deferred.promise.then(function(zipContentB64) {\n return self._invoke(\"deploy\", {\n ZipFile: zipContentB64,\n DeployOptions: options\n }, callback);\n });\n return new DeployResultLocator(this, res).thenCall(callback);\n};\n\n/**\n * Checks the status of declarative metadata call deploy()\n *\n * @param {String} id - Async process id returned from previous deploy request\n * @param {Boolean} [includeDetails] - Sets the DeployResult object to include details information (default: false)\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\nMetadata.prototype.checkDeployStatus = function(id, includeDetails, callback) {\n if (_.isObject(includeDetails) || _.isBoolean(includeDetails)) {\n includeDetails = !!includeDetails;\n } else {\n callback = includeDetails;\n includeDetails = false;\n }\n return this._invoke(\"checkDeployStatus\", {\n asyncProcessId: id,\n includeDetails : includeDetails\n }).then(function(res) {\n res.done = res.done === 'true';\n res.success = res.success === 'true';\n res.checkOnly = res.checkOnly === 'true';\n res.runTestsEnabled = res.runTestsEnabled === 'true';\n if (res.ignoreWarnings) {\n res.ignoreWarnings = res.ignoreWarnings === 'true';\n }\n if (res.rollbackOnError) {\n res.rollbackOnError = res.rollbackOnError === 'true';\n }\n res.numberComponentErrors = Number(res.numberComponentErrors);\n res.numberComponentsDeployed = Number(res.numberComponentsDeployed);\n res.numberComponentsTotal = Number(res.numberComponentsTotal);\n res.numberTestErrors = Number(res.numberTestErrors);\n res.numberTestsCompleted = Number(res.numberTestsCompleted);\n res.numberTestsTotal = Number(res.numberTestsTotal);\n\n return res;\n }).thenCall(callback);\n};\n\n\n/*--------------------------------------------*/\n\n/**\n * @typedef {Object} Metadata~AsyncResult\n * @prop {Boolean} done - Indicates whether the call has completed or not\n * @prop {String} id - ID of the component being created, updated, deleted, deployed, or retrieved\n * @prop {String} state - The state four possible values: Queued, InProgress, Completed, and Error.\n * @prop {String} [statusCode] - If an error occurred during the create(), update(), or delete() call, a status code is returned\n * @prop {String} [message] - Message corresponding to the statusCode field returned\n */\n\n/**\n * The locator class for Metadata API asynchronous call result\n *\n * @protected\n * @class Metadata~AsyncResultLocator\n * @extends events.EventEmitter\n * @implements Promise.>\n * @param {Metadata} meta - Metadata API object\n * @param {Promise.>} results - Promise object for async result info\n * @param {Boolean} [isArray] - Indicates whether the async request is given in array or single object\n */\nvar AsyncResultLocator = function(meta, results, isArray) {\n this._meta = meta;\n this._results = results;\n this._isArray = isArray;\n};\n\ninherits(AsyncResultLocator, events.EventEmitter);\n\n/**\n * Promise/A+ interface\n * http://promises-aplus.github.io/promises-spec/\n *\n * Delegate to deferred promise, return promise instance for batch result\n *\n * @method Metadata~AsyncResultLocator#then\n */\nAsyncResultLocator.prototype.then = function(onResolve, onReject) {\n var self = this;\n return this._results.then(function(results) {\n var convertType = function(res) {\n if (res.$ && res.$[\"xsi:nil\"] === 'true') {\n return null;\n }\n res.done = res.done === 'true';\n return res;\n };\n results = _.isArray(results) ? _.map(results, convertType) : convertType(results);\n if (self._isArray && !_.isArray(results)) {\n results = [ results ];\n }\n return onResolve(results);\n }, onReject);\n};\n\n/**\n * Promise/A+ extension\n * Call \"then\" using given node-style callback function\n *\n * @method Metadata~AsyncResultLocator#thenCall\n */\nAsyncResultLocator.prototype.thenCall = function(callback) {\n return _.isFunction(callback) ? this.then(function(res) {\n process.nextTick(function() {\n callback(null, res);\n });\n }, function(err) {\n process.nextTick(function() {\n callback(err);\n });\n }) : this;\n};\n\n/**\n * Check the status of async request\n *\n * @method Metadata~AsyncResultLocator#check\n * @param {Callback.>} [callback] - Callback function\n * @returns {Promise.>}\n */\nAsyncResultLocator.prototype.check = function(callback) {\n var self = this;\n var meta = this._meta;\n return this.then(function(results) {\n var ids = _.isArray(results) ? _.map(results, function(res){ return res.id; }) : results.id;\n self._ids = ids;\n return meta.checkStatus(ids);\n }).thenCall(callback);\n};\n\n/**\n * Polling until async call status becomes complete or error\n *\n * @method Metadata~AsyncResultLocator#poll\n * @param {Number} interval - Polling interval in milliseconds\n * @param {Number} timeout - Polling timeout in milliseconds\n */\nAsyncResultLocator.prototype.poll = function(interval, timeout) {\n var self = this;\n var startTime = new Date().getTime();\n var poll = function() {\n var now = new Date().getTime();\n if (startTime + timeout < now) {\n var errMsg = \"Polling time out.\";\n if (self._ids) {\n errMsg += \" Process Id = \" + self._ids;\n }\n self.emit('error', new Error(errMsg));\n return;\n }\n self.check().then(function(results) {\n var done = true;\n var resultArr = _.isArray(results) ? results : [ results ];\n for (var i=0, len=resultArr.length; i>} [callback] - Callback function\n * @returns {Promise.>}\n */\nAsyncResultLocator.prototype.complete = function(callback) {\n var deferred = Promise.defer();\n this.on('complete', function(results) {\n deferred.resolve(results);\n });\n this.on('error', function(err) {\n deferred.reject(err);\n });\n var meta = this._meta;\n this.poll(meta.pollInterval, meta.pollTimeout);\n return deferred.promise.thenCall(callback);\n};\n\n/*--------------------------------------------*/\n/**\n * The locator class to track retreive() Metadata API call result\n *\n * @protected\n * @class Metadata~RetrieveResultLocator\n * @extends Metadata~AsyncResultLocator\n * @param {Metadata} meta - Metadata API object\n * @param {Promise.} result - Promise object for async result of retrieve call()\n */\nvar RetrieveResultLocator = function(meta, result) {\n RetrieveResultLocator.super_.call(this, meta, result);\n};\n\ninherits(RetrieveResultLocator, AsyncResultLocator);\n\n/**\n * @typedef {Object} Metadata~RetrieveResult\n * @prop {Array.} fileProperties - Contains information about the properties of each component in the .zip file, and the manifest file package.xml\n * @prop {String} id - ID of the component being retrieved\n * @prop {Array.} messages - Contains information about the success or failure of the retrieve() call\n * @prop {String} zipFile - The zip file returned by the retrieve request. Base 64-encoded binary data\n */\n\n/**\n * Check and wait until the async request becomes in completed status,\n * and retrieve the result data.\n *\n * @memthod Metadata~RetrieveResultLocator#complete\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\nRetrieveResultLocator.prototype.complete = function(callback) {\n var meta = this._meta;\n return RetrieveResultLocator.super_.prototype.complete.call(this).then(function(result) {\n return meta.checkRetrieveStatus(result.id);\n }).thenCall(callback);\n};\n\n/**\n * Change the retrieved result to Node.js readable stream\n *\n * @method Metadata~RetrieveResultLocator#stream\n * @returns {stream.Readable}\n */\nRetrieveResultLocator.prototype.stream = function() {\n var self = this;\n var resultStream = new stream.Readable();\n var reading = false;\n resultStream._read = function() {\n if (reading) { return; }\n reading = true;\n self.complete(function(err, result) {\n if (err) {\n resultStream.emit('error', err);\n } else {\n resultStream.push(new Buffer(result.zipFile, 'base64'));\n resultStream.push(null);\n }\n });\n };\n return resultStream;\n};\n\n/*--------------------------------------------*/\n/**\n * The locator class to track deploy() Metadata API call result\n *\n * @protected\n * @class Metadata~DeployResultLocator\n * @extends Metadata~AsyncResultLocator\n * @param {Metadata} meta - Metadata API object\n * @param {Promise.} result - Promise object for async result of deploy() call\n */\nvar DeployResultLocator = function(meta, result) {\n DeployResultLocator.super_.call(this, meta, result);\n};\n\ninherits(DeployResultLocator, AsyncResultLocator);\n\n/**\n * @typedef {Object} Metadata~DeployResult\n * @prop {String} id - ID of the component being deployed\n * @prop {Boolean} checkOnly - Indicates whether this deployment is being used to check the validity of the deployed files without making any changes in the organization or not\n * @prop {String} completedDate - Timestamp for when the deployment process ended\n * @prop {String} createdDate - Timestamp for when the deploy() call was received\n * @prop {Array.} [details] - Provides the details of a deployment that is in-progress or ended, if includeDetails is set to true in checkDeployStatus() call\n * @prop {Boolean} done - Indicates whether the server finished processing the deploy() call for the specified id\n * @prop {String} [errorMessage] - Message corresponding to the values in the errorStatusCode field\n * @prop {String} [errorStatusCode] - If an error occurred during the deploy() call, a status code is returned, and the message corresponding to the status code is returned in the errorMessagefield\n * @prop {Boolean} [ignoreWarnings] - Specifies whether a deployment should continue even if the deployment generates warnings\n * @prop {String} lastModifiedDate - Timestamp of the last update for the deployment process\n * @prop {Number} numberComponentErrors - The number of components that generated errors during this deployment\n * @prop {Number} numberComponentsDeployed - The number of components deployed in the deployment process\n * @prop {Number} numberComponentsTotal - The total number of components in the deployment\n * @prop {Number} numberTestErrors - The number of Apex tests that have generated errors during this deployment\n * @prop {Number} numberTestsCompleted - The number of completedApex tests for this deployment\n * @prop {Number} numberTestsTotal - The total number of Apex tests for this deployment\n * @prop {Boolean} [rollbackOnError] - Indicates whether any failure causes a complete rollback or not. Default is true.\n * @prop {String} startDate - Timestamp for when the deployment process began\n * @prop {String} status - Indicates the current state of the deployment\n * @prop {Boolean} success - Indicates whether the deployment was successful or not\n */\n\n/**\n * Check and wait until the async request becomes in completed status,\n * and retrieve the result data.\n *\n * @method Metadata~DeployResultLocator#complete\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\nDeployResultLocator.prototype.complete = function(includeDetails, callback) {\n if (_.isFunction(includeDetails)) {\n callback = includeDetails;\n includeDetails = false;\n }\n var meta = this._meta;\n return DeployResultLocator.super_.prototype.complete.call(this).then(function(result) {\n return meta.checkDeployStatus(result.id, includeDetails);\n }).thenCall(callback);\n};\n\n\n/*--------------------------------------------*/\n/*\n * Register hook in connection instantiation for dynamically adding this API module features\n */\njsforce.on('connection:new', function(conn) {\n conn.metadata = new Metadata(conn);\n});\n\n}).call(this,require('_process'),require(\"buffer\").Buffer)\n\n},{\"_process\":5,\"buffer\":3}],2:[function(require,module,exports){\n'use strict'\n\nexports.byteLength = byteLength\nexports.toByteArray = toByteArray\nexports.fromByteArray = fromByteArray\n\nvar lookup = []\nvar revLookup = []\nvar Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array\n\nvar code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'\nfor (var i = 0, len = code.length; i < len; ++i) {\n lookup[i] = code[i]\n revLookup[code.charCodeAt(i)] = i\n}\n\n// Support decoding URL-safe base64 strings, as Node.js does.\n// See: https://en.wikipedia.org/wiki/Base64#URL_applications\nrevLookup['-'.charCodeAt(0)] = 62\nrevLookup['_'.charCodeAt(0)] = 63\n\nfunction getLens (b64) {\n var len = b64.length\n\n if (len % 4 > 0) {\n throw new Error('Invalid string. Length must be a multiple of 4')\n }\n\n // Trim off extra bytes after placeholder bytes are found\n // See: https://github.com/beatgammit/base64-js/issues/42\n var validLen = b64.indexOf('=')\n if (validLen === -1) validLen = len\n\n var placeHoldersLen = validLen === len\n ? 0\n : 4 - (validLen % 4)\n\n return [validLen, placeHoldersLen]\n}\n\n// base64 is 4/3 + up to two characters of the original data\nfunction byteLength (b64) {\n var lens = getLens(b64)\n var validLen = lens[0]\n var placeHoldersLen = lens[1]\n return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction _byteLength (b64, validLen, placeHoldersLen) {\n return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction toByteArray (b64) {\n var tmp\n var lens = getLens(b64)\n var validLen = lens[0]\n var placeHoldersLen = lens[1]\n\n var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen))\n\n var curByte = 0\n\n // if there are placeholders, only get up to the last complete 4 chars\n var len = placeHoldersLen > 0\n ? validLen - 4\n : validLen\n\n for (var i = 0; i < len; i += 4) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 18) |\n (revLookup[b64.charCodeAt(i + 1)] << 12) |\n (revLookup[b64.charCodeAt(i + 2)] << 6) |\n revLookup[b64.charCodeAt(i + 3)]\n arr[curByte++] = (tmp >> 16) & 0xFF\n arr[curByte++] = (tmp >> 8) & 0xFF\n arr[curByte++] = tmp & 0xFF\n }\n\n if (placeHoldersLen === 2) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 2) |\n (revLookup[b64.charCodeAt(i + 1)] >> 4)\n arr[curByte++] = tmp & 0xFF\n }\n\n if (placeHoldersLen === 1) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 10) |\n (revLookup[b64.charCodeAt(i + 1)] << 4) |\n (revLookup[b64.charCodeAt(i + 2)] >> 2)\n arr[curByte++] = (tmp >> 8) & 0xFF\n arr[curByte++] = tmp & 0xFF\n }\n\n return arr\n}\n\nfunction tripletToBase64 (num) {\n return lookup[num >> 18 & 0x3F] +\n lookup[num >> 12 & 0x3F] +\n lookup[num >> 6 & 0x3F] +\n lookup[num & 0x3F]\n}\n\nfunction encodeChunk (uint8, start, end) {\n var tmp\n var output = []\n for (var i = start; i < end; i += 3) {\n tmp =\n ((uint8[i] << 16) & 0xFF0000) +\n ((uint8[i + 1] << 8) & 0xFF00) +\n (uint8[i + 2] & 0xFF)\n output.push(tripletToBase64(tmp))\n }\n return output.join('')\n}\n\nfunction fromByteArray (uint8) {\n var tmp\n var len = uint8.length\n var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes\n var parts = []\n var maxChunkLength = 16383 // must be multiple of 3\n\n // go through the array every three bytes, we'll deal with trailing stuff later\n for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {\n parts.push(encodeChunk(\n uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)\n ))\n }\n\n // pad the end with zeros, but make sure to not forget the extra bytes\n if (extraBytes === 1) {\n tmp = uint8[len - 1]\n parts.push(\n lookup[tmp >> 2] +\n lookup[(tmp << 4) & 0x3F] +\n '=='\n )\n } else if (extraBytes === 2) {\n tmp = (uint8[len - 2] << 8) + uint8[len - 1]\n parts.push(\n lookup[tmp >> 10] +\n lookup[(tmp >> 4) & 0x3F] +\n lookup[(tmp << 2) & 0x3F] +\n '='\n )\n }\n\n return parts.join('')\n}\n\n},{}],3:[function(require,module,exports){\n/*!\n * The buffer module from node.js, for the browser.\n *\n * @author Feross Aboukhadijeh \n * @license MIT\n */\n/* eslint-disable no-proto */\n\n'use strict'\n\nvar base64 = require('base64-js')\nvar ieee754 = require('ieee754')\n\nexports.Buffer = Buffer\nexports.SlowBuffer = SlowBuffer\nexports.INSPECT_MAX_BYTES = 50\n\nvar K_MAX_LENGTH = 0x7fffffff\nexports.kMaxLength = K_MAX_LENGTH\n\n/**\n * If `Buffer.TYPED_ARRAY_SUPPORT`:\n * === true Use Uint8Array implementation (fastest)\n * === false Print warning and recommend using `buffer` v4.x which has an Object\n * implementation (most compatible, even IE6)\n *\n * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+,\n * Opera 11.6+, iOS 4.2+.\n *\n * We report that the browser does not support typed arrays if the are not subclassable\n * using __proto__. Firefox 4-29 lacks support for adding new properties to `Uint8Array`\n * (See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438). IE 10 lacks support\n * for __proto__ and has a buggy typed array implementation.\n */\nBuffer.TYPED_ARRAY_SUPPORT = typedArraySupport()\n\nif (!Buffer.TYPED_ARRAY_SUPPORT && typeof console !== 'undefined' &&\n typeof console.error === 'function') {\n console.error(\n 'This browser lacks typed array (Uint8Array) support which is required by ' +\n '`buffer` v5.x. Use `buffer` v4.x if you require old browser support.'\n )\n}\n\nfunction typedArraySupport () {\n // Can typed array instances can be augmented?\n try {\n var arr = new Uint8Array(1)\n arr.__proto__ = {__proto__: Uint8Array.prototype, foo: function () { return 42 }}\n return arr.foo() === 42\n } catch (e) {\n return false\n }\n}\n\nObject.defineProperty(Buffer.prototype, 'parent', {\n get: function () {\n if (!(this instanceof Buffer)) {\n return undefined\n }\n return this.buffer\n }\n})\n\nObject.defineProperty(Buffer.prototype, 'offset', {\n get: function () {\n if (!(this instanceof Buffer)) {\n return undefined\n }\n return this.byteOffset\n }\n})\n\nfunction createBuffer (length) {\n if (length > K_MAX_LENGTH) {\n throw new RangeError('Invalid typed array length')\n }\n // Return an augmented `Uint8Array` instance\n var buf = new Uint8Array(length)\n buf.__proto__ = Buffer.prototype\n return buf\n}\n\n/**\n * The Buffer constructor returns instances of `Uint8Array` that have their\n * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of\n * `Uint8Array`, so the returned instances will have all the node `Buffer` methods\n * and the `Uint8Array` methods. Square bracket notation works as expected -- it\n * returns a single octet.\n *\n * The `Uint8Array` prototype remains unmodified.\n */\n\nfunction Buffer (arg, encodingOrOffset, length) {\n // Common case.\n if (typeof arg === 'number') {\n if (typeof encodingOrOffset === 'string') {\n throw new Error(\n 'If encoding is specified then the first argument must be a string'\n )\n }\n return allocUnsafe(arg)\n }\n return from(arg, encodingOrOffset, length)\n}\n\n// Fix subarray() in ES2016. See: https://github.com/feross/buffer/pull/97\nif (typeof Symbol !== 'undefined' && Symbol.species &&\n Buffer[Symbol.species] === Buffer) {\n Object.defineProperty(Buffer, Symbol.species, {\n value: null,\n configurable: true,\n enumerable: false,\n writable: false\n })\n}\n\nBuffer.poolSize = 8192 // not used by this implementation\n\nfunction from (value, encodingOrOffset, length) {\n if (typeof value === 'number') {\n throw new TypeError('\"value\" argument must not be a number')\n }\n\n if (isArrayBuffer(value) || (value && isArrayBuffer(value.buffer))) {\n return fromArrayBuffer(value, encodingOrOffset, length)\n }\n\n if (typeof value === 'string') {\n return fromString(value, encodingOrOffset)\n }\n\n return fromObject(value)\n}\n\n/**\n * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError\n * if value is a number.\n * Buffer.from(str[, encoding])\n * Buffer.from(array)\n * Buffer.from(buffer)\n * Buffer.from(arrayBuffer[, byteOffset[, length]])\n **/\nBuffer.from = function (value, encodingOrOffset, length) {\n return from(value, encodingOrOffset, length)\n}\n\n// Note: Change prototype *after* Buffer.from is defined to workaround Chrome bug:\n// https://github.com/feross/buffer/pull/148\nBuffer.prototype.__proto__ = Uint8Array.prototype\nBuffer.__proto__ = Uint8Array\n\nfunction assertSize (size) {\n if (typeof size !== 'number') {\n throw new TypeError('\"size\" argument must be of type number')\n } else if (size < 0) {\n throw new RangeError('\"size\" argument must not be negative')\n }\n}\n\nfunction alloc (size, fill, encoding) {\n assertSize(size)\n if (size <= 0) {\n return createBuffer(size)\n }\n if (fill !== undefined) {\n // Only pay attention to encoding if it's a string. This\n // prevents accidentally sending in a number that would\n // be interpretted as a start offset.\n return typeof encoding === 'string'\n ? createBuffer(size).fill(fill, encoding)\n : createBuffer(size).fill(fill)\n }\n return createBuffer(size)\n}\n\n/**\n * Creates a new filled Buffer instance.\n * alloc(size[, fill[, encoding]])\n **/\nBuffer.alloc = function (size, fill, encoding) {\n return alloc(size, fill, encoding)\n}\n\nfunction allocUnsafe (size) {\n assertSize(size)\n return createBuffer(size < 0 ? 0 : checked(size) | 0)\n}\n\n/**\n * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance.\n * */\nBuffer.allocUnsafe = function (size) {\n return allocUnsafe(size)\n}\n/**\n * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance.\n */\nBuffer.allocUnsafeSlow = function (size) {\n return allocUnsafe(size)\n}\n\nfunction fromString (string, encoding) {\n if (typeof encoding !== 'string' || encoding === '') {\n encoding = 'utf8'\n }\n\n if (!Buffer.isEncoding(encoding)) {\n throw new TypeError('Unknown encoding: ' + encoding)\n }\n\n var length = byteLength(string, encoding) | 0\n var buf = createBuffer(length)\n\n var actual = buf.write(string, encoding)\n\n if (actual !== length) {\n // Writing a hex string, for example, that contains invalid characters will\n // cause everything after the first invalid character to be ignored. (e.g.\n // 'abxxcd' will be treated as 'ab')\n buf = buf.slice(0, actual)\n }\n\n return buf\n}\n\nfunction fromArrayLike (array) {\n var length = array.length < 0 ? 0 : checked(array.length) | 0\n var buf = createBuffer(length)\n for (var i = 0; i < length; i += 1) {\n buf[i] = array[i] & 255\n }\n return buf\n}\n\nfunction fromArrayBuffer (array, byteOffset, length) {\n if (byteOffset < 0 || array.byteLength < byteOffset) {\n throw new RangeError('\"offset\" is outside of buffer bounds')\n }\n\n if (array.byteLength < byteOffset + (length || 0)) {\n throw new RangeError('\"length\" is outside of buffer bounds')\n }\n\n var buf\n if (byteOffset === undefined && length === undefined) {\n buf = new Uint8Array(array)\n } else if (length === undefined) {\n buf = new Uint8Array(array, byteOffset)\n } else {\n buf = new Uint8Array(array, byteOffset, length)\n }\n\n // Return an augmented `Uint8Array` instance\n buf.__proto__ = Buffer.prototype\n return buf\n}\n\nfunction fromObject (obj) {\n if (Buffer.isBuffer(obj)) {\n var len = checked(obj.length) | 0\n var buf = createBuffer(len)\n\n if (buf.length === 0) {\n return buf\n }\n\n obj.copy(buf, 0, 0, len)\n return buf\n }\n\n if (obj) {\n if (ArrayBuffer.isView(obj) || 'length' in obj) {\n if (typeof obj.length !== 'number' || numberIsNaN(obj.length)) {\n return createBuffer(0)\n }\n return fromArrayLike(obj)\n }\n\n if (obj.type === 'Buffer' && Array.isArray(obj.data)) {\n return fromArrayLike(obj.data)\n }\n }\n\n throw new TypeError('The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object.')\n}\n\nfunction checked (length) {\n // Note: cannot use `length < K_MAX_LENGTH` here because that fails when\n // length is NaN (which is otherwise coerced to zero.)\n if (length >= K_MAX_LENGTH) {\n throw new RangeError('Attempt to allocate Buffer larger than maximum ' +\n 'size: 0x' + K_MAX_LENGTH.toString(16) + ' bytes')\n }\n return length | 0\n}\n\nfunction SlowBuffer (length) {\n if (+length != length) { // eslint-disable-line eqeqeq\n length = 0\n }\n return Buffer.alloc(+length)\n}\n\nBuffer.isBuffer = function isBuffer (b) {\n return b != null && b._isBuffer === true\n}\n\nBuffer.compare = function compare (a, b) {\n if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) {\n throw new TypeError('Arguments must be Buffers')\n }\n\n if (a === b) return 0\n\n var x = a.length\n var y = b.length\n\n for (var i = 0, len = Math.min(x, y); i < len; ++i) {\n if (a[i] !== b[i]) {\n x = a[i]\n y = b[i]\n break\n }\n }\n\n if (x < y) return -1\n if (y < x) return 1\n return 0\n}\n\nBuffer.isEncoding = function isEncoding (encoding) {\n switch (String(encoding).toLowerCase()) {\n case 'hex':\n case 'utf8':\n case 'utf-8':\n case 'ascii':\n case 'latin1':\n case 'binary':\n case 'base64':\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return true\n default:\n return false\n }\n}\n\nBuffer.concat = function concat (list, length) {\n if (!Array.isArray(list)) {\n throw new TypeError('\"list\" argument must be an Array of Buffers')\n }\n\n if (list.length === 0) {\n return Buffer.alloc(0)\n }\n\n var i\n if (length === undefined) {\n length = 0\n for (i = 0; i < list.length; ++i) {\n length += list[i].length\n }\n }\n\n var buffer = Buffer.allocUnsafe(length)\n var pos = 0\n for (i = 0; i < list.length; ++i) {\n var buf = list[i]\n if (ArrayBuffer.isView(buf)) {\n buf = Buffer.from(buf)\n }\n if (!Buffer.isBuffer(buf)) {\n throw new TypeError('\"list\" argument must be an Array of Buffers')\n }\n buf.copy(buffer, pos)\n pos += buf.length\n }\n return buffer\n}\n\nfunction byteLength (string, encoding) {\n if (Buffer.isBuffer(string)) {\n return string.length\n }\n if (ArrayBuffer.isView(string) || isArrayBuffer(string)) {\n return string.byteLength\n }\n if (typeof string !== 'string') {\n string = '' + string\n }\n\n var len = string.length\n if (len === 0) return 0\n\n // Use a for loop to avoid recursion\n var loweredCase = false\n for (;;) {\n switch (encoding) {\n case 'ascii':\n case 'latin1':\n case 'binary':\n return len\n case 'utf8':\n case 'utf-8':\n case undefined:\n return utf8ToBytes(string).length\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return len * 2\n case 'hex':\n return len >>> 1\n case 'base64':\n return base64ToBytes(string).length\n default:\n if (loweredCase) return utf8ToBytes(string).length // assume utf8\n encoding = ('' + encoding).toLowerCase()\n loweredCase = true\n }\n }\n}\nBuffer.byteLength = byteLength\n\nfunction slowToString (encoding, start, end) {\n var loweredCase = false\n\n // No need to verify that \"this.length <= MAX_UINT32\" since it's a read-only\n // property of a typed array.\n\n // This behaves neither like String nor Uint8Array in that we set start/end\n // to their upper/lower bounds if the value passed is out of range.\n // undefined is handled specially as per ECMA-262 6th Edition,\n // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization.\n if (start === undefined || start < 0) {\n start = 0\n }\n // Return early if start > this.length. Done here to prevent potential uint32\n // coercion fail below.\n if (start > this.length) {\n return ''\n }\n\n if (end === undefined || end > this.length) {\n end = this.length\n }\n\n if (end <= 0) {\n return ''\n }\n\n // Force coersion to uint32. This will also coerce falsey/NaN values to 0.\n end >>>= 0\n start >>>= 0\n\n if (end <= start) {\n return ''\n }\n\n if (!encoding) encoding = 'utf8'\n\n while (true) {\n switch (encoding) {\n case 'hex':\n return hexSlice(this, start, end)\n\n case 'utf8':\n case 'utf-8':\n return utf8Slice(this, start, end)\n\n case 'ascii':\n return asciiSlice(this, start, end)\n\n case 'latin1':\n case 'binary':\n return latin1Slice(this, start, end)\n\n case 'base64':\n return base64Slice(this, start, end)\n\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return utf16leSlice(this, start, end)\n\n default:\n if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n encoding = (encoding + '').toLowerCase()\n loweredCase = true\n }\n }\n}\n\n// This property is used by `Buffer.isBuffer` (and the `is-buffer` npm package)\n// to detect a Buffer instance. It's not possible to use `instanceof Buffer`\n// reliably in a browserify context because there could be multiple different\n// copies of the 'buffer' package in use. This method works even for Buffer\n// instances that were created from another copy of the `buffer` package.\n// See: https://github.com/feross/buffer/issues/154\nBuffer.prototype._isBuffer = true\n\nfunction swap (b, n, m) {\n var i = b[n]\n b[n] = b[m]\n b[m] = i\n}\n\nBuffer.prototype.swap16 = function swap16 () {\n var len = this.length\n if (len % 2 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 16-bits')\n }\n for (var i = 0; i < len; i += 2) {\n swap(this, i, i + 1)\n }\n return this\n}\n\nBuffer.prototype.swap32 = function swap32 () {\n var len = this.length\n if (len % 4 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 32-bits')\n }\n for (var i = 0; i < len; i += 4) {\n swap(this, i, i + 3)\n swap(this, i + 1, i + 2)\n }\n return this\n}\n\nBuffer.prototype.swap64 = function swap64 () {\n var len = this.length\n if (len % 8 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 64-bits')\n }\n for (var i = 0; i < len; i += 8) {\n swap(this, i, i + 7)\n swap(this, i + 1, i + 6)\n swap(this, i + 2, i + 5)\n swap(this, i + 3, i + 4)\n }\n return this\n}\n\nBuffer.prototype.toString = function toString () {\n var length = this.length\n if (length === 0) return ''\n if (arguments.length === 0) return utf8Slice(this, 0, length)\n return slowToString.apply(this, arguments)\n}\n\nBuffer.prototype.toLocaleString = Buffer.prototype.toString\n\nBuffer.prototype.equals = function equals (b) {\n if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')\n if (this === b) return true\n return Buffer.compare(this, b) === 0\n}\n\nBuffer.prototype.inspect = function inspect () {\n var str = ''\n var max = exports.INSPECT_MAX_BYTES\n if (this.length > 0) {\n str = this.toString('hex', 0, max).match(/.{2}/g).join(' ')\n if (this.length > max) str += ' ... '\n }\n return ''\n}\n\nBuffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) {\n if (!Buffer.isBuffer(target)) {\n throw new TypeError('Argument must be a Buffer')\n }\n\n if (start === undefined) {\n start = 0\n }\n if (end === undefined) {\n end = target ? target.length : 0\n }\n if (thisStart === undefined) {\n thisStart = 0\n }\n if (thisEnd === undefined) {\n thisEnd = this.length\n }\n\n if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) {\n throw new RangeError('out of range index')\n }\n\n if (thisStart >= thisEnd && start >= end) {\n return 0\n }\n if (thisStart >= thisEnd) {\n return -1\n }\n if (start >= end) {\n return 1\n }\n\n start >>>= 0\n end >>>= 0\n thisStart >>>= 0\n thisEnd >>>= 0\n\n if (this === target) return 0\n\n var x = thisEnd - thisStart\n var y = end - start\n var len = Math.min(x, y)\n\n var thisCopy = this.slice(thisStart, thisEnd)\n var targetCopy = target.slice(start, end)\n\n for (var i = 0; i < len; ++i) {\n if (thisCopy[i] !== targetCopy[i]) {\n x = thisCopy[i]\n y = targetCopy[i]\n break\n }\n }\n\n if (x < y) return -1\n if (y < x) return 1\n return 0\n}\n\n// Finds either the first index of `val` in `buffer` at offset >= `byteOffset`,\n// OR the last index of `val` in `buffer` at offset <= `byteOffset`.\n//\n// Arguments:\n// - buffer - a Buffer to search\n// - val - a string, Buffer, or number\n// - byteOffset - an index into `buffer`; will be clamped to an int32\n// - encoding - an optional encoding, relevant is val is a string\n// - dir - true for indexOf, false for lastIndexOf\nfunction bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) {\n // Empty buffer means no match\n if (buffer.length === 0) return -1\n\n // Normalize byteOffset\n if (typeof byteOffset === 'string') {\n encoding = byteOffset\n byteOffset = 0\n } else if (byteOffset > 0x7fffffff) {\n byteOffset = 0x7fffffff\n } else if (byteOffset < -0x80000000) {\n byteOffset = -0x80000000\n }\n byteOffset = +byteOffset // Coerce to Number.\n if (numberIsNaN(byteOffset)) {\n // byteOffset: it it's undefined, null, NaN, \"foo\", etc, search whole buffer\n byteOffset = dir ? 0 : (buffer.length - 1)\n }\n\n // Normalize byteOffset: negative offsets start from the end of the buffer\n if (byteOffset < 0) byteOffset = buffer.length + byteOffset\n if (byteOffset >= buffer.length) {\n if (dir) return -1\n else byteOffset = buffer.length - 1\n } else if (byteOffset < 0) {\n if (dir) byteOffset = 0\n else return -1\n }\n\n // Normalize val\n if (typeof val === 'string') {\n val = Buffer.from(val, encoding)\n }\n\n // Finally, search either indexOf (if dir is true) or lastIndexOf\n if (Buffer.isBuffer(val)) {\n // Special case: looking for empty string/buffer always fails\n if (val.length === 0) {\n return -1\n }\n return arrayIndexOf(buffer, val, byteOffset, encoding, dir)\n } else if (typeof val === 'number') {\n val = val & 0xFF // Search for a byte value [0-255]\n if (typeof Uint8Array.prototype.indexOf === 'function') {\n if (dir) {\n return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset)\n } else {\n return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset)\n }\n }\n return arrayIndexOf(buffer, [ val ], byteOffset, encoding, dir)\n }\n\n throw new TypeError('val must be string, number or Buffer')\n}\n\nfunction arrayIndexOf (arr, val, byteOffset, encoding, dir) {\n var indexSize = 1\n var arrLength = arr.length\n var valLength = val.length\n\n if (encoding !== undefined) {\n encoding = String(encoding).toLowerCase()\n if (encoding === 'ucs2' || encoding === 'ucs-2' ||\n encoding === 'utf16le' || encoding === 'utf-16le') {\n if (arr.length < 2 || val.length < 2) {\n return -1\n }\n indexSize = 2\n arrLength /= 2\n valLength /= 2\n byteOffset /= 2\n }\n }\n\n function read (buf, i) {\n if (indexSize === 1) {\n return buf[i]\n } else {\n return buf.readUInt16BE(i * indexSize)\n }\n }\n\n var i\n if (dir) {\n var foundIndex = -1\n for (i = byteOffset; i < arrLength; i++) {\n if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) {\n if (foundIndex === -1) foundIndex = i\n if (i - foundIndex + 1 === valLength) return foundIndex * indexSize\n } else {\n if (foundIndex !== -1) i -= i - foundIndex\n foundIndex = -1\n }\n }\n } else {\n if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength\n for (i = byteOffset; i >= 0; i--) {\n var found = true\n for (var j = 0; j < valLength; j++) {\n if (read(arr, i + j) !== read(val, j)) {\n found = false\n break\n }\n }\n if (found) return i\n }\n }\n\n return -1\n}\n\nBuffer.prototype.includes = function includes (val, byteOffset, encoding) {\n return this.indexOf(val, byteOffset, encoding) !== -1\n}\n\nBuffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) {\n return bidirectionalIndexOf(this, val, byteOffset, encoding, true)\n}\n\nBuffer.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) {\n return bidirectionalIndexOf(this, val, byteOffset, encoding, false)\n}\n\nfunction hexWrite (buf, string, offset, length) {\n offset = Number(offset) || 0\n var remaining = buf.length - offset\n if (!length) {\n length = remaining\n } else {\n length = Number(length)\n if (length > remaining) {\n length = remaining\n }\n }\n\n var strLen = string.length\n\n if (length > strLen / 2) {\n length = strLen / 2\n }\n for (var i = 0; i < length; ++i) {\n var parsed = parseInt(string.substr(i * 2, 2), 16)\n if (numberIsNaN(parsed)) return i\n buf[offset + i] = parsed\n }\n return i\n}\n\nfunction utf8Write (buf, string, offset, length) {\n return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nfunction asciiWrite (buf, string, offset, length) {\n return blitBuffer(asciiToBytes(string), buf, offset, length)\n}\n\nfunction latin1Write (buf, string, offset, length) {\n return asciiWrite(buf, string, offset, length)\n}\n\nfunction base64Write (buf, string, offset, length) {\n return blitBuffer(base64ToBytes(string), buf, offset, length)\n}\n\nfunction ucs2Write (buf, string, offset, length) {\n return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nBuffer.prototype.write = function write (string, offset, length, encoding) {\n // Buffer#write(string)\n if (offset === undefined) {\n encoding = 'utf8'\n length = this.length\n offset = 0\n // Buffer#write(string, encoding)\n } else if (length === undefined && typeof offset === 'string') {\n encoding = offset\n length = this.length\n offset = 0\n // Buffer#write(string, offset[, length][, encoding])\n } else if (isFinite(offset)) {\n offset = offset >>> 0\n if (isFinite(length)) {\n length = length >>> 0\n if (encoding === undefined) encoding = 'utf8'\n } else {\n encoding = length\n length = undefined\n }\n } else {\n throw new Error(\n 'Buffer.write(string, encoding, offset[, length]) is no longer supported'\n )\n }\n\n var remaining = this.length - offset\n if (length === undefined || length > remaining) length = remaining\n\n if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) {\n throw new RangeError('Attempt to write outside buffer bounds')\n }\n\n if (!encoding) encoding = 'utf8'\n\n var loweredCase = false\n for (;;) {\n switch (encoding) {\n case 'hex':\n return hexWrite(this, string, offset, length)\n\n case 'utf8':\n case 'utf-8':\n return utf8Write(this, string, offset, length)\n\n case 'ascii':\n return asciiWrite(this, string, offset, length)\n\n case 'latin1':\n case 'binary':\n return latin1Write(this, string, offset, length)\n\n case 'base64':\n // Warning: maxLength not taken into account in base64Write\n return base64Write(this, string, offset, length)\n\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return ucs2Write(this, string, offset, length)\n\n default:\n if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n encoding = ('' + encoding).toLowerCase()\n loweredCase = true\n }\n }\n}\n\nBuffer.prototype.toJSON = function toJSON () {\n return {\n type: 'Buffer',\n data: Array.prototype.slice.call(this._arr || this, 0)\n }\n}\n\nfunction base64Slice (buf, start, end) {\n if (start === 0 && end === buf.length) {\n return base64.fromByteArray(buf)\n } else {\n return base64.fromByteArray(buf.slice(start, end))\n }\n}\n\nfunction utf8Slice (buf, start, end) {\n end = Math.min(buf.length, end)\n var res = []\n\n var i = start\n while (i < end) {\n var firstByte = buf[i]\n var codePoint = null\n var bytesPerSequence = (firstByte > 0xEF) ? 4\n : (firstByte > 0xDF) ? 3\n : (firstByte > 0xBF) ? 2\n : 1\n\n if (i + bytesPerSequence <= end) {\n var secondByte, thirdByte, fourthByte, tempCodePoint\n\n switch (bytesPerSequence) {\n case 1:\n if (firstByte < 0x80) {\n codePoint = firstByte\n }\n break\n case 2:\n secondByte = buf[i + 1]\n if ((secondByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F)\n if (tempCodePoint > 0x7F) {\n codePoint = tempCodePoint\n }\n }\n break\n case 3:\n secondByte = buf[i + 1]\n thirdByte = buf[i + 2]\n if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F)\n if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) {\n codePoint = tempCodePoint\n }\n }\n break\n case 4:\n secondByte = buf[i + 1]\n thirdByte = buf[i + 2]\n fourthByte = buf[i + 3]\n if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F)\n if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) {\n codePoint = tempCodePoint\n }\n }\n }\n }\n\n if (codePoint === null) {\n // we did not generate a valid codePoint so insert a\n // replacement char (U+FFFD) and advance only 1 byte\n codePoint = 0xFFFD\n bytesPerSequence = 1\n } else if (codePoint > 0xFFFF) {\n // encode to utf16 (surrogate pair dance)\n codePoint -= 0x10000\n res.push(codePoint >>> 10 & 0x3FF | 0xD800)\n codePoint = 0xDC00 | codePoint & 0x3FF\n }\n\n res.push(codePoint)\n i += bytesPerSequence\n }\n\n return decodeCodePointsArray(res)\n}\n\n// Based on http://stackoverflow.com/a/22747272/680742, the browser with\n// the lowest limit is Chrome, with 0x10000 args.\n// We go 1 magnitude less, for safety\nvar MAX_ARGUMENTS_LENGTH = 0x1000\n\nfunction decodeCodePointsArray (codePoints) {\n var len = codePoints.length\n if (len <= MAX_ARGUMENTS_LENGTH) {\n return String.fromCharCode.apply(String, codePoints) // avoid extra slice()\n }\n\n // Decode in chunks to avoid \"call stack size exceeded\".\n var res = ''\n var i = 0\n while (i < len) {\n res += String.fromCharCode.apply(\n String,\n codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH)\n )\n }\n return res\n}\n\nfunction asciiSlice (buf, start, end) {\n var ret = ''\n end = Math.min(buf.length, end)\n\n for (var i = start; i < end; ++i) {\n ret += String.fromCharCode(buf[i] & 0x7F)\n }\n return ret\n}\n\nfunction latin1Slice (buf, start, end) {\n var ret = ''\n end = Math.min(buf.length, end)\n\n for (var i = start; i < end; ++i) {\n ret += String.fromCharCode(buf[i])\n }\n return ret\n}\n\nfunction hexSlice (buf, start, end) {\n var len = buf.length\n\n if (!start || start < 0) start = 0\n if (!end || end < 0 || end > len) end = len\n\n var out = ''\n for (var i = start; i < end; ++i) {\n out += toHex(buf[i])\n }\n return out\n}\n\nfunction utf16leSlice (buf, start, end) {\n var bytes = buf.slice(start, end)\n var res = ''\n for (var i = 0; i < bytes.length; i += 2) {\n res += String.fromCharCode(bytes[i] + (bytes[i + 1] * 256))\n }\n return res\n}\n\nBuffer.prototype.slice = function slice (start, end) {\n var len = this.length\n start = ~~start\n end = end === undefined ? len : ~~end\n\n if (start < 0) {\n start += len\n if (start < 0) start = 0\n } else if (start > len) {\n start = len\n }\n\n if (end < 0) {\n end += len\n if (end < 0) end = 0\n } else if (end > len) {\n end = len\n }\n\n if (end < start) end = start\n\n var newBuf = this.subarray(start, end)\n // Return an augmented `Uint8Array` instance\n newBuf.__proto__ = Buffer.prototype\n return newBuf\n}\n\n/*\n * Need to make sure that buffer isn't trying to write out of bounds.\n */\nfunction checkOffset (offset, ext, length) {\n if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint')\n if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length')\n}\n\nBuffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) {\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n var val = this[offset]\n var mul = 1\n var i = 0\n while (++i < byteLength && (mul *= 0x100)) {\n val += this[offset + i] * mul\n }\n\n return val\n}\n\nBuffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) {\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) {\n checkOffset(offset, byteLength, this.length)\n }\n\n var val = this[offset + --byteLength]\n var mul = 1\n while (byteLength > 0 && (mul *= 0x100)) {\n val += this[offset + --byteLength] * mul\n }\n\n return val\n}\n\nBuffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 1, this.length)\n return this[offset]\n}\n\nBuffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 2, this.length)\n return this[offset] | (this[offset + 1] << 8)\n}\n\nBuffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 2, this.length)\n return (this[offset] << 8) | this[offset + 1]\n}\n\nBuffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return ((this[offset]) |\n (this[offset + 1] << 8) |\n (this[offset + 2] << 16)) +\n (this[offset + 3] * 0x1000000)\n}\n\nBuffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return (this[offset] * 0x1000000) +\n ((this[offset + 1] << 16) |\n (this[offset + 2] << 8) |\n this[offset + 3])\n}\n\nBuffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) {\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n var val = this[offset]\n var mul = 1\n var i = 0\n while (++i < byteLength && (mul *= 0x100)) {\n val += this[offset + i] * mul\n }\n mul *= 0x80\n\n if (val >= mul) val -= Math.pow(2, 8 * byteLength)\n\n return val\n}\n\nBuffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) {\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n var i = byteLength\n var mul = 1\n var val = this[offset + --i]\n while (i > 0 && (mul *= 0x100)) {\n val += this[offset + --i] * mul\n }\n mul *= 0x80\n\n if (val >= mul) val -= Math.pow(2, 8 * byteLength)\n\n return val\n}\n\nBuffer.prototype.readInt8 = function readInt8 (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 1, this.length)\n if (!(this[offset] & 0x80)) return (this[offset])\n return ((0xff - this[offset] + 1) * -1)\n}\n\nBuffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 2, this.length)\n var val = this[offset] | (this[offset + 1] << 8)\n return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 2, this.length)\n var val = this[offset + 1] | (this[offset] << 8)\n return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return (this[offset]) |\n (this[offset + 1] << 8) |\n (this[offset + 2] << 16) |\n (this[offset + 3] << 24)\n}\n\nBuffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return (this[offset] << 24) |\n (this[offset + 1] << 16) |\n (this[offset + 2] << 8) |\n (this[offset + 3])\n}\n\nBuffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n return ieee754.read(this, offset, true, 23, 4)\n}\n\nBuffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n return ieee754.read(this, offset, false, 23, 4)\n}\n\nBuffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 8, this.length)\n return ieee754.read(this, offset, true, 52, 8)\n}\n\nBuffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 8, this.length)\n return ieee754.read(this, offset, false, 52, 8)\n}\n\nfunction checkInt (buf, value, offset, ext, max, min) {\n if (!Buffer.isBuffer(buf)) throw new TypeError('\"buffer\" argument must be a Buffer instance')\n if (value > max || value < min) throw new RangeError('\"value\" argument is out of bounds')\n if (offset + ext > buf.length) throw new RangeError('Index out of range')\n}\n\nBuffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) {\n var maxBytes = Math.pow(2, 8 * byteLength) - 1\n checkInt(this, value, offset, byteLength, maxBytes, 0)\n }\n\n var mul = 1\n var i = 0\n this[offset] = value & 0xFF\n while (++i < byteLength && (mul *= 0x100)) {\n this[offset + i] = (value / mul) & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) {\n var maxBytes = Math.pow(2, 8 * byteLength) - 1\n checkInt(this, value, offset, byteLength, maxBytes, 0)\n }\n\n var i = byteLength - 1\n var mul = 1\n this[offset + i] = value & 0xFF\n while (--i >= 0 && (mul *= 0x100)) {\n this[offset + i] = (value / mul) & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0)\n this[offset] = (value & 0xff)\n return offset + 1\n}\n\nBuffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\n this[offset] = (value & 0xff)\n this[offset + 1] = (value >>> 8)\n return offset + 2\n}\n\nBuffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\n this[offset] = (value >>> 8)\n this[offset + 1] = (value & 0xff)\n return offset + 2\n}\n\nBuffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\n this[offset + 3] = (value >>> 24)\n this[offset + 2] = (value >>> 16)\n this[offset + 1] = (value >>> 8)\n this[offset] = (value & 0xff)\n return offset + 4\n}\n\nBuffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\n this[offset] = (value >>> 24)\n this[offset + 1] = (value >>> 16)\n this[offset + 2] = (value >>> 8)\n this[offset + 3] = (value & 0xff)\n return offset + 4\n}\n\nBuffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) {\n var limit = Math.pow(2, (8 * byteLength) - 1)\n\n checkInt(this, value, offset, byteLength, limit - 1, -limit)\n }\n\n var i = 0\n var mul = 1\n var sub = 0\n this[offset] = value & 0xFF\n while (++i < byteLength && (mul *= 0x100)) {\n if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) {\n sub = 1\n }\n this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) {\n var limit = Math.pow(2, (8 * byteLength) - 1)\n\n checkInt(this, value, offset, byteLength, limit - 1, -limit)\n }\n\n var i = byteLength - 1\n var mul = 1\n var sub = 0\n this[offset + i] = value & 0xFF\n while (--i >= 0 && (mul *= 0x100)) {\n if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) {\n sub = 1\n }\n this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80)\n if (value < 0) value = 0xff + value + 1\n this[offset] = (value & 0xff)\n return offset + 1\n}\n\nBuffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\n this[offset] = (value & 0xff)\n this[offset + 1] = (value >>> 8)\n return offset + 2\n}\n\nBuffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\n this[offset] = (value >>> 8)\n this[offset + 1] = (value & 0xff)\n return offset + 2\n}\n\nBuffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\n this[offset] = (value & 0xff)\n this[offset + 1] = (value >>> 8)\n this[offset + 2] = (value >>> 16)\n this[offset + 3] = (value >>> 24)\n return offset + 4\n}\n\nBuffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\n if (value < 0) value = 0xffffffff + value + 1\n this[offset] = (value >>> 24)\n this[offset + 1] = (value >>> 16)\n this[offset + 2] = (value >>> 8)\n this[offset + 3] = (value & 0xff)\n return offset + 4\n}\n\nfunction checkIEEE754 (buf, value, offset, ext, max, min) {\n if (offset + ext > buf.length) throw new RangeError('Index out of range')\n if (offset < 0) throw new RangeError('Index out of range')\n}\n\nfunction writeFloat (buf, value, offset, littleEndian, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) {\n checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38)\n }\n ieee754.write(buf, value, offset, littleEndian, 23, 4)\n return offset + 4\n}\n\nBuffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) {\n return writeFloat(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) {\n return writeFloat(this, value, offset, false, noAssert)\n}\n\nfunction writeDouble (buf, value, offset, littleEndian, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) {\n checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308)\n }\n ieee754.write(buf, value, offset, littleEndian, 52, 8)\n return offset + 8\n}\n\nBuffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) {\n return writeDouble(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) {\n return writeDouble(this, value, offset, false, noAssert)\n}\n\n// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)\nBuffer.prototype.copy = function copy (target, targetStart, start, end) {\n if (!Buffer.isBuffer(target)) throw new TypeError('argument should be a Buffer')\n if (!start) start = 0\n if (!end && end !== 0) end = this.length\n if (targetStart >= target.length) targetStart = target.length\n if (!targetStart) targetStart = 0\n if (end > 0 && end < start) end = start\n\n // Copy 0 bytes; we're done\n if (end === start) return 0\n if (target.length === 0 || this.length === 0) return 0\n\n // Fatal error conditions\n if (targetStart < 0) {\n throw new RangeError('targetStart out of bounds')\n }\n if (start < 0 || start >= this.length) throw new RangeError('Index out of range')\n if (end < 0) throw new RangeError('sourceEnd out of bounds')\n\n // Are we oob?\n if (end > this.length) end = this.length\n if (target.length - targetStart < end - start) {\n end = target.length - targetStart + start\n }\n\n var len = end - start\n\n if (this === target && typeof Uint8Array.prototype.copyWithin === 'function') {\n // Use built-in when available, missing from IE11\n this.copyWithin(targetStart, start, end)\n } else if (this === target && start < targetStart && targetStart < end) {\n // descending copy from end\n for (var i = len - 1; i >= 0; --i) {\n target[i + targetStart] = this[i + start]\n }\n } else {\n Uint8Array.prototype.set.call(\n target,\n this.subarray(start, end),\n targetStart\n )\n }\n\n return len\n}\n\n// Usage:\n// buffer.fill(number[, offset[, end]])\n// buffer.fill(buffer[, offset[, end]])\n// buffer.fill(string[, offset[, end]][, encoding])\nBuffer.prototype.fill = function fill (val, start, end, encoding) {\n // Handle string cases:\n if (typeof val === 'string') {\n if (typeof start === 'string') {\n encoding = start\n start = 0\n end = this.length\n } else if (typeof end === 'string') {\n encoding = end\n end = this.length\n }\n if (encoding !== undefined && typeof encoding !== 'string') {\n throw new TypeError('encoding must be a string')\n }\n if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) {\n throw new TypeError('Unknown encoding: ' + encoding)\n }\n if (val.length === 1) {\n var code = val.charCodeAt(0)\n if ((encoding === 'utf8' && code < 128) ||\n encoding === 'latin1') {\n // Fast path: If `val` fits into a single byte, use that numeric value.\n val = code\n }\n }\n } else if (typeof val === 'number') {\n val = val & 255\n }\n\n // Invalid ranges are not set to a default, so can range check early.\n if (start < 0 || this.length < start || this.length < end) {\n throw new RangeError('Out of range index')\n }\n\n if (end <= start) {\n return this\n }\n\n start = start >>> 0\n end = end === undefined ? this.length : end >>> 0\n\n if (!val) val = 0\n\n var i\n if (typeof val === 'number') {\n for (i = start; i < end; ++i) {\n this[i] = val\n }\n } else {\n var bytes = Buffer.isBuffer(val)\n ? val\n : new Buffer(val, encoding)\n var len = bytes.length\n if (len === 0) {\n throw new TypeError('The value \"' + val +\n '\" is invalid for argument \"value\"')\n }\n for (i = 0; i < end - start; ++i) {\n this[i + start] = bytes[i % len]\n }\n }\n\n return this\n}\n\n// HELPER FUNCTIONS\n// ================\n\nvar INVALID_BASE64_RE = /[^+/0-9A-Za-z-_]/g\n\nfunction base64clean (str) {\n // Node takes equal signs as end of the Base64 encoding\n str = str.split('=')[0]\n // Node strips out invalid characters like \\n and \\t from the string, base64-js does not\n str = str.trim().replace(INVALID_BASE64_RE, '')\n // Node converts strings with length < 2 to ''\n if (str.length < 2) return ''\n // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not\n while (str.length % 4 !== 0) {\n str = str + '='\n }\n return str\n}\n\nfunction toHex (n) {\n if (n < 16) return '0' + n.toString(16)\n return n.toString(16)\n}\n\nfunction utf8ToBytes (string, units) {\n units = units || Infinity\n var codePoint\n var length = string.length\n var leadSurrogate = null\n var bytes = []\n\n for (var i = 0; i < length; ++i) {\n codePoint = string.charCodeAt(i)\n\n // is surrogate component\n if (codePoint > 0xD7FF && codePoint < 0xE000) {\n // last char was a lead\n if (!leadSurrogate) {\n // no lead yet\n if (codePoint > 0xDBFF) {\n // unexpected trail\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n continue\n } else if (i + 1 === length) {\n // unpaired lead\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n continue\n }\n\n // valid lead\n leadSurrogate = codePoint\n\n continue\n }\n\n // 2 leads in a row\n if (codePoint < 0xDC00) {\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n leadSurrogate = codePoint\n continue\n }\n\n // valid surrogate pair\n codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000\n } else if (leadSurrogate) {\n // valid bmp char, but last char was a lead\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n }\n\n leadSurrogate = null\n\n // encode utf8\n if (codePoint < 0x80) {\n if ((units -= 1) < 0) break\n bytes.push(codePoint)\n } else if (codePoint < 0x800) {\n if ((units -= 2) < 0) break\n bytes.push(\n codePoint >> 0x6 | 0xC0,\n codePoint & 0x3F | 0x80\n )\n } else if (codePoint < 0x10000) {\n if ((units -= 3) < 0) break\n bytes.push(\n codePoint >> 0xC | 0xE0,\n codePoint >> 0x6 & 0x3F | 0x80,\n codePoint & 0x3F | 0x80\n )\n } else if (codePoint < 0x110000) {\n if ((units -= 4) < 0) break\n bytes.push(\n codePoint >> 0x12 | 0xF0,\n codePoint >> 0xC & 0x3F | 0x80,\n codePoint >> 0x6 & 0x3F | 0x80,\n codePoint & 0x3F | 0x80\n )\n } else {\n throw new Error('Invalid code point')\n }\n }\n\n return bytes\n}\n\nfunction asciiToBytes (str) {\n var byteArray = []\n for (var i = 0; i < str.length; ++i) {\n // Node's code seems to be doing this and not & 0x7F..\n byteArray.push(str.charCodeAt(i) & 0xFF)\n }\n return byteArray\n}\n\nfunction utf16leToBytes (str, units) {\n var c, hi, lo\n var byteArray = []\n for (var i = 0; i < str.length; ++i) {\n if ((units -= 2) < 0) break\n\n c = str.charCodeAt(i)\n hi = c >> 8\n lo = c % 256\n byteArray.push(lo)\n byteArray.push(hi)\n }\n\n return byteArray\n}\n\nfunction base64ToBytes (str) {\n return base64.toByteArray(base64clean(str))\n}\n\nfunction blitBuffer (src, dst, offset, length) {\n for (var i = 0; i < length; ++i) {\n if ((i + offset >= dst.length) || (i >= src.length)) break\n dst[i + offset] = src[i]\n }\n return i\n}\n\n// ArrayBuffers from another context (i.e. an iframe) do not pass the `instanceof` check\n// but they should be treated as valid. See: https://github.com/feross/buffer/issues/166\nfunction isArrayBuffer (obj) {\n return obj instanceof ArrayBuffer ||\n (obj != null && obj.constructor != null && obj.constructor.name === 'ArrayBuffer' &&\n typeof obj.byteLength === 'number')\n}\n\nfunction numberIsNaN (obj) {\n return obj !== obj // eslint-disable-line no-self-compare\n}\n\n},{\"base64-js\":2,\"ieee754\":4}],4:[function(require,module,exports){\nexports.read = function (buffer, offset, isLE, mLen, nBytes) {\n var e, m\n var eLen = (nBytes * 8) - mLen - 1\n var eMax = (1 << eLen) - 1\n var eBias = eMax >> 1\n var nBits = -7\n var i = isLE ? (nBytes - 1) : 0\n var d = isLE ? -1 : 1\n var s = buffer[offset + i]\n\n i += d\n\n e = s & ((1 << (-nBits)) - 1)\n s >>= (-nBits)\n nBits += eLen\n for (; nBits > 0; e = (e * 256) + buffer[offset + i], i += d, nBits -= 8) {}\n\n m = e & ((1 << (-nBits)) - 1)\n e >>= (-nBits)\n nBits += mLen\n for (; nBits > 0; m = (m * 256) + buffer[offset + i], i += d, nBits -= 8) {}\n\n if (e === 0) {\n e = 1 - eBias\n } else if (e === eMax) {\n return m ? NaN : ((s ? -1 : 1) * Infinity)\n } else {\n m = m + Math.pow(2, mLen)\n e = e - eBias\n }\n return (s ? -1 : 1) * m * Math.pow(2, e - mLen)\n}\n\nexports.write = function (buffer, value, offset, isLE, mLen, nBytes) {\n var e, m, c\n var eLen = (nBytes * 8) - mLen - 1\n var eMax = (1 << eLen) - 1\n var eBias = eMax >> 1\n var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0)\n var i = isLE ? 0 : (nBytes - 1)\n var d = isLE ? 1 : -1\n var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0\n\n value = Math.abs(value)\n\n if (isNaN(value) || value === Infinity) {\n m = isNaN(value) ? 1 : 0\n e = eMax\n } else {\n e = Math.floor(Math.log(value) / Math.LN2)\n if (value * (c = Math.pow(2, -e)) < 1) {\n e--\n c *= 2\n }\n if (e + eBias >= 1) {\n value += rt / c\n } else {\n value += rt * Math.pow(2, 1 - eBias)\n }\n if (value * c >= 2) {\n e++\n c /= 2\n }\n\n if (e + eBias >= eMax) {\n m = 0\n e = eMax\n } else if (e + eBias >= 1) {\n m = ((value * c) - 1) * Math.pow(2, mLen)\n e = e + eBias\n } else {\n m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen)\n e = 0\n }\n }\n\n for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}\n\n e = (e << mLen) | m\n eLen += mLen\n for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}\n\n buffer[offset + i - d] |= s * 128\n}\n\n},{}],5:[function(require,module,exports){\n// shim for using process in browser\nvar process = module.exports = {};\n\n// cached from whatever global is present so that test runners that stub it\n// don't break things. But we need to wrap it in a try catch in case it is\n// wrapped in strict mode code which doesn't define any globals. It's inside a\n// function because try/catches deoptimize in certain engines.\n\nvar cachedSetTimeout;\nvar cachedClearTimeout;\n\nfunction defaultSetTimout() {\n throw new Error('setTimeout has not been defined');\n}\nfunction defaultClearTimeout () {\n throw new Error('clearTimeout has not been defined');\n}\n(function () {\n try {\n if (typeof setTimeout === 'function') {\n cachedSetTimeout = setTimeout;\n } else {\n cachedSetTimeout = defaultSetTimout;\n }\n } catch (e) {\n cachedSetTimeout = defaultSetTimout;\n }\n try {\n if (typeof clearTimeout === 'function') {\n cachedClearTimeout = clearTimeout;\n } else {\n cachedClearTimeout = defaultClearTimeout;\n }\n } catch (e) {\n cachedClearTimeout = defaultClearTimeout;\n }\n} ())\nfunction runTimeout(fun) {\n if (cachedSetTimeout === setTimeout) {\n //normal enviroments in sane situations\n return setTimeout(fun, 0);\n }\n // if setTimeout wasn't available but was latter defined\n if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n cachedSetTimeout = setTimeout;\n return setTimeout(fun, 0);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedSetTimeout(fun, 0);\n } catch(e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedSetTimeout.call(null, fun, 0);\n } catch(e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n return cachedSetTimeout.call(this, fun, 0);\n }\n }\n\n\n}\nfunction runClearTimeout(marker) {\n if (cachedClearTimeout === clearTimeout) {\n //normal enviroments in sane situations\n return clearTimeout(marker);\n }\n // if clearTimeout wasn't available but was latter defined\n if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n cachedClearTimeout = clearTimeout;\n return clearTimeout(marker);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedClearTimeout(marker);\n } catch (e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedClearTimeout.call(null, marker);\n } catch (e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n return cachedClearTimeout.call(this, marker);\n }\n }\n\n\n\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n if (!draining || !currentQueue) {\n return;\n }\n draining = false;\n if (currentQueue.length) {\n queue = currentQueue.concat(queue);\n } else {\n queueIndex = -1;\n }\n if (queue.length) {\n drainQueue();\n }\n}\n\nfunction drainQueue() {\n if (draining) {\n return;\n }\n var timeout = runTimeout(cleanUpNextTick);\n draining = true;\n\n var len = queue.length;\n while(len) {\n currentQueue = queue;\n queue = [];\n while (++queueIndex < len) {\n if (currentQueue) {\n currentQueue[queueIndex].run();\n }\n }\n queueIndex = -1;\n len = queue.length;\n }\n currentQueue = null;\n draining = false;\n runClearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n var args = new Array(arguments.length - 1);\n if (arguments.length > 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},{}]},{},[1])(1)\n});\n\n","/*global process, Buffer */\n/**\n * @file Manages Salesforce Metadata API\n * @author Shinichi Tomita \n */\n\n'use strict';\n\nvar inherits = window.jsforce.require('inherits'),\n events = window.jsforce.require('events'),\n stream = window.jsforce.require('readable-stream'),\n _ = window.jsforce.require('lodash/core'),\n jsforce = window.jsforce.require('./core'),\n Promise = window.jsforce.require('./promise'),\n SOAP = window.jsforce.require('./soap');\n\n/*--------------------------------------------*/\n/**\n * Class for Salesforce Metadata API\n *\n * @class\n * @param {Connection} conn - Connection object\n */\nvar Metadata = module.exports = function(conn) {\n this._conn = conn;\n};\n\n\n/**\n * Polling interval in milliseconds\n * @type {Number}\n */\nMetadata.prototype.pollInterval = 1000;\n\n/**\n * Polling timeout in milliseconds\n * @type {Number}\n */\nMetadata.prototype.pollTimeout = 10000;\n\n\n/**\n * Call Metadata API SOAP endpoint\n *\n * @private\n */\nMetadata.prototype._invoke = function(method, message, callback) {\n var soapEndpoint = new SOAP(this._conn, {\n xmlns: \"http://soap.sforce.com/2006/04/metadata\",\n endpointUrl: this._conn.instanceUrl + \"/services/Soap/m/\" + this._conn.version\n });\n return soapEndpoint.invoke(method, message).then(function(res) {\n return res.result;\n }).thenCall(callback);\n};\n\n\n/**\n * @typedef {Object} Metadata~MetadataInfo\n * @prop {String} fullName - The name of the component\n */\n\n/**\n * Asynchronously adds one or more new metadata components to the organization.\n *\n * @param {String} type - The type of metadata to create\n * @param {Metadata~MetadataInfo|Array.} metadata - Metadata to create\n * @param {Callback.>} [callback] - Callback function\n * @returns {Metadata~AsyncResultLocator}\n */\nMetadata.prototype.createAsync = function(type, metadata, callback) {\n if (Number(this._conn.version) > 30) {\n throw new Error(\"Async metadata CRUD calls are not supported on ver 31.0 or later.\");\n }\n var convert = function(md) {\n md[\"@xsi:type\"] = type;\n return md;\n };\n var isArray = _.isArray(metadata);\n metadata = isArray ? _.map(metadata, convert) : convert(metadata);\n var res = this._invoke(\"create\", { metadata: metadata });\n return new AsyncResultLocator(this, res, isArray).thenCall(callback);\n};\n\n/**\n * @typedef {Object} Metadata~SaveResult\n * @prop {Boolean} success - True if metadata is successfully saved\n * @prop {String} fullName - Full name of metadata object\n */\n\n/**\n * @private\n */\nfunction convertToSaveResult(result) {\n var saveResult = _.clone(result);\n saveResult.success = saveResult.success === 'true';\n return saveResult;\n}\n\n/**\n * @typedef {Object} Metadata~UpsertResult\n * @prop {Boolean} success - True if metadata is successfully saved\n * @prop {String} fullName - Full name of metadata object\n * @prop {Boolean} created - True if metadata is newly created\n */\n\n/**\n * @private\n */\nfunction convertToUpsertResult(result) {\n var upsertResult = convertToSaveResult(result);\n upsertResult.created = upsertResult.created === 'true';\n return upsertResult;\n}\n\n/**\n * Synonym of Metadata#create().\n *\n * @method Metadata#createSync\n * @param {String} type - The type of metadata to create\n * @param {Metadata~MetadataInfo|Array.} metadata - Metadata to create\n * @param {Callback.>} [callback] - Callback function\n * @returns {Promise.>}\n */\n/**\n * Synchronously adds one or more new metadata components to the organization.\n *\n * @method Metadata#create\n * @param {String} type - The type of metadata to create\n * @param {Metadata~MetadataInfo|Array.} metadata - Metadata to create\n * @param {Callback.>} [callback] - Callback function\n * @returns {Promise.>}\n */\nMetadata.prototype.createSync =\nMetadata.prototype.create = function(type, metadata, callback) {\n var convert = function(md) {\n md[\"@xsi:type\"] = type;\n return md;\n };\n var isArray = _.isArray(metadata);\n metadata = isArray ? _.map(metadata, convert) : convert(metadata);\n return this._invoke(\"createMetadata\", { metadata: metadata }).then(function(results) {\n return _.isArray(results) ? _.map(results, convertToSaveResult) : convertToSaveResult(results);\n }).thenCall(callback);\n};\n\n/**\n * @private\n */\nfunction convertToMetadataInfo(rec) {\n var metadataInfo = _.clone(rec);\n delete metadataInfo.$;\n return metadataInfo;\n}\n\n/**\n * Synonym of Metadata#read()\n *\n * @method Metadata#readSync\n * @param {String} type - The type of metadata to read\n * @param {String|Array.} fullNames - full name(s) of metadata objects to read\n * @param {Callback.>} [callback] - Callback function\n * @returns {Promise.>>}\n */\n/**\n * Synchronously read specified metadata components in the organization.\n *\n * @method Metadata#read\n * @param {String} type - The type of metadata to read\n * @param {String|Array.} fullNames - full name(s) of metadata objects to read\n * @param {Callback.>} [callback] - Callback function\n * @returns {Promise.>>}\n */\nMetadata.prototype.readSync =\nMetadata.prototype.read = function(type, fullNames, callback) {\n return this._invoke(\"readMetadata\", { type: type, fullNames: fullNames }).then(function(res) {\n return _.isArray(res.records) ? _.map(res.records, convertToMetadataInfo) : convertToMetadataInfo(res.records);\n }).thenCall(callback);\n};\n\n/**\n * @typedef {Object} Metadata~UpdateMetadataInfo\n * @prop {String} currentName - The API name of the component or field before the update\n * @prop {Metadata~MetadataInfo} metadata - Full specification of the component or field you wish to update\n */\n\n/**\n * Asynchronously updates one or more metadata components in the organization.\n *\n * @param {String} type - The type of metadata to update\n * @param {Metadata~UpdateMetadataInfo|Array.} updateMetadata - Updating metadata\n * @param {Callback.>} [callback] - Callback function\n * @returns {Metadata~AsyncResultLocator}\n */\nMetadata.prototype.updateAsync = function(type, updateMetadata, callback) {\n if (Number(this._conn.version) > 30) {\n throw new Error(\"Async metadata CRUD calls are not supported on ver 31.0 or later.\");\n }\n var convert = function(umd) {\n umd.metadata[\"@xsi:type\"] = type;\n return umd;\n };\n var isArray = _.isArray(updateMetadata);\n updateMetadata = isArray ? _.map(updateMetadata, convert) : convert(updateMetadata);\n var res = this._invoke(\"update\", { updateMetadata: updateMetadata });\n return new AsyncResultLocator(this, res, isArray).thenCall(callback);\n};\n\n/**\n * Synonym of Metadata#update().\n *\n * @method Metadata#updateSync\n * @param {String} type - The type of metadata to update\n * @param {Metadata~MetadataInfo|Array.} updateMetadata - Updating metadata\n * @param {Callback.>} [callback] - Callback function\n * @returns {Promise.>}\n */\n/**\n * Synchronously updates one or more metadata components in the organization.\n *\n * @method Metadata#update\n * @param {String} type - The type of metadata to update\n * @param {Metadata~MetadataInfo|Array.} updateMetadata - Updating metadata\n * @param {Callback.>} [callback] - Callback function\n * @returns {Promise.>}\n */\nMetadata.prototype.updateSync =\nMetadata.prototype.update = function(type, metadata, callback) {\n var convert = function(md) {\n md[\"@xsi:type\"] = type;\n return md;\n };\n var isArray = _.isArray(metadata);\n metadata = isArray ? _.map(metadata, convert) : convert(metadata);\n return this._invoke(\"updateMetadata\", { metadata: metadata }).then(function(results) {\n return _.isArray(results) ? _.map(results, convertToSaveResult) : convertToSaveResult(results);\n }).thenCall(callback);\n};\n\n/**\n * Synonym of Metadata#upsert().\n *\n * @method Metadata#upsertSync\n * @param {String} type - The type of metadata to upsert\n * @param {Metadata~MetadataInfo|Array.} metadata - Upserting metadata\n * @param {Callback.>} [callback] - Callback function\n * @returns {Promise.>}\n */\n/**\n * Upserts one or more components in your organization's data.\n *\n * @method Metadata#upsert\n * @param {String} type - The type of metadata to upsert\n * @param {Metadata~MetadataInfo|Array.} metadata - Upserting metadata\n * @param {Callback.>} [callback] - Callback function\n * @returns {Promise.>}\n */\nMetadata.prototype.upsertSync =\nMetadata.prototype.upsert = function(type, metadata, callback) {\n var convert = function(md) {\n md[\"@xsi:type\"] = type;\n return md;\n };\n var isArray = _.isArray(metadata);\n metadata = isArray ? _.map(metadata, convert) : convert(metadata);\n return this._invoke(\"upsertMetadata\", { metadata: metadata }).then(function(results) {\n return _.isArray(results) ? _.map(results, convertToUpsertResult) : convertToUpsertResult(results);\n }).thenCall(callback);\n};\n\n/**\n * Asynchronously deletes specified metadata components in the organization.\n *\n * @param {String} type - The type of metadata to delete\n * @param {String|Metadata~MetadataInfo|Array.|Array.} metadata - The fullName of metadata or metadata info to delete. If it is passed in fullName, the type parameter should not be empty.\n * @param {Callback.>} [callback] - Callback function\n * @returns {Metadata~AsyncResultLocator}\n */\nMetadata.prototype.deleteAsync = function(type, metadata, callback) {\n if (Number(this._conn.version) > 30) {\n throw new Error(\"Async metadata CRUD calls are not supported on ver 31.0 or later.\");\n }\n var convert = function(md) {\n if (_.isString(md)) {\n md = { fullName : md };\n }\n md[\"@xsi:type\"] = type;\n return md;\n };\n var isArray = _.isArray(metadata);\n metadata = isArray ? _.map(metadata, convert) : convert(metadata);\n var res = this._invoke(\"delete\", { metadata: metadata });\n return new AsyncResultLocator(this, res, isArray).thenCall(callback);\n};\n\n/**\n * Synonym of Metadata#delete().\n *\n * @deprecated\n * @method Metadata#del\n * @param {String} [type] - The type of metadata to delete\n * @param {String|Metadata~MetadataInfo|Array.|Array.} metadata - The fullName of metadata or metadata info to delete. If it is passed in fullName, the type parameter should not be empty.\n * @param {Callback.>} [callback] - Callback function\n * @returns {Metadata~AsyncResultLocator}\n */\n/**\n * Synonym of Metadata#delete().\n *\n * @method Metadata#deleteSync\n * @param {String} type - The type of metadata to delete\n * @param {String|Array.} fullNames - The fullName of metadata to delete.\n * @param {Callback.>} [callback] - Callback function\n * @returns {Promise.>}\n */\n\n/**\n * Synchronously deletes specified metadata components in the organization.\n *\n * @method Metadata#delete\n * @param {String} type - The type of metadata to delete\n * @param {String|Array.} fullNames - The fullName of metadata to delete.\n * @param {Callback.>} [callback] - Callback function\n * @returns {Promise.>}\n */\nMetadata.prototype.del =\nMetadata.prototype.deleteSync =\nMetadata.prototype[\"delete\"] = function(type, fullNames, callback) {\n return this._invoke(\"deleteMetadata\", { type: type, fullNames: fullNames }).then(function(results) {\n return _.isArray(results) ? _.map(results, convertToSaveResult) : convertToSaveResult(results);\n }).thenCall(callback);\n};\n\n/**\n * Rename fullname of a metadata component in the organization\n *\n * @param {String} type - The type of metadata to delete\n * @param {String} oldFullName - The original fullName of metadata\n * @param {String} newFullName - The new fullName of metadata\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\nMetadata.prototype.rename = function(type, oldFullName, newFullName, callback) {\n return this._invoke(\"renameMetadata\", { type: type, oldFullName: oldFullName, newFullName: newFullName }).then(function(result) {\n return convertToSaveResult(result);\n }).thenCall(callback);\n};\n\n/**\n * Checks the status of asynchronous metadata calls\n *\n * @param {String|Array.} ids - The asynchronous process ID(s)\n * @param {Callback.>} [callback] - Callback function\n * @returns {Metadata~AsyncResultLocator}\n */\nMetadata.prototype.checkStatus = function(ids, callback) {\n var isArray = _.isArray(ids);\n var res = this._invoke(\"checkStatus\", { asyncProcessId: ids });\n return new AsyncResultLocator(this, res, isArray).thenCall(callback);\n};\n\n/**\n * @typedef {Object} Metadata~DescribeMetadataResult\n * @prop {Array.} metadataObjects - One or more metadata components and their attributes\n * @prop {Array.} metadataObjects.childXmlNames - List of child sub-components for this component\n * @prop {String} metadataObjects.directoryName - The name of the directory in the .zip file that contains this component\n * @prop {Boolean} metadataObjects.inFolder - Indicates whether the component is in a folder or not\n * @prop {Boolean} metadataObjects.metaFile - Indicates whether the component requires an accompanying metadata file\n * @prop {String} metadataObjects.suffix - The file suffix for this component\n * @prop {String} metadataObjects.xmlName - The name of the root element in the metadata file for this component\n * @prop {String} organizationNamespace - The namespace of the organization\n * @prop {Boolean} partialSaveAllowed - Indicates whether rollbackOnError is allowed or not\n * @prop {Boolean} testRequired - Indicates whether tests are required or not\n */\n\n/**\n * Retrieves the metadata which describes your organization, including Apex classes and triggers,\n * custom objects, custom fields on standard objects, tab sets that define an app,\n * and many other components.\n *\n * @param {String} [version] - The API version for which you want metadata; for example, 29.0\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\nMetadata.prototype.describe = function(version, callback) {\n if (!_.isString(version)) {\n callback = version;\n version = this._conn.version;\n }\n return this._invoke(\"describeMetadata\", { asOfVersion: version }).then(function(res) {\n res.metadataObjects = _.isArray(res.metadataObjects) ? res.metadataObjects : [ res.metadataObjects ];\n res.metadataObjects = _.map(res.metadataObjects, function(mo) {\n if (mo.childXmlNames) {\n mo.childXmlNames = _.isArray(mo.childXmlNames) ? mo.childXmlNames: [ mo.childXmlNames ];\n }\n mo.inFolder = mo.inFolder === 'true';\n mo.metaFile = mo.metaFile === 'true';\n return mo;\n });\n res.partialSaveAllowed = res.partialSaveAllowed === 'true';\n res.testRequired = res.testRequired === 'true';\n return res;\n }).thenCall(callback);\n};\n\n/**\n * @typedef {Object} Metadata~ListMetadataQuery\n * @prop {String} type - The metadata type, such as CustomObject, CustomField, or ApexClass\n * @prop {String} [folder] - The folder associated with the component.\n */\n\n/**\n * @typedef {Object} Metadata~FileProperties\n * @prop {String} type - The metadata type, such as CustomObject, CustomField, or ApexClass\n * @prop {String} createdById - ID of the user who created the file\n * @prop {String} createdByName - Name of the user who created the file\n * @prop {String} createdDate - Date and time when the file was created\n * @prop {String} fileName - Name of the file\n * @prop {String} fullName - The file developer name used as a unique identifier for API access\n * @prop {String} id - ID of the file\n * @prop {String} lastModifiedById - ID of the user who last modified the file\n * @prop {String} lastModifiedByName - Name of the user who last modified the file\n * @prop {String} lastModifiedDate - Date and time that the file was last modified\n * @prop {String} [manageableState] - Indicates the manageable state of the specified component if it is contained in a package\n * @prop {String} [namespacePrefix] - The namespace prefix of the component\n */\n\n/**\n * Retrieves property information about metadata components in your organization\n *\n * @param {Metadata~ListMetadataQuery|Array.} queries - The criteria object(s) specifing metadata to list\n * @param {String} [version] - The API version for which you want metadata; for example, 29.0\n * @param {Callback.>} [callback] - Callback function\n * @returns {Promise.>}\n */\nMetadata.prototype.list = function(queries, version, callback) {\n if (!_.isString(version)) {\n callback = version;\n version = this._conn.version;\n }\n if (!_.isArray(queries)) {\n queries = [ queries ];\n }\n return this._invoke(\"listMetadata\", { queries: queries, asOfVersion: version }, callback);\n};\n\n/**\n * @typedef {Object} Metadata~RetrieveRequest\n */\n\n/**\n * Retrieves XML file representations of components in an organization\n *\n * @param {Metadata~RetrieveRequest} request - Options for determining which packages or files are retrieved\n * @param {Callback.} [callback] - Callback function\n * @returns {Metadata~RetrieveResultLocator}\n */\nMetadata.prototype.retrieve = function(request, callback) {\n var res = this._invoke(\"retrieve\", { request: request });\n return new RetrieveResultLocator(this, res).thenCall(callback);\n};\n\n/**\n * Checks the status of declarative metadata call retrieve() and returns the zip file contents\n *\n * @param {String} id - Async process id returned from previous retrieve request\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\nMetadata.prototype.checkRetrieveStatus = function(id, callback) {\n return this._invoke(\"checkRetrieveStatus\", { asyncProcessId: id }, callback);\n};\n\n/**\n * Deploy components into an organization using zipped file representations\n *\n * @param {stream.Stream|Buffer|String} zipInput - Zipped file input source in readable stream, binary buffer or Base64-encoded string\n * @param {Object} [options] - Options used in deployment\n * @param {Boolean} [options.allowMissingFiles] - Specifies whether a deploy succeeds even if files that are specified in package.xml but are not in the .zip file or not.\n * @param {Boolean} [options.autoUpdatePackage] - If a file is in the .zip file but not specified in package.xml, specifies whether the file should be automatically added to the package or not.\n * @param {Boolean} [options.checkOnly] - Indicates whether Apex classes and triggers are saved to the organization as part of the deployment (false) or not (true).\n * @param {Boolean} [options.ignoreWarnings] - Indicates whether a warning should allow a deployment to complete successfully (true) or not (false). Defaults to false.\n * @param {Boolean} [options.performRetrieve] - Indicates whether a retrieve() call is performed immediately after the deployment (true) or not (false).\n * @param {Boolean} [options.purgeOnDelete] - If true, the deleted components in the destructiveChanges.xml manifest file aren't stored in the Recycle Bin.\n * @param {Boolean} [options.rollbackOnError] - Indicates whether any failure causes a complete rollback (true) or not (false).\n * @param {Boolean} [options.runAllTests] - If true, all Apex tests defined in the organization are run.\n * @param {Array.} [options.runTests] - A list of Apex tests to be run during deployment.\n * @param {Boolean} [options.singlePackage] - Indicates whether the specified .zip file points to a directory structure with a single package (true) or a set of packages (false).\n * @param {Callback.} [callback] - Callback function\n * @returns {Metadata~DeployResultLocator}\n */\nMetadata.prototype.deploy = function(zipInput, options, callback) {\n if (!options || _.isFunction(options)) {\n callback = options;\n options = {};\n }\n var deferred = Promise.defer();\n if (_.isObject(zipInput) && _.isFunction(zipInput.pipe)) {\n var bufs = [];\n zipInput.on('data', function(d) {\n bufs.push(d);\n });\n zipInput.on('end', function() {\n deferred.resolve(Buffer.concat(bufs).toString('base64'));\n });\n // zipInput.resume();\n } else if (zipInput instanceof Buffer) {\n deferred.resolve(zipInput.toString('base64'));\n } else if (zipInput instanceof String || typeof zipInput === 'string') {\n deferred.resolve(zipInput);\n } else {\n throw \"Unexpected zipInput type\";\n }\n\n var self = this;\n var res = deferred.promise.then(function(zipContentB64) {\n return self._invoke(\"deploy\", {\n ZipFile: zipContentB64,\n DeployOptions: options\n }, callback);\n });\n return new DeployResultLocator(this, res).thenCall(callback);\n};\n\n/**\n * Checks the status of declarative metadata call deploy()\n *\n * @param {String} id - Async process id returned from previous deploy request\n * @param {Boolean} [includeDetails] - Sets the DeployResult object to include details information (default: false)\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\nMetadata.prototype.checkDeployStatus = function(id, includeDetails, callback) {\n if (_.isObject(includeDetails) || _.isBoolean(includeDetails)) {\n includeDetails = !!includeDetails;\n } else {\n callback = includeDetails;\n includeDetails = false;\n }\n return this._invoke(\"checkDeployStatus\", {\n asyncProcessId: id,\n includeDetails : includeDetails\n }).then(function(res) {\n res.done = res.done === 'true';\n res.success = res.success === 'true';\n res.checkOnly = res.checkOnly === 'true';\n res.runTestsEnabled = res.runTestsEnabled === 'true';\n if (res.ignoreWarnings) {\n res.ignoreWarnings = res.ignoreWarnings === 'true';\n }\n if (res.rollbackOnError) {\n res.rollbackOnError = res.rollbackOnError === 'true';\n }\n res.numberComponentErrors = Number(res.numberComponentErrors);\n res.numberComponentsDeployed = Number(res.numberComponentsDeployed);\n res.numberComponentsTotal = Number(res.numberComponentsTotal);\n res.numberTestErrors = Number(res.numberTestErrors);\n res.numberTestsCompleted = Number(res.numberTestsCompleted);\n res.numberTestsTotal = Number(res.numberTestsTotal);\n\n return res;\n }).thenCall(callback);\n};\n\n\n/*--------------------------------------------*/\n\n/**\n * @typedef {Object} Metadata~AsyncResult\n * @prop {Boolean} done - Indicates whether the call has completed or not\n * @prop {String} id - ID of the component being created, updated, deleted, deployed, or retrieved\n * @prop {String} state - The state four possible values: Queued, InProgress, Completed, and Error.\n * @prop {String} [statusCode] - If an error occurred during the create(), update(), or delete() call, a status code is returned\n * @prop {String} [message] - Message corresponding to the statusCode field returned\n */\n\n/**\n * The locator class for Metadata API asynchronous call result\n *\n * @protected\n * @class Metadata~AsyncResultLocator\n * @extends events.EventEmitter\n * @implements Promise.>\n * @param {Metadata} meta - Metadata API object\n * @param {Promise.>} results - Promise object for async result info\n * @param {Boolean} [isArray] - Indicates whether the async request is given in array or single object\n */\nvar AsyncResultLocator = function(meta, results, isArray) {\n this._meta = meta;\n this._results = results;\n this._isArray = isArray;\n};\n\ninherits(AsyncResultLocator, events.EventEmitter);\n\n/**\n * Promise/A+ interface\n * http://promises-aplus.github.io/promises-spec/\n *\n * Delegate to deferred promise, return promise instance for batch result\n *\n * @method Metadata~AsyncResultLocator#then\n */\nAsyncResultLocator.prototype.then = function(onResolve, onReject) {\n var self = this;\n return this._results.then(function(results) {\n var convertType = function(res) {\n if (res.$ && res.$[\"xsi:nil\"] === 'true') {\n return null;\n }\n res.done = res.done === 'true';\n return res;\n };\n results = _.isArray(results) ? _.map(results, convertType) : convertType(results);\n if (self._isArray && !_.isArray(results)) {\n results = [ results ];\n }\n return onResolve(results);\n }, onReject);\n};\n\n/**\n * Promise/A+ extension\n * Call \"then\" using given node-style callback function\n *\n * @method Metadata~AsyncResultLocator#thenCall\n */\nAsyncResultLocator.prototype.thenCall = function(callback) {\n return _.isFunction(callback) ? this.then(function(res) {\n process.nextTick(function() {\n callback(null, res);\n });\n }, function(err) {\n process.nextTick(function() {\n callback(err);\n });\n }) : this;\n};\n\n/**\n * Check the status of async request\n *\n * @method Metadata~AsyncResultLocator#check\n * @param {Callback.>} [callback] - Callback function\n * @returns {Promise.>}\n */\nAsyncResultLocator.prototype.check = function(callback) {\n var self = this;\n var meta = this._meta;\n return this.then(function(results) {\n var ids = _.isArray(results) ? _.map(results, function(res){ return res.id; }) : results.id;\n self._ids = ids;\n return meta.checkStatus(ids);\n }).thenCall(callback);\n};\n\n/**\n * Polling until async call status becomes complete or error\n *\n * @method Metadata~AsyncResultLocator#poll\n * @param {Number} interval - Polling interval in milliseconds\n * @param {Number} timeout - Polling timeout in milliseconds\n */\nAsyncResultLocator.prototype.poll = function(interval, timeout) {\n var self = this;\n var startTime = new Date().getTime();\n var poll = function() {\n var now = new Date().getTime();\n if (startTime + timeout < now) {\n var errMsg = \"Polling time out.\";\n if (self._ids) {\n errMsg += \" Process Id = \" + self._ids;\n }\n self.emit('error', new Error(errMsg));\n return;\n }\n self.check().then(function(results) {\n var done = true;\n var resultArr = _.isArray(results) ? results : [ results ];\n for (var i=0, len=resultArr.length; i>} [callback] - Callback function\n * @returns {Promise.>}\n */\nAsyncResultLocator.prototype.complete = function(callback) {\n var deferred = Promise.defer();\n this.on('complete', function(results) {\n deferred.resolve(results);\n });\n this.on('error', function(err) {\n deferred.reject(err);\n });\n var meta = this._meta;\n this.poll(meta.pollInterval, meta.pollTimeout);\n return deferred.promise.thenCall(callback);\n};\n\n/*--------------------------------------------*/\n/**\n * The locator class to track retreive() Metadata API call result\n *\n * @protected\n * @class Metadata~RetrieveResultLocator\n * @extends Metadata~AsyncResultLocator\n * @param {Metadata} meta - Metadata API object\n * @param {Promise.} result - Promise object for async result of retrieve call()\n */\nvar RetrieveResultLocator = function(meta, result) {\n RetrieveResultLocator.super_.call(this, meta, result);\n};\n\ninherits(RetrieveResultLocator, AsyncResultLocator);\n\n/**\n * @typedef {Object} Metadata~RetrieveResult\n * @prop {Array.} fileProperties - Contains information about the properties of each component in the .zip file, and the manifest file package.xml\n * @prop {String} id - ID of the component being retrieved\n * @prop {Array.} messages - Contains information about the success or failure of the retrieve() call\n * @prop {String} zipFile - The zip file returned by the retrieve request. Base 64-encoded binary data\n */\n\n/**\n * Check and wait until the async request becomes in completed status,\n * and retrieve the result data.\n *\n * @memthod Metadata~RetrieveResultLocator#complete\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\nRetrieveResultLocator.prototype.complete = function(callback) {\n var meta = this._meta;\n return RetrieveResultLocator.super_.prototype.complete.call(this).then(function(result) {\n return meta.checkRetrieveStatus(result.id);\n }).thenCall(callback);\n};\n\n/**\n * Change the retrieved result to Node.js readable stream\n *\n * @method Metadata~RetrieveResultLocator#stream\n * @returns {stream.Readable}\n */\nRetrieveResultLocator.prototype.stream = function() {\n var self = this;\n var resultStream = new stream.Readable();\n var reading = false;\n resultStream._read = function() {\n if (reading) { return; }\n reading = true;\n self.complete(function(err, result) {\n if (err) {\n resultStream.emit('error', err);\n } else {\n resultStream.push(new Buffer(result.zipFile, 'base64'));\n resultStream.push(null);\n }\n });\n };\n return resultStream;\n};\n\n/*--------------------------------------------*/\n/**\n * The locator class to track deploy() Metadata API call result\n *\n * @protected\n * @class Metadata~DeployResultLocator\n * @extends Metadata~AsyncResultLocator\n * @param {Metadata} meta - Metadata API object\n * @param {Promise.} result - Promise object for async result of deploy() call\n */\nvar DeployResultLocator = function(meta, result) {\n DeployResultLocator.super_.call(this, meta, result);\n};\n\ninherits(DeployResultLocator, AsyncResultLocator);\n\n/**\n * @typedef {Object} Metadata~DeployResult\n * @prop {String} id - ID of the component being deployed\n * @prop {Boolean} checkOnly - Indicates whether this deployment is being used to check the validity of the deployed files without making any changes in the organization or not\n * @prop {String} completedDate - Timestamp for when the deployment process ended\n * @prop {String} createdDate - Timestamp for when the deploy() call was received\n * @prop {Array.} [details] - Provides the details of a deployment that is in-progress or ended, if includeDetails is set to true in checkDeployStatus() call\n * @prop {Boolean} done - Indicates whether the server finished processing the deploy() call for the specified id\n * @prop {String} [errorMessage] - Message corresponding to the values in the errorStatusCode field\n * @prop {String} [errorStatusCode] - If an error occurred during the deploy() call, a status code is returned, and the message corresponding to the status code is returned in the errorMessagefield\n * @prop {Boolean} [ignoreWarnings] - Specifies whether a deployment should continue even if the deployment generates warnings\n * @prop {String} lastModifiedDate - Timestamp of the last update for the deployment process\n * @prop {Number} numberComponentErrors - The number of components that generated errors during this deployment\n * @prop {Number} numberComponentsDeployed - The number of components deployed in the deployment process\n * @prop {Number} numberComponentsTotal - The total number of components in the deployment\n * @prop {Number} numberTestErrors - The number of Apex tests that have generated errors during this deployment\n * @prop {Number} numberTestsCompleted - The number of completedApex tests for this deployment\n * @prop {Number} numberTestsTotal - The total number of Apex tests for this deployment\n * @prop {Boolean} [rollbackOnError] - Indicates whether any failure causes a complete rollback or not. Default is true.\n * @prop {String} startDate - Timestamp for when the deployment process began\n * @prop {String} status - Indicates the current state of the deployment\n * @prop {Boolean} success - Indicates whether the deployment was successful or not\n */\n\n/**\n * Check and wait until the async request becomes in completed status,\n * and retrieve the result data.\n *\n * @method Metadata~DeployResultLocator#complete\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\nDeployResultLocator.prototype.complete = function(includeDetails, callback) {\n if (_.isFunction(includeDetails)) {\n callback = includeDetails;\n includeDetails = false;\n }\n var meta = this._meta;\n return DeployResultLocator.super_.prototype.complete.call(this).then(function(result) {\n return meta.checkDeployStatus(result.id, includeDetails);\n }).thenCall(callback);\n};\n\n\n/*--------------------------------------------*/\n/*\n * Register hook in connection instantiation for dynamically adding this API module features\n */\njsforce.on('connection:new', function(conn) {\n conn.metadata = new Metadata(conn);\n});\n","'use strict'\n\nexports.byteLength = byteLength\nexports.toByteArray = toByteArray\nexports.fromByteArray = fromByteArray\n\nvar lookup = []\nvar revLookup = []\nvar Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array\n\nvar code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'\nfor (var i = 0, len = code.length; i < len; ++i) {\n lookup[i] = code[i]\n revLookup[code.charCodeAt(i)] = i\n}\n\n// Support decoding URL-safe base64 strings, as Node.js does.\n// See: https://en.wikipedia.org/wiki/Base64#URL_applications\nrevLookup['-'.charCodeAt(0)] = 62\nrevLookup['_'.charCodeAt(0)] = 63\n\nfunction getLens (b64) {\n var len = b64.length\n\n if (len % 4 > 0) {\n throw new Error('Invalid string. Length must be a multiple of 4')\n }\n\n // Trim off extra bytes after placeholder bytes are found\n // See: https://github.com/beatgammit/base64-js/issues/42\n var validLen = b64.indexOf('=')\n if (validLen === -1) validLen = len\n\n var placeHoldersLen = validLen === len\n ? 0\n : 4 - (validLen % 4)\n\n return [validLen, placeHoldersLen]\n}\n\n// base64 is 4/3 + up to two characters of the original data\nfunction byteLength (b64) {\n var lens = getLens(b64)\n var validLen = lens[0]\n var placeHoldersLen = lens[1]\n return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction _byteLength (b64, validLen, placeHoldersLen) {\n return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction toByteArray (b64) {\n var tmp\n var lens = getLens(b64)\n var validLen = lens[0]\n var placeHoldersLen = lens[1]\n\n var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen))\n\n var curByte = 0\n\n // if there are placeholders, only get up to the last complete 4 chars\n var len = placeHoldersLen > 0\n ? validLen - 4\n : validLen\n\n for (var i = 0; i < len; i += 4) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 18) |\n (revLookup[b64.charCodeAt(i + 1)] << 12) |\n (revLookup[b64.charCodeAt(i + 2)] << 6) |\n revLookup[b64.charCodeAt(i + 3)]\n arr[curByte++] = (tmp >> 16) & 0xFF\n arr[curByte++] = (tmp >> 8) & 0xFF\n arr[curByte++] = tmp & 0xFF\n }\n\n if (placeHoldersLen === 2) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 2) |\n (revLookup[b64.charCodeAt(i + 1)] >> 4)\n arr[curByte++] = tmp & 0xFF\n }\n\n if (placeHoldersLen === 1) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 10) |\n (revLookup[b64.charCodeAt(i + 1)] << 4) |\n (revLookup[b64.charCodeAt(i + 2)] >> 2)\n arr[curByte++] = (tmp >> 8) & 0xFF\n arr[curByte++] = tmp & 0xFF\n }\n\n return arr\n}\n\nfunction tripletToBase64 (num) {\n return lookup[num >> 18 & 0x3F] +\n lookup[num >> 12 & 0x3F] +\n lookup[num >> 6 & 0x3F] +\n lookup[num & 0x3F]\n}\n\nfunction encodeChunk (uint8, start, end) {\n var tmp\n var output = []\n for (var i = start; i < end; i += 3) {\n tmp =\n ((uint8[i] << 16) & 0xFF0000) +\n ((uint8[i + 1] << 8) & 0xFF00) +\n (uint8[i + 2] & 0xFF)\n output.push(tripletToBase64(tmp))\n }\n return output.join('')\n}\n\nfunction fromByteArray (uint8) {\n var tmp\n var len = uint8.length\n var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes\n var parts = []\n var maxChunkLength = 16383 // must be multiple of 3\n\n // go through the array every three bytes, we'll deal with trailing stuff later\n for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {\n parts.push(encodeChunk(\n uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)\n ))\n }\n\n // pad the end with zeros, but make sure to not forget the extra bytes\n if (extraBytes === 1) {\n tmp = uint8[len - 1]\n parts.push(\n lookup[tmp >> 2] +\n lookup[(tmp << 4) & 0x3F] +\n '=='\n )\n } else if (extraBytes === 2) {\n tmp = (uint8[len - 2] << 8) + uint8[len - 1]\n parts.push(\n lookup[tmp >> 10] +\n lookup[(tmp >> 4) & 0x3F] +\n lookup[(tmp << 2) & 0x3F] +\n '='\n )\n }\n\n return parts.join('')\n}\n","/*!\n * The buffer module from node.js, for the browser.\n *\n * @author Feross Aboukhadijeh \n * @license MIT\n */\n/* eslint-disable no-proto */\n\n'use strict'\n\nvar base64 = require('base64-js')\nvar ieee754 = require('ieee754')\n\nexports.Buffer = Buffer\nexports.SlowBuffer = SlowBuffer\nexports.INSPECT_MAX_BYTES = 50\n\nvar K_MAX_LENGTH = 0x7fffffff\nexports.kMaxLength = K_MAX_LENGTH\n\n/**\n * If `Buffer.TYPED_ARRAY_SUPPORT`:\n * === true Use Uint8Array implementation (fastest)\n * === false Print warning and recommend using `buffer` v4.x which has an Object\n * implementation (most compatible, even IE6)\n *\n * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+,\n * Opera 11.6+, iOS 4.2+.\n *\n * We report that the browser does not support typed arrays if the are not subclassable\n * using __proto__. Firefox 4-29 lacks support for adding new properties to `Uint8Array`\n * (See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438). IE 10 lacks support\n * for __proto__ and has a buggy typed array implementation.\n */\nBuffer.TYPED_ARRAY_SUPPORT = typedArraySupport()\n\nif (!Buffer.TYPED_ARRAY_SUPPORT && typeof console !== 'undefined' &&\n typeof console.error === 'function') {\n console.error(\n 'This browser lacks typed array (Uint8Array) support which is required by ' +\n '`buffer` v5.x. Use `buffer` v4.x if you require old browser support.'\n )\n}\n\nfunction typedArraySupport () {\n // Can typed array instances can be augmented?\n try {\n var arr = new Uint8Array(1)\n arr.__proto__ = {__proto__: Uint8Array.prototype, foo: function () { return 42 }}\n return arr.foo() === 42\n } catch (e) {\n return false\n }\n}\n\nObject.defineProperty(Buffer.prototype, 'parent', {\n get: function () {\n if (!(this instanceof Buffer)) {\n return undefined\n }\n return this.buffer\n }\n})\n\nObject.defineProperty(Buffer.prototype, 'offset', {\n get: function () {\n if (!(this instanceof Buffer)) {\n return undefined\n }\n return this.byteOffset\n }\n})\n\nfunction createBuffer (length) {\n if (length > K_MAX_LENGTH) {\n throw new RangeError('Invalid typed array length')\n }\n // Return an augmented `Uint8Array` instance\n var buf = new Uint8Array(length)\n buf.__proto__ = Buffer.prototype\n return buf\n}\n\n/**\n * The Buffer constructor returns instances of `Uint8Array` that have their\n * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of\n * `Uint8Array`, so the returned instances will have all the node `Buffer` methods\n * and the `Uint8Array` methods. Square bracket notation works as expected -- it\n * returns a single octet.\n *\n * The `Uint8Array` prototype remains unmodified.\n */\n\nfunction Buffer (arg, encodingOrOffset, length) {\n // Common case.\n if (typeof arg === 'number') {\n if (typeof encodingOrOffset === 'string') {\n throw new Error(\n 'If encoding is specified then the first argument must be a string'\n )\n }\n return allocUnsafe(arg)\n }\n return from(arg, encodingOrOffset, length)\n}\n\n// Fix subarray() in ES2016. See: https://github.com/feross/buffer/pull/97\nif (typeof Symbol !== 'undefined' && Symbol.species &&\n Buffer[Symbol.species] === Buffer) {\n Object.defineProperty(Buffer, Symbol.species, {\n value: null,\n configurable: true,\n enumerable: false,\n writable: false\n })\n}\n\nBuffer.poolSize = 8192 // not used by this implementation\n\nfunction from (value, encodingOrOffset, length) {\n if (typeof value === 'number') {\n throw new TypeError('\"value\" argument must not be a number')\n }\n\n if (isArrayBuffer(value) || (value && isArrayBuffer(value.buffer))) {\n return fromArrayBuffer(value, encodingOrOffset, length)\n }\n\n if (typeof value === 'string') {\n return fromString(value, encodingOrOffset)\n }\n\n return fromObject(value)\n}\n\n/**\n * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError\n * if value is a number.\n * Buffer.from(str[, encoding])\n * Buffer.from(array)\n * Buffer.from(buffer)\n * Buffer.from(arrayBuffer[, byteOffset[, length]])\n **/\nBuffer.from = function (value, encodingOrOffset, length) {\n return from(value, encodingOrOffset, length)\n}\n\n// Note: Change prototype *after* Buffer.from is defined to workaround Chrome bug:\n// https://github.com/feross/buffer/pull/148\nBuffer.prototype.__proto__ = Uint8Array.prototype\nBuffer.__proto__ = Uint8Array\n\nfunction assertSize (size) {\n if (typeof size !== 'number') {\n throw new TypeError('\"size\" argument must be of type number')\n } else if (size < 0) {\n throw new RangeError('\"size\" argument must not be negative')\n }\n}\n\nfunction alloc (size, fill, encoding) {\n assertSize(size)\n if (size <= 0) {\n return createBuffer(size)\n }\n if (fill !== undefined) {\n // Only pay attention to encoding if it's a string. This\n // prevents accidentally sending in a number that would\n // be interpretted as a start offset.\n return typeof encoding === 'string'\n ? createBuffer(size).fill(fill, encoding)\n : createBuffer(size).fill(fill)\n }\n return createBuffer(size)\n}\n\n/**\n * Creates a new filled Buffer instance.\n * alloc(size[, fill[, encoding]])\n **/\nBuffer.alloc = function (size, fill, encoding) {\n return alloc(size, fill, encoding)\n}\n\nfunction allocUnsafe (size) {\n assertSize(size)\n return createBuffer(size < 0 ? 0 : checked(size) | 0)\n}\n\n/**\n * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance.\n * */\nBuffer.allocUnsafe = function (size) {\n return allocUnsafe(size)\n}\n/**\n * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance.\n */\nBuffer.allocUnsafeSlow = function (size) {\n return allocUnsafe(size)\n}\n\nfunction fromString (string, encoding) {\n if (typeof encoding !== 'string' || encoding === '') {\n encoding = 'utf8'\n }\n\n if (!Buffer.isEncoding(encoding)) {\n throw new TypeError('Unknown encoding: ' + encoding)\n }\n\n var length = byteLength(string, encoding) | 0\n var buf = createBuffer(length)\n\n var actual = buf.write(string, encoding)\n\n if (actual !== length) {\n // Writing a hex string, for example, that contains invalid characters will\n // cause everything after the first invalid character to be ignored. (e.g.\n // 'abxxcd' will be treated as 'ab')\n buf = buf.slice(0, actual)\n }\n\n return buf\n}\n\nfunction fromArrayLike (array) {\n var length = array.length < 0 ? 0 : checked(array.length) | 0\n var buf = createBuffer(length)\n for (var i = 0; i < length; i += 1) {\n buf[i] = array[i] & 255\n }\n return buf\n}\n\nfunction fromArrayBuffer (array, byteOffset, length) {\n if (byteOffset < 0 || array.byteLength < byteOffset) {\n throw new RangeError('\"offset\" is outside of buffer bounds')\n }\n\n if (array.byteLength < byteOffset + (length || 0)) {\n throw new RangeError('\"length\" is outside of buffer bounds')\n }\n\n var buf\n if (byteOffset === undefined && length === undefined) {\n buf = new Uint8Array(array)\n } else if (length === undefined) {\n buf = new Uint8Array(array, byteOffset)\n } else {\n buf = new Uint8Array(array, byteOffset, length)\n }\n\n // Return an augmented `Uint8Array` instance\n buf.__proto__ = Buffer.prototype\n return buf\n}\n\nfunction fromObject (obj) {\n if (Buffer.isBuffer(obj)) {\n var len = checked(obj.length) | 0\n var buf = createBuffer(len)\n\n if (buf.length === 0) {\n return buf\n }\n\n obj.copy(buf, 0, 0, len)\n return buf\n }\n\n if (obj) {\n if (ArrayBuffer.isView(obj) || 'length' in obj) {\n if (typeof obj.length !== 'number' || numberIsNaN(obj.length)) {\n return createBuffer(0)\n }\n return fromArrayLike(obj)\n }\n\n if (obj.type === 'Buffer' && Array.isArray(obj.data)) {\n return fromArrayLike(obj.data)\n }\n }\n\n throw new TypeError('The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object.')\n}\n\nfunction checked (length) {\n // Note: cannot use `length < K_MAX_LENGTH` here because that fails when\n // length is NaN (which is otherwise coerced to zero.)\n if (length >= K_MAX_LENGTH) {\n throw new RangeError('Attempt to allocate Buffer larger than maximum ' +\n 'size: 0x' + K_MAX_LENGTH.toString(16) + ' bytes')\n }\n return length | 0\n}\n\nfunction SlowBuffer (length) {\n if (+length != length) { // eslint-disable-line eqeqeq\n length = 0\n }\n return Buffer.alloc(+length)\n}\n\nBuffer.isBuffer = function isBuffer (b) {\n return b != null && b._isBuffer === true\n}\n\nBuffer.compare = function compare (a, b) {\n if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) {\n throw new TypeError('Arguments must be Buffers')\n }\n\n if (a === b) return 0\n\n var x = a.length\n var y = b.length\n\n for (var i = 0, len = Math.min(x, y); i < len; ++i) {\n if (a[i] !== b[i]) {\n x = a[i]\n y = b[i]\n break\n }\n }\n\n if (x < y) return -1\n if (y < x) return 1\n return 0\n}\n\nBuffer.isEncoding = function isEncoding (encoding) {\n switch (String(encoding).toLowerCase()) {\n case 'hex':\n case 'utf8':\n case 'utf-8':\n case 'ascii':\n case 'latin1':\n case 'binary':\n case 'base64':\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return true\n default:\n return false\n }\n}\n\nBuffer.concat = function concat (list, length) {\n if (!Array.isArray(list)) {\n throw new TypeError('\"list\" argument must be an Array of Buffers')\n }\n\n if (list.length === 0) {\n return Buffer.alloc(0)\n }\n\n var i\n if (length === undefined) {\n length = 0\n for (i = 0; i < list.length; ++i) {\n length += list[i].length\n }\n }\n\n var buffer = Buffer.allocUnsafe(length)\n var pos = 0\n for (i = 0; i < list.length; ++i) {\n var buf = list[i]\n if (ArrayBuffer.isView(buf)) {\n buf = Buffer.from(buf)\n }\n if (!Buffer.isBuffer(buf)) {\n throw new TypeError('\"list\" argument must be an Array of Buffers')\n }\n buf.copy(buffer, pos)\n pos += buf.length\n }\n return buffer\n}\n\nfunction byteLength (string, encoding) {\n if (Buffer.isBuffer(string)) {\n return string.length\n }\n if (ArrayBuffer.isView(string) || isArrayBuffer(string)) {\n return string.byteLength\n }\n if (typeof string !== 'string') {\n string = '' + string\n }\n\n var len = string.length\n if (len === 0) return 0\n\n // Use a for loop to avoid recursion\n var loweredCase = false\n for (;;) {\n switch (encoding) {\n case 'ascii':\n case 'latin1':\n case 'binary':\n return len\n case 'utf8':\n case 'utf-8':\n case undefined:\n return utf8ToBytes(string).length\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return len * 2\n case 'hex':\n return len >>> 1\n case 'base64':\n return base64ToBytes(string).length\n default:\n if (loweredCase) return utf8ToBytes(string).length // assume utf8\n encoding = ('' + encoding).toLowerCase()\n loweredCase = true\n }\n }\n}\nBuffer.byteLength = byteLength\n\nfunction slowToString (encoding, start, end) {\n var loweredCase = false\n\n // No need to verify that \"this.length <= MAX_UINT32\" since it's a read-only\n // property of a typed array.\n\n // This behaves neither like String nor Uint8Array in that we set start/end\n // to their upper/lower bounds if the value passed is out of range.\n // undefined is handled specially as per ECMA-262 6th Edition,\n // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization.\n if (start === undefined || start < 0) {\n start = 0\n }\n // Return early if start > this.length. Done here to prevent potential uint32\n // coercion fail below.\n if (start > this.length) {\n return ''\n }\n\n if (end === undefined || end > this.length) {\n end = this.length\n }\n\n if (end <= 0) {\n return ''\n }\n\n // Force coersion to uint32. This will also coerce falsey/NaN values to 0.\n end >>>= 0\n start >>>= 0\n\n if (end <= start) {\n return ''\n }\n\n if (!encoding) encoding = 'utf8'\n\n while (true) {\n switch (encoding) {\n case 'hex':\n return hexSlice(this, start, end)\n\n case 'utf8':\n case 'utf-8':\n return utf8Slice(this, start, end)\n\n case 'ascii':\n return asciiSlice(this, start, end)\n\n case 'latin1':\n case 'binary':\n return latin1Slice(this, start, end)\n\n case 'base64':\n return base64Slice(this, start, end)\n\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return utf16leSlice(this, start, end)\n\n default:\n if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n encoding = (encoding + '').toLowerCase()\n loweredCase = true\n }\n }\n}\n\n// This property is used by `Buffer.isBuffer` (and the `is-buffer` npm package)\n// to detect a Buffer instance. It's not possible to use `instanceof Buffer`\n// reliably in a browserify context because there could be multiple different\n// copies of the 'buffer' package in use. This method works even for Buffer\n// instances that were created from another copy of the `buffer` package.\n// See: https://github.com/feross/buffer/issues/154\nBuffer.prototype._isBuffer = true\n\nfunction swap (b, n, m) {\n var i = b[n]\n b[n] = b[m]\n b[m] = i\n}\n\nBuffer.prototype.swap16 = function swap16 () {\n var len = this.length\n if (len % 2 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 16-bits')\n }\n for (var i = 0; i < len; i += 2) {\n swap(this, i, i + 1)\n }\n return this\n}\n\nBuffer.prototype.swap32 = function swap32 () {\n var len = this.length\n if (len % 4 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 32-bits')\n }\n for (var i = 0; i < len; i += 4) {\n swap(this, i, i + 3)\n swap(this, i + 1, i + 2)\n }\n return this\n}\n\nBuffer.prototype.swap64 = function swap64 () {\n var len = this.length\n if (len % 8 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 64-bits')\n }\n for (var i = 0; i < len; i += 8) {\n swap(this, i, i + 7)\n swap(this, i + 1, i + 6)\n swap(this, i + 2, i + 5)\n swap(this, i + 3, i + 4)\n }\n return this\n}\n\nBuffer.prototype.toString = function toString () {\n var length = this.length\n if (length === 0) return ''\n if (arguments.length === 0) return utf8Slice(this, 0, length)\n return slowToString.apply(this, arguments)\n}\n\nBuffer.prototype.toLocaleString = Buffer.prototype.toString\n\nBuffer.prototype.equals = function equals (b) {\n if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')\n if (this === b) return true\n return Buffer.compare(this, b) === 0\n}\n\nBuffer.prototype.inspect = function inspect () {\n var str = ''\n var max = exports.INSPECT_MAX_BYTES\n if (this.length > 0) {\n str = this.toString('hex', 0, max).match(/.{2}/g).join(' ')\n if (this.length > max) str += ' ... '\n }\n return ''\n}\n\nBuffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) {\n if (!Buffer.isBuffer(target)) {\n throw new TypeError('Argument must be a Buffer')\n }\n\n if (start === undefined) {\n start = 0\n }\n if (end === undefined) {\n end = target ? target.length : 0\n }\n if (thisStart === undefined) {\n thisStart = 0\n }\n if (thisEnd === undefined) {\n thisEnd = this.length\n }\n\n if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) {\n throw new RangeError('out of range index')\n }\n\n if (thisStart >= thisEnd && start >= end) {\n return 0\n }\n if (thisStart >= thisEnd) {\n return -1\n }\n if (start >= end) {\n return 1\n }\n\n start >>>= 0\n end >>>= 0\n thisStart >>>= 0\n thisEnd >>>= 0\n\n if (this === target) return 0\n\n var x = thisEnd - thisStart\n var y = end - start\n var len = Math.min(x, y)\n\n var thisCopy = this.slice(thisStart, thisEnd)\n var targetCopy = target.slice(start, end)\n\n for (var i = 0; i < len; ++i) {\n if (thisCopy[i] !== targetCopy[i]) {\n x = thisCopy[i]\n y = targetCopy[i]\n break\n }\n }\n\n if (x < y) return -1\n if (y < x) return 1\n return 0\n}\n\n// Finds either the first index of `val` in `buffer` at offset >= `byteOffset`,\n// OR the last index of `val` in `buffer` at offset <= `byteOffset`.\n//\n// Arguments:\n// - buffer - a Buffer to search\n// - val - a string, Buffer, or number\n// - byteOffset - an index into `buffer`; will be clamped to an int32\n// - encoding - an optional encoding, relevant is val is a string\n// - dir - true for indexOf, false for lastIndexOf\nfunction bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) {\n // Empty buffer means no match\n if (buffer.length === 0) return -1\n\n // Normalize byteOffset\n if (typeof byteOffset === 'string') {\n encoding = byteOffset\n byteOffset = 0\n } else if (byteOffset > 0x7fffffff) {\n byteOffset = 0x7fffffff\n } else if (byteOffset < -0x80000000) {\n byteOffset = -0x80000000\n }\n byteOffset = +byteOffset // Coerce to Number.\n if (numberIsNaN(byteOffset)) {\n // byteOffset: it it's undefined, null, NaN, \"foo\", etc, search whole buffer\n byteOffset = dir ? 0 : (buffer.length - 1)\n }\n\n // Normalize byteOffset: negative offsets start from the end of the buffer\n if (byteOffset < 0) byteOffset = buffer.length + byteOffset\n if (byteOffset >= buffer.length) {\n if (dir) return -1\n else byteOffset = buffer.length - 1\n } else if (byteOffset < 0) {\n if (dir) byteOffset = 0\n else return -1\n }\n\n // Normalize val\n if (typeof val === 'string') {\n val = Buffer.from(val, encoding)\n }\n\n // Finally, search either indexOf (if dir is true) or lastIndexOf\n if (Buffer.isBuffer(val)) {\n // Special case: looking for empty string/buffer always fails\n if (val.length === 0) {\n return -1\n }\n return arrayIndexOf(buffer, val, byteOffset, encoding, dir)\n } else if (typeof val === 'number') {\n val = val & 0xFF // Search for a byte value [0-255]\n if (typeof Uint8Array.prototype.indexOf === 'function') {\n if (dir) {\n return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset)\n } else {\n return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset)\n }\n }\n return arrayIndexOf(buffer, [ val ], byteOffset, encoding, dir)\n }\n\n throw new TypeError('val must be string, number or Buffer')\n}\n\nfunction arrayIndexOf (arr, val, byteOffset, encoding, dir) {\n var indexSize = 1\n var arrLength = arr.length\n var valLength = val.length\n\n if (encoding !== undefined) {\n encoding = String(encoding).toLowerCase()\n if (encoding === 'ucs2' || encoding === 'ucs-2' ||\n encoding === 'utf16le' || encoding === 'utf-16le') {\n if (arr.length < 2 || val.length < 2) {\n return -1\n }\n indexSize = 2\n arrLength /= 2\n valLength /= 2\n byteOffset /= 2\n }\n }\n\n function read (buf, i) {\n if (indexSize === 1) {\n return buf[i]\n } else {\n return buf.readUInt16BE(i * indexSize)\n }\n }\n\n var i\n if (dir) {\n var foundIndex = -1\n for (i = byteOffset; i < arrLength; i++) {\n if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) {\n if (foundIndex === -1) foundIndex = i\n if (i - foundIndex + 1 === valLength) return foundIndex * indexSize\n } else {\n if (foundIndex !== -1) i -= i - foundIndex\n foundIndex = -1\n }\n }\n } else {\n if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength\n for (i = byteOffset; i >= 0; i--) {\n var found = true\n for (var j = 0; j < valLength; j++) {\n if (read(arr, i + j) !== read(val, j)) {\n found = false\n break\n }\n }\n if (found) return i\n }\n }\n\n return -1\n}\n\nBuffer.prototype.includes = function includes (val, byteOffset, encoding) {\n return this.indexOf(val, byteOffset, encoding) !== -1\n}\n\nBuffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) {\n return bidirectionalIndexOf(this, val, byteOffset, encoding, true)\n}\n\nBuffer.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) {\n return bidirectionalIndexOf(this, val, byteOffset, encoding, false)\n}\n\nfunction hexWrite (buf, string, offset, length) {\n offset = Number(offset) || 0\n var remaining = buf.length - offset\n if (!length) {\n length = remaining\n } else {\n length = Number(length)\n if (length > remaining) {\n length = remaining\n }\n }\n\n var strLen = string.length\n\n if (length > strLen / 2) {\n length = strLen / 2\n }\n for (var i = 0; i < length; ++i) {\n var parsed = parseInt(string.substr(i * 2, 2), 16)\n if (numberIsNaN(parsed)) return i\n buf[offset + i] = parsed\n }\n return i\n}\n\nfunction utf8Write (buf, string, offset, length) {\n return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nfunction asciiWrite (buf, string, offset, length) {\n return blitBuffer(asciiToBytes(string), buf, offset, length)\n}\n\nfunction latin1Write (buf, string, offset, length) {\n return asciiWrite(buf, string, offset, length)\n}\n\nfunction base64Write (buf, string, offset, length) {\n return blitBuffer(base64ToBytes(string), buf, offset, length)\n}\n\nfunction ucs2Write (buf, string, offset, length) {\n return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nBuffer.prototype.write = function write (string, offset, length, encoding) {\n // Buffer#write(string)\n if (offset === undefined) {\n encoding = 'utf8'\n length = this.length\n offset = 0\n // Buffer#write(string, encoding)\n } else if (length === undefined && typeof offset === 'string') {\n encoding = offset\n length = this.length\n offset = 0\n // Buffer#write(string, offset[, length][, encoding])\n } else if (isFinite(offset)) {\n offset = offset >>> 0\n if (isFinite(length)) {\n length = length >>> 0\n if (encoding === undefined) encoding = 'utf8'\n } else {\n encoding = length\n length = undefined\n }\n } else {\n throw new Error(\n 'Buffer.write(string, encoding, offset[, length]) is no longer supported'\n )\n }\n\n var remaining = this.length - offset\n if (length === undefined || length > remaining) length = remaining\n\n if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) {\n throw new RangeError('Attempt to write outside buffer bounds')\n }\n\n if (!encoding) encoding = 'utf8'\n\n var loweredCase = false\n for (;;) {\n switch (encoding) {\n case 'hex':\n return hexWrite(this, string, offset, length)\n\n case 'utf8':\n case 'utf-8':\n return utf8Write(this, string, offset, length)\n\n case 'ascii':\n return asciiWrite(this, string, offset, length)\n\n case 'latin1':\n case 'binary':\n return latin1Write(this, string, offset, length)\n\n case 'base64':\n // Warning: maxLength not taken into account in base64Write\n return base64Write(this, string, offset, length)\n\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return ucs2Write(this, string, offset, length)\n\n default:\n if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n encoding = ('' + encoding).toLowerCase()\n loweredCase = true\n }\n }\n}\n\nBuffer.prototype.toJSON = function toJSON () {\n return {\n type: 'Buffer',\n data: Array.prototype.slice.call(this._arr || this, 0)\n }\n}\n\nfunction base64Slice (buf, start, end) {\n if (start === 0 && end === buf.length) {\n return base64.fromByteArray(buf)\n } else {\n return base64.fromByteArray(buf.slice(start, end))\n }\n}\n\nfunction utf8Slice (buf, start, end) {\n end = Math.min(buf.length, end)\n var res = []\n\n var i = start\n while (i < end) {\n var firstByte = buf[i]\n var codePoint = null\n var bytesPerSequence = (firstByte > 0xEF) ? 4\n : (firstByte > 0xDF) ? 3\n : (firstByte > 0xBF) ? 2\n : 1\n\n if (i + bytesPerSequence <= end) {\n var secondByte, thirdByte, fourthByte, tempCodePoint\n\n switch (bytesPerSequence) {\n case 1:\n if (firstByte < 0x80) {\n codePoint = firstByte\n }\n break\n case 2:\n secondByte = buf[i + 1]\n if ((secondByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F)\n if (tempCodePoint > 0x7F) {\n codePoint = tempCodePoint\n }\n }\n break\n case 3:\n secondByte = buf[i + 1]\n thirdByte = buf[i + 2]\n if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F)\n if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) {\n codePoint = tempCodePoint\n }\n }\n break\n case 4:\n secondByte = buf[i + 1]\n thirdByte = buf[i + 2]\n fourthByte = buf[i + 3]\n if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F)\n if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) {\n codePoint = tempCodePoint\n }\n }\n }\n }\n\n if (codePoint === null) {\n // we did not generate a valid codePoint so insert a\n // replacement char (U+FFFD) and advance only 1 byte\n codePoint = 0xFFFD\n bytesPerSequence = 1\n } else if (codePoint > 0xFFFF) {\n // encode to utf16 (surrogate pair dance)\n codePoint -= 0x10000\n res.push(codePoint >>> 10 & 0x3FF | 0xD800)\n codePoint = 0xDC00 | codePoint & 0x3FF\n }\n\n res.push(codePoint)\n i += bytesPerSequence\n }\n\n return decodeCodePointsArray(res)\n}\n\n// Based on http://stackoverflow.com/a/22747272/680742, the browser with\n// the lowest limit is Chrome, with 0x10000 args.\n// We go 1 magnitude less, for safety\nvar MAX_ARGUMENTS_LENGTH = 0x1000\n\nfunction decodeCodePointsArray (codePoints) {\n var len = codePoints.length\n if (len <= MAX_ARGUMENTS_LENGTH) {\n return String.fromCharCode.apply(String, codePoints) // avoid extra slice()\n }\n\n // Decode in chunks to avoid \"call stack size exceeded\".\n var res = ''\n var i = 0\n while (i < len) {\n res += String.fromCharCode.apply(\n String,\n codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH)\n )\n }\n return res\n}\n\nfunction asciiSlice (buf, start, end) {\n var ret = ''\n end = Math.min(buf.length, end)\n\n for (var i = start; i < end; ++i) {\n ret += String.fromCharCode(buf[i] & 0x7F)\n }\n return ret\n}\n\nfunction latin1Slice (buf, start, end) {\n var ret = ''\n end = Math.min(buf.length, end)\n\n for (var i = start; i < end; ++i) {\n ret += String.fromCharCode(buf[i])\n }\n return ret\n}\n\nfunction hexSlice (buf, start, end) {\n var len = buf.length\n\n if (!start || start < 0) start = 0\n if (!end || end < 0 || end > len) end = len\n\n var out = ''\n for (var i = start; i < end; ++i) {\n out += toHex(buf[i])\n }\n return out\n}\n\nfunction utf16leSlice (buf, start, end) {\n var bytes = buf.slice(start, end)\n var res = ''\n for (var i = 0; i < bytes.length; i += 2) {\n res += String.fromCharCode(bytes[i] + (bytes[i + 1] * 256))\n }\n return res\n}\n\nBuffer.prototype.slice = function slice (start, end) {\n var len = this.length\n start = ~~start\n end = end === undefined ? len : ~~end\n\n if (start < 0) {\n start += len\n if (start < 0) start = 0\n } else if (start > len) {\n start = len\n }\n\n if (end < 0) {\n end += len\n if (end < 0) end = 0\n } else if (end > len) {\n end = len\n }\n\n if (end < start) end = start\n\n var newBuf = this.subarray(start, end)\n // Return an augmented `Uint8Array` instance\n newBuf.__proto__ = Buffer.prototype\n return newBuf\n}\n\n/*\n * Need to make sure that buffer isn't trying to write out of bounds.\n */\nfunction checkOffset (offset, ext, length) {\n if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint')\n if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length')\n}\n\nBuffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) {\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n var val = this[offset]\n var mul = 1\n var i = 0\n while (++i < byteLength && (mul *= 0x100)) {\n val += this[offset + i] * mul\n }\n\n return val\n}\n\nBuffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) {\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) {\n checkOffset(offset, byteLength, this.length)\n }\n\n var val = this[offset + --byteLength]\n var mul = 1\n while (byteLength > 0 && (mul *= 0x100)) {\n val += this[offset + --byteLength] * mul\n }\n\n return val\n}\n\nBuffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 1, this.length)\n return this[offset]\n}\n\nBuffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 2, this.length)\n return this[offset] | (this[offset + 1] << 8)\n}\n\nBuffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 2, this.length)\n return (this[offset] << 8) | this[offset + 1]\n}\n\nBuffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return ((this[offset]) |\n (this[offset + 1] << 8) |\n (this[offset + 2] << 16)) +\n (this[offset + 3] * 0x1000000)\n}\n\nBuffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return (this[offset] * 0x1000000) +\n ((this[offset + 1] << 16) |\n (this[offset + 2] << 8) |\n this[offset + 3])\n}\n\nBuffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) {\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n var val = this[offset]\n var mul = 1\n var i = 0\n while (++i < byteLength && (mul *= 0x100)) {\n val += this[offset + i] * mul\n }\n mul *= 0x80\n\n if (val >= mul) val -= Math.pow(2, 8 * byteLength)\n\n return val\n}\n\nBuffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) {\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n var i = byteLength\n var mul = 1\n var val = this[offset + --i]\n while (i > 0 && (mul *= 0x100)) {\n val += this[offset + --i] * mul\n }\n mul *= 0x80\n\n if (val >= mul) val -= Math.pow(2, 8 * byteLength)\n\n return val\n}\n\nBuffer.prototype.readInt8 = function readInt8 (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 1, this.length)\n if (!(this[offset] & 0x80)) return (this[offset])\n return ((0xff - this[offset] + 1) * -1)\n}\n\nBuffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 2, this.length)\n var val = this[offset] | (this[offset + 1] << 8)\n return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 2, this.length)\n var val = this[offset + 1] | (this[offset] << 8)\n return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return (this[offset]) |\n (this[offset + 1] << 8) |\n (this[offset + 2] << 16) |\n (this[offset + 3] << 24)\n}\n\nBuffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return (this[offset] << 24) |\n (this[offset + 1] << 16) |\n (this[offset + 2] << 8) |\n (this[offset + 3])\n}\n\nBuffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n return ieee754.read(this, offset, true, 23, 4)\n}\n\nBuffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n return ieee754.read(this, offset, false, 23, 4)\n}\n\nBuffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 8, this.length)\n return ieee754.read(this, offset, true, 52, 8)\n}\n\nBuffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 8, this.length)\n return ieee754.read(this, offset, false, 52, 8)\n}\n\nfunction checkInt (buf, value, offset, ext, max, min) {\n if (!Buffer.isBuffer(buf)) throw new TypeError('\"buffer\" argument must be a Buffer instance')\n if (value > max || value < min) throw new RangeError('\"value\" argument is out of bounds')\n if (offset + ext > buf.length) throw new RangeError('Index out of range')\n}\n\nBuffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) {\n var maxBytes = Math.pow(2, 8 * byteLength) - 1\n checkInt(this, value, offset, byteLength, maxBytes, 0)\n }\n\n var mul = 1\n var i = 0\n this[offset] = value & 0xFF\n while (++i < byteLength && (mul *= 0x100)) {\n this[offset + i] = (value / mul) & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) {\n var maxBytes = Math.pow(2, 8 * byteLength) - 1\n checkInt(this, value, offset, byteLength, maxBytes, 0)\n }\n\n var i = byteLength - 1\n var mul = 1\n this[offset + i] = value & 0xFF\n while (--i >= 0 && (mul *= 0x100)) {\n this[offset + i] = (value / mul) & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0)\n this[offset] = (value & 0xff)\n return offset + 1\n}\n\nBuffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\n this[offset] = (value & 0xff)\n this[offset + 1] = (value >>> 8)\n return offset + 2\n}\n\nBuffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\n this[offset] = (value >>> 8)\n this[offset + 1] = (value & 0xff)\n return offset + 2\n}\n\nBuffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\n this[offset + 3] = (value >>> 24)\n this[offset + 2] = (value >>> 16)\n this[offset + 1] = (value >>> 8)\n this[offset] = (value & 0xff)\n return offset + 4\n}\n\nBuffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\n this[offset] = (value >>> 24)\n this[offset + 1] = (value >>> 16)\n this[offset + 2] = (value >>> 8)\n this[offset + 3] = (value & 0xff)\n return offset + 4\n}\n\nBuffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) {\n var limit = Math.pow(2, (8 * byteLength) - 1)\n\n checkInt(this, value, offset, byteLength, limit - 1, -limit)\n }\n\n var i = 0\n var mul = 1\n var sub = 0\n this[offset] = value & 0xFF\n while (++i < byteLength && (mul *= 0x100)) {\n if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) {\n sub = 1\n }\n this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) {\n var limit = Math.pow(2, (8 * byteLength) - 1)\n\n checkInt(this, value, offset, byteLength, limit - 1, -limit)\n }\n\n var i = byteLength - 1\n var mul = 1\n var sub = 0\n this[offset + i] = value & 0xFF\n while (--i >= 0 && (mul *= 0x100)) {\n if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) {\n sub = 1\n }\n this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80)\n if (value < 0) value = 0xff + value + 1\n this[offset] = (value & 0xff)\n return offset + 1\n}\n\nBuffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\n this[offset] = (value & 0xff)\n this[offset + 1] = (value >>> 8)\n return offset + 2\n}\n\nBuffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\n this[offset] = (value >>> 8)\n this[offset + 1] = (value & 0xff)\n return offset + 2\n}\n\nBuffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\n this[offset] = (value & 0xff)\n this[offset + 1] = (value >>> 8)\n this[offset + 2] = (value >>> 16)\n this[offset + 3] = (value >>> 24)\n return offset + 4\n}\n\nBuffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\n if (value < 0) value = 0xffffffff + value + 1\n this[offset] = (value >>> 24)\n this[offset + 1] = (value >>> 16)\n this[offset + 2] = (value >>> 8)\n this[offset + 3] = (value & 0xff)\n return offset + 4\n}\n\nfunction checkIEEE754 (buf, value, offset, ext, max, min) {\n if (offset + ext > buf.length) throw new RangeError('Index out of range')\n if (offset < 0) throw new RangeError('Index out of range')\n}\n\nfunction writeFloat (buf, value, offset, littleEndian, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) {\n checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38)\n }\n ieee754.write(buf, value, offset, littleEndian, 23, 4)\n return offset + 4\n}\n\nBuffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) {\n return writeFloat(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) {\n return writeFloat(this, value, offset, false, noAssert)\n}\n\nfunction writeDouble (buf, value, offset, littleEndian, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) {\n checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308)\n }\n ieee754.write(buf, value, offset, littleEndian, 52, 8)\n return offset + 8\n}\n\nBuffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) {\n return writeDouble(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) {\n return writeDouble(this, value, offset, false, noAssert)\n}\n\n// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)\nBuffer.prototype.copy = function copy (target, targetStart, start, end) {\n if (!Buffer.isBuffer(target)) throw new TypeError('argument should be a Buffer')\n if (!start) start = 0\n if (!end && end !== 0) end = this.length\n if (targetStart >= target.length) targetStart = target.length\n if (!targetStart) targetStart = 0\n if (end > 0 && end < start) end = start\n\n // Copy 0 bytes; we're done\n if (end === start) return 0\n if (target.length === 0 || this.length === 0) return 0\n\n // Fatal error conditions\n if (targetStart < 0) {\n throw new RangeError('targetStart out of bounds')\n }\n if (start < 0 || start >= this.length) throw new RangeError('Index out of range')\n if (end < 0) throw new RangeError('sourceEnd out of bounds')\n\n // Are we oob?\n if (end > this.length) end = this.length\n if (target.length - targetStart < end - start) {\n end = target.length - targetStart + start\n }\n\n var len = end - start\n\n if (this === target && typeof Uint8Array.prototype.copyWithin === 'function') {\n // Use built-in when available, missing from IE11\n this.copyWithin(targetStart, start, end)\n } else if (this === target && start < targetStart && targetStart < end) {\n // descending copy from end\n for (var i = len - 1; i >= 0; --i) {\n target[i + targetStart] = this[i + start]\n }\n } else {\n Uint8Array.prototype.set.call(\n target,\n this.subarray(start, end),\n targetStart\n )\n }\n\n return len\n}\n\n// Usage:\n// buffer.fill(number[, offset[, end]])\n// buffer.fill(buffer[, offset[, end]])\n// buffer.fill(string[, offset[, end]][, encoding])\nBuffer.prototype.fill = function fill (val, start, end, encoding) {\n // Handle string cases:\n if (typeof val === 'string') {\n if (typeof start === 'string') {\n encoding = start\n start = 0\n end = this.length\n } else if (typeof end === 'string') {\n encoding = end\n end = this.length\n }\n if (encoding !== undefined && typeof encoding !== 'string') {\n throw new TypeError('encoding must be a string')\n }\n if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) {\n throw new TypeError('Unknown encoding: ' + encoding)\n }\n if (val.length === 1) {\n var code = val.charCodeAt(0)\n if ((encoding === 'utf8' && code < 128) ||\n encoding === 'latin1') {\n // Fast path: If `val` fits into a single byte, use that numeric value.\n val = code\n }\n }\n } else if (typeof val === 'number') {\n val = val & 255\n }\n\n // Invalid ranges are not set to a default, so can range check early.\n if (start < 0 || this.length < start || this.length < end) {\n throw new RangeError('Out of range index')\n }\n\n if (end <= start) {\n return this\n }\n\n start = start >>> 0\n end = end === undefined ? this.length : end >>> 0\n\n if (!val) val = 0\n\n var i\n if (typeof val === 'number') {\n for (i = start; i < end; ++i) {\n this[i] = val\n }\n } else {\n var bytes = Buffer.isBuffer(val)\n ? val\n : new Buffer(val, encoding)\n var len = bytes.length\n if (len === 0) {\n throw new TypeError('The value \"' + val +\n '\" is invalid for argument \"value\"')\n }\n for (i = 0; i < end - start; ++i) {\n this[i + start] = bytes[i % len]\n }\n }\n\n return this\n}\n\n// HELPER FUNCTIONS\n// ================\n\nvar INVALID_BASE64_RE = /[^+/0-9A-Za-z-_]/g\n\nfunction base64clean (str) {\n // Node takes equal signs as end of the Base64 encoding\n str = str.split('=')[0]\n // Node strips out invalid characters like \\n and \\t from the string, base64-js does not\n str = str.trim().replace(INVALID_BASE64_RE, '')\n // Node converts strings with length < 2 to ''\n if (str.length < 2) return ''\n // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not\n while (str.length % 4 !== 0) {\n str = str + '='\n }\n return str\n}\n\nfunction toHex (n) {\n if (n < 16) return '0' + n.toString(16)\n return n.toString(16)\n}\n\nfunction utf8ToBytes (string, units) {\n units = units || Infinity\n var codePoint\n var length = string.length\n var leadSurrogate = null\n var bytes = []\n\n for (var i = 0; i < length; ++i) {\n codePoint = string.charCodeAt(i)\n\n // is surrogate component\n if (codePoint > 0xD7FF && codePoint < 0xE000) {\n // last char was a lead\n if (!leadSurrogate) {\n // no lead yet\n if (codePoint > 0xDBFF) {\n // unexpected trail\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n continue\n } else if (i + 1 === length) {\n // unpaired lead\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n continue\n }\n\n // valid lead\n leadSurrogate = codePoint\n\n continue\n }\n\n // 2 leads in a row\n if (codePoint < 0xDC00) {\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n leadSurrogate = codePoint\n continue\n }\n\n // valid surrogate pair\n codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000\n } else if (leadSurrogate) {\n // valid bmp char, but last char was a lead\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n }\n\n leadSurrogate = null\n\n // encode utf8\n if (codePoint < 0x80) {\n if ((units -= 1) < 0) break\n bytes.push(codePoint)\n } else if (codePoint < 0x800) {\n if ((units -= 2) < 0) break\n bytes.push(\n codePoint >> 0x6 | 0xC0,\n codePoint & 0x3F | 0x80\n )\n } else if (codePoint < 0x10000) {\n if ((units -= 3) < 0) break\n bytes.push(\n codePoint >> 0xC | 0xE0,\n codePoint >> 0x6 & 0x3F | 0x80,\n codePoint & 0x3F | 0x80\n )\n } else if (codePoint < 0x110000) {\n if ((units -= 4) < 0) break\n bytes.push(\n codePoint >> 0x12 | 0xF0,\n codePoint >> 0xC & 0x3F | 0x80,\n codePoint >> 0x6 & 0x3F | 0x80,\n codePoint & 0x3F | 0x80\n )\n } else {\n throw new Error('Invalid code point')\n }\n }\n\n return bytes\n}\n\nfunction asciiToBytes (str) {\n var byteArray = []\n for (var i = 0; i < str.length; ++i) {\n // Node's code seems to be doing this and not & 0x7F..\n byteArray.push(str.charCodeAt(i) & 0xFF)\n }\n return byteArray\n}\n\nfunction utf16leToBytes (str, units) {\n var c, hi, lo\n var byteArray = []\n for (var i = 0; i < str.length; ++i) {\n if ((units -= 2) < 0) break\n\n c = str.charCodeAt(i)\n hi = c >> 8\n lo = c % 256\n byteArray.push(lo)\n byteArray.push(hi)\n }\n\n return byteArray\n}\n\nfunction base64ToBytes (str) {\n return base64.toByteArray(base64clean(str))\n}\n\nfunction blitBuffer (src, dst, offset, length) {\n for (var i = 0; i < length; ++i) {\n if ((i + offset >= dst.length) || (i >= src.length)) break\n dst[i + offset] = src[i]\n }\n return i\n}\n\n// ArrayBuffers from another context (i.e. an iframe) do not pass the `instanceof` check\n// but they should be treated as valid. See: https://github.com/feross/buffer/issues/166\nfunction isArrayBuffer (obj) {\n return obj instanceof ArrayBuffer ||\n (obj != null && obj.constructor != null && obj.constructor.name === 'ArrayBuffer' &&\n typeof obj.byteLength === 'number')\n}\n\nfunction numberIsNaN (obj) {\n return obj !== obj // eslint-disable-line no-self-compare\n}\n","exports.read = function (buffer, offset, isLE, mLen, nBytes) {\n var e, m\n var eLen = (nBytes * 8) - mLen - 1\n var eMax = (1 << eLen) - 1\n var eBias = eMax >> 1\n var nBits = -7\n var i = isLE ? (nBytes - 1) : 0\n var d = isLE ? -1 : 1\n var s = buffer[offset + i]\n\n i += d\n\n e = s & ((1 << (-nBits)) - 1)\n s >>= (-nBits)\n nBits += eLen\n for (; nBits > 0; e = (e * 256) + buffer[offset + i], i += d, nBits -= 8) {}\n\n m = e & ((1 << (-nBits)) - 1)\n e >>= (-nBits)\n nBits += mLen\n for (; nBits > 0; m = (m * 256) + buffer[offset + i], i += d, nBits -= 8) {}\n\n if (e === 0) {\n e = 1 - eBias\n } else if (e === eMax) {\n return m ? NaN : ((s ? -1 : 1) * Infinity)\n } else {\n m = m + Math.pow(2, mLen)\n e = e - eBias\n }\n return (s ? -1 : 1) * m * Math.pow(2, e - mLen)\n}\n\nexports.write = function (buffer, value, offset, isLE, mLen, nBytes) {\n var e, m, c\n var eLen = (nBytes * 8) - mLen - 1\n var eMax = (1 << eLen) - 1\n var eBias = eMax >> 1\n var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0)\n var i = isLE ? 0 : (nBytes - 1)\n var d = isLE ? 1 : -1\n var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0\n\n value = Math.abs(value)\n\n if (isNaN(value) || value === Infinity) {\n m = isNaN(value) ? 1 : 0\n e = eMax\n } else {\n e = Math.floor(Math.log(value) / Math.LN2)\n if (value * (c = Math.pow(2, -e)) < 1) {\n e--\n c *= 2\n }\n if (e + eBias >= 1) {\n value += rt / c\n } else {\n value += rt * Math.pow(2, 1 - eBias)\n }\n if (value * c >= 2) {\n e++\n c /= 2\n }\n\n if (e + eBias >= eMax) {\n m = 0\n e = eMax\n } else if (e + eBias >= 1) {\n m = ((value * c) - 1) * Math.pow(2, mLen)\n e = e + eBias\n } else {\n m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen)\n e = 0\n }\n }\n\n for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}\n\n e = (e << mLen) | m\n eLen += mLen\n for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}\n\n buffer[offset + i - d] |= s * 128\n}\n","// shim for using process in browser\nvar process = module.exports = {};\n\n// cached from whatever global is present so that test runners that stub it\n// don't break things. But we need to wrap it in a try catch in case it is\n// wrapped in strict mode code which doesn't define any globals. It's inside a\n// function because try/catches deoptimize in certain engines.\n\nvar cachedSetTimeout;\nvar cachedClearTimeout;\n\nfunction defaultSetTimout() {\n throw new Error('setTimeout has not been defined');\n}\nfunction defaultClearTimeout () {\n throw new Error('clearTimeout has not been defined');\n}\n(function () {\n try {\n if (typeof setTimeout === 'function') {\n cachedSetTimeout = setTimeout;\n } else {\n cachedSetTimeout = defaultSetTimout;\n }\n } catch (e) {\n cachedSetTimeout = defaultSetTimout;\n }\n try {\n if (typeof clearTimeout === 'function') {\n cachedClearTimeout = clearTimeout;\n } else {\n cachedClearTimeout = defaultClearTimeout;\n }\n } catch (e) {\n cachedClearTimeout = defaultClearTimeout;\n }\n} ())\nfunction runTimeout(fun) {\n if (cachedSetTimeout === setTimeout) {\n //normal enviroments in sane situations\n return setTimeout(fun, 0);\n }\n // if setTimeout wasn't available but was latter defined\n if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n cachedSetTimeout = setTimeout;\n return setTimeout(fun, 0);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedSetTimeout(fun, 0);\n } catch(e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedSetTimeout.call(null, fun, 0);\n } catch(e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n return cachedSetTimeout.call(this, fun, 0);\n }\n }\n\n\n}\nfunction runClearTimeout(marker) {\n if (cachedClearTimeout === clearTimeout) {\n //normal enviroments in sane situations\n return clearTimeout(marker);\n }\n // if clearTimeout wasn't available but was latter defined\n if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n cachedClearTimeout = clearTimeout;\n return clearTimeout(marker);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedClearTimeout(marker);\n } catch (e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedClearTimeout.call(null, marker);\n } catch (e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n return cachedClearTimeout.call(this, marker);\n }\n }\n\n\n\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n if (!draining || !currentQueue) {\n return;\n }\n draining = false;\n if (currentQueue.length) {\n queue = currentQueue.concat(queue);\n } else {\n queueIndex = -1;\n }\n if (queue.length) {\n drainQueue();\n }\n}\n\nfunction drainQueue() {\n if (draining) {\n return;\n }\n var timeout = runTimeout(cleanUpNextTick);\n draining = true;\n\n var len = queue.length;\n while(len) {\n currentQueue = queue;\n queue = [];\n while (++queueIndex < len) {\n if (currentQueue) {\n currentQueue[queueIndex].run();\n }\n }\n queueIndex = -1;\n len = queue.length;\n }\n currentQueue = null;\n draining = false;\n runClearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n var args = new Array(arguments.length - 1);\n if (arguments.length > 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"]} \ No newline at end of file +{"version":3,"sources":["node_modules/browser-pack/_prelude.js","jsforce-api-metadata.min.js","lib/api/metadata.js","node_modules/base64-js/index.js","node_modules/browserify/node_modules/buffer/index.js","node_modules/ieee754/index.js","node_modules/process/browser.js"],"names":["f","exports","module","define","amd","g","window","global","self","this","jsforce","modules","api","Metadata","r","e","n","t","o","i","c","require","u","a","Error","code","p","call","length","1","process","Buffer","inherits","events","stream","_","Promise","SOAP","conn","_conn","convertToSaveResult","result","saveResult","clone","success","convertToUpsertResult","upsertResult","created","convertToMetadataInfo","rec","metadataInfo","$","prototype","pollInterval","pollTimeout","_invoke","method","message","callback","xmlns","endpointUrl","instanceUrl","version","invoke","then","res","thenCall","createAsync","type","metadata","Number","convert","md","isArray","map","AsyncResultLocator","createSync","create","results","readSync","read","fullNames","records","updateAsync","updateMetadata","umd","updateSync","update","upsertSync","upsert","deleteAsync","isString","fullName","del","deleteSync","rename","oldFullName","newFullName","checkStatus","ids","asyncProcessId","describe","asOfVersion","metadataObjects","mo","childXmlNames","inFolder","metaFile","partialSaveAllowed","testRequired","list","queries","retrieve","request","RetrieveResultLocator","checkRetrieveStatus","id","deploy","zipInput","options","isFunction","deferred","defer","isObject","pipe","bufs","on","d","push","resolve","concat","toString","String","promise","zipContentB64","ZipFile","DeployOptions","DeployResultLocator","checkDeployStatus","includeDetails","isBoolean","done","checkOnly","runTestsEnabled","ignoreWarnings","rollbackOnError","numberComponentErrors","numberComponentsDeployed","numberComponentsTotal","numberTestErrors","numberTestsCompleted","numberTestsTotal","meta","_meta","_results","_isArray","EventEmitter","onResolve","onReject","convertType","nextTick","err","check","_ids","poll","interval","timeout","startTime","Date","getTime","now","errMsg","emit","resultArr","len","setTimeout","complete","reject","super_","resultStream","Readable","reading","_read","from","zipFile","_process","buffer","2","byteLength","b64","lens","getLens","validLen","placeHoldersLen","toByteArray","tmp","arr","Arr","_byteLength","curByte","revLookup","charCodeAt","fromByteArray","uint8","extraBytes","parts","len2","encodeChunk","lookup","join","Uint8Array","Array","indexOf","start","end","num","output","3","base64","ieee754","SlowBuffer","alloc","INSPECT_MAX_BYTES","createBuffer","RangeError","buf","__proto__","arg","encodingOrOffset","TypeError","allocUnsafe","value","string","encoding","isEncoding","actual","write","slice","fromString","ArrayBuffer","isView","fromArrayLike","isInstance","array","byteOffset","undefined","fromArrayBuffer","valueOf","b","obj","isBuffer","checked","copy","numberIsNaN","data","fromObject","Symbol","toPrimitive","assertSize","size","mustMatch","arguments","loweredCase","utf8ToBytes","base64ToBytes","toLowerCase","slowToString","hexSlice","utf8Slice","asciiSlice","latin1Slice","base64Slice","utf16leSlice","swap","m","bidirectionalIndexOf","val","dir","arrayIndexOf","lastIndexOf","indexSize","arrLength","valLength","readUInt16BE","foundIndex","found","j","hexWrite","offset","remaining","strLen","parsed","parseInt","substr","utf8Write","blitBuffer","asciiWrite","str","byteArray","asciiToBytes","latin1Write","base64Write","ucs2Write","units","hi","lo","utf16leToBytes","Math","min","secondByte","thirdByte","fourthByte","tempCodePoint","firstByte","codePoint","bytesPerSequence","codePoints","fromCharCode","apply","decodeCodePointsArray","kMaxLength","TYPED_ARRAY_SUPPORT","foo","typedArraySupport","console","error","Object","defineProperty","enumerable","get","species","configurable","writable","poolSize","fill","allocUnsafeSlow","_isBuffer","compare","x","y","pos","swap16","swap32","swap64","toLocaleString","equals","inspect","max","replace","trim","target","thisStart","thisEnd","thisCopy","targetCopy","includes","isFinite","toJSON","_arr","ret","out","toHex","bytes","checkOffset","ext","checkInt","checkIEEE754","writeFloat","littleEndian","noAssert","writeDouble","newBuf","subarray","readUIntLE","mul","readUIntBE","readUInt8","readUInt16LE","readUInt32LE","readUInt32BE","readIntLE","pow","readIntBE","readInt8","readInt16LE","readInt16BE","readInt32LE","readInt32BE","readFloatLE","readFloatBE","readDoubleLE","readDoubleBE","writeUIntLE","writeUIntBE","writeUInt8","writeUInt16LE","writeUInt16BE","writeUInt32LE","writeUInt32BE","writeIntLE","limit","sub","writeIntBE","writeInt8","writeInt16LE","writeInt16BE","writeInt32LE","writeInt32BE","writeFloatLE","writeFloatBE","writeDoubleLE","writeDoubleBE","targetStart","copyWithin","set","INVALID_BASE64_RE","Infinity","leadSurrogate","split","base64clean","src","dst","constructor","name","base64-js","4","isLE","mLen","nBytes","eLen","eMax","eBias","nBits","s","NaN","rt","abs","isNaN","floor","log","LN2","5","cachedSetTimeout","cachedClearTimeout","defaultSetTimout","defaultClearTimeout","runTimeout","fun","clearTimeout","currentQueue","queue","draining","queueIndex","cleanUpNextTick","drainQueue","run","marker","runClearTimeout","Item","noop","args","title","browser","env","argv","versions","addListener","once","off","removeListener","removeAllListeners","prependListener","prependOnceListener","listeners","binding","cwd","chdir","umask"],"mappings":"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","file":"jsforce-api-metadata.min.js","sourcesContent":["(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>16&255,u[s++]=e>>8&255,u[s++]=255&e;2===i&&(e=f[t.charCodeAt(r)]<<2|f[t.charCodeAt(r+1)]>>4,u[s++]=255&e);1===i&&(e=f[t.charCodeAt(r)]<<10|f[t.charCodeAt(r+1)]<<4|f[t.charCodeAt(r+2)]>>2,u[s++]=e>>8&255,u[s++]=255&e);return u},r.fromByteArray=function(t){for(var e,r=t.length,n=r%3,o=[],i=0,u=r-n;i>2]+s[e<<4&63]+\"==\")):2==n&&(e=(t[r-2]<<8)+t[r-1],o.push(s[e>>10]+s[e>>4&63]+s[e<<2&63]+\"=\"));return o.join(\"\")};for(var s=[],f=[],h=\"undefined\"!=typeof Uint8Array?Uint8Array:Array,n=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\",o=0,i=n.length;o>18&63]+s[o>>12&63]+s[o>>6&63]+s[63&o]);return i.join(\"\")}f[\"-\".charCodeAt(0)]=62,f[\"_\".charCodeAt(0)]=63},{}],3:[function(t,e,j){(function(c){\"use strict\";var n=t(\"base64-js\"),i=t(\"ieee754\");j.Buffer=c,j.SlowBuffer=function(t){+t!=t&&(t=0);return c.alloc(+t)},j.INSPECT_MAX_BYTES=50;var r=2147483647;function u(t){if(r>>1;case\"base64\":return M(t).length;default:if(o)return n?-1:L(t).length;e=(\"\"+e).toLowerCase(),o=!0}}function p(t,e,r){var n=t[e];t[e]=t[r],t[r]=n}function y(t,e,r,n,o){if(0===t.length)return-1;if(\"string\"==typeof r?(n=r,r=0):2147483647=t.length){if(o)return-1;r=t.length-1}else if(r<0){if(!o)return-1;r=0}if(\"string\"==typeof e&&(e=c.from(e,n)),c.isBuffer(e))return 0===e.length?-1:d(t,e,r,n,o);if(\"number\"==typeof e)return e&=255,\"function\"==typeof Uint8Array.prototype.indexOf?o?Uint8Array.prototype.indexOf.call(t,e,r):Uint8Array.prototype.lastIndexOf.call(t,e,r):d(t,[e],r,n,o);throw new TypeError(\"val must be string, number or Buffer\")}function d(t,e,r,n,o){var i=1,u=t.length,s=e.length;if(void 0!==n&&(\"ucs2\"===(n=String(n).toLowerCase())||\"ucs-2\"===n||\"utf16le\"===n||\"utf-16le\"===n)){if(t.length<2||e.length<2)return-1;u/=i=2,s/=2,r/=2}function a(t,e){return 1===i?t[e]:t.readUInt16BE(e*i)}if(o)for(var f=-1,h=r;h>8,o=r%256,i.push(o),i.push(n);return i}(e,t.length-r),t,r,n)}function w(t,e,r){return 0===e&&r===t.length?n.fromByteArray(t):n.fromByteArray(t.slice(e,r))}function b(t,e,r){r=Math.min(t.length,r);for(var n=[],o=e;o>>10&1023|55296),h=56320|1023&h),n.push(h),o+=c}return function(t){var e=t.length;if(e<=E)return String.fromCharCode.apply(String,t);var r=\"\",n=0;for(;nthis.length)return\"\";if((void 0===r||r>this.length)&&(r=this.length),r<=0)return\"\";if((r>>>=0)<=(e>>>=0))return\"\";for(t=t||\"utf8\";;)switch(t){case\"hex\":return T(this,e,r);case\"utf8\":case\"utf-8\":return b(this,e,r);case\"ascii\":return A(this,e,r);case\"latin1\":case\"binary\":return _(this,e,r);case\"base64\":return w(this,e,r);case\"ucs2\":case\"ucs-2\":case\"utf16le\":case\"utf-16le\":return B(this,e,r);default:if(n)throw new TypeError(\"Unknown encoding: \"+t);t=(t+\"\").toLowerCase(),n=!0}}.apply(this,arguments)},c.prototype.equals=function(t){if(!c.isBuffer(t))throw new TypeError(\"Argument must be a Buffer\");return this===t||0===c.compare(this,t)},c.prototype.inspect=function(){var t=\"\",e=j.INSPECT_MAX_BYTES,t=this.toString(\"hex\",0,e).replace(/(.{2})/g,\"$1 \").trim();return this.length>e&&(t+=\" ... \"),\"\"},c.prototype.compare=function(t,e,r,n,o){if(R(t,Uint8Array)&&(t=c.from(t,t.offset,t.byteLength)),!c.isBuffer(t))throw new TypeError('The \"target\" argument must be one of type Buffer or Uint8Array. Received type '+typeof t);if(void 0===e&&(e=0),void 0===r&&(r=t?t.length:0),void 0===n&&(n=0),void 0===o&&(o=this.length),e<0||r>t.length||n<0||o>this.length)throw new RangeError(\"out of range index\");if(o<=n&&r<=e)return 0;if(o<=n)return-1;if(r<=e)return 1;if(this===t)return 0;for(var i=(o>>>=0)-(n>>>=0),u=(r>>>=0)-(e>>>=0),s=Math.min(i,u),a=this.slice(n,o),f=t.slice(e,r),h=0;h>>=0,isFinite(r)?(r>>>=0,void 0===n&&(n=\"utf8\")):(n=r,r=void 0)}var o=this.length-e;if((void 0===r||othis.length)throw new RangeError(\"Attempt to write outside buffer bounds\");n=n||\"utf8\";for(var i,u,s,a,f,h,c=!1;;)switch(n){case\"hex\":return g(this,t,e,r);case\"utf8\":case\"utf-8\":return f=e,h=r,O(L(t,(a=this).length-f),a,f,h);case\"ascii\":return m(this,t,e,r);case\"latin1\":case\"binary\":return m(this,t,e,r);case\"base64\":return i=this,u=e,s=r,O(M(t),i,u,s);case\"ucs2\":case\"ucs-2\":case\"utf16le\":case\"utf-16le\":return v(this,t,e,r);default:if(c)throw new TypeError(\"Unknown encoding: \"+n);n=(\"\"+n).toLowerCase(),c=!0}},c.prototype.toJSON=function(){return{type:\"Buffer\",data:Array.prototype.slice.call(this._arr||this,0)}};var E=4096;function A(t,e,r){var n=\"\";r=Math.min(t.length,r);for(var o=e;ot.length)throw new RangeError(\"Index out of range\")}function S(t,e,r,n){if(r+n>t.length)throw new RangeError(\"Index out of range\");if(r<0)throw new RangeError(\"Index out of range\")}function U(t,e,r,n,o){return e=+e,r>>>=0,o||S(t,0,r,4),i.write(t,e,r,n,23,4),r+4}function I(t,e,r,n,o){return e=+e,r>>>=0,o||S(t,0,r,8),i.write(t,e,r,n,52,8),r+8}c.prototype.slice=function(t,e){var r=this.length;(t=~~t)<0?(t+=r)<0&&(t=0):r>>=0,e>>>=0,r||C(t,e,this.length);for(var n=this[t],o=1,i=0;++i>>=0,e>>>=0,r||C(t,e,this.length);for(var n=this[t+--e],o=1;0>>=0,e||C(t,1,this.length),this[t]},c.prototype.readUInt16LE=function(t,e){return t>>>=0,e||C(t,2,this.length),this[t]|this[t+1]<<8},c.prototype.readUInt16BE=function(t,e){return t>>>=0,e||C(t,2,this.length),this[t]<<8|this[t+1]},c.prototype.readUInt32LE=function(t,e){return t>>>=0,e||C(t,4,this.length),(this[t]|this[t+1]<<8|this[t+2]<<16)+16777216*this[t+3]},c.prototype.readUInt32BE=function(t,e){return t>>>=0,e||C(t,4,this.length),16777216*this[t]+(this[t+1]<<16|this[t+2]<<8|this[t+3])},c.prototype.readIntLE=function(t,e,r){t>>>=0,e>>>=0,r||C(t,e,this.length);for(var n=this[t],o=1,i=0;++i>>=0,e>>>=0,r||C(t,e,this.length);for(var n=e,o=1,i=this[t+--n];0>>=0,e||C(t,1,this.length),128&this[t]?-1*(255-this[t]+1):this[t]},c.prototype.readInt16LE=function(t,e){t>>>=0,e||C(t,2,this.length);var r=this[t]|this[t+1]<<8;return 32768&r?4294901760|r:r},c.prototype.readInt16BE=function(t,e){t>>>=0,e||C(t,2,this.length);var r=this[t+1]|this[t]<<8;return 32768&r?4294901760|r:r},c.prototype.readInt32LE=function(t,e){return t>>>=0,e||C(t,4,this.length),this[t]|this[t+1]<<8|this[t+2]<<16|this[t+3]<<24},c.prototype.readInt32BE=function(t,e){return t>>>=0,e||C(t,4,this.length),this[t]<<24|this[t+1]<<16|this[t+2]<<8|this[t+3]},c.prototype.readFloatLE=function(t,e){return t>>>=0,e||C(t,4,this.length),i.read(this,t,!0,23,4)},c.prototype.readFloatBE=function(t,e){return t>>>=0,e||C(t,4,this.length),i.read(this,t,!1,23,4)},c.prototype.readDoubleLE=function(t,e){return t>>>=0,e||C(t,8,this.length),i.read(this,t,!0,52,8)},c.prototype.readDoubleBE=function(t,e){return t>>>=0,e||C(t,8,this.length),i.read(this,t,!1,52,8)},c.prototype.writeUIntLE=function(t,e,r,n){t=+t,e>>>=0,r>>>=0,n||k(this,t,e,r,Math.pow(2,8*r)-1,0);var o=1,i=0;for(this[e]=255&t;++i>>=0,r>>>=0,n||k(this,t,e,r,Math.pow(2,8*r)-1,0);var o=r-1,i=1;for(this[e+o]=255&t;0<=--o&&(i*=256);)this[e+o]=t/i&255;return e+r},c.prototype.writeUInt8=function(t,e,r){return t=+t,e>>>=0,r||k(this,t,e,1,255,0),this[e]=255&t,e+1},c.prototype.writeUInt16LE=function(t,e,r){return t=+t,e>>>=0,r||k(this,t,e,2,65535,0),this[e]=255&t,this[e+1]=t>>>8,e+2},c.prototype.writeUInt16BE=function(t,e,r){return t=+t,e>>>=0,r||k(this,t,e,2,65535,0),this[e]=t>>>8,this[e+1]=255&t,e+2},c.prototype.writeUInt32LE=function(t,e,r){return t=+t,e>>>=0,r||k(this,t,e,4,4294967295,0),this[e+3]=t>>>24,this[e+2]=t>>>16,this[e+1]=t>>>8,this[e]=255&t,e+4},c.prototype.writeUInt32BE=function(t,e,r){return t=+t,e>>>=0,r||k(this,t,e,4,4294967295,0),this[e]=t>>>24,this[e+1]=t>>>16,this[e+2]=t>>>8,this[e+3]=255&t,e+4},c.prototype.writeIntLE=function(t,e,r,n){var o;t=+t,e>>>=0,n||k(this,t,e,r,(o=Math.pow(2,8*r-1))-1,-o);var i=0,u=1,s=0;for(this[e]=255&t;++i>0)-s&255;return e+r},c.prototype.writeIntBE=function(t,e,r,n){var o;t=+t,e>>>=0,n||k(this,t,e,r,(o=Math.pow(2,8*r-1))-1,-o);var i=r-1,u=1,s=0;for(this[e+i]=255&t;0<=--i&&(u*=256);)t<0&&0===s&&0!==this[e+i+1]&&(s=1),this[e+i]=(t/u>>0)-s&255;return e+r},c.prototype.writeInt8=function(t,e,r){return t=+t,e>>>=0,r||k(this,t,e,1,127,-128),t<0&&(t=255+t+1),this[e]=255&t,e+1},c.prototype.writeInt16LE=function(t,e,r){return t=+t,e>>>=0,r||k(this,t,e,2,32767,-32768),this[e]=255&t,this[e+1]=t>>>8,e+2},c.prototype.writeInt16BE=function(t,e,r){return t=+t,e>>>=0,r||k(this,t,e,2,32767,-32768),this[e]=t>>>8,this[e+1]=255&t,e+2},c.prototype.writeInt32LE=function(t,e,r){return t=+t,e>>>=0,r||k(this,t,e,4,2147483647,-2147483648),this[e]=255&t,this[e+1]=t>>>8,this[e+2]=t>>>16,this[e+3]=t>>>24,e+4},c.prototype.writeInt32BE=function(t,e,r){return t=+t,e>>>=0,r||k(this,t,e,4,2147483647,-2147483648),t<0&&(t=4294967295+t+1),this[e]=t>>>24,this[e+1]=t>>>16,this[e+2]=t>>>8,this[e+3]=255&t,e+4},c.prototype.writeFloatLE=function(t,e,r){return U(this,t,e,!0,r)},c.prototype.writeFloatBE=function(t,e,r){return U(this,t,e,!1,r)},c.prototype.writeDoubleLE=function(t,e,r){return I(this,t,e,!0,r)},c.prototype.writeDoubleBE=function(t,e,r){return I(this,t,e,!1,r)},c.prototype.copy=function(t,e,r,n){if(!c.isBuffer(t))throw new TypeError(\"argument should be a Buffer\");if(r=r||0,n||0===n||(n=this.length),e>=t.length&&(e=t.length),e=e||0,0=this.length)throw new RangeError(\"Index out of range\");if(n<0)throw new RangeError(\"sourceEnd out of bounds\");n>this.length&&(n=this.length),t.length-e>>=0,r=void 0===r?this.length:r>>>0,\"number\"==typeof(t=t||0))for(i=e;i>6|192,63&r|128)}else if(r<65536){if((e-=3)<0)break;i.push(r>>12|224,r>>6&63|128,63&r|128)}else{if(!(r<1114112))throw new Error(\"Invalid code point\");if((e-=4)<0)break;i.push(r>>18|240,r>>12&63|128,r>>6&63|128,63&r|128)}}return i}function M(t){return n.toByteArray(function(t){if((t=(t=t.split(\"=\")[0]).trim().replace(e,\"\")).length<2)return\"\";for(;t.length%4!=0;)t+=\"=\";return t}(t))}function O(t,e,r,n){for(var o=0;o=e.length||o>=t.length);++o)e[o+r]=t[o];return o}function R(t,e){return t instanceof e||null!=t&&null!=t.constructor&&null!=t.constructor.name&&t.constructor.name===e.name}function N(t){return t!=t}}).call(this,t(\"buffer\").Buffer)},{\"base64-js\":2,buffer:3,ieee754:4}],4:[function(t,e,r){r.read=function(t,e,r,n,o){var i,u,s=8*o-n-1,a=(1<>1,h=-7,c=r?o-1:0,l=r?-1:1,p=t[e+c];for(c+=l,i=p&(1<<-h)-1,p>>=-h,h+=s;0>=-h,h+=n;0>1,l=23===o?Math.pow(2,-24)-Math.pow(2,-77):0,p=n?0:i-1,y=n?1:-1,d=e<0||0===e&&1/e<0?1:0;for(e=Math.abs(e),isNaN(e)||e===1/0?(s=isNaN(e)?1:0,u=h):(u=Math.floor(Math.log(e)/Math.LN2),e*(a=Math.pow(2,-u))<1&&(u--,a*=2),2<=(e+=1<=u+c?l/a:l*Math.pow(2,1-c))*a&&(u++,a/=2),h<=u+c?(s=0,u=h):1<=u+c?(s=(e*a-1)*Math.pow(2,o),u+=c):(s=e*Math.pow(2,c-1)*Math.pow(2,o),u=0));8<=o;t[r+p]=255&s,p+=y,s/=256,o-=8);for(u=u<\n */\n\n'use strict';\n\nvar inherits = window.jsforce.require('inherits'),\n events = window.jsforce.require('events'),\n stream = window.jsforce.require('readable-stream'),\n _ = window.jsforce.require('lodash/core'),\n jsforce = window.jsforce.require('./core'),\n Promise = window.jsforce.require('./promise'),\n SOAP = window.jsforce.require('./soap');\n\n/*--------------------------------------------*/\n/**\n * Class for Salesforce Metadata API\n *\n * @class\n * @param {Connection} conn - Connection object\n */\nvar Metadata = module.exports = function(conn) {\n this._conn = conn;\n};\n\n\n/**\n * Polling interval in milliseconds\n * @type {Number}\n */\nMetadata.prototype.pollInterval = 1000;\n\n/**\n * Polling timeout in milliseconds\n * @type {Number}\n */\nMetadata.prototype.pollTimeout = 10000;\n\n\n/**\n * Call Metadata API SOAP endpoint\n *\n * @private\n */\nMetadata.prototype._invoke = function(method, message, callback) {\n var soapEndpoint = new SOAP(this._conn, {\n xmlns: \"http://soap.sforce.com/2006/04/metadata\",\n endpointUrl: this._conn.instanceUrl + \"/services/Soap/m/\" + this._conn.version\n });\n return soapEndpoint.invoke(method, message).then(function(res) {\n return res.result;\n }).thenCall(callback);\n};\n\n\n/**\n * @typedef {Object} Metadata~MetadataInfo\n * @prop {String} fullName - The name of the component\n */\n\n/**\n * Asynchronously adds one or more new metadata components to the organization.\n *\n * @param {String} type - The type of metadata to create\n * @param {Metadata~MetadataInfo|Array.} metadata - Metadata to create\n * @param {Callback.>} [callback] - Callback function\n * @returns {Metadata~AsyncResultLocator}\n */\nMetadata.prototype.createAsync = function(type, metadata, callback) {\n if (Number(this._conn.version) > 30) {\n throw new Error(\"Async metadata CRUD calls are not supported on ver 31.0 or later.\");\n }\n var convert = function(md) {\n md[\"@xsi:type\"] = type;\n return md;\n };\n var isArray = _.isArray(metadata);\n metadata = isArray ? _.map(metadata, convert) : convert(metadata);\n var res = this._invoke(\"create\", { metadata: metadata });\n return new AsyncResultLocator(this, res, isArray).thenCall(callback);\n};\n\n/**\n * @typedef {Object} Metadata~SaveResult\n * @prop {Boolean} success - True if metadata is successfully saved\n * @prop {String} fullName - Full name of metadata object\n */\n\n/**\n * @private\n */\nfunction convertToSaveResult(result) {\n var saveResult = _.clone(result);\n saveResult.success = saveResult.success === 'true';\n return saveResult;\n}\n\n/**\n * @typedef {Object} Metadata~UpsertResult\n * @prop {Boolean} success - True if metadata is successfully saved\n * @prop {String} fullName - Full name of metadata object\n * @prop {Boolean} created - True if metadata is newly created\n */\n\n/**\n * @private\n */\nfunction convertToUpsertResult(result) {\n var upsertResult = convertToSaveResult(result);\n upsertResult.created = upsertResult.created === 'true';\n return upsertResult;\n}\n\n/**\n * Synonym of Metadata#create().\n *\n * @method Metadata#createSync\n * @param {String} type - The type of metadata to create\n * @param {Metadata~MetadataInfo|Array.} metadata - Metadata to create\n * @param {Callback.>} [callback] - Callback function\n * @returns {Promise.>}\n */\n/**\n * Synchronously adds one or more new metadata components to the organization.\n *\n * @method Metadata#create\n * @param {String} type - The type of metadata to create\n * @param {Metadata~MetadataInfo|Array.} metadata - Metadata to create\n * @param {Callback.>} [callback] - Callback function\n * @returns {Promise.>}\n */\nMetadata.prototype.createSync =\nMetadata.prototype.create = function(type, metadata, callback) {\n var convert = function(md) {\n md[\"@xsi:type\"] = type;\n return md;\n };\n var isArray = _.isArray(metadata);\n metadata = isArray ? _.map(metadata, convert) : convert(metadata);\n return this._invoke(\"createMetadata\", { metadata: metadata }).then(function(results) {\n return _.isArray(results) ? _.map(results, convertToSaveResult) : convertToSaveResult(results);\n }).thenCall(callback);\n};\n\n/**\n * @private\n */\nfunction convertToMetadataInfo(rec) {\n var metadataInfo = _.clone(rec);\n delete metadataInfo.$;\n return metadataInfo;\n}\n\n/**\n * Synonym of Metadata#read()\n *\n * @method Metadata#readSync\n * @param {String} type - The type of metadata to read\n * @param {String|Array.} fullNames - full name(s) of metadata objects to read\n * @param {Callback.>} [callback] - Callback function\n * @returns {Promise.>>}\n */\n/**\n * Synchronously read specified metadata components in the organization.\n *\n * @method Metadata#read\n * @param {String} type - The type of metadata to read\n * @param {String|Array.} fullNames - full name(s) of metadata objects to read\n * @param {Callback.>} [callback] - Callback function\n * @returns {Promise.>>}\n */\nMetadata.prototype.readSync =\nMetadata.prototype.read = function(type, fullNames, callback) {\n return this._invoke(\"readMetadata\", { type: type, fullNames: fullNames }).then(function(res) {\n return _.isArray(res.records) ? _.map(res.records, convertToMetadataInfo) : convertToMetadataInfo(res.records);\n }).thenCall(callback);\n};\n\n/**\n * @typedef {Object} Metadata~UpdateMetadataInfo\n * @prop {String} currentName - The API name of the component or field before the update\n * @prop {Metadata~MetadataInfo} metadata - Full specification of the component or field you wish to update\n */\n\n/**\n * Asynchronously updates one or more metadata components in the organization.\n *\n * @param {String} type - The type of metadata to update\n * @param {Metadata~UpdateMetadataInfo|Array.} updateMetadata - Updating metadata\n * @param {Callback.>} [callback] - Callback function\n * @returns {Metadata~AsyncResultLocator}\n */\nMetadata.prototype.updateAsync = function(type, updateMetadata, callback) {\n if (Number(this._conn.version) > 30) {\n throw new Error(\"Async metadata CRUD calls are not supported on ver 31.0 or later.\");\n }\n var convert = function(umd) {\n umd.metadata[\"@xsi:type\"] = type;\n return umd;\n };\n var isArray = _.isArray(updateMetadata);\n updateMetadata = isArray ? _.map(updateMetadata, convert) : convert(updateMetadata);\n var res = this._invoke(\"update\", { updateMetadata: updateMetadata });\n return new AsyncResultLocator(this, res, isArray).thenCall(callback);\n};\n\n/**\n * Synonym of Metadata#update().\n *\n * @method Metadata#updateSync\n * @param {String} type - The type of metadata to update\n * @param {Metadata~MetadataInfo|Array.} updateMetadata - Updating metadata\n * @param {Callback.>} [callback] - Callback function\n * @returns {Promise.>}\n */\n/**\n * Synchronously updates one or more metadata components in the organization.\n *\n * @method Metadata#update\n * @param {String} type - The type of metadata to update\n * @param {Metadata~MetadataInfo|Array.} updateMetadata - Updating metadata\n * @param {Callback.>} [callback] - Callback function\n * @returns {Promise.>}\n */\nMetadata.prototype.updateSync =\nMetadata.prototype.update = function(type, metadata, callback) {\n var convert = function(md) {\n md[\"@xsi:type\"] = type;\n return md;\n };\n var isArray = _.isArray(metadata);\n metadata = isArray ? _.map(metadata, convert) : convert(metadata);\n return this._invoke(\"updateMetadata\", { metadata: metadata }).then(function(results) {\n return _.isArray(results) ? _.map(results, convertToSaveResult) : convertToSaveResult(results);\n }).thenCall(callback);\n};\n\n/**\n * Synonym of Metadata#upsert().\n *\n * @method Metadata#upsertSync\n * @param {String} type - The type of metadata to upsert\n * @param {Metadata~MetadataInfo|Array.} metadata - Upserting metadata\n * @param {Callback.>} [callback] - Callback function\n * @returns {Promise.>}\n */\n/**\n * Upserts one or more components in your organization's data.\n *\n * @method Metadata#upsert\n * @param {String} type - The type of metadata to upsert\n * @param {Metadata~MetadataInfo|Array.} metadata - Upserting metadata\n * @param {Callback.>} [callback] - Callback function\n * @returns {Promise.>}\n */\nMetadata.prototype.upsertSync =\nMetadata.prototype.upsert = function(type, metadata, callback) {\n var convert = function(md) {\n md[\"@xsi:type\"] = type;\n return md;\n };\n var isArray = _.isArray(metadata);\n metadata = isArray ? _.map(metadata, convert) : convert(metadata);\n return this._invoke(\"upsertMetadata\", { metadata: metadata }).then(function(results) {\n return _.isArray(results) ? _.map(results, convertToUpsertResult) : convertToUpsertResult(results);\n }).thenCall(callback);\n};\n\n/**\n * Asynchronously deletes specified metadata components in the organization.\n *\n * @param {String} type - The type of metadata to delete\n * @param {String|Metadata~MetadataInfo|Array.|Array.} metadata - The fullName of metadata or metadata info to delete. If it is passed in fullName, the type parameter should not be empty.\n * @param {Callback.>} [callback] - Callback function\n * @returns {Metadata~AsyncResultLocator}\n */\nMetadata.prototype.deleteAsync = function(type, metadata, callback) {\n if (Number(this._conn.version) > 30) {\n throw new Error(\"Async metadata CRUD calls are not supported on ver 31.0 or later.\");\n }\n var convert = function(md) {\n if (_.isString(md)) {\n md = { fullName : md };\n }\n md[\"@xsi:type\"] = type;\n return md;\n };\n var isArray = _.isArray(metadata);\n metadata = isArray ? _.map(metadata, convert) : convert(metadata);\n var res = this._invoke(\"delete\", { metadata: metadata });\n return new AsyncResultLocator(this, res, isArray).thenCall(callback);\n};\n\n/**\n * Synonym of Metadata#delete().\n *\n * @deprecated\n * @method Metadata#del\n * @param {String} [type] - The type of metadata to delete\n * @param {String|Metadata~MetadataInfo|Array.|Array.} metadata - The fullName of metadata or metadata info to delete. If it is passed in fullName, the type parameter should not be empty.\n * @param {Callback.>} [callback] - Callback function\n * @returns {Metadata~AsyncResultLocator}\n */\n/**\n * Synonym of Metadata#delete().\n *\n * @method Metadata#deleteSync\n * @param {String} type - The type of metadata to delete\n * @param {String|Array.} fullNames - The fullName of metadata to delete.\n * @param {Callback.>} [callback] - Callback function\n * @returns {Promise.>}\n */\n\n/**\n * Synchronously deletes specified metadata components in the organization.\n *\n * @method Metadata#delete\n * @param {String} type - The type of metadata to delete\n * @param {String|Array.} fullNames - The fullName of metadata to delete.\n * @param {Callback.>} [callback] - Callback function\n * @returns {Promise.>}\n */\nMetadata.prototype.del =\nMetadata.prototype.deleteSync =\nMetadata.prototype[\"delete\"] = function(type, fullNames, callback) {\n return this._invoke(\"deleteMetadata\", { type: type, fullNames: fullNames }).then(function(results) {\n return _.isArray(results) ? _.map(results, convertToSaveResult) : convertToSaveResult(results);\n }).thenCall(callback);\n};\n\n/**\n * Rename fullname of a metadata component in the organization\n *\n * @param {String} type - The type of metadata to delete\n * @param {String} oldFullName - The original fullName of metadata\n * @param {String} newFullName - The new fullName of metadata\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\nMetadata.prototype.rename = function(type, oldFullName, newFullName, callback) {\n return this._invoke(\"renameMetadata\", { type: type, oldFullName: oldFullName, newFullName: newFullName }).then(function(result) {\n return convertToSaveResult(result);\n }).thenCall(callback);\n};\n\n/**\n * Checks the status of asynchronous metadata calls\n *\n * @param {String|Array.} ids - The asynchronous process ID(s)\n * @param {Callback.>} [callback] - Callback function\n * @returns {Metadata~AsyncResultLocator}\n */\nMetadata.prototype.checkStatus = function(ids, callback) {\n var isArray = _.isArray(ids);\n var res = this._invoke(\"checkStatus\", { asyncProcessId: ids });\n return new AsyncResultLocator(this, res, isArray).thenCall(callback);\n};\n\n/**\n * @typedef {Object} Metadata~DescribeMetadataResult\n * @prop {Array.} metadataObjects - One or more metadata components and their attributes\n * @prop {Array.} metadataObjects.childXmlNames - List of child sub-components for this component\n * @prop {String} metadataObjects.directoryName - The name of the directory in the .zip file that contains this component\n * @prop {Boolean} metadataObjects.inFolder - Indicates whether the component is in a folder or not\n * @prop {Boolean} metadataObjects.metaFile - Indicates whether the component requires an accompanying metadata file\n * @prop {String} metadataObjects.suffix - The file suffix for this component\n * @prop {String} metadataObjects.xmlName - The name of the root element in the metadata file for this component\n * @prop {String} organizationNamespace - The namespace of the organization\n * @prop {Boolean} partialSaveAllowed - Indicates whether rollbackOnError is allowed or not\n * @prop {Boolean} testRequired - Indicates whether tests are required or not\n */\n\n/**\n * Retrieves the metadata which describes your organization, including Apex classes and triggers,\n * custom objects, custom fields on standard objects, tab sets that define an app,\n * and many other components.\n *\n * @param {String} [version] - The API version for which you want metadata; for example, 29.0\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\nMetadata.prototype.describe = function(version, callback) {\n if (!_.isString(version)) {\n callback = version;\n version = this._conn.version;\n }\n return this._invoke(\"describeMetadata\", { asOfVersion: version }).then(function(res) {\n res.metadataObjects = _.isArray(res.metadataObjects) ? res.metadataObjects : [ res.metadataObjects ];\n res.metadataObjects = _.map(res.metadataObjects, function(mo) {\n if (mo.childXmlNames) {\n mo.childXmlNames = _.isArray(mo.childXmlNames) ? mo.childXmlNames: [ mo.childXmlNames ];\n }\n mo.inFolder = mo.inFolder === 'true';\n mo.metaFile = mo.metaFile === 'true';\n return mo;\n });\n res.partialSaveAllowed = res.partialSaveAllowed === 'true';\n res.testRequired = res.testRequired === 'true';\n return res;\n }).thenCall(callback);\n};\n\n/**\n * @typedef {Object} Metadata~ListMetadataQuery\n * @prop {String} type - The metadata type, such as CustomObject, CustomField, or ApexClass\n * @prop {String} [folder] - The folder associated with the component.\n */\n\n/**\n * @typedef {Object} Metadata~FileProperties\n * @prop {String} type - The metadata type, such as CustomObject, CustomField, or ApexClass\n * @prop {String} createdById - ID of the user who created the file\n * @prop {String} createdByName - Name of the user who created the file\n * @prop {String} createdDate - Date and time when the file was created\n * @prop {String} fileName - Name of the file\n * @prop {String} fullName - The file developer name used as a unique identifier for API access\n * @prop {String} id - ID of the file\n * @prop {String} lastModifiedById - ID of the user who last modified the file\n * @prop {String} lastModifiedByName - Name of the user who last modified the file\n * @prop {String} lastModifiedDate - Date and time that the file was last modified\n * @prop {String} [manageableState] - Indicates the manageable state of the specified component if it is contained in a package\n * @prop {String} [namespacePrefix] - The namespace prefix of the component\n */\n\n/**\n * Retrieves property information about metadata components in your organization\n *\n * @param {Metadata~ListMetadataQuery|Array.} queries - The criteria object(s) specifing metadata to list\n * @param {String} [version] - The API version for which you want metadata; for example, 29.0\n * @param {Callback.>} [callback] - Callback function\n * @returns {Promise.>}\n */\nMetadata.prototype.list = function(queries, version, callback) {\n if (!_.isString(version)) {\n callback = version;\n version = this._conn.version;\n }\n if (!_.isArray(queries)) {\n queries = [ queries ];\n }\n return this._invoke(\"listMetadata\", { queries: queries, asOfVersion: version }, callback);\n};\n\n/**\n * @typedef {Object} Metadata~RetrieveRequest\n */\n\n/**\n * Retrieves XML file representations of components in an organization\n *\n * @param {Metadata~RetrieveRequest} request - Options for determining which packages or files are retrieved\n * @param {Callback.} [callback] - Callback function\n * @returns {Metadata~RetrieveResultLocator}\n */\nMetadata.prototype.retrieve = function(request, callback) {\n var res = this._invoke(\"retrieve\", { request: request });\n return new RetrieveResultLocator(this, res).thenCall(callback);\n};\n\n/**\n * Checks the status of declarative metadata call retrieve() and returns the zip file contents\n *\n * @param {String} id - Async process id returned from previous retrieve request\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\nMetadata.prototype.checkRetrieveStatus = function(id, callback) {\n return this._invoke(\"checkRetrieveStatus\", { asyncProcessId: id }, callback);\n};\n\n/**\n * Deploy components into an organization using zipped file representations\n *\n * @param {stream.Stream|Buffer|String} zipInput - Zipped file input source in readable stream, binary buffer or Base64-encoded string\n * @param {Object} [options] - Options used in deployment\n * @param {Boolean} [options.allowMissingFiles] - Specifies whether a deploy succeeds even if files that are specified in package.xml but are not in the .zip file or not.\n * @param {Boolean} [options.autoUpdatePackage] - If a file is in the .zip file but not specified in package.xml, specifies whether the file should be automatically added to the package or not.\n * @param {Boolean} [options.checkOnly] - Indicates whether Apex classes and triggers are saved to the organization as part of the deployment (false) or not (true).\n * @param {Boolean} [options.ignoreWarnings] - Indicates whether a warning should allow a deployment to complete successfully (true) or not (false). Defaults to false.\n * @param {Boolean} [options.performRetrieve] - Indicates whether a retrieve() call is performed immediately after the deployment (true) or not (false).\n * @param {Boolean} [options.purgeOnDelete] - If true, the deleted components in the destructiveChanges.xml manifest file aren't stored in the Recycle Bin.\n * @param {Boolean} [options.rollbackOnError] - Indicates whether any failure causes a complete rollback (true) or not (false).\n * @param {Boolean} [options.runAllTests] - If true, all Apex tests defined in the organization are run.\n * @param {Array.} [options.runTests] - A list of Apex tests to be run during deployment.\n * @param {Boolean} [options.singlePackage] - Indicates whether the specified .zip file points to a directory structure with a single package (true) or a set of packages (false).\n * @param {Callback.} [callback] - Callback function\n * @returns {Metadata~DeployResultLocator}\n */\nMetadata.prototype.deploy = function(zipInput, options, callback) {\n if (!options || _.isFunction(options)) {\n callback = options;\n options = {};\n }\n var deferred = Promise.defer();\n if (_.isObject(zipInput) && _.isFunction(zipInput.pipe)) {\n var bufs = [];\n zipInput.on('data', function(d) {\n bufs.push(d);\n });\n zipInput.on('end', function() {\n deferred.resolve(Buffer.concat(bufs).toString('base64'));\n });\n // zipInput.resume();\n } else if (zipInput instanceof Buffer) {\n deferred.resolve(zipInput.toString('base64'));\n } else if (zipInput instanceof String || typeof zipInput === 'string') {\n deferred.resolve(zipInput);\n } else {\n throw \"Unexpected zipInput type\";\n }\n\n var self = this;\n var res = deferred.promise.then(function(zipContentB64) {\n return self._invoke(\"deploy\", {\n ZipFile: zipContentB64,\n DeployOptions: options\n }, callback);\n });\n return new DeployResultLocator(this, res).thenCall(callback);\n};\n\n/**\n * Checks the status of declarative metadata call deploy()\n *\n * @param {String} id - Async process id returned from previous deploy request\n * @param {Boolean} [includeDetails] - Sets the DeployResult object to include details information (default: false)\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\nMetadata.prototype.checkDeployStatus = function(id, includeDetails, callback) {\n if (_.isObject(includeDetails) || _.isBoolean(includeDetails)) {\n includeDetails = !!includeDetails;\n } else {\n callback = includeDetails;\n includeDetails = false;\n }\n return this._invoke(\"checkDeployStatus\", {\n asyncProcessId: id,\n includeDetails : includeDetails\n }).then(function(res) {\n res.done = res.done === 'true';\n res.success = res.success === 'true';\n res.checkOnly = res.checkOnly === 'true';\n res.runTestsEnabled = res.runTestsEnabled === 'true';\n if (res.ignoreWarnings) {\n res.ignoreWarnings = res.ignoreWarnings === 'true';\n }\n if (res.rollbackOnError) {\n res.rollbackOnError = res.rollbackOnError === 'true';\n }\n res.numberComponentErrors = Number(res.numberComponentErrors);\n res.numberComponentsDeployed = Number(res.numberComponentsDeployed);\n res.numberComponentsTotal = Number(res.numberComponentsTotal);\n res.numberTestErrors = Number(res.numberTestErrors);\n res.numberTestsCompleted = Number(res.numberTestsCompleted);\n res.numberTestsTotal = Number(res.numberTestsTotal);\n\n return res;\n }).thenCall(callback);\n};\n\n\n/*--------------------------------------------*/\n\n/**\n * @typedef {Object} Metadata~AsyncResult\n * @prop {Boolean} done - Indicates whether the call has completed or not\n * @prop {String} id - ID of the component being created, updated, deleted, deployed, or retrieved\n * @prop {String} state - The state four possible values: Queued, InProgress, Completed, and Error.\n * @prop {String} [statusCode] - If an error occurred during the create(), update(), or delete() call, a status code is returned\n * @prop {String} [message] - Message corresponding to the statusCode field returned\n */\n\n/**\n * The locator class for Metadata API asynchronous call result\n *\n * @protected\n * @class Metadata~AsyncResultLocator\n * @extends events.EventEmitter\n * @implements Promise.>\n * @param {Metadata} meta - Metadata API object\n * @param {Promise.>} results - Promise object for async result info\n * @param {Boolean} [isArray] - Indicates whether the async request is given in array or single object\n */\nvar AsyncResultLocator = function(meta, results, isArray) {\n this._meta = meta;\n this._results = results;\n this._isArray = isArray;\n};\n\ninherits(AsyncResultLocator, events.EventEmitter);\n\n/**\n * Promise/A+ interface\n * http://promises-aplus.github.io/promises-spec/\n *\n * Delegate to deferred promise, return promise instance for batch result\n *\n * @method Metadata~AsyncResultLocator#then\n */\nAsyncResultLocator.prototype.then = function(onResolve, onReject) {\n var self = this;\n return this._results.then(function(results) {\n var convertType = function(res) {\n if (res.$ && res.$[\"xsi:nil\"] === 'true') {\n return null;\n }\n res.done = res.done === 'true';\n return res;\n };\n results = _.isArray(results) ? _.map(results, convertType) : convertType(results);\n if (self._isArray && !_.isArray(results)) {\n results = [ results ];\n }\n return onResolve(results);\n }, onReject);\n};\n\n/**\n * Promise/A+ extension\n * Call \"then\" using given node-style callback function\n *\n * @method Metadata~AsyncResultLocator#thenCall\n */\nAsyncResultLocator.prototype.thenCall = function(callback) {\n return _.isFunction(callback) ? this.then(function(res) {\n process.nextTick(function() {\n callback(null, res);\n });\n }, function(err) {\n process.nextTick(function() {\n callback(err);\n });\n }) : this;\n};\n\n/**\n * Check the status of async request\n *\n * @method Metadata~AsyncResultLocator#check\n * @param {Callback.>} [callback] - Callback function\n * @returns {Promise.>}\n */\nAsyncResultLocator.prototype.check = function(callback) {\n var self = this;\n var meta = this._meta;\n return this.then(function(results) {\n var ids = _.isArray(results) ? _.map(results, function(res){ return res.id; }) : results.id;\n self._ids = ids;\n return meta.checkStatus(ids);\n }).thenCall(callback);\n};\n\n/**\n * Polling until async call status becomes complete or error\n *\n * @method Metadata~AsyncResultLocator#poll\n * @param {Number} interval - Polling interval in milliseconds\n * @param {Number} timeout - Polling timeout in milliseconds\n */\nAsyncResultLocator.prototype.poll = function(interval, timeout) {\n var self = this;\n var startTime = new Date().getTime();\n var poll = function() {\n var now = new Date().getTime();\n if (startTime + timeout < now) {\n var errMsg = \"Polling time out.\";\n if (self._ids) {\n errMsg += \" Process Id = \" + self._ids;\n }\n self.emit('error', new Error(errMsg));\n return;\n }\n self.check().then(function(results) {\n var done = true;\n var resultArr = _.isArray(results) ? results : [ results ];\n for (var i=0, len=resultArr.length; i>} [callback] - Callback function\n * @returns {Promise.>}\n */\nAsyncResultLocator.prototype.complete = function(callback) {\n var deferred = Promise.defer();\n this.on('complete', function(results) {\n deferred.resolve(results);\n });\n this.on('error', function(err) {\n deferred.reject(err);\n });\n var meta = this._meta;\n this.poll(meta.pollInterval, meta.pollTimeout);\n return deferred.promise.thenCall(callback);\n};\n\n/*--------------------------------------------*/\n/**\n * The locator class to track retreive() Metadata API call result\n *\n * @protected\n * @class Metadata~RetrieveResultLocator\n * @extends Metadata~AsyncResultLocator\n * @param {Metadata} meta - Metadata API object\n * @param {Promise.} result - Promise object for async result of retrieve call()\n */\nvar RetrieveResultLocator = function(meta, result) {\n RetrieveResultLocator.super_.call(this, meta, result);\n};\n\ninherits(RetrieveResultLocator, AsyncResultLocator);\n\n/**\n * @typedef {Object} Metadata~RetrieveResult\n * @prop {Array.} fileProperties - Contains information about the properties of each component in the .zip file, and the manifest file package.xml\n * @prop {String} id - ID of the component being retrieved\n * @prop {Array.} messages - Contains information about the success or failure of the retrieve() call\n * @prop {String} zipFile - The zip file returned by the retrieve request. Base 64-encoded binary data\n */\n\n/**\n * Check and wait until the async request becomes in completed status,\n * and retrieve the result data.\n *\n * @memthod Metadata~RetrieveResultLocator#complete\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\nRetrieveResultLocator.prototype.complete = function(callback) {\n var meta = this._meta;\n return RetrieveResultLocator.super_.prototype.complete.call(this).then(function(result) {\n return meta.checkRetrieveStatus(result.id);\n }).thenCall(callback);\n};\n\n/**\n * Change the retrieved result to Node.js readable stream\n *\n * @method Metadata~RetrieveResultLocator#stream\n * @returns {stream.Readable}\n */\nRetrieveResultLocator.prototype.stream = function() {\n var self = this;\n var resultStream = new stream.Readable();\n var reading = false;\n resultStream._read = function() {\n if (reading) { return; }\n reading = true;\n self.complete(function(err, result) {\n if (err) {\n resultStream.emit('error', err);\n } else {\n resultStream.push(Buffer.from(result.zipFile, 'base64'));\n resultStream.push(null);\n }\n });\n };\n return resultStream;\n};\n\n/*--------------------------------------------*/\n/**\n * The locator class to track deploy() Metadata API call result\n *\n * @protected\n * @class Metadata~DeployResultLocator\n * @extends Metadata~AsyncResultLocator\n * @param {Metadata} meta - Metadata API object\n * @param {Promise.} result - Promise object for async result of deploy() call\n */\nvar DeployResultLocator = function(meta, result) {\n DeployResultLocator.super_.call(this, meta, result);\n};\n\ninherits(DeployResultLocator, AsyncResultLocator);\n\n/**\n * @typedef {Object} Metadata~DeployResult\n * @prop {String} id - ID of the component being deployed\n * @prop {Boolean} checkOnly - Indicates whether this deployment is being used to check the validity of the deployed files without making any changes in the organization or not\n * @prop {String} completedDate - Timestamp for when the deployment process ended\n * @prop {String} createdDate - Timestamp for when the deploy() call was received\n * @prop {Array.} [details] - Provides the details of a deployment that is in-progress or ended, if includeDetails is set to true in checkDeployStatus() call\n * @prop {Boolean} done - Indicates whether the server finished processing the deploy() call for the specified id\n * @prop {String} [errorMessage] - Message corresponding to the values in the errorStatusCode field\n * @prop {String} [errorStatusCode] - If an error occurred during the deploy() call, a status code is returned, and the message corresponding to the status code is returned in the errorMessagefield\n * @prop {Boolean} [ignoreWarnings] - Specifies whether a deployment should continue even if the deployment generates warnings\n * @prop {String} lastModifiedDate - Timestamp of the last update for the deployment process\n * @prop {Number} numberComponentErrors - The number of components that generated errors during this deployment\n * @prop {Number} numberComponentsDeployed - The number of components deployed in the deployment process\n * @prop {Number} numberComponentsTotal - The total number of components in the deployment\n * @prop {Number} numberTestErrors - The number of Apex tests that have generated errors during this deployment\n * @prop {Number} numberTestsCompleted - The number of completedApex tests for this deployment\n * @prop {Number} numberTestsTotal - The total number of Apex tests for this deployment\n * @prop {Boolean} [rollbackOnError] - Indicates whether any failure causes a complete rollback or not. Default is true.\n * @prop {String} startDate - Timestamp for when the deployment process began\n * @prop {String} status - Indicates the current state of the deployment\n * @prop {Boolean} success - Indicates whether the deployment was successful or not\n */\n\n/**\n * Check and wait until the async request becomes in completed status,\n * and retrieve the result data.\n *\n * @method Metadata~DeployResultLocator#complete\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\nDeployResultLocator.prototype.complete = function(includeDetails, callback) {\n if (_.isFunction(includeDetails)) {\n callback = includeDetails;\n includeDetails = false;\n }\n var meta = this._meta;\n return DeployResultLocator.super_.prototype.complete.call(this).then(function(result) {\n return meta.checkDeployStatus(result.id, includeDetails);\n }).thenCall(callback);\n};\n\n\n/*--------------------------------------------*/\n/*\n * Register hook in connection instantiation for dynamically adding this API module features\n */\njsforce.on('connection:new', function(conn) {\n conn.metadata = new Metadata(conn);\n});\n","'use strict'\n\nexports.byteLength = byteLength\nexports.toByteArray = toByteArray\nexports.fromByteArray = fromByteArray\n\nvar lookup = []\nvar revLookup = []\nvar Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array\n\nvar code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'\nfor (var i = 0, len = code.length; i < len; ++i) {\n lookup[i] = code[i]\n revLookup[code.charCodeAt(i)] = i\n}\n\n// Support decoding URL-safe base64 strings, as Node.js does.\n// See: https://en.wikipedia.org/wiki/Base64#URL_applications\nrevLookup['-'.charCodeAt(0)] = 62\nrevLookup['_'.charCodeAt(0)] = 63\n\nfunction getLens (b64) {\n var len = b64.length\n\n if (len % 4 > 0) {\n throw new Error('Invalid string. Length must be a multiple of 4')\n }\n\n // Trim off extra bytes after placeholder bytes are found\n // See: https://github.com/beatgammit/base64-js/issues/42\n var validLen = b64.indexOf('=')\n if (validLen === -1) validLen = len\n\n var placeHoldersLen = validLen === len\n ? 0\n : 4 - (validLen % 4)\n\n return [validLen, placeHoldersLen]\n}\n\n// base64 is 4/3 + up to two characters of the original data\nfunction byteLength (b64) {\n var lens = getLens(b64)\n var validLen = lens[0]\n var placeHoldersLen = lens[1]\n return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction _byteLength (b64, validLen, placeHoldersLen) {\n return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction toByteArray (b64) {\n var tmp\n var lens = getLens(b64)\n var validLen = lens[0]\n var placeHoldersLen = lens[1]\n\n var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen))\n\n var curByte = 0\n\n // if there are placeholders, only get up to the last complete 4 chars\n var len = placeHoldersLen > 0\n ? validLen - 4\n : validLen\n\n var i\n for (i = 0; i < len; i += 4) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 18) |\n (revLookup[b64.charCodeAt(i + 1)] << 12) |\n (revLookup[b64.charCodeAt(i + 2)] << 6) |\n revLookup[b64.charCodeAt(i + 3)]\n arr[curByte++] = (tmp >> 16) & 0xFF\n arr[curByte++] = (tmp >> 8) & 0xFF\n arr[curByte++] = tmp & 0xFF\n }\n\n if (placeHoldersLen === 2) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 2) |\n (revLookup[b64.charCodeAt(i + 1)] >> 4)\n arr[curByte++] = tmp & 0xFF\n }\n\n if (placeHoldersLen === 1) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 10) |\n (revLookup[b64.charCodeAt(i + 1)] << 4) |\n (revLookup[b64.charCodeAt(i + 2)] >> 2)\n arr[curByte++] = (tmp >> 8) & 0xFF\n arr[curByte++] = tmp & 0xFF\n }\n\n return arr\n}\n\nfunction tripletToBase64 (num) {\n return lookup[num >> 18 & 0x3F] +\n lookup[num >> 12 & 0x3F] +\n lookup[num >> 6 & 0x3F] +\n lookup[num & 0x3F]\n}\n\nfunction encodeChunk (uint8, start, end) {\n var tmp\n var output = []\n for (var i = start; i < end; i += 3) {\n tmp =\n ((uint8[i] << 16) & 0xFF0000) +\n ((uint8[i + 1] << 8) & 0xFF00) +\n (uint8[i + 2] & 0xFF)\n output.push(tripletToBase64(tmp))\n }\n return output.join('')\n}\n\nfunction fromByteArray (uint8) {\n var tmp\n var len = uint8.length\n var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes\n var parts = []\n var maxChunkLength = 16383 // must be multiple of 3\n\n // go through the array every three bytes, we'll deal with trailing stuff later\n for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {\n parts.push(encodeChunk(\n uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)\n ))\n }\n\n // pad the end with zeros, but make sure to not forget the extra bytes\n if (extraBytes === 1) {\n tmp = uint8[len - 1]\n parts.push(\n lookup[tmp >> 2] +\n lookup[(tmp << 4) & 0x3F] +\n '=='\n )\n } else if (extraBytes === 2) {\n tmp = (uint8[len - 2] << 8) + uint8[len - 1]\n parts.push(\n lookup[tmp >> 10] +\n lookup[(tmp >> 4) & 0x3F] +\n lookup[(tmp << 2) & 0x3F] +\n '='\n )\n }\n\n return parts.join('')\n}\n","/*!\n * The buffer module from node.js, for the browser.\n *\n * @author Feross Aboukhadijeh \n * @license MIT\n */\n/* eslint-disable no-proto */\n\n'use strict'\n\nvar base64 = require('base64-js')\nvar ieee754 = require('ieee754')\n\nexports.Buffer = Buffer\nexports.SlowBuffer = SlowBuffer\nexports.INSPECT_MAX_BYTES = 50\n\nvar K_MAX_LENGTH = 0x7fffffff\nexports.kMaxLength = K_MAX_LENGTH\n\n/**\n * If `Buffer.TYPED_ARRAY_SUPPORT`:\n * === true Use Uint8Array implementation (fastest)\n * === false Print warning and recommend using `buffer` v4.x which has an Object\n * implementation (most compatible, even IE6)\n *\n * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+,\n * Opera 11.6+, iOS 4.2+.\n *\n * We report that the browser does not support typed arrays if the are not subclassable\n * using __proto__. Firefox 4-29 lacks support for adding new properties to `Uint8Array`\n * (See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438). IE 10 lacks support\n * for __proto__ and has a buggy typed array implementation.\n */\nBuffer.TYPED_ARRAY_SUPPORT = typedArraySupport()\n\nif (!Buffer.TYPED_ARRAY_SUPPORT && typeof console !== 'undefined' &&\n typeof console.error === 'function') {\n console.error(\n 'This browser lacks typed array (Uint8Array) support which is required by ' +\n '`buffer` v5.x. Use `buffer` v4.x if you require old browser support.'\n )\n}\n\nfunction typedArraySupport () {\n // Can typed array instances can be augmented?\n try {\n var arr = new Uint8Array(1)\n arr.__proto__ = { __proto__: Uint8Array.prototype, foo: function () { return 42 } }\n return arr.foo() === 42\n } catch (e) {\n return false\n }\n}\n\nObject.defineProperty(Buffer.prototype, 'parent', {\n enumerable: true,\n get: function () {\n if (!Buffer.isBuffer(this)) return undefined\n return this.buffer\n }\n})\n\nObject.defineProperty(Buffer.prototype, 'offset', {\n enumerable: true,\n get: function () {\n if (!Buffer.isBuffer(this)) return undefined\n return this.byteOffset\n }\n})\n\nfunction createBuffer (length) {\n if (length > K_MAX_LENGTH) {\n throw new RangeError('The value \"' + length + '\" is invalid for option \"size\"')\n }\n // Return an augmented `Uint8Array` instance\n var buf = new Uint8Array(length)\n buf.__proto__ = Buffer.prototype\n return buf\n}\n\n/**\n * The Buffer constructor returns instances of `Uint8Array` that have their\n * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of\n * `Uint8Array`, so the returned instances will have all the node `Buffer` methods\n * and the `Uint8Array` methods. Square bracket notation works as expected -- it\n * returns a single octet.\n *\n * The `Uint8Array` prototype remains unmodified.\n */\n\nfunction Buffer (arg, encodingOrOffset, length) {\n // Common case.\n if (typeof arg === 'number') {\n if (typeof encodingOrOffset === 'string') {\n throw new TypeError(\n 'The \"string\" argument must be of type string. Received type number'\n )\n }\n return allocUnsafe(arg)\n }\n return from(arg, encodingOrOffset, length)\n}\n\n// Fix subarray() in ES2016. See: https://github.com/feross/buffer/pull/97\nif (typeof Symbol !== 'undefined' && Symbol.species != null &&\n Buffer[Symbol.species] === Buffer) {\n Object.defineProperty(Buffer, Symbol.species, {\n value: null,\n configurable: true,\n enumerable: false,\n writable: false\n })\n}\n\nBuffer.poolSize = 8192 // not used by this implementation\n\nfunction from (value, encodingOrOffset, length) {\n if (typeof value === 'string') {\n return fromString(value, encodingOrOffset)\n }\n\n if (ArrayBuffer.isView(value)) {\n return fromArrayLike(value)\n }\n\n if (value == null) {\n throw TypeError(\n 'The first argument must be one of type string, Buffer, ArrayBuffer, Array, ' +\n 'or Array-like Object. Received type ' + (typeof value)\n )\n }\n\n if (isInstance(value, ArrayBuffer) ||\n (value && isInstance(value.buffer, ArrayBuffer))) {\n return fromArrayBuffer(value, encodingOrOffset, length)\n }\n\n if (typeof value === 'number') {\n throw new TypeError(\n 'The \"value\" argument must not be of type number. Received type number'\n )\n }\n\n var valueOf = value.valueOf && value.valueOf()\n if (valueOf != null && valueOf !== value) {\n return Buffer.from(valueOf, encodingOrOffset, length)\n }\n\n var b = fromObject(value)\n if (b) return b\n\n if (typeof Symbol !== 'undefined' && Symbol.toPrimitive != null &&\n typeof value[Symbol.toPrimitive] === 'function') {\n return Buffer.from(\n value[Symbol.toPrimitive]('string'), encodingOrOffset, length\n )\n }\n\n throw new TypeError(\n 'The first argument must be one of type string, Buffer, ArrayBuffer, Array, ' +\n 'or Array-like Object. Received type ' + (typeof value)\n )\n}\n\n/**\n * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError\n * if value is a number.\n * Buffer.from(str[, encoding])\n * Buffer.from(array)\n * Buffer.from(buffer)\n * Buffer.from(arrayBuffer[, byteOffset[, length]])\n **/\nBuffer.from = function (value, encodingOrOffset, length) {\n return from(value, encodingOrOffset, length)\n}\n\n// Note: Change prototype *after* Buffer.from is defined to workaround Chrome bug:\n// https://github.com/feross/buffer/pull/148\nBuffer.prototype.__proto__ = Uint8Array.prototype\nBuffer.__proto__ = Uint8Array\n\nfunction assertSize (size) {\n if (typeof size !== 'number') {\n throw new TypeError('\"size\" argument must be of type number')\n } else if (size < 0) {\n throw new RangeError('The value \"' + size + '\" is invalid for option \"size\"')\n }\n}\n\nfunction alloc (size, fill, encoding) {\n assertSize(size)\n if (size <= 0) {\n return createBuffer(size)\n }\n if (fill !== undefined) {\n // Only pay attention to encoding if it's a string. This\n // prevents accidentally sending in a number that would\n // be interpretted as a start offset.\n return typeof encoding === 'string'\n ? createBuffer(size).fill(fill, encoding)\n : createBuffer(size).fill(fill)\n }\n return createBuffer(size)\n}\n\n/**\n * Creates a new filled Buffer instance.\n * alloc(size[, fill[, encoding]])\n **/\nBuffer.alloc = function (size, fill, encoding) {\n return alloc(size, fill, encoding)\n}\n\nfunction allocUnsafe (size) {\n assertSize(size)\n return createBuffer(size < 0 ? 0 : checked(size) | 0)\n}\n\n/**\n * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance.\n * */\nBuffer.allocUnsafe = function (size) {\n return allocUnsafe(size)\n}\n/**\n * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance.\n */\nBuffer.allocUnsafeSlow = function (size) {\n return allocUnsafe(size)\n}\n\nfunction fromString (string, encoding) {\n if (typeof encoding !== 'string' || encoding === '') {\n encoding = 'utf8'\n }\n\n if (!Buffer.isEncoding(encoding)) {\n throw new TypeError('Unknown encoding: ' + encoding)\n }\n\n var length = byteLength(string, encoding) | 0\n var buf = createBuffer(length)\n\n var actual = buf.write(string, encoding)\n\n if (actual !== length) {\n // Writing a hex string, for example, that contains invalid characters will\n // cause everything after the first invalid character to be ignored. (e.g.\n // 'abxxcd' will be treated as 'ab')\n buf = buf.slice(0, actual)\n }\n\n return buf\n}\n\nfunction fromArrayLike (array) {\n var length = array.length < 0 ? 0 : checked(array.length) | 0\n var buf = createBuffer(length)\n for (var i = 0; i < length; i += 1) {\n buf[i] = array[i] & 255\n }\n return buf\n}\n\nfunction fromArrayBuffer (array, byteOffset, length) {\n if (byteOffset < 0 || array.byteLength < byteOffset) {\n throw new RangeError('\"offset\" is outside of buffer bounds')\n }\n\n if (array.byteLength < byteOffset + (length || 0)) {\n throw new RangeError('\"length\" is outside of buffer bounds')\n }\n\n var buf\n if (byteOffset === undefined && length === undefined) {\n buf = new Uint8Array(array)\n } else if (length === undefined) {\n buf = new Uint8Array(array, byteOffset)\n } else {\n buf = new Uint8Array(array, byteOffset, length)\n }\n\n // Return an augmented `Uint8Array` instance\n buf.__proto__ = Buffer.prototype\n return buf\n}\n\nfunction fromObject (obj) {\n if (Buffer.isBuffer(obj)) {\n var len = checked(obj.length) | 0\n var buf = createBuffer(len)\n\n if (buf.length === 0) {\n return buf\n }\n\n obj.copy(buf, 0, 0, len)\n return buf\n }\n\n if (obj.length !== undefined) {\n if (typeof obj.length !== 'number' || numberIsNaN(obj.length)) {\n return createBuffer(0)\n }\n return fromArrayLike(obj)\n }\n\n if (obj.type === 'Buffer' && Array.isArray(obj.data)) {\n return fromArrayLike(obj.data)\n }\n}\n\nfunction checked (length) {\n // Note: cannot use `length < K_MAX_LENGTH` here because that fails when\n // length is NaN (which is otherwise coerced to zero.)\n if (length >= K_MAX_LENGTH) {\n throw new RangeError('Attempt to allocate Buffer larger than maximum ' +\n 'size: 0x' + K_MAX_LENGTH.toString(16) + ' bytes')\n }\n return length | 0\n}\n\nfunction SlowBuffer (length) {\n if (+length != length) { // eslint-disable-line eqeqeq\n length = 0\n }\n return Buffer.alloc(+length)\n}\n\nBuffer.isBuffer = function isBuffer (b) {\n return b != null && b._isBuffer === true &&\n b !== Buffer.prototype // so Buffer.isBuffer(Buffer.prototype) will be false\n}\n\nBuffer.compare = function compare (a, b) {\n if (isInstance(a, Uint8Array)) a = Buffer.from(a, a.offset, a.byteLength)\n if (isInstance(b, Uint8Array)) b = Buffer.from(b, b.offset, b.byteLength)\n if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) {\n throw new TypeError(\n 'The \"buf1\", \"buf2\" arguments must be one of type Buffer or Uint8Array'\n )\n }\n\n if (a === b) return 0\n\n var x = a.length\n var y = b.length\n\n for (var i = 0, len = Math.min(x, y); i < len; ++i) {\n if (a[i] !== b[i]) {\n x = a[i]\n y = b[i]\n break\n }\n }\n\n if (x < y) return -1\n if (y < x) return 1\n return 0\n}\n\nBuffer.isEncoding = function isEncoding (encoding) {\n switch (String(encoding).toLowerCase()) {\n case 'hex':\n case 'utf8':\n case 'utf-8':\n case 'ascii':\n case 'latin1':\n case 'binary':\n case 'base64':\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return true\n default:\n return false\n }\n}\n\nBuffer.concat = function concat (list, length) {\n if (!Array.isArray(list)) {\n throw new TypeError('\"list\" argument must be an Array of Buffers')\n }\n\n if (list.length === 0) {\n return Buffer.alloc(0)\n }\n\n var i\n if (length === undefined) {\n length = 0\n for (i = 0; i < list.length; ++i) {\n length += list[i].length\n }\n }\n\n var buffer = Buffer.allocUnsafe(length)\n var pos = 0\n for (i = 0; i < list.length; ++i) {\n var buf = list[i]\n if (isInstance(buf, Uint8Array)) {\n buf = Buffer.from(buf)\n }\n if (!Buffer.isBuffer(buf)) {\n throw new TypeError('\"list\" argument must be an Array of Buffers')\n }\n buf.copy(buffer, pos)\n pos += buf.length\n }\n return buffer\n}\n\nfunction byteLength (string, encoding) {\n if (Buffer.isBuffer(string)) {\n return string.length\n }\n if (ArrayBuffer.isView(string) || isInstance(string, ArrayBuffer)) {\n return string.byteLength\n }\n if (typeof string !== 'string') {\n throw new TypeError(\n 'The \"string\" argument must be one of type string, Buffer, or ArrayBuffer. ' +\n 'Received type ' + typeof string\n )\n }\n\n var len = string.length\n var mustMatch = (arguments.length > 2 && arguments[2] === true)\n if (!mustMatch && len === 0) return 0\n\n // Use a for loop to avoid recursion\n var loweredCase = false\n for (;;) {\n switch (encoding) {\n case 'ascii':\n case 'latin1':\n case 'binary':\n return len\n case 'utf8':\n case 'utf-8':\n return utf8ToBytes(string).length\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return len * 2\n case 'hex':\n return len >>> 1\n case 'base64':\n return base64ToBytes(string).length\n default:\n if (loweredCase) {\n return mustMatch ? -1 : utf8ToBytes(string).length // assume utf8\n }\n encoding = ('' + encoding).toLowerCase()\n loweredCase = true\n }\n }\n}\nBuffer.byteLength = byteLength\n\nfunction slowToString (encoding, start, end) {\n var loweredCase = false\n\n // No need to verify that \"this.length <= MAX_UINT32\" since it's a read-only\n // property of a typed array.\n\n // This behaves neither like String nor Uint8Array in that we set start/end\n // to their upper/lower bounds if the value passed is out of range.\n // undefined is handled specially as per ECMA-262 6th Edition,\n // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization.\n if (start === undefined || start < 0) {\n start = 0\n }\n // Return early if start > this.length. Done here to prevent potential uint32\n // coercion fail below.\n if (start > this.length) {\n return ''\n }\n\n if (end === undefined || end > this.length) {\n end = this.length\n }\n\n if (end <= 0) {\n return ''\n }\n\n // Force coersion to uint32. This will also coerce falsey/NaN values to 0.\n end >>>= 0\n start >>>= 0\n\n if (end <= start) {\n return ''\n }\n\n if (!encoding) encoding = 'utf8'\n\n while (true) {\n switch (encoding) {\n case 'hex':\n return hexSlice(this, start, end)\n\n case 'utf8':\n case 'utf-8':\n return utf8Slice(this, start, end)\n\n case 'ascii':\n return asciiSlice(this, start, end)\n\n case 'latin1':\n case 'binary':\n return latin1Slice(this, start, end)\n\n case 'base64':\n return base64Slice(this, start, end)\n\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return utf16leSlice(this, start, end)\n\n default:\n if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n encoding = (encoding + '').toLowerCase()\n loweredCase = true\n }\n }\n}\n\n// This property is used by `Buffer.isBuffer` (and the `is-buffer` npm package)\n// to detect a Buffer instance. It's not possible to use `instanceof Buffer`\n// reliably in a browserify context because there could be multiple different\n// copies of the 'buffer' package in use. This method works even for Buffer\n// instances that were created from another copy of the `buffer` package.\n// See: https://github.com/feross/buffer/issues/154\nBuffer.prototype._isBuffer = true\n\nfunction swap (b, n, m) {\n var i = b[n]\n b[n] = b[m]\n b[m] = i\n}\n\nBuffer.prototype.swap16 = function swap16 () {\n var len = this.length\n if (len % 2 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 16-bits')\n }\n for (var i = 0; i < len; i += 2) {\n swap(this, i, i + 1)\n }\n return this\n}\n\nBuffer.prototype.swap32 = function swap32 () {\n var len = this.length\n if (len % 4 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 32-bits')\n }\n for (var i = 0; i < len; i += 4) {\n swap(this, i, i + 3)\n swap(this, i + 1, i + 2)\n }\n return this\n}\n\nBuffer.prototype.swap64 = function swap64 () {\n var len = this.length\n if (len % 8 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 64-bits')\n }\n for (var i = 0; i < len; i += 8) {\n swap(this, i, i + 7)\n swap(this, i + 1, i + 6)\n swap(this, i + 2, i + 5)\n swap(this, i + 3, i + 4)\n }\n return this\n}\n\nBuffer.prototype.toString = function toString () {\n var length = this.length\n if (length === 0) return ''\n if (arguments.length === 0) return utf8Slice(this, 0, length)\n return slowToString.apply(this, arguments)\n}\n\nBuffer.prototype.toLocaleString = Buffer.prototype.toString\n\nBuffer.prototype.equals = function equals (b) {\n if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')\n if (this === b) return true\n return Buffer.compare(this, b) === 0\n}\n\nBuffer.prototype.inspect = function inspect () {\n var str = ''\n var max = exports.INSPECT_MAX_BYTES\n str = this.toString('hex', 0, max).replace(/(.{2})/g, '$1 ').trim()\n if (this.length > max) str += ' ... '\n return ''\n}\n\nBuffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) {\n if (isInstance(target, Uint8Array)) {\n target = Buffer.from(target, target.offset, target.byteLength)\n }\n if (!Buffer.isBuffer(target)) {\n throw new TypeError(\n 'The \"target\" argument must be one of type Buffer or Uint8Array. ' +\n 'Received type ' + (typeof target)\n )\n }\n\n if (start === undefined) {\n start = 0\n }\n if (end === undefined) {\n end = target ? target.length : 0\n }\n if (thisStart === undefined) {\n thisStart = 0\n }\n if (thisEnd === undefined) {\n thisEnd = this.length\n }\n\n if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) {\n throw new RangeError('out of range index')\n }\n\n if (thisStart >= thisEnd && start >= end) {\n return 0\n }\n if (thisStart >= thisEnd) {\n return -1\n }\n if (start >= end) {\n return 1\n }\n\n start >>>= 0\n end >>>= 0\n thisStart >>>= 0\n thisEnd >>>= 0\n\n if (this === target) return 0\n\n var x = thisEnd - thisStart\n var y = end - start\n var len = Math.min(x, y)\n\n var thisCopy = this.slice(thisStart, thisEnd)\n var targetCopy = target.slice(start, end)\n\n for (var i = 0; i < len; ++i) {\n if (thisCopy[i] !== targetCopy[i]) {\n x = thisCopy[i]\n y = targetCopy[i]\n break\n }\n }\n\n if (x < y) return -1\n if (y < x) return 1\n return 0\n}\n\n// Finds either the first index of `val` in `buffer` at offset >= `byteOffset`,\n// OR the last index of `val` in `buffer` at offset <= `byteOffset`.\n//\n// Arguments:\n// - buffer - a Buffer to search\n// - val - a string, Buffer, or number\n// - byteOffset - an index into `buffer`; will be clamped to an int32\n// - encoding - an optional encoding, relevant is val is a string\n// - dir - true for indexOf, false for lastIndexOf\nfunction bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) {\n // Empty buffer means no match\n if (buffer.length === 0) return -1\n\n // Normalize byteOffset\n if (typeof byteOffset === 'string') {\n encoding = byteOffset\n byteOffset = 0\n } else if (byteOffset > 0x7fffffff) {\n byteOffset = 0x7fffffff\n } else if (byteOffset < -0x80000000) {\n byteOffset = -0x80000000\n }\n byteOffset = +byteOffset // Coerce to Number.\n if (numberIsNaN(byteOffset)) {\n // byteOffset: it it's undefined, null, NaN, \"foo\", etc, search whole buffer\n byteOffset = dir ? 0 : (buffer.length - 1)\n }\n\n // Normalize byteOffset: negative offsets start from the end of the buffer\n if (byteOffset < 0) byteOffset = buffer.length + byteOffset\n if (byteOffset >= buffer.length) {\n if (dir) return -1\n else byteOffset = buffer.length - 1\n } else if (byteOffset < 0) {\n if (dir) byteOffset = 0\n else return -1\n }\n\n // Normalize val\n if (typeof val === 'string') {\n val = Buffer.from(val, encoding)\n }\n\n // Finally, search either indexOf (if dir is true) or lastIndexOf\n if (Buffer.isBuffer(val)) {\n // Special case: looking for empty string/buffer always fails\n if (val.length === 0) {\n return -1\n }\n return arrayIndexOf(buffer, val, byteOffset, encoding, dir)\n } else if (typeof val === 'number') {\n val = val & 0xFF // Search for a byte value [0-255]\n if (typeof Uint8Array.prototype.indexOf === 'function') {\n if (dir) {\n return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset)\n } else {\n return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset)\n }\n }\n return arrayIndexOf(buffer, [ val ], byteOffset, encoding, dir)\n }\n\n throw new TypeError('val must be string, number or Buffer')\n}\n\nfunction arrayIndexOf (arr, val, byteOffset, encoding, dir) {\n var indexSize = 1\n var arrLength = arr.length\n var valLength = val.length\n\n if (encoding !== undefined) {\n encoding = String(encoding).toLowerCase()\n if (encoding === 'ucs2' || encoding === 'ucs-2' ||\n encoding === 'utf16le' || encoding === 'utf-16le') {\n if (arr.length < 2 || val.length < 2) {\n return -1\n }\n indexSize = 2\n arrLength /= 2\n valLength /= 2\n byteOffset /= 2\n }\n }\n\n function read (buf, i) {\n if (indexSize === 1) {\n return buf[i]\n } else {\n return buf.readUInt16BE(i * indexSize)\n }\n }\n\n var i\n if (dir) {\n var foundIndex = -1\n for (i = byteOffset; i < arrLength; i++) {\n if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) {\n if (foundIndex === -1) foundIndex = i\n if (i - foundIndex + 1 === valLength) return foundIndex * indexSize\n } else {\n if (foundIndex !== -1) i -= i - foundIndex\n foundIndex = -1\n }\n }\n } else {\n if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength\n for (i = byteOffset; i >= 0; i--) {\n var found = true\n for (var j = 0; j < valLength; j++) {\n if (read(arr, i + j) !== read(val, j)) {\n found = false\n break\n }\n }\n if (found) return i\n }\n }\n\n return -1\n}\n\nBuffer.prototype.includes = function includes (val, byteOffset, encoding) {\n return this.indexOf(val, byteOffset, encoding) !== -1\n}\n\nBuffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) {\n return bidirectionalIndexOf(this, val, byteOffset, encoding, true)\n}\n\nBuffer.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) {\n return bidirectionalIndexOf(this, val, byteOffset, encoding, false)\n}\n\nfunction hexWrite (buf, string, offset, length) {\n offset = Number(offset) || 0\n var remaining = buf.length - offset\n if (!length) {\n length = remaining\n } else {\n length = Number(length)\n if (length > remaining) {\n length = remaining\n }\n }\n\n var strLen = string.length\n\n if (length > strLen / 2) {\n length = strLen / 2\n }\n for (var i = 0; i < length; ++i) {\n var parsed = parseInt(string.substr(i * 2, 2), 16)\n if (numberIsNaN(parsed)) return i\n buf[offset + i] = parsed\n }\n return i\n}\n\nfunction utf8Write (buf, string, offset, length) {\n return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nfunction asciiWrite (buf, string, offset, length) {\n return blitBuffer(asciiToBytes(string), buf, offset, length)\n}\n\nfunction latin1Write (buf, string, offset, length) {\n return asciiWrite(buf, string, offset, length)\n}\n\nfunction base64Write (buf, string, offset, length) {\n return blitBuffer(base64ToBytes(string), buf, offset, length)\n}\n\nfunction ucs2Write (buf, string, offset, length) {\n return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nBuffer.prototype.write = function write (string, offset, length, encoding) {\n // Buffer#write(string)\n if (offset === undefined) {\n encoding = 'utf8'\n length = this.length\n offset = 0\n // Buffer#write(string, encoding)\n } else if (length === undefined && typeof offset === 'string') {\n encoding = offset\n length = this.length\n offset = 0\n // Buffer#write(string, offset[, length][, encoding])\n } else if (isFinite(offset)) {\n offset = offset >>> 0\n if (isFinite(length)) {\n length = length >>> 0\n if (encoding === undefined) encoding = 'utf8'\n } else {\n encoding = length\n length = undefined\n }\n } else {\n throw new Error(\n 'Buffer.write(string, encoding, offset[, length]) is no longer supported'\n )\n }\n\n var remaining = this.length - offset\n if (length === undefined || length > remaining) length = remaining\n\n if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) {\n throw new RangeError('Attempt to write outside buffer bounds')\n }\n\n if (!encoding) encoding = 'utf8'\n\n var loweredCase = false\n for (;;) {\n switch (encoding) {\n case 'hex':\n return hexWrite(this, string, offset, length)\n\n case 'utf8':\n case 'utf-8':\n return utf8Write(this, string, offset, length)\n\n case 'ascii':\n return asciiWrite(this, string, offset, length)\n\n case 'latin1':\n case 'binary':\n return latin1Write(this, string, offset, length)\n\n case 'base64':\n // Warning: maxLength not taken into account in base64Write\n return base64Write(this, string, offset, length)\n\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return ucs2Write(this, string, offset, length)\n\n default:\n if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n encoding = ('' + encoding).toLowerCase()\n loweredCase = true\n }\n }\n}\n\nBuffer.prototype.toJSON = function toJSON () {\n return {\n type: 'Buffer',\n data: Array.prototype.slice.call(this._arr || this, 0)\n }\n}\n\nfunction base64Slice (buf, start, end) {\n if (start === 0 && end === buf.length) {\n return base64.fromByteArray(buf)\n } else {\n return base64.fromByteArray(buf.slice(start, end))\n }\n}\n\nfunction utf8Slice (buf, start, end) {\n end = Math.min(buf.length, end)\n var res = []\n\n var i = start\n while (i < end) {\n var firstByte = buf[i]\n var codePoint = null\n var bytesPerSequence = (firstByte > 0xEF) ? 4\n : (firstByte > 0xDF) ? 3\n : (firstByte > 0xBF) ? 2\n : 1\n\n if (i + bytesPerSequence <= end) {\n var secondByte, thirdByte, fourthByte, tempCodePoint\n\n switch (bytesPerSequence) {\n case 1:\n if (firstByte < 0x80) {\n codePoint = firstByte\n }\n break\n case 2:\n secondByte = buf[i + 1]\n if ((secondByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F)\n if (tempCodePoint > 0x7F) {\n codePoint = tempCodePoint\n }\n }\n break\n case 3:\n secondByte = buf[i + 1]\n thirdByte = buf[i + 2]\n if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F)\n if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) {\n codePoint = tempCodePoint\n }\n }\n break\n case 4:\n secondByte = buf[i + 1]\n thirdByte = buf[i + 2]\n fourthByte = buf[i + 3]\n if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F)\n if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) {\n codePoint = tempCodePoint\n }\n }\n }\n }\n\n if (codePoint === null) {\n // we did not generate a valid codePoint so insert a\n // replacement char (U+FFFD) and advance only 1 byte\n codePoint = 0xFFFD\n bytesPerSequence = 1\n } else if (codePoint > 0xFFFF) {\n // encode to utf16 (surrogate pair dance)\n codePoint -= 0x10000\n res.push(codePoint >>> 10 & 0x3FF | 0xD800)\n codePoint = 0xDC00 | codePoint & 0x3FF\n }\n\n res.push(codePoint)\n i += bytesPerSequence\n }\n\n return decodeCodePointsArray(res)\n}\n\n// Based on http://stackoverflow.com/a/22747272/680742, the browser with\n// the lowest limit is Chrome, with 0x10000 args.\n// We go 1 magnitude less, for safety\nvar MAX_ARGUMENTS_LENGTH = 0x1000\n\nfunction decodeCodePointsArray (codePoints) {\n var len = codePoints.length\n if (len <= MAX_ARGUMENTS_LENGTH) {\n return String.fromCharCode.apply(String, codePoints) // avoid extra slice()\n }\n\n // Decode in chunks to avoid \"call stack size exceeded\".\n var res = ''\n var i = 0\n while (i < len) {\n res += String.fromCharCode.apply(\n String,\n codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH)\n )\n }\n return res\n}\n\nfunction asciiSlice (buf, start, end) {\n var ret = ''\n end = Math.min(buf.length, end)\n\n for (var i = start; i < end; ++i) {\n ret += String.fromCharCode(buf[i] & 0x7F)\n }\n return ret\n}\n\nfunction latin1Slice (buf, start, end) {\n var ret = ''\n end = Math.min(buf.length, end)\n\n for (var i = start; i < end; ++i) {\n ret += String.fromCharCode(buf[i])\n }\n return ret\n}\n\nfunction hexSlice (buf, start, end) {\n var len = buf.length\n\n if (!start || start < 0) start = 0\n if (!end || end < 0 || end > len) end = len\n\n var out = ''\n for (var i = start; i < end; ++i) {\n out += toHex(buf[i])\n }\n return out\n}\n\nfunction utf16leSlice (buf, start, end) {\n var bytes = buf.slice(start, end)\n var res = ''\n for (var i = 0; i < bytes.length; i += 2) {\n res += String.fromCharCode(bytes[i] + (bytes[i + 1] * 256))\n }\n return res\n}\n\nBuffer.prototype.slice = function slice (start, end) {\n var len = this.length\n start = ~~start\n end = end === undefined ? len : ~~end\n\n if (start < 0) {\n start += len\n if (start < 0) start = 0\n } else if (start > len) {\n start = len\n }\n\n if (end < 0) {\n end += len\n if (end < 0) end = 0\n } else if (end > len) {\n end = len\n }\n\n if (end < start) end = start\n\n var newBuf = this.subarray(start, end)\n // Return an augmented `Uint8Array` instance\n newBuf.__proto__ = Buffer.prototype\n return newBuf\n}\n\n/*\n * Need to make sure that buffer isn't trying to write out of bounds.\n */\nfunction checkOffset (offset, ext, length) {\n if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint')\n if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length')\n}\n\nBuffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) {\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n var val = this[offset]\n var mul = 1\n var i = 0\n while (++i < byteLength && (mul *= 0x100)) {\n val += this[offset + i] * mul\n }\n\n return val\n}\n\nBuffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) {\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) {\n checkOffset(offset, byteLength, this.length)\n }\n\n var val = this[offset + --byteLength]\n var mul = 1\n while (byteLength > 0 && (mul *= 0x100)) {\n val += this[offset + --byteLength] * mul\n }\n\n return val\n}\n\nBuffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 1, this.length)\n return this[offset]\n}\n\nBuffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 2, this.length)\n return this[offset] | (this[offset + 1] << 8)\n}\n\nBuffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 2, this.length)\n return (this[offset] << 8) | this[offset + 1]\n}\n\nBuffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return ((this[offset]) |\n (this[offset + 1] << 8) |\n (this[offset + 2] << 16)) +\n (this[offset + 3] * 0x1000000)\n}\n\nBuffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return (this[offset] * 0x1000000) +\n ((this[offset + 1] << 16) |\n (this[offset + 2] << 8) |\n this[offset + 3])\n}\n\nBuffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) {\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n var val = this[offset]\n var mul = 1\n var i = 0\n while (++i < byteLength && (mul *= 0x100)) {\n val += this[offset + i] * mul\n }\n mul *= 0x80\n\n if (val >= mul) val -= Math.pow(2, 8 * byteLength)\n\n return val\n}\n\nBuffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) {\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n var i = byteLength\n var mul = 1\n var val = this[offset + --i]\n while (i > 0 && (mul *= 0x100)) {\n val += this[offset + --i] * mul\n }\n mul *= 0x80\n\n if (val >= mul) val -= Math.pow(2, 8 * byteLength)\n\n return val\n}\n\nBuffer.prototype.readInt8 = function readInt8 (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 1, this.length)\n if (!(this[offset] & 0x80)) return (this[offset])\n return ((0xff - this[offset] + 1) * -1)\n}\n\nBuffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 2, this.length)\n var val = this[offset] | (this[offset + 1] << 8)\n return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 2, this.length)\n var val = this[offset + 1] | (this[offset] << 8)\n return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return (this[offset]) |\n (this[offset + 1] << 8) |\n (this[offset + 2] << 16) |\n (this[offset + 3] << 24)\n}\n\nBuffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return (this[offset] << 24) |\n (this[offset + 1] << 16) |\n (this[offset + 2] << 8) |\n (this[offset + 3])\n}\n\nBuffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n return ieee754.read(this, offset, true, 23, 4)\n}\n\nBuffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n return ieee754.read(this, offset, false, 23, 4)\n}\n\nBuffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 8, this.length)\n return ieee754.read(this, offset, true, 52, 8)\n}\n\nBuffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 8, this.length)\n return ieee754.read(this, offset, false, 52, 8)\n}\n\nfunction checkInt (buf, value, offset, ext, max, min) {\n if (!Buffer.isBuffer(buf)) throw new TypeError('\"buffer\" argument must be a Buffer instance')\n if (value > max || value < min) throw new RangeError('\"value\" argument is out of bounds')\n if (offset + ext > buf.length) throw new RangeError('Index out of range')\n}\n\nBuffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) {\n var maxBytes = Math.pow(2, 8 * byteLength) - 1\n checkInt(this, value, offset, byteLength, maxBytes, 0)\n }\n\n var mul = 1\n var i = 0\n this[offset] = value & 0xFF\n while (++i < byteLength && (mul *= 0x100)) {\n this[offset + i] = (value / mul) & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) {\n var maxBytes = Math.pow(2, 8 * byteLength) - 1\n checkInt(this, value, offset, byteLength, maxBytes, 0)\n }\n\n var i = byteLength - 1\n var mul = 1\n this[offset + i] = value & 0xFF\n while (--i >= 0 && (mul *= 0x100)) {\n this[offset + i] = (value / mul) & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0)\n this[offset] = (value & 0xff)\n return offset + 1\n}\n\nBuffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\n this[offset] = (value & 0xff)\n this[offset + 1] = (value >>> 8)\n return offset + 2\n}\n\nBuffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\n this[offset] = (value >>> 8)\n this[offset + 1] = (value & 0xff)\n return offset + 2\n}\n\nBuffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\n this[offset + 3] = (value >>> 24)\n this[offset + 2] = (value >>> 16)\n this[offset + 1] = (value >>> 8)\n this[offset] = (value & 0xff)\n return offset + 4\n}\n\nBuffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\n this[offset] = (value >>> 24)\n this[offset + 1] = (value >>> 16)\n this[offset + 2] = (value >>> 8)\n this[offset + 3] = (value & 0xff)\n return offset + 4\n}\n\nBuffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) {\n var limit = Math.pow(2, (8 * byteLength) - 1)\n\n checkInt(this, value, offset, byteLength, limit - 1, -limit)\n }\n\n var i = 0\n var mul = 1\n var sub = 0\n this[offset] = value & 0xFF\n while (++i < byteLength && (mul *= 0x100)) {\n if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) {\n sub = 1\n }\n this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) {\n var limit = Math.pow(2, (8 * byteLength) - 1)\n\n checkInt(this, value, offset, byteLength, limit - 1, -limit)\n }\n\n var i = byteLength - 1\n var mul = 1\n var sub = 0\n this[offset + i] = value & 0xFF\n while (--i >= 0 && (mul *= 0x100)) {\n if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) {\n sub = 1\n }\n this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80)\n if (value < 0) value = 0xff + value + 1\n this[offset] = (value & 0xff)\n return offset + 1\n}\n\nBuffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\n this[offset] = (value & 0xff)\n this[offset + 1] = (value >>> 8)\n return offset + 2\n}\n\nBuffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\n this[offset] = (value >>> 8)\n this[offset + 1] = (value & 0xff)\n return offset + 2\n}\n\nBuffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\n this[offset] = (value & 0xff)\n this[offset + 1] = (value >>> 8)\n this[offset + 2] = (value >>> 16)\n this[offset + 3] = (value >>> 24)\n return offset + 4\n}\n\nBuffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\n if (value < 0) value = 0xffffffff + value + 1\n this[offset] = (value >>> 24)\n this[offset + 1] = (value >>> 16)\n this[offset + 2] = (value >>> 8)\n this[offset + 3] = (value & 0xff)\n return offset + 4\n}\n\nfunction checkIEEE754 (buf, value, offset, ext, max, min) {\n if (offset + ext > buf.length) throw new RangeError('Index out of range')\n if (offset < 0) throw new RangeError('Index out of range')\n}\n\nfunction writeFloat (buf, value, offset, littleEndian, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) {\n checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38)\n }\n ieee754.write(buf, value, offset, littleEndian, 23, 4)\n return offset + 4\n}\n\nBuffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) {\n return writeFloat(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) {\n return writeFloat(this, value, offset, false, noAssert)\n}\n\nfunction writeDouble (buf, value, offset, littleEndian, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) {\n checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308)\n }\n ieee754.write(buf, value, offset, littleEndian, 52, 8)\n return offset + 8\n}\n\nBuffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) {\n return writeDouble(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) {\n return writeDouble(this, value, offset, false, noAssert)\n}\n\n// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)\nBuffer.prototype.copy = function copy (target, targetStart, start, end) {\n if (!Buffer.isBuffer(target)) throw new TypeError('argument should be a Buffer')\n if (!start) start = 0\n if (!end && end !== 0) end = this.length\n if (targetStart >= target.length) targetStart = target.length\n if (!targetStart) targetStart = 0\n if (end > 0 && end < start) end = start\n\n // Copy 0 bytes; we're done\n if (end === start) return 0\n if (target.length === 0 || this.length === 0) return 0\n\n // Fatal error conditions\n if (targetStart < 0) {\n throw new RangeError('targetStart out of bounds')\n }\n if (start < 0 || start >= this.length) throw new RangeError('Index out of range')\n if (end < 0) throw new RangeError('sourceEnd out of bounds')\n\n // Are we oob?\n if (end > this.length) end = this.length\n if (target.length - targetStart < end - start) {\n end = target.length - targetStart + start\n }\n\n var len = end - start\n\n if (this === target && typeof Uint8Array.prototype.copyWithin === 'function') {\n // Use built-in when available, missing from IE11\n this.copyWithin(targetStart, start, end)\n } else if (this === target && start < targetStart && targetStart < end) {\n // descending copy from end\n for (var i = len - 1; i >= 0; --i) {\n target[i + targetStart] = this[i + start]\n }\n } else {\n Uint8Array.prototype.set.call(\n target,\n this.subarray(start, end),\n targetStart\n )\n }\n\n return len\n}\n\n// Usage:\n// buffer.fill(number[, offset[, end]])\n// buffer.fill(buffer[, offset[, end]])\n// buffer.fill(string[, offset[, end]][, encoding])\nBuffer.prototype.fill = function fill (val, start, end, encoding) {\n // Handle string cases:\n if (typeof val === 'string') {\n if (typeof start === 'string') {\n encoding = start\n start = 0\n end = this.length\n } else if (typeof end === 'string') {\n encoding = end\n end = this.length\n }\n if (encoding !== undefined && typeof encoding !== 'string') {\n throw new TypeError('encoding must be a string')\n }\n if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) {\n throw new TypeError('Unknown encoding: ' + encoding)\n }\n if (val.length === 1) {\n var code = val.charCodeAt(0)\n if ((encoding === 'utf8' && code < 128) ||\n encoding === 'latin1') {\n // Fast path: If `val` fits into a single byte, use that numeric value.\n val = code\n }\n }\n } else if (typeof val === 'number') {\n val = val & 255\n }\n\n // Invalid ranges are not set to a default, so can range check early.\n if (start < 0 || this.length < start || this.length < end) {\n throw new RangeError('Out of range index')\n }\n\n if (end <= start) {\n return this\n }\n\n start = start >>> 0\n end = end === undefined ? this.length : end >>> 0\n\n if (!val) val = 0\n\n var i\n if (typeof val === 'number') {\n for (i = start; i < end; ++i) {\n this[i] = val\n }\n } else {\n var bytes = Buffer.isBuffer(val)\n ? val\n : Buffer.from(val, encoding)\n var len = bytes.length\n if (len === 0) {\n throw new TypeError('The value \"' + val +\n '\" is invalid for argument \"value\"')\n }\n for (i = 0; i < end - start; ++i) {\n this[i + start] = bytes[i % len]\n }\n }\n\n return this\n}\n\n// HELPER FUNCTIONS\n// ================\n\nvar INVALID_BASE64_RE = /[^+/0-9A-Za-z-_]/g\n\nfunction base64clean (str) {\n // Node takes equal signs as end of the Base64 encoding\n str = str.split('=')[0]\n // Node strips out invalid characters like \\n and \\t from the string, base64-js does not\n str = str.trim().replace(INVALID_BASE64_RE, '')\n // Node converts strings with length < 2 to ''\n if (str.length < 2) return ''\n // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not\n while (str.length % 4 !== 0) {\n str = str + '='\n }\n return str\n}\n\nfunction toHex (n) {\n if (n < 16) return '0' + n.toString(16)\n return n.toString(16)\n}\n\nfunction utf8ToBytes (string, units) {\n units = units || Infinity\n var codePoint\n var length = string.length\n var leadSurrogate = null\n var bytes = []\n\n for (var i = 0; i < length; ++i) {\n codePoint = string.charCodeAt(i)\n\n // is surrogate component\n if (codePoint > 0xD7FF && codePoint < 0xE000) {\n // last char was a lead\n if (!leadSurrogate) {\n // no lead yet\n if (codePoint > 0xDBFF) {\n // unexpected trail\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n continue\n } else if (i + 1 === length) {\n // unpaired lead\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n continue\n }\n\n // valid lead\n leadSurrogate = codePoint\n\n continue\n }\n\n // 2 leads in a row\n if (codePoint < 0xDC00) {\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n leadSurrogate = codePoint\n continue\n }\n\n // valid surrogate pair\n codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000\n } else if (leadSurrogate) {\n // valid bmp char, but last char was a lead\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n }\n\n leadSurrogate = null\n\n // encode utf8\n if (codePoint < 0x80) {\n if ((units -= 1) < 0) break\n bytes.push(codePoint)\n } else if (codePoint < 0x800) {\n if ((units -= 2) < 0) break\n bytes.push(\n codePoint >> 0x6 | 0xC0,\n codePoint & 0x3F | 0x80\n )\n } else if (codePoint < 0x10000) {\n if ((units -= 3) < 0) break\n bytes.push(\n codePoint >> 0xC | 0xE0,\n codePoint >> 0x6 & 0x3F | 0x80,\n codePoint & 0x3F | 0x80\n )\n } else if (codePoint < 0x110000) {\n if ((units -= 4) < 0) break\n bytes.push(\n codePoint >> 0x12 | 0xF0,\n codePoint >> 0xC & 0x3F | 0x80,\n codePoint >> 0x6 & 0x3F | 0x80,\n codePoint & 0x3F | 0x80\n )\n } else {\n throw new Error('Invalid code point')\n }\n }\n\n return bytes\n}\n\nfunction asciiToBytes (str) {\n var byteArray = []\n for (var i = 0; i < str.length; ++i) {\n // Node's code seems to be doing this and not & 0x7F..\n byteArray.push(str.charCodeAt(i) & 0xFF)\n }\n return byteArray\n}\n\nfunction utf16leToBytes (str, units) {\n var c, hi, lo\n var byteArray = []\n for (var i = 0; i < str.length; ++i) {\n if ((units -= 2) < 0) break\n\n c = str.charCodeAt(i)\n hi = c >> 8\n lo = c % 256\n byteArray.push(lo)\n byteArray.push(hi)\n }\n\n return byteArray\n}\n\nfunction base64ToBytes (str) {\n return base64.toByteArray(base64clean(str))\n}\n\nfunction blitBuffer (src, dst, offset, length) {\n for (var i = 0; i < length; ++i) {\n if ((i + offset >= dst.length) || (i >= src.length)) break\n dst[i + offset] = src[i]\n }\n return i\n}\n\n// ArrayBuffer or Uint8Array objects from other contexts (i.e. iframes) do not pass\n// the `instanceof` check but they should be treated as of that type.\n// See: https://github.com/feross/buffer/issues/166\nfunction isInstance (obj, type) {\n return obj instanceof type ||\n (obj != null && obj.constructor != null && obj.constructor.name != null &&\n obj.constructor.name === type.name)\n}\nfunction numberIsNaN (obj) {\n // For IE11 support\n return obj !== obj // eslint-disable-line no-self-compare\n}\n","exports.read = function (buffer, offset, isLE, mLen, nBytes) {\n var e, m\n var eLen = (nBytes * 8) - mLen - 1\n var eMax = (1 << eLen) - 1\n var eBias = eMax >> 1\n var nBits = -7\n var i = isLE ? (nBytes - 1) : 0\n var d = isLE ? -1 : 1\n var s = buffer[offset + i]\n\n i += d\n\n e = s & ((1 << (-nBits)) - 1)\n s >>= (-nBits)\n nBits += eLen\n for (; nBits > 0; e = (e * 256) + buffer[offset + i], i += d, nBits -= 8) {}\n\n m = e & ((1 << (-nBits)) - 1)\n e >>= (-nBits)\n nBits += mLen\n for (; nBits > 0; m = (m * 256) + buffer[offset + i], i += d, nBits -= 8) {}\n\n if (e === 0) {\n e = 1 - eBias\n } else if (e === eMax) {\n return m ? NaN : ((s ? -1 : 1) * Infinity)\n } else {\n m = m + Math.pow(2, mLen)\n e = e - eBias\n }\n return (s ? -1 : 1) * m * Math.pow(2, e - mLen)\n}\n\nexports.write = function (buffer, value, offset, isLE, mLen, nBytes) {\n var e, m, c\n var eLen = (nBytes * 8) - mLen - 1\n var eMax = (1 << eLen) - 1\n var eBias = eMax >> 1\n var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0)\n var i = isLE ? 0 : (nBytes - 1)\n var d = isLE ? 1 : -1\n var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0\n\n value = Math.abs(value)\n\n if (isNaN(value) || value === Infinity) {\n m = isNaN(value) ? 1 : 0\n e = eMax\n } else {\n e = Math.floor(Math.log(value) / Math.LN2)\n if (value * (c = Math.pow(2, -e)) < 1) {\n e--\n c *= 2\n }\n if (e + eBias >= 1) {\n value += rt / c\n } else {\n value += rt * Math.pow(2, 1 - eBias)\n }\n if (value * c >= 2) {\n e++\n c /= 2\n }\n\n if (e + eBias >= eMax) {\n m = 0\n e = eMax\n } else if (e + eBias >= 1) {\n m = ((value * c) - 1) * Math.pow(2, mLen)\n e = e + eBias\n } else {\n m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen)\n e = 0\n }\n }\n\n for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}\n\n e = (e << mLen) | m\n eLen += mLen\n for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}\n\n buffer[offset + i - d] |= s * 128\n}\n","// shim for using process in browser\nvar process = module.exports = {};\n\n// cached from whatever global is present so that test runners that stub it\n// don't break things. But we need to wrap it in a try catch in case it is\n// wrapped in strict mode code which doesn't define any globals. It's inside a\n// function because try/catches deoptimize in certain engines.\n\nvar cachedSetTimeout;\nvar cachedClearTimeout;\n\nfunction defaultSetTimout() {\n throw new Error('setTimeout has not been defined');\n}\nfunction defaultClearTimeout () {\n throw new Error('clearTimeout has not been defined');\n}\n(function () {\n try {\n if (typeof setTimeout === 'function') {\n cachedSetTimeout = setTimeout;\n } else {\n cachedSetTimeout = defaultSetTimout;\n }\n } catch (e) {\n cachedSetTimeout = defaultSetTimout;\n }\n try {\n if (typeof clearTimeout === 'function') {\n cachedClearTimeout = clearTimeout;\n } else {\n cachedClearTimeout = defaultClearTimeout;\n }\n } catch (e) {\n cachedClearTimeout = defaultClearTimeout;\n }\n} ())\nfunction runTimeout(fun) {\n if (cachedSetTimeout === setTimeout) {\n //normal enviroments in sane situations\n return setTimeout(fun, 0);\n }\n // if setTimeout wasn't available but was latter defined\n if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n cachedSetTimeout = setTimeout;\n return setTimeout(fun, 0);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedSetTimeout(fun, 0);\n } catch(e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedSetTimeout.call(null, fun, 0);\n } catch(e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n return cachedSetTimeout.call(this, fun, 0);\n }\n }\n\n\n}\nfunction runClearTimeout(marker) {\n if (cachedClearTimeout === clearTimeout) {\n //normal enviroments in sane situations\n return clearTimeout(marker);\n }\n // if clearTimeout wasn't available but was latter defined\n if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n cachedClearTimeout = clearTimeout;\n return clearTimeout(marker);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedClearTimeout(marker);\n } catch (e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedClearTimeout.call(null, marker);\n } catch (e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n return cachedClearTimeout.call(this, marker);\n }\n }\n\n\n\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n if (!draining || !currentQueue) {\n return;\n }\n draining = false;\n if (currentQueue.length) {\n queue = currentQueue.concat(queue);\n } else {\n queueIndex = -1;\n }\n if (queue.length) {\n drainQueue();\n }\n}\n\nfunction drainQueue() {\n if (draining) {\n return;\n }\n var timeout = runTimeout(cleanUpNextTick);\n draining = true;\n\n var len = queue.length;\n while(len) {\n currentQueue = queue;\n queue = [];\n while (++queueIndex < len) {\n if (currentQueue) {\n currentQueue[queueIndex].run();\n }\n }\n queueIndex = -1;\n len = queue.length;\n }\n currentQueue = null;\n draining = false;\n runClearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n var args = new Array(arguments.length - 1);\n if (arguments.length > 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"]} \ No newline at end of file diff --git a/build/jsforce-api-soap.min.js b/build/jsforce-api-soap.min.js index c4272ad1..7ddb5199 100644 --- a/build/jsforce-api-soap.min.js +++ b/build/jsforce-api-soap.min.js @@ -1,2 +1,2 @@ -!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var r;r="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,r=r.jsforce||(r.jsforce={}),r=r.modules||(r.modules={}),r=r.api||(r.api={}),r.Soap=e()}}(function(){return function(){function e(r,t,n){function s(i,u){if(!t[i]){if(!r[i]){var a="function"==typeof require&&require;if(!u&&a)return a(i,!0);if(o)return o(i,!0);var c=new Error("Cannot find module '"+i+"'");throw c.code="MODULE_NOT_FOUND",c}var l=t[i]={exports:{}};r[i][0].call(l.exports,function(e){var t=r[i][1][e];return s(t||e)},l,l.exports,e,r,t,n)}return t[i].exports}for(var o="function"==typeof require&&require,i=0;i\n */\n\n'use strict';\n\nvar _ = window.jsforce.require('lodash/core');\nvar jsforce = window.jsforce.require('./core');\nvar SOAP = window.jsforce.require('./soap');\n\n/**\n * API class for Partner SOAP call\n *\n * @class\n * @param {Connection} conn - Connection\n */\nvar SoapApi = module.exports = function(conn) {\n this._conn = conn;\n};\n\n/**\n * Call SOAP Api (Partner) endpoint\n * @private\n */\nSoapApi.prototype._invoke = function(method, message, schema, callback) {\n var soapEndpoint = new SOAP(this._conn, {\n xmlns: \"urn:partner.soap.sforce.com\",\n endpointUrl: this._conn.instanceUrl + \"/services/Soap/u/\" + this._conn.version\n });\n return soapEndpoint.invoke(method, message, { result: schema }).then(function(res) {\n return res.result;\n }).thenCall(callback);\n};\n\n\n/* */\nvar Schemas = {};\n\n/**\n * @typedef SoapApi~LeadConvert\n * @prop {String} convertedStatus - Status of converted lead\n * @prop {String} leadId - Lead record Id to convert\n * @prop {String} [accountId] - Account record Id to assign the converted record\n * @prop {String} [contactId] - Contact record Id to assign the converted record\n * @prop {Boolean} [doNotCreateOpportunity] - True if you don't want to create a new opportunity\n * @prop {String} [opportunityName] - Name of opportunity to create\n * @prop {Boolean} [overwriteLeadSource] - True if overwriting lead source\n * @prop {String} [ownerId] - Owner Id\n * @prop {Boolean} [sendNotificationEmail] - True if send notification email\n */\n/**\n * @typedef SoapApi~LeadConvertResult\n * @prop {String} leadId - Lead record Id to convert\n * @prop {String} [accountId] - Account record Id of converted lead\n * @prop {String} [contactId] - Contact record Id of converted lead\n * @prop {String} [opportunityId] - Opportunity record Id created in conversion\n * @prop {Boolean} success - True if successfully converted\n * @prop {Array.} errors - Error\n */\n/**\n * Converts a Lead into an Account, Contact, or (optionally) an Opportunity.\n *\n * @param {SoapApi~LeadConvert|Array.} leadConverts\n * @param {Callback.>} [callback] - Callback function\n * @returns {Promise.>}\n */\nSoapApi.prototype.convertLead = function(leadConverts, callback) {\n var schema = _.isArray(leadConverts) ? [ Schemas.LeadConvertResult ] : Schemas.LeadConvertResult;\n return this._invoke(\"convertLead\", { leadConverts: leadConverts }, schema, callback);\n};\nSchemas.LeadConvertResult = {\n success: 'boolean',\n errors: [],\n leadId: 'string',\n accountId: 'string',\n contactId: 'string',\n opportunityId: 'string'\n};\n\n/**\n * @typedef SoapApi~MergeRequest\n * @prop {Object} masterRecord - The merge destination record\n * @prop {Array.} recordToMergeIds - Ids of records to merge\n */\n/**\n * @typedef SoapApi~MergeResult\n * @prop {Boolean} success - True if successfully merged\n * @prop {Array.} errors - Error\n * @prop {String} id - ID of the master record\n * @prop {Array.} mergedRecordIds - ID of the records that were merged into the master record\n * @prop {Array.} updatedRelatedIds - ID of all related records that were moved (re-parented) as a result of the merge\n */\n\n/**\n * Merge up to three records into one\n *\n * @param {SoapApi~MergeRequest|Array.} mergeRequests\n * @param {Callback.>} [callback] - Callback function\n * @returns {Promise.>}\n */\nSoapApi.prototype.merge = function(mergeRequests, callback) {\n var schema = _.isArray(mergeRequests) ? [ Schemas.MergeResult ] : Schemas.MergeResult;\n return this._invoke(\"merge\", { mergeRequests: mergeRequests }, schema, callback);\n};\nSchemas.MergeResult = {\n success: 'boolean',\n errors: [],\n id: 'string',\n mergedRecordIds: ['string'],\n updatedRelatedIds: ['string']\n};\n\n\n/**\n * @typedef SoapApi~EmptyRecycleBinResult\n * @prop {String} id - ID of an sObject that you attempted to delete from the Recycle Bin\n * @prop {Boolean} success - Whether the call succeeded (true) or not (false) for this record\n * @prop {Array.} errors - Errors\n */\n/**\n * Delete records from the recycle bin immediately\n *\n * @param {Array.} ids - Record ids to empty from recycle bin\n * @param {Callback.>} [callback] - Callback function\n * @returns {Promise.>}\n */\nSoapApi.prototype.emptyRecycleBin = function(ids, callback) {\n return this._invoke(\"emptyRecycleBin\", { ids: ids }, [ Schemas.EmptyRecycleBinResult ], callback);\n};\nSchemas.EmptyRecycleBinResult = {\n id: 'string',\n success: 'boolean',\n errors: []\n};\n\n\n/**\n * @typedef SoapApi~DescribeTabSetResult\n * @prop {String} label - The display label for this standard or custom app\n * @prop {String} logoUrl - A fully qualified URL to the logo image associated with the standard or custom app\n * @prop {String} namespace - Namespace of application package\n * @prop {Boolean} selected - If true, then this standard or custom app is the user’s currently selected app\n * @prop {Array.} tabs - An array of tabs that are displayed for the specified standard app or custom app\n */\n/**\n * @typedef SoapApi~DescribeTab\n * @prop {Array.} colors - Array of color information used for a tab\n * @prop {Boolean} custom - true if this is a custom tab\n * @prop {String} iconUrl - The URL for the main 32 x 32 pixel icon for a tab\n * @prop {Array.} icons - Array of icon information used for a tab\n * @prop {String} label - The display label for this tab\n * @prop {String} miniIconUrl - The URL for the 16 x 16 pixel icon that represents a tab\n * @prop {String} name - The API name of the tab\n * @prop {String} sobjectName - The name of the sObject that is primarily displayed on this tab\n * @prop {String} url - A fully qualified URL for viewing this tab\n */\n/**\n * Returns information about the standard and custom apps available to the logged-in user\n *\n * @param {Callback.>} [callback] - Callback function\n * @returns {Promise.>}\n */\nSoapApi.prototype.describeTabs = function(callback) {\n return this._invoke(\"describeTabs\", {}, [ Schemas.DescribeTabSetResult ], callback);\n};\nSchemas.DescribeTabSetResult = {\n label: 'string',\n logoUrl: 'string',\n namespace: 'string',\n selected: 'boolean',\n tabs: [{\n colors: [{\n theme: 'string',\n color: 'string',\n context: 'string'\n }],\n iconUrl: 'string',\n icons: [{\n theme: 'string',\n height: 'number',\n width: 'number',\n url: 'string',\n contentType: 'string'\n }],\n label: 'string',\n custom: 'boolean',\n miniIconUrl: 'string',\n name: 'string',\n sobjectName: 'string',\n url: 'string'\n }]\n};\n\n/**\n * Retrieves the current system timestamp (Coordinated Universal Time (UTC) time zone) from the API\n *\n * @typedef SoapApi~ServerTimestampResult\n * @prop {String} timestamp - Timestamp\n */\n/**\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\nSoapApi.prototype.getServerTimestamp = function(callback) {\n return this._invoke(\"getServerTimestamp\", {}, Schemas.GetServerTimestampResult, callback);\n};\nSchemas.GetServerTimestampResult = {\n timestamp: 'string'\n};\n\n/**\n * @typedef SoapApi~UserInfoResult\n * @prop {Boolean} accessibilityMode\n * @prop {String} currencySymbol\n * @prop {Number} orgAttachmentFileSizeLimit\n * @prop {String} orgDefaultCurrencyIsoCode\n * @prop {String} orgDisallowHtmlAttachments\n * @prop {Boolean} orgHasPersonAccounts\n * @prop {String} organizationId\n * @prop {Boolean} organizationMultiCurrency\n * @prop {String} organizationName\n * @prop {String} profileId\n * @prop {String} roleId\n * @prop {Number} sessionSecondsValid\n * @prop {String} userDefaultCurrencyIsoCode\n * @prop {String} userEmail\n * @prop {String} userFullName\n * @prop {String} userId\n * @prop {String} userLanguage\n * @prop {String} userLocale\n * @prop {String} userName\n * @prop {String} userTimeZone\n * @prop {String} userType\n * @prop {String} userUiSkin\n */\n/**\n * Retrieves personal information for the user associated with the current session\n *\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\nSoapApi.prototype.getUserInfo = function(callback) {\n return this._invoke(\"getUserInfo\", {}, Schemas.GetUserInfoResult, callback);\n};\nSchemas.GetUserInfoResult = {\n accessibilityMode: 'boolean',\n currencySymbol: 'string',\n orgAttachmentFileSizeLimit: 'number',\n orgDefaultCurrencyIsoCode: 'string',\n orgDisallowHtmlAttachments: 'boolean',\n orgHasPersonAccounts: 'boolean',\n organizationId: 'string',\n organizationMultiCurrency: 'boolean',\n organizationName: 'string',\n profileId: 'string',\n roleId: 'string',\n sessionSecondsValid: 'number',\n userDefaultCurrencyIsoCode: 'string',\n userEmail: 'string',\n userFullName: 'string',\n userId: 'string',\n userLanguage: 'string',\n userLocale: 'string',\n userName: 'string',\n userTimeZone: 'string',\n userType: 'string',\n userUiSkin: 'string'\n};\n\n/**\n * Sets the specified user’s password to the specified value\n *\n * @param {String} userId - User Id to set password\n * @param {String} password - New password\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\nSoapApi.prototype.setPassword = function(userId, password, callback) {\n return this._invoke(\"setPassword\", { userId: userId, password: password }, callback);\n};\n\n/**\n * @typedef SoapApi~ResetPasswordResult\n * @prop {String} password\n */\n/**\n * Resets the specified user’s password\n *\n * @param {String} userId - User Id to set password\n * @param {String} password - New password\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\nSoapApi.prototype.resetPassword = function(userId, callback) {\n return this._invoke(\"resetPassword\", { userId: userId }, callback);\n};\n\n/**\n * Adds one or more new records to your organization’s data\n *\n * @param {Array.} sObjects - Records to insert\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\nSoapApi.prototype.create = function(sObjects, callback) {\n var schema = _.isArray(sObjects) ? [ Schemas.SaveResult ] : Schemas.SaveResult;\n var args = {\n '@xmlns' : 'urn:partner.soap.sforce.com',\n '@xmlns:ns1' : 'sobject.partner.soap.sforce.com',\n 'ns1:sObjects' : sObjects\n };\n return this._invoke(\"create\", args, schema, callback);\n};\n\n/**\n * Updates one or more existing records in your organization’s data.\n *\n * @param {Array.} sObjects - Records to update\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\nSoapApi.prototype.update = function(sObjects, callback) {\n var schema = _.isArray(sObjects) ? [ Schemas.SaveResult ] : Schemas.SaveResult;\n var args = {\n '@xmlns' : 'urn:partner.soap.sforce.com',\n '@xmlns:ns1' : 'sobject.partner.soap.sforce.com',\n 'ns1:sObjects' : sObjects\n };\n return this._invoke(\"update\", args, schema, callback);\n};\n\nSchemas.SaveResult = {\n success: 'boolean',\n errors: [],\n id: 'string'\n};\n\n/**\n * Creates new records and updates existing records in your organization’s data.\n *\n * @param {Array.} sObjects - Records to upsert\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\nSoapApi.prototype.upsert = function(externalIdFieldName, sObjects, callback) {\n var schema = _.isArray(sObjects) ? [ Schemas.UpsertResult ] : Schemas.UpsertResult;\n var args = {\n '@xmlns' : 'urn:partner.soap.sforce.com',\n '@xmlns:ns1' : 'sobject.partner.soap.sforce.com',\n 'ns1:externalIDFieldName' : externalIdFieldName,\n 'ns1:sObjects' : sObjects\n };\n return this._invoke(\"upsert\", args, schema, callback);\n};\n\nSchemas.UpsertResult = {\n created: 'boolean',\n success: 'boolean',\n errors: [],\n id: 'string'\n};\n\n/**\n * Deletes one or more records from your organization’s data\n *\n * @param {Array.} ids - Id of records to delete\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\nSoapApi.prototype.delete = function(ids, callback) {\n var schema = _.isArray(ids) ? [ Schemas.DeleteResult ] : Schemas.DeleteResult;\n var args = {\n '@xmlns' : 'urn:partner.soap.sforce.com',\n '@xmlns:ns1' : 'sobject.partner.soap.sforce.com',\n 'ns1:ids' : ids\n };\n return this._invoke(\"delete\", args, schema, callback);\n};\n\nSchemas.DeleteResult = {\n success: 'boolean',\n errors: [],\n id: 'string'\n};\n\n\n/*--------------------------------------------*/\n/*\n * Register hook in connection instantiation for dynamically adding this API module features\n */\njsforce.on('connection:new', function(conn) {\n conn.soap = new SoapApi(conn);\n});\n\n\nmodule.exports = SoapApi;\n","(function(f){if(typeof exports===\"object\"&&typeof module!==\"undefined\"){module.exports=f()}else if(typeof define===\"function\"&&define.amd){define([],f)}else{var g;if(typeof window!==\"undefined\"){g=window}else if(typeof global!==\"undefined\"){g=global}else if(typeof self!==\"undefined\"){g=self}else{g=this}g=(g.jsforce||(g.jsforce = {}));g=(g.modules||(g.modules = {}));g=(g.api||(g.api = {}));g.Soap = f()}})(function(){var define,module,exports;return (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\n */\n\n'use strict';\n\nvar _ = window.jsforce.require('lodash/core');\nvar jsforce = window.jsforce.require('./core');\nvar SOAP = window.jsforce.require('./soap');\n\n/**\n * API class for Partner SOAP call\n *\n * @class\n * @param {Connection} conn - Connection\n */\nvar SoapApi = module.exports = function(conn) {\n this._conn = conn;\n};\n\n/**\n * Call SOAP Api (Partner) endpoint\n * @private\n */\nSoapApi.prototype._invoke = function(method, message, schema, callback) {\n var soapEndpoint = new SOAP(this._conn, {\n xmlns: \"urn:partner.soap.sforce.com\",\n endpointUrl: this._conn.instanceUrl + \"/services/Soap/u/\" + this._conn.version\n });\n return soapEndpoint.invoke(method, message, { result: schema }).then(function(res) {\n return res.result;\n }).thenCall(callback);\n};\n\n\n/* */\nvar Schemas = {};\n\n/**\n * @typedef SoapApi~LeadConvert\n * @prop {String} convertedStatus - Status of converted lead\n * @prop {String} leadId - Lead record Id to convert\n * @prop {String} [accountId] - Account record Id to assign the converted record\n * @prop {String} [contactId] - Contact record Id to assign the converted record\n * @prop {Boolean} [doNotCreateOpportunity] - True if you don't want to create a new opportunity\n * @prop {String} [opportunityName] - Name of opportunity to create\n * @prop {Boolean} [overwriteLeadSource] - True if overwriting lead source\n * @prop {String} [ownerId] - Owner Id\n * @prop {Boolean} [sendNotificationEmail] - True if send notification email\n */\n/**\n * @typedef SoapApi~LeadConvertResult\n * @prop {String} leadId - Lead record Id to convert\n * @prop {String} [accountId] - Account record Id of converted lead\n * @prop {String} [contactId] - Contact record Id of converted lead\n * @prop {String} [opportunityId] - Opportunity record Id created in conversion\n * @prop {Boolean} success - True if successfully converted\n * @prop {Array.} errors - Error\n */\n/**\n * Converts a Lead into an Account, Contact, or (optionally) an Opportunity.\n *\n * @param {SoapApi~LeadConvert|Array.} leadConverts\n * @param {Callback.>} [callback] - Callback function\n * @returns {Promise.>}\n */\nSoapApi.prototype.convertLead = function(leadConverts, callback) {\n var schema = _.isArray(leadConverts) ? [ Schemas.LeadConvertResult ] : Schemas.LeadConvertResult;\n return this._invoke(\"convertLead\", { leadConverts: leadConverts }, schema, callback);\n};\nSchemas.LeadConvertResult = {\n success: 'boolean',\n errors: [],\n leadId: 'string',\n accountId: 'string',\n contactId: 'string',\n opportunityId: 'string'\n};\n\n/**\n * @typedef SoapApi~MergeRequest\n * @prop {Object} masterRecord - The merge destination record\n * @prop {Array.} recordToMergeIds - Ids of records to merge\n */\n/**\n * @typedef SoapApi~MergeResult\n * @prop {Boolean} success - True if successfully merged\n * @prop {Array.} errors - Error\n * @prop {String} id - ID of the master record\n * @prop {Array.} mergedRecordIds - ID of the records that were merged into the master record\n * @prop {Array.} updatedRelatedIds - ID of all related records that were moved (re-parented) as a result of the merge\n */\n\n/**\n * Merge up to three records into one\n *\n * @param {SoapApi~MergeRequest|Array.} mergeRequests\n * @param {Callback.>} [callback] - Callback function\n * @returns {Promise.>}\n */\nSoapApi.prototype.merge = function(mergeRequests, callback) {\n var schema = _.isArray(mergeRequests) ? [ Schemas.MergeResult ] : Schemas.MergeResult;\n return this._invoke(\"merge\", { mergeRequests: mergeRequests }, schema, callback);\n};\nSchemas.MergeResult = {\n success: 'boolean',\n errors: [],\n id: 'string',\n mergedRecordIds: ['string'],\n updatedRelatedIds: ['string']\n};\n\n\n/**\n * @typedef SoapApi~EmptyRecycleBinResult\n * @prop {String} id - ID of an sObject that you attempted to delete from the Recycle Bin\n * @prop {Boolean} success - Whether the call succeeded (true) or not (false) for this record\n * @prop {Array.} errors - Errors\n */\n/**\n * Delete records from the recycle bin immediately\n *\n * @param {Array.} ids - Record ids to empty from recycle bin\n * @param {Callback.>} [callback] - Callback function\n * @returns {Promise.>}\n */\nSoapApi.prototype.emptyRecycleBin = function(ids, callback) {\n return this._invoke(\"emptyRecycleBin\", { ids: ids }, [ Schemas.EmptyRecycleBinResult ], callback);\n};\nSchemas.EmptyRecycleBinResult = {\n id: 'string',\n success: 'boolean',\n errors: []\n};\n\n\n/**\n * @typedef SoapApi~DescribeTabSetResult\n * @prop {String} label - The display label for this standard or custom app\n * @prop {String} logoUrl - A fully qualified URL to the logo image associated with the standard or custom app\n * @prop {String} namespace - Namespace of application package\n * @prop {Boolean} selected - If true, then this standard or custom app is the user’s currently selected app\n * @prop {Array.} tabs - An array of tabs that are displayed for the specified standard app or custom app\n */\n/**\n * @typedef SoapApi~DescribeTab\n * @prop {Array.} colors - Array of color information used for a tab\n * @prop {Boolean} custom - true if this is a custom tab\n * @prop {String} iconUrl - The URL for the main 32 x 32 pixel icon for a tab\n * @prop {Array.} icons - Array of icon information used for a tab\n * @prop {String} label - The display label for this tab\n * @prop {String} miniIconUrl - The URL for the 16 x 16 pixel icon that represents a tab\n * @prop {String} name - The API name of the tab\n * @prop {String} sobjectName - The name of the sObject that is primarily displayed on this tab\n * @prop {String} url - A fully qualified URL for viewing this tab\n */\n/**\n * Returns information about the standard and custom apps available to the logged-in user\n *\n * @param {Callback.>} [callback] - Callback function\n * @returns {Promise.>}\n */\nSoapApi.prototype.describeTabs = function(callback) {\n return this._invoke(\"describeTabs\", {}, [ Schemas.DescribeTabSetResult ], callback);\n};\nSchemas.DescribeTabSetResult = {\n label: 'string',\n logoUrl: 'string',\n namespace: 'string',\n selected: 'boolean',\n tabs: [{\n colors: [{\n theme: 'string',\n color: 'string',\n context: 'string'\n }],\n iconUrl: 'string',\n icons: [{\n theme: 'string',\n height: 'number',\n width: 'number',\n url: 'string',\n contentType: 'string'\n }],\n label: 'string',\n custom: 'boolean',\n miniIconUrl: 'string',\n name: 'string',\n sobjectName: 'string',\n url: 'string'\n }]\n};\n\n/**\n * Retrieves the current system timestamp (Coordinated Universal Time (UTC) time zone) from the API\n *\n * @typedef SoapApi~ServerTimestampResult\n * @prop {String} timestamp - Timestamp\n */\n/**\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\nSoapApi.prototype.getServerTimestamp = function(callback) {\n return this._invoke(\"getServerTimestamp\", {}, Schemas.GetServerTimestampResult, callback);\n};\nSchemas.GetServerTimestampResult = {\n timestamp: 'string'\n};\n\n/**\n * @typedef SoapApi~UserInfoResult\n * @prop {Boolean} accessibilityMode\n * @prop {String} currencySymbol\n * @prop {Number} orgAttachmentFileSizeLimit\n * @prop {String} orgDefaultCurrencyIsoCode\n * @prop {String} orgDisallowHtmlAttachments\n * @prop {Boolean} orgHasPersonAccounts\n * @prop {String} organizationId\n * @prop {Boolean} organizationMultiCurrency\n * @prop {String} organizationName\n * @prop {String} profileId\n * @prop {String} roleId\n * @prop {Number} sessionSecondsValid\n * @prop {String} userDefaultCurrencyIsoCode\n * @prop {String} userEmail\n * @prop {String} userFullName\n * @prop {String} userId\n * @prop {String} userLanguage\n * @prop {String} userLocale\n * @prop {String} userName\n * @prop {String} userTimeZone\n * @prop {String} userType\n * @prop {String} userUiSkin\n */\n/**\n * Retrieves personal information for the user associated with the current session\n *\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\nSoapApi.prototype.getUserInfo = function(callback) {\n return this._invoke(\"getUserInfo\", {}, Schemas.GetUserInfoResult, callback);\n};\nSchemas.GetUserInfoResult = {\n accessibilityMode: 'boolean',\n currencySymbol: 'string',\n orgAttachmentFileSizeLimit: 'number',\n orgDefaultCurrencyIsoCode: 'string',\n orgDisallowHtmlAttachments: 'boolean',\n orgHasPersonAccounts: 'boolean',\n organizationId: 'string',\n organizationMultiCurrency: 'boolean',\n organizationName: 'string',\n profileId: 'string',\n roleId: 'string',\n sessionSecondsValid: 'number',\n userDefaultCurrencyIsoCode: 'string',\n userEmail: 'string',\n userFullName: 'string',\n userId: 'string',\n userLanguage: 'string',\n userLocale: 'string',\n userName: 'string',\n userTimeZone: 'string',\n userType: 'string',\n userUiSkin: 'string'\n};\n\n/**\n * Sets the specified user’s password to the specified value\n *\n * @param {String} userId - User Id to set password\n * @param {String} password - New password\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\nSoapApi.prototype.setPassword = function(userId, password, callback) {\n return this._invoke(\"setPassword\", { userId: userId, password: password }, callback);\n};\n\n/**\n * @typedef SoapApi~ResetPasswordResult\n * @prop {String} password\n */\n/**\n * Resets the specified user’s password\n *\n * @param {String} userId - User Id to set password\n * @param {String} password - New password\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\nSoapApi.prototype.resetPassword = function(userId, callback) {\n return this._invoke(\"resetPassword\", { userId: userId }, callback);\n};\n\n/**\n * Adds one or more new records to your organization’s data\n *\n * @param {Array.} sObjects - Records to insert\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\nSoapApi.prototype.create = function(sObjects, callback) {\n var schema = _.isArray(sObjects) ? [ Schemas.SaveResult ] : Schemas.SaveResult;\n var args = {\n '@xmlns' : 'urn:partner.soap.sforce.com',\n '@xmlns:ns1' : 'sobject.partner.soap.sforce.com',\n 'ns1:sObjects' : sObjects\n };\n return this._invoke(\"create\", args, schema, callback);\n};\n\n/**\n * Updates one or more existing records in your organization’s data.\n *\n * @param {Array.} sObjects - Records to update\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\nSoapApi.prototype.update = function(sObjects, callback) {\n var schema = _.isArray(sObjects) ? [ Schemas.SaveResult ] : Schemas.SaveResult;\n var args = {\n '@xmlns' : 'urn:partner.soap.sforce.com',\n '@xmlns:ns1' : 'sobject.partner.soap.sforce.com',\n 'ns1:sObjects' : sObjects\n };\n return this._invoke(\"update\", args, schema, callback);\n};\n\nSchemas.SaveResult = {\n success: 'boolean',\n errors: [],\n id: 'string'\n};\n\n/**\n * Creates new records and updates existing records in your organization’s data.\n *\n * @param {Array.} sObjects - Records to upsert\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\nSoapApi.prototype.upsert = function(externalIdFieldName, sObjects, callback) {\n var schema = _.isArray(sObjects) ? [ Schemas.UpsertResult ] : Schemas.UpsertResult;\n var args = {\n '@xmlns' : 'urn:partner.soap.sforce.com',\n '@xmlns:ns1' : 'sobject.partner.soap.sforce.com',\n 'ns1:externalIDFieldName' : externalIdFieldName,\n 'ns1:sObjects' : sObjects\n };\n return this._invoke(\"upsert\", args, schema, callback);\n};\n\nSchemas.UpsertResult = {\n created: 'boolean',\n success: 'boolean',\n errors: [],\n id: 'string'\n};\n\n/**\n * Deletes one or more records from your organization’s data\n *\n * @param {Array.} ids - Id of records to delete\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\nSoapApi.prototype.delete = function(ids, callback) {\n var schema = _.isArray(ids) ? [ Schemas.DeleteResult ] : Schemas.DeleteResult;\n var args = {\n '@xmlns' : 'urn:partner.soap.sforce.com',\n '@xmlns:ns1' : 'sobject.partner.soap.sforce.com',\n 'ns1:ids' : ids\n };\n return this._invoke(\"delete\", args, schema, callback);\n};\n\nSchemas.DeleteResult = {\n success: 'boolean',\n errors: [],\n id: 'string'\n};\n\n\n/*--------------------------------------------*/\n/*\n * Register hook in connection instantiation for dynamically adding this API module features\n */\njsforce.on('connection:new', function(conn) {\n conn.soap = new SoapApi(conn);\n});\n\n\nmodule.exports = SoapApi;\n\n},{}]},{},[1])(1)\n});\n\n"]} \ No newline at end of file +{"version":3,"sources":["node_modules/browser-pack/_prelude.js","lib/api/soap.js","jsforce-api-soap.min.js"],"names":["f","exports","module","define","amd","g","window","global","self","this","jsforce","modules","api","Soap","r","e","n","t","o","i","c","require","u","a","Error","code","p","call","length","1","_","SOAP","SoapApi","conn","_conn","prototype","_invoke","method","message","schema","callback","xmlns","endpointUrl","instanceUrl","version","invoke","result","then","res","thenCall","Schemas","convertLead","leadConverts","isArray","LeadConvertResult","success","errors","leadId","accountId","contactId","opportunityId","merge","mergeRequests","MergeResult","id","mergedRecordIds","updatedRelatedIds","emptyRecycleBin","ids","EmptyRecycleBinResult","describeTabs","DescribeTabSetResult","label","logoUrl","namespace","selected","tabs","colors","theme","color","context","iconUrl","icons","height","width","url","contentType","custom","miniIconUrl","name","sobjectName","getServerTimestamp","GetServerTimestampResult","timestamp","getUserInfo","GetUserInfoResult","accessibilityMode","currencySymbol","orgAttachmentFileSizeLimit","orgDefaultCurrencyIsoCode","orgDisallowHtmlAttachments","orgHasPersonAccounts","organizationId","organizationMultiCurrency","organizationName","profileId","roleId","sessionSecondsValid","userDefaultCurrencyIsoCode","userEmail","userFullName","userId","userLanguage","userLocale","userName","userTimeZone","userType","userUiSkin","setPassword","password","resetPassword","create","sObjects","SaveResult","args","@xmlns","@xmlns:ns1","ns1:sObjects","update","upsert","externalIdFieldName","UpsertResult","ns1:externalIDFieldName","created","delete","DeleteResult","ns1:ids","on","soap"],"mappings":"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","file":"jsforce-api-soap.min.js","sourcesContent":["(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\n */\n\n'use strict';\n\nvar _ = window.jsforce.require('lodash/core');\nvar jsforce = window.jsforce.require('./core');\nvar SOAP = window.jsforce.require('./soap');\n\n/**\n * API class for Partner SOAP call\n *\n * @class\n * @param {Connection} conn - Connection\n */\nvar SoapApi = module.exports = function(conn) {\n this._conn = conn;\n};\n\n/**\n * Call SOAP Api (Partner) endpoint\n * @private\n */\nSoapApi.prototype._invoke = function(method, message, schema, callback) {\n var soapEndpoint = new SOAP(this._conn, {\n xmlns: \"urn:partner.soap.sforce.com\",\n endpointUrl: this._conn.instanceUrl + \"/services/Soap/u/\" + this._conn.version\n });\n return soapEndpoint.invoke(method, message, { result: schema }).then(function(res) {\n return res.result;\n }).thenCall(callback);\n};\n\n\n/* */\nvar Schemas = {};\n\n/**\n * @typedef SoapApi~LeadConvert\n * @prop {String} convertedStatus - Status of converted lead\n * @prop {String} leadId - Lead record Id to convert\n * @prop {String} [accountId] - Account record Id to assign the converted record\n * @prop {String} [contactId] - Contact record Id to assign the converted record\n * @prop {Boolean} [doNotCreateOpportunity] - True if you don't want to create a new opportunity\n * @prop {String} [opportunityName] - Name of opportunity to create\n * @prop {Boolean} [overwriteLeadSource] - True if overwriting lead source\n * @prop {String} [ownerId] - Owner Id\n * @prop {Boolean} [sendNotificationEmail] - True if send notification email\n */\n/**\n * @typedef SoapApi~LeadConvertResult\n * @prop {String} leadId - Lead record Id to convert\n * @prop {String} [accountId] - Account record Id of converted lead\n * @prop {String} [contactId] - Contact record Id of converted lead\n * @prop {String} [opportunityId] - Opportunity record Id created in conversion\n * @prop {Boolean} success - True if successfully converted\n * @prop {Array.} errors - Error\n */\n/**\n * Converts a Lead into an Account, Contact, or (optionally) an Opportunity.\n *\n * @param {SoapApi~LeadConvert|Array.} leadConverts\n * @param {Callback.>} [callback] - Callback function\n * @returns {Promise.>}\n */\nSoapApi.prototype.convertLead = function(leadConverts, callback) {\n var schema = _.isArray(leadConverts) ? [ Schemas.LeadConvertResult ] : Schemas.LeadConvertResult;\n return this._invoke(\"convertLead\", { leadConverts: leadConverts }, schema, callback);\n};\nSchemas.LeadConvertResult = {\n success: 'boolean',\n errors: [],\n leadId: 'string',\n accountId: 'string',\n contactId: 'string',\n opportunityId: 'string'\n};\n\n/**\n * @typedef SoapApi~MergeRequest\n * @prop {Object} masterRecord - The merge destination record\n * @prop {Array.} recordToMergeIds - Ids of records to merge\n */\n/**\n * @typedef SoapApi~MergeResult\n * @prop {Boolean} success - True if successfully merged\n * @prop {Array.} errors - Error\n * @prop {String} id - ID of the master record\n * @prop {Array.} mergedRecordIds - ID of the records that were merged into the master record\n * @prop {Array.} updatedRelatedIds - ID of all related records that were moved (re-parented) as a result of the merge\n */\n\n/**\n * Merge up to three records into one\n *\n * @param {SoapApi~MergeRequest|Array.} mergeRequests\n * @param {Callback.>} [callback] - Callback function\n * @returns {Promise.>}\n */\nSoapApi.prototype.merge = function(mergeRequests, callback) {\n var schema = _.isArray(mergeRequests) ? [ Schemas.MergeResult ] : Schemas.MergeResult;\n return this._invoke(\"merge\", { mergeRequests: mergeRequests }, schema, callback);\n};\nSchemas.MergeResult = {\n success: 'boolean',\n errors: [],\n id: 'string',\n mergedRecordIds: ['string'],\n updatedRelatedIds: ['string']\n};\n\n\n/**\n * @typedef SoapApi~EmptyRecycleBinResult\n * @prop {String} id - ID of an sObject that you attempted to delete from the Recycle Bin\n * @prop {Boolean} success - Whether the call succeeded (true) or not (false) for this record\n * @prop {Array.} errors - Errors\n */\n/**\n * Delete records from the recycle bin immediately\n *\n * @param {Array.} ids - Record ids to empty from recycle bin\n * @param {Callback.>} [callback] - Callback function\n * @returns {Promise.>}\n */\nSoapApi.prototype.emptyRecycleBin = function(ids, callback) {\n return this._invoke(\"emptyRecycleBin\", { ids: ids }, [ Schemas.EmptyRecycleBinResult ], callback);\n};\nSchemas.EmptyRecycleBinResult = {\n id: 'string',\n success: 'boolean',\n errors: []\n};\n\n\n/**\n * @typedef SoapApi~DescribeTabSetResult\n * @prop {String} label - The display label for this standard or custom app\n * @prop {String} logoUrl - A fully qualified URL to the logo image associated with the standard or custom app\n * @prop {String} namespace - Namespace of application package\n * @prop {Boolean} selected - If true, then this standard or custom app is the user’s currently selected app\n * @prop {Array.} tabs - An array of tabs that are displayed for the specified standard app or custom app\n */\n/**\n * @typedef SoapApi~DescribeTab\n * @prop {Array.} colors - Array of color information used for a tab\n * @prop {Boolean} custom - true if this is a custom tab\n * @prop {String} iconUrl - The URL for the main 32 x 32 pixel icon for a tab\n * @prop {Array.} icons - Array of icon information used for a tab\n * @prop {String} label - The display label for this tab\n * @prop {String} miniIconUrl - The URL for the 16 x 16 pixel icon that represents a tab\n * @prop {String} name - The API name of the tab\n * @prop {String} sobjectName - The name of the sObject that is primarily displayed on this tab\n * @prop {String} url - A fully qualified URL for viewing this tab\n */\n/**\n * Returns information about the standard and custom apps available to the logged-in user\n *\n * @param {Callback.>} [callback] - Callback function\n * @returns {Promise.>}\n */\nSoapApi.prototype.describeTabs = function(callback) {\n return this._invoke(\"describeTabs\", {}, [ Schemas.DescribeTabSetResult ], callback);\n};\nSchemas.DescribeTabSetResult = {\n label: 'string',\n logoUrl: 'string',\n namespace: 'string',\n selected: 'boolean',\n tabs: [{\n colors: [{\n theme: 'string',\n color: 'string',\n context: 'string'\n }],\n iconUrl: 'string',\n icons: [{\n theme: 'string',\n height: 'number',\n width: 'number',\n url: 'string',\n contentType: 'string'\n }],\n label: 'string',\n custom: 'boolean',\n miniIconUrl: 'string',\n name: 'string',\n sobjectName: 'string',\n url: 'string'\n }]\n};\n\n/**\n * Retrieves the current system timestamp (Coordinated Universal Time (UTC) time zone) from the API\n *\n * @typedef SoapApi~ServerTimestampResult\n * @prop {String} timestamp - Timestamp\n */\n/**\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\nSoapApi.prototype.getServerTimestamp = function(callback) {\n return this._invoke(\"getServerTimestamp\", {}, Schemas.GetServerTimestampResult, callback);\n};\nSchemas.GetServerTimestampResult = {\n timestamp: 'string'\n};\n\n/**\n * @typedef SoapApi~UserInfoResult\n * @prop {Boolean} accessibilityMode\n * @prop {String} currencySymbol\n * @prop {Number} orgAttachmentFileSizeLimit\n * @prop {String} orgDefaultCurrencyIsoCode\n * @prop {String} orgDisallowHtmlAttachments\n * @prop {Boolean} orgHasPersonAccounts\n * @prop {String} organizationId\n * @prop {Boolean} organizationMultiCurrency\n * @prop {String} organizationName\n * @prop {String} profileId\n * @prop {String} roleId\n * @prop {Number} sessionSecondsValid\n * @prop {String} userDefaultCurrencyIsoCode\n * @prop {String} userEmail\n * @prop {String} userFullName\n * @prop {String} userId\n * @prop {String} userLanguage\n * @prop {String} userLocale\n * @prop {String} userName\n * @prop {String} userTimeZone\n * @prop {String} userType\n * @prop {String} userUiSkin\n */\n/**\n * Retrieves personal information for the user associated with the current session\n *\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\nSoapApi.prototype.getUserInfo = function(callback) {\n return this._invoke(\"getUserInfo\", {}, Schemas.GetUserInfoResult, callback);\n};\nSchemas.GetUserInfoResult = {\n accessibilityMode: 'boolean',\n currencySymbol: 'string',\n orgAttachmentFileSizeLimit: 'number',\n orgDefaultCurrencyIsoCode: 'string',\n orgDisallowHtmlAttachments: 'boolean',\n orgHasPersonAccounts: 'boolean',\n organizationId: 'string',\n organizationMultiCurrency: 'boolean',\n organizationName: 'string',\n profileId: 'string',\n roleId: 'string',\n sessionSecondsValid: 'number',\n userDefaultCurrencyIsoCode: 'string',\n userEmail: 'string',\n userFullName: 'string',\n userId: 'string',\n userLanguage: 'string',\n userLocale: 'string',\n userName: 'string',\n userTimeZone: 'string',\n userType: 'string',\n userUiSkin: 'string'\n};\n\n/**\n * Sets the specified user’s password to the specified value\n *\n * @param {String} userId - User Id to set password\n * @param {String} password - New password\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\nSoapApi.prototype.setPassword = function(userId, password, callback) {\n return this._invoke(\"setPassword\", { userId: userId, password: password }, callback);\n};\n\n/**\n * @typedef SoapApi~ResetPasswordResult\n * @prop {String} password\n */\n/**\n * Resets the specified user’s password\n *\n * @param {String} userId - User Id to set password\n * @param {String} password - New password\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\nSoapApi.prototype.resetPassword = function(userId, callback) {\n return this._invoke(\"resetPassword\", { userId: userId }, callback);\n};\n\n/**\n * Adds one or more new records to your organization’s data\n *\n * @param {Array.} sObjects - Records to insert\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\nSoapApi.prototype.create = function(sObjects, callback) {\n var schema = _.isArray(sObjects) ? [ Schemas.SaveResult ] : Schemas.SaveResult;\n var args = {\n '@xmlns' : 'urn:partner.soap.sforce.com',\n '@xmlns:ns1' : 'sobject.partner.soap.sforce.com',\n 'ns1:sObjects' : sObjects\n };\n return this._invoke(\"create\", args, schema, callback);\n};\n\n/**\n * Updates one or more existing records in your organization’s data.\n *\n * @param {Array.} sObjects - Records to update\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\nSoapApi.prototype.update = function(sObjects, callback) {\n var schema = _.isArray(sObjects) ? [ Schemas.SaveResult ] : Schemas.SaveResult;\n var args = {\n '@xmlns' : 'urn:partner.soap.sforce.com',\n '@xmlns:ns1' : 'sobject.partner.soap.sforce.com',\n 'ns1:sObjects' : sObjects\n };\n return this._invoke(\"update\", args, schema, callback);\n};\n\nSchemas.SaveResult = {\n success: 'boolean',\n errors: [],\n id: 'string'\n};\n\n/**\n * Creates new records and updates existing records in your organization’s data.\n *\n * @param {Array.} sObjects - Records to upsert\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\nSoapApi.prototype.upsert = function(externalIdFieldName, sObjects, callback) {\n var schema = _.isArray(sObjects) ? [ Schemas.UpsertResult ] : Schemas.UpsertResult;\n var args = {\n '@xmlns' : 'urn:partner.soap.sforce.com',\n '@xmlns:ns1' : 'sobject.partner.soap.sforce.com',\n 'ns1:externalIDFieldName' : externalIdFieldName,\n 'ns1:sObjects' : sObjects\n };\n return this._invoke(\"upsert\", args, schema, callback);\n};\n\nSchemas.UpsertResult = {\n created: 'boolean',\n success: 'boolean',\n errors: [],\n id: 'string'\n};\n\n/**\n * Deletes one or more records from your organization’s data\n *\n * @param {Array.} ids - Id of records to delete\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\nSoapApi.prototype.delete = function(ids, callback) {\n var schema = _.isArray(ids) ? [ Schemas.DeleteResult ] : Schemas.DeleteResult;\n var args = {\n '@xmlns' : 'urn:partner.soap.sforce.com',\n '@xmlns:ns1' : 'sobject.partner.soap.sforce.com',\n 'ns1:ids' : ids\n };\n return this._invoke(\"delete\", args, schema, callback);\n};\n\nSchemas.DeleteResult = {\n success: 'boolean',\n errors: [],\n id: 'string'\n};\n\n\n/*--------------------------------------------*/\n/*\n * Register hook in connection instantiation for dynamically adding this API module features\n */\njsforce.on('connection:new', function(conn) {\n conn.soap = new SoapApi(conn);\n});\n\n\nmodule.exports = SoapApi;\n","!function(e){var r;\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=e():\"function\"==typeof define&&define.amd?define([],e):(r=(r=(r=(r=\"undefined\"!=typeof window?window:\"undefined\"!=typeof global?global:\"undefined\"!=typeof self?self:this).jsforce||(r.jsforce={})).modules||(r.modules={})).api||(r.api={})).Soap=e()}(function(){return function o(i,u,a){function c(r,e){if(!u[r]){if(!i[r]){var t=\"function\"==typeof require&&require;if(!e&&t)return t(r,!0);if(l)return l(r,!0);var n=new Error(\"Cannot find module '\"+r+\"'\");throw n.code=\"MODULE_NOT_FOUND\",n}var s=u[r]={exports:{}};i[r][0].call(s.exports,function(e){return c(i[r][1][e]||e)},s,s.exports,o,i,u,a)}return u[r].exports}for(var l=\"function\"==typeof require&&require,e=0;el){for(var e=0,n=c.length-u;e=Math.pow(2,32)&&(this._messageId=0),this._messageId.toString(36)},_receiveMessage:function(t){var e,n=t.id;void 0!==t.successful&&(e=this._responseCallbacks[n],delete this._responseCallbacks[n]),this.pipeThroughExtensions("incoming",t,null,function(t){t&&(t.advice&&this._handleAdvice(t.advice),this._deliverMessage(t),e&&e[0].call(e[1],t))},this)},_handleAdvice:function(t){u(this._advice,t),this._dispatcher.timeout=this._advice.timeout/1e3,this._advice.reconnect===this.HANDSHAKE&&this._state!==this.DISCONNECTED&&(this._state=this.UNCONNECTED,this._dispatcher.clientId=null,this._cycleConnection())},_deliverMessage:function(t){t.channel&&void 0!==t.data&&(this.info("Client ? calling listeners for ? with ?",this._dispatcher.clientId,t.channel,t.data),this._channels.distributeMessage(t))},_cycleConnection:function(){this._connectRequest&&(this._connectRequest=null,this.info("Closed connection for ?",this._dispatcher.clientId));var t=this;n.setTimeout(function(){t.connect()},this._advice.interval)}});u(b.prototype,h),u(b.prototype,d),u(b.prototype,f),u(b.prototype,g),e.exports=b}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{"../mixins/deferrable":6,"../mixins/logging":7,"../mixins/publisher":8,"../util/array":26,"../util/browser":27,"../util/class":28,"../util/constants":29,"../util/extend":33,"../util/promise":34,"../util/uri":37,"../util/validate_options":38,"./channel":10,"./dispatcher":12,"./error":13,"./extensible":14,"./publication":16,"./subscription":18,asap:3}],12:[function(t,e,n){(function(n){"use strict";var i=t("../util/class"),s=t("../util/uri"),r=t("../util/cookies"),o=t("../util/extend"),c=t("../mixins/logging"),a=t("../mixins/publisher"),u=t("../transport"),l=t("./scheduler"),h=i({className:"Dispatcher",MAX_REQUEST_SIZE:2048,DEFAULT_RETRY:5,UP:1,DOWN:2,initialize:function(t,e,n){this._client=t,this.endpoint=s.parse(e),this._alternates=n.endpoints||{},this.cookies=r.CookieJar&&new r.CookieJar,this._disabled=[],this._envelopes={},this.headers={},this.retry=n.retry||this.DEFAULT_RETRY,this._scheduler=n.scheduler||l,this._state=0,this.transports={},this.wsExtensions=[],this.proxy=n.proxy||{},"string"==typeof this._proxy&&(this._proxy={origin:this._proxy});var i=n.websocketExtensions;if(i){i=[].concat(i);for(var o=0,c=i.length;o=3?c[t](e,n,o):c[t](e,o)):o(e)};o(e)}};i(r,s),e.exports=r},{"../mixins/logging":7,"../util/extend":33}],15:[function(t,e,n){"use strict";e.exports={CHANNEL_NAME:/^\/(((([a-z]|[A-Z])|[0-9])|(\-|\_|\!|\~|\(|\)|\$|\@)))+(\/(((([a-z]|[A-Z])|[0-9])|(\-|\_|\!|\~|\(|\)|\$|\@)))+)*$/,CHANNEL_PATTERN:/^(\/(((([a-z]|[A-Z])|[0-9])|(\-|\_|\!|\~|\(|\)|\$|\@)))+)*\/\*{1,2}$/,ERROR:/^([0-9][0-9][0-9]:(((([a-z]|[A-Z])|[0-9])|(\-|\_|\!|\~|\(|\)|\$|\@)| |\/|\*|\.))*(,(((([a-z]|[A-Z])|[0-9])|(\-|\_|\!|\~|\(|\)|\$|\@)| |\/|\*|\.))*)*:(((([a-z]|[A-Z])|[0-9])|(\-|\_|\!|\~|\(|\)|\$|\@)| |\/|\*|\.))*|[0-9][0-9][0-9]::(((([a-z]|[A-Z])|[0-9])|(\-|\_|\!|\~|\(|\)|\$|\@)| |\/|\*|\.))*)$/,VERSION:/^([0-9])+(\.(([a-z]|[A-Z])|[0-9])(((([a-z]|[A-Z])|[0-9])|\-|\_))*)*$/}},{}],16:[function(t,e,n){"use strict";var i=t("../util/class"),s=t("../mixins/deferrable");e.exports=i(s)},{"../mixins/deferrable":6,"../util/class":28}],17:[function(t,e,n){"use strict";var i=t("../util/extend"),s=function(t,e){this.message=t,this.options=e,this.attempts=0};i(s.prototype,{getTimeout:function(){return this.options.timeout},getInterval:function(){return this.options.interval},isDeliverable:function(){var t=this.options.attempts,e=this.attempts,n=this.options.deadline,i=(new Date).getTime();return!(void 0!==t&&e>=t)&&!(void 0!==n&&i>n)},send:function(){this.attempts+=1},succeed:function(){},fail:function(){},abort:function(){}}),e.exports=s},{"../util/extend":33}],18:[function(t,e,n){"use strict";var i=t("../util/class"),s=t("../util/extend"),r=t("../mixins/deferrable"),o=i({initialize:function(t,e,n,i){this._client=t,this._channels=e,this._callback=n,this._context=i,this._cancelled=!1},withChannel:function(t,e){return this._withChannel=[t,e],this},apply:function(t,e){var n=e[0];this._callback&&this._callback.call(this._context,n.data),this._withChannel&&this._withChannel[0].call(this._withChannel[1],n.channel,n.data)},cancel:function(){this._cancelled||(this._client.unsubscribe(this._channels,this),this._cancelled=!0)},unsubscribe:function(){this.cancel()}});s(o.prototype,r),e.exports=o},{"../mixins/deferrable":6,"../util/class":28,"../util/extend":33}],19:[function(t,e,n){"use strict";var i=t("./transport");i.register("websocket",t("./web_socket")),i.register("eventsource",t("./event_source")),i.register("long-polling",t("./xhr")),i.register("cross-origin-long-polling",t("./cors")),i.register("callback-polling",t("./jsonp")),e.exports=i},{"./cors":20,"./event_source":21,"./jsonp":22,"./transport":23,"./web_socket":24,"./xhr":25}],20:[function(t,e,n){(function(n){"use strict";var i=t("../util/class"),s=t("../util/set"),r=t("../util/uri"),o=t("../util/extend"),c=t("../util/to_json"),a=t("./transport"),u=o(i(a,{encode:function(t){return"message="+encodeURIComponent(c(t))},request:function(t){var e,i=n.XDomainRequest?XDomainRequest:XMLHttpRequest,s=new i,o=++u._id,c=this._dispatcher.headers,a=this;if(s.open("POST",r.stringify(this.endpoint),!0),s.setRequestHeader){s.setRequestHeader("Pragma","no-cache");for(e in c)c.hasOwnProperty(e)&&s.setRequestHeader(e,c[e])}var l=function(){return!!s&&(u._pending.remove(o),s.onload=s.onerror=s.ontimeout=s.onprogress=null,void(s=null))};return s.onload=function(){var e;try{e=JSON.parse(s.responseText)}catch(n){}l(),e?a._receive(e):a._handleError(t)},s.onerror=s.ontimeout=function(){l(),a._handleError(t)},s.onprogress=function(){},i===n.XDomainRequest&&u._pending.add({id:o,xhr:s}),s.send(this.encode(t)),s}}),{_id:0,_pending:new s,isUsable:function(t,e,i,s){if(r.isSameOrigin(e))return i.call(s,!1);if(n.XDomainRequest)return i.call(s,e.protocol===location.protocol);if(n.XMLHttpRequest){var o=new XMLHttpRequest;return i.call(s,void 0!==o.withCredentials)}return i.call(s,!1)}});e.exports=u}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{"../util/class":28,"../util/extend":33,"../util/set":35,"../util/to_json":36,"../util/uri":37,"./transport":23}],21:[function(t,e,n){(function(n){"use strict";var i=t("../util/class"),s=t("../util/uri"),r=t("../util/copy_object"),o=t("../util/extend"),c=t("../mixins/deferrable"),a=t("./transport"),u=t("./xhr"),l=o(i(a,{initialize:function(t,e){if(a.prototype.initialize.call(this,t,e),!n.EventSource)return this.setDeferredStatus("failed");this._xhr=new u(t,e),e=r(e),e.pathname+="/"+t.clientId;var i=new n.EventSource(s.stringify(e)),o=this;i.onopen=function(){o._everConnected=!0,o.setDeferredStatus("succeeded")},i.onerror=function(){o._everConnected?o._handleError([]):(o.setDeferredStatus("failed"),i.close())},i.onmessage=function(t){var e;try{e=JSON.parse(t.data)}catch(n){}e?o._receive(e):o._handleError([])},this._socket=i},close:function(){this._socket&&(this._socket.onopen=this._socket.onerror=this._socket.onmessage=null,this._socket.close(),delete this._socket)},isUsable:function(t,e){this.callback(function(){t.call(e,!0)}),this.errback(function(){t.call(e,!1)})},encode:function(t){return this._xhr.encode(t)},request:function(t){return this._xhr.request(t)}}),{isUsable:function(t,e,n,i){var s=t.clientId;return s?void u.isUsable(t,e,function(s){return s?void this.create(t,e).isUsable(n,i):n.call(i,!1)},this):n.call(i,!1)},create:function(t,e){var n=t.transports.eventsource=t.transports.eventsource||{},i=t.clientId,o=r(e);return o.pathname+="/"+(i||""),o=s.stringify(o),n[o]=n[o]||new this(t,e),n[o]}});o(l.prototype,c),e.exports=l}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{"../mixins/deferrable":6,"../util/class":28,"../util/copy_object":31,"../util/extend":33,"../util/uri":37,"./transport":23,"./xhr":25}],22:[function(t,e,n){(function(n){"use strict";var i=t("../util/class"),s=t("../util/uri"),r=t("../util/copy_object"),o=t("../util/extend"),c=t("../util/to_json"),a=t("./transport"),u=o(i(a,{encode:function(t){var e=r(this.endpoint);return e.query.message=c(t),e.query.jsonp="__jsonp"+u._cbCount+"__",s.stringify(e)},request:function(t){var e=document.getElementsByTagName("head")[0],i=document.createElement("script"),o=u.getCallbackName(),a=r(this.endpoint),l=this;a.query.message=c(t),a.query.jsonp=o;var h=function(){if(!n[o])return!1;n[o]=void 0;try{delete n[o]}catch(t){}i.parentNode.removeChild(i)};return n[o]=function(t){h(),l._receive(t)},i.type="text/javascript",i.src=s.stringify(a),e.appendChild(i),i.onerror=function(){h(),l._handleError(t)},{abort:h}}}),{_cbCount:0,getCallbackName:function(){return this._cbCount+=1,"__jsonp"+this._cbCount+"__"},isUsable:function(t,e,n,i){n.call(i,!0)}});e.exports=u}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{"../util/class":28,"../util/copy_object":31,"../util/extend":33,"../util/to_json":36,"../util/uri":37,"./transport":23}],23:[function(t,e,n){(function(n){"use strict";var i=t("../util/class"),s=t("../util/cookies").Cookie,r=t("../util/promise"),o=t("../util/uri"),c=t("../util/array"),a=t("../util/extend"),u=t("../mixins/logging"),l=t("../mixins/timeouts"),h=t("../protocol/channel"),f=a(i({className:"Transport",DEFAULT_PORTS:{"http:":80,"https:":443,"ws:":80,"wss:":443},MAX_DELAY:0,batching:!0,initialize:function(t,e){this._dispatcher=t,this.endpoint=e,this._outbox=[],this._proxy=a({},this._dispatcher.proxy),this._proxy.origin||(this._proxy.origin=this._findProxy())},close:function(){},encode:function(t){return""},sendMessage:function(t){return this.debug("Client ? sending message to ?: ?",this._dispatcher.clientId,o.stringify(this.endpoint),t),this.batching?(this._outbox.push(t),this._flushLargeBatch(),t.channel===h.HANDSHAKE?this._publish(.01):(t.channel===h.CONNECT&&(this._connectMessage=t),this._publish(this.MAX_DELAY))):r.resolve(this.request([t]))},_makePromise:function(){var t=this;this._requestPromise=this._requestPromise||new r(function(e){t._resolvePromise=e})},_publish:function(t){return this._makePromise(),this.addTimeout("publish",t,function(){this._flush(),delete this._requestPromise},this),this._requestPromise},_flush:function(){this.removeTimeout("publish"),this._outbox.length>1&&this._connectMessage&&(this._connectMessage.advice={timeout:0}),this._resolvePromise(this.request(this._outbox)),this._connectMessage=null,this._outbox=[]},_flushLargeBatch:function(){var t=this.encode(this._outbox);if(!(t.length1&&(i=o[s]),i=i||o["CGI_"+r]):(i=o[s]||o[r],i&&!o[s]&&console.warn("The environment variable "+r+" is discouraged. Use "+s+".")),i}}}}),{get:function(t,e,n,i,s){var r=t.endpoint;c.asyncEach(this._transports,function(r,o){var a=r[0],u=r[1],l=t.endpointFor(a);return c.indexOf(n,a)>=0?o():c.indexOf(e,a)<0?(u.isUsable(t,l,function(){}),o()):void u.isUsable(t,l,function(e){ -if(!e)return o();var n=u.hasOwnProperty("create")?u.create(t,l):new u(t,l);i.call(s,n)})},function(){throw new Error("Could not find a usable connection type for "+o.stringify(r))})},register:function(t,e){this._transports.push([t,e]),e.prototype.connectionType=t},getConnectionTypes:function(){return c.map(this._transports,function(t){return t[0]})},_transports:[]});a(f.prototype,u),a(f.prototype,l),e.exports=f}).call(this,t("_process"))},{"../mixins/logging":7,"../mixins/timeouts":9,"../protocol/channel":10,"../util/array":26,"../util/class":28,"../util/cookies":30,"../util/extend":33,"../util/promise":34,"../util/uri":37,_process:40}],24:[function(t,e,n){(function(n){"use strict";var i=t("../util/class"),s=t("../util/promise"),r=t("../util/set"),o=t("../util/uri"),c=t("../util/browser"),a=t("../util/copy_object"),u=t("../util/extend"),l=t("../util/to_json"),h=t("../util/websocket"),f=t("../mixins/deferrable"),d=t("./transport"),p=u(i(d,{UNCONNECTED:1,CONNECTING:2,CONNECTED:3,batching:!1,isUsable:function(t,e){this.callback(function(){t.call(e,!0)}),this.errback(function(){t.call(e,!1)}),this.connect()},request:function(t){this._pending=this._pending||new r;for(var e=0,n=t.length;e=200&&o<300||304===o||1223===o;if(void 0!==n.onbeforeunload&&r.Event.detach(n,"beforeunload",a),e.onreadystatechange=function(){},e=null,!u)return s._handleError(t);try{i=JSON.parse(c)}catch(l){}i?s._receive(i):s._handleError(t)}},e.send(this.encode(t)),e}}),{isUsable:function(t,e,n,i){var r="ReactNative"===navigator.product||s.isSameOrigin(e);n.call(i,r)}});e.exports=u}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{"../util/browser":27,"../util/class":28,"../util/extend":33,"../util/to_json":36,"../util/uri":37,"./transport":23}],26:[function(t,e,n){"use strict";e.exports={commonElement:function(t,e){for(var n=0,i=t.length;n0;)a();c=!1}},l=function(){o+=1,u()};l()}}},{}],27:[function(t,e,n){(function(t){"use strict";var n={_registry:[],on:function(t,e,n,i){var s=function(){n.call(i)};t.addEventListener?t.addEventListener(e,s,!1):t.attachEvent("on"+e,s),this._registry.push({_element:t,_type:e,_callback:n,_context:i,_handler:s})},detach:function(t,e,n,i){for(var s,r=this._registry.length;r--;)s=this._registry[r],t&&t!==s._element||e&&e!==s._type||n&&n!==s._callback||i&&i!==s._context||(s._element.removeEventListener?s._element.removeEventListener(s._type,s._handler,!1):s._element.detachEvent("on"+s._type,s._handler),this._registry.splice(r,1),s=null)}};void 0!==t.onunload&&n.on(t,"unload",n.detach,n),e.exports={Event:n}}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],28:[function(t,e,n){"use strict";var i=t("./extend");e.exports=function(t,e){"function"!=typeof t&&(e=t,t=Object);var n=function(){return this.initialize?this.initialize.apply(this,arguments)||this:this},s=function(){};return s.prototype=t.prototype,n.prototype=new s,i(n.prototype,e),n}},{"./extend":33}],29:[function(t,e,n){e.exports={VERSION:"1.2.4",BAYEUX_VERSION:"1.0",ID_LENGTH:160,JSONP_CALLBACK:"jsonpcallback",CONNECTION_TYPES:["long-polling","cross-origin-long-polling","callback-polling","websocket","eventsource","in-process"],MANDATORY_CONNECTION_TYPES:["long-polling","callback-polling","in-process"]}},{}],30:[function(t,e,n){"use strict";e.exports={}},{}],31:[function(t,e,n){"use strict";var i=function(t){var e,n,s;if(t instanceof Array){for(e=[],n=t.length;n--;)e[n]=i(t[n]);return e}if("object"==typeof t){e=null===t?null:{};for(s in t)e[s]=i(t[s]);return e}return t};e.exports=i},{}],32:[function(t,e,n){function i(t,e){if(t.indexOf)return t.indexOf(e);for(var n=0;n1)for(var n=1;n1024){for(var e=0,n=s.length-r;e=Math.pow(2,32)&&(this._messageId=0),this._messageId.toString(36)},_receiveMessage:function(t){var e,n=t.id;void 0!==t.successful&&(e=this._responseCallbacks[n],delete this._responseCallbacks[n]),this.pipeThroughExtensions("incoming",t,null,(function(t){t&&(t.advice&&this._handleAdvice(t.advice),this._deliverMessage(t),e&&e[0].call(e[1],t))}),this)},_handleAdvice:function(t){u(this._advice,t),this._dispatcher.timeout=this._advice.timeout/1e3,this._advice.reconnect===this.HANDSHAKE&&this._state!==this.DISCONNECTED&&(this._state=this.UNCONNECTED,this._dispatcher.clientId=null,this._cycleConnection())},_deliverMessage:function(t){t.channel&&void 0!==t.data&&(this.info("Client ? calling listeners for ? with ?",this._dispatcher.clientId,t.channel,t.data),this._channels.distributeMessage(t))},_cycleConnection:function(){this._connectRequest&&(this._connectRequest=null,this.info("Closed connection for ?",this._dispatcher.clientId));var t=this;n.setTimeout((function(){t.connect()}),this._advice.interval)}});u(b.prototype,h),u(b.prototype,d),u(b.prototype,f),u(b.prototype,g),e.exports=b}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{"../mixins/deferrable":6,"../mixins/logging":7,"../mixins/publisher":8,"../util/array":26,"../util/browser":27,"../util/class":28,"../util/constants":29,"../util/extend":33,"../util/promise":34,"../util/uri":37,"../util/validate_options":38,"./channel":10,"./dispatcher":12,"./error":13,"./extensible":14,"./publication":16,"./subscription":18,asap:3}],12:[function(t,e,n){(function(n){"use strict";var i=t("../util/class"),s=t("../util/uri"),r=t("../util/cookies"),o=t("../util/extend"),c=t("../mixins/logging"),a=t("../mixins/publisher"),u=t("../transport"),l=t("./scheduler"),h=i({className:"Dispatcher",MAX_REQUEST_SIZE:2048,DEFAULT_RETRY:5,UP:1,DOWN:2,initialize:function(t,e,n){this._client=t,this.endpoint=s.parse(e),this._alternates=n.endpoints||{},this.cookies=r.CookieJar&&new r.CookieJar,this._disabled=[],this._envelopes={},this.headers={},this.retry=n.retry||this.DEFAULT_RETRY,this._scheduler=n.scheduler||l,this._state=0,this.transports={},this.wsExtensions=[],this.proxy=n.proxy||{},"string"==typeof this._proxy&&(this._proxy={origin:this._proxy});var i=n.websocketExtensions;if(i)for(var o=0,c=(i=[].concat(i)).length;o=3?c[t](e,n,o):c[t](e,o)};o(e)}};t("../util/extend")(i,t("../mixins/logging")),e.exports=i},{"../mixins/logging":7,"../util/extend":33}],15:[function(t,e,n){"use strict";e.exports={CHANNEL_NAME:/^\/(((([a-z]|[A-Z])|[0-9])|(\-|\_|\!|\~|\(|\)|\$|\@)))+(\/(((([a-z]|[A-Z])|[0-9])|(\-|\_|\!|\~|\(|\)|\$|\@)))+)*$/,CHANNEL_PATTERN:/^(\/(((([a-z]|[A-Z])|[0-9])|(\-|\_|\!|\~|\(|\)|\$|\@)))+)*\/\*{1,2}$/,ERROR:/^([0-9][0-9][0-9]:(((([a-z]|[A-Z])|[0-9])|(\-|\_|\!|\~|\(|\)|\$|\@)| |\/|\*|\.))*(,(((([a-z]|[A-Z])|[0-9])|(\-|\_|\!|\~|\(|\)|\$|\@)| |\/|\*|\.))*)*:(((([a-z]|[A-Z])|[0-9])|(\-|\_|\!|\~|\(|\)|\$|\@)| |\/|\*|\.))*|[0-9][0-9][0-9]::(((([a-z]|[A-Z])|[0-9])|(\-|\_|\!|\~|\(|\)|\$|\@)| |\/|\*|\.))*)$/,VERSION:/^([0-9])+(\.(([a-z]|[A-Z])|[0-9])(((([a-z]|[A-Z])|[0-9])|\-|\_))*)*$/}},{}],16:[function(t,e,n){"use strict";var i=t("../util/class"),s=t("../mixins/deferrable");e.exports=i(s)},{"../mixins/deferrable":6,"../util/class":28}],17:[function(t,e,n){"use strict";var i=function(t,e){this.message=t,this.options=e,this.attempts=0};t("../util/extend")(i.prototype,{getTimeout:function(){return this.options.timeout},getInterval:function(){return this.options.interval},isDeliverable:function(){var t=this.options.attempts,e=this.attempts,n=this.options.deadline,i=(new Date).getTime();return!(void 0!==t&&e>=t)&&!(void 0!==n&&i>n)},send:function(){this.attempts+=1},succeed:function(){},fail:function(){},abort:function(){}}),e.exports=i},{"../util/extend":33}],18:[function(t,e,n){"use strict";var i=t("../util/class"),s=t("../util/extend"),r=t("../mixins/deferrable"),o=i({initialize:function(t,e,n,i){this._client=t,this._channels=e,this._callback=n,this._context=i,this._cancelled=!1},withChannel:function(t,e){return this._withChannel=[t,e],this},apply:function(t,e){var n=e[0];this._callback&&this._callback.call(this._context,n.data),this._withChannel&&this._withChannel[0].call(this._withChannel[1],n.channel,n.data)},cancel:function(){this._cancelled||(this._client.unsubscribe(this._channels,this),this._cancelled=!0)},unsubscribe:function(){this.cancel()}});s(o.prototype,r),e.exports=o},{"../mixins/deferrable":6,"../util/class":28,"../util/extend":33}],19:[function(t,e,n){"use strict";var i=t("./transport");i.register("websocket",t("./web_socket")),i.register("eventsource",t("./event_source")),i.register("long-polling",t("./xhr")),i.register("cross-origin-long-polling",t("./cors")),i.register("callback-polling",t("./jsonp")),e.exports=i},{"./cors":20,"./event_source":21,"./jsonp":22,"./transport":23,"./web_socket":24,"./xhr":25}],20:[function(t,e,n){(function(n){"use strict";var i=t("../util/class"),s=t("../util/set"),r=t("../util/uri"),o=t("../util/extend"),c=t("../util/to_json"),a=o(i(t("./transport"),{encode:function(t){return"message="+encodeURIComponent(c(t))},request:function(t){var e,i=n.XDomainRequest?XDomainRequest:XMLHttpRequest,s=new i,o=++a._id,c=this._dispatcher.headers,u=this;if(s.open("POST",r.stringify(this.endpoint),!0),s.setRequestHeader)for(e in s.setRequestHeader("Pragma","no-cache"),c)c.hasOwnProperty(e)&&s.setRequestHeader(e,c[e]);var l=function(){if(!s)return!1;a._pending.remove(o),s.onload=s.onerror=s.ontimeout=s.onprogress=null,s=null};return s.onload=function(){var e;try{e=JSON.parse(s.responseText)}catch(t){}l(),e?u._receive(e):u._handleError(t)},s.onerror=s.ontimeout=function(){l(),u._handleError(t)},s.onprogress=function(){},i===n.XDomainRequest&&a._pending.add({id:o,xhr:s}),s.send(this.encode(t)),s}}),{_id:0,_pending:new s,isUsable:function(t,e,i,s){if(r.isSameOrigin(e))return i.call(s,!1);if(n.XDomainRequest)return i.call(s,e.protocol===location.protocol);if(n.XMLHttpRequest){var o=new XMLHttpRequest;return i.call(s,void 0!==o.withCredentials)}return i.call(s,!1)}});e.exports=a}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{"../util/class":28,"../util/extend":33,"../util/set":35,"../util/to_json":36,"../util/uri":37,"./transport":23}],21:[function(t,e,n){(function(n){"use strict";var i=t("../util/class"),s=t("../util/uri"),r=t("../util/copy_object"),o=t("../util/extend"),c=t("../mixins/deferrable"),a=t("./transport"),u=t("./xhr"),l=o(i(a,{initialize:function(t,e){if(a.prototype.initialize.call(this,t,e),!n.EventSource)return this.setDeferredStatus("failed");this._xhr=new u(t,e),(e=r(e)).pathname+="/"+t.clientId;var i=new n.EventSource(s.stringify(e)),o=this;i.onopen=function(){o._everConnected=!0,o.setDeferredStatus("succeeded")},i.onerror=function(){o._everConnected?o._handleError([]):(o.setDeferredStatus("failed"),i.close())},i.onmessage=function(t){var e;try{e=JSON.parse(t.data)}catch(t){}e?o._receive(e):o._handleError([])},this._socket=i},close:function(){this._socket&&(this._socket.onopen=this._socket.onerror=this._socket.onmessage=null,this._socket.close(),delete this._socket)},isUsable:function(t,e){this.callback((function(){t.call(e,!0)})),this.errback((function(){t.call(e,!1)}))},encode:function(t){return this._xhr.encode(t)},request:function(t){return this._xhr.request(t)}}),{isUsable:function(t,e,n,i){if(!t.clientId)return n.call(i,!1);u.isUsable(t,e,(function(s){if(!s)return n.call(i,!1);this.create(t,e).isUsable(n,i)}),this)},create:function(t,e){var n=t.transports.eventsource=t.transports.eventsource||{},i=t.clientId,o=r(e);return o.pathname+="/"+(i||""),n[o=s.stringify(o)]=n[o]||new this(t,e),n[o]}});o(l.prototype,c),e.exports=l}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{"../mixins/deferrable":6,"../util/class":28,"../util/copy_object":31,"../util/extend":33,"../util/uri":37,"./transport":23,"./xhr":25}],22:[function(t,e,n){(function(n){"use strict";var i=t("../util/class"),s=t("../util/uri"),r=t("../util/copy_object"),o=t("../util/extend"),c=t("../util/to_json"),a=o(i(t("./transport"),{encode:function(t){var e=r(this.endpoint);return e.query.message=c(t),e.query.jsonp="__jsonp"+a._cbCount+"__",s.stringify(e)},request:function(t){var e=document.getElementsByTagName("head")[0],i=document.createElement("script"),o=a.getCallbackName(),u=r(this.endpoint),l=this;u.query.message=c(t),u.query.jsonp=o;var h=function(){if(!n[o])return!1;n[o]=void 0;try{delete n[o]}catch(t){}i.parentNode.removeChild(i)};return n[o]=function(t){h(),l._receive(t)},i.type="text/javascript",i.src=s.stringify(u),e.appendChild(i),i.onerror=function(){h(),l._handleError(t)},{abort:h}}}),{_cbCount:0,getCallbackName:function(){return this._cbCount+=1,"__jsonp"+this._cbCount+"__"},isUsable:function(t,e,n,i){n.call(i,!0)}});e.exports=a}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{"../util/class":28,"../util/copy_object":31,"../util/extend":33,"../util/to_json":36,"../util/uri":37,"./transport":23}],23:[function(t,e,n){(function(n){"use strict";var i=t("../util/class"),s=t("../util/cookies").Cookie,r=t("../util/promise"),o=t("../util/uri"),c=t("../util/array"),a=t("../util/extend"),u=t("../mixins/logging"),l=t("../mixins/timeouts"),h=t("../protocol/channel"),f=a(i({className:"Transport",DEFAULT_PORTS:{"http:":80,"https:":443,"ws:":80,"wss:":443},MAX_DELAY:0,batching:!0,initialize:function(t,e){this._dispatcher=t,this.endpoint=e,this._outbox=[],this._proxy=a({},this._dispatcher.proxy),this._proxy.origin||(this._proxy.origin=this._findProxy())},close:function(){},encode:function(t){return""},sendMessage:function(t){return this.debug("Client ? sending message to ?: ?",this._dispatcher.clientId,o.stringify(this.endpoint),t),this.batching?(this._outbox.push(t),this._flushLargeBatch(),t.channel===h.HANDSHAKE?this._publish(.01):(t.channel===h.CONNECT&&(this._connectMessage=t),this._publish(this.MAX_DELAY))):r.resolve(this.request([t]))},_makePromise:function(){var t=this;this._requestPromise=this._requestPromise||new r((function(e){t._resolvePromise=e}))},_publish:function(t){return this._makePromise(),this.addTimeout("publish",t,(function(){this._flush(),delete this._requestPromise}),this),this._requestPromise},_flush:function(){this.removeTimeout("publish"),this._outbox.length>1&&this._connectMessage&&(this._connectMessage.advice={timeout:0}),this._resolvePromise(this.request(this._outbox)),this._connectMessage=null,this._outbox=[]},_flushLargeBatch:function(){if(!(this.encode(this._outbox).length1&&(i=o[s]),i=i||o["CGI_"+r]):(i=o[s]||o[r])&&!o[s]&&console.warn("The environment variable "+r+" is discouraged. Use "+s+"."),i}}}}),{get:function(t,e,n,i,s){var r=t.endpoint;c.asyncEach(this._transports,(function(r,o){var a=r[0],u=r[1],l=t.endpointFor(a);return c.indexOf(n,a)>=0?o():c.indexOf(e,a)<0?(u.isUsable(t,l,(function(){})),o()):void u.isUsable(t,l,(function(e){if(!e)return o();var n=u.hasOwnProperty("create")?u.create(t,l):new u(t,l);i.call(s,n)}))}),(function(){throw new Error("Could not find a usable connection type for "+o.stringify(r))}))},register:function(t,e){this._transports.push([t,e]),e.prototype.connectionType=t},getConnectionTypes:function(){return c.map(this._transports,(function(t){return t[0]}))},_transports:[]});a(f.prototype,u),a(f.prototype,l),e.exports=f}).call(this,t("_process"))},{"../mixins/logging":7,"../mixins/timeouts":9,"../protocol/channel":10,"../util/array":26,"../util/class":28,"../util/cookies":30,"../util/extend":33,"../util/promise":34,"../util/uri":37,_process:40}],24:[function(t,e,n){(function(n){"use strict";var i=t("../util/class"),s=t("../util/promise"),r=t("../util/set"),o=t("../util/uri"),c=t("../util/browser"),a=t("../util/copy_object"),u=t("../util/extend"),l=t("../util/to_json"),h=t("../util/websocket"),f=t("../mixins/deferrable"),d=u(i(t("./transport"),{UNCONNECTED:1,CONNECTING:2,CONNECTED:3,batching:!1,isUsable:function(t,e){this.callback((function(){t.call(e,!0)})),this.errback((function(){t.call(e,!1)})),this.connect()},request:function(t){this._pending=this._pending||new r;for(var e=0,n=t.length;e=200&&o<300||304===o||1223===o;if(void 0!==n.onbeforeunload&&r.Event.detach(n,"beforeunload",a),e.onreadystatechange=function(){},e=null,!u)return s._handleError(t);try{i=JSON.parse(c)}catch(t){}i?s._receive(i):s._handleError(t)}},e.send(this.encode(t)),e}}),{isUsable:function(t,e,n,i){var r="ReactNative"===navigator.product||s.isSameOrigin(e);n.call(i,r)}});e.exports=a}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{"../util/browser":27,"../util/class":28,"../util/extend":33,"../util/to_json":36,"../util/uri":37,"./transport":23}],26:[function(t,e,n){"use strict";e.exports={commonElement:function(t,e){for(var n=0,i=t.length;n0;)a();c=!1}}()};u()}}},{}],27:[function(t,e,n){(function(t){"use strict";var n={_registry:[],on:function(t,e,n,i){var s=function(){n.call(i)};t.addEventListener?t.addEventListener(e,s,!1):t.attachEvent("on"+e,s),this._registry.push({_element:t,_type:e,_callback:n,_context:i,_handler:s})},detach:function(t,e,n,i){for(var s,r=this._registry.length;r--;)s=this._registry[r],t&&t!==s._element||e&&e!==s._type||n&&n!==s._callback||i&&i!==s._context||(s._element.removeEventListener?s._element.removeEventListener(s._type,s._handler,!1):s._element.detachEvent("on"+s._type,s._handler),this._registry.splice(r,1),s=null)}};void 0!==t.onunload&&n.on(t,"unload",n.detach,n),e.exports={Event:n}}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],28:[function(t,e,n){"use strict";var i=t("./extend");e.exports=function(t,e){"function"!=typeof t&&(e=t,t=Object);var n=function(){return this.initialize&&this.initialize.apply(this,arguments)||this},s=function(){};return s.prototype=t.prototype,n.prototype=new s,i(n.prototype,e),n}},{"./extend":33}],29:[function(t,e,n){e.exports={VERSION:"1.2.5",BAYEUX_VERSION:"1.0",ID_LENGTH:160,JSONP_CALLBACK:"jsonpcallback",CONNECTION_TYPES:["long-polling","cross-origin-long-polling","callback-polling","websocket","eventsource","in-process"],MANDATORY_CONNECTION_TYPES:["long-polling","callback-polling","in-process"]}},{}],30:[function(t,e,n){"use strict";e.exports={}},{}],31:[function(t,e,n){"use strict";var i=function(t){var e,n,s;if(t instanceof Array){for(e=[],n=t.length;n--;)e[n]=i(t[n]);return e}if("object"==typeof t){for(s in e=null===t?null:{},t)e[s]=i(t[s]);return e}return t};e.exports=i},{}],32:[function(t,e,n){var i="function"==typeof Array.isArray?Array.isArray:function(t){return"[object Array]"===Object.prototype.toString.call(t)};function s(){}e.exports=s,s.prototype.emit=function(t){if("error"===t&&(!this._events||!this._events.error||i(this._events.error)&&!this._events.error.length))throw arguments[1]instanceof Error?arguments[1]:new Error("Uncaught, unspecified 'error' event.");if(!this._events)return!1;var e=this._events[t];if(!e)return!1;if("function"==typeof e){switch(arguments.length){case 1:e.call(this);break;case 2:e.call(this,arguments[1]);break;case 3:e.call(this,arguments[1],arguments[2]);break;default:var n=Array.prototype.slice.call(arguments,1);e.apply(this,n)}return!0}if(i(e)){n=Array.prototype.slice.call(arguments,1);for(var s=e.slice(),r=0,o=s.length;r1)for(var n=1;n process.exit(1);\n * const authFailureExt = new jsforce.StreamingExtension.AuthFailure(exitCallback);\n * \n * const fayeClient = conn.streaming.createClient([ authFailureExt ]);\n * \n * const subscription = fayeClient.subscribe(channel, data => {\n * console.log('topic received data', data);\n * });\n * \n * subscription.cancel();\n * ```\n *\n * @param {Function} failureCallback - Invoked when authentication becomes invalid\n */\nStreamingExtension.AuthFailure = function(failureCallback) {\n this.incoming = function(message, callback) {\n if (\n (message.channel === '/meta/connect' ||\n message.channel === '/meta/handshake')\n && message.advice\n && message.advice.reconnect == 'none'\n ) {\n failureCallback(message);\n } else {\n callback(message);\n }\n }\n};\n\n/**\n * Constructor for a durable streaming replay extension\n *\n * Modified from original Salesforce demo source code:\n * https://github.com/developerforce/SalesforceDurableStreamingDemo/blob/3d4a56eac956f744ad6c22e6a8141b6feb57abb9/staticresources/cometdReplayExtension.resource\n * \n * Example usage:\n *\n * ```javascript\n * const conn = new jsforce.Connection({ … });\n * \n * const channel = \"/event/My_Event__e\";\n * const replayId = -2; // -2 is all retained events\n * \n * const replayExt = new jsforce.StreamingExtension.Replay(channel, replayId);\n * \n * const fayeClient = conn.streaming.createClient([ replayExt ]);\n * \n * const subscription = fayeClient.subscribe(channel, data => {\n * console.log('topic received data', data);\n * });\n * \n * subscription.cancel();\n * ```\n */\nStreamingExtension.Replay = function(channel, replayId) {\n var REPLAY_FROM_KEY = \"replay\";\n \n var _extensionEnabled = replayId != null ? true : false;\n var _replay = replayId;\n var _channel = channel;\n\n this.setExtensionEnabled = function(extensionEnabled) {\n _extensionEnabled = extensionEnabled;\n }\n\n this.setReplay = function (replay) {\n _replay = parseInt(replay, 10);\n }\n\n this.setChannel = function(channel) {\n _channel = channel;\n }\n\n this.incoming = function(message, callback) {\n if (message.channel === '/meta/handshake') {\n if (message.ext && message.ext[REPLAY_FROM_KEY] == true) {\n _extensionEnabled = true;\n }\n } else if (message.channel === _channel && message.data && message.data.event && message.data.event.replayId) {\n _replay = message.data.event.replayId;\n }\n callback(message);\n }\n \n this.outgoing = function(message, callback) {\n if (message.channel === '/meta/subscribe' && message.subscription === _channel) {\n if (_extensionEnabled) {\n if (!message.ext) { message.ext = {}; }\n\n var replayFromMap = {};\n replayFromMap[_channel] = _replay;\n\n // add \"ext : { \"replay\" : { CHANNEL : REPLAY_VALUE }}\" to subscribe message\n message.ext[REPLAY_FROM_KEY] = replayFromMap;\n }\n }\n callback(message);\n };\n};\n\nmodule.exports = StreamingExtension;\n","(function(f){if(typeof exports===\"object\"&&typeof module!==\"undefined\"){module.exports=f()}else if(typeof define===\"function\"&&define.amd){define([],f)}else{var g;if(typeof window!==\"undefined\"){g=window}else if(typeof global!==\"undefined\"){g=global}else if(typeof self!==\"undefined\"){g=self}else{g=this}g=(g.jsforce||(g.jsforce = {}));g=(g.modules||(g.modules = {}));g=(g.api||(g.api = {}));g.Streaming = f()}})(function(){var define,module,exports;return (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 process.exit(1);\n * const authFailureExt = new jsforce.StreamingExtension.AuthFailure(exitCallback);\n * \n * const fayeClient = conn.streaming.createClient([ authFailureExt ]);\n * \n * const subscription = fayeClient.subscribe(channel, data => {\n * console.log('topic received data', data);\n * });\n * \n * subscription.cancel();\n * ```\n *\n * @param {Function} failureCallback - Invoked when authentication becomes invalid\n */\nStreamingExtension.AuthFailure = function(failureCallback) {\n this.incoming = function(message, callback) {\n if (\n (message.channel === '/meta/connect' ||\n message.channel === '/meta/handshake')\n && message.advice\n && message.advice.reconnect == 'none'\n ) {\n failureCallback(message);\n } else {\n callback(message);\n }\n }\n};\n\n/**\n * Constructor for a durable streaming replay extension\n *\n * Modified from original Salesforce demo source code:\n * https://github.com/developerforce/SalesforceDurableStreamingDemo/blob/3d4a56eac956f744ad6c22e6a8141b6feb57abb9/staticresources/cometdReplayExtension.resource\n * \n * Example usage:\n *\n * ```javascript\n * const conn = new jsforce.Connection({ … });\n * \n * const channel = \"/event/My_Event__e\";\n * const replayId = -2; // -2 is all retained events\n * \n * const replayExt = new jsforce.StreamingExtension.Replay(channel, replayId);\n * \n * const fayeClient = conn.streaming.createClient([ replayExt ]);\n * \n * const subscription = fayeClient.subscribe(channel, data => {\n * console.log('topic received data', data);\n * });\n * \n * subscription.cancel();\n * ```\n */\nStreamingExtension.Replay = function(channel, replayId) {\n var REPLAY_FROM_KEY = \"replay\";\n \n var _extensionEnabled = replayId != null ? true : false;\n var _replay = replayId;\n var _channel = channel;\n\n this.setExtensionEnabled = function(extensionEnabled) {\n _extensionEnabled = extensionEnabled;\n }\n\n this.setReplay = function (replay) {\n _replay = parseInt(replay, 10);\n }\n\n this.setChannel = function(channel) {\n _channel = channel;\n }\n\n this.incoming = function(message, callback) {\n if (message.channel === '/meta/handshake') {\n if (message.ext && message.ext[REPLAY_FROM_KEY] == true) {\n _extensionEnabled = true;\n }\n } else if (message.channel === _channel && message.data && message.data.event && message.data.event.replayId) {\n _replay = message.data.event.replayId;\n }\n callback(message);\n }\n \n this.outgoing = function(message, callback) {\n if (message.channel === '/meta/subscribe' && message.subscription === _channel) {\n if (_extensionEnabled) {\n if (!message.ext) { message.ext = {}; }\n\n var replayFromMap = {};\n replayFromMap[_channel] = _replay;\n\n // add \"ext : { \"replay\" : { CHANNEL : REPLAY_VALUE }}\" to subscribe message\n message.ext[REPLAY_FROM_KEY] = replayFromMap;\n }\n }\n callback(message);\n };\n};\n\nmodule.exports = StreamingExtension;\n\n},{}],2:[function(require,module,exports){\n/**\n * @file Manages Streaming APIs\n * @author Shinichi Tomita \n */\n\n'use strict';\n\nvar events = window.jsforce.require('events'),\n inherits = window.jsforce.require('inherits'),\n _ = window.jsforce.require('lodash/core'),\n Faye = require('faye'),\n StreamingExtension = require('./streaming-extension'),\n jsforce = window.jsforce.require('./core');\n\n/**\n * Streaming API topic class\n *\n * @class Streaming~Topic\n * @param {Streaming} steaming - Streaming API object\n * @param {String} name - Topic name\n */\nvar Topic = function(streaming, name) {\n this._streaming = streaming;\n this.name = name;\n};\n\n/**\n * @typedef {Object} Streaming~StreamingMessage\n * @prop {Object} event\n * @prop {Object} event.type - Event type\n * @prop {Record} sobject - Record information\n */\n/**\n * Subscribe listener to topic\n *\n * @method Streaming~Topic#subscribe\n * @param {Callback.} listener - Streaming message listener\n * @returns {Subscription} - Faye subscription object\n */\nTopic.prototype.subscribe = function(listener) {\n return this._streaming.subscribe(this.name, listener);\n};\n\n/**\n * Unsubscribe listener from topic\n *\n * @method Streaming~Topic#unsubscribe\n * @param {Callback.} listener - Streaming message listener\n * @returns {Streaming~Topic}\n */\nTopic.prototype.unsubscribe = function(listener) {\n this._streaming.unsubscribe(this.name, listener);\n return this;\n};\n\n/*--------------------------------------------*/\n\n/**\n * Streaming API Generic Streaming Channel\n *\n * @class Streaming~Channel\n * @param {Streaming} steaming - Streaming API object\n * @param {String} name - Channel name (starts with \"/u/\")\n */\nvar Channel = function(streaming, name) {\n this._streaming = streaming;\n this._name = name;\n};\n\n/**\n * Subscribe to channel\n *\n * @param {Callback.} listener - Streaming message listener\n * @returns {Subscription} - Faye subscription object\n */\nChannel.prototype.subscribe = function(listener) {\n return this._streaming.subscribe(this._name, listener);\n};\n\nChannel.prototype.unsubscribe = function(listener) {\n this._streaming.unsubscribe(this._name, listener);\n return this;\n};\n\nChannel.prototype.push = function(events, callback) {\n var isArray = _.isArray(events);\n events = isArray ? events : [ events ];\n var conn = this._streaming._conn;\n if (!this._id) {\n this._id = conn.sobject('StreamingChannel').findOne({ Name: this._name }, 'Id')\n .then(function(rec) { return rec.Id });\n }\n return this._id.then(function(id) {\n var channelUrl = '/sobjects/StreamingChannel/' + id + '/push';\n return conn.requestPost(channelUrl, { pushEvents: events });\n }).then(function(rets) {\n return isArray ? rets : rets[0];\n }).thenCall(callback);\n};\n\n/*--------------------------------------------*/\n\n/**\n * Streaming API class\n *\n * @class\n * @extends events.EventEmitter\n * @param {Connection} conn - Connection object\n */\nvar Streaming = function(conn) {\n this._conn = conn;\n};\n\ninherits(Streaming, events.EventEmitter);\n\n/** @private **/\nStreaming.prototype._createClient = function(forChannelName, extensions) {\n // forChannelName is advisory, for an API workaround. It does not restrict or select the channel.\n var needsReplayFix = typeof forChannelName === 'string' && forChannelName.indexOf('/u/') === 0;\n var endpointUrl = [\n this._conn.instanceUrl,\n // special endpoint \"/cometd/replay/xx.x\" is only available in 36.0.\n // See https://releasenotes.docs.salesforce.com/en-us/summer16/release-notes/rn_api_streaming_classic_replay.htm\n \"cometd\" + (needsReplayFix === true && this._conn.version === \"36.0\" ? \"/replay\" : \"\"),\n this._conn.version\n ].join('/');\n var fayeClient = new Faye.Client(endpointUrl, {});\n fayeClient.setHeader('Authorization', 'OAuth '+this._conn.accessToken);\n if (extensions instanceof Array) {\n extensions.forEach(function(extension) {\n fayeClient.addExtension(extension);\n });\n }\n if (fayeClient._dispatcher.getConnectionTypes().indexOf('callback-polling') === -1) {\n // prevent streaming API server error\n fayeClient._dispatcher.selectTransport('long-polling');\n fayeClient._dispatcher._transport.batching = false;\n }\n return fayeClient;\n};\n\n/** @private **/\nStreaming.prototype._getFayeClient = function(channelName) {\n var isGeneric = channelName.indexOf('/u/') === 0;\n var clientType = isGeneric ? 'generic' : 'pushTopic';\n if (!this._fayeClients || !this._fayeClients[clientType]) {\n this._fayeClients = this._fayeClients || {};\n this._fayeClients[clientType] = this._createClient(channelName);\n }\n return this._fayeClients[clientType];\n};\n\n\n/**\n * Get named topic\n *\n * @param {String} name - Topic name\n * @returns {Streaming~Topic}\n */\nStreaming.prototype.topic = function(name) {\n this._topics = this._topics || {};\n var topic = this._topics[name] =\n this._topics[name] || new Topic(this, name);\n return topic;\n};\n\n/**\n * Get Channel for Id\n * @param {String} channelId - Id of StreamingChannel object\n * @returns {Streaming~Channel}\n */\nStreaming.prototype.channel = function(channelId) {\n return new Channel(this, channelId);\n};\n\n/**\n * Subscribe topic/channel\n *\n * @param {String} name - Topic name\n * @param {Callback.} listener - Streaming message listener\n * @returns {Subscription} - Faye subscription object\n */\nStreaming.prototype.subscribe = function(name, listener) {\n var channelName = name.indexOf('/') === 0 ? name : '/topic/' + name;\n var fayeClient = this._getFayeClient(channelName);\n return fayeClient.subscribe(channelName, listener);\n};\n\n/**\n * Unsubscribe topic\n *\n * @param {String} name - Topic name\n * @param {Callback.} listener - Streaming message listener\n * @returns {Streaming}\n */\nStreaming.prototype.unsubscribe = function(name, listener) {\n var channelName = name.indexOf('/') === 0 ? name : '/topic/' + name;\n var fayeClient = this._getFayeClient(channelName);\n fayeClient.unsubscribe(channelName, listener);\n return this;\n};\n\n\n/**\n * Create a Streaming client, optionally with extensions\n *\n * See Faye docs for implementation details: https://faye.jcoglan.com/browser/extensions.html\n *\n * Example usage:\n * \n * ```javascript\n * // Establish a Salesforce connection. (Details elided)\n * const conn = new jsforce.Connection({ … });\n * \n * const fayeClient = conn.streaming.createClient();\n * \n * const subscription = fayeClient.subscribe(channel, data => {\n * console.log('topic received data', data);\n * });\n * \n * subscription.cancel();\n * ```\n * \n * Example with extensions, using Replay & Auth Failure extensions in a server-side Node.js app:\n * \n * ```javascript\n * // Establish a Salesforce connection. (Details elided)\n * const conn = new jsforce.Connection({ … });\n * \n * const channel = \"/event/My_Event__e\";\n * const replayId = -2; // -2 is all retained events\n * \n * const exitCallback = () => process.exit(1);\n * const authFailureExt = new jsforce.StreamingExtension.AuthFailure(exitCallback);\n * \n * const replayExt = new jsforce.StreamingExtension.Replay(channel, replayId);\n * \n * const fayeClient = conn.streaming.createClient([\n * authFailureExt,\n * replayExt\n * ]);\n * \n * const subscription = fayeClient.subscribe(channel, data => {\n * console.log('topic received data', data);\n * });\n * \n * subscription.cancel();\n * ```\n * \n * @param {Array} Extensions - Optional, extensions to apply to the Faye client\n * @returns {FayeClient} - Faye client object\n */\nStreaming.prototype.createClient = function(extensions) {\n return this._createClient(null, extensions);\n};\n\n/*--------------------------------------------*/\n/*\n * Register hook in connection instantiation for dynamically adding this API module features\n */\njsforce.on('connection:new', function(conn) {\n conn.streaming = new Streaming(conn);\n});\n\n/*\n * \n */\njsforce.StreamingExtension = StreamingExtension;\n\nmodule.exports = Streaming;\n\n},{\"./streaming-extension\":1,\"faye\":5}],3:[function(require,module,exports){\n\"use strict\";\n\n// rawAsap provides everything we need except exception management.\nvar rawAsap = require(\"./raw\");\n// RawTasks are recycled to reduce GC churn.\nvar freeTasks = [];\n// We queue errors to ensure they are thrown in right order (FIFO).\n// Array-as-queue is good enough here, since we are just dealing with exceptions.\nvar pendingErrors = [];\nvar requestErrorThrow = rawAsap.makeRequestCallFromTimer(throwFirstError);\n\nfunction throwFirstError() {\n if (pendingErrors.length) {\n throw pendingErrors.shift();\n }\n}\n\n/**\n * Calls a task as soon as possible after returning, in its own event, with priority\n * over other events like animation, reflow, and repaint. An error thrown from an\n * event will not interrupt, nor even substantially slow down the processing of\n * other events, but will be rather postponed to a lower priority event.\n * @param {{call}} task A callable object, typically a function that takes no\n * arguments.\n */\nmodule.exports = asap;\nfunction asap(task) {\n var rawTask;\n if (freeTasks.length) {\n rawTask = freeTasks.pop();\n } else {\n rawTask = new RawTask();\n }\n rawTask.task = task;\n rawAsap(rawTask);\n}\n\n// We wrap tasks with recyclable task objects. A task object implements\n// `call`, just like a function.\nfunction RawTask() {\n this.task = null;\n}\n\n// The sole purpose of wrapping the task is to catch the exception and recycle\n// the task object after its single use.\nRawTask.prototype.call = function () {\n try {\n this.task.call();\n } catch (error) {\n if (asap.onerror) {\n // This hook exists purely for testing purposes.\n // Its name will be periodically randomized to break any code that\n // depends on its existence.\n asap.onerror(error);\n } else {\n // In a web browser, exceptions are not fatal. However, to avoid\n // slowing down the queue of pending tasks, we rethrow the error in a\n // lower priority turn.\n pendingErrors.push(error);\n requestErrorThrow();\n }\n } finally {\n this.task = null;\n freeTasks[freeTasks.length] = this;\n }\n};\n\n},{\"./raw\":4}],4:[function(require,module,exports){\n(function (global){\n\"use strict\";\n\n// Use the fastest means possible to execute a task in its own turn, with\n// priority over other events including IO, animation, reflow, and redraw\n// events in browsers.\n//\n// An exception thrown by a task will permanently interrupt the processing of\n// subsequent tasks. The higher level `asap` function ensures that if an\n// exception is thrown by a task, that the task queue will continue flushing as\n// soon as possible, but if you use `rawAsap` directly, you are responsible to\n// either ensure that no exceptions are thrown from your task, or to manually\n// call `rawAsap.requestFlush` if an exception is thrown.\nmodule.exports = rawAsap;\nfunction rawAsap(task) {\n if (!queue.length) {\n requestFlush();\n flushing = true;\n }\n // Equivalent to push, but avoids a function call.\n queue[queue.length] = task;\n}\n\nvar queue = [];\n// Once a flush has been requested, no further calls to `requestFlush` are\n// necessary until the next `flush` completes.\nvar flushing = false;\n// `requestFlush` is an implementation-specific method that attempts to kick\n// off a `flush` event as quickly as possible. `flush` will attempt to exhaust\n// the event queue before yielding to the browser's own event loop.\nvar requestFlush;\n// The position of the next task to execute in the task queue. This is\n// preserved between calls to `flush` so that it can be resumed if\n// a task throws an exception.\nvar index = 0;\n// If a task schedules additional tasks recursively, the task queue can grow\n// unbounded. To prevent memory exhaustion, the task queue will periodically\n// truncate already-completed tasks.\nvar capacity = 1024;\n\n// The flush function processes all tasks that have been scheduled with\n// `rawAsap` unless and until one of those tasks throws an exception.\n// If a task throws an exception, `flush` ensures that its state will remain\n// consistent and will resume where it left off when called again.\n// However, `flush` does not make any arrangements to be called again if an\n// exception is thrown.\nfunction flush() {\n while (index < queue.length) {\n var currentIndex = index;\n // Advance the index before calling the task. This ensures that we will\n // begin flushing on the next task the task throws an error.\n index = index + 1;\n queue[currentIndex].call();\n // Prevent leaking memory for long chains of recursive calls to `asap`.\n // If we call `asap` within tasks scheduled by `asap`, the queue will\n // grow, but to avoid an O(n) walk for every task we execute, we don't\n // shift tasks off the queue after they have been executed.\n // Instead, we periodically shift 1024 tasks off the queue.\n if (index > capacity) {\n // Manually shift all values starting at the index back to the\n // beginning of the queue.\n for (var scan = 0, newLength = queue.length - index; scan < newLength; scan++) {\n queue[scan] = queue[scan + index];\n }\n queue.length -= index;\n index = 0;\n }\n }\n queue.length = 0;\n index = 0;\n flushing = false;\n}\n\n// `requestFlush` is implemented using a strategy based on data collected from\n// every available SauceLabs Selenium web driver worker at time of writing.\n// https://docs.google.com/spreadsheets/d/1mG-5UYGup5qxGdEMWkhP6BWCz053NUb2E1QoUTU16uA/edit#gid=783724593\n\n// Safari 6 and 6.1 for desktop, iPad, and iPhone are the only browsers that\n// have WebKitMutationObserver but not un-prefixed MutationObserver.\n// Must use `global` or `self` instead of `window` to work in both frames and web\n// workers. `global` is a provision of Browserify, Mr, Mrs, or Mop.\n\n/* globals self */\nvar scope = typeof global !== \"undefined\" ? global : self;\nvar BrowserMutationObserver = scope.MutationObserver || scope.WebKitMutationObserver;\n\n// MutationObservers are desirable because they have high priority and work\n// reliably everywhere they are implemented.\n// They are implemented in all modern browsers.\n//\n// - Android 4-4.3\n// - Chrome 26-34\n// - Firefox 14-29\n// - Internet Explorer 11\n// - iPad Safari 6-7.1\n// - iPhone Safari 7-7.1\n// - Safari 6-7\nif (typeof BrowserMutationObserver === \"function\") {\n requestFlush = makeRequestCallFromMutationObserver(flush);\n\n// MessageChannels are desirable because they give direct access to the HTML\n// task queue, are implemented in Internet Explorer 10, Safari 5.0-1, and Opera\n// 11-12, and in web workers in many engines.\n// Although message channels yield to any queued rendering and IO tasks, they\n// would be better than imposing the 4ms delay of timers.\n// However, they do not work reliably in Internet Explorer or Safari.\n\n// Internet Explorer 10 is the only browser that has setImmediate but does\n// not have MutationObservers.\n// Although setImmediate yields to the browser's renderer, it would be\n// preferrable to falling back to setTimeout since it does not have\n// the minimum 4ms penalty.\n// Unfortunately there appears to be a bug in Internet Explorer 10 Mobile (and\n// Desktop to a lesser extent) that renders both setImmediate and\n// MessageChannel useless for the purposes of ASAP.\n// https://github.com/kriskowal/q/issues/396\n\n// Timers are implemented universally.\n// We fall back to timers in workers in most engines, and in foreground\n// contexts in the following browsers.\n// However, note that even this simple case requires nuances to operate in a\n// broad spectrum of browsers.\n//\n// - Firefox 3-13\n// - Internet Explorer 6-9\n// - iPad Safari 4.3\n// - Lynx 2.8.7\n} else {\n requestFlush = makeRequestCallFromTimer(flush);\n}\n\n// `requestFlush` requests that the high priority event queue be flushed as\n// soon as possible.\n// This is useful to prevent an error thrown in a task from stalling the event\n// queue if the exception handled by Node.js’s\n// `process.on(\"uncaughtException\")` or by a domain.\nrawAsap.requestFlush = requestFlush;\n\n// To request a high priority event, we induce a mutation observer by toggling\n// the text of a text node between \"1\" and \"-1\".\nfunction makeRequestCallFromMutationObserver(callback) {\n var toggle = 1;\n var observer = new BrowserMutationObserver(callback);\n var node = document.createTextNode(\"\");\n observer.observe(node, {characterData: true});\n return function requestCall() {\n toggle = -toggle;\n node.data = toggle;\n };\n}\n\n// The message channel technique was discovered by Malte Ubl and was the\n// original foundation for this library.\n// http://www.nonblocking.io/2011/06/windownexttick.html\n\n// Safari 6.0.5 (at least) intermittently fails to create message ports on a\n// page's first load. Thankfully, this version of Safari supports\n// MutationObservers, so we don't need to fall back in that case.\n\n// function makeRequestCallFromMessageChannel(callback) {\n// var channel = new MessageChannel();\n// channel.port1.onmessage = callback;\n// return function requestCall() {\n// channel.port2.postMessage(0);\n// };\n// }\n\n// For reasons explained above, we are also unable to use `setImmediate`\n// under any circumstances.\n// Even if we were, there is another bug in Internet Explorer 10.\n// It is not sufficient to assign `setImmediate` to `requestFlush` because\n// `setImmediate` must be called *by name* and therefore must be wrapped in a\n// closure.\n// Never forget.\n\n// function makeRequestCallFromSetImmediate(callback) {\n// return function requestCall() {\n// setImmediate(callback);\n// };\n// }\n\n// Safari 6.0 has a problem where timers will get lost while the user is\n// scrolling. This problem does not impact ASAP because Safari 6.0 supports\n// mutation observers, so that implementation is used instead.\n// However, if we ever elect to use timers in Safari, the prevalent work-around\n// is to add a scroll event listener that calls for a flush.\n\n// `setTimeout` does not call the passed callback if the delay is less than\n// approximately 7 in web workers in Firefox 8 through 18, and sometimes not\n// even then.\n\nfunction makeRequestCallFromTimer(callback) {\n return function requestCall() {\n // We dispatch a timeout with a specified delay of 0 for engines that\n // can reliably accommodate that request. This will usually be snapped\n // to a 4 milisecond delay, but once we're flushing, there's no delay\n // between events.\n var timeoutHandle = setTimeout(handleTimer, 0);\n // However, since this timer gets frequently dropped in Firefox\n // workers, we enlist an interval handle that will try to fire\n // an event 20 times per second until it succeeds.\n var intervalHandle = setInterval(handleTimer, 50);\n\n function handleTimer() {\n // Whichever timer succeeds will cancel both timers and\n // execute the callback.\n clearTimeout(timeoutHandle);\n clearInterval(intervalHandle);\n callback();\n }\n };\n}\n\n// This is for `asap.js` only.\n// Its name will be periodically randomized to break any code that depends on\n// its existence.\nrawAsap.makeRequestCallFromTimer = makeRequestCallFromTimer;\n\n// ASAP was originally a nextTick shim included in Q. This was factored out\n// into this ASAP package. It was later adapted to RSVP which made further\n// amendments. These decisions, particularly to marginalize MessageChannel and\n// to capture the MutationObserver implementation in a closure, were integrated\n// back into ASAP proper.\n// https://github.com/tildeio/rsvp.js/blob/cddf7232546a9cf858524b75cde6f9edf72620a7/lib/rsvp/asap.js\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n\n},{}],5:[function(require,module,exports){\n'use strict';\n\nvar constants = require('./util/constants'),\n Logging = require('./mixins/logging');\n\nvar Faye = {\n VERSION: constants.VERSION,\n\n Client: require('./protocol/client'),\n Scheduler: require('./protocol/scheduler')\n};\n\nLogging.wrapper = Faye;\n\nmodule.exports = Faye;\n\n},{\"./mixins/logging\":7,\"./protocol/client\":11,\"./protocol/scheduler\":17,\"./util/constants\":29}],6:[function(require,module,exports){\n(function (global){\n'use strict';\n\nvar Promise = require('../util/promise');\n\nmodule.exports = {\n then: function(callback, errback) {\n var self = this;\n if (!this._promise)\n this._promise = new Promise(function(resolve, reject) {\n self._resolve = resolve;\n self._reject = reject;\n });\n\n if (arguments.length === 0)\n return this._promise;\n else\n return this._promise.then(callback, errback);\n },\n\n callback: function(callback, context) {\n return this.then(function(value) { callback.call(context, value) });\n },\n\n errback: function(callback, context) {\n return this.then(null, function(reason) { callback.call(context, reason) });\n },\n\n timeout: function(seconds, message) {\n this.then();\n var self = this;\n this._timer = global.setTimeout(function() {\n self._reject(message);\n }, seconds * 1000);\n },\n\n setDeferredStatus: function(status, value) {\n if (this._timer) global.clearTimeout(this._timer);\n\n this.then();\n\n if (status === 'succeeded')\n this._resolve(value);\n else if (status === 'failed')\n this._reject(value);\n else\n delete this._promise;\n }\n};\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n\n},{\"../util/promise\":34}],7:[function(require,module,exports){\n'use strict';\n\nvar toJSON = require('../util/to_json');\n\nvar Logging = {\n LOG_LEVELS: {\n fatal: 4,\n error: 3,\n warn: 2,\n info: 1,\n debug: 0\n },\n\n writeLog: function(messageArgs, level) {\n var logger = Logging.logger || (Logging.wrapper || Logging).logger;\n if (!logger) return;\n\n var args = Array.prototype.slice.apply(messageArgs),\n banner = '[Faye',\n klass = this.className,\n\n message = args.shift().replace(/\\?/g, function() {\n try {\n return toJSON(args.shift());\n } catch (error) {\n return '[Object]';\n }\n });\n\n if (klass) banner += '.' + klass;\n banner += '] ';\n\n if (typeof logger[level] === 'function')\n logger[level](banner + message);\n else if (typeof logger === 'function')\n logger(banner + message);\n }\n};\n\nfor (var key in Logging.LOG_LEVELS)\n (function(level) {\n Logging[level] = function() {\n this.writeLog(arguments, level);\n };\n })(key);\n\nmodule.exports = Logging;\n\n},{\"../util/to_json\":36}],8:[function(require,module,exports){\n'use strict';\n\nvar extend = require('../util/extend'),\n EventEmitter = require('../util/event_emitter');\n\nvar Publisher = {\n countListeners: function(eventType) {\n return this.listeners(eventType).length;\n },\n\n bind: function(eventType, listener, context) {\n var slice = Array.prototype.slice,\n handler = function() { listener.apply(context, slice.call(arguments)) };\n\n this._listeners = this._listeners || [];\n this._listeners.push([eventType, listener, context, handler]);\n return this.on(eventType, handler);\n },\n\n unbind: function(eventType, listener, context) {\n this._listeners = this._listeners || [];\n var n = this._listeners.length, tuple;\n\n while (n--) {\n tuple = this._listeners[n];\n if (tuple[0] !== eventType) continue;\n if (listener && (tuple[1] !== listener || tuple[2] !== context)) continue;\n this._listeners.splice(n, 1);\n this.removeListener(eventType, tuple[3]);\n }\n }\n};\n\nextend(Publisher, EventEmitter.prototype);\nPublisher.trigger = Publisher.emit;\n\nmodule.exports = Publisher;\n\n},{\"../util/event_emitter\":32,\"../util/extend\":33}],9:[function(require,module,exports){\n(function (global){\n'use strict';\n\nmodule.exports = {\n addTimeout: function(name, delay, callback, context) {\n this._timeouts = this._timeouts || {};\n if (this._timeouts.hasOwnProperty(name)) return;\n var self = this;\n this._timeouts[name] = global.setTimeout(function() {\n delete self._timeouts[name];\n callback.call(context);\n }, 1000 * delay);\n },\n\n removeTimeout: function(name) {\n this._timeouts = this._timeouts || {};\n var timeout = this._timeouts[name];\n if (!timeout) return;\n global.clearTimeout(timeout);\n delete this._timeouts[name];\n },\n\n removeAllTimeouts: function() {\n this._timeouts = this._timeouts || {};\n for (var name in this._timeouts) this.removeTimeout(name);\n }\n};\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n\n},{}],10:[function(require,module,exports){\n'use strict';\n\nvar Class = require('../util/class'),\n extend = require('../util/extend'),\n Publisher = require('../mixins/publisher'),\n Grammar = require('./grammar');\n\nvar Channel = Class({\n initialize: function(name) {\n this.id = this.name = name;\n },\n\n push: function(message) {\n this.trigger('message', message);\n },\n\n isUnused: function() {\n return this.countListeners('message') === 0;\n }\n});\n\nextend(Channel.prototype, Publisher);\n\nextend(Channel, {\n HANDSHAKE: '/meta/handshake',\n CONNECT: '/meta/connect',\n SUBSCRIBE: '/meta/subscribe',\n UNSUBSCRIBE: '/meta/unsubscribe',\n DISCONNECT: '/meta/disconnect',\n\n META: 'meta',\n SERVICE: 'service',\n\n expand: function(name) {\n var segments = this.parse(name),\n channels = ['/**', name];\n\n var copy = segments.slice();\n copy[copy.length - 1] = '*';\n channels.push(this.unparse(copy));\n\n for (var i = 1, n = segments.length; i < n; i++) {\n copy = segments.slice(0, i);\n copy.push('**');\n channels.push(this.unparse(copy));\n }\n\n return channels;\n },\n\n isValid: function(name) {\n return Grammar.CHANNEL_NAME.test(name) ||\n Grammar.CHANNEL_PATTERN.test(name);\n },\n\n parse: function(name) {\n if (!this.isValid(name)) return null;\n return name.split('/').slice(1);\n },\n\n unparse: function(segments) {\n return '/' + segments.join('/');\n },\n\n isMeta: function(name) {\n var segments = this.parse(name);\n return segments ? (segments[0] === this.META) : null;\n },\n\n isService: function(name) {\n var segments = this.parse(name);\n return segments ? (segments[0] === this.SERVICE) : null;\n },\n\n isSubscribable: function(name) {\n if (!this.isValid(name)) return null;\n return !this.isMeta(name) && !this.isService(name);\n },\n\n Set: Class({\n initialize: function() {\n this._channels = {};\n },\n\n getKeys: function() {\n var keys = [];\n for (var key in this._channels) keys.push(key);\n return keys;\n },\n\n remove: function(name) {\n delete this._channels[name];\n },\n\n hasSubscription: function(name) {\n return this._channels.hasOwnProperty(name);\n },\n\n subscribe: function(names, subscription) {\n var name;\n for (var i = 0, n = names.length; i < n; i++) {\n name = names[i];\n var channel = this._channels[name] = this._channels[name] || new Channel(name);\n channel.bind('message', subscription);\n }\n },\n\n unsubscribe: function(name, subscription) {\n var channel = this._channels[name];\n if (!channel) return false;\n channel.unbind('message', subscription);\n\n if (channel.isUnused()) {\n this.remove(name);\n return true;\n } else {\n return false;\n }\n },\n\n distributeMessage: function(message) {\n var channels = Channel.expand(message.channel);\n\n for (var i = 0, n = channels.length; i < n; i++) {\n var channel = this._channels[channels[i]];\n if (channel) channel.trigger('message', message);\n }\n }\n })\n});\n\nmodule.exports = Channel;\n\n},{\"../mixins/publisher\":8,\"../util/class\":28,\"../util/extend\":33,\"./grammar\":15}],11:[function(require,module,exports){\n(function (global){\n'use strict';\n\nvar asap = require('asap'),\n Class = require('../util/class'),\n Promise = require('../util/promise'),\n URI = require('../util/uri'),\n array = require('../util/array'),\n browser = require('../util/browser'),\n constants = require('../util/constants'),\n extend = require('../util/extend'),\n validateOptions = require('../util/validate_options'),\n Deferrable = require('../mixins/deferrable'),\n Logging = require('../mixins/logging'),\n Publisher = require('../mixins/publisher'),\n Channel = require('./channel'),\n Dispatcher = require('./dispatcher'),\n Error = require('./error'),\n Extensible = require('./extensible'),\n Publication = require('./publication'),\n Subscription = require('./subscription');\n\nvar Client = Class({ className: 'Client',\n UNCONNECTED: 1,\n CONNECTING: 2,\n CONNECTED: 3,\n DISCONNECTED: 4,\n\n HANDSHAKE: 'handshake',\n RETRY: 'retry',\n NONE: 'none',\n\n CONNECTION_TIMEOUT: 60,\n\n DEFAULT_ENDPOINT: '/bayeux',\n INTERVAL: 0,\n\n initialize: function(endpoint, options) {\n this.info('New client created for ?', endpoint);\n options = options || {};\n\n validateOptions(options, ['interval', 'timeout', 'endpoints', 'proxy', 'retry', 'scheduler', 'websocketExtensions', 'tls', 'ca']);\n\n this._channels = new Channel.Set();\n this._dispatcher = Dispatcher.create(this, endpoint || this.DEFAULT_ENDPOINT, options);\n\n this._messageId = 0;\n this._state = this.UNCONNECTED;\n\n this._responseCallbacks = {};\n\n this._advice = {\n reconnect: this.RETRY,\n interval: 1000 * (options.interval || this.INTERVAL),\n timeout: 1000 * (options.timeout || this.CONNECTION_TIMEOUT)\n };\n this._dispatcher.timeout = this._advice.timeout / 1000;\n\n this._dispatcher.bind('message', this._receiveMessage, this);\n\n if (browser.Event && global.onbeforeunload !== undefined)\n browser.Event.on(global, 'beforeunload', function() {\n if (array.indexOf(this._dispatcher._disabled, 'autodisconnect') < 0)\n this.disconnect();\n }, this);\n },\n\n addWebsocketExtension: function(extension) {\n return this._dispatcher.addWebsocketExtension(extension);\n },\n\n disable: function(feature) {\n return this._dispatcher.disable(feature);\n },\n\n setHeader: function(name, value) {\n return this._dispatcher.setHeader(name, value);\n },\n\n // Request\n // MUST include: * channel\n // * version\n // * supportedConnectionTypes\n // MAY include: * minimumVersion\n // * ext\n // * id\n //\n // Success Response Failed Response\n // MUST include: * channel MUST include: * channel\n // * version * successful\n // * supportedConnectionTypes * error\n // * clientId MAY include: * supportedConnectionTypes\n // * successful * advice\n // MAY include: * minimumVersion * version\n // * advice * minimumVersion\n // * ext * ext\n // * id * id\n // * authSuccessful\n handshake: function(callback, context) {\n if (this._advice.reconnect === this.NONE) return;\n if (this._state !== this.UNCONNECTED) return;\n\n this._state = this.CONNECTING;\n var self = this;\n\n this.info('Initiating handshake with ?', URI.stringify(this._dispatcher.endpoint));\n this._dispatcher.selectTransport(constants.MANDATORY_CONNECTION_TYPES);\n\n this._sendMessage({\n channel: Channel.HANDSHAKE,\n version: constants.BAYEUX_VERSION,\n supportedConnectionTypes: this._dispatcher.getConnectionTypes()\n\n }, {}, function(response) {\n\n if (response.successful) {\n this._state = this.CONNECTED;\n this._dispatcher.clientId = response.clientId;\n\n this._dispatcher.selectTransport(response.supportedConnectionTypes);\n\n this.info('Handshake successful: ?', this._dispatcher.clientId);\n\n this.subscribe(this._channels.getKeys(), true);\n if (callback) asap(function() { callback.call(context) });\n\n } else {\n this.info('Handshake unsuccessful');\n global.setTimeout(function() { self.handshake(callback, context) }, this._dispatcher.retry * 1000);\n this._state = this.UNCONNECTED;\n }\n }, this);\n },\n\n // Request Response\n // MUST include: * channel MUST include: * channel\n // * clientId * successful\n // * connectionType * clientId\n // MAY include: * ext MAY include: * error\n // * id * advice\n // * ext\n // * id\n // * timestamp\n connect: function(callback, context) {\n if (this._advice.reconnect === this.NONE) return;\n if (this._state === this.DISCONNECTED) return;\n\n if (this._state === this.UNCONNECTED)\n return this.handshake(function() { this.connect(callback, context) }, this);\n\n this.callback(callback, context);\n if (this._state !== this.CONNECTED) return;\n\n this.info('Calling deferred actions for ?', this._dispatcher.clientId);\n this.setDeferredStatus('succeeded');\n this.setDeferredStatus('unknown');\n\n if (this._connectRequest) return;\n this._connectRequest = true;\n\n this.info('Initiating connection for ?', this._dispatcher.clientId);\n\n this._sendMessage({\n channel: Channel.CONNECT,\n clientId: this._dispatcher.clientId,\n connectionType: this._dispatcher.connectionType\n\n }, {}, this._cycleConnection, this);\n },\n\n // Request Response\n // MUST include: * channel MUST include: * channel\n // * clientId * successful\n // MAY include: * ext * clientId\n // * id MAY include: * error\n // * ext\n // * id\n disconnect: function() {\n if (this._state !== this.CONNECTED) return;\n this._state = this.DISCONNECTED;\n\n this.info('Disconnecting ?', this._dispatcher.clientId);\n var promise = new Publication();\n\n this._sendMessage({\n channel: Channel.DISCONNECT,\n clientId: this._dispatcher.clientId\n\n }, {}, function(response) {\n if (response.successful) {\n this._dispatcher.close();\n promise.setDeferredStatus('succeeded');\n } else {\n promise.setDeferredStatus('failed', Error.parse(response.error));\n }\n }, this);\n\n this.info('Clearing channel listeners for ?', this._dispatcher.clientId);\n this._channels = new Channel.Set();\n\n return promise;\n },\n\n // Request Response\n // MUST include: * channel MUST include: * channel\n // * clientId * successful\n // * subscription * clientId\n // MAY include: * ext * subscription\n // * id MAY include: * error\n // * advice\n // * ext\n // * id\n // * timestamp\n subscribe: function(channel, callback, context) {\n if (channel instanceof Array)\n return array.map(channel, function(c) {\n return this.subscribe(c, callback, context);\n }, this);\n\n var subscription = new Subscription(this, channel, callback, context),\n force = (callback === true),\n hasSubscribe = this._channels.hasSubscription(channel);\n\n if (hasSubscribe && !force) {\n this._channels.subscribe([channel], subscription);\n subscription.setDeferredStatus('succeeded');\n return subscription;\n }\n\n this.connect(function() {\n this.info('Client ? attempting to subscribe to ?', this._dispatcher.clientId, channel);\n if (!force) this._channels.subscribe([channel], subscription);\n\n this._sendMessage({\n channel: Channel.SUBSCRIBE,\n clientId: this._dispatcher.clientId,\n subscription: channel\n\n }, {}, function(response) {\n if (!response.successful) {\n subscription.setDeferredStatus('failed', Error.parse(response.error));\n return this._channels.unsubscribe(channel, subscription);\n }\n\n var channels = [].concat(response.subscription);\n this.info('Subscription acknowledged for ? to ?', this._dispatcher.clientId, channels);\n subscription.setDeferredStatus('succeeded');\n }, this);\n }, this);\n\n return subscription;\n },\n\n // Request Response\n // MUST include: * channel MUST include: * channel\n // * clientId * successful\n // * subscription * clientId\n // MAY include: * ext * subscription\n // * id MAY include: * error\n // * advice\n // * ext\n // * id\n // * timestamp\n unsubscribe: function(channel, subscription) {\n if (channel instanceof Array)\n return array.map(channel, function(c) {\n return this.unsubscribe(c, subscription);\n }, this);\n\n var dead = this._channels.unsubscribe(channel, subscription);\n if (!dead) return;\n\n this.connect(function() {\n this.info('Client ? attempting to unsubscribe from ?', this._dispatcher.clientId, channel);\n\n this._sendMessage({\n channel: Channel.UNSUBSCRIBE,\n clientId: this._dispatcher.clientId,\n subscription: channel\n\n }, {}, function(response) {\n if (!response.successful) return;\n\n var channels = [].concat(response.subscription);\n this.info('Unsubscription acknowledged for ? from ?', this._dispatcher.clientId, channels);\n }, this);\n }, this);\n },\n\n // Request Response\n // MUST include: * channel MUST include: * channel\n // * data * successful\n // MAY include: * clientId MAY include: * id\n // * id * error\n // * ext * ext\n publish: function(channel, data, options) {\n validateOptions(options || {}, ['attempts', 'deadline']);\n var publication = new Publication();\n\n this.connect(function() {\n this.info('Client ? queueing published message to ?: ?', this._dispatcher.clientId, channel, data);\n\n this._sendMessage({\n channel: channel,\n data: data,\n clientId: this._dispatcher.clientId\n\n }, options, function(response) {\n if (response.successful)\n publication.setDeferredStatus('succeeded');\n else\n publication.setDeferredStatus('failed', Error.parse(response.error));\n }, this);\n }, this);\n\n return publication;\n },\n\n _sendMessage: function(message, options, callback, context) {\n message.id = this._generateMessageId();\n\n var timeout = this._advice.timeout\n ? 1.2 * this._advice.timeout / 1000\n : 1.2 * this._dispatcher.retry;\n\n this.pipeThroughExtensions('outgoing', message, null, function(message) {\n if (!message) return;\n if (callback) this._responseCallbacks[message.id] = [callback, context];\n this._dispatcher.sendMessage(message, timeout, options || {});\n }, this);\n },\n\n _generateMessageId: function() {\n this._messageId += 1;\n if (this._messageId >= Math.pow(2,32)) this._messageId = 0;\n return this._messageId.toString(36);\n },\n\n _receiveMessage: function(message) {\n var id = message.id, callback;\n\n if (message.successful !== undefined) {\n callback = this._responseCallbacks[id];\n delete this._responseCallbacks[id];\n }\n\n this.pipeThroughExtensions('incoming', message, null, function(message) {\n if (!message) return;\n if (message.advice) this._handleAdvice(message.advice);\n this._deliverMessage(message);\n if (callback) callback[0].call(callback[1], message);\n }, this);\n },\n\n _handleAdvice: function(advice) {\n extend(this._advice, advice);\n this._dispatcher.timeout = this._advice.timeout / 1000;\n\n if (this._advice.reconnect === this.HANDSHAKE && this._state !== this.DISCONNECTED) {\n this._state = this.UNCONNECTED;\n this._dispatcher.clientId = null;\n this._cycleConnection();\n }\n },\n\n _deliverMessage: function(message) {\n if (!message.channel || message.data === undefined) return;\n this.info('Client ? calling listeners for ? with ?', this._dispatcher.clientId, message.channel, message.data);\n this._channels.distributeMessage(message);\n },\n\n _cycleConnection: function() {\n if (this._connectRequest) {\n this._connectRequest = null;\n this.info('Closed connection for ?', this._dispatcher.clientId);\n }\n var self = this;\n global.setTimeout(function() { self.connect() }, this._advice.interval);\n }\n});\n\nextend(Client.prototype, Deferrable);\nextend(Client.prototype, Publisher);\nextend(Client.prototype, Logging);\nextend(Client.prototype, Extensible);\n\nmodule.exports = Client;\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n\n},{\"../mixins/deferrable\":6,\"../mixins/logging\":7,\"../mixins/publisher\":8,\"../util/array\":26,\"../util/browser\":27,\"../util/class\":28,\"../util/constants\":29,\"../util/extend\":33,\"../util/promise\":34,\"../util/uri\":37,\"../util/validate_options\":38,\"./channel\":10,\"./dispatcher\":12,\"./error\":13,\"./extensible\":14,\"./publication\":16,\"./subscription\":18,\"asap\":3}],12:[function(require,module,exports){\n(function (global){\n'use strict';\n\nvar Class = require('../util/class'),\n URI = require('../util/uri'),\n cookies = require('../util/cookies'),\n extend = require('../util/extend'),\n Logging = require('../mixins/logging'),\n Publisher = require('../mixins/publisher'),\n Transport = require('../transport'),\n Scheduler = require('./scheduler');\n\nvar Dispatcher = Class({ className: 'Dispatcher',\n MAX_REQUEST_SIZE: 2048,\n DEFAULT_RETRY: 5,\n\n UP: 1,\n DOWN: 2,\n\n initialize: function(client, endpoint, options) {\n this._client = client;\n this.endpoint = URI.parse(endpoint);\n this._alternates = options.endpoints || {};\n\n this.cookies = cookies.CookieJar && new cookies.CookieJar();\n this._disabled = [];\n this._envelopes = {};\n this.headers = {};\n this.retry = options.retry || this.DEFAULT_RETRY;\n this._scheduler = options.scheduler || Scheduler;\n this._state = 0;\n this.transports = {};\n this.wsExtensions = [];\n\n this.proxy = options.proxy || {};\n if (typeof this._proxy === 'string') this._proxy = {origin: this._proxy};\n\n var exts = options.websocketExtensions;\n if (exts) {\n exts = [].concat(exts);\n for (var i = 0, n = exts.length; i < n; i++)\n this.addWebsocketExtension(exts[i]);\n }\n\n this.tls = options.tls || {};\n this.tls.ca = this.tls.ca || options.ca;\n\n for (var type in this._alternates)\n this._alternates[type] = URI.parse(this._alternates[type]);\n\n this.maxRequestSize = this.MAX_REQUEST_SIZE;\n },\n\n endpointFor: function(connectionType) {\n return this._alternates[connectionType] || this.endpoint;\n },\n\n addWebsocketExtension: function(extension) {\n this.wsExtensions.push(extension);\n },\n\n disable: function(feature) {\n this._disabled.push(feature);\n },\n\n setHeader: function(name, value) {\n this.headers[name] = value;\n },\n\n close: function() {\n var transport = this._transport;\n delete this._transport;\n if (transport) transport.close();\n },\n\n getConnectionTypes: function() {\n return Transport.getConnectionTypes();\n },\n\n selectTransport: function(transportTypes) {\n Transport.get(this, transportTypes, this._disabled, function(transport) {\n this.debug('Selected ? transport for ?', transport.connectionType, URI.stringify(transport.endpoint));\n\n if (transport === this._transport) return;\n if (this._transport) this._transport.close();\n\n this._transport = transport;\n this.connectionType = transport.connectionType;\n }, this);\n },\n\n sendMessage: function(message, timeout, options) {\n options = options || {};\n\n var id = message.id,\n attempts = options.attempts,\n deadline = options.deadline && new Date().getTime() + (options.deadline * 1000),\n envelope = this._envelopes[id],\n scheduler;\n\n if (!envelope) {\n scheduler = new this._scheduler(message, {timeout: timeout, interval: this.retry, attempts: attempts, deadline: deadline});\n envelope = this._envelopes[id] = {message: message, scheduler: scheduler};\n }\n\n this._sendEnvelope(envelope);\n },\n\n _sendEnvelope: function(envelope) {\n if (!this._transport) return;\n if (envelope.request || envelope.timer) return;\n\n var message = envelope.message,\n scheduler = envelope.scheduler,\n self = this;\n\n if (!scheduler.isDeliverable()) {\n scheduler.abort();\n delete this._envelopes[message.id];\n return;\n }\n\n envelope.timer = global.setTimeout(function() {\n self.handleError(message);\n }, scheduler.getTimeout() * 1000);\n\n scheduler.send();\n envelope.request = this._transport.sendMessage(message);\n },\n\n handleResponse: function(reply) {\n var envelope = this._envelopes[reply.id];\n\n if (reply.successful !== undefined && envelope) {\n envelope.scheduler.succeed();\n delete this._envelopes[reply.id];\n global.clearTimeout(envelope.timer);\n }\n\n this.trigger('message', reply);\n\n if (this._state === this.UP) return;\n this._state = this.UP;\n this._client.trigger('transport:up');\n },\n\n handleError: function(message, immediate) {\n var envelope = this._envelopes[message.id],\n request = envelope && envelope.request,\n self = this;\n\n if (!request) return;\n\n request.then(function(req) {\n if (req && req.abort) req.abort();\n });\n\n var scheduler = envelope.scheduler;\n scheduler.fail();\n\n global.clearTimeout(envelope.timer);\n envelope.request = envelope.timer = null;\n\n if (immediate) {\n this._sendEnvelope(envelope);\n } else {\n envelope.timer = global.setTimeout(function() {\n envelope.timer = null;\n self._sendEnvelope(envelope);\n }, scheduler.getInterval() * 1000);\n }\n\n if (this._state === this.DOWN) return;\n this._state = this.DOWN;\n this._client.trigger('transport:down');\n }\n});\n\nDispatcher.create = function(client, endpoint, options) {\n return new Dispatcher(client, endpoint, options);\n};\n\nextend(Dispatcher.prototype, Publisher);\nextend(Dispatcher.prototype, Logging);\n\nmodule.exports = Dispatcher;\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n\n},{\"../mixins/logging\":7,\"../mixins/publisher\":8,\"../transport\":19,\"../util/class\":28,\"../util/cookies\":30,\"../util/extend\":33,\"../util/uri\":37,\"./scheduler\":17}],13:[function(require,module,exports){\n'use strict';\n\nvar Class = require('../util/class'),\n Grammar = require('./grammar');\n\nvar Error = Class({\n initialize: function(code, params, message) {\n this.code = code;\n this.params = Array.prototype.slice.call(params);\n this.message = message;\n },\n\n toString: function() {\n return this.code + ':' +\n this.params.join(',') + ':' +\n this.message;\n }\n});\n\nError.parse = function(message) {\n message = message || '';\n if (!Grammar.ERROR.test(message)) return new Error(null, [], message);\n\n var parts = message.split(':'),\n code = parseInt(parts[0]),\n params = parts[1].split(','),\n message = parts[2];\n\n return new Error(code, params, message);\n};\n\n// http://code.google.com/p/cometd/wiki/BayeuxCodes\nvar errors = {\n versionMismatch: [300, 'Version mismatch'],\n conntypeMismatch: [301, 'Connection types not supported'],\n extMismatch: [302, 'Extension mismatch'],\n badRequest: [400, 'Bad request'],\n clientUnknown: [401, 'Unknown client'],\n parameterMissing: [402, 'Missing required parameter'],\n channelForbidden: [403, 'Forbidden channel'],\n channelUnknown: [404, 'Unknown channel'],\n channelInvalid: [405, 'Invalid channel'],\n extUnknown: [406, 'Unknown extension'],\n publishFailed: [407, 'Failed to publish'],\n serverError: [500, 'Internal server error']\n};\n\nfor (var name in errors)\n (function(name) {\n Error[name] = function() {\n return new Error(errors[name][0], arguments, errors[name][1]).toString();\n };\n })(name);\n\nmodule.exports = Error;\n\n},{\"../util/class\":28,\"./grammar\":15}],14:[function(require,module,exports){\n'use strict';\n\nvar extend = require('../util/extend'),\n Logging = require('../mixins/logging');\n\nvar Extensible = {\n addExtension: function(extension) {\n this._extensions = this._extensions || [];\n this._extensions.push(extension);\n if (extension.added) extension.added(this);\n },\n\n removeExtension: function(extension) {\n if (!this._extensions) return;\n var i = this._extensions.length;\n while (i--) {\n if (this._extensions[i] !== extension) continue;\n this._extensions.splice(i,1);\n if (extension.removed) extension.removed(this);\n }\n },\n\n pipeThroughExtensions: function(stage, message, request, callback, context) {\n this.debug('Passing through ? extensions: ?', stage, message);\n\n if (!this._extensions) return callback.call(context, message);\n var extensions = this._extensions.slice();\n\n var pipe = function(message) {\n if (!message) return callback.call(context, message);\n\n var extension = extensions.shift();\n if (!extension) return callback.call(context, message);\n\n var fn = extension[stage];\n if (!fn) return pipe(message);\n\n if (fn.length >= 3) extension[stage](message, request, pipe);\n else extension[stage](message, pipe);\n };\n pipe(message);\n }\n};\n\nextend(Extensible, Logging);\n\nmodule.exports = Extensible;\n\n},{\"../mixins/logging\":7,\"../util/extend\":33}],15:[function(require,module,exports){\n'use strict';\n\nmodule.exports = {\n CHANNEL_NAME: /^\\/(((([a-z]|[A-Z])|[0-9])|(\\-|\\_|\\!|\\~|\\(|\\)|\\$|\\@)))+(\\/(((([a-z]|[A-Z])|[0-9])|(\\-|\\_|\\!|\\~|\\(|\\)|\\$|\\@)))+)*$/,\n CHANNEL_PATTERN: /^(\\/(((([a-z]|[A-Z])|[0-9])|(\\-|\\_|\\!|\\~|\\(|\\)|\\$|\\@)))+)*\\/\\*{1,2}$/,\n ERROR: /^([0-9][0-9][0-9]:(((([a-z]|[A-Z])|[0-9])|(\\-|\\_|\\!|\\~|\\(|\\)|\\$|\\@)| |\\/|\\*|\\.))*(,(((([a-z]|[A-Z])|[0-9])|(\\-|\\_|\\!|\\~|\\(|\\)|\\$|\\@)| |\\/|\\*|\\.))*)*:(((([a-z]|[A-Z])|[0-9])|(\\-|\\_|\\!|\\~|\\(|\\)|\\$|\\@)| |\\/|\\*|\\.))*|[0-9][0-9][0-9]::(((([a-z]|[A-Z])|[0-9])|(\\-|\\_|\\!|\\~|\\(|\\)|\\$|\\@)| |\\/|\\*|\\.))*)$/,\n VERSION: /^([0-9])+(\\.(([a-z]|[A-Z])|[0-9])(((([a-z]|[A-Z])|[0-9])|\\-|\\_))*)*$/\n};\n\n},{}],16:[function(require,module,exports){\n'use strict';\n\nvar Class = require('../util/class'),\n Deferrable = require('../mixins/deferrable');\n\nmodule.exports = Class(Deferrable);\n\n},{\"../mixins/deferrable\":6,\"../util/class\":28}],17:[function(require,module,exports){\n'use strict';\n\nvar extend = require('../util/extend');\n\nvar Scheduler = function(message, options) {\n this.message = message;\n this.options = options;\n this.attempts = 0;\n};\n\nextend(Scheduler.prototype, {\n getTimeout: function() {\n return this.options.timeout;\n },\n\n getInterval: function() {\n return this.options.interval;\n },\n\n isDeliverable: function() {\n var attempts = this.options.attempts,\n made = this.attempts,\n deadline = this.options.deadline,\n now = new Date().getTime();\n\n if (attempts !== undefined && made >= attempts)\n return false;\n\n if (deadline !== undefined && now > deadline)\n return false;\n\n return true;\n },\n\n send: function() {\n this.attempts += 1;\n },\n\n succeed: function() {},\n\n fail: function() {},\n\n abort: function() {}\n});\n\nmodule.exports = Scheduler;\n\n},{\"../util/extend\":33}],18:[function(require,module,exports){\n'use strict';\n\nvar Class = require('../util/class'),\n extend = require('../util/extend'),\n Deferrable = require('../mixins/deferrable');\n\nvar Subscription = Class({\n initialize: function(client, channels, callback, context) {\n this._client = client;\n this._channels = channels;\n this._callback = callback;\n this._context = context;\n this._cancelled = false;\n },\n\n withChannel: function(callback, context) {\n this._withChannel = [callback, context];\n return this;\n },\n\n apply: function(context, args) {\n var message = args[0];\n\n if (this._callback)\n this._callback.call(this._context, message.data);\n\n if (this._withChannel)\n this._withChannel[0].call(this._withChannel[1], message.channel, message.data);\n },\n\n cancel: function() {\n if (this._cancelled) return;\n this._client.unsubscribe(this._channels, this);\n this._cancelled = true;\n },\n\n unsubscribe: function() {\n this.cancel();\n }\n});\n\nextend(Subscription.prototype, Deferrable);\n\nmodule.exports = Subscription;\n\n},{\"../mixins/deferrable\":6,\"../util/class\":28,\"../util/extend\":33}],19:[function(require,module,exports){\n'use strict';\n\nvar Transport = require('./transport');\n\nTransport.register('websocket', require('./web_socket'));\nTransport.register('eventsource', require('./event_source'));\nTransport.register('long-polling', require('./xhr'));\nTransport.register('cross-origin-long-polling', require('./cors'));\nTransport.register('callback-polling', require('./jsonp'));\n\nmodule.exports = Transport;\n\n},{\"./cors\":20,\"./event_source\":21,\"./jsonp\":22,\"./transport\":23,\"./web_socket\":24,\"./xhr\":25}],20:[function(require,module,exports){\n(function (global){\n'use strict';\n\nvar Class = require('../util/class'),\n Set = require('../util/set'),\n URI = require('../util/uri'),\n extend = require('../util/extend'),\n toJSON = require('../util/to_json'),\n Transport = require('./transport');\n\nvar CORS = extend(Class(Transport, {\n encode: function(messages) {\n return 'message=' + encodeURIComponent(toJSON(messages));\n },\n\n request: function(messages) {\n var xhrClass = global.XDomainRequest ? XDomainRequest : XMLHttpRequest,\n xhr = new xhrClass(),\n id = ++CORS._id,\n headers = this._dispatcher.headers,\n self = this,\n key;\n\n xhr.open('POST', URI.stringify(this.endpoint), true);\n\n if (xhr.setRequestHeader) {\n xhr.setRequestHeader('Pragma', 'no-cache');\n for (key in headers) {\n if (!headers.hasOwnProperty(key)) continue;\n xhr.setRequestHeader(key, headers[key]);\n }\n }\n\n var cleanUp = function() {\n if (!xhr) return false;\n CORS._pending.remove(id);\n xhr.onload = xhr.onerror = xhr.ontimeout = xhr.onprogress = null;\n xhr = null;\n };\n\n xhr.onload = function() {\n var replies;\n try { replies = JSON.parse(xhr.responseText) } catch (error) {}\n\n cleanUp();\n\n if (replies)\n self._receive(replies);\n else\n self._handleError(messages);\n };\n\n xhr.onerror = xhr.ontimeout = function() {\n cleanUp();\n self._handleError(messages);\n };\n\n xhr.onprogress = function() {};\n\n if (xhrClass === global.XDomainRequest)\n CORS._pending.add({id: id, xhr: xhr});\n\n xhr.send(this.encode(messages));\n return xhr;\n }\n}), {\n _id: 0,\n _pending: new Set(),\n\n isUsable: function(dispatcher, endpoint, callback, context) {\n if (URI.isSameOrigin(endpoint))\n return callback.call(context, false);\n\n if (global.XDomainRequest)\n return callback.call(context, endpoint.protocol === location.protocol);\n\n if (global.XMLHttpRequest) {\n var xhr = new XMLHttpRequest();\n return callback.call(context, xhr.withCredentials !== undefined);\n }\n return callback.call(context, false);\n }\n});\n\nmodule.exports = CORS;\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n\n},{\"../util/class\":28,\"../util/extend\":33,\"../util/set\":35,\"../util/to_json\":36,\"../util/uri\":37,\"./transport\":23}],21:[function(require,module,exports){\n(function (global){\n'use strict';\n\nvar Class = require('../util/class'),\n URI = require('../util/uri'),\n copyObject = require('../util/copy_object'),\n extend = require('../util/extend'),\n Deferrable = require('../mixins/deferrable'),\n Transport = require('./transport'),\n XHR = require('./xhr');\n\nvar EventSource = extend(Class(Transport, {\n initialize: function(dispatcher, endpoint) {\n Transport.prototype.initialize.call(this, dispatcher, endpoint);\n if (!global.EventSource) return this.setDeferredStatus('failed');\n\n this._xhr = new XHR(dispatcher, endpoint);\n\n endpoint = copyObject(endpoint);\n endpoint.pathname += '/' + dispatcher.clientId;\n\n var socket = new global.EventSource(URI.stringify(endpoint)),\n self = this;\n\n socket.onopen = function() {\n self._everConnected = true;\n self.setDeferredStatus('succeeded');\n };\n\n socket.onerror = function() {\n if (self._everConnected) {\n self._handleError([]);\n } else {\n self.setDeferredStatus('failed');\n socket.close();\n }\n };\n\n socket.onmessage = function(event) {\n var replies;\n try { replies = JSON.parse(event.data) } catch (error) {}\n\n if (replies)\n self._receive(replies);\n else\n self._handleError([]);\n };\n\n this._socket = socket;\n },\n\n close: function() {\n if (!this._socket) return;\n this._socket.onopen = this._socket.onerror = this._socket.onmessage = null;\n this._socket.close();\n delete this._socket;\n },\n\n isUsable: function(callback, context) {\n this.callback(function() { callback.call(context, true) });\n this.errback(function() { callback.call(context, false) });\n },\n\n encode: function(messages) {\n return this._xhr.encode(messages);\n },\n\n request: function(messages) {\n return this._xhr.request(messages);\n }\n\n}), {\n isUsable: function(dispatcher, endpoint, callback, context) {\n var id = dispatcher.clientId;\n if (!id) return callback.call(context, false);\n\n XHR.isUsable(dispatcher, endpoint, function(usable) {\n if (!usable) return callback.call(context, false);\n this.create(dispatcher, endpoint).isUsable(callback, context);\n }, this);\n },\n\n create: function(dispatcher, endpoint) {\n var sockets = dispatcher.transports.eventsource = dispatcher.transports.eventsource || {},\n id = dispatcher.clientId;\n\n var url = copyObject(endpoint);\n url.pathname += '/' + (id || '');\n url = URI.stringify(url);\n\n sockets[url] = sockets[url] || new this(dispatcher, endpoint);\n return sockets[url];\n }\n});\n\nextend(EventSource.prototype, Deferrable);\n\nmodule.exports = EventSource;\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n\n},{\"../mixins/deferrable\":6,\"../util/class\":28,\"../util/copy_object\":31,\"../util/extend\":33,\"../util/uri\":37,\"./transport\":23,\"./xhr\":25}],22:[function(require,module,exports){\n(function (global){\n'use strict';\n\nvar Class = require('../util/class'),\n URI = require('../util/uri'),\n copyObject = require('../util/copy_object'),\n extend = require('../util/extend'),\n toJSON = require('../util/to_json'),\n Transport = require('./transport');\n\nvar JSONP = extend(Class(Transport, {\n encode: function(messages) {\n var url = copyObject(this.endpoint);\n url.query.message = toJSON(messages);\n url.query.jsonp = '__jsonp' + JSONP._cbCount + '__';\n return URI.stringify(url);\n },\n\n request: function(messages) {\n var head = document.getElementsByTagName('head')[0],\n script = document.createElement('script'),\n callbackName = JSONP.getCallbackName(),\n endpoint = copyObject(this.endpoint),\n self = this;\n\n endpoint.query.message = toJSON(messages);\n endpoint.query.jsonp = callbackName;\n\n var cleanup = function() {\n if (!global[callbackName]) return false;\n global[callbackName] = undefined;\n try { delete global[callbackName] } catch (error) {}\n script.parentNode.removeChild(script);\n };\n\n global[callbackName] = function(replies) {\n cleanup();\n self._receive(replies);\n };\n\n script.type = 'text/javascript';\n script.src = URI.stringify(endpoint);\n head.appendChild(script);\n\n script.onerror = function() {\n cleanup();\n self._handleError(messages);\n };\n\n return {abort: cleanup};\n }\n}), {\n _cbCount: 0,\n\n getCallbackName: function() {\n this._cbCount += 1;\n return '__jsonp' + this._cbCount + '__';\n },\n\n isUsable: function(dispatcher, endpoint, callback, context) {\n callback.call(context, true);\n }\n});\n\nmodule.exports = JSONP;\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n\n},{\"../util/class\":28,\"../util/copy_object\":31,\"../util/extend\":33,\"../util/to_json\":36,\"../util/uri\":37,\"./transport\":23}],23:[function(require,module,exports){\n(function (process){\n'use strict';\n\nvar Class = require('../util/class'),\n Cookie = require('../util/cookies').Cookie,\n Promise = require('../util/promise'),\n URI = require('../util/uri'),\n array = require('../util/array'),\n extend = require('../util/extend'),\n Logging = require('../mixins/logging'),\n Timeouts = require('../mixins/timeouts'),\n Channel = require('../protocol/channel');\n\nvar Transport = extend(Class({ className: 'Transport',\n DEFAULT_PORTS: {'http:': 80, 'https:': 443, 'ws:': 80, 'wss:': 443},\n MAX_DELAY: 0,\n\n batching: true,\n\n initialize: function(dispatcher, endpoint) {\n this._dispatcher = dispatcher;\n this.endpoint = endpoint;\n this._outbox = [];\n this._proxy = extend({}, this._dispatcher.proxy);\n\n if (!this._proxy.origin)\n this._proxy.origin = this._findProxy();\n },\n\n close: function() {},\n\n encode: function(messages) {\n return '';\n },\n\n sendMessage: function(message) {\n this.debug('Client ? sending message to ?: ?',\n this._dispatcher.clientId, URI.stringify(this.endpoint), message);\n\n if (!this.batching) return Promise.resolve(this.request([message]));\n\n this._outbox.push(message);\n this._flushLargeBatch();\n\n if (message.channel === Channel.HANDSHAKE)\n return this._publish(0.01);\n\n if (message.channel === Channel.CONNECT)\n this._connectMessage = message;\n\n return this._publish(this.MAX_DELAY);\n },\n\n _makePromise: function() {\n var self = this;\n\n this._requestPromise = this._requestPromise || new Promise(function(resolve) {\n self._resolvePromise = resolve;\n });\n },\n\n _publish: function(delay) {\n this._makePromise();\n\n this.addTimeout('publish', delay, function() {\n this._flush();\n delete this._requestPromise;\n }, this);\n\n return this._requestPromise;\n },\n\n _flush: function() {\n this.removeTimeout('publish');\n\n if (this._outbox.length > 1 && this._connectMessage)\n this._connectMessage.advice = {timeout: 0};\n\n this._resolvePromise(this.request(this._outbox));\n\n this._connectMessage = null;\n this._outbox = [];\n },\n\n _flushLargeBatch: function() {\n var string = this.encode(this._outbox);\n if (string.length < this._dispatcher.maxRequestSize) return;\n var last = this._outbox.pop();\n\n this._makePromise();\n this._flush();\n\n if (last) this._outbox.push(last);\n },\n\n _receive: function(replies) {\n if (!replies) return;\n replies = [].concat(replies);\n\n this.debug('Client ? received from ? via ?: ?',\n this._dispatcher.clientId, URI.stringify(this.endpoint), this.connectionType, replies);\n\n for (var i = 0, n = replies.length; i < n; i++)\n this._dispatcher.handleResponse(replies[i]);\n },\n\n _handleError: function(messages, immediate) {\n messages = [].concat(messages);\n\n this.debug('Client ? failed to send to ? via ?: ?',\n this._dispatcher.clientId, URI.stringify(this.endpoint), this.connectionType, messages);\n\n for (var i = 0, n = messages.length; i < n; i++)\n this._dispatcher.handleError(messages[i]);\n },\n\n _getCookies: function() {\n var cookies = this._dispatcher.cookies,\n url = URI.stringify(this.endpoint);\n\n if (!cookies) return '';\n\n return array.map(cookies.getCookiesSync(url), function(cookie) {\n return cookie.cookieString();\n }).join('; ');\n },\n\n _storeCookies: function(setCookie) {\n var cookies = this._dispatcher.cookies,\n url = URI.stringify(this.endpoint),\n cookie;\n\n if (!setCookie || !cookies) return;\n setCookie = [].concat(setCookie);\n\n for (var i = 0, n = setCookie.length; i < n; i++) {\n cookie = Cookie.parse(setCookie[i]);\n cookies.setCookieSync(cookie, url);\n }\n },\n\n _findProxy: function() {\n if (typeof process === 'undefined') return undefined;\n\n var protocol = this.endpoint.protocol;\n if (!protocol) return undefined;\n\n var name = protocol.replace(/:$/, '').toLowerCase() + '_proxy',\n upcase = name.toUpperCase(),\n env = process.env,\n keys, proxy;\n\n if (name === 'http_proxy' && env.REQUEST_METHOD) {\n keys = Object.keys(env).filter(function(k) { return /^http_proxy$/i.test(k) });\n if (keys.length === 1) {\n if (keys[0] === name && env[upcase] === undefined)\n proxy = env[name];\n } else if (keys.length > 1) {\n proxy = env[name];\n }\n proxy = proxy || env['CGI_' + upcase];\n } else {\n proxy = env[name] || env[upcase];\n if (proxy && !env[name])\n console.warn('The environment variable ' + upcase +\n ' is discouraged. Use ' + name + '.');\n }\n return proxy;\n }\n\n}), {\n get: function(dispatcher, allowed, disabled, callback, context) {\n var endpoint = dispatcher.endpoint;\n\n array.asyncEach(this._transports, function(pair, resume) {\n var connType = pair[0], klass = pair[1],\n connEndpoint = dispatcher.endpointFor(connType);\n\n if (array.indexOf(disabled, connType) >= 0)\n return resume();\n\n if (array.indexOf(allowed, connType) < 0) {\n klass.isUsable(dispatcher, connEndpoint, function() {});\n return resume();\n }\n\n klass.isUsable(dispatcher, connEndpoint, function(isUsable) {\n if (!isUsable) return resume();\n var transport = klass.hasOwnProperty('create') ? klass.create(dispatcher, connEndpoint) : new klass(dispatcher, connEndpoint);\n callback.call(context, transport);\n });\n }, function() {\n throw new Error('Could not find a usable connection type for ' + URI.stringify(endpoint));\n });\n },\n\n register: function(type, klass) {\n this._transports.push([type, klass]);\n klass.prototype.connectionType = type;\n },\n\n getConnectionTypes: function() {\n return array.map(this._transports, function(t) { return t[0] });\n },\n\n _transports: []\n});\n\nextend(Transport.prototype, Logging);\nextend(Transport.prototype, Timeouts);\n\nmodule.exports = Transport;\n\n}).call(this,require('_process'))\n\n},{\"../mixins/logging\":7,\"../mixins/timeouts\":9,\"../protocol/channel\":10,\"../util/array\":26,\"../util/class\":28,\"../util/cookies\":30,\"../util/extend\":33,\"../util/promise\":34,\"../util/uri\":37,\"_process\":40}],24:[function(require,module,exports){\n(function (global){\n'use strict';\n\nvar Class = require('../util/class'),\n Promise = require('../util/promise'),\n Set = require('../util/set'),\n URI = require('../util/uri'),\n browser = require('../util/browser'),\n copyObject = require('../util/copy_object'),\n extend = require('../util/extend'),\n toJSON = require('../util/to_json'),\n ws = require('../util/websocket'),\n Deferrable = require('../mixins/deferrable'),\n Transport = require('./transport');\n\nvar WebSocket = extend(Class(Transport, {\n UNCONNECTED: 1,\n CONNECTING: 2,\n CONNECTED: 3,\n\n batching: false,\n\n isUsable: function(callback, context) {\n this.callback(function() { callback.call(context, true) });\n this.errback(function() { callback.call(context, false) });\n this.connect();\n },\n\n request: function(messages) {\n this._pending = this._pending || new Set();\n for (var i = 0, n = messages.length; i < n; i++) this._pending.add(messages[i]);\n\n var self = this;\n\n var promise = new Promise(function(resolve, reject) {\n self.callback(function(socket) {\n if (!socket || socket.readyState !== 1) return;\n socket.send(toJSON(messages));\n resolve(socket);\n });\n\n self.connect();\n });\n\n return {\n abort: function() { promise.then(function(ws) { ws.close() }) }\n };\n },\n\n connect: function() {\n if (WebSocket._unloaded) return;\n\n this._state = this._state || this.UNCONNECTED;\n if (this._state !== this.UNCONNECTED) return;\n this._state = this.CONNECTING;\n\n var socket = this._createSocket();\n if (!socket) return this.setDeferredStatus('failed');\n\n var self = this;\n\n socket.onopen = function() {\n if (socket.headers) self._storeCookies(socket.headers['set-cookie']);\n self._socket = socket;\n self._state = self.CONNECTED;\n self._everConnected = true;\n self._ping();\n self.setDeferredStatus('succeeded', socket);\n };\n\n var closed = false;\n socket.onclose = socket.onerror = function() {\n if (closed) return;\n closed = true;\n\n var wasConnected = (self._state === self.CONNECTED);\n socket.onopen = socket.onclose = socket.onerror = socket.onmessage = null;\n\n delete self._socket;\n self._state = self.UNCONNECTED;\n self.removeTimeout('ping');\n\n var pending = self._pending ? self._pending.toArray() : [];\n delete self._pending;\n\n if (wasConnected || self._everConnected) {\n self.setDeferredStatus('unknown');\n self._handleError(pending, wasConnected);\n } else {\n self.setDeferredStatus('failed');\n }\n };\n\n socket.onmessage = function(event) {\n var replies;\n try { replies = JSON.parse(event.data) } catch (error) {}\n\n if (!replies) return;\n\n replies = [].concat(replies);\n\n for (var i = 0, n = replies.length; i < n; i++) {\n if (replies[i].successful === undefined) continue;\n self._pending.remove(replies[i]);\n }\n self._receive(replies);\n };\n },\n\n close: function() {\n if (!this._socket) return;\n this._socket.close();\n },\n\n _createSocket: function() {\n var url = WebSocket.getSocketUrl(this.endpoint),\n headers = this._dispatcher.headers,\n extensions = this._dispatcher.wsExtensions,\n cookie = this._getCookies(),\n tls = this._dispatcher.tls,\n options = {extensions: extensions, headers: headers, proxy: this._proxy, tls: tls};\n\n if (cookie !== '') options.headers['Cookie'] = cookie;\n\n return ws.create(url, [], options);\n },\n\n _ping: function() {\n if (!this._socket || this._socket.readyState !== 1) return;\n this._socket.send('[]');\n this.addTimeout('ping', this._dispatcher.timeout / 2, this._ping, this);\n }\n\n}), {\n PROTOCOLS: {\n 'http:': 'ws:',\n 'https:': 'wss:'\n },\n\n create: function(dispatcher, endpoint) {\n var sockets = dispatcher.transports.websocket = dispatcher.transports.websocket || {};\n sockets[endpoint.href] = sockets[endpoint.href] || new this(dispatcher, endpoint);\n return sockets[endpoint.href];\n },\n\n getSocketUrl: function(endpoint) {\n endpoint = copyObject(endpoint);\n endpoint.protocol = this.PROTOCOLS[endpoint.protocol];\n return URI.stringify(endpoint);\n },\n\n isUsable: function(dispatcher, endpoint, callback, context) {\n this.create(dispatcher, endpoint).isUsable(callback, context);\n }\n});\n\nextend(WebSocket.prototype, Deferrable);\n\nif (browser.Event && global.onbeforeunload !== undefined)\n browser.Event.on(global, 'beforeunload', function() { WebSocket._unloaded = true });\n\nmodule.exports = WebSocket;\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n\n},{\"../mixins/deferrable\":6,\"../util/browser\":27,\"../util/class\":28,\"../util/copy_object\":31,\"../util/extend\":33,\"../util/promise\":34,\"../util/set\":35,\"../util/to_json\":36,\"../util/uri\":37,\"../util/websocket\":39,\"./transport\":23}],25:[function(require,module,exports){\n(function (global){\n'use strict';\n\nvar Class = require('../util/class'),\n URI = require('../util/uri'),\n browser = require('../util/browser'),\n extend = require('../util/extend'),\n toJSON = require('../util/to_json'),\n Transport = require('./transport');\n\nvar XHR = extend(Class(Transport, {\n encode: function(messages) {\n return toJSON(messages);\n },\n\n request: function(messages) {\n var href = this.endpoint.href,\n self = this,\n xhr;\n\n // Prefer XMLHttpRequest over ActiveXObject if they both exist\n if (global.XMLHttpRequest) {\n xhr = new XMLHttpRequest();\n } else if (global.ActiveXObject) {\n xhr = new ActiveXObject('Microsoft.XMLHTTP');\n } else {\n return this._handleError(messages);\n }\n\n xhr.open('POST', href, true);\n xhr.setRequestHeader('Content-Type', 'application/json');\n xhr.setRequestHeader('Pragma', 'no-cache');\n xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');\n\n var headers = this._dispatcher.headers;\n for (var key in headers) {\n if (!headers.hasOwnProperty(key)) continue;\n xhr.setRequestHeader(key, headers[key]);\n }\n\n var abort = function() { xhr.abort() };\n if (global.onbeforeunload !== undefined)\n browser.Event.on(global, 'beforeunload', abort);\n\n xhr.onreadystatechange = function() {\n if (!xhr || xhr.readyState !== 4) return;\n\n var replies = null,\n status = xhr.status,\n text = xhr.responseText,\n successful = (status >= 200 && status < 300) || status === 304 || status === 1223;\n\n if (global.onbeforeunload !== undefined)\n browser.Event.detach(global, 'beforeunload', abort);\n\n xhr.onreadystatechange = function() {};\n xhr = null;\n\n if (!successful) return self._handleError(messages);\n\n try {\n replies = JSON.parse(text);\n } catch (error) {}\n\n if (replies)\n self._receive(replies);\n else\n self._handleError(messages);\n };\n\n xhr.send(this.encode(messages));\n return xhr;\n }\n}), {\n isUsable: function(dispatcher, endpoint, callback, context) {\n var usable = (navigator.product === 'ReactNative')\n || URI.isSameOrigin(endpoint);\n\n callback.call(context, usable);\n }\n});\n\nmodule.exports = XHR;\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n\n},{\"../util/browser\":27,\"../util/class\":28,\"../util/extend\":33,\"../util/to_json\":36,\"../util/uri\":37,\"./transport\":23}],26:[function(require,module,exports){\n'use strict';\n\nmodule.exports = {\n commonElement: function(lista, listb) {\n for (var i = 0, n = lista.length; i < n; i++) {\n if (this.indexOf(listb, lista[i]) !== -1)\n return lista[i];\n }\n return null;\n },\n\n indexOf: function(list, needle) {\n if (list.indexOf) return list.indexOf(needle);\n\n for (var i = 0, n = list.length; i < n; i++) {\n if (list[i] === needle) return i;\n }\n return -1;\n },\n\n map: function(object, callback, context) {\n if (object.map) return object.map(callback, context);\n var result = [];\n\n if (object instanceof Array) {\n for (var i = 0, n = object.length; i < n; i++) {\n result.push(callback.call(context || null, object[i], i));\n }\n } else {\n for (var key in object) {\n if (!object.hasOwnProperty(key)) continue;\n result.push(callback.call(context || null, key, object[key]));\n }\n }\n return result;\n },\n\n filter: function(array, callback, context) {\n if (array.filter) return array.filter(callback, context);\n var result = [];\n for (var i = 0, n = array.length; i < n; i++) {\n if (callback.call(context || null, array[i], i))\n result.push(array[i]);\n }\n return result;\n },\n\n asyncEach: function(list, iterator, callback, context) {\n var n = list.length,\n i = -1,\n calls = 0,\n looping = false;\n\n var iterate = function() {\n calls -= 1;\n i += 1;\n if (i === n) return callback && callback.call(context);\n iterator(list[i], resume);\n };\n\n var loop = function() {\n if (looping) return;\n looping = true;\n while (calls > 0) iterate();\n looping = false;\n };\n\n var resume = function() {\n calls += 1;\n loop();\n };\n resume();\n }\n};\n\n},{}],27:[function(require,module,exports){\n(function (global){\n'use strict';\n\nvar Event = {\n _registry: [],\n\n on: function(element, eventName, callback, context) {\n var wrapped = function() { callback.call(context) };\n\n if (element.addEventListener)\n element.addEventListener(eventName, wrapped, false);\n else\n element.attachEvent('on' + eventName, wrapped);\n\n this._registry.push({\n _element: element,\n _type: eventName,\n _callback: callback,\n _context: context,\n _handler: wrapped\n });\n },\n\n detach: function(element, eventName, callback, context) {\n var i = this._registry.length, register;\n while (i--) {\n register = this._registry[i];\n\n if ((element && element !== register._element) ||\n (eventName && eventName !== register._type) ||\n (callback && callback !== register._callback) ||\n (context && context !== register._context))\n continue;\n\n if (register._element.removeEventListener)\n register._element.removeEventListener(register._type, register._handler, false);\n else\n register._element.detachEvent('on' + register._type, register._handler);\n\n this._registry.splice(i,1);\n register = null;\n }\n }\n};\n\nif (global.onunload !== undefined)\n Event.on(global, 'unload', Event.detach, Event);\n\nmodule.exports = {\n Event: Event\n};\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n\n},{}],28:[function(require,module,exports){\n'use strict';\n\nvar extend = require('./extend');\n\nmodule.exports = function(parent, methods) {\n if (typeof parent !== 'function') {\n methods = parent;\n parent = Object;\n }\n\n var klass = function() {\n if (!this.initialize) return this;\n return this.initialize.apply(this, arguments) || this;\n };\n\n var bridge = function() {};\n bridge.prototype = parent.prototype;\n\n klass.prototype = new bridge();\n extend(klass.prototype, methods);\n\n return klass;\n};\n\n},{\"./extend\":33}],29:[function(require,module,exports){\nmodule.exports = {\n VERSION: '1.2.4',\n\n BAYEUX_VERSION: '1.0',\n ID_LENGTH: 160,\n JSONP_CALLBACK: 'jsonpcallback',\n CONNECTION_TYPES: ['long-polling', 'cross-origin-long-polling', 'callback-polling', 'websocket', 'eventsource', 'in-process'],\n\n MANDATORY_CONNECTION_TYPES: ['long-polling', 'callback-polling', 'in-process']\n};\n\n},{}],30:[function(require,module,exports){\n'use strict';\n\nmodule.exports = {};\n\n},{}],31:[function(require,module,exports){\n'use strict';\n\nvar copyObject = function(object) {\n var clone, i, key;\n if (object instanceof Array) {\n clone = [];\n i = object.length;\n while (i--) clone[i] = copyObject(object[i]);\n return clone;\n } else if (typeof object === 'object') {\n clone = (object === null) ? null : {};\n for (key in object) clone[key] = copyObject(object[key]);\n return clone;\n } else {\n return object;\n }\n};\n\nmodule.exports = copyObject;\n\n},{}],32:[function(require,module,exports){\n/*\nCopyright Joyent, Inc. and other Node contributors. All rights reserved.\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies\nof the Software, and to permit persons to whom the Software is furnished to do\nso, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n*/\n\nvar isArray = typeof Array.isArray === 'function'\n ? Array.isArray\n : function (xs) {\n return Object.prototype.toString.call(xs) === '[object Array]'\n }\n;\nfunction indexOf (xs, x) {\n if (xs.indexOf) return xs.indexOf(x);\n for (var i = 0; i < xs.length; i++) {\n if (x === xs[i]) return i;\n }\n return -1;\n}\n\nfunction EventEmitter() {}\nmodule.exports = EventEmitter;\n\nEventEmitter.prototype.emit = function(type) {\n // If there is no 'error' event listener then throw.\n if (type === 'error') {\n if (!this._events || !this._events.error ||\n (isArray(this._events.error) && !this._events.error.length))\n {\n if (arguments[1] instanceof Error) {\n throw arguments[1]; // Unhandled 'error' event\n } else {\n throw new Error(\"Uncaught, unspecified 'error' event.\");\n }\n return false;\n }\n }\n\n if (!this._events) return false;\n var handler = this._events[type];\n if (!handler) return false;\n\n if (typeof handler == 'function') {\n switch (arguments.length) {\n // fast cases\n case 1:\n handler.call(this);\n break;\n case 2:\n handler.call(this, arguments[1]);\n break;\n case 3:\n handler.call(this, arguments[1], arguments[2]);\n break;\n // slower\n default:\n var args = Array.prototype.slice.call(arguments, 1);\n handler.apply(this, args);\n }\n return true;\n\n } else if (isArray(handler)) {\n var args = Array.prototype.slice.call(arguments, 1);\n\n var listeners = handler.slice();\n for (var i = 0, l = listeners.length; i < l; i++) {\n listeners[i].apply(this, args);\n }\n return true;\n\n } else {\n return false;\n }\n};\n\n// EventEmitter is defined in src/node_events.cc\n// EventEmitter.prototype.emit() is also defined there.\nEventEmitter.prototype.addListener = function(type, listener) {\n if ('function' !== typeof listener) {\n throw new Error('addListener only takes instances of Function');\n }\n\n if (!this._events) this._events = {};\n\n // To avoid recursion in the case that type == \"newListeners\"! Before\n // adding it to the listeners, first emit \"newListeners\".\n this.emit('newListener', type, listener);\n\n if (!this._events[type]) {\n // Optimize the case of one listener. Don't need the extra array object.\n this._events[type] = listener;\n } else if (isArray(this._events[type])) {\n // If we've already got an array, just append.\n this._events[type].push(listener);\n } else {\n // Adding the second element, need to change to array.\n this._events[type] = [this._events[type], listener];\n }\n\n return this;\n};\n\nEventEmitter.prototype.on = EventEmitter.prototype.addListener;\n\nEventEmitter.prototype.once = function(type, listener) {\n var self = this;\n self.on(type, function g() {\n self.removeListener(type, g);\n listener.apply(this, arguments);\n });\n\n return this;\n};\n\nEventEmitter.prototype.removeListener = function(type, listener) {\n if ('function' !== typeof listener) {\n throw new Error('removeListener only takes instances of Function');\n }\n\n // does not use listeners(), so no side effect of creating _events[type]\n if (!this._events || !this._events[type]) return this;\n\n var list = this._events[type];\n\n if (isArray(list)) {\n var i = indexOf(list, listener);\n if (i < 0) return this;\n list.splice(i, 1);\n if (list.length == 0)\n delete this._events[type];\n } else if (this._events[type] === listener) {\n delete this._events[type];\n }\n\n return this;\n};\n\nEventEmitter.prototype.removeAllListeners = function(type) {\n if (arguments.length === 0) {\n this._events = {};\n return this;\n }\n\n // does not use listeners(), so no side effect of creating _events[type]\n if (type && this._events && this._events[type]) this._events[type] = null;\n return this;\n};\n\nEventEmitter.prototype.listeners = function(type) {\n if (!this._events) this._events = {};\n if (!this._events[type]) this._events[type] = [];\n if (!isArray(this._events[type])) {\n this._events[type] = [this._events[type]];\n }\n return this._events[type];\n};\n\n},{}],33:[function(require,module,exports){\n'use strict';\n\nmodule.exports = function(dest, source, overwrite) {\n if (!source) return dest;\n for (var key in source) {\n if (!source.hasOwnProperty(key)) continue;\n if (dest.hasOwnProperty(key) && overwrite === false) continue;\n if (dest[key] !== source[key])\n dest[key] = source[key];\n }\n return dest;\n};\n\n},{}],34:[function(require,module,exports){\n'use strict';\n\nvar asap = require('asap');\n\nvar PENDING = 0,\n FULFILLED = 1,\n REJECTED = 2;\n\nvar RETURN = function(x) { return x },\n THROW = function(x) { throw x };\n\nvar Promise = function(task) {\n this._state = PENDING;\n this._onFulfilled = [];\n this._onRejected = [];\n\n if (typeof task !== 'function') return;\n var self = this;\n\n task(function(value) { resolve(self, value) },\n function(reason) { reject(self, reason) });\n};\n\nPromise.prototype.then = function(onFulfilled, onRejected) {\n var next = new Promise();\n registerOnFulfilled(this, onFulfilled, next);\n registerOnRejected(this, onRejected, next);\n return next;\n};\n\nPromise.prototype['catch'] = function(onRejected) {\n return this.then(null, onRejected);\n};\n\nvar registerOnFulfilled = function(promise, onFulfilled, next) {\n if (typeof onFulfilled !== 'function') onFulfilled = RETURN;\n var handler = function(value) { invoke(onFulfilled, value, next) };\n\n if (promise._state === PENDING) {\n promise._onFulfilled.push(handler);\n } else if (promise._state === FULFILLED) {\n handler(promise._value);\n }\n};\n\nvar registerOnRejected = function(promise, onRejected, next) {\n if (typeof onRejected !== 'function') onRejected = THROW;\n var handler = function(reason) { invoke(onRejected, reason, next) };\n\n if (promise._state === PENDING) {\n promise._onRejected.push(handler);\n } else if (promise._state === REJECTED) {\n handler(promise._reason);\n }\n};\n\nvar invoke = function(fn, value, next) {\n asap(function() { _invoke(fn, value, next) });\n};\n\nvar _invoke = function(fn, value, next) {\n var outcome;\n\n try {\n outcome = fn(value);\n } catch (error) {\n return reject(next, error);\n }\n\n if (outcome === next) {\n reject(next, new TypeError('Recursive promise chain detected'));\n } else {\n resolve(next, outcome);\n }\n};\n\nvar resolve = function(promise, value) {\n var called = false, type, then;\n\n try {\n type = typeof value;\n then = value !== null && (type === 'function' || type === 'object') && value.then;\n\n if (typeof then !== 'function') return fulfill(promise, value);\n\n then.call(value, function(v) {\n if (!(called ^ (called = true))) return;\n resolve(promise, v);\n }, function(r) {\n if (!(called ^ (called = true))) return;\n reject(promise, r);\n });\n } catch (error) {\n if (!(called ^ (called = true))) return;\n reject(promise, error);\n }\n};\n\nvar fulfill = function(promise, value) {\n if (promise._state !== PENDING) return;\n\n promise._state = FULFILLED;\n promise._value = value;\n promise._onRejected = [];\n\n var onFulfilled = promise._onFulfilled, fn;\n while (fn = onFulfilled.shift()) fn(value);\n};\n\nvar reject = function(promise, reason) {\n if (promise._state !== PENDING) return;\n\n promise._state = REJECTED;\n promise._reason = reason;\n promise._onFulfilled = [];\n\n var onRejected = promise._onRejected, fn;\n while (fn = onRejected.shift()) fn(reason);\n};\n\nPromise.resolve = function(value) {\n return new Promise(function(resolve, reject) { resolve(value) });\n};\n\nPromise.reject = function(reason) {\n return new Promise(function(resolve, reject) { reject(reason) });\n};\n\nPromise.all = function(promises) {\n return new Promise(function(resolve, reject) {\n var list = [], n = promises.length, i;\n\n if (n === 0) return resolve(list);\n\n for (i = 0; i < n; i++) (function(promise, i) {\n Promise.resolve(promise).then(function(value) {\n list[i] = value;\n if (--n === 0) resolve(list);\n }, reject);\n })(promises[i], i);\n });\n};\n\nPromise.race = function(promises) {\n return new Promise(function(resolve, reject) {\n for (var i = 0, n = promises.length; i < n; i++)\n Promise.resolve(promises[i]).then(resolve, reject);\n });\n};\n\nPromise.deferred = Promise.pending = function() {\n var tuple = {};\n\n tuple.promise = new Promise(function(resolve, reject) {\n tuple.resolve = resolve;\n tuple.reject = reject;\n });\n return tuple;\n};\n\nmodule.exports = Promise;\n\n},{\"asap\":3}],35:[function(require,module,exports){\n'use strict';\n\nvar Class = require('./class');\n\nmodule.exports = Class({\n initialize: function() {\n this._index = {};\n },\n\n add: function(item) {\n var key = (item.id !== undefined) ? item.id : item;\n if (this._index.hasOwnProperty(key)) return false;\n this._index[key] = item;\n return true;\n },\n\n forEach: function(block, context) {\n for (var key in this._index) {\n if (this._index.hasOwnProperty(key))\n block.call(context, this._index[key]);\n }\n },\n\n isEmpty: function() {\n for (var key in this._index) {\n if (this._index.hasOwnProperty(key)) return false;\n }\n return true;\n },\n\n member: function(item) {\n for (var key in this._index) {\n if (this._index[key] === item) return true;\n }\n return false;\n },\n\n remove: function(item) {\n var key = (item.id !== undefined) ? item.id : item;\n var removed = this._index[key];\n delete this._index[key];\n return removed;\n },\n\n toArray: function() {\n var array = [];\n this.forEach(function(item) { array.push(item) });\n return array;\n }\n});\n\n},{\"./class\":28}],36:[function(require,module,exports){\n'use strict';\n\n// http://assanka.net/content/tech/2009/09/02/json2-js-vs-prototype/\n\nmodule.exports = function(object) {\n return JSON.stringify(object, function(key, value) {\n return (this[key] instanceof Array) ? this[key] : value;\n });\n};\n\n},{}],37:[function(require,module,exports){\n'use strict';\n\nmodule.exports = {\n isURI: function(uri) {\n return uri && uri.protocol && uri.host && uri.path;\n },\n\n isSameOrigin: function(uri) {\n return uri.protocol === location.protocol &&\n uri.hostname === location.hostname &&\n uri.port === location.port;\n },\n\n parse: function(url) {\n if (typeof url !== 'string') return url;\n var uri = {}, parts, query, pairs, i, n, data;\n\n var consume = function(name, pattern) {\n url = url.replace(pattern, function(match) {\n uri[name] = match;\n return '';\n });\n uri[name] = uri[name] || '';\n };\n\n consume('protocol', /^[a-z]+\\:/i);\n consume('host', /^\\/\\/[^\\/\\?#]+/);\n\n if (!/^\\//.test(url) && !uri.host)\n url = location.pathname.replace(/[^\\/]*$/, '') + url;\n\n consume('pathname', /^[^\\?#]*/);\n consume('search', /^\\?[^#]*/);\n consume('hash', /^#.*/);\n\n uri.protocol = uri.protocol || location.protocol;\n\n if (uri.host) {\n uri.host = uri.host.substr(2);\n parts = uri.host.split(':');\n uri.hostname = parts[0];\n uri.port = parts[1] || '';\n } else {\n uri.host = location.host;\n uri.hostname = location.hostname;\n uri.port = location.port;\n }\n\n uri.pathname = uri.pathname || '/';\n uri.path = uri.pathname + uri.search;\n\n query = uri.search.replace(/^\\?/, '');\n pairs = query ? query.split('&') : [];\n data = {};\n\n for (i = 0, n = pairs.length; i < n; i++) {\n parts = pairs[i].split('=');\n data[decodeURIComponent(parts[0] || '')] = decodeURIComponent(parts[1] || '');\n }\n\n uri.query = data;\n\n uri.href = this.stringify(uri);\n return uri;\n },\n\n stringify: function(uri) {\n var string = uri.protocol + '//' + uri.hostname;\n if (uri.port) string += ':' + uri.port;\n string += uri.pathname + this.queryString(uri.query) + (uri.hash || '');\n return string;\n },\n\n queryString: function(query) {\n var pairs = [];\n for (var key in query) {\n if (!query.hasOwnProperty(key)) continue;\n pairs.push(encodeURIComponent(key) + '=' + encodeURIComponent(query[key]));\n }\n if (pairs.length === 0) return '';\n return '?' + pairs.join('&');\n }\n};\n\n},{}],38:[function(require,module,exports){\n'use strict';\n\nvar array = require('./array');\n\nmodule.exports = function(options, validKeys) {\n for (var key in options) {\n if (array.indexOf(validKeys, key) < 0)\n throw new Error('Unrecognized option: ' + key);\n }\n};\n\n},{\"./array\":26}],39:[function(require,module,exports){\n(function (global){\n'use strict';\n\nvar WS = global.MozWebSocket || global.WebSocket;\n\nmodule.exports = {\n create: function(url, protocols, options) {\n if (typeof WS !== 'function') return null;\n return new WS(url);\n }\n};\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n\n},{}],40:[function(require,module,exports){\n// shim for using process in browser\nvar process = module.exports = {};\n\n// cached from whatever global is present so that test runners that stub it\n// don't break things. But we need to wrap it in a try catch in case it is\n// wrapped in strict mode code which doesn't define any globals. It's inside a\n// function because try/catches deoptimize in certain engines.\n\nvar cachedSetTimeout;\nvar cachedClearTimeout;\n\nfunction defaultSetTimout() {\n throw new Error('setTimeout has not been defined');\n}\nfunction defaultClearTimeout () {\n throw new Error('clearTimeout has not been defined');\n}\n(function () {\n try {\n if (typeof setTimeout === 'function') {\n cachedSetTimeout = setTimeout;\n } else {\n cachedSetTimeout = defaultSetTimout;\n }\n } catch (e) {\n cachedSetTimeout = defaultSetTimout;\n }\n try {\n if (typeof clearTimeout === 'function') {\n cachedClearTimeout = clearTimeout;\n } else {\n cachedClearTimeout = defaultClearTimeout;\n }\n } catch (e) {\n cachedClearTimeout = defaultClearTimeout;\n }\n} ())\nfunction runTimeout(fun) {\n if (cachedSetTimeout === setTimeout) {\n //normal enviroments in sane situations\n return setTimeout(fun, 0);\n }\n // if setTimeout wasn't available but was latter defined\n if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n cachedSetTimeout = setTimeout;\n return setTimeout(fun, 0);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedSetTimeout(fun, 0);\n } catch(e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedSetTimeout.call(null, fun, 0);\n } catch(e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n return cachedSetTimeout.call(this, fun, 0);\n }\n }\n\n\n}\nfunction runClearTimeout(marker) {\n if (cachedClearTimeout === clearTimeout) {\n //normal enviroments in sane situations\n return clearTimeout(marker);\n }\n // if clearTimeout wasn't available but was latter defined\n if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n cachedClearTimeout = clearTimeout;\n return clearTimeout(marker);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedClearTimeout(marker);\n } catch (e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedClearTimeout.call(null, marker);\n } catch (e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n return cachedClearTimeout.call(this, marker);\n }\n }\n\n\n\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n if (!draining || !currentQueue) {\n return;\n }\n draining = false;\n if (currentQueue.length) {\n queue = currentQueue.concat(queue);\n } else {\n queueIndex = -1;\n }\n if (queue.length) {\n drainQueue();\n }\n}\n\nfunction drainQueue() {\n if (draining) {\n return;\n }\n var timeout = runTimeout(cleanUpNextTick);\n draining = true;\n\n var len = queue.length;\n while(len) {\n currentQueue = queue;\n queue = [];\n while (++queueIndex < len) {\n if (currentQueue) {\n currentQueue[queueIndex].run();\n }\n }\n queueIndex = -1;\n len = queue.length;\n }\n currentQueue = null;\n draining = false;\n runClearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n var args = new Array(arguments.length - 1);\n if (arguments.length > 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},{}]},{},[2])(2)\n});\n\n","/**\n * @file Manages Streaming APIs\n * @author Shinichi Tomita \n */\n\n'use strict';\n\nvar events = window.jsforce.require('events'),\n inherits = window.jsforce.require('inherits'),\n _ = window.jsforce.require('lodash/core'),\n Faye = require('faye'),\n StreamingExtension = require('./streaming-extension'),\n jsforce = window.jsforce.require('./core');\n\n/**\n * Streaming API topic class\n *\n * @class Streaming~Topic\n * @param {Streaming} steaming - Streaming API object\n * @param {String} name - Topic name\n */\nvar Topic = function(streaming, name) {\n this._streaming = streaming;\n this.name = name;\n};\n\n/**\n * @typedef {Object} Streaming~StreamingMessage\n * @prop {Object} event\n * @prop {Object} event.type - Event type\n * @prop {Record} sobject - Record information\n */\n/**\n * Subscribe listener to topic\n *\n * @method Streaming~Topic#subscribe\n * @param {Callback.} listener - Streaming message listener\n * @returns {Subscription} - Faye subscription object\n */\nTopic.prototype.subscribe = function(listener) {\n return this._streaming.subscribe(this.name, listener);\n};\n\n/**\n * Unsubscribe listener from topic\n *\n * @method Streaming~Topic#unsubscribe\n * @param {Callback.} listener - Streaming message listener\n * @returns {Streaming~Topic}\n */\nTopic.prototype.unsubscribe = function(listener) {\n this._streaming.unsubscribe(this.name, listener);\n return this;\n};\n\n/*--------------------------------------------*/\n\n/**\n * Streaming API Generic Streaming Channel\n *\n * @class Streaming~Channel\n * @param {Streaming} steaming - Streaming API object\n * @param {String} name - Channel name (starts with \"/u/\")\n */\nvar Channel = function(streaming, name) {\n this._streaming = streaming;\n this._name = name;\n};\n\n/**\n * Subscribe to channel\n *\n * @param {Callback.} listener - Streaming message listener\n * @returns {Subscription} - Faye subscription object\n */\nChannel.prototype.subscribe = function(listener) {\n return this._streaming.subscribe(this._name, listener);\n};\n\nChannel.prototype.unsubscribe = function(listener) {\n this._streaming.unsubscribe(this._name, listener);\n return this;\n};\n\nChannel.prototype.push = function(events, callback) {\n var isArray = _.isArray(events);\n events = isArray ? events : [ events ];\n var conn = this._streaming._conn;\n if (!this._id) {\n this._id = conn.sobject('StreamingChannel').findOne({ Name: this._name }, 'Id')\n .then(function(rec) { return rec.Id });\n }\n return this._id.then(function(id) {\n var channelUrl = '/sobjects/StreamingChannel/' + id + '/push';\n return conn.requestPost(channelUrl, { pushEvents: events });\n }).then(function(rets) {\n return isArray ? rets : rets[0];\n }).thenCall(callback);\n};\n\n/*--------------------------------------------*/\n\n/**\n * Streaming API class\n *\n * @class\n * @extends events.EventEmitter\n * @param {Connection} conn - Connection object\n */\nvar Streaming = function(conn) {\n this._conn = conn;\n};\n\ninherits(Streaming, events.EventEmitter);\n\n/** @private **/\nStreaming.prototype._createClient = function(forChannelName, extensions) {\n // forChannelName is advisory, for an API workaround. It does not restrict or select the channel.\n var needsReplayFix = typeof forChannelName === 'string' && forChannelName.indexOf('/u/') === 0;\n var endpointUrl = [\n this._conn.instanceUrl,\n // special endpoint \"/cometd/replay/xx.x\" is only available in 36.0.\n // See https://releasenotes.docs.salesforce.com/en-us/summer16/release-notes/rn_api_streaming_classic_replay.htm\n \"cometd\" + (needsReplayFix === true && this._conn.version === \"36.0\" ? \"/replay\" : \"\"),\n this._conn.version\n ].join('/');\n var fayeClient = new Faye.Client(endpointUrl, {});\n fayeClient.setHeader('Authorization', 'OAuth '+this._conn.accessToken);\n if (extensions instanceof Array) {\n extensions.forEach(function(extension) {\n fayeClient.addExtension(extension);\n });\n }\n if (fayeClient._dispatcher.getConnectionTypes().indexOf('callback-polling') === -1) {\n // prevent streaming API server error\n fayeClient._dispatcher.selectTransport('long-polling');\n fayeClient._dispatcher._transport.batching = false;\n }\n return fayeClient;\n};\n\n/** @private **/\nStreaming.prototype._getFayeClient = function(channelName) {\n var isGeneric = channelName.indexOf('/u/') === 0;\n var clientType = isGeneric ? 'generic' : 'pushTopic';\n if (!this._fayeClients || !this._fayeClients[clientType]) {\n this._fayeClients = this._fayeClients || {};\n this._fayeClients[clientType] = this._createClient(channelName);\n }\n return this._fayeClients[clientType];\n};\n\n\n/**\n * Get named topic\n *\n * @param {String} name - Topic name\n * @returns {Streaming~Topic}\n */\nStreaming.prototype.topic = function(name) {\n this._topics = this._topics || {};\n var topic = this._topics[name] =\n this._topics[name] || new Topic(this, name);\n return topic;\n};\n\n/**\n * Get Channel for Id\n * @param {String} channelId - Id of StreamingChannel object\n * @returns {Streaming~Channel}\n */\nStreaming.prototype.channel = function(channelId) {\n return new Channel(this, channelId);\n};\n\n/**\n * Subscribe topic/channel\n *\n * @param {String} name - Topic name\n * @param {Callback.} listener - Streaming message listener\n * @returns {Subscription} - Faye subscription object\n */\nStreaming.prototype.subscribe = function(name, listener) {\n var channelName = name.indexOf('/') === 0 ? name : '/topic/' + name;\n var fayeClient = this._getFayeClient(channelName);\n return fayeClient.subscribe(channelName, listener);\n};\n\n/**\n * Unsubscribe topic\n *\n * @param {String} name - Topic name\n * @param {Callback.} listener - Streaming message listener\n * @returns {Streaming}\n */\nStreaming.prototype.unsubscribe = function(name, listener) {\n var channelName = name.indexOf('/') === 0 ? name : '/topic/' + name;\n var fayeClient = this._getFayeClient(channelName);\n fayeClient.unsubscribe(channelName, listener);\n return this;\n};\n\n\n/**\n * Create a Streaming client, optionally with extensions\n *\n * See Faye docs for implementation details: https://faye.jcoglan.com/browser/extensions.html\n *\n * Example usage:\n * \n * ```javascript\n * // Establish a Salesforce connection. (Details elided)\n * const conn = new jsforce.Connection({ … });\n * \n * const fayeClient = conn.streaming.createClient();\n * \n * const subscription = fayeClient.subscribe(channel, data => {\n * console.log('topic received data', data);\n * });\n * \n * subscription.cancel();\n * ```\n * \n * Example with extensions, using Replay & Auth Failure extensions in a server-side Node.js app:\n * \n * ```javascript\n * // Establish a Salesforce connection. (Details elided)\n * const conn = new jsforce.Connection({ … });\n * \n * const channel = \"/event/My_Event__e\";\n * const replayId = -2; // -2 is all retained events\n * \n * const exitCallback = () => process.exit(1);\n * const authFailureExt = new jsforce.StreamingExtension.AuthFailure(exitCallback);\n * \n * const replayExt = new jsforce.StreamingExtension.Replay(channel, replayId);\n * \n * const fayeClient = conn.streaming.createClient([\n * authFailureExt,\n * replayExt\n * ]);\n * \n * const subscription = fayeClient.subscribe(channel, data => {\n * console.log('topic received data', data);\n * });\n * \n * subscription.cancel();\n * ```\n * \n * @param {Array} Extensions - Optional, extensions to apply to the Faye client\n * @returns {FayeClient} - Faye client object\n */\nStreaming.prototype.createClient = function(extensions) {\n return this._createClient(null, extensions);\n};\n\n/*--------------------------------------------*/\n/*\n * Register hook in connection instantiation for dynamically adding this API module features\n */\njsforce.on('connection:new', function(conn) {\n conn.streaming = new Streaming(conn);\n});\n\n/*\n * \n */\njsforce.StreamingExtension = StreamingExtension;\n\nmodule.exports = Streaming;\n","\"use strict\";\n\n// rawAsap provides everything we need except exception management.\nvar rawAsap = require(\"./raw\");\n// RawTasks are recycled to reduce GC churn.\nvar freeTasks = [];\n// We queue errors to ensure they are thrown in right order (FIFO).\n// Array-as-queue is good enough here, since we are just dealing with exceptions.\nvar pendingErrors = [];\nvar requestErrorThrow = rawAsap.makeRequestCallFromTimer(throwFirstError);\n\nfunction throwFirstError() {\n if (pendingErrors.length) {\n throw pendingErrors.shift();\n }\n}\n\n/**\n * Calls a task as soon as possible after returning, in its own event, with priority\n * over other events like animation, reflow, and repaint. An error thrown from an\n * event will not interrupt, nor even substantially slow down the processing of\n * other events, but will be rather postponed to a lower priority event.\n * @param {{call}} task A callable object, typically a function that takes no\n * arguments.\n */\nmodule.exports = asap;\nfunction asap(task) {\n var rawTask;\n if (freeTasks.length) {\n rawTask = freeTasks.pop();\n } else {\n rawTask = new RawTask();\n }\n rawTask.task = task;\n rawAsap(rawTask);\n}\n\n// We wrap tasks with recyclable task objects. A task object implements\n// `call`, just like a function.\nfunction RawTask() {\n this.task = null;\n}\n\n// The sole purpose of wrapping the task is to catch the exception and recycle\n// the task object after its single use.\nRawTask.prototype.call = function () {\n try {\n this.task.call();\n } catch (error) {\n if (asap.onerror) {\n // This hook exists purely for testing purposes.\n // Its name will be periodically randomized to break any code that\n // depends on its existence.\n asap.onerror(error);\n } else {\n // In a web browser, exceptions are not fatal. However, to avoid\n // slowing down the queue of pending tasks, we rethrow the error in a\n // lower priority turn.\n pendingErrors.push(error);\n requestErrorThrow();\n }\n } finally {\n this.task = null;\n freeTasks[freeTasks.length] = this;\n }\n};\n","\"use strict\";\n\n// Use the fastest means possible to execute a task in its own turn, with\n// priority over other events including IO, animation, reflow, and redraw\n// events in browsers.\n//\n// An exception thrown by a task will permanently interrupt the processing of\n// subsequent tasks. The higher level `asap` function ensures that if an\n// exception is thrown by a task, that the task queue will continue flushing as\n// soon as possible, but if you use `rawAsap` directly, you are responsible to\n// either ensure that no exceptions are thrown from your task, or to manually\n// call `rawAsap.requestFlush` if an exception is thrown.\nmodule.exports = rawAsap;\nfunction rawAsap(task) {\n if (!queue.length) {\n requestFlush();\n flushing = true;\n }\n // Equivalent to push, but avoids a function call.\n queue[queue.length] = task;\n}\n\nvar queue = [];\n// Once a flush has been requested, no further calls to `requestFlush` are\n// necessary until the next `flush` completes.\nvar flushing = false;\n// `requestFlush` is an implementation-specific method that attempts to kick\n// off a `flush` event as quickly as possible. `flush` will attempt to exhaust\n// the event queue before yielding to the browser's own event loop.\nvar requestFlush;\n// The position of the next task to execute in the task queue. This is\n// preserved between calls to `flush` so that it can be resumed if\n// a task throws an exception.\nvar index = 0;\n// If a task schedules additional tasks recursively, the task queue can grow\n// unbounded. To prevent memory exhaustion, the task queue will periodically\n// truncate already-completed tasks.\nvar capacity = 1024;\n\n// The flush function processes all tasks that have been scheduled with\n// `rawAsap` unless and until one of those tasks throws an exception.\n// If a task throws an exception, `flush` ensures that its state will remain\n// consistent and will resume where it left off when called again.\n// However, `flush` does not make any arrangements to be called again if an\n// exception is thrown.\nfunction flush() {\n while (index < queue.length) {\n var currentIndex = index;\n // Advance the index before calling the task. This ensures that we will\n // begin flushing on the next task the task throws an error.\n index = index + 1;\n queue[currentIndex].call();\n // Prevent leaking memory for long chains of recursive calls to `asap`.\n // If we call `asap` within tasks scheduled by `asap`, the queue will\n // grow, but to avoid an O(n) walk for every task we execute, we don't\n // shift tasks off the queue after they have been executed.\n // Instead, we periodically shift 1024 tasks off the queue.\n if (index > capacity) {\n // Manually shift all values starting at the index back to the\n // beginning of the queue.\n for (var scan = 0, newLength = queue.length - index; scan < newLength; scan++) {\n queue[scan] = queue[scan + index];\n }\n queue.length -= index;\n index = 0;\n }\n }\n queue.length = 0;\n index = 0;\n flushing = false;\n}\n\n// `requestFlush` is implemented using a strategy based on data collected from\n// every available SauceLabs Selenium web driver worker at time of writing.\n// https://docs.google.com/spreadsheets/d/1mG-5UYGup5qxGdEMWkhP6BWCz053NUb2E1QoUTU16uA/edit#gid=783724593\n\n// Safari 6 and 6.1 for desktop, iPad, and iPhone are the only browsers that\n// have WebKitMutationObserver but not un-prefixed MutationObserver.\n// Must use `global` or `self` instead of `window` to work in both frames and web\n// workers. `global` is a provision of Browserify, Mr, Mrs, or Mop.\n\n/* globals self */\nvar scope = typeof global !== \"undefined\" ? global : self;\nvar BrowserMutationObserver = scope.MutationObserver || scope.WebKitMutationObserver;\n\n// MutationObservers are desirable because they have high priority and work\n// reliably everywhere they are implemented.\n// They are implemented in all modern browsers.\n//\n// - Android 4-4.3\n// - Chrome 26-34\n// - Firefox 14-29\n// - Internet Explorer 11\n// - iPad Safari 6-7.1\n// - iPhone Safari 7-7.1\n// - Safari 6-7\nif (typeof BrowserMutationObserver === \"function\") {\n requestFlush = makeRequestCallFromMutationObserver(flush);\n\n// MessageChannels are desirable because they give direct access to the HTML\n// task queue, are implemented in Internet Explorer 10, Safari 5.0-1, and Opera\n// 11-12, and in web workers in many engines.\n// Although message channels yield to any queued rendering and IO tasks, they\n// would be better than imposing the 4ms delay of timers.\n// However, they do not work reliably in Internet Explorer or Safari.\n\n// Internet Explorer 10 is the only browser that has setImmediate but does\n// not have MutationObservers.\n// Although setImmediate yields to the browser's renderer, it would be\n// preferrable to falling back to setTimeout since it does not have\n// the minimum 4ms penalty.\n// Unfortunately there appears to be a bug in Internet Explorer 10 Mobile (and\n// Desktop to a lesser extent) that renders both setImmediate and\n// MessageChannel useless for the purposes of ASAP.\n// https://github.com/kriskowal/q/issues/396\n\n// Timers are implemented universally.\n// We fall back to timers in workers in most engines, and in foreground\n// contexts in the following browsers.\n// However, note that even this simple case requires nuances to operate in a\n// broad spectrum of browsers.\n//\n// - Firefox 3-13\n// - Internet Explorer 6-9\n// - iPad Safari 4.3\n// - Lynx 2.8.7\n} else {\n requestFlush = makeRequestCallFromTimer(flush);\n}\n\n// `requestFlush` requests that the high priority event queue be flushed as\n// soon as possible.\n// This is useful to prevent an error thrown in a task from stalling the event\n// queue if the exception handled by Node.js’s\n// `process.on(\"uncaughtException\")` or by a domain.\nrawAsap.requestFlush = requestFlush;\n\n// To request a high priority event, we induce a mutation observer by toggling\n// the text of a text node between \"1\" and \"-1\".\nfunction makeRequestCallFromMutationObserver(callback) {\n var toggle = 1;\n var observer = new BrowserMutationObserver(callback);\n var node = document.createTextNode(\"\");\n observer.observe(node, {characterData: true});\n return function requestCall() {\n toggle = -toggle;\n node.data = toggle;\n };\n}\n\n// The message channel technique was discovered by Malte Ubl and was the\n// original foundation for this library.\n// http://www.nonblocking.io/2011/06/windownexttick.html\n\n// Safari 6.0.5 (at least) intermittently fails to create message ports on a\n// page's first load. Thankfully, this version of Safari supports\n// MutationObservers, so we don't need to fall back in that case.\n\n// function makeRequestCallFromMessageChannel(callback) {\n// var channel = new MessageChannel();\n// channel.port1.onmessage = callback;\n// return function requestCall() {\n// channel.port2.postMessage(0);\n// };\n// }\n\n// For reasons explained above, we are also unable to use `setImmediate`\n// under any circumstances.\n// Even if we were, there is another bug in Internet Explorer 10.\n// It is not sufficient to assign `setImmediate` to `requestFlush` because\n// `setImmediate` must be called *by name* and therefore must be wrapped in a\n// closure.\n// Never forget.\n\n// function makeRequestCallFromSetImmediate(callback) {\n// return function requestCall() {\n// setImmediate(callback);\n// };\n// }\n\n// Safari 6.0 has a problem where timers will get lost while the user is\n// scrolling. This problem does not impact ASAP because Safari 6.0 supports\n// mutation observers, so that implementation is used instead.\n// However, if we ever elect to use timers in Safari, the prevalent work-around\n// is to add a scroll event listener that calls for a flush.\n\n// `setTimeout` does not call the passed callback if the delay is less than\n// approximately 7 in web workers in Firefox 8 through 18, and sometimes not\n// even then.\n\nfunction makeRequestCallFromTimer(callback) {\n return function requestCall() {\n // We dispatch a timeout with a specified delay of 0 for engines that\n // can reliably accommodate that request. This will usually be snapped\n // to a 4 milisecond delay, but once we're flushing, there's no delay\n // between events.\n var timeoutHandle = setTimeout(handleTimer, 0);\n // However, since this timer gets frequently dropped in Firefox\n // workers, we enlist an interval handle that will try to fire\n // an event 20 times per second until it succeeds.\n var intervalHandle = setInterval(handleTimer, 50);\n\n function handleTimer() {\n // Whichever timer succeeds will cancel both timers and\n // execute the callback.\n clearTimeout(timeoutHandle);\n clearInterval(intervalHandle);\n callback();\n }\n };\n}\n\n// This is for `asap.js` only.\n// Its name will be periodically randomized to break any code that depends on\n// its existence.\nrawAsap.makeRequestCallFromTimer = makeRequestCallFromTimer;\n\n// ASAP was originally a nextTick shim included in Q. This was factored out\n// into this ASAP package. It was later adapted to RSVP which made further\n// amendments. These decisions, particularly to marginalize MessageChannel and\n// to capture the MutationObserver implementation in a closure, were integrated\n// back into ASAP proper.\n// https://github.com/tildeio/rsvp.js/blob/cddf7232546a9cf858524b75cde6f9edf72620a7/lib/rsvp/asap.js\n","'use strict';\n\nvar constants = require('./util/constants'),\n Logging = require('./mixins/logging');\n\nvar Faye = {\n VERSION: constants.VERSION,\n\n Client: require('./protocol/client'),\n Scheduler: require('./protocol/scheduler')\n};\n\nLogging.wrapper = Faye;\n\nmodule.exports = Faye;\n","'use strict';\n\nvar Promise = require('../util/promise');\n\nmodule.exports = {\n then: function(callback, errback) {\n var self = this;\n if (!this._promise)\n this._promise = new Promise(function(resolve, reject) {\n self._resolve = resolve;\n self._reject = reject;\n });\n\n if (arguments.length === 0)\n return this._promise;\n else\n return this._promise.then(callback, errback);\n },\n\n callback: function(callback, context) {\n return this.then(function(value) { callback.call(context, value) });\n },\n\n errback: function(callback, context) {\n return this.then(null, function(reason) { callback.call(context, reason) });\n },\n\n timeout: function(seconds, message) {\n this.then();\n var self = this;\n this._timer = global.setTimeout(function() {\n self._reject(message);\n }, seconds * 1000);\n },\n\n setDeferredStatus: function(status, value) {\n if (this._timer) global.clearTimeout(this._timer);\n\n this.then();\n\n if (status === 'succeeded')\n this._resolve(value);\n else if (status === 'failed')\n this._reject(value);\n else\n delete this._promise;\n }\n};\n","'use strict';\n\nvar toJSON = require('../util/to_json');\n\nvar Logging = {\n LOG_LEVELS: {\n fatal: 4,\n error: 3,\n warn: 2,\n info: 1,\n debug: 0\n },\n\n writeLog: function(messageArgs, level) {\n var logger = Logging.logger || (Logging.wrapper || Logging).logger;\n if (!logger) return;\n\n var args = Array.prototype.slice.apply(messageArgs),\n banner = '[Faye',\n klass = this.className,\n\n message = args.shift().replace(/\\?/g, function() {\n try {\n return toJSON(args.shift());\n } catch (error) {\n return '[Object]';\n }\n });\n\n if (klass) banner += '.' + klass;\n banner += '] ';\n\n if (typeof logger[level] === 'function')\n logger[level](banner + message);\n else if (typeof logger === 'function')\n logger(banner + message);\n }\n};\n\nfor (var key in Logging.LOG_LEVELS)\n (function(level) {\n Logging[level] = function() {\n this.writeLog(arguments, level);\n };\n })(key);\n\nmodule.exports = Logging;\n","'use strict';\n\nvar extend = require('../util/extend'),\n EventEmitter = require('../util/event_emitter');\n\nvar Publisher = {\n countListeners: function(eventType) {\n return this.listeners(eventType).length;\n },\n\n bind: function(eventType, listener, context) {\n var slice = Array.prototype.slice,\n handler = function() { listener.apply(context, slice.call(arguments)) };\n\n this._listeners = this._listeners || [];\n this._listeners.push([eventType, listener, context, handler]);\n return this.on(eventType, handler);\n },\n\n unbind: function(eventType, listener, context) {\n this._listeners = this._listeners || [];\n var n = this._listeners.length, tuple;\n\n while (n--) {\n tuple = this._listeners[n];\n if (tuple[0] !== eventType) continue;\n if (listener && (tuple[1] !== listener || tuple[2] !== context)) continue;\n this._listeners.splice(n, 1);\n this.removeListener(eventType, tuple[3]);\n }\n }\n};\n\nextend(Publisher, EventEmitter.prototype);\nPublisher.trigger = Publisher.emit;\n\nmodule.exports = Publisher;\n","'use strict';\n\nmodule.exports = {\n addTimeout: function(name, delay, callback, context) {\n this._timeouts = this._timeouts || {};\n if (this._timeouts.hasOwnProperty(name)) return;\n var self = this;\n this._timeouts[name] = global.setTimeout(function() {\n delete self._timeouts[name];\n callback.call(context);\n }, 1000 * delay);\n },\n\n removeTimeout: function(name) {\n this._timeouts = this._timeouts || {};\n var timeout = this._timeouts[name];\n if (!timeout) return;\n global.clearTimeout(timeout);\n delete this._timeouts[name];\n },\n\n removeAllTimeouts: function() {\n this._timeouts = this._timeouts || {};\n for (var name in this._timeouts) this.removeTimeout(name);\n }\n};\n","'use strict';\n\nvar Class = require('../util/class'),\n extend = require('../util/extend'),\n Publisher = require('../mixins/publisher'),\n Grammar = require('./grammar');\n\nvar Channel = Class({\n initialize: function(name) {\n this.id = this.name = name;\n },\n\n push: function(message) {\n this.trigger('message', message);\n },\n\n isUnused: function() {\n return this.countListeners('message') === 0;\n }\n});\n\nextend(Channel.prototype, Publisher);\n\nextend(Channel, {\n HANDSHAKE: '/meta/handshake',\n CONNECT: '/meta/connect',\n SUBSCRIBE: '/meta/subscribe',\n UNSUBSCRIBE: '/meta/unsubscribe',\n DISCONNECT: '/meta/disconnect',\n\n META: 'meta',\n SERVICE: 'service',\n\n expand: function(name) {\n var segments = this.parse(name),\n channels = ['/**', name];\n\n var copy = segments.slice();\n copy[copy.length - 1] = '*';\n channels.push(this.unparse(copy));\n\n for (var i = 1, n = segments.length; i < n; i++) {\n copy = segments.slice(0, i);\n copy.push('**');\n channels.push(this.unparse(copy));\n }\n\n return channels;\n },\n\n isValid: function(name) {\n return Grammar.CHANNEL_NAME.test(name) ||\n Grammar.CHANNEL_PATTERN.test(name);\n },\n\n parse: function(name) {\n if (!this.isValid(name)) return null;\n return name.split('/').slice(1);\n },\n\n unparse: function(segments) {\n return '/' + segments.join('/');\n },\n\n isMeta: function(name) {\n var segments = this.parse(name);\n return segments ? (segments[0] === this.META) : null;\n },\n\n isService: function(name) {\n var segments = this.parse(name);\n return segments ? (segments[0] === this.SERVICE) : null;\n },\n\n isSubscribable: function(name) {\n if (!this.isValid(name)) return null;\n return !this.isMeta(name) && !this.isService(name);\n },\n\n Set: Class({\n initialize: function() {\n this._channels = {};\n },\n\n getKeys: function() {\n var keys = [];\n for (var key in this._channels) keys.push(key);\n return keys;\n },\n\n remove: function(name) {\n delete this._channels[name];\n },\n\n hasSubscription: function(name) {\n return this._channels.hasOwnProperty(name);\n },\n\n subscribe: function(names, subscription) {\n var name;\n for (var i = 0, n = names.length; i < n; i++) {\n name = names[i];\n var channel = this._channels[name] = this._channels[name] || new Channel(name);\n channel.bind('message', subscription);\n }\n },\n\n unsubscribe: function(name, subscription) {\n var channel = this._channels[name];\n if (!channel) return false;\n channel.unbind('message', subscription);\n\n if (channel.isUnused()) {\n this.remove(name);\n return true;\n } else {\n return false;\n }\n },\n\n distributeMessage: function(message) {\n var channels = Channel.expand(message.channel);\n\n for (var i = 0, n = channels.length; i < n; i++) {\n var channel = this._channels[channels[i]];\n if (channel) channel.trigger('message', message);\n }\n }\n })\n});\n\nmodule.exports = Channel;\n","'use strict';\n\nvar asap = require('asap'),\n Class = require('../util/class'),\n Promise = require('../util/promise'),\n URI = require('../util/uri'),\n array = require('../util/array'),\n browser = require('../util/browser'),\n constants = require('../util/constants'),\n extend = require('../util/extend'),\n validateOptions = require('../util/validate_options'),\n Deferrable = require('../mixins/deferrable'),\n Logging = require('../mixins/logging'),\n Publisher = require('../mixins/publisher'),\n Channel = require('./channel'),\n Dispatcher = require('./dispatcher'),\n Error = require('./error'),\n Extensible = require('./extensible'),\n Publication = require('./publication'),\n Subscription = require('./subscription');\n\nvar Client = Class({ className: 'Client',\n UNCONNECTED: 1,\n CONNECTING: 2,\n CONNECTED: 3,\n DISCONNECTED: 4,\n\n HANDSHAKE: 'handshake',\n RETRY: 'retry',\n NONE: 'none',\n\n CONNECTION_TIMEOUT: 60,\n\n DEFAULT_ENDPOINT: '/bayeux',\n INTERVAL: 0,\n\n initialize: function(endpoint, options) {\n this.info('New client created for ?', endpoint);\n options = options || {};\n\n validateOptions(options, ['interval', 'timeout', 'endpoints', 'proxy', 'retry', 'scheduler', 'websocketExtensions', 'tls', 'ca']);\n\n this._channels = new Channel.Set();\n this._dispatcher = Dispatcher.create(this, endpoint || this.DEFAULT_ENDPOINT, options);\n\n this._messageId = 0;\n this._state = this.UNCONNECTED;\n\n this._responseCallbacks = {};\n\n this._advice = {\n reconnect: this.RETRY,\n interval: 1000 * (options.interval || this.INTERVAL),\n timeout: 1000 * (options.timeout || this.CONNECTION_TIMEOUT)\n };\n this._dispatcher.timeout = this._advice.timeout / 1000;\n\n this._dispatcher.bind('message', this._receiveMessage, this);\n\n if (browser.Event && global.onbeforeunload !== undefined)\n browser.Event.on(global, 'beforeunload', function() {\n if (array.indexOf(this._dispatcher._disabled, 'autodisconnect') < 0)\n this.disconnect();\n }, this);\n },\n\n addWebsocketExtension: function(extension) {\n return this._dispatcher.addWebsocketExtension(extension);\n },\n\n disable: function(feature) {\n return this._dispatcher.disable(feature);\n },\n\n setHeader: function(name, value) {\n return this._dispatcher.setHeader(name, value);\n },\n\n // Request\n // MUST include: * channel\n // * version\n // * supportedConnectionTypes\n // MAY include: * minimumVersion\n // * ext\n // * id\n //\n // Success Response Failed Response\n // MUST include: * channel MUST include: * channel\n // * version * successful\n // * supportedConnectionTypes * error\n // * clientId MAY include: * supportedConnectionTypes\n // * successful * advice\n // MAY include: * minimumVersion * version\n // * advice * minimumVersion\n // * ext * ext\n // * id * id\n // * authSuccessful\n handshake: function(callback, context) {\n if (this._advice.reconnect === this.NONE) return;\n if (this._state !== this.UNCONNECTED) return;\n\n this._state = this.CONNECTING;\n var self = this;\n\n this.info('Initiating handshake with ?', URI.stringify(this._dispatcher.endpoint));\n this._dispatcher.selectTransport(constants.MANDATORY_CONNECTION_TYPES);\n\n this._sendMessage({\n channel: Channel.HANDSHAKE,\n version: constants.BAYEUX_VERSION,\n supportedConnectionTypes: this._dispatcher.getConnectionTypes()\n\n }, {}, function(response) {\n\n if (response.successful) {\n this._state = this.CONNECTED;\n this._dispatcher.clientId = response.clientId;\n\n this._dispatcher.selectTransport(response.supportedConnectionTypes);\n\n this.info('Handshake successful: ?', this._dispatcher.clientId);\n\n this.subscribe(this._channels.getKeys(), true);\n if (callback) asap(function() { callback.call(context) });\n\n } else {\n this.info('Handshake unsuccessful');\n global.setTimeout(function() { self.handshake(callback, context) }, this._dispatcher.retry * 1000);\n this._state = this.UNCONNECTED;\n }\n }, this);\n },\n\n // Request Response\n // MUST include: * channel MUST include: * channel\n // * clientId * successful\n // * connectionType * clientId\n // MAY include: * ext MAY include: * error\n // * id * advice\n // * ext\n // * id\n // * timestamp\n connect: function(callback, context) {\n if (this._advice.reconnect === this.NONE) return;\n if (this._state === this.DISCONNECTED) return;\n\n if (this._state === this.UNCONNECTED)\n return this.handshake(function() { this.connect(callback, context) }, this);\n\n this.callback(callback, context);\n if (this._state !== this.CONNECTED) return;\n\n this.info('Calling deferred actions for ?', this._dispatcher.clientId);\n this.setDeferredStatus('succeeded');\n this.setDeferredStatus('unknown');\n\n if (this._connectRequest) return;\n this._connectRequest = true;\n\n this.info('Initiating connection for ?', this._dispatcher.clientId);\n\n this._sendMessage({\n channel: Channel.CONNECT,\n clientId: this._dispatcher.clientId,\n connectionType: this._dispatcher.connectionType\n\n }, {}, this._cycleConnection, this);\n },\n\n // Request Response\n // MUST include: * channel MUST include: * channel\n // * clientId * successful\n // MAY include: * ext * clientId\n // * id MAY include: * error\n // * ext\n // * id\n disconnect: function() {\n if (this._state !== this.CONNECTED) return;\n this._state = this.DISCONNECTED;\n\n this.info('Disconnecting ?', this._dispatcher.clientId);\n var promise = new Publication();\n\n this._sendMessage({\n channel: Channel.DISCONNECT,\n clientId: this._dispatcher.clientId\n\n }, {}, function(response) {\n if (response.successful) {\n this._dispatcher.close();\n promise.setDeferredStatus('succeeded');\n } else {\n promise.setDeferredStatus('failed', Error.parse(response.error));\n }\n }, this);\n\n this.info('Clearing channel listeners for ?', this._dispatcher.clientId);\n this._channels = new Channel.Set();\n\n return promise;\n },\n\n // Request Response\n // MUST include: * channel MUST include: * channel\n // * clientId * successful\n // * subscription * clientId\n // MAY include: * ext * subscription\n // * id MAY include: * error\n // * advice\n // * ext\n // * id\n // * timestamp\n subscribe: function(channel, callback, context) {\n if (channel instanceof Array)\n return array.map(channel, function(c) {\n return this.subscribe(c, callback, context);\n }, this);\n\n var subscription = new Subscription(this, channel, callback, context),\n force = (callback === true),\n hasSubscribe = this._channels.hasSubscription(channel);\n\n if (hasSubscribe && !force) {\n this._channels.subscribe([channel], subscription);\n subscription.setDeferredStatus('succeeded');\n return subscription;\n }\n\n this.connect(function() {\n this.info('Client ? attempting to subscribe to ?', this._dispatcher.clientId, channel);\n if (!force) this._channels.subscribe([channel], subscription);\n\n this._sendMessage({\n channel: Channel.SUBSCRIBE,\n clientId: this._dispatcher.clientId,\n subscription: channel\n\n }, {}, function(response) {\n if (!response.successful) {\n subscription.setDeferredStatus('failed', Error.parse(response.error));\n return this._channels.unsubscribe(channel, subscription);\n }\n\n var channels = [].concat(response.subscription);\n this.info('Subscription acknowledged for ? to ?', this._dispatcher.clientId, channels);\n subscription.setDeferredStatus('succeeded');\n }, this);\n }, this);\n\n return subscription;\n },\n\n // Request Response\n // MUST include: * channel MUST include: * channel\n // * clientId * successful\n // * subscription * clientId\n // MAY include: * ext * subscription\n // * id MAY include: * error\n // * advice\n // * ext\n // * id\n // * timestamp\n unsubscribe: function(channel, subscription) {\n if (channel instanceof Array)\n return array.map(channel, function(c) {\n return this.unsubscribe(c, subscription);\n }, this);\n\n var dead = this._channels.unsubscribe(channel, subscription);\n if (!dead) return;\n\n this.connect(function() {\n this.info('Client ? attempting to unsubscribe from ?', this._dispatcher.clientId, channel);\n\n this._sendMessage({\n channel: Channel.UNSUBSCRIBE,\n clientId: this._dispatcher.clientId,\n subscription: channel\n\n }, {}, function(response) {\n if (!response.successful) return;\n\n var channels = [].concat(response.subscription);\n this.info('Unsubscription acknowledged for ? from ?', this._dispatcher.clientId, channels);\n }, this);\n }, this);\n },\n\n // Request Response\n // MUST include: * channel MUST include: * channel\n // * data * successful\n // MAY include: * clientId MAY include: * id\n // * id * error\n // * ext * ext\n publish: function(channel, data, options) {\n validateOptions(options || {}, ['attempts', 'deadline']);\n var publication = new Publication();\n\n this.connect(function() {\n this.info('Client ? queueing published message to ?: ?', this._dispatcher.clientId, channel, data);\n\n this._sendMessage({\n channel: channel,\n data: data,\n clientId: this._dispatcher.clientId\n\n }, options, function(response) {\n if (response.successful)\n publication.setDeferredStatus('succeeded');\n else\n publication.setDeferredStatus('failed', Error.parse(response.error));\n }, this);\n }, this);\n\n return publication;\n },\n\n _sendMessage: function(message, options, callback, context) {\n message.id = this._generateMessageId();\n\n var timeout = this._advice.timeout\n ? 1.2 * this._advice.timeout / 1000\n : 1.2 * this._dispatcher.retry;\n\n this.pipeThroughExtensions('outgoing', message, null, function(message) {\n if (!message) return;\n if (callback) this._responseCallbacks[message.id] = [callback, context];\n this._dispatcher.sendMessage(message, timeout, options || {});\n }, this);\n },\n\n _generateMessageId: function() {\n this._messageId += 1;\n if (this._messageId >= Math.pow(2,32)) this._messageId = 0;\n return this._messageId.toString(36);\n },\n\n _receiveMessage: function(message) {\n var id = message.id, callback;\n\n if (message.successful !== undefined) {\n callback = this._responseCallbacks[id];\n delete this._responseCallbacks[id];\n }\n\n this.pipeThroughExtensions('incoming', message, null, function(message) {\n if (!message) return;\n if (message.advice) this._handleAdvice(message.advice);\n this._deliverMessage(message);\n if (callback) callback[0].call(callback[1], message);\n }, this);\n },\n\n _handleAdvice: function(advice) {\n extend(this._advice, advice);\n this._dispatcher.timeout = this._advice.timeout / 1000;\n\n if (this._advice.reconnect === this.HANDSHAKE && this._state !== this.DISCONNECTED) {\n this._state = this.UNCONNECTED;\n this._dispatcher.clientId = null;\n this._cycleConnection();\n }\n },\n\n _deliverMessage: function(message) {\n if (!message.channel || message.data === undefined) return;\n this.info('Client ? calling listeners for ? with ?', this._dispatcher.clientId, message.channel, message.data);\n this._channels.distributeMessage(message);\n },\n\n _cycleConnection: function() {\n if (this._connectRequest) {\n this._connectRequest = null;\n this.info('Closed connection for ?', this._dispatcher.clientId);\n }\n var self = this;\n global.setTimeout(function() { self.connect() }, this._advice.interval);\n }\n});\n\nextend(Client.prototype, Deferrable);\nextend(Client.prototype, Publisher);\nextend(Client.prototype, Logging);\nextend(Client.prototype, Extensible);\n\nmodule.exports = Client;\n","'use strict';\n\nvar Class = require('../util/class'),\n URI = require('../util/uri'),\n cookies = require('../util/cookies'),\n extend = require('../util/extend'),\n Logging = require('../mixins/logging'),\n Publisher = require('../mixins/publisher'),\n Transport = require('../transport'),\n Scheduler = require('./scheduler');\n\nvar Dispatcher = Class({ className: 'Dispatcher',\n MAX_REQUEST_SIZE: 2048,\n DEFAULT_RETRY: 5,\n\n UP: 1,\n DOWN: 2,\n\n initialize: function(client, endpoint, options) {\n this._client = client;\n this.endpoint = URI.parse(endpoint);\n this._alternates = options.endpoints || {};\n\n this.cookies = cookies.CookieJar && new cookies.CookieJar();\n this._disabled = [];\n this._envelopes = {};\n this.headers = {};\n this.retry = options.retry || this.DEFAULT_RETRY;\n this._scheduler = options.scheduler || Scheduler;\n this._state = 0;\n this.transports = {};\n this.wsExtensions = [];\n\n this.proxy = options.proxy || {};\n if (typeof this._proxy === 'string') this._proxy = {origin: this._proxy};\n\n var exts = options.websocketExtensions;\n if (exts) {\n exts = [].concat(exts);\n for (var i = 0, n = exts.length; i < n; i++)\n this.addWebsocketExtension(exts[i]);\n }\n\n this.tls = options.tls || {};\n this.tls.ca = this.tls.ca || options.ca;\n\n for (var type in this._alternates)\n this._alternates[type] = URI.parse(this._alternates[type]);\n\n this.maxRequestSize = this.MAX_REQUEST_SIZE;\n },\n\n endpointFor: function(connectionType) {\n return this._alternates[connectionType] || this.endpoint;\n },\n\n addWebsocketExtension: function(extension) {\n this.wsExtensions.push(extension);\n },\n\n disable: function(feature) {\n this._disabled.push(feature);\n },\n\n setHeader: function(name, value) {\n this.headers[name] = value;\n },\n\n close: function() {\n var transport = this._transport;\n delete this._transport;\n if (transport) transport.close();\n },\n\n getConnectionTypes: function() {\n return Transport.getConnectionTypes();\n },\n\n selectTransport: function(transportTypes) {\n Transport.get(this, transportTypes, this._disabled, function(transport) {\n this.debug('Selected ? transport for ?', transport.connectionType, URI.stringify(transport.endpoint));\n\n if (transport === this._transport) return;\n if (this._transport) this._transport.close();\n\n this._transport = transport;\n this.connectionType = transport.connectionType;\n }, this);\n },\n\n sendMessage: function(message, timeout, options) {\n options = options || {};\n\n var id = message.id,\n attempts = options.attempts,\n deadline = options.deadline && new Date().getTime() + (options.deadline * 1000),\n envelope = this._envelopes[id],\n scheduler;\n\n if (!envelope) {\n scheduler = new this._scheduler(message, {timeout: timeout, interval: this.retry, attempts: attempts, deadline: deadline});\n envelope = this._envelopes[id] = {message: message, scheduler: scheduler};\n }\n\n this._sendEnvelope(envelope);\n },\n\n _sendEnvelope: function(envelope) {\n if (!this._transport) return;\n if (envelope.request || envelope.timer) return;\n\n var message = envelope.message,\n scheduler = envelope.scheduler,\n self = this;\n\n if (!scheduler.isDeliverable()) {\n scheduler.abort();\n delete this._envelopes[message.id];\n return;\n }\n\n envelope.timer = global.setTimeout(function() {\n self.handleError(message);\n }, scheduler.getTimeout() * 1000);\n\n scheduler.send();\n envelope.request = this._transport.sendMessage(message);\n },\n\n handleResponse: function(reply) {\n var envelope = this._envelopes[reply.id];\n\n if (reply.successful !== undefined && envelope) {\n envelope.scheduler.succeed();\n delete this._envelopes[reply.id];\n global.clearTimeout(envelope.timer);\n }\n\n this.trigger('message', reply);\n\n if (this._state === this.UP) return;\n this._state = this.UP;\n this._client.trigger('transport:up');\n },\n\n handleError: function(message, immediate) {\n var envelope = this._envelopes[message.id],\n request = envelope && envelope.request,\n self = this;\n\n if (!request) return;\n\n request.then(function(req) {\n if (req && req.abort) req.abort();\n });\n\n var scheduler = envelope.scheduler;\n scheduler.fail();\n\n global.clearTimeout(envelope.timer);\n envelope.request = envelope.timer = null;\n\n if (immediate) {\n this._sendEnvelope(envelope);\n } else {\n envelope.timer = global.setTimeout(function() {\n envelope.timer = null;\n self._sendEnvelope(envelope);\n }, scheduler.getInterval() * 1000);\n }\n\n if (this._state === this.DOWN) return;\n this._state = this.DOWN;\n this._client.trigger('transport:down');\n }\n});\n\nDispatcher.create = function(client, endpoint, options) {\n return new Dispatcher(client, endpoint, options);\n};\n\nextend(Dispatcher.prototype, Publisher);\nextend(Dispatcher.prototype, Logging);\n\nmodule.exports = Dispatcher;\n","'use strict';\n\nvar Class = require('../util/class'),\n Grammar = require('./grammar');\n\nvar Error = Class({\n initialize: function(code, params, message) {\n this.code = code;\n this.params = Array.prototype.slice.call(params);\n this.message = message;\n },\n\n toString: function() {\n return this.code + ':' +\n this.params.join(',') + ':' +\n this.message;\n }\n});\n\nError.parse = function(message) {\n message = message || '';\n if (!Grammar.ERROR.test(message)) return new Error(null, [], message);\n\n var parts = message.split(':'),\n code = parseInt(parts[0]),\n params = parts[1].split(','),\n message = parts[2];\n\n return new Error(code, params, message);\n};\n\n// http://code.google.com/p/cometd/wiki/BayeuxCodes\nvar errors = {\n versionMismatch: [300, 'Version mismatch'],\n conntypeMismatch: [301, 'Connection types not supported'],\n extMismatch: [302, 'Extension mismatch'],\n badRequest: [400, 'Bad request'],\n clientUnknown: [401, 'Unknown client'],\n parameterMissing: [402, 'Missing required parameter'],\n channelForbidden: [403, 'Forbidden channel'],\n channelUnknown: [404, 'Unknown channel'],\n channelInvalid: [405, 'Invalid channel'],\n extUnknown: [406, 'Unknown extension'],\n publishFailed: [407, 'Failed to publish'],\n serverError: [500, 'Internal server error']\n};\n\nfor (var name in errors)\n (function(name) {\n Error[name] = function() {\n return new Error(errors[name][0], arguments, errors[name][1]).toString();\n };\n })(name);\n\nmodule.exports = Error;\n","'use strict';\n\nvar extend = require('../util/extend'),\n Logging = require('../mixins/logging');\n\nvar Extensible = {\n addExtension: function(extension) {\n this._extensions = this._extensions || [];\n this._extensions.push(extension);\n if (extension.added) extension.added(this);\n },\n\n removeExtension: function(extension) {\n if (!this._extensions) return;\n var i = this._extensions.length;\n while (i--) {\n if (this._extensions[i] !== extension) continue;\n this._extensions.splice(i,1);\n if (extension.removed) extension.removed(this);\n }\n },\n\n pipeThroughExtensions: function(stage, message, request, callback, context) {\n this.debug('Passing through ? extensions: ?', stage, message);\n\n if (!this._extensions) return callback.call(context, message);\n var extensions = this._extensions.slice();\n\n var pipe = function(message) {\n if (!message) return callback.call(context, message);\n\n var extension = extensions.shift();\n if (!extension) return callback.call(context, message);\n\n var fn = extension[stage];\n if (!fn) return pipe(message);\n\n if (fn.length >= 3) extension[stage](message, request, pipe);\n else extension[stage](message, pipe);\n };\n pipe(message);\n }\n};\n\nextend(Extensible, Logging);\n\nmodule.exports = Extensible;\n","'use strict';\n\nmodule.exports = {\n CHANNEL_NAME: /^\\/(((([a-z]|[A-Z])|[0-9])|(\\-|\\_|\\!|\\~|\\(|\\)|\\$|\\@)))+(\\/(((([a-z]|[A-Z])|[0-9])|(\\-|\\_|\\!|\\~|\\(|\\)|\\$|\\@)))+)*$/,\n CHANNEL_PATTERN: /^(\\/(((([a-z]|[A-Z])|[0-9])|(\\-|\\_|\\!|\\~|\\(|\\)|\\$|\\@)))+)*\\/\\*{1,2}$/,\n ERROR: /^([0-9][0-9][0-9]:(((([a-z]|[A-Z])|[0-9])|(\\-|\\_|\\!|\\~|\\(|\\)|\\$|\\@)| |\\/|\\*|\\.))*(,(((([a-z]|[A-Z])|[0-9])|(\\-|\\_|\\!|\\~|\\(|\\)|\\$|\\@)| |\\/|\\*|\\.))*)*:(((([a-z]|[A-Z])|[0-9])|(\\-|\\_|\\!|\\~|\\(|\\)|\\$|\\@)| |\\/|\\*|\\.))*|[0-9][0-9][0-9]::(((([a-z]|[A-Z])|[0-9])|(\\-|\\_|\\!|\\~|\\(|\\)|\\$|\\@)| |\\/|\\*|\\.))*)$/,\n VERSION: /^([0-9])+(\\.(([a-z]|[A-Z])|[0-9])(((([a-z]|[A-Z])|[0-9])|\\-|\\_))*)*$/\n};\n","'use strict';\n\nvar Class = require('../util/class'),\n Deferrable = require('../mixins/deferrable');\n\nmodule.exports = Class(Deferrable);\n","'use strict';\n\nvar extend = require('../util/extend');\n\nvar Scheduler = function(message, options) {\n this.message = message;\n this.options = options;\n this.attempts = 0;\n};\n\nextend(Scheduler.prototype, {\n getTimeout: function() {\n return this.options.timeout;\n },\n\n getInterval: function() {\n return this.options.interval;\n },\n\n isDeliverable: function() {\n var attempts = this.options.attempts,\n made = this.attempts,\n deadline = this.options.deadline,\n now = new Date().getTime();\n\n if (attempts !== undefined && made >= attempts)\n return false;\n\n if (deadline !== undefined && now > deadline)\n return false;\n\n return true;\n },\n\n send: function() {\n this.attempts += 1;\n },\n\n succeed: function() {},\n\n fail: function() {},\n\n abort: function() {}\n});\n\nmodule.exports = Scheduler;\n","'use strict';\n\nvar Class = require('../util/class'),\n extend = require('../util/extend'),\n Deferrable = require('../mixins/deferrable');\n\nvar Subscription = Class({\n initialize: function(client, channels, callback, context) {\n this._client = client;\n this._channels = channels;\n this._callback = callback;\n this._context = context;\n this._cancelled = false;\n },\n\n withChannel: function(callback, context) {\n this._withChannel = [callback, context];\n return this;\n },\n\n apply: function(context, args) {\n var message = args[0];\n\n if (this._callback)\n this._callback.call(this._context, message.data);\n\n if (this._withChannel)\n this._withChannel[0].call(this._withChannel[1], message.channel, message.data);\n },\n\n cancel: function() {\n if (this._cancelled) return;\n this._client.unsubscribe(this._channels, this);\n this._cancelled = true;\n },\n\n unsubscribe: function() {\n this.cancel();\n }\n});\n\nextend(Subscription.prototype, Deferrable);\n\nmodule.exports = Subscription;\n","'use strict';\n\nvar Transport = require('./transport');\n\nTransport.register('websocket', require('./web_socket'));\nTransport.register('eventsource', require('./event_source'));\nTransport.register('long-polling', require('./xhr'));\nTransport.register('cross-origin-long-polling', require('./cors'));\nTransport.register('callback-polling', require('./jsonp'));\n\nmodule.exports = Transport;\n","'use strict';\n\nvar Class = require('../util/class'),\n Set = require('../util/set'),\n URI = require('../util/uri'),\n extend = require('../util/extend'),\n toJSON = require('../util/to_json'),\n Transport = require('./transport');\n\nvar CORS = extend(Class(Transport, {\n encode: function(messages) {\n return 'message=' + encodeURIComponent(toJSON(messages));\n },\n\n request: function(messages) {\n var xhrClass = global.XDomainRequest ? XDomainRequest : XMLHttpRequest,\n xhr = new xhrClass(),\n id = ++CORS._id,\n headers = this._dispatcher.headers,\n self = this,\n key;\n\n xhr.open('POST', URI.stringify(this.endpoint), true);\n\n if (xhr.setRequestHeader) {\n xhr.setRequestHeader('Pragma', 'no-cache');\n for (key in headers) {\n if (!headers.hasOwnProperty(key)) continue;\n xhr.setRequestHeader(key, headers[key]);\n }\n }\n\n var cleanUp = function() {\n if (!xhr) return false;\n CORS._pending.remove(id);\n xhr.onload = xhr.onerror = xhr.ontimeout = xhr.onprogress = null;\n xhr = null;\n };\n\n xhr.onload = function() {\n var replies;\n try { replies = JSON.parse(xhr.responseText) } catch (error) {}\n\n cleanUp();\n\n if (replies)\n self._receive(replies);\n else\n self._handleError(messages);\n };\n\n xhr.onerror = xhr.ontimeout = function() {\n cleanUp();\n self._handleError(messages);\n };\n\n xhr.onprogress = function() {};\n\n if (xhrClass === global.XDomainRequest)\n CORS._pending.add({id: id, xhr: xhr});\n\n xhr.send(this.encode(messages));\n return xhr;\n }\n}), {\n _id: 0,\n _pending: new Set(),\n\n isUsable: function(dispatcher, endpoint, callback, context) {\n if (URI.isSameOrigin(endpoint))\n return callback.call(context, false);\n\n if (global.XDomainRequest)\n return callback.call(context, endpoint.protocol === location.protocol);\n\n if (global.XMLHttpRequest) {\n var xhr = new XMLHttpRequest();\n return callback.call(context, xhr.withCredentials !== undefined);\n }\n return callback.call(context, false);\n }\n});\n\nmodule.exports = CORS;\n","'use strict';\n\nvar Class = require('../util/class'),\n URI = require('../util/uri'),\n copyObject = require('../util/copy_object'),\n extend = require('../util/extend'),\n Deferrable = require('../mixins/deferrable'),\n Transport = require('./transport'),\n XHR = require('./xhr');\n\nvar EventSource = extend(Class(Transport, {\n initialize: function(dispatcher, endpoint) {\n Transport.prototype.initialize.call(this, dispatcher, endpoint);\n if (!global.EventSource) return this.setDeferredStatus('failed');\n\n this._xhr = new XHR(dispatcher, endpoint);\n\n endpoint = copyObject(endpoint);\n endpoint.pathname += '/' + dispatcher.clientId;\n\n var socket = new global.EventSource(URI.stringify(endpoint)),\n self = this;\n\n socket.onopen = function() {\n self._everConnected = true;\n self.setDeferredStatus('succeeded');\n };\n\n socket.onerror = function() {\n if (self._everConnected) {\n self._handleError([]);\n } else {\n self.setDeferredStatus('failed');\n socket.close();\n }\n };\n\n socket.onmessage = function(event) {\n var replies;\n try { replies = JSON.parse(event.data) } catch (error) {}\n\n if (replies)\n self._receive(replies);\n else\n self._handleError([]);\n };\n\n this._socket = socket;\n },\n\n close: function() {\n if (!this._socket) return;\n this._socket.onopen = this._socket.onerror = this._socket.onmessage = null;\n this._socket.close();\n delete this._socket;\n },\n\n isUsable: function(callback, context) {\n this.callback(function() { callback.call(context, true) });\n this.errback(function() { callback.call(context, false) });\n },\n\n encode: function(messages) {\n return this._xhr.encode(messages);\n },\n\n request: function(messages) {\n return this._xhr.request(messages);\n }\n\n}), {\n isUsable: function(dispatcher, endpoint, callback, context) {\n var id = dispatcher.clientId;\n if (!id) return callback.call(context, false);\n\n XHR.isUsable(dispatcher, endpoint, function(usable) {\n if (!usable) return callback.call(context, false);\n this.create(dispatcher, endpoint).isUsable(callback, context);\n }, this);\n },\n\n create: function(dispatcher, endpoint) {\n var sockets = dispatcher.transports.eventsource = dispatcher.transports.eventsource || {},\n id = dispatcher.clientId;\n\n var url = copyObject(endpoint);\n url.pathname += '/' + (id || '');\n url = URI.stringify(url);\n\n sockets[url] = sockets[url] || new this(dispatcher, endpoint);\n return sockets[url];\n }\n});\n\nextend(EventSource.prototype, Deferrable);\n\nmodule.exports = EventSource;\n","'use strict';\n\nvar Class = require('../util/class'),\n URI = require('../util/uri'),\n copyObject = require('../util/copy_object'),\n extend = require('../util/extend'),\n toJSON = require('../util/to_json'),\n Transport = require('./transport');\n\nvar JSONP = extend(Class(Transport, {\n encode: function(messages) {\n var url = copyObject(this.endpoint);\n url.query.message = toJSON(messages);\n url.query.jsonp = '__jsonp' + JSONP._cbCount + '__';\n return URI.stringify(url);\n },\n\n request: function(messages) {\n var head = document.getElementsByTagName('head')[0],\n script = document.createElement('script'),\n callbackName = JSONP.getCallbackName(),\n endpoint = copyObject(this.endpoint),\n self = this;\n\n endpoint.query.message = toJSON(messages);\n endpoint.query.jsonp = callbackName;\n\n var cleanup = function() {\n if (!global[callbackName]) return false;\n global[callbackName] = undefined;\n try { delete global[callbackName] } catch (error) {}\n script.parentNode.removeChild(script);\n };\n\n global[callbackName] = function(replies) {\n cleanup();\n self._receive(replies);\n };\n\n script.type = 'text/javascript';\n script.src = URI.stringify(endpoint);\n head.appendChild(script);\n\n script.onerror = function() {\n cleanup();\n self._handleError(messages);\n };\n\n return {abort: cleanup};\n }\n}), {\n _cbCount: 0,\n\n getCallbackName: function() {\n this._cbCount += 1;\n return '__jsonp' + this._cbCount + '__';\n },\n\n isUsable: function(dispatcher, endpoint, callback, context) {\n callback.call(context, true);\n }\n});\n\nmodule.exports = JSONP;\n","'use strict';\n\nvar Class = require('../util/class'),\n Cookie = require('../util/cookies').Cookie,\n Promise = require('../util/promise'),\n URI = require('../util/uri'),\n array = require('../util/array'),\n extend = require('../util/extend'),\n Logging = require('../mixins/logging'),\n Timeouts = require('../mixins/timeouts'),\n Channel = require('../protocol/channel');\n\nvar Transport = extend(Class({ className: 'Transport',\n DEFAULT_PORTS: {'http:': 80, 'https:': 443, 'ws:': 80, 'wss:': 443},\n MAX_DELAY: 0,\n\n batching: true,\n\n initialize: function(dispatcher, endpoint) {\n this._dispatcher = dispatcher;\n this.endpoint = endpoint;\n this._outbox = [];\n this._proxy = extend({}, this._dispatcher.proxy);\n\n if (!this._proxy.origin)\n this._proxy.origin = this._findProxy();\n },\n\n close: function() {},\n\n encode: function(messages) {\n return '';\n },\n\n sendMessage: function(message) {\n this.debug('Client ? sending message to ?: ?',\n this._dispatcher.clientId, URI.stringify(this.endpoint), message);\n\n if (!this.batching) return Promise.resolve(this.request([message]));\n\n this._outbox.push(message);\n this._flushLargeBatch();\n\n if (message.channel === Channel.HANDSHAKE)\n return this._publish(0.01);\n\n if (message.channel === Channel.CONNECT)\n this._connectMessage = message;\n\n return this._publish(this.MAX_DELAY);\n },\n\n _makePromise: function() {\n var self = this;\n\n this._requestPromise = this._requestPromise || new Promise(function(resolve) {\n self._resolvePromise = resolve;\n });\n },\n\n _publish: function(delay) {\n this._makePromise();\n\n this.addTimeout('publish', delay, function() {\n this._flush();\n delete this._requestPromise;\n }, this);\n\n return this._requestPromise;\n },\n\n _flush: function() {\n this.removeTimeout('publish');\n\n if (this._outbox.length > 1 && this._connectMessage)\n this._connectMessage.advice = {timeout: 0};\n\n this._resolvePromise(this.request(this._outbox));\n\n this._connectMessage = null;\n this._outbox = [];\n },\n\n _flushLargeBatch: function() {\n var string = this.encode(this._outbox);\n if (string.length < this._dispatcher.maxRequestSize) return;\n var last = this._outbox.pop();\n\n this._makePromise();\n this._flush();\n\n if (last) this._outbox.push(last);\n },\n\n _receive: function(replies) {\n if (!replies) return;\n replies = [].concat(replies);\n\n this.debug('Client ? received from ? via ?: ?',\n this._dispatcher.clientId, URI.stringify(this.endpoint), this.connectionType, replies);\n\n for (var i = 0, n = replies.length; i < n; i++)\n this._dispatcher.handleResponse(replies[i]);\n },\n\n _handleError: function(messages, immediate) {\n messages = [].concat(messages);\n\n this.debug('Client ? failed to send to ? via ?: ?',\n this._dispatcher.clientId, URI.stringify(this.endpoint), this.connectionType, messages);\n\n for (var i = 0, n = messages.length; i < n; i++)\n this._dispatcher.handleError(messages[i]);\n },\n\n _getCookies: function() {\n var cookies = this._dispatcher.cookies,\n url = URI.stringify(this.endpoint);\n\n if (!cookies) return '';\n\n return array.map(cookies.getCookiesSync(url), function(cookie) {\n return cookie.cookieString();\n }).join('; ');\n },\n\n _storeCookies: function(setCookie) {\n var cookies = this._dispatcher.cookies,\n url = URI.stringify(this.endpoint),\n cookie;\n\n if (!setCookie || !cookies) return;\n setCookie = [].concat(setCookie);\n\n for (var i = 0, n = setCookie.length; i < n; i++) {\n cookie = Cookie.parse(setCookie[i]);\n cookies.setCookieSync(cookie, url);\n }\n },\n\n _findProxy: function() {\n if (typeof process === 'undefined') return undefined;\n\n var protocol = this.endpoint.protocol;\n if (!protocol) return undefined;\n\n var name = protocol.replace(/:$/, '').toLowerCase() + '_proxy',\n upcase = name.toUpperCase(),\n env = process.env,\n keys, proxy;\n\n if (name === 'http_proxy' && env.REQUEST_METHOD) {\n keys = Object.keys(env).filter(function(k) { return /^http_proxy$/i.test(k) });\n if (keys.length === 1) {\n if (keys[0] === name && env[upcase] === undefined)\n proxy = env[name];\n } else if (keys.length > 1) {\n proxy = env[name];\n }\n proxy = proxy || env['CGI_' + upcase];\n } else {\n proxy = env[name] || env[upcase];\n if (proxy && !env[name])\n console.warn('The environment variable ' + upcase +\n ' is discouraged. Use ' + name + '.');\n }\n return proxy;\n }\n\n}), {\n get: function(dispatcher, allowed, disabled, callback, context) {\n var endpoint = dispatcher.endpoint;\n\n array.asyncEach(this._transports, function(pair, resume) {\n var connType = pair[0], klass = pair[1],\n connEndpoint = dispatcher.endpointFor(connType);\n\n if (array.indexOf(disabled, connType) >= 0)\n return resume();\n\n if (array.indexOf(allowed, connType) < 0) {\n klass.isUsable(dispatcher, connEndpoint, function() {});\n return resume();\n }\n\n klass.isUsable(dispatcher, connEndpoint, function(isUsable) {\n if (!isUsable) return resume();\n var transport = klass.hasOwnProperty('create') ? klass.create(dispatcher, connEndpoint) : new klass(dispatcher, connEndpoint);\n callback.call(context, transport);\n });\n }, function() {\n throw new Error('Could not find a usable connection type for ' + URI.stringify(endpoint));\n });\n },\n\n register: function(type, klass) {\n this._transports.push([type, klass]);\n klass.prototype.connectionType = type;\n },\n\n getConnectionTypes: function() {\n return array.map(this._transports, function(t) { return t[0] });\n },\n\n _transports: []\n});\n\nextend(Transport.prototype, Logging);\nextend(Transport.prototype, Timeouts);\n\nmodule.exports = Transport;\n","'use strict';\n\nvar Class = require('../util/class'),\n Promise = require('../util/promise'),\n Set = require('../util/set'),\n URI = require('../util/uri'),\n browser = require('../util/browser'),\n copyObject = require('../util/copy_object'),\n extend = require('../util/extend'),\n toJSON = require('../util/to_json'),\n ws = require('../util/websocket'),\n Deferrable = require('../mixins/deferrable'),\n Transport = require('./transport');\n\nvar WebSocket = extend(Class(Transport, {\n UNCONNECTED: 1,\n CONNECTING: 2,\n CONNECTED: 3,\n\n batching: false,\n\n isUsable: function(callback, context) {\n this.callback(function() { callback.call(context, true) });\n this.errback(function() { callback.call(context, false) });\n this.connect();\n },\n\n request: function(messages) {\n this._pending = this._pending || new Set();\n for (var i = 0, n = messages.length; i < n; i++) this._pending.add(messages[i]);\n\n var self = this;\n\n var promise = new Promise(function(resolve, reject) {\n self.callback(function(socket) {\n if (!socket || socket.readyState !== 1) return;\n socket.send(toJSON(messages));\n resolve(socket);\n });\n\n self.connect();\n });\n\n return {\n abort: function() { promise.then(function(ws) { ws.close() }) }\n };\n },\n\n connect: function() {\n if (WebSocket._unloaded) return;\n\n this._state = this._state || this.UNCONNECTED;\n if (this._state !== this.UNCONNECTED) return;\n this._state = this.CONNECTING;\n\n var socket = this._createSocket();\n if (!socket) return this.setDeferredStatus('failed');\n\n var self = this;\n\n socket.onopen = function() {\n if (socket.headers) self._storeCookies(socket.headers['set-cookie']);\n self._socket = socket;\n self._state = self.CONNECTED;\n self._everConnected = true;\n self._ping();\n self.setDeferredStatus('succeeded', socket);\n };\n\n var closed = false;\n socket.onclose = socket.onerror = function() {\n if (closed) return;\n closed = true;\n\n var wasConnected = (self._state === self.CONNECTED);\n socket.onopen = socket.onclose = socket.onerror = socket.onmessage = null;\n\n delete self._socket;\n self._state = self.UNCONNECTED;\n self.removeTimeout('ping');\n\n var pending = self._pending ? self._pending.toArray() : [];\n delete self._pending;\n\n if (wasConnected || self._everConnected) {\n self.setDeferredStatus('unknown');\n self._handleError(pending, wasConnected);\n } else {\n self.setDeferredStatus('failed');\n }\n };\n\n socket.onmessage = function(event) {\n var replies;\n try { replies = JSON.parse(event.data) } catch (error) {}\n\n if (!replies) return;\n\n replies = [].concat(replies);\n\n for (var i = 0, n = replies.length; i < n; i++) {\n if (replies[i].successful === undefined) continue;\n self._pending.remove(replies[i]);\n }\n self._receive(replies);\n };\n },\n\n close: function() {\n if (!this._socket) return;\n this._socket.close();\n },\n\n _createSocket: function() {\n var url = WebSocket.getSocketUrl(this.endpoint),\n headers = this._dispatcher.headers,\n extensions = this._dispatcher.wsExtensions,\n cookie = this._getCookies(),\n tls = this._dispatcher.tls,\n options = {extensions: extensions, headers: headers, proxy: this._proxy, tls: tls};\n\n if (cookie !== '') options.headers['Cookie'] = cookie;\n\n return ws.create(url, [], options);\n },\n\n _ping: function() {\n if (!this._socket || this._socket.readyState !== 1) return;\n this._socket.send('[]');\n this.addTimeout('ping', this._dispatcher.timeout / 2, this._ping, this);\n }\n\n}), {\n PROTOCOLS: {\n 'http:': 'ws:',\n 'https:': 'wss:'\n },\n\n create: function(dispatcher, endpoint) {\n var sockets = dispatcher.transports.websocket = dispatcher.transports.websocket || {};\n sockets[endpoint.href] = sockets[endpoint.href] || new this(dispatcher, endpoint);\n return sockets[endpoint.href];\n },\n\n getSocketUrl: function(endpoint) {\n endpoint = copyObject(endpoint);\n endpoint.protocol = this.PROTOCOLS[endpoint.protocol];\n return URI.stringify(endpoint);\n },\n\n isUsable: function(dispatcher, endpoint, callback, context) {\n this.create(dispatcher, endpoint).isUsable(callback, context);\n }\n});\n\nextend(WebSocket.prototype, Deferrable);\n\nif (browser.Event && global.onbeforeunload !== undefined)\n browser.Event.on(global, 'beforeunload', function() { WebSocket._unloaded = true });\n\nmodule.exports = WebSocket;\n","'use strict';\n\nvar Class = require('../util/class'),\n URI = require('../util/uri'),\n browser = require('../util/browser'),\n extend = require('../util/extend'),\n toJSON = require('../util/to_json'),\n Transport = require('./transport');\n\nvar XHR = extend(Class(Transport, {\n encode: function(messages) {\n return toJSON(messages);\n },\n\n request: function(messages) {\n var href = this.endpoint.href,\n self = this,\n xhr;\n\n // Prefer XMLHttpRequest over ActiveXObject if they both exist\n if (global.XMLHttpRequest) {\n xhr = new XMLHttpRequest();\n } else if (global.ActiveXObject) {\n xhr = new ActiveXObject('Microsoft.XMLHTTP');\n } else {\n return this._handleError(messages);\n }\n\n xhr.open('POST', href, true);\n xhr.setRequestHeader('Content-Type', 'application/json');\n xhr.setRequestHeader('Pragma', 'no-cache');\n xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');\n\n var headers = this._dispatcher.headers;\n for (var key in headers) {\n if (!headers.hasOwnProperty(key)) continue;\n xhr.setRequestHeader(key, headers[key]);\n }\n\n var abort = function() { xhr.abort() };\n if (global.onbeforeunload !== undefined)\n browser.Event.on(global, 'beforeunload', abort);\n\n xhr.onreadystatechange = function() {\n if (!xhr || xhr.readyState !== 4) return;\n\n var replies = null,\n status = xhr.status,\n text = xhr.responseText,\n successful = (status >= 200 && status < 300) || status === 304 || status === 1223;\n\n if (global.onbeforeunload !== undefined)\n browser.Event.detach(global, 'beforeunload', abort);\n\n xhr.onreadystatechange = function() {};\n xhr = null;\n\n if (!successful) return self._handleError(messages);\n\n try {\n replies = JSON.parse(text);\n } catch (error) {}\n\n if (replies)\n self._receive(replies);\n else\n self._handleError(messages);\n };\n\n xhr.send(this.encode(messages));\n return xhr;\n }\n}), {\n isUsable: function(dispatcher, endpoint, callback, context) {\n var usable = (navigator.product === 'ReactNative')\n || URI.isSameOrigin(endpoint);\n\n callback.call(context, usable);\n }\n});\n\nmodule.exports = XHR;\n","'use strict';\n\nmodule.exports = {\n commonElement: function(lista, listb) {\n for (var i = 0, n = lista.length; i < n; i++) {\n if (this.indexOf(listb, lista[i]) !== -1)\n return lista[i];\n }\n return null;\n },\n\n indexOf: function(list, needle) {\n if (list.indexOf) return list.indexOf(needle);\n\n for (var i = 0, n = list.length; i < n; i++) {\n if (list[i] === needle) return i;\n }\n return -1;\n },\n\n map: function(object, callback, context) {\n if (object.map) return object.map(callback, context);\n var result = [];\n\n if (object instanceof Array) {\n for (var i = 0, n = object.length; i < n; i++) {\n result.push(callback.call(context || null, object[i], i));\n }\n } else {\n for (var key in object) {\n if (!object.hasOwnProperty(key)) continue;\n result.push(callback.call(context || null, key, object[key]));\n }\n }\n return result;\n },\n\n filter: function(array, callback, context) {\n if (array.filter) return array.filter(callback, context);\n var result = [];\n for (var i = 0, n = array.length; i < n; i++) {\n if (callback.call(context || null, array[i], i))\n result.push(array[i]);\n }\n return result;\n },\n\n asyncEach: function(list, iterator, callback, context) {\n var n = list.length,\n i = -1,\n calls = 0,\n looping = false;\n\n var iterate = function() {\n calls -= 1;\n i += 1;\n if (i === n) return callback && callback.call(context);\n iterator(list[i], resume);\n };\n\n var loop = function() {\n if (looping) return;\n looping = true;\n while (calls > 0) iterate();\n looping = false;\n };\n\n var resume = function() {\n calls += 1;\n loop();\n };\n resume();\n }\n};\n","'use strict';\n\nvar Event = {\n _registry: [],\n\n on: function(element, eventName, callback, context) {\n var wrapped = function() { callback.call(context) };\n\n if (element.addEventListener)\n element.addEventListener(eventName, wrapped, false);\n else\n element.attachEvent('on' + eventName, wrapped);\n\n this._registry.push({\n _element: element,\n _type: eventName,\n _callback: callback,\n _context: context,\n _handler: wrapped\n });\n },\n\n detach: function(element, eventName, callback, context) {\n var i = this._registry.length, register;\n while (i--) {\n register = this._registry[i];\n\n if ((element && element !== register._element) ||\n (eventName && eventName !== register._type) ||\n (callback && callback !== register._callback) ||\n (context && context !== register._context))\n continue;\n\n if (register._element.removeEventListener)\n register._element.removeEventListener(register._type, register._handler, false);\n else\n register._element.detachEvent('on' + register._type, register._handler);\n\n this._registry.splice(i,1);\n register = null;\n }\n }\n};\n\nif (global.onunload !== undefined)\n Event.on(global, 'unload', Event.detach, Event);\n\nmodule.exports = {\n Event: Event\n};\n","'use strict';\n\nvar extend = require('./extend');\n\nmodule.exports = function(parent, methods) {\n if (typeof parent !== 'function') {\n methods = parent;\n parent = Object;\n }\n\n var klass = function() {\n if (!this.initialize) return this;\n return this.initialize.apply(this, arguments) || this;\n };\n\n var bridge = function() {};\n bridge.prototype = parent.prototype;\n\n klass.prototype = new bridge();\n extend(klass.prototype, methods);\n\n return klass;\n};\n","module.exports = {\n VERSION: '1.2.4',\n\n BAYEUX_VERSION: '1.0',\n ID_LENGTH: 160,\n JSONP_CALLBACK: 'jsonpcallback',\n CONNECTION_TYPES: ['long-polling', 'cross-origin-long-polling', 'callback-polling', 'websocket', 'eventsource', 'in-process'],\n\n MANDATORY_CONNECTION_TYPES: ['long-polling', 'callback-polling', 'in-process']\n};\n","'use strict';\n\nmodule.exports = {};\n","'use strict';\n\nvar copyObject = function(object) {\n var clone, i, key;\n if (object instanceof Array) {\n clone = [];\n i = object.length;\n while (i--) clone[i] = copyObject(object[i]);\n return clone;\n } else if (typeof object === 'object') {\n clone = (object === null) ? null : {};\n for (key in object) clone[key] = copyObject(object[key]);\n return clone;\n } else {\n return object;\n }\n};\n\nmodule.exports = copyObject;\n","/*\nCopyright Joyent, Inc. and other Node contributors. All rights reserved.\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies\nof the Software, and to permit persons to whom the Software is furnished to do\nso, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n*/\n\nvar isArray = typeof Array.isArray === 'function'\n ? Array.isArray\n : function (xs) {\n return Object.prototype.toString.call(xs) === '[object Array]'\n }\n;\nfunction indexOf (xs, x) {\n if (xs.indexOf) return xs.indexOf(x);\n for (var i = 0; i < xs.length; i++) {\n if (x === xs[i]) return i;\n }\n return -1;\n}\n\nfunction EventEmitter() {}\nmodule.exports = EventEmitter;\n\nEventEmitter.prototype.emit = function(type) {\n // If there is no 'error' event listener then throw.\n if (type === 'error') {\n if (!this._events || !this._events.error ||\n (isArray(this._events.error) && !this._events.error.length))\n {\n if (arguments[1] instanceof Error) {\n throw arguments[1]; // Unhandled 'error' event\n } else {\n throw new Error(\"Uncaught, unspecified 'error' event.\");\n }\n return false;\n }\n }\n\n if (!this._events) return false;\n var handler = this._events[type];\n if (!handler) return false;\n\n if (typeof handler == 'function') {\n switch (arguments.length) {\n // fast cases\n case 1:\n handler.call(this);\n break;\n case 2:\n handler.call(this, arguments[1]);\n break;\n case 3:\n handler.call(this, arguments[1], arguments[2]);\n break;\n // slower\n default:\n var args = Array.prototype.slice.call(arguments, 1);\n handler.apply(this, args);\n }\n return true;\n\n } else if (isArray(handler)) {\n var args = Array.prototype.slice.call(arguments, 1);\n\n var listeners = handler.slice();\n for (var i = 0, l = listeners.length; i < l; i++) {\n listeners[i].apply(this, args);\n }\n return true;\n\n } else {\n return false;\n }\n};\n\n// EventEmitter is defined in src/node_events.cc\n// EventEmitter.prototype.emit() is also defined there.\nEventEmitter.prototype.addListener = function(type, listener) {\n if ('function' !== typeof listener) {\n throw new Error('addListener only takes instances of Function');\n }\n\n if (!this._events) this._events = {};\n\n // To avoid recursion in the case that type == \"newListeners\"! Before\n // adding it to the listeners, first emit \"newListeners\".\n this.emit('newListener', type, listener);\n\n if (!this._events[type]) {\n // Optimize the case of one listener. Don't need the extra array object.\n this._events[type] = listener;\n } else if (isArray(this._events[type])) {\n // If we've already got an array, just append.\n this._events[type].push(listener);\n } else {\n // Adding the second element, need to change to array.\n this._events[type] = [this._events[type], listener];\n }\n\n return this;\n};\n\nEventEmitter.prototype.on = EventEmitter.prototype.addListener;\n\nEventEmitter.prototype.once = function(type, listener) {\n var self = this;\n self.on(type, function g() {\n self.removeListener(type, g);\n listener.apply(this, arguments);\n });\n\n return this;\n};\n\nEventEmitter.prototype.removeListener = function(type, listener) {\n if ('function' !== typeof listener) {\n throw new Error('removeListener only takes instances of Function');\n }\n\n // does not use listeners(), so no side effect of creating _events[type]\n if (!this._events || !this._events[type]) return this;\n\n var list = this._events[type];\n\n if (isArray(list)) {\n var i = indexOf(list, listener);\n if (i < 0) return this;\n list.splice(i, 1);\n if (list.length == 0)\n delete this._events[type];\n } else if (this._events[type] === listener) {\n delete this._events[type];\n }\n\n return this;\n};\n\nEventEmitter.prototype.removeAllListeners = function(type) {\n if (arguments.length === 0) {\n this._events = {};\n return this;\n }\n\n // does not use listeners(), so no side effect of creating _events[type]\n if (type && this._events && this._events[type]) this._events[type] = null;\n return this;\n};\n\nEventEmitter.prototype.listeners = function(type) {\n if (!this._events) this._events = {};\n if (!this._events[type]) this._events[type] = [];\n if (!isArray(this._events[type])) {\n this._events[type] = [this._events[type]];\n }\n return this._events[type];\n};\n","'use strict';\n\nmodule.exports = function(dest, source, overwrite) {\n if (!source) return dest;\n for (var key in source) {\n if (!source.hasOwnProperty(key)) continue;\n if (dest.hasOwnProperty(key) && overwrite === false) continue;\n if (dest[key] !== source[key])\n dest[key] = source[key];\n }\n return dest;\n};\n","'use strict';\n\nvar asap = require('asap');\n\nvar PENDING = 0,\n FULFILLED = 1,\n REJECTED = 2;\n\nvar RETURN = function(x) { return x },\n THROW = function(x) { throw x };\n\nvar Promise = function(task) {\n this._state = PENDING;\n this._onFulfilled = [];\n this._onRejected = [];\n\n if (typeof task !== 'function') return;\n var self = this;\n\n task(function(value) { resolve(self, value) },\n function(reason) { reject(self, reason) });\n};\n\nPromise.prototype.then = function(onFulfilled, onRejected) {\n var next = new Promise();\n registerOnFulfilled(this, onFulfilled, next);\n registerOnRejected(this, onRejected, next);\n return next;\n};\n\nPromise.prototype['catch'] = function(onRejected) {\n return this.then(null, onRejected);\n};\n\nvar registerOnFulfilled = function(promise, onFulfilled, next) {\n if (typeof onFulfilled !== 'function') onFulfilled = RETURN;\n var handler = function(value) { invoke(onFulfilled, value, next) };\n\n if (promise._state === PENDING) {\n promise._onFulfilled.push(handler);\n } else if (promise._state === FULFILLED) {\n handler(promise._value);\n }\n};\n\nvar registerOnRejected = function(promise, onRejected, next) {\n if (typeof onRejected !== 'function') onRejected = THROW;\n var handler = function(reason) { invoke(onRejected, reason, next) };\n\n if (promise._state === PENDING) {\n promise._onRejected.push(handler);\n } else if (promise._state === REJECTED) {\n handler(promise._reason);\n }\n};\n\nvar invoke = function(fn, value, next) {\n asap(function() { _invoke(fn, value, next) });\n};\n\nvar _invoke = function(fn, value, next) {\n var outcome;\n\n try {\n outcome = fn(value);\n } catch (error) {\n return reject(next, error);\n }\n\n if (outcome === next) {\n reject(next, new TypeError('Recursive promise chain detected'));\n } else {\n resolve(next, outcome);\n }\n};\n\nvar resolve = function(promise, value) {\n var called = false, type, then;\n\n try {\n type = typeof value;\n then = value !== null && (type === 'function' || type === 'object') && value.then;\n\n if (typeof then !== 'function') return fulfill(promise, value);\n\n then.call(value, function(v) {\n if (!(called ^ (called = true))) return;\n resolve(promise, v);\n }, function(r) {\n if (!(called ^ (called = true))) return;\n reject(promise, r);\n });\n } catch (error) {\n if (!(called ^ (called = true))) return;\n reject(promise, error);\n }\n};\n\nvar fulfill = function(promise, value) {\n if (promise._state !== PENDING) return;\n\n promise._state = FULFILLED;\n promise._value = value;\n promise._onRejected = [];\n\n var onFulfilled = promise._onFulfilled, fn;\n while (fn = onFulfilled.shift()) fn(value);\n};\n\nvar reject = function(promise, reason) {\n if (promise._state !== PENDING) return;\n\n promise._state = REJECTED;\n promise._reason = reason;\n promise._onFulfilled = [];\n\n var onRejected = promise._onRejected, fn;\n while (fn = onRejected.shift()) fn(reason);\n};\n\nPromise.resolve = function(value) {\n return new Promise(function(resolve, reject) { resolve(value) });\n};\n\nPromise.reject = function(reason) {\n return new Promise(function(resolve, reject) { reject(reason) });\n};\n\nPromise.all = function(promises) {\n return new Promise(function(resolve, reject) {\n var list = [], n = promises.length, i;\n\n if (n === 0) return resolve(list);\n\n for (i = 0; i < n; i++) (function(promise, i) {\n Promise.resolve(promise).then(function(value) {\n list[i] = value;\n if (--n === 0) resolve(list);\n }, reject);\n })(promises[i], i);\n });\n};\n\nPromise.race = function(promises) {\n return new Promise(function(resolve, reject) {\n for (var i = 0, n = promises.length; i < n; i++)\n Promise.resolve(promises[i]).then(resolve, reject);\n });\n};\n\nPromise.deferred = Promise.pending = function() {\n var tuple = {};\n\n tuple.promise = new Promise(function(resolve, reject) {\n tuple.resolve = resolve;\n tuple.reject = reject;\n });\n return tuple;\n};\n\nmodule.exports = Promise;\n","'use strict';\n\nvar Class = require('./class');\n\nmodule.exports = Class({\n initialize: function() {\n this._index = {};\n },\n\n add: function(item) {\n var key = (item.id !== undefined) ? item.id : item;\n if (this._index.hasOwnProperty(key)) return false;\n this._index[key] = item;\n return true;\n },\n\n forEach: function(block, context) {\n for (var key in this._index) {\n if (this._index.hasOwnProperty(key))\n block.call(context, this._index[key]);\n }\n },\n\n isEmpty: function() {\n for (var key in this._index) {\n if (this._index.hasOwnProperty(key)) return false;\n }\n return true;\n },\n\n member: function(item) {\n for (var key in this._index) {\n if (this._index[key] === item) return true;\n }\n return false;\n },\n\n remove: function(item) {\n var key = (item.id !== undefined) ? item.id : item;\n var removed = this._index[key];\n delete this._index[key];\n return removed;\n },\n\n toArray: function() {\n var array = [];\n this.forEach(function(item) { array.push(item) });\n return array;\n }\n});\n","'use strict';\n\n// http://assanka.net/content/tech/2009/09/02/json2-js-vs-prototype/\n\nmodule.exports = function(object) {\n return JSON.stringify(object, function(key, value) {\n return (this[key] instanceof Array) ? this[key] : value;\n });\n};\n","'use strict';\n\nmodule.exports = {\n isURI: function(uri) {\n return uri && uri.protocol && uri.host && uri.path;\n },\n\n isSameOrigin: function(uri) {\n return uri.protocol === location.protocol &&\n uri.hostname === location.hostname &&\n uri.port === location.port;\n },\n\n parse: function(url) {\n if (typeof url !== 'string') return url;\n var uri = {}, parts, query, pairs, i, n, data;\n\n var consume = function(name, pattern) {\n url = url.replace(pattern, function(match) {\n uri[name] = match;\n return '';\n });\n uri[name] = uri[name] || '';\n };\n\n consume('protocol', /^[a-z]+\\:/i);\n consume('host', /^\\/\\/[^\\/\\?#]+/);\n\n if (!/^\\//.test(url) && !uri.host)\n url = location.pathname.replace(/[^\\/]*$/, '') + url;\n\n consume('pathname', /^[^\\?#]*/);\n consume('search', /^\\?[^#]*/);\n consume('hash', /^#.*/);\n\n uri.protocol = uri.protocol || location.protocol;\n\n if (uri.host) {\n uri.host = uri.host.substr(2);\n parts = uri.host.split(':');\n uri.hostname = parts[0];\n uri.port = parts[1] || '';\n } else {\n uri.host = location.host;\n uri.hostname = location.hostname;\n uri.port = location.port;\n }\n\n uri.pathname = uri.pathname || '/';\n uri.path = uri.pathname + uri.search;\n\n query = uri.search.replace(/^\\?/, '');\n pairs = query ? query.split('&') : [];\n data = {};\n\n for (i = 0, n = pairs.length; i < n; i++) {\n parts = pairs[i].split('=');\n data[decodeURIComponent(parts[0] || '')] = decodeURIComponent(parts[1] || '');\n }\n\n uri.query = data;\n\n uri.href = this.stringify(uri);\n return uri;\n },\n\n stringify: function(uri) {\n var string = uri.protocol + '//' + uri.hostname;\n if (uri.port) string += ':' + uri.port;\n string += uri.pathname + this.queryString(uri.query) + (uri.hash || '');\n return string;\n },\n\n queryString: function(query) {\n var pairs = [];\n for (var key in query) {\n if (!query.hasOwnProperty(key)) continue;\n pairs.push(encodeURIComponent(key) + '=' + encodeURIComponent(query[key]));\n }\n if (pairs.length === 0) return '';\n return '?' + pairs.join('&');\n }\n};\n","'use strict';\n\nvar array = require('./array');\n\nmodule.exports = function(options, validKeys) {\n for (var key in options) {\n if (array.indexOf(validKeys, key) < 0)\n throw new Error('Unrecognized option: ' + key);\n }\n};\n","'use strict';\n\nvar WS = global.MozWebSocket || global.WebSocket;\n\nmodule.exports = {\n create: function(url, protocols, options) {\n if (typeof WS !== 'function') return null;\n return new WS(url);\n }\n};\n","// shim for using process in browser\nvar process = module.exports = {};\n\n// cached from whatever global is present so that test runners that stub it\n// don't break things. But we need to wrap it in a try catch in case it is\n// wrapped in strict mode code which doesn't define any globals. It's inside a\n// function because try/catches deoptimize in certain engines.\n\nvar cachedSetTimeout;\nvar cachedClearTimeout;\n\nfunction defaultSetTimout() {\n throw new Error('setTimeout has not been defined');\n}\nfunction defaultClearTimeout () {\n throw new Error('clearTimeout has not been defined');\n}\n(function () {\n try {\n if (typeof setTimeout === 'function') {\n cachedSetTimeout = setTimeout;\n } else {\n cachedSetTimeout = defaultSetTimout;\n }\n } catch (e) {\n cachedSetTimeout = defaultSetTimout;\n }\n try {\n if (typeof clearTimeout === 'function') {\n cachedClearTimeout = clearTimeout;\n } else {\n cachedClearTimeout = defaultClearTimeout;\n }\n } catch (e) {\n cachedClearTimeout = defaultClearTimeout;\n }\n} ())\nfunction runTimeout(fun) {\n if (cachedSetTimeout === setTimeout) {\n //normal enviroments in sane situations\n return setTimeout(fun, 0);\n }\n // if setTimeout wasn't available but was latter defined\n if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n cachedSetTimeout = setTimeout;\n return setTimeout(fun, 0);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedSetTimeout(fun, 0);\n } catch(e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedSetTimeout.call(null, fun, 0);\n } catch(e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n return cachedSetTimeout.call(this, fun, 0);\n }\n }\n\n\n}\nfunction runClearTimeout(marker) {\n if (cachedClearTimeout === clearTimeout) {\n //normal enviroments in sane situations\n return clearTimeout(marker);\n }\n // if clearTimeout wasn't available but was latter defined\n if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n cachedClearTimeout = clearTimeout;\n return clearTimeout(marker);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedClearTimeout(marker);\n } catch (e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedClearTimeout.call(null, marker);\n } catch (e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n return cachedClearTimeout.call(this, marker);\n }\n }\n\n\n\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n if (!draining || !currentQueue) {\n return;\n }\n draining = false;\n if (currentQueue.length) {\n queue = currentQueue.concat(queue);\n } else {\n queueIndex = -1;\n }\n if (queue.length) {\n drainQueue();\n }\n}\n\nfunction drainQueue() {\n if (draining) {\n return;\n }\n var timeout = runTimeout(cleanUpNextTick);\n draining = true;\n\n var len = queue.length;\n while(len) {\n currentQueue = queue;\n queue = [];\n while (++queueIndex < len) {\n if (currentQueue) {\n currentQueue[queueIndex].run();\n }\n }\n queueIndex = -1;\n len = queue.length;\n }\n currentQueue = null;\n draining = false;\n runClearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n var args = new Array(arguments.length - 1);\n if (arguments.length > 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"]} \ No newline at end of file +{"version":3,"sources":["node_modules/browser-pack/_prelude.js","lib/api/streaming-extension.js","jsforce-api-streaming.min.js","lib/api/streaming.js","node_modules/asap/browser-asap.js","node_modules/asap/browser-raw.js","node_modules/faye/src/faye_browser.js","node_modules/faye/src/mixins/deferrable.js","node_modules/faye/src/mixins/logging.js","node_modules/faye/src/mixins/publisher.js","node_modules/faye/src/mixins/timeouts.js","node_modules/faye/src/protocol/channel.js","node_modules/faye/src/protocol/client.js","node_modules/faye/src/protocol/dispatcher.js","node_modules/faye/src/protocol/error.js","node_modules/faye/src/protocol/extensible.js","node_modules/faye/src/protocol/grammar.js","node_modules/faye/src/protocol/publication.js","node_modules/faye/src/protocol/scheduler.js","node_modules/faye/src/protocol/subscription.js","node_modules/faye/src/transport/browser_transports.js","node_modules/faye/src/transport/cors.js","node_modules/faye/src/transport/event_source.js","node_modules/faye/src/transport/jsonp.js","node_modules/faye/src/transport/transport.js","node_modules/faye/src/transport/web_socket.js","node_modules/faye/src/transport/xhr.js","node_modules/faye/src/util/array.js","node_modules/faye/src/util/browser/event.js","node_modules/faye/src/util/class.js","node_modules/faye/src/util/constants.js","node_modules/faye/src/util/cookies/browser_cookies.js","node_modules/faye/src/util/copy_object.js","node_modules/faye/src/util/event_emitter.js","node_modules/faye/src/util/extend.js","node_modules/faye/src/util/promise.js","node_modules/faye/src/util/set.js","node_modules/faye/src/util/to_json.js","node_modules/faye/src/util/uri.js","node_modules/faye/src/util/validate_options.js","node_modules/faye/src/util/websocket/browser_websocket.js","node_modules/process/browser.js"],"names":["f","exports","module","define","amd","g","window","global","self","this","jsforce","modules","api","Streaming","r","e","n","t","o","i","c","require","u","a","Error","code","p","call","length","1","StreamingExtension","AuthFailure","failureCallback","incoming","message","callback","channel","advice","reconnect","Replay","replayId","_extensionEnabled","_replay","_channel","setExtensionEnabled","extensionEnabled","setReplay","replay","parseInt","setChannel","ext","data","event","outgoing","subscription","replayFromMap","2","events","inherits","_","Faye","Topic","streaming","name","_streaming","prototype","subscribe","listener","unsubscribe","Channel","_name","push","isArray","conn","_conn","_id","sobject","findOne","Name","then","rec","Id","id","channelUrl","requestPost","pushEvents","rets","thenCall","EventEmitter","_createClient","forChannelName","extensions","needsReplayFix","indexOf","endpointUrl","instanceUrl","version","join","fayeClient","Client","setHeader","accessToken","Array","forEach","extension","addExtension","_dispatcher","getConnectionTypes","selectTransport","_transport","batching","_getFayeClient","channelName","clientType","_fayeClients","topic","_topics","channelId","createClient","on","./streaming-extension","faye","3","rawAsap","freeTasks","pendingErrors","requestErrorThrow","makeRequestCallFromTimer","shift","asap","task","rawTask","pop","RawTask","error","onerror","./raw","4","queue","requestFlush","index","flush","currentIndex","scan","newLength","toggle","observer","node","scope","BrowserMutationObserver","MutationObserver","WebKitMutationObserver","timeoutHandle","setTimeout","handleTimer","intervalHandle","setInterval","clearTimeout","clearInterval","document","createTextNode","observe","characterData","5","constants","Logging","VERSION","Scheduler","wrapper","./mixins/logging","./protocol/client","./protocol/scheduler","./util/constants","6","Promise","errback","_promise","resolve","reject","_resolve","_reject","arguments","context","value","reason","timeout","seconds","_timer","setDeferredStatus","status","../util/promise","7","toJSON","LOG_LEVELS","fatal","warn","info","debug","writeLog","messageArgs","level","logger","args","slice","apply","banner","klass","className","replace","key","../util/to_json","8","Publisher","countListeners","eventType","listeners","bind","handler","_listeners","unbind","tuple","splice","removeListener","extend","trigger","emit","../util/event_emitter","../util/extend","9","addTimeout","delay","_timeouts","hasOwnProperty","removeTimeout","removeAllTimeouts","10","Class","Grammar","initialize","isUnused","HANDSHAKE","CONNECT","SUBSCRIBE","UNSUBSCRIBE","DISCONNECT","META","SERVICE","expand","segments","parse","channels","copy","unparse","isValid","CHANNEL_NAME","test","CHANNEL_PATTERN","split","isMeta","isService","isSubscribable","Set","_channels","getKeys","keys","remove","hasSubscription","names","distributeMessage","../mixins/publisher","../util/class","./grammar","11","URI","array","browser","validateOptions","Deferrable","Dispatcher","Extensible","Publication","Subscription","UNCONNECTED","CONNECTING","CONNECTED","DISCONNECTED","RETRY","NONE","CONNECTION_TIMEOUT","DEFAULT_ENDPOINT","INTERVAL","endpoint","options","create","_messageId","_state","_responseCallbacks","_advice","interval","_receiveMessage","Event","undefined","onbeforeunload","_disabled","disconnect","addWebsocketExtension","disable","feature","handshake","stringify","MANDATORY_CONNECTION_TYPES","_sendMessage","BAYEUX_VERSION","supportedConnectionTypes","response","successful","clientId","retry","connect","_connectRequest","connectionType","_cycleConnection","promise","close","map","force","concat","publish","publication","_generateMessageId","pipeThroughExtensions","sendMessage","Math","pow","toString","_handleAdvice","_deliverMessage","../mixins/deferrable","../mixins/logging","../util/array","../util/browser","../util/constants","../util/uri","../util/validate_options","./channel","./dispatcher","./error","./extensible","./publication","./subscription","12","cookies","Transport","MAX_REQUEST_SIZE","DEFAULT_RETRY","UP","DOWN","client","_client","_alternates","endpoints","CookieJar","_envelopes","headers","_scheduler","scheduler","transports","wsExtensions","proxy","_proxy","origin","exts","websocketExtensions","type","tls","ca","maxRequestSize","endpointFor","transport","transportTypes","get","attempts","deadline","Date","getTime","envelope","_sendEnvelope","request","timer","isDeliverable","abort","handleError","getTimeout","send","handleResponse","reply","succeed","immediate","req","fail","getInterval","../transport","../util/cookies","./scheduler","13","params","ERROR","parts","errors","versionMismatch","conntypeMismatch","extMismatch","badRequest","clientUnknown","parameterMissing","channelForbidden","channelUnknown","channelInvalid","extUnknown","publishFailed","serverError","14","_extensions","added","removeExtension","removed","stage","pipe","fn","15","16","17","made","now","18","_callback","_context","_cancelled","withChannel","_withChannel","cancel","19","register","./cors","./event_source","./jsonp","./transport","./web_socket","./xhr","20","CORS","encode","messages","encodeURIComponent","xhrClass","XDomainRequest","XMLHttpRequest","xhr","open","setRequestHeader","cleanUp","_pending","onload","ontimeout","onprogress","replies","JSON","responseText","_receive","_handleError","add","isUsable","dispatcher","isSameOrigin","protocol","location","withCredentials","../util/set","21","copyObject","XHR","EventSource","_xhr","pathname","socket","onopen","_everConnected","onmessage","_socket","usable","sockets","eventsource","url","../util/copy_object","22","JSONP","query","jsonp","_cbCount","head","getElementsByTagName","script","createElement","callbackName","getCallbackName","cleanup","parentNode","removeChild","src","appendChild","23","process","Cookie","Timeouts","DEFAULT_PORTS","http:","https:","ws:","wss:","MAX_DELAY","_outbox","_findProxy","_flushLargeBatch","_publish","_connectMessage","_makePromise","_requestPromise","_resolvePromise","_flush","last","_getCookies","getCookiesSync","cookie","cookieString","_storeCookies","setCookie","setCookieSync","toLowerCase","upcase","toUpperCase","env","REQUEST_METHOD","Object","filter","k","console","allowed","disabled","asyncEach","_transports","pair","resume","connType","connEndpoint","../mixins/timeouts","../protocol/channel","_process","24","ws","WebSocket","readyState","_unloaded","_createSocket","_ping","closed","onclose","wasConnected","pending","toArray","getSocketUrl","PROTOCOLS","websocket","href","../util/websocket","25","ActiveXObject","onreadystatechange","text","detach","navigator","product","26","commonElement","lista","listb","list","needle","object","result","iterator","calls","looping","iterate","loop","27","_registry","element","eventName","wrapped","addEventListener","attachEvent","_element","_type","_handler","removeEventListener","detachEvent","onunload","28","parent","methods","bridge","./extend","29","ID_LENGTH","JSONP_CALLBACK","CONNECTION_TYPES","30","31","clone","32","xs","_events","l","addListener","once","x","removeAllListeners","33","dest","source","overwrite","34","RETURN","THROW","_onFulfilled","_onRejected","onFulfilled","onRejected","next","registerOnFulfilled","registerOnRejected","invoke","_value","_reason","_invoke","outcome","TypeError","called","fulfill","v","all","promises","race","deferred","35","_index","item","block","isEmpty","member","./class","36","37","isURI","uri","host","path","hostname","port","pairs","consume","pattern","match","substr","search","decodeURIComponent","string","queryString","hash","38","validKeys","./array","39","WS","MozWebSocket","protocols","40","cachedSetTimeout","cachedClearTimeout","defaultSetTimout","defaultClearTimeout","runTimeout","fun","currentQueue","draining","queueIndex","cleanUpNextTick","drainQueue","len","run","marker","runClearTimeout","Item","noop","nextTick","title","argv","versions","off","prependListener","prependOnceListener","binding","cwd","chdir","dir","umask"],"mappings":"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","file":"jsforce-api-streaming.min.js","sourcesContent":["(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 process.exit(1);\n * const authFailureExt = new jsforce.StreamingExtension.AuthFailure(exitCallback);\n * \n * const fayeClient = conn.streaming.createClient([ authFailureExt ]);\n * \n * const subscription = fayeClient.subscribe(channel, data => {\n * console.log('topic received data', data);\n * });\n * \n * subscription.cancel();\n * ```\n *\n * @param {Function} failureCallback - Invoked when authentication becomes invalid\n */\nStreamingExtension.AuthFailure = function(failureCallback) {\n this.incoming = function(message, callback) {\n if (\n (message.channel === '/meta/connect' ||\n message.channel === '/meta/handshake')\n && message.advice\n && message.advice.reconnect == 'none'\n ) {\n failureCallback(message);\n } else {\n callback(message);\n }\n }\n};\n\n/**\n * Constructor for a durable streaming replay extension\n *\n * Modified from original Salesforce demo source code:\n * https://github.com/developerforce/SalesforceDurableStreamingDemo/blob/3d4a56eac956f744ad6c22e6a8141b6feb57abb9/staticresources/cometdReplayExtension.resource\n * \n * Example usage:\n *\n * ```javascript\n * const conn = new jsforce.Connection({ … });\n * \n * const channel = \"/event/My_Event__e\";\n * const replayId = -2; // -2 is all retained events\n * \n * const replayExt = new jsforce.StreamingExtension.Replay(channel, replayId);\n * \n * const fayeClient = conn.streaming.createClient([ replayExt ]);\n * \n * const subscription = fayeClient.subscribe(channel, data => {\n * console.log('topic received data', data);\n * });\n * \n * subscription.cancel();\n * ```\n */\nStreamingExtension.Replay = function(channel, replayId) {\n var REPLAY_FROM_KEY = \"replay\";\n \n var _extensionEnabled = replayId != null ? true : false;\n var _replay = replayId;\n var _channel = channel;\n\n this.setExtensionEnabled = function(extensionEnabled) {\n _extensionEnabled = extensionEnabled;\n }\n\n this.setReplay = function (replay) {\n _replay = parseInt(replay, 10);\n }\n\n this.setChannel = function(channel) {\n _channel = channel;\n }\n\n this.incoming = function(message, callback) {\n if (message.channel === '/meta/handshake') {\n if (message.ext && message.ext[REPLAY_FROM_KEY] == true) {\n _extensionEnabled = true;\n }\n } else if (message.channel === _channel && message.data && message.data.event && message.data.event.replayId) {\n _replay = message.data.event.replayId;\n }\n callback(message);\n }\n \n this.outgoing = function(message, callback) {\n if (message.channel === '/meta/subscribe' && message.subscription === _channel) {\n if (_extensionEnabled) {\n if (!message.ext) { message.ext = {}; }\n\n var replayFromMap = {};\n replayFromMap[_channel] = _replay;\n\n // add \"ext : { \"replay\" : { CHANNEL : REPLAY_VALUE }}\" to subscribe message\n message.ext[REPLAY_FROM_KEY] = replayFromMap;\n }\n }\n callback(message);\n };\n};\n\nmodule.exports = StreamingExtension;\n","!function(t){var e;\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=t():\"function\"==typeof define&&define.amd?define([],t):(e=(e=(e=(e=\"undefined\"!=typeof window?window:\"undefined\"!=typeof global?global:\"undefined\"!=typeof self?self:this).jsforce||(e.jsforce={})).modules||(e.modules={})).api||(e.api={})).Streaming=t()}(function(){return function r(o,c,a){function u(e,t){if(!c[e]){if(!o[e]){var n=\"function\"==typeof require&&require;if(!t&&n)return n(e,!0);if(l)return l(e,!0);var i=new Error(\"Cannot find module '\"+e+\"'\");throw i.code=\"MODULE_NOT_FOUND\",i}var s=c[e]={exports:{}};o[e][0].call(s.exports,function(t){return u(o[e][1][t]||t)},s,s.exports,r,o,c,a)}return c[e].exports}for(var l=\"function\"==typeof require&&require,t=0;t=Math.pow(2,32)&&(this._messageId=0),this._messageId.toString(36)},_receiveMessage:function(t){var e,n=t.id;void 0!==t.successful&&(e=this._responseCallbacks[n],delete this._responseCallbacks[n]),this.pipeThroughExtensions(\"incoming\",t,null,function(t){t&&(t.advice&&this._handleAdvice(t.advice),this._deliverMessage(t),e&&e[0].call(e[1],t))},this)},_handleAdvice:function(t){e(this._advice,t),this._dispatcher.timeout=this._advice.timeout/1e3,this._advice.reconnect===this.HANDSHAKE&&this._state!==this.DISCONNECTED&&(this._state=this.UNCONNECTED,this._dispatcher.clientId=null,this._cycleConnection())},_deliverMessage:function(t){t.channel&&void 0!==t.data&&(this.info(\"Client ? calling listeners for ? with ?\",this._dispatcher.clientId,t.channel,t.data),this._channels.distributeMessage(t))},_cycleConnection:function(){this._connectRequest&&(this._connectRequest=null,this.info(\"Closed connection for ?\",this._dispatcher.clientId));var t=this;s.setTimeout(function(){t.connect()},this._advice.interval)}});e(m.prototype,i),e(m.prototype,h),e(m.prototype,l),e(m.prototype,_),b.exports=m}).call(this,\"undefined\"!=typeof global?global:\"undefined\"!=typeof self?self:\"undefined\"!=typeof window?window:{})},{\"../mixins/deferrable\":6,\"../mixins/logging\":7,\"../mixins/publisher\":8,\"../util/array\":26,\"../util/browser\":27,\"../util/class\":28,\"../util/constants\":29,\"../util/extend\":33,\"../util/promise\":34,\"../util/uri\":37,\"../util/validate_options\":38,\"./channel\":10,\"./dispatcher\":12,\"./error\":13,\"./extensible\":14,\"./publication\":16,\"./subscription\":18,asap:3}],12:[function(l,h,t){(function(o){\"use strict\";var t=l(\"../util/class\"),c=l(\"../util/uri\"),a=l(\"../util/cookies\"),e=l(\"../util/extend\"),n=l(\"../mixins/logging\"),i=l(\"../mixins/publisher\"),s=l(\"../transport\"),u=l(\"./scheduler\"),r=t({className:\"Dispatcher\",MAX_REQUEST_SIZE:2048,DEFAULT_RETRY:5,UP:1,DOWN:2,initialize:function(t,e,n){this._client=t,this.endpoint=c.parse(e),this._alternates=n.endpoints||{},this.cookies=a.CookieJar&&new a.CookieJar,this._disabled=[],this._envelopes={},this.headers={},this.retry=n.retry||this.DEFAULT_RETRY,this._scheduler=n.scheduler||u,this._state=0,this.transports={},this.wsExtensions=[],this.proxy=n.proxy||{},\"string\"==typeof this._proxy&&(this._proxy={origin:this._proxy});var i=n.websocketExtensions;if(i)for(var s=0,r=(i=[].concat(i)).length;s\n */\n\n'use strict';\n\nvar events = window.jsforce.require('events'),\n inherits = window.jsforce.require('inherits'),\n _ = window.jsforce.require('lodash/core'),\n Faye = require('faye'),\n StreamingExtension = require('./streaming-extension'),\n jsforce = window.jsforce.require('./core');\n\n/**\n * Streaming API topic class\n *\n * @class Streaming~Topic\n * @param {Streaming} steaming - Streaming API object\n * @param {String} name - Topic name\n */\nvar Topic = function(streaming, name) {\n this._streaming = streaming;\n this.name = name;\n};\n\n/**\n * @typedef {Object} Streaming~StreamingMessage\n * @prop {Object} event\n * @prop {Object} event.type - Event type\n * @prop {Record} sobject - Record information\n */\n/**\n * Subscribe listener to topic\n *\n * @method Streaming~Topic#subscribe\n * @param {Callback.} listener - Streaming message listener\n * @returns {Subscription} - Faye subscription object\n */\nTopic.prototype.subscribe = function(listener) {\n return this._streaming.subscribe(this.name, listener);\n};\n\n/**\n * Unsubscribe listener from topic\n *\n * @method Streaming~Topic#unsubscribe\n * @param {Callback.} listener - Streaming message listener\n * @returns {Streaming~Topic}\n */\nTopic.prototype.unsubscribe = function(listener) {\n this._streaming.unsubscribe(this.name, listener);\n return this;\n};\n\n/*--------------------------------------------*/\n\n/**\n * Streaming API Generic Streaming Channel\n *\n * @class Streaming~Channel\n * @param {Streaming} steaming - Streaming API object\n * @param {String} name - Channel name (starts with \"/u/\")\n */\nvar Channel = function(streaming, name) {\n this._streaming = streaming;\n this._name = name;\n};\n\n/**\n * Subscribe to channel\n *\n * @param {Callback.} listener - Streaming message listener\n * @returns {Subscription} - Faye subscription object\n */\nChannel.prototype.subscribe = function(listener) {\n return this._streaming.subscribe(this._name, listener);\n};\n\nChannel.prototype.unsubscribe = function(listener) {\n this._streaming.unsubscribe(this._name, listener);\n return this;\n};\n\nChannel.prototype.push = function(events, callback) {\n var isArray = _.isArray(events);\n events = isArray ? events : [ events ];\n var conn = this._streaming._conn;\n if (!this._id) {\n this._id = conn.sobject('StreamingChannel').findOne({ Name: this._name }, 'Id')\n .then(function(rec) { return rec.Id });\n }\n return this._id.then(function(id) {\n var channelUrl = '/sobjects/StreamingChannel/' + id + '/push';\n return conn.requestPost(channelUrl, { pushEvents: events });\n }).then(function(rets) {\n return isArray ? rets : rets[0];\n }).thenCall(callback);\n};\n\n/*--------------------------------------------*/\n\n/**\n * Streaming API class\n *\n * @class\n * @extends events.EventEmitter\n * @param {Connection} conn - Connection object\n */\nvar Streaming = function(conn) {\n this._conn = conn;\n};\n\ninherits(Streaming, events.EventEmitter);\n\n/** @private **/\nStreaming.prototype._createClient = function(forChannelName, extensions) {\n // forChannelName is advisory, for an API workaround. It does not restrict or select the channel.\n var needsReplayFix = typeof forChannelName === 'string' && forChannelName.indexOf('/u/') === 0;\n var endpointUrl = [\n this._conn.instanceUrl,\n // special endpoint \"/cometd/replay/xx.x\" is only available in 36.0.\n // See https://releasenotes.docs.salesforce.com/en-us/summer16/release-notes/rn_api_streaming_classic_replay.htm\n \"cometd\" + (needsReplayFix === true && this._conn.version === \"36.0\" ? \"/replay\" : \"\"),\n this._conn.version\n ].join('/');\n var fayeClient = new Faye.Client(endpointUrl, {});\n fayeClient.setHeader('Authorization', 'OAuth '+this._conn.accessToken);\n if (extensions instanceof Array) {\n extensions.forEach(function(extension) {\n fayeClient.addExtension(extension);\n });\n }\n if (fayeClient._dispatcher.getConnectionTypes().indexOf('callback-polling') === -1) {\n // prevent streaming API server error\n fayeClient._dispatcher.selectTransport('long-polling');\n fayeClient._dispatcher._transport.batching = false;\n }\n return fayeClient;\n};\n\n/** @private **/\nStreaming.prototype._getFayeClient = function(channelName) {\n var isGeneric = channelName.indexOf('/u/') === 0;\n var clientType = isGeneric ? 'generic' : 'pushTopic';\n if (!this._fayeClients || !this._fayeClients[clientType]) {\n this._fayeClients = this._fayeClients || {};\n this._fayeClients[clientType] = this._createClient(channelName);\n }\n return this._fayeClients[clientType];\n};\n\n\n/**\n * Get named topic\n *\n * @param {String} name - Topic name\n * @returns {Streaming~Topic}\n */\nStreaming.prototype.topic = function(name) {\n this._topics = this._topics || {};\n var topic = this._topics[name] =\n this._topics[name] || new Topic(this, name);\n return topic;\n};\n\n/**\n * Get Channel for Id\n * @param {String} channelId - Id of StreamingChannel object\n * @returns {Streaming~Channel}\n */\nStreaming.prototype.channel = function(channelId) {\n return new Channel(this, channelId);\n};\n\n/**\n * Subscribe topic/channel\n *\n * @param {String} name - Topic name\n * @param {Callback.} listener - Streaming message listener\n * @returns {Subscription} - Faye subscription object\n */\nStreaming.prototype.subscribe = function(name, listener) {\n var channelName = name.indexOf('/') === 0 ? name : '/topic/' + name;\n var fayeClient = this._getFayeClient(channelName);\n return fayeClient.subscribe(channelName, listener);\n};\n\n/**\n * Unsubscribe topic\n *\n * @param {String} name - Topic name\n * @param {Callback.} listener - Streaming message listener\n * @returns {Streaming}\n */\nStreaming.prototype.unsubscribe = function(name, listener) {\n var channelName = name.indexOf('/') === 0 ? name : '/topic/' + name;\n var fayeClient = this._getFayeClient(channelName);\n fayeClient.unsubscribe(channelName, listener);\n return this;\n};\n\n\n/**\n * Create a Streaming client, optionally with extensions\n *\n * See Faye docs for implementation details: https://faye.jcoglan.com/browser/extensions.html\n *\n * Example usage:\n * \n * ```javascript\n * // Establish a Salesforce connection. (Details elided)\n * const conn = new jsforce.Connection({ … });\n * \n * const fayeClient = conn.streaming.createClient();\n * \n * const subscription = fayeClient.subscribe(channel, data => {\n * console.log('topic received data', data);\n * });\n * \n * subscription.cancel();\n * ```\n * \n * Example with extensions, using Replay & Auth Failure extensions in a server-side Node.js app:\n * \n * ```javascript\n * // Establish a Salesforce connection. (Details elided)\n * const conn = new jsforce.Connection({ … });\n * \n * const channel = \"/event/My_Event__e\";\n * const replayId = -2; // -2 is all retained events\n * \n * const exitCallback = () => process.exit(1);\n * const authFailureExt = new jsforce.StreamingExtension.AuthFailure(exitCallback);\n * \n * const replayExt = new jsforce.StreamingExtension.Replay(channel, replayId);\n * \n * const fayeClient = conn.streaming.createClient([\n * authFailureExt,\n * replayExt\n * ]);\n * \n * const subscription = fayeClient.subscribe(channel, data => {\n * console.log('topic received data', data);\n * });\n * \n * subscription.cancel();\n * ```\n * \n * @param {Array} Extensions - Optional, extensions to apply to the Faye client\n * @returns {FayeClient} - Faye client object\n */\nStreaming.prototype.createClient = function(extensions) {\n return this._createClient(null, extensions);\n};\n\n/*--------------------------------------------*/\n/*\n * Register hook in connection instantiation for dynamically adding this API module features\n */\njsforce.on('connection:new', function(conn) {\n conn.streaming = new Streaming(conn);\n});\n\n/*\n * \n */\njsforce.StreamingExtension = StreamingExtension;\n\nmodule.exports = Streaming;\n","\"use strict\";\n\n// rawAsap provides everything we need except exception management.\nvar rawAsap = require(\"./raw\");\n// RawTasks are recycled to reduce GC churn.\nvar freeTasks = [];\n// We queue errors to ensure they are thrown in right order (FIFO).\n// Array-as-queue is good enough here, since we are just dealing with exceptions.\nvar pendingErrors = [];\nvar requestErrorThrow = rawAsap.makeRequestCallFromTimer(throwFirstError);\n\nfunction throwFirstError() {\n if (pendingErrors.length) {\n throw pendingErrors.shift();\n }\n}\n\n/**\n * Calls a task as soon as possible after returning, in its own event, with priority\n * over other events like animation, reflow, and repaint. An error thrown from an\n * event will not interrupt, nor even substantially slow down the processing of\n * other events, but will be rather postponed to a lower priority event.\n * @param {{call}} task A callable object, typically a function that takes no\n * arguments.\n */\nmodule.exports = asap;\nfunction asap(task) {\n var rawTask;\n if (freeTasks.length) {\n rawTask = freeTasks.pop();\n } else {\n rawTask = new RawTask();\n }\n rawTask.task = task;\n rawAsap(rawTask);\n}\n\n// We wrap tasks with recyclable task objects. A task object implements\n// `call`, just like a function.\nfunction RawTask() {\n this.task = null;\n}\n\n// The sole purpose of wrapping the task is to catch the exception and recycle\n// the task object after its single use.\nRawTask.prototype.call = function () {\n try {\n this.task.call();\n } catch (error) {\n if (asap.onerror) {\n // This hook exists purely for testing purposes.\n // Its name will be periodically randomized to break any code that\n // depends on its existence.\n asap.onerror(error);\n } else {\n // In a web browser, exceptions are not fatal. However, to avoid\n // slowing down the queue of pending tasks, we rethrow the error in a\n // lower priority turn.\n pendingErrors.push(error);\n requestErrorThrow();\n }\n } finally {\n this.task = null;\n freeTasks[freeTasks.length] = this;\n }\n};\n","\"use strict\";\n\n// Use the fastest means possible to execute a task in its own turn, with\n// priority over other events including IO, animation, reflow, and redraw\n// events in browsers.\n//\n// An exception thrown by a task will permanently interrupt the processing of\n// subsequent tasks. The higher level `asap` function ensures that if an\n// exception is thrown by a task, that the task queue will continue flushing as\n// soon as possible, but if you use `rawAsap` directly, you are responsible to\n// either ensure that no exceptions are thrown from your task, or to manually\n// call `rawAsap.requestFlush` if an exception is thrown.\nmodule.exports = rawAsap;\nfunction rawAsap(task) {\n if (!queue.length) {\n requestFlush();\n flushing = true;\n }\n // Equivalent to push, but avoids a function call.\n queue[queue.length] = task;\n}\n\nvar queue = [];\n// Once a flush has been requested, no further calls to `requestFlush` are\n// necessary until the next `flush` completes.\nvar flushing = false;\n// `requestFlush` is an implementation-specific method that attempts to kick\n// off a `flush` event as quickly as possible. `flush` will attempt to exhaust\n// the event queue before yielding to the browser's own event loop.\nvar requestFlush;\n// The position of the next task to execute in the task queue. This is\n// preserved between calls to `flush` so that it can be resumed if\n// a task throws an exception.\nvar index = 0;\n// If a task schedules additional tasks recursively, the task queue can grow\n// unbounded. To prevent memory exhaustion, the task queue will periodically\n// truncate already-completed tasks.\nvar capacity = 1024;\n\n// The flush function processes all tasks that have been scheduled with\n// `rawAsap` unless and until one of those tasks throws an exception.\n// If a task throws an exception, `flush` ensures that its state will remain\n// consistent and will resume where it left off when called again.\n// However, `flush` does not make any arrangements to be called again if an\n// exception is thrown.\nfunction flush() {\n while (index < queue.length) {\n var currentIndex = index;\n // Advance the index before calling the task. This ensures that we will\n // begin flushing on the next task the task throws an error.\n index = index + 1;\n queue[currentIndex].call();\n // Prevent leaking memory for long chains of recursive calls to `asap`.\n // If we call `asap` within tasks scheduled by `asap`, the queue will\n // grow, but to avoid an O(n) walk for every task we execute, we don't\n // shift tasks off the queue after they have been executed.\n // Instead, we periodically shift 1024 tasks off the queue.\n if (index > capacity) {\n // Manually shift all values starting at the index back to the\n // beginning of the queue.\n for (var scan = 0, newLength = queue.length - index; scan < newLength; scan++) {\n queue[scan] = queue[scan + index];\n }\n queue.length -= index;\n index = 0;\n }\n }\n queue.length = 0;\n index = 0;\n flushing = false;\n}\n\n// `requestFlush` is implemented using a strategy based on data collected from\n// every available SauceLabs Selenium web driver worker at time of writing.\n// https://docs.google.com/spreadsheets/d/1mG-5UYGup5qxGdEMWkhP6BWCz053NUb2E1QoUTU16uA/edit#gid=783724593\n\n// Safari 6 and 6.1 for desktop, iPad, and iPhone are the only browsers that\n// have WebKitMutationObserver but not un-prefixed MutationObserver.\n// Must use `global` or `self` instead of `window` to work in both frames and web\n// workers. `global` is a provision of Browserify, Mr, Mrs, or Mop.\n\n/* globals self */\nvar scope = typeof global !== \"undefined\" ? global : self;\nvar BrowserMutationObserver = scope.MutationObserver || scope.WebKitMutationObserver;\n\n// MutationObservers are desirable because they have high priority and work\n// reliably everywhere they are implemented.\n// They are implemented in all modern browsers.\n//\n// - Android 4-4.3\n// - Chrome 26-34\n// - Firefox 14-29\n// - Internet Explorer 11\n// - iPad Safari 6-7.1\n// - iPhone Safari 7-7.1\n// - Safari 6-7\nif (typeof BrowserMutationObserver === \"function\") {\n requestFlush = makeRequestCallFromMutationObserver(flush);\n\n// MessageChannels are desirable because they give direct access to the HTML\n// task queue, are implemented in Internet Explorer 10, Safari 5.0-1, and Opera\n// 11-12, and in web workers in many engines.\n// Although message channels yield to any queued rendering and IO tasks, they\n// would be better than imposing the 4ms delay of timers.\n// However, they do not work reliably in Internet Explorer or Safari.\n\n// Internet Explorer 10 is the only browser that has setImmediate but does\n// not have MutationObservers.\n// Although setImmediate yields to the browser's renderer, it would be\n// preferrable to falling back to setTimeout since it does not have\n// the minimum 4ms penalty.\n// Unfortunately there appears to be a bug in Internet Explorer 10 Mobile (and\n// Desktop to a lesser extent) that renders both setImmediate and\n// MessageChannel useless for the purposes of ASAP.\n// https://github.com/kriskowal/q/issues/396\n\n// Timers are implemented universally.\n// We fall back to timers in workers in most engines, and in foreground\n// contexts in the following browsers.\n// However, note that even this simple case requires nuances to operate in a\n// broad spectrum of browsers.\n//\n// - Firefox 3-13\n// - Internet Explorer 6-9\n// - iPad Safari 4.3\n// - Lynx 2.8.7\n} else {\n requestFlush = makeRequestCallFromTimer(flush);\n}\n\n// `requestFlush` requests that the high priority event queue be flushed as\n// soon as possible.\n// This is useful to prevent an error thrown in a task from stalling the event\n// queue if the exception handled by Node.js’s\n// `process.on(\"uncaughtException\")` or by a domain.\nrawAsap.requestFlush = requestFlush;\n\n// To request a high priority event, we induce a mutation observer by toggling\n// the text of a text node between \"1\" and \"-1\".\nfunction makeRequestCallFromMutationObserver(callback) {\n var toggle = 1;\n var observer = new BrowserMutationObserver(callback);\n var node = document.createTextNode(\"\");\n observer.observe(node, {characterData: true});\n return function requestCall() {\n toggle = -toggle;\n node.data = toggle;\n };\n}\n\n// The message channel technique was discovered by Malte Ubl and was the\n// original foundation for this library.\n// http://www.nonblocking.io/2011/06/windownexttick.html\n\n// Safari 6.0.5 (at least) intermittently fails to create message ports on a\n// page's first load. Thankfully, this version of Safari supports\n// MutationObservers, so we don't need to fall back in that case.\n\n// function makeRequestCallFromMessageChannel(callback) {\n// var channel = new MessageChannel();\n// channel.port1.onmessage = callback;\n// return function requestCall() {\n// channel.port2.postMessage(0);\n// };\n// }\n\n// For reasons explained above, we are also unable to use `setImmediate`\n// under any circumstances.\n// Even if we were, there is another bug in Internet Explorer 10.\n// It is not sufficient to assign `setImmediate` to `requestFlush` because\n// `setImmediate` must be called *by name* and therefore must be wrapped in a\n// closure.\n// Never forget.\n\n// function makeRequestCallFromSetImmediate(callback) {\n// return function requestCall() {\n// setImmediate(callback);\n// };\n// }\n\n// Safari 6.0 has a problem where timers will get lost while the user is\n// scrolling. This problem does not impact ASAP because Safari 6.0 supports\n// mutation observers, so that implementation is used instead.\n// However, if we ever elect to use timers in Safari, the prevalent work-around\n// is to add a scroll event listener that calls for a flush.\n\n// `setTimeout` does not call the passed callback if the delay is less than\n// approximately 7 in web workers in Firefox 8 through 18, and sometimes not\n// even then.\n\nfunction makeRequestCallFromTimer(callback) {\n return function requestCall() {\n // We dispatch a timeout with a specified delay of 0 for engines that\n // can reliably accommodate that request. This will usually be snapped\n // to a 4 milisecond delay, but once we're flushing, there's no delay\n // between events.\n var timeoutHandle = setTimeout(handleTimer, 0);\n // However, since this timer gets frequently dropped in Firefox\n // workers, we enlist an interval handle that will try to fire\n // an event 20 times per second until it succeeds.\n var intervalHandle = setInterval(handleTimer, 50);\n\n function handleTimer() {\n // Whichever timer succeeds will cancel both timers and\n // execute the callback.\n clearTimeout(timeoutHandle);\n clearInterval(intervalHandle);\n callback();\n }\n };\n}\n\n// This is for `asap.js` only.\n// Its name will be periodically randomized to break any code that depends on\n// its existence.\nrawAsap.makeRequestCallFromTimer = makeRequestCallFromTimer;\n\n// ASAP was originally a nextTick shim included in Q. This was factored out\n// into this ASAP package. It was later adapted to RSVP which made further\n// amendments. These decisions, particularly to marginalize MessageChannel and\n// to capture the MutationObserver implementation in a closure, were integrated\n// back into ASAP proper.\n// https://github.com/tildeio/rsvp.js/blob/cddf7232546a9cf858524b75cde6f9edf72620a7/lib/rsvp/asap.js\n","'use strict';\n\nvar constants = require('./util/constants'),\n Logging = require('./mixins/logging');\n\nvar Faye = {\n VERSION: constants.VERSION,\n\n Client: require('./protocol/client'),\n Scheduler: require('./protocol/scheduler')\n};\n\nLogging.wrapper = Faye;\n\nmodule.exports = Faye;\n","'use strict';\n\nvar Promise = require('../util/promise');\n\nmodule.exports = {\n then: function(callback, errback) {\n var self = this;\n if (!this._promise)\n this._promise = new Promise(function(resolve, reject) {\n self._resolve = resolve;\n self._reject = reject;\n });\n\n if (arguments.length === 0)\n return this._promise;\n else\n return this._promise.then(callback, errback);\n },\n\n callback: function(callback, context) {\n return this.then(function(value) { callback.call(context, value) });\n },\n\n errback: function(callback, context) {\n return this.then(null, function(reason) { callback.call(context, reason) });\n },\n\n timeout: function(seconds, message) {\n this.then();\n var self = this;\n this._timer = global.setTimeout(function() {\n self._reject(message);\n }, seconds * 1000);\n },\n\n setDeferredStatus: function(status, value) {\n if (this._timer) global.clearTimeout(this._timer);\n\n this.then();\n\n if (status === 'succeeded')\n this._resolve(value);\n else if (status === 'failed')\n this._reject(value);\n else\n delete this._promise;\n }\n};\n","'use strict';\n\nvar toJSON = require('../util/to_json');\n\nvar Logging = {\n LOG_LEVELS: {\n fatal: 4,\n error: 3,\n warn: 2,\n info: 1,\n debug: 0\n },\n\n writeLog: function(messageArgs, level) {\n var logger = Logging.logger || (Logging.wrapper || Logging).logger;\n if (!logger) return;\n\n var args = Array.prototype.slice.apply(messageArgs),\n banner = '[Faye',\n klass = this.className,\n\n message = args.shift().replace(/\\?/g, function() {\n try {\n return toJSON(args.shift());\n } catch (error) {\n return '[Object]';\n }\n });\n\n if (klass) banner += '.' + klass;\n banner += '] ';\n\n if (typeof logger[level] === 'function')\n logger[level](banner + message);\n else if (typeof logger === 'function')\n logger(banner + message);\n }\n};\n\nfor (var key in Logging.LOG_LEVELS)\n (function(level) {\n Logging[level] = function() {\n this.writeLog(arguments, level);\n };\n })(key);\n\nmodule.exports = Logging;\n","'use strict';\n\nvar extend = require('../util/extend'),\n EventEmitter = require('../util/event_emitter');\n\nvar Publisher = {\n countListeners: function(eventType) {\n return this.listeners(eventType).length;\n },\n\n bind: function(eventType, listener, context) {\n var slice = Array.prototype.slice,\n handler = function() { listener.apply(context, slice.call(arguments)) };\n\n this._listeners = this._listeners || [];\n this._listeners.push([eventType, listener, context, handler]);\n return this.on(eventType, handler);\n },\n\n unbind: function(eventType, listener, context) {\n this._listeners = this._listeners || [];\n var n = this._listeners.length, tuple;\n\n while (n--) {\n tuple = this._listeners[n];\n if (tuple[0] !== eventType) continue;\n if (listener && (tuple[1] !== listener || tuple[2] !== context)) continue;\n this._listeners.splice(n, 1);\n this.removeListener(eventType, tuple[3]);\n }\n }\n};\n\nextend(Publisher, EventEmitter.prototype);\nPublisher.trigger = Publisher.emit;\n\nmodule.exports = Publisher;\n","'use strict';\n\nmodule.exports = {\n addTimeout: function(name, delay, callback, context) {\n this._timeouts = this._timeouts || {};\n if (this._timeouts.hasOwnProperty(name)) return;\n var self = this;\n this._timeouts[name] = global.setTimeout(function() {\n delete self._timeouts[name];\n callback.call(context);\n }, 1000 * delay);\n },\n\n removeTimeout: function(name) {\n this._timeouts = this._timeouts || {};\n var timeout = this._timeouts[name];\n if (!timeout) return;\n global.clearTimeout(timeout);\n delete this._timeouts[name];\n },\n\n removeAllTimeouts: function() {\n this._timeouts = this._timeouts || {};\n for (var name in this._timeouts) this.removeTimeout(name);\n }\n};\n","'use strict';\n\nvar Class = require('../util/class'),\n extend = require('../util/extend'),\n Publisher = require('../mixins/publisher'),\n Grammar = require('./grammar');\n\nvar Channel = Class({\n initialize: function(name) {\n this.id = this.name = name;\n },\n\n push: function(message) {\n this.trigger('message', message);\n },\n\n isUnused: function() {\n return this.countListeners('message') === 0;\n }\n});\n\nextend(Channel.prototype, Publisher);\n\nextend(Channel, {\n HANDSHAKE: '/meta/handshake',\n CONNECT: '/meta/connect',\n SUBSCRIBE: '/meta/subscribe',\n UNSUBSCRIBE: '/meta/unsubscribe',\n DISCONNECT: '/meta/disconnect',\n\n META: 'meta',\n SERVICE: 'service',\n\n expand: function(name) {\n var segments = this.parse(name),\n channels = ['/**', name];\n\n var copy = segments.slice();\n copy[copy.length - 1] = '*';\n channels.push(this.unparse(copy));\n\n for (var i = 1, n = segments.length; i < n; i++) {\n copy = segments.slice(0, i);\n copy.push('**');\n channels.push(this.unparse(copy));\n }\n\n return channels;\n },\n\n isValid: function(name) {\n return Grammar.CHANNEL_NAME.test(name) ||\n Grammar.CHANNEL_PATTERN.test(name);\n },\n\n parse: function(name) {\n if (!this.isValid(name)) return null;\n return name.split('/').slice(1);\n },\n\n unparse: function(segments) {\n return '/' + segments.join('/');\n },\n\n isMeta: function(name) {\n var segments = this.parse(name);\n return segments ? (segments[0] === this.META) : null;\n },\n\n isService: function(name) {\n var segments = this.parse(name);\n return segments ? (segments[0] === this.SERVICE) : null;\n },\n\n isSubscribable: function(name) {\n if (!this.isValid(name)) return null;\n return !this.isMeta(name) && !this.isService(name);\n },\n\n Set: Class({\n initialize: function() {\n this._channels = {};\n },\n\n getKeys: function() {\n var keys = [];\n for (var key in this._channels) keys.push(key);\n return keys;\n },\n\n remove: function(name) {\n delete this._channels[name];\n },\n\n hasSubscription: function(name) {\n return this._channels.hasOwnProperty(name);\n },\n\n subscribe: function(names, subscription) {\n var name;\n for (var i = 0, n = names.length; i < n; i++) {\n name = names[i];\n var channel = this._channels[name] = this._channels[name] || new Channel(name);\n channel.bind('message', subscription);\n }\n },\n\n unsubscribe: function(name, subscription) {\n var channel = this._channels[name];\n if (!channel) return false;\n channel.unbind('message', subscription);\n\n if (channel.isUnused()) {\n this.remove(name);\n return true;\n } else {\n return false;\n }\n },\n\n distributeMessage: function(message) {\n var channels = Channel.expand(message.channel);\n\n for (var i = 0, n = channels.length; i < n; i++) {\n var channel = this._channels[channels[i]];\n if (channel) channel.trigger('message', message);\n }\n }\n })\n});\n\nmodule.exports = Channel;\n","'use strict';\n\nvar asap = require('asap'),\n Class = require('../util/class'),\n Promise = require('../util/promise'),\n URI = require('../util/uri'),\n array = require('../util/array'),\n browser = require('../util/browser'),\n constants = require('../util/constants'),\n extend = require('../util/extend'),\n validateOptions = require('../util/validate_options'),\n Deferrable = require('../mixins/deferrable'),\n Logging = require('../mixins/logging'),\n Publisher = require('../mixins/publisher'),\n Channel = require('./channel'),\n Dispatcher = require('./dispatcher'),\n Error = require('./error'),\n Extensible = require('./extensible'),\n Publication = require('./publication'),\n Subscription = require('./subscription');\n\nvar Client = Class({ className: 'Client',\n UNCONNECTED: 1,\n CONNECTING: 2,\n CONNECTED: 3,\n DISCONNECTED: 4,\n\n HANDSHAKE: 'handshake',\n RETRY: 'retry',\n NONE: 'none',\n\n CONNECTION_TIMEOUT: 60,\n\n DEFAULT_ENDPOINT: '/bayeux',\n INTERVAL: 0,\n\n initialize: function(endpoint, options) {\n this.info('New client created for ?', endpoint);\n options = options || {};\n\n validateOptions(options, ['interval', 'timeout', 'endpoints', 'proxy', 'retry', 'scheduler', 'websocketExtensions', 'tls', 'ca']);\n\n this._channels = new Channel.Set();\n this._dispatcher = Dispatcher.create(this, endpoint || this.DEFAULT_ENDPOINT, options);\n\n this._messageId = 0;\n this._state = this.UNCONNECTED;\n\n this._responseCallbacks = {};\n\n this._advice = {\n reconnect: this.RETRY,\n interval: 1000 * (options.interval || this.INTERVAL),\n timeout: 1000 * (options.timeout || this.CONNECTION_TIMEOUT)\n };\n this._dispatcher.timeout = this._advice.timeout / 1000;\n\n this._dispatcher.bind('message', this._receiveMessage, this);\n\n if (browser.Event && global.onbeforeunload !== undefined)\n browser.Event.on(global, 'beforeunload', function() {\n if (array.indexOf(this._dispatcher._disabled, 'autodisconnect') < 0)\n this.disconnect();\n }, this);\n },\n\n addWebsocketExtension: function(extension) {\n return this._dispatcher.addWebsocketExtension(extension);\n },\n\n disable: function(feature) {\n return this._dispatcher.disable(feature);\n },\n\n setHeader: function(name, value) {\n return this._dispatcher.setHeader(name, value);\n },\n\n // Request\n // MUST include: * channel\n // * version\n // * supportedConnectionTypes\n // MAY include: * minimumVersion\n // * ext\n // * id\n //\n // Success Response Failed Response\n // MUST include: * channel MUST include: * channel\n // * version * successful\n // * supportedConnectionTypes * error\n // * clientId MAY include: * supportedConnectionTypes\n // * successful * advice\n // MAY include: * minimumVersion * version\n // * advice * minimumVersion\n // * ext * ext\n // * id * id\n // * authSuccessful\n handshake: function(callback, context) {\n if (this._advice.reconnect === this.NONE) return;\n if (this._state !== this.UNCONNECTED) return;\n\n this._state = this.CONNECTING;\n var self = this;\n\n this.info('Initiating handshake with ?', URI.stringify(this._dispatcher.endpoint));\n this._dispatcher.selectTransport(constants.MANDATORY_CONNECTION_TYPES);\n\n this._sendMessage({\n channel: Channel.HANDSHAKE,\n version: constants.BAYEUX_VERSION,\n supportedConnectionTypes: this._dispatcher.getConnectionTypes()\n\n }, {}, function(response) {\n\n if (response.successful) {\n this._state = this.CONNECTED;\n this._dispatcher.clientId = response.clientId;\n\n this._dispatcher.selectTransport(response.supportedConnectionTypes);\n\n this.info('Handshake successful: ?', this._dispatcher.clientId);\n\n this.subscribe(this._channels.getKeys(), true);\n if (callback) asap(function() { callback.call(context) });\n\n } else {\n this.info('Handshake unsuccessful');\n global.setTimeout(function() { self.handshake(callback, context) }, this._dispatcher.retry * 1000);\n this._state = this.UNCONNECTED;\n }\n }, this);\n },\n\n // Request Response\n // MUST include: * channel MUST include: * channel\n // * clientId * successful\n // * connectionType * clientId\n // MAY include: * ext MAY include: * error\n // * id * advice\n // * ext\n // * id\n // * timestamp\n connect: function(callback, context) {\n if (this._advice.reconnect === this.NONE) return;\n if (this._state === this.DISCONNECTED) return;\n\n if (this._state === this.UNCONNECTED)\n return this.handshake(function() { this.connect(callback, context) }, this);\n\n this.callback(callback, context);\n if (this._state !== this.CONNECTED) return;\n\n this.info('Calling deferred actions for ?', this._dispatcher.clientId);\n this.setDeferredStatus('succeeded');\n this.setDeferredStatus('unknown');\n\n if (this._connectRequest) return;\n this._connectRequest = true;\n\n this.info('Initiating connection for ?', this._dispatcher.clientId);\n\n this._sendMessage({\n channel: Channel.CONNECT,\n clientId: this._dispatcher.clientId,\n connectionType: this._dispatcher.connectionType\n\n }, {}, this._cycleConnection, this);\n },\n\n // Request Response\n // MUST include: * channel MUST include: * channel\n // * clientId * successful\n // MAY include: * ext * clientId\n // * id MAY include: * error\n // * ext\n // * id\n disconnect: function() {\n if (this._state !== this.CONNECTED) return;\n this._state = this.DISCONNECTED;\n\n this.info('Disconnecting ?', this._dispatcher.clientId);\n var promise = new Publication();\n\n this._sendMessage({\n channel: Channel.DISCONNECT,\n clientId: this._dispatcher.clientId\n\n }, {}, function(response) {\n if (response.successful) {\n this._dispatcher.close();\n promise.setDeferredStatus('succeeded');\n } else {\n promise.setDeferredStatus('failed', Error.parse(response.error));\n }\n }, this);\n\n this.info('Clearing channel listeners for ?', this._dispatcher.clientId);\n this._channels = new Channel.Set();\n\n return promise;\n },\n\n // Request Response\n // MUST include: * channel MUST include: * channel\n // * clientId * successful\n // * subscription * clientId\n // MAY include: * ext * subscription\n // * id MAY include: * error\n // * advice\n // * ext\n // * id\n // * timestamp\n subscribe: function(channel, callback, context) {\n if (channel instanceof Array)\n return array.map(channel, function(c) {\n return this.subscribe(c, callback, context);\n }, this);\n\n var subscription = new Subscription(this, channel, callback, context),\n force = (callback === true),\n hasSubscribe = this._channels.hasSubscription(channel);\n\n if (hasSubscribe && !force) {\n this._channels.subscribe([channel], subscription);\n subscription.setDeferredStatus('succeeded');\n return subscription;\n }\n\n this.connect(function() {\n this.info('Client ? attempting to subscribe to ?', this._dispatcher.clientId, channel);\n if (!force) this._channels.subscribe([channel], subscription);\n\n this._sendMessage({\n channel: Channel.SUBSCRIBE,\n clientId: this._dispatcher.clientId,\n subscription: channel\n\n }, {}, function(response) {\n if (!response.successful) {\n subscription.setDeferredStatus('failed', Error.parse(response.error));\n return this._channels.unsubscribe(channel, subscription);\n }\n\n var channels = [].concat(response.subscription);\n this.info('Subscription acknowledged for ? to ?', this._dispatcher.clientId, channels);\n subscription.setDeferredStatus('succeeded');\n }, this);\n }, this);\n\n return subscription;\n },\n\n // Request Response\n // MUST include: * channel MUST include: * channel\n // * clientId * successful\n // * subscription * clientId\n // MAY include: * ext * subscription\n // * id MAY include: * error\n // * advice\n // * ext\n // * id\n // * timestamp\n unsubscribe: function(channel, subscription) {\n if (channel instanceof Array)\n return array.map(channel, function(c) {\n return this.unsubscribe(c, subscription);\n }, this);\n\n var dead = this._channels.unsubscribe(channel, subscription);\n if (!dead) return;\n\n this.connect(function() {\n this.info('Client ? attempting to unsubscribe from ?', this._dispatcher.clientId, channel);\n\n this._sendMessage({\n channel: Channel.UNSUBSCRIBE,\n clientId: this._dispatcher.clientId,\n subscription: channel\n\n }, {}, function(response) {\n if (!response.successful) return;\n\n var channels = [].concat(response.subscription);\n this.info('Unsubscription acknowledged for ? from ?', this._dispatcher.clientId, channels);\n }, this);\n }, this);\n },\n\n // Request Response\n // MUST include: * channel MUST include: * channel\n // * data * successful\n // MAY include: * clientId MAY include: * id\n // * id * error\n // * ext * ext\n publish: function(channel, data, options) {\n validateOptions(options || {}, ['attempts', 'deadline']);\n var publication = new Publication();\n\n this.connect(function() {\n this.info('Client ? queueing published message to ?: ?', this._dispatcher.clientId, channel, data);\n\n this._sendMessage({\n channel: channel,\n data: data,\n clientId: this._dispatcher.clientId\n\n }, options, function(response) {\n if (response.successful)\n publication.setDeferredStatus('succeeded');\n else\n publication.setDeferredStatus('failed', Error.parse(response.error));\n }, this);\n }, this);\n\n return publication;\n },\n\n _sendMessage: function(message, options, callback, context) {\n message.id = this._generateMessageId();\n\n var timeout = this._advice.timeout\n ? 1.2 * this._advice.timeout / 1000\n : 1.2 * this._dispatcher.retry;\n\n this.pipeThroughExtensions('outgoing', message, null, function(message) {\n if (!message) return;\n if (callback) this._responseCallbacks[message.id] = [callback, context];\n this._dispatcher.sendMessage(message, timeout, options || {});\n }, this);\n },\n\n _generateMessageId: function() {\n this._messageId += 1;\n if (this._messageId >= Math.pow(2,32)) this._messageId = 0;\n return this._messageId.toString(36);\n },\n\n _receiveMessage: function(message) {\n var id = message.id, callback;\n\n if (message.successful !== undefined) {\n callback = this._responseCallbacks[id];\n delete this._responseCallbacks[id];\n }\n\n this.pipeThroughExtensions('incoming', message, null, function(message) {\n if (!message) return;\n if (message.advice) this._handleAdvice(message.advice);\n this._deliverMessage(message);\n if (callback) callback[0].call(callback[1], message);\n }, this);\n },\n\n _handleAdvice: function(advice) {\n extend(this._advice, advice);\n this._dispatcher.timeout = this._advice.timeout / 1000;\n\n if (this._advice.reconnect === this.HANDSHAKE && this._state !== this.DISCONNECTED) {\n this._state = this.UNCONNECTED;\n this._dispatcher.clientId = null;\n this._cycleConnection();\n }\n },\n\n _deliverMessage: function(message) {\n if (!message.channel || message.data === undefined) return;\n this.info('Client ? calling listeners for ? with ?', this._dispatcher.clientId, message.channel, message.data);\n this._channels.distributeMessage(message);\n },\n\n _cycleConnection: function() {\n if (this._connectRequest) {\n this._connectRequest = null;\n this.info('Closed connection for ?', this._dispatcher.clientId);\n }\n var self = this;\n global.setTimeout(function() { self.connect() }, this._advice.interval);\n }\n});\n\nextend(Client.prototype, Deferrable);\nextend(Client.prototype, Publisher);\nextend(Client.prototype, Logging);\nextend(Client.prototype, Extensible);\n\nmodule.exports = Client;\n","'use strict';\n\nvar Class = require('../util/class'),\n URI = require('../util/uri'),\n cookies = require('../util/cookies'),\n extend = require('../util/extend'),\n Logging = require('../mixins/logging'),\n Publisher = require('../mixins/publisher'),\n Transport = require('../transport'),\n Scheduler = require('./scheduler');\n\nvar Dispatcher = Class({ className: 'Dispatcher',\n MAX_REQUEST_SIZE: 2048,\n DEFAULT_RETRY: 5,\n\n UP: 1,\n DOWN: 2,\n\n initialize: function(client, endpoint, options) {\n this._client = client;\n this.endpoint = URI.parse(endpoint);\n this._alternates = options.endpoints || {};\n\n this.cookies = cookies.CookieJar && new cookies.CookieJar();\n this._disabled = [];\n this._envelopes = {};\n this.headers = {};\n this.retry = options.retry || this.DEFAULT_RETRY;\n this._scheduler = options.scheduler || Scheduler;\n this._state = 0;\n this.transports = {};\n this.wsExtensions = [];\n\n this.proxy = options.proxy || {};\n if (typeof this._proxy === 'string') this._proxy = {origin: this._proxy};\n\n var exts = options.websocketExtensions;\n if (exts) {\n exts = [].concat(exts);\n for (var i = 0, n = exts.length; i < n; i++)\n this.addWebsocketExtension(exts[i]);\n }\n\n this.tls = options.tls || {};\n this.tls.ca = this.tls.ca || options.ca;\n\n for (var type in this._alternates)\n this._alternates[type] = URI.parse(this._alternates[type]);\n\n this.maxRequestSize = this.MAX_REQUEST_SIZE;\n },\n\n endpointFor: function(connectionType) {\n return this._alternates[connectionType] || this.endpoint;\n },\n\n addWebsocketExtension: function(extension) {\n this.wsExtensions.push(extension);\n },\n\n disable: function(feature) {\n this._disabled.push(feature);\n },\n\n setHeader: function(name, value) {\n this.headers[name] = value;\n },\n\n close: function() {\n var transport = this._transport;\n delete this._transport;\n if (transport) transport.close();\n },\n\n getConnectionTypes: function() {\n return Transport.getConnectionTypes();\n },\n\n selectTransport: function(transportTypes) {\n Transport.get(this, transportTypes, this._disabled, function(transport) {\n this.debug('Selected ? transport for ?', transport.connectionType, URI.stringify(transport.endpoint));\n\n if (transport === this._transport) return;\n if (this._transport) this._transport.close();\n\n this._transport = transport;\n this.connectionType = transport.connectionType;\n }, this);\n },\n\n sendMessage: function(message, timeout, options) {\n options = options || {};\n\n var id = message.id,\n attempts = options.attempts,\n deadline = options.deadline && new Date().getTime() + (options.deadline * 1000),\n envelope = this._envelopes[id],\n scheduler;\n\n if (!envelope) {\n scheduler = new this._scheduler(message, {timeout: timeout, interval: this.retry, attempts: attempts, deadline: deadline});\n envelope = this._envelopes[id] = {message: message, scheduler: scheduler};\n }\n\n this._sendEnvelope(envelope);\n },\n\n _sendEnvelope: function(envelope) {\n if (!this._transport) return;\n if (envelope.request || envelope.timer) return;\n\n var message = envelope.message,\n scheduler = envelope.scheduler,\n self = this;\n\n if (!scheduler.isDeliverable()) {\n scheduler.abort();\n delete this._envelopes[message.id];\n return;\n }\n\n envelope.timer = global.setTimeout(function() {\n self.handleError(message);\n }, scheduler.getTimeout() * 1000);\n\n scheduler.send();\n envelope.request = this._transport.sendMessage(message);\n },\n\n handleResponse: function(reply) {\n var envelope = this._envelopes[reply.id];\n\n if (reply.successful !== undefined && envelope) {\n envelope.scheduler.succeed();\n delete this._envelopes[reply.id];\n global.clearTimeout(envelope.timer);\n }\n\n this.trigger('message', reply);\n\n if (this._state === this.UP) return;\n this._state = this.UP;\n this._client.trigger('transport:up');\n },\n\n handleError: function(message, immediate) {\n var envelope = this._envelopes[message.id],\n request = envelope && envelope.request,\n self = this;\n\n if (!request) return;\n\n request.then(function(req) {\n if (req && req.abort) req.abort();\n });\n\n var scheduler = envelope.scheduler;\n scheduler.fail();\n\n global.clearTimeout(envelope.timer);\n envelope.request = envelope.timer = null;\n\n if (immediate) {\n this._sendEnvelope(envelope);\n } else {\n envelope.timer = global.setTimeout(function() {\n envelope.timer = null;\n self._sendEnvelope(envelope);\n }, scheduler.getInterval() * 1000);\n }\n\n if (this._state === this.DOWN) return;\n this._state = this.DOWN;\n this._client.trigger('transport:down');\n }\n});\n\nDispatcher.create = function(client, endpoint, options) {\n return new Dispatcher(client, endpoint, options);\n};\n\nextend(Dispatcher.prototype, Publisher);\nextend(Dispatcher.prototype, Logging);\n\nmodule.exports = Dispatcher;\n","'use strict';\n\nvar Class = require('../util/class'),\n Grammar = require('./grammar');\n\nvar Error = Class({\n initialize: function(code, params, message) {\n this.code = code;\n this.params = Array.prototype.slice.call(params);\n this.message = message;\n },\n\n toString: function() {\n return this.code + ':' +\n this.params.join(',') + ':' +\n this.message;\n }\n});\n\nError.parse = function(message) {\n message = message || '';\n if (!Grammar.ERROR.test(message)) return new Error(null, [], message);\n\n var parts = message.split(':'),\n code = parseInt(parts[0]),\n params = parts[1].split(','),\n message = parts[2];\n\n return new Error(code, params, message);\n};\n\n// http://code.google.com/p/cometd/wiki/BayeuxCodes\nvar errors = {\n versionMismatch: [300, 'Version mismatch'],\n conntypeMismatch: [301, 'Connection types not supported'],\n extMismatch: [302, 'Extension mismatch'],\n badRequest: [400, 'Bad request'],\n clientUnknown: [401, 'Unknown client'],\n parameterMissing: [402, 'Missing required parameter'],\n channelForbidden: [403, 'Forbidden channel'],\n channelUnknown: [404, 'Unknown channel'],\n channelInvalid: [405, 'Invalid channel'],\n extUnknown: [406, 'Unknown extension'],\n publishFailed: [407, 'Failed to publish'],\n serverError: [500, 'Internal server error']\n};\n\nfor (var name in errors)\n (function(name) {\n Error[name] = function() {\n return new Error(errors[name][0], arguments, errors[name][1]).toString();\n };\n })(name);\n\nmodule.exports = Error;\n","'use strict';\n\nvar extend = require('../util/extend'),\n Logging = require('../mixins/logging');\n\nvar Extensible = {\n addExtension: function(extension) {\n this._extensions = this._extensions || [];\n this._extensions.push(extension);\n if (extension.added) extension.added(this);\n },\n\n removeExtension: function(extension) {\n if (!this._extensions) return;\n var i = this._extensions.length;\n while (i--) {\n if (this._extensions[i] !== extension) continue;\n this._extensions.splice(i,1);\n if (extension.removed) extension.removed(this);\n }\n },\n\n pipeThroughExtensions: function(stage, message, request, callback, context) {\n this.debug('Passing through ? extensions: ?', stage, message);\n\n if (!this._extensions) return callback.call(context, message);\n var extensions = this._extensions.slice();\n\n var pipe = function(message) {\n if (!message) return callback.call(context, message);\n\n var extension = extensions.shift();\n if (!extension) return callback.call(context, message);\n\n var fn = extension[stage];\n if (!fn) return pipe(message);\n\n if (fn.length >= 3) extension[stage](message, request, pipe);\n else extension[stage](message, pipe);\n };\n pipe(message);\n }\n};\n\nextend(Extensible, Logging);\n\nmodule.exports = Extensible;\n","'use strict';\n\nmodule.exports = {\n CHANNEL_NAME: /^\\/(((([a-z]|[A-Z])|[0-9])|(\\-|\\_|\\!|\\~|\\(|\\)|\\$|\\@)))+(\\/(((([a-z]|[A-Z])|[0-9])|(\\-|\\_|\\!|\\~|\\(|\\)|\\$|\\@)))+)*$/,\n CHANNEL_PATTERN: /^(\\/(((([a-z]|[A-Z])|[0-9])|(\\-|\\_|\\!|\\~|\\(|\\)|\\$|\\@)))+)*\\/\\*{1,2}$/,\n ERROR: /^([0-9][0-9][0-9]:(((([a-z]|[A-Z])|[0-9])|(\\-|\\_|\\!|\\~|\\(|\\)|\\$|\\@)| |\\/|\\*|\\.))*(,(((([a-z]|[A-Z])|[0-9])|(\\-|\\_|\\!|\\~|\\(|\\)|\\$|\\@)| |\\/|\\*|\\.))*)*:(((([a-z]|[A-Z])|[0-9])|(\\-|\\_|\\!|\\~|\\(|\\)|\\$|\\@)| |\\/|\\*|\\.))*|[0-9][0-9][0-9]::(((([a-z]|[A-Z])|[0-9])|(\\-|\\_|\\!|\\~|\\(|\\)|\\$|\\@)| |\\/|\\*|\\.))*)$/,\n VERSION: /^([0-9])+(\\.(([a-z]|[A-Z])|[0-9])(((([a-z]|[A-Z])|[0-9])|\\-|\\_))*)*$/\n};\n","'use strict';\n\nvar Class = require('../util/class'),\n Deferrable = require('../mixins/deferrable');\n\nmodule.exports = Class(Deferrable);\n","'use strict';\n\nvar extend = require('../util/extend');\n\nvar Scheduler = function(message, options) {\n this.message = message;\n this.options = options;\n this.attempts = 0;\n};\n\nextend(Scheduler.prototype, {\n getTimeout: function() {\n return this.options.timeout;\n },\n\n getInterval: function() {\n return this.options.interval;\n },\n\n isDeliverable: function() {\n var attempts = this.options.attempts,\n made = this.attempts,\n deadline = this.options.deadline,\n now = new Date().getTime();\n\n if (attempts !== undefined && made >= attempts)\n return false;\n\n if (deadline !== undefined && now > deadline)\n return false;\n\n return true;\n },\n\n send: function() {\n this.attempts += 1;\n },\n\n succeed: function() {},\n\n fail: function() {},\n\n abort: function() {}\n});\n\nmodule.exports = Scheduler;\n","'use strict';\n\nvar Class = require('../util/class'),\n extend = require('../util/extend'),\n Deferrable = require('../mixins/deferrable');\n\nvar Subscription = Class({\n initialize: function(client, channels, callback, context) {\n this._client = client;\n this._channels = channels;\n this._callback = callback;\n this._context = context;\n this._cancelled = false;\n },\n\n withChannel: function(callback, context) {\n this._withChannel = [callback, context];\n return this;\n },\n\n apply: function(context, args) {\n var message = args[0];\n\n if (this._callback)\n this._callback.call(this._context, message.data);\n\n if (this._withChannel)\n this._withChannel[0].call(this._withChannel[1], message.channel, message.data);\n },\n\n cancel: function() {\n if (this._cancelled) return;\n this._client.unsubscribe(this._channels, this);\n this._cancelled = true;\n },\n\n unsubscribe: function() {\n this.cancel();\n }\n});\n\nextend(Subscription.prototype, Deferrable);\n\nmodule.exports = Subscription;\n","'use strict';\n\nvar Transport = require('./transport');\n\nTransport.register('websocket', require('./web_socket'));\nTransport.register('eventsource', require('./event_source'));\nTransport.register('long-polling', require('./xhr'));\nTransport.register('cross-origin-long-polling', require('./cors'));\nTransport.register('callback-polling', require('./jsonp'));\n\nmodule.exports = Transport;\n","'use strict';\n\nvar Class = require('../util/class'),\n Set = require('../util/set'),\n URI = require('../util/uri'),\n extend = require('../util/extend'),\n toJSON = require('../util/to_json'),\n Transport = require('./transport');\n\nvar CORS = extend(Class(Transport, {\n encode: function(messages) {\n return 'message=' + encodeURIComponent(toJSON(messages));\n },\n\n request: function(messages) {\n var xhrClass = global.XDomainRequest ? XDomainRequest : XMLHttpRequest,\n xhr = new xhrClass(),\n id = ++CORS._id,\n headers = this._dispatcher.headers,\n self = this,\n key;\n\n xhr.open('POST', URI.stringify(this.endpoint), true);\n\n if (xhr.setRequestHeader) {\n xhr.setRequestHeader('Pragma', 'no-cache');\n for (key in headers) {\n if (!headers.hasOwnProperty(key)) continue;\n xhr.setRequestHeader(key, headers[key]);\n }\n }\n\n var cleanUp = function() {\n if (!xhr) return false;\n CORS._pending.remove(id);\n xhr.onload = xhr.onerror = xhr.ontimeout = xhr.onprogress = null;\n xhr = null;\n };\n\n xhr.onload = function() {\n var replies;\n try { replies = JSON.parse(xhr.responseText) } catch (error) {}\n\n cleanUp();\n\n if (replies)\n self._receive(replies);\n else\n self._handleError(messages);\n };\n\n xhr.onerror = xhr.ontimeout = function() {\n cleanUp();\n self._handleError(messages);\n };\n\n xhr.onprogress = function() {};\n\n if (xhrClass === global.XDomainRequest)\n CORS._pending.add({id: id, xhr: xhr});\n\n xhr.send(this.encode(messages));\n return xhr;\n }\n}), {\n _id: 0,\n _pending: new Set(),\n\n isUsable: function(dispatcher, endpoint, callback, context) {\n if (URI.isSameOrigin(endpoint))\n return callback.call(context, false);\n\n if (global.XDomainRequest)\n return callback.call(context, endpoint.protocol === location.protocol);\n\n if (global.XMLHttpRequest) {\n var xhr = new XMLHttpRequest();\n return callback.call(context, xhr.withCredentials !== undefined);\n }\n return callback.call(context, false);\n }\n});\n\nmodule.exports = CORS;\n","'use strict';\n\nvar Class = require('../util/class'),\n URI = require('../util/uri'),\n copyObject = require('../util/copy_object'),\n extend = require('../util/extend'),\n Deferrable = require('../mixins/deferrable'),\n Transport = require('./transport'),\n XHR = require('./xhr');\n\nvar EventSource = extend(Class(Transport, {\n initialize: function(dispatcher, endpoint) {\n Transport.prototype.initialize.call(this, dispatcher, endpoint);\n if (!global.EventSource) return this.setDeferredStatus('failed');\n\n this._xhr = new XHR(dispatcher, endpoint);\n\n endpoint = copyObject(endpoint);\n endpoint.pathname += '/' + dispatcher.clientId;\n\n var socket = new global.EventSource(URI.stringify(endpoint)),\n self = this;\n\n socket.onopen = function() {\n self._everConnected = true;\n self.setDeferredStatus('succeeded');\n };\n\n socket.onerror = function() {\n if (self._everConnected) {\n self._handleError([]);\n } else {\n self.setDeferredStatus('failed');\n socket.close();\n }\n };\n\n socket.onmessage = function(event) {\n var replies;\n try { replies = JSON.parse(event.data) } catch (error) {}\n\n if (replies)\n self._receive(replies);\n else\n self._handleError([]);\n };\n\n this._socket = socket;\n },\n\n close: function() {\n if (!this._socket) return;\n this._socket.onopen = this._socket.onerror = this._socket.onmessage = null;\n this._socket.close();\n delete this._socket;\n },\n\n isUsable: function(callback, context) {\n this.callback(function() { callback.call(context, true) });\n this.errback(function() { callback.call(context, false) });\n },\n\n encode: function(messages) {\n return this._xhr.encode(messages);\n },\n\n request: function(messages) {\n return this._xhr.request(messages);\n }\n\n}), {\n isUsable: function(dispatcher, endpoint, callback, context) {\n var id = dispatcher.clientId;\n if (!id) return callback.call(context, false);\n\n XHR.isUsable(dispatcher, endpoint, function(usable) {\n if (!usable) return callback.call(context, false);\n this.create(dispatcher, endpoint).isUsable(callback, context);\n }, this);\n },\n\n create: function(dispatcher, endpoint) {\n var sockets = dispatcher.transports.eventsource = dispatcher.transports.eventsource || {},\n id = dispatcher.clientId;\n\n var url = copyObject(endpoint);\n url.pathname += '/' + (id || '');\n url = URI.stringify(url);\n\n sockets[url] = sockets[url] || new this(dispatcher, endpoint);\n return sockets[url];\n }\n});\n\nextend(EventSource.prototype, Deferrable);\n\nmodule.exports = EventSource;\n","'use strict';\n\nvar Class = require('../util/class'),\n URI = require('../util/uri'),\n copyObject = require('../util/copy_object'),\n extend = require('../util/extend'),\n toJSON = require('../util/to_json'),\n Transport = require('./transport');\n\nvar JSONP = extend(Class(Transport, {\n encode: function(messages) {\n var url = copyObject(this.endpoint);\n url.query.message = toJSON(messages);\n url.query.jsonp = '__jsonp' + JSONP._cbCount + '__';\n return URI.stringify(url);\n },\n\n request: function(messages) {\n var head = document.getElementsByTagName('head')[0],\n script = document.createElement('script'),\n callbackName = JSONP.getCallbackName(),\n endpoint = copyObject(this.endpoint),\n self = this;\n\n endpoint.query.message = toJSON(messages);\n endpoint.query.jsonp = callbackName;\n\n var cleanup = function() {\n if (!global[callbackName]) return false;\n global[callbackName] = undefined;\n try { delete global[callbackName] } catch (error) {}\n script.parentNode.removeChild(script);\n };\n\n global[callbackName] = function(replies) {\n cleanup();\n self._receive(replies);\n };\n\n script.type = 'text/javascript';\n script.src = URI.stringify(endpoint);\n head.appendChild(script);\n\n script.onerror = function() {\n cleanup();\n self._handleError(messages);\n };\n\n return {abort: cleanup};\n }\n}), {\n _cbCount: 0,\n\n getCallbackName: function() {\n this._cbCount += 1;\n return '__jsonp' + this._cbCount + '__';\n },\n\n isUsable: function(dispatcher, endpoint, callback, context) {\n callback.call(context, true);\n }\n});\n\nmodule.exports = JSONP;\n","'use strict';\n\nvar Class = require('../util/class'),\n Cookie = require('../util/cookies').Cookie,\n Promise = require('../util/promise'),\n URI = require('../util/uri'),\n array = require('../util/array'),\n extend = require('../util/extend'),\n Logging = require('../mixins/logging'),\n Timeouts = require('../mixins/timeouts'),\n Channel = require('../protocol/channel');\n\nvar Transport = extend(Class({ className: 'Transport',\n DEFAULT_PORTS: {'http:': 80, 'https:': 443, 'ws:': 80, 'wss:': 443},\n MAX_DELAY: 0,\n\n batching: true,\n\n initialize: function(dispatcher, endpoint) {\n this._dispatcher = dispatcher;\n this.endpoint = endpoint;\n this._outbox = [];\n this._proxy = extend({}, this._dispatcher.proxy);\n\n if (!this._proxy.origin)\n this._proxy.origin = this._findProxy();\n },\n\n close: function() {},\n\n encode: function(messages) {\n return '';\n },\n\n sendMessage: function(message) {\n this.debug('Client ? sending message to ?: ?',\n this._dispatcher.clientId, URI.stringify(this.endpoint), message);\n\n if (!this.batching) return Promise.resolve(this.request([message]));\n\n this._outbox.push(message);\n this._flushLargeBatch();\n\n if (message.channel === Channel.HANDSHAKE)\n return this._publish(0.01);\n\n if (message.channel === Channel.CONNECT)\n this._connectMessage = message;\n\n return this._publish(this.MAX_DELAY);\n },\n\n _makePromise: function() {\n var self = this;\n\n this._requestPromise = this._requestPromise || new Promise(function(resolve) {\n self._resolvePromise = resolve;\n });\n },\n\n _publish: function(delay) {\n this._makePromise();\n\n this.addTimeout('publish', delay, function() {\n this._flush();\n delete this._requestPromise;\n }, this);\n\n return this._requestPromise;\n },\n\n _flush: function() {\n this.removeTimeout('publish');\n\n if (this._outbox.length > 1 && this._connectMessage)\n this._connectMessage.advice = {timeout: 0};\n\n this._resolvePromise(this.request(this._outbox));\n\n this._connectMessage = null;\n this._outbox = [];\n },\n\n _flushLargeBatch: function() {\n var string = this.encode(this._outbox);\n if (string.length < this._dispatcher.maxRequestSize) return;\n var last = this._outbox.pop();\n\n this._makePromise();\n this._flush();\n\n if (last) this._outbox.push(last);\n },\n\n _receive: function(replies) {\n if (!replies) return;\n replies = [].concat(replies);\n\n this.debug('Client ? received from ? via ?: ?',\n this._dispatcher.clientId, URI.stringify(this.endpoint), this.connectionType, replies);\n\n for (var i = 0, n = replies.length; i < n; i++)\n this._dispatcher.handleResponse(replies[i]);\n },\n\n _handleError: function(messages, immediate) {\n messages = [].concat(messages);\n\n this.debug('Client ? failed to send to ? via ?: ?',\n this._dispatcher.clientId, URI.stringify(this.endpoint), this.connectionType, messages);\n\n for (var i = 0, n = messages.length; i < n; i++)\n this._dispatcher.handleError(messages[i]);\n },\n\n _getCookies: function() {\n var cookies = this._dispatcher.cookies,\n url = URI.stringify(this.endpoint);\n\n if (!cookies) return '';\n\n return array.map(cookies.getCookiesSync(url), function(cookie) {\n return cookie.cookieString();\n }).join('; ');\n },\n\n _storeCookies: function(setCookie) {\n var cookies = this._dispatcher.cookies,\n url = URI.stringify(this.endpoint),\n cookie;\n\n if (!setCookie || !cookies) return;\n setCookie = [].concat(setCookie);\n\n for (var i = 0, n = setCookie.length; i < n; i++) {\n cookie = Cookie.parse(setCookie[i]);\n cookies.setCookieSync(cookie, url);\n }\n },\n\n _findProxy: function() {\n if (typeof process === 'undefined') return undefined;\n\n var protocol = this.endpoint.protocol;\n if (!protocol) return undefined;\n\n var name = protocol.replace(/:$/, '').toLowerCase() + '_proxy',\n upcase = name.toUpperCase(),\n env = process.env,\n keys, proxy;\n\n if (name === 'http_proxy' && env.REQUEST_METHOD) {\n keys = Object.keys(env).filter(function(k) { return /^http_proxy$/i.test(k) });\n if (keys.length === 1) {\n if (keys[0] === name && env[upcase] === undefined)\n proxy = env[name];\n } else if (keys.length > 1) {\n proxy = env[name];\n }\n proxy = proxy || env['CGI_' + upcase];\n } else {\n proxy = env[name] || env[upcase];\n if (proxy && !env[name])\n console.warn('The environment variable ' + upcase +\n ' is discouraged. Use ' + name + '.');\n }\n return proxy;\n }\n\n}), {\n get: function(dispatcher, allowed, disabled, callback, context) {\n var endpoint = dispatcher.endpoint;\n\n array.asyncEach(this._transports, function(pair, resume) {\n var connType = pair[0], klass = pair[1],\n connEndpoint = dispatcher.endpointFor(connType);\n\n if (array.indexOf(disabled, connType) >= 0)\n return resume();\n\n if (array.indexOf(allowed, connType) < 0) {\n klass.isUsable(dispatcher, connEndpoint, function() {});\n return resume();\n }\n\n klass.isUsable(dispatcher, connEndpoint, function(isUsable) {\n if (!isUsable) return resume();\n var transport = klass.hasOwnProperty('create') ? klass.create(dispatcher, connEndpoint) : new klass(dispatcher, connEndpoint);\n callback.call(context, transport);\n });\n }, function() {\n throw new Error('Could not find a usable connection type for ' + URI.stringify(endpoint));\n });\n },\n\n register: function(type, klass) {\n this._transports.push([type, klass]);\n klass.prototype.connectionType = type;\n },\n\n getConnectionTypes: function() {\n return array.map(this._transports, function(t) { return t[0] });\n },\n\n _transports: []\n});\n\nextend(Transport.prototype, Logging);\nextend(Transport.prototype, Timeouts);\n\nmodule.exports = Transport;\n","'use strict';\n\nvar Class = require('../util/class'),\n Promise = require('../util/promise'),\n Set = require('../util/set'),\n URI = require('../util/uri'),\n browser = require('../util/browser'),\n copyObject = require('../util/copy_object'),\n extend = require('../util/extend'),\n toJSON = require('../util/to_json'),\n ws = require('../util/websocket'),\n Deferrable = require('../mixins/deferrable'),\n Transport = require('./transport');\n\nvar WebSocket = extend(Class(Transport, {\n UNCONNECTED: 1,\n CONNECTING: 2,\n CONNECTED: 3,\n\n batching: false,\n\n isUsable: function(callback, context) {\n this.callback(function() { callback.call(context, true) });\n this.errback(function() { callback.call(context, false) });\n this.connect();\n },\n\n request: function(messages) {\n this._pending = this._pending || new Set();\n for (var i = 0, n = messages.length; i < n; i++) this._pending.add(messages[i]);\n\n var self = this;\n\n var promise = new Promise(function(resolve, reject) {\n self.callback(function(socket) {\n if (!socket || socket.readyState !== 1) return;\n socket.send(toJSON(messages));\n resolve(socket);\n });\n\n self.connect();\n });\n\n return {\n abort: function() { promise.then(function(ws) { ws.close() }) }\n };\n },\n\n connect: function() {\n if (WebSocket._unloaded) return;\n\n this._state = this._state || this.UNCONNECTED;\n if (this._state !== this.UNCONNECTED) return;\n this._state = this.CONNECTING;\n\n var socket = this._createSocket();\n if (!socket) return this.setDeferredStatus('failed');\n\n var self = this;\n\n socket.onopen = function() {\n if (socket.headers) self._storeCookies(socket.headers['set-cookie']);\n self._socket = socket;\n self._state = self.CONNECTED;\n self._everConnected = true;\n self._ping();\n self.setDeferredStatus('succeeded', socket);\n };\n\n var closed = false;\n socket.onclose = socket.onerror = function() {\n if (closed) return;\n closed = true;\n\n var wasConnected = (self._state === self.CONNECTED);\n socket.onopen = socket.onclose = socket.onerror = socket.onmessage = null;\n\n delete self._socket;\n self._state = self.UNCONNECTED;\n self.removeTimeout('ping');\n\n var pending = self._pending ? self._pending.toArray() : [];\n delete self._pending;\n\n if (wasConnected || self._everConnected) {\n self.setDeferredStatus('unknown');\n self._handleError(pending, wasConnected);\n } else {\n self.setDeferredStatus('failed');\n }\n };\n\n socket.onmessage = function(event) {\n var replies;\n try { replies = JSON.parse(event.data) } catch (error) {}\n\n if (!replies) return;\n\n replies = [].concat(replies);\n\n for (var i = 0, n = replies.length; i < n; i++) {\n if (replies[i].successful === undefined) continue;\n self._pending.remove(replies[i]);\n }\n self._receive(replies);\n };\n },\n\n close: function() {\n if (!this._socket) return;\n this._socket.close();\n },\n\n _createSocket: function() {\n var url = WebSocket.getSocketUrl(this.endpoint),\n headers = this._dispatcher.headers,\n extensions = this._dispatcher.wsExtensions,\n cookie = this._getCookies(),\n tls = this._dispatcher.tls,\n options = {extensions: extensions, headers: headers, proxy: this._proxy, tls: tls};\n\n if (cookie !== '') options.headers['Cookie'] = cookie;\n\n return ws.create(url, [], options);\n },\n\n _ping: function() {\n if (!this._socket || this._socket.readyState !== 1) return;\n this._socket.send('[]');\n this.addTimeout('ping', this._dispatcher.timeout / 2, this._ping, this);\n }\n\n}), {\n PROTOCOLS: {\n 'http:': 'ws:',\n 'https:': 'wss:'\n },\n\n create: function(dispatcher, endpoint) {\n var sockets = dispatcher.transports.websocket = dispatcher.transports.websocket || {};\n sockets[endpoint.href] = sockets[endpoint.href] || new this(dispatcher, endpoint);\n return sockets[endpoint.href];\n },\n\n getSocketUrl: function(endpoint) {\n endpoint = copyObject(endpoint);\n endpoint.protocol = this.PROTOCOLS[endpoint.protocol];\n return URI.stringify(endpoint);\n },\n\n isUsable: function(dispatcher, endpoint, callback, context) {\n this.create(dispatcher, endpoint).isUsable(callback, context);\n }\n});\n\nextend(WebSocket.prototype, Deferrable);\n\nif (browser.Event && global.onbeforeunload !== undefined)\n browser.Event.on(global, 'beforeunload', function() { WebSocket._unloaded = true });\n\nmodule.exports = WebSocket;\n","'use strict';\n\nvar Class = require('../util/class'),\n URI = require('../util/uri'),\n browser = require('../util/browser'),\n extend = require('../util/extend'),\n toJSON = require('../util/to_json'),\n Transport = require('./transport');\n\nvar XHR = extend(Class(Transport, {\n encode: function(messages) {\n return toJSON(messages);\n },\n\n request: function(messages) {\n var href = this.endpoint.href,\n self = this,\n xhr;\n\n // Prefer XMLHttpRequest over ActiveXObject if they both exist\n if (global.XMLHttpRequest) {\n xhr = new XMLHttpRequest();\n } else if (global.ActiveXObject) {\n xhr = new ActiveXObject('Microsoft.XMLHTTP');\n } else {\n return this._handleError(messages);\n }\n\n xhr.open('POST', href, true);\n xhr.setRequestHeader('Content-Type', 'application/json');\n xhr.setRequestHeader('Pragma', 'no-cache');\n xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');\n\n var headers = this._dispatcher.headers;\n for (var key in headers) {\n if (!headers.hasOwnProperty(key)) continue;\n xhr.setRequestHeader(key, headers[key]);\n }\n\n var abort = function() { xhr.abort() };\n if (global.onbeforeunload !== undefined)\n browser.Event.on(global, 'beforeunload', abort);\n\n xhr.onreadystatechange = function() {\n if (!xhr || xhr.readyState !== 4) return;\n\n var replies = null,\n status = xhr.status,\n text = xhr.responseText,\n successful = (status >= 200 && status < 300) || status === 304 || status === 1223;\n\n if (global.onbeforeunload !== undefined)\n browser.Event.detach(global, 'beforeunload', abort);\n\n xhr.onreadystatechange = function() {};\n xhr = null;\n\n if (!successful) return self._handleError(messages);\n\n try {\n replies = JSON.parse(text);\n } catch (error) {}\n\n if (replies)\n self._receive(replies);\n else\n self._handleError(messages);\n };\n\n xhr.send(this.encode(messages));\n return xhr;\n }\n}), {\n isUsable: function(dispatcher, endpoint, callback, context) {\n var usable = (navigator.product === 'ReactNative')\n || URI.isSameOrigin(endpoint);\n\n callback.call(context, usable);\n }\n});\n\nmodule.exports = XHR;\n","'use strict';\n\nmodule.exports = {\n commonElement: function(lista, listb) {\n for (var i = 0, n = lista.length; i < n; i++) {\n if (this.indexOf(listb, lista[i]) !== -1)\n return lista[i];\n }\n return null;\n },\n\n indexOf: function(list, needle) {\n if (list.indexOf) return list.indexOf(needle);\n\n for (var i = 0, n = list.length; i < n; i++) {\n if (list[i] === needle) return i;\n }\n return -1;\n },\n\n map: function(object, callback, context) {\n if (object.map) return object.map(callback, context);\n var result = [];\n\n if (object instanceof Array) {\n for (var i = 0, n = object.length; i < n; i++) {\n result.push(callback.call(context || null, object[i], i));\n }\n } else {\n for (var key in object) {\n if (!object.hasOwnProperty(key)) continue;\n result.push(callback.call(context || null, key, object[key]));\n }\n }\n return result;\n },\n\n filter: function(array, callback, context) {\n if (array.filter) return array.filter(callback, context);\n var result = [];\n for (var i = 0, n = array.length; i < n; i++) {\n if (callback.call(context || null, array[i], i))\n result.push(array[i]);\n }\n return result;\n },\n\n asyncEach: function(list, iterator, callback, context) {\n var n = list.length,\n i = -1,\n calls = 0,\n looping = false;\n\n var iterate = function() {\n calls -= 1;\n i += 1;\n if (i === n) return callback && callback.call(context);\n iterator(list[i], resume);\n };\n\n var loop = function() {\n if (looping) return;\n looping = true;\n while (calls > 0) iterate();\n looping = false;\n };\n\n var resume = function() {\n calls += 1;\n loop();\n };\n resume();\n }\n};\n","'use strict';\n\nvar Event = {\n _registry: [],\n\n on: function(element, eventName, callback, context) {\n var wrapped = function() { callback.call(context) };\n\n if (element.addEventListener)\n element.addEventListener(eventName, wrapped, false);\n else\n element.attachEvent('on' + eventName, wrapped);\n\n this._registry.push({\n _element: element,\n _type: eventName,\n _callback: callback,\n _context: context,\n _handler: wrapped\n });\n },\n\n detach: function(element, eventName, callback, context) {\n var i = this._registry.length, register;\n while (i--) {\n register = this._registry[i];\n\n if ((element && element !== register._element) ||\n (eventName && eventName !== register._type) ||\n (callback && callback !== register._callback) ||\n (context && context !== register._context))\n continue;\n\n if (register._element.removeEventListener)\n register._element.removeEventListener(register._type, register._handler, false);\n else\n register._element.detachEvent('on' + register._type, register._handler);\n\n this._registry.splice(i,1);\n register = null;\n }\n }\n};\n\nif (global.onunload !== undefined)\n Event.on(global, 'unload', Event.detach, Event);\n\nmodule.exports = {\n Event: Event\n};\n","'use strict';\n\nvar extend = require('./extend');\n\nmodule.exports = function(parent, methods) {\n if (typeof parent !== 'function') {\n methods = parent;\n parent = Object;\n }\n\n var klass = function() {\n if (!this.initialize) return this;\n return this.initialize.apply(this, arguments) || this;\n };\n\n var bridge = function() {};\n bridge.prototype = parent.prototype;\n\n klass.prototype = new bridge();\n extend(klass.prototype, methods);\n\n return klass;\n};\n","module.exports = {\n VERSION: '1.2.5',\n\n BAYEUX_VERSION: '1.0',\n ID_LENGTH: 160,\n JSONP_CALLBACK: 'jsonpcallback',\n CONNECTION_TYPES: ['long-polling', 'cross-origin-long-polling', 'callback-polling', 'websocket', 'eventsource', 'in-process'],\n\n MANDATORY_CONNECTION_TYPES: ['long-polling', 'callback-polling', 'in-process']\n};\n","'use strict';\n\nmodule.exports = {};\n","'use strict';\n\nvar copyObject = function(object) {\n var clone, i, key;\n if (object instanceof Array) {\n clone = [];\n i = object.length;\n while (i--) clone[i] = copyObject(object[i]);\n return clone;\n } else if (typeof object === 'object') {\n clone = (object === null) ? null : {};\n for (key in object) clone[key] = copyObject(object[key]);\n return clone;\n } else {\n return object;\n }\n};\n\nmodule.exports = copyObject;\n","/*\nCopyright Joyent, Inc. and other Node contributors. All rights reserved.\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies\nof the Software, and to permit persons to whom the Software is furnished to do\nso, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n*/\n\nvar isArray = typeof Array.isArray === 'function'\n ? Array.isArray\n : function (xs) {\n return Object.prototype.toString.call(xs) === '[object Array]'\n }\n;\nfunction indexOf (xs, x) {\n if (xs.indexOf) return xs.indexOf(x);\n for (var i = 0; i < xs.length; i++) {\n if (x === xs[i]) return i;\n }\n return -1;\n}\n\nfunction EventEmitter() {}\nmodule.exports = EventEmitter;\n\nEventEmitter.prototype.emit = function(type) {\n // If there is no 'error' event listener then throw.\n if (type === 'error') {\n if (!this._events || !this._events.error ||\n (isArray(this._events.error) && !this._events.error.length))\n {\n if (arguments[1] instanceof Error) {\n throw arguments[1]; // Unhandled 'error' event\n } else {\n throw new Error(\"Uncaught, unspecified 'error' event.\");\n }\n return false;\n }\n }\n\n if (!this._events) return false;\n var handler = this._events[type];\n if (!handler) return false;\n\n if (typeof handler == 'function') {\n switch (arguments.length) {\n // fast cases\n case 1:\n handler.call(this);\n break;\n case 2:\n handler.call(this, arguments[1]);\n break;\n case 3:\n handler.call(this, arguments[1], arguments[2]);\n break;\n // slower\n default:\n var args = Array.prototype.slice.call(arguments, 1);\n handler.apply(this, args);\n }\n return true;\n\n } else if (isArray(handler)) {\n var args = Array.prototype.slice.call(arguments, 1);\n\n var listeners = handler.slice();\n for (var i = 0, l = listeners.length; i < l; i++) {\n listeners[i].apply(this, args);\n }\n return true;\n\n } else {\n return false;\n }\n};\n\n// EventEmitter is defined in src/node_events.cc\n// EventEmitter.prototype.emit() is also defined there.\nEventEmitter.prototype.addListener = function(type, listener) {\n if ('function' !== typeof listener) {\n throw new Error('addListener only takes instances of Function');\n }\n\n if (!this._events) this._events = {};\n\n // To avoid recursion in the case that type == \"newListeners\"! Before\n // adding it to the listeners, first emit \"newListeners\".\n this.emit('newListener', type, listener);\n\n if (!this._events[type]) {\n // Optimize the case of one listener. Don't need the extra array object.\n this._events[type] = listener;\n } else if (isArray(this._events[type])) {\n // If we've already got an array, just append.\n this._events[type].push(listener);\n } else {\n // Adding the second element, need to change to array.\n this._events[type] = [this._events[type], listener];\n }\n\n return this;\n};\n\nEventEmitter.prototype.on = EventEmitter.prototype.addListener;\n\nEventEmitter.prototype.once = function(type, listener) {\n var self = this;\n self.on(type, function g() {\n self.removeListener(type, g);\n listener.apply(this, arguments);\n });\n\n return this;\n};\n\nEventEmitter.prototype.removeListener = function(type, listener) {\n if ('function' !== typeof listener) {\n throw new Error('removeListener only takes instances of Function');\n }\n\n // does not use listeners(), so no side effect of creating _events[type]\n if (!this._events || !this._events[type]) return this;\n\n var list = this._events[type];\n\n if (isArray(list)) {\n var i = indexOf(list, listener);\n if (i < 0) return this;\n list.splice(i, 1);\n if (list.length == 0)\n delete this._events[type];\n } else if (this._events[type] === listener) {\n delete this._events[type];\n }\n\n return this;\n};\n\nEventEmitter.prototype.removeAllListeners = function(type) {\n if (arguments.length === 0) {\n this._events = {};\n return this;\n }\n\n // does not use listeners(), so no side effect of creating _events[type]\n if (type && this._events && this._events[type]) this._events[type] = null;\n return this;\n};\n\nEventEmitter.prototype.listeners = function(type) {\n if (!this._events) this._events = {};\n if (!this._events[type]) this._events[type] = [];\n if (!isArray(this._events[type])) {\n this._events[type] = [this._events[type]];\n }\n return this._events[type];\n};\n","'use strict';\n\nmodule.exports = function(dest, source, overwrite) {\n if (!source) return dest;\n for (var key in source) {\n if (!source.hasOwnProperty(key)) continue;\n if (dest.hasOwnProperty(key) && overwrite === false) continue;\n if (dest[key] !== source[key])\n dest[key] = source[key];\n }\n return dest;\n};\n","'use strict';\n\nvar asap = require('asap');\n\nvar PENDING = 0,\n FULFILLED = 1,\n REJECTED = 2;\n\nvar RETURN = function(x) { return x },\n THROW = function(x) { throw x };\n\nvar Promise = function(task) {\n this._state = PENDING;\n this._onFulfilled = [];\n this._onRejected = [];\n\n if (typeof task !== 'function') return;\n var self = this;\n\n task(function(value) { resolve(self, value) },\n function(reason) { reject(self, reason) });\n};\n\nPromise.prototype.then = function(onFulfilled, onRejected) {\n var next = new Promise();\n registerOnFulfilled(this, onFulfilled, next);\n registerOnRejected(this, onRejected, next);\n return next;\n};\n\nPromise.prototype['catch'] = function(onRejected) {\n return this.then(null, onRejected);\n};\n\nvar registerOnFulfilled = function(promise, onFulfilled, next) {\n if (typeof onFulfilled !== 'function') onFulfilled = RETURN;\n var handler = function(value) { invoke(onFulfilled, value, next) };\n\n if (promise._state === PENDING) {\n promise._onFulfilled.push(handler);\n } else if (promise._state === FULFILLED) {\n handler(promise._value);\n }\n};\n\nvar registerOnRejected = function(promise, onRejected, next) {\n if (typeof onRejected !== 'function') onRejected = THROW;\n var handler = function(reason) { invoke(onRejected, reason, next) };\n\n if (promise._state === PENDING) {\n promise._onRejected.push(handler);\n } else if (promise._state === REJECTED) {\n handler(promise._reason);\n }\n};\n\nvar invoke = function(fn, value, next) {\n asap(function() { _invoke(fn, value, next) });\n};\n\nvar _invoke = function(fn, value, next) {\n var outcome;\n\n try {\n outcome = fn(value);\n } catch (error) {\n return reject(next, error);\n }\n\n if (outcome === next) {\n reject(next, new TypeError('Recursive promise chain detected'));\n } else {\n resolve(next, outcome);\n }\n};\n\nvar resolve = function(promise, value) {\n var called = false, type, then;\n\n try {\n type = typeof value;\n then = value !== null && (type === 'function' || type === 'object') && value.then;\n\n if (typeof then !== 'function') return fulfill(promise, value);\n\n then.call(value, function(v) {\n if (!(called ^ (called = true))) return;\n resolve(promise, v);\n }, function(r) {\n if (!(called ^ (called = true))) return;\n reject(promise, r);\n });\n } catch (error) {\n if (!(called ^ (called = true))) return;\n reject(promise, error);\n }\n};\n\nvar fulfill = function(promise, value) {\n if (promise._state !== PENDING) return;\n\n promise._state = FULFILLED;\n promise._value = value;\n promise._onRejected = [];\n\n var onFulfilled = promise._onFulfilled, fn;\n while (fn = onFulfilled.shift()) fn(value);\n};\n\nvar reject = function(promise, reason) {\n if (promise._state !== PENDING) return;\n\n promise._state = REJECTED;\n promise._reason = reason;\n promise._onFulfilled = [];\n\n var onRejected = promise._onRejected, fn;\n while (fn = onRejected.shift()) fn(reason);\n};\n\nPromise.resolve = function(value) {\n return new Promise(function(resolve, reject) { resolve(value) });\n};\n\nPromise.reject = function(reason) {\n return new Promise(function(resolve, reject) { reject(reason) });\n};\n\nPromise.all = function(promises) {\n return new Promise(function(resolve, reject) {\n var list = [], n = promises.length, i;\n\n if (n === 0) return resolve(list);\n\n for (i = 0; i < n; i++) (function(promise, i) {\n Promise.resolve(promise).then(function(value) {\n list[i] = value;\n if (--n === 0) resolve(list);\n }, reject);\n })(promises[i], i);\n });\n};\n\nPromise.race = function(promises) {\n return new Promise(function(resolve, reject) {\n for (var i = 0, n = promises.length; i < n; i++)\n Promise.resolve(promises[i]).then(resolve, reject);\n });\n};\n\nPromise.deferred = Promise.pending = function() {\n var tuple = {};\n\n tuple.promise = new Promise(function(resolve, reject) {\n tuple.resolve = resolve;\n tuple.reject = reject;\n });\n return tuple;\n};\n\nmodule.exports = Promise;\n","'use strict';\n\nvar Class = require('./class');\n\nmodule.exports = Class({\n initialize: function() {\n this._index = {};\n },\n\n add: function(item) {\n var key = (item.id !== undefined) ? item.id : item;\n if (this._index.hasOwnProperty(key)) return false;\n this._index[key] = item;\n return true;\n },\n\n forEach: function(block, context) {\n for (var key in this._index) {\n if (this._index.hasOwnProperty(key))\n block.call(context, this._index[key]);\n }\n },\n\n isEmpty: function() {\n for (var key in this._index) {\n if (this._index.hasOwnProperty(key)) return false;\n }\n return true;\n },\n\n member: function(item) {\n for (var key in this._index) {\n if (this._index[key] === item) return true;\n }\n return false;\n },\n\n remove: function(item) {\n var key = (item.id !== undefined) ? item.id : item;\n var removed = this._index[key];\n delete this._index[key];\n return removed;\n },\n\n toArray: function() {\n var array = [];\n this.forEach(function(item) { array.push(item) });\n return array;\n }\n});\n","'use strict';\n\n// http://assanka.net/content/tech/2009/09/02/json2-js-vs-prototype/\n\nmodule.exports = function(object) {\n return JSON.stringify(object, function(key, value) {\n return (this[key] instanceof Array) ? this[key] : value;\n });\n};\n","'use strict';\n\nmodule.exports = {\n isURI: function(uri) {\n return uri && uri.protocol && uri.host && uri.path;\n },\n\n isSameOrigin: function(uri) {\n return uri.protocol === location.protocol &&\n uri.hostname === location.hostname &&\n uri.port === location.port;\n },\n\n parse: function(url) {\n if (typeof url !== 'string') return url;\n var uri = {}, parts, query, pairs, i, n, data;\n\n var consume = function(name, pattern) {\n url = url.replace(pattern, function(match) {\n uri[name] = match;\n return '';\n });\n uri[name] = uri[name] || '';\n };\n\n consume('protocol', /^[a-z]+\\:/i);\n consume('host', /^\\/\\/[^\\/\\?#]+/);\n\n if (!/^\\//.test(url) && !uri.host)\n url = location.pathname.replace(/[^\\/]*$/, '') + url;\n\n consume('pathname', /^[^\\?#]*/);\n consume('search', /^\\?[^#]*/);\n consume('hash', /^#.*/);\n\n uri.protocol = uri.protocol || location.protocol;\n\n if (uri.host) {\n uri.host = uri.host.substr(2);\n parts = uri.host.split(':');\n uri.hostname = parts[0];\n uri.port = parts[1] || '';\n } else {\n uri.host = location.host;\n uri.hostname = location.hostname;\n uri.port = location.port;\n }\n\n uri.pathname = uri.pathname || '/';\n uri.path = uri.pathname + uri.search;\n\n query = uri.search.replace(/^\\?/, '');\n pairs = query ? query.split('&') : [];\n data = {};\n\n for (i = 0, n = pairs.length; i < n; i++) {\n parts = pairs[i].split('=');\n data[decodeURIComponent(parts[0] || '')] = decodeURIComponent(parts[1] || '');\n }\n\n uri.query = data;\n\n uri.href = this.stringify(uri);\n return uri;\n },\n\n stringify: function(uri) {\n var string = uri.protocol + '//' + uri.hostname;\n if (uri.port) string += ':' + uri.port;\n string += uri.pathname + this.queryString(uri.query) + (uri.hash || '');\n return string;\n },\n\n queryString: function(query) {\n var pairs = [];\n for (var key in query) {\n if (!query.hasOwnProperty(key)) continue;\n pairs.push(encodeURIComponent(key) + '=' + encodeURIComponent(query[key]));\n }\n if (pairs.length === 0) return '';\n return '?' + pairs.join('&');\n }\n};\n","'use strict';\n\nvar array = require('./array');\n\nmodule.exports = function(options, validKeys) {\n for (var key in options) {\n if (array.indexOf(validKeys, key) < 0)\n throw new Error('Unrecognized option: ' + key);\n }\n};\n","'use strict';\n\nvar WS = global.MozWebSocket || global.WebSocket;\n\nmodule.exports = {\n create: function(url, protocols, options) {\n if (typeof WS !== 'function') return null;\n return new WS(url);\n }\n};\n","// shim for using process in browser\nvar process = module.exports = {};\n\n// cached from whatever global is present so that test runners that stub it\n// don't break things. But we need to wrap it in a try catch in case it is\n// wrapped in strict mode code which doesn't define any globals. It's inside a\n// function because try/catches deoptimize in certain engines.\n\nvar cachedSetTimeout;\nvar cachedClearTimeout;\n\nfunction defaultSetTimout() {\n throw new Error('setTimeout has not been defined');\n}\nfunction defaultClearTimeout () {\n throw new Error('clearTimeout has not been defined');\n}\n(function () {\n try {\n if (typeof setTimeout === 'function') {\n cachedSetTimeout = setTimeout;\n } else {\n cachedSetTimeout = defaultSetTimout;\n }\n } catch (e) {\n cachedSetTimeout = defaultSetTimout;\n }\n try {\n if (typeof clearTimeout === 'function') {\n cachedClearTimeout = clearTimeout;\n } else {\n cachedClearTimeout = defaultClearTimeout;\n }\n } catch (e) {\n cachedClearTimeout = defaultClearTimeout;\n }\n} ())\nfunction runTimeout(fun) {\n if (cachedSetTimeout === setTimeout) {\n //normal enviroments in sane situations\n return setTimeout(fun, 0);\n }\n // if setTimeout wasn't available but was latter defined\n if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n cachedSetTimeout = setTimeout;\n return setTimeout(fun, 0);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedSetTimeout(fun, 0);\n } catch(e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedSetTimeout.call(null, fun, 0);\n } catch(e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n return cachedSetTimeout.call(this, fun, 0);\n }\n }\n\n\n}\nfunction runClearTimeout(marker) {\n if (cachedClearTimeout === clearTimeout) {\n //normal enviroments in sane situations\n return clearTimeout(marker);\n }\n // if clearTimeout wasn't available but was latter defined\n if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n cachedClearTimeout = clearTimeout;\n return clearTimeout(marker);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedClearTimeout(marker);\n } catch (e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedClearTimeout.call(null, marker);\n } catch (e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n return cachedClearTimeout.call(this, marker);\n }\n }\n\n\n\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n if (!draining || !currentQueue) {\n return;\n }\n draining = false;\n if (currentQueue.length) {\n queue = currentQueue.concat(queue);\n } else {\n queueIndex = -1;\n }\n if (queue.length) {\n drainQueue();\n }\n}\n\nfunction drainQueue() {\n if (draining) {\n return;\n }\n var timeout = runTimeout(cleanUpNextTick);\n draining = true;\n\n var len = queue.length;\n while(len) {\n currentQueue = queue;\n queue = [];\n while (++queueIndex < len) {\n if (currentQueue) {\n currentQueue[queueIndex].run();\n }\n }\n queueIndex = -1;\n len = queue.length;\n }\n currentQueue = null;\n draining = false;\n runClearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n var args = new Array(arguments.length - 1);\n if (arguments.length > 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"]} \ No newline at end of file diff --git a/build/jsforce-api-tooling.min.js b/build/jsforce-api-tooling.min.js index 41cb10cf..53270999 100644 --- a/build/jsforce-api-tooling.min.js +++ b/build/jsforce-api-tooling.min.js @@ -1,2 +1,2 @@ -!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var t;t="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,t=t.jsforce||(t.jsforce={}),t=t.modules||(t.modules={}),t=t.api||(t.api={}),t.Tooling=e()}}(function(){return function(){function e(t,r,o){function n(i,c){if(!r[i]){if(!t[i]){var a="function"==typeof require&&require;if(!c&&a)return a(i,!0);if(s)return s(i,!0);var u=new Error("Cannot find module '"+i+"'");throw u.code="MODULE_NOT_FOUND",u}var l=r[i]={exports:{}};t[i][0].call(l.exports,function(e){var r=t[i][1][e];return n(r||e)},l,l.exports,e,t,r,o)}return r[i].exports}for(var s="function"==typeof require&&require,i=0;i\n */\n\n'use strict';\n\nvar jsforce = window.jsforce.require('./core'),\n _ = window.jsforce.require('lodash/core'),\n Cache = window.jsforce.require('./cache');\n\n/**\n * API class for Tooling API call\n *\n * @class\n * @param {Connection} conn - Connection\n */\nvar Tooling = function(conn) {\n this._conn = conn;\n this._logger = conn._logger;\n var delegates = [\n \"query\",\n \"queryMore\",\n \"_toRecordResult\",\n \"create\",\n \"_createSingle\",\n \"_createParallel\",\n \"_createMany\",\n \"insert\",\n \"retrieve\",\n \"_retrieveSingle\",\n \"_retrieveParallel\",\n \"_retrieveMany\",\n \"update\",\n \"_updateSingle\",\n \"_updateParallel\",\n \"_updateMany\",\n \"upsert\",\n \"del\",\n \"delete\",\n \"destroy\",\n \"_destroySingle\",\n \"_destroyParallel\",\n \"_destroyMany\",\n \"describe\",\n \"describeGlobal\",\n \"sobject\"\n ];\n delegates.forEach(function(method) {\n this[method] = conn.constructor.prototype[method];\n }, this);\n\n this.cache = new Cache();\n\n var cacheOptions = {\n key: function(type) { return type ? \"describe.\" + type : \"describe\"; }\n };\n this.describe$ = this.cache.makeCacheable(this.describe, this, cacheOptions);\n this.describe = this.cache.makeResponseCacheable(this.describe, this, cacheOptions);\n this.describeSObject$ = this.describe$;\n this.describeSObject = this.describe;\n\n cacheOptions = { key: 'describeGlobal' };\n this.describeGlobal$ = this.cache.makeCacheable(this.describeGlobal, this, cacheOptions);\n this.describeGlobal = this.cache.makeResponseCacheable(this.describeGlobal, this, cacheOptions);\n\n this.initialize();\n};\n\n/**\n * Initialize tooling API\n * @protected\n */\nTooling.prototype.initialize = function() {\n this.sobjects = {};\n this.cache.clear();\n this.cache.get('describeGlobal').removeAllListeners('value');\n this.cache.get('describeGlobal').on('value', _.bind(function(res) {\n if (res.result) {\n var types = _.map(res.result.sobjects, function(so) { return so.name; });\n types.forEach(this.sobject, this);\n }\n }, this));\n};\n\n/**\n * @private\n */\nTooling.prototype._baseUrl = function() {\n return this._conn._baseUrl() + \"/tooling\";\n};\n\n/**\n * @private\n */\nTooling.prototype._supports = function(feature) {\n // should return false in order not to use compsite collection\n if (feature === 'sobject-collection') {\n return false;\n }\n return this._conn._supports.apply(this._conn, arguments);\n};\n\n/**\n * @private\n */\nTooling.prototype.request = function() {\n return this._conn.request.apply(this._conn, arguments);\n};\n\n/**\n * Execute query by using SOQL\n *\n * @param {String} soql - SOQL string\n * @param {Callback.} [callback] - Callback function\n * @returns {Query.}\n */\n/**\n * Query next record set by using query locator\n *\n * @method Tooling#query\n * @param {String} locator - Next record set locator\n * @param {Callback.} [callback] - Callback function\n * @returns {Query.}\n */\n/**\n * Retrieve specified records\n *\n * @method Tooling#queryMore\n * @param {String} type - SObject Type\n * @param {String|Array.} ids - A record ID or array of record IDs\n * @param {Callback.>} [callback] - Callback function\n * @returns {Promise.>}\n */\n\n/**\n * Synonym of Tooling#create()\n *\n * @method Tooling#insert\n * @param {String} type - SObject Type\n * @param {Object|Array.} records - A record or array of records to create\n * @param {Callback.>} [callback] - Callback function\n * @returns {Promise.>}\n */\n/**\n * Create records\n *\n * @method Tooling#create\n * @param {String} type - SObject Type\n * @param {Record|Array.} records - A record or array of records to create\n * @param {Callback.>} [callback] - Callback function\n * @returns {Promise.>}\n */\n\n/**\n * Update records\n *\n * @method Tooling#update\n * @param {String} type - SObject Type\n * @param {Record|Array.} records - A record or array of records to update\n * @param {Callback.>} [callback] - Callback function\n * @returns {Promise.>}\n */\n\n/**\n * Upsert records\n *\n * @method Tooling#upsert\n * @param {String} type - SObject Type\n * @param {Record|Array.} records - Record or array of records to upsert\n * @param {String} extIdField - External ID field name\n * @param {Callback.>} [callback] - Callback\n * @returns {Promise.>}\n */\n\n/**\n * Synonym of Tooling#destroy()\n *\n * @method Tooling#delete\n * @param {String} type - SObject Type\n * @param {String|Array.} ids - A ID or array of IDs to delete\n * @param {Callback.>} [callback] - Callback\n * @returns {Promise.>}\n */\n/**\n * Synonym of Tooling#destroy()\n *\n * @method Tooling#del\n * @param {String} type - SObject Type\n * @param {String|Array.} ids - A ID or array of IDs to delete\n * @param {Callback.>} [callback] - Callback\n * @returns {Promise.>}\n */\n/**\n * Delete records\n *\n * @method Tooling#destroy\n * @param {String} type - SObject Type\n * @param {String|Array.} ids - A ID or array of IDs to delete\n * @param {Callback.>} [callback] - Callback\n * @returns {Promise.>}\n */\n\n/**\n * Synonym of Tooling#describe()\n *\n * @method Tooling#describeSObject\n * @param {String} type - SObject Type\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\n/**\n * Describe SObject metadata\n *\n * @method Tooling#describe\n * @param {String} type - SObject Type\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\n\n/**\n * Describe global SObjects\n *\n * @method Tooling#describeGlobal\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\n\n/**\n * Get SObject instance\n *\n * @method Tooling#sobject\n * @param {String} type - SObject Type\n * @returns {SObject}\n */\n\n/**\n * @typedef {Object} Tooling~ExecuteAnonymousResult\n * @prop {Boolean} compiled - Flag if the query is compiled successfully\n * @prop {String} compileProblem - Error reason in compilation\n * @prop {Boolean} success - Flag if the code is executed successfully\n * @prop {Number} line - Line number for the error\n * @prop {Number} column - Column number for the error\n * @prop {String} exceptionMessage - Exception message\n * @prop {String} exceptionStackTrace - Exception stack trace\n */\n/**\n * Executes Apex code anonymously\n *\n * @param {String} body - Anonymous Apex code\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\nTooling.prototype.executeAnonymous = function(body, callback) {\n var url = this._baseUrl() + \"/executeAnonymous?anonymousBody=\" + encodeURIComponent(body);\n return this.request(url).thenCall(callback);\n};\n\n/**\n * Executes Apex tests asynchronously\n *\n * @param {Array.} classids - Comma separated list of class IDs\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\nTooling.prototype.runTestsAsynchronous = function(classids, callback) {\n var url = this._baseUrl() + \"/runTestsAsynchronous/\";\n return this._conn.requestPost(url, {classids : classids.join(',')}, undefined, callback);\n};\n\n/**\n * Executes Apex tests synchronously\n *\n * @param {Array.} classnames - Comma separated list of class Names\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\nTooling.prototype.runTestsSynchronous = function(classnames, callback) {\n var url = this._baseUrl() + \"/runTestsSynchronous/\";\n return this._conn.requestPost(url, {classnames : classnames.join(',')}, undefined, callback);\n};\n\n/**\n * @typedef {Object} Tooling~CompletionsResult\n * @prop {Object} publicDeclarations\n */\n/**\n * Retrieves available code completions of the referenced type\n *\n * @param {String} [type] - completion type (default 'apex')\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\nTooling.prototype.completions = function(type, callback) {\n if (!_.isString(type)) {\n callback = type;\n type = 'apex';\n }\n var url = this._baseUrl() + \"/completions?type=\" + encodeURIComponent(type);\n return this.request(url).thenCall(callback);\n};\n\n\n/*--------------------------------------------*/\n/*\n * Register hook in connection instantiation for dynamically adding this API module features\n */\njsforce.on('connection:new', function(conn) {\n conn.tooling = new Tooling(conn);\n});\n\n\nmodule.exports = Tooling;\n","(function(f){if(typeof exports===\"object\"&&typeof module!==\"undefined\"){module.exports=f()}else if(typeof define===\"function\"&&define.amd){define([],f)}else{var g;if(typeof window!==\"undefined\"){g=window}else if(typeof global!==\"undefined\"){g=global}else if(typeof self!==\"undefined\"){g=self}else{g=this}g=(g.jsforce||(g.jsforce = {}));g=(g.modules||(g.modules = {}));g=(g.api||(g.api = {}));g.Tooling = f()}})(function(){var define,module,exports;return (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\n */\n\n'use strict';\n\nvar jsforce = window.jsforce.require('./core'),\n _ = window.jsforce.require('lodash/core'),\n Cache = window.jsforce.require('./cache');\n\n/**\n * API class for Tooling API call\n *\n * @class\n * @param {Connection} conn - Connection\n */\nvar Tooling = function(conn) {\n this._conn = conn;\n this._logger = conn._logger;\n var delegates = [\n \"query\",\n \"queryMore\",\n \"_toRecordResult\",\n \"create\",\n \"_createSingle\",\n \"_createParallel\",\n \"_createMany\",\n \"insert\",\n \"retrieve\",\n \"_retrieveSingle\",\n \"_retrieveParallel\",\n \"_retrieveMany\",\n \"update\",\n \"_updateSingle\",\n \"_updateParallel\",\n \"_updateMany\",\n \"upsert\",\n \"del\",\n \"delete\",\n \"destroy\",\n \"_destroySingle\",\n \"_destroyParallel\",\n \"_destroyMany\",\n \"describe\",\n \"describeGlobal\",\n \"sobject\"\n ];\n delegates.forEach(function(method) {\n this[method] = conn.constructor.prototype[method];\n }, this);\n\n this.cache = new Cache();\n\n var cacheOptions = {\n key: function(type) { return type ? \"describe.\" + type : \"describe\"; }\n };\n this.describe$ = this.cache.makeCacheable(this.describe, this, cacheOptions);\n this.describe = this.cache.makeResponseCacheable(this.describe, this, cacheOptions);\n this.describeSObject$ = this.describe$;\n this.describeSObject = this.describe;\n\n cacheOptions = { key: 'describeGlobal' };\n this.describeGlobal$ = this.cache.makeCacheable(this.describeGlobal, this, cacheOptions);\n this.describeGlobal = this.cache.makeResponseCacheable(this.describeGlobal, this, cacheOptions);\n\n this.initialize();\n};\n\n/**\n * Initialize tooling API\n * @protected\n */\nTooling.prototype.initialize = function() {\n this.sobjects = {};\n this.cache.clear();\n this.cache.get('describeGlobal').removeAllListeners('value');\n this.cache.get('describeGlobal').on('value', _.bind(function(res) {\n if (res.result) {\n var types = _.map(res.result.sobjects, function(so) { return so.name; });\n types.forEach(this.sobject, this);\n }\n }, this));\n};\n\n/**\n * @private\n */\nTooling.prototype._baseUrl = function() {\n return this._conn._baseUrl() + \"/tooling\";\n};\n\n/**\n * @private\n */\nTooling.prototype._supports = function(feature) {\n // should return false in order not to use compsite collection\n if (feature === 'sobject-collection') {\n return false;\n }\n return this._conn._supports.apply(this._conn, arguments);\n};\n\n/**\n * @private\n */\nTooling.prototype.request = function() {\n return this._conn.request.apply(this._conn, arguments);\n};\n\n/**\n * Execute query by using SOQL\n *\n * @param {String} soql - SOQL string\n * @param {Callback.} [callback] - Callback function\n * @returns {Query.}\n */\n/**\n * Query next record set by using query locator\n *\n * @method Tooling#query\n * @param {String} locator - Next record set locator\n * @param {Callback.} [callback] - Callback function\n * @returns {Query.}\n */\n/**\n * Retrieve specified records\n *\n * @method Tooling#queryMore\n * @param {String} type - SObject Type\n * @param {String|Array.} ids - A record ID or array of record IDs\n * @param {Callback.>} [callback] - Callback function\n * @returns {Promise.>}\n */\n\n/**\n * Synonym of Tooling#create()\n *\n * @method Tooling#insert\n * @param {String} type - SObject Type\n * @param {Object|Array.} records - A record or array of records to create\n * @param {Callback.>} [callback] - Callback function\n * @returns {Promise.>}\n */\n/**\n * Create records\n *\n * @method Tooling#create\n * @param {String} type - SObject Type\n * @param {Record|Array.} records - A record or array of records to create\n * @param {Callback.>} [callback] - Callback function\n * @returns {Promise.>}\n */\n\n/**\n * Update records\n *\n * @method Tooling#update\n * @param {String} type - SObject Type\n * @param {Record|Array.} records - A record or array of records to update\n * @param {Callback.>} [callback] - Callback function\n * @returns {Promise.>}\n */\n\n/**\n * Upsert records\n *\n * @method Tooling#upsert\n * @param {String} type - SObject Type\n * @param {Record|Array.} records - Record or array of records to upsert\n * @param {String} extIdField - External ID field name\n * @param {Callback.>} [callback] - Callback\n * @returns {Promise.>}\n */\n\n/**\n * Synonym of Tooling#destroy()\n *\n * @method Tooling#delete\n * @param {String} type - SObject Type\n * @param {String|Array.} ids - A ID or array of IDs to delete\n * @param {Callback.>} [callback] - Callback\n * @returns {Promise.>}\n */\n/**\n * Synonym of Tooling#destroy()\n *\n * @method Tooling#del\n * @param {String} type - SObject Type\n * @param {String|Array.} ids - A ID or array of IDs to delete\n * @param {Callback.>} [callback] - Callback\n * @returns {Promise.>}\n */\n/**\n * Delete records\n *\n * @method Tooling#destroy\n * @param {String} type - SObject Type\n * @param {String|Array.} ids - A ID or array of IDs to delete\n * @param {Callback.>} [callback] - Callback\n * @returns {Promise.>}\n */\n\n/**\n * Synonym of Tooling#describe()\n *\n * @method Tooling#describeSObject\n * @param {String} type - SObject Type\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\n/**\n * Describe SObject metadata\n *\n * @method Tooling#describe\n * @param {String} type - SObject Type\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\n\n/**\n * Describe global SObjects\n *\n * @method Tooling#describeGlobal\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\n\n/**\n * Get SObject instance\n *\n * @method Tooling#sobject\n * @param {String} type - SObject Type\n * @returns {SObject}\n */\n\n/**\n * @typedef {Object} Tooling~ExecuteAnonymousResult\n * @prop {Boolean} compiled - Flag if the query is compiled successfully\n * @prop {String} compileProblem - Error reason in compilation\n * @prop {Boolean} success - Flag if the code is executed successfully\n * @prop {Number} line - Line number for the error\n * @prop {Number} column - Column number for the error\n * @prop {String} exceptionMessage - Exception message\n * @prop {String} exceptionStackTrace - Exception stack trace\n */\n/**\n * Executes Apex code anonymously\n *\n * @param {String} body - Anonymous Apex code\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\nTooling.prototype.executeAnonymous = function(body, callback) {\n var url = this._baseUrl() + \"/executeAnonymous?anonymousBody=\" + encodeURIComponent(body);\n return this.request(url).thenCall(callback);\n};\n\n/**\n * Executes Apex tests asynchronously\n *\n * @param {Array.} classids - Comma separated list of class IDs\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\nTooling.prototype.runTestsAsynchronous = function(classids, callback) {\n var url = this._baseUrl() + \"/runTestsAsynchronous/\";\n return this._conn.requestPost(url, {classids : classids.join(',')}, undefined, callback);\n};\n\n/**\n * Executes Apex tests synchronously\n *\n * @param {Array.} classnames - Comma separated list of class Names\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\nTooling.prototype.runTestsSynchronous = function(classnames, callback) {\n var url = this._baseUrl() + \"/runTestsSynchronous/\";\n return this._conn.requestPost(url, {classnames : classnames.join(',')}, undefined, callback);\n};\n\n/**\n * @typedef {Object} Tooling~CompletionsResult\n * @prop {Object} publicDeclarations\n */\n/**\n * Retrieves available code completions of the referenced type\n *\n * @param {String} [type] - completion type (default 'apex')\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\nTooling.prototype.completions = function(type, callback) {\n if (!_.isString(type)) {\n callback = type;\n type = 'apex';\n }\n var url = this._baseUrl() + \"/completions?type=\" + encodeURIComponent(type);\n return this.request(url).thenCall(callback);\n};\n\n\n/*--------------------------------------------*/\n/*\n * Register hook in connection instantiation for dynamically adding this API module features\n */\njsforce.on('connection:new', function(conn) {\n conn.tooling = new Tooling(conn);\n});\n\n\nmodule.exports = Tooling;\n\n},{}]},{},[1])(1)\n});\n\n"]} \ No newline at end of file +{"version":3,"sources":["node_modules/browser-pack/_prelude.js","lib/api/tooling.js","jsforce-api-tooling.min.js"],"names":["f","exports","module","define","amd","g","window","global","self","this","jsforce","modules","api","Tooling","r","e","n","t","o","i","c","require","u","a","Error","code","p","call","length","1","_","Cache","conn","_conn","_logger","forEach","method","constructor","prototype","cache","cacheOptions","key","type","describe$","makeCacheable","describe","makeResponseCacheable","describeSObject$","describeSObject","describeGlobal$","describeGlobal","initialize","sobjects","clear","get","removeAllListeners","on","bind","res","result","map","so","name","sobject","_baseUrl","_supports","feature","apply","arguments","request","executeAnonymous","body","callback","url","encodeURIComponent","thenCall","runTestsAsynchronous","classids","requestPost","join","undefined","runTestsSynchronous","classnames","completions","isString","tooling"],"mappings":"CAAA,SAAAA,GAAA,GAAA,iBAAAC,SAAA,oBAAAC,OAAAA,OAAAD,QAAAD,SAAA,GAAA,mBAAAG,QAAAA,OAAAC,IAAAD,OAAA,GAAAH,OAAA,CAAA,IAAAK,GAAAA,GAAAA,GAAAA,GAAAA,EAAA,oBAAAC,OAAAA,OAAA,oBAAAC,OAAAA,OAAA,oBAAAC,KAAAA,KAAAC,MAAAC,UAAAL,EAAAK,QAAA,KAAAC,UAAAN,EAAAM,QAAA,KAAAC,MAAAP,EAAAO,IAAA,KAAAC,QAAAb,KAAA,EAAA,WAAA,OAAA,SAAAc,EAAAC,EAAAC,EAAAC,GAAA,SAAAC,EAAAC,EAAAnB,GAAA,IAAAgB,EAAAG,GAAA,CAAA,IAAAJ,EAAAI,GAAA,CAAA,IAAAC,EAAA,mBAAAC,SAAAA,QAAA,IAAArB,GAAAoB,EAAA,OAAAA,EAAAD,GAAA,GAAA,GAAAG,EAAA,OAAAA,EAAAH,GAAA,GAAA,IAAAI,EAAA,IAAAC,MAAA,uBAAAL,EAAA,KAAA,MAAAI,EAAAE,KAAA,mBAAAF,EAAA,IAAAG,EAAAV,EAAAG,GAAA,CAAAlB,QAAA,IAAAc,EAAAI,GAAA,GAAAQ,KAAAD,EAAAzB,SAAA,SAAAa,GAAA,OAAAI,EAAAH,EAAAI,GAAA,GAAAL,IAAAA,KAAAY,EAAAA,EAAAzB,QAAAa,EAAAC,EAAAC,EAAAC,GAAA,OAAAD,EAAAG,GAAAlB,QAAA,IAAA,IAAAqB,EAAA,mBAAAD,SAAAA,QAAAF,EAAA,EAAAA,EAAAF,EAAAW,OAAAT,IAAAD,EAAAD,EAAAE,IAAA,OAAAD,EAAA,CAAA,CAAAW,EAAA,CAAA,SAAAR,EAAAnB,EAAAD,GCKA,aAEA,IAAAS,EAAAJ,OAAAI,QAAAW,QAAA,UACAS,EAAAxB,OAAAI,QAAAW,QAAA,eACAU,EAAAzB,OAAAI,QAAAW,QAAA,WAQAR,EAAA,SAAAmB,GACAvB,KAAAwB,MAAAD,EACAvB,KAAAyB,QAAAF,EAAAE,QACA,CACA,QACA,YACA,kBACA,SACA,gBACA,kBACA,cACA,SACA,WACA,kBACA,oBACA,gBACA,SACA,gBACA,kBACA,cACA,SACA,MACA,SACA,UACA,iBACA,mBACA,eACA,WACA,iBACA,WAEAC,SAAA,SAAAC,GACA3B,KAAA2B,GAAAJ,EAAAK,YAAAC,UAAAF,KACA3B,MAEAA,KAAA8B,MAAA,IAAAR,EAEA,IAAAS,EAAA,CACAC,IAAA,SAAAC,GAAA,OAAAA,EAAA,YAAAA,EAAA,aAEAjC,KAAAkC,UAAAlC,KAAA8B,MAAAK,cAAAnC,KAAAoC,SAAApC,KAAA+B,GACA/B,KAAAoC,SAAApC,KAAA8B,MAAAO,sBAAArC,KAAAoC,SAAApC,KAAA+B,GACA/B,KAAAsC,iBAAAtC,KAAAkC,UACAlC,KAAAuC,gBAAAvC,KAAAoC,SAEAL,EAAA,CAAAC,IAAA,kBACAhC,KAAAwC,gBAAAxC,KAAA8B,MAAAK,cAAAnC,KAAAyC,eAAAzC,KAAA+B,GACA/B,KAAAyC,eAAAzC,KAAA8B,MAAAO,sBAAArC,KAAAyC,eAAAzC,KAAA+B,GAEA/B,KAAA0C,cAOAtC,EAAAyB,UAAAa,WAAA,WACA1C,KAAA2C,SAAA,GACA3C,KAAA8B,MAAAc,QACA5C,KAAA8B,MAAAe,IAAA,kBAAAC,mBAAA,SACA9C,KAAA8B,MAAAe,IAAA,kBAAAE,GAAA,QAAA1B,EAAA2B,MAAA,SAAAC,GACAA,EAAAC,QACA7B,EAAA8B,IAAAF,EAAAC,OAAAP,UAAA,SAAAS,GAAA,OAAAA,EAAAC,QACA3B,QAAA1B,KAAAsD,QAAAtD,QAEAA,QAMAI,EAAAyB,UAAA0B,SAAA,WACA,OAAAvD,KAAAwB,MAAA+B,WAAA,YAMAnD,EAAAyB,UAAA2B,UAAA,SAAAC,GAEA,MAAA,uBAAAA,GAGAzD,KAAAwB,MAAAgC,UAAAE,MAAA1D,KAAAwB,MAAAmC,YAMAvD,EAAAyB,UAAA+B,QAAA,WACA,OAAA5D,KAAAwB,MAAAoC,QAAAF,MAAA1D,KAAAwB,MAAAmC,YAkJAvD,EAAAyB,UAAAgC,iBAAA,SAAAC,EAAAC,GACA,IAAAC,EAAAhE,KAAAuD,WAAA,mCAAAU,mBAAAH,GACA,OAAA9D,KAAA4D,QAAAI,GAAAE,SAAAH,IAUA3D,EAAAyB,UAAAsC,qBAAA,SAAAC,EAAAL,GACA,IAAAC,EAAAhE,KAAAuD,WAAA,yBACA,OAAAvD,KAAAwB,MAAA6C,YAAAL,EAAA,CAAAI,SAAAA,EAAAE,KAAA,WAAAC,EAAAR,IAUA3D,EAAAyB,UAAA2C,oBAAA,SAAAC,EAAAV,GACA,IAAAC,EAAAhE,KAAAuD,WAAA,wBACA,OAAAvD,KAAAwB,MAAA6C,YAAAL,EAAA,CAAAS,WAAAA,EAAAH,KAAA,WAAAC,EAAAR,IAcA3D,EAAAyB,UAAA6C,YAAA,SAAAzC,EAAA8B,GACA1C,EAAAsD,SAAA1C,KACA8B,EAAA9B,EACAA,EAAA,QAEA,IAAA+B,EAAAhE,KAAAuD,WAAA,qBAAAU,mBAAAhC,GACA,OAAAjC,KAAA4D,QAAAI,GAAAE,SAAAH,IAQA9D,EAAA8C,GAAA,kBAAA,SAAAxB,GACAA,EAAAqD,QAAA,IAAAxE,EAAAmB,MAIA9B,EAAAD,QAAAY,GCGE,KAAK,GAAG,CAAC,GF3TX,CE2Te","file":"jsforce-api-tooling.min.js","sourcesContent":["(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\n */\n\n'use strict';\n\nvar jsforce = window.jsforce.require('./core'),\n _ = window.jsforce.require('lodash/core'),\n Cache = window.jsforce.require('./cache');\n\n/**\n * API class for Tooling API call\n *\n * @class\n * @param {Connection} conn - Connection\n */\nvar Tooling = function(conn) {\n this._conn = conn;\n this._logger = conn._logger;\n var delegates = [\n \"query\",\n \"queryMore\",\n \"_toRecordResult\",\n \"create\",\n \"_createSingle\",\n \"_createParallel\",\n \"_createMany\",\n \"insert\",\n \"retrieve\",\n \"_retrieveSingle\",\n \"_retrieveParallel\",\n \"_retrieveMany\",\n \"update\",\n \"_updateSingle\",\n \"_updateParallel\",\n \"_updateMany\",\n \"upsert\",\n \"del\",\n \"delete\",\n \"destroy\",\n \"_destroySingle\",\n \"_destroyParallel\",\n \"_destroyMany\",\n \"describe\",\n \"describeGlobal\",\n \"sobject\"\n ];\n delegates.forEach(function(method) {\n this[method] = conn.constructor.prototype[method];\n }, this);\n\n this.cache = new Cache();\n\n var cacheOptions = {\n key: function(type) { return type ? \"describe.\" + type : \"describe\"; }\n };\n this.describe$ = this.cache.makeCacheable(this.describe, this, cacheOptions);\n this.describe = this.cache.makeResponseCacheable(this.describe, this, cacheOptions);\n this.describeSObject$ = this.describe$;\n this.describeSObject = this.describe;\n\n cacheOptions = { key: 'describeGlobal' };\n this.describeGlobal$ = this.cache.makeCacheable(this.describeGlobal, this, cacheOptions);\n this.describeGlobal = this.cache.makeResponseCacheable(this.describeGlobal, this, cacheOptions);\n\n this.initialize();\n};\n\n/**\n * Initialize tooling API\n * @protected\n */\nTooling.prototype.initialize = function() {\n this.sobjects = {};\n this.cache.clear();\n this.cache.get('describeGlobal').removeAllListeners('value');\n this.cache.get('describeGlobal').on('value', _.bind(function(res) {\n if (res.result) {\n var types = _.map(res.result.sobjects, function(so) { return so.name; });\n types.forEach(this.sobject, this);\n }\n }, this));\n};\n\n/**\n * @private\n */\nTooling.prototype._baseUrl = function() {\n return this._conn._baseUrl() + \"/tooling\";\n};\n\n/**\n * @private\n */\nTooling.prototype._supports = function(feature) {\n // should return false in order not to use compsite collection\n if (feature === 'sobject-collection') {\n return false;\n }\n return this._conn._supports.apply(this._conn, arguments);\n};\n\n/**\n * @private\n */\nTooling.prototype.request = function() {\n return this._conn.request.apply(this._conn, arguments);\n};\n\n/**\n * Execute query by using SOQL\n *\n * @param {String} soql - SOQL string\n * @param {Callback.} [callback] - Callback function\n * @returns {Query.}\n */\n/**\n * Query next record set by using query locator\n *\n * @method Tooling#query\n * @param {String} locator - Next record set locator\n * @param {Callback.} [callback] - Callback function\n * @returns {Query.}\n */\n/**\n * Retrieve specified records\n *\n * @method Tooling#queryMore\n * @param {String} type - SObject Type\n * @param {String|Array.} ids - A record ID or array of record IDs\n * @param {Callback.>} [callback] - Callback function\n * @returns {Promise.>}\n */\n\n/**\n * Synonym of Tooling#create()\n *\n * @method Tooling#insert\n * @param {String} type - SObject Type\n * @param {Object|Array.} records - A record or array of records to create\n * @param {Callback.>} [callback] - Callback function\n * @returns {Promise.>}\n */\n/**\n * Create records\n *\n * @method Tooling#create\n * @param {String} type - SObject Type\n * @param {Record|Array.} records - A record or array of records to create\n * @param {Callback.>} [callback] - Callback function\n * @returns {Promise.>}\n */\n\n/**\n * Update records\n *\n * @method Tooling#update\n * @param {String} type - SObject Type\n * @param {Record|Array.} records - A record or array of records to update\n * @param {Callback.>} [callback] - Callback function\n * @returns {Promise.>}\n */\n\n/**\n * Upsert records\n *\n * @method Tooling#upsert\n * @param {String} type - SObject Type\n * @param {Record|Array.} records - Record or array of records to upsert\n * @param {String} extIdField - External ID field name\n * @param {Callback.>} [callback] - Callback\n * @returns {Promise.>}\n */\n\n/**\n * Synonym of Tooling#destroy()\n *\n * @method Tooling#delete\n * @param {String} type - SObject Type\n * @param {String|Array.} ids - A ID or array of IDs to delete\n * @param {Callback.>} [callback] - Callback\n * @returns {Promise.>}\n */\n/**\n * Synonym of Tooling#destroy()\n *\n * @method Tooling#del\n * @param {String} type - SObject Type\n * @param {String|Array.} ids - A ID or array of IDs to delete\n * @param {Callback.>} [callback] - Callback\n * @returns {Promise.>}\n */\n/**\n * Delete records\n *\n * @method Tooling#destroy\n * @param {String} type - SObject Type\n * @param {String|Array.} ids - A ID or array of IDs to delete\n * @param {Callback.>} [callback] - Callback\n * @returns {Promise.>}\n */\n\n/**\n * Synonym of Tooling#describe()\n *\n * @method Tooling#describeSObject\n * @param {String} type - SObject Type\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\n/**\n * Describe SObject metadata\n *\n * @method Tooling#describe\n * @param {String} type - SObject Type\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\n\n/**\n * Describe global SObjects\n *\n * @method Tooling#describeGlobal\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\n\n/**\n * Get SObject instance\n *\n * @method Tooling#sobject\n * @param {String} type - SObject Type\n * @returns {SObject}\n */\n\n/**\n * @typedef {Object} Tooling~ExecuteAnonymousResult\n * @prop {Boolean} compiled - Flag if the query is compiled successfully\n * @prop {String} compileProblem - Error reason in compilation\n * @prop {Boolean} success - Flag if the code is executed successfully\n * @prop {Number} line - Line number for the error\n * @prop {Number} column - Column number for the error\n * @prop {String} exceptionMessage - Exception message\n * @prop {String} exceptionStackTrace - Exception stack trace\n */\n/**\n * Executes Apex code anonymously\n *\n * @param {String} body - Anonymous Apex code\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\nTooling.prototype.executeAnonymous = function(body, callback) {\n var url = this._baseUrl() + \"/executeAnonymous?anonymousBody=\" + encodeURIComponent(body);\n return this.request(url).thenCall(callback);\n};\n\n/**\n * Executes Apex tests asynchronously\n *\n * @param {Array.} classids - Comma separated list of class IDs\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\nTooling.prototype.runTestsAsynchronous = function(classids, callback) {\n var url = this._baseUrl() + \"/runTestsAsynchronous/\";\n return this._conn.requestPost(url, {classids : classids.join(',')}, undefined, callback);\n};\n\n/**\n * Executes Apex tests synchronously\n *\n * @param {Array.} classnames - Comma separated list of class Names\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\nTooling.prototype.runTestsSynchronous = function(classnames, callback) {\n var url = this._baseUrl() + \"/runTestsSynchronous/\";\n return this._conn.requestPost(url, {classnames : classnames.join(',')}, undefined, callback);\n};\n\n/**\n * @typedef {Object} Tooling~CompletionsResult\n * @prop {Object} publicDeclarations\n */\n/**\n * Retrieves available code completions of the referenced type\n *\n * @param {String} [type] - completion type (default 'apex')\n * @param {Callback.} [callback] - Callback function\n * @returns {Promise.}\n */\nTooling.prototype.completions = function(type, callback) {\n if (!_.isString(type)) {\n callback = type;\n type = 'apex';\n }\n var url = this._baseUrl() + \"/completions?type=\" + encodeURIComponent(type);\n return this.request(url).thenCall(callback);\n};\n\n\n/*--------------------------------------------*/\n/*\n * Register hook in connection instantiation for dynamically adding this API module features\n */\njsforce.on('connection:new', function(conn) {\n conn.tooling = new Tooling(conn);\n});\n\n\nmodule.exports = Tooling;\n","!function(e){var t;\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=e():\"function\"==typeof define&&define.amd?define([],e):(t=(t=(t=(t=\"undefined\"!=typeof window?window:\"undefined\"!=typeof global?global:\"undefined\"!=typeof self?self:this).jsforce||(t.jsforce={})).modules||(t.modules={})).api||(t.api={})).Tooling=e()}(function(){return function s(i,c,a){function u(t,e){if(!c[t]){if(!i[t]){var o=\"function\"==typeof require&&require;if(!e&&o)return o(t,!0);if(l)return l(t,!0);var r=new Error(\"Cannot find module '\"+t+\"'\");throw r.code=\"MODULE_NOT_FOUND\",r}var n=c[t]={exports:{}};i[t][0].call(n.exports,function(e){return u(i[t][1][e]||e)},n,n.exports,s,i,c,a)}return c[t].exports}for(var l=\"function\"==typeof require&&require,e=0;e @@ -374,7 +374,7 @@ module.exports = new Client(); module.exports.Client = Client; -},{"../connection":9,"../oauth2":15,"events":37,"inherits":39,"lodash/core":43,"querystring":51}],6:[function(require,module,exports){ +},{"../connection":9,"../oauth2":15,"events":37,"inherits":39,"lodash/core":42,"querystring":50}],6:[function(require,module,exports){ /*global window, document */ 'use strict'; @@ -499,7 +499,7 @@ function getResponseHeaderNames(xhr) { }); } -},{"lodash/core":43,"readable-stream":62}],8:[function(require,module,exports){ +},{"lodash/core":42,"readable-stream":65}],8:[function(require,module,exports){ /** * @file Manages asynchronous method response cache * @author Shinichi Tomita @@ -716,7 +716,7 @@ Cache.prototype.makeCacheable = function(fn, scope, options) { module.exports = Cache; -},{"events":37,"inherits":39,"lodash/core":43}],9:[function(require,module,exports){ +},{"events":37,"inherits":39,"lodash/core":42}],9:[function(require,module,exports){ (function (Buffer){ /*global Buffer */ /** @@ -2415,7 +2415,7 @@ Connection.prototype.quickAction = function(actionName) { }).call(this,require("buffer").Buffer) -},{"./cache":8,"./core":10,"./http-api":13,"./logger":14,"./oauth2":15,"./process":16,"./promise":17,"./query":18,"./quick-action":19,"./sobject":24,"./transport":26,"buffer":30,"events":37,"inherits":39,"lodash/core":43}],10:[function(require,module,exports){ +},{"./cache":8,"./core":10,"./http-api":13,"./logger":14,"./oauth2":15,"./process":16,"./promise":17,"./query":18,"./quick-action":19,"./sobject":24,"./transport":26,"buffer":30,"events":37,"inherits":39,"lodash/core":42}],10:[function(require,module,exports){ /** * @file JSforce Core * @author Shinichi Tomita @@ -2485,7 +2485,7 @@ module.exports = { serializeCSVStream: serializeCSVStream }; -},{"csv-parse/lib/es5":33,"csv-parse/lib/es5/sync":34,"csv-stringify":35,"csv-stringify/lib/sync":36,"lodash/core":43}],12:[function(require,module,exports){ +},{"csv-parse/lib/es5":33,"csv-parse/lib/es5/sync":34,"csv-stringify":35,"csv-stringify/lib/sync":36,"lodash/core":42}],12:[function(require,module,exports){ 'use strict'; var _ = require('lodash/core'); @@ -2650,7 +2650,7 @@ function createLiteralBuilder(literal) { return function(num) { return new SfDate(literal + ":" + num); }; } -},{"lodash/core":43}],13:[function(require,module,exports){ +},{"lodash/core":42}],13:[function(require,module,exports){ 'use strict'; var inherits = require('inherits'), @@ -2952,7 +2952,7 @@ SessionRefreshDelegate.prototype.refresh = function(since, callback) { HttpApi.SessionRefreshDelegate = SessionRefreshDelegate; module.exports = HttpApi; -},{"./csv":11,"./promise":17,"events":37,"inherits":39,"lodash/core":43,"xml2js":78}],14:[function(require,module,exports){ +},{"./csv":11,"./promise":17,"events":37,"inherits":39,"lodash/core":42,"xml2js":95}],14:[function(require,module,exports){ 'use strict'; /** @@ -3214,7 +3214,7 @@ _.extend(OAuth2.prototype, /** @lends OAuth2.prototype **/ { }); -},{"./transport":26,"lodash/core":43,"querystring":51}],16:[function(require,module,exports){ +},{"./transport":26,"lodash/core":42,"querystring":50}],16:[function(require,module,exports){ /** * @file Process class to manage/run workflow rule and approval process * @author Shinichi Tomita @@ -3491,7 +3491,7 @@ ApprovalProcessRequest.prototype.thenCall = function(callback) { this; }; -},{"./connection":9,"./promise":17,"lodash/core":43}],17:[function(require,module,exports){ +},{"./connection":9,"./promise":17,"lodash/core":42}],17:[function(require,module,exports){ (function (process){ /*global process*/ @@ -3660,7 +3660,7 @@ module.exports = Promise; }).call(this,require('_process')) -},{"_process":46,"lodash/core":43,"promise/lib/es6-extensions":48}],18:[function(require,module,exports){ +},{"_process":45,"lodash/core":42,"promise/lib/es6-extensions":47}],18:[function(require,module,exports){ (function (process){ /*global process*/ /** @@ -4546,7 +4546,7 @@ SubQuery.prototype.execute = function() { }).call(this,require('_process')) -},{"./date":12,"./promise":17,"./record-stream":20,"./soql-builder":25,"_process":46,"events":37,"inherits":39,"lodash/core":43,"readable-stream":62}],19:[function(require,module,exports){ +},{"./date":12,"./promise":17,"./record-stream":20,"./soql-builder":25,"_process":45,"events":37,"inherits":39,"lodash/core":42,"readable-stream":65}],19:[function(require,module,exports){ /** * @file Represents Salesforce QuickAction * @author Shinichi Tomita @@ -4920,7 +4920,7 @@ var DataStreamConverters = RecordStream.DataStreamConverters = { csv: CSVStreamConverter }; -},{"./csv":11,"events":37,"inherits":39,"lodash/core":43,"readable-stream":62}],21:[function(require,module,exports){ +},{"./csv":11,"events":37,"inherits":39,"lodash/core":42,"readable-stream":65}],21:[function(require,module,exports){ /** * @file Represents Salesforce record information * @author Shinichi Tomita @@ -5029,7 +5029,7 @@ RecordReference.prototype.blob = function(fieldName) { return this._conn.request(url).stream(); }; -},{"lodash/core":43}],22:[function(require,module,exports){ +},{"lodash/core":42}],22:[function(require,module,exports){ 'use strict'; var required = require('./_required'); @@ -5254,7 +5254,7 @@ SOAP.prototype._createEnvelope = function(message) { ].join(''); }; -},{"./http-api":13,"inherits":39,"lodash/core":43,"xml2js":78}],24:[function(require,module,exports){ +},{"./http-api":13,"inherits":39,"lodash/core":42,"xml2js":95}],24:[function(require,module,exports){ /** * @file Represents Salesforce SObject * @author Shinichi Tomita @@ -5814,7 +5814,7 @@ ListView.prototype.explain = function(callback) { return this._conn.request(url, callback); }; -},{"./cache":8,"./query":18,"./quick-action":19,"./record":21,"lodash/core":43}],25:[function(require,module,exports){ +},{"./cache":8,"./query":18,"./quick-action":19,"./record":21,"lodash/core":42}],25:[function(require,module,exports){ /** * @file Create and build SOQL string from configuration * @author Shinichi Tomita @@ -5941,21 +5941,23 @@ var opMap = { /** @private **/ function createFieldExpression(field, value) { - var op = "$eq"; - // Assume the `$in` operator if value is an array and none was supplied. - if (_.isArray(value)) { op = "$in"; } + if (_.isArray(value)) { + return createOpExpression(field, "$in", value); + } // Otherwise, if an object was passed then process the supplied ops. else if (_.isObject(value)) { - var _value; - for (var k in value) { - if (k[0] === "$") { - op = k; - value = value[k]; - break; - } - } + var expressions = _.map(value, function (v, k) { + if (k[0] === "$") return createOpExpression(field, k, v); + }); + return expressions.join(' AND '); } + // If the value is a scalar, it's an equality condition. + else return createOpExpression(field, "$eq", value); +} + +/** @private **/ +function createOpExpression(field, op, value) { var sfop = opMap[op]; if (!sfop || _.isUndefined(value)) { return null; } var valueExpr = createValueExpression(value); @@ -6050,7 +6052,7 @@ function createOrderByClause(sort) { exports.createSOQL = createSOQL; -},{"./date":12,"lodash/core":43}],26:[function(require,module,exports){ +},{"./date":12,"lodash/core":42}],26:[function(require,module,exports){ (function (process){ /*global process, Sfdc */ @@ -6288,7 +6290,7 @@ HttpProxyTransport.prototype.httpRequest = function(params, callback) { }).call(this,require('_process')) -},{"./browser/canvas":4,"./browser/jsonp":6,"./promise":17,"_process":46,"inherits":39,"request":7}],27:[function(require,module,exports){ +},{"./browser/canvas":4,"./browser/jsonp":6,"./promise":17,"_process":45,"inherits":39,"request":7}],27:[function(require,module,exports){ (function (global){ "use strict"; @@ -6584,7 +6586,8 @@ function toByteArray (b64) { ? validLen - 4 : validLen - for (var i = 0; i < len; i += 4) { + var i + for (i = 0; i < len; i += 4) { tmp = (revLookup[b64.charCodeAt(i)] << 18) | (revLookup[b64.charCodeAt(i + 1)] << 12) | @@ -6672,6 +6675,7 @@ function fromByteArray (uint8) { },{}],29:[function(require,module,exports){ },{}],30:[function(require,module,exports){ +(function (Buffer){ /*! * The buffer module from node.js, for the browser. * @@ -6720,7 +6724,7 @@ function typedArraySupport () { // Can typed array instances can be augmented? try { var arr = new Uint8Array(1) - arr.__proto__ = {__proto__: Uint8Array.prototype, foo: function () { return 42 }} + arr.__proto__ = { __proto__: Uint8Array.prototype, foo: function () { return 42 } } return arr.foo() === 42 } catch (e) { return false @@ -6728,26 +6732,24 @@ function typedArraySupport () { } Object.defineProperty(Buffer.prototype, 'parent', { + enumerable: true, get: function () { - if (!(this instanceof Buffer)) { - return undefined - } + if (!Buffer.isBuffer(this)) return undefined return this.buffer } }) Object.defineProperty(Buffer.prototype, 'offset', { + enumerable: true, get: function () { - if (!(this instanceof Buffer)) { - return undefined - } + if (!Buffer.isBuffer(this)) return undefined return this.byteOffset } }) function createBuffer (length) { if (length > K_MAX_LENGTH) { - throw new RangeError('Invalid typed array length') + throw new RangeError('The value "' + length + '" is invalid for option "size"') } // Return an augmented `Uint8Array` instance var buf = new Uint8Array(length) @@ -6769,8 +6771,8 @@ function Buffer (arg, encodingOrOffset, length) { // Common case. if (typeof arg === 'number') { if (typeof encodingOrOffset === 'string') { - throw new Error( - 'If encoding is specified then the first argument must be a string' + throw new TypeError( + 'The "string" argument must be of type string. Received type number' ) } return allocUnsafe(arg) @@ -6779,7 +6781,7 @@ function Buffer (arg, encodingOrOffset, length) { } // Fix subarray() in ES2016. See: https://github.com/feross/buffer/pull/97 -if (typeof Symbol !== 'undefined' && Symbol.species && +if (typeof Symbol !== 'undefined' && Symbol.species != null && Buffer[Symbol.species] === Buffer) { Object.defineProperty(Buffer, Symbol.species, { value: null, @@ -6792,19 +6794,51 @@ if (typeof Symbol !== 'undefined' && Symbol.species && Buffer.poolSize = 8192 // not used by this implementation function from (value, encodingOrOffset, length) { - if (typeof value === 'number') { - throw new TypeError('"value" argument must not be a number') + if (typeof value === 'string') { + return fromString(value, encodingOrOffset) + } + + if (ArrayBuffer.isView(value)) { + return fromArrayLike(value) + } + + if (value == null) { + throw TypeError( + 'The first argument must be one of type string, Buffer, ArrayBuffer, Array, ' + + 'or Array-like Object. Received type ' + (typeof value) + ) } - if (isArrayBuffer(value) || (value && isArrayBuffer(value.buffer))) { + if (isInstance(value, ArrayBuffer) || + (value && isInstance(value.buffer, ArrayBuffer))) { return fromArrayBuffer(value, encodingOrOffset, length) } - if (typeof value === 'string') { - return fromString(value, encodingOrOffset) + if (typeof value === 'number') { + throw new TypeError( + 'The "value" argument must not be of type number. Received type number' + ) + } + + var valueOf = value.valueOf && value.valueOf() + if (valueOf != null && valueOf !== value) { + return Buffer.from(valueOf, encodingOrOffset, length) + } + + var b = fromObject(value) + if (b) return b + + if (typeof Symbol !== 'undefined' && Symbol.toPrimitive != null && + typeof value[Symbol.toPrimitive] === 'function') { + return Buffer.from( + value[Symbol.toPrimitive]('string'), encodingOrOffset, length + ) } - return fromObject(value) + throw new TypeError( + 'The first argument must be one of type string, Buffer, ArrayBuffer, Array, ' + + 'or Array-like Object. Received type ' + (typeof value) + ) } /** @@ -6828,7 +6862,7 @@ function assertSize (size) { if (typeof size !== 'number') { throw new TypeError('"size" argument must be of type number') } else if (size < 0) { - throw new RangeError('"size" argument must not be negative') + throw new RangeError('The value "' + size + '" is invalid for option "size"') } } @@ -6943,20 +6977,16 @@ function fromObject (obj) { return buf } - if (obj) { - if (ArrayBuffer.isView(obj) || 'length' in obj) { - if (typeof obj.length !== 'number' || numberIsNaN(obj.length)) { - return createBuffer(0) - } - return fromArrayLike(obj) - } - - if (obj.type === 'Buffer' && Array.isArray(obj.data)) { - return fromArrayLike(obj.data) + if (obj.length !== undefined) { + if (typeof obj.length !== 'number' || numberIsNaN(obj.length)) { + return createBuffer(0) } + return fromArrayLike(obj) } - throw new TypeError('The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object.') + if (obj.type === 'Buffer' && Array.isArray(obj.data)) { + return fromArrayLike(obj.data) + } } function checked (length) { @@ -6977,12 +7007,17 @@ function SlowBuffer (length) { } Buffer.isBuffer = function isBuffer (b) { - return b != null && b._isBuffer === true + return b != null && b._isBuffer === true && + b !== Buffer.prototype // so Buffer.isBuffer(Buffer.prototype) will be false } Buffer.compare = function compare (a, b) { + if (isInstance(a, Uint8Array)) a = Buffer.from(a, a.offset, a.byteLength) + if (isInstance(b, Uint8Array)) b = Buffer.from(b, b.offset, b.byteLength) if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) { - throw new TypeError('Arguments must be Buffers') + throw new TypeError( + 'The "buf1", "buf2" arguments must be one of type Buffer or Uint8Array' + ) } if (a === b) return 0 @@ -7043,7 +7078,7 @@ Buffer.concat = function concat (list, length) { var pos = 0 for (i = 0; i < list.length; ++i) { var buf = list[i] - if (ArrayBuffer.isView(buf)) { + if (isInstance(buf, Uint8Array)) { buf = Buffer.from(buf) } if (!Buffer.isBuffer(buf)) { @@ -7059,15 +7094,19 @@ function byteLength (string, encoding) { if (Buffer.isBuffer(string)) { return string.length } - if (ArrayBuffer.isView(string) || isArrayBuffer(string)) { + if (ArrayBuffer.isView(string) || isInstance(string, ArrayBuffer)) { return string.byteLength } if (typeof string !== 'string') { - string = '' + string + throw new TypeError( + 'The "string" argument must be one of type string, Buffer, or ArrayBuffer. ' + + 'Received type ' + typeof string + ) } var len = string.length - if (len === 0) return 0 + var mustMatch = (arguments.length > 2 && arguments[2] === true) + if (!mustMatch && len === 0) return 0 // Use a for loop to avoid recursion var loweredCase = false @@ -7079,7 +7118,6 @@ function byteLength (string, encoding) { return len case 'utf8': case 'utf-8': - case undefined: return utf8ToBytes(string).length case 'ucs2': case 'ucs-2': @@ -7091,7 +7129,9 @@ function byteLength (string, encoding) { case 'base64': return base64ToBytes(string).length default: - if (loweredCase) return utf8ToBytes(string).length // assume utf8 + if (loweredCase) { + return mustMatch ? -1 : utf8ToBytes(string).length // assume utf8 + } encoding = ('' + encoding).toLowerCase() loweredCase = true } @@ -7238,16 +7278,20 @@ Buffer.prototype.equals = function equals (b) { Buffer.prototype.inspect = function inspect () { var str = '' var max = exports.INSPECT_MAX_BYTES - if (this.length > 0) { - str = this.toString('hex', 0, max).match(/.{2}/g).join(' ') - if (this.length > max) str += ' ... ' - } + str = this.toString('hex', 0, max).replace(/(.{2})/g, '$1 ').trim() + if (this.length > max) str += ' ... ' return '' } Buffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) { + if (isInstance(target, Uint8Array)) { + target = Buffer.from(target, target.offset, target.byteLength) + } if (!Buffer.isBuffer(target)) { - throw new TypeError('Argument must be a Buffer') + throw new TypeError( + 'The "target" argument must be one of type Buffer or Uint8Array. ' + + 'Received type ' + (typeof target) + ) } if (start === undefined) { @@ -7326,7 +7370,7 @@ function bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) { } else if (byteOffset < -0x80000000) { byteOffset = -0x80000000 } - byteOffset = +byteOffset // Coerce to Number. + byteOffset = +byteOffset // Coerce to Number. if (numberIsNaN(byteOffset)) { // byteOffset: it it's undefined, null, NaN, "foo", etc, search whole buffer byteOffset = dir ? 0 : (buffer.length - 1) @@ -7578,8 +7622,8 @@ function utf8Slice (buf, start, end) { var codePoint = null var bytesPerSequence = (firstByte > 0xEF) ? 4 : (firstByte > 0xDF) ? 3 - : (firstByte > 0xBF) ? 2 - : 1 + : (firstByte > 0xBF) ? 2 + : 1 if (i + bytesPerSequence <= end) { var secondByte, thirdByte, fourthByte, tempCodePoint @@ -8397,19 +8441,22 @@ function blitBuffer (src, dst, offset, length) { return i } -// ArrayBuffers from another context (i.e. an iframe) do not pass the `instanceof` check -// but they should be treated as valid. See: https://github.com/feross/buffer/issues/166 -function isArrayBuffer (obj) { - return obj instanceof ArrayBuffer || - (obj != null && obj.constructor != null && obj.constructor.name === 'ArrayBuffer' && - typeof obj.byteLength === 'number') +// ArrayBuffer or Uint8Array objects from other contexts (i.e. iframes) do not pass +// the `instanceof` check but they should be treated as of that type. +// See: https://github.com/feross/buffer/issues/166 +function isInstance (obj, type) { + return obj instanceof type || + (obj != null && obj.constructor != null && obj.constructor.name != null && + obj.constructor.name === type.name) } - function numberIsNaN (obj) { + // For IE11 support return obj !== obj // eslint-disable-line no-self-compare } -},{"base64-js":28,"ieee754":38}],31:[function(require,module,exports){ +}).call(this,require("buffer").Buffer) + +},{"base64-js":28,"buffer":30,"ieee754":38}],31:[function(require,module,exports){ (function (Buffer){ // Copyright Joyent, Inc. and other Node contributors. // @@ -8531,9 +8578,7 @@ function _defineProperties(target, props) { for (var i = 0; i < props.length; i+ function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } -var ResizeableBuffer = -/*#__PURE__*/ -function () { +var ResizeableBuffer = /*#__PURE__*/function () { function ResizeableBuffer() { var size = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 100; @@ -8606,7 +8651,7 @@ module.exports = ResizeableBuffer; }).call(this,require("buffer").Buffer) },{"buffer":30}],33:[function(require,module,exports){ -(function (Buffer){ +(function (Buffer,setImmediate){ "use strict"; function _wrapNativeSuper(Class) { var _cache = typeof Map === "function" ? new Map() : undefined; _wrapNativeSuper = function _wrapNativeSuper(Class) { if (Class === null || !_isNativeFunction(Class)) return Class; if (typeof Class !== "function") { throw new TypeError("Super expression must either be null or a function"); } if (typeof _cache !== "undefined") { if (_cache.has(Class)) return _cache.get(Class); _cache.set(Class, Wrapper); } function Wrapper() { return _construct(Class, arguments, _getPrototypeOf(this).constructor); } Wrapper.prototype = Object.create(Class.prototype, { constructor: { value: Wrapper, enumerable: false, writable: true, configurable: true } }); return _setPrototypeOf(Wrapper, Class); }; return _wrapNativeSuper(Class); } @@ -8617,13 +8662,13 @@ function _construct(Parent, args, Class) { if (isNativeReflectConstruct()) { _co function _isNativeFunction(fn) { return Function.toString.call(fn).indexOf("[native code]") !== -1; } -function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } +function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); } function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } -function _iterableToArrayLimit(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } +function _iterableToArrayLimit(arr, i) { if (!(Symbol.iterator in Object(arr) || Object.prototype.toString.call(arr) === "[object Arguments]")) { return; } var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } @@ -8637,7 +8682,7 @@ function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } -function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(source, true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(source).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } +function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } @@ -8660,23 +8705,22 @@ function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || func /* CSV Parse -Please look at the [project documentation](https://csv.js.org/parse/) for additional -information. +Please look at the [project documentation](https://csv.js.org/parse/) for +additional information. */ var _require = require('stream'), Transform = _require.Transform; var ResizeableBuffer = require('./ResizeableBuffer'); -var cr = 13; +var tab = 9; var nl = 10; +var np = 12; +var cr = 13; var space = 32; -var tab = 9; var bom_utf8 = Buffer.from([239, 187, 191]); -var Parser = -/*#__PURE__*/ -function (_Transform) { +var Parser = /*#__PURE__*/function (_Transform) { _inherits(Parser, _Transform); function Parser() { @@ -8699,7 +8743,7 @@ function (_Transform) { if (options.bom === undefined || options.bom === null || options.bom === false) { options.bom = false; } else if (options.bom !== true) { - throw new Error("Invalid Option: bom must be true, got ".concat(JSON.stringify(options.bom))); + throw new CsvError('CSV_INVALID_OPTION_BOM', ['Invalid option bom:', 'bom must be true,', "got ".concat(JSON.stringify(options.bom))]); } // Normalize option `cast` @@ -8711,7 +8755,7 @@ function (_Transform) { fnCastField = options.cast; options.cast = true; } else if (options.cast !== true) { - throw new Error('Invalid Option: cast must be true or a function'); + throw new CsvError('CSV_INVALID_OPTION_CAST', ['Invalid option cast:', 'cast must be true or a function,', "got ".concat(JSON.stringify(options.cast))]); } // Normalize option `cast_date` @@ -8723,7 +8767,7 @@ function (_Transform) { return !isNaN(date) ? new Date(date) : value; }; } else if (typeof options.cast_date !== 'function') { - throw new Error('Invalid Option: cast_date must be true or a function'); + throw new CsvError('CSV_INVALID_OPTION_CAST_DATE', ['Invalid option cast_date:', 'cast_date must be true or a function,', "got ".concat(JSON.stringify(options.cast_date))]); } // Normalize option `columns` @@ -8740,7 +8784,7 @@ function (_Transform) { } else if (options.columns === undefined || options.columns === null || options.columns === false) { options.columns = false; } else { - throw new Error("Invalid Option columns: expect an object or true, got ".concat(JSON.stringify(options.columns))); + throw new CsvError('CSV_INVALID_OPTION_COLUMNS', ['Invalid option columns:', 'expect an object, a function or true,', "got ".concat(JSON.stringify(options.columns))]); } // Normalize option `comment` @@ -8752,28 +8796,33 @@ function (_Transform) { } if (!Buffer.isBuffer(options.comment)) { - throw new Error("Invalid Option: comment must be a buffer or a string, got ".concat(JSON.stringify(options.comment))); + throw new CsvError('CSV_INVALID_OPTION_COMMENT', ['Invalid option comment:', 'comment must be a buffer or a string,', "got ".concat(JSON.stringify(options.comment))]); } } // Normalize option `delimiter` - if (options.delimiter === undefined || options.delimiter === null || options.delimiter === false) { - options.delimiter = Buffer.from(','); - } else if (Buffer.isBuffer(options.delimiter)) { - if (options.delimiter.length === 0) { - throw new Error("Invalid Option: delimiter must be a non empty buffer"); - } // Great, nothing to do + var delimiter_json = JSON.stringify(options.delimiter); + if (!Array.isArray(options.delimiter)) options.delimiter = [options.delimiter]; + + if (options.delimiter.length === 0) { + throw new CsvError('CSV_INVALID_OPTION_DELIMITER', ['Invalid option delimiter:', 'delimiter must be a non empty string or buffer or array of string|buffer,', "got ".concat(delimiter_json)]); + } - } else if (typeof options.delimiter === 'string') { - if (options.delimiter.length === 0) { - throw new Error("Invalid Option: delimiter must be a non empty string"); + options.delimiter = options.delimiter.map(function (delimiter) { + if (delimiter === undefined || delimiter === null || delimiter === false) { + return Buffer.from(','); } - options.delimiter = Buffer.from(options.delimiter); - } else { - throw new Error("Invalid Option: delimiter must be a string or a buffer, got ".concat(options.delimiter)); - } // Normalize option `escape` + if (typeof delimiter === 'string') { + delimiter = Buffer.from(delimiter); + } + + if (!Buffer.isBuffer(delimiter) || delimiter.length === 0) { + throw new CsvError('CSV_INVALID_OPTION_DELIMITER', ['Invalid option delimiter:', 'delimiter must be a non empty string or buffer or array of string|buffer,', "got ".concat(delimiter_json)]); + } + return delimiter; + }); // Normalize option `escape` if (options.escape === undefined || options.escape === null) { options.escape = Buffer.from('"'); @@ -8856,6 +8905,13 @@ function (_Transform) { } else { throw new Error("Invalid Option: objname must be a string or a buffer, got ".concat(options.objname)); + } // Normalize option `on_record` + + + if (options.on_record === undefined || options.on_record === null) { + options.on_record = undefined; + } else if (typeof options.on_record !== 'function') { + throw new CsvError('CSV_INVALID_OPTION_ON_RECORD', ['Invalid option `on_record`:', 'expect a function,', "got ".concat(JSON.stringify(options.on_record))]); } // Normalize option `quote` @@ -8912,6 +8968,20 @@ function (_Transform) { options.relax_column_count = false; } else { throw new Error("Invalid Option: relax_column_count must be a boolean, got ".concat(JSON.stringify(options.relax_column_count))); + } + + if (typeof options.relax_column_count_less === 'boolean') {// Great, nothing to do + } else if (options.relax_column_count_less === undefined || options.relax_column_count_less === null) { + options.relax_column_count_less = false; + } else { + throw new Error("Invalid Option: relax_column_count_less must be a boolean, got ".concat(JSON.stringify(options.relax_column_count_less))); + } + + if (typeof options.relax_column_count_more === 'boolean') {// Great, nothing to do + } else if (options.relax_column_count_more === undefined || options.relax_column_count_more === null) { + options.relax_column_count_more = false; + } else { + throw new Error("Invalid Option: relax_column_count_more must be a boolean, got ".concat(JSON.stringify(options.relax_column_count_more))); } // Normalize option `skip_empty_lines` @@ -9184,8 +9254,8 @@ function (_Transform) { this.state.escaping = false; } else { // Escape is only active inside quoted fields + // We are quoting, the char is an escape chr and there is a chr to escape if (this.state.quoting === true && chr === escape && pos + 1 < bufLen) { - // We are quoting, the char is an escape chr and there is a chr to escape if (escapeIsQuote) { if (buf[pos + 1] === quote) { this.state.escaping = true; @@ -9321,7 +9391,7 @@ function (_Transform) { if (this.state.commenting === false) { if (max_record_size !== 0 && this.state.record_length + this.state.field.length > max_record_size) { - var _err2 = this.__error("Max Record Size: record exceed the maximum number of tolerated bytes of ".concat(max_record_size, " on line ").concat(this.info.lines)); + var _err2 = this.__error(new CsvError('CSV_MAX_RECORD_SIZE', ['Max Record Size:', 'record exceed the maximum number of tolerated bytes', "of ".concat(max_record_size), "at line ".concat(this.info.lines)], this.__context())); if (_err2 !== undefined) return _err2; } @@ -9334,13 +9404,14 @@ function (_Transform) { if (lappend === true && rappend === true) { this.state.field.append(chr); } else if (rtrim === true && !this.__isCharTrimable(chr)) { - var _err3 = this.__error("Invalid Closing Quote: found non trimable byte after quote at line ".concat(this.info.lines)); + var _err3 = this.__error(new CsvError('CSV_NON_TRIMABLE_CHAR_AFTER_CLOSING_QUOTE', ['Invalid Closing Quote:', 'found non trimable byte after quote', "at line ".concat(this.info.lines)], this.__context())); if (_err3 !== undefined) return _err3; } } if (end === true) { + // Ensure we are not ending in a quoting state if (this.state.quoting === true) { var _err4 = this.__error(new CsvError('CSV_QUOTE_NOT_CLOSED', ['Quote Not Closed:', "the parsing is finished with an opening quote at line ".concat(this.info.lines)], this.__context())); @@ -9374,7 +9445,7 @@ function (_Transform) { }, { key: "__isCharTrimable", value: function __isCharTrimable(chr) { - return chr === space || chr === tab || chr === cr || chr === nl; + return chr === space || chr === tab || chr === cr || chr === nl || chr === np; } }, { key: "__onRow", @@ -9384,50 +9455,59 @@ function (_Transform) { info = _this$options2.info, from = _this$options2.from, relax_column_count = _this$options2.relax_column_count, + relax_column_count_less = _this$options2.relax_column_count_less, + relax_column_count_more = _this$options2.relax_column_count_more, raw = _this$options2.raw, skip_lines_with_empty_values = _this$options2.skip_lines_with_empty_values; var _this$state2 = this.state, enabled = _this$state2.enabled, - record = _this$state2.record; // Convert the first line into column names + record = _this$state2.record; + + if (enabled === false) { + return this.__resetRow(); + } // Convert the first line into column names + + + var recordLength = record.length; if (columns === true) { + if (isRecordEmpty(record)) { + this.__resetRow(); + + return; + } + return this.__firstLineToColumns(record); } - var recordLength = record.length; - if (columns === false && this.info.records === 0) { this.state.expectedRecordLength = recordLength; - } else if (enabled === true) { - if (recordLength !== this.state.expectedRecordLength) { - if (relax_column_count === true) { - this.info.invalid_field_length++; - } else { - if (columns === false) { - var err = this.__error(new CsvError('CSV_INVALID_RECORD_LENGTH_DONT_PREVIOUS_RECORDS', ['Invalid Record Length:', "expect ".concat(this.state.expectedRecordLength, ","), "got ".concat(recordLength, " on line ").concat(this.info.lines)], this.__context(), { - record: record - })); + } - if (err !== undefined) return err; - } else { - var _err5 = this.__error(new CsvError('CSV_INVALID_RECORD_LENGTH_DONT_MATCH_COLUMNS', ['Invalid Record Length:', "header length is ".concat(columns.length, ","), "got ".concat(recordLength, " on line ").concat(this.info.lines)], this.__context(), { - record: record - })); + if (recordLength !== this.state.expectedRecordLength) { + if (relax_column_count === true || relax_column_count_less === true && recordLength < this.state.expectedRecordLength || relax_column_count_more === true && recordLength > this.state.expectedRecordLength) { + this.info.invalid_field_length++; + } else { + if (columns === false) { + var err = this.__error(new CsvError('CSV_INCONSISTENT_RECORD_LENGTH', ['Invalid Record Length:', "expect ".concat(this.state.expectedRecordLength, ","), "got ".concat(recordLength, " on line ").concat(this.info.lines)], this.__context(), { + record: record + })); - if (_err5 !== undefined) return _err5; - } + if (err !== undefined) return err; + } else { + var _err5 = this.__error( // CSV_INVALID_RECORD_LENGTH_DONT_MATCH_COLUMNS + new CsvError('CSV_RECORD_DONT_MATCH_COLUMNS_LENGTH', ['Invalid Record Length:', "columns length is ".concat(columns.length, ","), // rename columns + "got ".concat(recordLength, " on line ").concat(this.info.lines)], this.__context(), { + record: record + })); + + if (_err5 !== undefined) return _err5; } } } - if (enabled === false) { - return this.__resetRow(); - } - if (skip_lines_with_empty_values === true) { - if (record.every(function (field) { - return field == null || field.toString && field.toString().trim() === ''; - })) { + if (isRecordEmpty(record)) { this.__resetRow(); return; @@ -9447,7 +9527,7 @@ function (_Transform) { if (columns !== false) { var obj = {}; // Transform record array to an object - for (var i in record) { + for (var i = 0, l = record.length; i < l; i++) { if (columns[i] === undefined || columns[i].disabled) continue; obj[columns[i].name] = record[i]; } @@ -9456,40 +9536,64 @@ function (_Transform) { if (objname === undefined) { if (raw === true || info === true) { - this.push(Object.assign({ + var _err6 = this.__push(Object.assign({ record: obj }, raw === true ? { raw: this.state.rawBuffer.toString() } : {}, info === true ? { info: this.state.info } : {})); + + if (_err6) { + return _err6; + } } else { - this.push(obj); + var _err7 = this.__push(obj); + + if (_err7) { + return _err7; + } } } else { if (raw === true || info === true) { - this.push(Object.assign({ + var _err8 = this.__push(Object.assign({ record: [obj[objname], obj] }, raw === true ? { raw: this.state.rawBuffer.toString() } : {}, info === true ? { info: this.state.info } : {})); + + if (_err8) { + return _err8; + } } else { - this.push([obj[objname], obj]); + var _err9 = this.__push([obj[objname], obj]); + + if (_err9) { + return _err9; + } } } } else { if (raw === true || info === true) { - this.push(Object.assign({ + var _err10 = this.__push(Object.assign({ record: record }, raw === true ? { raw: this.state.rawBuffer.toString() } : {}, info === true ? { info: this.state.info } : {})); + + if (_err10) { + return _err10; + } } else { - this.push(record); + var _err11 = this.__push(record); + + if (_err11) { + return _err11; + } } } } @@ -9540,9 +9644,10 @@ function (_Transform) { max_record_size = _this$options3.max_record_size; var _this$state3 = this.state, enabled = _this$state3.enabled, - wasQuoting = _this$state3.wasQuoting; // Deal with from_to options + wasQuoting = _this$state3.wasQuoting; // Short circuit for the from_line options - if (this.options.columns !== true && enabled === false) { + if (enabled === false) { + /* this.options.columns !== true && */ return this.__resetField(); } @@ -9575,6 +9680,27 @@ function (_Transform) { value: function __resetField() { this.state.field.reset(); this.state.wasQuoting = false; + } + }, { + key: "__push", + value: function __push(record) { + var on_record = this.options.on_record; + + if (on_record !== undefined) { + var context = this.__context(); + + try { + record = on_record.call(null, record, context); + } catch (err) { + return err; + } + + if (record === undefined || record === null) { + return; + } + } + + this.push(record); } // Return a tuple with the error and the casted value }, { @@ -9660,14 +9786,20 @@ function (_Transform) { key: "__isDelimiter", value: function __isDelimiter(chr, buf, pos) { var delimiter = this.options.delimiter; - var delLength = delimiter.length; - if (delimiter[0] !== chr) return 0; - for (var i = 1; i < delLength; i++) { - if (delimiter[i] !== buf[pos + i]) return 0; + loop1: for (var i = 0; i < delimiter.length; i++) { + var del = delimiter[i]; + + if (del[0] === chr) { + for (var j = 1; j < del.length; j++) { + if (del[j] !== buf[pos + j]) continue loop1; + } + + return del.length; + } } - return delimiter.length; + return 0; } }, { key: "__isRecordDelimiter", @@ -9737,7 +9869,7 @@ function (_Transform) { var columns = this.options.columns; var isColumns = Array.isArray(columns); return { - column: isColumns === true ? columns.length >= this.state.record.length ? columns[this.state.record.length].name : null : this.state.record.length, + column: isColumns === true ? columns.length > this.state.record.length ? columns[this.state.record.length].name : null : this.state.record.length, empty_lines: this.info.empty_lines, header: columns === true, index: this.state.record.length, @@ -9767,7 +9899,7 @@ var parse = function parse() { } else if (callback === undefined && type === 'function') { callback = argument; } else { - throw new Error("Invalid argument: got ".concat(JSON.stringify(argument), " at index ").concat(i)); + throw new CsvError('CSV_INVALID_ARGUMENT', ['Invalid argument:', "got ".concat(JSON.stringify(argument), " at index ").concat(i)]); } } @@ -9795,16 +9927,22 @@ var parse = function parse() { } if (data !== undefined) { - parser.write(data); - parser.end(); + // Give a chance for events to be registered later + if (typeof setImmediate === 'function') { + setImmediate(function () { + parser.write(data); + parser.end(); + }); + } else { + parser.write(data); + parser.end(); + } } return parser; }; -var CsvError = -/*#__PURE__*/ -function (_Error) { +var CsvError = /*#__PURE__*/function (_Error) { _inherits(CsvError, _Error); function CsvError(code, message) { @@ -9813,8 +9951,12 @@ function (_Error) { _classCallCheck(this, CsvError); if (Array.isArray(message)) message = message.join(' '); - _this2 = _possibleConstructorReturn(this, _getPrototypeOf(CsvError).call(this, [message])); - Error.captureStackTrace(_assertThisInitialized(_this2), CsvError); + _this2 = _possibleConstructorReturn(this, _getPrototypeOf(CsvError).call(this, message)); + + if (Error.captureStackTrace !== undefined) { + Error.captureStackTrace(_assertThisInitialized(_this2), CsvError); + } + _this2.code = code; for (var _len = arguments.length, contexts = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { @@ -9825,8 +9967,8 @@ function (_Error) { var context = _contexts[_i2]; for (var key in context) { - var value = Buffer.isBuffer(context[key]) ? context[key].toString() : context[key]; - _this2[key] = JSON.parse(JSON.stringify(value)); + var value = context[key]; + _this2[key] = Buffer.isBuffer(value) ? value.toString() : value == null ? value : JSON.parse(JSON.stringify(value)); } } @@ -9834,7 +9976,7 @@ function (_Error) { } return CsvError; -}(_wrapNativeSuper(Error)); +}( /*#__PURE__*/_wrapNativeSuper(Error)); parse.Parser = Parser; parse.CsvError = CsvError; @@ -9850,10 +9992,16 @@ var isObject = function isObject(obj) { return _typeof(obj) === 'object' && obj !== null && !Array.isArray(obj); }; +var isRecordEmpty = function isRecordEmpty(record) { + return record.every(function (field) { + return field == null || field.toString && field.toString().trim() === ''; + }); +}; + var normalizeColumnsArray = function normalizeColumnsArray(columns) { var normalizedColumns = []; - for (var i = 0; i < columns.length; i++) { + for (var i = 0, l = columns.length; i < l; i++) { var column = columns[i]; if (column === undefined || column === null || column === false) { @@ -9866,20 +10014,20 @@ var normalizeColumnsArray = function normalizeColumnsArray(columns) { }; } else if (isObject(column)) { if (typeof column.name !== 'string') { - throw new Error("Invalid Option columns: property \"name\" is required at position ".concat(i, " when column is an object literal")); + throw new CsvError('CSV_OPTION_COLUMNS_MISSING_NAME', ['Option columns missing name:', "property \"name\" is required at position ".concat(i), 'when column is an object literal']); } normalizedColumns[i] = column; } else { - throw new Error("Invalid Option columns: expect a string or an object, got ".concat(JSON.stringify(column), " at position ").concat(i)); + throw new CsvError('CSV_INVALID_COLUMN_DEFINITION', ['Invalid column definition:', 'expect a string or a literal object,', "got ".concat(JSON.stringify(column), " at position ").concat(i)]); } } return normalizedColumns; }; -}).call(this,require("buffer").Buffer) +}).call(this,require("buffer").Buffer,require("timers").setImmediate) -},{"./ResizeableBuffer":32,"buffer":30,"stream":67}],34:[function(require,module,exports){ +},{"./ResizeableBuffer":32,"buffer":30,"stream":68,"timers":85}],34:[function(require,module,exports){ (function (Buffer){ "use strict"; @@ -9896,6 +10044,10 @@ module.exports = function (data) { var parser = new parse.Parser(options); parser.push = function (record) { + if (record === null) { + return; + } + if (options.objname === undefined) records.push(record);else { records[record[0]] = record[1]; } @@ -9913,358 +10065,665 @@ module.exports = function (data) { }).call(this,require("buffer").Buffer) },{".":33,"buffer":30}],35:[function(require,module,exports){ -(function (process){ -// Generated by CoffeeScript 1.12.7 -var Stringifier, get, stream, util; +(function (Buffer,setImmediate){ -stream = require('stream'); - -util = require('util'); +/* +CSV Stringify -get = require('lodash.get'); +Please look at the [project documentation](https://csv.js.org/stringify/) for +additional information. +*/ -module.exports = function() { - var callback, chunks, data, options, stringifier; - if (arguments.length === 3) { - data = arguments[0]; - options = arguments[1]; - callback = arguments[2]; - } else if (arguments.length === 2) { - if (Array.isArray(arguments[0])) { - data = arguments[0]; - } else { - options = arguments[0]; +const { Transform } = require('stream') +const bom_utf8 = Buffer.from([239, 187, 191]) + +class Stringifier extends Transform { + constructor(opts = {}){ + super({...{writableObjectMode: true}, ...opts}) + const options = {} + let err + // Merge with user options + for(let opt in opts){ + options[underscore(opt)] = opts[opt] + } + if(err = this.normalize(options)) throw err + switch(options.record_delimiter){ + case 'auto': + options.record_delimiter = null + break + case 'unix': + options.record_delimiter = "\n" + break + case 'mac': + options.record_delimiter = "\r" + break + case 'windows': + options.record_delimiter = "\r\n" + break + case 'ascii': + options.record_delimiter = "\u001e" + break + case 'unicode': + options.record_delimiter = "\u2028" + break } - if (typeof arguments[1] === 'function') { - callback = arguments[1]; - } else { - options = arguments[1]; + // Expose options + this.options = options + // Internal state + this.state = { + stop: false } - } else if (arguments.length === 1) { - if (typeof arguments[0] === 'function') { - callback = arguments[0]; - } else if (Array.isArray(arguments[0])) { - data = arguments[0]; - } else { - options = arguments[0]; + // Information + this.info = { + records: 0 } - } - if (options == null) { - options = {}; - } - stringifier = new Stringifier(options); - if (data) { - process.nextTick(function() { - var d, j, len; - for (j = 0, len = data.length; j < len; j++) { - d = data[j]; - stringifier.write(d); + if(options.bom === true){ + this.push(bom_utf8) + } + this + } + normalize(options){ + // Normalize option `bom` + if(options.bom === undefined || options.bom === null || options.bom === false){ + options.bom = false + }else if(options.bom !== true){ + return new CsvError('CSV_OPTION_BOOLEAN_INVALID_TYPE', [ + 'option `bom` is optional and must be a boolean value,', + `got ${JSON.stringify(options.bom)}` + ]) + } + // Normalize option `delimiter` + if(options.delimiter === undefined || options.delimiter === null){ + options.delimiter = ',' + }else if(Buffer.isBuffer(options.delimiter)){ + options.delimiter = options.delimiter.toString() + }else if(typeof options.delimiter !== 'string'){ + return new CsvError('CSV_OPTION_DELIMITER_INVALID_TYPE', [ + 'option `delimiter` must be a buffer or a string,', + `got ${JSON.stringify(options.delimiter)}` + ]) + } + // Normalize option `quote` + if(options.quote === undefined || options.quote === null){ + options.quote = '"' + }else if(options.quote === true){ + options.quote = '"' + }else if(options.quote === false){ + options.quote = '' + }else if (Buffer.isBuffer(options.quote)){ + options.quote = options.quote.toString() + }else if(typeof options.quote !== 'string'){ + return new CsvError('CSV_OPTION_QUOTE_INVALID_TYPE', [ + 'option `quote` must be a boolean, a buffer or a string,', + `got ${JSON.stringify(options.quote)}` + ]) + } + // Normalize option `quoted` + if(options.quoted === undefined || options.quoted === null){ + options.quoted = false + }else{ + // todo + } + // Normalize option `quoted_empty` + if(options.quoted_empty === undefined || options.quoted_empty === null){ + options.quoted_empty = undefined + }else{ + // todo + } + // Normalize option `quoted_match` + if(options.quoted_match === undefined || options.quoted_match === null || options.quoted_match === false){ + options.quoted_match = null + }else if(!Array.isArray(options.quoted_match)){ + options.quoted_match = [options.quoted_match] + } + if(options.quoted_match){ + for(let quoted_match of options.quoted_match){ + const isString = typeof quoted_match === 'string' + const isRegExp = quoted_match instanceof RegExp + if(!isString && !isRegExp){ + return Error(`Invalid Option: quoted_match must be a string or a regex, got ${JSON.stringify(quoted_match)}`) + } } - return stringifier.end(); - }); + } + // Normalize option `quoted_string` + if(options.quoted_string === undefined || options.quoted_string === null){ + options.quoted_string = false + }else{ + // todo + } + // Normalize option `eof` + if(options.eof === undefined || options.eof === null){ + options.eof = true + }else{ + // todo + } + // Normalize option `escape` + if(options.escape === undefined || options.escape === null){ + options.escape = '"' + }else if(Buffer.isBuffer(options.escape)){ + options.escape = options.escape.toString() + }else if(typeof options.escape !== 'string'){ + return Error(`Invalid Option: escape must be a buffer or a string, got ${JSON.stringify(options.escape)}`) + } + if (options.escape.length > 1){ + return Error(`Invalid Option: escape must be one character, got ${options.escape.length} characters`) + } + // Normalize option `header` + if(options.header === undefined || options.header === null){ + options.header = false + }else{ + // todo + } + // Normalize option `columns` + options.columns = this.normalize_columns(options.columns) + // Normalize option `quoted` + if(options.quoted === undefined || options.quoted === null){ + options.quoted = false + }else{ + // todo + } + // Normalize option `cast` + if(options.cast === undefined || options.cast === null){ + options.cast = {} + }else{ + // todo + } + // Normalize option cast.bigint + if(options.cast.bigint === undefined || options.cast.bigint === null){ + // Cast boolean to string by default + options.cast.bigint = value => '' + value + } + // Normalize option cast.boolean + if(options.cast.boolean === undefined || options.cast.boolean === null){ + // Cast boolean to string by default + options.cast.boolean = value => value ? '1' : '' + } + // Normalize option cast.date + if(options.cast.date === undefined || options.cast.date === null){ + // Cast date to timestamp string by default + options.cast.date = value => '' + value.getTime() + } + // Normalize option cast.number + if(options.cast.number === undefined || options.cast.number === null){ + // Cast number to string using native casting by default + options.cast.number = value => '' + value + } + // Normalize option cast.object + if(options.cast.object === undefined || options.cast.object === null){ + // Stringify object as JSON by default + options.cast.object = value => JSON.stringify(value) + } + // Normalize option cast.string + if(options.cast.string === undefined || options.cast.string === null){ + // Leave string untouched + options.cast.string = function(value){return value} + } + // Normalize option `record_delimiter` + if(options.record_delimiter === undefined || options.record_delimiter === null){ + options.record_delimiter = '\n' + }else if(Buffer.isBuffer(options.record_delimiter)){ + options.record_delimiter = options.record_delimiter.toString() + }else if(typeof options.record_delimiter !== 'string'){ + return Error(`Invalid Option: record_delimiter must be a buffer or a string, got ${JSON.stringify(options.record_delimiter)}`) + } + } + _transform(chunk, encoding, callback){ + if(this.state.stop === true){ + return + } + // Chunk validation + if(!Array.isArray(chunk) && typeof chunk !== 'object'){ + this.state.stop = true + return callback(Error(`Invalid Record: expect an array or an object, got ${JSON.stringify(chunk)}`)) + } + // Detect columns from the first record + if(this.info.records === 0){ + if(Array.isArray(chunk)){ + if(this.options.header === true && !this.options.columns){ + this.state.stop = true + return callback(Error('Undiscoverable Columns: header option requires column option or object records')) + } + }else if(this.options.columns === undefined || this.options.columns === null){ + this.options.columns = this.normalize_columns(Object.keys(chunk)) + } + } + // Emit the header + if(this.info.records === 0){ + this.headers() + } + // Emit and stringify the record if an object or an array + try{ + this.emit('record', chunk, this.info.records) + }catch(err){ + this.state.stop = true + return this.emit('error', err) + } + // Convert the record into a string + if(this.options.eof){ + chunk = this.stringify(chunk) + if(chunk === undefined){ + return + }else{ + chunk = chunk + this.options.record_delimiter + } + }else{ + chunk = this.stringify(chunk) + if(chunk === undefined){ + return + }else{ + if(this.options.header || this.info.records){ + chunk = this.options.record_delimiter + chunk + } + } + } + // Emit the csv + this.info.records++ + this.push(chunk) + callback() + null + } + _flush(callback){ + if(this.info.records === 0){ + this.headers() + } + callback() + null + } + stringify(chunk, chunkIsHeader=false){ + if(typeof chunk !== 'object'){ + return chunk + } + const {columns, header} = this.options + const record = [] + // Record is an array + if(Array.isArray(chunk)){ + // We are getting an array but the user has specified output columns. In + // this case, we respect the columns indexes + if(columns){ + chunk.splice(columns.length) + } + // Cast record elements + for(let i=0; i= 0 + const containsQuote = (quote !== '') && value.indexOf(quote) >= 0 + const containsEscape = value.indexOf(escape) >= 0 && (escape !== quote) + const containsRecordDelimiter = value.indexOf(record_delimiter) >= 0 + const quotedString = quoted_string && typeof field === 'string' + let quotedMatch = quoted_match && quoted_match.filter( quoted_match => { + if(typeof quoted_match === 'string'){ + return value.indexOf(quoted_match) !== -1 + }else{ + return quoted_match.test(value) + } + }) + quotedMatch = quotedMatch && quotedMatch.length > 0 + const shouldQuote = containsQuote === true || containsdelimiter || containsRecordDelimiter || quoted || quotedString || quotedMatch + if(shouldQuote === true && containsEscape === true){ + const regexp = escape === '\\' + ? new RegExp(escape + escape, 'g') + : new RegExp(escape, 'g') + value = value.replace(regexp, escape + escape) + } + if(containsQuote === true){ + const regexp = new RegExp(quote,'g') + value = value.replace(regexp, escape + quote) + } + if(shouldQuote === true){ + value = quote + value + quote + } + csvrecord += value + }else if(quoted_empty === true || (field === '' && quoted_string === true && quoted_empty !== false)){ + csvrecord += quote + quote + } + if(i !== record.length - 1){ + csvrecord += delimiter + } + } + return csvrecord } - if (callback) { - chunks = []; - stringifier.on('readable', function() { - var chunk, results; - results = []; - while (chunk = stringifier.read()) { - results.push(chunks.push(chunk)); + headers(){ + if(this.options.header === false){ + return + } + if(this.options.columns === undefined){ + return + } + let headers = this.options.columns.map(column => column.header) + if(this.options.eof){ + headers = this.stringify(headers, true) + this.options.record_delimiter + }else{ + headers = this.stringify(headers) + } + this.push(headers) + } + __cast(value, context){ + const type = typeof value + try{ + if(type === 'string'){ // Fine for 99% of the cases + return [undefined, this.options.cast.string(value, context)] + }else if(type === 'bigint'){ + return [undefined, this.options.cast.bigint(value, context)] + }else if(type === 'number'){ + return [undefined, this.options.cast.number(value, context)] + }else if(type === 'boolean'){ + return [undefined, this.options.cast.boolean(value, context)] + }else if(value instanceof Date){ + return [undefined, this.options.cast.date(value, context)] + }else if(type === 'object' && value !== null){ + return [undefined, this.options.cast.object(value, context)] + }else{ + return [undefined, value, value] + } + }catch(err){ + return [err] + } + } + normalize_columns(columns){ + if(columns === undefined || columns === null){ + return undefined + } + if(typeof columns !== 'object'){ + throw Error('Invalid option "columns": expect an array or an object') + } + if(!Array.isArray(columns)){ + const newcolumns = [] + for(let k in columns){ + newcolumns.push({ + key: k, + header: columns[k] + }) } - return results; - }); - stringifier.on('error', function(err) { - return callback(err); - }); - stringifier.on('end', function() { - return callback(null, chunks.join('')); - }); + columns = newcolumns + }else{ + const newcolumns = [] + for(let column of columns){ + if(typeof column === 'string'){ + newcolumns.push({ + key: column, + header: column + }) + }else if(typeof column === 'object' && column !== undefined && !Array.isArray(column)){ + if(!column.key){ + throw Error('Invalid column definition: property "key" is required') + } + if(column.header === undefined){ + column.header = column.key + } + newcolumns.push(column) + }else{ + throw Error('Invalid column definition: expect a string or an object') + } + } + columns = newcolumns + } + return columns } - return stringifier; -}; +} -Stringifier = function(opts) { - var base, base1, base10, base11, base12, base13, base2, base3, base4, base5, base6, base7, base8, base9, k, options, v; - if (opts == null) { - opts = {}; - } - options = {}; - for (k in opts) { - v = opts[k]; - options[k] = v; +const stringify = function(){ + let data, options, callback + for(let i in arguments){ + const argument = arguments[i] + const type = typeof argument + if(data === undefined && (Array.isArray(argument))){ + data = argument + }else if(options === undefined && isObject(argument)){ + options = argument + }else if(callback === undefined && type === 'function'){ + callback = argument + }else{ + throw new CsvError('CSV_INVALID_ARGUMENT', [ + 'Invalid argument:', + `got ${JSON.stringify(argument)} at index ${i}` + ]) + } } - stream.Transform.call(this, options); - this.options = options; - if ((base = this.options).delimiter == null) { - base.delimiter = ','; + const stringifier = new Stringifier(options) + if(callback){ + const chunks = [] + stringifier.on('readable', function(){ + let chunk + while((chunk = this.read()) !== null){ + chunks.push(chunk) + } + }) + stringifier.on('error', function(err){ + callback(err) + }) + stringifier.on('end', function(){ + callback(undefined, chunks.join('')) + }) } - if ((base1 = this.options).quote == null) { - base1.quote = '"'; + if(data !== undefined){ + // Give a chance for events to be registered later + if(typeof setImmediate === 'function'){ + setImmediate(function(){ + for(let record of data){ + stringifier.write(record) + } + stringifier.end() + }) + }else{ + for(let record of data){ + stringifier.write(record) + } + stringifier.end() + } } - if ((base2 = this.options).quoted == null) { - base2.quoted = false; + return stringifier +} + +class CsvError extends Error { + constructor(code, message, ...contexts) { + if(Array.isArray(message)) message = message.join(' ') + super(message) + if(Error.captureStackTrace !== undefined){ + Error.captureStackTrace(this, CsvError) + } + this.code = code + for(const context of contexts){ + for(const key in context){ + const value = context[key] + this[key] = Buffer.isBuffer(value) ? value.toString() : value == null ? value : JSON.parse(JSON.stringify(value)) + } + } } - if ((base3 = this.options).quotedEmpty == null) { - base3.quotedEmpty = void 0; +} + +stringify.Stringifier = Stringifier + +stringify.CsvError = CsvError + +module.exports = stringify + +const isObject = function(obj){ + return typeof obj === 'object' && obj !== null && ! Array.isArray(obj) +} + +const underscore = function(str){ + return str.replace(/([A-Z])/g, function(_, match){ + return '_' + match.toLowerCase() + }) +} + +// Lodash implementation of `get` + +const charCodeOfDot = '.'.charCodeAt(0) +const reEscapeChar = /\\(\\)?/g +const rePropName = RegExp( + // Match anything that isn't a dot or bracket. + '[^.[\\]]+' + '|' + + // Or match property names within brackets. + '\\[(?:' + + // Match a non-string expression. + '([^"\'][^[]*)' + '|' + + // Or match strings (supports escaping characters). + '(["\'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2' + + ')\\]'+ '|' + + // Or match "" as the space between consecutive dots or empty brackets. + '(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))' +, 'g') +const reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/ +const reIsPlainProp = /^\w*$/ +const getTag = function(value){ + if(!value) + value === undefined ? '[object Undefined]' : '[object Null]' + return Object.prototype.toString.call(value) +} +const isKey = function(value, object){ + if(Array.isArray(value)){ + return false } - if ((base4 = this.options).quotedString == null) { - base4.quotedString = false; + const type = typeof value + if(type === 'number' || type === 'symbol' || type === 'boolean' || !value || isSymbol(value)){ + return true } - if ((base5 = this.options).eof == null) { - base5.eof = true; + return reIsPlainProp.test(value) || !reIsDeepProp.test(value) || + (object != null && value in Object(object)) +} +const isSymbol = function(value){ + const type = typeof value + return type === 'symbol' || (type === 'object' && value && getTag(value) === '[object Symbol]') +} +const stringToPath = function(string){ + const result = [] + if(string.charCodeAt(0) === charCodeOfDot){ + result.push('') } - if ((base6 = this.options).escape == null) { - base6.escape = '"'; + string.replace(rePropName, function(match, expression, quote, subString){ + let key = match + if(quote){ + key = subString.replace(reEscapeChar, '$1') + }else if(expression){ + key = expression.trim() + } + result.push(key) + }) + return result +} +const castPath = function(value, object){ + if(Array.isArray(value)){ + return value + } else { + return isKey(value, object) ? [value] : stringToPath(value) } - if ((base7 = this.options).columns == null) { - base7.columns = null; - } - if ((base8 = this.options).header == null) { - base8.header = false; - } - if ((base9 = this.options).formatters == null) { - base9.formatters = {}; - } - if ((base10 = this.options.formatters).date == null) { - base10.date = function(value) { - return '' + value.getTime(); - }; - } - if ((base11 = this.options.formatters).bool == null) { - base11.bool = function(value) { - if (value) { - return '1'; - } else { - return ''; - } - }; - } - if ((base12 = this.options.formatters).object == null) { - base12.object = function(value) { - return JSON.stringify(value); - }; - } - if ((base13 = this.options).rowDelimiter == null) { - base13.rowDelimiter = '\n'; - } - if (this.countWriten == null) { - this.countWriten = 0; - } - switch (this.options.rowDelimiter) { - case 'auto': - this.options.rowDelimiter = null; - break; - case 'unix': - this.options.rowDelimiter = "\n"; - break; - case 'mac': - this.options.rowDelimiter = "\r"; - break; - case 'windows': - this.options.rowDelimiter = "\r\n"; - break; - case 'unicode': - this.options.rowDelimiter = "\u2028"; - } - return this; -}; - -util.inherits(Stringifier, stream.Transform); - -module.exports.Stringifier = Stringifier; - -Stringifier.prototype.headers = function() { - var k, label, labels; - if (!this.options.header) { - return; - } - if (!this.options.columns) { - return; - } - labels = this.options.columns; - if (typeof labels === 'object') { - labels = (function() { - var results; - results = []; - for (k in labels) { - label = labels[k]; - results.push(label); - } - return results; - })(); - } - if (this.options.eof) { - labels = this.stringify(labels) + this.options.rowDelimiter; - } else { - labels = this.stringify(labels); - } - return stream.Transform.prototype.write.call(this, labels); -}; - -Stringifier.prototype.end = function(chunk, encoding, callback) { - if (this.countWriten === 0) { - this.headers(); - } - return stream.Transform.prototype.end.apply(this, arguments); -}; - -Stringifier.prototype.write = function(chunk, encoding, callback) { - var base, e, preserve; - if (chunk == null) { - return; - } - preserve = typeof chunk !== 'object'; - if (!preserve) { - if (this.countWriten === 0 && !Array.isArray(chunk)) { - if ((base = this.options).columns == null) { - base.columns = Object.keys(chunk); - } - } - try { - this.emit('record', chunk, this.countWriten); - } catch (error) { - e = error; - return this.emit('error', e); - } - if (this.options.eof) { - chunk = this.stringify(chunk) + this.options.rowDelimiter; - } else { - chunk = this.stringify(chunk); - if (this.options.header || this.countWriten) { - chunk = this.options.rowDelimiter + chunk; - } - } - } - if (typeof chunk === 'number') { - chunk = "" + chunk; - } - if (this.countWriten === 0) { - this.headers(); - } - if (!preserve) { - this.countWriten++; - } - return stream.Transform.prototype.write.call(this, chunk, encoding, callback); -}; - -Stringifier.prototype._transform = function(chunk, encoding, callback) { - this.push(chunk); - return callback(); -}; - -Stringifier.prototype.stringify = function(line) { - var _line, column, columns, containsEscape, containsLinebreak, containsQuote, containsdelimiter, delimiter, escape, field, i, j, l, newLine, quote, ref, ref1, regexp, shouldQuote, value; - if (typeof line !== 'object') { - return line; - } - columns = this.options.columns; - if (typeof columns === 'object' && columns !== null && !Array.isArray(columns)) { - columns = Object.keys(columns); - } - delimiter = this.options.delimiter; - quote = this.options.quote; - escape = this.options.escape; - if (!Array.isArray(line)) { - _line = []; - if (columns) { - for (i = j = 0, ref = columns.length; 0 <= ref ? j < ref : j > ref; i = 0 <= ref ? ++j : --j) { - column = columns[i]; - value = get(line, column); - _line[i] = (typeof value === 'undefined' || value === null) ? '' : value; - } - } else { - for (column in line) { - _line.push(line[column]); - } - } - line = _line; - _line = null; - } else if (columns) { - line.splice(columns.length); - } - if (Array.isArray(line)) { - newLine = ''; - for (i = l = 0, ref1 = line.length; 0 <= ref1 ? l < ref1 : l > ref1; i = 0 <= ref1 ? ++l : --l) { - field = line[i]; - if (typeof field === 'string') { - - } else if (typeof field === 'number') { - field = '' + field; - } else if (typeof field === 'boolean') { - field = this.options.formatters.bool(field); - } else if (field instanceof Date) { - field = this.options.formatters.date(field); - } else if (typeof field === 'object' && field !== null) { - field = this.options.formatters.object(field); - } - if (field) { - containsdelimiter = field.indexOf(delimiter) >= 0; - containsQuote = field.indexOf(quote) >= 0; - containsEscape = field.indexOf(escape) >= 0 && (escape !== quote); - containsLinebreak = field.indexOf('\r') >= 0 || field.indexOf('\n') >= 0; - shouldQuote = containsQuote || containsdelimiter || containsLinebreak || this.options.quoted || (this.options.quotedString && typeof line[i] === 'string'); - if (shouldQuote && containsEscape) { - regexp = escape === '\\' ? new RegExp(escape + escape, 'g') : new RegExp(escape, 'g'); - field = field.replace(regexp, escape + escape); - } - if (containsQuote) { - regexp = new RegExp(quote, 'g'); - field = field.replace(regexp, escape + quote); - } - if (shouldQuote) { - field = quote + field + quote; - } - newLine += field; - } else if (this.options.quotedEmpty || ((this.options.quotedEmpty == null) && line[i] === '' && this.options.quotedString)) { - newLine += quote + quote; - } - if (i !== line.length - 1) { - newLine += delimiter; - } - } - line = newLine; +} +const toKey = function(value){ + if(typeof value === 'string' || isSymbol(value)) + return value + const result = `${value}` + return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result +} +const get = function(object, path){ + path = castPath(path, object) + let index = 0 + const length = path.length + while(object != null && index < length){ + object = object[toKey(path[index++])] } - return line; -}; + return (index && index === length) ? object : undefined +} -}).call(this,require('_process')) +}).call(this,require("buffer").Buffer,require("timers").setImmediate) -},{"_process":46,"lodash.get":42,"stream":67,"util":72}],36:[function(require,module,exports){ +},{"buffer":30,"stream":68,"timers":85}],36:[function(require,module,exports){ (function (Buffer){ -// Generated by CoffeeScript 1.12.7 -var StringDecoder, stringify; - -StringDecoder = require('string_decoder').StringDecoder; -stringify = require('./index'); +const stringify = require('.') +const {StringDecoder} = require('string_decoder') -module.exports = function(records, options) { - var data, decoder, i, len, record, stringifier; - if (options == null) { - options = {}; - } - data = []; - if (records instanceof Buffer) { - decoder = new StringDecoder(); - records = decoder.write(records); +module.exports = function(records, options={}){ + const data = [] + if(Buffer.isBuffer(records)){ + const decoder = new StringDecoder() + records = decoder.write(records) } - stringifier = new stringify.Stringifier(options); - stringifier.push = function(record) { - if (record) { - return data.push(record.toString()); + const stringifier = new stringify.Stringifier(options) + stringifier.push = function(record){ + if(record){ + data.push(record.toString()) } - }; - for (i = 0, len = records.length; i < len; i++) { - record = records[i]; - stringifier.write(record); } - stringifier.end(); - return data.join(''); -}; + for(let record of records){ + stringifier.write(record) + } + stringifier.end() + return data.join('') +} -}).call(this,require("buffer").Buffer) +}).call(this,{"isBuffer":require("../../is-buffer/index.js")}) -},{"./index":35,"buffer":30,"string_decoder":68}],37:[function(require,module,exports){ +},{".":35,"../../is-buffer/index.js":40,"string_decoder":83}],37:[function(require,module,exports){ // Copyright Joyent, Inc. and other Node contributors. // // Permission is hereby granted, free of charge, to any person obtaining a @@ -10879,24 +11338,28 @@ exports.write = function (buffer, value, offset, isLE, mLen, nBytes) { if (typeof Object.create === 'function') { // implementation from standard node.js 'util' module module.exports = function inherits(ctor, superCtor) { - ctor.super_ = superCtor - ctor.prototype = Object.create(superCtor.prototype, { - constructor: { - value: ctor, - enumerable: false, - writable: true, - configurable: true - } - }); + if (superCtor) { + ctor.super_ = superCtor + ctor.prototype = Object.create(superCtor.prototype, { + constructor: { + value: ctor, + enumerable: false, + writable: true, + configurable: true + } + }) + } }; } else { // old school shim for old browsers module.exports = function inherits(ctor, superCtor) { - ctor.super_ = superCtor - var TempCtor = function () {} - TempCtor.prototype = superCtor.prototype - ctor.prototype = new TempCtor() - ctor.prototype.constructor = ctor + if (superCtor) { + ctor.super_ = superCtor + var TempCtor = function () {} + TempCtor.prototype = superCtor.prototype + ctor.prototype = new TempCtor() + ctor.prototype.constructor = ctor + } } } @@ -10933,1561 +11396,625 @@ module.exports = Array.isArray || function (arr) { },{}],42:[function(require,module,exports){ (function (global){ /** - * lodash (Custom Build) - * Build: `lodash modularize exports="npm" -o ./` - * Copyright jQuery Foundation and other contributors + * @license + * Lodash (Custom Build) + * Build: `lodash core -o ./dist/lodash.core.js` + * Copyright OpenJS Foundation and other contributors * Released under MIT license * Based on Underscore.js 1.8.3 * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors */ +;(function() { -/** Used as the `TypeError` message for "Functions" methods. */ -var FUNC_ERROR_TEXT = 'Expected a function'; - -/** Used to stand-in for `undefined` hash values. */ -var HASH_UNDEFINED = '__lodash_hash_undefined__'; - -/** Used as references for various `Number` constants. */ -var INFINITY = 1 / 0; - -/** `Object#toString` result references. */ -var funcTag = '[object Function]', - genTag = '[object GeneratorFunction]', - symbolTag = '[object Symbol]'; - -/** Used to match property names within property paths. */ -var reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/, - reIsPlainProp = /^\w*$/, - reLeadingDot = /^\./, - rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g; - -/** - * Used to match `RegExp` - * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns). - */ -var reRegExpChar = /[\\^$.*+?()[\]{}|]/g; - -/** Used to match backslashes in property paths. */ -var reEscapeChar = /\\(\\)?/g; + /** Used as a safe reference for `undefined` in pre-ES5 environments. */ + var undefined; -/** Used to detect host constructors (Safari). */ -var reIsHostCtor = /^\[object .+?Constructor\]$/; + /** Used as the semantic version number. */ + var VERSION = '4.17.15'; -/** Detect free variable `global` from Node.js. */ -var freeGlobal = typeof global == 'object' && global && global.Object === Object && global; + /** Error message constants. */ + var FUNC_ERROR_TEXT = 'Expected a function'; -/** Detect free variable `self`. */ -var freeSelf = typeof self == 'object' && self && self.Object === Object && self; + /** Used to compose bitmasks for value comparisons. */ + var COMPARE_PARTIAL_FLAG = 1, + COMPARE_UNORDERED_FLAG = 2; -/** Used as a reference to the global object. */ -var root = freeGlobal || freeSelf || Function('return this')(); + /** Used to compose bitmasks for function metadata. */ + var WRAP_BIND_FLAG = 1, + WRAP_PARTIAL_FLAG = 32; -/** - * Gets the value at `key` of `object`. - * - * @private - * @param {Object} [object] The object to query. - * @param {string} key The key of the property to get. - * @returns {*} Returns the property value. - */ -function getValue(object, key) { - return object == null ? undefined : object[key]; -} + /** Used as references for various `Number` constants. */ + var INFINITY = 1 / 0, + MAX_SAFE_INTEGER = 9007199254740991; -/** - * Checks if `value` is a host object in IE < 9. - * - * @private - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a host object, else `false`. - */ -function isHostObject(value) { - // Many host objects are `Object` objects that can coerce to strings - // despite having improperly defined `toString` methods. - var result = false; - if (value != null && typeof value.toString != 'function') { - try { - result = !!(value + ''); - } catch (e) {} - } - return result; -} + /** `Object#toString` result references. */ + var argsTag = '[object Arguments]', + arrayTag = '[object Array]', + asyncTag = '[object AsyncFunction]', + boolTag = '[object Boolean]', + dateTag = '[object Date]', + errorTag = '[object Error]', + funcTag = '[object Function]', + genTag = '[object GeneratorFunction]', + numberTag = '[object Number]', + objectTag = '[object Object]', + proxyTag = '[object Proxy]', + regexpTag = '[object RegExp]', + stringTag = '[object String]'; -/** Used for built-in method references. */ -var arrayProto = Array.prototype, - funcProto = Function.prototype, - objectProto = Object.prototype; + /** Used to match HTML entities and HTML characters. */ + var reUnescapedHtml = /[&<>"']/g, + reHasUnescapedHtml = RegExp(reUnescapedHtml.source); -/** Used to detect overreaching core-js shims. */ -var coreJsData = root['__core-js_shared__']; + /** Used to detect unsigned integer values. */ + var reIsUint = /^(?:0|[1-9]\d*)$/; -/** Used to detect methods masquerading as native. */ -var maskSrcKey = (function() { - var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || ''); - return uid ? ('Symbol(src)_1.' + uid) : ''; -}()); + /** Used to map characters to HTML entities. */ + var htmlEscapes = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + "'": ''' + }; -/** Used to resolve the decompiled source of functions. */ -var funcToString = funcProto.toString; + /** Detect free variable `global` from Node.js. */ + var freeGlobal = typeof global == 'object' && global && global.Object === Object && global; -/** Used to check objects for own properties. */ -var hasOwnProperty = objectProto.hasOwnProperty; + /** Detect free variable `self`. */ + var freeSelf = typeof self == 'object' && self && self.Object === Object && self; -/** - * Used to resolve the - * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring) - * of values. - */ -var objectToString = objectProto.toString; + /** Used as a reference to the global object. */ + var root = freeGlobal || freeSelf || Function('return this')(); -/** Used to detect if a method is native. */ -var reIsNative = RegExp('^' + - funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\$&') - .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$' -); + /** Detect free variable `exports`. */ + var freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports; -/** Built-in value references. */ -var Symbol = root.Symbol, - splice = arrayProto.splice; + /** Detect free variable `module`. */ + var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module; -/* Built-in method references that are verified to be native. */ -var Map = getNative(root, 'Map'), - nativeCreate = getNative(Object, 'create'); + /*--------------------------------------------------------------------------*/ -/** Used to convert symbols to primitives and strings. */ -var symbolProto = Symbol ? Symbol.prototype : undefined, - symbolToString = symbolProto ? symbolProto.toString : undefined; + /** + * Appends the elements of `values` to `array`. + * + * @private + * @param {Array} array The array to modify. + * @param {Array} values The values to append. + * @returns {Array} Returns `array`. + */ + function arrayPush(array, values) { + array.push.apply(array, values); + return array; + } -/** - * Creates a hash object. - * - * @private - * @constructor - * @param {Array} [entries] The key-value pairs to cache. - */ -function Hash(entries) { - var index = -1, - length = entries ? entries.length : 0; + /** + * The base implementation of `_.findIndex` and `_.findLastIndex` without + * support for iteratee shorthands. + * + * @private + * @param {Array} array The array to inspect. + * @param {Function} predicate The function invoked per iteration. + * @param {number} fromIndex The index to search from. + * @param {boolean} [fromRight] Specify iterating from right to left. + * @returns {number} Returns the index of the matched value, else `-1`. + */ + function baseFindIndex(array, predicate, fromIndex, fromRight) { + var length = array.length, + index = fromIndex + (fromRight ? 1 : -1); - this.clear(); - while (++index < length) { - var entry = entries[index]; - this.set(entry[0], entry[1]); + while ((fromRight ? index-- : ++index < length)) { + if (predicate(array[index], index, array)) { + return index; + } + } + return -1; } -} - -/** - * Removes all key-value entries from the hash. - * - * @private - * @name clear - * @memberOf Hash - */ -function hashClear() { - this.__data__ = nativeCreate ? nativeCreate(null) : {}; -} -/** - * Removes `key` and its value from the hash. - * - * @private - * @name delete - * @memberOf Hash - * @param {Object} hash The hash to modify. - * @param {string} key The key of the value to remove. - * @returns {boolean} Returns `true` if the entry was removed, else `false`. - */ -function hashDelete(key) { - return this.has(key) && delete this.__data__[key]; -} + /** + * The base implementation of `_.property` without support for deep paths. + * + * @private + * @param {string} key The key of the property to get. + * @returns {Function} Returns the new accessor function. + */ + function baseProperty(key) { + return function(object) { + return object == null ? undefined : object[key]; + }; + } -/** - * Gets the hash value for `key`. - * - * @private - * @name get - * @memberOf Hash - * @param {string} key The key of the value to get. - * @returns {*} Returns the entry value. - */ -function hashGet(key) { - var data = this.__data__; - if (nativeCreate) { - var result = data[key]; - return result === HASH_UNDEFINED ? undefined : result; + /** + * The base implementation of `_.propertyOf` without support for deep paths. + * + * @private + * @param {Object} object The object to query. + * @returns {Function} Returns the new accessor function. + */ + function basePropertyOf(object) { + return function(key) { + return object == null ? undefined : object[key]; + }; } - return hasOwnProperty.call(data, key) ? data[key] : undefined; -} -/** - * Checks if a hash value for `key` exists. - * - * @private - * @name has - * @memberOf Hash - * @param {string} key The key of the entry to check. - * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. - */ -function hashHas(key) { - var data = this.__data__; - return nativeCreate ? data[key] !== undefined : hasOwnProperty.call(data, key); -} - -/** - * Sets the hash `key` to `value`. - * - * @private - * @name set - * @memberOf Hash - * @param {string} key The key of the value to set. - * @param {*} value The value to set. - * @returns {Object} Returns the hash instance. - */ -function hashSet(key, value) { - var data = this.__data__; - data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value; - return this; -} - -// Add methods to `Hash`. -Hash.prototype.clear = hashClear; -Hash.prototype['delete'] = hashDelete; -Hash.prototype.get = hashGet; -Hash.prototype.has = hashHas; -Hash.prototype.set = hashSet; - -/** - * Creates an list cache object. - * - * @private - * @constructor - * @param {Array} [entries] The key-value pairs to cache. - */ -function ListCache(entries) { - var index = -1, - length = entries ? entries.length : 0; - - this.clear(); - while (++index < length) { - var entry = entries[index]; - this.set(entry[0], entry[1]); - } -} - -/** - * Removes all key-value entries from the list cache. - * - * @private - * @name clear - * @memberOf ListCache - */ -function listCacheClear() { - this.__data__ = []; -} - -/** - * Removes `key` and its value from the list cache. - * - * @private - * @name delete - * @memberOf ListCache - * @param {string} key The key of the value to remove. - * @returns {boolean} Returns `true` if the entry was removed, else `false`. - */ -function listCacheDelete(key) { - var data = this.__data__, - index = assocIndexOf(data, key); - - if (index < 0) { - return false; - } - var lastIndex = data.length - 1; - if (index == lastIndex) { - data.pop(); - } else { - splice.call(data, index, 1); - } - return true; -} - -/** - * Gets the list cache value for `key`. - * - * @private - * @name get - * @memberOf ListCache - * @param {string} key The key of the value to get. - * @returns {*} Returns the entry value. - */ -function listCacheGet(key) { - var data = this.__data__, - index = assocIndexOf(data, key); - - return index < 0 ? undefined : data[index][1]; -} - -/** - * Checks if a list cache value for `key` exists. - * - * @private - * @name has - * @memberOf ListCache - * @param {string} key The key of the entry to check. - * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. - */ -function listCacheHas(key) { - return assocIndexOf(this.__data__, key) > -1; -} - -/** - * Sets the list cache `key` to `value`. - * - * @private - * @name set - * @memberOf ListCache - * @param {string} key The key of the value to set. - * @param {*} value The value to set. - * @returns {Object} Returns the list cache instance. - */ -function listCacheSet(key, value) { - var data = this.__data__, - index = assocIndexOf(data, key); - - if (index < 0) { - data.push([key, value]); - } else { - data[index][1] = value; - } - return this; -} - -// Add methods to `ListCache`. -ListCache.prototype.clear = listCacheClear; -ListCache.prototype['delete'] = listCacheDelete; -ListCache.prototype.get = listCacheGet; -ListCache.prototype.has = listCacheHas; -ListCache.prototype.set = listCacheSet; - -/** - * Creates a map cache object to store key-value pairs. - * - * @private - * @constructor - * @param {Array} [entries] The key-value pairs to cache. - */ -function MapCache(entries) { - var index = -1, - length = entries ? entries.length : 0; - - this.clear(); - while (++index < length) { - var entry = entries[index]; - this.set(entry[0], entry[1]); + /** + * The base implementation of `_.reduce` and `_.reduceRight`, without support + * for iteratee shorthands, which iterates over `collection` using `eachFunc`. + * + * @private + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @param {*} accumulator The initial value. + * @param {boolean} initAccum Specify using the first or last element of + * `collection` as the initial value. + * @param {Function} eachFunc The function to iterate over `collection`. + * @returns {*} Returns the accumulated value. + */ + function baseReduce(collection, iteratee, accumulator, initAccum, eachFunc) { + eachFunc(collection, function(value, index, collection) { + accumulator = initAccum + ? (initAccum = false, value) + : iteratee(accumulator, value, index, collection); + }); + return accumulator; } -} - -/** - * Removes all key-value entries from the map. - * - * @private - * @name clear - * @memberOf MapCache - */ -function mapCacheClear() { - this.__data__ = { - 'hash': new Hash, - 'map': new (Map || ListCache), - 'string': new Hash - }; -} - -/** - * Removes `key` and its value from the map. - * - * @private - * @name delete - * @memberOf MapCache - * @param {string} key The key of the value to remove. - * @returns {boolean} Returns `true` if the entry was removed, else `false`. - */ -function mapCacheDelete(key) { - return getMapData(this, key)['delete'](key); -} - -/** - * Gets the map value for `key`. - * - * @private - * @name get - * @memberOf MapCache - * @param {string} key The key of the value to get. - * @returns {*} Returns the entry value. - */ -function mapCacheGet(key) { - return getMapData(this, key).get(key); -} - -/** - * Checks if a map value for `key` exists. - * - * @private - * @name has - * @memberOf MapCache - * @param {string} key The key of the entry to check. - * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. - */ -function mapCacheHas(key) { - return getMapData(this, key).has(key); -} - -/** - * Sets the map `key` to `value`. - * - * @private - * @name set - * @memberOf MapCache - * @param {string} key The key of the value to set. - * @param {*} value The value to set. - * @returns {Object} Returns the map cache instance. - */ -function mapCacheSet(key, value) { - getMapData(this, key).set(key, value); - return this; -} - -// Add methods to `MapCache`. -MapCache.prototype.clear = mapCacheClear; -MapCache.prototype['delete'] = mapCacheDelete; -MapCache.prototype.get = mapCacheGet; -MapCache.prototype.has = mapCacheHas; -MapCache.prototype.set = mapCacheSet; -/** - * Gets the index at which the `key` is found in `array` of key-value pairs. - * - * @private - * @param {Array} array The array to inspect. - * @param {*} key The key to search for. - * @returns {number} Returns the index of the matched value, else `-1`. - */ -function assocIndexOf(array, key) { - var length = array.length; - while (length--) { - if (eq(array[length][0], key)) { - return length; - } + /** + * The base implementation of `_.values` and `_.valuesIn` which creates an + * array of `object` property values corresponding to the property names + * of `props`. + * + * @private + * @param {Object} object The object to query. + * @param {Array} props The property names to get values for. + * @returns {Object} Returns the array of property values. + */ + function baseValues(object, props) { + return baseMap(props, function(key) { + return object[key]; + }); } - return -1; -} - -/** - * The base implementation of `_.get` without support for default values. - * - * @private - * @param {Object} object The object to query. - * @param {Array|string} path The path of the property to get. - * @returns {*} Returns the resolved value. - */ -function baseGet(object, path) { - path = isKey(path, object) ? [path] : castPath(path); - var index = 0, - length = path.length; - - while (object != null && index < length) { - object = object[toKey(path[index++])]; - } - return (index && index == length) ? object : undefined; -} + /** + * Used by `_.escape` to convert characters to HTML entities. + * + * @private + * @param {string} chr The matched character to escape. + * @returns {string} Returns the escaped character. + */ + var escapeHtmlChar = basePropertyOf(htmlEscapes); -/** - * The base implementation of `_.isNative` without bad shim checks. - * - * @private - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a native function, - * else `false`. - */ -function baseIsNative(value) { - if (!isObject(value) || isMasked(value)) { - return false; + /** + * Creates a unary function that invokes `func` with its argument transformed. + * + * @private + * @param {Function} func The function to wrap. + * @param {Function} transform The argument transform. + * @returns {Function} Returns the new function. + */ + function overArg(func, transform) { + return function(arg) { + return func(transform(arg)); + }; } - var pattern = (isFunction(value) || isHostObject(value)) ? reIsNative : reIsHostCtor; - return pattern.test(toSource(value)); -} -/** - * The base implementation of `_.toString` which doesn't convert nullish - * values to empty strings. - * - * @private - * @param {*} value The value to process. - * @returns {string} Returns the string. - */ -function baseToString(value) { - // Exit early for strings to avoid a performance hit in some environments. - if (typeof value == 'string') { - return value; - } - if (isSymbol(value)) { - return symbolToString ? symbolToString.call(value) : ''; - } - var result = (value + ''); - return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result; -} + /*--------------------------------------------------------------------------*/ -/** - * Casts `value` to a path array if it's not one. - * - * @private - * @param {*} value The value to inspect. - * @returns {Array} Returns the cast property path array. - */ -function castPath(value) { - return isArray(value) ? value : stringToPath(value); -} + /** Used for built-in method references. */ + var arrayProto = Array.prototype, + objectProto = Object.prototype; -/** - * Gets the data for `map`. - * - * @private - * @param {Object} map The map to query. - * @param {string} key The reference key. - * @returns {*} Returns the map data. - */ -function getMapData(map, key) { - var data = map.__data__; - return isKeyable(key) - ? data[typeof key == 'string' ? 'string' : 'hash'] - : data.map; -} + /** Used to check objects for own properties. */ + var hasOwnProperty = objectProto.hasOwnProperty; -/** - * Gets the native function at `key` of `object`. - * - * @private - * @param {Object} object The object to query. - * @param {string} key The key of the method to get. - * @returns {*} Returns the function if it's native, else `undefined`. - */ -function getNative(object, key) { - var value = getValue(object, key); - return baseIsNative(value) ? value : undefined; -} + /** Used to generate unique IDs. */ + var idCounter = 0; -/** - * Checks if `value` is a property name and not a property path. - * - * @private - * @param {*} value The value to check. - * @param {Object} [object] The object to query keys on. - * @returns {boolean} Returns `true` if `value` is a property name, else `false`. - */ -function isKey(value, object) { - if (isArray(value)) { - return false; - } - var type = typeof value; - if (type == 'number' || type == 'symbol' || type == 'boolean' || - value == null || isSymbol(value)) { - return true; - } - return reIsPlainProp.test(value) || !reIsDeepProp.test(value) || - (object != null && value in Object(object)); -} + /** + * Used to resolve the + * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring) + * of values. + */ + var nativeObjectToString = objectProto.toString; -/** - * Checks if `value` is suitable for use as unique object key. - * - * @private - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is suitable, else `false`. - */ -function isKeyable(value) { - var type = typeof value; - return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean') - ? (value !== '__proto__') - : (value === null); -} + /** Used to restore the original `_` reference in `_.noConflict`. */ + var oldDash = root._; -/** - * Checks if `func` has its source masked. - * - * @private - * @param {Function} func The function to check. - * @returns {boolean} Returns `true` if `func` is masked, else `false`. - */ -function isMasked(func) { - return !!maskSrcKey && (maskSrcKey in func); -} + /** Built-in value references. */ + var objectCreate = Object.create, + propertyIsEnumerable = objectProto.propertyIsEnumerable; -/** - * Converts `string` to a property path array. - * - * @private - * @param {string} string The string to convert. - * @returns {Array} Returns the property path array. - */ -var stringToPath = memoize(function(string) { - string = toString(string); + /* Built-in method references for those with the same name as other `lodash` methods. */ + var nativeIsFinite = root.isFinite, + nativeKeys = overArg(Object.keys, Object), + nativeMax = Math.max; - var result = []; - if (reLeadingDot.test(string)) { - result.push(''); - } - string.replace(rePropName, function(match, number, quote, string) { - result.push(quote ? string.replace(reEscapeChar, '$1') : (number || match)); - }); - return result; -}); + /*------------------------------------------------------------------------*/ -/** - * Converts `value` to a string key if it's not a string or symbol. - * - * @private - * @param {*} value The value to inspect. - * @returns {string|symbol} Returns the key. - */ -function toKey(value) { - if (typeof value == 'string' || isSymbol(value)) { - return value; + /** + * Creates a `lodash` object which wraps `value` to enable implicit method + * chain sequences. Methods that operate on and return arrays, collections, + * and functions can be chained together. Methods that retrieve a single value + * or may return a primitive value will automatically end the chain sequence + * and return the unwrapped value. Otherwise, the value must be unwrapped + * with `_#value`. + * + * Explicit chain sequences, which must be unwrapped with `_#value`, may be + * enabled using `_.chain`. + * + * The execution of chained methods is lazy, that is, it's deferred until + * `_#value` is implicitly or explicitly called. + * + * Lazy evaluation allows several methods to support shortcut fusion. + * Shortcut fusion is an optimization to merge iteratee calls; this avoids + * the creation of intermediate arrays and can greatly reduce the number of + * iteratee executions. Sections of a chain sequence qualify for shortcut + * fusion if the section is applied to an array and iteratees accept only + * one argument. The heuristic for whether a section qualifies for shortcut + * fusion is subject to change. + * + * Chaining is supported in custom builds as long as the `_#value` method is + * directly or indirectly included in the build. + * + * In addition to lodash methods, wrappers have `Array` and `String` methods. + * + * The wrapper `Array` methods are: + * `concat`, `join`, `pop`, `push`, `shift`, `sort`, `splice`, and `unshift` + * + * The wrapper `String` methods are: + * `replace` and `split` + * + * The wrapper methods that support shortcut fusion are: + * `at`, `compact`, `drop`, `dropRight`, `dropWhile`, `filter`, `find`, + * `findLast`, `head`, `initial`, `last`, `map`, `reject`, `reverse`, `slice`, + * `tail`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, and `toArray` + * + * The chainable wrapper methods are: + * `after`, `ary`, `assign`, `assignIn`, `assignInWith`, `assignWith`, `at`, + * `before`, `bind`, `bindAll`, `bindKey`, `castArray`, `chain`, `chunk`, + * `commit`, `compact`, `concat`, `conforms`, `constant`, `countBy`, `create`, + * `curry`, `debounce`, `defaults`, `defaultsDeep`, `defer`, `delay`, + * `difference`, `differenceBy`, `differenceWith`, `drop`, `dropRight`, + * `dropRightWhile`, `dropWhile`, `extend`, `extendWith`, `fill`, `filter`, + * `flatMap`, `flatMapDeep`, `flatMapDepth`, `flatten`, `flattenDeep`, + * `flattenDepth`, `flip`, `flow`, `flowRight`, `fromPairs`, `functions`, + * `functionsIn`, `groupBy`, `initial`, `intersection`, `intersectionBy`, + * `intersectionWith`, `invert`, `invertBy`, `invokeMap`, `iteratee`, `keyBy`, + * `keys`, `keysIn`, `map`, `mapKeys`, `mapValues`, `matches`, `matchesProperty`, + * `memoize`, `merge`, `mergeWith`, `method`, `methodOf`, `mixin`, `negate`, + * `nthArg`, `omit`, `omitBy`, `once`, `orderBy`, `over`, `overArgs`, + * `overEvery`, `overSome`, `partial`, `partialRight`, `partition`, `pick`, + * `pickBy`, `plant`, `property`, `propertyOf`, `pull`, `pullAll`, `pullAllBy`, + * `pullAllWith`, `pullAt`, `push`, `range`, `rangeRight`, `rearg`, `reject`, + * `remove`, `rest`, `reverse`, `sampleSize`, `set`, `setWith`, `shuffle`, + * `slice`, `sort`, `sortBy`, `splice`, `spread`, `tail`, `take`, `takeRight`, + * `takeRightWhile`, `takeWhile`, `tap`, `throttle`, `thru`, `toArray`, + * `toPairs`, `toPairsIn`, `toPath`, `toPlainObject`, `transform`, `unary`, + * `union`, `unionBy`, `unionWith`, `uniq`, `uniqBy`, `uniqWith`, `unset`, + * `unshift`, `unzip`, `unzipWith`, `update`, `updateWith`, `values`, + * `valuesIn`, `without`, `wrap`, `xor`, `xorBy`, `xorWith`, `zip`, + * `zipObject`, `zipObjectDeep`, and `zipWith` + * + * The wrapper methods that are **not** chainable by default are: + * `add`, `attempt`, `camelCase`, `capitalize`, `ceil`, `clamp`, `clone`, + * `cloneDeep`, `cloneDeepWith`, `cloneWith`, `conformsTo`, `deburr`, + * `defaultTo`, `divide`, `each`, `eachRight`, `endsWith`, `eq`, `escape`, + * `escapeRegExp`, `every`, `find`, `findIndex`, `findKey`, `findLast`, + * `findLastIndex`, `findLastKey`, `first`, `floor`, `forEach`, `forEachRight`, + * `forIn`, `forInRight`, `forOwn`, `forOwnRight`, `get`, `gt`, `gte`, `has`, + * `hasIn`, `head`, `identity`, `includes`, `indexOf`, `inRange`, `invoke`, + * `isArguments`, `isArray`, `isArrayBuffer`, `isArrayLike`, `isArrayLikeObject`, + * `isBoolean`, `isBuffer`, `isDate`, `isElement`, `isEmpty`, `isEqual`, + * `isEqualWith`, `isError`, `isFinite`, `isFunction`, `isInteger`, `isLength`, + * `isMap`, `isMatch`, `isMatchWith`, `isNaN`, `isNative`, `isNil`, `isNull`, + * `isNumber`, `isObject`, `isObjectLike`, `isPlainObject`, `isRegExp`, + * `isSafeInteger`, `isSet`, `isString`, `isUndefined`, `isTypedArray`, + * `isWeakMap`, `isWeakSet`, `join`, `kebabCase`, `last`, `lastIndexOf`, + * `lowerCase`, `lowerFirst`, `lt`, `lte`, `max`, `maxBy`, `mean`, `meanBy`, + * `min`, `minBy`, `multiply`, `noConflict`, `noop`, `now`, `nth`, `pad`, + * `padEnd`, `padStart`, `parseInt`, `pop`, `random`, `reduce`, `reduceRight`, + * `repeat`, `result`, `round`, `runInContext`, `sample`, `shift`, `size`, + * `snakeCase`, `some`, `sortedIndex`, `sortedIndexBy`, `sortedLastIndex`, + * `sortedLastIndexBy`, `startCase`, `startsWith`, `stubArray`, `stubFalse`, + * `stubObject`, `stubString`, `stubTrue`, `subtract`, `sum`, `sumBy`, + * `template`, `times`, `toFinite`, `toInteger`, `toJSON`, `toLength`, + * `toLower`, `toNumber`, `toSafeInteger`, `toString`, `toUpper`, `trim`, + * `trimEnd`, `trimStart`, `truncate`, `unescape`, `uniqueId`, `upperCase`, + * `upperFirst`, `value`, and `words` + * + * @name _ + * @constructor + * @category Seq + * @param {*} value The value to wrap in a `lodash` instance. + * @returns {Object} Returns the new `lodash` wrapper instance. + * @example + * + * function square(n) { + * return n * n; + * } + * + * var wrapped = _([1, 2, 3]); + * + * // Returns an unwrapped value. + * wrapped.reduce(_.add); + * // => 6 + * + * // Returns a wrapped value. + * var squares = wrapped.map(square); + * + * _.isArray(squares); + * // => false + * + * _.isArray(squares.value()); + * // => true + */ + function lodash(value) { + return value instanceof LodashWrapper + ? value + : new LodashWrapper(value); } - var result = (value + ''); - return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result; -} -/** - * Converts `func` to its source code. - * - * @private - * @param {Function} func The function to process. - * @returns {string} Returns the source code. - */ -function toSource(func) { - if (func != null) { - try { - return funcToString.call(func); - } catch (e) {} - try { - return (func + ''); - } catch (e) {} - } - return ''; -} + /** + * The base implementation of `_.create` without support for assigning + * properties to the created object. + * + * @private + * @param {Object} proto The object to inherit from. + * @returns {Object} Returns the new object. + */ + var baseCreate = (function() { + function object() {} + return function(proto) { + if (!isObject(proto)) { + return {}; + } + if (objectCreate) { + return objectCreate(proto); + } + object.prototype = proto; + var result = new object; + object.prototype = undefined; + return result; + }; + }()); -/** - * Creates a function that memoizes the result of `func`. If `resolver` is - * provided, it determines the cache key for storing the result based on the - * arguments provided to the memoized function. By default, the first argument - * provided to the memoized function is used as the map cache key. The `func` - * is invoked with the `this` binding of the memoized function. - * - * **Note:** The cache is exposed as the `cache` property on the memoized - * function. Its creation may be customized by replacing the `_.memoize.Cache` - * constructor with one whose instances implement the - * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object) - * method interface of `delete`, `get`, `has`, and `set`. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Function - * @param {Function} func The function to have its output memoized. - * @param {Function} [resolver] The function to resolve the cache key. - * @returns {Function} Returns the new memoized function. - * @example - * - * var object = { 'a': 1, 'b': 2 }; - * var other = { 'c': 3, 'd': 4 }; - * - * var values = _.memoize(_.values); - * values(object); - * // => [1, 2] - * - * values(other); - * // => [3, 4] - * - * object.a = 2; - * values(object); - * // => [1, 2] - * - * // Modify the result cache. - * values.cache.set(object, ['a', 'b']); - * values(object); - * // => ['a', 'b'] - * - * // Replace `_.memoize.Cache`. - * _.memoize.Cache = WeakMap; - */ -function memoize(func, resolver) { - if (typeof func != 'function' || (resolver && typeof resolver != 'function')) { - throw new TypeError(FUNC_ERROR_TEXT); + /** + * The base constructor for creating `lodash` wrapper objects. + * + * @private + * @param {*} value The value to wrap. + * @param {boolean} [chainAll] Enable explicit method chain sequences. + */ + function LodashWrapper(value, chainAll) { + this.__wrapped__ = value; + this.__actions__ = []; + this.__chain__ = !!chainAll; } - var memoized = function() { - var args = arguments, - key = resolver ? resolver.apply(this, args) : args[0], - cache = memoized.cache; - if (cache.has(key)) { - return cache.get(key); - } - var result = func.apply(this, args); - memoized.cache = cache.set(key, result); - return result; - }; - memoized.cache = new (memoize.Cache || MapCache); - return memoized; -} + LodashWrapper.prototype = baseCreate(lodash.prototype); + LodashWrapper.prototype.constructor = LodashWrapper; -// Assign cache to `_.memoize`. -memoize.Cache = MapCache; + /*------------------------------------------------------------------------*/ -/** - * Performs a - * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) - * comparison between two values to determine if they are equivalent. - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Lang - * @param {*} value The value to compare. - * @param {*} other The other value to compare. - * @returns {boolean} Returns `true` if the values are equivalent, else `false`. - * @example - * - * var object = { 'a': 1 }; - * var other = { 'a': 1 }; - * - * _.eq(object, object); - * // => true - * - * _.eq(object, other); - * // => false - * - * _.eq('a', 'a'); - * // => true - * - * _.eq('a', Object('a')); - * // => false - * - * _.eq(NaN, NaN); - * // => true - */ -function eq(value, other) { - return value === other || (value !== value && other !== other); -} + /** + * Assigns `value` to `key` of `object` if the existing value is not equivalent + * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) + * for equality comparisons. + * + * @private + * @param {Object} object The object to modify. + * @param {string} key The key of the property to assign. + * @param {*} value The value to assign. + */ + function assignValue(object, key, value) { + var objValue = object[key]; + if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) || + (value === undefined && !(key in object))) { + baseAssignValue(object, key, value); + } + } -/** - * Checks if `value` is classified as an `Array` object. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is an array, else `false`. - * @example - * - * _.isArray([1, 2, 3]); - * // => true - * - * _.isArray(document.body.children); - * // => false - * - * _.isArray('abc'); - * // => false - * - * _.isArray(_.noop); - * // => false - */ -var isArray = Array.isArray; + /** + * The base implementation of `assignValue` and `assignMergeValue` without + * value checks. + * + * @private + * @param {Object} object The object to modify. + * @param {string} key The key of the property to assign. + * @param {*} value The value to assign. + */ + function baseAssignValue(object, key, value) { + object[key] = value; + } -/** - * Checks if `value` is classified as a `Function` object. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a function, else `false`. - * @example - * - * _.isFunction(_); - * // => true - * - * _.isFunction(/abc/); - * // => false - */ -function isFunction(value) { - // The use of `Object#toString` avoids issues with the `typeof` operator - // in Safari 8-9 which returns 'object' for typed array and other constructors. - var tag = isObject(value) ? objectToString.call(value) : ''; - return tag == funcTag || tag == genTag; -} - -/** - * Checks if `value` is the - * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types) - * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`) - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is an object, else `false`. - * @example - * - * _.isObject({}); - * // => true - * - * _.isObject([1, 2, 3]); - * // => true - * - * _.isObject(_.noop); - * // => true - * - * _.isObject(null); - * // => false - */ -function isObject(value) { - var type = typeof value; - return !!value && (type == 'object' || type == 'function'); -} - -/** - * Checks if `value` is object-like. A value is object-like if it's not `null` - * and has a `typeof` result of "object". - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is object-like, else `false`. - * @example - * - * _.isObjectLike({}); - * // => true - * - * _.isObjectLike([1, 2, 3]); - * // => true - * - * _.isObjectLike(_.noop); - * // => false - * - * _.isObjectLike(null); - * // => false - */ -function isObjectLike(value) { - return !!value && typeof value == 'object'; -} - -/** - * Checks if `value` is classified as a `Symbol` primitive or object. - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a symbol, else `false`. - * @example - * - * _.isSymbol(Symbol.iterator); - * // => true - * - * _.isSymbol('abc'); - * // => false - */ -function isSymbol(value) { - return typeof value == 'symbol' || - (isObjectLike(value) && objectToString.call(value) == symbolTag); -} - -/** - * Converts `value` to a string. An empty string is returned for `null` - * and `undefined` values. The sign of `-0` is preserved. - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Lang - * @param {*} value The value to process. - * @returns {string} Returns the string. - * @example - * - * _.toString(null); - * // => '' - * - * _.toString(-0); - * // => '-0' - * - * _.toString([1, 2, 3]); - * // => '1,2,3' - */ -function toString(value) { - return value == null ? '' : baseToString(value); -} - -/** - * Gets the value at `path` of `object`. If the resolved value is - * `undefined`, the `defaultValue` is returned in its place. - * - * @static - * @memberOf _ - * @since 3.7.0 - * @category Object - * @param {Object} object The object to query. - * @param {Array|string} path The path of the property to get. - * @param {*} [defaultValue] The value returned for `undefined` resolved values. - * @returns {*} Returns the resolved value. - * @example - * - * var object = { 'a': [{ 'b': { 'c': 3 } }] }; - * - * _.get(object, 'a[0].b.c'); - * // => 3 - * - * _.get(object, ['a', '0', 'b', 'c']); - * // => 3 - * - * _.get(object, 'a.b.c', 'default'); - * // => 'default' - */ -function get(object, path, defaultValue) { - var result = object == null ? undefined : baseGet(object, path); - return result === undefined ? defaultValue : result; -} - -module.exports = get; - -}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) - -},{}],43:[function(require,module,exports){ -(function (global){ -/** - * @license - * Lodash (Custom Build) - * Build: `lodash core -o ./dist/lodash.core.js` - * Copyright OpenJS Foundation and other contributors - * Released under MIT license - * Based on Underscore.js 1.8.3 - * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors - */ -;(function() { - - /** Used as a safe reference for `undefined` in pre-ES5 environments. */ - var undefined; - - /** Used as the semantic version number. */ - var VERSION = '4.17.14'; - - /** Error message constants. */ - var FUNC_ERROR_TEXT = 'Expected a function'; - - /** Used to compose bitmasks for value comparisons. */ - var COMPARE_PARTIAL_FLAG = 1, - COMPARE_UNORDERED_FLAG = 2; - - /** Used to compose bitmasks for function metadata. */ - var WRAP_BIND_FLAG = 1, - WRAP_PARTIAL_FLAG = 32; - - /** Used as references for various `Number` constants. */ - var INFINITY = 1 / 0, - MAX_SAFE_INTEGER = 9007199254740991; - - /** `Object#toString` result references. */ - var argsTag = '[object Arguments]', - arrayTag = '[object Array]', - asyncTag = '[object AsyncFunction]', - boolTag = '[object Boolean]', - dateTag = '[object Date]', - errorTag = '[object Error]', - funcTag = '[object Function]', - genTag = '[object GeneratorFunction]', - numberTag = '[object Number]', - objectTag = '[object Object]', - proxyTag = '[object Proxy]', - regexpTag = '[object RegExp]', - stringTag = '[object String]'; - - /** Used to match HTML entities and HTML characters. */ - var reUnescapedHtml = /[&<>"']/g, - reHasUnescapedHtml = RegExp(reUnescapedHtml.source); - - /** Used to detect unsigned integer values. */ - var reIsUint = /^(?:0|[1-9]\d*)$/; - - /** Used to map characters to HTML entities. */ - var htmlEscapes = { - '&': '&', - '<': '<', - '>': '>', - '"': '"', - "'": ''' - }; - - /** Detect free variable `global` from Node.js. */ - var freeGlobal = typeof global == 'object' && global && global.Object === Object && global; - - /** Detect free variable `self`. */ - var freeSelf = typeof self == 'object' && self && self.Object === Object && self; - - /** Used as a reference to the global object. */ - var root = freeGlobal || freeSelf || Function('return this')(); - - /** Detect free variable `exports`. */ - var freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports; - - /** Detect free variable `module`. */ - var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module; - - /*--------------------------------------------------------------------------*/ + /** + * The base implementation of `_.delay` and `_.defer` which accepts `args` + * to provide to `func`. + * + * @private + * @param {Function} func The function to delay. + * @param {number} wait The number of milliseconds to delay invocation. + * @param {Array} args The arguments to provide to `func`. + * @returns {number|Object} Returns the timer id or timeout object. + */ + function baseDelay(func, wait, args) { + if (typeof func != 'function') { + throw new TypeError(FUNC_ERROR_TEXT); + } + return setTimeout(function() { func.apply(undefined, args); }, wait); + } /** - * Appends the elements of `values` to `array`. + * The base implementation of `_.forEach` without support for iteratee shorthands. * * @private - * @param {Array} array The array to modify. - * @param {Array} values The values to append. - * @returns {Array} Returns `array`. + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Array|Object} Returns `collection`. */ - function arrayPush(array, values) { - array.push.apply(array, values); - return array; - } + var baseEach = createBaseEach(baseForOwn); /** - * The base implementation of `_.findIndex` and `_.findLastIndex` without - * support for iteratee shorthands. + * The base implementation of `_.every` without support for iteratee shorthands. * * @private - * @param {Array} array The array to inspect. + * @param {Array|Object} collection The collection to iterate over. * @param {Function} predicate The function invoked per iteration. - * @param {number} fromIndex The index to search from. - * @param {boolean} [fromRight] Specify iterating from right to left. - * @returns {number} Returns the index of the matched value, else `-1`. + * @returns {boolean} Returns `true` if all elements pass the predicate check, + * else `false` */ - function baseFindIndex(array, predicate, fromIndex, fromRight) { - var length = array.length, - index = fromIndex + (fromRight ? 1 : -1); - - while ((fromRight ? index-- : ++index < length)) { - if (predicate(array[index], index, array)) { - return index; - } - } - return -1; + function baseEvery(collection, predicate) { + var result = true; + baseEach(collection, function(value, index, collection) { + result = !!predicate(value, index, collection); + return result; + }); + return result; } /** - * The base implementation of `_.property` without support for deep paths. + * The base implementation of methods like `_.max` and `_.min` which accepts a + * `comparator` to determine the extremum value. * * @private - * @param {string} key The key of the property to get. - * @returns {Function} Returns the new accessor function. + * @param {Array} array The array to iterate over. + * @param {Function} iteratee The iteratee invoked per iteration. + * @param {Function} comparator The comparator used to compare values. + * @returns {*} Returns the extremum value. */ - function baseProperty(key) { - return function(object) { - return object == null ? undefined : object[key]; - }; - } + function baseExtremum(array, iteratee, comparator) { + var index = -1, + length = array.length; - /** - * The base implementation of `_.propertyOf` without support for deep paths. - * - * @private - * @param {Object} object The object to query. - * @returns {Function} Returns the new accessor function. - */ - function basePropertyOf(object) { - return function(key) { - return object == null ? undefined : object[key]; - }; + while (++index < length) { + var value = array[index], + current = iteratee(value); + + if (current != null && (computed === undefined + ? (current === current && !false) + : comparator(current, computed) + )) { + var computed = current, + result = value; + } + } + return result; } /** - * The base implementation of `_.reduce` and `_.reduceRight`, without support - * for iteratee shorthands, which iterates over `collection` using `eachFunc`. + * The base implementation of `_.filter` without support for iteratee shorthands. * * @private * @param {Array|Object} collection The collection to iterate over. - * @param {Function} iteratee The function invoked per iteration. - * @param {*} accumulator The initial value. - * @param {boolean} initAccum Specify using the first or last element of - * `collection` as the initial value. - * @param {Function} eachFunc The function to iterate over `collection`. - * @returns {*} Returns the accumulated value. + * @param {Function} predicate The function invoked per iteration. + * @returns {Array} Returns the new filtered array. */ - function baseReduce(collection, iteratee, accumulator, initAccum, eachFunc) { - eachFunc(collection, function(value, index, collection) { - accumulator = initAccum - ? (initAccum = false, value) - : iteratee(accumulator, value, index, collection); + function baseFilter(collection, predicate) { + var result = []; + baseEach(collection, function(value, index, collection) { + if (predicate(value, index, collection)) { + result.push(value); + } }); - return accumulator; + return result; } /** - * The base implementation of `_.values` and `_.valuesIn` which creates an - * array of `object` property values corresponding to the property names - * of `props`. + * The base implementation of `_.flatten` with support for restricting flattening. * * @private - * @param {Object} object The object to query. - * @param {Array} props The property names to get values for. - * @returns {Object} Returns the array of property values. + * @param {Array} array The array to flatten. + * @param {number} depth The maximum recursion depth. + * @param {boolean} [predicate=isFlattenable] The function invoked per iteration. + * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks. + * @param {Array} [result=[]] The initial result value. + * @returns {Array} Returns the new flattened array. */ - function baseValues(object, props) { - return baseMap(props, function(key) { - return object[key]; - }); - } + function baseFlatten(array, depth, predicate, isStrict, result) { + var index = -1, + length = array.length; - /** - * Used by `_.escape` to convert characters to HTML entities. - * - * @private - * @param {string} chr The matched character to escape. - * @returns {string} Returns the escaped character. - */ - var escapeHtmlChar = basePropertyOf(htmlEscapes); + predicate || (predicate = isFlattenable); + result || (result = []); - /** - * Creates a unary function that invokes `func` with its argument transformed. - * - * @private - * @param {Function} func The function to wrap. - * @param {Function} transform The argument transform. - * @returns {Function} Returns the new function. - */ - function overArg(func, transform) { - return function(arg) { - return func(transform(arg)); - }; + while (++index < length) { + var value = array[index]; + if (depth > 0 && predicate(value)) { + if (depth > 1) { + // Recursively flatten arrays (susceptible to call stack limits). + baseFlatten(value, depth - 1, predicate, isStrict, result); + } else { + arrayPush(result, value); + } + } else if (!isStrict) { + result[result.length] = value; + } + } + return result; } - /*--------------------------------------------------------------------------*/ - - /** Used for built-in method references. */ - var arrayProto = Array.prototype, - objectProto = Object.prototype; - - /** Used to check objects for own properties. */ - var hasOwnProperty = objectProto.hasOwnProperty; - - /** Used to generate unique IDs. */ - var idCounter = 0; - /** - * Used to resolve the - * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring) - * of values. + * The base implementation of `baseForOwn` which iterates over `object` + * properties returned by `keysFunc` and invokes `iteratee` for each property. + * Iteratee functions may exit iteration early by explicitly returning `false`. + * + * @private + * @param {Object} object The object to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @param {Function} keysFunc The function to get the keys of `object`. + * @returns {Object} Returns `object`. */ - var nativeObjectToString = objectProto.toString; - - /** Used to restore the original `_` reference in `_.noConflict`. */ - var oldDash = root._; - - /** Built-in value references. */ - var objectCreate = Object.create, - propertyIsEnumerable = objectProto.propertyIsEnumerable; - - /* Built-in method references for those with the same name as other `lodash` methods. */ - var nativeIsFinite = root.isFinite, - nativeKeys = overArg(Object.keys, Object), - nativeMax = Math.max; - - /*------------------------------------------------------------------------*/ + var baseFor = createBaseFor(); /** - * Creates a `lodash` object which wraps `value` to enable implicit method - * chain sequences. Methods that operate on and return arrays, collections, - * and functions can be chained together. Methods that retrieve a single value - * or may return a primitive value will automatically end the chain sequence - * and return the unwrapped value. Otherwise, the value must be unwrapped - * with `_#value`. - * - * Explicit chain sequences, which must be unwrapped with `_#value`, may be - * enabled using `_.chain`. - * - * The execution of chained methods is lazy, that is, it's deferred until - * `_#value` is implicitly or explicitly called. - * - * Lazy evaluation allows several methods to support shortcut fusion. - * Shortcut fusion is an optimization to merge iteratee calls; this avoids - * the creation of intermediate arrays and can greatly reduce the number of - * iteratee executions. Sections of a chain sequence qualify for shortcut - * fusion if the section is applied to an array and iteratees accept only - * one argument. The heuristic for whether a section qualifies for shortcut - * fusion is subject to change. - * - * Chaining is supported in custom builds as long as the `_#value` method is - * directly or indirectly included in the build. - * - * In addition to lodash methods, wrappers have `Array` and `String` methods. - * - * The wrapper `Array` methods are: - * `concat`, `join`, `pop`, `push`, `shift`, `sort`, `splice`, and `unshift` - * - * The wrapper `String` methods are: - * `replace` and `split` - * - * The wrapper methods that support shortcut fusion are: - * `at`, `compact`, `drop`, `dropRight`, `dropWhile`, `filter`, `find`, - * `findLast`, `head`, `initial`, `last`, `map`, `reject`, `reverse`, `slice`, - * `tail`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, and `toArray` - * - * The chainable wrapper methods are: - * `after`, `ary`, `assign`, `assignIn`, `assignInWith`, `assignWith`, `at`, - * `before`, `bind`, `bindAll`, `bindKey`, `castArray`, `chain`, `chunk`, - * `commit`, `compact`, `concat`, `conforms`, `constant`, `countBy`, `create`, - * `curry`, `debounce`, `defaults`, `defaultsDeep`, `defer`, `delay`, - * `difference`, `differenceBy`, `differenceWith`, `drop`, `dropRight`, - * `dropRightWhile`, `dropWhile`, `extend`, `extendWith`, `fill`, `filter`, - * `flatMap`, `flatMapDeep`, `flatMapDepth`, `flatten`, `flattenDeep`, - * `flattenDepth`, `flip`, `flow`, `flowRight`, `fromPairs`, `functions`, - * `functionsIn`, `groupBy`, `initial`, `intersection`, `intersectionBy`, - * `intersectionWith`, `invert`, `invertBy`, `invokeMap`, `iteratee`, `keyBy`, - * `keys`, `keysIn`, `map`, `mapKeys`, `mapValues`, `matches`, `matchesProperty`, - * `memoize`, `merge`, `mergeWith`, `method`, `methodOf`, `mixin`, `negate`, - * `nthArg`, `omit`, `omitBy`, `once`, `orderBy`, `over`, `overArgs`, - * `overEvery`, `overSome`, `partial`, `partialRight`, `partition`, `pick`, - * `pickBy`, `plant`, `property`, `propertyOf`, `pull`, `pullAll`, `pullAllBy`, - * `pullAllWith`, `pullAt`, `push`, `range`, `rangeRight`, `rearg`, `reject`, - * `remove`, `rest`, `reverse`, `sampleSize`, `set`, `setWith`, `shuffle`, - * `slice`, `sort`, `sortBy`, `splice`, `spread`, `tail`, `take`, `takeRight`, - * `takeRightWhile`, `takeWhile`, `tap`, `throttle`, `thru`, `toArray`, - * `toPairs`, `toPairsIn`, `toPath`, `toPlainObject`, `transform`, `unary`, - * `union`, `unionBy`, `unionWith`, `uniq`, `uniqBy`, `uniqWith`, `unset`, - * `unshift`, `unzip`, `unzipWith`, `update`, `updateWith`, `values`, - * `valuesIn`, `without`, `wrap`, `xor`, `xorBy`, `xorWith`, `zip`, - * `zipObject`, `zipObjectDeep`, and `zipWith` - * - * The wrapper methods that are **not** chainable by default are: - * `add`, `attempt`, `camelCase`, `capitalize`, `ceil`, `clamp`, `clone`, - * `cloneDeep`, `cloneDeepWith`, `cloneWith`, `conformsTo`, `deburr`, - * `defaultTo`, `divide`, `each`, `eachRight`, `endsWith`, `eq`, `escape`, - * `escapeRegExp`, `every`, `find`, `findIndex`, `findKey`, `findLast`, - * `findLastIndex`, `findLastKey`, `first`, `floor`, `forEach`, `forEachRight`, - * `forIn`, `forInRight`, `forOwn`, `forOwnRight`, `get`, `gt`, `gte`, `has`, - * `hasIn`, `head`, `identity`, `includes`, `indexOf`, `inRange`, `invoke`, - * `isArguments`, `isArray`, `isArrayBuffer`, `isArrayLike`, `isArrayLikeObject`, - * `isBoolean`, `isBuffer`, `isDate`, `isElement`, `isEmpty`, `isEqual`, - * `isEqualWith`, `isError`, `isFinite`, `isFunction`, `isInteger`, `isLength`, - * `isMap`, `isMatch`, `isMatchWith`, `isNaN`, `isNative`, `isNil`, `isNull`, - * `isNumber`, `isObject`, `isObjectLike`, `isPlainObject`, `isRegExp`, - * `isSafeInteger`, `isSet`, `isString`, `isUndefined`, `isTypedArray`, - * `isWeakMap`, `isWeakSet`, `join`, `kebabCase`, `last`, `lastIndexOf`, - * `lowerCase`, `lowerFirst`, `lt`, `lte`, `max`, `maxBy`, `mean`, `meanBy`, - * `min`, `minBy`, `multiply`, `noConflict`, `noop`, `now`, `nth`, `pad`, - * `padEnd`, `padStart`, `parseInt`, `pop`, `random`, `reduce`, `reduceRight`, - * `repeat`, `result`, `round`, `runInContext`, `sample`, `shift`, `size`, - * `snakeCase`, `some`, `sortedIndex`, `sortedIndexBy`, `sortedLastIndex`, - * `sortedLastIndexBy`, `startCase`, `startsWith`, `stubArray`, `stubFalse`, - * `stubObject`, `stubString`, `stubTrue`, `subtract`, `sum`, `sumBy`, - * `template`, `times`, `toFinite`, `toInteger`, `toJSON`, `toLength`, - * `toLower`, `toNumber`, `toSafeInteger`, `toString`, `toUpper`, `trim`, - * `trimEnd`, `trimStart`, `truncate`, `unescape`, `uniqueId`, `upperCase`, - * `upperFirst`, `value`, and `words` - * - * @name _ - * @constructor - * @category Seq - * @param {*} value The value to wrap in a `lodash` instance. - * @returns {Object} Returns the new `lodash` wrapper instance. - * @example - * - * function square(n) { - * return n * n; - * } - * - * var wrapped = _([1, 2, 3]); - * - * // Returns an unwrapped value. - * wrapped.reduce(_.add); - * // => 6 - * - * // Returns a wrapped value. - * var squares = wrapped.map(square); - * - * _.isArray(squares); - * // => false + * The base implementation of `_.forOwn` without support for iteratee shorthands. * - * _.isArray(squares.value()); - * // => true + * @private + * @param {Object} object The object to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Object} Returns `object`. */ - function lodash(value) { - return value instanceof LodashWrapper - ? value - : new LodashWrapper(value); + function baseForOwn(object, iteratee) { + return object && baseFor(object, iteratee, keys); } /** - * The base implementation of `_.create` without support for assigning - * properties to the created object. + * The base implementation of `_.functions` which creates an array of + * `object` function property names filtered from `props`. * * @private - * @param {Object} proto The object to inherit from. - * @returns {Object} Returns the new object. + * @param {Object} object The object to inspect. + * @param {Array} props The property names to filter. + * @returns {Array} Returns the function names. */ - var baseCreate = (function() { - function object() {} - return function(proto) { - if (!isObject(proto)) { - return {}; - } - if (objectCreate) { - return objectCreate(proto); - } - object.prototype = proto; - var result = new object; - object.prototype = undefined; - return result; - }; - }()); + function baseFunctions(object, props) { + return baseFilter(props, function(key) { + return isFunction(object[key]); + }); + } /** - * The base constructor for creating `lodash` wrapper objects. + * The base implementation of `getTag` without fallbacks for buggy environments. * * @private - * @param {*} value The value to wrap. - * @param {boolean} [chainAll] Enable explicit method chain sequences. + * @param {*} value The value to query. + * @returns {string} Returns the `toStringTag`. */ - function LodashWrapper(value, chainAll) { - this.__wrapped__ = value; - this.__actions__ = []; - this.__chain__ = !!chainAll; + function baseGetTag(value) { + return objectToString(value); } - LodashWrapper.prototype = baseCreate(lodash.prototype); - LodashWrapper.prototype.constructor = LodashWrapper; - - /*------------------------------------------------------------------------*/ - /** - * Assigns `value` to `key` of `object` if the existing value is not equivalent - * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) - * for equality comparisons. + * The base implementation of `_.gt` which doesn't coerce arguments. * * @private - * @param {Object} object The object to modify. - * @param {string} key The key of the property to assign. - * @param {*} value The value to assign. + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @returns {boolean} Returns `true` if `value` is greater than `other`, + * else `false`. */ - function assignValue(object, key, value) { - var objValue = object[key]; - if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) || - (value === undefined && !(key in object))) { - baseAssignValue(object, key, value); - } - } - - /** - * The base implementation of `assignValue` and `assignMergeValue` without - * value checks. - * - * @private - * @param {Object} object The object to modify. - * @param {string} key The key of the property to assign. - * @param {*} value The value to assign. - */ - function baseAssignValue(object, key, value) { - object[key] = value; - } - - /** - * The base implementation of `_.delay` and `_.defer` which accepts `args` - * to provide to `func`. - * - * @private - * @param {Function} func The function to delay. - * @param {number} wait The number of milliseconds to delay invocation. - * @param {Array} args The arguments to provide to `func`. - * @returns {number|Object} Returns the timer id or timeout object. - */ - function baseDelay(func, wait, args) { - if (typeof func != 'function') { - throw new TypeError(FUNC_ERROR_TEXT); - } - return setTimeout(function() { func.apply(undefined, args); }, wait); - } - - /** - * The base implementation of `_.forEach` without support for iteratee shorthands. - * - * @private - * @param {Array|Object} collection The collection to iterate over. - * @param {Function} iteratee The function invoked per iteration. - * @returns {Array|Object} Returns `collection`. - */ - var baseEach = createBaseEach(baseForOwn); - - /** - * The base implementation of `_.every` without support for iteratee shorthands. - * - * @private - * @param {Array|Object} collection The collection to iterate over. - * @param {Function} predicate The function invoked per iteration. - * @returns {boolean} Returns `true` if all elements pass the predicate check, - * else `false` - */ - function baseEvery(collection, predicate) { - var result = true; - baseEach(collection, function(value, index, collection) { - result = !!predicate(value, index, collection); - return result; - }); - return result; - } - - /** - * The base implementation of methods like `_.max` and `_.min` which accepts a - * `comparator` to determine the extremum value. - * - * @private - * @param {Array} array The array to iterate over. - * @param {Function} iteratee The iteratee invoked per iteration. - * @param {Function} comparator The comparator used to compare values. - * @returns {*} Returns the extremum value. - */ - function baseExtremum(array, iteratee, comparator) { - var index = -1, - length = array.length; - - while (++index < length) { - var value = array[index], - current = iteratee(value); - - if (current != null && (computed === undefined - ? (current === current && !false) - : comparator(current, computed) - )) { - var computed = current, - result = value; - } - } - return result; - } - - /** - * The base implementation of `_.filter` without support for iteratee shorthands. - * - * @private - * @param {Array|Object} collection The collection to iterate over. - * @param {Function} predicate The function invoked per iteration. - * @returns {Array} Returns the new filtered array. - */ - function baseFilter(collection, predicate) { - var result = []; - baseEach(collection, function(value, index, collection) { - if (predicate(value, index, collection)) { - result.push(value); - } - }); - return result; - } - - /** - * The base implementation of `_.flatten` with support for restricting flattening. - * - * @private - * @param {Array} array The array to flatten. - * @param {number} depth The maximum recursion depth. - * @param {boolean} [predicate=isFlattenable] The function invoked per iteration. - * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks. - * @param {Array} [result=[]] The initial result value. - * @returns {Array} Returns the new flattened array. - */ - function baseFlatten(array, depth, predicate, isStrict, result) { - var index = -1, - length = array.length; - - predicate || (predicate = isFlattenable); - result || (result = []); - - while (++index < length) { - var value = array[index]; - if (depth > 0 && predicate(value)) { - if (depth > 1) { - // Recursively flatten arrays (susceptible to call stack limits). - baseFlatten(value, depth - 1, predicate, isStrict, result); - } else { - arrayPush(result, value); - } - } else if (!isStrict) { - result[result.length] = value; - } - } - return result; - } - - /** - * The base implementation of `baseForOwn` which iterates over `object` - * properties returned by `keysFunc` and invokes `iteratee` for each property. - * Iteratee functions may exit iteration early by explicitly returning `false`. - * - * @private - * @param {Object} object The object to iterate over. - * @param {Function} iteratee The function invoked per iteration. - * @param {Function} keysFunc The function to get the keys of `object`. - * @returns {Object} Returns `object`. - */ - var baseFor = createBaseFor(); - - /** - * The base implementation of `_.forOwn` without support for iteratee shorthands. - * - * @private - * @param {Object} object The object to iterate over. - * @param {Function} iteratee The function invoked per iteration. - * @returns {Object} Returns `object`. - */ - function baseForOwn(object, iteratee) { - return object && baseFor(object, iteratee, keys); - } - - /** - * The base implementation of `_.functions` which creates an array of - * `object` function property names filtered from `props`. - * - * @private - * @param {Object} object The object to inspect. - * @param {Array} props The property names to filter. - * @returns {Array} Returns the function names. - */ - function baseFunctions(object, props) { - return baseFilter(props, function(key) { - return isFunction(object[key]); - }); - } - - /** - * The base implementation of `getTag` without fallbacks for buggy environments. - * - * @private - * @param {*} value The value to query. - * @returns {string} Returns the `toStringTag`. - */ - function baseGetTag(value) { - return objectToString(value); - } - - /** - * The base implementation of `_.gt` which doesn't coerce arguments. - * - * @private - * @param {*} value The value to compare. - * @param {*} other The other value to compare. - * @returns {boolean} Returns `true` if `value` is greater than `other`, - * else `false`. - */ - function baseGt(value, other) { - return value > other; + function baseGt(value, other) { + return value > other; } /** @@ -15725,161 +15252,154 @@ module.exports = get; }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{}],44:[function(require,module,exports){ -module.exports = MultiStream - -var inherits = require('inherits') +},{}],43:[function(require,module,exports){ var stream = require('readable-stream') -inherits(MultiStream, stream.Readable) - -function MultiStream (streams, opts) { - var self = this - if (!(self instanceof MultiStream)) return new MultiStream(streams, opts) - stream.Readable.call(self, opts) +function toStreams2Obj (s) { + return toStreams2(s, { objectMode: true, highWaterMark: 16 }) +} - self.destroyed = false +function toStreams2Buf (s) { + return toStreams2(s) +} - self._drained = false - self._forwarding = false - self._current = null - self._toStreams2 = (opts && opts.objectMode) ? toStreams2Obj : toStreams2Buf +function toStreams2 (s, opts) { + if (!s || typeof s === 'function' || s._readableState) return s - if (typeof streams === 'function') { - self._queue = streams - } else { - self._queue = streams.map(self._toStreams2) - self._queue.forEach(function (stream) { - if (typeof stream !== 'function') self._attachErrorListener(stream) - }) + var wrap = new stream.Readable(opts).wrap(s) + if (s.destroy) { + wrap.destroy = s.destroy.bind(s) } - - self._next() + return wrap } -MultiStream.obj = function (streams) { - return new MultiStream(streams, { objectMode: true, highWaterMark: 16 }) -} +class MultiStream extends stream.Readable { + constructor (streams, opts) { + super(opts) -MultiStream.prototype._read = function () { - this._drained = true - this._forward() -} + this.destroyed = false + + this._drained = false + this._forwarding = false + this._current = null + this._toStreams2 = (opts && opts.objectMode) ? toStreams2Obj : toStreams2Buf + + if (typeof streams === 'function') { + this._queue = streams + } else { + this._queue = streams.map(this._toStreams2) + this._queue.forEach(stream => { + if (typeof stream !== 'function') this._attachErrorListener(stream) + }) + } -MultiStream.prototype._forward = function () { - if (this._forwarding || !this._drained || !this._current) return - this._forwarding = true + this._next() + } - var chunk - while ((chunk = this._current.read()) !== null) { - this._drained = this.push(chunk) + _read () { + this._drained = true + this._forward() } - this._forwarding = false -} + _forward () { + if (this._forwarding || !this._drained || !this._current) return + this._forwarding = true -MultiStream.prototype.destroy = function (err) { - if (this.destroyed) return - this.destroyed = true + var chunk + while ((chunk = this._current.read()) !== null && this._drained) { + this._drained = this.push(chunk) + } - if (this._current && this._current.destroy) this._current.destroy() - if (typeof this._queue !== 'function') { - this._queue.forEach(function (stream) { - if (stream.destroy) stream.destroy() - }) + this._forwarding = false } - if (err) this.emit('error', err) - this.emit('close') -} - -MultiStream.prototype._next = function () { - var self = this - self._current = null + destroy (err) { + if (this.destroyed) return + this.destroyed = true - if (typeof self._queue === 'function') { - self._queue(function (err, stream) { - if (err) return self.destroy(err) - stream = self._toStreams2(stream) - self._attachErrorListener(stream) - self._gotNextStream(stream) - }) - } else { - var stream = self._queue.shift() - if (typeof stream === 'function') { - stream = self._toStreams2(stream()) - self._attachErrorListener(stream) + if (this._current && this._current.destroy) this._current.destroy() + if (typeof this._queue !== 'function') { + this._queue.forEach(stream => { + if (stream.destroy) stream.destroy() + }) } - self._gotNextStream(stream) + + if (err) this.emit('error', err) + this.emit('close') } -} -MultiStream.prototype._gotNextStream = function (stream) { - var self = this + _next () { + this._current = null - if (!stream) { - self.push(null) - self.destroy() - return + if (typeof this._queue === 'function') { + this._queue((err, stream) => { + if (err) return this.destroy(err) + stream = this._toStreams2(stream) + this._attachErrorListener(stream) + this._gotNextStream(stream) + }) + } else { + var stream = this._queue.shift() + if (typeof stream === 'function') { + stream = this._toStreams2(stream()) + this._attachErrorListener(stream) + } + this._gotNextStream(stream) + } } - self._current = stream - self._forward() + _gotNextStream (stream) { + if (!stream) { + this.push(null) + this.destroy() + return + } - stream.on('readable', onReadable) - stream.once('end', onEnd) - stream.once('close', onClose) + this._current = stream + this._forward() - function onReadable () { - self._forward() - } + const onReadable = () => { + this._forward() + } - function onClose () { - if (!stream._readableState.ended) { - self.destroy() + const onClose = () => { + if (!stream._readableState.ended) { + this.destroy() + } } - } - function onEnd () { - self._current = null - stream.removeListener('readable', onReadable) - stream.removeListener('end', onEnd) - stream.removeListener('close', onClose) - self._next() + const onEnd = () => { + this._current = null + stream.removeListener('readable', onReadable) + stream.removeListener('end', onEnd) + stream.removeListener('close', onClose) + this._next() + } + + stream.on('readable', onReadable) + stream.once('end', onEnd) + stream.once('close', onClose) } -} -MultiStream.prototype._attachErrorListener = function (stream) { - var self = this - if (!stream) return + _attachErrorListener (stream) { + if (!stream) return - stream.once('error', onError) + const onError = (err) => { + stream.removeListener('error', onError) + this.destroy(err) + } - function onError (err) { - stream.removeListener('error', onError) - self.destroy(err) + stream.once('error', onError) } } -function toStreams2Obj (s) { - return toStreams2(s, {objectMode: true, highWaterMark: 16}) -} +MultiStream.obj = streams => ( + new MultiStream(streams, { objectMode: true, highWaterMark: 16 }) +) -function toStreams2Buf (s) { - return toStreams2(s) -} - -function toStreams2 (s, opts) { - if (!s || typeof s === 'function' || s._readableState) return s - - var wrap = new stream.Readable(opts).wrap(s) - if (s.destroy) { - wrap.destroy = s.destroy.bind(s) - } - return wrap -} +module.exports = MultiStream -},{"inherits":39,"readable-stream":62}],45:[function(require,module,exports){ +},{"readable-stream":65}],44:[function(require,module,exports){ (function (process){ 'use strict'; @@ -15928,7 +15448,7 @@ function nextTick(fn, arg1, arg2, arg3) { }).call(this,require('_process')) -},{"_process":46}],46:[function(require,module,exports){ +},{"_process":45}],45:[function(require,module,exports){ // shim for using process in browser var process = module.exports = {}; @@ -16114,7 +15634,7 @@ process.chdir = function (dir) { }; process.umask = function() { return 0; }; -},{}],47:[function(require,module,exports){ +},{}],46:[function(require,module,exports){ 'use strict'; var asap = require('asap/raw'); @@ -16175,16 +15695,16 @@ function Promise(fn) { if (typeof fn !== 'function') { throw new TypeError('Promise constructor\'s argument is not a function'); } - this._40 = 0; - this._65 = 0; - this._55 = null; - this._72 = null; + this._U = 0; + this._V = 0; + this._W = null; + this._X = null; if (fn === noop) return; doResolve(fn, this); } -Promise._37 = null; -Promise._87 = null; -Promise._61 = noop; +Promise._Y = null; +Promise._Z = null; +Promise._0 = noop; Promise.prototype.then = function(onFulfilled, onRejected) { if (this.constructor !== Promise) { @@ -16203,24 +15723,24 @@ function safeThen(self, onFulfilled, onRejected) { }); } function handle(self, deferred) { - while (self._65 === 3) { - self = self._55; + while (self._V === 3) { + self = self._W; } - if (Promise._37) { - Promise._37(self); + if (Promise._Y) { + Promise._Y(self); } - if (self._65 === 0) { - if (self._40 === 0) { - self._40 = 1; - self._72 = deferred; + if (self._V === 0) { + if (self._U === 0) { + self._U = 1; + self._X = deferred; return; } - if (self._40 === 1) { - self._40 = 2; - self._72 = [self._72, deferred]; + if (self._U === 1) { + self._U = 2; + self._X = [self._X, deferred]; return; } - self._72.push(deferred); + self._X.push(deferred); return; } handleResolved(self, deferred); @@ -16228,16 +15748,16 @@ function handle(self, deferred) { function handleResolved(self, deferred) { asap(function() { - var cb = self._65 === 1 ? deferred.onFulfilled : deferred.onRejected; + var cb = self._V === 1 ? deferred.onFulfilled : deferred.onRejected; if (cb === null) { - if (self._65 === 1) { - resolve(deferred.promise, self._55); + if (self._V === 1) { + resolve(deferred.promise, self._W); } else { - reject(deferred.promise, self._55); + reject(deferred.promise, self._W); } return; } - var ret = tryCallOne(cb, self._55); + var ret = tryCallOne(cb, self._W); if (ret === IS_ERROR) { reject(deferred.promise, LAST_ERROR); } else { @@ -16265,8 +15785,8 @@ function resolve(self, newValue) { then === self.then && newValue instanceof Promise ) { - self._65 = 3; - self._55 = newValue; + self._V = 3; + self._W = newValue; finale(self); return; } else if (typeof then === 'function') { @@ -16274,29 +15794,29 @@ function resolve(self, newValue) { return; } } - self._65 = 1; - self._55 = newValue; + self._V = 1; + self._W = newValue; finale(self); } function reject(self, newValue) { - self._65 = 2; - self._55 = newValue; - if (Promise._87) { - Promise._87(self, newValue); + self._V = 2; + self._W = newValue; + if (Promise._Z) { + Promise._Z(self, newValue); } finale(self); } function finale(self) { - if (self._40 === 1) { - handle(self, self._72); - self._72 = null; + if (self._U === 1) { + handle(self, self._X); + self._X = null; } - if (self._40 === 2) { - for (var i = 0; i < self._72.length; i++) { - handle(self, self._72[i]); + if (self._U === 2) { + for (var i = 0; i < self._X.length; i++) { + handle(self, self._X[i]); } - self._72 = null; + self._X = null; } } @@ -16329,7 +15849,7 @@ function doResolve(fn, promise) { } } -},{"asap/raw":27}],48:[function(require,module,exports){ +},{"asap/raw":27}],47:[function(require,module,exports){ 'use strict'; //This file contains the ES6 extensions to the core Promises/A+ API @@ -16348,9 +15868,9 @@ var ZERO = valuePromise(0); var EMPTYSTRING = valuePromise(''); function valuePromise(value) { - var p = new Promise(Promise._61); - p._65 = 1; - p._55 = value; + var p = new Promise(Promise._0); + p._V = 1; + p._W = value; return p; } Promise.resolve = function (value) { @@ -16378,8 +15898,20 @@ Promise.resolve = function (value) { return valuePromise(value); }; +var iterableToArray = function (iterable) { + if (typeof Array.from === 'function') { + // ES2015+, iterables exist + iterableToArray = Array.from; + return Array.from(iterable); + } + + // ES5, only arrays and array-likes exist + iterableToArray = function (x) { return Array.prototype.slice.call(x); }; + return Array.prototype.slice.call(iterable); +} + Promise.all = function (arr) { - var args = Array.prototype.slice.call(arr); + var args = iterableToArray(arr); return new Promise(function (resolve, reject) { if (args.length === 0) return resolve([]); @@ -16387,11 +15919,11 @@ Promise.all = function (arr) { function res(i, val) { if (val && (typeof val === 'object' || typeof val === 'function')) { if (val instanceof Promise && val.then === Promise.prototype.then) { - while (val._65 === 3) { - val = val._55; + while (val._V === 3) { + val = val._W; } - if (val._65 === 1) return res(i, val._55); - if (val._65 === 2) reject(val._55); + if (val._V === 1) return res(i, val._W); + if (val._V === 2) reject(val._W); val.then(function (val) { res(i, val); }, reject); @@ -16426,7 +15958,7 @@ Promise.reject = function (value) { Promise.race = function (values) { return new Promise(function (resolve, reject) { - values.forEach(function(value){ + iterableToArray(values).forEach(function(value){ Promise.resolve(value).then(resolve, reject); }); }); @@ -16438,7 +15970,7 @@ Promise.prototype['catch'] = function (onRejected) { return this.then(null, onRejected); }; -},{"./core.js":47}],49:[function(require,module,exports){ +},{"./core.js":46}],48:[function(require,module,exports){ // Copyright Joyent, Inc. and other Node contributors. // // Permission is hereby granted, free of charge, to any person obtaining a @@ -16524,7 +16056,7 @@ var isArray = Array.isArray || function (xs) { return Object.prototype.toString.call(xs) === '[object Array]'; }; -},{}],50:[function(require,module,exports){ +},{}],49:[function(require,module,exports){ // Copyright Joyent, Inc. and other Node contributors. // // Permission is hereby granted, free of charge, to any person obtaining a @@ -16611,16 +16143,143 @@ var objectKeys = Object.keys || function (obj) { return res; }; -},{}],51:[function(require,module,exports){ +},{}],50:[function(require,module,exports){ 'use strict'; exports.decode = exports.parse = require('./decode'); exports.encode = exports.stringify = require('./encode'); -},{"./decode":49,"./encode":50}],52:[function(require,module,exports){ -module.exports = require('./lib/_stream_duplex.js'); +},{"./decode":48,"./encode":49}],51:[function(require,module,exports){ +'use strict'; + +function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; } + +var codes = {}; + +function createErrorType(code, message, Base) { + if (!Base) { + Base = Error; + } + + function getMessage(arg1, arg2, arg3) { + if (typeof message === 'string') { + return message; + } else { + return message(arg1, arg2, arg3); + } + } + + var NodeError = + /*#__PURE__*/ + function (_Base) { + _inheritsLoose(NodeError, _Base); + + function NodeError(arg1, arg2, arg3) { + return _Base.call(this, getMessage(arg1, arg2, arg3)) || this; + } + + return NodeError; + }(Base); -},{"./lib/_stream_duplex.js":53}],53:[function(require,module,exports){ + NodeError.prototype.name = Base.name; + NodeError.prototype.code = code; + codes[code] = NodeError; +} // https://github.com/nodejs/node/blob/v10.8.0/lib/internal/errors.js + + +function oneOf(expected, thing) { + if (Array.isArray(expected)) { + var len = expected.length; + expected = expected.map(function (i) { + return String(i); + }); + + if (len > 2) { + return "one of ".concat(thing, " ").concat(expected.slice(0, len - 1).join(', '), ", or ") + expected[len - 1]; + } else if (len === 2) { + return "one of ".concat(thing, " ").concat(expected[0], " or ").concat(expected[1]); + } else { + return "of ".concat(thing, " ").concat(expected[0]); + } + } else { + return "of ".concat(thing, " ").concat(String(expected)); + } +} // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/startsWith + + +function startsWith(str, search, pos) { + return str.substr(!pos || pos < 0 ? 0 : +pos, search.length) === search; +} // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/endsWith + + +function endsWith(str, search, this_len) { + if (this_len === undefined || this_len > str.length) { + this_len = str.length; + } + + return str.substring(this_len - search.length, this_len) === search; +} // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/includes + + +function includes(str, search, start) { + if (typeof start !== 'number') { + start = 0; + } + + if (start + search.length > str.length) { + return false; + } else { + return str.indexOf(search, start) !== -1; + } +} + +createErrorType('ERR_INVALID_OPT_VALUE', function (name, value) { + return 'The value "' + value + '" is invalid for option "' + name + '"'; +}, TypeError); +createErrorType('ERR_INVALID_ARG_TYPE', function (name, expected, actual) { + // determiner: 'must be' or 'must not be' + var determiner; + + if (typeof expected === 'string' && startsWith(expected, 'not ')) { + determiner = 'must not be'; + expected = expected.replace(/^not /, ''); + } else { + determiner = 'must be'; + } + + var msg; + + if (endsWith(name, ' argument')) { + // For cases like 'first argument' + msg = "The ".concat(name, " ").concat(determiner, " ").concat(oneOf(expected, 'type')); + } else { + var type = includes(name, '.') ? 'property' : 'argument'; + msg = "The \"".concat(name, "\" ").concat(type, " ").concat(determiner, " ").concat(oneOf(expected, 'type')); + } + + msg += ". Received type ".concat(typeof actual); + return msg; +}, TypeError); +createErrorType('ERR_STREAM_PUSH_AFTER_EOF', 'stream.push() after EOF'); +createErrorType('ERR_METHOD_NOT_IMPLEMENTED', function (name) { + return 'The ' + name + ' method is not implemented'; +}); +createErrorType('ERR_STREAM_PREMATURE_CLOSE', 'Premature close'); +createErrorType('ERR_STREAM_DESTROYED', function (name) { + return 'Cannot call ' + name + ' after a stream was destroyed'; +}); +createErrorType('ERR_MULTIPLE_CALLBACK', 'Callback called multiple times'); +createErrorType('ERR_STREAM_CANNOT_PIPE', 'Cannot pipe, not readable'); +createErrorType('ERR_STREAM_WRITE_AFTER_END', 'write after end'); +createErrorType('ERR_STREAM_NULL_VALUES', 'May not write null values to stream', TypeError); +createErrorType('ERR_UNKNOWN_ENCODING', function (arg) { + return 'Unknown encoding: ' + arg; +}, TypeError); +createErrorType('ERR_STREAM_UNSHIFT_AFTER_END_EVENT', 'stream.unshift() after end event'); +module.exports.codes = codes; + +},{}],52:[function(require,module,exports){ +(function (process){ // Copyright Joyent, Inc. and other Node contributors. // // Permission is hereby granted, free of charge, to any person obtaining a @@ -16641,43 +16300,37 @@ module.exports = require('./lib/_stream_duplex.js'); // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE // USE OR OTHER DEALINGS IN THE SOFTWARE. - // a duplex stream is just a stream that is both readable and writable. // Since JS doesn't have multiple prototypal inheritance, this class // prototypally inherits from Readable, and then parasitically from // Writable. - 'use strict'; - /**/ -var pna = require('process-nextick-args'); -/**/ - -/**/ var objectKeys = Object.keys || function (obj) { var keys = []; + for (var key in obj) { keys.push(key); - }return keys; + } + + return keys; }; /**/ -module.exports = Duplex; -/**/ -var util = require('core-util-is'); -util.inherits = require('inherits'); -/**/ +module.exports = Duplex; var Readable = require('./_stream_readable'); + var Writable = require('./_stream_writable'); -util.inherits(Duplex, Readable); +require('inherits')(Duplex, Readable); { - // avoid scope creep, the keys array can then be collected + // Allow the keys array to be GC'ed. var keys = objectKeys(Writable.prototype); + for (var v = 0; v < keys.length; v++) { var method = keys[v]; if (!Duplex.prototype[method]) Duplex.prototype[method] = Writable.prototype[method]; @@ -16686,18 +16339,19 @@ util.inherits(Duplex, Readable); function Duplex(options) { if (!(this instanceof Duplex)) return new Duplex(options); - Readable.call(this, options); Writable.call(this, options); - - if (options && options.readable === false) this.readable = false; - - if (options && options.writable === false) this.writable = false; - this.allowHalfOpen = true; - if (options && options.allowHalfOpen === false) this.allowHalfOpen = false; - this.once('end', onend); + if (options) { + if (options.readable === false) this.readable = false; + if (options.writable === false) this.writable = false; + + if (options.allowHalfOpen === false) { + this.allowHalfOpen = false; + this.once('end', onend); + } + } } Object.defineProperty(Duplex.prototype, 'writableHighWaterMark', { @@ -16705,20 +16359,35 @@ Object.defineProperty(Duplex.prototype, 'writableHighWaterMark', { // because otherwise some prototype manipulation in // userland will fail enumerable: false, - get: function () { + get: function get() { return this._writableState.highWaterMark; } }); +Object.defineProperty(Duplex.prototype, 'writableBuffer', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get() { + return this._writableState && this._writableState.getBuffer(); + } +}); +Object.defineProperty(Duplex.prototype, 'writableLength', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get() { + return this._writableState.length; + } +}); // the no-half-open enforcer -// the no-half-open enforcer function onend() { - // if we allow half-open state, or if the writable side ended, - // then we're ok. - if (this.allowHalfOpen || this._writableState.ended) return; - - // no more data can be written. + // If the writable side ended, then we're ok. + if (this._writableState.ended) return; // no more data can be written. // But allow more writes to happen in this tick. - pna.nextTick(onEndNT, this); + + process.nextTick(onEndNT, this); } function onEndNT(self) { @@ -16726,33 +16395,33 @@ function onEndNT(self) { } Object.defineProperty(Duplex.prototype, 'destroyed', { - get: function () { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get() { if (this._readableState === undefined || this._writableState === undefined) { return false; } + return this._readableState.destroyed && this._writableState.destroyed; }, - set: function (value) { + set: function set(value) { // we ignore the value if the stream // has not been initialized yet if (this._readableState === undefined || this._writableState === undefined) { return; - } - - // backward compatibility, the user is explicitly + } // backward compatibility, the user is explicitly // managing destroyed + + this._readableState.destroyed = value; this._writableState.destroyed = value; } }); +}).call(this,require('_process')) -Duplex.prototype._destroy = function (err, cb) { - this.push(null); - this.end(); - - pna.nextTick(cb, err); -}; -},{"./_stream_readable":55,"./_stream_writable":57,"core-util-is":31,"inherits":39,"process-nextick-args":45}],54:[function(require,module,exports){ +},{"./_stream_readable":54,"./_stream_writable":56,"_process":45,"inherits":39}],53:[function(require,module,exports){ // Copyright Joyent, Inc. and other Node contributors. // // Permission is hereby granted, free of charge, to any person obtaining a @@ -16773,34 +16442,26 @@ Duplex.prototype._destroy = function (err, cb) { // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE // USE OR OTHER DEALINGS IN THE SOFTWARE. - // a passthrough stream. // basically just the most minimal sort of Transform stream. // Every written chunk gets output as-is. - 'use strict'; module.exports = PassThrough; var Transform = require('./_stream_transform'); -/**/ -var util = require('core-util-is'); -util.inherits = require('inherits'); -/**/ - -util.inherits(PassThrough, Transform); +require('inherits')(PassThrough, Transform); function PassThrough(options) { if (!(this instanceof PassThrough)) return new PassThrough(options); - Transform.call(this, options); } PassThrough.prototype._transform = function (chunk, encoding, cb) { cb(null, chunk); }; -},{"./_stream_transform":56,"core-util-is":31,"inherits":39}],55:[function(require,module,exports){ +},{"./_stream_transform":55,"inherits":39}],54:[function(require,module,exports){ (function (process,global){ // Copyright Joyent, Inc. and other Node contributors. // @@ -16822,118 +16483,110 @@ PassThrough.prototype._transform = function (chunk, encoding, cb) { // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE // USE OR OTHER DEALINGS IN THE SOFTWARE. - 'use strict'; -/**/ - -var pna = require('process-nextick-args'); -/**/ - module.exports = Readable; - /**/ -var isArray = require('isarray'); -/**/ -/**/ var Duplex; /**/ Readable.ReadableState = ReadableState; - /**/ + var EE = require('events').EventEmitter; -var EElistenerCount = function (emitter, type) { +var EElistenerCount = function EElistenerCount(emitter, type) { return emitter.listeners(type).length; }; /**/ /**/ + + var Stream = require('./internal/streams/stream'); /**/ -/**/ -var Buffer = require('safe-buffer').Buffer; +var Buffer = require('buffer').Buffer; + var OurUint8Array = global.Uint8Array || function () {}; + function _uint8ArrayToBuffer(chunk) { return Buffer.from(chunk); } + function _isUint8Array(obj) { return Buffer.isBuffer(obj) || obj instanceof OurUint8Array; } - -/**/ - /**/ -var util = require('core-util-is'); -util.inherits = require('inherits'); -/**/ -/**/ + var debugUtil = require('util'); -var debug = void 0; + +var debug; + if (debugUtil && debugUtil.debuglog) { debug = debugUtil.debuglog('stream'); } else { - debug = function () {}; + debug = function debug() {}; } /**/ -var BufferList = require('./internal/streams/BufferList'); + +var BufferList = require('./internal/streams/buffer_list'); + var destroyImpl = require('./internal/streams/destroy'); + +var _require = require('./internal/streams/state'), + getHighWaterMark = _require.getHighWaterMark; + +var _require$codes = require('../errors').codes, + ERR_INVALID_ARG_TYPE = _require$codes.ERR_INVALID_ARG_TYPE, + ERR_STREAM_PUSH_AFTER_EOF = _require$codes.ERR_STREAM_PUSH_AFTER_EOF, + ERR_METHOD_NOT_IMPLEMENTED = _require$codes.ERR_METHOD_NOT_IMPLEMENTED, + ERR_STREAM_UNSHIFT_AFTER_END_EVENT = _require$codes.ERR_STREAM_UNSHIFT_AFTER_END_EVENT; // Lazy loaded to improve the startup performance. + + var StringDecoder; +var createReadableStreamAsyncIterator; +var from; -util.inherits(Readable, Stream); +require('inherits')(Readable, Stream); +var errorOrDestroy = destroyImpl.errorOrDestroy; var kProxyEvents = ['error', 'close', 'destroy', 'pause', 'resume']; function prependListener(emitter, event, fn) { // Sadly this is not cacheable as some libraries bundle their own // event emitter implementation with them. - if (typeof emitter.prependListener === 'function') return emitter.prependListener(event, fn); - - // This is a hack to make sure that our error handler is attached before any + if (typeof emitter.prependListener === 'function') return emitter.prependListener(event, fn); // This is a hack to make sure that our error handler is attached before any // userland ones. NEVER DO THIS. This is here only because this code needs // to continue to work with older versions of Node.js that do not include // the prependListener() method. The goal is to eventually remove this hack. - if (!emitter._events || !emitter._events[event]) emitter.on(event, fn);else if (isArray(emitter._events[event])) emitter._events[event].unshift(fn);else emitter._events[event] = [fn, emitter._events[event]]; + + if (!emitter._events || !emitter._events[event]) emitter.on(event, fn);else if (Array.isArray(emitter._events[event])) emitter._events[event].unshift(fn);else emitter._events[event] = [fn, emitter._events[event]]; } -function ReadableState(options, stream) { +function ReadableState(options, stream, isDuplex) { Duplex = Duplex || require('./_stream_duplex'); - - options = options || {}; - - // Duplex streams are both readable and writable, but share + options = options || {}; // Duplex streams are both readable and writable, but share // the same options object. // However, some cases require setting options to different // values for the readable and the writable sides of the duplex stream. // These options can be provided separately as readableXXX and writableXXX. - var isDuplex = stream instanceof Duplex; - // object stream flag. Used to make read(n) ignore n and to + if (typeof isDuplex !== 'boolean') isDuplex = stream instanceof Duplex; // object stream flag. Used to make read(n) ignore n and to // make all the buffer merging and length checks go away - this.objectMode = !!options.objectMode; - - if (isDuplex) this.objectMode = this.objectMode || !!options.readableObjectMode; - // the point at which it stops calling _read() to fill the buffer + this.objectMode = !!options.objectMode; + if (isDuplex) this.objectMode = this.objectMode || !!options.readableObjectMode; // the point at which it stops calling _read() to fill the buffer // Note: 0 is a valid value, means "don't call _read preemptively ever" - var hwm = options.highWaterMark; - var readableHwm = options.readableHighWaterMark; - var defaultHwm = this.objectMode ? 16 : 16 * 1024; - - if (hwm || hwm === 0) this.highWaterMark = hwm;else if (isDuplex && (readableHwm || readableHwm === 0)) this.highWaterMark = readableHwm;else this.highWaterMark = defaultHwm; - - // cast to ints. - this.highWaterMark = Math.floor(this.highWaterMark); - // A linked list is used to store data chunks instead of an array because the + this.highWaterMark = getHighWaterMark(this, options, 'readableHighWaterMark', isDuplex); // A linked list is used to store data chunks instead of an array because the // linked list can remove elements from the beginning faster than // array.shift() + this.buffer = new BufferList(); this.length = 0; this.pipes = null; @@ -16941,37 +16594,36 @@ function ReadableState(options, stream) { this.flowing = null; this.ended = false; this.endEmitted = false; - this.reading = false; - - // a flag to be able to tell if the event 'readable'/'data' is emitted + this.reading = false; // a flag to be able to tell if the event 'readable'/'data' is emitted // immediately, or on a later tick. We set this to true at first, because // any actions that shouldn't happen until "later" should generally also // not happen before the first read call. - this.sync = true; - // whenever we return null, then we set a flag to say + this.sync = true; // whenever we return null, then we set a flag to say // that we're awaiting a 'readable' event emission. + this.needReadable = false; this.emittedReadable = false; this.readableListening = false; this.resumeScheduled = false; + this.paused = true; // Should close be emitted on destroy. Defaults to true. - // has it been destroyed - this.destroyed = false; + this.emitClose = options.emitClose !== false; // Should .destroy() be called after 'end' (and potentially 'finish') - // Crypto is kind of old and crusty. Historically, its default string + this.autoDestroy = !!options.autoDestroy; // has it been destroyed + + this.destroyed = false; // Crypto is kind of old and crusty. Historically, its default string // encoding is 'binary' so we have to make this configurable. // Everything else in the universe uses 'utf8', though. - this.defaultEncoding = options.defaultEncoding || 'utf8'; - // the number of writers that are awaiting a drain event in .pipe()s - this.awaitDrain = 0; + this.defaultEncoding = options.defaultEncoding || 'utf8'; // the number of writers that are awaiting a drain event in .pipe()s - // if true, a maybeReadMore has been scheduled - this.readingMore = false; + this.awaitDrain = 0; // if true, a maybeReadMore has been scheduled + this.readingMore = false; this.decoder = null; this.encoding = null; + if (options.encoding) { if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder; this.decoder = new StringDecoder(options.encoding); @@ -16981,17 +16633,16 @@ function ReadableState(options, stream) { function Readable(options) { Duplex = Duplex || require('./_stream_duplex'); + if (!(this instanceof Readable)) return new Readable(options); // Checking for a Stream.Duplex instance is faster here instead of inside + // the ReadableState constructor, at least with V8 6.5 - if (!(this instanceof Readable)) return new Readable(options); - - this._readableState = new ReadableState(options, this); + var isDuplex = this instanceof Duplex; + this._readableState = new ReadableState(options, this, isDuplex); // legacy - // legacy this.readable = true; if (options) { if (typeof options.read === 'function') this._read = options.read; - if (typeof options.destroy === 'function') this._destroy = options.destroy; } @@ -16999,36 +16650,40 @@ function Readable(options) { } Object.defineProperty(Readable.prototype, 'destroyed', { - get: function () { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get() { if (this._readableState === undefined) { return false; } + return this._readableState.destroyed; }, - set: function (value) { + set: function set(value) { // we ignore the value if the stream // has not been initialized yet if (!this._readableState) { return; - } - - // backward compatibility, the user is explicitly + } // backward compatibility, the user is explicitly // managing destroyed + + this._readableState.destroyed = value; } }); - Readable.prototype.destroy = destroyImpl.destroy; Readable.prototype._undestroy = destroyImpl.undestroy; + Readable.prototype._destroy = function (err, cb) { - this.push(null); cb(err); -}; - -// Manually shove something into the read() buffer. +}; // Manually shove something into the read() buffer. // This returns true if the highWaterMark has not been hit yet, // similar to how Writable.write() returns true if you should // write() some more. + + Readable.prototype.push = function (chunk, encoding) { var state = this._readableState; var skipChunkCheck; @@ -17036,10 +16691,12 @@ Readable.prototype.push = function (chunk, encoding) { if (!state.objectMode) { if (typeof chunk === 'string') { encoding = encoding || state.defaultEncoding; + if (encoding !== state.encoding) { chunk = Buffer.from(chunk, encoding); encoding = ''; } + skipChunkCheck = true; } } else { @@ -17047,34 +16704,40 @@ Readable.prototype.push = function (chunk, encoding) { } return readableAddChunk(this, chunk, encoding, false, skipChunkCheck); -}; +}; // Unshift should *always* be something directly out of read() + -// Unshift should *always* be something directly out of read() Readable.prototype.unshift = function (chunk) { return readableAddChunk(this, chunk, null, true, false); }; function readableAddChunk(stream, chunk, encoding, addToFront, skipChunkCheck) { + debug('readableAddChunk', chunk); var state = stream._readableState; + if (chunk === null) { state.reading = false; onEofChunk(stream, state); } else { var er; if (!skipChunkCheck) er = chunkInvalid(state, chunk); + if (er) { - stream.emit('error', er); + errorOrDestroy(stream, er); } else if (state.objectMode || chunk && chunk.length > 0) { if (typeof chunk !== 'string' && !state.objectMode && Object.getPrototypeOf(chunk) !== Buffer.prototype) { chunk = _uint8ArrayToBuffer(chunk); } if (addToFront) { - if (state.endEmitted) stream.emit('error', new Error('stream.unshift() after end event'));else addChunk(stream, state, chunk, true); + if (state.endEmitted) errorOrDestroy(stream, new ERR_STREAM_UNSHIFT_AFTER_END_EVENT());else addChunk(stream, state, chunk, true); } else if (state.ended) { - stream.emit('error', new Error('stream.push() after EOF')); + errorOrDestroy(stream, new ERR_STREAM_PUSH_AFTER_EOF()); + } else if (state.destroyed) { + return false; } else { state.reading = false; + if (state.decoder && !encoding) { chunk = state.decoder.write(chunk); if (state.objectMode || chunk.length !== 0) addChunk(stream, state, chunk, false);else maybeReadMore(stream, state); @@ -17084,61 +16747,73 @@ function readableAddChunk(stream, chunk, encoding, addToFront, skipChunkCheck) { } } else if (!addToFront) { state.reading = false; + maybeReadMore(stream, state); } - } + } // We can push more data if we are below the highWaterMark. + // Also, if we have no data yet, we can stand some more bytes. + // This is to work around cases where hwm=0, such as the repl. - return needMoreData(state); + + return !state.ended && (state.length < state.highWaterMark || state.length === 0); } function addChunk(stream, state, chunk, addToFront) { if (state.flowing && state.length === 0 && !state.sync) { + state.awaitDrain = 0; stream.emit('data', chunk); - stream.read(0); } else { // update the buffer info. state.length += state.objectMode ? 1 : chunk.length; if (addToFront) state.buffer.unshift(chunk);else state.buffer.push(chunk); - if (state.needReadable) emitReadable(stream); } + maybeReadMore(stream, state); } function chunkInvalid(state, chunk) { var er; + if (!_isUint8Array(chunk) && typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) { - er = new TypeError('Invalid non-string/buffer chunk'); + er = new ERR_INVALID_ARG_TYPE('chunk', ['string', 'Buffer', 'Uint8Array'], chunk); } - return er; -} -// if it's past the high water mark, we can push in some more. -// Also, if we have no data yet, we can stand some -// more bytes. This is to work around cases where hwm=0, -// such as the repl. Also, if the push() triggered a -// readable event, and the user called read(largeNumber) such that -// needReadable was set, then we ought to push more, so that another -// 'readable' event will be triggered. -function needMoreData(state) { - return !state.ended && (state.needReadable || state.length < state.highWaterMark || state.length === 0); + return er; } Readable.prototype.isPaused = function () { return this._readableState.flowing === false; -}; +}; // backwards compatibility. + -// backwards compatibility. Readable.prototype.setEncoding = function (enc) { if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder; - this._readableState.decoder = new StringDecoder(enc); - this._readableState.encoding = enc; + var decoder = new StringDecoder(enc); + this._readableState.decoder = decoder; // If setEncoding(null), decoder.encoding equals utf8 + + this._readableState.encoding = this._readableState.decoder.encoding; // Iterate over current buffer to convert already stored Buffers: + + var p = this._readableState.buffer.head; + var content = ''; + + while (p !== null) { + content += decoder.write(p.data); + p = p.next; + } + + this._readableState.buffer.clear(); + + if (content !== '') this._readableState.buffer.push(content); + this._readableState.length = content.length; return this; -}; +}; // Don't raise the hwm > 1GB + + +var MAX_HWM = 0x40000000; -// Don't raise the hwm > 8MB -var MAX_HWM = 0x800000; function computeNewHighWaterMark(n) { if (n >= MAX_HWM) { + // TODO(ronag): Throw ERR_VALUE_OUT_OF_RANGE. n = MAX_HWM; } else { // Get the next highest power of 2 to prevent increasing hwm excessively in @@ -17151,56 +16826,55 @@ function computeNewHighWaterMark(n) { n |= n >>> 16; n++; } - return n; -} -// This function is designed to be inlinable, so please take care when making + return n; +} // This function is designed to be inlinable, so please take care when making // changes to the function body. + + function howMuchToRead(n, state) { if (n <= 0 || state.length === 0 && state.ended) return 0; if (state.objectMode) return 1; + if (n !== n) { // Only flow one buffer at a time if (state.flowing && state.length) return state.buffer.head.data.length;else return state.length; - } - // If we're asking for more than the current hwm, then raise the hwm. + } // If we're asking for more than the current hwm, then raise the hwm. + + if (n > state.highWaterMark) state.highWaterMark = computeNewHighWaterMark(n); - if (n <= state.length) return n; - // Don't have enough + if (n <= state.length) return n; // Don't have enough + if (!state.ended) { state.needReadable = true; return 0; } + return state.length; -} +} // you can override either this method, or the async _read(n) below. + -// you can override either this method, or the async _read(n) below. Readable.prototype.read = function (n) { debug('read', n); n = parseInt(n, 10); var state = this._readableState; var nOrig = n; - - if (n !== 0) state.emittedReadable = false; - - // if we're doing read(0) to trigger a readable event, but we + if (n !== 0) state.emittedReadable = false; // if we're doing read(0) to trigger a readable event, but we // already have a bunch of data in the buffer, then just trigger // the 'readable' event and move on. - if (n === 0 && state.needReadable && (state.length >= state.highWaterMark || state.ended)) { + + if (n === 0 && state.needReadable && ((state.highWaterMark !== 0 ? state.length >= state.highWaterMark : state.length > 0) || state.ended)) { debug('read: emitReadable', state.length, state.ended); if (state.length === 0 && state.ended) endReadable(this);else emitReadable(this); return null; } - n = howMuchToRead(n, state); + n = howMuchToRead(n, state); // if we've ended, and we're now clear, then finish it up. - // if we've ended, and we're now clear, then finish it up. if (n === 0 && state.ended) { if (state.length === 0) endReadable(this); return null; - } - - // All the actual chunk generation logic needs to be + } // All the actual chunk generation logic needs to be // *below* the call to _read. The reason is that in certain // synthetic stream cases, such as passthrough streams, _read // may be a completely synchronous operation which may change @@ -17221,33 +16895,34 @@ Readable.prototype.read = function (n) { // 'readable' etc. // // 3. Actually pull the requested chunks out of the buffer and return. - // if we need a readable event, then we need to do some reading. + + var doRead = state.needReadable; - debug('need readable', doRead); + debug('need readable', doRead); // if we currently have less than the highWaterMark, then also read some - // if we currently have less than the highWaterMark, then also read some if (state.length === 0 || state.length - n < state.highWaterMark) { doRead = true; debug('length less than watermark', doRead); - } - - // however, if we've ended, then there's no point, and if we're already + } // however, if we've ended, then there's no point, and if we're already // reading, then it's unnecessary. + + if (state.ended || state.reading) { doRead = false; debug('reading or ended', doRead); } else if (doRead) { debug('do read'); state.reading = true; - state.sync = true; - // if the length is currently zero, then we *need* a readable event. - if (state.length === 0) state.needReadable = true; - // call internal read method + state.sync = true; // if the length is currently zero, then we *need* a readable event. + + if (state.length === 0) state.needReadable = true; // call internal read method + this._read(state.highWaterMark); - state.sync = false; - // If _read pushed data synchronously, then `reading` will be false, + + state.sync = false; // If _read pushed data synchronously, then `reading` will be false, // and we need to re-evaluate how much data we can return to the user. + if (!state.reading) n = howMuchToRead(nOrig, state); } @@ -17255,91 +16930,144 @@ Readable.prototype.read = function (n) { if (n > 0) ret = fromList(n, state);else ret = null; if (ret === null) { - state.needReadable = true; + state.needReadable = state.length <= state.highWaterMark; n = 0; } else { state.length -= n; + state.awaitDrain = 0; } if (state.length === 0) { // If we have nothing in the buffer, then we want to know // as soon as we *do* get something into the buffer. - if (!state.ended) state.needReadable = true; + if (!state.ended) state.needReadable = true; // If we tried to read() past the EOF, then emit end on the next tick. - // If we tried to read() past the EOF, then emit end on the next tick. if (nOrig !== n && state.ended) endReadable(this); } if (ret !== null) this.emit('data', ret); - return ret; }; function onEofChunk(stream, state) { + debug('onEofChunk'); if (state.ended) return; + if (state.decoder) { var chunk = state.decoder.end(); + if (chunk && chunk.length) { state.buffer.push(chunk); state.length += state.objectMode ? 1 : chunk.length; } } + state.ended = true; - // emit 'readable' now to make sure it gets picked up. - emitReadable(stream); -} + if (state.sync) { + // if we are sync, wait until next tick to emit the data. + // Otherwise we risk emitting data in the flow() + // the readable code triggers during a read() call + emitReadable(stream); + } else { + // emit 'readable' now to make sure it gets picked up. + state.needReadable = false; -// Don't emit readable right away in sync mode, because this can trigger + if (!state.emittedReadable) { + state.emittedReadable = true; + emitReadable_(stream); + } + } +} // Don't emit readable right away in sync mode, because this can trigger // another read() call => stack overflow. This way, it might trigger // a nextTick recursion warning, but that's not so bad. + + function emitReadable(stream) { var state = stream._readableState; + debug('emitReadable', state.needReadable, state.emittedReadable); state.needReadable = false; + if (!state.emittedReadable) { debug('emitReadable', state.flowing); state.emittedReadable = true; - if (state.sync) pna.nextTick(emitReadable_, stream);else emitReadable_(stream); + process.nextTick(emitReadable_, stream); } } function emitReadable_(stream) { - debug('emit readable'); - stream.emit('readable'); - flow(stream); -} + var state = stream._readableState; + debug('emitReadable_', state.destroyed, state.length, state.ended); -// at this point, the user has presumably seen the 'readable' event, + if (!state.destroyed && (state.length || state.ended)) { + stream.emit('readable'); + state.emittedReadable = false; + } // The stream needs another readable event if + // 1. It is not flowing, as the flow mechanism will take + // care of it. + // 2. It is not ended. + // 3. It is below the highWaterMark, so we can schedule + // another readable later. + + + state.needReadable = !state.flowing && !state.ended && state.length <= state.highWaterMark; + flow(stream); +} // at this point, the user has presumably seen the 'readable' event, // and called read() to consume some data. that may have triggered // in turn another _read(n) call, in which case reading = true if // it's in progress. // However, if we're not ended, or reading, and the length < hwm, // then go ahead and try to read some more preemptively. + + function maybeReadMore(stream, state) { if (!state.readingMore) { state.readingMore = true; - pna.nextTick(maybeReadMore_, stream, state); + process.nextTick(maybeReadMore_, stream, state); } } function maybeReadMore_(stream, state) { - var len = state.length; - while (!state.reading && !state.flowing && !state.ended && state.length < state.highWaterMark) { + // Attempt to read more data if we should. + // + // The conditions for reading more data are (one of): + // - Not enough data buffered (state.length < state.highWaterMark). The loop + // is responsible for filling the buffer with enough data if such data + // is available. If highWaterMark is 0 and we are not in the flowing mode + // we should _not_ attempt to buffer any extra data. We'll get more data + // when the stream consumer calls read() instead. + // - No data in the buffer, and the stream is in flowing mode. In this mode + // the loop below is responsible for ensuring read() is called. Failing to + // call read here would abort the flow and there's no other mechanism for + // continuing the flow if the stream consumer has just subscribed to the + // 'data' event. + // + // In addition to the above conditions to keep reading data, the following + // conditions prevent the data from being read: + // - The stream has ended (state.ended). + // - There is already a pending 'read' operation (state.reading). This is a + // case where the the stream has called the implementation defined _read() + // method, but they are processing the call asynchronously and have _not_ + // called push() with new data. In this case we skip performing more + // read()s. The execution ends in this method again after the _read() ends + // up calling push() with more data. + while (!state.reading && !state.ended && (state.length < state.highWaterMark || state.flowing && state.length === 0)) { + var len = state.length; debug('maybeReadMore read 0'); stream.read(0); - if (len === state.length) - // didn't get any data, stop spinning. - break;else len = state.length; + if (len === state.length) // didn't get any data, stop spinning. + break; } - state.readingMore = false; -} -// abstract method. to be overridden in specific implementation classes. + state.readingMore = false; +} // abstract method. to be overridden in specific implementation classes. // call cb(er, data) where data is <= n in length. // for virtual (non-string, non-buffer) streams, "length" is somewhat // arbitrary, and perhaps not very meaningful. + + Readable.prototype._read = function (n) { - this.emit('error', new Error('_read() is not implemented')); + errorOrDestroy(this, new ERR_METHOD_NOT_IMPLEMENTED('_read()')); }; Readable.prototype.pipe = function (dest, pipeOpts) { @@ -17350,24 +17078,26 @@ Readable.prototype.pipe = function (dest, pipeOpts) { case 0: state.pipes = dest; break; + case 1: state.pipes = [state.pipes, dest]; break; + default: state.pipes.push(dest); break; } + state.pipesCount += 1; debug('pipe count=%d opts=%j', state.pipesCount, pipeOpts); - var doEnd = (!pipeOpts || pipeOpts.end !== false) && dest !== process.stdout && dest !== process.stderr; - var endFn = doEnd ? onend : unpipe; - if (state.endEmitted) pna.nextTick(endFn);else src.once('end', endFn); - + if (state.endEmitted) process.nextTick(endFn);else src.once('end', endFn); dest.on('unpipe', onunpipe); + function onunpipe(readable, unpipeInfo) { debug('onunpipe'); + if (readable === src) { if (unpipeInfo && unpipeInfo.hasUnpiped === false) { unpipeInfo.hasUnpiped = true; @@ -17379,19 +17109,19 @@ Readable.prototype.pipe = function (dest, pipeOpts) { function onend() { debug('onend'); dest.end(); - } - - // when the dest drains, it reduces the awaitDrain counter + } // when the dest drains, it reduces the awaitDrain counter // on the source. This would be more elegant with a .once() // handler in flow(), but adding and removing repeatedly is // too slow. + + var ondrain = pipeOnDrain(src); dest.on('drain', ondrain); - var cleanedUp = false; + function cleanup() { - debug('cleanup'); - // cleanup event handlers once the pipe is broken + debug('cleanup'); // cleanup event handlers once the pipe is broken + dest.removeListener('close', onclose); dest.removeListener('finish', onfinish); dest.removeListener('drain', ondrain); @@ -17400,75 +17130,71 @@ Readable.prototype.pipe = function (dest, pipeOpts) { src.removeListener('end', onend); src.removeListener('end', unpipe); src.removeListener('data', ondata); - - cleanedUp = true; - - // if the reader is waiting for a drain event from this + cleanedUp = true; // if the reader is waiting for a drain event from this // specific writer, then it would cause it to never start // flowing again. // So, if this is awaiting a drain, then we just call it now. // If we don't know, then assume that we are waiting for one. + if (state.awaitDrain && (!dest._writableState || dest._writableState.needDrain)) ondrain(); } - // If the user pushes more data while we're writing to dest then we'll end up - // in ondata again. However, we only want to increase awaitDrain once because - // dest will only emit one 'drain' event for the multiple writes. - // => Introduce a guard on increasing awaitDrain. - var increasedAwaitDrain = false; src.on('data', ondata); + function ondata(chunk) { debug('ondata'); - increasedAwaitDrain = false; var ret = dest.write(chunk); - if (false === ret && !increasedAwaitDrain) { + debug('dest.write', ret); + + if (ret === false) { // If the user unpiped during `dest.write()`, it is possible // to get stuck in a permanently paused state if that write // also returned false. // => Check whether `dest` is still a piping destination. if ((state.pipesCount === 1 && state.pipes === dest || state.pipesCount > 1 && indexOf(state.pipes, dest) !== -1) && !cleanedUp) { - debug('false write response, pause', src._readableState.awaitDrain); - src._readableState.awaitDrain++; - increasedAwaitDrain = true; + debug('false write response, pause', state.awaitDrain); + state.awaitDrain++; } + src.pause(); } - } - - // if the dest has an error, then stop piping into it. + } // if the dest has an error, then stop piping into it. // however, don't suppress the throwing behavior for this. + + function onerror(er) { debug('onerror', er); unpipe(); dest.removeListener('error', onerror); - if (EElistenerCount(dest, 'error') === 0) dest.emit('error', er); - } + if (EElistenerCount(dest, 'error') === 0) errorOrDestroy(dest, er); + } // Make sure our error handler is attached before userland ones. - // Make sure our error handler is attached before userland ones. - prependListener(dest, 'error', onerror); - // Both close and finish should trigger unpipe, but only once. + prependListener(dest, 'error', onerror); // Both close and finish should trigger unpipe, but only once. + function onclose() { dest.removeListener('finish', onfinish); unpipe(); } + dest.once('close', onclose); + function onfinish() { debug('onfinish'); dest.removeListener('close', onclose); unpipe(); } + dest.once('finish', onfinish); function unpipe() { debug('unpipe'); src.unpipe(dest); - } + } // tell the dest that it's being piped to - // tell the dest that it's being piped to - dest.emit('pipe', src); - // start the flow if it hasn't been started already. + dest.emit('pipe', src); // start the flow if it hasn't been started already. + if (!state.flowing) { debug('pipe resume'); src.resume(); @@ -17478,10 +17204,11 @@ Readable.prototype.pipe = function (dest, pipeOpts) { }; function pipeOnDrain(src) { - return function () { + return function pipeOnDrainFunctionResult() { var state = src._readableState; debug('pipeOnDrain', state.awaitDrain); if (state.awaitDrain) state.awaitDrain--; + if (state.awaitDrain === 0 && EElistenerCount(src, 'data')) { state.flowing = true; flow(src); @@ -17491,27 +17218,24 @@ function pipeOnDrain(src) { Readable.prototype.unpipe = function (dest) { var state = this._readableState; - var unpipeInfo = { hasUnpiped: false }; + var unpipeInfo = { + hasUnpiped: false + }; // if we're not piping anywhere, then do nothing. - // if we're not piping anywhere, then do nothing. - if (state.pipesCount === 0) return this; + if (state.pipesCount === 0) return this; // just one destination. most common case. - // just one destination. most common case. if (state.pipesCount === 1) { // passed in one, but it's not the right one. if (dest && dest !== state.pipes) return this; + if (!dest) dest = state.pipes; // got a match. - if (!dest) dest = state.pipes; - - // got a match. state.pipes = null; state.pipesCount = 0; state.flowing = false; if (dest) dest.emit('unpipe', this, unpipeInfo); return this; - } + } // slow case. multiple pipe destinations. - // slow case. multiple pipe destinations. if (!dest) { // remove all. @@ -17522,80 +17246,139 @@ Readable.prototype.unpipe = function (dest) { state.flowing = false; for (var i = 0; i < len; i++) { - dests[i].emit('unpipe', this, unpipeInfo); - }return this; - } + dests[i].emit('unpipe', this, { + hasUnpiped: false + }); + } + + return this; + } // try to find the right one. + - // try to find the right one. var index = indexOf(state.pipes, dest); if (index === -1) return this; - state.pipes.splice(index, 1); state.pipesCount -= 1; if (state.pipesCount === 1) state.pipes = state.pipes[0]; - dest.emit('unpipe', this, unpipeInfo); - return this; -}; - -// set up data events if they are asked for +}; // set up data events if they are asked for // Ensure readable listeners eventually get something + + Readable.prototype.on = function (ev, fn) { var res = Stream.prototype.on.call(this, ev, fn); + var state = this._readableState; if (ev === 'data') { - // Start flowing on next tick if stream isn't explicitly paused - if (this._readableState.flowing !== false) this.resume(); + // update readableListening so that resume() may be a no-op + // a few lines down. This is needed to support once('readable'). + state.readableListening = this.listenerCount('readable') > 0; // Try start flowing on next tick if stream isn't explicitly paused + + if (state.flowing !== false) this.resume(); } else if (ev === 'readable') { - var state = this._readableState; if (!state.endEmitted && !state.readableListening) { state.readableListening = state.needReadable = true; + state.flowing = false; state.emittedReadable = false; - if (!state.reading) { - pna.nextTick(nReadingNextTick, this); - } else if (state.length) { + debug('on readable', state.length, state.reading); + + if (state.length) { emitReadable(this); + } else if (!state.reading) { + process.nextTick(nReadingNextTick, this); } } } return res; }; + Readable.prototype.addListener = Readable.prototype.on; +Readable.prototype.removeListener = function (ev, fn) { + var res = Stream.prototype.removeListener.call(this, ev, fn); + + if (ev === 'readable') { + // We need to check if there is someone still listening to + // readable and reset the state. However this needs to happen + // after readable has been emitted but before I/O (nextTick) to + // support once('readable', fn) cycles. This means that calling + // resume within the same tick will have no + // effect. + process.nextTick(updateReadableListening, this); + } + + return res; +}; + +Readable.prototype.removeAllListeners = function (ev) { + var res = Stream.prototype.removeAllListeners.apply(this, arguments); + + if (ev === 'readable' || ev === undefined) { + // We need to check if there is someone still listening to + // readable and reset the state. However this needs to happen + // after readable has been emitted but before I/O (nextTick) to + // support once('readable', fn) cycles. This means that calling + // resume within the same tick will have no + // effect. + process.nextTick(updateReadableListening, this); + } + + return res; +}; + +function updateReadableListening(self) { + var state = self._readableState; + state.readableListening = self.listenerCount('readable') > 0; + + if (state.resumeScheduled && !state.paused) { + // flowing needs to be set to true now, otherwise + // the upcoming resume will not flow. + state.flowing = true; // crude way to check if we should resume + } else if (self.listenerCount('data') > 0) { + self.resume(); + } +} + function nReadingNextTick(self) { debug('readable nexttick read 0'); self.read(0); -} - -// pause() and resume() are remnants of the legacy readable stream API +} // pause() and resume() are remnants of the legacy readable stream API // If the user uses them, then switch into old mode. + + Readable.prototype.resume = function () { var state = this._readableState; + if (!state.flowing) { - debug('resume'); - state.flowing = true; + debug('resume'); // we flow only if there is no one listening + // for readable, but we still have to call + // resume() + + state.flowing = !state.readableListening; resume(this, state); } + + state.paused = false; return this; }; function resume(stream, state) { if (!state.resumeScheduled) { state.resumeScheduled = true; - pna.nextTick(resume_, stream, state); + process.nextTick(resume_, stream, state); } } function resume_(stream, state) { + debug('resume', state.reading); + if (!state.reading) { - debug('resume read 0'); stream.read(0); } state.resumeScheduled = false; - state.awaitDrain = 0; stream.emit('resume'); flow(stream); if (state.flowing && !state.reading) stream.read(0); @@ -17603,31 +17386,37 @@ function resume_(stream, state) { Readable.prototype.pause = function () { debug('call pause flowing=%j', this._readableState.flowing); - if (false !== this._readableState.flowing) { + + if (this._readableState.flowing !== false) { debug('pause'); this._readableState.flowing = false; this.emit('pause'); } + + this._readableState.paused = true; return this; }; function flow(stream) { var state = stream._readableState; debug('flow', state.flowing); - while (state.flowing && stream.read() !== null) {} -} -// wrap an old-style stream as the async data source. + while (state.flowing && stream.read() !== null) { + ; + } +} // wrap an old-style stream as the async data source. // This is *not* part of the readable stream interface. // It is an ugly unfortunate mess of history. + + Readable.prototype.wrap = function (stream) { var _this = this; var state = this._readableState; var paused = false; - stream.on('end', function () { debug('wrapped end'); + if (state.decoder && !state.ended) { var chunk = state.decoder.end(); if (chunk && chunk.length) _this.push(chunk); @@ -17635,42 +17424,41 @@ Readable.prototype.wrap = function (stream) { _this.push(null); }); - stream.on('data', function (chunk) { debug('wrapped data'); - if (state.decoder) chunk = state.decoder.write(chunk); + if (state.decoder) chunk = state.decoder.write(chunk); // don't skip over falsy values in objectMode - // don't skip over falsy values in objectMode if (state.objectMode && (chunk === null || chunk === undefined)) return;else if (!state.objectMode && (!chunk || !chunk.length)) return; var ret = _this.push(chunk); + if (!ret) { paused = true; stream.pause(); } - }); - - // proxy all the other methods. + }); // proxy all the other methods. // important when wrapping filters and duplexes. + for (var i in stream) { if (this[i] === undefined && typeof stream[i] === 'function') { - this[i] = function (method) { - return function () { + this[i] = function methodWrap(method) { + return function methodWrapReturnFunction() { return stream[method].apply(stream, arguments); }; }(i); } - } + } // proxy certain important events. + - // proxy certain important events. for (var n = 0; n < kProxyEvents.length; n++) { stream.on(kProxyEvents[n], this.emit.bind(this, kProxyEvents[n])); - } - - // when we try to consume some more bytes, simply unpause the + } // when we try to consume some more bytes, simply unpause the // underlying stream. + + this._read = function (n) { debug('wrapped _read', n); + if (paused) { paused = false; stream.resume(); @@ -17680,150 +17468,128 @@ Readable.prototype.wrap = function (stream) { return this; }; +if (typeof Symbol === 'function') { + Readable.prototype[Symbol.asyncIterator] = function () { + if (createReadableStreamAsyncIterator === undefined) { + createReadableStreamAsyncIterator = require('./internal/streams/async_iterator'); + } + + return createReadableStreamAsyncIterator(this); + }; +} + Object.defineProperty(Readable.prototype, 'readableHighWaterMark', { // making it explicit this property is not enumerable // because otherwise some prototype manipulation in // userland will fail enumerable: false, - get: function () { + get: function get() { return this._readableState.highWaterMark; } }); +Object.defineProperty(Readable.prototype, 'readableBuffer', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get() { + return this._readableState && this._readableState.buffer; + } +}); +Object.defineProperty(Readable.prototype, 'readableFlowing', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get() { + return this._readableState.flowing; + }, + set: function set(state) { + if (this._readableState) { + this._readableState.flowing = state; + } + } +}); // exposed for testing purposes only. -// exposed for testing purposes only. Readable._fromList = fromList; - -// Pluck off n bytes from an array of buffers. +Object.defineProperty(Readable.prototype, 'readableLength', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get() { + return this._readableState.length; + } +}); // Pluck off n bytes from an array of buffers. // Length is the combined lengths of all the buffers in the list. // This function is designed to be inlinable, so please take care when making // changes to the function body. + function fromList(n, state) { // nothing buffered if (state.length === 0) return null; - var ret; if (state.objectMode) ret = state.buffer.shift();else if (!n || n >= state.length) { // read it all, truncate the list - if (state.decoder) ret = state.buffer.join('');else if (state.buffer.length === 1) ret = state.buffer.head.data;else ret = state.buffer.concat(state.length); + if (state.decoder) ret = state.buffer.join('');else if (state.buffer.length === 1) ret = state.buffer.first();else ret = state.buffer.concat(state.length); state.buffer.clear(); } else { // read part of list - ret = fromListPartial(n, state.buffer, state.decoder); - } - - return ret; -} - -// Extracts only enough buffered data to satisfy the amount requested. -// This function is designed to be inlinable, so please take care when making -// changes to the function body. -function fromListPartial(n, list, hasStrings) { - var ret; - if (n < list.head.data.length) { - // slice is the same for buffers and strings - ret = list.head.data.slice(0, n); - list.head.data = list.head.data.slice(n); - } else if (n === list.head.data.length) { - // first chunk is a perfect match - ret = list.shift(); - } else { - // result spans more than one buffer - ret = hasStrings ? copyFromBufferString(n, list) : copyFromBuffer(n, list); - } - return ret; -} - -// Copies a specified amount of characters from the list of buffered data -// chunks. -// This function is designed to be inlinable, so please take care when making -// changes to the function body. -function copyFromBufferString(n, list) { - var p = list.head; - var c = 1; - var ret = p.data; - n -= ret.length; - while (p = p.next) { - var str = p.data; - var nb = n > str.length ? str.length : n; - if (nb === str.length) ret += str;else ret += str.slice(0, n); - n -= nb; - if (n === 0) { - if (nb === str.length) { - ++c; - if (p.next) list.head = p.next;else list.head = list.tail = null; - } else { - list.head = p; - p.data = str.slice(nb); - } - break; - } - ++c; - } - list.length -= c; - return ret; -} - -// Copies a specified amount of bytes from the list of buffered data chunks. -// This function is designed to be inlinable, so please take care when making -// changes to the function body. -function copyFromBuffer(n, list) { - var ret = Buffer.allocUnsafe(n); - var p = list.head; - var c = 1; - p.data.copy(ret); - n -= p.data.length; - while (p = p.next) { - var buf = p.data; - var nb = n > buf.length ? buf.length : n; - buf.copy(ret, ret.length - n, 0, nb); - n -= nb; - if (n === 0) { - if (nb === buf.length) { - ++c; - if (p.next) list.head = p.next;else list.head = list.tail = null; - } else { - list.head = p; - p.data = buf.slice(nb); - } - break; - } - ++c; + ret = state.buffer.consume(n, state.decoder); } - list.length -= c; return ret; } function endReadable(stream) { var state = stream._readableState; - - // If we get here before consuming all the bytes, then that is a - // bug in node. Should never happen. - if (state.length > 0) throw new Error('"endReadable()" called on non-empty stream'); + debug('endReadable', state.endEmitted); if (!state.endEmitted) { state.ended = true; - pna.nextTick(endReadableNT, state, stream); + process.nextTick(endReadableNT, state, stream); } } function endReadableNT(state, stream) { - // Check that we didn't get one last unshift. + debug('endReadableNT', state.endEmitted, state.length); // Check that we didn't get one last unshift. + if (!state.endEmitted && state.length === 0) { state.endEmitted = true; stream.readable = false; stream.emit('end'); + + if (state.autoDestroy) { + // In case of duplex streams we need a way to detect + // if the writable side is ready for autoDestroy as well + var wState = stream._writableState; + + if (!wState || wState.autoDestroy && wState.finished) { + stream.destroy(); + } + } } } +if (typeof Symbol === 'function') { + Readable.from = function (iterable, opts) { + if (from === undefined) { + from = require('./internal/streams/from'); + } + + return from(Readable, iterable, opts); + }; +} + function indexOf(xs, x) { for (var i = 0, l = xs.length; i < l; i++) { if (xs[i] === x) return i; } + return -1; } }).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{"./_stream_duplex":53,"./internal/streams/BufferList":58,"./internal/streams/destroy":59,"./internal/streams/stream":60,"_process":46,"core-util-is":31,"events":37,"inherits":39,"isarray":41,"process-nextick-args":45,"safe-buffer":65,"string_decoder/":68,"util":29}],56:[function(require,module,exports){ +},{"../errors":51,"./_stream_duplex":52,"./internal/streams/async_iterator":57,"./internal/streams/buffer_list":58,"./internal/streams/destroy":59,"./internal/streams/from":61,"./internal/streams/state":63,"./internal/streams/stream":64,"_process":45,"buffer":30,"events":37,"inherits":39,"string_decoder/":83,"util":29}],55:[function(require,module,exports){ // Copyright Joyent, Inc. and other Node contributors. // // Permission is hereby granted, free of charge, to any person obtaining a @@ -17844,7 +17610,6 @@ function indexOf(xs, x) { // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE // USE OR OTHER DEALINGS IN THE SOFTWARE. - // a transform stream is a readable/writable stream where you do // something with the data. Sometimes it's called a "filter", // but that's not a great name for it, since that implies a thing where @@ -17886,40 +17651,37 @@ function indexOf(xs, x) { // However, even in such a pathological case, only a single written chunk // would be consumed, and then the rest would wait (un-transformed) until // the results of the previous transformed chunk were consumed. - 'use strict'; module.exports = Transform; -var Duplex = require('./_stream_duplex'); +var _require$codes = require('../errors').codes, + ERR_METHOD_NOT_IMPLEMENTED = _require$codes.ERR_METHOD_NOT_IMPLEMENTED, + ERR_MULTIPLE_CALLBACK = _require$codes.ERR_MULTIPLE_CALLBACK, + ERR_TRANSFORM_ALREADY_TRANSFORMING = _require$codes.ERR_TRANSFORM_ALREADY_TRANSFORMING, + ERR_TRANSFORM_WITH_LENGTH_0 = _require$codes.ERR_TRANSFORM_WITH_LENGTH_0; -/**/ -var util = require('core-util-is'); -util.inherits = require('inherits'); -/**/ +var Duplex = require('./_stream_duplex'); -util.inherits(Transform, Duplex); +require('inherits')(Transform, Duplex); function afterTransform(er, data) { var ts = this._transformState; ts.transforming = false; - var cb = ts.writecb; - if (!cb) { - return this.emit('error', new Error('write callback called multiple times')); + if (cb === null) { + return this.emit('error', new ERR_MULTIPLE_CALLBACK()); } ts.writechunk = null; ts.writecb = null; - if (data != null) // single equals check for both `null` and `undefined` this.push(data); - cb(er); - var rs = this._readableState; rs.reading = false; + if (rs.needReadable || rs.length < rs.highWaterMark) { this._read(rs.highWaterMark); } @@ -17927,9 +17689,7 @@ function afterTransform(er, data) { function Transform(options) { if (!(this instanceof Transform)) return new Transform(options); - Duplex.call(this, options); - this._transformState = { afterTransform: afterTransform.bind(this), needTransform: false, @@ -17937,30 +17697,27 @@ function Transform(options) { writecb: null, writechunk: null, writeencoding: null - }; - - // start out asking for a readable event once data is transformed. - this._readableState.needReadable = true; + }; // start out asking for a readable event once data is transformed. - // we have implemented the _read method, and done the other things + this._readableState.needReadable = true; // we have implemented the _read method, and done the other things // that Readable wants before the first _read call, so unset the // sync guard flag. + this._readableState.sync = false; if (options) { if (typeof options.transform === 'function') this._transform = options.transform; - if (typeof options.flush === 'function') this._flush = options.flush; - } + } // When the writable side finishes, then flush out anything remaining. + - // When the writable side finishes, then flush out anything remaining. this.on('prefinish', prefinish); } function prefinish() { var _this = this; - if (typeof this._flush === 'function') { + if (typeof this._flush === 'function' && !this._readableState.destroyed) { this._flush(function (er, data) { done(_this, er, data); }); @@ -17972,9 +17729,7 @@ function prefinish() { Transform.prototype.push = function (chunk, encoding) { this._transformState.needTransform = false; return Duplex.prototype.push.call(this, chunk, encoding); -}; - -// This is the part where you do stuff! +}; // This is the part where you do stuff! // override this function in implementation classes. // 'chunk' is an input chunk. // @@ -17984,8 +17739,10 @@ Transform.prototype.push = function (chunk, encoding) { // Call `cb(err)` when you are done with this chunk. If you pass // an error, then that'll put the hurt on the whole operation. If you // never call cb(), then you'll never get another chunk. + + Transform.prototype._transform = function (chunk, encoding, cb) { - throw new Error('_transform() is not implemented'); + cb(new ERR_METHOD_NOT_IMPLEMENTED('_transform()')); }; Transform.prototype._write = function (chunk, encoding, cb) { @@ -17993,20 +17750,22 @@ Transform.prototype._write = function (chunk, encoding, cb) { ts.writecb = cb; ts.writechunk = chunk; ts.writeencoding = encoding; + if (!ts.transforming) { var rs = this._readableState; if (ts.needTransform || rs.needReadable || rs.length < rs.highWaterMark) this._read(rs.highWaterMark); } -}; - -// Doesn't matter what the args are here. +}; // Doesn't matter what the args are here. // _transform does all the work. // That we got here means that the readable side wants more data. + + Transform.prototype._read = function (n) { var ts = this._transformState; - if (ts.writechunk !== null && ts.writecb && !ts.transforming) { + if (ts.writechunk !== null && !ts.transforming) { ts.transforming = true; + this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform); } else { // mark that we need a transform, so that any data that comes in @@ -18016,30 +17775,24 @@ Transform.prototype._read = function (n) { }; Transform.prototype._destroy = function (err, cb) { - var _this2 = this; - Duplex.prototype._destroy.call(this, err, function (err2) { cb(err2); - _this2.emit('close'); }); }; function done(stream, er, data) { if (er) return stream.emit('error', er); - if (data != null) // single equals check for both `null` and `undefined` - stream.push(data); - + stream.push(data); // TODO(BridgeAR): Write a test for these two error cases // if there's nothing in the write buffer, then that means // that nothing more will ever be provided - if (stream._writableState.length) throw new Error('Calling transform done when ws.length != 0'); - - if (stream._transformState.transforming) throw new Error('Calling transform done when still transforming'); + if (stream._writableState.length) throw new ERR_TRANSFORM_WITH_LENGTH_0(); + if (stream._transformState.transforming) throw new ERR_TRANSFORM_ALREADY_TRANSFORMING(); return stream.push(null); } -},{"./_stream_duplex":53,"core-util-is":31,"inherits":39}],57:[function(require,module,exports){ -(function (process,global,setImmediate){ +},{"../errors":51,"./_stream_duplex":52,"inherits":39}],56:[function(require,module,exports){ +(function (process,global){ // Copyright Joyent, Inc. and other Node contributors. // // Permission is hereby granted, free of charge, to any person obtaining a @@ -18060,35 +17813,29 @@ function done(stream, er, data) { // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE // USE OR OTHER DEALINGS IN THE SOFTWARE. - // A bit simpler than readable streams. // Implement an async ._write(chunk, encoding, cb), and it'll handle all // the drain event emission and buffering. - 'use strict'; -/**/ - -var pna = require('process-nextick-args'); -/**/ - module.exports = Writable; - /* */ + function WriteReq(chunk, encoding, cb) { this.chunk = chunk; this.encoding = encoding; this.callback = cb; this.next = null; -} - -// It seems a linked list but it is not +} // It seems a linked list but it is not // there will be only 2 of these for each stream + + function CorkedRequest(state) { var _this = this; this.next = null; this.entry = null; + this.finish = function () { onCorkedFinish(_this, state); }; @@ -18096,266 +17843,247 @@ function CorkedRequest(state) { /* */ /**/ -var asyncWrite = !process.browser && ['v0.10', 'v0.9.'].indexOf(process.version.slice(0, 5)) > -1 ? setImmediate : pna.nextTick; -/**/ -/**/ + var Duplex; /**/ Writable.WritableState = WritableState; - /**/ -var util = require('core-util-is'); -util.inherits = require('inherits'); -/**/ -/**/ var internalUtil = { deprecate: require('util-deprecate') }; /**/ /**/ + var Stream = require('./internal/streams/stream'); /**/ -/**/ -var Buffer = require('safe-buffer').Buffer; +var Buffer = require('buffer').Buffer; + var OurUint8Array = global.Uint8Array || function () {}; + function _uint8ArrayToBuffer(chunk) { return Buffer.from(chunk); } + function _isUint8Array(obj) { return Buffer.isBuffer(obj) || obj instanceof OurUint8Array; } -/**/ - var destroyImpl = require('./internal/streams/destroy'); -util.inherits(Writable, Stream); +var _require = require('./internal/streams/state'), + getHighWaterMark = _require.getHighWaterMark; + +var _require$codes = require('../errors').codes, + ERR_INVALID_ARG_TYPE = _require$codes.ERR_INVALID_ARG_TYPE, + ERR_METHOD_NOT_IMPLEMENTED = _require$codes.ERR_METHOD_NOT_IMPLEMENTED, + ERR_MULTIPLE_CALLBACK = _require$codes.ERR_MULTIPLE_CALLBACK, + ERR_STREAM_CANNOT_PIPE = _require$codes.ERR_STREAM_CANNOT_PIPE, + ERR_STREAM_DESTROYED = _require$codes.ERR_STREAM_DESTROYED, + ERR_STREAM_NULL_VALUES = _require$codes.ERR_STREAM_NULL_VALUES, + ERR_STREAM_WRITE_AFTER_END = _require$codes.ERR_STREAM_WRITE_AFTER_END, + ERR_UNKNOWN_ENCODING = _require$codes.ERR_UNKNOWN_ENCODING; + +var errorOrDestroy = destroyImpl.errorOrDestroy; + +require('inherits')(Writable, Stream); function nop() {} -function WritableState(options, stream) { +function WritableState(options, stream, isDuplex) { Duplex = Duplex || require('./_stream_duplex'); + options = options || {}; // Duplex streams are both readable and writable, but share + // the same options object. + // However, some cases require setting options to different + // values for the readable and the writable sides of the duplex stream, + // e.g. options.readableObjectMode vs. options.writableObjectMode, etc. - options = options || {}; - - // Duplex streams are both readable and writable, but share - // the same options object. - // However, some cases require setting options to different - // values for the readable and the writable sides of the duplex stream. - // These options can be provided separately as readableXXX and writableXXX. - var isDuplex = stream instanceof Duplex; - - // object stream flag to indicate whether or not this stream + if (typeof isDuplex !== 'boolean') isDuplex = stream instanceof Duplex; // object stream flag to indicate whether or not this stream // contains buffers or objects. - this.objectMode = !!options.objectMode; - - if (isDuplex) this.objectMode = this.objectMode || !!options.writableObjectMode; - // the point at which write() starts returning false + this.objectMode = !!options.objectMode; + if (isDuplex) this.objectMode = this.objectMode || !!options.writableObjectMode; // the point at which write() starts returning false // Note: 0 is a valid value, means that we always return false if // the entire buffer is not flushed immediately on write() - var hwm = options.highWaterMark; - var writableHwm = options.writableHighWaterMark; - var defaultHwm = this.objectMode ? 16 : 16 * 1024; - if (hwm || hwm === 0) this.highWaterMark = hwm;else if (isDuplex && (writableHwm || writableHwm === 0)) this.highWaterMark = writableHwm;else this.highWaterMark = defaultHwm; + this.highWaterMark = getHighWaterMark(this, options, 'writableHighWaterMark', isDuplex); // if _final has been called - // cast to ints. - this.highWaterMark = Math.floor(this.highWaterMark); + this.finalCalled = false; // drain event flag. - // if _final has been called - this.finalCalled = false; + this.needDrain = false; // at the start of calling end() - // drain event flag. - this.needDrain = false; - // at the start of calling end() - this.ending = false; - // when end() has been called, and returned - this.ended = false; - // when 'finish' is emitted - this.finished = false; + this.ending = false; // when end() has been called, and returned - // has it been destroyed - this.destroyed = false; + this.ended = false; // when 'finish' is emitted - // should we decode strings into buffers before passing to _write? + this.finished = false; // has it been destroyed + + this.destroyed = false; // should we decode strings into buffers before passing to _write? // this is here so that some node-core streams can optimize string // handling at a lower level. - var noDecode = options.decodeStrings === false; - this.decodeStrings = !noDecode; - // Crypto is kind of old and crusty. Historically, its default string + var noDecode = options.decodeStrings === false; + this.decodeStrings = !noDecode; // Crypto is kind of old and crusty. Historically, its default string // encoding is 'binary' so we have to make this configurable. // Everything else in the universe uses 'utf8', though. - this.defaultEncoding = options.defaultEncoding || 'utf8'; - // not an actual buffer we keep track of, but a measurement + this.defaultEncoding = options.defaultEncoding || 'utf8'; // not an actual buffer we keep track of, but a measurement // of how much we're waiting to get pushed to some underlying // socket or file. - this.length = 0; - // a flag to see when we're in the middle of a write. - this.writing = false; + this.length = 0; // a flag to see when we're in the middle of a write. - // when true all writes will be buffered until .uncork() call - this.corked = 0; + this.writing = false; // when true all writes will be buffered until .uncork() call - // a flag to be able to tell if the onwrite cb is called immediately, + this.corked = 0; // a flag to be able to tell if the onwrite cb is called immediately, // or on a later tick. We set this to true at first, because any // actions that shouldn't happen until "later" should generally also // not happen before the first write call. - this.sync = true; - // a flag to know if we're processing previously buffered items, which + this.sync = true; // a flag to know if we're processing previously buffered items, which // may call the _write() callback in the same tick, so that we don't // end up in an overlapped onwrite situation. - this.bufferProcessing = false; - // the callback that's passed to _write(chunk,cb) + this.bufferProcessing = false; // the callback that's passed to _write(chunk,cb) + this.onwrite = function (er) { onwrite(stream, er); - }; + }; // the callback that the user supplies to write(chunk,encoding,cb) - // the callback that the user supplies to write(chunk,encoding,cb) - this.writecb = null; - // the amount that is being written when _write is called. - this.writelen = 0; + this.writecb = null; // the amount that is being written when _write is called. + this.writelen = 0; this.bufferedRequest = null; - this.lastBufferedRequest = null; - - // number of pending user-supplied write callbacks + this.lastBufferedRequest = null; // number of pending user-supplied write callbacks // this must be 0 before 'finish' can be emitted - this.pendingcb = 0; - // emit prefinish if the only thing we're waiting for is _write cbs + this.pendingcb = 0; // emit prefinish if the only thing we're waiting for is _write cbs // This is relevant for synchronous Transform streams - this.prefinished = false; - // True if the error was already emitted and should not be thrown again - this.errorEmitted = false; + this.prefinished = false; // True if the error was already emitted and should not be thrown again - // count buffered requests - this.bufferedRequestCount = 0; + this.errorEmitted = false; // Should close be emitted on destroy. Defaults to true. - // allocate the first CorkedRequest, there is always + this.emitClose = options.emitClose !== false; // Should .destroy() be called after 'finish' (and potentially 'end') + + this.autoDestroy = !!options.autoDestroy; // count buffered requests + + this.bufferedRequestCount = 0; // allocate the first CorkedRequest, there is always // one allocated and free to use, and we maintain at most two + this.corkedRequestsFree = new CorkedRequest(this); } WritableState.prototype.getBuffer = function getBuffer() { var current = this.bufferedRequest; var out = []; + while (current) { out.push(current); current = current.next; } + return out; }; (function () { try { Object.defineProperty(WritableState.prototype, 'buffer', { - get: internalUtil.deprecate(function () { + get: internalUtil.deprecate(function writableStateBufferGetter() { return this.getBuffer(); }, '_writableState.buffer is deprecated. Use _writableState.getBuffer ' + 'instead.', 'DEP0003') }); } catch (_) {} -})(); - -// Test _writableState for inheritance to account for Duplex streams, +})(); // Test _writableState for inheritance to account for Duplex streams, // whose prototype chain only points to Readable. + + var realHasInstance; + if (typeof Symbol === 'function' && Symbol.hasInstance && typeof Function.prototype[Symbol.hasInstance] === 'function') { realHasInstance = Function.prototype[Symbol.hasInstance]; Object.defineProperty(Writable, Symbol.hasInstance, { - value: function (object) { + value: function value(object) { if (realHasInstance.call(this, object)) return true; if (this !== Writable) return false; - return object && object._writableState instanceof WritableState; } }); } else { - realHasInstance = function (object) { + realHasInstance = function realHasInstance(object) { return object instanceof this; }; } function Writable(options) { - Duplex = Duplex || require('./_stream_duplex'); - - // Writable ctor is applied to Duplexes, too. + Duplex = Duplex || require('./_stream_duplex'); // Writable ctor is applied to Duplexes, too. // `realHasInstance` is necessary because using plain `instanceof` // would return false, as no `_writableState` property is attached. - // Trying to use the custom `instanceof` for Writable here will also break the // Node.js LazyTransform implementation, which has a non-trivial getter for // `_writableState` that would lead to infinite recursion. - if (!realHasInstance.call(Writable, this) && !(this instanceof Duplex)) { - return new Writable(options); - } + // Checking for a Stream.Duplex instance is faster here instead of inside + // the WritableState constructor, at least with V8 6.5 - this._writableState = new WritableState(options, this); + var isDuplex = this instanceof Duplex; + if (!isDuplex && !realHasInstance.call(Writable, this)) return new Writable(options); + this._writableState = new WritableState(options, this, isDuplex); // legacy. - // legacy. this.writable = true; if (options) { if (typeof options.write === 'function') this._write = options.write; - if (typeof options.writev === 'function') this._writev = options.writev; - if (typeof options.destroy === 'function') this._destroy = options.destroy; - if (typeof options.final === 'function') this._final = options.final; } Stream.call(this); -} +} // Otherwise people can pipe Writable streams, which is just wrong. + -// Otherwise people can pipe Writable streams, which is just wrong. Writable.prototype.pipe = function () { - this.emit('error', new Error('Cannot pipe, not readable')); + errorOrDestroy(this, new ERR_STREAM_CANNOT_PIPE()); }; function writeAfterEnd(stream, cb) { - var er = new Error('write after end'); - // TODO: defer error events consistently everywhere, not just the cb - stream.emit('error', er); - pna.nextTick(cb, er); -} + var er = new ERR_STREAM_WRITE_AFTER_END(); // TODO: defer error events consistently everywhere, not just the cb -// Checks that a user-supplied chunk is valid, especially for the particular + errorOrDestroy(stream, er); + process.nextTick(cb, er); +} // Checks that a user-supplied chunk is valid, especially for the particular // mode the stream is in. Currently this means that `null` is never accepted // and undefined/non-string values are only allowed in object mode. + + function validChunk(stream, state, chunk, cb) { - var valid = true; - var er = false; + var er; if (chunk === null) { - er = new TypeError('May not write null values to stream'); - } else if (typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) { - er = new TypeError('Invalid non-string/buffer chunk'); + er = new ERR_STREAM_NULL_VALUES(); + } else if (typeof chunk !== 'string' && !state.objectMode) { + er = new ERR_INVALID_ARG_TYPE('chunk', ['string', 'Buffer'], chunk); } + if (er) { - stream.emit('error', er); - pna.nextTick(cb, er); - valid = false; + errorOrDestroy(stream, er); + process.nextTick(cb, er); + return false; } - return valid; + + return true; } Writable.prototype.write = function (chunk, encoding, cb) { var state = this._writableState; var ret = false; + var isBuf = !state.objectMode && _isUint8Array(chunk); if (isBuf && !Buffer.isBuffer(chunk)) { @@ -18368,21 +18096,16 @@ Writable.prototype.write = function (chunk, encoding, cb) { } if (isBuf) encoding = 'buffer';else if (!encoding) encoding = state.defaultEncoding; - if (typeof cb !== 'function') cb = nop; - - if (state.ended) writeAfterEnd(this, cb);else if (isBuf || validChunk(this, state, chunk, cb)) { + if (state.ending) writeAfterEnd(this, cb);else if (isBuf || validChunk(this, state, chunk, cb)) { state.pendingcb++; ret = writeOrBuffer(this, state, isBuf, chunk, encoding, cb); } - return ret; }; Writable.prototype.cork = function () { - var state = this._writableState; - - state.corked++; + this._writableState.corked++; }; Writable.prototype.uncork = function () { @@ -18390,23 +18113,33 @@ Writable.prototype.uncork = function () { if (state.corked) { state.corked--; - - if (!state.writing && !state.corked && !state.finished && !state.bufferProcessing && state.bufferedRequest) clearBuffer(this, state); + if (!state.writing && !state.corked && !state.bufferProcessing && state.bufferedRequest) clearBuffer(this, state); } }; Writable.prototype.setDefaultEncoding = function setDefaultEncoding(encoding) { // node::ParseEncoding() requires lower case. if (typeof encoding === 'string') encoding = encoding.toLowerCase(); - if (!(['hex', 'utf8', 'utf-8', 'ascii', 'binary', 'base64', 'ucs2', 'ucs-2', 'utf16le', 'utf-16le', 'raw'].indexOf((encoding + '').toLowerCase()) > -1)) throw new TypeError('Unknown encoding: ' + encoding); + if (!(['hex', 'utf8', 'utf-8', 'ascii', 'binary', 'base64', 'ucs2', 'ucs-2', 'utf16le', 'utf-16le', 'raw'].indexOf((encoding + '').toLowerCase()) > -1)) throw new ERR_UNKNOWN_ENCODING(encoding); this._writableState.defaultEncoding = encoding; return this; }; +Object.defineProperty(Writable.prototype, 'writableBuffer', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get() { + return this._writableState && this._writableState.getBuffer(); + } +}); + function decodeChunk(state, chunk, encoding) { if (!state.objectMode && state.decodeStrings !== false && typeof chunk === 'string') { chunk = Buffer.from(chunk, encoding); } + return chunk; } @@ -18415,29 +18148,28 @@ Object.defineProperty(Writable.prototype, 'writableHighWaterMark', { // because otherwise some prototype manipulation in // userland will fail enumerable: false, - get: function () { + get: function get() { return this._writableState.highWaterMark; } -}); - -// if we're already writing something, then just put this +}); // if we're already writing something, then just put this // in the queue, and wait our turn. Otherwise, call _write // If we return false, then we need a drain event, so set that flag. + function writeOrBuffer(stream, state, isBuf, chunk, encoding, cb) { if (!isBuf) { var newChunk = decodeChunk(state, chunk, encoding); + if (chunk !== newChunk) { isBuf = true; encoding = 'buffer'; chunk = newChunk; } } - var len = state.objectMode ? 1 : chunk.length; + var len = state.objectMode ? 1 : chunk.length; state.length += len; + var ret = state.length < state.highWaterMark; // we must ensure that previous needDrain will not be reset to false. - var ret = state.length < state.highWaterMark; - // we must ensure that previous needDrain will not be reset to false. if (!ret) state.needDrain = true; if (state.writing || state.corked) { @@ -18449,11 +18181,13 @@ function writeOrBuffer(stream, state, isBuf, chunk, encoding, cb) { callback: cb, next: null }; + if (last) { last.next = state.lastBufferedRequest; } else { state.bufferedRequest = state.lastBufferedRequest; } + state.bufferedRequestCount += 1; } else { doWrite(stream, state, false, len, chunk, encoding, cb); @@ -18467,7 +18201,7 @@ function doWrite(stream, state, writev, len, chunk, encoding, cb) { state.writecb = cb; state.writing = true; state.sync = true; - if (writev) stream._writev(chunk, state.onwrite);else stream._write(chunk, encoding, state.onwrite); + if (state.destroyed) state.onwrite(new ERR_STREAM_DESTROYED('write'));else if (writev) stream._writev(chunk, state.onwrite);else stream._write(chunk, encoding, state.onwrite); state.sync = false; } @@ -18477,20 +18211,20 @@ function onwriteError(stream, state, sync, er, cb) { if (sync) { // defer the callback if we are being called synchronously // to avoid piling up things on the stack - pna.nextTick(cb, er); - // this can emit finish, and it will always happen + process.nextTick(cb, er); // this can emit finish, and it will always happen // after error - pna.nextTick(finishMaybe, stream, state); + + process.nextTick(finishMaybe, stream, state); stream._writableState.errorEmitted = true; - stream.emit('error', er); + errorOrDestroy(stream, er); } else { // the caller expect this to happen before if // it is async cb(er); stream._writableState.errorEmitted = true; - stream.emit('error', er); - // this can emit finish, but finish must + errorOrDestroy(stream, er); // this can emit finish, but finish must // always follow error + finishMaybe(stream, state); } } @@ -18506,21 +18240,18 @@ function onwrite(stream, er) { var state = stream._writableState; var sync = state.sync; var cb = state.writecb; - + if (typeof cb !== 'function') throw new ERR_MULTIPLE_CALLBACK(); onwriteStateUpdate(state); - if (er) onwriteError(stream, state, sync, er, cb);else { // Check if we're actually ready to finish, but don't emit yet - var finished = needFinish(state); + var finished = needFinish(state) || stream.destroyed; if (!finished && !state.corked && !state.bufferProcessing && state.bufferedRequest) { clearBuffer(stream, state); } if (sync) { - /**/ - asyncWrite(afterWrite, stream, state, finished, cb); - /**/ + process.nextTick(afterWrite, stream, state, finished, cb); } else { afterWrite(stream, state, finished, cb); } @@ -18532,19 +18263,19 @@ function afterWrite(stream, state, finished, cb) { state.pendingcb--; cb(); finishMaybe(stream, state); -} - -// Must force callback to be called on nextTick, so that we don't +} // Must force callback to be called on nextTick, so that we don't // emit 'drain' before the write() consumer gets the 'false' return // value, and has a chance to attach a 'drain' listener. + + function onwriteDrain(stream, state) { if (state.length === 0 && state.needDrain) { state.needDrain = false; stream.emit('drain'); } -} +} // if there's something in the buffer waiting, then process it + -// if there's something in the buffer waiting, then process it function clearBuffer(stream, state) { state.bufferProcessing = true; var entry = state.bufferedRequest; @@ -18555,29 +18286,30 @@ function clearBuffer(stream, state) { var buffer = new Array(l); var holder = state.corkedRequestsFree; holder.entry = entry; - var count = 0; var allBuffers = true; + while (entry) { buffer[count] = entry; if (!entry.isBuf) allBuffers = false; entry = entry.next; count += 1; } - buffer.allBuffers = allBuffers; - - doWrite(stream, state, true, state.length, buffer, '', holder.finish); - // doWrite is almost always async, defer these to save a bit of time + buffer.allBuffers = allBuffers; + doWrite(stream, state, true, state.length, buffer, '', holder.finish); // doWrite is almost always async, defer these to save a bit of time // as the hot path ends with doWrite + state.pendingcb++; state.lastBufferedRequest = null; + if (holder.next) { state.corkedRequestsFree = holder.next; holder.next = null; } else { state.corkedRequestsFree = new CorkedRequest(state); } + state.bufferedRequestCount = 0; } else { // Slow case, write chunks one-by-one @@ -18586,14 +18318,13 @@ function clearBuffer(stream, state) { var encoding = entry.encoding; var cb = entry.callback; var len = state.objectMode ? 1 : chunk.length; - doWrite(stream, state, false, len, chunk, encoding, cb); entry = entry.next; - state.bufferedRequestCount--; - // if we didn't call the onwrite immediately, then + state.bufferedRequestCount--; // if we didn't call the onwrite immediately, then // it means that we need to wait until it does. // also, that means that the chunk and cb are currently // being processed, so move the buffer counter past them. + if (state.writing) { break; } @@ -18607,7 +18338,7 @@ function clearBuffer(stream, state) { } Writable.prototype._write = function (chunk, encoding, cb) { - cb(new Error('_write() is not implemented')); + cb(new ERR_METHOD_NOT_IMPLEMENTED('_write()')); }; Writable.prototype._writev = null; @@ -18624,38 +18355,52 @@ Writable.prototype.end = function (chunk, encoding, cb) { encoding = null; } - if (chunk !== null && chunk !== undefined) this.write(chunk, encoding); + if (chunk !== null && chunk !== undefined) this.write(chunk, encoding); // .end() fully uncorks - // .end() fully uncorks if (state.corked) { state.corked = 1; this.uncork(); - } + } // ignore unnecessary end() calls. - // ignore unnecessary end() calls. - if (!state.ending && !state.finished) endWritable(this, state, cb); + + if (!state.ending) endWritable(this, state, cb); + return this; }; +Object.defineProperty(Writable.prototype, 'writableLength', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get() { + return this._writableState.length; + } +}); + function needFinish(state) { return state.ending && state.length === 0 && state.bufferedRequest === null && !state.finished && !state.writing; } + function callFinal(stream, state) { stream._final(function (err) { state.pendingcb--; + if (err) { - stream.emit('error', err); + errorOrDestroy(stream, err); } + state.prefinished = true; stream.emit('prefinish'); finishMaybe(stream, state); }); } + function prefinish(stream, state) { if (!state.prefinished && !state.finalCalled) { - if (typeof stream._final === 'function') { + if (typeof stream._final === 'function' && !state.destroyed) { state.pendingcb++; state.finalCalled = true; - pna.nextTick(callFinal, stream, state); + process.nextTick(callFinal, stream, state); } else { state.prefinished = true; stream.emit('prefinish'); @@ -18665,22 +18410,37 @@ function prefinish(stream, state) { function finishMaybe(stream, state) { var need = needFinish(state); + if (need) { prefinish(stream, state); + if (state.pendingcb === 0) { state.finished = true; stream.emit('finish'); + + if (state.autoDestroy) { + // In case of duplex streams we need a way to detect + // if the readable side is ready for autoDestroy as well + var rState = stream._readableState; + + if (!rState || rState.autoDestroy && rState.endEmitted) { + stream.destroy(); + } + } } } + return need; } function endWritable(stream, state, cb) { state.ending = true; finishMaybe(stream, state); + if (cb) { - if (state.finished) pna.nextTick(cb);else stream.once('finish', cb); + if (state.finished) process.nextTick(cb);else stream.once('finish', cb); } + state.ended = true; stream.writable = false; } @@ -18688,60 +18448,291 @@ function endWritable(stream, state, cb) { function onCorkedFinish(corkReq, state, err) { var entry = corkReq.entry; corkReq.entry = null; + while (entry) { var cb = entry.callback; state.pendingcb--; cb(err); entry = entry.next; - } - if (state.corkedRequestsFree) { - state.corkedRequestsFree.next = corkReq; - } else { - state.corkedRequestsFree = corkReq; - } + } // reuse the free corkReq. + + + state.corkedRequestsFree.next = corkReq; } Object.defineProperty(Writable.prototype, 'destroyed', { - get: function () { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get() { if (this._writableState === undefined) { return false; } + return this._writableState.destroyed; }, - set: function (value) { + set: function set(value) { // we ignore the value if the stream // has not been initialized yet if (!this._writableState) { return; - } - - // backward compatibility, the user is explicitly + } // backward compatibility, the user is explicitly // managing destroyed + + this._writableState.destroyed = value; } }); - Writable.prototype.destroy = destroyImpl.destroy; Writable.prototype._undestroy = destroyImpl.undestroy; + Writable.prototype._destroy = function (err, cb) { - this.end(); cb(err); }; -}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {},require("timers").setImmediate) +}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{"./_stream_duplex":53,"./internal/streams/destroy":59,"./internal/streams/stream":60,"_process":46,"core-util-is":31,"inherits":39,"process-nextick-args":45,"safe-buffer":65,"timers":69,"util-deprecate":70}],58:[function(require,module,exports){ +},{"../errors":51,"./_stream_duplex":52,"./internal/streams/destroy":59,"./internal/streams/state":63,"./internal/streams/stream":64,"_process":45,"buffer":30,"inherits":39,"util-deprecate":86}],57:[function(require,module,exports){ +(function (process){ 'use strict'; -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } +var _Object$setPrototypeO; -var Buffer = require('safe-buffer').Buffer; -var util = require('util'); +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } -function copyBuffer(src, target, offset) { - src.copy(target, offset); -} +var finished = require('./end-of-stream'); -module.exports = function () { +var kLastResolve = Symbol('lastResolve'); +var kLastReject = Symbol('lastReject'); +var kError = Symbol('error'); +var kEnded = Symbol('ended'); +var kLastPromise = Symbol('lastPromise'); +var kHandlePromise = Symbol('handlePromise'); +var kStream = Symbol('stream'); + +function createIterResult(value, done) { + return { + value: value, + done: done + }; +} + +function readAndResolve(iter) { + var resolve = iter[kLastResolve]; + + if (resolve !== null) { + var data = iter[kStream].read(); // we defer if data is null + // we can be expecting either 'end' or + // 'error' + + if (data !== null) { + iter[kLastPromise] = null; + iter[kLastResolve] = null; + iter[kLastReject] = null; + resolve(createIterResult(data, false)); + } + } +} + +function onReadable(iter) { + // we wait for the next tick, because it might + // emit an error with process.nextTick + process.nextTick(readAndResolve, iter); +} + +function wrapForNext(lastPromise, iter) { + return function (resolve, reject) { + lastPromise.then(function () { + if (iter[kEnded]) { + resolve(createIterResult(undefined, true)); + return; + } + + iter[kHandlePromise](resolve, reject); + }, reject); + }; +} + +var AsyncIteratorPrototype = Object.getPrototypeOf(function () {}); +var ReadableStreamAsyncIteratorPrototype = Object.setPrototypeOf((_Object$setPrototypeO = { + get stream() { + return this[kStream]; + }, + + next: function next() { + var _this = this; + + // if we have detected an error in the meanwhile + // reject straight away + var error = this[kError]; + + if (error !== null) { + return Promise.reject(error); + } + + if (this[kEnded]) { + return Promise.resolve(createIterResult(undefined, true)); + } + + if (this[kStream].destroyed) { + // We need to defer via nextTick because if .destroy(err) is + // called, the error will be emitted via nextTick, and + // we cannot guarantee that there is no error lingering around + // waiting to be emitted. + return new Promise(function (resolve, reject) { + process.nextTick(function () { + if (_this[kError]) { + reject(_this[kError]); + } else { + resolve(createIterResult(undefined, true)); + } + }); + }); + } // if we have multiple next() calls + // we will wait for the previous Promise to finish + // this logic is optimized to support for await loops, + // where next() is only called once at a time + + + var lastPromise = this[kLastPromise]; + var promise; + + if (lastPromise) { + promise = new Promise(wrapForNext(lastPromise, this)); + } else { + // fast path needed to support multiple this.push() + // without triggering the next() queue + var data = this[kStream].read(); + + if (data !== null) { + return Promise.resolve(createIterResult(data, false)); + } + + promise = new Promise(this[kHandlePromise]); + } + + this[kLastPromise] = promise; + return promise; + } +}, _defineProperty(_Object$setPrototypeO, Symbol.asyncIterator, function () { + return this; +}), _defineProperty(_Object$setPrototypeO, "return", function _return() { + var _this2 = this; + + // destroy(err, cb) is a private API + // we can guarantee we have that here, because we control the + // Readable class this is attached to + return new Promise(function (resolve, reject) { + _this2[kStream].destroy(null, function (err) { + if (err) { + reject(err); + return; + } + + resolve(createIterResult(undefined, true)); + }); + }); +}), _Object$setPrototypeO), AsyncIteratorPrototype); + +var createReadableStreamAsyncIterator = function createReadableStreamAsyncIterator(stream) { + var _Object$create; + + var iterator = Object.create(ReadableStreamAsyncIteratorPrototype, (_Object$create = {}, _defineProperty(_Object$create, kStream, { + value: stream, + writable: true + }), _defineProperty(_Object$create, kLastResolve, { + value: null, + writable: true + }), _defineProperty(_Object$create, kLastReject, { + value: null, + writable: true + }), _defineProperty(_Object$create, kError, { + value: null, + writable: true + }), _defineProperty(_Object$create, kEnded, { + value: stream._readableState.endEmitted, + writable: true + }), _defineProperty(_Object$create, kHandlePromise, { + value: function value(resolve, reject) { + var data = iterator[kStream].read(); + + if (data) { + iterator[kLastPromise] = null; + iterator[kLastResolve] = null; + iterator[kLastReject] = null; + resolve(createIterResult(data, false)); + } else { + iterator[kLastResolve] = resolve; + iterator[kLastReject] = reject; + } + }, + writable: true + }), _Object$create)); + iterator[kLastPromise] = null; + finished(stream, function (err) { + if (err && err.code !== 'ERR_STREAM_PREMATURE_CLOSE') { + var reject = iterator[kLastReject]; // reject if we are waiting for data in the Promise + // returned by next() and store the error + + if (reject !== null) { + iterator[kLastPromise] = null; + iterator[kLastResolve] = null; + iterator[kLastReject] = null; + reject(err); + } + + iterator[kError] = err; + return; + } + + var resolve = iterator[kLastResolve]; + + if (resolve !== null) { + iterator[kLastPromise] = null; + iterator[kLastResolve] = null; + iterator[kLastReject] = null; + resolve(createIterResult(undefined, true)); + } + + iterator[kEnded] = true; + }); + stream.on('readable', onReadable.bind(null, iterator)); + return iterator; +}; + +module.exports = createReadableStreamAsyncIterator; +}).call(this,require('_process')) + +},{"./end-of-stream":60,"_process":45}],58:[function(require,module,exports){ +'use strict'; + +function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } + +function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } + +var _require = require('buffer'), + Buffer = _require.Buffer; + +var _require2 = require('util'), + inspect = _require2.inspect; + +var custom = inspect && inspect.custom || 'inspect'; + +function copyBuffer(src, target, offset) { + Buffer.prototype.copy.call(src, target, offset); +} + +module.exports = +/*#__PURE__*/ +function () { function BufferList() { _classCallCheck(this, BufferList); @@ -18750,74 +18741,183 @@ module.exports = function () { this.length = 0; } - BufferList.prototype.push = function push(v) { - var entry = { data: v, next: null }; - if (this.length > 0) this.tail.next = entry;else this.head = entry; - this.tail = entry; - ++this.length; - }; + _createClass(BufferList, [{ + key: "push", + value: function push(v) { + var entry = { + data: v, + next: null + }; + if (this.length > 0) this.tail.next = entry;else this.head = entry; + this.tail = entry; + ++this.length; + } + }, { + key: "unshift", + value: function unshift(v) { + var entry = { + data: v, + next: this.head + }; + if (this.length === 0) this.tail = entry; + this.head = entry; + ++this.length; + } + }, { + key: "shift", + value: function shift() { + if (this.length === 0) return; + var ret = this.head.data; + if (this.length === 1) this.head = this.tail = null;else this.head = this.head.next; + --this.length; + return ret; + } + }, { + key: "clear", + value: function clear() { + this.head = this.tail = null; + this.length = 0; + } + }, { + key: "join", + value: function join(s) { + if (this.length === 0) return ''; + var p = this.head; + var ret = '' + p.data; - BufferList.prototype.unshift = function unshift(v) { - var entry = { data: v, next: this.head }; - if (this.length === 0) this.tail = entry; - this.head = entry; - ++this.length; - }; + while (p = p.next) { + ret += s + p.data; + } - BufferList.prototype.shift = function shift() { - if (this.length === 0) return; - var ret = this.head.data; - if (this.length === 1) this.head = this.tail = null;else this.head = this.head.next; - --this.length; - return ret; - }; + return ret; + } + }, { + key: "concat", + value: function concat(n) { + if (this.length === 0) return Buffer.alloc(0); + var ret = Buffer.allocUnsafe(n >>> 0); + var p = this.head; + var i = 0; - BufferList.prototype.clear = function clear() { - this.head = this.tail = null; - this.length = 0; - }; + while (p) { + copyBuffer(p.data, ret, i); + i += p.data.length; + p = p.next; + } - BufferList.prototype.join = function join(s) { - if (this.length === 0) return ''; - var p = this.head; - var ret = '' + p.data; - while (p = p.next) { - ret += s + p.data; - }return ret; - }; + return ret; + } // Consumes a specified amount of bytes or characters from the buffered data. - BufferList.prototype.concat = function concat(n) { - if (this.length === 0) return Buffer.alloc(0); - if (this.length === 1) return this.head.data; - var ret = Buffer.allocUnsafe(n >>> 0); - var p = this.head; - var i = 0; - while (p) { - copyBuffer(p.data, ret, i); - i += p.data.length; - p = p.next; + }, { + key: "consume", + value: function consume(n, hasStrings) { + var ret; + + if (n < this.head.data.length) { + // `slice` is the same for buffers and strings. + ret = this.head.data.slice(0, n); + this.head.data = this.head.data.slice(n); + } else if (n === this.head.data.length) { + // First chunk is a perfect match. + ret = this.shift(); + } else { + // Result spans more than one buffer. + ret = hasStrings ? this._getString(n) : this._getBuffer(n); + } + + return ret; } - return ret; - }; + }, { + key: "first", + value: function first() { + return this.head.data; + } // Consumes a specified amount of characters from the buffered data. - return BufferList; -}(); + }, { + key: "_getString", + value: function _getString(n) { + var p = this.head; + var c = 1; + var ret = p.data; + n -= ret.length; + + while (p = p.next) { + var str = p.data; + var nb = n > str.length ? str.length : n; + if (nb === str.length) ret += str;else ret += str.slice(0, n); + n -= nb; + + if (n === 0) { + if (nb === str.length) { + ++c; + if (p.next) this.head = p.next;else this.head = this.tail = null; + } else { + this.head = p; + p.data = str.slice(nb); + } -if (util && util.inspect && util.inspect.custom) { - module.exports.prototype[util.inspect.custom] = function () { - var obj = util.inspect({ length: this.length }); - return this.constructor.name + ' ' + obj; - }; -} -},{"safe-buffer":65,"util":29}],59:[function(require,module,exports){ -'use strict'; + break; + } -/**/ + ++c; + } -var pna = require('process-nextick-args'); -/**/ + this.length -= c; + return ret; + } // Consumes a specified amount of bytes from the buffered data. + + }, { + key: "_getBuffer", + value: function _getBuffer(n) { + var ret = Buffer.allocUnsafe(n); + var p = this.head; + var c = 1; + p.data.copy(ret); + n -= p.data.length; + + while (p = p.next) { + var buf = p.data; + var nb = n > buf.length ? buf.length : n; + buf.copy(ret, ret.length - n, 0, nb); + n -= nb; + + if (n === 0) { + if (nb === buf.length) { + ++c; + if (p.next) this.head = p.next;else this.head = this.tail = null; + } else { + this.head = p; + p.data = buf.slice(nb); + } + + break; + } + + ++c; + } + + this.length -= c; + return ret; + } // Make sure the linked list only shows the minimal necessary information. + + }, { + key: custom, + value: function value(_, options) { + return inspect(this, _objectSpread({}, options, { + // Only inspect one level. + depth: 0, + // It should not recurse. + customInspect: false + })); + } + }]); + + return BufferList; +}(); +},{"buffer":30,"util":29}],59:[function(require,module,exports){ +(function (process){ +'use strict'; // undocumented cb() API, needed for core, not for public API -// undocumented cb() API, needed for core, not for public API function destroy(err, cb) { var _this = this; @@ -18827,38 +18927,61 @@ function destroy(err, cb) { if (readableDestroyed || writableDestroyed) { if (cb) { cb(err); - } else if (err && (!this._writableState || !this._writableState.errorEmitted)) { - pna.nextTick(emitErrorNT, this, err); + } else if (err) { + if (!this._writableState) { + process.nextTick(emitErrorNT, this, err); + } else if (!this._writableState.errorEmitted) { + this._writableState.errorEmitted = true; + process.nextTick(emitErrorNT, this, err); + } } - return this; - } - // we set destroyed to true before firing error callbacks in order + return this; + } // we set destroyed to true before firing error callbacks in order // to make it re-entrance safe in case destroy() is called within callbacks + if (this._readableState) { this._readableState.destroyed = true; - } + } // if this is a duplex stream mark the writable part as destroyed as well + - // if this is a duplex stream mark the writable part as destroyed as well if (this._writableState) { this._writableState.destroyed = true; } this._destroy(err || null, function (err) { if (!cb && err) { - pna.nextTick(emitErrorNT, _this, err); - if (_this._writableState) { + if (!_this._writableState) { + process.nextTick(emitErrorAndCloseNT, _this, err); + } else if (!_this._writableState.errorEmitted) { _this._writableState.errorEmitted = true; + process.nextTick(emitErrorAndCloseNT, _this, err); + } else { + process.nextTick(emitCloseNT, _this); } } else if (cb) { + process.nextTick(emitCloseNT, _this); cb(err); + } else { + process.nextTick(emitCloseNT, _this); } }); return this; } +function emitErrorAndCloseNT(self, err) { + emitErrorNT(self, err); + emitCloseNT(self); +} + +function emitCloseNT(self) { + if (self._writableState && !self._writableState.emitClose) return; + if (self._readableState && !self._readableState.emitClose) return; + self.emit('close'); +} + function undestroy() { if (this._readableState) { this._readableState.destroyed = false; @@ -18871,6 +18994,8 @@ function undestroy() { this._writableState.destroyed = false; this._writableState.ended = false; this._writableState.ending = false; + this._writableState.finalCalled = false; + this._writableState.prefinished = false; this._writableState.finished = false; this._writableState.errorEmitted = false; } @@ -18880,48 +19005,291 @@ function emitErrorNT(self, err) { self.emit('error', err); } +function errorOrDestroy(stream, err) { + // We have tests that rely on errors being emitted + // in the same tick, so changing this is semver major. + // For now when you opt-in to autoDestroy we allow + // the error to be emitted nextTick. In a future + // semver major update we should change the default to this. + var rState = stream._readableState; + var wState = stream._writableState; + if (rState && rState.autoDestroy || wState && wState.autoDestroy) stream.destroy(err);else stream.emit('error', err); +} + module.exports = { destroy: destroy, - undestroy: undestroy + undestroy: undestroy, + errorOrDestroy: errorOrDestroy }; -},{"process-nextick-args":45}],60:[function(require,module,exports){ -module.exports = require('events').EventEmitter; - -},{"events":37}],61:[function(require,module,exports){ -module.exports = require('./readable').PassThrough +}).call(this,require('_process')) -},{"./readable":62}],62:[function(require,module,exports){ -exports = module.exports = require('./lib/_stream_readable.js'); -exports.Stream = exports; -exports.Readable = exports; -exports.Writable = require('./lib/_stream_writable.js'); -exports.Duplex = require('./lib/_stream_duplex.js'); -exports.Transform = require('./lib/_stream_transform.js'); -exports.PassThrough = require('./lib/_stream_passthrough.js'); +},{"_process":45}],60:[function(require,module,exports){ +// Ported from https://github.com/mafintosh/end-of-stream with +// permission from the author, Mathias Buus (@mafintosh). +'use strict'; -},{"./lib/_stream_duplex.js":53,"./lib/_stream_passthrough.js":54,"./lib/_stream_readable.js":55,"./lib/_stream_transform.js":56,"./lib/_stream_writable.js":57}],63:[function(require,module,exports){ -module.exports = require('./readable').Transform +var ERR_STREAM_PREMATURE_CLOSE = require('../../../errors').codes.ERR_STREAM_PREMATURE_CLOSE; -},{"./readable":62}],64:[function(require,module,exports){ -module.exports = require('./lib/_stream_writable.js'); +function once(callback) { + var called = false; + return function () { + if (called) return; + called = true; -},{"./lib/_stream_writable.js":57}],65:[function(require,module,exports){ -/* eslint-disable node/no-deprecated-api */ -var buffer = require('buffer') -var Buffer = buffer.Buffer + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } -// alternative to using Object.keys for old browsers -function copyProps (src, dst) { - for (var key in src) { - dst[key] = src[key] - } + callback.apply(this, args); + }; } -if (Buffer.from && Buffer.alloc && Buffer.allocUnsafe && Buffer.allocUnsafeSlow) { - module.exports = buffer -} else { - // Copy properties from require('buffer') - copyProps(buffer, exports) - exports.Buffer = SafeBuffer + +function noop() {} + +function isRequest(stream) { + return stream.setHeader && typeof stream.abort === 'function'; +} + +function eos(stream, opts, callback) { + if (typeof opts === 'function') return eos(stream, null, opts); + if (!opts) opts = {}; + callback = once(callback || noop); + var readable = opts.readable || opts.readable !== false && stream.readable; + var writable = opts.writable || opts.writable !== false && stream.writable; + + var onlegacyfinish = function onlegacyfinish() { + if (!stream.writable) onfinish(); + }; + + var writableEnded = stream._writableState && stream._writableState.finished; + + var onfinish = function onfinish() { + writable = false; + writableEnded = true; + if (!readable) callback.call(stream); + }; + + var readableEnded = stream._readableState && stream._readableState.endEmitted; + + var onend = function onend() { + readable = false; + readableEnded = true; + if (!writable) callback.call(stream); + }; + + var onerror = function onerror(err) { + callback.call(stream, err); + }; + + var onclose = function onclose() { + var err; + + if (readable && !readableEnded) { + if (!stream._readableState || !stream._readableState.ended) err = new ERR_STREAM_PREMATURE_CLOSE(); + return callback.call(stream, err); + } + + if (writable && !writableEnded) { + if (!stream._writableState || !stream._writableState.ended) err = new ERR_STREAM_PREMATURE_CLOSE(); + return callback.call(stream, err); + } + }; + + var onrequest = function onrequest() { + stream.req.on('finish', onfinish); + }; + + if (isRequest(stream)) { + stream.on('complete', onfinish); + stream.on('abort', onclose); + if (stream.req) onrequest();else stream.on('request', onrequest); + } else if (writable && !stream._writableState) { + // legacy streams + stream.on('end', onlegacyfinish); + stream.on('close', onlegacyfinish); + } + + stream.on('end', onend); + stream.on('finish', onfinish); + if (opts.error !== false) stream.on('error', onerror); + stream.on('close', onclose); + return function () { + stream.removeListener('complete', onfinish); + stream.removeListener('abort', onclose); + stream.removeListener('request', onrequest); + if (stream.req) stream.req.removeListener('finish', onfinish); + stream.removeListener('end', onlegacyfinish); + stream.removeListener('close', onlegacyfinish); + stream.removeListener('finish', onfinish); + stream.removeListener('end', onend); + stream.removeListener('error', onerror); + stream.removeListener('close', onclose); + }; +} + +module.exports = eos; +},{"../../../errors":51}],61:[function(require,module,exports){ +module.exports = function () { + throw new Error('Readable.from is not available in the browser') +}; + +},{}],62:[function(require,module,exports){ +// Ported from https://github.com/mafintosh/pump with +// permission from the author, Mathias Buus (@mafintosh). +'use strict'; + +var eos; + +function once(callback) { + var called = false; + return function () { + if (called) return; + called = true; + callback.apply(void 0, arguments); + }; +} + +var _require$codes = require('../../../errors').codes, + ERR_MISSING_ARGS = _require$codes.ERR_MISSING_ARGS, + ERR_STREAM_DESTROYED = _require$codes.ERR_STREAM_DESTROYED; + +function noop(err) { + // Rethrow the error if it exists to avoid swallowing it + if (err) throw err; +} + +function isRequest(stream) { + return stream.setHeader && typeof stream.abort === 'function'; +} + +function destroyer(stream, reading, writing, callback) { + callback = once(callback); + var closed = false; + stream.on('close', function () { + closed = true; + }); + if (eos === undefined) eos = require('./end-of-stream'); + eos(stream, { + readable: reading, + writable: writing + }, function (err) { + if (err) return callback(err); + closed = true; + callback(); + }); + var destroyed = false; + return function (err) { + if (closed) return; + if (destroyed) return; + destroyed = true; // request.destroy just do .end - .abort is what we want + + if (isRequest(stream)) return stream.abort(); + if (typeof stream.destroy === 'function') return stream.destroy(); + callback(err || new ERR_STREAM_DESTROYED('pipe')); + }; +} + +function call(fn) { + fn(); +} + +function pipe(from, to) { + return from.pipe(to); +} + +function popCallback(streams) { + if (!streams.length) return noop; + if (typeof streams[streams.length - 1] !== 'function') return noop; + return streams.pop(); +} + +function pipeline() { + for (var _len = arguments.length, streams = new Array(_len), _key = 0; _key < _len; _key++) { + streams[_key] = arguments[_key]; + } + + var callback = popCallback(streams); + if (Array.isArray(streams[0])) streams = streams[0]; + + if (streams.length < 2) { + throw new ERR_MISSING_ARGS('streams'); + } + + var error; + var destroys = streams.map(function (stream, i) { + var reading = i < streams.length - 1; + var writing = i > 0; + return destroyer(stream, reading, writing, function (err) { + if (!error) error = err; + if (err) destroys.forEach(call); + if (reading) return; + destroys.forEach(call); + callback(error); + }); + }); + return streams.reduce(pipe); +} + +module.exports = pipeline; +},{"../../../errors":51,"./end-of-stream":60}],63:[function(require,module,exports){ +'use strict'; + +var ERR_INVALID_OPT_VALUE = require('../../../errors').codes.ERR_INVALID_OPT_VALUE; + +function highWaterMarkFrom(options, isDuplex, duplexKey) { + return options.highWaterMark != null ? options.highWaterMark : isDuplex ? options[duplexKey] : null; +} + +function getHighWaterMark(state, options, duplexKey, isDuplex) { + var hwm = highWaterMarkFrom(options, isDuplex, duplexKey); + + if (hwm != null) { + if (!(isFinite(hwm) && Math.floor(hwm) === hwm) || hwm < 0) { + var name = isDuplex ? duplexKey : 'highWaterMark'; + throw new ERR_INVALID_OPT_VALUE(name, hwm); + } + + return Math.floor(hwm); + } // Default value + + + return state.objectMode ? 16 : 16 * 1024; +} + +module.exports = { + getHighWaterMark: getHighWaterMark +}; +},{"../../../errors":51}],64:[function(require,module,exports){ +module.exports = require('events').EventEmitter; + +},{"events":37}],65:[function(require,module,exports){ +exports = module.exports = require('./lib/_stream_readable.js'); +exports.Stream = exports; +exports.Readable = exports; +exports.Writable = require('./lib/_stream_writable.js'); +exports.Duplex = require('./lib/_stream_duplex.js'); +exports.Transform = require('./lib/_stream_transform.js'); +exports.PassThrough = require('./lib/_stream_passthrough.js'); +exports.finished = require('./lib/internal/streams/end-of-stream.js'); +exports.pipeline = require('./lib/internal/streams/pipeline.js'); + +},{"./lib/_stream_duplex.js":52,"./lib/_stream_passthrough.js":53,"./lib/_stream_readable.js":54,"./lib/_stream_transform.js":55,"./lib/_stream_writable.js":56,"./lib/internal/streams/end-of-stream.js":60,"./lib/internal/streams/pipeline.js":62}],66:[function(require,module,exports){ +/* eslint-disable node/no-deprecated-api */ +var buffer = require('buffer') +var Buffer = buffer.Buffer + +// alternative to using Object.keys for old browsers +function copyProps (src, dst) { + for (var key in src) { + dst[key] = src[key] + } +} +if (Buffer.from && Buffer.alloc && Buffer.allocUnsafe && Buffer.allocUnsafeSlow) { + module.exports = buffer +} else { + // Copy properties from require('buffer') + copyProps(buffer, exports) + exports.Buffer = SafeBuffer } function SafeBuffer (arg, encodingOrOffset, length) { @@ -18969,7 +19337,7 @@ SafeBuffer.allocUnsafeSlow = function (size) { return buffer.SlowBuffer(size) } -},{"buffer":30}],66:[function(require,module,exports){ +},{"buffer":30}],67:[function(require,module,exports){ (function (Buffer){ ;(function (sax) { // wrapper for non-node envs sax.parser = function (strict, opt) { return new SAXParser(strict, opt) } @@ -19580,1095 +19948,3382 @@ SafeBuffer.allocUnsafeSlow = function (size) { 'diams': 9830 } - Object.keys(sax.ENTITIES).forEach(function (key) { - var e = sax.ENTITIES[key] - var s = typeof e === 'number' ? String.fromCharCode(e) : e - sax.ENTITIES[key] = s - }) + Object.keys(sax.ENTITIES).forEach(function (key) { + var e = sax.ENTITIES[key] + var s = typeof e === 'number' ? String.fromCharCode(e) : e + sax.ENTITIES[key] = s + }) + + for (var s in sax.STATE) { + sax.STATE[sax.STATE[s]] = s + } + + // shorthand + S = sax.STATE + + function emit (parser, event, data) { + parser[event] && parser[event](data) + } + + function emitNode (parser, nodeType, data) { + if (parser.textNode) closeText(parser) + emit(parser, nodeType, data) + } + + function closeText (parser) { + parser.textNode = textopts(parser.opt, parser.textNode) + if (parser.textNode) emit(parser, 'ontext', parser.textNode) + parser.textNode = '' + } + + function textopts (opt, text) { + if (opt.trim) text = text.trim() + if (opt.normalize) text = text.replace(/\s+/g, ' ') + return text + } + + function error (parser, er) { + closeText(parser) + if (parser.trackPosition) { + er += '\nLine: ' + parser.line + + '\nColumn: ' + parser.column + + '\nChar: ' + parser.c + } + er = new Error(er) + parser.error = er + emit(parser, 'onerror', er) + return parser + } + + function end (parser) { + if (parser.sawRoot && !parser.closedRoot) strictFail(parser, 'Unclosed root tag') + if ((parser.state !== S.BEGIN) && + (parser.state !== S.BEGIN_WHITESPACE) && + (parser.state !== S.TEXT)) { + error(parser, 'Unexpected end') + } + closeText(parser) + parser.c = '' + parser.closed = true + emit(parser, 'onend') + SAXParser.call(parser, parser.strict, parser.opt) + return parser + } + + function strictFail (parser, message) { + if (typeof parser !== 'object' || !(parser instanceof SAXParser)) { + throw new Error('bad call to strictFail') + } + if (parser.strict) { + error(parser, message) + } + } + + function newTag (parser) { + if (!parser.strict) parser.tagName = parser.tagName[parser.looseCase]() + var parent = parser.tags[parser.tags.length - 1] || parser + var tag = parser.tag = { name: parser.tagName, attributes: {} } + + // will be overridden if tag contails an xmlns="foo" or xmlns:foo="bar" + if (parser.opt.xmlns) { + tag.ns = parent.ns + } + parser.attribList.length = 0 + emitNode(parser, 'onopentagstart', tag) + } + + function qname (name, attribute) { + var i = name.indexOf(':') + var qualName = i < 0 ? [ '', name ] : name.split(':') + var prefix = qualName[0] + var local = qualName[1] + + // + if (attribute && name === 'xmlns') { + prefix = 'xmlns' + local = '' + } + + return { prefix: prefix, local: local } + } + + function attrib (parser) { + if (!parser.strict) { + parser.attribName = parser.attribName[parser.looseCase]() + } + + if (parser.attribList.indexOf(parser.attribName) !== -1 || + parser.tag.attributes.hasOwnProperty(parser.attribName)) { + parser.attribName = parser.attribValue = '' + return + } + + if (parser.opt.xmlns) { + var qn = qname(parser.attribName, true) + var prefix = qn.prefix + var local = qn.local + + if (prefix === 'xmlns') { + // namespace binding attribute. push the binding into scope + if (local === 'xml' && parser.attribValue !== XML_NAMESPACE) { + strictFail(parser, + 'xml: prefix must be bound to ' + XML_NAMESPACE + '\n' + + 'Actual: ' + parser.attribValue) + } else if (local === 'xmlns' && parser.attribValue !== XMLNS_NAMESPACE) { + strictFail(parser, + 'xmlns: prefix must be bound to ' + XMLNS_NAMESPACE + '\n' + + 'Actual: ' + parser.attribValue) + } else { + var tag = parser.tag + var parent = parser.tags[parser.tags.length - 1] || parser + if (tag.ns === parent.ns) { + tag.ns = Object.create(parent.ns) + } + tag.ns[local] = parser.attribValue + } + } + + // defer onattribute events until all attributes have been seen + // so any new bindings can take effect. preserve attribute order + // so deferred events can be emitted in document order + parser.attribList.push([parser.attribName, parser.attribValue]) + } else { + // in non-xmlns mode, we can emit the event right away + parser.tag.attributes[parser.attribName] = parser.attribValue + emitNode(parser, 'onattribute', { + name: parser.attribName, + value: parser.attribValue + }) + } + + parser.attribName = parser.attribValue = '' + } + + function openTag (parser, selfClosing) { + if (parser.opt.xmlns) { + // emit namespace binding events + var tag = parser.tag + + // add namespace info to tag + var qn = qname(parser.tagName) + tag.prefix = qn.prefix + tag.local = qn.local + tag.uri = tag.ns[qn.prefix] || '' + + if (tag.prefix && !tag.uri) { + strictFail(parser, 'Unbound namespace prefix: ' + + JSON.stringify(parser.tagName)) + tag.uri = qn.prefix + } + + var parent = parser.tags[parser.tags.length - 1] || parser + if (tag.ns && parent.ns !== tag.ns) { + Object.keys(tag.ns).forEach(function (p) { + emitNode(parser, 'onopennamespace', { + prefix: p, + uri: tag.ns[p] + }) + }) + } + + // handle deferred onattribute events + // Note: do not apply default ns to attributes: + // http://www.w3.org/TR/REC-xml-names/#defaulting + for (var i = 0, l = parser.attribList.length; i < l; i++) { + var nv = parser.attribList[i] + var name = nv[0] + var value = nv[1] + var qualName = qname(name, true) + var prefix = qualName.prefix + var local = qualName.local + var uri = prefix === '' ? '' : (tag.ns[prefix] || '') + var a = { + name: name, + value: value, + prefix: prefix, + local: local, + uri: uri + } + + // if there's any attributes with an undefined namespace, + // then fail on them now. + if (prefix && prefix !== 'xmlns' && !uri) { + strictFail(parser, 'Unbound namespace prefix: ' + + JSON.stringify(prefix)) + a.uri = prefix + } + parser.tag.attributes[name] = a + emitNode(parser, 'onattribute', a) + } + parser.attribList.length = 0 + } + + parser.tag.isSelfClosing = !!selfClosing + + // process the tag + parser.sawRoot = true + parser.tags.push(parser.tag) + emitNode(parser, 'onopentag', parser.tag) + if (!selfClosing) { + // special case for