New Case Study:See how Anthropic automated 95% of dependency reviews with Socket.Learn More
Socket
Sign inDemoInstall
Socket

redibox-hook-job

Package Overview
Dependencies
Maintainers
2
Versions
23
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

redibox-hook-job - npm Package Compare versions

Comparing version

to
1.1.0

6

lib/hook.js

@@ -98,5 +98,3 @@ 'use strict';

*/
toKey() {
let key = arguments.length <= 0 || arguments[0] === undefined ? '' : arguments[0];
toKey(key = '') {
return `${ this.options.keyPrefix }:${ key }`;

@@ -115,2 +113,2 @@ }

exports.default = JobHook;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9ob29rLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQUE7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBRWUsTUFBTSxPQUFOLDJCQUErQjtBQUM1QyxnQkFBYztBQUNaLFVBQU0sS0FBTjtBQUNBLFNBQUssTUFBTCxHQUFjLEVBQWQ7QUFDRDs7Ozs7OztBQU9ELGFBQVc7QUFDVDtBQUNEOzs7Ozs7QUFNRCxZQUFVO0FBQ1I7QUFDRDs7Ozs7QUFLRCxlQUFhO0FBQ1gsUUFBSSxDQUFDLEtBQUssT0FBTCxDQUFhLE9BQWxCLEVBQTJCO0FBQ3pCLGFBQU8sbUJBQVEsT0FBUixFQUFQO0FBQ0Q7O0FBRUQsU0FBSyxJQUFJLElBQUksQ0FBUixFQUFXLE1BQU0sS0FBSyxPQUFMLENBQWEsTUFBYixDQUFvQixNQUExQyxFQUFrRCxJQUFJLEdBQXRELEVBQTJELEdBQTNELEVBQWdFO0FBQzlELFlBQU0sUUFBUSxLQUFLLE9BQUwsQ0FBYSxNQUFiLENBQW9CLENBQXBCLENBQWQ7QUFDQSxXQUFLLFdBQUwsQ0FBaUIsS0FBakI7QUFDRDs7QUFFRCxXQUFPLG1CQUFRLE9BQVIsRUFBUDtBQUNEOzs7Ozs7Ozs7QUFTRCxTQUFPLEtBQVAsRUFBYyxJQUFkLEVBQW9CLE9BQXBCLEVBQTZCO0FBQzNCLFNBQUssR0FBTCxDQUFTLE9BQVQsQ0FBaUIsQ0FBQyxrQkFBRCxHQUFxQixLQUFyQixFQUEyQixBQUEzQixDQUFqQjtBQUNBLFdBQU8sa0JBQVEsS0FBSyxJQUFiLEVBQW1CLElBQW5CLEVBQXlCLElBQXpCLEVBQStCLE9BQS9CLEVBQXdDLEtBQXhDLEVBQStDLElBQS9DLENBQVA7QUFDRDs7Ozs7O0FBTUQsY0FBWSxLQUFaLEVBQW1CO0FBQ2pCLFNBQUssR0FBTCxDQUFTLE9BQVQsQ0FBaUIsQ0FBQyxPQUFELEdBQVUsTUFBTSxJQUFoQixFQUFxQixVQUFyQixDQUFqQjtBQUNBLFNBQUssTUFBTCxDQUFZLE1BQU0sSUFBbEIsSUFBMEIsaUNBQWUsS0FBSyxPQUFwQixFQUFnQyxLQUFoQyxHQUF5QyxLQUFLLElBQTlDLENBQTFCO0FBQ0Q7Ozs7Ozs7QUFPRCxVQUFnQjtBQUFBLFFBQVYsR0FBVSx5REFBSixFQUFJOztBQUNkLFdBQU8sQ0FBQyxBQUFELEdBQUcsS0FBSyxPQUFMLENBQWEsU0FBaEIsRUFBMEIsQ0FBMUIsR0FBNkIsR0FBN0IsRUFBaUMsQUFBakMsQ0FBUDtBQUNEOzs7Ozs7O0FBT0QsVUFBUSxJQUFSLEVBQWM7QUFDWixTQUFLLE9BQUwsQ0FBYSxPQUFiLEdBQXVCLFFBQVEsQ0FBQyxLQUFLLE9BQUwsQ0FBYSxPQUE3QztBQUNEO0FBNUUyQztrQkFBekIsTyIsImZpbGUiOiJob29rLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEpvYiBmcm9tICcuL2pvYic7XG5pbXBvcnQgUXVldWUgZnJvbSAnLi9xdWV1ZSc7XG5pbXBvcnQgUHJvbWlzZSBmcm9tICdibHVlYmlyZCc7XG5pbXBvcnQgZGVmYXVsdHMgZnJvbSAnLi9kZWZhdWx0cyc7XG5pbXBvcnQgc2NyaXB0cyBmcm9tICcuL3NjcmlwdHMnO1xuaW1wb3J0IHsgQmFzZUhvb2sgfSBmcm9tICdyZWRpYm94JztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSm9iSG9vayBleHRlbmRzIEJhc2VIb29rIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoJ2pvYicpO1xuICAgIHRoaXMucXVldWVzID0ge307XG4gIH1cblxuICAvLyBub2luc3BlY3Rpb24gSlNVbnVzZWRHbG9iYWxTeW1ib2xzLEpTTWV0aG9kQ2FuQmVTdGF0aWNcbiAgLyoqXG4gICAqIERlZmF1bHQgY29uZmlnIGZvciBzY2hlZHVsZXJcbiAgICogQHJldHVybnMge3tzb21lRGVmYXVsdFRoaW5nOiBzdHJpbmd9fVxuICAgKi9cbiAgZGVmYXVsdHMoKSB7XG4gICAgcmV0dXJuIGRlZmF1bHRzO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEByZXR1cm5zIHt7YWRkSm9iLCBjaGVja1N0YWxsZWRKb2JzLCByZW1vdmVKb2J9fVxuICAgKi9cbiAgc2NyaXB0cygpIHtcbiAgICByZXR1cm4gc2NyaXB0cztcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKi9cbiAgaW5pdGlhbGl6ZSgpIHtcbiAgICBpZiAoIXRoaXMub3B0aW9ucy5lbmFibGVkKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHRoaXMub3B0aW9ucy5xdWV1ZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGNvbnN0IHF1ZXVlID0gdGhpcy5vcHRpb25zLnF1ZXVlc1tpXTtcbiAgICAgIHRoaXMucXVldWVDcmVhdGUocXVldWUpO1xuICAgIH1cblxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IGpvYiBmb3IgdGhlIHNwZWNpZmllZCBxdWV1ZVxuICAgKiBAcGFyYW0gcXVldWVcbiAgICogQHBhcmFtIGRhdGFcbiAgICogQHBhcmFtIG9wdGlvbnNcbiAgICogQHJldHVybnMgeyp8Sm9ifVxuICAgKi9cbiAgY3JlYXRlKHF1ZXVlLCBkYXRhLCBvcHRpb25zKSB7XG4gICAgdGhpcy5sb2cudmVyYm9zZShgQ3JlYXRpbmcgdGFzayBmb3IgJHtxdWV1ZX1gKTtcbiAgICByZXR1cm4gbmV3IEpvYih0aGlzLmNvcmUsIG51bGwsIGRhdGEsIG9wdGlvbnMsIHF1ZXVlLCB0cnVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0gcXVldWVcbiAgICovXG4gIHF1ZXVlQ3JlYXRlKHF1ZXVlKSB7XG4gICAgdGhpcy5sb2cudmVyYm9zZShgUXVldWUgJyR7cXVldWUubmFtZX0nIGNyZWF0ZWQhYCk7XG4gICAgdGhpcy5xdWV1ZXNbcXVldWUubmFtZV0gPSBuZXcgUXVldWUoeyAuLi50aGlzLm9wdGlvbnMsIC4uLnF1ZXVlIH0sIHRoaXMuY29yZSk7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgdGhlIHVzZXJzIGtleSB0byB0aGUgZnVsbCByZWRpcyBrZXkgd2l0aCBtb2R1bGUgcHJlZml4LlxuICAgKiBAcGFyYW0ga2V5XG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICB0b0tleShrZXkgPSAnJykge1xuICAgIHJldHVybiBgJHt0aGlzLm9wdGlvbnMua2V5UHJlZml4fToke2tleX1gO1xuICB9XG5cbiAgLyoqXG4gICAqIFRvIGVuYWJsZSBieXBhc3Npbmcgb2YgY2FjaGUgZm9yIHdyYXAgZnVuY3Rpb25zXG4gICAqIFRvZ2dsZXMgYnkgZGVmYXVsdCBvciBwYXNzIGluIHRydWUvZmFsc2VcbiAgICogQHBhcmFtIGJvb2xcbiAgICovXG4gIGVuYWJsZWQoYm9vbCkge1xuICAgIHRoaXMub3B0aW9ucy5lbmFibGVkID0gYm9vbCB8fCAhdGhpcy5vcHRpb25zLmVuYWJsZWQ7XG4gIH1cbn1cbiJdfQ==
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9ob29rLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQUE7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBRWUsTUFBTSxPQUFOLDJCQUErQjtBQUM1QyxnQkFBYztBQUNaLFVBQU0sS0FBTjtBQUNBLFNBQUssTUFBTCxHQUFjLEVBQWQ7QUFDRDs7Ozs7OztBQU9ELGFBQVc7QUFDVDtBQUNEOzs7Ozs7QUFNRCxZQUFVO0FBQ1I7QUFDRDs7Ozs7QUFLRCxlQUFhO0FBQ1gsUUFBSSxDQUFDLEtBQUssT0FBTCxDQUFhLE9BQWxCLEVBQTJCO0FBQ3pCLGFBQU8sbUJBQVEsT0FBUixFQUFQO0FBQ0Q7O0FBRUQsU0FBSyxJQUFJLElBQUksQ0FBUixFQUFXLE1BQU0sS0FBSyxPQUFMLENBQWEsTUFBYixDQUFvQixNQUExQyxFQUFrRCxJQUFJLEdBQXRELEVBQTJELEdBQTNELEVBQWdFO0FBQzlELFlBQU0sUUFBUSxLQUFLLE9BQUwsQ0FBYSxNQUFiLENBQW9CLENBQXBCLENBQWQ7QUFDQSxXQUFLLFdBQUwsQ0FBaUIsS0FBakI7QUFDRDs7QUFFRCxXQUFPLG1CQUFRLE9BQVIsRUFBUDtBQUNEOzs7Ozs7Ozs7QUFTRCxTQUFPLEtBQVAsRUFBYyxJQUFkLEVBQW9CLE9BQXBCLEVBQTZCO0FBQzNCLFNBQUssR0FBTCxDQUFTLE9BQVQsQ0FBaUIsQ0FBQyxrQkFBRCxHQUFxQixLQUFyQixFQUEyQixBQUEzQixDQUFqQjtBQUNBLFdBQU8sa0JBQVEsS0FBSyxJQUFiLEVBQW1CLElBQW5CLEVBQXlCLElBQXpCLEVBQStCLE9BQS9CLEVBQXdDLEtBQXhDLEVBQStDLElBQS9DLENBQVA7QUFDRDs7Ozs7O0FBTUQsY0FBWSxLQUFaLEVBQW1CO0FBQ2pCLFNBQUssR0FBTCxDQUFTLE9BQVQsQ0FBaUIsQ0FBQyxPQUFELEdBQVUsTUFBTSxJQUFoQixFQUFxQixVQUFyQixDQUFqQjtBQUNBLFNBQUssTUFBTCxDQUFZLE1BQU0sSUFBbEIsSUFBMEIsaUNBQWUsS0FBSyxPQUFwQixFQUFnQyxLQUFoQyxHQUF5QyxLQUFLLElBQTlDLENBQTFCO0FBQ0Q7Ozs7Ozs7QUFPRCxRQUFNLE1BQU0sRUFBWixFQUFnQjtBQUNkLFdBQU8sQ0FBQyxBQUFELEdBQUcsS0FBSyxPQUFMLENBQWEsU0FBaEIsRUFBMEIsQ0FBMUIsR0FBNkIsR0FBN0IsRUFBaUMsQUFBakMsQ0FBUDtBQUNEOzs7Ozs7O0FBT0QsVUFBUSxJQUFSLEVBQWM7QUFDWixTQUFLLE9BQUwsQ0FBYSxPQUFiLEdBQXVCLFFBQVEsQ0FBQyxLQUFLLE9BQUwsQ0FBYSxPQUE3QztBQUNEO0FBNUUyQztrQkFBekIsTyIsImZpbGUiOiJob29rLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEpvYiBmcm9tICcuL2pvYic7XG5pbXBvcnQgUXVldWUgZnJvbSAnLi9xdWV1ZSc7XG5pbXBvcnQgUHJvbWlzZSBmcm9tICdibHVlYmlyZCc7XG5pbXBvcnQgZGVmYXVsdHMgZnJvbSAnLi9kZWZhdWx0cyc7XG5pbXBvcnQgc2NyaXB0cyBmcm9tICcuL3NjcmlwdHMnO1xuaW1wb3J0IHsgQmFzZUhvb2sgfSBmcm9tICdyZWRpYm94JztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSm9iSG9vayBleHRlbmRzIEJhc2VIb29rIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoJ2pvYicpO1xuICAgIHRoaXMucXVldWVzID0ge307XG4gIH1cblxuICAvLyBub2luc3BlY3Rpb24gSlNVbnVzZWRHbG9iYWxTeW1ib2xzLEpTTWV0aG9kQ2FuQmVTdGF0aWNcbiAgLyoqXG4gICAqIERlZmF1bHQgY29uZmlnIGZvciBzY2hlZHVsZXJcbiAgICogQHJldHVybnMge3tzb21lRGVmYXVsdFRoaW5nOiBzdHJpbmd9fVxuICAgKi9cbiAgZGVmYXVsdHMoKSB7XG4gICAgcmV0dXJuIGRlZmF1bHRzO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEByZXR1cm5zIHt7YWRkSm9iLCBjaGVja1N0YWxsZWRKb2JzLCByZW1vdmVKb2J9fVxuICAgKi9cbiAgc2NyaXB0cygpIHtcbiAgICByZXR1cm4gc2NyaXB0cztcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKi9cbiAgaW5pdGlhbGl6ZSgpIHtcbiAgICBpZiAoIXRoaXMub3B0aW9ucy5lbmFibGVkKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHRoaXMub3B0aW9ucy5xdWV1ZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGNvbnN0IHF1ZXVlID0gdGhpcy5vcHRpb25zLnF1ZXVlc1tpXTtcbiAgICAgIHRoaXMucXVldWVDcmVhdGUocXVldWUpO1xuICAgIH1cblxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IGpvYiBmb3IgdGhlIHNwZWNpZmllZCBxdWV1ZVxuICAgKiBAcGFyYW0gcXVldWVcbiAgICogQHBhcmFtIGRhdGFcbiAgICogQHBhcmFtIG9wdGlvbnNcbiAgICogQHJldHVybnMgeyp8Sm9ifVxuICAgKi9cbiAgY3JlYXRlKHF1ZXVlLCBkYXRhLCBvcHRpb25zKSB7XG4gICAgdGhpcy5sb2cudmVyYm9zZShgQ3JlYXRpbmcgdGFzayBmb3IgJHtxdWV1ZX1gKTtcbiAgICByZXR1cm4gbmV3IEpvYih0aGlzLmNvcmUsIG51bGwsIGRhdGEsIG9wdGlvbnMsIHF1ZXVlLCB0cnVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0gcXVldWVcbiAgICovXG4gIHF1ZXVlQ3JlYXRlKHF1ZXVlKSB7XG4gICAgdGhpcy5sb2cudmVyYm9zZShgUXVldWUgJyR7cXVldWUubmFtZX0nIGNyZWF0ZWQhYCk7XG4gICAgdGhpcy5xdWV1ZXNbcXVldWUubmFtZV0gPSBuZXcgUXVldWUoeyAuLi50aGlzLm9wdGlvbnMsIC4uLnF1ZXVlIH0sIHRoaXMuY29yZSk7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgdGhlIHVzZXJzIGtleSB0byB0aGUgZnVsbCByZWRpcyBrZXkgd2l0aCBtb2R1bGUgcHJlZml4LlxuICAgKiBAcGFyYW0ga2V5XG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICB0b0tleShrZXkgPSAnJykge1xuICAgIHJldHVybiBgJHt0aGlzLm9wdGlvbnMua2V5UHJlZml4fToke2tleX1gO1xuICB9XG5cbiAgLyoqXG4gICAqIFRvIGVuYWJsZSBieXBhc3Npbmcgb2YgY2FjaGUgZm9yIHdyYXAgZnVuY3Rpb25zXG4gICAqIFRvZ2dsZXMgYnkgZGVmYXVsdCBvciBwYXNzIGluIHRydWUvZmFsc2VcbiAgICogQHBhcmFtIGJvb2xcbiAgICovXG4gIGVuYWJsZWQoYm9vbCkge1xuICAgIHRoaXMub3B0aW9ucy5lbmFibGVkID0gYm9vbCB8fCAhdGhpcy5vcHRpb25zLmVuYWJsZWQ7XG4gIH1cbn1cbiJdfQ==

@@ -34,18 +34,18 @@ 'use strict';

*/
constructor(core, id) {
let data = arguments.length <= 2 || arguments[2] === undefined ? {} : arguments[2];
let options = arguments.length <= 3 || arguments[3] === undefined ? {
unique: false,
timeout: 60000 } : arguments[3];
let // 1 minute default timeout
queueName = arguments[4];
let isNew = arguments[5];
constructor(core, id, data = {}, options = {
unique: false,
timeout: 60000 }, // 1 minute default timeout
queueName, isNew) {
this.id = id;
this.core = core;
this.data = data;
this.options = options;
this.status = 'created';
this.options = options;
this.subscriptions = [];
this.queueName = queueName;
this.subscriptions = [];
this.type = data.runs && Array.isArray(data.runs) ? 'relay' : 'single';
// parent relay job timeout should cover all child job timeouts
if (this.type === 'relay') this.options.timeout = this.options.timeout * data.runs.length;
if (isNew) {

@@ -69,4 +69,6 @@ // this Proxy allows chaining methods while still keeping the

});
return this.proxy;
}
return this;

@@ -116,7 +118,7 @@ }

* @returns {*}
*/
toObject() {
*/
toObject(excludeData) {
return {
id: this.id,
data: this.data,
data: excludeData ? 'hidden' : this.data,
status: this.status,

@@ -141,4 +143,3 @@ options: this.options

this.status = 'saved';
// this.queue.jobs[id] = this;
return _bluebird2.default.resolve(this.toObject());
return _bluebird2.default.resolve(this.toObject(true));
});

@@ -172,18 +173,10 @@ }

// on message received
const channel = message.channel;
// remove the pubsub data
if (message.data) {
message = message.data;
}
if (message.data) message = message.data;
// if there's an error the assume failed.
if (message.error) {
return this.onFailureCallback(message);
}
// if there's an error then assume failed.
if (message.error) return this.onFailureCallback(message);
// is it from the success channel.
if (this.subscriptions[0] === channel) {
return this.onSuccessCallback(message);
}
if (this.subscriptions[0] === message.channel) return this.onSuccessCallback(message);

@@ -194,3 +187,3 @@ return this.onFailureCallback(message);

type: 'job',
error: new Error('Error while subscribing to job events, however this job will still be queued - ' + 'you may be unable to receive onComplete / onFailure events for this job.'),
error: new Error('Error while subscribing to job events, however this job will still be queued - ' + 'you may be unable to receive onSuccess / onFailure events for this job.'),
error_actual: error

@@ -209,5 +202,3 @@ }));

retries(n) {
if (n < 0) {
throw Error('Retries cannot be negative');
}
if (n < 0) throw Error('Retries cannot be negative');
this.options.retries = n - 1;

@@ -252,3 +243,3 @@ return this.proxy;

/**
* Set how long this job can run before it times out.
* Set how long this job can remain running for before it times out.
* @param ms

@@ -263,52 +254,2 @@ * @returns {Job}

/**
*
* @returns {Job.initialJob|*}
*/
initialJob() {
return this._internalData.initialJob;
}
/**
*
* @returns {Job.initialQueue|*}
*/
initialQueue() {
return this._internalData.initialQueue;
}
/**
* Remove this job from all sets.
* @param cb
*/
remove() {
let cb = arguments.length <= 0 || arguments[0] === undefined ? _redibox.noop : arguments[0];
this.core.client.removejob(this._toQueueKey('succeeded'), this._toQueueKey('failed'), this._toQueueKey('waiting'), this._toQueueKey('active'), this._toQueueKey('stalling'), this._toQueueKey('jobs'), this.id, cb);
}
/**
* Re-save this job for the purpose of retrying it.
* @param cb
*/
retry() {
let cb = arguments.length <= 0 || arguments[0] === undefined ? _redibox.noop : arguments[0];
this.core.client.multi().srem(this._toQueueKey('failed'), this.id).lpush(this._toQueueKey('waiting'), this.id).exec(cb);
}
/**
* Callbacks true of false if this job exists in the specified set.
* @param set
* @param cb
*/
isInSet(set) {
let cb = arguments.length <= 1 || arguments[1] === undefined ? _redibox.noop : arguments[1];
this.core.client.sismember(this._toQueueKey(set), this.id, (err, result) => {
if (err) return cb(err);
return cb(null, result === 1);
});
}
/**
* Generates a queue prefixed key based on the provided string.

@@ -353,2 +294,74 @@ * @param str

exports.default = Job;
//# sourceMappingURL=data:application/json;base64,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Q0FBNEIsU0FBL0IsRUFBeUMsRUFBekMsR0FBNkMsS0FBSyxTQUFsRCxFQUE0RCxFQUE1RCxHQUFnRSxHQUFoRSxFQUFvRSxBQUFwRSxDQUFQO0FBQ0Q7QUFDRCxXQUFPLENBQUMsQUFBRCxHQUFHLEtBQUssSUFBTCxDQUFVLEtBQVYsQ0FBZ0IsR0FBaEIsQ0FBb0IsT0FBcEIsQ0FBNEIsU0FBL0IsRUFBeUMsQ0FBekMsR0FBNEMsS0FBSyxTQUFqRCxFQUEyRCxDQUEzRCxHQUE4RCxHQUE5RCxFQUFrRSxBQUFsRSxDQUFQO0FBQ0Q7O0FBOVNPLEM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O2tCQWtUSyxHIiwiZmlsZSI6ImpvYi5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICpcbiAqIFRoZSBNSVQgTGljZW5zZSAoTUlUKVxuICpcbiAqIENvcHlyaWdodCAoYykgMjAxNSBTYWxha2FyXG4gKlxuICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4gKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuICpcbiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbFxuICogY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbiAqXG4gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4gKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbiAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFXG4gKiBTT0ZUV0FSRS5cbiAqXG4gKi9cblxuaW1wb3J0IGN1aWQgZnJvbSAnY3VpZCc7XG5pbXBvcnQgUHJvbWlzZSBmcm9tICdibHVlYmlyZCc7XG5pbXBvcnQgeyBub29wLCBzaGExc3VtLCB0cnlKU09OU3RyaW5naWZ5LCB0cnlKU09OUGFyc2UgfSBmcm9tICdyZWRpYm94JztcblxuLyoqXG4gKiBAY2xhc3MgSm9iXG4gKi9cbmNsYXNzIEpvYiB7XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSBjb3JlXG4gICAqIEBwYXJhbSBpZFxuICAgKiBAcGFyYW0gZGF0YVxuICAgKiBAcGFyYW0gb3B0aW9uc1xuICAgKiBAcGFyYW0gcXVldWVOYW1lXG4gICAqIEBwYXJhbSBpc05ld1xuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGNvbnN0cnVjdG9yKGNvcmUsIGlkLCBkYXRhID0ge30sIG9wdGlvbnMgPSB7XG4gICAgdW5pcXVlOiBmYWxzZSxcbiAgICB0aW1lb3V0OiA2MDAwMCwgLy8gMSBtaW51dGUgZGVmYXVsdCB0aW1lb3V0XG4gIH0sIHF1ZXVlTmFtZSwgaXNOZXcpIHtcbiAgICB0aGlzLmlkID0gaWQ7XG4gICAgdGhpcy5jb3JlID0gY29yZTtcbiAgICB0aGlzLmRhdGEgPSBkYXRhO1xuICAgIHRoaXMuc3RhdHVzID0gJ2NyZWF0ZWQnO1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgdGhpcy5xdWV1ZU5hbWUgPSBxdWV1ZU5hbWU7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zID0gW107XG4gICAgaWYgKGlzTmV3KSB7XG4gICAgICAvLyB0aGlzIFByb3h5IGFsbG93cyBjaGFpbmluZyBtZXRob2RzIHdoaWxlIHN0aWxsIGtlZXBpbmcgdGhlXG4gICAgICAvLyBzYXZlKCkgcHJvbWlzZSB2YWxpZFxuICAgICAgdGhpcy5wcm94eSA9IG5ldyBQcm94eSh0aGlzLCB7XG4gICAgICAgIGdldCh0YXJnZXQsIG5hbWUpIHtcbiAgICAgICAgICBpZiAobmFtZSBpbiB0YXJnZXQpIHtcbiAgICAgICAgICAgIHJldHVybiB0YXJnZXRbbmFtZV07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gaGF4eG9yc1xuICAgICAgICAgIGlmIChuYW1lID09PSAndGhlbicpIHtcbiAgICAgICAgICAgIHRhcmdldC5wcm9taXNlID0gdGFyZ2V0LnNhdmUoKTtcbiAgICAgICAgICAgIHJldHVybiB0YXJnZXQucHJvbWlzZS50aGVuLmJpbmQodGFyZ2V0LnByb21pc2UpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB0aGlzLnByb3h5O1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBRdWVyeSByZWRpcyBmb3IgdGhlIHNwZWNpZmllZCBqb2IgaWQgYW5kIGNvbnZlcnRzIGl0IHRvIGEgbmV3IGluc3RhbmNlIG9mIEpvYi5cbiAgICogQHN0YXRpY1xuICAgKiBAcGFyYW0gcXVldWVcbiAgICogQHBhcmFtIGlkXG4gICAqL1xuICBzdGF0aWMgZnJvbUlkKHF1ZXVlLCBpZCkge1xuICAgIHJldHVybiBxdWV1ZS5jbGllbnQuaGdldChxdWV1ZS50b0tleSgnam9icycpLCBpZCkudGhlbigoZGF0YSkgPT5cbiAgICAgIEpvYi5mcm9tRGF0YShxdWV1ZSwgaWQsIGRhdGEpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhIEpTT04gc3RyaW5nIG9mIGEgam9iJ3MgZGF0YSB0byBhIG5ldyBpbnN0YW5jZSBvZiBKb2JcbiAgICogQHN0YXRpY1xuICAgKiBAcGFyYW0gcXVldWVcbiAgICogQHBhcmFtIGlkXG4gICAqIEBwYXJhbSBkYXRhXG4gICAqIEByZXR1cm5zIHtKb2IgfCBudWxsfVxuICAgKi9cbiAgc3RhdGljIGZyb21EYXRhKHF1ZXVlLCBpZCwgZGF0YSkge1xuICAgIGNvbnN0IG9iaiA9IHRyeUpTT05QYXJzZShkYXRhKTtcbiAgICBpZiAoIW9iaikgcmV0dXJuIG51bGw7XG4gICAgY29uc3Qgam9iID0gbmV3IEpvYihxdWV1ZS5jb3JlLCBpZCwgb2JqLmRhdGEsIG9iai5vcHRpb25zLCBxdWV1ZS5uYW1lKTtcbiAgICBqb2Iuc3RhdHVzID0gb2JqLmRhdGEuc3RhdHVzO1xuICAgIHJldHVybiBqb2I7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydCB0aGlzIEpvYiBpbnN0YW5jZSB0byBhIGpzb24gc3RyaW5nLlxuICAgKi9cbiAgdG9EYXRhKCkge1xuICAgIHJldHVybiB0cnlKU09OU3RyaW5naWZ5KHtcbiAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgZGF0YTogdGhpcy5kYXRhLFxuICAgICAgc3RhdHVzOiB0aGlzLnN0YXR1cyxcbiAgICAgIG9wdGlvbnM6IHRoaXMub3B0aW9ucyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcmV0dXJucyB7Kn1cblx0ICovXG4gIHRvT2JqZWN0KCkge1xuICAgIHJldHVybiB7XG4gICAgICBpZDogdGhpcy5pZCxcbiAgICAgIGRhdGE6IHRoaXMuZGF0YSxcbiAgICAgIHN0YXR1czogdGhpcy5zdGF0dXMsXG4gICAgICBvcHRpb25zOiB0aGlzLm9wdGlvbnMsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnRlcm5hbCBzYXZlIHRoYXQgcHVzaGVzIHRvIHJlZGlzLlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX3NhdmUoKSB7XG4gICAgdGhpcy5jb3JlLmxvZy52ZXJib3NlKGBTYXZpbmcgbmV3IGpvYiAke3RoaXMuaWR9IGZvciAke3RoaXMucXVldWVOYW1lfWApO1xuICAgIHJldHVybiB0aGlzLmNvcmUuY2xpZW50LmFkZGpvYihcbiAgICAgIHRoaXMuX3RvUXVldWVLZXkoJ2pvYnMnKSxcbiAgICAgIHRoaXMuX3RvUXVldWVLZXkoJ3dhaXRpbmcnKSxcbiAgICAgIHRoaXMuX3RvUXVldWVLZXkoJ2lkJyksXG4gICAgICB0aGlzLnRvRGF0YSgpLFxuICAgICAgISF0aGlzLm9wdGlvbnMudW5pcXVlLFxuICAgICAgdGhpcy5pZCkudGhlbigoaWQpID0+IHtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy51bmlxdWUgJiYgaWQgPT09IDApIHtcbiAgICAgICAgICB0aGlzLnN0YXR1cyA9ICdkdXBsaWNhdGUnO1xuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoYEVSUl9EVVBMSUNBVEU6IEpvYiAke3RoaXMuaWR9IGFscmVhZHkgZXhpc3RzLCBzYXZlIGhhcyBiZWVuIGFib3J0ZWQuYCkpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY29yZS5sb2cudmVyYm9zZShgU2F2ZWQgam9iIGZvciAke3RoaXMucXVldWVOYW1lfWApO1xuICAgICAgICB0aGlzLmlkID0gaWQ7XG4gICAgICAgIHRoaXMuc3RhdHVzID0gJ3NhdmVkJztcbiAgICAgICAgLy8gdGhpcy5xdWV1ZS5qb2JzW2lkXSA9IHRoaXM7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy50b09iamVjdCgpKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFNhdmUgdGhpcyBpbnN0YW5jZSBvZiBKb2IgdG8gcmVkaXMuIEFueSBhY3RpdmUgcXVldWVzIHdpbGwgcGljayBpdCB1cFxuICAgKiBpbW1lZGlhdGVseSBmb3IgcHJvY2Vzc2luZy5cbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBzYXZlKCkge1xuICAgIHRoaXMuaWQgPSBgJHt0aGlzLnF1ZXVlTmFtZX0tJHsodGhpcy5vcHRpb25zLnVuaXF1ZSA/IHNoYTFzdW0odGhpcy5kYXRhKSA6IGN1aWQoKSl9YDtcblxuICAgIGlmICh0aGlzLm9wdGlvbnMubm90aWZ5U3VjY2Vzcykge1xuICAgICAgdGhpcy5vcHRpb25zLm5vdGlmeVN1Y2Nlc3MgPSBgam9iOiR7dGhpcy5pZH06c3VjY2Vzc2A7XG4gICAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChgam9iOiR7dGhpcy5pZH06c3VjY2Vzc2ApO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMubm90aWZ5RmFpbHVyZSkge1xuICAgICAgdGhpcy5vcHRpb25zLm5vdGlmeUZhaWx1cmUgPSBgam9iOiR7dGhpcy5pZH06ZmFpbHVyZWA7XG4gICAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChgam9iOiR7dGhpcy5pZH06ZmFpbHVyZWApO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMubm90aWZ5U3VjY2VzcyB8fCB0aGlzLm9wdGlvbnMubm90aWZ5RmFpbHVyZSkge1xuICAgICAgaWYgKCF0aGlzLmNvcmUucHVic3ViLm9wdGlvbnMuc3Vic2NyaWJlcikge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoXG4gICAgICAgICAgbmV3IEVycm9yKCdDYW5ub3Qgc3Vic2NyaWJlIHRvIGpvYiBldmVudHMgd2hlbiBSZWRpQm94LnB1YnN1YiBcXCdzdWJzY3JpYmVyXFwnIGNvbmZpZyBpcyBzZXQgdG8gZGlzYWJsZWQuJylcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMuY29yZS5wdWJzdWIuc3Vic2NyaWJlT25jZU9mKHRoaXMuc3Vic2NyaXB0aW9ucywgKG1lc3NhZ2UpID0+IHsgLy8gb24gbWVzc2FnZSByZWNlaXZlZFxuICAgICAgICBjb25zdCBjaGFubmVsID0gbWVzc2FnZS5jaGFubmVsO1xuXG4gICAgICAgIC8vIHJlbW92ZSB0aGUgcHVic3ViIGRhdGFcbiAgICAgICAgaWYgKG1lc3NhZ2UuZGF0YSkge1xuICAgICAgICAgIG1lc3NhZ2UgPSBtZXNzYWdlLmRhdGE7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBpZiB0aGVyZSdzIGFuIGVycm9yIHRoZSBhc3N1bWUgZmFpbGVkLlxuICAgICAgICBpZiAobWVzc2FnZS5lcnJvcikge1xuICAgICAgICAgIHJldHVybiB0aGlzLm9uRmFpbHVyZUNhbGxiYWNrKG1lc3NhZ2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gaXMgaXQgZnJvbSB0aGUgc3VjY2VzcyBjaGFubmVsLlxuICAgICAgICBpZiAodGhpcy5zdWJzY3JpcHRpb25zWzBdID09PSBjaGFubmVsKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMub25TdWNjZXNzQ2FsbGJhY2sobWVzc2FnZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5vbkZhaWx1cmVDYWxsYmFjayhtZXNzYWdlKTtcbiAgICAgIH0sIHRoaXMub3B0aW9ucy50aW1lb3V0ICsgMjAwMCkudGhlbigoKSA9PiAgLy8gc3Vic2NyaWJlZCBjYWxsYmFja1xuICAgICAgICB0aGlzLl9zYXZlKClcbiAgICAgICkuY2F0Y2goZXJyb3IgPT5cbiAgICAgICAgdGhpcy5vbkZhaWx1cmVDYWxsYmFjayh7XG4gICAgICAgICAgdHlwZTogJ2pvYicsXG4gICAgICAgICAgZXJyb3I6IG5ldyBFcnJvcignRXJyb3Igd2hpbGUgc3Vic2NyaWJpbmcgdG8gam9iIGV2ZW50cywgaG93ZXZlciB0aGlzIGpvYiB3aWxsIHN0aWxsIGJlIHF1ZXVlZCAtICcgK1xuICAgICAgICAgICAgJ3lvdSBtYXkgYmUgdW5hYmxlIHRvIHJlY2VpdmUgb25Db21wbGV0ZSAvIG9uRmFpbHVyZSBldmVudHMgZm9yIHRoaXMgam9iLicpLFxuICAgICAgICAgIGVycm9yX2FjdHVhbDogZXJyb3IsXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9zYXZlKCk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSBudW1iZXIgb2YgdGltZXMgdGhpcyBqb2Igd2lsbCByZXRyeSBvbiBmYWlsdXJlXG4gICAqIEBwYXJhbSBuXG4gICAqIEByZXR1cm5zIHtKb2J9XG4gICAqL1xuICByZXRyaWVzKG4pIHtcbiAgICBpZiAobiA8IDApIHtcbiAgICAgIHRocm93IEVycm9yKCdSZXRyaWVzIGNhbm5vdCBiZSBuZWdhdGl2ZScpO1xuICAgIH1cbiAgICB0aGlzLm9wdGlvbnMucmV0cmllcyA9IG4gLSAxO1xuICAgIHJldHVybiB0aGlzLnByb3h5O1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgb25TdWNjZXNzIGNhbGxiYWNrIGFuZCBub3RpZnkgb3B0aW9uXG4gICAqIEBwYXJhbSBub3RpZnlcbiAgICogQHJldHVybnMge0pvYn1cbiAgICovXG4gIG9uU3VjY2Vzcyhub3RpZnkpIHtcbiAgICB0aGlzLm9wdGlvbnMubm90aWZ5U3VjY2VzcyA9IHRydWU7XG4gICAgdGhpcy5vblN1Y2Nlc3NDYWxsYmFjayA9IG5vdGlmeTtcbiAgICBpZiAoIXRoaXMub25GYWlsdXJlQ2FsbGJhY2spIHRoaXMub25GYWlsdXJlQ2FsbGJhY2sgPSBub29wO1xuICAgIHJldHVybiB0aGlzLnByb3h5O1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgb25GYWlsdXJlIGNhbGxiYWNrIGFuZCBub3RpZnkgb3B0aW9uXG4gICAqIEBwYXJhbSBub3RpZnlcbiAgICogQHJldHVybnMge0pvYn1cbiAgICovXG4gIG9uRmFpbHVyZShub3RpZnkpIHtcbiAgICB0aGlzLm9wdGlvbnMubm90aWZ5RmFpbHVyZSA9IHRydWU7XG4gICAgdGhpcy5vbkZhaWx1cmVDYWxsYmFjayA9IG5vdGlmeTtcbiAgICBpZiAoIXRoaXMub25TdWNjZXNzQ2FsbGJhY2spIHRoaXMub25TdWNjZXNzQ2FsbGJhY2sgPSBub29wO1xuICAgIHJldHVybiB0aGlzLnByb3h5O1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSBib29sXG4gICAqIEByZXR1cm5zIHtKb2J9XG4gICAqL1xuICB1bmlxdWUoYm9vbCkge1xuICAgIHRoaXMub3B0aW9ucy51bmlxdWUgPSBib29sO1xuICAgIHJldHVybiB0aGlzLnByb3h5O1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBob3cgbG9uZyB0aGlzIGpvYiBjYW4gcnVuIGJlZm9yZSBpdCB0aW1lcyBvdXQuXG4gICAqIEBwYXJhbSBtc1xuICAgKiBAcmV0dXJucyB7Sm9ifVxuICAgKi9cbiAgdGltZW91dChtcykge1xuICAgIHRoaXMub3B0aW9ucy50aW1lb3V0ID0gbXM7XG4gICAgcmV0dXJuIHRoaXMucHJveHk7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHJldHVybnMge0pvYi5pbml0aWFsSm9ifCp9XG4gICAqL1xuICBpbml0aWFsSm9iKCkge1xuICAgIHJldHVybiB0aGlzLl9pbnRlcm5hbERhdGEuaW5pdGlhbEpvYjtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcmV0dXJucyB7Sm9iLmluaXRpYWxRdWV1ZXwqfVxuICAgKi9cbiAgaW5pdGlhbFF1ZXVlKCkge1xuICAgIHJldHVybiB0aGlzLl9pbnRlcm5hbERhdGEuaW5pdGlhbFF1ZXVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSB0aGlzIGpvYiBmcm9tIGFsbCBzZXRzLlxuICAgKiBAcGFyYW0gY2JcbiAgICovXG4gIHJlbW92ZShjYiA9IG5vb3ApIHtcbiAgICB0aGlzLmNvcmUuY2xpZW50LnJlbW92ZWpvYihcbiAgICAgIHRoaXMuX3RvUXVldWVLZXkoJ3N1Y2NlZWRlZCcpLCB0aGlzLl90b1F1ZXVlS2V5KCdmYWlsZWQnKSwgdGhpcy5fdG9RdWV1ZUtleSgnd2FpdGluZycpLFxuICAgICAgdGhpcy5fdG9RdWV1ZUtleSgnYWN0aXZlJyksIHRoaXMuX3RvUXVldWVLZXkoJ3N0YWxsaW5nJyksIHRoaXMuX3RvUXVldWVLZXkoJ2pvYnMnKSxcbiAgICAgIHRoaXMuaWQsIGNiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZS1zYXZlIHRoaXMgam9iIGZvciB0aGUgcHVycG9zZSBvZiByZXRyeWluZyBpdC5cbiAgICogQHBhcmFtIGNiXG4gICAqL1xuICByZXRyeShjYiA9IG5vb3ApIHtcbiAgICB0aGlzLmNvcmUuY2xpZW50Lm11bHRpKClcbiAgICAgICAgLnNyZW0odGhpcy5fdG9RdWV1ZUtleSgnZmFpbGVkJyksIHRoaXMuaWQpXG4gICAgICAgIC5scHVzaCh0aGlzLl90b1F1ZXVlS2V5KCd3YWl0aW5nJyksIHRoaXMuaWQpXG4gICAgICAgIC5leGVjKGNiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsYmFja3MgdHJ1ZSBvZiBmYWxzZSBpZiB0aGlzIGpvYiBleGlzdHMgaW4gdGhlIHNwZWNpZmllZCBzZXQuXG4gICAqIEBwYXJhbSBzZXRcbiAgICogQHBhcmFtIGNiXG4gICAqL1xuICBpc0luU2V0KHNldCwgY2IgPSBub29wKSB7XG4gICAgdGhpcy5jb3JlLmNsaWVudC5zaXNtZW1iZXIodGhpcy5fdG9RdWV1ZUtleShzZXQpLCB0aGlzLmlkLCAoZXJyLCByZXN1bHQpID0+IHtcbiAgICAgIGlmIChlcnIpIHJldHVybiBjYihlcnIpO1xuICAgICAgcmV0dXJuIGNiKG51bGwsIHJlc3VsdCA9PT0gMSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGVzIGEgcXVldWUgcHJlZml4ZWQga2V5IGJhc2VkIG9uIHRoZSBwcm92aWRlZCBzdHJpbmcuXG4gICAqIEBwYXJhbSBzdHJcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICogQHByaXZhdGVcbiAgICovXG4gIF90b1F1ZXVlS2V5KHN0cikge1xuICAgIGlmICh0aGlzLmNvcmUuY2x1c3Rlci5pc0NsdXN0ZXIoKSkge1xuICAgICAgcmV0dXJuIGAke3RoaXMuY29yZS5ob29rcy5qb2Iub3B0aW9ucy5rZXlQcmVmaXh9Onske3RoaXMucXVldWVOYW1lfX06JHtzdHJ9YDtcbiAgICB9XG4gICAgcmV0dXJuIGAke3RoaXMuY29yZS5ob29rcy5qb2Iub3B0aW9ucy5rZXlQcmVmaXh9OiR7dGhpcy5xdWV1ZU5hbWV9OiR7c3RyfWA7XG4gIH1cblxufVxuXG5leHBvcnQgZGVmYXVsdCBKb2I7XG4iXX0=
// Experimental code below is TODO
// /**
// *
// * @returns {Job.initialJob|*}
// */
// initialJob() {
// return this._internalData.initialJob;
// }
//
// /**
// *
// * @returns {Job.initialQueue|*}
// */
// initialQueue() {
// return this._internalData.initialQueue;
// }
/**
*
* @param jobId
* @returns {Promise}
*/
// getJob(jobId) {
// return new Promise((resolve, reject) => {
// if (jobId in this.jobs) {
// // we have the job locally
// return resolve(this.jobs[jobId]);
// }
// // not local so gather from redis
// Job.fromId(this, jobId)
// .then(job => {
// this.jobs[jobId] = job;
// return resolve(job);
// }).catch(reject);
// });
// }
//
// /**
// * Remove this job from all sets.
// * @param cb
// */
// remove(cb = noop) {
// this.core.client.removejob(
// this._toQueueKey('succeeded'), this._toQueueKey('failed'), this._toQueueKey('waiting'),
// this._toQueueKey('active'), this._toQueueKey('stalling'), this._toQueueKey('jobs'),
// this.id, cb);
// }
//
// /**
// * Re-save this job for the purpose of retrying it.
// * @param cb
// */
// retry(cb = noop) {
// this.core.client.multi()
// .srem(this._toQueueKey('failed'), this.id)
// .lpush(this._toQueueKey('waiting'), this.id)
// .exec(cb);
// }
//
// /**
// * Callbacks true of false if this job exists in the specified set.
// * @param set
// * @param cb
// */
// isInSet(set, cb = noop) {
// this.core.client.sismember(this._toQueueKey(set), this.id, (err, result) => {
// if (err) return cb(err);
// return cb(null, result === 1);
// });
// }
//# sourceMappingURL=data:application/json;base64,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Q0Q7Ozs7Ozs7O0FBUUQsY0FBWSxHQUFaLEVBQWlCO0FBQ2YsUUFBSSxLQUFLLElBQUwsQ0FBVSxPQUFWLENBQWtCLFNBQWxCLEVBQUosRUFBbUM7QUFDakMsYUFBTyxDQUFDLEFBQUQsR0FBRyxLQUFLLElBQUwsQ0FBVSxLQUFWLENBQWdCLEdBQWhCLENBQW9CLE9BQXBCLENBQTRCLFNBQS9CLEVBQXlDLEVBQXpDLEdBQTZDLEtBQUssU0FBbEQsRUFBNEQsRUFBNUQsR0FBZ0UsR0FBaEUsRUFBb0UsQUFBcEUsQ0FBUDtBQUNEO0FBQ0QsV0FBTyxDQUFDLEFBQUQsR0FBRyxLQUFLLElBQUwsQ0FBVSxLQUFWLENBQWdCLEdBQWhCLENBQW9CLE9BQXBCLENBQTRCLFNBQS9CLEVBQXlDLENBQXpDLEdBQTRDLEtBQUssU0FBakQsRUFBMkQsQ0FBM0QsR0FBOEQsR0FBOUQsRUFBa0UsQUFBbEUsQ0FBUDtBQUNEOztBQTVQTyxDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztrQkFnUUssRyIsImZpbGUiOiJqb2IuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqXG4gKiBUaGUgTUlUIExpY2Vuc2UgKE1JVClcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTUgU2FsYWthclxuICpcbiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbiAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbiAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbiAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbiAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbiAqXG4gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGxcbiAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4gKlxuICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbiAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbiAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4gKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRVxuICogU09GVFdBUkUuXG4gKlxuICovXG5cbmltcG9ydCBjdWlkIGZyb20gJ2N1aWQnO1xuaW1wb3J0IFByb21pc2UgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0IHsgbm9vcCwgc2hhMXN1bSwgdHJ5SlNPTlN0cmluZ2lmeSwgdHJ5SlNPTlBhcnNlIH0gZnJvbSAncmVkaWJveCc7XG5cbi8qKlxuICogQGNsYXNzIEpvYlxuICovXG5jbGFzcyBKb2Ige1xuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0gY29yZVxuICAgKiBAcGFyYW0gaWRcbiAgICogQHBhcmFtIGRhdGFcbiAgICogQHBhcmFtIG9wdGlvbnNcbiAgICogQHBhcmFtIHF1ZXVlTmFtZVxuICAgKiBAcGFyYW0gaXNOZXdcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBjb25zdHJ1Y3Rvcihjb3JlLCBpZCwgZGF0YSA9IHt9LCBvcHRpb25zID0ge1xuICAgIHVuaXF1ZTogZmFsc2UsXG4gICAgdGltZW91dDogNjAwMDAsIC8vIDEgbWludXRlIGRlZmF1bHQgdGltZW91dFxuICB9LCBxdWV1ZU5hbWUsIGlzTmV3KSB7XG4gICAgdGhpcy5pZCA9IGlkO1xuICAgIHRoaXMuY29yZSA9IGNvcmU7XG4gICAgdGhpcy5kYXRhID0gZGF0YTtcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgIHRoaXMuc3RhdHVzID0gJ2NyZWF0ZWQnO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucyA9IFtdO1xuICAgIHRoaXMucXVldWVOYW1lID0gcXVldWVOYW1lO1xuICAgIHRoaXMudHlwZSA9IGRhdGEucnVucyAmJiBBcnJheS5pc0FycmF5KGRhdGEucnVucykgPyAncmVsYXknIDogJ3NpbmdsZSc7XG5cbiAgICAvLyBwYXJlbnQgcmVsYXkgam9iIHRpbWVvdXQgc2hvdWxkIGNvdmVyIGFsbCBjaGlsZCBqb2IgdGltZW91dHNcbiAgICBpZiAodGhpcy50eXBlID09PSAncmVsYXknKSB0aGlzLm9wdGlvbnMudGltZW91dCA9IHRoaXMub3B0aW9ucy50aW1lb3V0ICogZGF0YS5ydW5zLmxlbmd0aDtcblxuICAgIGlmIChpc05ldykge1xuICAgICAgLy8gdGhpcyBQcm94eSBhbGxvd3MgY2hhaW5pbmcgbWV0aG9kcyB3aGlsZSBzdGlsbCBrZWVwaW5nIHRoZVxuICAgICAgLy8gc2F2ZSgpIHByb21pc2UgdmFsaWRcbiAgICAgIHRoaXMucHJveHkgPSBuZXcgUHJveHkodGhpcywge1xuICAgICAgICBnZXQodGFyZ2V0LCBuYW1lKSB7XG4gICAgICAgICAgaWYgKG5hbWUgaW4gdGFyZ2V0KSB7XG4gICAgICAgICAgICByZXR1cm4gdGFyZ2V0W25hbWVdO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIGhheHhvcnNcbiAgICAgICAgICBpZiAobmFtZSA9PT0gJ3RoZW4nKSB7XG4gICAgICAgICAgICB0YXJnZXQucHJvbWlzZSA9IHRhcmdldC5zYXZlKCk7XG4gICAgICAgICAgICByZXR1cm4gdGFyZ2V0LnByb21pc2UudGhlbi5iaW5kKHRhcmdldC5wcm9taXNlKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiB0aGlzLnByb3h5O1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFF1ZXJ5IHJlZGlzIGZvciB0aGUgc3BlY2lmaWVkIGpvYiBpZCBhbmQgY29udmVydHMgaXQgdG8gYSBuZXcgaW5zdGFuY2Ugb2YgSm9iLlxuICAgKiBAc3RhdGljXG4gICAqIEBwYXJhbSBxdWV1ZVxuICAgKiBAcGFyYW0gaWRcbiAgICovXG4gIHN0YXRpYyBmcm9tSWQocXVldWUsIGlkKSB7XG4gICAgcmV0dXJuIHF1ZXVlLmNsaWVudC5oZ2V0KHF1ZXVlLnRvS2V5KCdqb2JzJyksIGlkKS50aGVuKChkYXRhKSA9PlxuICAgICAgSm9iLmZyb21EYXRhKHF1ZXVlLCBpZCwgZGF0YSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGEgSlNPTiBzdHJpbmcgb2YgYSBqb2IncyBkYXRhIHRvIGEgbmV3IGluc3RhbmNlIG9mIEpvYlxuICAgKiBAc3RhdGljXG4gICAqIEBwYXJhbSBxdWV1ZVxuICAgKiBAcGFyYW0gaWRcbiAgICogQHBhcmFtIGRhdGFcbiAgICogQHJldHVybnMge0pvYiB8IG51bGx9XG4gICAqL1xuICBzdGF0aWMgZnJvbURhdGEocXVldWUsIGlkLCBkYXRhKSB7XG4gICAgY29uc3Qgb2JqID0gdHJ5SlNPTlBhcnNlKGRhdGEpO1xuICAgIGlmICghb2JqKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBqb2IgPSBuZXcgSm9iKHF1ZXVlLmNvcmUsIGlkLCBvYmouZGF0YSwgb2JqLm9wdGlvbnMsIHF1ZXVlLm5hbWUpO1xuICAgIGpvYi5zdGF0dXMgPSBvYmouZGF0YS5zdGF0dXM7XG4gICAgcmV0dXJuIGpvYjtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0IHRoaXMgSm9iIGluc3RhbmNlIHRvIGEganNvbiBzdHJpbmcuXG4gICAqL1xuICB0b0RhdGEoKSB7XG4gICAgcmV0dXJuIHRyeUpTT05TdHJpbmdpZnkoe1xuICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICBkYXRhOiB0aGlzLmRhdGEsXG4gICAgICBzdGF0dXM6IHRoaXMuc3RhdHVzLFxuICAgICAgb3B0aW9uczogdGhpcy5vcHRpb25zLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgdG9PYmplY3QoZXhjbHVkZURhdGEpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICBkYXRhOiBleGNsdWRlRGF0YSA/ICdoaWRkZW4nIDogdGhpcy5kYXRhLFxuICAgICAgc3RhdHVzOiB0aGlzLnN0YXR1cyxcbiAgICAgIG9wdGlvbnM6IHRoaXMub3B0aW9ucyxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEludGVybmFsIHNhdmUgdGhhdCBwdXNoZXMgdG8gcmVkaXMuXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfc2F2ZSgpIHtcbiAgICB0aGlzLmNvcmUubG9nLnZlcmJvc2UoYFNhdmluZyBuZXcgam9iICR7dGhpcy5pZH0gZm9yICR7dGhpcy5xdWV1ZU5hbWV9YCk7XG4gICAgcmV0dXJuIHRoaXMuY29yZS5jbGllbnQuYWRkam9iKFxuICAgICAgdGhpcy5fdG9RdWV1ZUtleSgnam9icycpLFxuICAgICAgdGhpcy5fdG9RdWV1ZUtleSgnd2FpdGluZycpLFxuICAgICAgdGhpcy5fdG9RdWV1ZUtleSgnaWQnKSxcbiAgICAgIHRoaXMudG9EYXRhKCksXG4gICAgICAhIXRoaXMub3B0aW9ucy51bmlxdWUsXG4gICAgICB0aGlzLmlkKS50aGVuKChpZCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnVuaXF1ZSAmJiBpZCA9PT0gMCkge1xuICAgICAgICAgIHRoaXMuc3RhdHVzID0gJ2R1cGxpY2F0ZSc7XG4gICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihgRVJSX0RVUExJQ0FURTogSm9iICR7dGhpcy5pZH0gYWxyZWFkeSBleGlzdHMsIHNhdmUgaGFzIGJlZW4gYWJvcnRlZC5gKSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jb3JlLmxvZy52ZXJib3NlKGBTYXZlZCBqb2IgZm9yICR7dGhpcy5xdWV1ZU5hbWV9YCk7XG4gICAgICAgIHRoaXMuaWQgPSBpZDtcbiAgICAgICAgdGhpcy5zdGF0dXMgPSAnc2F2ZWQnO1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMudG9PYmplY3QodHJ1ZSkpO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogU2F2ZSB0aGlzIGluc3RhbmNlIG9mIEpvYiB0byByZWRpcy4gQW55IGFjdGl2ZSBxdWV1ZXMgd2lsbCBwaWNrIGl0IHVwXG4gICAqIGltbWVkaWF0ZWx5IGZvciBwcm9jZXNzaW5nLlxuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIHNhdmUoKSB7XG4gICAgdGhpcy5pZCA9IGAke3RoaXMucXVldWVOYW1lfS0keyh0aGlzLm9wdGlvbnMudW5pcXVlID8gc2hhMXN1bSh0aGlzLmRhdGEpIDogY3VpZCgpKX1gO1xuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5ub3RpZnlTdWNjZXNzKSB7XG4gICAgICB0aGlzLm9wdGlvbnMubm90aWZ5U3VjY2VzcyA9IGBqb2I6JHt0aGlzLmlkfTpzdWNjZXNzYDtcbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKGBqb2I6JHt0aGlzLmlkfTpzdWNjZXNzYCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5ub3RpZnlGYWlsdXJlKSB7XG4gICAgICB0aGlzLm9wdGlvbnMubm90aWZ5RmFpbHVyZSA9IGBqb2I6JHt0aGlzLmlkfTpmYWlsdXJlYDtcbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKGBqb2I6JHt0aGlzLmlkfTpmYWlsdXJlYCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5ub3RpZnlTdWNjZXNzIHx8IHRoaXMub3B0aW9ucy5ub3RpZnlGYWlsdXJlKSB7XG4gICAgICBpZiAoIXRoaXMuY29yZS5wdWJzdWIub3B0aW9ucy5zdWJzY3JpYmVyKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChcbiAgICAgICAgICBuZXcgRXJyb3IoJ0Nhbm5vdCBzdWJzY3JpYmUgdG8gam9iIGV2ZW50cyB3aGVuIFJlZGlCb3gucHVic3ViIFxcJ3N1YnNjcmliZXJcXCcgY29uZmlnIGlzIHNldCB0byBkaXNhYmxlZC4nKVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5jb3JlLnB1YnN1Yi5zdWJzY3JpYmVPbmNlT2YoXG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucyxcbiAgICAgICAgKG1lc3NhZ2UpID0+IHsgLy8gb24gbWVzc2FnZSByZWNlaXZlZFxuICAgICAgICAgIC8vIHJlbW92ZSB0aGUgcHVic3ViIGRhdGFcbiAgICAgICAgICBpZiAobWVzc2FnZS5kYXRhKSBtZXNzYWdlID0gbWVzc2FnZS5kYXRhO1xuXG4gICAgICAgICAgLy8gaWYgdGhlcmUncyBhbiBlcnJvciB0aGVuIGFzc3VtZSBmYWlsZWQuXG4gICAgICAgICAgaWYgKG1lc3NhZ2UuZXJyb3IpIHJldHVybiB0aGlzLm9uRmFpbHVyZUNhbGxiYWNrKG1lc3NhZ2UpO1xuXG4gICAgICAgICAgLy8gaXMgaXQgZnJvbSB0aGUgc3VjY2VzcyBjaGFubmVsLlxuICAgICAgICAgIGlmICh0aGlzLnN1YnNjcmlwdGlvbnNbMF0gPT09IG1lc3NhZ2UuY2hhbm5lbCkgcmV0dXJuIHRoaXMub25TdWNjZXNzQ2FsbGJhY2sobWVzc2FnZSk7XG5cbiAgICAgICAgICByZXR1cm4gdGhpcy5vbkZhaWx1cmVDYWxsYmFjayhtZXNzYWdlKTtcbiAgICAgICAgfSxcbiAgICAgICAgdGhpcy5vcHRpb25zLnRpbWVvdXQgKyAyMDAwXG4gICAgICApLnRoZW4oKCkgPT4gIC8vIHN1YnNjcmliZWQgY2FsbGJhY2tcbiAgICAgICAgdGhpcy5fc2F2ZSgpXG4gICAgICApLmNhdGNoKGVycm9yID0+XG4gICAgICAgIHRoaXMub25GYWlsdXJlQ2FsbGJhY2soe1xuICAgICAgICAgIHR5cGU6ICdqb2InLFxuICAgICAgICAgIGVycm9yOiBuZXcgRXJyb3IoJ0Vycm9yIHdoaWxlIHN1YnNjcmliaW5nIHRvIGpvYiBldmVudHMsIGhvd2V2ZXIgdGhpcyBqb2Igd2lsbCBzdGlsbCBiZSBxdWV1ZWQgLSAnICtcbiAgICAgICAgICAgICd5b3UgbWF5IGJlIHVuYWJsZSB0byByZWNlaXZlIG9uU3VjY2VzcyAvIG9uRmFpbHVyZSBldmVudHMgZm9yIHRoaXMgam9iLicpLFxuICAgICAgICAgIGVycm9yX2FjdHVhbDogZXJyb3IsXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9zYXZlKCk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSBudW1iZXIgb2YgdGltZXMgdGhpcyBqb2Igd2lsbCByZXRyeSBvbiBmYWlsdXJlXG4gICAqIEBwYXJhbSBuXG4gICAqIEByZXR1cm5zIHtKb2J9XG4gICAqL1xuICByZXRyaWVzKG4pIHtcbiAgICBpZiAobiA8IDApIHRocm93IEVycm9yKCdSZXRyaWVzIGNhbm5vdCBiZSBuZWdhdGl2ZScpO1xuICAgIHRoaXMub3B0aW9ucy5yZXRyaWVzID0gbiAtIDE7XG4gICAgcmV0dXJuIHRoaXMucHJveHk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSBvblN1Y2Nlc3MgY2FsbGJhY2sgYW5kIG5vdGlmeSBvcHRpb25cbiAgICogQHBhcmFtIG5vdGlmeVxuICAgKiBAcmV0dXJucyB7Sm9ifVxuICAgKi9cbiAgb25TdWNjZXNzKG5vdGlmeSkge1xuICAgIHRoaXMub3B0aW9ucy5ub3RpZnlTdWNjZXNzID0gdHJ1ZTtcbiAgICB0aGlzLm9uU3VjY2Vzc0NhbGxiYWNrID0gbm90aWZ5O1xuICAgIGlmICghdGhpcy5vbkZhaWx1cmVDYWxsYmFjaykgdGhpcy5vbkZhaWx1cmVDYWxsYmFjayA9IG5vb3A7XG4gICAgcmV0dXJuIHRoaXMucHJveHk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSBvbkZhaWx1cmUgY2FsbGJhY2sgYW5kIG5vdGlmeSBvcHRpb25cbiAgICogQHBhcmFtIG5vdGlmeVxuICAgKiBAcmV0dXJucyB7Sm9ifVxuICAgKi9cbiAgb25GYWlsdXJlKG5vdGlmeSkge1xuICAgIHRoaXMub3B0aW9ucy5ub3RpZnlGYWlsdXJlID0gdHJ1ZTtcbiAgICB0aGlzLm9uRmFpbHVyZUNhbGxiYWNrID0gbm90aWZ5O1xuICAgIGlmICghdGhpcy5vblN1Y2Nlc3NDYWxsYmFjaykgdGhpcy5vblN1Y2Nlc3NDYWxsYmFjayA9IG5vb3A7XG4gICAgcmV0dXJuIHRoaXMucHJveHk7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIGJvb2xcbiAgICogQHJldHVybnMge0pvYn1cbiAgICovXG4gIHVuaXF1ZShib29sKSB7XG4gICAgdGhpcy5vcHRpb25zLnVuaXF1ZSA9IGJvb2w7XG4gICAgcmV0dXJuIHRoaXMucHJveHk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IGhvdyBsb25nIHRoaXMgam9iIGNhbiByZW1haW4gcnVubmluZyBmb3IgYmVmb3JlIGl0IHRpbWVzIG91dC5cbiAgICogQHBhcmFtIG1zXG4gICAqIEByZXR1cm5zIHtKb2J9XG4gICAqL1xuICB0aW1lb3V0KG1zKSB7XG4gICAgdGhpcy5vcHRpb25zLnRpbWVvdXQgPSBtcztcbiAgICByZXR1cm4gdGhpcy5wcm94eTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZXMgYSBxdWV1ZSBwcmVmaXhlZCBrZXkgYmFzZWQgb24gdGhlIHByb3ZpZGVkIHN0cmluZy5cbiAgICogQHBhcmFtIHN0clxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX3RvUXVldWVLZXkoc3RyKSB7XG4gICAgaWYgKHRoaXMuY29yZS5jbHVzdGVyLmlzQ2x1c3RlcigpKSB7XG4gICAgICByZXR1cm4gYCR7dGhpcy5jb3JlLmhvb2tzLmpvYi5vcHRpb25zLmtleVByZWZpeH06eyR7dGhpcy5xdWV1ZU5hbWV9fToke3N0cn1gO1xuICAgIH1cbiAgICByZXR1cm4gYCR7dGhpcy5jb3JlLmhvb2tzLmpvYi5vcHRpb25zLmtleVByZWZpeH06JHt0aGlzLnF1ZXVlTmFtZX06JHtzdHJ9YDtcbiAgfVxuXG59XG5cbmV4cG9ydCBkZWZhdWx0IEpvYjtcblxuLy8gRXhwZXJpbWVudGFsIGNvZGUgYmVsb3cgaXMgVE9ET1xuXG4vLyAvKipcbi8vICAqXG4vLyAgKiBAcmV0dXJucyB7Sm9iLmluaXRpYWxKb2J8Kn1cbi8vICAqL1xuLy8gaW5pdGlhbEpvYigpIHtcbi8vICAgcmV0dXJuIHRoaXMuX2ludGVybmFsRGF0YS5pbml0aWFsSm9iO1xuLy8gfVxuLy9cbi8vIC8qKlxuLy8gICpcbi8vICAqIEByZXR1cm5zIHtKb2IuaW5pdGlhbFF1ZXVlfCp9XG4vLyAgKi9cbi8vIGluaXRpYWxRdWV1ZSgpIHtcbi8vICAgcmV0dXJuIHRoaXMuX2ludGVybmFsRGF0YS5pbml0aWFsUXVldWU7XG4vLyB9XG5cbi8qKlxuICpcbiAqIEBwYXJhbSBqb2JJZFxuICogQHJldHVybnMge1Byb21pc2V9XG4gKi9cbi8vIGdldEpvYihqb2JJZCkge1xuLy8gICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuLy8gICAgIGlmIChqb2JJZCBpbiB0aGlzLmpvYnMpIHtcbi8vICAgICAgIC8vIHdlIGhhdmUgdGhlIGpvYiBsb2NhbGx5XG4vLyAgICAgICByZXR1cm4gcmVzb2x2ZSh0aGlzLmpvYnNbam9iSWRdKTtcbi8vICAgICB9XG4vLyAgICAgLy8gbm90IGxvY2FsIHNvIGdhdGhlciBmcm9tIHJlZGlzXG4vLyAgICAgSm9iLmZyb21JZCh0aGlzLCBqb2JJZClcbi8vICAgICAgICAudGhlbihqb2IgPT4ge1xuLy8gICAgICAgICAgdGhpcy5qb2JzW2pvYklkXSA9IGpvYjtcbi8vICAgICAgICAgIHJldHVybiByZXNvbHZlKGpvYik7XG4vLyAgICAgICAgfSkuY2F0Y2gocmVqZWN0KTtcbi8vICAgfSk7XG4vLyB9XG4vL1xuLy8gLyoqXG4vLyAgKiBSZW1vdmUgdGhpcyBqb2IgZnJvbSBhbGwgc2V0cy5cbi8vICAqIEBwYXJhbSBjYlxuLy8gICovXG4vLyByZW1vdmUoY2IgPSBub29wKSB7XG4vLyAgIHRoaXMuY29yZS5jbGllbnQucmVtb3Zlam9iKFxuLy8gICAgIHRoaXMuX3RvUXVldWVLZXkoJ3N1Y2NlZWRlZCcpLCB0aGlzLl90b1F1ZXVlS2V5KCdmYWlsZWQnKSwgdGhpcy5fdG9RdWV1ZUtleSgnd2FpdGluZycpLFxuLy8gICAgIHRoaXMuX3RvUXVldWVLZXkoJ2FjdGl2ZScpLCB0aGlzLl90b1F1ZXVlS2V5KCdzdGFsbGluZycpLCB0aGlzLl90b1F1ZXVlS2V5KCdqb2JzJyksXG4vLyAgICAgdGhpcy5pZCwgY2IpO1xuLy8gfVxuLy9cbi8vIC8qKlxuLy8gICogUmUtc2F2ZSB0aGlzIGpvYiBmb3IgdGhlIHB1cnBvc2Ugb2YgcmV0cnlpbmcgaXQuXG4vLyAgKiBAcGFyYW0gY2Jcbi8vICAqL1xuLy8gcmV0cnkoY2IgPSBub29wKSB7XG4vLyAgIHRoaXMuY29yZS5jbGllbnQubXVsdGkoKVxuLy8gICAgICAgLnNyZW0odGhpcy5fdG9RdWV1ZUtleSgnZmFpbGVkJyksIHRoaXMuaWQpXG4vLyAgICAgICAubHB1c2godGhpcy5fdG9RdWV1ZUtleSgnd2FpdGluZycpLCB0aGlzLmlkKVxuLy8gICAgICAgLmV4ZWMoY2IpO1xuLy8gfVxuLy9cbi8vIC8qKlxuLy8gICogQ2FsbGJhY2tzIHRydWUgb2YgZmFsc2UgaWYgdGhpcyBqb2IgZXhpc3RzIGluIHRoZSBzcGVjaWZpZWQgc2V0LlxuLy8gICogQHBhcmFtIHNldFxuLy8gICogQHBhcmFtIGNiXG4vLyAgKi9cbi8vIGlzSW5TZXQoc2V0LCBjYiA9IG5vb3ApIHtcbi8vICAgdGhpcy5jb3JlLmNsaWVudC5zaXNtZW1iZXIodGhpcy5fdG9RdWV1ZUtleShzZXQpLCB0aGlzLmlkLCAoZXJyLCByZXN1bHQpID0+IHtcbi8vICAgICBpZiAoZXJyKSByZXR1cm4gY2IoZXJyKTtcbi8vICAgICByZXR1cm4gY2IobnVsbCwgcmVzdWx0ID09PSAxKTtcbi8vICAgfSk7XG4vLyB9XG4iXX0=

@@ -40,33 +40,48 @@ 'use strict';

this._jobTick = () => {
this._onLocalTickComplete = () => {
this.running--;
this.queued--;
if (!this.options.throttle) return setImmediate(this._queueTick);
return this.client.throttle(this.toKey('throttle'), this.options.throttle.limit, this.options.throttle.seconds).then(throttle => {
const shouldThrottle = throttle[0] === 1;
if (!shouldThrottle) {
this.throttled = false;
return setImmediate(this._queueTick);
}
this.throttled = true;
const timeRemaining = throttle[2] === 0 ? 1 : throttle[2];
this.log.verbose(`'${ this.name }' queue reached it's throttle limit, resuming in ${ timeRemaining } seconds.`);
return setTimeout(this._queueTick, timeRemaining * 1000);
}).catch(this._queueTick);
};
this._onLocalTickError = error => {
this.queued--;
this.log.error(error);
setImmediate(this._queueTick);
};
this._throttleQueue = () => {};
this._queueTick = () => {
if (this.paused || !this.options.enabled) {
return void 0;
}
this.queued++;
return this._getNextJob().then(job => {
this.running++;
if (this.running + this.queued < this.concurrency) {
setImmediate(this._jobTick);
// queue more jobs if within limit
if (this.running + this.queued < this.options.concurrency) {
// concurrency is a little pointless right now if we're throttling jobs
if (!this.options.throttle) setImmediate(this._queueTick);
}
return this._runJob(job).then(() => {
this.running--;
this.queued--;
setImmediate(this._jobTick);
}).catch(() => {
this.running--;
this.queued--;
setImmediate(this._jobTick);
});
}).catch(error => {
this.log.error(error);
setImmediate(this._jobTick);
});
return this._runJob(job).then(this._onLocalTickComplete).catch(this._onLocalTickComplete);
}).catch(this._onLocalTickError);
};
this._restartProcessing = () => {
this.clients.block.once('ready', this._jobTick);
this.clients.block.once('ready', this._queueTick);
};

@@ -76,3 +91,2 @@

this.jobs = {};
this.core = core;

@@ -82,2 +96,3 @@ this.client = core.client;

this.started = false;
this.throttled = false;
this.log = this.core.log;

@@ -89,3 +104,3 @@ this.name = options.name;

this.log.verbose(`Blocking client for queue '${ this.name }' is ready. Starting queue processor.`);
this.process(this.options.concurrency);
this.beginWorking();
});

@@ -119,35 +134,6 @@ }

// /**
// *
// * @param data
// * @returns {Job}
// */
// createJob(data) {
// return new Job(this, null, data);
// }
/**
*
* @param jobId
* @returns {Promise}
*/
// getJob(jobId) {
// return new Promise((resolve, reject) => {
// if (jobId in this.jobs) {
// // we have the job locally
// return resolve(this.jobs[jobId]);
// }
// // not local so gather from redis
// Job.fromId(this, jobId)
// .then(job => {
// this.jobs[jobId] = job;
// return resolve(job);
// }).catch(reject);
// });
// }
/**
*
* @returns {Promise}
*/
_getNextJob() {

@@ -163,2 +149,33 @@ this.log.verbose(`Getting next job for queue '${ this.name }'.`);

* @param job
* @param jobError
* @private
*/
_logJobFailure(job, jobError) {
if (process.env.KUBERNETES_PORT || process.env.KUBERNETES_SERVICE_HOST) {
/* eslint no-console: 0 */
console.log(JSON.stringify({
level: 'error',
type: 'redibox_job_failure',
data: {
runs: job.data.runs,
queue: this.name,
stack: jobError.stack ? jobError.stack.split('\n').slice(0, 5) : []
}
}));
} else {
this.log.error('');
this.log.error('--------------- RDB JOB ERROR/FAILURE ---------------');
this.log.error(`Job: ${ job.data.runs }` || this.name);
if (jobError.stack) {
this.log.error(jobError.stack.split('\n').slice(0, 5));
}
this.log.error(jobError);
this.log.error('------------------------------------------------------');
this.log.error('');
}
}
/**
*
* @param job
* @returns {Promise}

@@ -177,5 +194,3 @@ */

// silently ignore any multiple calls
if (handled) {
return void 0;
}
if (handled) return void 0;

@@ -190,6 +205,4 @@ clearTimeout(preventStallingTimeout);

if (job.data.runs && Array.isArray(job.data.runs) && data !== false) {
return this._finishMultiJob(null, data, job);
}
// only relay to next job if user did not resolve 'false' on current job
if (job.type === 'relay' && data !== false) return this._finishRelayJob(null, data, job);
return this._finishSingleJob(null, data, job);

@@ -199,3 +212,3 @@ };

// Handle any errors returned
const handleError = err => {
const handleError = jobError => {
clearTimeout(preventStallingTimeout);

@@ -217,19 +230,7 @@

if ((!job.data.initialJob || !job.data.initialJob.options.notifyFailure) && !Array.isArray(job.data.runs)) {
this.log.error('');
this.log.error('--------------- RDB JOB ERROR/FAILURE ---------------');
this.log.error(`Job: ${ job.data.runs }` || this.name);
if (err.stack) {
err.stack.split('\n').forEach(error => {
this.log.error(error);
});
}
this.log.error(err);
this.log.error('------------------------------------------------------');
this.log.error('');
this._logJobFailure(job, jobError);
}
if (job.data.runs && Array.isArray(job.data.runs)) {
return this._finishMultiJob(err, null, job);
}
return this._finishSingleJob(err, null, job);
if (job.type === 'relay') return this._finishRelayJob(jobError, null, job);
return this._finishSingleJob(jobError, null, job);
};

@@ -258,4 +259,3 @@

if (job.options.timeout) {
const msg = `Job ${ job.id } timed out (${ job.options.timeout }ms)`;
setTimeout(handleError.bind(null, Error(msg)), job.options.timeout);
setTimeout(handleError.bind(null, Error(`Job ${ job.id } timed out (${ job.options.timeout }ms)`)), job.options.timeout);
}

@@ -271,97 +271,78 @@

/**
* Completes a multi job or continues to the next stage.
*
* @param error
* @param data
* @param job
* @returns {Promise}
* @returns {{job: {id: *, worker_id: (*|String|string), status: string}, error: *, output: *}}
* @private
*/
_finishMultiJob(error, data, job) {
delete this.jobs[job.id];
_createJobEvent(error, data, job) {
return {
job: _extends({
id: job.id,
worker_id: this.core.id,
status: error ? 'failed' : 'succeeded'
}, job.data),
error,
output: data
};
}
return new _bluebird2.default((resolve, reject) => {
const status = error ? 'failed' : 'succeeded';
/**
*
* @param error
* @param data
* @param job
* @param multi
* @private
*/
_updateJobStatus(error, data, job, multi) {
const status = error ? 'failed' : 'succeeded';
const multi = this.client.multi();
multi.lrem(this.toKey('active'), 0, job.id);
multi.srem(this.toKey('stalling'), job.id);
multi.lrem(this.toKey('active'), 0, job.id);
multi.srem(this.toKey('stalling'), job.id);
const event = {
job: _extends({
id: job.id,
worker_id: this.core.id,
status
}, job.data),
error,
output: data
};
const currentJob = job.data.runs.shift();
const nextJob = job.data.runs[0];
let nextQueue = this.name;
// keep a record of the first job in this relay instance
// ssssh JSON ;p
if (!job.data.initialJob) {
job.data.initialJob = (0, _redibox.tryJSONParse)(job.toData());
if (status === 'failed') {
if (job.options.retries > 0) {
job.options.retries = job.options.retries - 1;
job.status = 'retrying';
multi.hset(this.toKey('jobs'), job.id, job.toData());
multi.lpush(this.toKey('waiting'), job.id);
} else {
job.status = 'failed';
multi.hdel(this.toKey('jobs'), job.id);
// TODO track failures and their data somewhere else for reviewing
// multi.hset(this.toKey('jobs'), job.id, job.toData());
// multi.sadd(this.toKey('failed'), job.id);
}
// keep a record of the first queue in this relay instance
if (!job.data.initialQueue) {
job.data.initialQueue = this.name;
}
if (status === 'failed') {
if (job.options.retries > 0) {
job.options.retries = job.options.retries - 1;
job.status = 'retrying';
event.event = 'retrying';
multi.hset(this.toKey('jobs'), job.id, job.toData());
multi.lpush(this.toKey('waiting'), job.id);
} else {
job.status = 'failed';
multi.hset(this.toKey('jobs'), job.id, job.toData());
multi.sadd(this.toKey('failed'), job.id);
}
} else {
} else {
job.status = 'succeeded';
multi.hset(this.toKey('jobs'), job.id, job.toData());
multi.hdel(this.toKey('jobs'), job.id);
// multi.sadd(this.toKey('succeeded'), job.id); // TODO LOG JOBS
// TODO track successes and their data somewhere else for reviewing
// multi.hset(this.toKey('jobs'), job.id, job.toData());
// multi.sadd(this.toKey('succeeded'), job.id);
}
}
// check if we need to relay to another job
if (!(job.data.runs.length === 0 || !!error)) {
if ((0, _redibox.isObject)(nextJob)) {
nextQueue = nextJob.queue;
job.data.runs[0] = nextJob.runs;
} else if (job.data.initialQueue) {
nextQueue = job.data.initialQueue;
}
/**
*
* @param error
* @param data
* @param job
* @returns {Promise}
*/
_finishSingleJob(error, data, job) {
const multi = this.client.multi();
const status = error ? 'failed' : 'succeeded';
this._updateJobStatus(error, data, job, multi);
// add some debug data for the next job
// so it can tell where its call originated from
job.data.from_job = currentJob;
job.data.from_queue = this.name;
job.data.from_timestamp = (0, _redibox.getTimeStamp)();
job.data.data = data;
// emit success or failure event if we have listeners
if (error && job.options.notifyFailure) {
this.core.pubsub.publish(job.options.notifyFailure, this._createJobEvent(error, data, job));
} else if (job.options.notifySuccess) {
this.core.pubsub.publish(job.options.notifySuccess, this._createJobEvent(error, data, job));
}
return this.core.hooks.job.create(nextQueue, job.data).then(() => {
multi.exec(errMulti => {
if (errMulti) return reject(errMulti);
return resolve({ status, result: error || data });
});
});
}
// we've just finished the last job in the relay
if (event.error) {
if (job.data.initialJob.options.notifyFailure) {
this.core.pubsub.publish(job.data.initialJob.options.notifyFailure, event);
}
} else if (job.data.initialJob.options.notifySuccess) {
this.core.pubsub.publish(job.data.initialJob.options.notifySuccess, event);
}
return multi.exec(errMulti => {
return new _bluebird2.default((resolve, reject) => {
multi.exec(errMulti => {
if (errMulti) return reject(errMulti);

@@ -374,3 +355,3 @@ return resolve({ status, result: error || data });

/**
*
* Completes a multi job or continues to the next stage.
* @param error

@@ -380,46 +361,60 @@ * @param data

* @returns {Promise}
* @private
*/
_finishSingleJob(error, data, job) {
delete this.jobs[job.id];
_finishRelayJob(error, data, job) {
let nextQueue = this.name;
const nextJob = job.data.runs[0];
const multi = this.client.multi();
const currentJob = job.data.runs.shift();
const status = error ? 'failed' : 'succeeded';
return new _bluebird2.default((resolve, reject) => {
const status = error ? 'failed' : 'succeeded';
const multi = this.client.multi();
// keep a record of the first job in this relay instance
if (!job.data.initialJob) {
job.data.initialJob = (0, _redibox.tryJSONParse)(job.toData());
}
multi.lrem(this.toKey('active'), 0, job.id);
multi.srem(this.toKey('stalling'), job.id);
// keep a record of the first queue in this relay instance
if (!job.data.initialQueue) {
job.data.initialQueue = this.name;
}
if (status === 'failed') {
if (job.options.retries > 0) {
job.options.retries = job.options.retries - 1;
job.status = 'retrying';
multi.hset(this.toKey('jobs'), job.id, job.toData());
multi.lpush(this.toKey('waiting'), job.id);
} else {
job.status = 'failed';
multi.hset(this.toKey('jobs'), job.id, job.toData());
multi.sadd(this.toKey('failed'), job.id);
}
} else {
job.status = 'succeeded';
multi.hset(this.toKey('jobs'), job.id, job.toData());
multi.hdel(this.toKey('jobs'), job.id);
// multi.sadd(this.toKey('succeeded'), job.id); // TODO LOG JOBS
}
this._updateJobStatus(error, data, job, multi);
if (error && (job.options.notifySuccess || job.notifyFailure)) {
const event = {
job: _extends({
id: job.id,
worker_id: this.core.id,
status
}, job.data),
error,
output: data
};
if (job.options.notifyFailure) this.core.pubsub.publish(job.options.notifyFailure, event);
if (job.options.notifySuccess) this.core.pubsub.publish(job.options.notifySuccess, event);
// check if we need to relay to another job
if (!(job.data.runs.length === 0 || !!error)) {
if ((0, _redibox.isObject)(nextJob)) {
nextQueue = nextJob.queue;
job.data.runs[0] = nextJob.runs;
} else if (job.data.initialQueue) {
nextQueue = job.data.initialQueue;
}
multi.exec(errMulti => {
// add some debug data for the next job
// so it can tell where the relay originated from
job.data.from_job = currentJob;
job.data.from_queue = this.name;
job.data.from_timestamp = (0, _redibox.getTimeStamp)();
// relay resolved data
job.data.data = data;
return new _bluebird2.default((resolve, reject) => {
return this.core.hooks.job.create(nextQueue, job.data).then(() => {
multi.exec(errMulti => {
if (errMulti) return reject(errMulti);
return resolve({ status, result: error || data });
});
});
});
}
// we've just finished the last job in the relay
// emit success or failure event if we have listeners
if (error && job.data.initialJob.options.notifyFailure) {
this.core.pubsub.publish(job.data.initialJob.options.notifyFailure, this._createJobEvent(error, data, job));
} else if (job.data.initialJob.options.notifySuccess) {
this.core.pubsub.publish(job.data.initialJob.options.notifySuccess, this._createJobEvent(error, data, job));
}
return new _bluebird2.default((resolve, reject) => {
return multi.exec(errMulti => {
if (errMulti) return reject(errMulti);

@@ -433,2 +428,15 @@ return resolve({ status, result: error || data });

*
* @private
*/
/**
*
* @param error
* @private
*/
/**
*
* @returns {*}

@@ -447,7 +455,4 @@ * @private

* Start the queue.
* @param concurrency
*/
process() {
let concurrency = arguments.length <= 0 || arguments[0] === undefined ? 1 : arguments[0];
beginWorking() {
if (this.started || !this.options.enabled) {

@@ -458,8 +463,7 @@ this.log.info(`Queue ${ this.name } is currently disabled.`);

this.queued = 0;
this.running = 0;
this.started = true;
this.running = 0;
this.queued = 0;
this.concurrency = concurrency;
this.log.verbose(`Queue '${ this.name }' - started with a concurrency of ${ this.concurrency }.`);
this.log.verbose(`Queue '${ this.name }' - started with a concurrency of ${ this.options.concurrency }.`);

@@ -473,3 +477,3 @@ this.clients.block.once('error', this._restartProcessing);

return this._jobTick();
return this._queueTick();
}

@@ -484,6 +488,3 @@

return this.client.checkstalledjobs(this.toKey('stallTime'), this.toKey('stalling'), this.toKey('waiting'), this.toKey('active'), (0, _redibox.getTimeStamp)(), this.options.stallInterval).then(() => {
if (!this.options.enabled || this.paused) {
return _bluebird2.default.resolve();
}
if (!this.options.enabled || this.paused) return _bluebird2.default.resolve();
return _bluebird2.default.delay(this.options.stallInterval).then(this.checkStalledJobs);

@@ -512,2 +513,2 @@ });

exports.default = Queue;
//# sourceMappingURL=data:application/json;base64,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LE9BQUwsQ0FBYSxhQUEzQixFQUEwQyxJQUExQyxDQUErQyxLQUFLLGdCQUFwRCxDQUFQO0FBQ0QsS0FiTSxDQUFQO0FBY0Q7Ozs7Ozs7QUFPRCxRQUFNLEdBQU4sRUFBVztBQUNULFFBQUksS0FBSyxJQUFMLENBQVUsT0FBVixDQUFrQixTQUFsQixFQUFKLEVBQW1DO0FBQ2pDLGFBQU8sQ0FBQyxBQUFELEdBQUcsS0FBSyxPQUFMLENBQWEsU0FBaEIsRUFBMEIsRUFBMUIsR0FBOEIsS0FBSyxJQUFuQyxFQUF3QyxFQUF4QyxHQUE0QyxHQUE1QyxFQUFnRCxBQUFoRCxDQUFQO0FBQ0Q7QUFDRCxXQUFPLENBQUMsQUFBRCxHQUFHLEtBQUssT0FBTCxDQUFhLFNBQWhCLEVBQTBCLENBQTFCLEdBQTZCLEtBQUssSUFBbEMsRUFBdUMsQ0FBdkMsR0FBMEMsR0FBMUMsRUFBOEMsQUFBOUMsQ0FBUDtBQUNEOzs7Ozs7O0FBemQ2QztrQkFBM0IsSyIsImZpbGUiOiJxdWV1ZS5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBKb2IgZnJvbSAnLi9qb2InO1xuaW1wb3J0IFByb21pc2UgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0IGRlZmF1bHRzIGZyb20gJy4vZGVmYXVsdHMnO1xuaW1wb3J0IEV2ZW50RW1pdHRlciBmcm9tICdldmVudGVtaXR0ZXIzJztcbmltcG9ydCB7IGRlZXBHZXQsIGlzT2JqZWN0LCBnZXRUaW1lU3RhbXAsIHRyeUpTT05QYXJzZSB9IGZyb20gJ3JlZGlib3gnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBRdWV1ZSBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSBvcHRpb25zXG4gICAqIEBwYXJhbSBjb3JlXG4gICAqIEByZXR1cm5zIHtRdWV1ZX1cbiAgICovXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnMsIGNvcmUpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuam9icyA9IHt9O1xuICAgIHRoaXMuY29yZSA9IGNvcmU7XG4gICAgdGhpcy5jbGllbnQgPSBjb3JlLmNsaWVudDtcbiAgICB0aGlzLnBhdXNlZCA9IGZhbHNlO1xuICAgIHRoaXMuc3RhcnRlZCA9IGZhbHNlO1xuICAgIHRoaXMubG9nID0gdGhpcy5jb3JlLmxvZztcbiAgICB0aGlzLm5hbWUgPSBvcHRpb25zLm5hbWU7XG4gICAgdGhpcy5oYW5kbGVyID0gb3B0aW9ucy5oYW5kbGVyIHx8IG51bGw7XG4gICAgdGhpcy5vcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgZGVmYXVsdHMucXVldWUsIG9wdGlvbnMgfHwge30pO1xuICAgIHRoaXMuY29yZS5jcmVhdGVDbGllbnQoJ2Jsb2NrJywgdGhpcykudGhlbigoKSA9PiB7XG4gICAgICB0aGlzLmxvZy52ZXJib3NlKGBCbG9ja2luZyBjbGllbnQgZm9yIHF1ZXVlICcke3RoaXMubmFtZX0nIGlzIHJlYWR5LiBTdGFydGluZyBxdWV1ZSBwcm9jZXNzb3IuYCk7XG4gICAgICB0aGlzLnByb2Nlc3ModGhpcy5vcHRpb25zLmNvbmN1cnJlbmN5KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGRlc3Ryb3koKSB7XG4gICAgY29uc3Qga2V5cyA9IFtcbiAgICAgICdpZCcsICdqb2JzJywgJ3N0YWxsVGltZScsICdzdGFsbGluZycsICd3YWl0aW5nJywgJ2FjdGl2ZScsICdzdWNjZWVkZWQnLCAnZmFpbGVkJyxcbiAgICBdLm1hcChrZXkgPT4gdGhpcy50b0tleShrZXkpKTtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQuZGVsKC4uLmtleXMpO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfVxuICAgKi9cbiAgY2hlY2tIZWFsdGgoKSB7XG4gICAgcmV0dXJuIHRoaXNcbiAgICAgIC5jbGllbnQubXVsdGkoKVxuICAgICAgLmxsZW4odGhpcy50b0tleSgnd2FpdGluZycpKVxuICAgICAgLmxsZW4odGhpcy50b0tleSgnYWN0aXZlJykpXG4gICAgICAuc2NhcmQodGhpcy50b0tleSgnc3VjY2VlZGVkJykpXG4gICAgICAuc2NhcmQodGhpcy50b0tleSgnZmFpbGVkJykpXG4gICAgICAudGhlbihyZXN1bHRzID0+IHsgLyogZXNsaW50IGFycm93LWJvZHktc3R5bGU6IDAgKi9cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB3YWl0aW5nOiByZXN1bHRzWzBdWzFdLFxuICAgICAgICAgIGFjdGl2ZTogcmVzdWx0c1sxXVsxXSxcbiAgICAgICAgICBzdWNjZWVkZWQ6IHJlc3VsdHNbMl1bMV0sXG4gICAgICAgICAgZmFpbGVkOiByZXN1bHRzWzNdWzFdLFxuICAgICAgICB9O1xuICAgICAgfSk7XG4gIH1cblxuICAvLyAvKipcbiAgLy8gICpcbiAgLy8gICogQHBhcmFtIGRhdGFcbiAgLy8gICogQHJldHVybnMge0pvYn1cbiAgLy8gICovXG4gIC8vIGNyZWF0ZUpvYihkYXRhKSB7XG4gIC8vICAgcmV0dXJuIG5ldyBKb2IodGhpcywgbnVsbCwgZGF0YSk7XG4gIC8vIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIGpvYklkXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfVxuICAgKi9cbiAgLy8gZ2V0Sm9iKGpvYklkKSB7XG4gIC8vICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgLy8gICAgIGlmIChqb2JJZCBpbiB0aGlzLmpvYnMpIHtcbiAgLy8gICAgICAgLy8gd2UgaGF2ZSB0aGUgam9iIGxvY2FsbHlcbiAgLy8gICAgICAgcmV0dXJuIHJlc29sdmUodGhpcy5qb2JzW2pvYklkXSk7XG4gIC8vICAgICB9XG4gIC8vICAgICAvLyBub3QgbG9jYWwgc28gZ2F0aGVyIGZyb20gcmVkaXNcbiAgLy8gICAgIEpvYi5mcm9tSWQodGhpcywgam9iSWQpXG4gIC8vICAgICAgICAudGhlbihqb2IgPT4ge1xuICAvLyAgICAgICAgICB0aGlzLmpvYnNbam9iSWRdID0gam9iO1xuICAvLyAgICAgICAgICByZXR1cm4gcmVzb2x2ZShqb2IpO1xuICAvLyAgICAgICAgfSkuY2F0Y2gocmVqZWN0KTtcbiAgLy8gICB9KTtcbiAgLy8gfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX1cbiAgICovXG4gIF9nZXROZXh0Sm9iKCkge1xuICAgIHRoaXMubG9nLnZlcmJvc2UoYEdldHRpbmcgbmV4dCBqb2IgZm9yIHF1ZXVlICcke3RoaXMubmFtZX0nLmApO1xuICAgIHJldHVybiB0aGlzLmNsaWVudHMuYmxvY2suYnJwb3BscHVzaChcbiAgICAgIHRoaXMudG9LZXkoJ3dhaXRpbmcnKSxcbiAgICAgIHRoaXMudG9LZXkoJ2FjdGl2ZScpLCAwXG4gICAgKS50aGVuKGpvYklkID0+XG4gICAgICBKb2IuZnJvbUlkKHRoaXMsIGpvYklkKS50aGVuKGpvYiA9PiB7XG4gICAgICAgIHJldHVybiBqb2I7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIGpvYlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX1cbiAgICovXG4gIF9ydW5Kb2Ioam9iKSB7XG4gICAgaWYgKCFqb2IgfHwgIWpvYi5kYXRhKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgY29uc3QgcnVucyA9IGpvYi5kYXRhICYmIGpvYi5kYXRhLnJ1bnMgJiYgQXJyYXkuaXNBcnJheShqb2IuZGF0YS5ydW5zKSA/IGpvYi5kYXRhLnJ1bnNbMF0gOiBqb2IuZGF0YS5ydW5zO1xuICAgIGNvbnN0IGhhbmRsZXIgPSAodHlwZW9mIHRoaXMuaGFuZGxlciA9PT0gJ3N0cmluZycgP1xuICAgICAgICBkZWVwR2V0KGdsb2JhbCwgdGhpcy5oYW5kbGVyKSA6IHRoaXMuaGFuZGxlcikgfHwgZGVlcEdldChnbG9iYWwsIHJ1bnMpO1xuXG4gICAgbGV0IHByZXZlbnRTdGFsbGluZ1RpbWVvdXQ7XG4gICAgbGV0IGhhbmRsZWQgPSBmYWxzZTtcblxuICAgIC8vIEhhbmRsZSBhbiBcIk9LXCIgcmVzcG9uc2UgZnJvbSB0aGUgcHJvbWlzZVxuICAgIGNvbnN0IGhhbmRsZU9LID0gZGF0YSA9PiB7XG4gICAgICAvLyBzaWxlbnRseSBpZ25vcmUgYW55IG11bHRpcGxlIGNhbGxzXG4gICAgICBpZiAoaGFuZGxlZCkge1xuICAgICAgICByZXR1cm4gdm9pZCAwO1xuICAgICAgfVxuXG4gICAgICBjbGVhclRpbWVvdXQocHJldmVudFN0YWxsaW5nVGltZW91dCk7XG4gICAgICBoYW5kbGVkID0gdHJ1ZTtcblxuICAgICAgLy8gc2V0IHRoZSBkYXRhIGJhY2sgdG8gaW50ZXJuYWwgZGF0YVxuICAgICAgaWYgKGpvYi5faW50ZXJuYWxEYXRhKSB7XG4gICAgICAgIGpvYi5kYXRhID0gam9iLl9pbnRlcm5hbERhdGE7XG4gICAgICB9XG5cbiAgICAgIGlmIChqb2IuZGF0YS5ydW5zICYmIEFycmF5LmlzQXJyYXkoam9iLmRhdGEucnVucykgJiYgZGF0YSAhPT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZpbmlzaE11bHRpSm9iKG51bGwsIGRhdGEsIGpvYik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLl9maW5pc2hTaW5nbGVKb2IobnVsbCwgZGF0YSwgam9iKTtcbiAgICB9O1xuXG4gICAgLy8gSGFuZGxlIGFueSBlcnJvcnMgcmV0dXJuZWRcbiAgICBjb25zdCBoYW5kbGVFcnJvciA9IGVyciA9PiB7XG4gICAgICBjbGVhclRpbWVvdXQocHJldmVudFN0YWxsaW5nVGltZW91dCk7XG5cbiAgICAgIC8vIHNpbGVudGx5IGlnbm9yZSBhbnkgbXVsdGlwbGUgY2FsbHNcbiAgICAgIGlmIChoYW5kbGVkKSB7XG4gICAgICAgIHJldHVybiB2b2lkIDA7XG4gICAgICB9XG5cbiAgICAgIGhhbmRsZWQgPSB0cnVlO1xuXG4gICAgICAvLyBzZXQgdGhlIGRhdGEgYmFjayB0byBpbnRlcm5hbCBqb2IgZGF0YVxuICAgICAgaWYgKGpvYi5faW50ZXJuYWxEYXRhKSB7XG4gICAgICAgIGpvYi5kYXRhID0gam9iLl9pbnRlcm5hbERhdGE7XG4gICAgICB9XG5cbiAgICAgIC8vIG9ubHkgbG9nIHRoZSBlcnJvciBpZiBubyBub3RpZnlGYWlsdXJlIHB1YnN1YiBzZXRcbiAgICAgIGlmICgoIWpvYi5kYXRhLmluaXRpYWxKb2IgfHwgIWpvYi5kYXRhLmluaXRpYWxKb2Iub3B0aW9ucy5ub3RpZnlGYWlsdXJlKSAmJiAhQXJyYXkuaXNBcnJheShqb2IuZGF0YS5ydW5zKSkge1xuICAgICAgICB0aGlzLmxvZy5lcnJvcignJyk7XG4gICAgICAgIHRoaXMubG9nLmVycm9yKCctLS0tLS0tLS0tLS0tLS0gUkRCIEpPQiBFUlJPUi9GQUlMVVJFIC0tLS0tLS0tLS0tLS0tLScpO1xuICAgICAgICB0aGlzLmxvZy5lcnJvcihgSm9iOiAke2pvYi5kYXRhLnJ1bnN9YCB8fCB0aGlzLm5hbWUpO1xuICAgICAgICBpZiAoZXJyLnN0YWNrKSB7XG4gICAgICAgICAgZXJyLnN0YWNrLnNwbGl0KCdcXG4nKS5mb3JFYWNoKGVycm9yID0+IHtcbiAgICAgICAgICAgIHRoaXMubG9nLmVycm9yKGVycm9yKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxvZy5lcnJvcihlcnIpO1xuICAgICAgICB0aGlzLmxvZy5lcnJvcignLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tJyk7XG4gICAgICAgIHRoaXMubG9nLmVycm9yKCcnKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGpvYi5kYXRhLnJ1bnMgJiYgQXJyYXkuaXNBcnJheShqb2IuZGF0YS5ydW5zKSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZmluaXNoTXVsdGlKb2IoZXJyLCBudWxsLCBqb2IpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuX2ZpbmlzaFNpbmdsZUpvYihlcnIsIG51bGwsIGpvYik7XG4gICAgfTtcblxuICAgIGNvbnN0IHByZXZlbnRTdGFsbGluZyA9ICgpID0+IHtcbiAgICAgIHRoaXMuY2xpZW50LnNyZW0odGhpcy50b0tleSgnc3RhbGxpbmcnKSwgam9iLmlkLCAoKSA9PiB7XG4gICAgICAgIGlmICghaGFuZGxlZCkge1xuICAgICAgICAgIHByZXZlbnRTdGFsbGluZ1RpbWVvdXQgPSBzZXRUaW1lb3V0KHByZXZlbnRTdGFsbGluZywgdGhpcy5vcHRpb25zLnN0YWxsSW50ZXJ2YWwgLyAyKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIGlmICghaGFuZGxlcikge1xuICAgICAgcmV0dXJuIGhhbmRsZUVycm9yKFxuICAgICAgICBuZXcgRXJyb3IoXG4gICAgICAgICAgYFwiJHtqb2IuZGF0YS5ydW5zIHx8ICdObyBKb2IgSGFuZGxlciBTcGVjaWZpZWQnfVwiIHdhcyBub3QgZm91bmQuIFNraXBwaW5nIGpvYi4gVG8gZml4IHRoaXNcbiAgICAgICAgICAgICB5b3UgbXVzdCBlaXRoZXIgc3BlY2lmeSBhIGhhbmRsZXIgZnVuY3Rpb24gdmlhIHF1ZXVlLnByb2Nlc3MoKSBvciBwcm92aWRlIGEgdmFsaWQgaGFuZGxlclxuICAgICAgICAgICAgIG5vZGUgZ2xvYmFsIHBhdGggaW4geW91ciBqb2Igb3B0aW9ucyAnaGFuZGxlcicsIGUuZy4gaWYgeW91IGhhZCBhIGdsb2JhbCBmdW5jdGlvbiBpblxuICAgICAgICAgICAgJ2dsb2JhbC5zYWlscy5zZXJ2aWNlcy5teXNlcnZpY2UnIHlvdSdkIHNwZWNpZnkgdGhlIGhhbmRsZXIgYXMgJ3NhaWxzLnNlcnZpY2VzLm15c2VydmljZS5teUhhbmRsZXInLmBcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBwcmV2ZW50U3RhbGxpbmcoKTsgLy8gc3RhcnQgc3RhbGxpbmcgbW9uaXRvclxuXG4gICAgam9iLl9pbnRlcm5hbERhdGEgPSBqb2IuZGF0YTtcbiAgICBqb2IuZGF0YSA9IGpvYi5kYXRhLmRhdGEgfHwgam9iLmRhdGE7XG5cbiAgICBpZiAoam9iLm9wdGlvbnMudGltZW91dCkge1xuICAgICAgY29uc3QgbXNnID0gYEpvYiAke2pvYi5pZH0gdGltZWQgb3V0ICgke2pvYi5vcHRpb25zLnRpbWVvdXR9bXMpYDtcbiAgICAgIHNldFRpbWVvdXQoaGFuZGxlRXJyb3IuYmluZChudWxsLCBFcnJvcihtc2cpKSwgam9iLm9wdGlvbnMudGltZW91dCk7XG4gICAgfVxuXG4gICAgaWYgKGpvYi5vcHRpb25zLm5vQmluZCB8fCB0aGlzLm9wdGlvbnMubm9CaW5kKSB7XG4gICAgICByZXR1cm4gaGFuZGxlcihqb2IpLnRoZW4oaGFuZGxlT0ssIGhhbmRsZUVycm9yKS5jYXRjaChoYW5kbGVFcnJvcik7XG4gICAgfVxuXG4gICAgcmV0dXJuIGhhbmRsZXIuYmluZChqb2IsIGpvYikoam9iKS50aGVuKGhhbmRsZU9LLCBoYW5kbGVFcnJvcikuY2F0Y2goaGFuZGxlRXJyb3IpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbXBsZXRlcyBhIG11bHRpIGpvYiBvciBjb250aW51ZXMgdG8gdGhlIG5leHQgc3RhZ2UuXG4gICAqIEBwYXJhbSBlcnJvclxuICAgKiBAcGFyYW0gZGF0YVxuICAgKiBAcGFyYW0gam9iXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX2ZpbmlzaE11bHRpSm9iKGVycm9yLCBkYXRhLCBqb2IpIHtcbiAgICBkZWxldGUgdGhpcy5qb2JzW2pvYi5pZF07XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3Qgc3RhdHVzID0gZXJyb3IgPyAnZmFpbGVkJyA6ICdzdWNjZWVkZWQnO1xuXG4gICAgICBjb25zdCBtdWx0aSA9IHRoaXMuY2xpZW50Lm11bHRpKCk7XG4gICAgICBtdWx0aS5scmVtKHRoaXMudG9LZXkoJ2FjdGl2ZScpLCAwLCBqb2IuaWQpO1xuICAgICAgbXVsdGkuc3JlbSh0aGlzLnRvS2V5KCdzdGFsbGluZycpLCBqb2IuaWQpO1xuXG4gICAgICBjb25zdCBldmVudCA9IHtcbiAgICAgICAgam9iOiB7XG4gICAgICAgICAgaWQ6IGpvYi5pZCxcbiAgICAgICAgICB3b3JrZXJfaWQ6IHRoaXMuY29yZS5pZCxcbiAgICAgICAgICBzdGF0dXMsXG4gICAgICAgICAgLi4uam9iLmRhdGEsXG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yLFxuICAgICAgICBvdXRwdXQ6IGRhdGEsXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBjdXJyZW50Sm9iID0gam9iLmRhdGEucnVucy5zaGlmdCgpO1xuICAgICAgY29uc3QgbmV4dEpvYiA9IGpvYi5kYXRhLnJ1bnNbMF07XG4gICAgICBsZXQgbmV4dFF1ZXVlID0gdGhpcy5uYW1lO1xuXG4gICAgICAvLyBrZWVwIGEgcmVjb3JkIG9mIHRoZSBmaXJzdCBqb2IgaW4gdGhpcyByZWxheSBpbnN0YW5jZVxuICAgICAgLy8gc3Nzc2ggSlNPTiA7cFxuICAgICAgaWYgKCFqb2IuZGF0YS5pbml0aWFsSm9iKSB7XG4gICAgICAgIGpvYi5kYXRhLmluaXRpYWxKb2IgPSB0cnlKU09OUGFyc2Uoam9iLnRvRGF0YSgpKTtcbiAgICAgIH1cblxuICAgICAgLy8ga2VlcCBhIHJlY29yZCBvZiB0aGUgZmlyc3QgcXVldWUgaW4gdGhpcyByZWxheSBpbnN0YW5jZVxuICAgICAgaWYgKCFqb2IuZGF0YS5pbml0aWFsUXVldWUpIHtcbiAgICAgICAgam9iLmRhdGEuaW5pdGlhbFF1ZXVlID0gdGhpcy5uYW1lO1xuICAgICAgfVxuXG4gICAgICBpZiAoc3RhdHVzID09PSAnZmFpbGVkJykge1xuICAgICAgICBpZiAoam9iLm9wdGlvbnMucmV0cmllcyA+IDApIHtcbiAgICAgICAgICBqb2Iub3B0aW9ucy5yZXRyaWVzID0gam9iLm9wdGlvbnMucmV0cmllcyAtIDE7XG4gICAgICAgICAgam9iLnN0YXR1cyA9ICdyZXRyeWluZyc7XG4gICAgICAgICAgZXZlbnQuZXZlbnQgPSAncmV0cnlpbmcnO1xuICAgICAgICAgIG11bHRpLmhzZXQodGhpcy50b0tleSgnam9icycpLCBqb2IuaWQsIGpvYi50b0RhdGEoKSk7XG4gICAgICAgICAgbXVsdGkubHB1c2godGhpcy50b0tleSgnd2FpdGluZycpLCBqb2IuaWQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGpvYi5zdGF0dXMgPSAnZmFpbGVkJztcbiAgICAgICAgICBtdWx0aS5oc2V0KHRoaXMudG9LZXkoJ2pvYnMnKSwgam9iLmlkLCBqb2IudG9EYXRhKCkpO1xuICAgICAgICAgIG11bHRpLnNhZGQodGhpcy50b0tleSgnZmFpbGVkJyksIGpvYi5pZCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGpvYi5zdGF0dXMgPSAnc3VjY2VlZGVkJztcbiAgICAgICAgbXVsdGkuaHNldCh0aGlzLnRvS2V5KCdqb2JzJyksIGpvYi5pZCwgam9iLnRvRGF0YSgpKTtcbiAgICAgICAgbXVsdGkuaGRlbCh0aGlzLnRvS2V5KCdqb2JzJyksIGpvYi5pZCk7XG4gICAgICAgIC8vIG11bHRpLnNhZGQodGhpcy50b0tleSgnc3VjY2VlZGVkJyksIGpvYi5pZCk7IC8vIFRPRE8gTE9HIEpPQlNcbiAgICAgIH1cblxuICAgICAgLy8gY2hlY2sgaWYgd2UgbmVlZCB0byByZWxheSB0byBhbm90aGVyIGpvYlxuICAgICAgaWYgKCEoam9iLmRhdGEucnVucy5sZW5ndGggPT09IDAgfHwgISFlcnJvcikpIHtcbiAgICAgICAgaWYgKGlzT2JqZWN0KG5leHRKb2IpKSB7XG4gICAgICAgICAgbmV4dFF1ZXVlID0gbmV4dEpvYi5xdWV1ZTtcbiAgICAgICAgICBqb2IuZGF0YS5ydW5zWzBdID0gbmV4dEpvYi5ydW5zO1xuICAgICAgICB9IGVsc2UgaWYgKGpvYi5kYXRhLmluaXRpYWxRdWV1ZSkge1xuICAgICAgICAgIG5leHRRdWV1ZSA9IGpvYi5kYXRhLmluaXRpYWxRdWV1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGFkZCBzb21lIGRlYnVnIGRhdGEgZm9yIHRoZSBuZXh0IGpvYlxuICAgICAgICAvLyBzbyBpdCBjYW4gdGVsbCB3aGVyZSBpdHMgY2FsbCBvcmlnaW5hdGVkIGZyb21cbiAgICAgICAgam9iLmRhdGEuZnJvbV9qb2IgPSBjdXJyZW50Sm9iO1xuICAgICAgICBqb2IuZGF0YS5mcm9tX3F1ZXVlID0gdGhpcy5uYW1lO1xuICAgICAgICBqb2IuZGF0YS5mcm9tX3RpbWVzdGFtcCA9IGdldFRpbWVTdGFtcCgpO1xuICAgICAgICBqb2IuZGF0YS5kYXRhID0gZGF0YTtcblxuICAgICAgICByZXR1cm4gdGhpcy5jb3JlLmhvb2tzLmpvYi5jcmVhdGUobmV4dFF1ZXVlLCBqb2IuZGF0YSkudGhlbigoKSA9PiB7XG4gICAgICAgICAgbXVsdGkuZXhlYyhlcnJNdWx0aSA9PiB7XG4gICAgICAgICAgICBpZiAoZXJyTXVsdGkpIHJldHVybiByZWplY3QoZXJyTXVsdGkpO1xuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUoeyBzdGF0dXMsIHJlc3VsdDogZXJyb3IgfHwgZGF0YSB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIHdlJ3ZlIGp1c3QgZmluaXNoZWQgdGhlIGxhc3Qgam9iIGluIHRoZSByZWxheVxuICAgICAgaWYgKGV2ZW50LmVycm9yKSB7XG4gICAgICAgIGlmIChqb2IuZGF0YS5pbml0aWFsSm9iLm9wdGlvbnMubm90aWZ5RmFpbHVyZSkge1xuICAgICAgICAgIHRoaXMuY29yZS5wdWJzdWIucHVibGlzaChqb2IuZGF0YS5pbml0aWFsSm9iLm9wdGlvbnMubm90aWZ5RmFpbHVyZSwgZXZlbnQpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGpvYi5kYXRhLmluaXRpYWxKb2Iub3B0aW9ucy5ub3RpZnlTdWNjZXNzKSB7XG4gICAgICAgIHRoaXMuY29yZS5wdWJzdWIucHVibGlzaChqb2IuZGF0YS5pbml0aWFsSm9iLm9wdGlvbnMubm90aWZ5U3VjY2VzcywgZXZlbnQpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbXVsdGkuZXhlYyhlcnJNdWx0aSA9PiB7XG4gICAgICAgIGlmIChlcnJNdWx0aSkgcmV0dXJuIHJlamVjdChlcnJNdWx0aSk7XG4gICAgICAgIHJldHVybiByZXNvbHZlKHsgc3RhdHVzLCByZXN1bHQ6IGVycm9yIHx8IGRhdGEgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0gZXJyb3JcbiAgICogQHBhcmFtIGRhdGFcbiAgICogQHBhcmFtIGpvYlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX1cbiAgICovXG4gIF9maW5pc2hTaW5nbGVKb2IoZXJyb3IsIGRhdGEsIGpvYikge1xuICAgIGRlbGV0ZSB0aGlzLmpvYnNbam9iLmlkXTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCBzdGF0dXMgPSBlcnJvciA/ICdmYWlsZWQnIDogJ3N1Y2NlZWRlZCc7XG4gICAgICBjb25zdCBtdWx0aSA9IHRoaXMuY2xpZW50Lm11bHRpKCk7XG5cbiAgICAgIG11bHRpLmxyZW0odGhpcy50b0tleSgnYWN0aXZlJyksIDAsIGpvYi5pZCk7XG4gICAgICBtdWx0aS5zcmVtKHRoaXMudG9LZXkoJ3N0YWxsaW5nJyksIGpvYi5pZCk7XG5cbiAgICAgIGlmIChzdGF0dXMgPT09ICdmYWlsZWQnKSB7XG4gICAgICAgIGlmIChqb2Iub3B0aW9ucy5yZXRyaWVzID4gMCkge1xuICAgICAgICAgIGpvYi5vcHRpb25zLnJldHJpZXMgPSBqb2Iub3B0aW9ucy5yZXRyaWVzIC0gMTtcbiAgICAgICAgICBqb2Iuc3RhdHVzID0gJ3JldHJ5aW5nJztcbiAgICAgICAgICBtdWx0aS5oc2V0KHRoaXMudG9LZXkoJ2pvYnMnKSwgam9iLmlkLCBqb2IudG9EYXRhKCkpO1xuICAgICAgICAgIG11bHRpLmxwdXNoKHRoaXMudG9LZXkoJ3dhaXRpbmcnKSwgam9iLmlkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBqb2Iuc3RhdHVzID0gJ2ZhaWxlZCc7XG4gICAgICAgICAgbXVsdGkuaHNldCh0aGlzLnRvS2V5KCdqb2JzJyksIGpvYi5pZCwgam9iLnRvRGF0YSgpKTtcbiAgICAgICAgICBtdWx0aS5zYWRkKHRoaXMudG9LZXkoJ2ZhaWxlZCcpLCBqb2IuaWQpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBqb2Iuc3RhdHVzID0gJ3N1Y2NlZWRlZCc7XG4gICAgICAgIG11bHRpLmhzZXQodGhpcy50b0tleSgnam9icycpLCBqb2IuaWQsIGpvYi50b0RhdGEoKSk7XG4gICAgICAgIG11bHRpLmhkZWwodGhpcy50b0tleSgnam9icycpLCBqb2IuaWQpO1xuICAgICAgICAvLyBtdWx0aS5zYWRkKHRoaXMudG9LZXkoJ3N1Y2NlZWRlZCcpLCBqb2IuaWQpOyAvLyBUT0RPIExPRyBKT0JTXG4gICAgICB9XG5cbiAgICAgIGlmIChlcnJvciAmJiAoam9iLm9wdGlvbnMubm90aWZ5U3VjY2VzcyB8fCBqb2Iubm90aWZ5RmFpbHVyZSkpIHtcbiAgICAgICAgY29uc3QgZXZlbnQgPSB7XG4gICAgICAgICAgam9iOiB7XG4gICAgICAgICAgICBpZDogam9iLmlkLFxuICAgICAgICAgICAgd29ya2VyX2lkOiB0aGlzLmNvcmUuaWQsXG4gICAgICAgICAgICBzdGF0dXMsXG4gICAgICAgICAgICAuLi5qb2IuZGF0YSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGVycm9yLFxuICAgICAgICAgIG91dHB1dDogZGF0YSxcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKGpvYi5vcHRpb25zLm5vdGlmeUZhaWx1cmUpIHRoaXMuY29yZS5wdWJzdWIucHVibGlzaChqb2Iub3B0aW9ucy5ub3RpZnlGYWlsdXJlLCBldmVudCk7XG4gICAgICAgIGlmIChqb2Iub3B0aW9ucy5ub3RpZnlTdWNjZXNzKSB0aGlzLmNvcmUucHVic3ViLnB1Ymxpc2goam9iLm9wdGlvbnMubm90aWZ5U3VjY2VzcywgZXZlbnQpO1xuICAgICAgfVxuXG4gICAgICBtdWx0aS5leGVjKGVyck11bHRpID0+IHtcbiAgICAgICAgaWYgKGVyck11bHRpKSByZXR1cm4gcmVqZWN0KGVyck11bHRpKTtcbiAgICAgICAgcmV0dXJuIHJlc29sdmUoeyBzdGF0dXMsIHJlc3VsdDogZXJyb3IgfHwgZGF0YSB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX2pvYlRpY2sgPSAoKSA9PiB7XG4gICAgaWYgKHRoaXMucGF1c2VkIHx8ICF0aGlzLm9wdGlvbnMuZW5hYmxlZCkge1xuICAgICAgcmV0dXJuIHZvaWQgMDtcbiAgICB9XG5cbiAgICB0aGlzLnF1ZXVlZCsrO1xuXG4gICAgcmV0dXJuIHRoaXMuX2dldE5leHRKb2IoKS50aGVuKGpvYiA9PiB7XG4gICAgICB0aGlzLnJ1bm5pbmcrKztcblxuICAgICAgaWYgKCh0aGlzLnJ1bm5pbmcgKyB0aGlzLnF1ZXVlZCkgPCB0aGlzLmNvbmN1cnJlbmN5KSB7XG4gICAgICAgIHNldEltbWVkaWF0ZSh0aGlzLl9qb2JUaWNrKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMuX3J1bkpvYihqb2IpLnRoZW4oKCkgPT4ge1xuICAgICAgICB0aGlzLnJ1bm5pbmctLTtcbiAgICAgICAgdGhpcy5xdWV1ZWQtLTtcbiAgICAgICAgc2V0SW1tZWRpYXRlKHRoaXMuX2pvYlRpY2spO1xuICAgICAgfSkuY2F0Y2goKCkgPT4ge1xuICAgICAgICB0aGlzLnJ1bm5pbmctLTtcbiAgICAgICAgdGhpcy5xdWV1ZWQtLTtcbiAgICAgICAgc2V0SW1tZWRpYXRlKHRoaXMuX2pvYlRpY2spO1xuICAgICAgfSk7XG4gICAgfSkuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgdGhpcy5sb2cuZXJyb3IoZXJyb3IpO1xuICAgICAgc2V0SW1tZWRpYXRlKHRoaXMuX2pvYlRpY2spO1xuICAgIH0pO1xuICB9O1xuXG4gIC8qKlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX3Jlc3RhcnRQcm9jZXNzaW5nID0gKCkgPT4ge1xuICAgIHRoaXMuY2xpZW50cy5ibG9jay5vbmNlKCdyZWFkeScsIHRoaXMuX2pvYlRpY2spO1xuICB9O1xuXG4gIC8qKlxuICAgKiBTdGFydCB0aGUgcXVldWUuXG4gICAqIEBwYXJhbSBjb25jdXJyZW5jeVxuICAgKi9cbiAgcHJvY2Vzcyhjb25jdXJyZW5jeSA9IDEpIHtcbiAgICBpZiAodGhpcy5zdGFydGVkIHx8ICF0aGlzLm9wdGlvbnMuZW5hYmxlZCkge1xuICAgICAgdGhpcy5sb2cuaW5mbyhgUXVldWUgJHt0aGlzLm5hbWV9IGlzIGN1cnJlbnRseSBkaXNhYmxlZC5gKTtcbiAgICAgIHJldHVybiB2b2lkIDA7XG4gICAgfVxuXG4gICAgdGhpcy5zdGFydGVkID0gdHJ1ZTtcbiAgICB0aGlzLnJ1bm5pbmcgPSAwO1xuICAgIHRoaXMucXVldWVkID0gMDtcbiAgICB0aGlzLmNvbmN1cnJlbmN5ID0gY29uY3VycmVuY3k7XG5cbiAgICB0aGlzLmxvZy52ZXJib3NlKGBRdWV1ZSAnJHt0aGlzLm5hbWV9JyAtIHN0YXJ0ZWQgd2l0aCBhIGNvbmN1cnJlbmN5IG9mICR7dGhpcy5jb25jdXJyZW5jeX0uYCk7XG5cbiAgICB0aGlzLmNsaWVudHMuYmxvY2sub25jZSgnZXJyb3InLCB0aGlzLl9yZXN0YXJ0UHJvY2Vzc2luZyk7XG4gICAgdGhpcy5jbGllbnRzLmJsb2NrLm9uY2UoJ2Nsb3NlJywgdGhpcy5fcmVzdGFydFByb2Nlc3NpbmcpO1xuXG4gICAgdGhpcy5jaGVja1N0YWxsZWRKb2JzKCkudGhlbigoKSA9PiB7XG4gICAgICB0aGlzLmxvZy52ZXJib3NlKCdjaGVja1N0YWxsZWRKb2JzIGNvbXBsZXRlZCcpO1xuICAgIH0pLmNhdGNoKCgpID0+IHtcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzLl9qb2JUaWNrKCk7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBjaGVja1N0YWxsZWRKb2JzKCkge1xuICAgIHRoaXMubG9nLnZlcmJvc2UoJ2NoZWNrU3RhbGxlZEpvYnMnKTtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQuY2hlY2tzdGFsbGVkam9icyhcbiAgICAgIHRoaXMudG9LZXkoJ3N0YWxsVGltZScpLFxuICAgICAgdGhpcy50b0tleSgnc3RhbGxpbmcnKSxcbiAgICAgIHRoaXMudG9LZXkoJ3dhaXRpbmcnKSxcbiAgICAgIHRoaXMudG9LZXkoJ2FjdGl2ZScpLFxuICAgICAgZ2V0VGltZVN0YW1wKCksXG4gICAgICB0aGlzLm9wdGlvbnMuc3RhbGxJbnRlcnZhbFxuICAgICkudGhlbigoKSA9PiB7XG4gICAgICBpZiAoIXRoaXMub3B0aW9ucy5lbmFibGVkIHx8IHRoaXMucGF1c2VkKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIFByb21pc2UuZGVsYXkodGhpcy5vcHRpb25zLnN0YWxsSW50ZXJ2YWwpLnRoZW4odGhpcy5jaGVja1N0YWxsZWRKb2JzKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0gc3RyXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgdG9LZXkoc3RyKSB7XG4gICAgaWYgKHRoaXMuY29yZS5jbHVzdGVyLmlzQ2x1c3RlcigpKSB7XG4gICAgICByZXR1cm4gYCR7dGhpcy5vcHRpb25zLmtleVByZWZpeH06eyR7dGhpcy5uYW1lfX06JHtzdHJ9YDtcbiAgICB9XG4gICAgcmV0dXJuIGAke3RoaXMub3B0aW9ucy5rZXlQcmVmaXh9OiR7dGhpcy5uYW1lfToke3N0cn1gO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCB0aGUgZXZlbnRQcmVmaXggdG8gYW4gZXZlbnQgbmFtZVxuICAgKiBAcGFyYW0gZXZlbnROYW1lXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICB0b0V2ZW50TmFtZSA9IGV2ZW50TmFtZSA9PiBgcXVldWU6JHt0aGlzLm5hbWV9OiR7ZXZlbnROYW1lfWA7XG59XG4iXX0=
//# sourceMappingURL=data:application/json;base64,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LEtBQUwsQ0FBVyxRQUFYLENBSkssRUFLTCw0QkFMSyxFQU1MLEtBQUssT0FBTCxDQUFhLGFBTlIsRUFPTCxJQVBLLENBT0EsTUFBTTtBQUNYLFVBQUksQ0FBQyxLQUFLLE9BQUwsQ0FBYSxPQUFkLElBQXlCLEtBQUssTUFBbEMsRUFBMEMsT0FBTyxtQkFBUSxPQUFSLEVBQVA7QUFDMUMsYUFBTyxtQkFBUSxLQUFSLENBQWMsS0FBSyxPQUFMLENBQWEsYUFBM0IsRUFBMEMsSUFBMUMsQ0FBK0MsS0FBSyxnQkFBcEQsQ0FBUDtBQUNELEtBVk0sQ0FBUDtBQVdEOzs7Ozs7O0FBT0QsUUFBTSxHQUFOLEVBQVc7QUFDVCxRQUFJLEtBQUssSUFBTCxDQUFVLE9BQVYsQ0FBa0IsU0FBbEIsRUFBSixFQUFtQztBQUNqQyxhQUFPLENBQUMsQUFBRCxHQUFHLEtBQUssT0FBTCxDQUFhLFNBQWhCLEVBQTBCLEVBQTFCLEdBQThCLEtBQUssSUFBbkMsRUFBd0MsRUFBeEMsR0FBNEMsR0FBNUMsRUFBZ0QsQUFBaEQsQ0FBUDtBQUNEO0FBQ0QsV0FBTyxDQUFDLEFBQUQsR0FBRyxLQUFLLE9BQUwsQ0FBYSxTQUFoQixFQUEwQixDQUExQixHQUE2QixLQUFLLElBQWxDLEVBQXVDLENBQXZDLEdBQTBDLEdBQTFDLEVBQThDLEFBQTlDLENBQVA7QUFDRDs7Ozs7OztBQS9kNkM7a0JBQTNCLEsiLCJmaWxlIjoicXVldWUuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgSm9iIGZyb20gJy4vam9iJztcbmltcG9ydCBQcm9taXNlIGZyb20gJ2JsdWViaXJkJztcbmltcG9ydCBkZWZhdWx0cyBmcm9tICcuL2RlZmF1bHRzJztcbmltcG9ydCBFdmVudEVtaXR0ZXIgZnJvbSAnZXZlbnRlbWl0dGVyMyc7XG5pbXBvcnQgeyBkZWVwR2V0LCBpc09iamVjdCwgZ2V0VGltZVN0YW1wLCB0cnlKU09OUGFyc2UgfSBmcm9tICdyZWRpYm94JztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUXVldWUgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0gb3B0aW9uc1xuICAgKiBAcGFyYW0gY29yZVxuICAgKiBAcmV0dXJucyB7UXVldWV9XG4gICAqL1xuICBjb25zdHJ1Y3RvcihvcHRpb25zLCBjb3JlKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmNvcmUgPSBjb3JlO1xuICAgIHRoaXMuY2xpZW50ID0gY29yZS5jbGllbnQ7XG4gICAgdGhpcy5wYXVzZWQgPSBmYWxzZTtcbiAgICB0aGlzLnN0YXJ0ZWQgPSBmYWxzZTtcbiAgICB0aGlzLnRocm90dGxlZCA9IGZhbHNlO1xuICAgIHRoaXMubG9nID0gdGhpcy5jb3JlLmxvZztcbiAgICB0aGlzLm5hbWUgPSBvcHRpb25zLm5hbWU7XG4gICAgdGhpcy5oYW5kbGVyID0gb3B0aW9ucy5oYW5kbGVyIHx8IG51bGw7XG4gICAgdGhpcy5vcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgZGVmYXVsdHMucXVldWUsIG9wdGlvbnMgfHwge30pO1xuICAgIHRoaXMuY29yZS5jcmVhdGVDbGllbnQoJ2Jsb2NrJywgdGhpcykudGhlbigoKSA9PiB7XG4gICAgICB0aGlzLmxvZy52ZXJib3NlKGBCbG9ja2luZyBjbGllbnQgZm9yIHF1ZXVlICcke3RoaXMubmFtZX0nIGlzIHJlYWR5LiBTdGFydGluZyBxdWV1ZSBwcm9jZXNzb3IuYCk7XG4gICAgICB0aGlzLmJlZ2luV29ya2luZygpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgZGVzdHJveSgpIHtcbiAgICBjb25zdCBrZXlzID0gW1xuICAgICAgJ2lkJywgJ2pvYnMnLCAnc3RhbGxUaW1lJywgJ3N0YWxsaW5nJywgJ3dhaXRpbmcnLCAnYWN0aXZlJywgJ3N1Y2NlZWRlZCcsICdmYWlsZWQnLFxuICAgIF0ubWFwKGtleSA9PiB0aGlzLnRvS2V5KGtleSkpO1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5kZWwoLi4ua2V5cyk7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2V9XG4gICAqL1xuICBjaGVja0hlYWx0aCgpIHtcbiAgICByZXR1cm4gdGhpc1xuICAgICAgLmNsaWVudC5tdWx0aSgpXG4gICAgICAubGxlbih0aGlzLnRvS2V5KCd3YWl0aW5nJykpXG4gICAgICAubGxlbih0aGlzLnRvS2V5KCdhY3RpdmUnKSlcbiAgICAgIC5zY2FyZCh0aGlzLnRvS2V5KCdzdWNjZWVkZWQnKSlcbiAgICAgIC5zY2FyZCh0aGlzLnRvS2V5KCdmYWlsZWQnKSlcbiAgICAgIC50aGVuKHJlc3VsdHMgPT4geyAvKiBlc2xpbnQgYXJyb3ctYm9keS1zdHlsZTogMCAqL1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHdhaXRpbmc6IHJlc3VsdHNbMF1bMV0sXG4gICAgICAgICAgYWN0aXZlOiByZXN1bHRzWzFdWzFdLFxuICAgICAgICAgIHN1Y2NlZWRlZDogcmVzdWx0c1syXVsxXSxcbiAgICAgICAgICBmYWlsZWQ6IHJlc3VsdHNbM11bMV0sXG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX1cbiAgICovXG4gIF9nZXROZXh0Sm9iKCkge1xuICAgIHRoaXMubG9nLnZlcmJvc2UoYEdldHRpbmcgbmV4dCBqb2IgZm9yIHF1ZXVlICcke3RoaXMubmFtZX0nLmApO1xuICAgIHJldHVybiB0aGlzLmNsaWVudHMuYmxvY2suYnJwb3BscHVzaChcbiAgICAgIHRoaXMudG9LZXkoJ3dhaXRpbmcnKSxcbiAgICAgIHRoaXMudG9LZXkoJ2FjdGl2ZScpLCAwXG4gICAgKS50aGVuKGpvYklkID0+XG4gICAgICBKb2IuZnJvbUlkKHRoaXMsIGpvYklkKS50aGVuKGpvYiA9PiB7XG4gICAgICAgIHJldHVybiBqb2I7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIGpvYlxuICAgKiBAcGFyYW0gam9iRXJyb3JcbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9sb2dKb2JGYWlsdXJlKGpvYiwgam9iRXJyb3IpIHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuS1VCRVJORVRFU19QT1JUIHx8IHByb2Nlc3MuZW52LktVQkVSTkVURVNfU0VSVklDRV9IT1NUKSB7XG4gICAgICAvKiBlc2xpbnQgbm8tY29uc29sZTogMCAqL1xuICAgICAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICBsZXZlbDogJ2Vycm9yJyxcbiAgICAgICAgdHlwZTogJ3JlZGlib3hfam9iX2ZhaWx1cmUnLFxuICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgcnVuczogam9iLmRhdGEucnVucyxcbiAgICAgICAgICBxdWV1ZTogdGhpcy5uYW1lLFxuICAgICAgICAgIHN0YWNrOiBqb2JFcnJvci5zdGFjayA/IGpvYkVycm9yLnN0YWNrLnNwbGl0KCdcXG4nKS5zbGljZSgwLCA1KSA6IFtdLFxuICAgICAgICB9LFxuICAgICAgfSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmxvZy5lcnJvcignJyk7XG4gICAgICB0aGlzLmxvZy5lcnJvcignLS0tLS0tLS0tLS0tLS0tIFJEQiBKT0IgRVJST1IvRkFJTFVSRSAtLS0tLS0tLS0tLS0tLS0nKTtcbiAgICAgIHRoaXMubG9nLmVycm9yKGBKb2I6ICR7am9iLmRhdGEucnVuc31gIHx8IHRoaXMubmFtZSk7XG4gICAgICBpZiAoam9iRXJyb3Iuc3RhY2spIHtcbiAgICAgICAgdGhpcy5sb2cuZXJyb3Ioam9iRXJyb3Iuc3RhY2suc3BsaXQoJ1xcbicpLnNsaWNlKDAsIDUpKTtcbiAgICAgIH1cbiAgICAgIHRoaXMubG9nLmVycm9yKGpvYkVycm9yKTtcbiAgICAgIHRoaXMubG9nLmVycm9yKCctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nKTtcbiAgICAgIHRoaXMubG9nLmVycm9yKCcnKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIGpvYlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX1cbiAgICovXG4gIF9ydW5Kb2Ioam9iKSB7XG4gICAgaWYgKCFqb2IgfHwgIWpvYi5kYXRhKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgY29uc3QgcnVucyA9IGpvYi5kYXRhICYmIGpvYi5kYXRhLnJ1bnMgJiYgQXJyYXkuaXNBcnJheShqb2IuZGF0YS5ydW5zKSA/IGpvYi5kYXRhLnJ1bnNbMF0gOiBqb2IuZGF0YS5ydW5zO1xuICAgIGNvbnN0IGhhbmRsZXIgPSAodHlwZW9mIHRoaXMuaGFuZGxlciA9PT0gJ3N0cmluZycgP1xuICAgICAgICBkZWVwR2V0KGdsb2JhbCwgdGhpcy5oYW5kbGVyKSA6IHRoaXMuaGFuZGxlcikgfHwgZGVlcEdldChnbG9iYWwsIHJ1bnMpO1xuXG4gICAgbGV0IHByZXZlbnRTdGFsbGluZ1RpbWVvdXQ7XG4gICAgbGV0IGhhbmRsZWQgPSBmYWxzZTtcblxuICAgIC8vIEhhbmRsZSBhbiBcIk9LXCIgcmVzcG9uc2UgZnJvbSB0aGUgcHJvbWlzZVxuICAgIGNvbnN0IGhhbmRsZU9LID0gZGF0YSA9PiB7XG4gICAgICAvLyBzaWxlbnRseSBpZ25vcmUgYW55IG11bHRpcGxlIGNhbGxzXG4gICAgICBpZiAoaGFuZGxlZCkgcmV0dXJuIHZvaWQgMDtcblxuICAgICAgY2xlYXJUaW1lb3V0KHByZXZlbnRTdGFsbGluZ1RpbWVvdXQpO1xuICAgICAgaGFuZGxlZCA9IHRydWU7XG5cbiAgICAgIC8vIHNldCB0aGUgZGF0YSBiYWNrIHRvIGludGVybmFsIGRhdGFcbiAgICAgIGlmIChqb2IuX2ludGVybmFsRGF0YSkge1xuICAgICAgICBqb2IuZGF0YSA9IGpvYi5faW50ZXJuYWxEYXRhO1xuICAgICAgfVxuXG4gICAgICAvLyBvbmx5IHJlbGF5IHRvIG5leHQgam9iIGlmIHVzZXIgZGlkIG5vdCByZXNvbHZlICdmYWxzZScgb24gY3VycmVudCBqb2JcbiAgICAgIGlmIChqb2IudHlwZSA9PT0gJ3JlbGF5JyAmJiBkYXRhICE9PSBmYWxzZSkgcmV0dXJuIHRoaXMuX2ZpbmlzaFJlbGF5Sm9iKG51bGwsIGRhdGEsIGpvYik7XG4gICAgICByZXR1cm4gdGhpcy5fZmluaXNoU2luZ2xlSm9iKG51bGwsIGRhdGEsIGpvYik7XG4gICAgfTtcblxuICAgIC8vIEhhbmRsZSBhbnkgZXJyb3JzIHJldHVybmVkXG4gICAgY29uc3QgaGFuZGxlRXJyb3IgPSBqb2JFcnJvciA9PiB7XG4gICAgICBjbGVhclRpbWVvdXQocHJldmVudFN0YWxsaW5nVGltZW91dCk7XG5cbiAgICAgIC8vIHNpbGVudGx5IGlnbm9yZSBhbnkgbXVsdGlwbGUgY2FsbHNcbiAgICAgIGlmIChoYW5kbGVkKSB7XG4gICAgICAgIHJldHVybiB2b2lkIDA7XG4gICAgICB9XG5cbiAgICAgIGhhbmRsZWQgPSB0cnVlO1xuXG4gICAgICAvLyBzZXQgdGhlIGRhdGEgYmFjayB0byBpbnRlcm5hbCBqb2IgZGF0YVxuICAgICAgaWYgKGpvYi5faW50ZXJuYWxEYXRhKSB7XG4gICAgICAgIGpvYi5kYXRhID0gam9iLl9pbnRlcm5hbERhdGE7XG4gICAgICB9XG5cbiAgICAgIC8vIG9ubHkgbG9nIHRoZSBlcnJvciBpZiBubyBub3RpZnlGYWlsdXJlIHB1YnN1YiBzZXRcbiAgICAgIGlmICgoIWpvYi5kYXRhLmluaXRpYWxKb2IgfHwgIWpvYi5kYXRhLmluaXRpYWxKb2Iub3B0aW9ucy5ub3RpZnlGYWlsdXJlKSAmJiAhQXJyYXkuaXNBcnJheShqb2IuZGF0YS5ydW5zKSkge1xuICAgICAgICB0aGlzLl9sb2dKb2JGYWlsdXJlKGpvYiwgam9iRXJyb3IpO1xuICAgICAgfVxuXG4gICAgICBpZiAoam9iLnR5cGUgPT09ICdyZWxheScpIHJldHVybiB0aGlzLl9maW5pc2hSZWxheUpvYihqb2JFcnJvciwgbnVsbCwgam9iKTtcbiAgICAgIHJldHVybiB0aGlzLl9maW5pc2hTaW5nbGVKb2Ioam9iRXJyb3IsIG51bGwsIGpvYik7XG4gICAgfTtcblxuICAgIGNvbnN0IHByZXZlbnRTdGFsbGluZyA9ICgpID0+IHtcbiAgICAgIHRoaXMuY2xpZW50LnNyZW0odGhpcy50b0tleSgnc3RhbGxpbmcnKSwgam9iLmlkLCAoKSA9PiB7XG4gICAgICAgIGlmICghaGFuZGxlZCkge1xuICAgICAgICAgIHByZXZlbnRTdGFsbGluZ1RpbWVvdXQgPSBzZXRUaW1lb3V0KHByZXZlbnRTdGFsbGluZywgdGhpcy5vcHRpb25zLnN0YWxsSW50ZXJ2YWwgLyAyKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIGlmICghaGFuZGxlcikge1xuICAgICAgcmV0dXJuIGhhbmRsZUVycm9yKFxuICAgICAgICBuZXcgRXJyb3IoXG4gICAgICAgICAgYFwiJHtqb2IuZGF0YS5ydW5zIHx8ICdObyBKb2IgSGFuZGxlciBTcGVjaWZpZWQnfVwiIHdhcyBub3QgZm91bmQuIFNraXBwaW5nIGpvYi4gVG8gZml4IHRoaXNcbiAgICAgICAgICAgICB5b3UgbXVzdCBlaXRoZXIgc3BlY2lmeSBhIGhhbmRsZXIgZnVuY3Rpb24gdmlhIHF1ZXVlLnByb2Nlc3MoKSBvciBwcm92aWRlIGEgdmFsaWQgaGFuZGxlclxuICAgICAgICAgICAgIG5vZGUgZ2xvYmFsIHBhdGggaW4geW91ciBqb2Igb3B0aW9ucyAnaGFuZGxlcicsIGUuZy4gaWYgeW91IGhhZCBhIGdsb2JhbCBmdW5jdGlvbiBpblxuICAgICAgICAgICAgJ2dsb2JhbC5zYWlscy5zZXJ2aWNlcy5teXNlcnZpY2UnIHlvdSdkIHNwZWNpZnkgdGhlIGhhbmRsZXIgYXMgJ3NhaWxzLnNlcnZpY2VzLm15c2VydmljZS5teUhhbmRsZXInLmBcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBwcmV2ZW50U3RhbGxpbmcoKTsgLy8gc3RhcnQgc3RhbGxpbmcgbW9uaXRvclxuXG4gICAgam9iLl9pbnRlcm5hbERhdGEgPSBqb2IuZGF0YTtcbiAgICBqb2IuZGF0YSA9IGpvYi5kYXRhLmRhdGEgfHwgam9iLmRhdGE7XG5cbiAgICBpZiAoam9iLm9wdGlvbnMudGltZW91dCkge1xuICAgICAgc2V0VGltZW91dChoYW5kbGVFcnJvci5iaW5kKG51bGwsIEVycm9yKGBKb2IgJHtqb2IuaWR9IHRpbWVkIG91dCAoJHtqb2Iub3B0aW9ucy50aW1lb3V0fW1zKWApKSwgam9iLm9wdGlvbnMudGltZW91dCk7XG4gICAgfVxuXG4gICAgaWYgKGpvYi5vcHRpb25zLm5vQmluZCB8fCB0aGlzLm9wdGlvbnMubm9CaW5kKSB7XG4gICAgICByZXR1cm4gaGFuZGxlcihqb2IpLnRoZW4oaGFuZGxlT0ssIGhhbmRsZUVycm9yKS5jYXRjaChoYW5kbGVFcnJvcik7XG4gICAgfVxuXG4gICAgcmV0dXJuIGhhbmRsZXIuYmluZChqb2IsIGpvYikoam9iKS50aGVuKGhhbmRsZU9LLCBoYW5kbGVFcnJvcikuY2F0Y2goaGFuZGxlRXJyb3IpO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSBlcnJvclxuICAgKiBAcGFyYW0gZGF0YVxuICAgKiBAcGFyYW0gam9iXG4gICAqIEByZXR1cm5zIHt7am9iOiB7aWQ6ICosIHdvcmtlcl9pZDogKCp8U3RyaW5nfHN0cmluZyksIHN0YXR1czogc3RyaW5nfSwgZXJyb3I6ICosIG91dHB1dDogKn19XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfY3JlYXRlSm9iRXZlbnQoZXJyb3IsIGRhdGEsIGpvYikge1xuICAgIHJldHVybiB7XG4gICAgICBqb2I6IHtcbiAgICAgICAgaWQ6IGpvYi5pZCxcbiAgICAgICAgd29ya2VyX2lkOiB0aGlzLmNvcmUuaWQsXG4gICAgICAgIHN0YXR1czogZXJyb3IgPyAnZmFpbGVkJyA6ICdzdWNjZWVkZWQnLFxuICAgICAgICAuLi5qb2IuZGF0YSxcbiAgICAgIH0sXG4gICAgICBlcnJvcixcbiAgICAgIG91dHB1dDogZGF0YSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSBlcnJvclxuICAgKiBAcGFyYW0gZGF0YVxuICAgKiBAcGFyYW0gam9iXG4gICAqIEBwYXJhbSBtdWx0aVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX3VwZGF0ZUpvYlN0YXR1cyhlcnJvciwgZGF0YSwgam9iLCBtdWx0aSkge1xuICAgIGNvbnN0IHN0YXR1cyA9IGVycm9yID8gJ2ZhaWxlZCcgOiAnc3VjY2VlZGVkJztcblxuICAgIG11bHRpLmxyZW0odGhpcy50b0tleSgnYWN0aXZlJyksIDAsIGpvYi5pZCk7XG4gICAgbXVsdGkuc3JlbSh0aGlzLnRvS2V5KCdzdGFsbGluZycpLCBqb2IuaWQpO1xuXG4gICAgaWYgKHN0YXR1cyA9PT0gJ2ZhaWxlZCcpIHtcbiAgICAgIGlmIChqb2Iub3B0aW9ucy5yZXRyaWVzID4gMCkge1xuICAgICAgICBqb2Iub3B0aW9ucy5yZXRyaWVzID0gam9iLm9wdGlvbnMucmV0cmllcyAtIDE7XG4gICAgICAgIGpvYi5zdGF0dXMgPSAncmV0cnlpbmcnO1xuICAgICAgICBtdWx0aS5oc2V0KHRoaXMudG9LZXkoJ2pvYnMnKSwgam9iLmlkLCBqb2IudG9EYXRhKCkpO1xuICAgICAgICBtdWx0aS5scHVzaCh0aGlzLnRvS2V5KCd3YWl0aW5nJyksIGpvYi5pZCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBqb2Iuc3RhdHVzID0gJ2ZhaWxlZCc7XG4gICAgICAgIG11bHRpLmhkZWwodGhpcy50b0tleSgnam9icycpLCBqb2IuaWQpO1xuICAgICAgICAvLyBUT0RPIHRyYWNrIGZhaWx1cmVzIGFuZCB0aGVpciBkYXRhIHNvbWV3aGVyZSBlbHNlIGZvciByZXZpZXdpbmdcbiAgICAgICAgLy8gbXVsdGkuaHNldCh0aGlzLnRvS2V5KCdqb2JzJyksIGpvYi5pZCwgam9iLnRvRGF0YSgpKTtcbiAgICAgICAgLy8gbXVsdGkuc2FkZCh0aGlzLnRvS2V5KCdmYWlsZWQnKSwgam9iLmlkKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgam9iLnN0YXR1cyA9ICdzdWNjZWVkZWQnO1xuICAgICAgbXVsdGkuaGRlbCh0aGlzLnRvS2V5KCdqb2JzJyksIGpvYi5pZCk7XG4gICAgICAvLyBUT0RPIHRyYWNrIHN1Y2Nlc3NlcyBhbmQgdGhlaXIgZGF0YSBzb21ld2hlcmUgZWxzZSBmb3IgcmV2aWV3aW5nXG4gICAgICAvLyBtdWx0aS5oc2V0KHRoaXMudG9LZXkoJ2pvYnMnKSwgam9iLmlkLCBqb2IudG9EYXRhKCkpO1xuICAgICAgLy8gbXVsdGkuc2FkZCh0aGlzLnRvS2V5KCdzdWNjZWVkZWQnKSwgam9iLmlkKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIGVycm9yXG4gICAqIEBwYXJhbSBkYXRhXG4gICAqIEBwYXJhbSBqb2JcbiAgICogQHJldHVybnMge1Byb21pc2V9XG4gICAqL1xuICBfZmluaXNoU2luZ2xlSm9iKGVycm9yLCBkYXRhLCBqb2IpIHtcbiAgICBjb25zdCBtdWx0aSA9IHRoaXMuY2xpZW50Lm11bHRpKCk7XG4gICAgY29uc3Qgc3RhdHVzID0gZXJyb3IgPyAnZmFpbGVkJyA6ICdzdWNjZWVkZWQnO1xuICAgIHRoaXMuX3VwZGF0ZUpvYlN0YXR1cyhlcnJvciwgZGF0YSwgam9iLCBtdWx0aSk7XG5cbiAgICAvLyBlbWl0IHN1Y2Nlc3Mgb3IgZmFpbHVyZSBldmVudCBpZiB3ZSBoYXZlIGxpc3RlbmVyc1xuICAgIGlmIChlcnJvciAmJiBqb2Iub3B0aW9ucy5ub3RpZnlGYWlsdXJlKSB7XG4gICAgICB0aGlzLmNvcmUucHVic3ViLnB1Ymxpc2goam9iLm9wdGlvbnMubm90aWZ5RmFpbHVyZSwgdGhpcy5fY3JlYXRlSm9iRXZlbnQoZXJyb3IsIGRhdGEsIGpvYikpO1xuICAgIH0gZWxzZSBpZiAoam9iLm9wdGlvbnMubm90aWZ5U3VjY2Vzcykge1xuICAgICAgdGhpcy5jb3JlLnB1YnN1Yi5wdWJsaXNoKGpvYi5vcHRpb25zLm5vdGlmeVN1Y2Nlc3MsIHRoaXMuX2NyZWF0ZUpvYkV2ZW50KGVycm9yLCBkYXRhLCBqb2IpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgbXVsdGkuZXhlYyhlcnJNdWx0aSA9PiB7XG4gICAgICAgIGlmIChlcnJNdWx0aSkgcmV0dXJuIHJlamVjdChlcnJNdWx0aSk7XG4gICAgICAgIHJldHVybiByZXNvbHZlKHsgc3RhdHVzLCByZXN1bHQ6IGVycm9yIHx8IGRhdGEgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb21wbGV0ZXMgYSBtdWx0aSBqb2Igb3IgY29udGludWVzIHRvIHRoZSBuZXh0IHN0YWdlLlxuICAgKiBAcGFyYW0gZXJyb3JcbiAgICogQHBhcmFtIGRhdGFcbiAgICogQHBhcmFtIGpvYlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX1cbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9maW5pc2hSZWxheUpvYihlcnJvciwgZGF0YSwgam9iKSB7XG4gICAgbGV0IG5leHRRdWV1ZSA9IHRoaXMubmFtZTtcbiAgICBjb25zdCBuZXh0Sm9iID0gam9iLmRhdGEucnVuc1swXTtcbiAgICBjb25zdCBtdWx0aSA9IHRoaXMuY2xpZW50Lm11bHRpKCk7XG4gICAgY29uc3QgY3VycmVudEpvYiA9IGpvYi5kYXRhLnJ1bnMuc2hpZnQoKTtcbiAgICBjb25zdCBzdGF0dXMgPSBlcnJvciA/ICdmYWlsZWQnIDogJ3N1Y2NlZWRlZCc7XG5cbiAgICAvLyBrZWVwIGEgcmVjb3JkIG9mIHRoZSBmaXJzdCBqb2IgaW4gdGhpcyByZWxheSBpbnN0YW5jZVxuICAgIGlmICgham9iLmRhdGEuaW5pdGlhbEpvYikge1xuICAgICAgam9iLmRhdGEuaW5pdGlhbEpvYiA9IHRyeUpTT05QYXJzZShqb2IudG9EYXRhKCkpO1xuICAgIH1cblxuICAgIC8vIGtlZXAgYSByZWNvcmQgb2YgdGhlIGZpcnN0IHF1ZXVlIGluIHRoaXMgcmVsYXkgaW5zdGFuY2VcbiAgICBpZiAoIWpvYi5kYXRhLmluaXRpYWxRdWV1ZSkge1xuICAgICAgam9iLmRhdGEuaW5pdGlhbFF1ZXVlID0gdGhpcy5uYW1lO1xuICAgIH1cblxuICAgIHRoaXMuX3VwZGF0ZUpvYlN0YXR1cyhlcnJvciwgZGF0YSwgam9iLCBtdWx0aSk7XG5cbiAgICAvLyBjaGVjayBpZiB3ZSBuZWVkIHRvIHJlbGF5IHRvIGFub3RoZXIgam9iXG4gICAgaWYgKCEoam9iLmRhdGEucnVucy5sZW5ndGggPT09IDAgfHwgISFlcnJvcikpIHtcbiAgICAgIGlmIChpc09iamVjdChuZXh0Sm9iKSkge1xuICAgICAgICBuZXh0UXVldWUgPSBuZXh0Sm9iLnF1ZXVlO1xuICAgICAgICBqb2IuZGF0YS5ydW5zWzBdID0gbmV4dEpvYi5ydW5zO1xuICAgICAgfSBlbHNlIGlmIChqb2IuZGF0YS5pbml0aWFsUXVldWUpIHtcbiAgICAgICAgbmV4dFF1ZXVlID0gam9iLmRhdGEuaW5pdGlhbFF1ZXVlO1xuICAgICAgfVxuXG4gICAgICAvLyBhZGQgc29tZSBkZWJ1ZyBkYXRhIGZvciB0aGUgbmV4dCBqb2JcbiAgICAgIC8vIHNvIGl0IGNhbiB0ZWxsIHdoZXJlIHRoZSByZWxheSBvcmlnaW5hdGVkIGZyb21cbiAgICAgIGpvYi5kYXRhLmZyb21fam9iID0gY3VycmVudEpvYjtcbiAgICAgIGpvYi5kYXRhLmZyb21fcXVldWUgPSB0aGlzLm5hbWU7XG4gICAgICBqb2IuZGF0YS5mcm9tX3RpbWVzdGFtcCA9IGdldFRpbWVTdGFtcCgpO1xuICAgICAgLy8gcmVsYXkgcmVzb2x2ZWQgZGF0YVxuICAgICAgam9iLmRhdGEuZGF0YSA9IGRhdGE7XG5cbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvcmUuaG9va3Muam9iLmNyZWF0ZShuZXh0UXVldWUsIGpvYi5kYXRhKS50aGVuKCgpID0+IHtcbiAgICAgICAgICBtdWx0aS5leGVjKGVyck11bHRpID0+IHtcbiAgICAgICAgICAgIGlmIChlcnJNdWx0aSkgcmV0dXJuIHJlamVjdChlcnJNdWx0aSk7XG4gICAgICAgICAgICByZXR1cm4gcmVzb2x2ZSh7IHN0YXR1cywgcmVzdWx0OiBlcnJvciB8fCBkYXRhIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIHdlJ3ZlIGp1c3QgZmluaXNoZWQgdGhlIGxhc3Qgam9iIGluIHRoZSByZWxheVxuICAgIC8vIGVtaXQgc3VjY2VzcyBvciBmYWlsdXJlIGV2ZW50IGlmIHdlIGhhdmUgbGlzdGVuZXJzXG4gICAgaWYgKGVycm9yICYmIGpvYi5kYXRhLmluaXRpYWxKb2Iub3B0aW9ucy5ub3RpZnlGYWlsdXJlKSB7XG4gICAgICB0aGlzLmNvcmUucHVic3ViLnB1Ymxpc2goam9iLmRhdGEuaW5pdGlhbEpvYi5vcHRpb25zLm5vdGlmeUZhaWx1cmUsIHRoaXMuX2NyZWF0ZUpvYkV2ZW50KGVycm9yLCBkYXRhLCBqb2IpKTtcbiAgICB9IGVsc2UgaWYgKGpvYi5kYXRhLmluaXRpYWxKb2Iub3B0aW9ucy5ub3RpZnlTdWNjZXNzKSB7XG4gICAgICB0aGlzLmNvcmUucHVic3ViLnB1Ymxpc2goam9iLmRhdGEuaW5pdGlhbEpvYi5vcHRpb25zLm5vdGlmeVN1Y2Nlc3MsIHRoaXMuX2NyZWF0ZUpvYkV2ZW50KGVycm9yLCBkYXRhLCBqb2IpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgcmV0dXJuIG11bHRpLmV4ZWMoZXJyTXVsdGkgPT4ge1xuICAgICAgICBpZiAoZXJyTXVsdGkpIHJldHVybiByZWplY3QoZXJyTXVsdGkpO1xuICAgICAgICByZXR1cm4gcmVzb2x2ZSh7IHN0YXR1cywgcmVzdWx0OiBlcnJvciB8fCBkYXRhIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9vbkxvY2FsVGlja0NvbXBsZXRlID0gKCkgPT4ge1xuICAgIHRoaXMucnVubmluZy0tO1xuICAgIHRoaXMucXVldWVkLS07XG4gICAgaWYgKCF0aGlzLm9wdGlvbnMudGhyb3R0bGUpIHJldHVybiBzZXRJbW1lZGlhdGUodGhpcy5fcXVldWVUaWNrKTtcblxuICAgIHJldHVybiB0aGlzLmNsaWVudC50aHJvdHRsZShcbiAgICAgIHRoaXMudG9LZXkoJ3Rocm90dGxlJyksXG4gICAgICB0aGlzLm9wdGlvbnMudGhyb3R0bGUubGltaXQsXG4gICAgICB0aGlzLm9wdGlvbnMudGhyb3R0bGUuc2Vjb25kc1xuICAgICkudGhlbih0aHJvdHRsZSA9PiB7XG4gICAgICBjb25zdCBzaG91bGRUaHJvdHRsZSA9IHRocm90dGxlWzBdID09PSAxO1xuICAgICAgaWYgKCFzaG91bGRUaHJvdHRsZSkge1xuICAgICAgICB0aGlzLnRocm90dGxlZCA9IGZhbHNlO1xuICAgICAgICByZXR1cm4gc2V0SW1tZWRpYXRlKHRoaXMuX3F1ZXVlVGljayk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMudGhyb3R0bGVkID0gdHJ1ZTtcbiAgICAgIGNvbnN0IHRpbWVSZW1haW5pbmcgPSAodGhyb3R0bGVbMl0gPT09IDAgPyAxIDogdGhyb3R0bGVbMl0pO1xuICAgICAgdGhpcy5sb2cudmVyYm9zZShgJyR7dGhpcy5uYW1lfScgcXVldWUgIHJlYWNoZWQgaXQncyB0aHJvdHRsZSBsaW1pdCwgcmVzdW1pbmcgaW4gJHt0aW1lUmVtYWluaW5nfSBzZWNvbmRzLmApO1xuICAgICAgcmV0dXJuIHNldFRpbWVvdXQodGhpcy5fcXVldWVUaWNrLCB0aW1lUmVtYWluaW5nICogMTAwMCk7XG4gICAgfSkuY2F0Y2godGhpcy5fcXVldWVUaWNrKTtcbiAgfTtcblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIGVycm9yXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfb25Mb2NhbFRpY2tFcnJvciA9IChlcnJvcikgPT4ge1xuICAgIHRoaXMucXVldWVkLS07XG4gICAgdGhpcy5sb2cuZXJyb3IoZXJyb3IpO1xuICAgIHNldEltbWVkaWF0ZSh0aGlzLl9xdWV1ZVRpY2spO1xuICB9O1xuXG4gIF90aHJvdHRsZVF1ZXVlID0gKCkgPT4ge1xuXG4gIH07XG5cbiAgLyoqXG4gICAqXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX3F1ZXVlVGljayA9ICgpID0+IHtcbiAgICBpZiAodGhpcy5wYXVzZWQgfHwgIXRoaXMub3B0aW9ucy5lbmFibGVkKSB7XG4gICAgICByZXR1cm4gdm9pZCAwO1xuICAgIH1cbiAgICB0aGlzLnF1ZXVlZCsrO1xuICAgIHJldHVybiB0aGlzXG4gICAgICAuX2dldE5leHRKb2IoKVxuICAgICAgLnRoZW4oam9iID0+IHtcbiAgICAgICAgdGhpcy5ydW5uaW5nKys7XG4gICAgICAgIC8vIHF1ZXVlIG1vcmUgam9icyBpZiB3aXRoaW4gbGltaXRcbiAgICAgICAgaWYgKCh0aGlzLnJ1bm5pbmcgKyB0aGlzLnF1ZXVlZCkgPCB0aGlzLm9wdGlvbnMuY29uY3VycmVuY3kpIHtcbiAgICAgICAgICAvLyBjb25jdXJyZW5jeSBpcyBhIGxpdHRsZSBwb2ludGxlc3MgcmlnaHQgbm93IGlmIHdlJ3JlIHRocm90dGxpbmcgam9ic1xuICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLnRocm90dGxlKSBzZXRJbW1lZGlhdGUodGhpcy5fcXVldWVUaWNrKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLl9ydW5Kb2Ioam9iKS50aGVuKHRoaXMuX29uTG9jYWxUaWNrQ29tcGxldGUpLmNhdGNoKHRoaXMuX29uTG9jYWxUaWNrQ29tcGxldGUpO1xuICAgICAgfSkuY2F0Y2godGhpcy5fb25Mb2NhbFRpY2tFcnJvcik7XG4gIH07XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfcmVzdGFydFByb2Nlc3NpbmcgPSAoKSA9PiB7XG4gICAgdGhpcy5jbGllbnRzLmJsb2NrLm9uY2UoJ3JlYWR5JywgdGhpcy5fcXVldWVUaWNrKTtcbiAgfTtcblxuICAvKipcbiAgICogU3RhcnQgdGhlIHF1ZXVlLlxuICAgKi9cbiAgYmVnaW5Xb3JraW5nKCkge1xuICAgIGlmICh0aGlzLnN0YXJ0ZWQgfHwgIXRoaXMub3B0aW9ucy5lbmFibGVkKSB7XG4gICAgICB0aGlzLmxvZy5pbmZvKGBRdWV1ZSAke3RoaXMubmFtZX0gaXMgY3VycmVudGx5IGRpc2FibGVkLmApO1xuICAgICAgcmV0dXJuIHZvaWQgMDtcbiAgICB9XG5cbiAgICB0aGlzLnF1ZXVlZCA9IDA7XG4gICAgdGhpcy5ydW5uaW5nID0gMDtcbiAgICB0aGlzLnN0YXJ0ZWQgPSB0cnVlO1xuXG4gICAgdGhpcy5sb2cudmVyYm9zZShgUXVldWUgJyR7dGhpcy5uYW1lfScgLSBzdGFydGVkIHdpdGggYSBjb25jdXJyZW5jeSBvZiAke3RoaXMub3B0aW9ucy5jb25jdXJyZW5jeX0uYCk7XG5cbiAgICB0aGlzLmNsaWVudHMuYmxvY2sub25jZSgnZXJyb3InLCB0aGlzLl9yZXN0YXJ0UHJvY2Vzc2luZyk7XG4gICAgdGhpcy5jbGllbnRzLmJsb2NrLm9uY2UoJ2Nsb3NlJywgdGhpcy5fcmVzdGFydFByb2Nlc3NpbmcpO1xuXG4gICAgdGhpcy5jaGVja1N0YWxsZWRKb2JzKCkudGhlbigoKSA9PiB7XG4gICAgICB0aGlzLmxvZy52ZXJib3NlKCdjaGVja1N0YWxsZWRKb2JzIGNvbXBsZXRlZCcpO1xuICAgIH0pLmNhdGNoKCgpID0+IHtcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzLl9xdWV1ZVRpY2soKTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGNoZWNrU3RhbGxlZEpvYnMoKSB7XG4gICAgdGhpcy5sb2cudmVyYm9zZSgnY2hlY2tTdGFsbGVkSm9icycpO1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5jaGVja3N0YWxsZWRqb2JzKFxuICAgICAgdGhpcy50b0tleSgnc3RhbGxUaW1lJyksXG4gICAgICB0aGlzLnRvS2V5KCdzdGFsbGluZycpLFxuICAgICAgdGhpcy50b0tleSgnd2FpdGluZycpLFxuICAgICAgdGhpcy50b0tleSgnYWN0aXZlJyksXG4gICAgICBnZXRUaW1lU3RhbXAoKSxcbiAgICAgIHRoaXMub3B0aW9ucy5zdGFsbEludGVydmFsXG4gICAgKS50aGVuKCgpID0+IHtcbiAgICAgIGlmICghdGhpcy5vcHRpb25zLmVuYWJsZWQgfHwgdGhpcy5wYXVzZWQpIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgIHJldHVybiBQcm9taXNlLmRlbGF5KHRoaXMub3B0aW9ucy5zdGFsbEludGVydmFsKS50aGVuKHRoaXMuY2hlY2tTdGFsbGVkSm9icyk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHN0clxuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIHRvS2V5KHN0cikge1xuICAgIGlmICh0aGlzLmNvcmUuY2x1c3Rlci5pc0NsdXN0ZXIoKSkge1xuICAgICAgcmV0dXJuIGAke3RoaXMub3B0aW9ucy5rZXlQcmVmaXh9Onske3RoaXMubmFtZX19OiR7c3RyfWA7XG4gICAgfVxuICAgIHJldHVybiBgJHt0aGlzLm9wdGlvbnMua2V5UHJlZml4fToke3RoaXMubmFtZX06JHtzdHJ9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgdGhlIGV2ZW50UHJlZml4IHRvIGFuIGV2ZW50IG5hbWVcbiAgICogQHBhcmFtIGV2ZW50TmFtZVxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgdG9FdmVudE5hbWUgPSBldmVudE5hbWUgPT4gYHF1ZXVlOiR7dGhpcy5uYW1lfToke2V2ZW50TmFtZX1gO1xufVxuIl19

@@ -142,4 +142,118 @@ "use strict";

`
},
throttle: {
keys: 1,
lua: `
--[[
key 1 -> key name - ip, user id or some unique key to throttle X by
arg 1 -> limit
arg 2 -> seconds
returns {
throttled: -> 1 if should throttle, 0 if still within limit
remaining: -> how many reqs left until throttled,
ttl: -> seconds remaining until limit resets
}
]]
local count = redis.call('INCR', KEYS[1])
local ttl = redis.call('ttl', KEYS[1])
local remaining = tonumber(ARGV[1]) - count
if count == 1 or ttl == -1 then
redis.call('EXPIRE', KEYS[1], ARGV[2])
end
if ttl == -1 then
ttl = tonumber(ARGV[2])
end
if count > tonumber(ARGV[1]) then
return {1, 0, ttl}
end
if remaining == 0 then
return {1, 0, ttl}
end
return {0, remaining, ttl}
`
},
pThrottle: {
keys: 1,
lua: `
--[[
key 1 -> key name - ip, user id or some unique key to throttle X by
arg 1 -> limit
arg 2 -> milliseconds
returns 0 if request is ok
returns 1 if request denied
]]
local count = redis.call('INCR', KEYS[1])
local pttl = redis.call('pttl',KEYS[1])
local remaining = tonumber(ARGV[1]) - count
if count == 1 or pttl == -1 then
redis.call('PEXPIRE', KEYS[1], ARGV[2])
end
if pttl == -1 then
pttl = tonumber(ARGV[2])
end
if count > tonumber(ARGV[1]) then
return {1,0,pttl}
end
if remaining == 0 then
return {1, 0, pttl}
end
return {0, remaining, pttl}
`
},
throttleNoIncr: {
keys: 1,
lua: `
--[[
key 1 -> key name - ip, user id or some unique key to throttle X by
arg 1 -> limit
arg 2 -> seconds
returns 0/1
]]
if redis.call('exists',KEYS[1]) > 0 then
local currentVal = tonumber(redis.call('get',KEYS[1]))
if currentVal >= tonumber(ARGV[1]) then
return 1
else
redis.call('incr',KEYS[1])
return 0
end
else
redis.call('setex',KEYS[1], tonumber(ARGV[2]), 1)
return 0
end
`
},
throttleDecr: {
keys: 1,
lua: `
--[[
key 1 -> key name - ip, user id or some unique key to throttle X by
returns 0/1
]]
if redis.call('exists',KEYS[1]) > 0 then
redis.call('decr',KEYS[1])
return 1
else
return 1
end
`
}
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9zY3JpcHRzLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7a0JBMEJlOztBQUViLFVBQVE7QUFDTixVQUFNLENBREE7QUFFTixTQUFLOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7SUFBQTtBQUZDLEdBRks7O0FBcUNiLG9CQUFrQjtBQUNoQixVQUFNLENBRFU7QUFFaEIsU0FBSzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQUFBO0FBRlcsR0FyQ0w7O0FBcUZiLGFBQVc7QUFDVCxVQUFNLENBREc7QUFFVCxTQUFLOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lBQUE7QUFGSTtBQXJGRSxDIiwiZmlsZSI6InNjcmlwdHMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqXG4gKiBUaGUgTUlUIExpY2Vuc2UgKE1JVClcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYgU2FsYWthclxuICpcbiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbiAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbiAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbiAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbiAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbiAqXG4gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGxcbiAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4gKlxuICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbiAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbiAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4gKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRVxuICogU09GVFdBUkUuXG4gKlxuICovXG5cbmV4cG9ydCBkZWZhdWx0IHtcblxuICBhZGRKb2I6IHtcbiAgICBrZXlzOiAzLFxuICAgIGx1YTogYFxuICAgICAgICAtLVtbXG4gICAgICAgIGtleSAxIC0+IHJhYjpqb2I6bmFtZTpqb2JzXG4gICAgICAgIGtleSAyIC0+IHJhYjpqb2I6bmFtZTp3YWl0aW5nXG4gICAgICAgIGtleSAzIC0+IHJhYjpqb2I6bmFtZTppZCAoam9iIElEIGNvdW50ZXIpXG4gICAgICAgIGFyZyAxIC0+IGpvYiBkYXRhXG4gICAgICAgIGFyZyAyIC0+IHNob3VsZCBiZSB1bmlxdWU/XG4gICAgICAgIGFyZyAzIC0+IGN1c3RvbUlkXG4gICAgICAgIF1dXG5cbiAgICAgICAgbG9jYWwgam9iSWQgPSBBUkdWWzNdXG5cbiAgICAgICAgaWYgam9iSWQgPT0gXCJcIiB0aGVuXG4gICAgICAgICAgam9iSWQgPSByZWRpcy5jYWxsKFwiaW5jclwiLCBLRVlTWzNdKVxuICAgICAgICBlbmRcblxuICAgICAgICAtLSBpZiB1bmlxdWUgZW5hYmxlZFxuICAgICAgICBpZiBBUkdWWzJdID09IFwidHJ1ZVwiIHRoZW5cbiAgICAgICAgICBsb2NhbCBleGlzdHMgPSByZWRpcy5jYWxsKFwiaHNldG54XCIsIEtFWVNbMV0sIGpvYklkLCBBUkdWWzFdKVxuICAgICAgICAgIGlmIGV4aXN0cyA9PSAxIHRoZW5cbiAgICAgICAgICAgIHJlZGlzLmNhbGwoXCJscHVzaFwiLCBLRVlTWzJdLCBqb2JJZClcbiAgICAgICAgICAgIHJldHVybiBqb2JJZFxuICAgICAgICAgIGVuZFxuICAgICAgICAgIHJldHVybiAwXG4gICAgICAgIGVsc2VcbiAgICAgICAgICAtLSBpZiBub3QgdW5pcXVlIGVuYWJsZWRcbiAgICAgICAgICByZWRpcy5jYWxsKFwiaHNldFwiLCBLRVlTWzFdLCBqb2JJZCwgQVJHVlsxXSlcbiAgICAgICAgICByZWRpcy5jYWxsKFwibHB1c2hcIiwgS0VZU1syXSwgam9iSWQpXG4gICAgICAgICAgcmV0dXJuIGpvYklkXG4gICAgICAgIGVuZFxuICAgIGAsXG4gIH0sXG5cbiAgY2hlY2tTdGFsbGVkSm9iczoge1xuICAgIGtleXM6IDQsXG4gICAgbHVhOiBgXG4gICAgICAgIC0tW1tcbiAgICAgICAga2V5IDEgLT4gcmFiOmpvYjpuYW1lOnN0YWxsVGltZVxuICAgICAgICBrZXkgMiAtPiByYWI6am9iOm5hbWU6c3RhbGxpbmdcbiAgICAgICAga2V5IDMgLT4gcmFiOmpvYjpuYW1lOndhaXRpbmdcbiAgICAgICAga2V5IDQgLT4gcmFiOmpvYjpuYW1lOmFjdGl2ZVxuICAgICAgICBhcmcgMSAtPiBtcyB0aW1lc3RhbXAgKFwibm93XCIpXG4gICAgICAgIGFyZyAyIC0+IG1zIHN0YWxsSW50ZXJ2YWxcblxuICAgICAgICByZXR1cm5zIHtyZXNldEpvYklkMSwgcmVzZXRKb2JJZDIsIC4uLn1cblxuICAgICAgICB3b3JrZXJzIGFyZSByZXNwb25zaWJsZSBmb3IgcmVtb3ZpbmcgdGhlaXIgam9iSWQgZnJvbSB0aGUgc3RhbGxpbmcgc2V0IGV2ZXJ5IHN0YWxsSW50ZXJ2YWwgbXNcbiAgICAgICAgaWYgYSBqb2JJZCBpcyBub3QgcmVtb3ZlZCBmcm9tIHRoZSBzdGFsbGluZyBzZXQgd2l0aGluIGEgc3RhbGxJbnRlcnZhbCB3aW5kb3csXG4gICAgICAgIHdlIGFzc3VtZSB0aGUgam9iIGhhcyBzdGFsbGVkIGFuZCBzaG91bGQgYmUgcmVzZXQgKG1vdmVkIGZyb20gYWN0aXZlIGJhY2sgdG8gd2FpdGluZylcbiAgICAgICAgLS1dXVxuXG4gICAgICAgIGxvY2FsIG5vdyA9IHRvbnVtYmVyKEFSR1ZbMV0pXG4gICAgICAgIGxvY2FsIHN0YWxsVGltZSA9IHRvbnVtYmVyKHJlZGlzLmNhbGwoXCJnZXRcIiwgS0VZU1sxXSkgb3IgMClcblxuICAgICAgICBpZiBub3cgPCBzdGFsbFRpbWUgdGhlblxuICAgICAgICAgIC0tIGhhc24ndCBiZWVuIGxvbmcgZW5vdWdoIChzdGFsbEludGVydmFsKSBzaW5jZSBsYXN0IGNoZWNrXG4gICAgICAgICAgcmV0dXJuIDBcbiAgICAgICAgZW5kXG5cbiAgICAgICAgLS0gcmVzZXQgYW55IHN0YWxsaW5nIGpvYnMgYnkgbW92aW5nIGZyb20gYWN0aXZlIHRvIHdhaXRpbmdcbiAgICAgICAgbG9jYWwgc3RhbGxpbmcgPSByZWRpcy5jYWxsKFwic21lbWJlcnNcIiwgS0VZU1syXSlcbiAgICAgICAgaWYgI3N0YWxsaW5nID4gMCB0aGVuXG4gICAgICAgICAgcmVkaXMuY2FsbChcInJwdXNoXCIsIEtFWVNbM10sIHVucGFjayhzdGFsbGluZykpXG4gICAgICAgICAgZm9yIGkgPSAxLCAjc3RhbGxpbmcgZG9cbiAgICAgICAgICAgIHJlZGlzLmNhbGwoXCJscmVtXCIsIEtFWVNbNF0sIDAsIHN0YWxsaW5nW2ldKVxuICAgICAgICAgIGVuZFxuICAgICAgICAgIHJlZGlzLmNhbGwoXCJkZWxcIiwgS0VZU1syXSlcbiAgICAgICAgZW5kXG5cbiAgICAgICAgLS0gY29weSBjdXJyZW50bHkgYWN0aXZlIGpvYnMgaW50byBzdGFsbGluZyBzZXRcbiAgICAgICAgbG9jYWwgYWN0aXZlcyA9IHJlZGlzLmNhbGwoXCJscmFuZ2VcIiwgS0VZU1s0XSwgMCwgLTEpXG4gICAgICAgIGlmICNhY3RpdmVzID4gMCB0aGVuXG4gICAgICAgICAgcmVkaXMuY2FsbChcInNhZGRcIiwgS0VZU1syXSwgdW5wYWNrKGFjdGl2ZXMpKVxuICAgICAgICBlbmRcblxuICAgICAgICByZWRpcy5jYWxsKFwic2V0XCIsIEtFWVNbMV0sIG5vdyArIEFSR1ZbMl0pXG5cbiAgICAgICAgcmV0dXJuIHN0YWxsaW5nXG4gICAgYCxcbiAgfSxcblxuICByZW1vdmVKb2I6IHtcbiAgICBrZXlzOiA2LFxuICAgIGx1YTogYFxuICAgICAgICAtLVtbXG4gICAgICAgIGtleSAxIC0+IHJhYjpqb2I6dGVzdDpzdWNjZWVkZWRcbiAgICAgICAga2V5IDIgLT4gcmFiOmpvYjp0ZXN0OmZhaWxlZFxuICAgICAgICBrZXkgMyAtPiByYWI6am9iOnRlc3Q6d2FpdGluZ1xuICAgICAgICBrZXkgNCAtPiByYWI6am9iOnRlc3Q6YWN0aXZlXG4gICAgICAgIGtleSA1IC0+IHJhYjpqb2I6dGVzdDpzdGFsbGluZ1xuICAgICAgICBrZXkgNiAtPiByYWI6am9iOnRlc3Q6am9ic1xuICAgICAgICBhcmcgMSAtPiBqb2JJZFxuICAgICAgICBdXVxuXG4gICAgICAgIGxvY2FsIGpvYklkID0gQVJHVlsxXVxuXG4gICAgICAgIGlmIChyZWRpcy5jYWxsKFwic2lzbWVtYmVyXCIsIEtFWVNbMV0sIGpvYklkKSArIHJlZGlzLmNhbGwoXCJzaXNtZW1iZXJcIiwgS0VZU1syXSwgam9iSWQpKSA9PSAwIHRoZW5cbiAgICAgICAgICByZWRpcy5jYWxsKFwibHJlbVwiLCBLRVlTWzNdLCAwLCBqb2JJZClcbiAgICAgICAgICByZWRpcy5jYWxsKFwibHJlbVwiLCBLRVlTWzRdLCAwLCBqb2JJZClcbiAgICAgICAgZW5kXG5cbiAgICAgICAgcmVkaXMuY2FsbChcInNyZW1cIiwgS0VZU1sxXSwgam9iSWQpXG4gICAgICAgIHJlZGlzLmNhbGwoXCJzcmVtXCIsIEtFWVNbMl0sIGpvYklkKVxuICAgICAgICByZWRpcy5jYWxsKFwic3JlbVwiLCBLRVlTWzVdLCBqb2JJZClcbiAgICAgICAgcmVkaXMuY2FsbChcImhkZWxcIiwgS0VZU1s2XSwgam9iSWQpXG4gICAgYCxcbiAgfSxcbn07XG4iXX0=
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9zY3JpcHRzLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7a0JBMEJlOztBQUViLFVBQVE7QUFDTixVQUFNLENBREE7QUFFTixTQUFLOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7SUFBQTtBQUZDLEdBRks7O0FBcUNiLG9CQUFrQjtBQUNoQixVQUFNLENBRFU7QUFFaEIsU0FBSzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQUFBO0FBRlcsR0FyQ0w7O0FBcUZiLGFBQVc7QUFDVCxVQUFNLENBREc7QUFFVCxTQUFLOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lBQUE7QUFGSSxHQXJGRTs7QUFnSGIsWUFBVTtBQUNSLFVBQU0sQ0FERTtBQUVSLFNBQUs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztFQUFBO0FBRkcsR0FoSEc7O0FBc0piLGFBQVc7QUFDVCxVQUFNLENBREc7QUFFVCxTQUFLOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7RUFBQTtBQUZJLEdBdEpFOztBQXlMYixrQkFBZ0I7QUFDZCxVQUFNLENBRFE7QUFFZCxTQUFLOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lBQUE7QUFGUyxHQXpMSDs7QUFpTmIsZ0JBQWM7QUFDWixVQUFNLENBRE07QUFFWixTQUFLOzs7Ozs7Ozs7Ozs7SUFBQTtBQUZPO0FBak5ELEMiLCJmaWxlIjoic2NyaXB0cy5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICpcbiAqIFRoZSBNSVQgTGljZW5zZSAoTUlUKVxuICpcbiAqIENvcHlyaWdodCAoYykgMjAxNiBTYWxha2FyXG4gKlxuICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4gKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuICpcbiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbFxuICogY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbiAqXG4gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4gKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbiAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFXG4gKiBTT0ZUV0FSRS5cbiAqXG4gKi9cblxuZXhwb3J0IGRlZmF1bHQge1xuXG4gIGFkZEpvYjoge1xuICAgIGtleXM6IDMsXG4gICAgbHVhOiBgXG4gICAgICAgIC0tW1tcbiAgICAgICAga2V5IDEgLT4gcmFiOmpvYjpuYW1lOmpvYnNcbiAgICAgICAga2V5IDIgLT4gcmFiOmpvYjpuYW1lOndhaXRpbmdcbiAgICAgICAga2V5IDMgLT4gcmFiOmpvYjpuYW1lOmlkIChqb2IgSUQgY291bnRlcilcbiAgICAgICAgYXJnIDEgLT4gam9iIGRhdGFcbiAgICAgICAgYXJnIDIgLT4gc2hvdWxkIGJlIHVuaXF1ZT9cbiAgICAgICAgYXJnIDMgLT4gY3VzdG9tSWRcbiAgICAgICAgXV1cblxuICAgICAgICBsb2NhbCBqb2JJZCA9IEFSR1ZbM11cblxuICAgICAgICBpZiBqb2JJZCA9PSBcIlwiIHRoZW5cbiAgICAgICAgICBqb2JJZCA9IHJlZGlzLmNhbGwoXCJpbmNyXCIsIEtFWVNbM10pXG4gICAgICAgIGVuZFxuXG4gICAgICAgIC0tIGlmIHVuaXF1ZSBlbmFibGVkXG4gICAgICAgIGlmIEFSR1ZbMl0gPT0gXCJ0cnVlXCIgdGhlblxuICAgICAgICAgIGxvY2FsIGV4aXN0cyA9IHJlZGlzLmNhbGwoXCJoc2V0bnhcIiwgS0VZU1sxXSwgam9iSWQsIEFSR1ZbMV0pXG4gICAgICAgICAgaWYgZXhpc3RzID09IDEgdGhlblxuICAgICAgICAgICAgcmVkaXMuY2FsbChcImxwdXNoXCIsIEtFWVNbMl0sIGpvYklkKVxuICAgICAgICAgICAgcmV0dXJuIGpvYklkXG4gICAgICAgICAgZW5kXG4gICAgICAgICAgcmV0dXJuIDBcbiAgICAgICAgZWxzZVxuICAgICAgICAgIC0tIGlmIG5vdCB1bmlxdWUgZW5hYmxlZFxuICAgICAgICAgIHJlZGlzLmNhbGwoXCJoc2V0XCIsIEtFWVNbMV0sIGpvYklkLCBBUkdWWzFdKVxuICAgICAgICAgIHJlZGlzLmNhbGwoXCJscHVzaFwiLCBLRVlTWzJdLCBqb2JJZClcbiAgICAgICAgICByZXR1cm4gam9iSWRcbiAgICAgICAgZW5kXG4gICAgYCxcbiAgfSxcblxuICBjaGVja1N0YWxsZWRKb2JzOiB7XG4gICAga2V5czogNCxcbiAgICBsdWE6IGBcbiAgICAgICAgLS1bW1xuICAgICAgICBrZXkgMSAtPiByYWI6am9iOm5hbWU6c3RhbGxUaW1lXG4gICAgICAgIGtleSAyIC0+IHJhYjpqb2I6bmFtZTpzdGFsbGluZ1xuICAgICAgICBrZXkgMyAtPiByYWI6am9iOm5hbWU6d2FpdGluZ1xuICAgICAgICBrZXkgNCAtPiByYWI6am9iOm5hbWU6YWN0aXZlXG4gICAgICAgIGFyZyAxIC0+IG1zIHRpbWVzdGFtcCAoXCJub3dcIilcbiAgICAgICAgYXJnIDIgLT4gbXMgc3RhbGxJbnRlcnZhbFxuXG4gICAgICAgIHJldHVybnMge3Jlc2V0Sm9iSWQxLCByZXNldEpvYklkMiwgLi4ufVxuXG4gICAgICAgIHdvcmtlcnMgYXJlIHJlc3BvbnNpYmxlIGZvciByZW1vdmluZyB0aGVpciBqb2JJZCBmcm9tIHRoZSBzdGFsbGluZyBzZXQgZXZlcnkgc3RhbGxJbnRlcnZhbCBtc1xuICAgICAgICBpZiBhIGpvYklkIGlzIG5vdCByZW1vdmVkIGZyb20gdGhlIHN0YWxsaW5nIHNldCB3aXRoaW4gYSBzdGFsbEludGVydmFsIHdpbmRvdyxcbiAgICAgICAgd2UgYXNzdW1lIHRoZSBqb2IgaGFzIHN0YWxsZWQgYW5kIHNob3VsZCBiZSByZXNldCAobW92ZWQgZnJvbSBhY3RpdmUgYmFjayB0byB3YWl0aW5nKVxuICAgICAgICAtLV1dXG5cbiAgICAgICAgbG9jYWwgbm93ID0gdG9udW1iZXIoQVJHVlsxXSlcbiAgICAgICAgbG9jYWwgc3RhbGxUaW1lID0gdG9udW1iZXIocmVkaXMuY2FsbChcImdldFwiLCBLRVlTWzFdKSBvciAwKVxuXG4gICAgICAgIGlmIG5vdyA8IHN0YWxsVGltZSB0aGVuXG4gICAgICAgICAgLS0gaGFzbid0IGJlZW4gbG9uZyBlbm91Z2ggKHN0YWxsSW50ZXJ2YWwpIHNpbmNlIGxhc3QgY2hlY2tcbiAgICAgICAgICByZXR1cm4gMFxuICAgICAgICBlbmRcblxuICAgICAgICAtLSByZXNldCBhbnkgc3RhbGxpbmcgam9icyBieSBtb3ZpbmcgZnJvbSBhY3RpdmUgdG8gd2FpdGluZ1xuICAgICAgICBsb2NhbCBzdGFsbGluZyA9IHJlZGlzLmNhbGwoXCJzbWVtYmVyc1wiLCBLRVlTWzJdKVxuICAgICAgICBpZiAjc3RhbGxpbmcgPiAwIHRoZW5cbiAgICAgICAgICByZWRpcy5jYWxsKFwicnB1c2hcIiwgS0VZU1szXSwgdW5wYWNrKHN0YWxsaW5nKSlcbiAgICAgICAgICBmb3IgaSA9IDEsICNzdGFsbGluZyBkb1xuICAgICAgICAgICAgcmVkaXMuY2FsbChcImxyZW1cIiwgS0VZU1s0XSwgMCwgc3RhbGxpbmdbaV0pXG4gICAgICAgICAgZW5kXG4gICAgICAgICAgcmVkaXMuY2FsbChcImRlbFwiLCBLRVlTWzJdKVxuICAgICAgICBlbmRcblxuICAgICAgICAtLSBjb3B5IGN1cnJlbnRseSBhY3RpdmUgam9icyBpbnRvIHN0YWxsaW5nIHNldFxuICAgICAgICBsb2NhbCBhY3RpdmVzID0gcmVkaXMuY2FsbChcImxyYW5nZVwiLCBLRVlTWzRdLCAwLCAtMSlcbiAgICAgICAgaWYgI2FjdGl2ZXMgPiAwIHRoZW5cbiAgICAgICAgICByZWRpcy5jYWxsKFwic2FkZFwiLCBLRVlTWzJdLCB1bnBhY2soYWN0aXZlcykpXG4gICAgICAgIGVuZFxuXG4gICAgICAgIHJlZGlzLmNhbGwoXCJzZXRcIiwgS0VZU1sxXSwgbm93ICsgQVJHVlsyXSlcblxuICAgICAgICByZXR1cm4gc3RhbGxpbmdcbiAgICBgLFxuICB9LFxuXG4gIHJlbW92ZUpvYjoge1xuICAgIGtleXM6IDYsXG4gICAgbHVhOiBgXG4gICAgICAgIC0tW1tcbiAgICAgICAga2V5IDEgLT4gcmFiOmpvYjp0ZXN0OnN1Y2NlZWRlZFxuICAgICAgICBrZXkgMiAtPiByYWI6am9iOnRlc3Q6ZmFpbGVkXG4gICAgICAgIGtleSAzIC0+IHJhYjpqb2I6dGVzdDp3YWl0aW5nXG4gICAgICAgIGtleSA0IC0+IHJhYjpqb2I6dGVzdDphY3RpdmVcbiAgICAgICAga2V5IDUgLT4gcmFiOmpvYjp0ZXN0OnN0YWxsaW5nXG4gICAgICAgIGtleSA2IC0+IHJhYjpqb2I6dGVzdDpqb2JzXG4gICAgICAgIGFyZyAxIC0+IGpvYklkXG4gICAgICAgIF1dXG5cbiAgICAgICAgbG9jYWwgam9iSWQgPSBBUkdWWzFdXG5cbiAgICAgICAgaWYgKHJlZGlzLmNhbGwoXCJzaXNtZW1iZXJcIiwgS0VZU1sxXSwgam9iSWQpICsgcmVkaXMuY2FsbChcInNpc21lbWJlclwiLCBLRVlTWzJdLCBqb2JJZCkpID09IDAgdGhlblxuICAgICAgICAgIHJlZGlzLmNhbGwoXCJscmVtXCIsIEtFWVNbM10sIDAsIGpvYklkKVxuICAgICAgICAgIHJlZGlzLmNhbGwoXCJscmVtXCIsIEtFWVNbNF0sIDAsIGpvYklkKVxuICAgICAgICBlbmRcblxuICAgICAgICByZWRpcy5jYWxsKFwic3JlbVwiLCBLRVlTWzFdLCBqb2JJZClcbiAgICAgICAgcmVkaXMuY2FsbChcInNyZW1cIiwgS0VZU1syXSwgam9iSWQpXG4gICAgICAgIHJlZGlzLmNhbGwoXCJzcmVtXCIsIEtFWVNbNV0sIGpvYklkKVxuICAgICAgICByZWRpcy5jYWxsKFwiaGRlbFwiLCBLRVlTWzZdLCBqb2JJZClcbiAgICBgLFxuICB9LFxuXG4gIHRocm90dGxlOiB7XG4gICAga2V5czogMSxcbiAgICBsdWE6IGBcbiAgICAgICAgLS1bW1xuICAgICAgICAgIGtleSAxIC0+IGtleSBuYW1lIC0gaXAsIHVzZXIgaWQgb3Igc29tZSB1bmlxdWUga2V5IHRvIHRocm90dGxlIFggYnlcbiAgICAgICAgICBhcmcgMSAtPiBsaW1pdFxuICAgICAgICAgIGFyZyAyIC0+IHNlY29uZHNcbiAgICAgICAgICByZXR1cm5zIHtcbiAgICAgICAgICAgIHRocm90dGxlZDogLT4gIDEgaWYgc2hvdWxkIHRocm90dGxlLCAwIGlmIHN0aWxsIHdpdGhpbiBsaW1pdFxuICAgICAgICAgICAgcmVtYWluaW5nOiAtPiAgaG93IG1hbnkgcmVxcyBsZWZ0IHVudGlsIHRocm90dGxlZCxcbiAgICAgICAgICAgIHR0bDogICAgICAgLT4gIHNlY29uZHMgcmVtYWluaW5nIHVudGlsIGxpbWl0IHJlc2V0c1xuICAgICAgICAgIH1cbiAgICAgICAgXV1cbiAgICAgICAgXG4gICAgICAgIGxvY2FsIGNvdW50ID0gcmVkaXMuY2FsbCgnSU5DUicsIEtFWVNbMV0pXG4gICAgICAgIGxvY2FsIHR0bCA9IHJlZGlzLmNhbGwoJ3R0bCcsIEtFWVNbMV0pXG4gICAgICAgIGxvY2FsIHJlbWFpbmluZyA9IHRvbnVtYmVyKEFSR1ZbMV0pIC0gY291bnRcbiAgICAgICAgXG4gICAgICAgIGlmIGNvdW50ID09IDEgb3IgdHRsID09IC0xIHRoZW5cbiAgICAgICAgICByZWRpcy5jYWxsKCdFWFBJUkUnLCBLRVlTWzFdLCBBUkdWWzJdKVxuICAgICAgICBlbmRcbiAgICAgICAgXG4gICAgICAgIGlmIHR0bCA9PSAtMSB0aGVuXG4gICAgICAgICAgdHRsID0gdG9udW1iZXIoQVJHVlsyXSlcbiAgICAgICAgZW5kXG4gICAgICAgIFxuICAgICAgICBpZiBjb3VudCA+IHRvbnVtYmVyKEFSR1ZbMV0pIHRoZW5cbiAgICAgICAgICByZXR1cm4gezEsIDAsIHR0bH1cbiAgICAgICAgZW5kXG4gICAgICAgIFxuICAgICAgICBpZiByZW1haW5pbmcgPT0gMCB0aGVuXG4gICAgICAgICAgcmV0dXJuIHsxLCAwLCB0dGx9XG4gICAgICAgIGVuZFxuICAgICAgICBcbiAgICAgICAgcmV0dXJuIHswLCByZW1haW5pbmcsIHR0bH1cbiAgYCxcbiAgfSxcblxuICBwVGhyb3R0bGU6IHtcbiAgICBrZXlzOiAxLFxuICAgIGx1YTogYFxuICAgICAgICAtLVtbXG4gICAgICAgICAga2V5IDEgLT4ga2V5IG5hbWUgLSBpcCwgdXNlciBpZCBvciBzb21lIHVuaXF1ZSBrZXkgdG8gdGhyb3R0bGUgWCBieVxuICAgICAgICAgIGFyZyAxIC0+IGxpbWl0XG4gICAgICAgICAgYXJnIDIgLT4gbWlsbGlzZWNvbmRzXG4gICAgICAgICAgcmV0dXJucyAwIGlmIHJlcXVlc3QgaXMgb2tcbiAgICAgICAgICByZXR1cm5zIDEgaWYgcmVxdWVzdCBkZW5pZWRcbiAgICAgICAgXV1cbiAgICAgICAgXG4gICAgICAgIGxvY2FsIGNvdW50ID0gcmVkaXMuY2FsbCgnSU5DUicsIEtFWVNbMV0pXG4gICAgICAgIGxvY2FsIHB0dGwgPSByZWRpcy5jYWxsKCdwdHRsJyxLRVlTWzFdKVxuICAgICAgICBsb2NhbCByZW1haW5pbmcgPSB0b251bWJlcihBUkdWWzFdKSAtIGNvdW50XG5cbiAgICAgICAgaWYgY291bnQgPT0gMSBvciBwdHRsID09IC0xIHRoZW5cbiAgICAgICAgICByZWRpcy5jYWxsKCdQRVhQSVJFJywgS0VZU1sxXSwgQVJHVlsyXSlcbiAgICAgICAgZW5kXG4gICAgICAgIFxuICAgICAgICBpZiBwdHRsID09IC0xIHRoZW5cbiAgICAgICAgICBwdHRsID0gdG9udW1iZXIoQVJHVlsyXSlcbiAgICAgICAgZW5kXG4gICAgICAgIFxuICAgICAgICBpZiBjb3VudCA+IHRvbnVtYmVyKEFSR1ZbMV0pIHRoZW5cbiAgICAgICAgICByZXR1cm4gezEsMCxwdHRsfVxuICAgICAgICBlbmRcbiAgICAgICAgXG4gICAgICAgIGlmIHJlbWFpbmluZyA9PSAwIHRoZW5cbiAgICAgICAgICByZXR1cm4gezEsIDAsIHB0dGx9XG4gICAgICAgIGVuZFxuICAgICAgICBcbiAgICAgICAgcmV0dXJuIHswLCByZW1haW5pbmcsIHB0dGx9XG4gIGAsXG4gIH0sXG5cbiAgdGhyb3R0bGVOb0luY3I6IHtcbiAgICBrZXlzOiAxLFxuICAgIGx1YTogYFxuICAgICAgICAtLVtbXG4gICAgICAgICAga2V5IDEgLT4ga2V5IG5hbWUgLSBpcCwgdXNlciBpZCBvciBzb21lIHVuaXF1ZSBrZXkgdG8gdGhyb3R0bGUgWCBieVxuICAgICAgICAgIGFyZyAxIC0+IGxpbWl0XG4gICAgICAgICAgYXJnIDIgLT4gc2Vjb25kc1xuICAgICAgICAgIHJldHVybnMgMC8xXG4gICAgICAgIF1dXG4gICAgICAgIGlmIHJlZGlzLmNhbGwoJ2V4aXN0cycsS0VZU1sxXSkgPiAwIHRoZW5cbiAgICAgICAgICBsb2NhbCBjdXJyZW50VmFsID0gdG9udW1iZXIocmVkaXMuY2FsbCgnZ2V0JyxLRVlTWzFdKSlcbiAgICAgICAgICBpZiBjdXJyZW50VmFsID49IHRvbnVtYmVyKEFSR1ZbMV0pIHRoZW5cbiAgICAgICAgICAgICByZXR1cm4gMVxuICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICByZWRpcy5jYWxsKCdpbmNyJyxLRVlTWzFdKVxuICAgICAgICAgICAgIHJldHVybiAwXG4gICAgICAgICAgZW5kXG4gICAgICAgIGVsc2VcbiAgICAgICAgICByZWRpcy5jYWxsKCdzZXRleCcsS0VZU1sxXSwgdG9udW1iZXIoQVJHVlsyXSksIDEpXG4gICAgICAgICAgcmV0dXJuIDBcbiAgICAgICAgZW5kXG4gICAgYCxcbiAgfSxcblxuICB0aHJvdHRsZURlY3I6IHtcbiAgICBrZXlzOiAxLFxuICAgIGx1YTogYFxuICAgICAgICAtLVtbXG4gICAgICAgICAga2V5IDEgLT4ga2V5IG5hbWUgLSBpcCwgdXNlciBpZCBvciBzb21lIHVuaXF1ZSBrZXkgdG8gdGhyb3R0bGUgWCBieVxuICAgICAgICAgIHJldHVybnMgMC8xXG4gICAgICAgIF1dXG4gICAgXG4gICAgICAgIGlmIHJlZGlzLmNhbGwoJ2V4aXN0cycsS0VZU1sxXSkgPiAwIHRoZW5cbiAgICAgICAgICByZWRpcy5jYWxsKCdkZWNyJyxLRVlTWzFdKVxuICAgICAgICAgIHJldHVybiAxXG4gICAgICAgIGVsc2VcbiAgICAgICAgICByZXR1cm4gMVxuICAgICAgICBlbmRcbiAgICBgLFxuICB9LFxufTtcbiJdfQ==
{
"name": "redibox-hook-job",
"description": "Advanced redibox powered jobs and queues",
"version": "1.0.3",
"version": "1.1.0",
"main": "lib/index.js",

@@ -43,12 +43,12 @@ "author": "Mike Diarmid",

"devDependencies": {
"babel-cli": "^6.8.0",
"babel-eslint": "^6.0.4",
"babel-istanbul": "^0.8.0",
"babel-plugin-add-module-exports": "^0.1.2",
"babel-plugin-transform-class-properties": "^6.8.0",
"babel-cli": "^6.10.1",
"babel-eslint": "^6.1.0",
"babel-istanbul": "^0.11.0",
"babel-plugin-add-module-exports": "^0.2.1",
"babel-plugin-transform-class-properties": "^6.10.2",
"babel-preset-es2015": "^6.6.0",
"babel-preset-es2015-node-auto": "0.0.4",
"babel-preset-es2015-node-auto": "0.0.5",
"babel-preset-es2015-node4": "^2.1.0",
"babel-preset-es2015-node5": "^1.2.0",
"babel-preset-es2015-node6": "^0.1.3",
"babel-preset-es2015-node6": "^0.2.0",
"babel-preset-stage-0": "^6.5.0",

@@ -58,15 +58,15 @@ "benchmark": "^2.1.0",

"coveralls": "^2.11.9",
"eslint": "^2.9.0",
"eslint-config-airbnb": "^8.0.0",
"eslint-plugin-import": "^1.6.1",
"eslint-plugin-jsx-a11y": "^1.0.4",
"eslint-plugin-react": "^5.0.1",
"eslint": "^2.13.1",
"eslint-config-airbnb": "^9.0.1",
"eslint-plugin-import": "^1.9.2",
"eslint-plugin-jsx-a11y": "^1.5.3",
"eslint-plugin-react": "^5.2.2",
"isparta": "^4.0.0",
"istanbul": "^1.0.0-alpha.2",
"istanbul": "^1.1.0-alpha.1",
"mocha": "^2.4.5",
"redibox": "^2.0.1",
"redibox": "^2.1.0",
"sinon": "^1.17.4"
},
"dependencies": {
"bluebird": "^3.3.5",
"bluebird": "^3.4.1",
"cuid": "^1.3.8",

@@ -73,0 +73,0 @@ "eventemitter3": "^1.2.0"

@@ -1,1 +0,23 @@

## RediBox Job
## RediBox Job Hook
High performance, robust and flexible queue/worker system powered by redis.
**DOCS ARE TODO**🙈
#### Current features
- **Queues**. Jobs can be divided into queues you specify - no pre-determined queues such as 'PriorityQueue', just configure them the way you like it.
- **Concurrency**. Queues can be configured to concurrently run jobs, concurrency can either be per worker or across all workers.
- **Throttling**. Queues can be configured to throttle the number of jobs processed over a time period, e.g. 100 jobs per 10 seconds.
- **Relay/Chained Jobs**. A relay job allows you to automatically follow a specified chain of jobs and relay the result of each job to the next job in the chain, or abort the relay mid chain with the option of sending the final result back to wherever you created the job.
- **Jobs Anywhere**. Flexibility to create jobs anywhere, e.g. create a Job on your public api server and have your separate worker farm process it, automatically return the result right back to were you created the Job, send the result back as your api response and... profit?
- This hook can be configured to run in 'job provider' only mode, no queues, no excess processing, just there to create jobs for somewhere else to consume.
- **Best Practice Implementation**. We use lua scripts for atomic operations and blocking ops such as `BLPOPRPUSH` to get queued items.
- *Surprisingly other libraries such as [Automattic/Kue](https://github.com/Automattic/kue/issues/688#issuecomment-142372665) don't do this correctly and therefore heavily impact on performance / opens them up to race conditions*.
- **Cluster and Sentinel support**. We use `ioredis` and built this implementation with a 'cluster-first' mentality, keys are correctly tagged for slots etc.
- **Easy Redis access inside job runners**. Job runners when called with a job are provided with the full RediBox utility belt and any hooks you configured. A job that creates a job that creates a relay job and creates another job from the relay response - why not? *(insert YO DAWG meme)*
- **Job Uniqueness**. Jobs can be set as 'unique', upon which it's id becomes the sha1sum of the data you provided, any duplicate jobs with the same unique flag will get rejected.
- **Job Timeouts**. Job timeouts can be set on a per job or per queue basis. Parent relay jobs are set to the timeout value provided multiplied by the number of jobs in the chain.
- **Job Retries**. Jobs by default are not retried but this can be changed on a per job basis.
- **Resumes on crash**. Should your node process crash then the queues will pick up and retry any jobs that were running on crash.

@@ -19,4 +19,11 @@ global.HOOK_NAME = 'job';

queues: [
{ name: 'test', concurrency: 5 },
{ name: 'test2', concurrency: 10 },
{
name: 'test2',
concurrency: 5,
// throttle: {
// limit: 2,
// seconds: 10,
// },
},
{ name: 'test', concurrency: 10 },
],

@@ -92,3 +99,5 @@ },

},
}).timeout(2000).unique(true).onSuccess((result) => { console.dir(result)});
}).timeout(2000).unique(true).onSuccess((result) => {
console.dir(result)
});
});

@@ -95,0 +104,0 @@ });