File: D:/HostingSpaces/SBogers10/reiskick.komma.nl/wwwroot/js/site/app.js
(window["webpackJsonp"] = window["webpackJsonp"] || []).push([["/js/site/app"],{
/***/ "./node_modules/@sentry/browser/esm/backend.js":
/*!*****************************************************!*\
!*** ./node_modules/@sentry/browser/esm/backend.js ***!
\*****************************************************/
/*! exports provided: BrowserBackend */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "BrowserBackend", function() { return BrowserBackend; });
/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.js");
/* harmony import */ var _sentry_core__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @sentry/core */ "./node_modules/@sentry/core/esm/index.js");
/* harmony import */ var _sentry_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @sentry/types */ "./node_modules/@sentry/types/esm/index.js");
/* harmony import */ var _sentry_utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @sentry/utils */ "./node_modules/@sentry/utils/esm/index.js");
/* harmony import */ var _eventbuilder__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./eventbuilder */ "./node_modules/@sentry/browser/esm/eventbuilder.js");
/* harmony import */ var _transports__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./transports */ "./node_modules/@sentry/browser/esm/transports/index.js");
/**
* The Sentry Browser SDK Backend.
* @hidden
*/
var BrowserBackend = /** @class */ (function (_super) {
tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](BrowserBackend, _super);
function BrowserBackend() {
return _super !== null && _super.apply(this, arguments) || this;
}
/**
* @inheritDoc
*/
BrowserBackend.prototype._setupTransport = function () {
if (!this._options.dsn) {
// We return the noop transport here in case there is no Dsn.
return _super.prototype._setupTransport.call(this);
}
var transportOptions = tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({}, this._options.transportOptions, { dsn: this._options.dsn });
if (this._options.transport) {
return new this._options.transport(transportOptions);
}
if (Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_3__["supportsFetch"])()) {
return new _transports__WEBPACK_IMPORTED_MODULE_5__["FetchTransport"](transportOptions);
}
return new _transports__WEBPACK_IMPORTED_MODULE_5__["XHRTransport"](transportOptions);
};
/**
* @inheritDoc
*/
BrowserBackend.prototype.eventFromException = function (exception, hint) {
var syntheticException = (hint && hint.syntheticException) || undefined;
var event = Object(_eventbuilder__WEBPACK_IMPORTED_MODULE_4__["eventFromUnknownInput"])(exception, syntheticException, {
attachStacktrace: this._options.attachStacktrace,
});
Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_3__["addExceptionMechanism"])(event, {
handled: true,
type: 'generic',
});
event.level = _sentry_types__WEBPACK_IMPORTED_MODULE_2__["Severity"].Error;
if (hint && hint.event_id) {
event.event_id = hint.event_id;
}
return _sentry_utils__WEBPACK_IMPORTED_MODULE_3__["SyncPromise"].resolve(event);
};
/**
* @inheritDoc
*/
BrowserBackend.prototype.eventFromMessage = function (message, level, hint) {
if (level === void 0) { level = _sentry_types__WEBPACK_IMPORTED_MODULE_2__["Severity"].Info; }
var syntheticException = (hint && hint.syntheticException) || undefined;
var event = Object(_eventbuilder__WEBPACK_IMPORTED_MODULE_4__["eventFromString"])(message, syntheticException, {
attachStacktrace: this._options.attachStacktrace,
});
event.level = level;
if (hint && hint.event_id) {
event.event_id = hint.event_id;
}
return _sentry_utils__WEBPACK_IMPORTED_MODULE_3__["SyncPromise"].resolve(event);
};
return BrowserBackend;
}(_sentry_core__WEBPACK_IMPORTED_MODULE_1__["BaseBackend"]));
//# sourceMappingURL=backend.js.map
/***/ }),
/***/ "./node_modules/@sentry/browser/esm/client.js":
/*!****************************************************!*\
!*** ./node_modules/@sentry/browser/esm/client.js ***!
\****************************************************/
/*! exports provided: BrowserClient */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "BrowserClient", function() { return BrowserClient; });
/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.js");
/* harmony import */ var _sentry_core__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @sentry/core */ "./node_modules/@sentry/core/esm/index.js");
/* harmony import */ var _sentry_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @sentry/utils */ "./node_modules/@sentry/utils/esm/index.js");
/* harmony import */ var _backend__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./backend */ "./node_modules/@sentry/browser/esm/backend.js");
/* harmony import */ var _integrations__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./integrations */ "./node_modules/@sentry/browser/esm/integrations/index.js");
/* harmony import */ var _version__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./version */ "./node_modules/@sentry/browser/esm/version.js");
/**
* The Sentry Browser SDK Client.
*
* @see BrowserOptions for documentation on configuration options.
* @see SentryClient for usage documentation.
*/
var BrowserClient = /** @class */ (function (_super) {
tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](BrowserClient, _super);
/**
* Creates a new Browser SDK instance.
*
* @param options Configuration options for this SDK.
*/
function BrowserClient(options) {
if (options === void 0) { options = {}; }
return _super.call(this, _backend__WEBPACK_IMPORTED_MODULE_3__["BrowserBackend"], options) || this;
}
/**
* @inheritDoc
*/
BrowserClient.prototype._prepareEvent = function (event, scope, hint) {
event.platform = event.platform || 'javascript';
event.sdk = tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({}, event.sdk, { name: _version__WEBPACK_IMPORTED_MODULE_5__["SDK_NAME"], packages: tslib__WEBPACK_IMPORTED_MODULE_0__["__spread"](((event.sdk && event.sdk.packages) || []), [
{
name: 'npm:@sentry/browser',
version: _version__WEBPACK_IMPORTED_MODULE_5__["SDK_VERSION"],
},
]), version: _version__WEBPACK_IMPORTED_MODULE_5__["SDK_VERSION"] });
return _super.prototype._prepareEvent.call(this, event, scope, hint);
};
/**
* @inheritDoc
*/
BrowserClient.prototype._sendEvent = function (event) {
var integration = this.getIntegration(_integrations__WEBPACK_IMPORTED_MODULE_4__["Breadcrumbs"]);
if (integration) {
integration.addSentryBreadcrumb(event);
}
_super.prototype._sendEvent.call(this, event);
};
/**
* Show a report dialog to the user to send feedback to a specific event.
*
* @param options Set individual options for the dialog
*/
BrowserClient.prototype.showReportDialog = function (options) {
if (options === void 0) { options = {}; }
// doesn't work without a document (React Native)
var document = Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_2__["getGlobalObject"])().document;
if (!document) {
return;
}
if (!this._isEnabled()) {
_sentry_utils__WEBPACK_IMPORTED_MODULE_2__["logger"].error('Trying to call showReportDialog with Sentry Client is disabled');
return;
}
var dsn = options.dsn || this.getDsn();
if (!options.eventId) {
_sentry_utils__WEBPACK_IMPORTED_MODULE_2__["logger"].error('Missing `eventId` option in showReportDialog call');
return;
}
if (!dsn) {
_sentry_utils__WEBPACK_IMPORTED_MODULE_2__["logger"].error('Missing `Dsn` option in showReportDialog call');
return;
}
var script = document.createElement('script');
script.async = true;
script.src = new _sentry_core__WEBPACK_IMPORTED_MODULE_1__["API"](dsn).getReportDialogEndpoint(options);
if (options.onLoad) {
script.onload = options.onLoad;
}
(document.head || document.body).appendChild(script);
};
return BrowserClient;
}(_sentry_core__WEBPACK_IMPORTED_MODULE_1__["BaseClient"]));
//# sourceMappingURL=client.js.map
/***/ }),
/***/ "./node_modules/@sentry/browser/esm/eventbuilder.js":
/*!**********************************************************!*\
!*** ./node_modules/@sentry/browser/esm/eventbuilder.js ***!
\**********************************************************/
/*! exports provided: eventFromUnknownInput, eventFromString */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "eventFromUnknownInput", function() { return eventFromUnknownInput; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "eventFromString", function() { return eventFromString; });
/* harmony import */ var _sentry_utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @sentry/utils */ "./node_modules/@sentry/utils/esm/index.js");
/* harmony import */ var _parsers__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./parsers */ "./node_modules/@sentry/browser/esm/parsers.js");
/* harmony import */ var _tracekit__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./tracekit */ "./node_modules/@sentry/browser/esm/tracekit.js");
/** JSDoc */
function eventFromUnknownInput(exception, syntheticException, options) {
if (options === void 0) { options = {}; }
var event;
if (Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_0__["isErrorEvent"])(exception) && exception.error) {
// If it is an ErrorEvent with `error` property, extract it to get actual Error
var errorEvent = exception;
exception = errorEvent.error; // tslint:disable-line:no-parameter-reassignment
event = Object(_parsers__WEBPACK_IMPORTED_MODULE_1__["eventFromStacktrace"])(Object(_tracekit__WEBPACK_IMPORTED_MODULE_2__["computeStackTrace"])(exception));
return event;
}
if (Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_0__["isDOMError"])(exception) || Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_0__["isDOMException"])(exception)) {
// If it is a DOMError or DOMException (which are legacy APIs, but still supported in some browsers)
// then we just extract the name and message, as they don't provide anything else
// https://developer.mozilla.org/en-US/docs/Web/API/DOMError
// https://developer.mozilla.org/en-US/docs/Web/API/DOMException
var domException = exception;
var name_1 = domException.name || (Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_0__["isDOMError"])(domException) ? 'DOMError' : 'DOMException');
var message = domException.message ? name_1 + ": " + domException.message : name_1;
event = eventFromString(message, syntheticException, options);
Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_0__["addExceptionTypeValue"])(event, message);
return event;
}
if (Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_0__["isError"])(exception)) {
// we have a real Error object, do nothing
event = Object(_parsers__WEBPACK_IMPORTED_MODULE_1__["eventFromStacktrace"])(Object(_tracekit__WEBPACK_IMPORTED_MODULE_2__["computeStackTrace"])(exception));
return event;
}
if (Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_0__["isPlainObject"])(exception) || Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_0__["isEvent"])(exception)) {
// If it is plain Object or Event, serialize it manually and extract options
// This will allow us to group events based on top-level keys
// which is much better than creating new group when any key/value change
var objectException = exception;
event = Object(_parsers__WEBPACK_IMPORTED_MODULE_1__["eventFromPlainObject"])(objectException, syntheticException, options.rejection);
Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_0__["addExceptionMechanism"])(event, {
synthetic: true,
});
return event;
}
// If none of previous checks were valid, then it means that it's not:
// - an instance of DOMError
// - an instance of DOMException
// - an instance of Event
// - an instance of Error
// - a valid ErrorEvent (one with an error property)
// - a plain Object
//
// So bail out and capture it as a simple message:
event = eventFromString(exception, syntheticException, options);
Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_0__["addExceptionTypeValue"])(event, "" + exception, undefined);
Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_0__["addExceptionMechanism"])(event, {
synthetic: true,
});
return event;
}
// this._options.attachStacktrace
/** JSDoc */
function eventFromString(input, syntheticException, options) {
if (options === void 0) { options = {}; }
var event = {
message: input,
};
if (options.attachStacktrace && syntheticException) {
var stacktrace = Object(_tracekit__WEBPACK_IMPORTED_MODULE_2__["computeStackTrace"])(syntheticException);
var frames_1 = Object(_parsers__WEBPACK_IMPORTED_MODULE_1__["prepareFramesForEvent"])(stacktrace.stack);
event.stacktrace = {
frames: frames_1,
};
}
return event;
}
//# sourceMappingURL=eventbuilder.js.map
/***/ }),
/***/ "./node_modules/@sentry/browser/esm/exports.js":
/*!*****************************************************!*\
!*** ./node_modules/@sentry/browser/esm/exports.js ***!
\*****************************************************/
/*! exports provided: Severity, Status, addGlobalEventProcessor, addBreadcrumb, captureException, captureEvent, captureMessage, configureScope, getHubFromCarrier, getCurrentHub, Hub, Scope, startTransaction, setContext, setExtra, setExtras, setTag, setTags, setUser, withScope, BrowserClient, defaultIntegrations, forceLoad, init, lastEventId, onLoad, showReportDialog, flush, close, wrap, SDK_NAME, SDK_VERSION */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _sentry_types__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @sentry/types */ "./node_modules/@sentry/types/esm/index.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Severity", function() { return _sentry_types__WEBPACK_IMPORTED_MODULE_0__["Severity"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Status", function() { return _sentry_types__WEBPACK_IMPORTED_MODULE_0__["Status"]; });
/* harmony import */ var _sentry_core__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @sentry/core */ "./node_modules/@sentry/core/esm/index.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "addGlobalEventProcessor", function() { return _sentry_core__WEBPACK_IMPORTED_MODULE_1__["addGlobalEventProcessor"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "addBreadcrumb", function() { return _sentry_core__WEBPACK_IMPORTED_MODULE_1__["addBreadcrumb"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "captureException", function() { return _sentry_core__WEBPACK_IMPORTED_MODULE_1__["captureException"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "captureEvent", function() { return _sentry_core__WEBPACK_IMPORTED_MODULE_1__["captureEvent"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "captureMessage", function() { return _sentry_core__WEBPACK_IMPORTED_MODULE_1__["captureMessage"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "configureScope", function() { return _sentry_core__WEBPACK_IMPORTED_MODULE_1__["configureScope"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getHubFromCarrier", function() { return _sentry_core__WEBPACK_IMPORTED_MODULE_1__["getHubFromCarrier"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getCurrentHub", function() { return _sentry_core__WEBPACK_IMPORTED_MODULE_1__["getCurrentHub"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Hub", function() { return _sentry_core__WEBPACK_IMPORTED_MODULE_1__["Hub"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Scope", function() { return _sentry_core__WEBPACK_IMPORTED_MODULE_1__["Scope"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "startTransaction", function() { return _sentry_core__WEBPACK_IMPORTED_MODULE_1__["startTransaction"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "setContext", function() { return _sentry_core__WEBPACK_IMPORTED_MODULE_1__["setContext"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "setExtra", function() { return _sentry_core__WEBPACK_IMPORTED_MODULE_1__["setExtra"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "setExtras", function() { return _sentry_core__WEBPACK_IMPORTED_MODULE_1__["setExtras"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "setTag", function() { return _sentry_core__WEBPACK_IMPORTED_MODULE_1__["setTag"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "setTags", function() { return _sentry_core__WEBPACK_IMPORTED_MODULE_1__["setTags"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "setUser", function() { return _sentry_core__WEBPACK_IMPORTED_MODULE_1__["setUser"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "withScope", function() { return _sentry_core__WEBPACK_IMPORTED_MODULE_1__["withScope"]; });
/* harmony import */ var _client__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./client */ "./node_modules/@sentry/browser/esm/client.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "BrowserClient", function() { return _client__WEBPACK_IMPORTED_MODULE_2__["BrowserClient"]; });
/* harmony import */ var _sdk__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./sdk */ "./node_modules/@sentry/browser/esm/sdk.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "defaultIntegrations", function() { return _sdk__WEBPACK_IMPORTED_MODULE_3__["defaultIntegrations"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "forceLoad", function() { return _sdk__WEBPACK_IMPORTED_MODULE_3__["forceLoad"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "init", function() { return _sdk__WEBPACK_IMPORTED_MODULE_3__["init"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "lastEventId", function() { return _sdk__WEBPACK_IMPORTED_MODULE_3__["lastEventId"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "onLoad", function() { return _sdk__WEBPACK_IMPORTED_MODULE_3__["onLoad"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "showReportDialog", function() { return _sdk__WEBPACK_IMPORTED_MODULE_3__["showReportDialog"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "flush", function() { return _sdk__WEBPACK_IMPORTED_MODULE_3__["flush"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "close", function() { return _sdk__WEBPACK_IMPORTED_MODULE_3__["close"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "wrap", function() { return _sdk__WEBPACK_IMPORTED_MODULE_3__["wrap"]; });
/* harmony import */ var _version__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./version */ "./node_modules/@sentry/browser/esm/version.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "SDK_NAME", function() { return _version__WEBPACK_IMPORTED_MODULE_4__["SDK_NAME"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "SDK_VERSION", function() { return _version__WEBPACK_IMPORTED_MODULE_4__["SDK_VERSION"]; });
//# sourceMappingURL=exports.js.map
/***/ }),
/***/ "./node_modules/@sentry/browser/esm/helpers.js":
/*!*****************************************************!*\
!*** ./node_modules/@sentry/browser/esm/helpers.js ***!
\*****************************************************/
/*! exports provided: shouldIgnoreOnError, ignoreNextOnError, wrap */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "shouldIgnoreOnError", function() { return shouldIgnoreOnError; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ignoreNextOnError", function() { return ignoreNextOnError; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "wrap", function() { return wrap; });
/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.js");
/* harmony import */ var _sentry_core__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @sentry/core */ "./node_modules/@sentry/core/esm/index.js");
/* harmony import */ var _sentry_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @sentry/utils */ "./node_modules/@sentry/utils/esm/index.js");
var ignoreOnError = 0;
/**
* @hidden
*/
function shouldIgnoreOnError() {
return ignoreOnError > 0;
}
/**
* @hidden
*/
function ignoreNextOnError() {
// onerror should trigger before setTimeout
ignoreOnError += 1;
setTimeout(function () {
ignoreOnError -= 1;
});
}
/**
* Instruments the given function and sends an event to Sentry every time the
* function throws an exception.
*
* @param fn A function to wrap.
* @returns The wrapped function.
* @hidden
*/
function wrap(fn, options, before) {
if (options === void 0) { options = {}; }
// tslint:disable-next-line:strict-type-predicates
if (typeof fn !== 'function') {
return fn;
}
try {
// We don't wanna wrap it twice
if (fn.__sentry__) {
return fn;
}
// If this has already been wrapped in the past, return that wrapped function
if (fn.__sentry_wrapped__) {
return fn.__sentry_wrapped__;
}
}
catch (e) {
// Just accessing custom props in some Selenium environments
// can cause a "Permission denied" exception (see raven-js#495).
// Bail on wrapping and return the function as-is (defers to window.onerror).
return fn;
}
var sentryWrapped = function () {
var args = Array.prototype.slice.call(arguments);
// tslint:disable:no-unsafe-any
try {
// tslint:disable-next-line:strict-type-predicates
if (before && typeof before === 'function') {
before.apply(this, arguments);
}
var wrappedArguments = args.map(function (arg) { return wrap(arg, options); });
if (fn.handleEvent) {
// Attempt to invoke user-land function
// NOTE: If you are a Sentry user, and you are seeing this stack frame, it
// means the sentry.javascript SDK caught an error invoking your application code. This
// is expected behavior and NOT indicative of a bug with sentry.javascript.
return fn.handleEvent.apply(this, wrappedArguments);
}
// Attempt to invoke user-land function
// NOTE: If you are a Sentry user, and you are seeing this stack frame, it
// means the sentry.javascript SDK caught an error invoking your application code. This
// is expected behavior and NOT indicative of a bug with sentry.javascript.
return fn.apply(this, wrappedArguments);
// tslint:enable:no-unsafe-any
}
catch (ex) {
ignoreNextOnError();
Object(_sentry_core__WEBPACK_IMPORTED_MODULE_1__["withScope"])(function (scope) {
scope.addEventProcessor(function (event) {
var processedEvent = tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({}, event);
if (options.mechanism) {
Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_2__["addExceptionTypeValue"])(processedEvent, undefined, undefined);
Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_2__["addExceptionMechanism"])(processedEvent, options.mechanism);
}
processedEvent.extra = tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({}, processedEvent.extra, { arguments: args });
return processedEvent;
});
Object(_sentry_core__WEBPACK_IMPORTED_MODULE_1__["captureException"])(ex);
});
throw ex;
}
};
// Accessing some objects may throw
// ref: https://github.com/getsentry/sentry-javascript/issues/1168
try {
for (var property in fn) {
if (Object.prototype.hasOwnProperty.call(fn, property)) {
sentryWrapped[property] = fn[property];
}
}
}
catch (_oO) { } // tslint:disable-line:no-empty
fn.prototype = fn.prototype || {};
sentryWrapped.prototype = fn.prototype;
Object.defineProperty(fn, '__sentry_wrapped__', {
enumerable: false,
value: sentryWrapped,
});
// Signal that this function has been wrapped/filled already
// for both debugging and to prevent it to being wrapped/filled twice
Object.defineProperties(sentryWrapped, {
__sentry__: {
enumerable: false,
value: true,
},
__sentry_original__: {
enumerable: false,
value: fn,
},
});
// Restore original function name (not all browsers allow that)
try {
var descriptor = Object.getOwnPropertyDescriptor(sentryWrapped, 'name');
if (descriptor.configurable) {
Object.defineProperty(sentryWrapped, 'name', {
get: function () {
return fn.name;
},
});
}
}
catch (_oO) {
/*no-empty*/
}
return sentryWrapped;
}
//# sourceMappingURL=helpers.js.map
/***/ }),
/***/ "./node_modules/@sentry/browser/esm/index.js":
/*!***************************************************!*\
!*** ./node_modules/@sentry/browser/esm/index.js ***!
\***************************************************/
/*! exports provided: Severity, Status, addGlobalEventProcessor, addBreadcrumb, captureException, captureEvent, captureMessage, configureScope, getHubFromCarrier, getCurrentHub, Hub, Scope, startTransaction, setContext, setExtra, setExtras, setTag, setTags, setUser, withScope, BrowserClient, defaultIntegrations, forceLoad, init, lastEventId, onLoad, showReportDialog, flush, close, wrap, SDK_NAME, SDK_VERSION, Integrations, Transports */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Integrations", function() { return INTEGRATIONS; });
/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.js");
/* harmony import */ var _exports__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./exports */ "./node_modules/@sentry/browser/esm/exports.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Severity", function() { return _exports__WEBPACK_IMPORTED_MODULE_1__["Severity"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Status", function() { return _exports__WEBPACK_IMPORTED_MODULE_1__["Status"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "addGlobalEventProcessor", function() { return _exports__WEBPACK_IMPORTED_MODULE_1__["addGlobalEventProcessor"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "addBreadcrumb", function() { return _exports__WEBPACK_IMPORTED_MODULE_1__["addBreadcrumb"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "captureException", function() { return _exports__WEBPACK_IMPORTED_MODULE_1__["captureException"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "captureEvent", function() { return _exports__WEBPACK_IMPORTED_MODULE_1__["captureEvent"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "captureMessage", function() { return _exports__WEBPACK_IMPORTED_MODULE_1__["captureMessage"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "configureScope", function() { return _exports__WEBPACK_IMPORTED_MODULE_1__["configureScope"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getHubFromCarrier", function() { return _exports__WEBPACK_IMPORTED_MODULE_1__["getHubFromCarrier"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getCurrentHub", function() { return _exports__WEBPACK_IMPORTED_MODULE_1__["getCurrentHub"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Hub", function() { return _exports__WEBPACK_IMPORTED_MODULE_1__["Hub"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Scope", function() { return _exports__WEBPACK_IMPORTED_MODULE_1__["Scope"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "startTransaction", function() { return _exports__WEBPACK_IMPORTED_MODULE_1__["startTransaction"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "setContext", function() { return _exports__WEBPACK_IMPORTED_MODULE_1__["setContext"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "setExtra", function() { return _exports__WEBPACK_IMPORTED_MODULE_1__["setExtra"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "setExtras", function() { return _exports__WEBPACK_IMPORTED_MODULE_1__["setExtras"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "setTag", function() { return _exports__WEBPACK_IMPORTED_MODULE_1__["setTag"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "setTags", function() { return _exports__WEBPACK_IMPORTED_MODULE_1__["setTags"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "setUser", function() { return _exports__WEBPACK_IMPORTED_MODULE_1__["setUser"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "withScope", function() { return _exports__WEBPACK_IMPORTED_MODULE_1__["withScope"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "BrowserClient", function() { return _exports__WEBPACK_IMPORTED_MODULE_1__["BrowserClient"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "defaultIntegrations", function() { return _exports__WEBPACK_IMPORTED_MODULE_1__["defaultIntegrations"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "forceLoad", function() { return _exports__WEBPACK_IMPORTED_MODULE_1__["forceLoad"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "init", function() { return _exports__WEBPACK_IMPORTED_MODULE_1__["init"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "lastEventId", function() { return _exports__WEBPACK_IMPORTED_MODULE_1__["lastEventId"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "onLoad", function() { return _exports__WEBPACK_IMPORTED_MODULE_1__["onLoad"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "showReportDialog", function() { return _exports__WEBPACK_IMPORTED_MODULE_1__["showReportDialog"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "flush", function() { return _exports__WEBPACK_IMPORTED_MODULE_1__["flush"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "close", function() { return _exports__WEBPACK_IMPORTED_MODULE_1__["close"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "wrap", function() { return _exports__WEBPACK_IMPORTED_MODULE_1__["wrap"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "SDK_NAME", function() { return _exports__WEBPACK_IMPORTED_MODULE_1__["SDK_NAME"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "SDK_VERSION", function() { return _exports__WEBPACK_IMPORTED_MODULE_1__["SDK_VERSION"]; });
/* harmony import */ var _sentry_core__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @sentry/core */ "./node_modules/@sentry/core/esm/index.js");
/* harmony import */ var _sentry_utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @sentry/utils */ "./node_modules/@sentry/utils/esm/index.js");
/* harmony import */ var _integrations__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./integrations */ "./node_modules/@sentry/browser/esm/integrations/index.js");
/* harmony import */ var _transports__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./transports */ "./node_modules/@sentry/browser/esm/transports/index.js");
/* harmony reexport (module object) */ __webpack_require__.d(__webpack_exports__, "Transports", function() { return _transports__WEBPACK_IMPORTED_MODULE_5__; });
var windowIntegrations = {};
// This block is needed to add compatibility with the integrations packages when used with a CDN
// tslint:disable: no-unsafe-any
var _window = Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_3__["getGlobalObject"])();
if (_window.Sentry && _window.Sentry.Integrations) {
windowIntegrations = _window.Sentry.Integrations;
}
// tslint:enable: no-unsafe-any
var INTEGRATIONS = tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({}, windowIntegrations, _sentry_core__WEBPACK_IMPORTED_MODULE_2__["Integrations"], _integrations__WEBPACK_IMPORTED_MODULE_4__);
//# sourceMappingURL=index.js.map
/***/ }),
/***/ "./node_modules/@sentry/browser/esm/integrations/breadcrumbs.js":
/*!**********************************************************************!*\
!*** ./node_modules/@sentry/browser/esm/integrations/breadcrumbs.js ***!
\**********************************************************************/
/*! exports provided: Breadcrumbs */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Breadcrumbs", function() { return Breadcrumbs; });
/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.js");
/* harmony import */ var _sentry_core__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @sentry/core */ "./node_modules/@sentry/core/esm/index.js");
/* harmony import */ var _sentry_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @sentry/types */ "./node_modules/@sentry/types/esm/index.js");
/* harmony import */ var _sentry_utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @sentry/utils */ "./node_modules/@sentry/utils/esm/index.js");
/**
* Default Breadcrumbs instrumentations
* TODO: Deprecated - with v6, this will be renamed to `Instrument`
*/
var Breadcrumbs = /** @class */ (function () {
/**
* @inheritDoc
*/
function Breadcrumbs(options) {
/**
* @inheritDoc
*/
this.name = Breadcrumbs.id;
this._options = tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({ console: true, dom: true, fetch: true, history: true, sentry: true, xhr: true }, options);
}
/**
* Create a breadcrumb of `sentry` from the events themselves
*/
Breadcrumbs.prototype.addSentryBreadcrumb = function (event) {
if (!this._options.sentry) {
return;
}
Object(_sentry_core__WEBPACK_IMPORTED_MODULE_1__["getCurrentHub"])().addBreadcrumb({
category: "sentry." + (event.type === 'transaction' ? 'transaction' : 'event'),
event_id: event.event_id,
level: event.level,
message: Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_3__["getEventDescription"])(event),
}, {
event: event,
});
};
/**
* Creates breadcrumbs from console API calls
*/
Breadcrumbs.prototype._consoleBreadcrumb = function (handlerData) {
var breadcrumb = {
category: 'console',
data: {
arguments: handlerData.args,
logger: 'console',
},
level: _sentry_types__WEBPACK_IMPORTED_MODULE_2__["Severity"].fromString(handlerData.level),
message: Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_3__["safeJoin"])(handlerData.args, ' '),
};
if (handlerData.level === 'assert') {
if (handlerData.args[0] === false) {
breadcrumb.message = "Assertion failed: " + (Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_3__["safeJoin"])(handlerData.args.slice(1), ' ') || 'console.assert');
breadcrumb.data.arguments = handlerData.args.slice(1);
}
else {
// Don't capture a breadcrumb for passed assertions
return;
}
}
Object(_sentry_core__WEBPACK_IMPORTED_MODULE_1__["getCurrentHub"])().addBreadcrumb(breadcrumb, {
input: handlerData.args,
level: handlerData.level,
});
};
/**
* Creates breadcrumbs from DOM API calls
*/
Breadcrumbs.prototype._domBreadcrumb = function (handlerData) {
var target;
// Accessing event.target can throw (see getsentry/raven-js#838, #768)
try {
target = handlerData.event.target
? Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_3__["htmlTreeAsString"])(handlerData.event.target)
: Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_3__["htmlTreeAsString"])(handlerData.event);
}
catch (e) {
target = '<unknown>';
}
if (target.length === 0) {
return;
}
Object(_sentry_core__WEBPACK_IMPORTED_MODULE_1__["getCurrentHub"])().addBreadcrumb({
category: "ui." + handlerData.name,
message: target,
}, {
event: handlerData.event,
name: handlerData.name,
});
};
/**
* Creates breadcrumbs from XHR API calls
*/
Breadcrumbs.prototype._xhrBreadcrumb = function (handlerData) {
if (handlerData.endTimestamp) {
// We only capture complete, non-sentry requests
if (handlerData.xhr.__sentry_own_request__) {
return;
}
Object(_sentry_core__WEBPACK_IMPORTED_MODULE_1__["getCurrentHub"])().addBreadcrumb({
category: 'xhr',
data: handlerData.xhr.__sentry_xhr__,
type: 'http',
}, {
xhr: handlerData.xhr,
});
return;
}
};
/**
* Creates breadcrumbs from fetch API calls
*/
Breadcrumbs.prototype._fetchBreadcrumb = function (handlerData) {
// We only capture complete fetch requests
if (!handlerData.endTimestamp) {
return;
}
if (handlerData.fetchData.url.match(/sentry_key/) && handlerData.fetchData.method === 'POST') {
// We will not create breadcrumbs for fetch requests that contain `sentry_key` (internal sentry requests)
return;
}
if (handlerData.error) {
Object(_sentry_core__WEBPACK_IMPORTED_MODULE_1__["getCurrentHub"])().addBreadcrumb({
category: 'fetch',
data: handlerData.fetchData,
level: _sentry_types__WEBPACK_IMPORTED_MODULE_2__["Severity"].Error,
type: 'http',
}, {
data: handlerData.error,
input: handlerData.args,
});
}
else {
Object(_sentry_core__WEBPACK_IMPORTED_MODULE_1__["getCurrentHub"])().addBreadcrumb({
category: 'fetch',
data: tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({}, handlerData.fetchData, { status_code: handlerData.response.status }),
type: 'http',
}, {
input: handlerData.args,
response: handlerData.response,
});
}
};
/**
* Creates breadcrumbs from history API calls
*/
Breadcrumbs.prototype._historyBreadcrumb = function (handlerData) {
var global = Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_3__["getGlobalObject"])();
var from = handlerData.from;
var to = handlerData.to;
var parsedLoc = Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_3__["parseUrl"])(global.location.href);
var parsedFrom = Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_3__["parseUrl"])(from);
var parsedTo = Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_3__["parseUrl"])(to);
// Initial pushState doesn't provide `from` information
if (!parsedFrom.path) {
parsedFrom = parsedLoc;
}
// Use only the path component of the URL if the URL matches the current
// document (almost all the time when using pushState)
if (parsedLoc.protocol === parsedTo.protocol && parsedLoc.host === parsedTo.host) {
// tslint:disable-next-line:no-parameter-reassignment
to = parsedTo.relative;
}
if (parsedLoc.protocol === parsedFrom.protocol && parsedLoc.host === parsedFrom.host) {
// tslint:disable-next-line:no-parameter-reassignment
from = parsedFrom.relative;
}
Object(_sentry_core__WEBPACK_IMPORTED_MODULE_1__["getCurrentHub"])().addBreadcrumb({
category: 'navigation',
data: {
from: from,
to: to,
},
});
};
/**
* Instrument browser built-ins w/ breadcrumb capturing
* - Console API
* - DOM API (click/typing)
* - XMLHttpRequest API
* - Fetch API
* - History API
*/
Breadcrumbs.prototype.setupOnce = function () {
var _this = this;
if (this._options.console) {
Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_3__["addInstrumentationHandler"])({
callback: function () {
var args = [];
for (var _i = 0; _i < arguments.length; _i++) {
args[_i] = arguments[_i];
}
_this._consoleBreadcrumb.apply(_this, tslib__WEBPACK_IMPORTED_MODULE_0__["__spread"](args));
},
type: 'console',
});
}
if (this._options.dom) {
Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_3__["addInstrumentationHandler"])({
callback: function () {
var args = [];
for (var _i = 0; _i < arguments.length; _i++) {
args[_i] = arguments[_i];
}
_this._domBreadcrumb.apply(_this, tslib__WEBPACK_IMPORTED_MODULE_0__["__spread"](args));
},
type: 'dom',
});
}
if (this._options.xhr) {
Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_3__["addInstrumentationHandler"])({
callback: function () {
var args = [];
for (var _i = 0; _i < arguments.length; _i++) {
args[_i] = arguments[_i];
}
_this._xhrBreadcrumb.apply(_this, tslib__WEBPACK_IMPORTED_MODULE_0__["__spread"](args));
},
type: 'xhr',
});
}
if (this._options.fetch) {
Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_3__["addInstrumentationHandler"])({
callback: function () {
var args = [];
for (var _i = 0; _i < arguments.length; _i++) {
args[_i] = arguments[_i];
}
_this._fetchBreadcrumb.apply(_this, tslib__WEBPACK_IMPORTED_MODULE_0__["__spread"](args));
},
type: 'fetch',
});
}
if (this._options.history) {
Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_3__["addInstrumentationHandler"])({
callback: function () {
var args = [];
for (var _i = 0; _i < arguments.length; _i++) {
args[_i] = arguments[_i];
}
_this._historyBreadcrumb.apply(_this, tslib__WEBPACK_IMPORTED_MODULE_0__["__spread"](args));
},
type: 'history',
});
}
};
/**
* @inheritDoc
*/
Breadcrumbs.id = 'Breadcrumbs';
return Breadcrumbs;
}());
//# sourceMappingURL=breadcrumbs.js.map
/***/ }),
/***/ "./node_modules/@sentry/browser/esm/integrations/globalhandlers.js":
/*!*************************************************************************!*\
!*** ./node_modules/@sentry/browser/esm/integrations/globalhandlers.js ***!
\*************************************************************************/
/*! exports provided: GlobalHandlers */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "GlobalHandlers", function() { return GlobalHandlers; });
/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.js");
/* harmony import */ var _sentry_core__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @sentry/core */ "./node_modules/@sentry/core/esm/index.js");
/* harmony import */ var _sentry_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @sentry/types */ "./node_modules/@sentry/types/esm/index.js");
/* harmony import */ var _sentry_utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @sentry/utils */ "./node_modules/@sentry/utils/esm/index.js");
/* harmony import */ var _eventbuilder__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../eventbuilder */ "./node_modules/@sentry/browser/esm/eventbuilder.js");
/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../helpers */ "./node_modules/@sentry/browser/esm/helpers.js");
/** Global handlers */
var GlobalHandlers = /** @class */ (function () {
/** JSDoc */
function GlobalHandlers(options) {
/**
* @inheritDoc
*/
this.name = GlobalHandlers.id;
/** JSDoc */
this._onErrorHandlerInstalled = false;
/** JSDoc */
this._onUnhandledRejectionHandlerInstalled = false;
this._options = tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({ onerror: true, onunhandledrejection: true }, options);
}
/**
* @inheritDoc
*/
GlobalHandlers.prototype.setupOnce = function () {
Error.stackTraceLimit = 50;
if (this._options.onerror) {
_sentry_utils__WEBPACK_IMPORTED_MODULE_3__["logger"].log('Global Handler attached: onerror');
this._installGlobalOnErrorHandler();
}
if (this._options.onunhandledrejection) {
_sentry_utils__WEBPACK_IMPORTED_MODULE_3__["logger"].log('Global Handler attached: onunhandledrejection');
this._installGlobalOnUnhandledRejectionHandler();
}
};
/** JSDoc */
GlobalHandlers.prototype._installGlobalOnErrorHandler = function () {
var _this = this;
if (this._onErrorHandlerInstalled) {
return;
}
Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_3__["addInstrumentationHandler"])({
callback: function (data) {
var error = data.error;
var currentHub = Object(_sentry_core__WEBPACK_IMPORTED_MODULE_1__["getCurrentHub"])();
var hasIntegration = currentHub.getIntegration(GlobalHandlers);
var isFailedOwnDelivery = error && error.__sentry_own_request__ === true;
if (!hasIntegration || Object(_helpers__WEBPACK_IMPORTED_MODULE_5__["shouldIgnoreOnError"])() || isFailedOwnDelivery) {
return;
}
var client = currentHub.getClient();
var event = Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_3__["isPrimitive"])(error)
? _this._eventFromIncompleteOnError(data.msg, data.url, data.line, data.column)
: _this._enhanceEventWithInitialFrame(Object(_eventbuilder__WEBPACK_IMPORTED_MODULE_4__["eventFromUnknownInput"])(error, undefined, {
attachStacktrace: client && client.getOptions().attachStacktrace,
rejection: false,
}), data.url, data.line, data.column);
Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_3__["addExceptionMechanism"])(event, {
handled: false,
type: 'onerror',
});
currentHub.captureEvent(event, {
originalException: error,
});
},
type: 'error',
});
this._onErrorHandlerInstalled = true;
};
/** JSDoc */
GlobalHandlers.prototype._installGlobalOnUnhandledRejectionHandler = function () {
var _this = this;
if (this._onUnhandledRejectionHandlerInstalled) {
return;
}
Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_3__["addInstrumentationHandler"])({
callback: function (e) {
var error = e;
// dig the object of the rejection out of known event types
try {
// PromiseRejectionEvents store the object of the rejection under 'reason'
// see https://developer.mozilla.org/en-US/docs/Web/API/PromiseRejectionEvent
if ('reason' in e) {
error = e.reason;
}
// something, somewhere, (likely a browser extension) effectively casts PromiseRejectionEvents
// to CustomEvents, moving the `promise` and `reason` attributes of the PRE into
// the CustomEvent's `detail` attribute, since they're not part of CustomEvent's spec
// see https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent and
// https://github.com/getsentry/sentry-javascript/issues/2380
else if ('detail' in e && 'reason' in e.detail) {
error = e.detail.reason;
}
}
catch (_oO) {
// no-empty
}
var currentHub = Object(_sentry_core__WEBPACK_IMPORTED_MODULE_1__["getCurrentHub"])();
var hasIntegration = currentHub.getIntegration(GlobalHandlers);
var isFailedOwnDelivery = error && error.__sentry_own_request__ === true;
if (!hasIntegration || Object(_helpers__WEBPACK_IMPORTED_MODULE_5__["shouldIgnoreOnError"])() || isFailedOwnDelivery) {
return true;
}
var client = currentHub.getClient();
var event = Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_3__["isPrimitive"])(error)
? _this._eventFromIncompleteRejection(error)
: Object(_eventbuilder__WEBPACK_IMPORTED_MODULE_4__["eventFromUnknownInput"])(error, undefined, {
attachStacktrace: client && client.getOptions().attachStacktrace,
rejection: true,
});
event.level = _sentry_types__WEBPACK_IMPORTED_MODULE_2__["Severity"].Error;
Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_3__["addExceptionMechanism"])(event, {
handled: false,
type: 'onunhandledrejection',
});
currentHub.captureEvent(event, {
originalException: error,
});
return;
},
type: 'unhandledrejection',
});
this._onUnhandledRejectionHandlerInstalled = true;
};
/**
* This function creates a stack from an old, error-less onerror handler.
*/
GlobalHandlers.prototype._eventFromIncompleteOnError = function (msg, url, line, column) {
var ERROR_TYPES_RE = /^(?:[Uu]ncaught (?:exception: )?)?(?:((?:Eval|Internal|Range|Reference|Syntax|Type|URI|)Error): )?(.*)$/i;
// If 'message' is ErrorEvent, get real message from inside
var message = Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_3__["isErrorEvent"])(msg) ? msg.message : msg;
var name;
if (Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_3__["isString"])(message)) {
var groups = message.match(ERROR_TYPES_RE);
if (groups) {
name = groups[1];
message = groups[2];
}
}
var event = {
exception: {
values: [
{
type: name || 'Error',
value: message,
},
],
},
};
return this._enhanceEventWithInitialFrame(event, url, line, column);
};
/**
* This function creates an Event from an TraceKitStackTrace that has part of it missing.
*/
GlobalHandlers.prototype._eventFromIncompleteRejection = function (error) {
return {
exception: {
values: [
{
type: 'UnhandledRejection',
value: "Non-Error promise rejection captured with value: " + error,
},
],
},
};
};
/** JSDoc */
GlobalHandlers.prototype._enhanceEventWithInitialFrame = function (event, url, line, column) {
event.exception = event.exception || {};
event.exception.values = event.exception.values || [];
event.exception.values[0] = event.exception.values[0] || {};
event.exception.values[0].stacktrace = event.exception.values[0].stacktrace || {};
event.exception.values[0].stacktrace.frames = event.exception.values[0].stacktrace.frames || [];
var colno = isNaN(parseInt(column, 10)) ? undefined : column;
var lineno = isNaN(parseInt(line, 10)) ? undefined : line;
var filename = Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_3__["isString"])(url) && url.length > 0 ? url : Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_3__["getLocationHref"])();
if (event.exception.values[0].stacktrace.frames.length === 0) {
event.exception.values[0].stacktrace.frames.push({
colno: colno,
filename: filename,
function: '?',
in_app: true,
lineno: lineno,
});
}
return event;
};
/**
* @inheritDoc
*/
GlobalHandlers.id = 'GlobalHandlers';
return GlobalHandlers;
}());
//# sourceMappingURL=globalhandlers.js.map
/***/ }),
/***/ "./node_modules/@sentry/browser/esm/integrations/index.js":
/*!****************************************************************!*\
!*** ./node_modules/@sentry/browser/esm/integrations/index.js ***!
\****************************************************************/
/*! exports provided: GlobalHandlers, TryCatch, Breadcrumbs, LinkedErrors, UserAgent */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _globalhandlers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./globalhandlers */ "./node_modules/@sentry/browser/esm/integrations/globalhandlers.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "GlobalHandlers", function() { return _globalhandlers__WEBPACK_IMPORTED_MODULE_0__["GlobalHandlers"]; });
/* harmony import */ var _trycatch__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./trycatch */ "./node_modules/@sentry/browser/esm/integrations/trycatch.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "TryCatch", function() { return _trycatch__WEBPACK_IMPORTED_MODULE_1__["TryCatch"]; });
/* harmony import */ var _breadcrumbs__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./breadcrumbs */ "./node_modules/@sentry/browser/esm/integrations/breadcrumbs.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Breadcrumbs", function() { return _breadcrumbs__WEBPACK_IMPORTED_MODULE_2__["Breadcrumbs"]; });
/* harmony import */ var _linkederrors__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./linkederrors */ "./node_modules/@sentry/browser/esm/integrations/linkederrors.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "LinkedErrors", function() { return _linkederrors__WEBPACK_IMPORTED_MODULE_3__["LinkedErrors"]; });
/* harmony import */ var _useragent__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./useragent */ "./node_modules/@sentry/browser/esm/integrations/useragent.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "UserAgent", function() { return _useragent__WEBPACK_IMPORTED_MODULE_4__["UserAgent"]; });
//# sourceMappingURL=index.js.map
/***/ }),
/***/ "./node_modules/@sentry/browser/esm/integrations/linkederrors.js":
/*!***********************************************************************!*\
!*** ./node_modules/@sentry/browser/esm/integrations/linkederrors.js ***!
\***********************************************************************/
/*! exports provided: LinkedErrors */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "LinkedErrors", function() { return LinkedErrors; });
/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.js");
/* harmony import */ var _sentry_core__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @sentry/core */ "./node_modules/@sentry/core/esm/index.js");
/* harmony import */ var _sentry_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @sentry/utils */ "./node_modules/@sentry/utils/esm/index.js");
/* harmony import */ var _parsers__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../parsers */ "./node_modules/@sentry/browser/esm/parsers.js");
/* harmony import */ var _tracekit__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../tracekit */ "./node_modules/@sentry/browser/esm/tracekit.js");
var DEFAULT_KEY = 'cause';
var DEFAULT_LIMIT = 5;
/** Adds SDK info to an event. */
var LinkedErrors = /** @class */ (function () {
/**
* @inheritDoc
*/
function LinkedErrors(options) {
if (options === void 0) { options = {}; }
/**
* @inheritDoc
*/
this.name = LinkedErrors.id;
this._key = options.key || DEFAULT_KEY;
this._limit = options.limit || DEFAULT_LIMIT;
}
/**
* @inheritDoc
*/
LinkedErrors.prototype.setupOnce = function () {
Object(_sentry_core__WEBPACK_IMPORTED_MODULE_1__["addGlobalEventProcessor"])(function (event, hint) {
var self = Object(_sentry_core__WEBPACK_IMPORTED_MODULE_1__["getCurrentHub"])().getIntegration(LinkedErrors);
if (self) {
return self._handler(event, hint);
}
return event;
});
};
/**
* @inheritDoc
*/
LinkedErrors.prototype._handler = function (event, hint) {
if (!event.exception || !event.exception.values || !hint || !Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_2__["isInstanceOf"])(hint.originalException, Error)) {
return event;
}
var linkedErrors = this._walkErrorTree(hint.originalException, this._key);
event.exception.values = tslib__WEBPACK_IMPORTED_MODULE_0__["__spread"](linkedErrors, event.exception.values);
return event;
};
/**
* @inheritDoc
*/
LinkedErrors.prototype._walkErrorTree = function (error, key, stack) {
if (stack === void 0) { stack = []; }
if (!Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_2__["isInstanceOf"])(error[key], Error) || stack.length + 1 >= this._limit) {
return stack;
}
var stacktrace = Object(_tracekit__WEBPACK_IMPORTED_MODULE_4__["computeStackTrace"])(error[key]);
var exception = Object(_parsers__WEBPACK_IMPORTED_MODULE_3__["exceptionFromStacktrace"])(stacktrace);
return this._walkErrorTree(error[key], key, tslib__WEBPACK_IMPORTED_MODULE_0__["__spread"]([exception], stack));
};
/**
* @inheritDoc
*/
LinkedErrors.id = 'LinkedErrors';
return LinkedErrors;
}());
//# sourceMappingURL=linkederrors.js.map
/***/ }),
/***/ "./node_modules/@sentry/browser/esm/integrations/trycatch.js":
/*!*******************************************************************!*\
!*** ./node_modules/@sentry/browser/esm/integrations/trycatch.js ***!
\*******************************************************************/
/*! exports provided: TryCatch */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TryCatch", function() { return TryCatch; });
/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.js");
/* harmony import */ var _sentry_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @sentry/utils */ "./node_modules/@sentry/utils/esm/index.js");
/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../helpers */ "./node_modules/@sentry/browser/esm/helpers.js");
var DEFAULT_EVENT_TARGET = [
'EventTarget',
'Window',
'Node',
'ApplicationCache',
'AudioTrackList',
'ChannelMergerNode',
'CryptoOperation',
'EventSource',
'FileReader',
'HTMLUnknownElement',
'IDBDatabase',
'IDBRequest',
'IDBTransaction',
'KeyOperation',
'MediaController',
'MessagePort',
'ModalWindow',
'Notification',
'SVGElementInstance',
'Screen',
'TextTrack',
'TextTrackCue',
'TextTrackList',
'WebSocket',
'WebSocketWorker',
'Worker',
'XMLHttpRequest',
'XMLHttpRequestEventTarget',
'XMLHttpRequestUpload',
];
/** Wrap timer functions and event targets to catch errors and provide better meta data */
var TryCatch = /** @class */ (function () {
/**
* @inheritDoc
*/
function TryCatch(options) {
/**
* @inheritDoc
*/
this.name = TryCatch.id;
this._options = tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({ XMLHttpRequest: true, eventTarget: true, requestAnimationFrame: true, setInterval: true, setTimeout: true }, options);
}
/** JSDoc */
TryCatch.prototype._wrapTimeFunction = function (original) {
return function () {
var args = [];
for (var _i = 0; _i < arguments.length; _i++) {
args[_i] = arguments[_i];
}
var originalCallback = args[0];
args[0] = Object(_helpers__WEBPACK_IMPORTED_MODULE_2__["wrap"])(originalCallback, {
mechanism: {
data: { function: Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_1__["getFunctionName"])(original) },
handled: true,
type: 'instrument',
},
});
return original.apply(this, args);
};
};
/** JSDoc */
TryCatch.prototype._wrapRAF = function (original) {
return function (callback) {
return original.call(this, Object(_helpers__WEBPACK_IMPORTED_MODULE_2__["wrap"])(callback, {
mechanism: {
data: {
function: 'requestAnimationFrame',
handler: Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_1__["getFunctionName"])(original),
},
handled: true,
type: 'instrument',
},
}));
};
};
/** JSDoc */
TryCatch.prototype._wrapEventTarget = function (target) {
var global = Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_1__["getGlobalObject"])();
var proto = global[target] && global[target].prototype;
if (!proto || !proto.hasOwnProperty || !proto.hasOwnProperty('addEventListener')) {
return;
}
Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_1__["fill"])(proto, 'addEventListener', function (original) {
return function (eventName, fn, options) {
try {
// tslint:disable-next-line:no-unbound-method strict-type-predicates
if (typeof fn.handleEvent === 'function') {
fn.handleEvent = Object(_helpers__WEBPACK_IMPORTED_MODULE_2__["wrap"])(fn.handleEvent.bind(fn), {
mechanism: {
data: {
function: 'handleEvent',
handler: Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_1__["getFunctionName"])(fn),
target: target,
},
handled: true,
type: 'instrument',
},
});
}
}
catch (err) {
// can sometimes get 'Permission denied to access property "handle Event'
}
return original.call(this, eventName, Object(_helpers__WEBPACK_IMPORTED_MODULE_2__["wrap"])(fn, {
mechanism: {
data: {
function: 'addEventListener',
handler: Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_1__["getFunctionName"])(fn),
target: target,
},
handled: true,
type: 'instrument',
},
}), options);
};
});
Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_1__["fill"])(proto, 'removeEventListener', function (original) {
return function (eventName, fn, options) {
var callback = fn;
try {
callback = callback && (callback.__sentry_wrapped__ || callback);
}
catch (e) {
// ignore, accessing __sentry_wrapped__ will throw in some Selenium environments
}
return original.call(this, eventName, callback, options);
};
});
};
/** JSDoc */
TryCatch.prototype._wrapXHR = function (originalSend) {
return function () {
var args = [];
for (var _i = 0; _i < arguments.length; _i++) {
args[_i] = arguments[_i];
}
var xhr = this; // tslint:disable-line:no-this-assignment
var xmlHttpRequestProps = ['onload', 'onerror', 'onprogress', 'onreadystatechange'];
xmlHttpRequestProps.forEach(function (prop) {
if (prop in xhr && typeof xhr[prop] === 'function') {
Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_1__["fill"])(xhr, prop, function (original) {
var wrapOptions = {
mechanism: {
data: {
function: prop,
handler: Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_1__["getFunctionName"])(original),
},
handled: true,
type: 'instrument',
},
};
// If Instrument integration has been called before TryCatch, get the name of original function
if (original.__sentry_original__) {
wrapOptions.mechanism.data.handler = Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_1__["getFunctionName"])(original.__sentry_original__);
}
// Otherwise wrap directly
return Object(_helpers__WEBPACK_IMPORTED_MODULE_2__["wrap"])(original, wrapOptions);
});
}
});
return originalSend.apply(this, args);
};
};
/**
* Wrap timer functions and event targets to catch errors
* and provide better metadata.
*/
TryCatch.prototype.setupOnce = function () {
var global = Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_1__["getGlobalObject"])();
if (this._options.setTimeout) {
Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_1__["fill"])(global, 'setTimeout', this._wrapTimeFunction.bind(this));
}
if (this._options.setInterval) {
Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_1__["fill"])(global, 'setInterval', this._wrapTimeFunction.bind(this));
}
if (this._options.requestAnimationFrame) {
Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_1__["fill"])(global, 'requestAnimationFrame', this._wrapRAF.bind(this));
}
if (this._options.XMLHttpRequest && 'XMLHttpRequest' in global) {
Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_1__["fill"])(XMLHttpRequest.prototype, 'send', this._wrapXHR.bind(this));
}
if (this._options.eventTarget) {
var eventTarget = Array.isArray(this._options.eventTarget) ? this._options.eventTarget : DEFAULT_EVENT_TARGET;
eventTarget.forEach(this._wrapEventTarget.bind(this));
}
};
/**
* @inheritDoc
*/
TryCatch.id = 'TryCatch';
return TryCatch;
}());
//# sourceMappingURL=trycatch.js.map
/***/ }),
/***/ "./node_modules/@sentry/browser/esm/integrations/useragent.js":
/*!********************************************************************!*\
!*** ./node_modules/@sentry/browser/esm/integrations/useragent.js ***!
\********************************************************************/
/*! exports provided: UserAgent */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "UserAgent", function() { return UserAgent; });
/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.js");
/* harmony import */ var _sentry_core__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @sentry/core */ "./node_modules/@sentry/core/esm/index.js");
/* harmony import */ var _sentry_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @sentry/utils */ "./node_modules/@sentry/utils/esm/index.js");
var global = Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_2__["getGlobalObject"])();
/** UserAgent */
var UserAgent = /** @class */ (function () {
function UserAgent() {
/**
* @inheritDoc
*/
this.name = UserAgent.id;
}
/**
* @inheritDoc
*/
UserAgent.prototype.setupOnce = function () {
Object(_sentry_core__WEBPACK_IMPORTED_MODULE_1__["addGlobalEventProcessor"])(function (event) {
if (Object(_sentry_core__WEBPACK_IMPORTED_MODULE_1__["getCurrentHub"])().getIntegration(UserAgent)) {
if (!global.navigator || !global.location) {
return event;
}
var request = event.request || {};
request.url = request.url || global.location.href;
request.headers = request.headers || {};
request.headers['User-Agent'] = global.navigator.userAgent;
return tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({}, event, { request: request });
}
return event;
});
};
/**
* @inheritDoc
*/
UserAgent.id = 'UserAgent';
return UserAgent;
}());
//# sourceMappingURL=useragent.js.map
/***/ }),
/***/ "./node_modules/@sentry/browser/esm/parsers.js":
/*!*****************************************************!*\
!*** ./node_modules/@sentry/browser/esm/parsers.js ***!
\*****************************************************/
/*! exports provided: exceptionFromStacktrace, eventFromPlainObject, eventFromStacktrace, prepareFramesForEvent */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "exceptionFromStacktrace", function() { return exceptionFromStacktrace; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "eventFromPlainObject", function() { return eventFromPlainObject; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "eventFromStacktrace", function() { return eventFromStacktrace; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "prepareFramesForEvent", function() { return prepareFramesForEvent; });
/* harmony import */ var _sentry_utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @sentry/utils */ "./node_modules/@sentry/utils/esm/index.js");
/* harmony import */ var _tracekit__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./tracekit */ "./node_modules/@sentry/browser/esm/tracekit.js");
var STACKTRACE_LIMIT = 50;
/**
* This function creates an exception from an TraceKitStackTrace
* @param stacktrace TraceKitStackTrace that will be converted to an exception
* @hidden
*/
function exceptionFromStacktrace(stacktrace) {
var frames = prepareFramesForEvent(stacktrace.stack);
var exception = {
type: stacktrace.name,
value: stacktrace.message,
};
if (frames && frames.length) {
exception.stacktrace = { frames: frames };
}
// tslint:disable-next-line:strict-type-predicates
if (exception.type === undefined && exception.value === '') {
exception.value = 'Unrecoverable error caught';
}
return exception;
}
/**
* @hidden
*/
function eventFromPlainObject(exception, syntheticException, rejection) {
var event = {
exception: {
values: [
{
type: Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_0__["isEvent"])(exception) ? exception.constructor.name : rejection ? 'UnhandledRejection' : 'Error',
value: "Non-Error " + (rejection ? 'promise rejection' : 'exception') + " captured with keys: " + Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_0__["extractExceptionKeysForMessage"])(exception),
},
],
},
extra: {
__serialized__: Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_0__["normalizeToSize"])(exception),
},
};
if (syntheticException) {
var stacktrace = Object(_tracekit__WEBPACK_IMPORTED_MODULE_1__["computeStackTrace"])(syntheticException);
var frames_1 = prepareFramesForEvent(stacktrace.stack);
event.stacktrace = {
frames: frames_1,
};
}
return event;
}
/**
* @hidden
*/
function eventFromStacktrace(stacktrace) {
var exception = exceptionFromStacktrace(stacktrace);
return {
exception: {
values: [exception],
},
};
}
/**
* @hidden
*/
function prepareFramesForEvent(stack) {
if (!stack || !stack.length) {
return [];
}
var localStack = stack;
var firstFrameFunction = localStack[0].func || '';
var lastFrameFunction = localStack[localStack.length - 1].func || '';
// If stack starts with one of our API calls, remove it (starts, meaning it's the top of the stack - aka last call)
if (firstFrameFunction.indexOf('captureMessage') !== -1 || firstFrameFunction.indexOf('captureException') !== -1) {
localStack = localStack.slice(1);
}
// If stack ends with one of our internal API calls, remove it (ends, meaning it's the bottom of the stack - aka top-most call)
if (lastFrameFunction.indexOf('sentryWrapped') !== -1) {
localStack = localStack.slice(0, -1);
}
// The frame where the crash happened, should be the last entry in the array
return localStack
.slice(0, STACKTRACE_LIMIT)
.map(function (frame) { return ({
colno: frame.column === null ? undefined : frame.column,
filename: frame.url || localStack[0].url,
function: frame.func || '?',
in_app: true,
lineno: frame.line === null ? undefined : frame.line,
}); })
.reverse();
}
//# sourceMappingURL=parsers.js.map
/***/ }),
/***/ "./node_modules/@sentry/browser/esm/sdk.js":
/*!*************************************************!*\
!*** ./node_modules/@sentry/browser/esm/sdk.js ***!
\*************************************************/
/*! exports provided: defaultIntegrations, init, showReportDialog, lastEventId, forceLoad, onLoad, flush, close, wrap */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "defaultIntegrations", function() { return defaultIntegrations; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "init", function() { return init; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "showReportDialog", function() { return showReportDialog; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "lastEventId", function() { return lastEventId; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "forceLoad", function() { return forceLoad; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "onLoad", function() { return onLoad; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "flush", function() { return flush; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "close", function() { return close; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "wrap", function() { return wrap; });
/* harmony import */ var _sentry_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @sentry/core */ "./node_modules/@sentry/core/esm/index.js");
/* harmony import */ var _sentry_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @sentry/utils */ "./node_modules/@sentry/utils/esm/index.js");
/* harmony import */ var _client__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./client */ "./node_modules/@sentry/browser/esm/client.js");
/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./helpers */ "./node_modules/@sentry/browser/esm/helpers.js");
/* harmony import */ var _integrations__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./integrations */ "./node_modules/@sentry/browser/esm/integrations/index.js");
var defaultIntegrations = [
new _sentry_core__WEBPACK_IMPORTED_MODULE_0__["Integrations"].InboundFilters(),
new _sentry_core__WEBPACK_IMPORTED_MODULE_0__["Integrations"].FunctionToString(),
new _integrations__WEBPACK_IMPORTED_MODULE_4__["TryCatch"](),
new _integrations__WEBPACK_IMPORTED_MODULE_4__["Breadcrumbs"](),
new _integrations__WEBPACK_IMPORTED_MODULE_4__["GlobalHandlers"](),
new _integrations__WEBPACK_IMPORTED_MODULE_4__["LinkedErrors"](),
new _integrations__WEBPACK_IMPORTED_MODULE_4__["UserAgent"](),
];
/**
* The Sentry Browser SDK Client.
*
* To use this SDK, call the {@link init} function as early as possible when
* loading the web page. To set context information or send manual events, use
* the provided methods.
*
* @example
*
* ```
*
* import { init } from '@sentry/browser';
*
* init({
* dsn: '__DSN__',
* // ...
* });
* ```
*
* @example
* ```
*
* import { configureScope } from '@sentry/browser';
* configureScope((scope: Scope) => {
* scope.setExtra({ battery: 0.7 });
* scope.setTag({ user_mode: 'admin' });
* scope.setUser({ id: '4711' });
* });
* ```
*
* @example
* ```
*
* import { addBreadcrumb } from '@sentry/browser';
* addBreadcrumb({
* message: 'My Breadcrumb',
* // ...
* });
* ```
*
* @example
*
* ```
*
* import * as Sentry from '@sentry/browser';
* Sentry.captureMessage('Hello, world!');
* Sentry.captureException(new Error('Good bye'));
* Sentry.captureEvent({
* message: 'Manual',
* stacktrace: [
* // ...
* ],
* });
* ```
*
* @see {@link BrowserOptions} for documentation on configuration options.
*/
function init(options) {
if (options === void 0) { options = {}; }
if (options.defaultIntegrations === undefined) {
options.defaultIntegrations = defaultIntegrations;
}
if (options.release === undefined) {
var window_1 = Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_1__["getGlobalObject"])();
// This supports the variable that sentry-webpack-plugin injects
if (window_1.SENTRY_RELEASE && window_1.SENTRY_RELEASE.id) {
options.release = window_1.SENTRY_RELEASE.id;
}
}
Object(_sentry_core__WEBPACK_IMPORTED_MODULE_0__["initAndBind"])(_client__WEBPACK_IMPORTED_MODULE_2__["BrowserClient"], options);
}
/**
* Present the user with a report dialog.
*
* @param options Everything is optional, we try to fetch all info need from the global scope.
*/
function showReportDialog(options) {
if (options === void 0) { options = {}; }
if (!options.eventId) {
options.eventId = Object(_sentry_core__WEBPACK_IMPORTED_MODULE_0__["getCurrentHub"])().lastEventId();
}
var client = Object(_sentry_core__WEBPACK_IMPORTED_MODULE_0__["getCurrentHub"])().getClient();
if (client) {
client.showReportDialog(options);
}
}
/**
* This is the getter for lastEventId.
*
* @returns The last event id of a captured event.
*/
function lastEventId() {
return Object(_sentry_core__WEBPACK_IMPORTED_MODULE_0__["getCurrentHub"])().lastEventId();
}
/**
* This function is here to be API compatible with the loader.
* @hidden
*/
function forceLoad() {
// Noop
}
/**
* This function is here to be API compatible with the loader.
* @hidden
*/
function onLoad(callback) {
callback();
}
/**
* A promise that resolves when all current events have been sent.
* If you provide a timeout and the queue takes longer to drain the promise returns false.
*
* @param timeout Maximum time in ms the client should wait.
*/
function flush(timeout) {
var client = Object(_sentry_core__WEBPACK_IMPORTED_MODULE_0__["getCurrentHub"])().getClient();
if (client) {
return client.flush(timeout);
}
return _sentry_utils__WEBPACK_IMPORTED_MODULE_1__["SyncPromise"].reject(false);
}
/**
* A promise that resolves when all current events have been sent.
* If you provide a timeout and the queue takes longer to drain the promise returns false.
*
* @param timeout Maximum time in ms the client should wait.
*/
function close(timeout) {
var client = Object(_sentry_core__WEBPACK_IMPORTED_MODULE_0__["getCurrentHub"])().getClient();
if (client) {
return client.close(timeout);
}
return _sentry_utils__WEBPACK_IMPORTED_MODULE_1__["SyncPromise"].reject(false);
}
/**
* Wrap code within a try/catch block so the SDK is able to capture errors.
*
* @param fn A function to wrap.
*
* @returns The result of wrapped function call.
*/
function wrap(fn) {
return Object(_helpers__WEBPACK_IMPORTED_MODULE_3__["wrap"])(fn)(); // tslint:disable-line:no-unsafe-any
}
//# sourceMappingURL=sdk.js.map
/***/ }),
/***/ "./node_modules/@sentry/browser/esm/tracekit.js":
/*!******************************************************!*\
!*** ./node_modules/@sentry/browser/esm/tracekit.js ***!
\******************************************************/
/*! exports provided: computeStackTrace */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "computeStackTrace", function() { return computeStackTrace; });
/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.js");
// tslint:disable:object-literal-sort-keys
// global reference to slice
var UNKNOWN_FUNCTION = '?';
// Chromium based browsers: Chrome, Brave, new Opera, new Edge
var chrome = /^\s*at (?:(.*?) ?\()?((?:file|https?|blob|chrome-extension|address|native|eval|webpack|<anonymous>|[-a-z]+:|.*bundle|\/).*?)(?::(\d+))?(?::(\d+))?\)?\s*$/i;
// gecko regex: `(?:bundle|\d+\.js)`: `bundle` is for react native, `\d+\.js` also but specifically for ram bundles because it
// generates filenames without a prefix like `file://` the filenames in the stacktrace are just 42.js
// We need this specific case for now because we want no other regex to match.
var gecko = /^\s*(.*?)(?:\((.*?)\))?(?:^|@)?((?:file|https?|blob|chrome|webpack|resource|moz-extension).*?:\/.*?|\[native code\]|[^@]*(?:bundle|\d+\.js))(?::(\d+))?(?::(\d+))?\s*$/i;
var winjs = /^\s*at (?:((?:\[object object\])?.+) )?\(?((?:file|ms-appx|https?|webpack|blob):.*?):(\d+)(?::(\d+))?\)?\s*$/i;
var geckoEval = /(\S+) line (\d+)(?: > eval line \d+)* > eval/i;
var chromeEval = /\((\S*)(?::(\d+))(?::(\d+))\)/;
/** JSDoc */
function computeStackTrace(ex) {
// tslint:disable:no-unsafe-any
var stack = null;
var popSize = ex && ex.framesToPop;
try {
// This must be tried first because Opera 10 *destroys*
// its stacktrace property if you try to access the stack
// property first!!
stack = computeStackTraceFromStacktraceProp(ex);
if (stack) {
return popFrames(stack, popSize);
}
}
catch (e) {
// no-empty
}
try {
stack = computeStackTraceFromStackProp(ex);
if (stack) {
return popFrames(stack, popSize);
}
}
catch (e) {
// no-empty
}
return {
message: extractMessage(ex),
name: ex && ex.name,
stack: [],
failed: true,
};
}
/** JSDoc */
// tslint:disable-next-line:cyclomatic-complexity
function computeStackTraceFromStackProp(ex) {
// tslint:disable:no-conditional-assignment
if (!ex || !ex.stack) {
return null;
}
var stack = [];
var lines = ex.stack.split('\n');
var isEval;
var submatch;
var parts;
var element;
for (var i = 0; i < lines.length; ++i) {
if ((parts = chrome.exec(lines[i]))) {
var isNative = parts[2] && parts[2].indexOf('native') === 0; // start of line
isEval = parts[2] && parts[2].indexOf('eval') === 0; // start of line
if (isEval && (submatch = chromeEval.exec(parts[2]))) {
// throw out eval line/column and use top-most line/column number
parts[2] = submatch[1]; // url
parts[3] = submatch[2]; // line
parts[4] = submatch[3]; // column
}
element = {
// working with the regexp above is super painful. it is quite a hack, but just stripping the `address at `
// prefix here seems like the quickest solution for now.
url: parts[2] && parts[2].indexOf('address at ') === 0 ? parts[2].substr('address at '.length) : parts[2],
func: parts[1] || UNKNOWN_FUNCTION,
args: isNative ? [parts[2]] : [],
line: parts[3] ? +parts[3] : null,
column: parts[4] ? +parts[4] : null,
};
}
else if ((parts = winjs.exec(lines[i]))) {
element = {
url: parts[2],
func: parts[1] || UNKNOWN_FUNCTION,
args: [],
line: +parts[3],
column: parts[4] ? +parts[4] : null,
};
}
else if ((parts = gecko.exec(lines[i]))) {
isEval = parts[3] && parts[3].indexOf(' > eval') > -1;
if (isEval && (submatch = geckoEval.exec(parts[3]))) {
// throw out eval line/column and use top-most line number
parts[1] = parts[1] || "eval";
parts[3] = submatch[1];
parts[4] = submatch[2];
parts[5] = ''; // no column when eval
}
else if (i === 0 && !parts[5] && ex.columnNumber !== void 0) {
// FireFox uses this awesome columnNumber property for its top frame
// Also note, Firefox's column number is 0-based and everything else expects 1-based,
// so adding 1
// NOTE: this hack doesn't work if top-most frame is eval
stack[0].column = ex.columnNumber + 1;
}
element = {
url: parts[3],
func: parts[1] || UNKNOWN_FUNCTION,
args: parts[2] ? parts[2].split(',') : [],
line: parts[4] ? +parts[4] : null,
column: parts[5] ? +parts[5] : null,
};
}
else {
continue;
}
if (!element.func && element.line) {
element.func = UNKNOWN_FUNCTION;
}
stack.push(element);
}
if (!stack.length) {
return null;
}
return {
message: extractMessage(ex),
name: ex.name,
stack: stack,
};
}
/** JSDoc */
function computeStackTraceFromStacktraceProp(ex) {
if (!ex || !ex.stacktrace) {
return null;
}
// Access and store the stacktrace property before doing ANYTHING
// else to it because Opera is not very good at providing it
// reliably in other circumstances.
var stacktrace = ex.stacktrace;
var opera10Regex = / line (\d+).*script (?:in )?(\S+)(?:: in function (\S+))?$/i;
var opera11Regex = / line (\d+), column (\d+)\s*(?:in (?:<anonymous function: ([^>]+)>|([^\)]+))\((.*)\))? in (.*):\s*$/i;
var lines = stacktrace.split('\n');
var stack = [];
var parts;
for (var line = 0; line < lines.length; line += 2) {
// tslint:disable:no-conditional-assignment
var element = null;
if ((parts = opera10Regex.exec(lines[line]))) {
element = {
url: parts[2],
func: parts[3],
args: [],
line: +parts[1],
column: null,
};
}
else if ((parts = opera11Regex.exec(lines[line]))) {
element = {
url: parts[6],
func: parts[3] || parts[4],
args: parts[5] ? parts[5].split(',') : [],
line: +parts[1],
column: +parts[2],
};
}
if (element) {
if (!element.func && element.line) {
element.func = UNKNOWN_FUNCTION;
}
stack.push(element);
}
}
if (!stack.length) {
return null;
}
return {
message: extractMessage(ex),
name: ex.name,
stack: stack,
};
}
/** Remove N number of frames from the stack */
function popFrames(stacktrace, popSize) {
try {
return tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({}, stacktrace, { stack: stacktrace.stack.slice(popSize) });
}
catch (e) {
return stacktrace;
}
}
/**
* There are cases where stacktrace.message is an Event object
* https://github.com/getsentry/sentry-javascript/issues/1949
* In this specific case we try to extract stacktrace.message.error.message
*/
function extractMessage(ex) {
var message = ex && ex.message;
if (!message) {
return 'No error message';
}
if (message.error && typeof message.error.message === 'string') {
return message.error.message;
}
return message;
}
//# sourceMappingURL=tracekit.js.map
/***/ }),
/***/ "./node_modules/@sentry/browser/esm/transports/base.js":
/*!*************************************************************!*\
!*** ./node_modules/@sentry/browser/esm/transports/base.js ***!
\*************************************************************/
/*! exports provided: BaseTransport */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "BaseTransport", function() { return BaseTransport; });
/* harmony import */ var _sentry_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @sentry/core */ "./node_modules/@sentry/core/esm/index.js");
/* harmony import */ var _sentry_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @sentry/utils */ "./node_modules/@sentry/utils/esm/index.js");
/** Base Transport class implementation */
var BaseTransport = /** @class */ (function () {
function BaseTransport(options) {
this.options = options;
/** A simple buffer holding all requests. */
this._buffer = new _sentry_utils__WEBPACK_IMPORTED_MODULE_1__["PromiseBuffer"](30);
this._api = new _sentry_core__WEBPACK_IMPORTED_MODULE_0__["API"](this.options.dsn);
// tslint:disable-next-line:deprecation
this.url = this._api.getStoreEndpointWithUrlEncodedAuth();
}
/**
* @inheritDoc
*/
BaseTransport.prototype.sendEvent = function (_) {
throw new _sentry_utils__WEBPACK_IMPORTED_MODULE_1__["SentryError"]('Transport Class has to implement `sendEvent` method');
};
/**
* @inheritDoc
*/
BaseTransport.prototype.close = function (timeout) {
return this._buffer.drain(timeout);
};
return BaseTransport;
}());
//# sourceMappingURL=base.js.map
/***/ }),
/***/ "./node_modules/@sentry/browser/esm/transports/fetch.js":
/*!**************************************************************!*\
!*** ./node_modules/@sentry/browser/esm/transports/fetch.js ***!
\**************************************************************/
/*! exports provided: FetchTransport */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FetchTransport", function() { return FetchTransport; });
/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.js");
/* harmony import */ var _sentry_core__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @sentry/core */ "./node_modules/@sentry/core/esm/index.js");
/* harmony import */ var _sentry_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @sentry/types */ "./node_modules/@sentry/types/esm/index.js");
/* harmony import */ var _sentry_utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @sentry/utils */ "./node_modules/@sentry/utils/esm/index.js");
/* harmony import */ var _base__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./base */ "./node_modules/@sentry/browser/esm/transports/base.js");
var global = Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_3__["getGlobalObject"])();
/** `fetch` based transport */
var FetchTransport = /** @class */ (function (_super) {
tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](FetchTransport, _super);
function FetchTransport() {
var _this = _super !== null && _super.apply(this, arguments) || this;
/** Locks transport after receiving 429 response */
_this._disabledUntil = new Date(Date.now());
return _this;
}
/**
* @inheritDoc
*/
FetchTransport.prototype.sendEvent = function (event) {
var _this = this;
if (new Date(Date.now()) < this._disabledUntil) {
return Promise.reject({
event: event,
reason: "Transport locked till " + this._disabledUntil + " due to too many requests.",
status: 429,
});
}
var sentryReq = Object(_sentry_core__WEBPACK_IMPORTED_MODULE_1__["eventToSentryRequest"])(event, this._api);
var options = {
body: sentryReq.body,
method: 'POST',
// Despite all stars in the sky saying that Edge supports old draft syntax, aka 'never', 'always', 'origin' and 'default
// https://caniuse.com/#feat=referrer-policy
// It doesn't. And it throw exception instead of ignoring this parameter...
// REF: https://github.com/getsentry/raven-js/issues/1233
referrerPolicy: (Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_3__["supportsReferrerPolicy"])() ? 'origin' : ''),
};
if (this.options.headers !== undefined) {
options.headers = this.options.headers;
}
return this._buffer.add(new _sentry_utils__WEBPACK_IMPORTED_MODULE_3__["SyncPromise"](function (resolve, reject) {
global
.fetch(sentryReq.url, options)
.then(function (response) {
var status = _sentry_types__WEBPACK_IMPORTED_MODULE_2__["Status"].fromHttpCode(response.status);
if (status === _sentry_types__WEBPACK_IMPORTED_MODULE_2__["Status"].Success) {
resolve({ status: status });
return;
}
if (status === _sentry_types__WEBPACK_IMPORTED_MODULE_2__["Status"].RateLimit) {
var now = Date.now();
_this._disabledUntil = new Date(now + Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_3__["parseRetryAfterHeader"])(now, response.headers.get('Retry-After')));
_sentry_utils__WEBPACK_IMPORTED_MODULE_3__["logger"].warn("Too many requests, backing off till: " + _this._disabledUntil);
}
reject(response);
})
.catch(reject);
}));
};
return FetchTransport;
}(_base__WEBPACK_IMPORTED_MODULE_4__["BaseTransport"]));
//# sourceMappingURL=fetch.js.map
/***/ }),
/***/ "./node_modules/@sentry/browser/esm/transports/index.js":
/*!**************************************************************!*\
!*** ./node_modules/@sentry/browser/esm/transports/index.js ***!
\**************************************************************/
/*! exports provided: BaseTransport, FetchTransport, XHRTransport */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _base__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./base */ "./node_modules/@sentry/browser/esm/transports/base.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "BaseTransport", function() { return _base__WEBPACK_IMPORTED_MODULE_0__["BaseTransport"]; });
/* harmony import */ var _fetch__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./fetch */ "./node_modules/@sentry/browser/esm/transports/fetch.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "FetchTransport", function() { return _fetch__WEBPACK_IMPORTED_MODULE_1__["FetchTransport"]; });
/* harmony import */ var _xhr__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./xhr */ "./node_modules/@sentry/browser/esm/transports/xhr.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "XHRTransport", function() { return _xhr__WEBPACK_IMPORTED_MODULE_2__["XHRTransport"]; });
//# sourceMappingURL=index.js.map
/***/ }),
/***/ "./node_modules/@sentry/browser/esm/transports/xhr.js":
/*!************************************************************!*\
!*** ./node_modules/@sentry/browser/esm/transports/xhr.js ***!
\************************************************************/
/*! exports provided: XHRTransport */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "XHRTransport", function() { return XHRTransport; });
/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.js");
/* harmony import */ var _sentry_core__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @sentry/core */ "./node_modules/@sentry/core/esm/index.js");
/* harmony import */ var _sentry_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @sentry/types */ "./node_modules/@sentry/types/esm/index.js");
/* harmony import */ var _sentry_utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @sentry/utils */ "./node_modules/@sentry/utils/esm/index.js");
/* harmony import */ var _base__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./base */ "./node_modules/@sentry/browser/esm/transports/base.js");
/** `XHR` based transport */
var XHRTransport = /** @class */ (function (_super) {
tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](XHRTransport, _super);
function XHRTransport() {
var _this = _super !== null && _super.apply(this, arguments) || this;
/** Locks transport after receiving 429 response */
_this._disabledUntil = new Date(Date.now());
return _this;
}
/**
* @inheritDoc
*/
XHRTransport.prototype.sendEvent = function (event) {
var _this = this;
if (new Date(Date.now()) < this._disabledUntil) {
return Promise.reject({
event: event,
reason: "Transport locked till " + this._disabledUntil + " due to too many requests.",
status: 429,
});
}
var sentryReq = Object(_sentry_core__WEBPACK_IMPORTED_MODULE_1__["eventToSentryRequest"])(event, this._api);
return this._buffer.add(new _sentry_utils__WEBPACK_IMPORTED_MODULE_3__["SyncPromise"](function (resolve, reject) {
var request = new XMLHttpRequest();
request.onreadystatechange = function () {
if (request.readyState !== 4) {
return;
}
var status = _sentry_types__WEBPACK_IMPORTED_MODULE_2__["Status"].fromHttpCode(request.status);
if (status === _sentry_types__WEBPACK_IMPORTED_MODULE_2__["Status"].Success) {
resolve({ status: status });
return;
}
if (status === _sentry_types__WEBPACK_IMPORTED_MODULE_2__["Status"].RateLimit) {
var now = Date.now();
_this._disabledUntil = new Date(now + Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_3__["parseRetryAfterHeader"])(now, request.getResponseHeader('Retry-After')));
_sentry_utils__WEBPACK_IMPORTED_MODULE_3__["logger"].warn("Too many requests, backing off till: " + _this._disabledUntil);
}
reject(request);
};
request.open('POST', sentryReq.url);
for (var header in _this.options.headers) {
if (_this.options.headers.hasOwnProperty(header)) {
request.setRequestHeader(header, _this.options.headers[header]);
}
}
request.send(sentryReq.body);
}));
};
return XHRTransport;
}(_base__WEBPACK_IMPORTED_MODULE_4__["BaseTransport"]));
//# sourceMappingURL=xhr.js.map
/***/ }),
/***/ "./node_modules/@sentry/browser/esm/version.js":
/*!*****************************************************!*\
!*** ./node_modules/@sentry/browser/esm/version.js ***!
\*****************************************************/
/*! exports provided: SDK_NAME, SDK_VERSION */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SDK_NAME", function() { return SDK_NAME; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SDK_VERSION", function() { return SDK_VERSION; });
var SDK_NAME = 'sentry.javascript.browser';
var SDK_VERSION = '5.16.1';
//# sourceMappingURL=version.js.map
/***/ }),
/***/ "./node_modules/@sentry/core/esm/api.js":
/*!**********************************************!*\
!*** ./node_modules/@sentry/core/esm/api.js ***!
\**********************************************/
/*! exports provided: API */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "API", function() { return API; });
/* harmony import */ var _sentry_utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @sentry/utils */ "./node_modules/@sentry/utils/esm/index.js");
var SENTRY_API_VERSION = '7';
/** Helper class to provide urls to different Sentry endpoints. */
var API = /** @class */ (function () {
/** Create a new instance of API */
function API(dsn) {
this.dsn = dsn;
this._dsnObject = new _sentry_utils__WEBPACK_IMPORTED_MODULE_0__["Dsn"](dsn);
}
/** Returns the Dsn object. */
API.prototype.getDsn = function () {
return this._dsnObject;
};
/** Returns the prefix to construct Sentry ingestion API endpoints. */
API.prototype.getBaseApiEndpoint = function () {
var dsn = this._dsnObject;
var protocol = dsn.protocol ? dsn.protocol + ":" : '';
var port = dsn.port ? ":" + dsn.port : '';
return protocol + "//" + dsn.host + port + (dsn.path ? "/" + dsn.path : '') + "/api/";
};
/** Returns the store endpoint URL. */
API.prototype.getStoreEndpoint = function () {
return this._getIngestEndpoint('store');
};
/** Returns the envelope endpoint URL. */
API.prototype._getEnvelopeEndpoint = function () {
return this._getIngestEndpoint('envelope');
};
/** Returns the ingest API endpoint for target. */
API.prototype._getIngestEndpoint = function (target) {
var base = this.getBaseApiEndpoint();
var dsn = this._dsnObject;
return "" + base + dsn.projectId + "/" + target + "/";
};
/**
* Returns the store endpoint URL with auth in the query string.
*
* Sending auth as part of the query string and not as custom HTTP headers avoids CORS preflight requests.
*/
API.prototype.getStoreEndpointWithUrlEncodedAuth = function () {
return this.getStoreEndpoint() + "?" + this._encodedAuth();
};
/**
* Returns the envelope endpoint URL with auth in the query string.
*
* Sending auth as part of the query string and not as custom HTTP headers avoids CORS preflight requests.
*/
API.prototype.getEnvelopeEndpointWithUrlEncodedAuth = function () {
return this._getEnvelopeEndpoint() + "?" + this._encodedAuth();
};
/** Returns a URL-encoded string with auth config suitable for a query string. */
API.prototype._encodedAuth = function () {
var dsn = this._dsnObject;
var auth = {
// We send only the minimum set of required information. See
// https://github.com/getsentry/sentry-javascript/issues/2572.
sentry_key: dsn.user,
sentry_version: SENTRY_API_VERSION,
};
return Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_0__["urlEncode"])(auth);
};
/** Returns only the path component for the store endpoint. */
API.prototype.getStoreEndpointPath = function () {
var dsn = this._dsnObject;
return (dsn.path ? "/" + dsn.path : '') + "/api/" + dsn.projectId + "/store/";
};
/**
* Returns an object that can be used in request headers.
* This is needed for node and the old /store endpoint in sentry
*/
API.prototype.getRequestHeaders = function (clientName, clientVersion) {
var dsn = this._dsnObject;
var header = ["Sentry sentry_version=" + SENTRY_API_VERSION];
header.push("sentry_client=" + clientName + "/" + clientVersion);
header.push("sentry_key=" + dsn.user);
if (dsn.pass) {
header.push("sentry_secret=" + dsn.pass);
}
return {
'Content-Type': 'application/json',
'X-Sentry-Auth': header.join(', '),
};
};
/** Returns the url to the report dialog endpoint. */
API.prototype.getReportDialogEndpoint = function (dialogOptions) {
if (dialogOptions === void 0) { dialogOptions = {}; }
var dsn = this._dsnObject;
var endpoint = this.getBaseApiEndpoint() + "embed/error-page/";
var encodedOptions = [];
encodedOptions.push("dsn=" + dsn.toString());
for (var key in dialogOptions) {
if (key === 'user') {
if (!dialogOptions.user) {
continue;
}
if (dialogOptions.user.name) {
encodedOptions.push("name=" + encodeURIComponent(dialogOptions.user.name));
}
if (dialogOptions.user.email) {
encodedOptions.push("email=" + encodeURIComponent(dialogOptions.user.email));
}
}
else {
encodedOptions.push(encodeURIComponent(key) + "=" + encodeURIComponent(dialogOptions[key]));
}
}
if (encodedOptions.length) {
return endpoint + "?" + encodedOptions.join('&');
}
return endpoint;
};
return API;
}());
//# sourceMappingURL=api.js.map
/***/ }),
/***/ "./node_modules/@sentry/core/esm/basebackend.js":
/*!******************************************************!*\
!*** ./node_modules/@sentry/core/esm/basebackend.js ***!
\******************************************************/
/*! exports provided: BaseBackend */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "BaseBackend", function() { return BaseBackend; });
/* harmony import */ var _sentry_utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @sentry/utils */ "./node_modules/@sentry/utils/esm/index.js");
/* harmony import */ var _transports_noop__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./transports/noop */ "./node_modules/@sentry/core/esm/transports/noop.js");
/**
* This is the base implemention of a Backend.
* @hidden
*/
var BaseBackend = /** @class */ (function () {
/** Creates a new backend instance. */
function BaseBackend(options) {
this._options = options;
if (!this._options.dsn) {
_sentry_utils__WEBPACK_IMPORTED_MODULE_0__["logger"].warn('No DSN provided, backend will not do anything.');
}
this._transport = this._setupTransport();
}
/**
* Sets up the transport so it can be used later to send requests.
*/
BaseBackend.prototype._setupTransport = function () {
return new _transports_noop__WEBPACK_IMPORTED_MODULE_1__["NoopTransport"]();
};
/**
* @inheritDoc
*/
BaseBackend.prototype.eventFromException = function (_exception, _hint) {
throw new _sentry_utils__WEBPACK_IMPORTED_MODULE_0__["SentryError"]('Backend has to implement `eventFromException` method');
};
/**
* @inheritDoc
*/
BaseBackend.prototype.eventFromMessage = function (_message, _level, _hint) {
throw new _sentry_utils__WEBPACK_IMPORTED_MODULE_0__["SentryError"]('Backend has to implement `eventFromMessage` method');
};
/**
* @inheritDoc
*/
BaseBackend.prototype.sendEvent = function (event) {
this._transport.sendEvent(event).then(null, function (reason) {
_sentry_utils__WEBPACK_IMPORTED_MODULE_0__["logger"].error("Error while sending event: " + reason);
});
};
/**
* @inheritDoc
*/
BaseBackend.prototype.getTransport = function () {
return this._transport;
};
return BaseBackend;
}());
//# sourceMappingURL=basebackend.js.map
/***/ }),
/***/ "./node_modules/@sentry/core/esm/baseclient.js":
/*!*****************************************************!*\
!*** ./node_modules/@sentry/core/esm/baseclient.js ***!
\*****************************************************/
/*! exports provided: BaseClient */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "BaseClient", function() { return BaseClient; });
/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.js");
/* harmony import */ var _sentry_hub__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @sentry/hub */ "./node_modules/@sentry/hub/esm/index.js");
/* harmony import */ var _sentry_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @sentry/utils */ "./node_modules/@sentry/utils/esm/index.js");
/* harmony import */ var _integration__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./integration */ "./node_modules/@sentry/core/esm/integration.js");
/**
* Base implementation for all JavaScript SDK clients.
*
* Call the constructor with the corresponding backend constructor and options
* specific to the client subclass. To access these options later, use
* {@link Client.getOptions}. Also, the Backend instance is available via
* {@link Client.getBackend}.
*
* If a Dsn is specified in the options, it will be parsed and stored. Use
* {@link Client.getDsn} to retrieve the Dsn at any moment. In case the Dsn is
* invalid, the constructor will throw a {@link SentryException}. Note that
* without a valid Dsn, the SDK will not send any events to Sentry.
*
* Before sending an event via the backend, it is passed through
* {@link BaseClient.prepareEvent} to add SDK information and scope data
* (breadcrumbs and context). To add more custom information, override this
* method and extend the resulting prepared event.
*
* To issue automatically created events (e.g. via instrumentation), use
* {@link Client.captureEvent}. It will prepare the event and pass it through
* the callback lifecycle. To issue auto-breadcrumbs, use
* {@link Client.addBreadcrumb}.
*
* @example
* class NodeClient extends BaseClient<NodeBackend, NodeOptions> {
* public constructor(options: NodeOptions) {
* super(NodeBackend, options);
* }
*
* // ...
* }
*/
var BaseClient = /** @class */ (function () {
/**
* Initializes this client instance.
*
* @param backendClass A constructor function to create the backend.
* @param options Options for the client.
*/
function BaseClient(backendClass, options) {
/** Array of used integrations. */
this._integrations = {};
/** Is the client still processing a call? */
this._processing = false;
this._backend = new backendClass(options);
this._options = options;
if (options.dsn) {
this._dsn = new _sentry_utils__WEBPACK_IMPORTED_MODULE_2__["Dsn"](options.dsn);
}
}
/**
* @inheritDoc
*/
BaseClient.prototype.captureException = function (exception, hint, scope) {
var _this = this;
var eventId = hint && hint.event_id;
this._processing = true;
this._getBackend()
.eventFromException(exception, hint)
.then(function (event) {
eventId = _this.captureEvent(event, hint, scope);
});
return eventId;
};
/**
* @inheritDoc
*/
BaseClient.prototype.captureMessage = function (message, level, hint, scope) {
var _this = this;
var eventId = hint && hint.event_id;
this._processing = true;
var promisedEvent = Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_2__["isPrimitive"])(message)
? this._getBackend().eventFromMessage("" + message, level, hint)
: this._getBackend().eventFromException(message, hint);
promisedEvent.then(function (event) {
eventId = _this.captureEvent(event, hint, scope);
});
return eventId;
};
/**
* @inheritDoc
*/
BaseClient.prototype.captureEvent = function (event, hint, scope) {
var _this = this;
var eventId = hint && hint.event_id;
this._processing = true;
this._processEvent(event, hint, scope)
.then(function (finalEvent) {
// We need to check for finalEvent in case beforeSend returned null
eventId = finalEvent && finalEvent.event_id;
_this._processing = false;
})
.then(null, function (reason) {
_sentry_utils__WEBPACK_IMPORTED_MODULE_2__["logger"].error(reason);
_this._processing = false;
});
return eventId;
};
/**
* @inheritDoc
*/
BaseClient.prototype.getDsn = function () {
return this._dsn;
};
/**
* @inheritDoc
*/
BaseClient.prototype.getOptions = function () {
return this._options;
};
/**
* @inheritDoc
*/
BaseClient.prototype.flush = function (timeout) {
var _this = this;
return this._isClientProcessing(timeout).then(function (status) {
clearInterval(status.interval);
return _this._getBackend()
.getTransport()
.close(timeout)
.then(function (transportFlushed) { return status.ready && transportFlushed; });
});
};
/**
* @inheritDoc
*/
BaseClient.prototype.close = function (timeout) {
var _this = this;
return this.flush(timeout).then(function (result) {
_this.getOptions().enabled = false;
return result;
});
};
/**
* Sets up the integrations
*/
BaseClient.prototype.setupIntegrations = function () {
if (this._isEnabled()) {
this._integrations = Object(_integration__WEBPACK_IMPORTED_MODULE_3__["setupIntegrations"])(this._options);
}
};
/**
* @inheritDoc
*/
BaseClient.prototype.getIntegration = function (integration) {
try {
return this._integrations[integration.id] || null;
}
catch (_oO) {
_sentry_utils__WEBPACK_IMPORTED_MODULE_2__["logger"].warn("Cannot retrieve integration " + integration.id + " from the current Client");
return null;
}
};
/** Waits for the client to be done with processing. */
BaseClient.prototype._isClientProcessing = function (timeout) {
var _this = this;
return new _sentry_utils__WEBPACK_IMPORTED_MODULE_2__["SyncPromise"](function (resolve) {
var ticked = 0;
var tick = 1;
var interval = 0;
clearInterval(interval);
interval = setInterval(function () {
if (!_this._processing) {
resolve({
interval: interval,
ready: true,
});
}
else {
ticked += tick;
if (timeout && ticked >= timeout) {
resolve({
interval: interval,
ready: false,
});
}
}
}, tick);
});
};
/** Returns the current backend. */
BaseClient.prototype._getBackend = function () {
return this._backend;
};
/** Determines whether this SDK is enabled and a valid Dsn is present. */
BaseClient.prototype._isEnabled = function () {
return this.getOptions().enabled !== false && this._dsn !== undefined;
};
/**
* Adds common information to events.
*
* The information includes release and environment from `options`,
* breadcrumbs and context (extra, tags and user) from the scope.
*
* Information that is already present in the event is never overwritten. For
* nested objects, such as the context, keys are merged.
*
* @param event The original event.
* @param hint May contain additional information about the original exception.
* @param scope A scope containing event metadata.
* @returns A new event with more information.
*/
BaseClient.prototype._prepareEvent = function (event, scope, hint) {
var _this = this;
var _a = this.getOptions().normalizeDepth, normalizeDepth = _a === void 0 ? 3 : _a;
var prepared = tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({}, event, { event_id: event.event_id || (hint && hint.event_id ? hint.event_id : Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_2__["uuid4"])()), timestamp: event.timestamp || Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_2__["timestampWithMs"])() });
this._applyClientOptions(prepared);
this._applyIntegrationsMetadata(prepared);
// If we have scope given to us, use it as the base for further modifications.
// This allows us to prevent unnecessary copying of data if `captureContext` is not provided.
var finalScope = scope;
if (hint && hint.captureContext) {
finalScope = _sentry_hub__WEBPACK_IMPORTED_MODULE_1__["Scope"].clone(finalScope).update(hint.captureContext);
}
// We prepare the result here with a resolved Event.
var result = _sentry_utils__WEBPACK_IMPORTED_MODULE_2__["SyncPromise"].resolve(prepared);
// This should be the last thing called, since we want that
// {@link Hub.addEventProcessor} gets the finished prepared event.
if (finalScope) {
// In case we have a hub we reassign it.
result = finalScope.applyToEvent(prepared, hint);
}
return result.then(function (evt) {
// tslint:disable-next-line:strict-type-predicates
if (typeof normalizeDepth === 'number' && normalizeDepth > 0) {
return _this._normalizeEvent(evt, normalizeDepth);
}
return evt;
});
};
/**
* Applies `normalize` function on necessary `Event` attributes to make them safe for serialization.
* Normalized keys:
* - `breadcrumbs.data`
* - `user`
* - `contexts`
* - `extra`
* @param event Event
* @returns Normalized event
*/
BaseClient.prototype._normalizeEvent = function (event, depth) {
if (!event) {
return null;
}
// tslint:disable:no-unsafe-any
return tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({}, event, (event.breadcrumbs && {
breadcrumbs: event.breadcrumbs.map(function (b) { return (tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({}, b, (b.data && {
data: Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_2__["normalize"])(b.data, depth),
}))); }),
}), (event.user && {
user: Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_2__["normalize"])(event.user, depth),
}), (event.contexts && {
contexts: Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_2__["normalize"])(event.contexts, depth),
}), (event.extra && {
extra: Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_2__["normalize"])(event.extra, depth),
}));
};
/**
* Enhances event using the client configuration.
* It takes care of all "static" values like environment, release and `dist`,
* as well as truncating overly long values.
* @param event event instance to be enhanced
*/
BaseClient.prototype._applyClientOptions = function (event) {
var _a = this.getOptions(), environment = _a.environment, release = _a.release, dist = _a.dist, _b = _a.maxValueLength, maxValueLength = _b === void 0 ? 250 : _b;
if (event.environment === undefined && environment !== undefined) {
event.environment = environment;
}
if (event.release === undefined && release !== undefined) {
event.release = release;
}
if (event.dist === undefined && dist !== undefined) {
event.dist = dist;
}
if (event.message) {
event.message = Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_2__["truncate"])(event.message, maxValueLength);
}
var exception = event.exception && event.exception.values && event.exception.values[0];
if (exception && exception.value) {
exception.value = Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_2__["truncate"])(exception.value, maxValueLength);
}
var request = event.request;
if (request && request.url) {
request.url = Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_2__["truncate"])(request.url, maxValueLength);
}
};
/**
* This function adds all used integrations to the SDK info in the event.
* @param sdkInfo The sdkInfo of the event that will be filled with all integrations.
*/
BaseClient.prototype._applyIntegrationsMetadata = function (event) {
var sdkInfo = event.sdk;
var integrationsArray = Object.keys(this._integrations);
if (sdkInfo && integrationsArray.length > 0) {
sdkInfo.integrations = integrationsArray;
}
};
/**
* Tells the backend to send this event
* @param event The Sentry event to send
*/
BaseClient.prototype._sendEvent = function (event) {
this._getBackend().sendEvent(event);
};
/**
* Processes an event (either error or message) and sends it to Sentry.
*
* This also adds breadcrumbs and context information to the event. However,
* platform specific meta data (such as the User's IP address) must be added
* by the SDK implementor.
*
*
* @param event The event to send to Sentry.
* @param hint May contain additional information about the original exception.
* @param scope A scope containing event metadata.
* @returns A SyncPromise that resolves with the event or rejects in case event was/will not be send.
*/
BaseClient.prototype._processEvent = function (event, hint, scope) {
var _this = this;
var _a = this.getOptions(), beforeSend = _a.beforeSend, sampleRate = _a.sampleRate;
if (!this._isEnabled()) {
return _sentry_utils__WEBPACK_IMPORTED_MODULE_2__["SyncPromise"].reject('SDK not enabled, will not send event.');
}
var isTransaction = event.type === 'transaction';
// 1.0 === 100% events are sent
// 0.0 === 0% events are sent
// Sampling for transaction happens somewhere else
if (!isTransaction && typeof sampleRate === 'number' && Math.random() > sampleRate) {
return _sentry_utils__WEBPACK_IMPORTED_MODULE_2__["SyncPromise"].reject('This event has been sampled, will not send event.');
}
return new _sentry_utils__WEBPACK_IMPORTED_MODULE_2__["SyncPromise"](function (resolve, reject) {
_this._prepareEvent(event, scope, hint)
.then(function (prepared) {
if (prepared === null) {
reject('An event processor returned null, will not send event.');
return;
}
var finalEvent = prepared;
var isInternalException = hint && hint.data && hint.data.__sentry__ === true;
// We skip beforeSend in case of transactions
if (isInternalException || !beforeSend || isTransaction) {
_this._sendEvent(finalEvent);
resolve(finalEvent);
return;
}
var beforeSendResult = beforeSend(prepared, hint);
// tslint:disable-next-line:strict-type-predicates
if (typeof beforeSendResult === 'undefined') {
_sentry_utils__WEBPACK_IMPORTED_MODULE_2__["logger"].error('`beforeSend` method has to return `null` or a valid event.');
}
else if (Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_2__["isThenable"])(beforeSendResult)) {
_this._handleAsyncBeforeSend(beforeSendResult, resolve, reject);
}
else {
finalEvent = beforeSendResult;
if (finalEvent === null) {
_sentry_utils__WEBPACK_IMPORTED_MODULE_2__["logger"].log('`beforeSend` returned `null`, will not send event.');
resolve(null);
return;
}
// From here on we are really async
_this._sendEvent(finalEvent);
resolve(finalEvent);
}
})
.then(null, function (reason) {
_this.captureException(reason, {
data: {
__sentry__: true,
},
originalException: reason,
});
reject("Event processing pipeline threw an error, original event will not be sent. Details have been sent as a new event.\nReason: " + reason);
});
});
};
/**
* Resolves before send Promise and calls resolve/reject on parent SyncPromise.
*/
BaseClient.prototype._handleAsyncBeforeSend = function (beforeSend, resolve, reject) {
var _this = this;
beforeSend
.then(function (processedEvent) {
if (processedEvent === null) {
reject('`beforeSend` returned `null`, will not send event.');
return;
}
// From here on we are really async
_this._sendEvent(processedEvent);
resolve(processedEvent);
})
.then(null, function (e) {
reject("beforeSend rejected with " + e);
});
};
return BaseClient;
}());
//# sourceMappingURL=baseclient.js.map
/***/ }),
/***/ "./node_modules/@sentry/core/esm/index.js":
/*!************************************************!*\
!*** ./node_modules/@sentry/core/esm/index.js ***!
\************************************************/
/*! exports provided: addBreadcrumb, captureException, captureEvent, captureMessage, configureScope, startTransaction, setContext, setExtra, setExtras, setTag, setTags, setUser, withScope, addGlobalEventProcessor, getCurrentHub, getHubFromCarrier, Hub, Scope, API, BaseClient, BaseBackend, eventToSentryRequest, initAndBind, NoopTransport, Integrations */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _sentry_minimal__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @sentry/minimal */ "./node_modules/@sentry/minimal/esm/index.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "addBreadcrumb", function() { return _sentry_minimal__WEBPACK_IMPORTED_MODULE_0__["addBreadcrumb"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "captureException", function() { return _sentry_minimal__WEBPACK_IMPORTED_MODULE_0__["captureException"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "captureEvent", function() { return _sentry_minimal__WEBPACK_IMPORTED_MODULE_0__["captureEvent"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "captureMessage", function() { return _sentry_minimal__WEBPACK_IMPORTED_MODULE_0__["captureMessage"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "configureScope", function() { return _sentry_minimal__WEBPACK_IMPORTED_MODULE_0__["configureScope"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "startTransaction", function() { return _sentry_minimal__WEBPACK_IMPORTED_MODULE_0__["startTransaction"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "setContext", function() { return _sentry_minimal__WEBPACK_IMPORTED_MODULE_0__["setContext"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "setExtra", function() { return _sentry_minimal__WEBPACK_IMPORTED_MODULE_0__["setExtra"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "setExtras", function() { return _sentry_minimal__WEBPACK_IMPORTED_MODULE_0__["setExtras"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "setTag", function() { return _sentry_minimal__WEBPACK_IMPORTED_MODULE_0__["setTag"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "setTags", function() { return _sentry_minimal__WEBPACK_IMPORTED_MODULE_0__["setTags"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "setUser", function() { return _sentry_minimal__WEBPACK_IMPORTED_MODULE_0__["setUser"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "withScope", function() { return _sentry_minimal__WEBPACK_IMPORTED_MODULE_0__["withScope"]; });
/* harmony import */ var _sentry_hub__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @sentry/hub */ "./node_modules/@sentry/hub/esm/index.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "addGlobalEventProcessor", function() { return _sentry_hub__WEBPACK_IMPORTED_MODULE_1__["addGlobalEventProcessor"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getCurrentHub", function() { return _sentry_hub__WEBPACK_IMPORTED_MODULE_1__["getCurrentHub"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getHubFromCarrier", function() { return _sentry_hub__WEBPACK_IMPORTED_MODULE_1__["getHubFromCarrier"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Hub", function() { return _sentry_hub__WEBPACK_IMPORTED_MODULE_1__["Hub"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Scope", function() { return _sentry_hub__WEBPACK_IMPORTED_MODULE_1__["Scope"]; });
/* harmony import */ var _api__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./api */ "./node_modules/@sentry/core/esm/api.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "API", function() { return _api__WEBPACK_IMPORTED_MODULE_2__["API"]; });
/* harmony import */ var _baseclient__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./baseclient */ "./node_modules/@sentry/core/esm/baseclient.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "BaseClient", function() { return _baseclient__WEBPACK_IMPORTED_MODULE_3__["BaseClient"]; });
/* harmony import */ var _basebackend__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./basebackend */ "./node_modules/@sentry/core/esm/basebackend.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "BaseBackend", function() { return _basebackend__WEBPACK_IMPORTED_MODULE_4__["BaseBackend"]; });
/* harmony import */ var _request__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./request */ "./node_modules/@sentry/core/esm/request.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "eventToSentryRequest", function() { return _request__WEBPACK_IMPORTED_MODULE_5__["eventToSentryRequest"]; });
/* harmony import */ var _sdk__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./sdk */ "./node_modules/@sentry/core/esm/sdk.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "initAndBind", function() { return _sdk__WEBPACK_IMPORTED_MODULE_6__["initAndBind"]; });
/* harmony import */ var _transports_noop__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./transports/noop */ "./node_modules/@sentry/core/esm/transports/noop.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "NoopTransport", function() { return _transports_noop__WEBPACK_IMPORTED_MODULE_7__["NoopTransport"]; });
/* harmony import */ var _integrations__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./integrations */ "./node_modules/@sentry/core/esm/integrations/index.js");
/* harmony reexport (module object) */ __webpack_require__.d(__webpack_exports__, "Integrations", function() { return _integrations__WEBPACK_IMPORTED_MODULE_8__; });
//# sourceMappingURL=index.js.map
/***/ }),
/***/ "./node_modules/@sentry/core/esm/integration.js":
/*!******************************************************!*\
!*** ./node_modules/@sentry/core/esm/integration.js ***!
\******************************************************/
/*! exports provided: installedIntegrations, getIntegrationsToSetup, setupIntegration, setupIntegrations */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "installedIntegrations", function() { return installedIntegrations; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getIntegrationsToSetup", function() { return getIntegrationsToSetup; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setupIntegration", function() { return setupIntegration; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setupIntegrations", function() { return setupIntegrations; });
/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.js");
/* harmony import */ var _sentry_hub__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @sentry/hub */ "./node_modules/@sentry/hub/esm/index.js");
/* harmony import */ var _sentry_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @sentry/utils */ "./node_modules/@sentry/utils/esm/index.js");
var installedIntegrations = [];
/** Gets integration to install */
function getIntegrationsToSetup(options) {
var defaultIntegrations = (options.defaultIntegrations && tslib__WEBPACK_IMPORTED_MODULE_0__["__spread"](options.defaultIntegrations)) || [];
var userIntegrations = options.integrations;
var integrations = [];
if (Array.isArray(userIntegrations)) {
var userIntegrationsNames_1 = userIntegrations.map(function (i) { return i.name; });
var pickedIntegrationsNames_1 = [];
// Leave only unique default integrations, that were not overridden with provided user integrations
defaultIntegrations.forEach(function (defaultIntegration) {
if (userIntegrationsNames_1.indexOf(defaultIntegration.name) === -1 &&
pickedIntegrationsNames_1.indexOf(defaultIntegration.name) === -1) {
integrations.push(defaultIntegration);
pickedIntegrationsNames_1.push(defaultIntegration.name);
}
});
// Don't add same user integration twice
userIntegrations.forEach(function (userIntegration) {
if (pickedIntegrationsNames_1.indexOf(userIntegration.name) === -1) {
integrations.push(userIntegration);
pickedIntegrationsNames_1.push(userIntegration.name);
}
});
}
else if (typeof userIntegrations === 'function') {
integrations = userIntegrations(defaultIntegrations);
integrations = Array.isArray(integrations) ? integrations : [integrations];
}
else {
integrations = tslib__WEBPACK_IMPORTED_MODULE_0__["__spread"](defaultIntegrations);
}
// Make sure that if present, `Debug` integration will always run last
var integrationsNames = integrations.map(function (i) { return i.name; });
var alwaysLastToRun = 'Debug';
if (integrationsNames.indexOf(alwaysLastToRun) !== -1) {
integrations.push.apply(integrations, tslib__WEBPACK_IMPORTED_MODULE_0__["__spread"](integrations.splice(integrationsNames.indexOf(alwaysLastToRun), 1)));
}
return integrations;
}
/** Setup given integration */
function setupIntegration(integration) {
if (installedIntegrations.indexOf(integration.name) !== -1) {
return;
}
integration.setupOnce(_sentry_hub__WEBPACK_IMPORTED_MODULE_1__["addGlobalEventProcessor"], _sentry_hub__WEBPACK_IMPORTED_MODULE_1__["getCurrentHub"]);
installedIntegrations.push(integration.name);
_sentry_utils__WEBPACK_IMPORTED_MODULE_2__["logger"].log("Integration installed: " + integration.name);
}
/**
* Given a list of integration instances this installs them all. When `withDefaults` is set to `true` then all default
* integrations are added unless they were already provided before.
* @param integrations array of integration instances
* @param withDefault should enable default integrations
*/
function setupIntegrations(options) {
var integrations = {};
getIntegrationsToSetup(options).forEach(function (integration) {
integrations[integration.name] = integration;
setupIntegration(integration);
});
return integrations;
}
//# sourceMappingURL=integration.js.map
/***/ }),
/***/ "./node_modules/@sentry/core/esm/integrations/functiontostring.js":
/*!************************************************************************!*\
!*** ./node_modules/@sentry/core/esm/integrations/functiontostring.js ***!
\************************************************************************/
/*! exports provided: FunctionToString */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FunctionToString", function() { return FunctionToString; });
var originalFunctionToString;
/** Patch toString calls to return proper name for wrapped functions */
var FunctionToString = /** @class */ (function () {
function FunctionToString() {
/**
* @inheritDoc
*/
this.name = FunctionToString.id;
}
/**
* @inheritDoc
*/
FunctionToString.prototype.setupOnce = function () {
originalFunctionToString = Function.prototype.toString;
Function.prototype.toString = function () {
var args = [];
for (var _i = 0; _i < arguments.length; _i++) {
args[_i] = arguments[_i];
}
var context = this.__sentry_original__ || this;
// tslint:disable-next-line:no-unsafe-any
return originalFunctionToString.apply(context, args);
};
};
/**
* @inheritDoc
*/
FunctionToString.id = 'FunctionToString';
return FunctionToString;
}());
//# sourceMappingURL=functiontostring.js.map
/***/ }),
/***/ "./node_modules/@sentry/core/esm/integrations/inboundfilters.js":
/*!**********************************************************************!*\
!*** ./node_modules/@sentry/core/esm/integrations/inboundfilters.js ***!
\**********************************************************************/
/*! exports provided: InboundFilters */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "InboundFilters", function() { return InboundFilters; });
/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.js");
/* harmony import */ var _sentry_hub__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @sentry/hub */ "./node_modules/@sentry/hub/esm/index.js");
/* harmony import */ var _sentry_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @sentry/utils */ "./node_modules/@sentry/utils/esm/index.js");
// "Script error." is hard coded into browsers for errors that it can't read.
// this is the result of a script being pulled in from an external domain and CORS.
var DEFAULT_IGNORE_ERRORS = [/^Script error\.?$/, /^Javascript error: Script error\.? on line 0$/];
/** Inbound filters configurable by the user */
var InboundFilters = /** @class */ (function () {
function InboundFilters(_options) {
if (_options === void 0) { _options = {}; }
this._options = _options;
/**
* @inheritDoc
*/
this.name = InboundFilters.id;
}
/**
* @inheritDoc
*/
InboundFilters.prototype.setupOnce = function () {
Object(_sentry_hub__WEBPACK_IMPORTED_MODULE_1__["addGlobalEventProcessor"])(function (event) {
var hub = Object(_sentry_hub__WEBPACK_IMPORTED_MODULE_1__["getCurrentHub"])();
if (!hub) {
return event;
}
var self = hub.getIntegration(InboundFilters);
if (self) {
var client = hub.getClient();
var clientOptions = client ? client.getOptions() : {};
var options = self._mergeOptions(clientOptions);
if (self._shouldDropEvent(event, options)) {
return null;
}
}
return event;
});
};
/** JSDoc */
InboundFilters.prototype._shouldDropEvent = function (event, options) {
if (this._isSentryError(event, options)) {
_sentry_utils__WEBPACK_IMPORTED_MODULE_2__["logger"].warn("Event dropped due to being internal Sentry Error.\nEvent: " + Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_2__["getEventDescription"])(event));
return true;
}
if (this._isIgnoredError(event, options)) {
_sentry_utils__WEBPACK_IMPORTED_MODULE_2__["logger"].warn("Event dropped due to being matched by `ignoreErrors` option.\nEvent: " + Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_2__["getEventDescription"])(event));
return true;
}
if (this._isBlacklistedUrl(event, options)) {
_sentry_utils__WEBPACK_IMPORTED_MODULE_2__["logger"].warn("Event dropped due to being matched by `blacklistUrls` option.\nEvent: " + Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_2__["getEventDescription"])(event) + ".\nUrl: " + this._getEventFilterUrl(event));
return true;
}
if (!this._isWhitelistedUrl(event, options)) {
_sentry_utils__WEBPACK_IMPORTED_MODULE_2__["logger"].warn("Event dropped due to not being matched by `whitelistUrls` option.\nEvent: " + Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_2__["getEventDescription"])(event) + ".\nUrl: " + this._getEventFilterUrl(event));
return true;
}
return false;
};
/** JSDoc */
InboundFilters.prototype._isSentryError = function (event, options) {
if (options === void 0) { options = {}; }
if (!options.ignoreInternal) {
return false;
}
try {
return ((event &&
event.exception &&
event.exception.values &&
event.exception.values[0] &&
event.exception.values[0].type === 'SentryError') ||
false);
}
catch (_oO) {
return false;
}
};
/** JSDoc */
InboundFilters.prototype._isIgnoredError = function (event, options) {
if (options === void 0) { options = {}; }
if (!options.ignoreErrors || !options.ignoreErrors.length) {
return false;
}
return this._getPossibleEventMessages(event).some(function (message) {
// Not sure why TypeScript complains here...
return options.ignoreErrors.some(function (pattern) { return Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_2__["isMatchingPattern"])(message, pattern); });
});
};
/** JSDoc */
InboundFilters.prototype._isBlacklistedUrl = function (event, options) {
if (options === void 0) { options = {}; }
// TODO: Use Glob instead?
if (!options.blacklistUrls || !options.blacklistUrls.length) {
return false;
}
var url = this._getEventFilterUrl(event);
return !url ? false : options.blacklistUrls.some(function (pattern) { return Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_2__["isMatchingPattern"])(url, pattern); });
};
/** JSDoc */
InboundFilters.prototype._isWhitelistedUrl = function (event, options) {
if (options === void 0) { options = {}; }
// TODO: Use Glob instead?
if (!options.whitelistUrls || !options.whitelistUrls.length) {
return true;
}
var url = this._getEventFilterUrl(event);
return !url ? true : options.whitelistUrls.some(function (pattern) { return Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_2__["isMatchingPattern"])(url, pattern); });
};
/** JSDoc */
InboundFilters.prototype._mergeOptions = function (clientOptions) {
if (clientOptions === void 0) { clientOptions = {}; }
return {
blacklistUrls: tslib__WEBPACK_IMPORTED_MODULE_0__["__spread"]((this._options.blacklistUrls || []), (clientOptions.blacklistUrls || [])),
ignoreErrors: tslib__WEBPACK_IMPORTED_MODULE_0__["__spread"]((this._options.ignoreErrors || []), (clientOptions.ignoreErrors || []), DEFAULT_IGNORE_ERRORS),
ignoreInternal: typeof this._options.ignoreInternal !== 'undefined' ? this._options.ignoreInternal : true,
whitelistUrls: tslib__WEBPACK_IMPORTED_MODULE_0__["__spread"]((this._options.whitelistUrls || []), (clientOptions.whitelistUrls || [])),
};
};
/** JSDoc */
InboundFilters.prototype._getPossibleEventMessages = function (event) {
if (event.message) {
return [event.message];
}
if (event.exception) {
try {
var _a = (event.exception.values && event.exception.values[0]) || {}, _b = _a.type, type = _b === void 0 ? '' : _b, _c = _a.value, value = _c === void 0 ? '' : _c;
return ["" + value, type + ": " + value];
}
catch (oO) {
_sentry_utils__WEBPACK_IMPORTED_MODULE_2__["logger"].error("Cannot extract message for event " + Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_2__["getEventDescription"])(event));
return [];
}
}
return [];
};
/** JSDoc */
InboundFilters.prototype._getEventFilterUrl = function (event) {
try {
if (event.stacktrace) {
var frames_1 = event.stacktrace.frames;
return (frames_1 && frames_1[frames_1.length - 1].filename) || null;
}
if (event.exception) {
var frames_2 = event.exception.values && event.exception.values[0].stacktrace && event.exception.values[0].stacktrace.frames;
return (frames_2 && frames_2[frames_2.length - 1].filename) || null;
}
return null;
}
catch (oO) {
_sentry_utils__WEBPACK_IMPORTED_MODULE_2__["logger"].error("Cannot extract url for event " + Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_2__["getEventDescription"])(event));
return null;
}
};
/**
* @inheritDoc
*/
InboundFilters.id = 'InboundFilters';
return InboundFilters;
}());
//# sourceMappingURL=inboundfilters.js.map
/***/ }),
/***/ "./node_modules/@sentry/core/esm/integrations/index.js":
/*!*************************************************************!*\
!*** ./node_modules/@sentry/core/esm/integrations/index.js ***!
\*************************************************************/
/*! exports provided: FunctionToString, InboundFilters */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _functiontostring__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./functiontostring */ "./node_modules/@sentry/core/esm/integrations/functiontostring.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "FunctionToString", function() { return _functiontostring__WEBPACK_IMPORTED_MODULE_0__["FunctionToString"]; });
/* harmony import */ var _inboundfilters__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./inboundfilters */ "./node_modules/@sentry/core/esm/integrations/inboundfilters.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "InboundFilters", function() { return _inboundfilters__WEBPACK_IMPORTED_MODULE_1__["InboundFilters"]; });
//# sourceMappingURL=index.js.map
/***/ }),
/***/ "./node_modules/@sentry/core/esm/request.js":
/*!**************************************************!*\
!*** ./node_modules/@sentry/core/esm/request.js ***!
\**************************************************/
/*! exports provided: eventToSentryRequest */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "eventToSentryRequest", function() { return eventToSentryRequest; });
/* harmony import */ var _sentry_utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @sentry/utils */ "./node_modules/@sentry/utils/esm/index.js");
/** Creates a SentryRequest from an event. */
function eventToSentryRequest(event, api) {
var useEnvelope = event.type === 'transaction';
var req = {
body: JSON.stringify(event),
url: useEnvelope ? api.getEnvelopeEndpointWithUrlEncodedAuth() : api.getStoreEndpointWithUrlEncodedAuth(),
};
// https://develop.sentry.dev/sdk/envelopes/
// Since we don't need to manipulate envelopes nor store them, there is no
// exported concept of an Envelope with operations including serialization and
// deserialization. Instead, we only implement a minimal subset of the spec to
// serialize events inline here.
if (useEnvelope) {
var envelopeHeaders = JSON.stringify({
event_id: event.event_id,
// We need to add * 1000 since we divide it by 1000 by default but JS works with ms precision
// The reason we use timestampWithMs here is that all clocks across the SDK use the same clock
sent_at: new Date(Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_0__["timestampWithMs"])() * 1000).toISOString(),
});
var itemHeaders = JSON.stringify({
type: event.type,
});
// The trailing newline is optional. We intentionally don't send it to avoid
// sending unnecessary bytes.
//
// const envelope = `${envelopeHeaders}\n${itemHeaders}\n${req.body}\n`;
var envelope = envelopeHeaders + "\n" + itemHeaders + "\n" + req.body;
req.body = envelope;
}
return req;
}
//# sourceMappingURL=request.js.map
/***/ }),
/***/ "./node_modules/@sentry/core/esm/sdk.js":
/*!**********************************************!*\
!*** ./node_modules/@sentry/core/esm/sdk.js ***!
\**********************************************/
/*! exports provided: initAndBind */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "initAndBind", function() { return initAndBind; });
/* harmony import */ var _sentry_hub__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @sentry/hub */ "./node_modules/@sentry/hub/esm/index.js");
/* harmony import */ var _sentry_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @sentry/utils */ "./node_modules/@sentry/utils/esm/index.js");
/**
* Internal function to create a new SDK client instance. The client is
* installed and then bound to the current scope.
*
* @param clientClass The client class to instanciate.
* @param options Options to pass to the client.
*/
function initAndBind(clientClass, options) {
if (options.debug === true) {
_sentry_utils__WEBPACK_IMPORTED_MODULE_1__["logger"].enable();
}
var hub = Object(_sentry_hub__WEBPACK_IMPORTED_MODULE_0__["getCurrentHub"])();
var client = new clientClass(options);
hub.bindClient(client);
}
//# sourceMappingURL=sdk.js.map
/***/ }),
/***/ "./node_modules/@sentry/core/esm/transports/noop.js":
/*!**********************************************************!*\
!*** ./node_modules/@sentry/core/esm/transports/noop.js ***!
\**********************************************************/
/*! exports provided: NoopTransport */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "NoopTransport", function() { return NoopTransport; });
/* harmony import */ var _sentry_types__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @sentry/types */ "./node_modules/@sentry/types/esm/index.js");
/* harmony import */ var _sentry_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @sentry/utils */ "./node_modules/@sentry/utils/esm/index.js");
/** Noop transport */
var NoopTransport = /** @class */ (function () {
function NoopTransport() {
}
/**
* @inheritDoc
*/
NoopTransport.prototype.sendEvent = function (_) {
return _sentry_utils__WEBPACK_IMPORTED_MODULE_1__["SyncPromise"].resolve({
reason: "NoopTransport: Event has been skipped because no Dsn is configured.",
status: _sentry_types__WEBPACK_IMPORTED_MODULE_0__["Status"].Skipped,
});
};
/**
* @inheritDoc
*/
NoopTransport.prototype.close = function (_) {
return _sentry_utils__WEBPACK_IMPORTED_MODULE_1__["SyncPromise"].resolve(true);
};
return NoopTransport;
}());
//# sourceMappingURL=noop.js.map
/***/ }),
/***/ "./node_modules/@sentry/hub/esm/hub.js":
/*!*********************************************!*\
!*** ./node_modules/@sentry/hub/esm/hub.js ***!
\*********************************************/
/*! exports provided: API_VERSION, Hub, getMainCarrier, makeMain, getCurrentHub, getHubFromCarrier, setHubOnCarrier */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "API_VERSION", function() { return API_VERSION; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Hub", function() { return Hub; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getMainCarrier", function() { return getMainCarrier; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "makeMain", function() { return makeMain; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getCurrentHub", function() { return getCurrentHub; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getHubFromCarrier", function() { return getHubFromCarrier; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setHubOnCarrier", function() { return setHubOnCarrier; });
/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.js");
/* harmony import */ var _sentry_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @sentry/utils */ "./node_modules/@sentry/utils/esm/index.js");
/* harmony import */ var _scope__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./scope */ "./node_modules/@sentry/hub/esm/scope.js");
/**
* API compatibility version of this hub.
*
* WARNING: This number should only be incresed when the global interface
* changes a and new methods are introduced.
*
* @hidden
*/
var API_VERSION = 3;
/**
* Default maximum number of breadcrumbs added to an event. Can be overwritten
* with {@link Options.maxBreadcrumbs}.
*/
var DEFAULT_BREADCRUMBS = 100;
/**
* Absolute maximum number of breadcrumbs added to an event. The
* `maxBreadcrumbs` option cannot be higher than this value.
*/
var MAX_BREADCRUMBS = 100;
/**
* @inheritDoc
*/
var Hub = /** @class */ (function () {
/**
* Creates a new instance of the hub, will push one {@link Layer} into the
* internal stack on creation.
*
* @param client bound to the hub.
* @param scope bound to the hub.
* @param version number, higher number means higher priority.
*/
function Hub(client, scope, _version) {
if (scope === void 0) { scope = new _scope__WEBPACK_IMPORTED_MODULE_2__["Scope"](); }
if (_version === void 0) { _version = API_VERSION; }
this._version = _version;
/** Is a {@link Layer}[] containing the client and scope */
this._stack = [];
this._stack.push({ client: client, scope: scope });
}
/**
* Internal helper function to call a method on the top client if it exists.
*
* @param method The method to call on the client.
* @param args Arguments to pass to the client function.
*/
Hub.prototype._invokeClient = function (method) {
var _a;
var args = [];
for (var _i = 1; _i < arguments.length; _i++) {
args[_i - 1] = arguments[_i];
}
var top = this.getStackTop();
if (top && top.client && top.client[method]) {
(_a = top.client)[method].apply(_a, tslib__WEBPACK_IMPORTED_MODULE_0__["__spread"](args, [top.scope]));
}
};
/**
* @inheritDoc
*/
Hub.prototype.isOlderThan = function (version) {
return this._version < version;
};
/**
* @inheritDoc
*/
Hub.prototype.bindClient = function (client) {
var top = this.getStackTop();
top.client = client;
if (client && client.setupIntegrations) {
client.setupIntegrations();
}
};
/**
* @inheritDoc
*/
Hub.prototype.pushScope = function () {
// We want to clone the content of prev scope
var stack = this.getStack();
var parentScope = stack.length > 0 ? stack[stack.length - 1].scope : undefined;
var scope = _scope__WEBPACK_IMPORTED_MODULE_2__["Scope"].clone(parentScope);
this.getStack().push({
client: this.getClient(),
scope: scope,
});
return scope;
};
/**
* @inheritDoc
*/
Hub.prototype.popScope = function () {
return this.getStack().pop() !== undefined;
};
/**
* @inheritDoc
*/
Hub.prototype.withScope = function (callback) {
var scope = this.pushScope();
try {
callback(scope);
}
finally {
this.popScope();
}
};
/**
* @inheritDoc
*/
Hub.prototype.getClient = function () {
return this.getStackTop().client;
};
/** Returns the scope of the top stack. */
Hub.prototype.getScope = function () {
return this.getStackTop().scope;
};
/** Returns the scope stack for domains or the process. */
Hub.prototype.getStack = function () {
return this._stack;
};
/** Returns the topmost scope layer in the order domain > local > process. */
Hub.prototype.getStackTop = function () {
return this._stack[this._stack.length - 1];
};
/**
* @inheritDoc
*/
Hub.prototype.captureException = function (exception, hint) {
var eventId = (this._lastEventId = Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_1__["uuid4"])());
var finalHint = hint;
// If there's no explicit hint provided, mimick the same thing that would happen
// in the minimal itself to create a consistent behavior.
// We don't do this in the client, as it's the lowest level API, and doing this,
// would prevent user from having full control over direct calls.
if (!hint) {
var syntheticException = void 0;
try {
throw new Error('Sentry syntheticException');
}
catch (exception) {
syntheticException = exception;
}
finalHint = {
originalException: exception,
syntheticException: syntheticException,
};
}
this._invokeClient('captureException', exception, tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({}, finalHint, { event_id: eventId }));
return eventId;
};
/**
* @inheritDoc
*/
Hub.prototype.captureMessage = function (message, level, hint) {
var eventId = (this._lastEventId = Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_1__["uuid4"])());
var finalHint = hint;
// If there's no explicit hint provided, mimick the same thing that would happen
// in the minimal itself to create a consistent behavior.
// We don't do this in the client, as it's the lowest level API, and doing this,
// would prevent user from having full control over direct calls.
if (!hint) {
var syntheticException = void 0;
try {
throw new Error(message);
}
catch (exception) {
syntheticException = exception;
}
finalHint = {
originalException: message,
syntheticException: syntheticException,
};
}
this._invokeClient('captureMessage', message, level, tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({}, finalHint, { event_id: eventId }));
return eventId;
};
/**
* @inheritDoc
*/
Hub.prototype.captureEvent = function (event, hint) {
var eventId = (this._lastEventId = Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_1__["uuid4"])());
this._invokeClient('captureEvent', event, tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({}, hint, { event_id: eventId }));
return eventId;
};
/**
* @inheritDoc
*/
Hub.prototype.lastEventId = function () {
return this._lastEventId;
};
/**
* @inheritDoc
*/
Hub.prototype.addBreadcrumb = function (breadcrumb, hint) {
var top = this.getStackTop();
if (!top.scope || !top.client) {
return;
}
var _a = (top.client.getOptions && top.client.getOptions()) || {}, _b = _a.beforeBreadcrumb, beforeBreadcrumb = _b === void 0 ? null : _b, _c = _a.maxBreadcrumbs, maxBreadcrumbs = _c === void 0 ? DEFAULT_BREADCRUMBS : _c;
if (maxBreadcrumbs <= 0) {
return;
}
var timestamp = Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_1__["timestampWithMs"])();
var mergedBreadcrumb = tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({ timestamp: timestamp }, breadcrumb);
var finalBreadcrumb = beforeBreadcrumb
? Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_1__["consoleSandbox"])(function () { return beforeBreadcrumb(mergedBreadcrumb, hint); })
: mergedBreadcrumb;
if (finalBreadcrumb === null) {
return;
}
top.scope.addBreadcrumb(finalBreadcrumb, Math.min(maxBreadcrumbs, MAX_BREADCRUMBS));
};
/**
* @inheritDoc
*/
Hub.prototype.setUser = function (user) {
var top = this.getStackTop();
if (!top.scope) {
return;
}
top.scope.setUser(user);
};
/**
* @inheritDoc
*/
Hub.prototype.setTags = function (tags) {
var top = this.getStackTop();
if (!top.scope) {
return;
}
top.scope.setTags(tags);
};
/**
* @inheritDoc
*/
Hub.prototype.setExtras = function (extras) {
var top = this.getStackTop();
if (!top.scope) {
return;
}
top.scope.setExtras(extras);
};
/**
* @inheritDoc
*/
Hub.prototype.setTag = function (key, value) {
var top = this.getStackTop();
if (!top.scope) {
return;
}
top.scope.setTag(key, value);
};
/**
* @inheritDoc
*/
Hub.prototype.setExtra = function (key, extra) {
var top = this.getStackTop();
if (!top.scope) {
return;
}
top.scope.setExtra(key, extra);
};
/**
* @inheritDoc
*/
Hub.prototype.setContext = function (name, context) {
var top = this.getStackTop();
if (!top.scope) {
return;
}
top.scope.setContext(name, context);
};
/**
* @inheritDoc
*/
Hub.prototype.configureScope = function (callback) {
var top = this.getStackTop();
if (top.scope && top.client) {
callback(top.scope);
}
};
/**
* @inheritDoc
*/
Hub.prototype.run = function (callback) {
var oldHub = makeMain(this);
try {
callback(this);
}
finally {
makeMain(oldHub);
}
};
/**
* @inheritDoc
*/
Hub.prototype.getIntegration = function (integration) {
var client = this.getClient();
if (!client) {
return null;
}
try {
return client.getIntegration(integration);
}
catch (_oO) {
_sentry_utils__WEBPACK_IMPORTED_MODULE_1__["logger"].warn("Cannot retrieve integration " + integration.id + " from the current Hub");
return null;
}
};
/**
* @inheritDoc
*/
Hub.prototype.startSpan = function (context) {
return this._callExtensionMethod('startSpan', context);
};
/**
* @inheritDoc
*/
Hub.prototype.startTransaction = function (context) {
return this._callExtensionMethod('startTransaction', context);
};
/**
* @inheritDoc
*/
Hub.prototype.traceHeaders = function () {
return this._callExtensionMethod('traceHeaders');
};
/**
* Calls global extension method and binding current instance to the function call
*/
// @ts-ignore
Hub.prototype._callExtensionMethod = function (method) {
var args = [];
for (var _i = 1; _i < arguments.length; _i++) {
args[_i - 1] = arguments[_i];
}
var carrier = getMainCarrier();
var sentry = carrier.__SENTRY__;
// tslint:disable-next-line: strict-type-predicates
if (sentry && sentry.extensions && typeof sentry.extensions[method] === 'function') {
return sentry.extensions[method].apply(this, args);
}
_sentry_utils__WEBPACK_IMPORTED_MODULE_1__["logger"].warn("Extension method " + method + " couldn't be found, doing nothing.");
};
return Hub;
}());
/** Returns the global shim registry. */
function getMainCarrier() {
var carrier = Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_1__["getGlobalObject"])();
carrier.__SENTRY__ = carrier.__SENTRY__ || {
extensions: {},
hub: undefined,
};
return carrier;
}
/**
* Replaces the current main hub with the passed one on the global object
*
* @returns The old replaced hub
*/
function makeMain(hub) {
var registry = getMainCarrier();
var oldHub = getHubFromCarrier(registry);
setHubOnCarrier(registry, hub);
return oldHub;
}
/**
* Returns the default hub instance.
*
* If a hub is already registered in the global carrier but this module
* contains a more recent version, it replaces the registered version.
* Otherwise, the currently registered hub will be returned.
*/
function getCurrentHub() {
// Get main carrier (global for every environment)
var registry = getMainCarrier();
// If there's no hub, or its an old API, assign a new one
if (!hasHubOnCarrier(registry) || getHubFromCarrier(registry).isOlderThan(API_VERSION)) {
setHubOnCarrier(registry, new Hub());
}
// Prefer domains over global if they are there (applicable only to Node environment)
if (Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_1__["isNodeEnv"])()) {
return getHubFromActiveDomain(registry);
}
// Return hub that lives on a global object
return getHubFromCarrier(registry);
}
/**
* Try to read the hub from an active domain, fallback to the registry if one doesnt exist
* @returns discovered hub
*/
function getHubFromActiveDomain(registry) {
try {
var property = 'domain';
var carrier = getMainCarrier();
var sentry = carrier.__SENTRY__;
// tslint:disable-next-line: strict-type-predicates
if (!sentry || !sentry.extensions || !sentry.extensions[property]) {
return getHubFromCarrier(registry);
}
var domain = sentry.extensions[property];
var activeDomain = domain.active;
// If there no active domain, just return global hub
if (!activeDomain) {
return getHubFromCarrier(registry);
}
// If there's no hub on current domain, or its an old API, assign a new one
if (!hasHubOnCarrier(activeDomain) || getHubFromCarrier(activeDomain).isOlderThan(API_VERSION)) {
var registryHubTopStack = getHubFromCarrier(registry).getStackTop();
setHubOnCarrier(activeDomain, new Hub(registryHubTopStack.client, _scope__WEBPACK_IMPORTED_MODULE_2__["Scope"].clone(registryHubTopStack.scope)));
}
// Return hub that lives on a domain
return getHubFromCarrier(activeDomain);
}
catch (_Oo) {
// Return hub that lives on a global object
return getHubFromCarrier(registry);
}
}
/**
* This will tell whether a carrier has a hub on it or not
* @param carrier object
*/
function hasHubOnCarrier(carrier) {
if (carrier && carrier.__SENTRY__ && carrier.__SENTRY__.hub) {
return true;
}
return false;
}
/**
* This will create a new {@link Hub} and add to the passed object on
* __SENTRY__.hub.
* @param carrier object
* @hidden
*/
function getHubFromCarrier(carrier) {
if (carrier && carrier.__SENTRY__ && carrier.__SENTRY__.hub) {
return carrier.__SENTRY__.hub;
}
carrier.__SENTRY__ = carrier.__SENTRY__ || {};
carrier.__SENTRY__.hub = new Hub();
return carrier.__SENTRY__.hub;
}
/**
* This will set passed {@link Hub} on the passed object's __SENTRY__.hub attribute
* @param carrier object
* @param hub Hub
*/
function setHubOnCarrier(carrier, hub) {
if (!carrier) {
return false;
}
carrier.__SENTRY__ = carrier.__SENTRY__ || {};
carrier.__SENTRY__.hub = hub;
return true;
}
//# sourceMappingURL=hub.js.map
/***/ }),
/***/ "./node_modules/@sentry/hub/esm/index.js":
/*!***********************************************!*\
!*** ./node_modules/@sentry/hub/esm/index.js ***!
\***********************************************/
/*! exports provided: addGlobalEventProcessor, Scope, getCurrentHub, getHubFromCarrier, getMainCarrier, Hub, makeMain, setHubOnCarrier */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _scope__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./scope */ "./node_modules/@sentry/hub/esm/scope.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "addGlobalEventProcessor", function() { return _scope__WEBPACK_IMPORTED_MODULE_0__["addGlobalEventProcessor"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Scope", function() { return _scope__WEBPACK_IMPORTED_MODULE_0__["Scope"]; });
/* harmony import */ var _hub__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./hub */ "./node_modules/@sentry/hub/esm/hub.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getCurrentHub", function() { return _hub__WEBPACK_IMPORTED_MODULE_1__["getCurrentHub"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getHubFromCarrier", function() { return _hub__WEBPACK_IMPORTED_MODULE_1__["getHubFromCarrier"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getMainCarrier", function() { return _hub__WEBPACK_IMPORTED_MODULE_1__["getMainCarrier"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Hub", function() { return _hub__WEBPACK_IMPORTED_MODULE_1__["Hub"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "makeMain", function() { return _hub__WEBPACK_IMPORTED_MODULE_1__["makeMain"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "setHubOnCarrier", function() { return _hub__WEBPACK_IMPORTED_MODULE_1__["setHubOnCarrier"]; });
//# sourceMappingURL=index.js.map
/***/ }),
/***/ "./node_modules/@sentry/hub/esm/scope.js":
/*!***********************************************!*\
!*** ./node_modules/@sentry/hub/esm/scope.js ***!
\***********************************************/
/*! exports provided: Scope, addGlobalEventProcessor */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Scope", function() { return Scope; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addGlobalEventProcessor", function() { return addGlobalEventProcessor; });
/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.js");
/* harmony import */ var _sentry_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @sentry/utils */ "./node_modules/@sentry/utils/esm/index.js");
/**
* Holds additional event information. {@link Scope.applyToEvent} will be
* called by the client before an event will be sent.
*/
var Scope = /** @class */ (function () {
function Scope() {
/** Flag if notifiying is happening. */
this._notifyingListeners = false;
/** Callback for client to receive scope changes. */
this._scopeListeners = [];
/** Callback list that will be called after {@link applyToEvent}. */
this._eventProcessors = [];
/** Array of breadcrumbs. */
this._breadcrumbs = [];
/** User */
this._user = {};
/** Tags */
this._tags = {};
/** Extra */
this._extra = {};
/** Contexts */
this._contexts = {};
}
/**
* Add internal on change listener. Used for sub SDKs that need to store the scope.
* @hidden
*/
Scope.prototype.addScopeListener = function (callback) {
this._scopeListeners.push(callback);
};
/**
* @inheritDoc
*/
Scope.prototype.addEventProcessor = function (callback) {
this._eventProcessors.push(callback);
return this;
};
/**
* This will be called on every set call.
*/
Scope.prototype._notifyScopeListeners = function () {
var _this = this;
if (!this._notifyingListeners) {
this._notifyingListeners = true;
setTimeout(function () {
_this._scopeListeners.forEach(function (callback) {
callback(_this);
});
_this._notifyingListeners = false;
});
}
};
/**
* This will be called after {@link applyToEvent} is finished.
*/
Scope.prototype._notifyEventProcessors = function (processors, event, hint, index) {
var _this = this;
if (index === void 0) { index = 0; }
return new _sentry_utils__WEBPACK_IMPORTED_MODULE_1__["SyncPromise"](function (resolve, reject) {
var processor = processors[index];
// tslint:disable-next-line:strict-type-predicates
if (event === null || typeof processor !== 'function') {
resolve(event);
}
else {
var result = processor(tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({}, event), hint);
if (Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_1__["isThenable"])(result)) {
result
.then(function (final) { return _this._notifyEventProcessors(processors, final, hint, index + 1).then(resolve); })
.then(null, reject);
}
else {
_this._notifyEventProcessors(processors, result, hint, index + 1)
.then(resolve)
.then(null, reject);
}
}
});
};
/**
* @inheritDoc
*/
Scope.prototype.setUser = function (user) {
this._user = user || {};
this._notifyScopeListeners();
return this;
};
/**
* @inheritDoc
*/
Scope.prototype.setTags = function (tags) {
this._tags = tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({}, this._tags, tags);
this._notifyScopeListeners();
return this;
};
/**
* @inheritDoc
*/
Scope.prototype.setTag = function (key, value) {
var _a;
this._tags = tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({}, this._tags, (_a = {}, _a[key] = value, _a));
this._notifyScopeListeners();
return this;
};
/**
* @inheritDoc
*/
Scope.prototype.setExtras = function (extras) {
this._extra = tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({}, this._extra, extras);
this._notifyScopeListeners();
return this;
};
/**
* @inheritDoc
*/
Scope.prototype.setExtra = function (key, extra) {
var _a;
this._extra = tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({}, this._extra, (_a = {}, _a[key] = extra, _a));
this._notifyScopeListeners();
return this;
};
/**
* @inheritDoc
*/
Scope.prototype.setFingerprint = function (fingerprint) {
this._fingerprint = fingerprint;
this._notifyScopeListeners();
return this;
};
/**
* @inheritDoc
*/
Scope.prototype.setLevel = function (level) {
this._level = level;
this._notifyScopeListeners();
return this;
};
/**
* @inheritDoc
*/
Scope.prototype.setTransaction = function (transaction) {
this._transaction = transaction;
this._notifyScopeListeners();
return this;
};
/**
* @inheritDoc
*/
Scope.prototype.setContext = function (key, context) {
var _a;
this._contexts = tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({}, this._contexts, (_a = {}, _a[key] = context, _a));
this._notifyScopeListeners();
return this;
};
/**
* @inheritDoc
*/
Scope.prototype.setSpan = function (span) {
this._span = span;
this._notifyScopeListeners();
return this;
};
/**
* Internal getter for Span, used in Hub.
* @hidden
*/
Scope.prototype.getSpan = function () {
return this._span;
};
/**
* Inherit values from the parent scope.
* @param scope to clone.
*/
Scope.clone = function (scope) {
var newScope = new Scope();
if (scope) {
newScope._breadcrumbs = tslib__WEBPACK_IMPORTED_MODULE_0__["__spread"](scope._breadcrumbs);
newScope._tags = tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({}, scope._tags);
newScope._extra = tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({}, scope._extra);
newScope._contexts = tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({}, scope._contexts);
newScope._user = scope._user;
newScope._level = scope._level;
newScope._span = scope._span;
newScope._transaction = scope._transaction;
newScope._fingerprint = scope._fingerprint;
newScope._eventProcessors = tslib__WEBPACK_IMPORTED_MODULE_0__["__spread"](scope._eventProcessors);
}
return newScope;
};
/**
* @inheritDoc
*/
Scope.prototype.update = function (captureContext) {
if (!captureContext) {
return this;
}
if (typeof captureContext === 'function') {
var updatedScope = captureContext(this);
return updatedScope instanceof Scope ? updatedScope : this;
}
if (captureContext instanceof Scope) {
this._tags = tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({}, this._tags, captureContext._tags);
this._extra = tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({}, this._extra, captureContext._extra);
this._contexts = tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({}, this._contexts, captureContext._contexts);
if (captureContext._user) {
this._user = captureContext._user;
}
if (captureContext._level) {
this._level = captureContext._level;
}
if (captureContext._fingerprint) {
this._fingerprint = captureContext._fingerprint;
}
}
else if (Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_1__["isPlainObject"])(captureContext)) {
// tslint:disable-next-line:no-parameter-reassignment
captureContext = captureContext;
this._tags = tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({}, this._tags, captureContext.tags);
this._extra = tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({}, this._extra, captureContext.extra);
this._contexts = tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({}, this._contexts, captureContext.contexts);
if (captureContext.user) {
this._user = captureContext.user;
}
if (captureContext.level) {
this._level = captureContext.level;
}
if (captureContext.fingerprint) {
this._fingerprint = captureContext.fingerprint;
}
}
return this;
};
/**
* @inheritDoc
*/
Scope.prototype.clear = function () {
this._breadcrumbs = [];
this._tags = {};
this._extra = {};
this._user = {};
this._contexts = {};
this._level = undefined;
this._transaction = undefined;
this._fingerprint = undefined;
this._span = undefined;
this._notifyScopeListeners();
return this;
};
/**
* @inheritDoc
*/
Scope.prototype.addBreadcrumb = function (breadcrumb, maxBreadcrumbs) {
var mergedBreadcrumb = tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({ timestamp: Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_1__["timestampWithMs"])() }, breadcrumb);
this._breadcrumbs =
maxBreadcrumbs !== undefined && maxBreadcrumbs >= 0
? tslib__WEBPACK_IMPORTED_MODULE_0__["__spread"](this._breadcrumbs, [mergedBreadcrumb]).slice(-maxBreadcrumbs)
: tslib__WEBPACK_IMPORTED_MODULE_0__["__spread"](this._breadcrumbs, [mergedBreadcrumb]);
this._notifyScopeListeners();
return this;
};
/**
* @inheritDoc
*/
Scope.prototype.clearBreadcrumbs = function () {
this._breadcrumbs = [];
this._notifyScopeListeners();
return this;
};
/**
* Applies fingerprint from the scope to the event if there's one,
* uses message if there's one instead or get rid of empty fingerprint
*/
Scope.prototype._applyFingerprint = function (event) {
// Make sure it's an array first and we actually have something in place
event.fingerprint = event.fingerprint
? Array.isArray(event.fingerprint)
? event.fingerprint
: [event.fingerprint]
: [];
// If we have something on the scope, then merge it with event
if (this._fingerprint) {
event.fingerprint = event.fingerprint.concat(this._fingerprint);
}
// If we have no data at all, remove empty array default
if (event.fingerprint && !event.fingerprint.length) {
delete event.fingerprint;
}
};
/**
* Applies the current context and fingerprint to the event.
* Note that breadcrumbs will be added by the client.
* Also if the event has already breadcrumbs on it, we do not merge them.
* @param event Event
* @param hint May contain additional informartion about the original exception.
* @hidden
*/
Scope.prototype.applyToEvent = function (event, hint) {
if (this._extra && Object.keys(this._extra).length) {
event.extra = tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({}, this._extra, event.extra);
}
if (this._tags && Object.keys(this._tags).length) {
event.tags = tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({}, this._tags, event.tags);
}
if (this._user && Object.keys(this._user).length) {
event.user = tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({}, this._user, event.user);
}
if (this._contexts && Object.keys(this._contexts).length) {
event.contexts = tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({}, this._contexts, event.contexts);
}
if (this._level) {
event.level = this._level;
}
if (this._transaction) {
event.transaction = this._transaction;
}
this._applyFingerprint(event);
event.breadcrumbs = tslib__WEBPACK_IMPORTED_MODULE_0__["__spread"]((event.breadcrumbs || []), this._breadcrumbs);
event.breadcrumbs = event.breadcrumbs.length > 0 ? event.breadcrumbs : undefined;
return this._notifyEventProcessors(tslib__WEBPACK_IMPORTED_MODULE_0__["__spread"](getGlobalEventProcessors(), this._eventProcessors), event, hint);
};
return Scope;
}());
/**
* Retruns the global event processors.
*/
function getGlobalEventProcessors() {
var global = Object(_sentry_utils__WEBPACK_IMPORTED_MODULE_1__["getGlobalObject"])();
global.__SENTRY__ = global.__SENTRY__ || {};
global.__SENTRY__.globalEventProcessors = global.__SENTRY__.globalEventProcessors || [];
return global.__SENTRY__.globalEventProcessors;
}
/**
* Add a EventProcessor to be kept globally.
* @param callback EventProcessor to add
*/
function addGlobalEventProcessor(callback) {
getGlobalEventProcessors().push(callback);
}
//# sourceMappingURL=scope.js.map
/***/ }),
/***/ "./node_modules/@sentry/minimal/esm/index.js":
/*!***************************************************!*\
!*** ./node_modules/@sentry/minimal/esm/index.js ***!
\***************************************************/
/*! exports provided: captureException, captureMessage, captureEvent, configureScope, addBreadcrumb, setContext, setExtras, setTags, setExtra, setTag, setUser, withScope, _callOnClient, startTransaction */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "captureException", function() { return captureException; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "captureMessage", function() { return captureMessage; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "captureEvent", function() { return captureEvent; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "configureScope", function() { return configureScope; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addBreadcrumb", function() { return addBreadcrumb; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setContext", function() { return setContext; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setExtras", function() { return setExtras; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setTags", function() { return setTags; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setExtra", function() { return setExtra; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setTag", function() { return setTag; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setUser", function() { return setUser; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "withScope", function() { return withScope; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_callOnClient", function() { return _callOnClient; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "startTransaction", function() { return startTransaction; });
/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.js");
/* harmony import */ var _sentry_hub__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @sentry/hub */ "./node_modules/@sentry/hub/esm/index.js");
/**
* This calls a function on the current hub.
* @param method function to call on hub.
* @param args to pass to function.
*/
function callOnHub(method) {
var args = [];
for (var _i = 1; _i < arguments.length; _i++) {
args[_i - 1] = arguments[_i];
}
var hub = Object(_sentry_hub__WEBPACK_IMPORTED_MODULE_1__["getCurrentHub"])();
if (hub && hub[method]) {
// tslint:disable-next-line:no-unsafe-any
return hub[method].apply(hub, tslib__WEBPACK_IMPORTED_MODULE_0__["__spread"](args));
}
throw new Error("No hub defined or " + method + " was not found on the hub, please open a bug report.");
}
/**
* Captures an exception event and sends it to Sentry.
*
* @param exception An exception-like object.
* @returns The generated eventId.
*/
function captureException(exception, captureContext) {
var syntheticException;
try {
throw new Error('Sentry syntheticException');
}
catch (exception) {
syntheticException = exception;
}
return callOnHub('captureException', exception, {
captureContext: captureContext,
originalException: exception,
syntheticException: syntheticException,
});
}
/**
* Captures a message event and sends it to Sentry.
*
* @param message The message to send to Sentry.
* @param level Define the level of the message.
* @returns The generated eventId.
*/
function captureMessage(message, captureContext) {
var syntheticException;
try {
throw new Error(message);
}
catch (exception) {
syntheticException = exception;
}
// This is necessary to provide explicit scopes upgrade, without changing the original
// arrity of the `captureMessage(message, level)` method.
var level = typeof captureContext === 'string' ? captureContext : undefined;
var context = typeof captureContext !== 'string' ? { captureContext: captureContext } : undefined;
return callOnHub('captureMessage', message, level, tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({ originalException: message, syntheticException: syntheticException }, context));
}
/**
* Captures a manually created event and sends it to Sentry.
*
* @param event The event to send to Sentry.
* @returns The generated eventId.
*/
function captureEvent(event) {
return callOnHub('captureEvent', event);
}
/**
* Callback to set context information onto the scope.
* @param callback Callback function that receives Scope.
*/
function configureScope(callback) {
callOnHub('configureScope', callback);
}
/**
* Records a new breadcrumb which will be attached to future events.
*
* Breadcrumbs will be added to subsequent events to provide more context on
* user's actions prior to an error or crash.
*
* @param breadcrumb The breadcrumb to record.
*/
function addBreadcrumb(breadcrumb) {
callOnHub('addBreadcrumb', breadcrumb);
}
/**
* Sets context data with the given name.
* @param name of the context
* @param context Any kind of data. This data will be normalized.
*/
function setContext(name, context) {
callOnHub('setContext', name, context);
}
/**
* Set an object that will be merged sent as extra data with the event.
* @param extras Extras object to merge into current context.
*/
function setExtras(extras) {
callOnHub('setExtras', extras);
}
/**
* Set an object that will be merged sent as tags data with the event.
* @param tags Tags context object to merge into current context.
*/
function setTags(tags) {
callOnHub('setTags', tags);
}
/**
* Set key:value that will be sent as extra data with the event.
* @param key String of extra
* @param extra Any kind of data. This data will be normalized.
*/
function setExtra(key, extra) {
callOnHub('setExtra', key, extra);
}
/**
* Set key:value that will be sent as tags data with the event.
* @param key String key of tag
* @param value String value of tag
*/
function setTag(key, value) {
callOnHub('setTag', key, value);
}
/**
* Updates user context information for future events.
*
* @param user User context object to be set in the current context. Pass `null` to unset the user.
*/
function setUser(user) {
callOnHub('setUser', user);
}
/**
* Creates a new scope with and executes the given operation within.
* The scope is automatically removed once the operation
* finishes or throws.
*
* This is essentially a convenience function for:
*
* pushScope();
* callback();
* popScope();
*
* @param callback that will be enclosed into push/popScope.
*/
function withScope(callback) {
callOnHub('withScope', callback);
}
/**
* Calls a function on the latest client. Use this with caution, it's meant as
* in "internal" helper so we don't need to expose every possible function in
* the shim. It is not guaranteed that the client actually implements the
* function.
*
* @param method The method to call on the client/client.
* @param args Arguments to pass to the client/fontend.
* @hidden
*/
function _callOnClient(method) {
var args = [];
for (var _i = 1; _i < arguments.length; _i++) {
args[_i - 1] = arguments[_i];
}
callOnHub.apply(void 0, tslib__WEBPACK_IMPORTED_MODULE_0__["__spread"](['_invokeClient', method], args));
}
/**
* Starts a Transaction. This is the entry point to do manual tracing. You can
* add child spans to transactions. Spans themselves can have children, building
* a tree structure. This function returns a Transaction and you need to keep
* track of the instance yourself. When you call `.finish()` on the transaction
* it will be sent to Sentry.
*/
function startTransaction(context) {
return callOnHub('startTransaction', tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({}, context));
}
//# sourceMappingURL=index.js.map
/***/ }),
/***/ "./node_modules/@sentry/types/esm/index.js":
/*!*************************************************!*\
!*** ./node_modules/@sentry/types/esm/index.js ***!
\*************************************************/
/*! exports provided: LogLevel, Severity, Status */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _loglevel__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./loglevel */ "./node_modules/@sentry/types/esm/loglevel.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "LogLevel", function() { return _loglevel__WEBPACK_IMPORTED_MODULE_0__["LogLevel"]; });
/* harmony import */ var _severity__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./severity */ "./node_modules/@sentry/types/esm/severity.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Severity", function() { return _severity__WEBPACK_IMPORTED_MODULE_1__["Severity"]; });
/* harmony import */ var _status__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./status */ "./node_modules/@sentry/types/esm/status.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Status", function() { return _status__WEBPACK_IMPORTED_MODULE_2__["Status"]; });
//# sourceMappingURL=index.js.map
/***/ }),
/***/ "./node_modules/@sentry/types/esm/loglevel.js":
/*!****************************************************!*\
!*** ./node_modules/@sentry/types/esm/loglevel.js ***!
\****************************************************/
/*! exports provided: LogLevel */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "LogLevel", function() { return LogLevel; });
/** Console logging verbosity for the SDK. */
var LogLevel;
(function (LogLevel) {
/** No logs will be generated. */
LogLevel[LogLevel["None"] = 0] = "None";
/** Only SDK internal errors will be logged. */
LogLevel[LogLevel["Error"] = 1] = "Error";
/** Information useful for debugging the SDK will be logged. */
LogLevel[LogLevel["Debug"] = 2] = "Debug";
/** All SDK actions will be logged. */
LogLevel[LogLevel["Verbose"] = 3] = "Verbose";
})(LogLevel || (LogLevel = {}));
//# sourceMappingURL=loglevel.js.map
/***/ }),
/***/ "./node_modules/@sentry/types/esm/severity.js":
/*!****************************************************!*\
!*** ./node_modules/@sentry/types/esm/severity.js ***!
\****************************************************/
/*! exports provided: Severity */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Severity", function() { return Severity; });
/** JSDoc */
var Severity;
(function (Severity) {
/** JSDoc */
Severity["Fatal"] = "fatal";
/** JSDoc */
Severity["Error"] = "error";
/** JSDoc */
Severity["Warning"] = "warning";
/** JSDoc */
Severity["Log"] = "log";
/** JSDoc */
Severity["Info"] = "info";
/** JSDoc */
Severity["Debug"] = "debug";
/** JSDoc */
Severity["Critical"] = "critical";
})(Severity || (Severity = {}));
// tslint:disable:completed-docs
// tslint:disable:no-unnecessary-qualifier no-namespace
(function (Severity) {
/**
* Converts a string-based level into a {@link Severity}.
*
* @param level string representation of Severity
* @returns Severity
*/
function fromString(level) {
switch (level) {
case 'debug':
return Severity.Debug;
case 'info':
return Severity.Info;
case 'warn':
case 'warning':
return Severity.Warning;
case 'error':
return Severity.Error;
case 'fatal':
return Severity.Fatal;
case 'critical':
return Severity.Critical;
case 'log':
default:
return Severity.Log;
}
}
Severity.fromString = fromString;
})(Severity || (Severity = {}));
//# sourceMappingURL=severity.js.map
/***/ }),
/***/ "./node_modules/@sentry/types/esm/status.js":
/*!**************************************************!*\
!*** ./node_modules/@sentry/types/esm/status.js ***!
\**************************************************/
/*! exports provided: Status */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Status", function() { return Status; });
/** The status of an event. */
var Status;
(function (Status) {
/** The status could not be determined. */
Status["Unknown"] = "unknown";
/** The event was skipped due to configuration or callbacks. */
Status["Skipped"] = "skipped";
/** The event was sent to Sentry successfully. */
Status["Success"] = "success";
/** The client is currently rate limited and will try again later. */
Status["RateLimit"] = "rate_limit";
/** The event could not be processed. */
Status["Invalid"] = "invalid";
/** A server-side error ocurred during submission. */
Status["Failed"] = "failed";
})(Status || (Status = {}));
// tslint:disable:completed-docs
// tslint:disable:no-unnecessary-qualifier no-namespace
(function (Status) {
/**
* Converts a HTTP status code into a {@link Status}.
*
* @param code The HTTP response status code.
* @returns The send status or {@link Status.Unknown}.
*/
function fromHttpCode(code) {
if (code >= 200 && code < 300) {
return Status.Success;
}
if (code === 429) {
return Status.RateLimit;
}
if (code >= 400 && code < 500) {
return Status.Invalid;
}
if (code >= 500) {
return Status.Failed;
}
return Status.Unknown;
}
Status.fromHttpCode = fromHttpCode;
})(Status || (Status = {}));
//# sourceMappingURL=status.js.map
/***/ }),
/***/ "./node_modules/@sentry/utils/esm/async.js":
/*!*************************************************!*\
!*** ./node_modules/@sentry/utils/esm/async.js ***!
\*************************************************/
/*! exports provided: forget */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "forget", function() { return forget; });
/**
* Consumes the promise and logs the error when it rejects.
* @param promise A promise to forget.
*/
function forget(promise) {
promise.then(null, function (e) {
// TODO: Use a better logging mechanism
console.error(e);
});
}
//# sourceMappingURL=async.js.map
/***/ }),
/***/ "./node_modules/@sentry/utils/esm/dsn.js":
/*!***********************************************!*\
!*** ./node_modules/@sentry/utils/esm/dsn.js ***!
\***********************************************/
/*! exports provided: Dsn */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Dsn", function() { return Dsn; });
/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.js");
/* harmony import */ var _error__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./error */ "./node_modules/@sentry/utils/esm/error.js");
/** Regular expression used to parse a Dsn. */
var DSN_REGEX = /^(?:(\w+):)\/\/(?:(\w+)(?::(\w+))?@)([\w\.-]+)(?::(\d+))?\/(.+)/;
/** Error message */
var ERROR_MESSAGE = 'Invalid Dsn';
/** The Sentry Dsn, identifying a Sentry instance and project. */
var Dsn = /** @class */ (function () {
/** Creates a new Dsn component */
function Dsn(from) {
if (typeof from === 'string') {
this._fromString(from);
}
else {
this._fromComponents(from);
}
this._validate();
}
/**
* Renders the string representation of this Dsn.
*
* By default, this will render the public representation without the password
* component. To get the deprecated private representation, set `withPassword`
* to true.
*
* @param withPassword When set to true, the password will be included.
*/
Dsn.prototype.toString = function (withPassword) {
if (withPassword === void 0) { withPassword = false; }
// tslint:disable-next-line:no-this-assignment
var _a = this, host = _a.host, path = _a.path, pass = _a.pass, port = _a.port, projectId = _a.projectId, protocol = _a.protocol, user = _a.user;
return (protocol + "://" + user + (withPassword && pass ? ":" + pass : '') +
("@" + host + (port ? ":" + port : '') + "/" + (path ? path + "/" : path) + projectId));
};
/** Parses a string into this Dsn. */
Dsn.prototype._fromString = function (str) {
var match = DSN_REGEX.exec(str);
if (!match) {
throw new _error__WEBPACK_IMPORTED_MODULE_1__["SentryError"](ERROR_MESSAGE);
}
var _a = tslib__WEBPACK_IMPORTED_MODULE_0__["__read"](match.slice(1), 6), protocol = _a[0], user = _a[1], _b = _a[2], pass = _b === void 0 ? '' : _b, host = _a[3], _c = _a[4], port = _c === void 0 ? '' : _c, lastPath = _a[5];
var path = '';
var projectId = lastPath;
var split = projectId.split('/');
if (split.length > 1) {
path = split.slice(0, -1).join('/');
projectId = split.pop();
}
this._fromComponents({ host: host, pass: pass, path: path, projectId: projectId, port: port, protocol: protocol, user: user });
};
/** Maps Dsn components into this instance. */
Dsn.prototype._fromComponents = function (components) {
this.protocol = components.protocol;
this.user = components.user;
this.pass = components.pass || '';
this.host = components.host;
this.port = components.port || '';
this.path = components.path || '';
this.projectId = components.projectId;
};
/** Validates this Dsn and throws on error. */
Dsn.prototype._validate = function () {
var _this = this;
['protocol', 'user', 'host', 'projectId'].forEach(function (component) {
if (!_this[component]) {
throw new _error__WEBPACK_IMPORTED_MODULE_1__["SentryError"](ERROR_MESSAGE);
}
});
if (this.protocol !== 'http' && this.protocol !== 'https') {
throw new _error__WEBPACK_IMPORTED_MODULE_1__["SentryError"](ERROR_MESSAGE);
}
if (this.port && isNaN(parseInt(this.port, 10))) {
throw new _error__WEBPACK_IMPORTED_MODULE_1__["SentryError"](ERROR_MESSAGE);
}
};
return Dsn;
}());
//# sourceMappingURL=dsn.js.map
/***/ }),
/***/ "./node_modules/@sentry/utils/esm/error.js":
/*!*************************************************!*\
!*** ./node_modules/@sentry/utils/esm/error.js ***!
\*************************************************/
/*! exports provided: SentryError */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SentryError", function() { return SentryError; });
/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.js");
/* harmony import */ var _polyfill__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./polyfill */ "./node_modules/@sentry/utils/esm/polyfill.js");
/** An error emitted by Sentry SDKs and related utilities. */
var SentryError = /** @class */ (function (_super) {
tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](SentryError, _super);
function SentryError(message) {
var _newTarget = this.constructor;
var _this = _super.call(this, message) || this;
_this.message = message;
// tslint:disable:no-unsafe-any
_this.name = _newTarget.prototype.constructor.name;
Object(_polyfill__WEBPACK_IMPORTED_MODULE_1__["setPrototypeOf"])(_this, _newTarget.prototype);
return _this;
}
return SentryError;
}(Error));
//# sourceMappingURL=error.js.map
/***/ }),
/***/ "./node_modules/@sentry/utils/esm/index.js":
/*!*************************************************!*\
!*** ./node_modules/@sentry/utils/esm/index.js ***!
\*************************************************/
/*! exports provided: forget, SentryError, isError, isErrorEvent, isDOMError, isDOMException, isString, isPrimitive, isPlainObject, isEvent, isElement, isRegExp, isThenable, isSyntheticEvent, isInstanceOf, logger, Memo, dynamicRequire, isNodeEnv, getGlobalObject, uuid4, parseUrl, getEventDescription, consoleSandbox, addExceptionTypeValue, addExceptionMechanism, getLocationHref, htmlTreeAsString, crossPlatformPerformance, timestampWithMs, parseSemver, parseRetryAfterHeader, getFunctionName, addContextToFrame, fill, urlEncode, normalizeToSize, walk, normalize, extractExceptionKeysForMessage, dropUndefinedKeys, resolve, relative, normalizePath, isAbsolute, join, dirname, basename, PromiseBuffer, truncate, snipLine, safeJoin, isMatchingPattern, supportsErrorEvent, supportsDOMError, supportsDOMException, supportsFetch, supportsNativeFetch, supportsReportingObserver, supportsReferrerPolicy, supportsHistory, SyncPromise, addInstrumentationHandler, Dsn */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _async__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./async */ "./node_modules/@sentry/utils/esm/async.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "forget", function() { return _async__WEBPACK_IMPORTED_MODULE_0__["forget"]; });
/* harmony import */ var _error__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./error */ "./node_modules/@sentry/utils/esm/error.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "SentryError", function() { return _error__WEBPACK_IMPORTED_MODULE_1__["SentryError"]; });
/* harmony import */ var _is__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./is */ "./node_modules/@sentry/utils/esm/is.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "isError", function() { return _is__WEBPACK_IMPORTED_MODULE_2__["isError"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "isErrorEvent", function() { return _is__WEBPACK_IMPORTED_MODULE_2__["isErrorEvent"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "isDOMError", function() { return _is__WEBPACK_IMPORTED_MODULE_2__["isDOMError"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "isDOMException", function() { return _is__WEBPACK_IMPORTED_MODULE_2__["isDOMException"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "isString", function() { return _is__WEBPACK_IMPORTED_MODULE_2__["isString"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "isPrimitive", function() { return _is__WEBPACK_IMPORTED_MODULE_2__["isPrimitive"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "isPlainObject", function() { return _is__WEBPACK_IMPORTED_MODULE_2__["isPlainObject"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "isEvent", function() { return _is__WEBPACK_IMPORTED_MODULE_2__["isEvent"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "isElement", function() { return _is__WEBPACK_IMPORTED_MODULE_2__["isElement"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "isRegExp", function() { return _is__WEBPACK_IMPORTED_MODULE_2__["isRegExp"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "isThenable", function() { return _is__WEBPACK_IMPORTED_MODULE_2__["isThenable"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "isSyntheticEvent", function() { return _is__WEBPACK_IMPORTED_MODULE_2__["isSyntheticEvent"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "isInstanceOf", function() { return _is__WEBPACK_IMPORTED_MODULE_2__["isInstanceOf"]; });
/* harmony import */ var _logger__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./logger */ "./node_modules/@sentry/utils/esm/logger.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "logger", function() { return _logger__WEBPACK_IMPORTED_MODULE_3__["logger"]; });
/* harmony import */ var _memo__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./memo */ "./node_modules/@sentry/utils/esm/memo.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Memo", function() { return _memo__WEBPACK_IMPORTED_MODULE_4__["Memo"]; });
/* harmony import */ var _misc__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./misc */ "./node_modules/@sentry/utils/esm/misc.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "dynamicRequire", function() { return _misc__WEBPACK_IMPORTED_MODULE_5__["dynamicRequire"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "isNodeEnv", function() { return _misc__WEBPACK_IMPORTED_MODULE_5__["isNodeEnv"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getGlobalObject", function() { return _misc__WEBPACK_IMPORTED_MODULE_5__["getGlobalObject"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "uuid4", function() { return _misc__WEBPACK_IMPORTED_MODULE_5__["uuid4"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "parseUrl", function() { return _misc__WEBPACK_IMPORTED_MODULE_5__["parseUrl"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getEventDescription", function() { return _misc__WEBPACK_IMPORTED_MODULE_5__["getEventDescription"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "consoleSandbox", function() { return _misc__WEBPACK_IMPORTED_MODULE_5__["consoleSandbox"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "addExceptionTypeValue", function() { return _misc__WEBPACK_IMPORTED_MODULE_5__["addExceptionTypeValue"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "addExceptionMechanism", function() { return _misc__WEBPACK_IMPORTED_MODULE_5__["addExceptionMechanism"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getLocationHref", function() { return _misc__WEBPACK_IMPORTED_MODULE_5__["getLocationHref"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "htmlTreeAsString", function() { return _misc__WEBPACK_IMPORTED_MODULE_5__["htmlTreeAsString"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "crossPlatformPerformance", function() { return _misc__WEBPACK_IMPORTED_MODULE_5__["crossPlatformPerformance"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "timestampWithMs", function() { return _misc__WEBPACK_IMPORTED_MODULE_5__["timestampWithMs"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "parseSemver", function() { return _misc__WEBPACK_IMPORTED_MODULE_5__["parseSemver"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "parseRetryAfterHeader", function() { return _misc__WEBPACK_IMPORTED_MODULE_5__["parseRetryAfterHeader"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getFunctionName", function() { return _misc__WEBPACK_IMPORTED_MODULE_5__["getFunctionName"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "addContextToFrame", function() { return _misc__WEBPACK_IMPORTED_MODULE_5__["addContextToFrame"]; });
/* harmony import */ var _object__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./object */ "./node_modules/@sentry/utils/esm/object.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "fill", function() { return _object__WEBPACK_IMPORTED_MODULE_6__["fill"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "urlEncode", function() { return _object__WEBPACK_IMPORTED_MODULE_6__["urlEncode"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "normalizeToSize", function() { return _object__WEBPACK_IMPORTED_MODULE_6__["normalizeToSize"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "walk", function() { return _object__WEBPACK_IMPORTED_MODULE_6__["walk"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "normalize", function() { return _object__WEBPACK_IMPORTED_MODULE_6__["normalize"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "extractExceptionKeysForMessage", function() { return _object__WEBPACK_IMPORTED_MODULE_6__["extractExceptionKeysForMessage"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "dropUndefinedKeys", function() { return _object__WEBPACK_IMPORTED_MODULE_6__["dropUndefinedKeys"]; });
/* harmony import */ var _path__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./path */ "./node_modules/@sentry/utils/esm/path.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "resolve", function() { return _path__WEBPACK_IMPORTED_MODULE_7__["resolve"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "relative", function() { return _path__WEBPACK_IMPORTED_MODULE_7__["relative"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "normalizePath", function() { return _path__WEBPACK_IMPORTED_MODULE_7__["normalizePath"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "isAbsolute", function() { return _path__WEBPACK_IMPORTED_MODULE_7__["isAbsolute"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "join", function() { return _path__WEBPACK_IMPORTED_MODULE_7__["join"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "dirname", function() { return _path__WEBPACK_IMPORTED_MODULE_7__["dirname"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "basename", function() { return _path__WEBPACK_IMPORTED_MODULE_7__["basename"]; });
/* harmony import */ var _promisebuffer__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./promisebuffer */ "./node_modules/@sentry/utils/esm/promisebuffer.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "PromiseBuffer", function() { return _promisebuffer__WEBPACK_IMPORTED_MODULE_8__["PromiseBuffer"]; });
/* harmony import */ var _string__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./string */ "./node_modules/@sentry/utils/esm/string.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "truncate", function() { return _string__WEBPACK_IMPORTED_MODULE_9__["truncate"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "snipLine", function() { return _string__WEBPACK_IMPORTED_MODULE_9__["snipLine"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "safeJoin", function() { return _string__WEBPACK_IMPORTED_MODULE_9__["safeJoin"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "isMatchingPattern", function() { return _string__WEBPACK_IMPORTED_MODULE_9__["isMatchingPattern"]; });
/* harmony import */ var _supports__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./supports */ "./node_modules/@sentry/utils/esm/supports.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "supportsErrorEvent", function() { return _supports__WEBPACK_IMPORTED_MODULE_10__["supportsErrorEvent"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "supportsDOMError", function() { return _supports__WEBPACK_IMPORTED_MODULE_10__["supportsDOMError"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "supportsDOMException", function() { return _supports__WEBPACK_IMPORTED_MODULE_10__["supportsDOMException"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "supportsFetch", function() { return _supports__WEBPACK_IMPORTED_MODULE_10__["supportsFetch"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "supportsNativeFetch", function() { return _supports__WEBPACK_IMPORTED_MODULE_10__["supportsNativeFetch"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "supportsReportingObserver", function() { return _supports__WEBPACK_IMPORTED_MODULE_10__["supportsReportingObserver"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "supportsReferrerPolicy", function() { return _supports__WEBPACK_IMPORTED_MODULE_10__["supportsReferrerPolicy"]; });
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "supportsHistory", function() { return _supports__WEBPACK_IMPORTED_MODULE_10__["supportsHistory"]; });
/* harmony import */ var _syncpromise__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./syncpromise */ "./node_modules/@sentry/utils/esm/syncpromise.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "SyncPromise", function() { return _syncpromise__WEBPACK_IMPORTED_MODULE_11__["SyncPromise"]; });
/* harmony import */ var _instrument__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./instrument */ "./node_modules/@sentry/utils/esm/instrument.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "addInstrumentationHandler", function() { return _instrument__WEBPACK_IMPORTED_MODULE_12__["addInstrumentationHandler"]; });
/* harmony import */ var _dsn__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./dsn */ "./node_modules/@sentry/utils/esm/dsn.js");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Dsn", function() { return _dsn__WEBPACK_IMPORTED_MODULE_13__["Dsn"]; });
//# sourceMappingURL=index.js.map
/***/ }),
/***/ "./node_modules/@sentry/utils/esm/instrument.js":
/*!******************************************************!*\
!*** ./node_modules/@sentry/utils/esm/instrument.js ***!
\******************************************************/
/*! exports provided: addInstrumentationHandler */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addInstrumentationHandler", function() { return addInstrumentationHandler; });
/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.js");
/* harmony import */ var _is__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./is */ "./node_modules/@sentry/utils/esm/is.js");
/* harmony import */ var _logger__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./logger */ "./node_modules/@sentry/utils/esm/logger.js");
/* harmony import */ var _misc__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./misc */ "./node_modules/@sentry/utils/esm/misc.js");
/* harmony import */ var _object__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./object */ "./node_modules/@sentry/utils/esm/object.js");
/* harmony import */ var _supports__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./supports */ "./node_modules/@sentry/utils/esm/supports.js");
/* tslint:disable:only-arrow-functions no-unsafe-any */
var global = Object(_misc__WEBPACK_IMPORTED_MODULE_3__["getGlobalObject"])();
/**
* Instrument native APIs to call handlers that can be used to create breadcrumbs, APM spans etc.
* - Console API
* - Fetch API
* - XHR API
* - History API
* - DOM API (click/typing)
* - Error API
* - UnhandledRejection API
*/
var handlers = {};
var instrumented = {};
/** Instruments given API */
function instrument(type) {
if (instrumented[type]) {
return;
}
instrumented[type] = true;
switch (type) {
case 'console':
instrumentConsole();
break;
case 'dom':
instrumentDOM();
break;
case 'xhr':
instrumentXHR();
break;
case 'fetch':
instrumentFetch();
break;
case 'history':
instrumentHistory();
break;
case 'error':
instrumentError();
break;
case 'unhandledrejection':
instrumentUnhandledRejection();
break;
default:
_logger__WEBPACK_IMPORTED_MODULE_2__["logger"].warn('unknown instrumentation type:', type);
}
}
/**
* Add handler that will be called when given type of instrumentation triggers.
* Use at your own risk, this might break without changelog notice, only used internally.
* @hidden
*/
function addInstrumentationHandler(handler) {
// tslint:disable-next-line:strict-type-predicates
if (!handler || typeof handler.type !== 'string' || typeof handler.callback !== 'function') {
return;
}
handlers[handler.type] = handlers[handler.type] || [];
handlers[handler.type].push(handler.callback);
instrument(handler.type);
}
/** JSDoc */
function triggerHandlers(type, data) {
var e_1, _a;
if (!type || !handlers[type]) {
return;
}
try {
for (var _b = tslib__WEBPACK_IMPORTED_MODULE_0__["__values"](handlers[type] || []), _c = _b.next(); !_c.done; _c = _b.next()) {
var handler = _c.value;
try {
handler(data);
}
catch (e) {
_logger__WEBPACK_IMPORTED_MODULE_2__["logger"].error("Error while triggering instrumentation handler.\nType: " + type + "\nName: " + Object(_misc__WEBPACK_IMPORTED_MODULE_3__["getFunctionName"])(handler) + "\nError: " + e);
}
}
}
catch (e_1_1) { e_1 = { error: e_1_1 }; }
finally {
try {
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
}
finally { if (e_1) throw e_1.error; }
}
}
/** JSDoc */
function instrumentConsole() {
if (!('console' in global)) {
return;
}
['debug', 'info', 'warn', 'error', 'log', 'assert'].forEach(function (level) {
if (!(level in global.console)) {
return;
}
Object(_object__WEBPACK_IMPORTED_MODULE_4__["fill"])(global.console, level, function (originalConsoleLevel) {
return function () {
var args = [];
for (var _i = 0; _i < arguments.length; _i++) {
args[_i] = arguments[_i];
}
triggerHandlers('console', { args: args, level: level });
// this fails for some browsers. :(
if (originalConsoleLevel) {
Function.prototype.apply.call(originalConsoleLevel, global.console, args);
}
};
});
});
}
/** JSDoc */
function instrumentFetch() {
if (!Object(_supports__WEBPACK_IMPORTED_MODULE_5__["supportsNativeFetch"])()) {
return;
}
Object(_object__WEBPACK_IMPORTED_MODULE_4__["fill"])(global, 'fetch', function (originalFetch) {
return function () {
var args = [];
for (var _i = 0; _i < arguments.length; _i++) {
args[_i] = arguments[_i];
}
var commonHandlerData = {
args: args,
fetchData: {
method: getFetchMethod(args),
url: getFetchUrl(args),
},
startTimestamp: Date.now(),
};
triggerHandlers('fetch', tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({}, commonHandlerData));
return originalFetch.apply(global, args).then(function (response) {
triggerHandlers('fetch', tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({}, commonHandlerData, { endTimestamp: Date.now(), response: response }));
return response;
}, function (error) {
triggerHandlers('fetch', tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({}, commonHandlerData, { endTimestamp: Date.now(), error: error }));
throw error;
});
};
});
}
/** Extract `method` from fetch call arguments */
function getFetchMethod(fetchArgs) {
if (fetchArgs === void 0) { fetchArgs = []; }
if ('Request' in global && Object(_is__WEBPACK_IMPORTED_MODULE_1__["isInstanceOf"])(fetchArgs[0], Request) && fetchArgs[0].method) {
return String(fetchArgs[0].method).toUpperCase();
}
if (fetchArgs[1] && fetchArgs[1].method) {
return String(fetchArgs[1].method).toUpperCase();
}
return 'GET';
}
/** Extract `url` from fetch call arguments */
function getFetchUrl(fetchArgs) {
if (fetchArgs === void 0) { fetchArgs = []; }
if (typeof fetchArgs[0] === 'string') {
return fetchArgs[0];
}
if ('Request' in global && Object(_is__WEBPACK_IMPORTED_MODULE_1__["isInstanceOf"])(fetchArgs[0], Request)) {
return fetchArgs[0].url;
}
return String(fetchArgs[0]);
}
/** JSDoc */
function instrumentXHR() {
if (!('XMLHttpRequest' in global)) {
return;
}
var xhrproto = XMLHttpRequest.prototype;
Object(_object__WEBPACK_IMPORTED_MODULE_4__["fill"])(xhrproto, 'open', function (originalOpen) {
return function () {
var args = [];
for (var _i = 0; _i < arguments.length; _i++) {
args[_i] = arguments[_i];
}
var url = args[1];
this.__sentry_xhr__ = {
method: Object(_is__WEBPACK_IMPORTED_MODULE_1__["isString"])(args[0]) ? args[0].toUpperCase() : args[0],
url: args[1],
};
// if Sentry key appears in URL, don't capture it as a request
if (Object(_is__WEBPACK_IMPORTED_MODULE_1__["isString"])(url) && this.__sentry_xhr__.method === 'POST' && url.match(/sentry_key/)) {
this.__sentry_own_request__ = true;
}
return originalOpen.apply(this, args);
};
});
Object(_object__WEBPACK_IMPORTED_MODULE_4__["fill"])(xhrproto, 'send', function (originalSend) {
return function () {
var args = [];
for (var _i = 0; _i < arguments.length; _i++) {
args[_i] = arguments[_i];
}
var xhr = this; // tslint:disable-line:no-this-assignment
var commonHandlerData = {
args: args,
startTimestamp: Date.now(),
xhr: xhr,
};
triggerHandlers('xhr', tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({}, commonHandlerData));
xhr.addEventListener('readystatechange', function () {
if (xhr.readyState === 4) {
try {
// touching statusCode in some platforms throws
// an exception
if (xhr.__sentry_xhr__) {
xhr.__sentry_xhr__.status_code = xhr.status;
}
}
catch (e) {
/* do nothing */
}
triggerHandlers('xhr', tslib__WEBPACK_IMPORTED_MODULE_0__["__assign"]({}, commonHandlerData, { endTimestamp: Date.now() }));
}
});
return originalSend.apply(this, args);
};
});
}
var lastHref;
/** JSDoc */
function instrumentHistory() {
if (!Object(_supports__WEBPACK_IMPORTED_MODULE_5__["supportsHistory"])()) {
return;
}
var oldOnPopState = global.onpopstate;
global.onpopstate = function () {
var args = [];
for (var _i = 0; _i < arguments.length; _i++) {
args[_i] = arguments[_i];
}
var to = global.location.href;
// keep track of the current URL state, as we always receive only the updated state
var from = lastHref;
lastHref = to;
triggerHandlers('history', {
from: from,
to: to,
});
if (oldOnPopState) {
return oldOnPopState.apply(this, args);
}
};
/** @hidden */
function historyReplacementFunction(originalHistoryFunction) {
return function () {
var args = [];
for (var _i = 0; _i < arguments.length; _i++) {
args[_i] = arguments[_i];
}
var url = args.length > 2 ? args[2] : undefined;
if (url) {
// coerce to string (this is what pushState does)
var from = lastHref;
var to = String(url);
// keep track of the current URL state, as we always receive only the updated state
lastHref = to;
triggerHandlers('history', {
from: from,
to: to,
});
}
return originalHistoryFunction.apply(this, args);
};
}
Object(_object__WEBPACK_IMPORTED_MODULE_4__["fill"])(global.history, 'pushState', historyReplacementFunction);
Object(_object__WEBPACK_IMPORTED_MODULE_4__["fill"])(global.history, 'replaceState', historyReplacementFunction);
}
/** JSDoc */
function instrumentDOM() {
if (!('document' in global)) {
return;
}
// Capture breadcrumbs from any click that is unhandled / bubbled up all the way
// to the document. Do this before we instrument addEventListener.
global.document.addEventListener('click', domEventHandler('click', triggerHandlers.bind(null, 'dom')), false);
global.document.addEventListener('keypress', keypressEventHandler(triggerHandlers.bind(null, 'dom')), false);
// After hooking into document bubbled up click and keypresses events, we also hook into user handled click & keypresses.
['EventTarget', 'Node'].forEach(function (target) {
var proto = global[target] && global[target].prototype;
if (!proto || !proto.hasOwnProperty || !proto.hasOwnProperty('addEventListener')) {
return;
}
Object(_object__WEBPACK_IMPORTED_MODULE_4__["fill"])(proto, 'addEventListener', function (original) {
return function (eventName, fn, options) {
if (fn && fn.handleEvent) {
if (eventName === 'click') {
Object(_object__WEBPACK_IMPORTED_MODULE_4__["fill"])(fn, 'handleEvent', function (innerOriginal) {
return function (event) {
domEventHandler('click', triggerHandlers.bind(null, 'dom'))(event);
return innerOriginal.call(this, event);
};
});
}
if (eventName === 'keypress') {
Object(_object__WEBPACK_IMPORTED_MODULE_4__["fill"])(fn, 'handleEvent', function (innerOriginal) {
return function (event) {
keypressEventHandler(triggerHandlers.bind(null, 'dom'))(event);
return innerOriginal.call(this, event);
};
});
}
}
else {
if (eventName === 'click') {
domEventHandler('click', triggerHandlers.bind(null, 'dom'), true)(this);
}
if (eventName === 'keypress') {
keypressEventHandler(triggerHandlers.bind(null, 'dom'))(this);
}
}
return original.call(this, eventName, fn, options);
};
});
Object(_object__WEBPACK_IMPORTED_MODULE_4__["fill"])(proto, 'removeEventListener', function (original) {
return function (eventName, fn, options) {
var callback = fn;
try {
callback = callback && (callback.__sentry_wrapped__ || callback);
}
catch (e) {
// ignore, accessing __sentry_wrapped__ will throw in some Selenium environments
}
return original.call(this, eventName, callback, options);
};
});
});
}
var debounceDuration = 1000;
var debounceTimer = 0;
var keypressTimeout;
var lastCapturedEvent;
/**
* Wraps addEventListener to capture UI breadcrumbs
* @param name the event name (e.g. "click")
* @param handler function that will be triggered
* @param debounce decides whether it should wait till another event loop
* @returns wrapped breadcrumb events handler
* @hidden
*/
function domEventHandler(name, handler, debounce) {
if (debounce === void 0) { debounce = false; }
return function (event) {
// reset keypress timeout; e.g. triggering a 'click' after
// a 'keypress' will reset the keypress debounce so that a new
// set of keypresses can be recorded
keypressTimeout = undefined;
// It's possible this handler might trigger multiple times for the same
// event (e.g. event propagation through node ancestors). Ignore if we've
// already captured the event.
if (!event || lastCapturedEvent === event) {
return;
}
lastCapturedEvent = event;
if (debounceTimer) {
clearTimeout(debounceTimer);
}
if (debounce) {
debounceTimer = setTimeout(function () {
handler({ event: event, name: name });
});
}
else {
handler({ event: event, name: name });
}
};
}
/**
* Wraps addEventListener to capture keypress UI events
* @param handler function that will be triggered
* @returns wrapped keypress events handler
* @hidden
*/
function keypressEventHandler(handler) {
// TODO: if somehow user switches keypress target before
// debounce timeout is triggered, we will only capture
// a single breadcrumb from the FIRST target (acceptable?)
return function (event) {
var target;
try {
target = event.target;
}
catch (e) {
// just accessing event properties can throw an exception in some rare circumstances
// see: https://github.com/getsentry/raven-js/issues/838
return;
}
var tagName = target && target.tagName;
// only consider keypress events on actual input elements
// this will disregard keypresses targeting body (e.g. tabbing
// through elements, hotkeys, etc)
if (!tagName || (tagName !== 'INPUT' && tagName !== 'TEXTAREA' && !target.isContentEditable)) {
return;
}
// record first keypress in a series, but ignore subsequent
// keypresses until debounce clears
if (!keypressTimeout) {
domEventHandler('input', handler)(event);
}
clearTimeout(keypressTimeout);
keypressTimeout = setTimeout(function () {
keypressTimeout = undefined;
}, debounceDuration);
};
}
var _oldOnErrorHandler = null;
/** JSDoc */
function instrumentError() {
_oldOnErrorHandler = global.onerror;
global.onerror = function (msg, url, line, column, error) {
triggerHandlers('error', {
column: column,
error: error,
line: line,
msg: msg,
url: url,
});
if (_oldOnErrorHandler) {
return _oldOnErrorHandler.apply(this, arguments);
}
return false;
};
}
var _oldOnUnhandledRejectionHandler = null;
/** JSDoc */
function instrumentUnhandledRejection() {
_oldOnUnhandledRejectionHandler = global.onunhandledrejection;
global.onunhandledrejection = function (e) {
triggerHandlers('unhandledrejection', e);
if (_oldOnUnhandledRejectionHandler) {
return _oldOnUnhandledRejectionHandler.apply(this, arguments);
}
return true;
};
}
//# sourceMappingURL=instrument.js.map
/***/ }),
/***/ "./node_modules/@sentry/utils/esm/is.js":
/*!**********************************************!*\
!*** ./node_modules/@sentry/utils/esm/is.js ***!
\**********************************************/
/*! exports provided: isError, isErrorEvent, isDOMError, isDOMException, isString, isPrimitive, isPlainObject, isEvent, isElement, isRegExp, isThenable, isSyntheticEvent, isInstanceOf */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isError", function() { return isError; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isErrorEvent", function() { return isErrorEvent; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isDOMError", function() { return isDOMError; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isDOMException", function() { return isDOMException; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isString", function() { return isString; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isPrimitive", function() { return isPrimitive; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isPlainObject", function() { return isPlainObject; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isEvent", function() { return isEvent; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isElement", function() { return isElement; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isRegExp", function() { return isRegExp; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isThenable", function() { return isThenable; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isSyntheticEvent", function() { return isSyntheticEvent; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isInstanceOf", function() { return isInstanceOf; });
/**
* Checks whether given value's type is one of a few Error or Error-like
* {@link isError}.
*
* @param wat A value to be checked.
* @returns A boolean representing the result.
*/
function isError(wat) {
switch (Object.prototype.toString.call(wat)) {
case '[object Error]':
return true;
case '[object Exception]':
return true;
case '[object DOMException]':
return true;
default:
return isInstanceOf(wat, Error);
}
}
/**
* Checks whether given value's type is ErrorEvent
* {@link isErrorEvent}.
*
* @param wat A value to be checked.
* @returns A boolean representing the result.
*/
function isErrorEvent(wat) {
return Object.prototype.toString.call(wat) === '[object ErrorEvent]';
}
/**
* Checks whether given value's type is DOMError
* {@link isDOMError}.
*
* @param wat A value to be checked.
* @returns A boolean representing the result.
*/
function isDOMError(wat) {
return Object.prototype.toString.call(wat) === '[object DOMError]';
}
/**
* Checks whether given value's type is DOMException
* {@link isDOMException}.
*
* @param wat A value to be checked.
* @returns A boolean representing the result.
*/
function isDOMException(wat) {
return Object.prototype.toString.call(wat) === '[object DOMException]';
}
/**
* Checks whether given value's type is a string
* {@link isString}.
*
* @param wat A value to be checked.
* @returns A boolean representing the result.
*/
function isString(wat) {
return Object.prototype.toString.call(wat) === '[object String]';
}
/**
* Checks whether given value's is a primitive (undefined, null, number, boolean, string)
* {@link isPrimitive}.
*
* @param wat A value to be checked.
* @returns A boolean representing the result.
*/
function isPrimitive(wat) {
return wat === null || (typeof wat !== 'object' && typeof wat !== 'function');
}
/**
* Checks whether given value's type is an object literal
* {@link isPlainObject}.
*
* @param wat A value to be checked.
* @returns A boolean representing the result.
*/
function isPlainObject(wat) {
return Object.prototype.toString.call(wat) === '[object Object]';
}
/**
* Checks whether given value's type is an Event instance
* {@link isEvent}.
*
* @param wat A value to be checked.
* @returns A boolean representing the result.
*/
function isEvent(wat) {
// tslint:disable-next-line:strict-type-predicates
return typeof Event !== 'undefined' && isInstanceOf(wat, Event);
}
/**
* Checks whether given value's type is an Element instance
* {@link isElement}.
*
* @param wat A value to be checked.
* @returns A boolean representing the result.
*/
function isElement(wat) {
// tslint:disable-next-line:strict-type-predicates
return typeof Element !== 'undefined' && isInstanceOf(wat, Element);
}
/**
* Checks whether given value's type is an regexp
* {@link isRegExp}.
*
* @param wat A value to be checked.
* @returns A boolean representing the result.
*/
function isRegExp(wat) {
return Object.prototype.toString.call(wat) === '[object RegExp]';
}
/**
* Checks whether given value has a then function.
* @param wat A value to be checked.
*/
function isThenable(wat) {
// tslint:disable:no-unsafe-any
return Boolean(wat && wat.then && typeof wat.then === 'function');
// tslint:enable:no-unsafe-any
}
/**
* Checks whether given value's type is a SyntheticEvent
* {@link isSyntheticEvent}.
*
* @param wat A value to be checked.
* @returns A boolean representing the result.
*/
function isSyntheticEvent(wat) {
// tslint:disable-next-line:no-unsafe-any
return isPlainObject(wat) && 'nativeEvent' in wat && 'preventDefault' in wat && 'stopPropagation' in wat;
}
/**
* Checks whether given value's type is an instance of provided constructor.
* {@link isInstanceOf}.
*
* @param wat A value to be checked.
* @param base A constructor to be used in a check.
* @returns A boolean representing the result.
*/
function isInstanceOf(wat, base) {
try {
// tslint:disable-next-line:no-unsafe-any
return wat instanceof base;
}
catch (_e) {
return false;
}
}
//# sourceMappingURL=is.js.map
/***/ }),
/***/ "./node_modules/@sentry/utils/esm/logger.js":
/*!**************************************************!*\
!*** ./node_modules/@sentry/utils/esm/logger.js ***!
\**************************************************/
/*! exports provided: logger */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "logger", function() { return logger; });
/* harmony import */ var _misc__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./misc */ "./node_modules/@sentry/utils/esm/misc.js");
// TODO: Implement different loggers for different environments
var global = Object(_misc__WEBPACK_IMPORTED_MODULE_0__["getGlobalObject"])();
/** Prefix for logging strings */
var PREFIX = 'Sentry Logger ';
/** JSDoc */
var Logger = /** @class */ (function () {
/** JSDoc */
function Logger() {
this._enabled = false;
}
/** JSDoc */
Logger.prototype.disable = function () {
this._enabled = false;
};
/** JSDoc */
Logger.prototype.enable = function () {
this._enabled = true;
};
/** JSDoc */
Logger.prototype.log = function () {
var args = [];
for (var _i = 0; _i < arguments.length; _i++) {
args[_i] = arguments[_i];
}
if (!this._enabled) {
return;
}
Object(_misc__WEBPACK_IMPORTED_MODULE_0__["consoleSandbox"])(function () {
global.console.log(PREFIX + "[Log]: " + args.join(' ')); // tslint:disable-line:no-console
});
};
/** JSDoc */
Logger.prototype.warn = function () {
var args = [];
for (var _i = 0; _i < arguments.length; _i++) {
args[_i] = arguments[_i];
}
if (!this._enabled) {
return;
}
Object(_misc__WEBPACK_IMPORTED_MODULE_0__["consoleSandbox"])(function () {
global.console.warn(PREFIX + "[Warn]: " + args.join(' ')); // tslint:disable-line:no-console
});
};
/** JSDoc */
Logger.prototype.error = function () {
var args = [];
for (var _i = 0; _i < arguments.length; _i++) {
args[_i] = arguments[_i];
}
if (!this._enabled) {
return;
}
Object(_misc__WEBPACK_IMPORTED_MODULE_0__["consoleSandbox"])(function () {
global.console.error(PREFIX + "[Error]: " + args.join(' ')); // tslint:disable-line:no-console
});
};
return Logger;
}());
// Ensure we only have a single logger instance, even if multiple versions of @sentry/utils are being used
global.__SENTRY__ = global.__SENTRY__ || {};
var logger = global.__SENTRY__.logger || (global.__SENTRY__.logger = new Logger());
//# sourceMappingURL=logger.js.map
/***/ }),
/***/ "./node_modules/@sentry/utils/esm/memo.js":
/*!************************************************!*\
!*** ./node_modules/@sentry/utils/esm/memo.js ***!
\************************************************/
/*! exports provided: Memo */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Memo", function() { return Memo; });
// tslint:disable:no-unsafe-any
/**
* Memo class used for decycle json objects. Uses WeakSet if available otherwise array.
*/
var Memo = /** @class */ (function () {
function Memo() {
// tslint:disable-next-line
this._hasWeakSet = typeof WeakSet === 'function';
this._inner = this._hasWeakSet ? new WeakSet() : [];
}
/**
* Sets obj to remember.
* @param obj Object to remember
*/
Memo.prototype.memoize = function (obj) {
if (this._hasWeakSet) {
if (this._inner.has(obj)) {
return true;
}
this._inner.add(obj);
return false;
}
// tslint:disable-next-line:prefer-for-of
for (var i = 0; i < this._inner.length; i++) {
var value = this._inner[i];
if (value === obj) {
return true;
}
}
this._inner.push(obj);
return false;
};
/**
* Removes object from internal storage.
* @param obj Object to forget
*/
Memo.prototype.unmemoize = function (obj) {
if (this._hasWeakSet) {
this._inner.delete(obj);
}
else {
for (var i = 0; i < this._inner.length; i++) {
if (this._inner[i] === obj) {
this._inner.splice(i, 1);
break;
}
}
}
};
return Memo;
}());
//# sourceMappingURL=memo.js.map
/***/ }),
/***/ "./node_modules/@sentry/utils/esm/misc.js":
/*!************************************************!*\
!*** ./node_modules/@sentry/utils/esm/misc.js ***!
\************************************************/
/*! exports provided: dynamicRequire, isNodeEnv, getGlobalObject, uuid4, parseUrl, getEventDescription, consoleSandbox, addExceptionTypeValue, addExceptionMechanism, getLocationHref, htmlTreeAsString, crossPlatformPerformance, timestampWithMs, parseSemver, parseRetryAfterHeader, getFunctionName, addContextToFrame */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* WEBPACK VAR INJECTION */(function(process, global, module) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "dynamicRequire", function() { return dynamicRequire; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isNodeEnv", function() { return isNodeEnv; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getGlobalObject", function() { return getGlobalObject; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "uuid4", function() { return uuid4; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "parseUrl", function() { return parseUrl; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getEventDescription", function() { return getEventDescription; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "consoleSandbox", function() { return consoleSandbox; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addExceptionTypeValue", function() { return addExceptionTypeValue; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addExceptionMechanism", function() { return addExceptionMechanism; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getLocationHref", function() { return getLocationHref; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "htmlTreeAsString", function() { return htmlTreeAsString; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "crossPlatformPerformance", function() { return crossPlatformPerformance; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "timestampWithMs", function() { return timestampWithMs; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "parseSemver", function() { return parseSemver; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "parseRetryAfterHeader", function() { return parseRetryAfterHeader; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getFunctionName", function() { return getFunctionName; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addContextToFrame", function() { return addContextToFrame; });
/* harmony import */ var _is__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./is */ "./node_modules/@sentry/utils/esm/is.js");
/* harmony import */ var _string__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./string */ "./node_modules/@sentry/utils/esm/string.js");
/**
* Requires a module which is protected against bundler minification.
*
* @param request The module path to resolve
*/
function dynamicRequire(mod, request) {
// tslint:disable-next-line: no-unsafe-any
return mod.require(request);
}
/**
* Checks whether we're in the Node.js or Browser environment
*
* @returns Answer to given question
*/
function isNodeEnv() {
// tslint:disable:strict-type-predicates
return Object.prototype.toString.call(typeof process !== 'undefined' ? process : 0) === '[object process]';
}
var fallbackGlobalObject = {};
/**
* Safely get global scope object
*
* @returns Global scope object
*/
function getGlobalObject() {
return (isNodeEnv()
? global
: typeof window !== 'undefined'
? window
: typeof self !== 'undefined'
? self
: fallbackGlobalObject);
}
/**
* UUID4 generator
*
* @returns string Generated UUID4.
*/
function uuid4() {
var global = getGlobalObject();
var crypto = global.crypto || global.msCrypto;
if (!(crypto === void 0) && crypto.getRandomValues) {
// Use window.crypto API if available
var arr = new Uint16Array(8);
crypto.getRandomValues(arr);
// set 4 in byte 7
// tslint:disable-next-line:no-bitwise
arr[3] = (arr[3] & 0xfff) | 0x4000;
// set 2 most significant bits of byte 9 to '10'
// tslint:disable-next-line:no-bitwise
arr[4] = (arr[4] & 0x3fff) | 0x8000;
var pad = function (num) {
var v = num.toString(16);
while (v.length < 4) {
v = "0" + v;
}
return v;
};
return (pad(arr[0]) + pad(arr[1]) + pad(arr[2]) + pad(arr[3]) + pad(arr[4]) + pad(arr[5]) + pad(arr[6]) + pad(arr[7]));
}
// http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/2117523#2117523
return 'xxxxxxxxxxxx4xxxyxxxxxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
// tslint:disable-next-line:no-bitwise
var r = (Math.random() * 16) | 0;
// tslint:disable-next-line:no-bitwise
var v = c === 'x' ? r : (r & 0x3) | 0x8;
return v.toString(16);
});
}
/**
* Parses string form of URL into an object
* // borrowed from https://tools.ietf.org/html/rfc3986#appendix-B
* // intentionally using regex and not <a/> href parsing trick because React Native and other
* // environments where DOM might not be available
* @returns parsed URL object
*/
function parseUrl(url) {
if (!url) {
return {};
}
var match = url.match(/^(([^:\/?#]+):)?(\/\/([^\/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?$/);
if (!match) {
return {};
}
// coerce to undefined values to empty string so we don't get 'undefined'
var query = match[6] || '';
var fragment = match[8] || '';
return {
host: match[4],
path: match[5],
protocol: match[2],
relative: match[5] + query + fragment,
};
}
/**
* Extracts either message or type+value from an event that can be used for user-facing logs
* @returns event's description
*/
function getEventDescription(event) {
if (event.message) {
return event.message;
}
if (event.exception && event.exception.values && event.exception.values[0]) {
var exception = event.exception.values[0];
if (exception.type && exception.value) {
return exception.type + ": " + exception.value;
}
return exception.type || exception.value || event.event_id || '<unknown>';
}
return event.event_id || '<unknown>';
}
/** JSDoc */
function consoleSandbox(callback) {
var global = getGlobalObject();
var levels = ['debug', 'info', 'warn', 'error', 'log', 'assert'];
if (!('console' in global)) {
return callback();
}
var originalConsole = global.console;
var wrappedLevels = {};
// Restore all wrapped console methods
levels.forEach(function (level) {
if (level in global.console && originalConsole[level].__sentry_original__) {
wrappedLevels[level] = originalConsole[level];
originalConsole[level] = originalConsole[level].__sentry_original__;
}
});
// Perform callback manipulations
var result = callback();
// Revert restoration to wrapped state
Object.keys(wrappedLevels).forEach(function (level) {
originalConsole[level] = wrappedLevels[level];
});
return result;
}
/**
* Adds exception values, type and value to an synthetic Exception.
* @param event The event to modify.
* @param value Value of the exception.
* @param type Type of the exception.
* @hidden
*/
function addExceptionTypeValue(event, value, type) {
event.exception = event.exception || {};
event.exception.values = event.exception.values || [];
event.exception.values[0] = event.exception.values[0] || {};
event.exception.values[0].value = event.exception.values[0].value || value || '';
event.exception.values[0].type = event.exception.values[0].type || type || 'Error';
}
/**
* Adds exception mechanism to a given event.
* @param event The event to modify.
* @param mechanism Mechanism of the mechanism.
* @hidden
*/
function addExceptionMechanism(event, mechanism) {
if (mechanism === void 0) { mechanism = {}; }
// TODO: Use real type with `keyof Mechanism` thingy and maybe make it better?
try {
// @ts-ignore
// tslint:disable:no-non-null-assertion
event.exception.values[0].mechanism = event.exception.values[0].mechanism || {};
Object.keys(mechanism).forEach(function (key) {
// @ts-ignore
event.exception.values[0].mechanism[key] = mechanism[key];
});
}
catch (_oO) {
// no-empty
}
}
/**
* A safe form of location.href
*/
function getLocationHref() {
try {
return document.location.href;
}
catch (oO) {
return '';
}
}
/**
* Given a child DOM element, returns a query-selector statement describing that
* and its ancestors
* e.g. [HTMLElement] => body > div > input#foo.btn[name=baz]
* @returns generated DOM path
*/
function htmlTreeAsString(elem) {
// try/catch both:
// - accessing event.target (see getsentry/raven-js#838, #768)
// - `htmlTreeAsString` because it's complex, and just accessing the DOM incorrectly
// - can throw an exception in some circumstances.
try {
var currentElem = elem;
var MAX_TRAVERSE_HEIGHT = 5;
var MAX_OUTPUT_LEN = 80;
var out = [];
var height = 0;
var len = 0;
var separator = ' > ';
var sepLength = separator.length;
var nextStr = void 0;
while (currentElem && height++ < MAX_TRAVERSE_HEIGHT) {
nextStr = _htmlElementAsString(currentElem);
// bail out if
// - nextStr is the 'html' element
// - the length of the string that would be created exceeds MAX_OUTPUT_LEN
// (ignore this limit if we are on the first iteration)
if (nextStr === 'html' || (height > 1 && len + out.length * sepLength + nextStr.length >= MAX_OUTPUT_LEN)) {
break;
}
out.push(nextStr);
len += nextStr.length;
currentElem = currentElem.parentNode;
}
return out.reverse().join(separator);
}
catch (_oO) {
return '<unknown>';
}
}
/**
* Returns a simple, query-selector representation of a DOM element
* e.g. [HTMLElement] => input#foo.btn[name=baz]
* @returns generated DOM path
*/
function _htmlElementAsString(el) {
var elem = el;
var out = [];
var className;
var classes;
var key;
var attr;
var i;
if (!elem || !elem.tagName) {
return '';
}
out.push(elem.tagName.toLowerCase());
if (elem.id) {
out.push("#" + elem.id);
}
className = elem.className;
if (className && Object(_is__WEBPACK_IMPORTED_MODULE_0__["isString"])(className)) {
classes = className.split(/\s+/);
for (i = 0; i < classes.length; i++) {
out.push("." + classes[i]);
}
}
var attrWhitelist = ['type', 'name', 'title', 'alt'];
for (i = 0; i < attrWhitelist.length; i++) {
key = attrWhitelist[i];
attr = elem.getAttribute(key);
if (attr) {
out.push("[" + key + "=\"" + attr + "\"]");
}
}
return out.join('');
}
var INITIAL_TIME = Date.now();
var prevNow = 0;
var performanceFallback = {
now: function () {
var now = Date.now() - INITIAL_TIME;
if (now < prevNow) {
now = prevNow;
}
prevNow = now;
return now;
},
timeOrigin: INITIAL_TIME,
};
var crossPlatformPerformance = (function () {
if (isNodeEnv()) {
try {
var perfHooks = dynamicRequire(module, 'perf_hooks');
return perfHooks.performance;
}
catch (_) {
return performanceFallback;
}
}
if (getGlobalObject().performance) {
// Polyfill for performance.timeOrigin.
//
// While performance.timing.navigationStart is deprecated in favor of performance.timeOrigin, performance.timeOrigin
// is not as widely supported. Namely, performance.timeOrigin is undefined in Safari as of writing.
// tslint:disable-next-line:strict-type-predicates
if (performance.timeOrigin === undefined) {
// As of writing, performance.timing is not available in Web Workers in mainstream browsers, so it is not always a
// valid fallback. In the absence of a initial time provided by the browser, fallback to INITIAL_TIME.
// @ts-ignore
// tslint:disable-next-line:deprecation
performance.timeOrigin = (performance.timing && performance.timing.navigationStart) || INITIAL_TIME;
}
}
return getGlobalObject().performance || performanceFallback;
})();
/**
* Returns a timestamp in seconds with milliseconds precision since the UNIX epoch calculated with the monotonic clock.
*/
function timestampWithMs() {
return (crossPlatformPerformance.timeOrigin + crossPlatformPerformance.now()) / 1000;
}
// https://semver.org/#is-there-a-suggested-regular-expression-regex-to-check-a-semver-string
var SEMVER_REGEXP = /^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$/;
/**
* Parses input into a SemVer interface
* @param input string representation of a semver version
*/
function parseSemver(input) {
var match = input.match(SEMVER_REGEXP) || [];
var major = parseInt(match[1], 10);
var minor = parseInt(match[2], 10);
var patch = parseInt(match[3], 10);
return {
buildmetadata: match[5],
major: isNaN(major) ? undefined : major,
minor: isNaN(minor) ? undefined : minor,
patch: isNaN(patch) ? undefined : patch,
prerelease: match[4],
};
}
var defaultRetryAfter = 60 * 1000; // 60 seconds
/**
* Extracts Retry-After value from the request header or returns default value
* @param now current unix timestamp
* @param header string representation of 'Retry-After' header
*/
function parseRetryAfterHeader(now, header) {
if (!header) {
return defaultRetryAfter;
}
var headerDelay = parseInt("" + header, 10);
if (!isNaN(headerDelay)) {
return headerDelay * 1000;
}
var headerDate = Date.parse("" + header);
if (!isNaN(headerDate)) {
return headerDate - now;
}
return defaultRetryAfter;
}
var defaultFunctionName = '<anonymous>';
/**
* Safely extract function name from itself
*/
function getFunctionName(fn) {
try {
if (!fn || typeof fn !== 'function') {
return defaultFunctionName;
}
return fn.name || defaultFunctionName;
}
catch (e) {
// Just accessing custom props in some Selenium environments
// can cause a "Permission denied" exception (see raven-js#495).
return defaultFunctionName;
}
}
/**
* This function adds context (pre/post/line) lines to the provided frame
*
* @param lines string[] containing all lines
* @param frame StackFrame that will be mutated
* @param linesOfContext number of context lines we want to add pre/post
*/
function addContextToFrame(lines, frame, linesOfContext) {
if (linesOfContext === void 0) { linesOfContext = 5; }
var lineno = frame.lineno || 0;
var maxLines = lines.length;
var sourceLine = Math.max(Math.min(maxLines, lineno - 1), 0);
frame.pre_context = lines
.slice(Math.max(0, sourceLine - linesOfContext), sourceLine)
.map(function (line) { return Object(_string__WEBPACK_IMPORTED_MODULE_1__["snipLine"])(line, 0); });
frame.context_line = Object(_string__WEBPACK_IMPORTED_MODULE_1__["snipLine"])(lines[Math.min(maxLines - 1, sourceLine)], frame.colno || 0);
frame.post_context = lines
.slice(Math.min(sourceLine + 1, maxLines), sourceLine + 1 + linesOfContext)
.map(function (line) { return Object(_string__WEBPACK_IMPORTED_MODULE_1__["snipLine"])(line, 0); });
}
//# sourceMappingURL=misc.js.map
/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../process/browser.js */ "./node_modules/process/browser.js"), __webpack_require__(/*! ./../../../webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js"), __webpack_require__(/*! ./../../../webpack/buildin/harmony-module.js */ "./node_modules/webpack/buildin/harmony-module.js")(module)))
/***/ }),
/***/ "./node_modules/@sentry/utils/esm/object.js":
/*!**************************************************!*\
!*** ./node_modules/@sentry/utils/esm/object.js ***!
\**************************************************/
/*! exports provided: fill, urlEncode, normalizeToSize, walk, normalize, extractExceptionKeysForMessage, dropUndefinedKeys */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* WEBPACK VAR INJECTION */(function(global) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "fill", function() { return fill; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "urlEncode", function() { return urlEncode; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "normalizeToSize", function() { return normalizeToSize; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "walk", function() { return walk; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "normalize", function() { return normalize; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "extractExceptionKeysForMessage", function() { return extractExceptionKeysForMessage; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "dropUndefinedKeys", function() { return dropUndefinedKeys; });
/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.js");
/* harmony import */ var _is__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./is */ "./node_modules/@sentry/utils/esm/is.js");
/* harmony import */ var _memo__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./memo */ "./node_modules/@sentry/utils/esm/memo.js");
/* harmony import */ var _misc__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./misc */ "./node_modules/@sentry/utils/esm/misc.js");
/* harmony import */ var _string__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./string */ "./node_modules/@sentry/utils/esm/string.js");
/**
* Wrap a given object method with a higher-order function
*
* @param source An object that contains a method to be wrapped.
* @param name A name of method to be wrapped.
* @param replacement A function that should be used to wrap a given method.
* @returns void
*/
function fill(source, name, replacement) {
if (!(name in source)) {
return;
}
var original = source[name];
var wrapped = replacement(original);
// Make sure it's a function first, as we need to attach an empty prototype for `defineProperties` to work
// otherwise it'll throw "TypeError: Object.defineProperties called on non-object"
// tslint:disable-next-line:strict-type-predicates
if (typeof wrapped === 'function') {
try {
wrapped.prototype = wrapped.prototype || {};
Object.defineProperties(wrapped, {
__sentry_original__: {
enumerable: false,
value: original,
},
});
}
catch (_Oo) {
// This can throw if multiple fill happens on a global object like XMLHttpRequest
// Fixes https://github.com/getsentry/sentry-javascript/issues/2043
}
}
source[name] = wrapped;
}
/**
* Encodes given object into url-friendly format
*
* @param object An object that contains serializable values
* @returns string Encoded
*/
function urlEncode(object) {
return Object.keys(object)
.map(
// tslint:disable-next-line:no-unsafe-any
function (key) { return encodeURIComponent(key) + "=" + encodeURIComponent(object[key]); })
.join('&');
}
/**
* Transforms any object into an object literal with all it's attributes
* attached to it.
*
* @param value Initial source that we have to transform in order to be usable by the serializer
*/
function getWalkSource(value) {
if (Object(_is__WEBPACK_IMPORTED_MODULE_1__["isError"])(value)) {
var error = value;
var err = {
message: error.message,
name: error.name,
stack: error.stack,
};
for (var i in error) {
if (Object.prototype.hasOwnProperty.call(error, i)) {
err[i] = error[i];
}
}
return err;
}
if (Object(_is__WEBPACK_IMPORTED_MODULE_1__["isEvent"])(value)) {
var event_1 = value;
var source = {};
source.type = event_1.type;
// Accessing event.target can throw (see getsentry/raven-js#838, #768)
try {
source.target = Object(_is__WEBPACK_IMPORTED_MODULE_1__["isElement"])(event_1.target)
? Object(_misc__WEBPACK_IMPORTED_MODULE_3__["htmlTreeAsString"])(event_1.target)
: Object.prototype.toString.call(event_1.target);
}
catch (_oO) {
source.target = '<unknown>';
}
try {
source.currentTarget = Object(_is__WEBPACK_IMPORTED_MODULE_1__["isElement"])(event_1.currentTarget)
? Object(_misc__WEBPACK_IMPORTED_MODULE_3__["htmlTreeAsString"])(event_1.currentTarget)
: Object.prototype.toString.call(event_1.currentTarget);
}
catch (_oO) {
source.currentTarget = '<unknown>';
}
// tslint:disable-next-line:strict-type-predicates
if (typeof CustomEvent !== 'undefined' && Object(_is__WEBPACK_IMPORTED_MODULE_1__["isInstanceOf"])(value, CustomEvent)) {
source.detail = event_1.detail;
}
for (var i in event_1) {
if (Object.prototype.hasOwnProperty.call(event_1, i)) {
source[i] = event_1;
}
}
return source;
}
return value;
}
/** Calculates bytes size of input string */
function utf8Length(value) {
// tslint:disable-next-line:no-bitwise
return ~-encodeURI(value).split(/%..|./).length;
}
/** Calculates bytes size of input object */
function jsonSize(value) {
return utf8Length(JSON.stringify(value));
}
/** JSDoc */
function normalizeToSize(object,
// Default Node.js REPL depth
depth,
// 100kB, as 200kB is max payload size, so half sounds reasonable
maxSize) {
if (depth === void 0) { depth = 3; }
if (maxSize === void 0) { maxSize = 100 * 1024; }
var serialized = normalize(object, depth);
if (jsonSize(serialized) > maxSize) {
return normalizeToSize(object, depth - 1, maxSize);
}
return serialized;
}
/** Transforms any input value into a string form, either primitive value or a type of the input */
function serializeValue(value) {
var type = Object.prototype.toString.call(value);
// Node.js REPL notation
if (typeof value === 'string') {
return value;
}
if (type === '[object Object]') {
return '[Object]';
}
if (type === '[object Array]') {
return '[Array]';
}
var normalized = normalizeValue(value);
return Object(_is__WEBPACK_IMPORTED_MODULE_1__["isPrimitive"])(normalized) ? normalized : type;
}
/**
* normalizeValue()
*
* Takes unserializable input and make it serializable friendly
*
* - translates undefined/NaN values to "[undefined]"/"[NaN]" respectively,
* - serializes Error objects
* - filter global objects
*/
// tslint:disable-next-line:cyclomatic-complexity
function normalizeValue(value, key) {
if (key === 'domain' && value && typeof value === 'object' && value._events) {
return '[Domain]';
}
if (key === 'domainEmitter') {
return '[DomainEmitter]';
}
if (typeof global !== 'undefined' && value === global) {
return '[Global]';
}
if (typeof window !== 'undefined' && value === window) {
return '[Window]';
}
if (typeof document !== 'undefined' && value === document) {
return '[Document]';
}
// React's SyntheticEvent thingy
if (Object(_is__WEBPACK_IMPORTED_MODULE_1__["isSyntheticEvent"])(value)) {
return '[SyntheticEvent]';
}
// tslint:disable-next-line:no-tautology-expression
if (typeof value === 'number' && value !== value) {
return '[NaN]';
}
if (value === void 0) {
return '[undefined]';
}
if (typeof value === 'function') {
return "[Function: " + Object(_misc__WEBPACK_IMPORTED_MODULE_3__["getFunctionName"])(value) + "]";
}
return value;
}
/**
* Walks an object to perform a normalization on it
*
* @param key of object that's walked in current iteration
* @param value object to be walked
* @param depth Optional number indicating how deep should walking be performed
* @param memo Optional Memo class handling decycling
*/
function walk(key, value, depth, memo) {
if (depth === void 0) { depth = +Infinity; }
if (memo === void 0) { memo = new _memo__WEBPACK_IMPORTED_MODULE_2__["Memo"](); }
// If we reach the maximum depth, serialize whatever has left
if (depth === 0) {
return serializeValue(value);
}
// If value implements `toJSON` method, call it and return early
// tslint:disable:no-unsafe-any
if (value !== null && value !== undefined && typeof value.toJSON === 'function') {
return value.toJSON();
}
// tslint:enable:no-unsafe-any
// If normalized value is a primitive, there are no branches left to walk, so we can just bail out, as theres no point in going down that branch any further
var normalized = normalizeValue(value, key);
if (Object(_is__WEBPACK_IMPORTED_MODULE_1__["isPrimitive"])(normalized)) {
return normalized;
}
// Create source that we will use for next itterations, either objectified error object (Error type with extracted keys:value pairs) or the input itself
var source = getWalkSource(value);
// Create an accumulator that will act as a parent for all future itterations of that branch
var acc = Array.isArray(value) ? [] : {};
// If we already walked that branch, bail out, as it's circular reference
if (memo.memoize(value)) {
return '[Circular ~]';
}
// Walk all keys of the source
for (var innerKey in source) {
// Avoid iterating over fields in the prototype if they've somehow been exposed to enumeration.
if (!Object.prototype.hasOwnProperty.call(source, innerKey)) {
continue;
}
// Recursively walk through all the child nodes
acc[innerKey] = walk(innerKey, source[innerKey], depth - 1, memo);
}
// Once walked through all the branches, remove the parent from memo storage
memo.unmemoize(value);
// Return accumulated values
return acc;
}
/**
* normalize()
*
* - Creates a copy to prevent original input mutation
* - Skip non-enumerablers
* - Calls `toJSON` if implemented
* - Removes circular references
* - Translates non-serializeable values (undefined/NaN/Functions) to serializable format
* - Translates known global objects/Classes to a string representations
* - Takes care of Error objects serialization
* - Optionally limit depth of final output
*/
function normalize(input, depth) {
try {
// tslint:disable-next-line:no-unsafe-any
return JSON.parse(JSON.stringify(input, function (key, value) { return walk(key, value, depth); }));
}
catch (_oO) {
return '**non-serializable**';
}
}
/**
* Given any captured exception, extract its keys and create a sorted
* and truncated list that will be used inside the event message.
* eg. `Non-error exception captured with keys: foo, bar, baz`
*/
function extractExceptionKeysForMessage(exception, maxLength) {
if (maxLength === void 0) { maxLength = 40; }
// tslint:disable:strict-type-predicates
var keys = Object.keys(getWalkSource(exception));
keys.sort();
if (!keys.length) {
return '[object has no keys]';
}
if (keys[0].length >= maxLength) {
return Object(_string__WEBPACK_IMPORTED_MODULE_4__["truncate"])(keys[0], maxLength);
}
for (var includedKeys = keys.length; includedKeys > 0; includedKeys--) {
var serialized = keys.slice(0, includedKeys).join(', ');
if (serialized.length > maxLength) {
continue;
}
if (includedKeys === keys.length) {
return serialized;
}
return Object(_string__WEBPACK_IMPORTED_MODULE_4__["truncate"])(serialized, maxLength);
}
return '';
}
/**
* Given any object, return the new object with removed keys that value was `undefined`.
* Works recursively on objects and arrays.
*/
function dropUndefinedKeys(val) {
var e_1, _a;
if (Object(_is__WEBPACK_IMPORTED_MODULE_1__["isPlainObject"])(val)) {
var obj = val;
var rv = {};
try {
for (var _b = tslib__WEBPACK_IMPORTED_MODULE_0__["__values"](Object.keys(obj)), _c = _b.next(); !_c.done; _c = _b.next()) {
var key = _c.value;
if (typeof obj[key] !== 'undefined') {
rv[key] = dropUndefinedKeys(obj[key]);
}
}
}
catch (e_1_1) { e_1 = { error: e_1_1 }; }
finally {
try {
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
}
finally { if (e_1) throw e_1.error; }
}
return rv;
}
if (Array.isArray(val)) {
return val.map(dropUndefinedKeys);
}
return val;
}
//# sourceMappingURL=object.js.map
/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js")))
/***/ }),
/***/ "./node_modules/@sentry/utils/esm/path.js":
/*!************************************************!*\
!*** ./node_modules/@sentry/utils/esm/path.js ***!
\************************************************/
/*! exports provided: resolve, relative, normalizePath, isAbsolute, join, dirname, basename */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "resolve", function() { return resolve; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "relative", function() { return relative; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "normalizePath", function() { return normalizePath; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isAbsolute", function() { return isAbsolute; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "join", function() { return join; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "dirname", function() { return dirname; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "basename", function() { return basename; });
// Slightly modified (no IE8 support, ES6) and transcribed to TypeScript
// https://raw.githubusercontent.com/calvinmetcalf/rollup-plugin-node-builtins/master/src/es6/path.js
/** JSDoc */
function normalizeArray(parts, allowAboveRoot) {
// if the path tries to go above the root, `up` ends up > 0
var up = 0;
for (var i = parts.length - 1; i >= 0; i--) {
var last = parts[i];
if (last === '.') {
parts.splice(i, 1);
}
else if (last === '..') {
parts.splice(i, 1);
up++;
}
else if (up) {
parts.splice(i, 1);
up--;
}
}
// if the path is allowed to go above the root, restore leading ..s
if (allowAboveRoot) {
for (; up--; up) {
parts.unshift('..');
}
}
return parts;
}
// Split a filename into [root, dir, basename, ext], unix version
// 'root' is just a slash, or nothing.
var splitPathRe = /^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;
/** JSDoc */
function splitPath(filename) {
var parts = splitPathRe.exec(filename);
return parts ? parts.slice(1) : [];
}
// path.resolve([from ...], to)
// posix version
/** JSDoc */
function resolve() {
var args = [];
for (var _i = 0; _i < arguments.length; _i++) {
args[_i] = arguments[_i];
}
var resolvedPath = '';
var resolvedAbsolute = false;
for (var i = args.length - 1; i >= -1 && !resolvedAbsolute; i--) {
var path = i >= 0 ? args[i] : '/';
// Skip empty entries
if (!path) {
continue;
}
resolvedPath = path + "/" + resolvedPath;
resolvedAbsolute = path.charAt(0) === '/';
}
// At this point the path should be resolved to a full absolute path, but
// handle relative paths to be safe (might happen when process.cwd() fails)
// Normalize the path
resolvedPath = normalizeArray(resolvedPath.split('/').filter(function (p) { return !!p; }), !resolvedAbsolute).join('/');
return (resolvedAbsolute ? '/' : '') + resolvedPath || '.';
}
/** JSDoc */
function trim(arr) {
var start = 0;
for (; start < arr.length; start++) {
if (arr[start] !== '') {
break;
}
}
var end = arr.length - 1;
for (; end >= 0; end--) {
if (arr[end] !== '') {
break;
}
}
if (start > end) {
return [];
}
return arr.slice(start, end - start + 1);
}
// path.relative(from, to)
// posix version
/** JSDoc */
function relative(from, to) {
// tslint:disable:no-parameter-reassignment
from = resolve(from).substr(1);
to = resolve(to).substr(1);
var fromParts = trim(from.split('/'));
var toParts = trim(to.split('/'));
var length = Math.min(fromParts.length, toParts.length);
var samePartsLength = length;
for (var i = 0; i < length; i++) {
if (fromParts[i] !== toParts[i]) {
samePartsLength = i;
break;
}
}
var outputParts = [];
for (var i = samePartsLength; i < fromParts.length; i++) {
outputParts.push('..');
}
outputParts = outputParts.concat(toParts.slice(samePartsLength));
return outputParts.join('/');
}
// path.normalize(path)
// posix version
/** JSDoc */
function normalizePath(path) {
var isPathAbsolute = isAbsolute(path);
var trailingSlash = path.substr(-1) === '/';
// Normalize the path
var normalizedPath = normalizeArray(path.split('/').filter(function (p) { return !!p; }), !isPathAbsolute).join('/');
if (!normalizedPath && !isPathAbsolute) {
normalizedPath = '.';
}
if (normalizedPath && trailingSlash) {
normalizedPath += '/';
}
return (isPathAbsolute ? '/' : '') + normalizedPath;
}
// posix version
/** JSDoc */
function isAbsolute(path) {
return path.charAt(0) === '/';
}
// posix version
/** JSDoc */
function join() {
var args = [];
for (var _i = 0; _i < arguments.length; _i++) {
args[_i] = arguments[_i];
}
return normalizePath(args.join('/'));
}
/** JSDoc */
function dirname(path) {
var result = splitPath(path);
var root = result[0];
var dir = result[1];
if (!root && !dir) {
// No dirname whatsoever
return '.';
}
if (dir) {
// It has a dirname, strip trailing slash
dir = dir.substr(0, dir.length - 1);
}
return root + dir;
}
/** JSDoc */
function basename(path, ext) {
var f = splitPath(path)[2];
if (ext && f.substr(ext.length * -1) === ext) {
f = f.substr(0, f.length - ext.length);
}
return f;
}
//# sourceMappingURL=path.js.map
/***/ }),
/***/ "./node_modules/@sentry/utils/esm/polyfill.js":
/*!****************************************************!*\
!*** ./node_modules/@sentry/utils/esm/polyfill.js ***!
\****************************************************/
/*! exports provided: setPrototypeOf */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setPrototypeOf", function() { return setPrototypeOf; });
var setPrototypeOf = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array ? setProtoOf : mixinProperties); // tslint:disable-line:no-unbound-method
/**
* setPrototypeOf polyfill using __proto__
*/
function setProtoOf(obj, proto) {
// @ts-ignore
obj.__proto__ = proto;
return obj;
}
/**
* setPrototypeOf polyfill using mixin
*/
function mixinProperties(obj, proto) {
for (var prop in proto) {
if (!obj.hasOwnProperty(prop)) {
// @ts-ignore
obj[prop] = proto[prop];
}
}
return obj;
}
//# sourceMappingURL=polyfill.js.map
/***/ }),
/***/ "./node_modules/@sentry/utils/esm/promisebuffer.js":
/*!*********************************************************!*\
!*** ./node_modules/@sentry/utils/esm/promisebuffer.js ***!
\*********************************************************/
/*! exports provided: PromiseBuffer */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "PromiseBuffer", function() { return PromiseBuffer; });
/* harmony import */ var _error__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./error */ "./node_modules/@sentry/utils/esm/error.js");
/* harmony import */ var _syncpromise__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./syncpromise */ "./node_modules/@sentry/utils/esm/syncpromise.js");
/** A simple queue that holds promises. */
var PromiseBuffer = /** @class */ (function () {
function PromiseBuffer(_limit) {
this._limit = _limit;
/** Internal set of queued Promises */
this._buffer = [];
}
/**
* Says if the buffer is ready to take more requests
*/
PromiseBuffer.prototype.isReady = function () {
return this._limit === undefined || this.length() < this._limit;
};
/**
* Add a promise to the queue.
*
* @param task Can be any PromiseLike<T>
* @returns The original promise.
*/
PromiseBuffer.prototype.add = function (task) {
var _this = this;
if (!this.isReady()) {
return _syncpromise__WEBPACK_IMPORTED_MODULE_1__["SyncPromise"].reject(new _error__WEBPACK_IMPORTED_MODULE_0__["SentryError"]('Not adding Promise due to buffer limit reached.'));
}
if (this._buffer.indexOf(task) === -1) {
this._buffer.push(task);
}
task
.then(function () { return _this.remove(task); })
.then(null, function () {
return _this.remove(task).then(null, function () {
// We have to add this catch here otherwise we have an unhandledPromiseRejection
// because it's a new Promise chain.
});
});
return task;
};
/**
* Remove a promise to the queue.
*
* @param task Can be any PromiseLike<T>
* @returns Removed promise.
*/
PromiseBuffer.prototype.remove = function (task) {
var removedTask = this._buffer.splice(this._buffer.indexOf(task), 1)[0];
return removedTask;
};
/**
* This function returns the number of unresolved promises in the queue.
*/
PromiseBuffer.prototype.length = function () {
return this._buffer.length;
};
/**
* This will drain the whole queue, returns true if queue is empty or drained.
* If timeout is provided and the queue takes longer to drain, the promise still resolves but with false.
*
* @param timeout Number in ms to wait until it resolves with false.
*/
PromiseBuffer.prototype.drain = function (timeout) {
var _this = this;
return new _syncpromise__WEBPACK_IMPORTED_MODULE_1__["SyncPromise"](function (resolve) {
var capturedSetTimeout = setTimeout(function () {
if (timeout && timeout > 0) {
resolve(false);
}
}, timeout);
_syncpromise__WEBPACK_IMPORTED_MODULE_1__["SyncPromise"].all(_this._buffer)
.then(function () {
clearTimeout(capturedSetTimeout);
resolve(true);
})
.then(null, function () {
resolve(true);
});
});
};
return PromiseBuffer;
}());
//# sourceMappingURL=promisebuffer.js.map
/***/ }),
/***/ "./node_modules/@sentry/utils/esm/string.js":
/*!**************************************************!*\
!*** ./node_modules/@sentry/utils/esm/string.js ***!
\**************************************************/
/*! exports provided: truncate, snipLine, safeJoin, isMatchingPattern */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "truncate", function() { return truncate; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "snipLine", function() { return snipLine; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "safeJoin", function() { return safeJoin; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isMatchingPattern", function() { return isMatchingPattern; });
/* harmony import */ var _is__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./is */ "./node_modules/@sentry/utils/esm/is.js");
/**
* Truncates given string to the maximum characters count
*
* @param str An object that contains serializable values
* @param max Maximum number of characters in truncated string
* @returns string Encoded
*/
function truncate(str, max) {
if (max === void 0) { max = 0; }
// tslint:disable-next-line:strict-type-predicates
if (typeof str !== 'string' || max === 0) {
return str;
}
return str.length <= max ? str : str.substr(0, max) + "...";
}
/**
* This is basically just `trim_line` from
* https://github.com/getsentry/sentry/blob/master/src/sentry/lang/javascript/processor.py#L67
*
* @param str An object that contains serializable values
* @param max Maximum number of characters in truncated string
* @returns string Encoded
*/
function snipLine(line, colno) {
var newLine = line;
var ll = newLine.length;
if (ll <= 150) {
return newLine;
}
if (colno > ll) {
colno = ll; // tslint:disable-line:no-parameter-reassignment
}
var start = Math.max(colno - 60, 0);
if (start < 5) {
start = 0;
}
var end = Math.min(start + 140, ll);
if (end > ll - 5) {
end = ll;
}
if (end === ll) {
start = Math.max(end - 140, 0);
}
newLine = newLine.slice(start, end);
if (start > 0) {
newLine = "'{snip} " + newLine;
}
if (end < ll) {
newLine += ' {snip}';
}
return newLine;
}
/**
* Join values in array
* @param input array of values to be joined together
* @param delimiter string to be placed in-between values
* @returns Joined values
*/
function safeJoin(input, delimiter) {
if (!Array.isArray(input)) {
return '';
}
var output = [];
// tslint:disable-next-line:prefer-for-of
for (var i = 0; i < input.length; i++) {
var value = input[i];
try {
output.push(String(value));
}
catch (e) {
output.push('[value cannot be serialized]');
}
}
return output.join(delimiter);
}
/**
* Checks if the value matches a regex or includes the string
* @param value The string value to be checked against
* @param pattern Either a regex or a string that must be contained in value
*/
function isMatchingPattern(value, pattern) {
if (!Object(_is__WEBPACK_IMPORTED_MODULE_0__["isString"])(value)) {
return false;
}
if (Object(_is__WEBPACK_IMPORTED_MODULE_0__["isRegExp"])(pattern)) {
return pattern.test(value);
}
if (typeof pattern === 'string') {
return value.indexOf(pattern) !== -1;
}
return false;
}
//# sourceMappingURL=string.js.map
/***/ }),
/***/ "./node_modules/@sentry/utils/esm/supports.js":
/*!****************************************************!*\
!*** ./node_modules/@sentry/utils/esm/supports.js ***!
\****************************************************/
/*! exports provided: supportsErrorEvent, supportsDOMError, supportsDOMException, supportsFetch, supportsNativeFetch, supportsReportingObserver, supportsReferrerPolicy, supportsHistory */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "supportsErrorEvent", function() { return supportsErrorEvent; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "supportsDOMError", function() { return supportsDOMError; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "supportsDOMException", function() { return supportsDOMException; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "supportsFetch", function() { return supportsFetch; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "supportsNativeFetch", function() { return supportsNativeFetch; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "supportsReportingObserver", function() { return supportsReportingObserver; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "supportsReferrerPolicy", function() { return supportsReferrerPolicy; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "supportsHistory", function() { return supportsHistory; });
/* harmony import */ var _logger__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./logger */ "./node_modules/@sentry/utils/esm/logger.js");
/* harmony import */ var _misc__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./misc */ "./node_modules/@sentry/utils/esm/misc.js");
/**
* Tells whether current environment supports ErrorEvent objects
* {@link supportsErrorEvent}.
*
* @returns Answer to the given question.
*/
function supportsErrorEvent() {
try {
// tslint:disable:no-unused-expression
new ErrorEvent('');
return true;
}
catch (e) {
return false;
}
}
/**
* Tells whether current environment supports DOMError objects
* {@link supportsDOMError}.
*
* @returns Answer to the given question.
*/
function supportsDOMError() {
try {
// It really needs 1 argument, not 0.
// Chrome: VM89:1 Uncaught TypeError: Failed to construct 'DOMError':
// 1 argument required, but only 0 present.
// @ts-ignore
// tslint:disable:no-unused-expression
new DOMError('');
return true;
}
catch (e) {
return false;
}
}
/**
* Tells whether current environment supports DOMException objects
* {@link supportsDOMException}.
*
* @returns Answer to the given question.
*/
function supportsDOMException() {
try {
// tslint:disable:no-unused-expression
new DOMException('');
return true;
}
catch (e) {
return false;
}
}
/**
* Tells whether current environment supports Fetch API
* {@link supportsFetch}.
*
* @returns Answer to the given question.
*/
function supportsFetch() {
if (!('fetch' in Object(_misc__WEBPACK_IMPORTED_MODULE_1__["getGlobalObject"])())) {
return false;
}
try {
// tslint:disable-next-line:no-unused-expression
new Headers();
// tslint:disable-next-line:no-unused-expression
new Request('');
// tslint:disable-next-line:no-unused-expression
new Response();
return true;
}
catch (e) {
return false;
}
}
/**
* isNativeFetch checks if the given function is a native implementation of fetch()
*/
function isNativeFetch(func) {
return func && /^function fetch\(\)\s+\{\s+\[native code\]\s+\}$/.test(func.toString());
}
/**
* Tells whether current environment supports Fetch API natively
* {@link supportsNativeFetch}.
*
* @returns true if `window.fetch` is natively implemented, false otherwise
*/
function supportsNativeFetch() {
if (!supportsFetch()) {
return false;
}
var global = Object(_misc__WEBPACK_IMPORTED_MODULE_1__["getGlobalObject"])();
// Fast path to avoid DOM I/O
// tslint:disable-next-line:no-unbound-method
if (isNativeFetch(global.fetch)) {
return true;
}
// window.fetch is implemented, but is polyfilled or already wrapped (e.g: by a chrome extension)
// so create a "pure" iframe to see if that has native fetch
var result = false;
var doc = global.document;
// tslint:disable-next-line:no-unbound-method deprecation
if (doc && typeof doc.createElement === "function") {
try {
var sandbox = doc.createElement('iframe');
sandbox.hidden = true;
doc.head.appendChild(sandbox);
if (sandbox.contentWindow && sandbox.contentWindow.fetch) {
// tslint:disable-next-line:no-unbound-method
result = isNativeFetch(sandbox.contentWindow.fetch);
}
doc.head.removeChild(sandbox);
}
catch (err) {
_logger__WEBPACK_IMPORTED_MODULE_0__["logger"].warn('Could not create sandbox iframe for pure fetch check, bailing to window.fetch: ', err);
}
}
return result;
}
/**
* Tells whether current environment supports ReportingObserver API
* {@link supportsReportingObserver}.
*
* @returns Answer to the given question.
*/
function supportsReportingObserver() {
// tslint:disable-next-line: no-unsafe-any
return 'ReportingObserver' in Object(_misc__WEBPACK_IMPORTED_MODULE_1__["getGlobalObject"])();
}
/**
* Tells whether current environment supports Referrer Policy API
* {@link supportsReferrerPolicy}.
*
* @returns Answer to the given question.
*/
function supportsReferrerPolicy() {
// Despite all stars in the sky saying that Edge supports old draft syntax, aka 'never', 'always', 'origin' and 'default
// https://caniuse.com/#feat=referrer-policy
// It doesn't. And it throw exception instead of ignoring this parameter...
// REF: https://github.com/getsentry/raven-js/issues/1233
if (!supportsFetch()) {
return false;
}
try {
// tslint:disable:no-unused-expression
new Request('_', {
referrerPolicy: 'origin',
});
return true;
}
catch (e) {
return false;
}
}
/**
* Tells whether current environment supports History API
* {@link supportsHistory}.
*
* @returns Answer to the given question.
*/
function supportsHistory() {
// NOTE: in Chrome App environment, touching history.pushState, *even inside
// a try/catch block*, will cause Chrome to output an error to console.error
// borrowed from: https://github.com/angular/angular.js/pull/13945/files
var global = Object(_misc__WEBPACK_IMPORTED_MODULE_1__["getGlobalObject"])();
var chrome = global.chrome;
// tslint:disable-next-line:no-unsafe-any
var isChromePackagedApp = chrome && chrome.app && chrome.app.runtime;
var hasHistoryApi = 'history' in global && !!global.history.pushState && !!global.history.replaceState;
return !isChromePackagedApp && hasHistoryApi;
}
//# sourceMappingURL=supports.js.map
/***/ }),
/***/ "./node_modules/@sentry/utils/esm/syncpromise.js":
/*!*******************************************************!*\
!*** ./node_modules/@sentry/utils/esm/syncpromise.js ***!
\*******************************************************/
/*! exports provided: SyncPromise */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SyncPromise", function() { return SyncPromise; });
/* harmony import */ var _is__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./is */ "./node_modules/@sentry/utils/esm/is.js");
/** SyncPromise internal states */
var States;
(function (States) {
/** Pending */
States["PENDING"] = "PENDING";
/** Resolved / OK */
States["RESOLVED"] = "RESOLVED";
/** Rejected / Error */
States["REJECTED"] = "REJECTED";
})(States || (States = {}));
/**
* Thenable class that behaves like a Promise and follows it's interface
* but is not async internally
*/
var SyncPromise = /** @class */ (function () {
function SyncPromise(executor) {
var _this = this;
this._state = States.PENDING;
this._handlers = [];
/** JSDoc */
this._resolve = function (value) {
_this._setResult(States.RESOLVED, value);
};
/** JSDoc */
this._reject = function (reason) {
_this._setResult(States.REJECTED, reason);
};
/** JSDoc */
this._setResult = function (state, value) {
if (_this._state !== States.PENDING) {
return;
}
if (Object(_is__WEBPACK_IMPORTED_MODULE_0__["isThenable"])(value)) {
value.then(_this._resolve, _this._reject);
return;
}
_this._state = state;
_this._value = value;
_this._executeHandlers();
};
// TODO: FIXME
/** JSDoc */
this._attachHandler = function (handler) {
_this._handlers = _this._handlers.concat(handler);
_this._executeHandlers();
};
/** JSDoc */
this._executeHandlers = function () {
if (_this._state === States.PENDING) {
return;
}
var cachedHandlers = _this._handlers.slice();
_this._handlers = [];
cachedHandlers.forEach(function (handler) {
if (handler.done) {
return;
}
if (_this._state === States.RESOLVED) {
if (handler.onfulfilled) {
handler.onfulfilled(_this._value);
}
}
if (_this._state === States.REJECTED) {
if (handler.onrejected) {
handler.onrejected(_this._value);
}
}
handler.done = true;
});
};
try {
executor(this._resolve, this._reject);
}
catch (e) {
this._reject(e);
}
}
/** JSDoc */
SyncPromise.prototype.toString = function () {
return '[object SyncPromise]';
};
/** JSDoc */
SyncPromise.resolve = function (value) {
return new SyncPromise(function (resolve) {
resolve(value);
});
};
/** JSDoc */
SyncPromise.reject = function (reason) {
return new SyncPromise(function (_, reject) {
reject(reason);
});
};
/** JSDoc */
SyncPromise.all = function (collection) {
return new SyncPromise(function (resolve, reject) {
if (!Array.isArray(collection)) {
reject(new TypeError("Promise.all requires an array as input."));
return;
}
if (collection.length === 0) {
resolve([]);
return;
}
var counter = collection.length;
var resolvedCollection = [];
collection.forEach(function (item, index) {
SyncPromise.resolve(item)
.then(function (value) {
resolvedCollection[index] = value;
counter -= 1;
if (counter !== 0) {
return;
}
resolve(resolvedCollection);
})
.then(null, reject);
});
});
};
/** JSDoc */
SyncPromise.prototype.then = function (onfulfilled, onrejected) {
var _this = this;
return new SyncPromise(function (resolve, reject) {
_this._attachHandler({
done: false,
onfulfilled: function (result) {
if (!onfulfilled) {
// TODO: ¯\_(ツ)_/¯
// TODO: FIXME
resolve(result);
return;
}
try {
resolve(onfulfilled(result));
return;
}
catch (e) {
reject(e);
return;
}
},
onrejected: function (reason) {
if (!onrejected) {
reject(reason);
return;
}
try {
resolve(onrejected(reason));
return;
}
catch (e) {
reject(e);
return;
}
},
});
});
};
/** JSDoc */
SyncPromise.prototype.catch = function (onrejected) {
return this.then(function (val) { return val; }, onrejected);
};
/** JSDoc */
SyncPromise.prototype.finally = function (onfinally) {
var _this = this;
return new SyncPromise(function (resolve, reject) {
var val;
var isRejected;
return _this.then(function (value) {
isRejected = false;
val = value;
if (onfinally) {
onfinally();
}
}, function (reason) {
isRejected = true;
val = reason;
if (onfinally) {
onfinally();
}
}).then(function () {
if (isRejected) {
reject(val);
return;
}
resolve(val);
});
});
};
return SyncPromise;
}());
//# sourceMappingURL=syncpromise.js.map
/***/ }),
/***/ "./node_modules/process/browser.js":
/*!*****************************************!*\
!*** ./node_modules/process/browser.js ***!
\*****************************************/
/*! no static exports found */
/***/ (function(module, exports) {
// shim for using process in browser
var process = module.exports = {};
// cached from whatever global is present so that test runners that stub it
// don't break things. But we need to wrap it in a try catch in case it is
// wrapped in strict mode code which doesn't define any globals. It's inside a
// function because try/catches deoptimize in certain engines.
var cachedSetTimeout;
var cachedClearTimeout;
function defaultSetTimout() {
throw new Error('setTimeout has not been defined');
}
function defaultClearTimeout () {
throw new Error('clearTimeout has not been defined');
}
(function () {
try {
if (typeof setTimeout === 'function') {
cachedSetTimeout = setTimeout;
} else {
cachedSetTimeout = defaultSetTimout;
}
} catch (e) {
cachedSetTimeout = defaultSetTimout;
}
try {
if (typeof clearTimeout === 'function') {
cachedClearTimeout = clearTimeout;
} else {
cachedClearTimeout = defaultClearTimeout;
}
} catch (e) {
cachedClearTimeout = defaultClearTimeout;
}
} ())
function runTimeout(fun) {
if (cachedSetTimeout === setTimeout) {
//normal enviroments in sane situations
return setTimeout(fun, 0);
}
// if setTimeout wasn't available but was latter defined
if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {
cachedSetTimeout = setTimeout;
return setTimeout(fun, 0);
}
try {
// when when somebody has screwed with setTimeout but no I.E. maddness
return cachedSetTimeout(fun, 0);
} catch(e){
try {
// When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
return cachedSetTimeout.call(null, fun, 0);
} catch(e){
// same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error
return cachedSetTimeout.call(this, fun, 0);
}
}
}
function runClearTimeout(marker) {
if (cachedClearTimeout === clearTimeout) {
//normal enviroments in sane situations
return clearTimeout(marker);
}
// if clearTimeout wasn't available but was latter defined
if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {
cachedClearTimeout = clearTimeout;
return clearTimeout(marker);
}
try {
// when when somebody has screwed with setTimeout but no I.E. maddness
return cachedClearTimeout(marker);
} catch (e){
try {
// When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
return cachedClearTimeout.call(null, marker);
} catch (e){
// same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.
// Some versions of I.E. have different rules for clearTimeout vs setTimeout
return cachedClearTimeout.call(this, marker);
}
}
}
var queue = [];
var draining = false;
var currentQueue;
var queueIndex = -1;
function cleanUpNextTick() {
if (!draining || !currentQueue) {
return;
}
draining = false;
if (currentQueue.length) {
queue = currentQueue.concat(queue);
} else {
queueIndex = -1;
}
if (queue.length) {
drainQueue();
}
}
function drainQueue() {
if (draining) {
return;
}
var timeout = runTimeout(cleanUpNextTick);
draining = true;
var len = queue.length;
while(len) {
currentQueue = queue;
queue = [];
while (++queueIndex < len) {
if (currentQueue) {
currentQueue[queueIndex].run();
}
}
queueIndex = -1;
len = queue.length;
}
currentQueue = null;
draining = false;
runClearTimeout(timeout);
}
process.nextTick = function (fun) {
var args = new Array(arguments.length - 1);
if (arguments.length > 1) {
for (var i = 1; i < arguments.length; i++) {
args[i - 1] = arguments[i];
}
}
queue.push(new Item(fun, args));
if (queue.length === 1 && !draining) {
runTimeout(drainQueue);
}
};
// v8 likes predictible objects
function Item(fun, array) {
this.fun = fun;
this.array = array;
}
Item.prototype.run = function () {
this.fun.apply(null, this.array);
};
process.title = 'browser';
process.browser = true;
process.env = {};
process.argv = [];
process.version = ''; // empty string to avoid regexp issues
process.versions = {};
function noop() {}
process.on = noop;
process.addListener = noop;
process.once = noop;
process.off = noop;
process.removeListener = noop;
process.removeAllListeners = noop;
process.emit = noop;
process.prependListener = noop;
process.prependOnceListener = noop;
process.listeners = function (name) { return [] }
process.binding = function (name) {
throw new Error('process.binding is not supported');
};
process.cwd = function () { return '/' };
process.chdir = function (dir) {
throw new Error('process.chdir is not supported');
};
process.umask = function() { return 0; };
/***/ }),
/***/ "./node_modules/tslib/tslib.es6.js":
/*!*****************************************!*\
!*** ./node_modules/tslib/tslib.es6.js ***!
\*****************************************/
/*! exports provided: __extends, __assign, __rest, __decorate, __param, __metadata, __awaiter, __generator, __exportStar, __values, __read, __spread, __spreadArrays, __await, __asyncGenerator, __asyncDelegator, __asyncValues, __makeTemplateObject, __importStar, __importDefault */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__extends", function() { return __extends; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__assign", function() { return __assign; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__rest", function() { return __rest; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__decorate", function() { return __decorate; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__param", function() { return __param; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__metadata", function() { return __metadata; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__awaiter", function() { return __awaiter; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__generator", function() { return __generator; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__exportStar", function() { return __exportStar; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__values", function() { return __values; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__read", function() { return __read; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__spread", function() { return __spread; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__spreadArrays", function() { return __spreadArrays; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__await", function() { return __await; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__asyncGenerator", function() { return __asyncGenerator; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__asyncDelegator", function() { return __asyncDelegator; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__asyncValues", function() { return __asyncValues; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__makeTemplateObject", function() { return __makeTemplateObject; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__importStar", function() { return __importStar; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__importDefault", function() { return __importDefault; });
/*! *****************************************************************************
Copyright (c) Microsoft Corporation. All rights reserved.
Licensed under the Apache License, Version 2.0 (the "License"); you may not use
this file except in compliance with the License. You may obtain a copy of the
License at http://www.apache.org/licenses/LICENSE-2.0
THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
MERCHANTABLITY OR NON-INFRINGEMENT.
See the Apache Version 2.0 License for specific language governing permissions
and limitations under the License.
***************************************************************************** */
/* global Reflect, Promise */
var extendStatics = function(d, b) {
extendStatics = Object.setPrototypeOf ||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
return extendStatics(d, b);
};
function __extends(d, b) {
extendStatics(d, b);
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
}
var __assign = function() {
__assign = Object.assign || function __assign(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
}
return t;
}
return __assign.apply(this, arguments);
}
function __rest(s, e) {
var t = {};
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
t[p] = s[p];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
t[p[i]] = s[p[i]];
}
return t;
}
function __decorate(decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
}
function __param(paramIndex, decorator) {
return function (target, key) { decorator(target, key, paramIndex); }
}
function __metadata(metadataKey, metadataValue) {
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(metadataKey, metadataValue);
}
function __awaiter(thisArg, _arguments, P, generator) {
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
}
function __generator(thisArg, body) {
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
function verb(n) { return function (v) { return step([n, v]); }; }
function step(op) {
if (f) throw new TypeError("Generator is already executing.");
while (_) try {
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
if (y = 0, t) op = [op[0] & 2, t.value];
switch (op[0]) {
case 0: case 1: t = op; break;
case 4: _.label++; return { value: op[1], done: false };
case 5: _.label++; y = op[1]; op = [0]; continue;
case 7: op = _.ops.pop(); _.trys.pop(); continue;
default:
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
if (t[2]) _.ops.pop();
_.trys.pop(); continue;
}
op = body.call(thisArg, _);
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
}
}
function __exportStar(m, exports) {
for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
}
function __values(o) {
var m = typeof Symbol === "function" && o[Symbol.iterator], i = 0;
if (m) return m.call(o);
return {
next: function () {
if (o && i >= o.length) o = void 0;
return { value: o && o[i++], done: !o };
}
};
}
function __read(o, n) {
var m = typeof Symbol === "function" && o[Symbol.iterator];
if (!m) return o;
var i = m.call(o), r, ar = [], e;
try {
while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
}
catch (error) { e = { error: error }; }
finally {
try {
if (r && !r.done && (m = i["return"])) m.call(i);
}
finally { if (e) throw e.error; }
}
return ar;
}
function __spread() {
for (var ar = [], i = 0; i < arguments.length; i++)
ar = ar.concat(__read(arguments[i]));
return ar;
}
function __spreadArrays() {
for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;
for (var r = Array(s), k = 0, i = 0; i < il; i++)
for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)
r[k] = a[j];
return r;
};
function __await(v) {
return this instanceof __await ? (this.v = v, this) : new __await(v);
}
function __asyncGenerator(thisArg, _arguments, generator) {
if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
var g = generator.apply(thisArg, _arguments || []), i, q = [];
return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i;
function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }
function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }
function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }
function fulfill(value) { resume("next", value); }
function reject(value) { resume("throw", value); }
function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }
}
function __asyncDelegator(o) {
var i, p;
return i = {}, verb("next"), verb("throw", function (e) { throw e; }), verb("return"), i[Symbol.iterator] = function () { return this; }, i;
function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === "return" } : f ? f(v) : v; } : f; }
}
function __asyncValues(o) {
if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
var m = o[Symbol.asyncIterator], i;
return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i);
function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }
function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }
}
function __makeTemplateObject(cooked, raw) {
if (Object.defineProperty) { Object.defineProperty(cooked, "raw", { value: raw }); } else { cooked.raw = raw; }
return cooked;
};
function __importStar(mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
result.default = mod;
return result;
}
function __importDefault(mod) {
return (mod && mod.__esModule) ? mod : { default: mod };
}
/***/ }),
/***/ "./node_modules/webpack/buildin/global.js":
/*!***********************************!*\
!*** (webpack)/buildin/global.js ***!
\***********************************/
/*! no static exports found */
/***/ (function(module, exports) {
var g;
// This works in non-strict mode
g = (function() {
return this;
})();
try {
// This works if eval is allowed (see CSP)
g = g || new Function("return this")();
} catch (e) {
// This works if the window reference is available
if (typeof window === "object") g = window;
}
// g can still be undefined, but nothing to do about it...
// We return undefined, instead of nothing here, so it's
// easier to handle this case. if(!global) { ...}
module.exports = g;
/***/ }),
/***/ "./node_modules/webpack/buildin/harmony-module.js":
/*!*******************************************!*\
!*** (webpack)/buildin/harmony-module.js ***!
\*******************************************/
/*! no static exports found */
/***/ (function(module, exports) {
module.exports = function(originalModule) {
if (!originalModule.webpackPolyfill) {
var module = Object.create(originalModule);
// module.parent = undefined by default
if (!module.children) module.children = [];
Object.defineProperty(module, "loaded", {
enumerable: true,
get: function() {
return module.l;
}
});
Object.defineProperty(module, "id", {
enumerable: true,
get: function() {
return module.i;
}
});
Object.defineProperty(module, "exports", {
enumerable: true
});
module.webpackPolyfill = 1;
}
return module;
};
/***/ }),
/***/ "./resources/js/app.js":
/*!*****************************!*\
!*** ./resources/js/app.js ***!
\*****************************/
/*! no exports provided */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _sentry_browser__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @sentry/browser */ "./node_modules/@sentry/browser/esm/index.js");
/** ==========================================================================
* Dependencies
* =========================================================================*/
// We first import Sentry and trigger it if the sentry dsn is defined
// Because then all errors are logged
if (window.sentry_dsn !== undefined) _sentry_browser__WEBPACK_IMPORTED_MODULE_0__["init"]({
dsn: window.sentry_dsn
});
/**
* External
*/
__webpack_require__(/*! hammerjs */ "./node_modules/hammerjs/hammer.js");
__webpack_require__(/*! objectFitPolyfill */ "./node_modules/objectFitPolyfill/dist/objectFitPolyfill.min.js");
/** ==========================================================================
* Global functionalities
* =========================================================================*/
__webpack_require__(/*! ./global/helpers */ "./resources/js/global/helpers.js"); // Should be first
__webpack_require__(/*! ./global/browserHandler */ "./resources/js/global/browserHandler.js");
__webpack_require__(/*! ./global/scrollHandler */ "./resources/js/global/scrollHandler.js");
/** ==========================================================================
* Component functionalities
* =========================================================================*/
__webpack_require__(/*! ./components/chocolateFactory */ "./resources/js/components/chocolateFactory.js");
__webpack_require__(/*! ./components/cookieHandler */ "./resources/js/components/cookieHandler.js"); // require('./components/InputHandler');
__webpack_require__(/*! ./components/mapsHandler */ "./resources/js/components/mapsHandler.js");
__webpack_require__(/*! ./components/overlayMenuHandler */ "./resources/js/components/overlayMenuHandler.js");
__webpack_require__(/*! ./components/scrollToHandler */ "./resources/js/components/scrollToHandler.js");
__webpack_require__(/*! ./components/sliderHandler */ "./resources/js/components/sliderHandler.js");
__webpack_require__(/*! ./components/tabsHandler */ "./resources/js/components/tabsHandler.js");
__webpack_require__(/*! ./components/youtubeHandler */ "./resources/js/components/youtubeHandler.js");
/***/ }),
/***/ "./resources/js/components/chocolateFactory.js":
/*!*****************************************************!*\
!*** ./resources/js/components/chocolateFactory.js ***!
\*****************************************************/
/*! no static exports found */
/***/ (function(module, exports) {
/* ==========================================================================
| Prevent Bots handler
|
| We named this chocolate factory and belonging confusing js hooks
| to prevent smart bots from blocking these variable or functions.
|
========================================================================== */
var ChocolateFactory = {
bannedVisitor: [],
/** Get all the chocolate factory and start
* Looping through those start flashing tickets
*/
enter: function enter() {
var chocolateFactories = document.querySelectorAll('.js-chocolate-factory');
if (isset(chocolateFactories)) {
var amountOfChocolateFactories = chocolateFactories.length;
for (var i = 0; i < amountOfChocolateFactories; i++) {
var ChocolateBar = chocolateFactories[i];
ChocolateFactory._flashTicket(ChocolateBar);
}
}
},
/**
* If factory has a golden ticket
* Then we can make them go on the tour if there has been click on the ticket
*
* @param chocolateBar
* @private
*/
_flashTicket: function _flashTicket(chocolateBar) {
// Try get the ticket from the chocolateBar
var goldenTicket = chocolateBar.querySelector('.js-golden-ticket'); // Only continue if chocolate bar has a golden ticket
if (isset(goldenTicket)) {
goldenTicket.addEventListener('click', function () {
ChocolateFactory.enjoyTheTour(chocolateBar);
});
} else {
console.log('To bad, no golden tickets has been found.');
}
},
/**
* Start the tour through the factory
* And get the names and properties of the members of the group
* If there are members in the group of course
*
* @param chocolateFactory
*/
enjoyTheTour: function enjoyTheTour(chocolateFactory) {
// Ask for the tour group
var tourGroup = chocolateFactory.querySelectorAll('input, textarea');
if (isset(tourGroup)) {
// For each visitor we want a belonging Oompa Loompa
var oompaLoompas = {};
var amountOfOompaLoompas = 0;
var tourGroupSize = tourGroup.length;
for (var i = 0; i < tourGroupSize; i++) {
// Get the visitor from the group
var visitor = tourGroup[i]; // Ask for its name
var visitorName = visitor.getAttribute('name'); // Check if the visitor is banned
if (ChocolateFactory._isVisitorBanned(visitorName)) continue;
oompaLoompas[visitorName] = ChocolateFactory._getArrangement(visitor);
amountOfOompaLoompas++;
} // Check for insurance that there are oompa loompas
if (amountOfOompaLoompas === 0) return; // Send submit request
ChocolateFactory._finishTour(oompaLoompas, chocolateFactory);
} else {
console.log('To bad, no members to visit this factory');
}
},
/**
* Check if the visitor name isn't allow
*
* @param visitorName
* @returns {boolean}
* @private
*/
_isVisitorBanned: function _isVisitorBanned(visitorName) {
if (ChocolateFactory.bannedVisitor.indexOf(visitorName) !== -1) {
return true;
}
return false;
},
/**
* Most get visitor have a normal arrangement
* But sometimes there are special cases
* Like a Selector or checkbox
*
* @param visitor
* @returns {*}
* @private
*/
_getArrangement: function _getArrangement(visitor) {
var visitorType = visitor.nodeName;
switch (visitorType) {
default:
return visitor.value;
}
},
/**
* Finish the tour
* If successful show thanks message
* Or show defined error message or fallback
*
* @param group
* @param chocolateFactory
* @returns {*|void}
* @private
*/
_finishTour: function _finishTour(group, chocolateFactory) {
// Add willie to the group
group = ChocolateFactory._addWillieWonka(group); // Get the gate for finish the tour
var gate = '/contact/process';
try {
Ajax.post(gate, group, function (HttpRequest) {
var response = JSON.parse(HttpRequest.response);
switch (HttpRequest.status) {
case 200:
return ChocolateFactory._thanksForVisiting(response.redirectUrl);
case 422:
return ChocolateFactory._giveFeedbackToMembers(response.errors, chocolateFactory);
default:
break;
}
return ChocolateFactory._unknownGapInFactory(chocolateFactory);
});
} catch (e) {
return ChocolateFactory._unknownGapInFactory(chocolateFactory);
}
},
/**
* Add willie wonka to the group
* Ps... it actually the secret code!
*
* @param group
* @returns {*}
* @private
*/
_addWillieWonka: function _addWillieWonka(group) {
group._willie = 'wonka';
return group;
},
/**
* Add the feedback to the desired area.
* Most likely to the visitor directly, but sometime to the factory desired feedback area
*
* @param errors
* @param chocolateFactory
* @private
*/
_giveFeedbackToMembers: function _giveFeedbackToMembers(errors, chocolateFactory) {
// Grab the factory feedback area
var feedbackArea = chocolateFactory.querySelector('.js-error-area'); // Clear the current html
if (isset(feedbackArea)) feedbackArea.innerHTML = ''; // Clear the previous marked jackets
ChocolateFactory._clearPreviousMarkedJackets(chocolateFactory);
Object.keys(errors).forEach(function (visitor) {
var jacket = null;
var visitorFeedbackArea = null; // Honey elements doesn't has a accessible element
if (visitor !== '_honey' && visitor !== '_secretCode') {
// Grab the visitor
var visitorNode = chocolateFactory.querySelector('#' + visitor); // Find the jacket of a visitor
jacket = ChocolateFactory._grabVisitorJacket(visitorNode); // If found get the desired area
if (isset(jacket)) visitorFeedbackArea = jacket.querySelector('.js-form-group-error'); // Clear the current html
if (isset(visitorFeedbackArea)) visitorFeedbackArea.innerHTML = '';
} // Get the feedback for this visitor
var visitorFeedback = errors[visitor]; // Spit out each line
var visitorFeedbackAmount = visitorFeedback.length;
for (var i = 0; i < visitorFeedbackAmount; i++) {
var visitorFeedbackLine = visitorFeedback[i]; // console.log(visitor, visitorFeedbackLine);
// Honey elements doesn't has a accessible element area
if (visitor !== '_honey' && visitor !== '_secretCode') {
// Mark the jacket
if (isset(jacket)) jacket.classList.add('has-error'); // Append feedback to visitor feedback area if defined
if (isset(visitorFeedbackArea) && visitorFeedbackLine.length > 0) {
var currentFeedbackArea = visitorFeedbackArea.innerHTML;
currentFeedbackArea += '<span>' + capitalizeFirstLetter(visitorFeedbackLine) + '</span>';
visitorFeedbackArea.innerHTML = currentFeedbackArea;
}
} // Append feedback to factory feedback area if defined
if (isset(feedbackArea) && visitorFeedbackLine.length > 0) {
var _currentFeedbackArea = feedbackArea.innerHTML;
_currentFeedbackArea += '<li>' + capitalizeFirstLetter(visitorFeedbackLine) + '</li>';
feedbackArea.innerHTML = _currentFeedbackArea;
}
}
});
},
/**
* Clear the previous marked jackets
*
* @param chocolateFactory
* @private
*/
_clearPreviousMarkedJackets: function _clearPreviousMarkedJackets(chocolateFactory) {
var markedJackets = chocolateFactory.querySelectorAll('.has-error');
var markedJacketsAmount = markedJackets.length;
for (var i = 0; i < markedJacketsAmount; i++) {
markedJackets[i].classList.remove('has-error');
}
},
/**
* Grab the jacket of the visitor
*
* @param visitor
* @returns {null|*|(() => (Node | null))|ActiveX.IXMLDOMNode|(Node & ParentNode)}
* @private
*/
_grabVisitorJacket: function _grabVisitorJacket(visitor) {
// Check if visitor is defined
if (!isset(visitor)) return null; // Do loop settings
currentLayer = visitor;
safetyBreak = 0; // Grab the next layer till it is the jacket (or safetyBreak has been reached
do {
safetyBreak++;
currentLayer = currentLayer.parentNode;
if (currentLayer.classList.contains('js-form-group')) return currentLayer;
} while (currentLayer.tagName !== 'BODY' && safetyBreak <= 10);
return null;
},
/**
* Redirect the visitor to the thanks page
*
* @param nextStop
* @private
*/
_thanksForVisiting: function _thanksForVisiting(nextStop) {
window.location = nextStop;
},
/**
* Unknown error occurred, log the error
*
* @param chocolateFactory
* @private
*/
_unknownGapInFactory: function _unknownGapInFactory(chocolateFactory) {
console.log(chocolateFactory);
console.log('ChocolateFactory: Unkown Error');
}
};
ChocolateFactory.enter();
/***/ }),
/***/ "./resources/js/components/cookieHandler.js":
/*!**************************************************!*\
!*** ./resources/js/components/cookieHandler.js ***!
\**************************************************/
/*! no static exports found */
/***/ (function(module, exports) {
/* ==========================================================================
Cookie handler
- Primary usage for toggling the cookie message and/or switch
========================================================================== */
var CookieHandler = {
cookieBar: null,
cookieMessage: null,
cookieFadeOutAnimationDuration: 400,
acceptTracking: false,
// Initialize cookie handler
init: function init() {
// Bind cookie bar to cookieMessage
CookieHandler.cookieMessage = document.querySelector('.js-cookie-bar'); // Bind cookie bar to cookieBar
CookieHandler.cookieBar = document.querySelector('.js-cookie-bar'); // If isset init the functions for cookie bar
if (isset(CookieHandler.cookieBar)) {
CookieHandler.initCookieBar();
} // If either type of cookie has been found check if settings are defined
if (isset(CookieHandler.cookieMessage)) {
CookieHandler.checkForCookieSettings();
}
},
// Init the cookie bar actions
initCookieBar: function initCookieBar() {
var closeButton = CookieHandler.cookieBar.querySelector('.js-disable-cookie-bar');
if (isset(closeButton)) {
closeButton.addEventListener('click', CookieHandler.closeCookieMessage);
}
},
checkForCookieSettings: function checkForCookieSettings() {
if (Cookie.get('cookieMessage')) {
document.body.classList.add('is-cookies-accepted');
} else {
document.body.classList.remove('is-cookies-accepted');
}
},
closeCookieMessage: function closeCookieMessage() {
Cookie.set('cookieMessage', true, 90);
CookieHandler.cookieMessage.classList.add('is-transitioning-out');
document.body.classList.add('is-cookies-accepted');
}
};
CookieHandler.init();
/***/ }),
/***/ "./resources/js/components/mapsHandler.js":
/*!************************************************!*\
!*** ./resources/js/components/mapsHandler.js ***!
\************************************************/
/*! no static exports found */
/***/ (function(module, exports) {
/* ==========================================================================
Google Maps handler
- https://developers.google.com/maps/documentation/javascript/adding-a-google-map
========================================================================== */
var MapsHandler = {
map: '',
key: 'AIzaSyCVGPUmRmQRxXvzzWu3Xyu77XebQxQ-f4Y',
location: {
lat: 51.261089,
lng: 5.598172
},
styling: '',
init: function init() {
// Get map by id
MapsHandler.map = document.querySelector('.js-google-map'); // Check if a map is defined
if (isset(MapsHandler.map)) {
if (MapsHandler.map.hasAttribute('data-google-lat')) MapsHandler.location.lat = parseFloat(MapsHandler.map.getAttribute('data-google-lat'));
if (MapsHandler.map.hasAttribute('data-google-lng')) MapsHandler.location.lng = parseFloat(MapsHandler.map.getAttribute('data-google-lng'));
MapsHandler.setCustomStyling(); // See if google variable exists
if (typeof google == 'undefined' || typeof google.maps == 'undefined') {
// Load external script
getScript('https://maps.googleapis.com/maps/api/js?key=' + MapsHandler.key, MapsHandler.drawMap);
} else {
MapsHandler.drawMap();
}
}
},
drawMap: function drawMap() {
// Create a map
var map = new google.maps.Map(MapsHandler.map, {
zoom: 14,
center: MapsHandler.location,
disableDefaultUI: true,
styles: MapsHandler.styling
});
var contentString = '<div><p>Plan een route op ' + '<a target="_blank" href="https://www.google.com/maps/dir/?api=1&destination=' + MapsHandler.location.lat + ',' + MapsHandler.location.lng + '" class="link">' + 'google maps</a> ' + '</p></div>';
var infowindow = new google.maps.InfoWindow({
content: contentString
}); // Add a marker
var marker = new google.maps.Marker({
position: MapsHandler.location,
map: map // label: 'A'
});
marker.addListener('click', function () {
infowindow.open(map, marker);
});
},
setCustomStyling: function setCustomStyling() {
MapsHandler.styling = [{
"featureType": "water",
"elementType": "geometry",
"stylers": [{
"color": "#e9e9e9"
}, {
"lightness": 17
}]
}, {
"featureType": "landscape",
"elementType": "geometry",
"stylers": [{
"color": "#f5f5f5"
}, {
"lightness": 20
}]
}, {
"featureType": "road.highway",
"elementType": "geometry.fill",
"stylers": [{
"color": "#ffffff"
}, {
"lightness": 17
}]
}, {
"featureType": "road.highway",
"elementType": "geometry.stroke",
"stylers": [{
"color": "#ffffff"
}, {
"lightness": 29
}, {
"weight": 0.2
}]
}, {
"featureType": "road.arterial",
"elementType": "geometry",
"stylers": [{
"color": "#ffffff"
}, {
"lightness": 18
}]
}, {
"featureType": "road.local",
"elementType": "geometry",
"stylers": [{
"color": "#ffffff"
}, {
"lightness": 16
}]
}, {
"featureType": "poi",
"elementType": "geometry",
"stylers": [{
"color": "#f5f5f5"
}, {
"lightness": 21
}]
}, {
"featureType": "poi.park",
"elementType": "geometry",
"stylers": [{
"color": "#dedede"
}, {
"lightness": 21
}]
}, {
"elementType": "labels.text.stroke",
"stylers": [{
"visibility": "on"
}, {
"color": "#ffffff"
}, {
"lightness": 16
}]
}, {
"elementType": "labels.text.fill",
"stylers": [{
"saturation": 36
}, {
"color": "#333333"
}, {
"lightness": 40
}]
}, {
"elementType": "labels.icon",
"stylers": [{
"visibility": "off"
}]
}, {
"featureType": "transit",
"elementType": "geometry",
"stylers": [{
"color": "#f2f2f2"
}, {
"lightness": 19
}]
}, {
"featureType": "administrative",
"elementType": "geometry.fill",
"stylers": [{
"color": "#fefefe"
}, {
"lightness": 20
}]
}, {
"featureType": "administrative",
"elementType": "geometry.stroke",
"stylers": [{
"color": "#fefefe"
}, {
"lightness": 17
}, {
"weight": 1.2
}]
}];
}
};
MapsHandler.init();
/***/ }),
/***/ "./resources/js/components/overlayMenuHandler.js":
/*!*******************************************************!*\
!*** ./resources/js/components/overlayMenuHandler.js ***!
\*******************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
/* ==========================================================================
Navigation handler
- Handles the showing and hiding of the overlay-menu component which has the proper classes.
========================================================================== */
var bodyScrollLock = __webpack_require__(/*! body-scroll-lock */ "./node_modules/body-scroll-lock/lib/bodyScrollLock.min.js");
var OverlayMenuHandler = {
// init: function () {
// const overlayMenuTrigger = document.querySelector('.js-overlay-menu-trigger');
// OverlayMenuHandler.initOverlayMenu(overlayMenuTrigger);
// },
init: function init() {
var overlayMenuTriggerList = document.querySelectorAll('.js-overlay-menu-trigger');
var overlayMenuTriggerListCount = overlayMenuTriggerList.length;
if (isset(overlayMenuTriggerList) && overlayMenuTriggerListCount !== 0) {
for (var i = 0; i < overlayMenuTriggerListCount; i++) {
var overlayMenuTrigger = overlayMenuTriggerList[i];
OverlayMenuHandler.initOverlayMenu(overlayMenuTrigger);
}
}
},
initOverlayMenu: function initOverlayMenu(overlayMenuTrigger) {
overlayMenuTrigger.addEventListener('click', OverlayMenuHandler.toggleOverlayMenu, false);
},
toggleOverlayMenu: function toggleOverlayMenu(event) {
var overlayMenuNav = document.querySelector('.js-overlay-menu'); // const overlayMenuBody = overlayMenu.querySelector('.js-overlay-menu-persist-scrolling');
// Bail if overlayMenu doesn't exist
if (!overlayMenuNav) return; // Clear previously locked scroll on the body
bodyScrollLock.enableBodyScroll(overlayMenuNav); // If the overlayMenu is already active, collapse it and quit
if (document.body.classList.contains('is-overlay-menu-active')) {
overlayMenuNav.querySelectorAll('[tabindex="0"]').forEach(function (elem) {
elem.tabIndex = -1;
});
document.body.classList.remove('is-overlay-menu-active');
return;
} // Lock scrolling on the body
bodyScrollLock.disableBodyScroll(overlayMenuNav);
overlayMenuNav.querySelectorAll('[tabindex="-1"]').forEach(function (elem) {
elem.tabIndex = 0;
}); // Toggle active overlayMenu by setting a class on the body
document.body.classList.toggle('is-overlay-menu-active');
overlayMenuNav.hidden = false;
}
};
OverlayMenuHandler.init();
/***/ }),
/***/ "./resources/js/components/scrollToHandler.js":
/*!****************************************************!*\
!*** ./resources/js/components/scrollToHandler.js ***!
\****************************************************/
/*! no static exports found */
/***/ (function(module, exports) {
/* ==========================================================================
Scroll To Click handler
========================================================================== */
var ScrollToHandler = {
// Animation settings
offset: 60,
//pixel
duration: 1400,
//ms
// Animation variables
body: null,
start: 0,
change: 0,
currentTime: 0,
allowAnimation: false,
scrollToAnimation: null,
// Watch the EasingFunction helper for the available methods
easing: 'easeInOutQuad',
init: function init() {
var anchorLinks = document.querySelectorAll('.js-scroll-to-target');
var anchorLinksAmount = anchorLinks.length;
for (var i = 0; i < anchorLinksAmount; i++) {
var anchorLink = anchorLinks[i];
anchorLink.addEventListener('click', function (event) {
ScrollToHandler.prepareScrollTo(this.getAttribute('href'));
event.preventDefault();
});
}
},
/**
* Prepare the Handler for the animation
*/
prepareScrollTo: function prepareScrollTo(elementId) {
// Get the scroll to element
elementId = elementId.substr(elementId.indexOf('#') + 1);
var scrollToElement = document.getElementById(elementId);
if (scrollToElement == null) return;
var scrollToElementPosition = scrollToElement.getBoundingClientRect(); // Reset or define the Handler variables
ScrollToHandler.body = document.documentElement;
ScrollToHandler.start = Math.max(ScrollToHandler.body.scrollTop, document.body.scrollTop, window.pageYOffset); //Use Math.max because safari doesn't support document.documentElement.scrollTop
ScrollToHandler.change = scrollToElementPosition.top + ScrollToHandler.start - ScrollToHandler.start - ScrollToHandler.offset;
ScrollToHandler.startTime = 'now' in window.performance ? performance.now() : new Date().getTime();
ScrollToHandler.allowAnimation = true; // Trigger animation
scrollToAnimation = requestAnimationFrame(ScrollToHandler.animateScroll); // Stop on scroll
window.addEventListener('mousedown', ScrollToHandler.abortScrollAnimation);
window.addEventListener('wheel', ScrollToHandler.abortScrollAnimation);
window.addEventListener('DOMMouseScroll', ScrollToHandler.abortScrollAnimation);
window.addEventListener('mousewheel', ScrollToHandler.abortScrollAnimation);
window.addEventListener('keyup', ScrollToHandler.abortScrollAnimation);
window.addEventListener('touchmove', ScrollToHandler.abortScrollAnimation);
},
/*
* Animate the scroll position
*/
animateScroll: function animateScroll(timestamp) {
// Calculate progress from 0 - 1
var progress = Math.min(1, (timestamp - ScrollToHandler.startTime) / ScrollToHandler.duration);
if (progress < 0) progress = 0; // Convert progress with easing function
progress = EasingFunctions[ScrollToHandler.easing](progress);
var newScrollTop = ScrollToHandler.start + ScrollToHandler.change * progress;
ScrollToHandler.body.scrollTop = newScrollTop;
if (ScrollToHandler.body.scrollTop === 0) document.body.scrollTop = newScrollTop; // Safari doesn't support so if ScrollToHandler.body.scrollTop is 0 force the scroll position through document.body.scrollTop
if (progress < 1 && ScrollToHandler.allowAnimation) {
scrollToAnimation = requestAnimationFrame(ScrollToHandler.animateScroll);
}
},
/*
* Abort the scroll animation
*/
abortScrollAnimation: function abortScrollAnimation(event) {
ScrollToHandler.allowAnimation = false;
cancelAnimationFrame(ScrollToHandler.scrollToAnimation);
}
};
ScrollToHandler.init();
/***/ }),
/***/ "./resources/js/components/sliderHandler.js":
/*!**************************************************!*\
!*** ./resources/js/components/sliderHandler.js ***!
\**************************************************/
/*! no static exports found */
/***/ (function(module, exports) {
/* Example
const headerImageSliderSetting = new SliderProjectorSetting({
sliderProjectorId: 'header-image-slider',
slideQuery: '#header-image-slider .placeholder figure',
dots: '#header-image-slider .slider-navigation-labels .navigation span',
autoSlider: true,
sliderInterval: 4000
});
headerImageSliderSetting = headerImageSliderSetting.prepareParameters();
const headerImageSlider = new SliderProjector(headerImageSliderSetting).init();
*/
var Sliders = [];
var sliderContainers = document.querySelectorAll('.js-slider');
var sliderContainersLength = sliderContainers.length;
for (var i = 0; i < sliderContainersLength; i++) {
var slider = sliderContainers[i];
var sliderId = slider.getAttribute('id');
if (sliderId !== null) {
var Slidersetting = new SliderSetting({
sliderId: sliderId,
autoSlider: slider.getAttribute('data-auto-slide'),
slideQuery: '#' + sliderId + ' .js-slider-slide',
navigationButtons: '#' + sliderId + ' .js-slider-button',
dots: '#' + sliderId + ' .js-slider-indicator'
});
Sliders.push(new Slider(Slidersetting.prepareParameters()).init());
} else console.log('An image slider has no id...');
}
function SliderSetting(settingsObject) {
var self = this;
this.sliderId = '';
this.autoSlider = false;
this.sliderInterval = 4000;
this.navigationButtons = '';
this.dots = '';
this.slideQuery = '';
this.setSliderId = function (string) {
this.sliderId = string;
return this;
};
this.setAutoSlider = function (_boolean) {
this.autoSlider = _boolean;
return this;
};
this.setSliderInterval = function (integer) {
this.sliderInterval = integer;
return this;
};
this.setSlideQuery = function (string) {
this.slideQuery = string;
return this;
};
this.setNavigationButtons = function (string) {
this.navigationButtons = string;
return this;
};
this.setDots = function (string) {
this.dots = string;
return this;
};
this.getSliderId = function () {
return this.sliderId;
};
this.getAutoSlider = function () {
var autoSlide = this.autoSlider;
if (!Number.isInteger(autoSlide)) {
if (autoSlide == false) autoSlide = false;else autoSlide = true;
}
return autoSlide;
};
this.getSliderInterval = function () {
return this.sliderInterval;
};
this.getSlideQuery = function () {
return this.slideQuery;
};
this.getNavigationButtons = function () {
return this.navigationButtons;
};
this.getDots = function () {
return this.dots;
}; // Invert setters to getters
this.prepareParameters = function () {
return {
sliderId: self.getSliderId(),
autoSlider: self.getAutoSlider(),
sliderInterval: self.getSliderInterval(),
navigationButtons: self.getNavigationButtons(),
dots: self.getDots(),
slideQuery: self.getSlideQuery()
};
}; // Mass assign settings
this.fill = function () {
// Object.keys(settingsObject).forEach(function (key) {
// self[key] = settingsObject[key];
// });
var settingsObjectKeys = Object.keys(settingsObject);
var settingsObjectLength = settingsObjectKeys.length;
for (var _i = 0; _i < settingsObjectLength; _i++) {
var key = settingsObjectKeys[_i];
self[key] = settingsObject[key];
}
};
this.fill();
return {
sliderId: self.setSliderId,
autoSlider: self.setAutoSlider,
sliderInterval: self.setSliderInterval,
navigationButtons: self.setNavigationButtons,
dots: self.setDots,
slideQuery: self.setSlideQuery,
prepareParameters: self.prepareParameters
};
}
function Slider(settings) {
//Define Slider object
var self = this;
this.sliderObject = ''; //SlideParameters
this.activeSlideId = 0;
this.previousSlideId = 0;
this.nextSlideId = 0;
this.availableSlides = 1;
this.slides = [];
this.autoSliderInterval = null;
this.settings = {};
this.init = function () {
//Append settings to self
this.settings = settings; //Assign needed elements and calculations
this.sliderObject = document.getElementById(this.settings.sliderId);
this.slides = document.querySelectorAll(this.settings.slideQuery);
this.availableSlides = this.slides.length;
this.activeSlideId = 0; // Set active slide (and possible previous and next classes)
this.setSlide(); // Swipe interaction
var swipeGestures = new Hammer(this.sliderObject);
swipeGestures.on('swipeleft', function () {
self.resetAutoSlider();
self.nextSlide();
self.setSlide();
});
swipeGestures.on('swiperight', function () {
self.resetAutoSlider();
self.previousSlide();
self.setSlide();
});
if (this.settings.navigationButtons !== '') {
// Click interaction
var navigationButtons = document.querySelectorAll(this.settings.navigationButtons);
var navigationButtonsLength = navigationButtons.length;
for (var _i2 = 0; _i2 < navigationButtonsLength; _i2++) {
var navigationButton = navigationButtons[_i2];
navigationButton.addEventListener('click', function () {
self.clickNavigationButton(this);
});
}
}
if (this.settings.dots !== '') {
// Click interaction
var dots = document.querySelectorAll(this.settings.dots);
var dotsLength = dots.length; // console.log(this.settings.dots);
// console.log(dots);
for (var _i3 = 0; _i3 < dotsLength; _i3++) {
var dot = dots[_i3];
dot.addEventListener('click', function () {
self.clickDot(this);
});
}
}
self.autoSlider();
};
this.autoSlider = function () {
// Reset the interval if defined
if (this.autoSliderInterval !== null) clearInterval(this.autoSliderInterval); // Check if should auto slide before creating the interval
// We do this inhere, because the autoslide function is also called by other functionality
if (this.settings.autoSlider !== false && Number.isInteger(this.settings.sliderInterval)) {
this.autoSliderInterval = setInterval(function () {
self.nextSlide();
self.setSlide();
}, this.settings.sliderInterval);
}
};
this.resetAutoSlider = self.autoSlider;
this.nextSlide = function () {
this.activeSlideId++;
if (this.activeSlideId >= this.availableSlides) this.activeSlideId = 0;
};
this.previousSlide = function () {
this.activeSlideId--;
if (this.activeSlideId < 0) this.activeSlideId = this.availableSlides - 1;
};
this.setSlide = function () {
// Loop through the form elements
var slidesLength = self.slides.length;
for (var _i4 = 0; _i4 < slidesLength; _i4++) {
var slide = self.slides[_i4];
slide.style.pointerEvents = "none"; // Needed for swipe functionality
// Convert data set attribute to desired type
var slideOrder = parseInt(slide.getAttribute('data-order')); // Remove and set active for all slides
if (slideOrder !== self.activeSlideId) slide.classList.remove('is-active');else slide.classList.add('is-active');
}
if (self.settings.dots !== '') {
self.setActiveDot();
}
};
this.clickNavigationButton = function (navButton) {
var navButtonDirection = navButton.getAttribute('aria-label');
if (navButtonDirection === 'next') this.nextSlide();else if (navButtonDirection === 'previous') this.previousSlide();
self.setSlide();
self.resetAutoSlider();
};
this.clickDot = function (clickedDot) {
self.activeSlideId = parseInt(clickedDot.getAttribute('data-order'));
self.setSlide();
self.resetAutoSlider();
};
this.setActiveDot = function () {
var dots = document.querySelectorAll(this.settings.dots);
var dotsLength = dots.length;
for (var _i5 = 0; _i5 < dotsLength; _i5++) {
var dot = dots[_i5];
dotOrder = parseInt(dot.getAttribute('data-order'));
if (dotOrder !== self.activeSlideId) {
dot.classList.remove('is-active');
dot.tabIndex = 0;
} else {
dot.classList.add('is-active');
dot.tabIndex = -1;
}
}
};
}
/***/ }),
/***/ "./resources/js/components/tabsHandler.js":
/*!************************************************!*\
!*** ./resources/js/components/tabsHandler.js ***!
\************************************************/
/*! no static exports found */
/***/ (function(module, exports) {
/* ==========================================================================
Tabs handler
- Handles the tabs component which has the proper classes.
========================================================================== */
var TabsHandler = {
tabsList: null,
tabs: null,
init: function init() {
TabsHandler.tabsList = document.querySelectorAll('.js-tabs');
var tabsListCount = TabsHandler.tabsList.length;
if (isset(TabsHandler.tabsList) && tabsListCount !== 0) {
for (var i = 0; i < tabsListCount; i++) {
var _tabs = TabsHandler.tabsList[i];
TabsHandler.initTabs(_tabs);
}
}
},
initTabs: function initTabs(tabs) {
var container = tabs.querySelector('.js-tabs-container'); // Check if container element exists
if (container == null) {
console.error("There is no container for the content tabs defined.");
return;
}
var triggers = tabs.querySelectorAll('.js-tabs-trigger');
var tabsContent = container.querySelectorAll('.js-tabs-content'); // Check if number of triggers and tabs match
if (triggers.length !== tabs.length) {
console.error("There are ".concat(triggers.length, " trigger buttons and ").concat(tabs.length, " tabs. These must match."));
}
tabs.addEventListener('click', function (event) {
// Check if clicked on a step button (prev or next)
if (event.target.closest('.js-tabs-step')) {
var dir = event.target.closest('.js-tabs-step').getAttribute('data-step');
TabsHandler.stepTabs(dir, triggers, tabsContent);
} // Bail if we didn't click on the trigger element
if (!event.target.classList.contains('js-tabs-trigger')) return; // Bail if already active
if (event.target.classList.contains('is-active')) {
return;
}
TabsHandler.toggleTabs(event.target.dataset.tabId, triggers, tabsContent);
});
},
toggleTabs: function toggleTabs(tabId, triggers, tabsContent) {
if (isset(triggers) && triggers.length > 0) {
// Loop through all tabs
for (var i = 0; i < triggers.length; i++) {
var tabsTab = tabsContent[i];
var tabsTrigger = triggers[i];
tabsTrigger.classList.remove('is-active');
tabsTrigger.tabIndex = 0;
tabsTab.classList.remove('is-active');
if (tabsTab.dataset.tabId === tabId) {
tabsTrigger.classList.add('is-active');
tabsTrigger.tabIndex = -1;
tabsTab.classList.add('is-active');
}
}
}
},
stepTabs: function stepTabs(dir, triggers, tabsContent) {
var triggerCount = triggers.length;
var activeId = 1;
var newId = 0;
if (isset(triggers) && triggerCount > 0) {
// Loop through all tabs
for (var i = 0; i < triggerCount; i++) {
var tabsTab = tabsContent[i];
var tabsTrigger = triggers[i]; // Set activeId
if (tabsTab.classList.contains('is-active')) {
activeId = Number(tabsTab.getAttribute('data-tab-id'));
} // Check what next Id will be
if (dir === 'next') {
if (activeId === triggerCount) {
newId = 0;
} else {
newId = activeId;
}
} else if (dir === 'prev') {
if (activeId === 1) {
newId = triggerCount - 1;
} else {
newId = activeId - 2;
}
} // Remove active class
tabsTrigger.tabIndex = 0;
tabsTab.classList.remove('is-active');
tabsTrigger.classList.remove('is-active');
}
triggers[newId].tabIndex = -1;
triggers[newId].classList.add('is-active');
tabs[newId].classList.add('is-active');
}
}
};
TabsHandler.init();
/***/ }),
/***/ "./resources/js/components/youtubeHandler.js":
/*!***************************************************!*\
!*** ./resources/js/components/youtubeHandler.js ***!
\***************************************************/
/*! no static exports found */
/***/ (function(module, exports) {
/* ==========================================================================
Youtube handler
========================================================================== */
var YoutubeHandler = {
youtubeClass: '.js-youtube-player',
players: [],
init: function init() {
// Get the youtube players containers
var youtubePlayers = document.querySelectorAll(YoutubeHandler.youtubeClass);
var youtubePlayersAmount = youtubePlayers.length;
for (var i = 0; i < youtubePlayersAmount; i++) {
var youtubePlayer = youtubePlayers[i];
var youtubePlayerId = youtubePlayer.getAttribute('id');
if (youtubePlayerId !== null) {
// Strip the necessary data from the html and create objects from it
var youtubeElement = {
id: youtubePlayer.getAttribute('id'),
link: youtubePlayer.getAttribute('data-youtube-link'),
autoPlay: parseInt(youtubePlayer.getAttribute('data-auto-play'))
};
YoutubeHandler.players.push(youtubeElement);
} else {
console.log("Element not include because there isn't a id on the player");
console.log(youtubePlayer);
}
}
if (youtubePlayersAmount >= 1) YoutubeHandler.initYoutube();
},
/**
* Check if external script is loaded
*
*/
initYoutube: function initYoutube() {
// See if YT variable exists
if (typeof YT == 'undefined' || typeof YT.Player == 'undefined') {
// Setup API ready function
window.onYouTubePlayerAPIReady = function () {
YoutubeHandler.loadPlayers();
}; // Load external script
getScript('https://www.youtube.com/iframe_api'); // If YT already exists load player
} else {
YoutubeHandler.loadPlayers();
}
},
/**
* Create the Youtube player(s) with parameters
* And rewrite the players to key them by the element id
*
*/
loadPlayers: function loadPlayers() {
var players = [];
var youtubePlayersAmount = YoutubeHandler.players.length;
for (var i = 0; i < youtubePlayersAmount; i++) {
var youtubePlayer = YoutubeHandler.players[i]; // Load player
youtubePlayer.player = new YT.Player(youtubePlayer.id, {
height: 200,
width: 200,
videoId: youtubePlayer.link,
host: 'https://www.youtube-nocookie.com',
playerVars: {
modestbranding: 0,
rel: 0,
disablekb: 1,
autoplay: youtubePlayer.autoPlay
},
events: {
// 'onReady': YoutubeHandler.onReady,
'onStateChange': YoutubeHandler.onStateChange
}
});
players[youtubePlayer.id] = youtubePlayer;
}
YoutubeHandler.players = players;
},
/**
* When player is ready to play
*/
onReady: function onReady(event) {
var playerContainerId = event.target.getIframe().getAttribute('id');
var player = YoutubeHandler.players[playerContainerId].player; // Show video
// setTimeout(function(){ $('#' + playerContainerId).stop().animate({ opacity: 1 },1000) },800);
// If not on tablet or mobile, play on high quality
// player.mute();
// player.playVideo();
// player.setPlaybackQuality('hd1080');
},
/**
* Listener for Youtube state change
*/
onStateChange: function onStateChange(event) {
var playerContainerId = event.target.getIframe().getAttribute('id');
var player = YoutubeHandler.players[playerContainerId].player;
var videoState = event.data; // Loop video
if (event.data === YT.PlayerState.ENDED) {
player.playVideo();
}
}
};
YoutubeHandler.init();
/***/ }),
/***/ "./resources/js/global/browserHandler.js":
/*!***********************************************!*\
!*** ./resources/js/global/browserHandler.js ***!
\***********************************************/
/*! no static exports found */
/***/ (function(module, exports) {
/* ==========================================================================
Browser Handler
========================================================================== */
var BrowserHandler = {
userAgent: '',
browserInfo: '',
init: function init() {
BrowserHandler.userAgent = window.navigator.userAgent;
BrowserHandler.browserInfo = BrowserHandler.getBrowserInfo();
BrowserHandler.handleIE();
BrowserHandler.handleSafari();
},
handleIE: function handleIE() {
// Detect versions below ie11
var msie = BrowserHandler.userAgent.indexOf('MSIE ');
var ielt11 = msie > 0; // Detect ie11
var ie11 = !!navigator.userAgent.match(/Trident.*rv\:11\./); // If Internet Explorer
if (ielt11 || ie11) {
// Default version
var version = '11'; // Way to detect version < 11
if (ielt11) version = parseInt(BrowserHandler.userAgent.substring(msie + 5, BrowserHandler.userAgent.indexOf(".", msie))); // Append classes to HTML (we have to do this separately because else ie will fail)
document.body.classList.add('ie');
document.body.classList.add('v' + version);
}
},
// Fallback for older safari version
handleSafari: function handleSafari() {
if (BrowserHandler.browserInfo.name === 'Safari' && BrowserHandler.browserInfo.version <= 10) {
document.getElementsByTagName('html')[0].classList.add('ie');
}
},
getBrowserInfo: function getBrowserInfo() {
var ua = navigator.userAgent,
tem,
M = ua.match(/(opera|chrome|safari|firefox|msie|trident(?=\/))\/?\s*(\d+)/i) || [];
if (/trident/i.test(M[1])) {
tem = /\brv[ :]+(\d+)/g.exec(ua) || [];
return {
name: 'IE ',
version: tem[1] || ''
};
}
if (M[1] === 'Chrome') {
tem = ua.match(/\bOPR\/(\d+)/);
if (tem != null) {
return {
name: 'Opera',
version: tem[1]
};
}
}
M = M[2] ? [M[1], M[2]] : [navigator.appName, navigator.appVersion, '-?'];
if ((tem = ua.match(/version\/(\d+)/i)) != null) {
M.splice(1, 1, tem[1]);
}
return {
name: M[0],
version: M[1]
};
}
};
BrowserHandler.init();
/***/ }),
/***/ "./resources/js/global/helpers.js":
/*!****************************************!*\
!*** ./resources/js/global/helpers.js ***!
\****************************************/
/*! no static exports found */
/***/ (function(module, exports) {
/* ==========================================================================
Helper functions
========================================================================== */
/*
* Simple isset method for this does not exist in javascript
*/
window.isset = function (obj) {
return typeof obj !== 'undefined' && obj !== null;
};
/*
* Easing Functions - inspired from http://gizma.com/easing/
* only considering the t value for the range [0, 1] => [0, 1]
*/
window.EasingFunctions = {
// no easing, no acceleration
linear: function linear(t) {
return t;
},
// accelerating from zero velocity
easeInQuad: function easeInQuad(t) {
return t * t;
},
// decelerating to zero velocity
easeOutQuad: function easeOutQuad(t) {
return t * (2 - t);
},
// acceleration until halfway, then deceleration
easeInOutQuad: function easeInOutQuad(t) {
return t < .5 ? 2 * t * t : -1 + (4 - 2 * t) * t;
},
// accelerating from zero velocity
easeInCubic: function easeInCubic(t) {
return t * t * t;
},
// decelerating to zero velocity
easeOutCubic: function easeOutCubic(t) {
return --t * t * t + 1;
},
// acceleration until halfway, then deceleration
easeInOutCubic: function easeInOutCubic(t) {
return t < .5 ? 4 * t * t * t : (t - 1) * (2 * t - 2) * (2 * t - 2) + 1;
},
// accelerating from zero velocity
easeInQuart: function easeInQuart(t) {
return t * t * t * t;
},
// decelerating to zero velocity
easeOutQuart: function easeOutQuart(t) {
return 1 - --t * t * t * t;
},
// acceleration until halfway, then deceleration
easeInOutQuart: function easeInOutQuart(t) {
return t < .5 ? 8 * t * t * t * t : 1 - 8 * --t * t * t * t;
},
// accelerating from zero velocity
easeInQuint: function easeInQuint(t) {
return t * t * t * t * t;
},
// decelerating to zero velocity
easeOutQuint: function easeOutQuint(t) {
return 1 + --t * t * t * t * t;
},
// acceleration until halfway, then deceleration
easeInOutQuint: function easeInOutQuint(t) {
return t < .5 ? 16 * t * t * t * t * t : 1 + 16 * --t * t * t * t * t;
}
};
/*
* Vanilla version of the $.getScript
*/
window.getScript = function (source, callback) {
var script = document.createElement('script');
script.async = 1;
window.scripts = document.getElementsByTagName('script');
var prior = scripts[scripts.length - 1];
script.onload = script.onreadystatechange = function (_, isAbort) {
if (isAbort || !script.readyState || /loaded|complete/.test(script.readyState)) {
script.onload = script.onreadystatechange = null;
script = undefined;
if (!isAbort) {
if (callback) callback();
}
}
};
script.src = source;
prior.parentNode.insertBefore(script, prior);
};
/**
* Returns a function, that, as long as it continues to be invoked, will not
* be triggered. The function will be called after it stops being called for
* N milliseconds. If `immediate` is passed, trigger the function on the
* leading edge, instead of the trailing.
* @param func
* @param wait
* @param immediate
* @returns {Function}
*/
window.debounce = function (func, wait, immediate) {
var timeout;
return function () {
var context = this,
args = arguments;
var later = function later() {
timeout = null;
if (!immediate) func.apply(context, args);
};
var callNow = immediate && !timeout;
clearTimeout(timeout);
timeout = setTimeout(later, wait);
if (callNow) func.apply(context, args);
};
};
/*
* Cookie helper class
*/
window.Cookie = {
set: function set(name, value, days) {
var domain, domainParts, date, expires, host;
if (days) {
date = new Date();
date.setTime(date.getTime() + days * 24 * 60 * 60 * 1000);
expires = "; expires=" + date.toGMTString();
} else {
expires = "";
}
host = location.host;
if (isIPOrLocalHost(location.hostname)) {
document.cookie = name + "=" + value + expires + "; path=/";
} else {
// Remember the cookie on all sub domains.
//
// Start with trying to set cookie to the top domain.
// (example: if user is on foo.com, try to set
// cookie to domain ".com")
//
// If the cookie will not be set, it means ".com"
// is a top level domain and we need to
// set the cookie to ".foo.com"
domainParts = host.split('.');
domainParts.shift();
domain = '.' + domainParts.join('.'); // For development purpose, remove this when moving to production
// domain = '.komma.pro';
document.cookie = name + "=" + value + expires + "; path=/; domain=" + domain; // check if cookie was successfuly set to the given domain
// (otherwise it was a Top-Level Domain)
if (Cookie.get(name) == null || Cookie.get(name) != value) {
// append "." to current domain
domain = '.' + host;
document.cookie = name + "=" + value + expires + "; path=/; domain=" + domain;
}
}
},
get: function get(name) {
window.nameEQ = name + "=";
window.ca = document.cookie.split(';');
for (var i = 0; i < ca.length; i++) {
var c = ca[i];
while (c.charAt(0) === ' ') {
c = c.substring(1, c.length);
}
if (c.indexOf(nameEQ) === 0) return c.substring(nameEQ.length, c.length);
}
return null;
},
erase: function erase(name) {
Cookie.set(name, '', -1);
}
};
window.isIPOrLocalHost = function (value) {
return isIpAddress(value) || value === 'localhost';
};
window.isIpAddress = function (ipaddress) {
return /^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/.test(ipaddress);
};
/*
* Javascript version of the number_format method of PHP
*/
window.number_format = function (number, decimals, dec_point, thousands_sep) {
// Strip all characters but numerical ones.
number = (number + '').replace(/[^0-9+\-Ee.]/g, '');
var n = !isFinite(+number) ? 0 : +number,
prec = !isFinite(+decimals) ? 0 : Math.abs(decimals),
sep = typeof thousands_sep === 'undefined' ? ',' : thousands_sep,
dec = typeof dec_point === 'undefined' ? '.' : dec_point,
s = '',
toFixedFix = function toFixedFix(n, prec) {
var k = Math.pow(10, prec);
return '' + Math.round(n * k) / k;
}; // Fix for IE parseFloat(0.55).toFixed(0) = 0;
s = (prec ? toFixedFix(n, prec) : '' + Math.round(n)).split('.');
if (s[0].length > 3) {
s[0] = s[0].replace(/\B(?=(?:\d{3})+(?!\d))/g, sep);
}
if ((s[1] || '').length < prec) {
s[1] = s[1] || '';
s[1] += new Array(prec - s[1].length + 1).join('0');
}
return s.join(dec);
};
/**
* Element.closest() polyfill
* https://developer.mozilla.org/en-US/docs/Web/API/Element/closest#Polyfill
*/
if (!Element.prototype.closest) {
if (!Element.prototype.matches) {
Element.prototype.matches = Element.prototype.msMatchesSelector || Element.prototype.webkitMatchesSelector;
}
Element.prototype.closest = function (s) {
var el = this;
var ancestor = this;
if (!document.documentElement.contains(el)) return null;
do {
if (ancestor.matches(s)) return ancestor;
ancestor = ancestor.parentElement;
} while (ancestor !== null);
return null;
};
}
window.Ajax = {
//TODO: Can we create a prepare request function ??
get: function get(url, callback) {
var xhr = new XMLHttpRequest();
var token = document.querySelector('meta[name="csrf-token"]').content;
xhr.open('get', url, true);
xhr.setRequestHeader('Content-Type', 'application/json');
xhr.setRequestHeader('X-CSRF-TOKEN', token);
xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
xhr.onreadystatechange = function () {
if (xhr.readyState === 4) {
callback(xhr);
}
};
xhr.send();
},
post: function post(url, data, callback) {
var xhr = new XMLHttpRequest();
var token = document.querySelector('meta[name="csrf-token"]').content;
xhr.open('post', url, true);
xhr.setRequestHeader('Content-Type', 'application/json');
xhr.setRequestHeader('X-CSRF-TOKEN', token);
xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
xhr.onreadystatechange = function () {
if (xhr.readyState === 4) {
callback(xhr);
}
};
xhr.send(JSON.stringify(data));
}
};
/**
* Capitalize the first letter of the string
* @param string
* @returns {string}
*/
window.capitalizeFirstLetter = function (string) {
return string.charAt(0).toUpperCase() + string.slice(1);
};
/**
* Convert snake case into camelcase
*
* @param string
* @returns {*}
*/
function snakeToCamel(string) {
return string.replace(/(\-\w)/g, function (m) {
return m[1].toUpperCase();
});
}
/**
* Get the index of an element inside its parent
*/
function indexInParent(node) {
window.children = node.parentNode.childNodes;
var num = 0;
for (var i = 0; i < children.length; i++) {
if (children[i] == node) return num;
if (children[i].nodeType == 1) num++;
}
return -1;
}
/**
* For security reasons iOS Safari only allows document.execCommand('copy') for text within a contentEditable container.
* The workaround is to detect iOS Safari and quickly toggle contentEditable before executing document.execCommand('copy').
* Wheb input or textarea is READONLY you can prevent the unwanted popup with copy/paste functions and the input keyboard
* Code from: https://stackoverflow.com/a/46981847
*/
function copyToClipboard(el) {
// resolve the element
el = typeof el === 'string' ? document.querySelector(el) : el; // handle iOS as a special case
if (navigator.userAgent.match(/ipad|ipod|iphone/i)) {
// save current contentEditable/readOnly status
window.editable = el.contentEditable;
window.readOnly = el.readOnly; // convert to editable with readonly to stop iOS keyboard opening
el.contentEditable = true;
el.readOnly = true; // create a selectable range
var range = document.createRange();
range.selectNodeContents(el); // select the range
window.selection = window.getSelection();
selection.removeAllRanges();
selection.addRange(range);
el.setSelectionRange(0, 999999); // restore contentEditable/readOnly to original state
el.contentEditable = editable;
el.readOnly = readOnly;
} else {
el.select();
} // execute copy command
document.execCommand('copy');
}
/***/ }),
/***/ "./resources/js/global/scrollHandler.js":
/*!**********************************************!*\
!*** ./resources/js/global/scrollHandler.js ***!
\**********************************************/
/*! no static exports found */
/***/ (function(module, exports) {
/* ==========================================================================
Scroll handler
- Handler the objects which are bind on scroll events or visible in viewport
========================================================================== */
var ScrollHandler = {
// Variables for debounce and throttle effects
time: Date.now(),
timeout: null,
waitThrottle: 1000,
waitDebounce: 300,
// Variables for scroll direction
lastScrollTopPosition: 0,
scrollDirectionDown: true,
scrollDirectionUp: false,
//Initialisation
init: function init() {
// Trigger start on start up
ScrollHandler.triggerOnInit(); // Throttle scroll
window.addEventListener('scroll', function () {
if (ScrollHandler.time + ScrollHandler.waitThrottle - Date.now() < 0) {
ScrollHandler.triggerThrottle();
ScrollHandler.time = Date.now();
}
}); // Smooth scroll
window.addEventListener('scroll', function () {
ScrollHandler.triggerSmooth();
}); // Debounce scroll
window.addEventListener('scroll', function () {
if (isset(ScrollHandler.timeout)) clearTimeout(ScrollHandler.timeout);
ScrollHandler.timeout = setTimeout(ScrollHandler.triggerDebounce, ScrollHandler.waitDebounce);
});
},
// Trigger on start up
triggerOnInit: function triggerOnInit() {
ScrollHandler.triggerElementInViewportAnimation();
},
// Trigger scroll functions with throttle (preferred)
triggerThrottle: function triggerThrottle() {
// console.log('Throttled scroll');
ScrollHandler.triggerElementInViewportAnimation();
},
// Trigger scroll on debounce
triggerDebounce: function triggerDebounce() {// console.log('Debounce scroll');
},
// Trigger scroll on the flight
triggerSmooth: function triggerSmooth() {
// console.log('Smooth scroll');
ScrollHandler.detectScrollDirection();
ScrollHandler.toggleStickyHeader();
},
// Detect if part of a given element is visible in the viewport
// El must be a node element
detectIfElementIsPartlyInViewport: function detectIfElementIsPartlyInViewport(el) {
if (isset(el)) {
var rect = el.getBoundingClientRect(); // DOMRect { x: 8, y: 8, width: 100, height: 100, top: 8, right: 108, bottom: 108, left: 8 }
var windowHeight = window.innerHeight || document.documentElement.clientHeight;
var windowWidth = window.innerWidth || document.documentElement.clientWidth;
var verticalInView = rect.top <= windowHeight && rect.top + rect.height >= 0;
var horizontalInView = rect.left <= windowWidth && rect.left + rect.width >= 0;
return verticalInView && horizontalInView;
}
},
// Detect if a given element is fully visible in the viewport
// El must be a node element
detectIfElementIsFullyInViewport: function detectIfElementIsFullyInViewport(el) {
if (isset(el)) {
var rect = el.getBoundingClientRect();
return rect.top >= 0 && rect.bottom <= window.innerHeight;
}
},
detectScrollDirection: function detectScrollDirection() {
var scrollTopPosition = window.pageYOffset || document.documentElement.scrollTop; // Credits: "https://github.com/qeremy/so/blob/master/so.dom.js#L426"
if (scrollTopPosition >= ScrollHandler.lastScrollTopPosition) {
ScrollHandler.scrollDirectionDown = true;
ScrollHandler.scrollDirectionUp = false;
} else {
ScrollHandler.scrollDirectionDown = false;
ScrollHandler.scrollDirectionUp = true;
}
ScrollHandler.lastScrollTopPosition = scrollTopPosition;
},
// Trigger animation on elements that have 'element-in-viewport' and that are in the viewport
// These animation can only be triggered once, if you want more then that you should write an specific function for this
triggerElementInViewportAnimation: function triggerElementInViewportAnimation() {
var elements = document.querySelectorAll('.element-in-viewport');
var elementsLength = elements.length;
for (var e = 0; e < elementsLength; e++) {
var element = elements[e];
if (ScrollHandler.detectIfElementIsPartlyInViewport(element)) {
element.classList.remove('element-in-viewport');
}
}
},
// ------------------------------ CUSTOM SCROLL HANDLERS ------------------------------------
// Hide or show sticky navigation when header isn't visible
toggleStickyHeader: function toggleStickyHeader() {
var stickyHeader = document.querySelector('.js-sticky-header');
var visibleStickyHeaderClass = 'is-sticky-header-visible';
var subnavList = document.querySelectorAll('.js-subnav');
var subNavIsVisible = false;
if (stickyHeader) stickyHeader.hidden = false;
for (var i = 0; i < subnavList.length; i++) {
if (window.getComputedStyle(subnavList[i], null).visibility == "visible") {
return subNavIsVisible = true;
}
}
if (isset(stickyHeader) && !subNavIsVisible) {
// Hide when scrolling DOWN (OR within offset)
if (ScrollHandler.scrollDirectionDown || ScrollHandler.lastScrollTopPosition < 110) {
document.body.classList.remove(visibleStickyHeaderClass);
} // Show when scrolling UP and outside of offset
else {
document.body.classList.add(visibleStickyHeaderClass);
}
}
}
};
ScrollHandler.init();
/***/ }),
/***/ "./resources/sass/style.scss":
/*!***********************************!*\
!*** ./resources/sass/style.scss ***!
\***********************************/
/*! no static exports found */
/***/ (function(module, exports) {
// removed by extract-text-webpack-plugin
/***/ }),
/***/ 0:
/*!***************************************************************!*\
!*** multi ./resources/js/app.js ./resources/sass/style.scss ***!
\***************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
__webpack_require__(/*! /Users/pascallemmen/Development/Reiskick/resources/js/app.js */"./resources/js/app.js");
module.exports = __webpack_require__(/*! /Users/pascallemmen/Development/Reiskick/resources/sass/style.scss */"./resources/sass/style.scss");
/***/ })
},[[0,"/js/site/manifest","/js/site/vendor"]]]);
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHNlbnRyeS9icm93c2VyL2VzbS9iYWNrZW5kLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L2Jyb3dzZXIvZXNtL2NsaWVudC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHNlbnRyeS9icm93c2VyL2VzbS9ldmVudGJ1aWxkZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BzZW50cnkvYnJvd3Nlci9lc20vZXhwb3J0cy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHNlbnRyeS9icm93c2VyL2VzbS9oZWxwZXJzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L2Jyb3dzZXIvZXNtL2luZGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L2Jyb3dzZXIvZXNtL2ludGVncmF0aW9ucy9icmVhZGNydW1icy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHNlbnRyeS9icm93c2VyL2VzbS9pbnRlZ3JhdGlvbnMvZ2xvYmFsaGFuZGxlcnMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BzZW50cnkvYnJvd3Nlci9lc20vaW50ZWdyYXRpb25zL2luZGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L2Jyb3dzZXIvZXNtL2ludGVncmF0aW9ucy9saW5rZWRlcnJvcnMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BzZW50cnkvYnJvd3Nlci9lc20vaW50ZWdyYXRpb25zL3RyeWNhdGNoLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L2Jyb3dzZXIvZXNtL2ludGVncmF0aW9ucy91c2VyYWdlbnQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BzZW50cnkvYnJvd3Nlci9lc20vcGFyc2Vycy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHNlbnRyeS9icm93c2VyL2VzbS9zZGsuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BzZW50cnkvYnJvd3Nlci9lc20vdHJhY2VraXQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BzZW50cnkvYnJvd3Nlci9lc20vdHJhbnNwb3J0cy9iYXNlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L2Jyb3dzZXIvZXNtL3RyYW5zcG9ydHMvZmV0Y2guanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BzZW50cnkvYnJvd3Nlci9lc20vdHJhbnNwb3J0cy9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHNlbnRyeS9icm93c2VyL2VzbS90cmFuc3BvcnRzL3hoci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHNlbnRyeS9icm93c2VyL2VzbS92ZXJzaW9uLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L2NvcmUvZXNtL2FwaS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHNlbnRyeS9jb3JlL2VzbS9iYXNlYmFja2VuZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHNlbnRyeS9jb3JlL2VzbS9iYXNlY2xpZW50LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L2NvcmUvZXNtL2luZGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L2NvcmUvZXNtL2ludGVncmF0aW9uLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L2NvcmUvZXNtL2ludGVncmF0aW9ucy9mdW5jdGlvbnRvc3RyaW5nLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L2NvcmUvZXNtL2ludGVncmF0aW9ucy9pbmJvdW5kZmlsdGVycy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHNlbnRyeS9jb3JlL2VzbS9pbnRlZ3JhdGlvbnMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BzZW50cnkvY29yZS9lc20vcmVxdWVzdC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHNlbnRyeS9jb3JlL2VzbS9zZGsuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BzZW50cnkvY29yZS9lc20vdHJhbnNwb3J0cy9ub29wLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L2h1Yi9lc20vaHViLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L2h1Yi9lc20vaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BzZW50cnkvaHViL2VzbS9zY29wZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHNlbnRyeS9taW5pbWFsL2VzbS9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHNlbnRyeS90eXBlcy9lc20vaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BzZW50cnkvdHlwZXMvZXNtL2xvZ2xldmVsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L3R5cGVzL2VzbS9zZXZlcml0eS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHNlbnRyeS90eXBlcy9lc20vc3RhdHVzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L3V0aWxzL2VzbS9hc3luYy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHNlbnRyeS91dGlscy9lc20vZHNuLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L3V0aWxzL2VzbS9lcnJvci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHNlbnRyeS91dGlscy9lc20vaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BzZW50cnkvdXRpbHMvZXNtL2luc3RydW1lbnQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BzZW50cnkvdXRpbHMvZXNtL2lzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L3V0aWxzL2VzbS9sb2dnZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BzZW50cnkvdXRpbHMvZXNtL21lbW8uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BzZW50cnkvdXRpbHMvZXNtL21pc2MuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BzZW50cnkvdXRpbHMvZXNtL29iamVjdC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHNlbnRyeS91dGlscy9lc20vcGF0aC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHNlbnRyeS91dGlscy9lc20vcG9seWZpbGwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BzZW50cnkvdXRpbHMvZXNtL3Byb21pc2VidWZmZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BzZW50cnkvdXRpbHMvZXNtL3N0cmluZy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHNlbnRyeS91dGlscy9lc20vc3VwcG9ydHMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BzZW50cnkvdXRpbHMvZXNtL3N5bmNwcm9taXNlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9wcm9jZXNzL2Jyb3dzZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3RzbGliL3RzbGliLmVzNi5qcyIsIndlYnBhY2s6Ly8vKHdlYnBhY2spL2J1aWxkaW4vZ2xvYmFsLmpzIiwid2VicGFjazovLy8od2VicGFjaykvYnVpbGRpbi9oYXJtb255LW1vZHVsZS5qcyIsIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvYXBwLmpzIiwid2VicGFjazovLy8uL3Jlc291cmNlcy9qcy9jb21wb25lbnRzL2Nob2NvbGF0ZUZhY3RvcnkuanMiLCJ3ZWJwYWNrOi8vLy4vcmVzb3VyY2VzL2pzL2NvbXBvbmVudHMvY29va2llSGFuZGxlci5qcyIsIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvY29tcG9uZW50cy9tYXBzSGFuZGxlci5qcyIsIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvY29tcG9uZW50cy9vdmVybGF5TWVudUhhbmRsZXIuanMiLCJ3ZWJwYWNrOi8vLy4vcmVzb3VyY2VzL2pzL2NvbXBvbmVudHMvc2Nyb2xsVG9IYW5kbGVyLmpzIiwid2VicGFjazovLy8uL3Jlc291cmNlcy9qcy9jb21wb25lbnRzL3NsaWRlckhhbmRsZXIuanMiLCJ3ZWJwYWNrOi8vLy4vcmVzb3VyY2VzL2pzL2NvbXBvbmVudHMvdGFic0hhbmRsZXIuanMiLCJ3ZWJwYWNrOi8vLy4vcmVzb3VyY2VzL2pzL2NvbXBvbmVudHMveW91dHViZUhhbmRsZXIuanMiLCJ3ZWJwYWNrOi8vLy4vcmVzb3VyY2VzL2pzL2dsb2JhbC9icm93c2VySGFuZGxlci5qcyIsIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvZ2xvYmFsL2hlbHBlcnMuanMiLCJ3ZWJwYWNrOi8vLy4vcmVzb3VyY2VzL2pzL2dsb2JhbC9zY3JvbGxIYW5kbGVyLmpzIiwid2VicGFjazovLy8uL3Jlc291cmNlcy9zYXNzL3N0eWxlLnNjc3M/YzY0ZCJdLCJuYW1lcyI6WyJ3aW5kb3ciLCJzZW50cnlfZHNuIiwidW5kZWZpbmVkIiwiU2VudHJ5IiwiZHNuIiwicmVxdWlyZSIsIkNob2NvbGF0ZUZhY3RvcnkiLCJiYW5uZWRWaXNpdG9yIiwiZW50ZXIiLCJjaG9jb2xhdGVGYWN0b3JpZXMiLCJkb2N1bWVudCIsInF1ZXJ5U2VsZWN0b3JBbGwiLCJpc3NldCIsImFtb3VudE9mQ2hvY29sYXRlRmFjdG9yaWVzIiwibGVuZ3RoIiwiaSIsIkNob2NvbGF0ZUJhciIsIl9mbGFzaFRpY2tldCIsImNob2NvbGF0ZUJhciIsImdvbGRlblRpY2tldCIsInF1ZXJ5U2VsZWN0b3IiLCJhZGRFdmVudExpc3RlbmVyIiwiZW5qb3lUaGVUb3VyIiwiY29uc29sZSIsImxvZyIsImNob2NvbGF0ZUZhY3RvcnkiLCJ0b3VyR3JvdXAiLCJvb21wYUxvb21wYXMiLCJhbW91bnRPZk9vbXBhTG9vbXBhcyIsInRvdXJHcm91cFNpemUiLCJ2aXNpdG9yIiwidmlzaXRvck5hbWUiLCJnZXRBdHRyaWJ1dGUiLCJfaXNWaXNpdG9yQmFubmVkIiwiX2dldEFycmFuZ2VtZW50IiwiX2ZpbmlzaFRvdXIiLCJpbmRleE9mIiwidmlzaXRvclR5cGUiLCJub2RlTmFtZSIsInZhbHVlIiwiZ3JvdXAiLCJfYWRkV2lsbGllV29ua2EiLCJnYXRlIiwiQWpheCIsInBvc3QiLCJIdHRwUmVxdWVzdCIsInJlc3BvbnNlIiwiSlNPTiIsInBhcnNlIiwic3RhdHVzIiwiX3RoYW5rc0ZvclZpc2l0aW5nIiwicmVkaXJlY3RVcmwiLCJfZ2l2ZUZlZWRiYWNrVG9NZW1iZXJzIiwiZXJyb3JzIiwiX3Vua25vd25HYXBJbkZhY3RvcnkiLCJlIiwiX3dpbGxpZSIsImZlZWRiYWNrQXJlYSIsImlubmVySFRNTCIsIl9jbGVhclByZXZpb3VzTWFya2VkSmFja2V0cyIsIk9iamVjdCIsImtleXMiLCJmb3JFYWNoIiwiamFja2V0IiwidmlzaXRvckZlZWRiYWNrQXJlYSIsInZpc2l0b3JOb2RlIiwiX2dyYWJWaXNpdG9ySmFja2V0IiwidmlzaXRvckZlZWRiYWNrIiwidmlzaXRvckZlZWRiYWNrQW1vdW50IiwidmlzaXRvckZlZWRiYWNrTGluZSIsImNsYXNzTGlzdCIsImFkZCIsImN1cnJlbnRGZWVkYmFja0FyZWEiLCJjYXBpdGFsaXplRmlyc3RMZXR0ZXIiLCJtYXJrZWRKYWNrZXRzIiwibWFya2VkSmFja2V0c0Ftb3VudCIsInJlbW92ZSIsImN1cnJlbnRMYXllciIsInNhZmV0eUJyZWFrIiwicGFyZW50Tm9kZSIsImNvbnRhaW5zIiwidGFnTmFtZSIsIm5leHRTdG9wIiwibG9jYXRpb24iLCJDb29raWVIYW5kbGVyIiwiY29va2llQmFyIiwiY29va2llTWVzc2FnZSIsImNvb2tpZUZhZGVPdXRBbmltYXRpb25EdXJhdGlvbiIsImFjY2VwdFRyYWNraW5nIiwiaW5pdCIsImluaXRDb29raWVCYXIiLCJjaGVja0ZvckNvb2tpZVNldHRpbmdzIiwiY2xvc2VCdXR0b24iLCJjbG9zZUNvb2tpZU1lc3NhZ2UiLCJDb29raWUiLCJnZXQiLCJib2R5Iiwic2V0IiwiTWFwc0hhbmRsZXIiLCJtYXAiLCJrZXkiLCJsYXQiLCJsbmciLCJzdHlsaW5nIiwiaGFzQXR0cmlidXRlIiwicGFyc2VGbG9hdCIsInNldEN1c3RvbVN0eWxpbmciLCJnb29nbGUiLCJtYXBzIiwiZ2V0U2NyaXB0IiwiZHJhd01hcCIsIk1hcCIsInpvb20iLCJjZW50ZXIiLCJkaXNhYmxlRGVmYXVsdFVJIiwic3R5bGVzIiwiY29udGVudFN0cmluZyIsImluZm93aW5kb3ciLCJJbmZvV2luZG93IiwiY29udGVudCIsIm1hcmtlciIsIk1hcmtlciIsInBvc2l0aW9uIiwiYWRkTGlzdGVuZXIiLCJvcGVuIiwiYm9keVNjcm9sbExvY2siLCJPdmVybGF5TWVudUhhbmRsZXIiLCJvdmVybGF5TWVudVRyaWdnZXJMaXN0Iiwib3ZlcmxheU1lbnVUcmlnZ2VyTGlzdENvdW50Iiwib3ZlcmxheU1lbnVUcmlnZ2VyIiwiaW5pdE92ZXJsYXlNZW51IiwidG9nZ2xlT3ZlcmxheU1lbnUiLCJldmVudCIsIm92ZXJsYXlNZW51TmF2IiwiZW5hYmxlQm9keVNjcm9sbCIsImVsZW0iLCJ0YWJJbmRleCIsImRpc2FibGVCb2R5U2Nyb2xsIiwidG9nZ2xlIiwiaGlkZGVuIiwiU2Nyb2xsVG9IYW5kbGVyIiwib2Zmc2V0IiwiZHVyYXRpb24iLCJzdGFydCIsImNoYW5nZSIsImN1cnJlbnRUaW1lIiwiYWxsb3dBbmltYXRpb24iLCJzY3JvbGxUb0FuaW1hdGlvbiIsImVhc2luZyIsImFuY2hvckxpbmtzIiwiYW5jaG9yTGlua3NBbW91bnQiLCJhbmNob3JMaW5rIiwicHJlcGFyZVNjcm9sbFRvIiwicHJldmVudERlZmF1bHQiLCJlbGVtZW50SWQiLCJzdWJzdHIiLCJzY3JvbGxUb0VsZW1lbnQiLCJnZXRFbGVtZW50QnlJZCIsInNjcm9sbFRvRWxlbWVudFBvc2l0aW9uIiwiZ2V0Qm91bmRpbmdDbGllbnRSZWN0IiwiZG9jdW1lbnRFbGVtZW50IiwiTWF0aCIsIm1heCIsInNjcm9sbFRvcCIsInBhZ2VZT2Zmc2V0IiwidG9wIiwic3RhcnRUaW1lIiwicGVyZm9ybWFuY2UiLCJub3ciLCJEYXRlIiwiZ2V0VGltZSIsInJlcXVlc3RBbmltYXRpb25GcmFtZSIsImFuaW1hdGVTY3JvbGwiLCJhYm9ydFNjcm9sbEFuaW1hdGlvbiIsInRpbWVzdGFtcCIsInByb2dyZXNzIiwibWluIiwiRWFzaW5nRnVuY3Rpb25zIiwibmV3U2Nyb2xsVG9wIiwiY2FuY2VsQW5pbWF0aW9uRnJhbWUiLCJTbGlkZXJzIiwic2xpZGVyQ29udGFpbmVycyIsInNsaWRlckNvbnRhaW5lcnNMZW5ndGgiLCJzbGlkZXIiLCJzbGlkZXJJZCIsIlNsaWRlcnNldHRpbmciLCJTbGlkZXJTZXR0aW5nIiwiYXV0b1NsaWRlciIsInNsaWRlUXVlcnkiLCJuYXZpZ2F0aW9uQnV0dG9ucyIsImRvdHMiLCJwdXNoIiwiU2xpZGVyIiwicHJlcGFyZVBhcmFtZXRlcnMiLCJzZXR0aW5nc09iamVjdCIsInNlbGYiLCJzbGlkZXJJbnRlcnZhbCIsInNldFNsaWRlcklkIiwic3RyaW5nIiwic2V0QXV0b1NsaWRlciIsImJvb2xlYW4iLCJzZXRTbGlkZXJJbnRlcnZhbCIsImludGVnZXIiLCJzZXRTbGlkZVF1ZXJ5Iiwic2V0TmF2aWdhdGlvbkJ1dHRvbnMiLCJzZXREb3RzIiwiZ2V0U2xpZGVySWQiLCJnZXRBdXRvU2xpZGVyIiwiYXV0b1NsaWRlIiwiTnVtYmVyIiwiaXNJbnRlZ2VyIiwiZ2V0U2xpZGVySW50ZXJ2YWwiLCJnZXRTbGlkZVF1ZXJ5IiwiZ2V0TmF2aWdhdGlvbkJ1dHRvbnMiLCJnZXREb3RzIiwiZmlsbCIsInNldHRpbmdzT2JqZWN0S2V5cyIsInNldHRpbmdzT2JqZWN0TGVuZ3RoIiwic2V0dGluZ3MiLCJzbGlkZXJPYmplY3QiLCJhY3RpdmVTbGlkZUlkIiwicHJldmlvdXNTbGlkZUlkIiwibmV4dFNsaWRlSWQiLCJhdmFpbGFibGVTbGlkZXMiLCJzbGlkZXMiLCJhdXRvU2xpZGVySW50ZXJ2YWwiLCJzZXRTbGlkZSIsInN3aXBlR2VzdHVyZXMiLCJIYW1tZXIiLCJvbiIsInJlc2V0QXV0b1NsaWRlciIsIm5leHRTbGlkZSIsInByZXZpb3VzU2xpZGUiLCJuYXZpZ2F0aW9uQnV0dG9uc0xlbmd0aCIsIm5hdmlnYXRpb25CdXR0b24iLCJjbGlja05hdmlnYXRpb25CdXR0b24iLCJkb3RzTGVuZ3RoIiwiZG90IiwiY2xpY2tEb3QiLCJjbGVhckludGVydmFsIiwic2V0SW50ZXJ2YWwiLCJzbGlkZXNMZW5ndGgiLCJzbGlkZSIsInN0eWxlIiwicG9pbnRlckV2ZW50cyIsInNsaWRlT3JkZXIiLCJwYXJzZUludCIsInNldEFjdGl2ZURvdCIsIm5hdkJ1dHRvbiIsIm5hdkJ1dHRvbkRpcmVjdGlvbiIsImNsaWNrZWREb3QiLCJkb3RPcmRlciIsIlRhYnNIYW5kbGVyIiwidGFic0xpc3QiLCJ0YWJzIiwidGFic0xpc3RDb3VudCIsImluaXRUYWJzIiwiY29udGFpbmVyIiwiZXJyb3IiLCJ0cmlnZ2VycyIsInRhYnNDb250ZW50IiwidGFyZ2V0IiwiY2xvc2VzdCIsImRpciIsInN0ZXBUYWJzIiwidG9nZ2xlVGFicyIsImRhdGFzZXQiLCJ0YWJJZCIsInRhYnNUYWIiLCJ0YWJzVHJpZ2dlciIsInRyaWdnZXJDb3VudCIsImFjdGl2ZUlkIiwibmV3SWQiLCJZb3V0dWJlSGFuZGxlciIsInlvdXR1YmVDbGFzcyIsInBsYXllcnMiLCJ5b3V0dWJlUGxheWVycyIsInlvdXR1YmVQbGF5ZXJzQW1vdW50IiwieW91dHViZVBsYXllciIsInlvdXR1YmVQbGF5ZXJJZCIsInlvdXR1YmVFbGVtZW50IiwiaWQiLCJsaW5rIiwiYXV0b1BsYXkiLCJpbml0WW91dHViZSIsIllUIiwiUGxheWVyIiwib25Zb3VUdWJlUGxheWVyQVBJUmVhZHkiLCJsb2FkUGxheWVycyIsInBsYXllciIsImhlaWdodCIsIndpZHRoIiwidmlkZW9JZCIsImhvc3QiLCJwbGF5ZXJWYXJzIiwibW9kZXN0YnJhbmRpbmciLCJyZWwiLCJkaXNhYmxla2IiLCJhdXRvcGxheSIsImV2ZW50cyIsIm9uU3RhdGVDaGFuZ2UiLCJvblJlYWR5IiwicGxheWVyQ29udGFpbmVySWQiLCJnZXRJZnJhbWUiLCJ2aWRlb1N0YXRlIiwiZGF0YSIsIlBsYXllclN0YXRlIiwiRU5ERUQiLCJwbGF5VmlkZW8iLCJCcm93c2VySGFuZGxlciIsInVzZXJBZ2VudCIsImJyb3dzZXJJbmZvIiwibmF2aWdhdG9yIiwiZ2V0QnJvd3NlckluZm8iLCJoYW5kbGVJRSIsImhhbmRsZVNhZmFyaSIsIm1zaWUiLCJpZWx0MTEiLCJpZTExIiwibWF0Y2giLCJ2ZXJzaW9uIiwic3Vic3RyaW5nIiwibmFtZSIsImdldEVsZW1lbnRzQnlUYWdOYW1lIiwidWEiLCJ0ZW0iLCJNIiwidGVzdCIsImV4ZWMiLCJhcHBOYW1lIiwiYXBwVmVyc2lvbiIsInNwbGljZSIsIm9iaiIsImxpbmVhciIsInQiLCJlYXNlSW5RdWFkIiwiZWFzZU91dFF1YWQiLCJlYXNlSW5PdXRRdWFkIiwiZWFzZUluQ3ViaWMiLCJlYXNlT3V0Q3ViaWMiLCJlYXNlSW5PdXRDdWJpYyIsImVhc2VJblF1YXJ0IiwiZWFzZU91dFF1YXJ0IiwiZWFzZUluT3V0UXVhcnQiLCJlYXNlSW5RdWludCIsImVhc2VPdXRRdWludCIsImVhc2VJbk91dFF1aW50Iiwic291cmNlIiwiY2FsbGJhY2siLCJzY3JpcHQiLCJjcmVhdGVFbGVtZW50IiwiYXN5bmMiLCJzY3JpcHRzIiwicHJpb3IiLCJvbmxvYWQiLCJvbnJlYWR5c3RhdGVjaGFuZ2UiLCJfIiwiaXNBYm9ydCIsInJlYWR5U3RhdGUiLCJzcmMiLCJpbnNlcnRCZWZvcmUiLCJkZWJvdW5jZSIsImZ1bmMiLCJ3YWl0IiwiaW1tZWRpYXRlIiwidGltZW91dCIsImNvbnRleHQiLCJhcmdzIiwiYXJndW1lbnRzIiwibGF0ZXIiLCJhcHBseSIsImNhbGxOb3ciLCJjbGVhclRpbWVvdXQiLCJzZXRUaW1lb3V0IiwiZGF5cyIsImRvbWFpbiIsImRvbWFpblBhcnRzIiwiZGF0ZSIsImV4cGlyZXMiLCJzZXRUaW1lIiwidG9HTVRTdHJpbmciLCJpc0lQT3JMb2NhbEhvc3QiLCJob3N0bmFtZSIsImNvb2tpZSIsInNwbGl0Iiwic2hpZnQiLCJqb2luIiwibmFtZUVRIiwiY2EiLCJjIiwiY2hhckF0IiwiZXJhc2UiLCJpc0lwQWRkcmVzcyIsImlwYWRkcmVzcyIsIm51bWJlcl9mb3JtYXQiLCJudW1iZXIiLCJkZWNpbWFscyIsImRlY19wb2ludCIsInRob3VzYW5kc19zZXAiLCJyZXBsYWNlIiwibiIsImlzRmluaXRlIiwicHJlYyIsImFicyIsInNlcCIsImRlYyIsInMiLCJ0b0ZpeGVkRml4IiwiayIsInBvdyIsInJvdW5kIiwiQXJyYXkiLCJFbGVtZW50IiwicHJvdG90eXBlIiwibWF0Y2hlcyIsIm1zTWF0Y2hlc1NlbGVjdG9yIiwid2Via2l0TWF0Y2hlc1NlbGVjdG9yIiwiZWwiLCJhbmNlc3RvciIsInBhcmVudEVsZW1lbnQiLCJ1cmwiLCJ4aHIiLCJYTUxIdHRwUmVxdWVzdCIsInRva2VuIiwic2V0UmVxdWVzdEhlYWRlciIsInNlbmQiLCJzdHJpbmdpZnkiLCJ0b1VwcGVyQ2FzZSIsInNsaWNlIiwic25ha2VUb0NhbWVsIiwibSIsImluZGV4SW5QYXJlbnQiLCJub2RlIiwiY2hpbGRyZW4iLCJjaGlsZE5vZGVzIiwibnVtIiwibm9kZVR5cGUiLCJjb3B5VG9DbGlwYm9hcmQiLCJlZGl0YWJsZSIsImNvbnRlbnRFZGl0YWJsZSIsInJlYWRPbmx5IiwicmFuZ2UiLCJjcmVhdGVSYW5nZSIsInNlbGVjdE5vZGVDb250ZW50cyIsInNlbGVjdGlvbiIsImdldFNlbGVjdGlvbiIsInJlbW92ZUFsbFJhbmdlcyIsImFkZFJhbmdlIiwic2V0U2VsZWN0aW9uUmFuZ2UiLCJzZWxlY3QiLCJleGVjQ29tbWFuZCIsIlNjcm9sbEhhbmRsZXIiLCJ0aW1lIiwid2FpdFRocm90dGxlIiwid2FpdERlYm91bmNlIiwibGFzdFNjcm9sbFRvcFBvc2l0aW9uIiwic2Nyb2xsRGlyZWN0aW9uRG93biIsInNjcm9sbERpcmVjdGlvblVwIiwidHJpZ2dlck9uSW5pdCIsInRyaWdnZXJUaHJvdHRsZSIsInRyaWdnZXJTbW9vdGgiLCJ0cmlnZ2VyRGVib3VuY2UiLCJ0cmlnZ2VyRWxlbWVudEluVmlld3BvcnRBbmltYXRpb24iLCJkZXRlY3RTY3JvbGxEaXJlY3Rpb24iLCJ0b2dnbGVTdGlja3lIZWFkZXIiLCJkZXRlY3RJZkVsZW1lbnRJc1BhcnRseUluVmlld3BvcnQiLCJyZWN0Iiwid2luZG93SGVpZ2h0IiwiaW5uZXJIZWlnaHQiLCJjbGllbnRIZWlnaHQiLCJ3aW5kb3dXaWR0aCIsImlubmVyV2lkdGgiLCJjbGllbnRXaWR0aCIsInZlcnRpY2FsSW5WaWV3IiwiaG9yaXpvbnRhbEluVmlldyIsImxlZnQiLCJkZXRlY3RJZkVsZW1lbnRJc0Z1bGx5SW5WaWV3cG9ydCIsImJvdHRvbSIsInNjcm9sbFRvcFBvc2l0aW9uIiwiZWxlbWVudHMiLCJlbGVtZW50c0xlbmd0aCIsImVsZW1lbnQiLCJzdGlja3lIZWFkZXIiLCJ2aXNpYmxlU3RpY2t5SGVhZGVyQ2xhc3MiLCJzdWJuYXZMaXN0Iiwic3ViTmF2SXNWaXNpYmxlIiwiZ2V0Q29tcHV0ZWRTdHlsZSIsInZpc2liaWxpdHkiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQWlDO0FBQ1U7QUFDRjtBQUN5QztBQUNWO0FBQ1o7QUFDNUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksK0NBQWlCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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QUFDZiwrQjs7Ozs7Ozs7Ozs7O0FDOUVBO0FBQUE7QUFBQTtBQUFBO0FBQWlDO0FBQ1c7QUFDNUM7QUFDQTtBQUNBLElBQUksK0NBQWlCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsZ0VBQWM7QUFDdEI7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNzQjtBQUN2QixpQzs7Ozs7Ozs7Ozs7O0FDakJBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBd0I7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QjtBQUNIO0FBQ0o7QUFDSjtBQXBKaUIsQ0FBdEI7QUF3SkFoQyxhQUFhLENBQUMxVyxJQUFkLEc7Ozs7Ozs7Ozs7O0FDN0pBLHlDIiwiZmlsZSI6Ii9qcy9zaXRlL2FwcC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHRzbGliXzEgZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBCYXNlQmFja2VuZCB9IGZyb20gJ0BzZW50cnkvY29yZSc7XG5pbXBvcnQgeyBTZXZlcml0eSB9IGZyb20gJ0BzZW50cnkvdHlwZXMnO1xuaW1wb3J0IHsgYWRkRXhjZXB0aW9uTWVjaGFuaXNtLCBzdXBwb3J0c0ZldGNoLCBTeW5jUHJvbWlzZSB9IGZyb20gJ0BzZW50cnkvdXRpbHMnO1xuaW1wb3J0IHsgZXZlbnRGcm9tU3RyaW5nLCBldmVudEZyb21Vbmtub3duSW5wdXQgfSBmcm9tICcuL2V2ZW50YnVpbGRlcic7XG5pbXBvcnQgeyBGZXRjaFRyYW5zcG9ydCwgWEhSVHJhbnNwb3J0IH0gZnJvbSAnLi90cmFuc3BvcnRzJztcbi8qKlxuICogVGhlIFNlbnRyeSBCcm93c2VyIFNESyBCYWNrZW5kLlxuICogQGhpZGRlblxuICovXG52YXIgQnJvd3NlckJhY2tlbmQgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgdHNsaWJfMS5fX2V4dGVuZHMoQnJvd3NlckJhY2tlbmQsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gQnJvd3NlckJhY2tlbmQoKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGluaGVyaXREb2NcbiAgICAgKi9cbiAgICBCcm93c2VyQmFja2VuZC5wcm90b3R5cGUuX3NldHVwVHJhbnNwb3J0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoIXRoaXMuX29wdGlvbnMuZHNuKSB7XG4gICAgICAgICAgICAvLyBXZSByZXR1cm4gdGhlIG5vb3AgdHJhbnNwb3J0IGhlcmUgaW4gY2FzZSB0aGVyZSBpcyBubyBEc24uXG4gICAgICAgICAgICByZXR1cm4gX3N1cGVyLnByb3RvdHlwZS5fc2V0dXBUcmFuc3BvcnQuY2FsbCh0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgdHJhbnNwb3J0T3B0aW9ucyA9IHRzbGliXzEuX19hc3NpZ24oe30sIHRoaXMuX29wdGlvbnMudHJhbnNwb3J0T3B0aW9ucywgeyBkc246IHRoaXMuX29wdGlvbnMuZHNuIH0pO1xuICAgICAgICBpZiAodGhpcy5fb3B0aW9ucy50cmFuc3BvcnQpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgdGhpcy5fb3B0aW9ucy50cmFuc3BvcnQodHJhbnNwb3J0T3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN1cHBvcnRzRmV0Y2goKSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBGZXRjaFRyYW5zcG9ydCh0cmFuc3BvcnRPcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFhIUlRyYW5zcG9ydCh0cmFuc3BvcnRPcHRpb25zKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEBpbmhlcml0RG9jXG4gICAgICovXG4gICAgQnJvd3NlckJhY2tlbmQucHJvdG90eXBlLmV2ZW50RnJvbUV4Y2VwdGlvbiA9IGZ1bmN0aW9uIChleGNlcHRpb24sIGhpbnQpIHtcbiAgICAgICAgdmFyIHN5bnRoZXRpY0V4Y2VwdGlvbiA9IChoaW50ICYmIGhpbnQuc3ludGhldGljRXhjZXB0aW9uKSB8fCB1bmRlZmluZWQ7XG4gICAgICAgIHZhciBldmVudCA9IGV2ZW50RnJvbVVua25vd25JbnB1dChleGNlcHRpb24sIHN5bnRoZXRpY0V4Y2VwdGlvbiwge1xuICAgICAgICAgICAgYXR0YWNoU3RhY2t0cmFjZTogdGhpcy5fb3B0aW9ucy5hdHRhY2hTdGFja3RyYWNlLFxuICAgICAgICB9KTtcbiAgICAgICAgYWRkRXhjZXB0aW9uTWVjaGFuaXNtKGV2ZW50LCB7XG4gICAgICAgICAgICBoYW5kbGVkOiB0cnVlLFxuICAgICAgICAgICAgdHlwZTogJ2dlbmVyaWMnLFxuICAgICAgICB9KTtcbiAgICAgICAgZXZlbnQubGV2ZWwgPSBTZXZlcml0eS5FcnJvcjtcbiAgICAgICAgaWYgKGhpbnQgJiYgaGludC5ldmVudF9pZCkge1xuICAgICAgICAgICAgZXZlbnQuZXZlbnRfaWQgPSBoaW50LmV2ZW50X2lkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBTeW5jUHJvbWlzZS5yZXNvbHZlKGV2ZW50KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEBpbmhlcml0RG9jXG4gICAgICovXG4gICAgQnJvd3NlckJhY2tlbmQucHJvdG90eXBlLmV2ZW50RnJvbU1lc3NhZ2UgPSBmdW5jdGlvbiAobWVzc2FnZSwgbGV2ZWwsIGhpbnQpIHtcbiAgICAgICAgaWYgKGxldmVsID09PSB2b2lkIDApIHsgbGV2ZWwgPSBTZXZlcml0eS5JbmZvOyB9XG4gICAgICAgIHZhciBzeW50aGV0aWNFeGNlcHRpb24gPSAoaGludCAmJiBoaW50LnN5bnRoZXRpY0V4Y2VwdGlvbikgfHwgdW5kZWZpbmVkO1xuICAgICAgICB2YXIgZXZlbnQgPSBldmVudEZyb21TdHJpbmcobWVzc2FnZSwgc3ludGhldGljRXhjZXB0aW9uLCB7XG4gICAgICAgICAgICBhdHRhY2hTdGFja3RyYWNlOiB0aGlzLl9vcHRpb25zLmF0dGFjaFN0YWNrdHJhY2UsXG4gICAgICAgIH0pO1xuICAgICAgICBldmVudC5sZXZlbCA9IGxldmVsO1xuICAgICAgICBpZiAoaGludCAmJiBoaW50LmV2ZW50X2lkKSB7XG4gICAgICAgICAgICBldmVudC5ldmVudF9pZCA9IGhpbnQuZXZlbnRfaWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFN5bmNQcm9taXNlLnJlc29sdmUoZXZlbnQpO1xuICAgIH07XG4gICAgcmV0dXJuIEJyb3dzZXJCYWNrZW5kO1xufShCYXNlQmFja2VuZCkpO1xuZXhwb3J0IHsgQnJvd3NlckJhY2tlbmQgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWJhY2tlbmQuanMubWFwIiwiaW1wb3J0ICogYXMgdHNsaWJfMSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IEFQSSwgQmFzZUNsaWVudCB9IGZyb20gJ0BzZW50cnkvY29yZSc7XG5pbXBvcnQgeyBnZXRHbG9iYWxPYmplY3QsIGxvZ2dlciB9IGZyb20gJ0BzZW50cnkvdXRpbHMnO1xuaW1wb3J0IHsgQnJvd3NlckJhY2tlbmQgfSBmcm9tICcuL2JhY2tlbmQnO1xuaW1wb3J0IHsgQnJlYWRjcnVtYnMgfSBmcm9tICcuL2ludGVncmF0aW9ucyc7XG5pbXBvcnQgeyBTREtfTkFNRSwgU0RLX1ZFUlNJT04gfSBmcm9tICcuL3ZlcnNpb24nO1xuLyoqXG4gKiBUaGUgU2VudHJ5IEJyb3dzZXIgU0RLIENsaWVudC5cbiAqXG4gKiBAc2VlIEJyb3dzZXJPcHRpb25zIGZvciBkb2N1bWVudGF0aW9uIG9uIGNvbmZpZ3VyYXRpb24gb3B0aW9ucy5cbiAqIEBzZWUgU2VudHJ5Q2xpZW50IGZvciB1c2FnZSBkb2N1bWVudGF0aW9uLlxuICovXG52YXIgQnJvd3NlckNsaWVudCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICB0c2xpYl8xLl9fZXh0ZW5kcyhCcm93c2VyQ2xpZW50LCBfc3VwZXIpO1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgQnJvd3NlciBTREsgaW5zdGFuY2UuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBDb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoaXMgU0RLLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIEJyb3dzZXJDbGllbnQob3B0aW9ucykge1xuICAgICAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7IG9wdGlvbnMgPSB7fTsgfVxuICAgICAgICByZXR1cm4gX3N1cGVyLmNhbGwodGhpcywgQnJvd3NlckJhY2tlbmQsIG9wdGlvbnMpIHx8IHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBpbmhlcml0RG9jXG4gICAgICovXG4gICAgQnJvd3NlckNsaWVudC5wcm90b3R5cGUuX3ByZXBhcmVFdmVudCA9IGZ1bmN0aW9uIChldmVudCwgc2NvcGUsIGhpbnQpIHtcbiAgICAgICAgZXZlbnQucGxhdGZvcm0gPSBldmVudC5wbGF0Zm9ybSB8fCAnamF2YXNjcmlwdCc7XG4gICAgICAgIGV2ZW50LnNkayA9IHRzbGliXzEuX19hc3NpZ24oe30sIGV2ZW50LnNkaywgeyBuYW1lOiBTREtfTkFNRSwgcGFja2FnZXM6IHRzbGliXzEuX19zcHJlYWQoKChldmVudC5zZGsgJiYgZXZlbnQuc2RrLnBhY2thZ2VzKSB8fCBbXSksIFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6ICducG06QHNlbnRyeS9icm93c2VyJyxcbiAgICAgICAgICAgICAgICAgICAgdmVyc2lvbjogU0RLX1ZFUlNJT04sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0pLCB2ZXJzaW9uOiBTREtfVkVSU0lPTiB9KTtcbiAgICAgICAgcmV0dXJuIF9zdXBlci5wcm90b3R5cGUuX3ByZXBhcmVFdmVudC5jYWxsKHRoaXMsIGV2ZW50LCBzY29wZSwgaGludCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuICAgIEJyb3dzZXJDbGllbnQucHJvdG90eXBlLl9zZW5kRXZlbnQgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgdmFyIGludGVncmF0aW9uID0gdGhpcy5nZXRJbnRlZ3JhdGlvbihCcmVhZGNydW1icyk7XG4gICAgICAgIGlmIChpbnRlZ3JhdGlvbikge1xuICAgICAgICAgICAgaW50ZWdyYXRpb24uYWRkU2VudHJ5QnJlYWRjcnVtYihldmVudCk7XG4gICAgICAgIH1cbiAgICAgICAgX3N1cGVyLnByb3RvdHlwZS5fc2VuZEV2ZW50LmNhbGwodGhpcywgZXZlbnQpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogU2hvdyBhIHJlcG9ydCBkaWFsb2cgdG8gdGhlIHVzZXIgdG8gc2VuZCBmZWVkYmFjayB0byBhIHNwZWNpZmljIGV2ZW50LlxuICAgICAqXG4gICAgICogQHBhcmFtIG9wdGlvbnMgU2V0IGluZGl2aWR1YWwgb3B0aW9ucyBmb3IgdGhlIGRpYWxvZ1xuICAgICAqL1xuICAgIEJyb3dzZXJDbGllbnQucHJvdG90eXBlLnNob3dSZXBvcnREaWFsb2cgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgICAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7IG9wdGlvbnMgPSB7fTsgfVxuICAgICAgICAvLyBkb2Vzbid0IHdvcmsgd2l0aG91dCBhIGRvY3VtZW50IChSZWFjdCBOYXRpdmUpXG4gICAgICAgIHZhciBkb2N1bWVudCA9IGdldEdsb2JhbE9iamVjdCgpLmRvY3VtZW50O1xuICAgICAgICBpZiAoIWRvY3VtZW50KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLl9pc0VuYWJsZWQoKSkge1xuICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCdUcnlpbmcgdG8gY2FsbCBzaG93UmVwb3J0RGlhbG9nIHdpdGggU2VudHJ5IENsaWVudCBpcyBkaXNhYmxlZCcpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHZhciBkc24gPSBvcHRpb25zLmRzbiB8fCB0aGlzLmdldERzbigpO1xuICAgICAgICBpZiAoIW9wdGlvbnMuZXZlbnRJZCkge1xuICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCdNaXNzaW5nIGBldmVudElkYCBvcHRpb24gaW4gc2hvd1JlcG9ydERpYWxvZyBjYWxsJyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFkc24pIHtcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcignTWlzc2luZyBgRHNuYCBvcHRpb24gaW4gc2hvd1JlcG9ydERpYWxvZyBjYWxsJyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpO1xuICAgICAgICBzY3JpcHQuYXN5bmMgPSB0cnVlO1xuICAgICAgICBzY3JpcHQuc3JjID0gbmV3IEFQSShkc24pLmdldFJlcG9ydERpYWxvZ0VuZHBvaW50KG9wdGlvbnMpO1xuICAgICAgICBpZiAob3B0aW9ucy5vbkxvYWQpIHtcbiAgICAgICAgICAgIHNjcmlwdC5vbmxvYWQgPSBvcHRpb25zLm9uTG9hZDtcbiAgICAgICAgfVxuICAgICAgICAoZG9jdW1lbnQuaGVhZCB8fCBkb2N1bWVudC5ib2R5KS5hcHBlbmRDaGlsZChzY3JpcHQpO1xuICAgIH07XG4gICAgcmV0dXJuIEJyb3dzZXJDbGllbnQ7XG59KEJhc2VDbGllbnQpKTtcbmV4cG9ydCB7IEJyb3dzZXJDbGllbnQgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNsaWVudC5qcy5tYXAiLCJpbXBvcnQgeyBhZGRFeGNlcHRpb25NZWNoYW5pc20sIGFkZEV4Y2VwdGlvblR5cGVWYWx1ZSwgaXNET01FcnJvciwgaXNET01FeGNlcHRpb24sIGlzRXJyb3IsIGlzRXJyb3JFdmVudCwgaXNFdmVudCwgaXNQbGFpbk9iamVjdCwgfSBmcm9tICdAc2VudHJ5L3V0aWxzJztcbmltcG9ydCB7IGV2ZW50RnJvbVBsYWluT2JqZWN0LCBldmVudEZyb21TdGFja3RyYWNlLCBwcmVwYXJlRnJhbWVzRm9yRXZlbnQgfSBmcm9tICcuL3BhcnNlcnMnO1xuaW1wb3J0IHsgY29tcHV0ZVN0YWNrVHJhY2UgfSBmcm9tICcuL3RyYWNla2l0Jztcbi8qKiBKU0RvYyAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV2ZW50RnJvbVVua25vd25JbnB1dChleGNlcHRpb24sIHN5bnRoZXRpY0V4Y2VwdGlvbiwgb3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHsgb3B0aW9ucyA9IHt9OyB9XG4gICAgdmFyIGV2ZW50O1xuICAgIGlmIChpc0Vycm9yRXZlbnQoZXhjZXB0aW9uKSAmJiBleGNlcHRpb24uZXJyb3IpIHtcbiAgICAgICAgLy8gSWYgaXQgaXMgYW4gRXJyb3JFdmVudCB3aXRoIGBlcnJvcmAgcHJvcGVydHksIGV4dHJhY3QgaXQgdG8gZ2V0IGFjdHVhbCBFcnJvclxuICAgICAgICB2YXIgZXJyb3JFdmVudCA9IGV4Y2VwdGlvbjtcbiAgICAgICAgZXhjZXB0aW9uID0gZXJyb3JFdmVudC5lcnJvcjsgLy8gdHNsaW50OmRpc2FibGUtbGluZTpuby1wYXJhbWV0ZXItcmVhc3NpZ25tZW50XG4gICAgICAgIGV2ZW50ID0gZXZlbnRGcm9tU3RhY2t0cmFjZShjb21wdXRlU3RhY2tUcmFjZShleGNlcHRpb24pKTtcbiAgICAgICAgcmV0dXJuIGV2ZW50O1xuICAgIH1cbiAgICBpZiAoaXNET01FcnJvcihleGNlcHRpb24pIHx8IGlzRE9NRXhjZXB0aW9uKGV4Y2VwdGlvbikpIHtcbiAgICAgICAgLy8gSWYgaXQgaXMgYSBET01FcnJvciBvciBET01FeGNlcHRpb24gKHdoaWNoIGFyZSBsZWdhY3kgQVBJcywgYnV0IHN0aWxsIHN1cHBvcnRlZCBpbiBzb21lIGJyb3dzZXJzKVxuICAgICAgICAvLyB0aGVuIHdlIGp1c3QgZXh0cmFjdCB0aGUgbmFtZSBhbmQgbWVzc2FnZSwgYXMgdGhleSBkb24ndCBwcm92aWRlIGFueXRoaW5nIGVsc2VcbiAgICAgICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0RPTUVycm9yXG4gICAgICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9ET01FeGNlcHRpb25cbiAgICAgICAgdmFyIGRvbUV4Y2VwdGlvbiA9IGV4Y2VwdGlvbjtcbiAgICAgICAgdmFyIG5hbWVfMSA9IGRvbUV4Y2VwdGlvbi5uYW1lIHx8IChpc0RPTUVycm9yKGRvbUV4Y2VwdGlvbikgPyAnRE9NRXJyb3InIDogJ0RPTUV4Y2VwdGlvbicpO1xuICAgICAgICB2YXIgbWVzc2FnZSA9IGRvbUV4Y2VwdGlvbi5tZXNzYWdlID8gbmFtZV8xICsgXCI6IFwiICsgZG9tRXhjZXB0aW9uLm1lc3NhZ2UgOiBuYW1lXzE7XG4gICAgICAgIGV2ZW50ID0gZXZlbnRGcm9tU3RyaW5nKG1lc3NhZ2UsIHN5bnRoZXRpY0V4Y2VwdGlvbiwgb3B0aW9ucyk7XG4gICAgICAgIGFkZEV4Y2VwdGlvblR5cGVWYWx1ZShldmVudCwgbWVzc2FnZSk7XG4gICAgICAgIHJldHVybiBldmVudDtcbiAgICB9XG4gICAgaWYgKGlzRXJyb3IoZXhjZXB0aW9uKSkge1xuICAgICAgICAvLyB3ZSBoYXZlIGEgcmVhbCBFcnJvciBvYmplY3QsIGRvIG5vdGhpbmdcbiAgICAgICAgZXZlbnQgPSBldmVudEZyb21TdGFja3RyYWNlKGNvbXB1dGVTdGFja1RyYWNlKGV4Y2VwdGlvbikpO1xuICAgICAgICByZXR1cm4gZXZlbnQ7XG4gICAgfVxuICAgIGlmIChpc1BsYWluT2JqZWN0KGV4Y2VwdGlvbikgfHwgaXNFdmVudChleGNlcHRpb24pKSB7XG4gICAgICAgIC8vIElmIGl0IGlzIHBsYWluIE9iamVjdCBvciBFdmVudCwgc2VyaWFsaXplIGl0IG1hbnVhbGx5IGFuZCBleHRyYWN0IG9wdGlvbnNcbiAgICAgICAgLy8gVGhpcyB3aWxsIGFsbG93IHVzIHRvIGdyb3VwIGV2ZW50cyBiYXNlZCBvbiB0b3AtbGV2ZWwga2V5c1xuICAgICAgICAvLyB3aGljaCBpcyBtdWNoIGJldHRlciB0aGFuIGNyZWF0aW5nIG5ldyBncm91cCB3aGVuIGFueSBrZXkvdmFsdWUgY2hhbmdlXG4gICAgICAgIHZhciBvYmplY3RFeGNlcHRpb24gPSBleGNlcHRpb247XG4gICAgICAgIGV2ZW50ID0gZXZlbnRGcm9tUGxhaW5PYmplY3Qob2JqZWN0RXhjZXB0aW9uLCBzeW50aGV0aWNFeGNlcHRpb24sIG9wdGlvbnMucmVqZWN0aW9uKTtcbiAgICAgICAgYWRkRXhjZXB0aW9uTWVjaGFuaXNtKGV2ZW50LCB7XG4gICAgICAgICAgICBzeW50aGV0aWM6IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gZXZlbnQ7XG4gICAgfVxuICAgIC8vIElmIG5vbmUgb2YgcHJldmlvdXMgY2hlY2tzIHdlcmUgdmFsaWQsIHRoZW4gaXQgbWVhbnMgdGhhdCBpdCdzIG5vdDpcbiAgICAvLyAtIGFuIGluc3RhbmNlIG9mIERPTUVycm9yXG4gICAgLy8gLSBhbiBpbnN0YW5jZSBvZiBET01FeGNlcHRpb25cbiAgICAvLyAtIGFuIGluc3RhbmNlIG9mIEV2ZW50XG4gICAgLy8gLSBhbiBpbnN0YW5jZSBvZiBFcnJvclxuICAgIC8vIC0gYSB2YWxpZCBFcnJvckV2ZW50IChvbmUgd2l0aCBhbiBlcnJvciBwcm9wZXJ0eSlcbiAgICAvLyAtIGEgcGxhaW4gT2JqZWN0XG4gICAgLy9cbiAgICAvLyBTbyBiYWlsIG91dCBhbmQgY2FwdHVyZSBpdCBhcyBhIHNpbXBsZSBtZXNzYWdlOlxuICAgIGV2ZW50ID0gZXZlbnRGcm9tU3RyaW5nKGV4Y2VwdGlvbiwgc3ludGhldGljRXhjZXB0aW9uLCBvcHRpb25zKTtcbiAgICBhZGRFeGNlcHRpb25UeXBlVmFsdWUoZXZlbnQsIFwiXCIgKyBleGNlcHRpb24sIHVuZGVmaW5lZCk7XG4gICAgYWRkRXhjZXB0aW9uTWVjaGFuaXNtKGV2ZW50LCB7XG4gICAgICAgIHN5bnRoZXRpYzogdHJ1ZSxcbiAgICB9KTtcbiAgICByZXR1cm4gZXZlbnQ7XG59XG4vLyB0aGlzLl9vcHRpb25zLmF0dGFjaFN0YWNrdHJhY2Vcbi8qKiBKU0RvYyAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV2ZW50RnJvbVN0cmluZyhpbnB1dCwgc3ludGhldGljRXhjZXB0aW9uLCBvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkgeyBvcHRpb25zID0ge307IH1cbiAgICB2YXIgZXZlbnQgPSB7XG4gICAgICAgIG1lc3NhZ2U6IGlucHV0LFxuICAgIH07XG4gICAgaWYgKG9wdGlvbnMuYXR0YWNoU3RhY2t0cmFjZSAmJiBzeW50aGV0aWNFeGNlcHRpb24pIHtcbiAgICAgICAgdmFyIHN0YWNrdHJhY2UgPSBjb21wdXRlU3RhY2tUcmFjZShzeW50aGV0aWNFeGNlcHRpb24pO1xuICAgICAgICB2YXIgZnJhbWVzXzEgPSBwcmVwYXJlRnJhbWVzRm9yRXZlbnQoc3RhY2t0cmFjZS5zdGFjayk7XG4gICAgICAgIGV2ZW50LnN0YWNrdHJhY2UgPSB7XG4gICAgICAgICAgICBmcmFtZXM6IGZyYW1lc18xLFxuICAgICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gZXZlbnQ7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1ldmVudGJ1aWxkZXIuanMubWFwIiwiZXhwb3J0IHsgU2V2ZXJpdHksIFN0YXR1cywgfSBmcm9tICdAc2VudHJ5L3R5cGVzJztcbmV4cG9ydCB7IGFkZEdsb2JhbEV2ZW50UHJvY2Vzc29yLCBhZGRCcmVhZGNydW1iLCBjYXB0dXJlRXhjZXB0aW9uLCBjYXB0dXJlRXZlbnQsIGNhcHR1cmVNZXNzYWdlLCBjb25maWd1cmVTY29wZSwgZ2V0SHViRnJvbUNhcnJpZXIsIGdldEN1cnJlbnRIdWIsIEh1YiwgU2NvcGUsIHN0YXJ0VHJhbnNhY3Rpb24sIHNldENvbnRleHQsIHNldEV4dHJhLCBzZXRFeHRyYXMsIHNldFRhZywgc2V0VGFncywgc2V0VXNlciwgd2l0aFNjb3BlLCB9IGZyb20gJ0BzZW50cnkvY29yZSc7XG5leHBvcnQgeyBCcm93c2VyQ2xpZW50IH0gZnJvbSAnLi9jbGllbnQnO1xuZXhwb3J0IHsgZGVmYXVsdEludGVncmF0aW9ucywgZm9yY2VMb2FkLCBpbml0LCBsYXN0RXZlbnRJZCwgb25Mb2FkLCBzaG93UmVwb3J0RGlhbG9nLCBmbHVzaCwgY2xvc2UsIHdyYXAgfSBmcm9tICcuL3Nkayc7XG5leHBvcnQgeyBTREtfTkFNRSwgU0RLX1ZFUlNJT04gfSBmcm9tICcuL3ZlcnNpb24nO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZXhwb3J0cy5qcy5tYXAiLCJpbXBvcnQgKiBhcyB0c2xpYl8xIGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgY2FwdHVyZUV4Y2VwdGlvbiwgd2l0aFNjb3BlIH0gZnJvbSAnQHNlbnRyeS9jb3JlJztcbmltcG9ydCB7IGFkZEV4Y2VwdGlvbk1lY2hhbmlzbSwgYWRkRXhjZXB0aW9uVHlwZVZhbHVlIH0gZnJvbSAnQHNlbnRyeS91dGlscyc7XG52YXIgaWdub3JlT25FcnJvciA9IDA7XG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNob3VsZElnbm9yZU9uRXJyb3IoKSB7XG4gICAgcmV0dXJuIGlnbm9yZU9uRXJyb3IgPiAwO1xufVxuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpZ25vcmVOZXh0T25FcnJvcigpIHtcbiAgICAvLyBvbmVycm9yIHNob3VsZCB0cmlnZ2VyIGJlZm9yZSBzZXRUaW1lb3V0XG4gICAgaWdub3JlT25FcnJvciArPSAxO1xuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICBpZ25vcmVPbkVycm9yIC09IDE7XG4gICAgfSk7XG59XG4vKipcbiAqIEluc3RydW1lbnRzIHRoZSBnaXZlbiBmdW5jdGlvbiBhbmQgc2VuZHMgYW4gZXZlbnQgdG8gU2VudHJ5IGV2ZXJ5IHRpbWUgdGhlXG4gKiBmdW5jdGlvbiB0aHJvd3MgYW4gZXhjZXB0aW9uLlxuICpcbiAqIEBwYXJhbSBmbiBBIGZ1bmN0aW9uIHRvIHdyYXAuXG4gKiBAcmV0dXJucyBUaGUgd3JhcHBlZCBmdW5jdGlvbi5cbiAqIEBoaWRkZW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdyYXAoZm4sIG9wdGlvbnMsIGJlZm9yZSkge1xuICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHsgb3B0aW9ucyA9IHt9OyB9XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnN0cmljdC10eXBlLXByZWRpY2F0ZXNcbiAgICBpZiAodHlwZW9mIGZuICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiBmbjtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gV2UgZG9uJ3Qgd2FubmEgd3JhcCBpdCB0d2ljZVxuICAgICAgICBpZiAoZm4uX19zZW50cnlfXykge1xuICAgICAgICAgICAgcmV0dXJuIGZuO1xuICAgICAgICB9XG4gICAgICAgIC8vIElmIHRoaXMgaGFzIGFscmVhZHkgYmVlbiB3cmFwcGVkIGluIHRoZSBwYXN0LCByZXR1cm4gdGhhdCB3cmFwcGVkIGZ1bmN0aW9uXG4gICAgICAgIGlmIChmbi5fX3NlbnRyeV93cmFwcGVkX18pIHtcbiAgICAgICAgICAgIHJldHVybiBmbi5fX3NlbnRyeV93cmFwcGVkX187XG4gICAgICAgIH1cbiAgICB9XG4gICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gSnVzdCBhY2Nlc3NpbmcgY3VzdG9tIHByb3BzIGluIHNvbWUgU2VsZW5pdW0gZW52aXJvbm1lbnRzXG4gICAgICAgIC8vIGNhbiBjYXVzZSBhIFwiUGVybWlzc2lvbiBkZW5pZWRcIiBleGNlcHRpb24gKHNlZSByYXZlbi1qcyM0OTUpLlxuICAgICAgICAvLyBCYWlsIG9uIHdyYXBwaW5nIGFuZCByZXR1cm4gdGhlIGZ1bmN0aW9uIGFzLWlzIChkZWZlcnMgdG8gd2luZG93Lm9uZXJyb3IpLlxuICAgICAgICByZXR1cm4gZm47XG4gICAgfVxuICAgIHZhciBzZW50cnlXcmFwcGVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7XG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlOm5vLXVuc2FmZS1hbnlcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpzdHJpY3QtdHlwZS1wcmVkaWNhdGVzXG4gICAgICAgICAgICBpZiAoYmVmb3JlICYmIHR5cGVvZiBiZWZvcmUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICBiZWZvcmUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciB3cmFwcGVkQXJndW1lbnRzID0gYXJncy5tYXAoZnVuY3Rpb24gKGFyZykgeyByZXR1cm4gd3JhcChhcmcsIG9wdGlvbnMpOyB9KTtcbiAgICAgICAgICAgIGlmIChmbi5oYW5kbGVFdmVudCkge1xuICAgICAgICAgICAgICAgIC8vIEF0dGVtcHQgdG8gaW52b2tlIHVzZXItbGFuZCBmdW5jdGlvblxuICAgICAgICAgICAgICAgIC8vIE5PVEU6IElmIHlvdSBhcmUgYSBTZW50cnkgdXNlciwgYW5kIHlvdSBhcmUgc2VlaW5nIHRoaXMgc3RhY2sgZnJhbWUsIGl0XG4gICAgICAgICAgICAgICAgLy8gICAgICAgbWVhbnMgdGhlIHNlbnRyeS5qYXZhc2NyaXB0IFNESyBjYXVnaHQgYW4gZXJyb3IgaW52b2tpbmcgeW91ciBhcHBsaWNhdGlvbiBjb2RlLiBUaGlzXG4gICAgICAgICAgICAgICAgLy8gICAgICAgaXMgZXhwZWN0ZWQgYmVoYXZpb3IgYW5kIE5PVCBpbmRpY2F0aXZlIG9mIGEgYnVnIHdpdGggc2VudHJ5LmphdmFzY3JpcHQuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZuLmhhbmRsZUV2ZW50LmFwcGx5KHRoaXMsIHdyYXBwZWRBcmd1bWVudHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gQXR0ZW1wdCB0byBpbnZva2UgdXNlci1sYW5kIGZ1bmN0aW9uXG4gICAgICAgICAgICAvLyBOT1RFOiBJZiB5b3UgYXJlIGEgU2VudHJ5IHVzZXIsIGFuZCB5b3UgYXJlIHNlZWluZyB0aGlzIHN0YWNrIGZyYW1lLCBpdFxuICAgICAgICAgICAgLy8gICAgICAgbWVhbnMgdGhlIHNlbnRyeS5qYXZhc2NyaXB0IFNESyBjYXVnaHQgYW4gZXJyb3IgaW52b2tpbmcgeW91ciBhcHBsaWNhdGlvbiBjb2RlLiBUaGlzXG4gICAgICAgICAgICAvLyAgICAgICBpcyBleHBlY3RlZCBiZWhhdmlvciBhbmQgTk9UIGluZGljYXRpdmUgb2YgYSBidWcgd2l0aCBzZW50cnkuamF2YXNjcmlwdC5cbiAgICAgICAgICAgIHJldHVybiBmbi5hcHBseSh0aGlzLCB3cmFwcGVkQXJndW1lbnRzKTtcbiAgICAgICAgICAgIC8vIHRzbGludDplbmFibGU6bm8tdW5zYWZlLWFueVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChleCkge1xuICAgICAgICAgICAgaWdub3JlTmV4dE9uRXJyb3IoKTtcbiAgICAgICAgICAgIHdpdGhTY29wZShmdW5jdGlvbiAoc2NvcGUpIHtcbiAgICAgICAgICAgICAgICBzY29wZS5hZGRFdmVudFByb2Nlc3NvcihmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHByb2Nlc3NlZEV2ZW50ID0gdHNsaWJfMS5fX2Fzc2lnbih7fSwgZXZlbnQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5tZWNoYW5pc20pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZEV4Y2VwdGlvblR5cGVWYWx1ZShwcm9jZXNzZWRFdmVudCwgdW5kZWZpbmVkLCB1bmRlZmluZWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYWRkRXhjZXB0aW9uTWVjaGFuaXNtKHByb2Nlc3NlZEV2ZW50LCBvcHRpb25zLm1lY2hhbmlzbSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc2VkRXZlbnQuZXh0cmEgPSB0c2xpYl8xLl9fYXNzaWduKHt9LCBwcm9jZXNzZWRFdmVudC5leHRyYSwgeyBhcmd1bWVudHM6IGFyZ3MgfSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwcm9jZXNzZWRFdmVudDtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBjYXB0dXJlRXhjZXB0aW9uKGV4KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhyb3cgZXg7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8vIEFjY2Vzc2luZyBzb21lIG9iamVjdHMgbWF5IHRocm93XG4gICAgLy8gcmVmOiBodHRwczovL2dpdGh1Yi5jb20vZ2V0c2VudHJ5L3NlbnRyeS1qYXZhc2NyaXB0L2lzc3Vlcy8xMTY4XG4gICAgdHJ5IHtcbiAgICAgICAgZm9yICh2YXIgcHJvcGVydHkgaW4gZm4pIHtcbiAgICAgICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZm4sIHByb3BlcnR5KSkge1xuICAgICAgICAgICAgICAgIHNlbnRyeVdyYXBwZWRbcHJvcGVydHldID0gZm5bcHJvcGVydHldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGNhdGNoIChfb08pIHsgfSAvLyB0c2xpbnQ6ZGlzYWJsZS1saW5lOm5vLWVtcHR5XG4gICAgZm4ucHJvdG90eXBlID0gZm4ucHJvdG90eXBlIHx8IHt9O1xuICAgIHNlbnRyeVdyYXBwZWQucHJvdG90eXBlID0gZm4ucHJvdG90eXBlO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmbiwgJ19fc2VudHJ5X3dyYXBwZWRfXycsIHtcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIHZhbHVlOiBzZW50cnlXcmFwcGVkLFxuICAgIH0pO1xuICAgIC8vIFNpZ25hbCB0aGF0IHRoaXMgZnVuY3Rpb24gaGFzIGJlZW4gd3JhcHBlZC9maWxsZWQgYWxyZWFkeVxuICAgIC8vIGZvciBib3RoIGRlYnVnZ2luZyBhbmQgdG8gcHJldmVudCBpdCB0byBiZWluZyB3cmFwcGVkL2ZpbGxlZCB0d2ljZVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHNlbnRyeVdyYXBwZWQsIHtcbiAgICAgICAgX19zZW50cnlfXzoge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICB2YWx1ZTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgICAgX19zZW50cnlfb3JpZ2luYWxfXzoge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICB2YWx1ZTogZm4sXG4gICAgICAgIH0sXG4gICAgfSk7XG4gICAgLy8gUmVzdG9yZSBvcmlnaW5hbCBmdW5jdGlvbiBuYW1lIChub3QgYWxsIGJyb3dzZXJzIGFsbG93IHRoYXQpXG4gICAgdHJ5IHtcbiAgICAgICAgdmFyIGRlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNlbnRyeVdyYXBwZWQsICduYW1lJyk7XG4gICAgICAgIGlmIChkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSkge1xuICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNlbnRyeVdyYXBwZWQsICduYW1lJywge1xuICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZm4ubmFtZTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY2F0Y2ggKF9vTykge1xuICAgICAgICAvKm5vLWVtcHR5Ki9cbiAgICB9XG4gICAgcmV0dXJuIHNlbnRyeVdyYXBwZWQ7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1oZWxwZXJzLmpzLm1hcCIsImltcG9ydCAqIGFzIHRzbGliXzEgZnJvbSBcInRzbGliXCI7XG5leHBvcnQgKiBmcm9tICcuL2V4cG9ydHMnO1xuaW1wb3J0IHsgSW50ZWdyYXRpb25zIGFzIENvcmVJbnRlZ3JhdGlvbnMgfSBmcm9tICdAc2VudHJ5L2NvcmUnO1xuaW1wb3J0IHsgZ2V0R2xvYmFsT2JqZWN0IH0gZnJvbSAnQHNlbnRyeS91dGlscyc7XG5pbXBvcnQgKiBhcyBCcm93c2VySW50ZWdyYXRpb25zIGZyb20gJy4vaW50ZWdyYXRpb25zJztcbmltcG9ydCAqIGFzIFRyYW5zcG9ydHMgZnJvbSAnLi90cmFuc3BvcnRzJztcbnZhciB3aW5kb3dJbnRlZ3JhdGlvbnMgPSB7fTtcbi8vIFRoaXMgYmxvY2sgaXMgbmVlZGVkIHRvIGFkZCBjb21wYXRpYmlsaXR5IHdpdGggdGhlIGludGVncmF0aW9ucyBwYWNrYWdlcyB3aGVuIHVzZWQgd2l0aCBhIENETlxuLy8gdHNsaW50OmRpc2FibGU6IG5vLXVuc2FmZS1hbnlcbnZhciBfd2luZG93ID0gZ2V0R2xvYmFsT2JqZWN0KCk7XG5pZiAoX3dpbmRvdy5TZW50cnkgJiYgX3dpbmRvdy5TZW50cnkuSW50ZWdyYXRpb25zKSB7XG4gICAgd2luZG93SW50ZWdyYXRpb25zID0gX3dpbmRvdy5TZW50cnkuSW50ZWdyYXRpb25zO1xufVxuLy8gdHNsaW50OmVuYWJsZTogbm8tdW5zYWZlLWFueVxudmFyIElOVEVHUkFUSU9OUyA9IHRzbGliXzEuX19hc3NpZ24oe30sIHdpbmRvd0ludGVncmF0aW9ucywgQ29yZUludGVncmF0aW9ucywgQnJvd3NlckludGVncmF0aW9ucyk7XG5leHBvcnQgeyBJTlRFR1JBVElPTlMgYXMgSW50ZWdyYXRpb25zLCBUcmFuc3BvcnRzIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCJpbXBvcnQgKiBhcyB0c2xpYl8xIGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgZ2V0Q3VycmVudEh1YiB9IGZyb20gJ0BzZW50cnkvY29yZSc7XG5pbXBvcnQgeyBTZXZlcml0eSB9IGZyb20gJ0BzZW50cnkvdHlwZXMnO1xuaW1wb3J0IHsgYWRkSW5zdHJ1bWVudGF0aW9uSGFuZGxlciwgZ2V0RXZlbnREZXNjcmlwdGlvbiwgZ2V0R2xvYmFsT2JqZWN0LCBodG1sVHJlZUFzU3RyaW5nLCBwYXJzZVVybCwgc2FmZUpvaW4sIH0gZnJvbSAnQHNlbnRyeS91dGlscyc7XG4vKipcbiAqIERlZmF1bHQgQnJlYWRjcnVtYnMgaW5zdHJ1bWVudGF0aW9uc1xuICogVE9ETzogRGVwcmVjYXRlZCAtIHdpdGggdjYsIHRoaXMgd2lsbCBiZSByZW5hbWVkIHRvIGBJbnN0cnVtZW50YFxuICovXG52YXIgQnJlYWRjcnVtYnMgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgLyoqXG4gICAgICogQGluaGVyaXREb2NcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBCcmVhZGNydW1icyhvcHRpb25zKSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAaW5oZXJpdERvY1xuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5uYW1lID0gQnJlYWRjcnVtYnMuaWQ7XG4gICAgICAgIHRoaXMuX29wdGlvbnMgPSB0c2xpYl8xLl9fYXNzaWduKHsgY29uc29sZTogdHJ1ZSwgZG9tOiB0cnVlLCBmZXRjaDogdHJ1ZSwgaGlzdG9yeTogdHJ1ZSwgc2VudHJ5OiB0cnVlLCB4aHI6IHRydWUgfSwgb3B0aW9ucyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIGJyZWFkY3J1bWIgb2YgYHNlbnRyeWAgZnJvbSB0aGUgZXZlbnRzIHRoZW1zZWx2ZXNcbiAgICAgKi9cbiAgICBCcmVhZGNydW1icy5wcm90b3R5cGUuYWRkU2VudHJ5QnJlYWRjcnVtYiA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICBpZiAoIXRoaXMuX29wdGlvbnMuc2VudHJ5KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZ2V0Q3VycmVudEh1YigpLmFkZEJyZWFkY3J1bWIoe1xuICAgICAgICAgICAgY2F0ZWdvcnk6IFwic2VudHJ5LlwiICsgKGV2ZW50LnR5cGUgPT09ICd0cmFuc2FjdGlvbicgPyAndHJhbnNhY3Rpb24nIDogJ2V2ZW50JyksXG4gICAgICAgICAgICBldmVudF9pZDogZXZlbnQuZXZlbnRfaWQsXG4gICAgICAgICAgICBsZXZlbDogZXZlbnQubGV2ZWwsXG4gICAgICAgICAgICBtZXNzYWdlOiBnZXRFdmVudERlc2NyaXB0aW9uKGV2ZW50KSxcbiAgICAgICAgfSwge1xuICAgICAgICAgICAgZXZlbnQ6IGV2ZW50LFxuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYnJlYWRjcnVtYnMgZnJvbSBjb25zb2xlIEFQSSBjYWxsc1xuICAgICAqL1xuICAgIEJyZWFkY3J1bWJzLnByb3RvdHlwZS5fY29uc29sZUJyZWFkY3J1bWIgPSBmdW5jdGlvbiAoaGFuZGxlckRhdGEpIHtcbiAgICAgICAgdmFyIGJyZWFkY3J1bWIgPSB7XG4gICAgICAgICAgICBjYXRlZ29yeTogJ2NvbnNvbGUnLFxuICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICAgIGFyZ3VtZW50czogaGFuZGxlckRhdGEuYXJncyxcbiAgICAgICAgICAgICAgICBsb2dnZXI6ICdjb25zb2xlJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsZXZlbDogU2V2ZXJpdHkuZnJvbVN0cmluZyhoYW5kbGVyRGF0YS5sZXZlbCksXG4gICAgICAgICAgICBtZXNzYWdlOiBzYWZlSm9pbihoYW5kbGVyRGF0YS5hcmdzLCAnICcpLFxuICAgICAgICB9O1xuICAgICAgICBpZiAoaGFuZGxlckRhdGEubGV2ZWwgPT09ICdhc3NlcnQnKSB7XG4gICAgICAgICAgICBpZiAoaGFuZGxlckRhdGEuYXJnc1swXSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICBicmVhZGNydW1iLm1lc3NhZ2UgPSBcIkFzc2VydGlvbiBmYWlsZWQ6IFwiICsgKHNhZmVKb2luKGhhbmRsZXJEYXRhLmFyZ3Muc2xpY2UoMSksICcgJykgfHwgJ2NvbnNvbGUuYXNzZXJ0Jyk7XG4gICAgICAgICAgICAgICAgYnJlYWRjcnVtYi5kYXRhLmFyZ3VtZW50cyA9IGhhbmRsZXJEYXRhLmFyZ3Muc2xpY2UoMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBEb24ndCBjYXB0dXJlIGEgYnJlYWRjcnVtYiBmb3IgcGFzc2VkIGFzc2VydGlvbnNcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZ2V0Q3VycmVudEh1YigpLmFkZEJyZWFkY3J1bWIoYnJlYWRjcnVtYiwge1xuICAgICAgICAgICAgaW5wdXQ6IGhhbmRsZXJEYXRhLmFyZ3MsXG4gICAgICAgICAgICBsZXZlbDogaGFuZGxlckRhdGEubGV2ZWwsXG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBicmVhZGNydW1icyBmcm9tIERPTSBBUEkgY2FsbHNcbiAgICAgKi9cbiAgICBCcmVhZGNydW1icy5wcm90b3R5cGUuX2RvbUJyZWFkY3J1bWIgPSBmdW5jdGlvbiAoaGFuZGxlckRhdGEpIHtcbiAgICAgICAgdmFyIHRhcmdldDtcbiAgICAgICAgLy8gQWNjZXNzaW5nIGV2ZW50LnRhcmdldCBjYW4gdGhyb3cgKHNlZSBnZXRzZW50cnkvcmF2ZW4tanMjODM4LCAjNzY4KVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGFyZ2V0ID0gaGFuZGxlckRhdGEuZXZlbnQudGFyZ2V0XG4gICAgICAgICAgICAgICAgPyBodG1sVHJlZUFzU3RyaW5nKGhhbmRsZXJEYXRhLmV2ZW50LnRhcmdldClcbiAgICAgICAgICAgICAgICA6IGh0bWxUcmVlQXNTdHJpbmcoaGFuZGxlckRhdGEuZXZlbnQpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0YXJnZXQgPSAnPHVua25vd24+JztcbiAgICAgICAgfVxuICAgICAgICBpZiAodGFyZ2V0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGdldEN1cnJlbnRIdWIoKS5hZGRCcmVhZGNydW1iKHtcbiAgICAgICAgICAgIGNhdGVnb3J5OiBcInVpLlwiICsgaGFuZGxlckRhdGEubmFtZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRhcmdldCxcbiAgICAgICAgfSwge1xuICAgICAgICAgICAgZXZlbnQ6IGhhbmRsZXJEYXRhLmV2ZW50LFxuICAgICAgICAgICAgbmFtZTogaGFuZGxlckRhdGEubmFtZSxcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGJyZWFkY3J1bWJzIGZyb20gWEhSIEFQSSBjYWxsc1xuICAgICAqL1xuICAgIEJyZWFkY3J1bWJzLnByb3RvdHlwZS5feGhyQnJlYWRjcnVtYiA9IGZ1bmN0aW9uIChoYW5kbGVyRGF0YSkge1xuICAgICAgICBpZiAoaGFuZGxlckRhdGEuZW5kVGltZXN0YW1wKSB7XG4gICAgICAgICAgICAvLyBXZSBvbmx5IGNhcHR1cmUgY29tcGxldGUsIG5vbi1zZW50cnkgcmVxdWVzdHNcbiAgICAgICAgICAgIGlmIChoYW5kbGVyRGF0YS54aHIuX19zZW50cnlfb3duX3JlcXVlc3RfXykge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGdldEN1cnJlbnRIdWIoKS5hZGRCcmVhZGNydW1iKHtcbiAgICAgICAgICAgICAgICBjYXRlZ29yeTogJ3hocicsXG4gICAgICAgICAgICAgICAgZGF0YTogaGFuZGxlckRhdGEueGhyLl9fc2VudHJ5X3hocl9fLFxuICAgICAgICAgICAgICAgIHR5cGU6ICdodHRwJyxcbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICB4aHI6IGhhbmRsZXJEYXRhLnhocixcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGJyZWFkY3J1bWJzIGZyb20gZmV0Y2ggQVBJIGNhbGxzXG4gICAgICovXG4gICAgQnJlYWRjcnVtYnMucHJvdG90eXBlLl9mZXRjaEJyZWFkY3J1bWIgPSBmdW5jdGlvbiAoaGFuZGxlckRhdGEpIHtcbiAgICAgICAgLy8gV2Ugb25seSBjYXB0dXJlIGNvbXBsZXRlIGZldGNoIHJlcXVlc3RzXG4gICAgICAgIGlmICghaGFuZGxlckRhdGEuZW5kVGltZXN0YW1wKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGhhbmRsZXJEYXRhLmZldGNoRGF0YS51cmwubWF0Y2goL3NlbnRyeV9rZXkvKSAmJiBoYW5kbGVyRGF0YS5mZXRjaERhdGEubWV0aG9kID09PSAnUE9TVCcpIHtcbiAgICAgICAgICAgIC8vIFdlIHdpbGwgbm90IGNyZWF0ZSBicmVhZGNydW1icyBmb3IgZmV0Y2ggcmVxdWVzdHMgdGhhdCBjb250YWluIGBzZW50cnlfa2V5YCAoaW50ZXJuYWwgc2VudHJ5IHJlcXVlc3RzKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChoYW5kbGVyRGF0YS5lcnJvcikge1xuICAgICAgICAgICAgZ2V0Q3VycmVudEh1YigpLmFkZEJyZWFkY3J1bWIoe1xuICAgICAgICAgICAgICAgIGNhdGVnb3J5OiAnZmV0Y2gnLFxuICAgICAgICAgICAgICAgIGRhdGE6IGhhbmRsZXJEYXRhLmZldGNoRGF0YSxcbiAgICAgICAgICAgICAgICBsZXZlbDogU2V2ZXJpdHkuRXJyb3IsXG4gICAgICAgICAgICAgICAgdHlwZTogJ2h0dHAnLFxuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIGRhdGE6IGhhbmRsZXJEYXRhLmVycm9yLFxuICAgICAgICAgICAgICAgIGlucHV0OiBoYW5kbGVyRGF0YS5hcmdzLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBnZXRDdXJyZW50SHViKCkuYWRkQnJlYWRjcnVtYih7XG4gICAgICAgICAgICAgICAgY2F0ZWdvcnk6ICdmZXRjaCcsXG4gICAgICAgICAgICAgICAgZGF0YTogdHNsaWJfMS5fX2Fzc2lnbih7fSwgaGFuZGxlckRhdGEuZmV0Y2hEYXRhLCB7IHN0YXR1c19jb2RlOiBoYW5kbGVyRGF0YS5yZXNwb25zZS5zdGF0dXMgfSksXG4gICAgICAgICAgICAgICAgdHlwZTogJ2h0dHAnLFxuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIGlucHV0OiBoYW5kbGVyRGF0YS5hcmdzLFxuICAgICAgICAgICAgICAgIHJlc3BvbnNlOiBoYW5kbGVyRGF0YS5yZXNwb25zZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGJyZWFkY3J1bWJzIGZyb20gaGlzdG9yeSBBUEkgY2FsbHNcbiAgICAgKi9cbiAgICBCcmVhZGNydW1icy5wcm90b3R5cGUuX2hpc3RvcnlCcmVhZGNydW1iID0gZnVuY3Rpb24gKGhhbmRsZXJEYXRhKSB7XG4gICAgICAgIHZhciBnbG9iYWwgPSBnZXRHbG9iYWxPYmplY3QoKTtcbiAgICAgICAgdmFyIGZyb20gPSBoYW5kbGVyRGF0YS5mcm9tO1xuICAgICAgICB2YXIgdG8gPSBoYW5kbGVyRGF0YS50bztcbiAgICAgICAgdmFyIHBhcnNlZExvYyA9IHBhcnNlVXJsKGdsb2JhbC5sb2NhdGlvbi5ocmVmKTtcbiAgICAgICAgdmFyIHBhcnNlZEZyb20gPSBwYXJzZVVybChmcm9tKTtcbiAgICAgICAgdmFyIHBhcnNlZFRvID0gcGFyc2VVcmwodG8pO1xuICAgICAgICAvLyBJbml0aWFsIHB1c2hTdGF0ZSBkb2Vzbid0IHByb3ZpZGUgYGZyb21gIGluZm9ybWF0aW9uXG4gICAgICAgIGlmICghcGFyc2VkRnJvbS5wYXRoKSB7XG4gICAgICAgICAgICBwYXJzZWRGcm9tID0gcGFyc2VkTG9jO1xuICAgICAgICB9XG4gICAgICAgIC8vIFVzZSBvbmx5IHRoZSBwYXRoIGNvbXBvbmVudCBvZiB0aGUgVVJMIGlmIHRoZSBVUkwgbWF0Y2hlcyB0aGUgY3VycmVudFxuICAgICAgICAvLyBkb2N1bWVudCAoYWxtb3N0IGFsbCB0aGUgdGltZSB3aGVuIHVzaW5nIHB1c2hTdGF0ZSlcbiAgICAgICAgaWYgKHBhcnNlZExvYy5wcm90b2NvbCA9PT0gcGFyc2VkVG8ucHJvdG9jb2wgJiYgcGFyc2VkTG9jLmhvc3QgPT09IHBhcnNlZFRvLmhvc3QpIHtcbiAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1wYXJhbWV0ZXItcmVhc3NpZ25tZW50XG4gICAgICAgICAgICB0byA9IHBhcnNlZFRvLnJlbGF0aXZlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXJzZWRMb2MucHJvdG9jb2wgPT09IHBhcnNlZEZyb20ucHJvdG9jb2wgJiYgcGFyc2VkTG9jLmhvc3QgPT09IHBhcnNlZEZyb20uaG9zdCkge1xuICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLXBhcmFtZXRlci1yZWFzc2lnbm1lbnRcbiAgICAgICAgICAgIGZyb20gPSBwYXJzZWRGcm9tLnJlbGF0aXZlO1xuICAgICAgICB9XG4gICAgICAgIGdldEN1cnJlbnRIdWIoKS5hZGRCcmVhZGNydW1iKHtcbiAgICAgICAgICAgIGNhdGVnb3J5OiAnbmF2aWdhdGlvbicsXG4gICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgZnJvbTogZnJvbSxcbiAgICAgICAgICAgICAgICB0bzogdG8sXG4gICAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEluc3RydW1lbnQgYnJvd3NlciBidWlsdC1pbnMgdy8gYnJlYWRjcnVtYiBjYXB0dXJpbmdcbiAgICAgKiAgLSBDb25zb2xlIEFQSVxuICAgICAqICAtIERPTSBBUEkgKGNsaWNrL3R5cGluZylcbiAgICAgKiAgLSBYTUxIdHRwUmVxdWVzdCBBUElcbiAgICAgKiAgLSBGZXRjaCBBUElcbiAgICAgKiAgLSBIaXN0b3J5IEFQSVxuICAgICAqL1xuICAgIEJyZWFkY3J1bWJzLnByb3RvdHlwZS5zZXR1cE9uY2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIGlmICh0aGlzLl9vcHRpb25zLmNvbnNvbGUpIHtcbiAgICAgICAgICAgIGFkZEluc3RydW1lbnRhdGlvbkhhbmRsZXIoe1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBhcmdzID0gW107XG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhcmdzW19pXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgX3RoaXMuX2NvbnNvbGVCcmVhZGNydW1iLmFwcGx5KF90aGlzLCB0c2xpYl8xLl9fc3ByZWFkKGFyZ3MpKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHR5cGU6ICdjb25zb2xlJyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9vcHRpb25zLmRvbSkge1xuICAgICAgICAgICAgYWRkSW5zdHJ1bWVudGF0aW9uSGFuZGxlcih7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2s6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3NbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBfdGhpcy5fZG9tQnJlYWRjcnVtYi5hcHBseShfdGhpcywgdHNsaWJfMS5fX3NwcmVhZChhcmdzKSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB0eXBlOiAnZG9tJyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9vcHRpb25zLnhocikge1xuICAgICAgICAgICAgYWRkSW5zdHJ1bWVudGF0aW9uSGFuZGxlcih7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2s6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3NbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBfdGhpcy5feGhyQnJlYWRjcnVtYi5hcHBseShfdGhpcywgdHNsaWJfMS5fX3NwcmVhZChhcmdzKSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB0eXBlOiAneGhyJyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9vcHRpb25zLmZldGNoKSB7XG4gICAgICAgICAgICBhZGRJbnN0cnVtZW50YXRpb25IYW5kbGVyKHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjazogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgYXJncyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXJnc1tfaV0gPSBhcmd1bWVudHNbX2ldO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF90aGlzLl9mZXRjaEJyZWFkY3J1bWIuYXBwbHkoX3RoaXMsIHRzbGliXzEuX19zcHJlYWQoYXJncykpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgdHlwZTogJ2ZldGNoJyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9vcHRpb25zLmhpc3RvcnkpIHtcbiAgICAgICAgICAgIGFkZEluc3RydW1lbnRhdGlvbkhhbmRsZXIoe1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBhcmdzID0gW107XG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhcmdzW19pXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgX3RoaXMuX2hpc3RvcnlCcmVhZGNydW1iLmFwcGx5KF90aGlzLCB0c2xpYl8xLl9fc3ByZWFkKGFyZ3MpKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHR5cGU6ICdoaXN0b3J5JyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuICAgIEJyZWFkY3J1bWJzLmlkID0gJ0JyZWFkY3J1bWJzJztcbiAgICByZXR1cm4gQnJlYWRjcnVtYnM7XG59KCkpO1xuZXhwb3J0IHsgQnJlYWRjcnVtYnMgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWJyZWFkY3J1bWJzLmpzLm1hcCIsImltcG9ydCAqIGFzIHRzbGliXzEgZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBnZXRDdXJyZW50SHViIH0gZnJvbSAnQHNlbnRyeS9jb3JlJztcbmltcG9ydCB7IFNldmVyaXR5IH0gZnJvbSAnQHNlbnRyeS90eXBlcyc7XG5pbXBvcnQgeyBhZGRFeGNlcHRpb25NZWNoYW5pc20sIGFkZEluc3RydW1lbnRhdGlvbkhhbmRsZXIsIGdldExvY2F0aW9uSHJlZiwgaXNFcnJvckV2ZW50LCBpc1ByaW1pdGl2ZSwgaXNTdHJpbmcsIGxvZ2dlciwgfSBmcm9tICdAc2VudHJ5L3V0aWxzJztcbmltcG9ydCB7IGV2ZW50RnJvbVVua25vd25JbnB1dCB9IGZyb20gJy4uL2V2ZW50YnVpbGRlcic7XG5pbXBvcnQgeyBzaG91bGRJZ25vcmVPbkVycm9yIH0gZnJvbSAnLi4vaGVscGVycyc7XG4vKiogR2xvYmFsIGhhbmRsZXJzICovXG52YXIgR2xvYmFsSGFuZGxlcnMgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgLyoqIEpTRG9jICovXG4gICAgZnVuY3Rpb24gR2xvYmFsSGFuZGxlcnMob3B0aW9ucykge1xuICAgICAgICAvKipcbiAgICAgICAgICogQGluaGVyaXREb2NcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMubmFtZSA9IEdsb2JhbEhhbmRsZXJzLmlkO1xuICAgICAgICAvKiogSlNEb2MgKi9cbiAgICAgICAgdGhpcy5fb25FcnJvckhhbmRsZXJJbnN0YWxsZWQgPSBmYWxzZTtcbiAgICAgICAgLyoqIEpTRG9jICovXG4gICAgICAgIHRoaXMuX29uVW5oYW5kbGVkUmVqZWN0aW9uSGFuZGxlckluc3RhbGxlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9vcHRpb25zID0gdHNsaWJfMS5fX2Fzc2lnbih7IG9uZXJyb3I6IHRydWUsIG9udW5oYW5kbGVkcmVqZWN0aW9uOiB0cnVlIH0sIG9wdGlvbnMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuICAgIEdsb2JhbEhhbmRsZXJzLnByb3RvdHlwZS5zZXR1cE9uY2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIEVycm9yLnN0YWNrVHJhY2VMaW1pdCA9IDUwO1xuICAgICAgICBpZiAodGhpcy5fb3B0aW9ucy5vbmVycm9yKSB7XG4gICAgICAgICAgICBsb2dnZXIubG9nKCdHbG9iYWwgSGFuZGxlciBhdHRhY2hlZDogb25lcnJvcicpO1xuICAgICAgICAgICAgdGhpcy5faW5zdGFsbEdsb2JhbE9uRXJyb3JIYW5kbGVyKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX29wdGlvbnMub251bmhhbmRsZWRyZWplY3Rpb24pIHtcbiAgICAgICAgICAgIGxvZ2dlci5sb2coJ0dsb2JhbCBIYW5kbGVyIGF0dGFjaGVkOiBvbnVuaGFuZGxlZHJlamVjdGlvbicpO1xuICAgICAgICAgICAgdGhpcy5faW5zdGFsbEdsb2JhbE9uVW5oYW5kbGVkUmVqZWN0aW9uSGFuZGxlcigpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKiogSlNEb2MgKi9cbiAgICBHbG9iYWxIYW5kbGVycy5wcm90b3R5cGUuX2luc3RhbGxHbG9iYWxPbkVycm9ySGFuZGxlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgaWYgKHRoaXMuX29uRXJyb3JIYW5kbGVySW5zdGFsbGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgYWRkSW5zdHJ1bWVudGF0aW9uSGFuZGxlcih7XG4gICAgICAgICAgICBjYWxsYmFjazogZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgICAgICAgICB2YXIgZXJyb3IgPSBkYXRhLmVycm9yO1xuICAgICAgICAgICAgICAgIHZhciBjdXJyZW50SHViID0gZ2V0Q3VycmVudEh1YigpO1xuICAgICAgICAgICAgICAgIHZhciBoYXNJbnRlZ3JhdGlvbiA9IGN1cnJlbnRIdWIuZ2V0SW50ZWdyYXRpb24oR2xvYmFsSGFuZGxlcnMpO1xuICAgICAgICAgICAgICAgIHZhciBpc0ZhaWxlZE93bkRlbGl2ZXJ5ID0gZXJyb3IgJiYgZXJyb3IuX19zZW50cnlfb3duX3JlcXVlc3RfXyA9PT0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBpZiAoIWhhc0ludGVncmF0aW9uIHx8IHNob3VsZElnbm9yZU9uRXJyb3IoKSB8fCBpc0ZhaWxlZE93bkRlbGl2ZXJ5KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIGNsaWVudCA9IGN1cnJlbnRIdWIuZ2V0Q2xpZW50KCk7XG4gICAgICAgICAgICAgICAgdmFyIGV2ZW50ID0gaXNQcmltaXRpdmUoZXJyb3IpXG4gICAgICAgICAgICAgICAgICAgID8gX3RoaXMuX2V2ZW50RnJvbUluY29tcGxldGVPbkVycm9yKGRhdGEubXNnLCBkYXRhLnVybCwgZGF0YS5saW5lLCBkYXRhLmNvbHVtbilcbiAgICAgICAgICAgICAgICAgICAgOiBfdGhpcy5fZW5oYW5jZUV2ZW50V2l0aEluaXRpYWxGcmFtZShldmVudEZyb21Vbmtub3duSW5wdXQoZXJyb3IsIHVuZGVmaW5lZCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXR0YWNoU3RhY2t0cmFjZTogY2xpZW50ICYmIGNsaWVudC5nZXRPcHRpb25zKCkuYXR0YWNoU3RhY2t0cmFjZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdGlvbjogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIH0pLCBkYXRhLnVybCwgZGF0YS5saW5lLCBkYXRhLmNvbHVtbik7XG4gICAgICAgICAgICAgICAgYWRkRXhjZXB0aW9uTWVjaGFuaXNtKGV2ZW50LCB7XG4gICAgICAgICAgICAgICAgICAgIGhhbmRsZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnb25lcnJvcicsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgY3VycmVudEh1Yi5jYXB0dXJlRXZlbnQoZXZlbnQsIHtcbiAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxFeGNlcHRpb246IGVycm9yLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHR5cGU6ICdlcnJvcicsXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl9vbkVycm9ySGFuZGxlckluc3RhbGxlZCA9IHRydWU7XG4gICAgfTtcbiAgICAvKiogSlNEb2MgKi9cbiAgICBHbG9iYWxIYW5kbGVycy5wcm90b3R5cGUuX2luc3RhbGxHbG9iYWxPblVuaGFuZGxlZFJlamVjdGlvbkhhbmRsZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIGlmICh0aGlzLl9vblVuaGFuZGxlZFJlamVjdGlvbkhhbmRsZXJJbnN0YWxsZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBhZGRJbnN0cnVtZW50YXRpb25IYW5kbGVyKHtcbiAgICAgICAgICAgIGNhbGxiYWNrOiBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgIHZhciBlcnJvciA9IGU7XG4gICAgICAgICAgICAgICAgLy8gZGlnIHRoZSBvYmplY3Qgb2YgdGhlIHJlamVjdGlvbiBvdXQgb2Yga25vd24gZXZlbnQgdHlwZXNcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAvLyBQcm9taXNlUmVqZWN0aW9uRXZlbnRzIHN0b3JlIHRoZSBvYmplY3Qgb2YgdGhlIHJlamVjdGlvbiB1bmRlciAncmVhc29uJ1xuICAgICAgICAgICAgICAgICAgICAvLyBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1Byb21pc2VSZWplY3Rpb25FdmVudFxuICAgICAgICAgICAgICAgICAgICBpZiAoJ3JlYXNvbicgaW4gZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSBlLnJlYXNvbjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBzb21ldGhpbmcsIHNvbWV3aGVyZSwgKGxpa2VseSBhIGJyb3dzZXIgZXh0ZW5zaW9uKSBlZmZlY3RpdmVseSBjYXN0cyBQcm9taXNlUmVqZWN0aW9uRXZlbnRzXG4gICAgICAgICAgICAgICAgICAgIC8vIHRvIEN1c3RvbUV2ZW50cywgbW92aW5nIHRoZSBgcHJvbWlzZWAgYW5kIGByZWFzb25gIGF0dHJpYnV0ZXMgb2YgdGhlIFBSRSBpbnRvXG4gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBDdXN0b21FdmVudCdzIGBkZXRhaWxgIGF0dHJpYnV0ZSwgc2luY2UgdGhleSdyZSBub3QgcGFydCBvZiBDdXN0b21FdmVudCdzIHNwZWNcbiAgICAgICAgICAgICAgICAgICAgLy8gc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9DdXN0b21FdmVudCBhbmRcbiAgICAgICAgICAgICAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2dldHNlbnRyeS9zZW50cnktamF2YXNjcmlwdC9pc3N1ZXMvMjM4MFxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICgnZGV0YWlsJyBpbiBlICYmICdyZWFzb24nIGluIGUuZGV0YWlsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvciA9IGUuZGV0YWlsLnJlYXNvbjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoX29PKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIG5vLWVtcHR5XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBjdXJyZW50SHViID0gZ2V0Q3VycmVudEh1YigpO1xuICAgICAgICAgICAgICAgIHZhciBoYXNJbnRlZ3JhdGlvbiA9IGN1cnJlbnRIdWIuZ2V0SW50ZWdyYXRpb24oR2xvYmFsSGFuZGxlcnMpO1xuICAgICAgICAgICAgICAgIHZhciBpc0ZhaWxlZE93bkRlbGl2ZXJ5ID0gZXJyb3IgJiYgZXJyb3IuX19zZW50cnlfb3duX3JlcXVlc3RfXyA9PT0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBpZiAoIWhhc0ludGVncmF0aW9uIHx8IHNob3VsZElnbm9yZU9uRXJyb3IoKSB8fCBpc0ZhaWxlZE93bkRlbGl2ZXJ5KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgY2xpZW50ID0gY3VycmVudEh1Yi5nZXRDbGllbnQoKTtcbiAgICAgICAgICAgICAgICB2YXIgZXZlbnQgPSBpc1ByaW1pdGl2ZShlcnJvcilcbiAgICAgICAgICAgICAgICAgICAgPyBfdGhpcy5fZXZlbnRGcm9tSW5jb21wbGV0ZVJlamVjdGlvbihlcnJvcilcbiAgICAgICAgICAgICAgICAgICAgOiBldmVudEZyb21Vbmtub3duSW5wdXQoZXJyb3IsIHVuZGVmaW5lZCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXR0YWNoU3RhY2t0cmFjZTogY2xpZW50ICYmIGNsaWVudC5nZXRPcHRpb25zKCkuYXR0YWNoU3RhY2t0cmFjZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdGlvbjogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgZXZlbnQubGV2ZWwgPSBTZXZlcml0eS5FcnJvcjtcbiAgICAgICAgICAgICAgICBhZGRFeGNlcHRpb25NZWNoYW5pc20oZXZlbnQsIHtcbiAgICAgICAgICAgICAgICAgICAgaGFuZGxlZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdvbnVuaGFuZGxlZHJlamVjdGlvbicsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgY3VycmVudEh1Yi5jYXB0dXJlRXZlbnQoZXZlbnQsIHtcbiAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxFeGNlcHRpb246IGVycm9yLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0eXBlOiAndW5oYW5kbGVkcmVqZWN0aW9uJyxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuX29uVW5oYW5kbGVkUmVqZWN0aW9uSGFuZGxlckluc3RhbGxlZCA9IHRydWU7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGNyZWF0ZXMgYSBzdGFjayBmcm9tIGFuIG9sZCwgZXJyb3ItbGVzcyBvbmVycm9yIGhhbmRsZXIuXG4gICAgICovXG4gICAgR2xvYmFsSGFuZGxlcnMucHJvdG90eXBlLl9ldmVudEZyb21JbmNvbXBsZXRlT25FcnJvciA9IGZ1bmN0aW9uIChtc2csIHVybCwgbGluZSwgY29sdW1uKSB7XG4gICAgICAgIHZhciBFUlJPUl9UWVBFU19SRSA9IC9eKD86W1V1XW5jYXVnaHQgKD86ZXhjZXB0aW9uOiApPyk/KD86KCg/OkV2YWx8SW50ZXJuYWx8UmFuZ2V8UmVmZXJlbmNlfFN5bnRheHxUeXBlfFVSSXwpRXJyb3IpOiApPyguKikkL2k7XG4gICAgICAgIC8vIElmICdtZXNzYWdlJyBpcyBFcnJvckV2ZW50LCBnZXQgcmVhbCBtZXNzYWdlIGZyb20gaW5zaWRlXG4gICAgICAgIHZhciBtZXNzYWdlID0gaXNFcnJvckV2ZW50KG1zZykgPyBtc2cubWVzc2FnZSA6IG1zZztcbiAgICAgICAgdmFyIG5hbWU7XG4gICAgICAgIGlmIChpc1N0cmluZyhtZXNzYWdlKSkge1xuICAgICAgICAgICAgdmFyIGdyb3VwcyA9IG1lc3NhZ2UubWF0Y2goRVJST1JfVFlQRVNfUkUpO1xuICAgICAgICAgICAgaWYgKGdyb3Vwcykge1xuICAgICAgICAgICAgICAgIG5hbWUgPSBncm91cHNbMV07XG4gICAgICAgICAgICAgICAgbWVzc2FnZSA9IGdyb3Vwc1syXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB2YXIgZXZlbnQgPSB7XG4gICAgICAgICAgICBleGNlcHRpb246IHtcbiAgICAgICAgICAgICAgICB2YWx1ZXM6IFtcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogbmFtZSB8fCAnRXJyb3InLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB0aGlzLl9lbmhhbmNlRXZlbnRXaXRoSW5pdGlhbEZyYW1lKGV2ZW50LCB1cmwsIGxpbmUsIGNvbHVtbik7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGNyZWF0ZXMgYW4gRXZlbnQgZnJvbSBhbiBUcmFjZUtpdFN0YWNrVHJhY2UgdGhhdCBoYXMgcGFydCBvZiBpdCBtaXNzaW5nLlxuICAgICAqL1xuICAgIEdsb2JhbEhhbmRsZXJzLnByb3RvdHlwZS5fZXZlbnRGcm9tSW5jb21wbGV0ZVJlamVjdGlvbiA9IGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZXhjZXB0aW9uOiB7XG4gICAgICAgICAgICAgICAgdmFsdWVzOiBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdVbmhhbmRsZWRSZWplY3Rpb24nLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IFwiTm9uLUVycm9yIHByb21pc2UgcmVqZWN0aW9uIGNhcHR1cmVkIHdpdGggdmFsdWU6IFwiICsgZXJyb3IsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgfTtcbiAgICAvKiogSlNEb2MgKi9cbiAgICBHbG9iYWxIYW5kbGVycy5wcm90b3R5cGUuX2VuaGFuY2VFdmVudFdpdGhJbml0aWFsRnJhbWUgPSBmdW5jdGlvbiAoZXZlbnQsIHVybCwgbGluZSwgY29sdW1uKSB7XG4gICAgICAgIGV2ZW50LmV4Y2VwdGlvbiA9IGV2ZW50LmV4Y2VwdGlvbiB8fCB7fTtcbiAgICAgICAgZXZlbnQuZXhjZXB0aW9uLnZhbHVlcyA9IGV2ZW50LmV4Y2VwdGlvbi52YWx1ZXMgfHwgW107XG4gICAgICAgIGV2ZW50LmV4Y2VwdGlvbi52YWx1ZXNbMF0gPSBldmVudC5leGNlcHRpb24udmFsdWVzWzBdIHx8IHt9O1xuICAgICAgICBldmVudC5leGNlcHRpb24udmFsdWVzWzBdLnN0YWNrdHJhY2UgPSBldmVudC5leGNlcHRpb24udmFsdWVzWzBdLnN0YWNrdHJhY2UgfHwge307XG4gICAgICAgIGV2ZW50LmV4Y2VwdGlvbi52YWx1ZXNbMF0uc3RhY2t0cmFjZS5mcmFtZXMgPSBldmVudC5leGNlcHRpb24udmFsdWVzWzBdLnN0YWNrdHJhY2UuZnJhbWVzIHx8IFtdO1xuICAgICAgICB2YXIgY29sbm8gPSBpc05hTihwYXJzZUludChjb2x1bW4sIDEwKSkgPyB1bmRlZmluZWQgOiBjb2x1bW47XG4gICAgICAgIHZhciBsaW5lbm8gPSBpc05hTihwYXJzZUludChsaW5lLCAxMCkpID8gdW5kZWZpbmVkIDogbGluZTtcbiAgICAgICAgdmFyIGZpbGVuYW1lID0gaXNTdHJpbmcodXJsKSAmJiB1cmwubGVuZ3RoID4gMCA/IHVybCA6IGdldExvY2F0aW9uSHJlZigpO1xuICAgICAgICBpZiAoZXZlbnQuZXhjZXB0aW9uLnZhbHVlc1swXS5zdGFja3RyYWNlLmZyYW1lcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIGV2ZW50LmV4Y2VwdGlvbi52YWx1ZXNbMF0uc3RhY2t0cmFjZS5mcmFtZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgY29sbm86IGNvbG5vLFxuICAgICAgICAgICAgICAgIGZpbGVuYW1lOiBmaWxlbmFtZSxcbiAgICAgICAgICAgICAgICBmdW5jdGlvbjogJz8nLFxuICAgICAgICAgICAgICAgIGluX2FwcDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBsaW5lbm86IGxpbmVubyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBldmVudDtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEBpbmhlcml0RG9jXG4gICAgICovXG4gICAgR2xvYmFsSGFuZGxlcnMuaWQgPSAnR2xvYmFsSGFuZGxlcnMnO1xuICAgIHJldHVybiBHbG9iYWxIYW5kbGVycztcbn0oKSk7XG5leHBvcnQgeyBHbG9iYWxIYW5kbGVycyB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Z2xvYmFsaGFuZGxlcnMuanMubWFwIiwiZXhwb3J0IHsgR2xvYmFsSGFuZGxlcnMgfSBmcm9tICcuL2dsb2JhbGhhbmRsZXJzJztcbmV4cG9ydCB7IFRyeUNhdGNoIH0gZnJvbSAnLi90cnljYXRjaCc7XG5leHBvcnQgeyBCcmVhZGNydW1icyB9IGZyb20gJy4vYnJlYWRjcnVtYnMnO1xuZXhwb3J0IHsgTGlua2VkRXJyb3JzIH0gZnJvbSAnLi9saW5rZWRlcnJvcnMnO1xuZXhwb3J0IHsgVXNlckFnZW50IH0gZnJvbSAnLi91c2VyYWdlbnQnO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIiwiaW1wb3J0ICogYXMgdHNsaWJfMSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IGFkZEdsb2JhbEV2ZW50UHJvY2Vzc29yLCBnZXRDdXJyZW50SHViIH0gZnJvbSAnQHNlbnRyeS9jb3JlJztcbmltcG9ydCB7IGlzSW5zdGFuY2VPZiB9IGZyb20gJ0BzZW50cnkvdXRpbHMnO1xuaW1wb3J0IHsgZXhjZXB0aW9uRnJvbVN0YWNrdHJhY2UgfSBmcm9tICcuLi9wYXJzZXJzJztcbmltcG9ydCB7IGNvbXB1dGVTdGFja1RyYWNlIH0gZnJvbSAnLi4vdHJhY2VraXQnO1xudmFyIERFRkFVTFRfS0VZID0gJ2NhdXNlJztcbnZhciBERUZBVUxUX0xJTUlUID0gNTtcbi8qKiBBZGRzIFNESyBpbmZvIHRvIGFuIGV2ZW50LiAqL1xudmFyIExpbmtlZEVycm9ycyA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIExpbmtlZEVycm9ycyhvcHRpb25zKSB7XG4gICAgICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHsgb3B0aW9ucyA9IHt9OyB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAaW5oZXJpdERvY1xuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5uYW1lID0gTGlua2VkRXJyb3JzLmlkO1xuICAgICAgICB0aGlzLl9rZXkgPSBvcHRpb25zLmtleSB8fCBERUZBVUxUX0tFWTtcbiAgICAgICAgdGhpcy5fbGltaXQgPSBvcHRpb25zLmxpbWl0IHx8IERFRkFVTFRfTElNSVQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBpbmhlcml0RG9jXG4gICAgICovXG4gICAgTGlua2VkRXJyb3JzLnByb3RvdHlwZS5zZXR1cE9uY2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGFkZEdsb2JhbEV2ZW50UHJvY2Vzc29yKGZ1bmN0aW9uIChldmVudCwgaGludCkge1xuICAgICAgICAgICAgdmFyIHNlbGYgPSBnZXRDdXJyZW50SHViKCkuZ2V0SW50ZWdyYXRpb24oTGlua2VkRXJyb3JzKTtcbiAgICAgICAgICAgIGlmIChzZWxmKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2hhbmRsZXIoZXZlbnQsIGhpbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGV2ZW50O1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEBpbmhlcml0RG9jXG4gICAgICovXG4gICAgTGlua2VkRXJyb3JzLnByb3RvdHlwZS5faGFuZGxlciA9IGZ1bmN0aW9uIChldmVudCwgaGludCkge1xuICAgICAgICBpZiAoIWV2ZW50LmV4Y2VwdGlvbiB8fCAhZXZlbnQuZXhjZXB0aW9uLnZhbHVlcyB8fCAhaGludCB8fCAhaXNJbnN0YW5jZU9mKGhpbnQub3JpZ2luYWxFeGNlcHRpb24sIEVycm9yKSkge1xuICAgICAgICAgICAgcmV0dXJuIGV2ZW50O1xuICAgICAgICB9XG4gICAgICAgIHZhciBsaW5rZWRFcnJvcnMgPSB0aGlzLl93YWxrRXJyb3JUcmVlKGhpbnQub3JpZ2luYWxFeGNlcHRpb24sIHRoaXMuX2tleSk7XG4gICAgICAgIGV2ZW50LmV4Y2VwdGlvbi52YWx1ZXMgPSB0c2xpYl8xLl9fc3ByZWFkKGxpbmtlZEVycm9ycywgZXZlbnQuZXhjZXB0aW9uLnZhbHVlcyk7XG4gICAgICAgIHJldHVybiBldmVudDtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEBpbmhlcml0RG9jXG4gICAgICovXG4gICAgTGlua2VkRXJyb3JzLnByb3RvdHlwZS5fd2Fsa0Vycm9yVHJlZSA9IGZ1bmN0aW9uIChlcnJvciwga2V5LCBzdGFjaykge1xuICAgICAgICBpZiAoc3RhY2sgPT09IHZvaWQgMCkgeyBzdGFjayA9IFtdOyB9XG4gICAgICAgIGlmICghaXNJbnN0YW5jZU9mKGVycm9yW2tleV0sIEVycm9yKSB8fCBzdGFjay5sZW5ndGggKyAxID49IHRoaXMuX2xpbWl0KSB7XG4gICAgICAgICAgICByZXR1cm4gc3RhY2s7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHN0YWNrdHJhY2UgPSBjb21wdXRlU3RhY2tUcmFjZShlcnJvcltrZXldKTtcbiAgICAgICAgdmFyIGV4Y2VwdGlvbiA9IGV4Y2VwdGlvbkZyb21TdGFja3RyYWNlKHN0YWNrdHJhY2UpO1xuICAgICAgICByZXR1cm4gdGhpcy5fd2Fsa0Vycm9yVHJlZShlcnJvcltrZXldLCBrZXksIHRzbGliXzEuX19zcHJlYWQoW2V4Y2VwdGlvbl0sIHN0YWNrKSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuICAgIExpbmtlZEVycm9ycy5pZCA9ICdMaW5rZWRFcnJvcnMnO1xuICAgIHJldHVybiBMaW5rZWRFcnJvcnM7XG59KCkpO1xuZXhwb3J0IHsgTGlua2VkRXJyb3JzIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1saW5rZWRlcnJvcnMuanMubWFwIiwiaW1wb3J0ICogYXMgdHNsaWJfMSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IGZpbGwsIGdldEZ1bmN0aW9uTmFtZSwgZ2V0R2xvYmFsT2JqZWN0IH0gZnJvbSAnQHNlbnRyeS91dGlscyc7XG5pbXBvcnQgeyB3cmFwIH0gZnJvbSAnLi4vaGVscGVycyc7XG52YXIgREVGQVVMVF9FVkVOVF9UQVJHRVQgPSBbXG4gICAgJ0V2ZW50VGFyZ2V0JyxcbiAgICAnV2luZG93JyxcbiAgICAnTm9kZScsXG4gICAgJ0FwcGxpY2F0aW9uQ2FjaGUnLFxuICAgICdBdWRpb1RyYWNrTGlzdCcsXG4gICAgJ0NoYW5uZWxNZXJnZXJOb2RlJyxcbiAgICAnQ3J5cHRvT3BlcmF0aW9uJyxcbiAgICAnRXZlbnRTb3VyY2UnLFxuICAgICdGaWxlUmVhZGVyJyxcbiAgICAnSFRNTFVua25vd25FbGVtZW50JyxcbiAgICAnSURCRGF0YWJhc2UnLFxuICAgICdJREJSZXF1ZXN0JyxcbiAgICAnSURCVHJhbnNhY3Rpb24nLFxuICAgICdLZXlPcGVyYXRpb24nLFxuICAgICdNZWRpYUNvbnRyb2xsZXInLFxuICAgICdNZXNzYWdlUG9ydCcsXG4gICAgJ01vZGFsV2luZG93JyxcbiAgICAnTm90aWZpY2F0aW9uJyxcbiAgICAnU1ZHRWxlbWVudEluc3RhbmNlJyxcbiAgICAnU2NyZWVuJyxcbiAgICAnVGV4dFRyYWNrJyxcbiAgICAnVGV4dFRyYWNrQ3VlJyxcbiAgICAnVGV4dFRyYWNrTGlzdCcsXG4gICAgJ1dlYlNvY2tldCcsXG4gICAgJ1dlYlNvY2tldFdvcmtlcicsXG4gICAgJ1dvcmtlcicsXG4gICAgJ1hNTEh0dHBSZXF1ZXN0JyxcbiAgICAnWE1MSHR0cFJlcXVlc3RFdmVudFRhcmdldCcsXG4gICAgJ1hNTEh0dHBSZXF1ZXN0VXBsb2FkJyxcbl07XG4vKiogV3JhcCB0aW1lciBmdW5jdGlvbnMgYW5kIGV2ZW50IHRhcmdldHMgdG8gY2F0Y2ggZXJyb3JzIGFuZCBwcm92aWRlIGJldHRlciBtZXRhIGRhdGEgKi9cbnZhciBUcnlDYXRjaCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIFRyeUNhdGNoKG9wdGlvbnMpIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBpbmhlcml0RG9jXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLm5hbWUgPSBUcnlDYXRjaC5pZDtcbiAgICAgICAgdGhpcy5fb3B0aW9ucyA9IHRzbGliXzEuX19hc3NpZ24oeyBYTUxIdHRwUmVxdWVzdDogdHJ1ZSwgZXZlbnRUYXJnZXQ6IHRydWUsIHJlcXVlc3RBbmltYXRpb25GcmFtZTogdHJ1ZSwgc2V0SW50ZXJ2YWw6IHRydWUsIHNldFRpbWVvdXQ6IHRydWUgfSwgb3B0aW9ucyk7XG4gICAgfVxuICAgIC8qKiBKU0RvYyAqL1xuICAgIFRyeUNhdGNoLnByb3RvdHlwZS5fd3JhcFRpbWVGdW5jdGlvbiA9IGZ1bmN0aW9uIChvcmlnaW5hbCkge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGFyZ3MgPSBbXTtcbiAgICAgICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICAgICAgYXJnc1tfaV0gPSBhcmd1bWVudHNbX2ldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIG9yaWdpbmFsQ2FsbGJhY2sgPSBhcmdzWzBdO1xuICAgICAgICAgICAgYXJnc1swXSA9IHdyYXAob3JpZ2luYWxDYWxsYmFjaywge1xuICAgICAgICAgICAgICAgIG1lY2hhbmlzbToge1xuICAgICAgICAgICAgICAgICAgICBkYXRhOiB7IGZ1bmN0aW9uOiBnZXRGdW5jdGlvbk5hbWUob3JpZ2luYWwpIH0sXG4gICAgICAgICAgICAgICAgICAgIGhhbmRsZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdpbnN0cnVtZW50JyxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gb3JpZ2luYWwuYXBwbHkodGhpcywgYXJncyk7XG4gICAgICAgIH07XG4gICAgfTtcbiAgICAvKiogSlNEb2MgKi9cbiAgICBUcnlDYXRjaC5wcm90b3R5cGUuX3dyYXBSQUYgPSBmdW5jdGlvbiAob3JpZ2luYWwpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsLmNhbGwodGhpcywgd3JhcChjYWxsYmFjaywge1xuICAgICAgICAgICAgICAgIG1lY2hhbmlzbToge1xuICAgICAgICAgICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbjogJ3JlcXVlc3RBbmltYXRpb25GcmFtZScsXG4gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVyOiBnZXRGdW5jdGlvbk5hbWUob3JpZ2luYWwpLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBoYW5kbGVkOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnaW5zdHJ1bWVudCcsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfTtcbiAgICB9O1xuICAgIC8qKiBKU0RvYyAqL1xuICAgIFRyeUNhdGNoLnByb3RvdHlwZS5fd3JhcEV2ZW50VGFyZ2V0ID0gZnVuY3Rpb24gKHRhcmdldCkge1xuICAgICAgICB2YXIgZ2xvYmFsID0gZ2V0R2xvYmFsT2JqZWN0KCk7XG4gICAgICAgIHZhciBwcm90byA9IGdsb2JhbFt0YXJnZXRdICYmIGdsb2JhbFt0YXJnZXRdLnByb3RvdHlwZTtcbiAgICAgICAgaWYgKCFwcm90byB8fCAhcHJvdG8uaGFzT3duUHJvcGVydHkgfHwgIXByb3RvLmhhc093blByb3BlcnR5KCdhZGRFdmVudExpc3RlbmVyJykpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBmaWxsKHByb3RvLCAnYWRkRXZlbnRMaXN0ZW5lcicsIGZ1bmN0aW9uIChvcmlnaW5hbCkge1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChldmVudE5hbWUsIGZuLCBvcHRpb25zKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLXVuYm91bmQtbWV0aG9kIHN0cmljdC10eXBlLXByZWRpY2F0ZXNcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBmbi5oYW5kbGVFdmVudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm4uaGFuZGxlRXZlbnQgPSB3cmFwKGZuLmhhbmRsZUV2ZW50LmJpbmQoZm4pLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVjaGFuaXNtOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uOiAnaGFuZGxlRXZlbnQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlcjogZ2V0RnVuY3Rpb25OYW1lKGZuKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldDogdGFyZ2V0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVkOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnaW5zdHJ1bWVudCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gY2FuIHNvbWV0aW1lcyBnZXQgJ1Blcm1pc3Npb24gZGVuaWVkIHRvIGFjY2VzcyBwcm9wZXJ0eSBcImhhbmRsZSBFdmVudCdcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsLmNhbGwodGhpcywgZXZlbnROYW1lLCB3cmFwKGZuLCB7XG4gICAgICAgICAgICAgICAgICAgIG1lY2hhbmlzbToge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uOiAnYWRkRXZlbnRMaXN0ZW5lcicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlcjogZ2V0RnVuY3Rpb25OYW1lKGZuKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6IHRhcmdldCxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVkOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2luc3RydW1lbnQnLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0pLCBvcHRpb25zKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgICAgICBmaWxsKHByb3RvLCAncmVtb3ZlRXZlbnRMaXN0ZW5lcicsIGZ1bmN0aW9uIChvcmlnaW5hbCkge1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChldmVudE5hbWUsIGZuLCBvcHRpb25zKSB7XG4gICAgICAgICAgICAgICAgdmFyIGNhbGxiYWNrID0gZm47XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayAmJiAoY2FsbGJhY2suX19zZW50cnlfd3JhcHBlZF9fIHx8IGNhbGxiYWNrKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlLCBhY2Nlc3NpbmcgX19zZW50cnlfd3JhcHBlZF9fIHdpbGwgdGhyb3cgaW4gc29tZSBTZWxlbml1bSBlbnZpcm9ubWVudHNcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsLmNhbGwodGhpcywgZXZlbnROYW1lLCBjYWxsYmFjaywgb3B0aW9ucyk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKiBKU0RvYyAqL1xuICAgIFRyeUNhdGNoLnByb3RvdHlwZS5fd3JhcFhIUiA9IGZ1bmN0aW9uIChvcmlnaW5hbFNlbmQpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBhcmdzID0gW107XG4gICAgICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgICAgIGFyZ3NbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciB4aHIgPSB0aGlzOyAvLyB0c2xpbnQ6ZGlzYWJsZS1saW5lOm5vLXRoaXMtYXNzaWdubWVudFxuICAgICAgICAgICAgdmFyIHhtbEh0dHBSZXF1ZXN0UHJvcHMgPSBbJ29ubG9hZCcsICdvbmVycm9yJywgJ29ucHJvZ3Jlc3MnLCAnb25yZWFkeXN0YXRlY2hhbmdlJ107XG4gICAgICAgICAgICB4bWxIdHRwUmVxdWVzdFByb3BzLmZvckVhY2goZnVuY3Rpb24gKHByb3ApIHtcbiAgICAgICAgICAgICAgICBpZiAocHJvcCBpbiB4aHIgJiYgdHlwZW9mIHhocltwcm9wXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICBmaWxsKHhociwgcHJvcCwgZnVuY3Rpb24gKG9yaWdpbmFsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgd3JhcE9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVjaGFuaXNtOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uOiBwcm9wLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlcjogZ2V0RnVuY3Rpb25OYW1lKG9yaWdpbmFsKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2luc3RydW1lbnQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgSW5zdHJ1bWVudCBpbnRlZ3JhdGlvbiBoYXMgYmVlbiBjYWxsZWQgYmVmb3JlIFRyeUNhdGNoLCBnZXQgdGhlIG5hbWUgb2Ygb3JpZ2luYWwgZnVuY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcmlnaW5hbC5fX3NlbnRyeV9vcmlnaW5hbF9fKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JhcE9wdGlvbnMubWVjaGFuaXNtLmRhdGEuaGFuZGxlciA9IGdldEZ1bmN0aW9uTmFtZShvcmlnaW5hbC5fX3NlbnRyeV9vcmlnaW5hbF9fKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSB3cmFwIGRpcmVjdGx5XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gd3JhcChvcmlnaW5hbCwgd3JhcE9wdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBvcmlnaW5hbFNlbmQuYXBwbHkodGhpcywgYXJncyk7XG4gICAgICAgIH07XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBXcmFwIHRpbWVyIGZ1bmN0aW9ucyBhbmQgZXZlbnQgdGFyZ2V0cyB0byBjYXRjaCBlcnJvcnNcbiAgICAgKiBhbmQgcHJvdmlkZSBiZXR0ZXIgbWV0YWRhdGEuXG4gICAgICovXG4gICAgVHJ5Q2F0Y2gucHJvdG90eXBlLnNldHVwT25jZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGdsb2JhbCA9IGdldEdsb2JhbE9iamVjdCgpO1xuICAgICAgICBpZiAodGhpcy5fb3B0aW9ucy5zZXRUaW1lb3V0KSB7XG4gICAgICAgICAgICBmaWxsKGdsb2JhbCwgJ3NldFRpbWVvdXQnLCB0aGlzLl93cmFwVGltZUZ1bmN0aW9uLmJpbmQodGhpcykpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9vcHRpb25zLnNldEludGVydmFsKSB7XG4gICAgICAgICAgICBmaWxsKGdsb2JhbCwgJ3NldEludGVydmFsJywgdGhpcy5fd3JhcFRpbWVGdW5jdGlvbi5iaW5kKHRoaXMpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fb3B0aW9ucy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUpIHtcbiAgICAgICAgICAgIGZpbGwoZ2xvYmFsLCAncmVxdWVzdEFuaW1hdGlvbkZyYW1lJywgdGhpcy5fd3JhcFJBRi5iaW5kKHRoaXMpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fb3B0aW9ucy5YTUxIdHRwUmVxdWVzdCAmJiAnWE1MSHR0cFJlcXVlc3QnIGluIGdsb2JhbCkge1xuICAgICAgICAgICAgZmlsbChYTUxIdHRwUmVxdWVzdC5wcm90b3R5cGUsICdzZW5kJywgdGhpcy5fd3JhcFhIUi5iaW5kKHRoaXMpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fb3B0aW9ucy5ldmVudFRhcmdldCkge1xuICAgICAgICAgICAgdmFyIGV2ZW50VGFyZ2V0ID0gQXJyYXkuaXNBcnJheSh0aGlzLl9vcHRpb25zLmV2ZW50VGFyZ2V0KSA/IHRoaXMuX29wdGlvbnMuZXZlbnRUYXJnZXQgOiBERUZBVUxUX0VWRU5UX1RBUkdFVDtcbiAgICAgICAgICAgIGV2ZW50VGFyZ2V0LmZvckVhY2godGhpcy5fd3JhcEV2ZW50VGFyZ2V0LmJpbmQodGhpcykpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuICAgIFRyeUNhdGNoLmlkID0gJ1RyeUNhdGNoJztcbiAgICByZXR1cm4gVHJ5Q2F0Y2g7XG59KCkpO1xuZXhwb3J0IHsgVHJ5Q2F0Y2ggfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXRyeWNhdGNoLmpzLm1hcCIsImltcG9ydCAqIGFzIHRzbGliXzEgZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBhZGRHbG9iYWxFdmVudFByb2Nlc3NvciwgZ2V0Q3VycmVudEh1YiB9IGZyb20gJ0BzZW50cnkvY29yZSc7XG5pbXBvcnQgeyBnZXRHbG9iYWxPYmplY3QgfSBmcm9tICdAc2VudHJ5L3V0aWxzJztcbnZhciBnbG9iYWwgPSBnZXRHbG9iYWxPYmplY3QoKTtcbi8qKiBVc2VyQWdlbnQgKi9cbnZhciBVc2VyQWdlbnQgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gVXNlckFnZW50KCkge1xuICAgICAgICAvKipcbiAgICAgICAgICogQGluaGVyaXREb2NcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMubmFtZSA9IFVzZXJBZ2VudC5pZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGluaGVyaXREb2NcbiAgICAgKi9cbiAgICBVc2VyQWdlbnQucHJvdG90eXBlLnNldHVwT25jZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgYWRkR2xvYmFsRXZlbnRQcm9jZXNzb3IoZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgICBpZiAoZ2V0Q3VycmVudEh1YigpLmdldEludGVncmF0aW9uKFVzZXJBZ2VudCkpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWdsb2JhbC5uYXZpZ2F0b3IgfHwgIWdsb2JhbC5sb2NhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXZlbnQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciByZXF1ZXN0ID0gZXZlbnQucmVxdWVzdCB8fCB7fTtcbiAgICAgICAgICAgICAgICByZXF1ZXN0LnVybCA9IHJlcXVlc3QudXJsIHx8IGdsb2JhbC5sb2NhdGlvbi5ocmVmO1xuICAgICAgICAgICAgICAgIHJlcXVlc3QuaGVhZGVycyA9IHJlcXVlc3QuaGVhZGVycyB8fCB7fTtcbiAgICAgICAgICAgICAgICByZXF1ZXN0LmhlYWRlcnNbJ1VzZXItQWdlbnQnXSA9IGdsb2JhbC5uYXZpZ2F0b3IudXNlckFnZW50O1xuICAgICAgICAgICAgICAgIHJldHVybiB0c2xpYl8xLl9fYXNzaWduKHt9LCBldmVudCwgeyByZXF1ZXN0OiByZXF1ZXN0IH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGV2ZW50O1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEBpbmhlcml0RG9jXG4gICAgICovXG4gICAgVXNlckFnZW50LmlkID0gJ1VzZXJBZ2VudCc7XG4gICAgcmV0dXJuIFVzZXJBZ2VudDtcbn0oKSk7XG5leHBvcnQgeyBVc2VyQWdlbnQgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXVzZXJhZ2VudC5qcy5tYXAiLCJpbXBvcnQgeyBleHRyYWN0RXhjZXB0aW9uS2V5c0Zvck1lc3NhZ2UsIGlzRXZlbnQsIG5vcm1hbGl6ZVRvU2l6ZSB9IGZyb20gJ0BzZW50cnkvdXRpbHMnO1xuaW1wb3J0IHsgY29tcHV0ZVN0YWNrVHJhY2UgfSBmcm9tICcuL3RyYWNla2l0JztcbnZhciBTVEFDS1RSQUNFX0xJTUlUID0gNTA7XG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gY3JlYXRlcyBhbiBleGNlcHRpb24gZnJvbSBhbiBUcmFjZUtpdFN0YWNrVHJhY2VcbiAqIEBwYXJhbSBzdGFja3RyYWNlIFRyYWNlS2l0U3RhY2tUcmFjZSB0aGF0IHdpbGwgYmUgY29udmVydGVkIHRvIGFuIGV4Y2VwdGlvblxuICogQGhpZGRlblxuICovXG5leHBvcnQgZnVuY3Rpb24gZXhjZXB0aW9uRnJvbVN0YWNrdHJhY2Uoc3RhY2t0cmFjZSkge1xuICAgIHZhciBmcmFtZXMgPSBwcmVwYXJlRnJhbWVzRm9yRXZlbnQoc3RhY2t0cmFjZS5zdGFjayk7XG4gICAgdmFyIGV4Y2VwdGlvbiA9IHtcbiAgICAgICAgdHlwZTogc3RhY2t0cmFjZS5uYW1lLFxuICAgICAgICB2YWx1ZTogc3RhY2t0cmFjZS5tZXNzYWdlLFxuICAgIH07XG4gICAgaWYgKGZyYW1lcyAmJiBmcmFtZXMubGVuZ3RoKSB7XG4gICAgICAgIGV4Y2VwdGlvbi5zdGFja3RyYWNlID0geyBmcmFtZXM6IGZyYW1lcyB9O1xuICAgIH1cbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6c3RyaWN0LXR5cGUtcHJlZGljYXRlc1xuICAgIGlmIChleGNlcHRpb24udHlwZSA9PT0gdW5kZWZpbmVkICYmIGV4Y2VwdGlvbi52YWx1ZSA9PT0gJycpIHtcbiAgICAgICAgZXhjZXB0aW9uLnZhbHVlID0gJ1VucmVjb3ZlcmFibGUgZXJyb3IgY2F1Z2h0JztcbiAgICB9XG4gICAgcmV0dXJuIGV4Y2VwdGlvbjtcbn1cbi8qKlxuICogQGhpZGRlblxuICovXG5leHBvcnQgZnVuY3Rpb24gZXZlbnRGcm9tUGxhaW5PYmplY3QoZXhjZXB0aW9uLCBzeW50aGV0aWNFeGNlcHRpb24sIHJlamVjdGlvbikge1xuICAgIHZhciBldmVudCA9IHtcbiAgICAgICAgZXhjZXB0aW9uOiB7XG4gICAgICAgICAgICB2YWx1ZXM6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IGlzRXZlbnQoZXhjZXB0aW9uKSA/IGV4Y2VwdGlvbi5jb25zdHJ1Y3Rvci5uYW1lIDogcmVqZWN0aW9uID8gJ1VuaGFuZGxlZFJlamVjdGlvbicgOiAnRXJyb3InLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogXCJOb24tRXJyb3IgXCIgKyAocmVqZWN0aW9uID8gJ3Byb21pc2UgcmVqZWN0aW9uJyA6ICdleGNlcHRpb24nKSArIFwiIGNhcHR1cmVkIHdpdGgga2V5czogXCIgKyBleHRyYWN0RXhjZXB0aW9uS2V5c0Zvck1lc3NhZ2UoZXhjZXB0aW9uKSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgICAgZXh0cmE6IHtcbiAgICAgICAgICAgIF9fc2VyaWFsaXplZF9fOiBub3JtYWxpemVUb1NpemUoZXhjZXB0aW9uKSxcbiAgICAgICAgfSxcbiAgICB9O1xuICAgIGlmIChzeW50aGV0aWNFeGNlcHRpb24pIHtcbiAgICAgICAgdmFyIHN0YWNrdHJhY2UgPSBjb21wdXRlU3RhY2tUcmFjZShzeW50aGV0aWNFeGNlcHRpb24pO1xuICAgICAgICB2YXIgZnJhbWVzXzEgPSBwcmVwYXJlRnJhbWVzRm9yRXZlbnQoc3RhY2t0cmFjZS5zdGFjayk7XG4gICAgICAgIGV2ZW50LnN0YWNrdHJhY2UgPSB7XG4gICAgICAgICAgICBmcmFtZXM6IGZyYW1lc18xLFxuICAgICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gZXZlbnQ7XG59XG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV2ZW50RnJvbVN0YWNrdHJhY2Uoc3RhY2t0cmFjZSkge1xuICAgIHZhciBleGNlcHRpb24gPSBleGNlcHRpb25Gcm9tU3RhY2t0cmFjZShzdGFja3RyYWNlKTtcbiAgICByZXR1cm4ge1xuICAgICAgICBleGNlcHRpb246IHtcbiAgICAgICAgICAgIHZhbHVlczogW2V4Y2VwdGlvbl0sXG4gICAgICAgIH0sXG4gICAgfTtcbn1cbi8qKlxuICogQGhpZGRlblxuICovXG5leHBvcnQgZnVuY3Rpb24gcHJlcGFyZUZyYW1lc0ZvckV2ZW50KHN0YWNrKSB7XG4gICAgaWYgKCFzdGFjayB8fCAhc3RhY2subGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgdmFyIGxvY2FsU3RhY2sgPSBzdGFjaztcbiAgICB2YXIgZmlyc3RGcmFtZUZ1bmN0aW9uID0gbG9jYWxTdGFja1swXS5mdW5jIHx8ICcnO1xuICAgIHZhciBsYXN0RnJhbWVGdW5jdGlvbiA9IGxvY2FsU3RhY2tbbG9jYWxTdGFjay5sZW5ndGggLSAxXS5mdW5jIHx8ICcnO1xuICAgIC8vIElmIHN0YWNrIHN0YXJ0cyB3aXRoIG9uZSBvZiBvdXIgQVBJIGNhbGxzLCByZW1vdmUgaXQgKHN0YXJ0cywgbWVhbmluZyBpdCdzIHRoZSB0b3Agb2YgdGhlIHN0YWNrIC0gYWthIGxhc3QgY2FsbClcbiAgICBpZiAoZmlyc3RGcmFtZUZ1bmN0aW9uLmluZGV4T2YoJ2NhcHR1cmVNZXNzYWdlJykgIT09IC0xIHx8IGZpcnN0RnJhbWVGdW5jdGlvbi5pbmRleE9mKCdjYXB0dXJlRXhjZXB0aW9uJykgIT09IC0xKSB7XG4gICAgICAgIGxvY2FsU3RhY2sgPSBsb2NhbFN0YWNrLnNsaWNlKDEpO1xuICAgIH1cbiAgICAvLyBJZiBzdGFjayBlbmRzIHdpdGggb25lIG9mIG91ciBpbnRlcm5hbCBBUEkgY2FsbHMsIHJlbW92ZSBpdCAoZW5kcywgbWVhbmluZyBpdCdzIHRoZSBib3R0b20gb2YgdGhlIHN0YWNrIC0gYWthIHRvcC1tb3N0IGNhbGwpXG4gICAgaWYgKGxhc3RGcmFtZUZ1bmN0aW9uLmluZGV4T2YoJ3NlbnRyeVdyYXBwZWQnKSAhPT0gLTEpIHtcbiAgICAgICAgbG9jYWxTdGFjayA9IGxvY2FsU3RhY2suc2xpY2UoMCwgLTEpO1xuICAgIH1cbiAgICAvLyBUaGUgZnJhbWUgd2hlcmUgdGhlIGNyYXNoIGhhcHBlbmVkLCBzaG91bGQgYmUgdGhlIGxhc3QgZW50cnkgaW4gdGhlIGFycmF5XG4gICAgcmV0dXJuIGxvY2FsU3RhY2tcbiAgICAgICAgLnNsaWNlKDAsIFNUQUNLVFJBQ0VfTElNSVQpXG4gICAgICAgIC5tYXAoZnVuY3Rpb24gKGZyYW1lKSB7IHJldHVybiAoe1xuICAgICAgICBjb2xubzogZnJhbWUuY29sdW1uID09PSBudWxsID8gdW5kZWZpbmVkIDogZnJhbWUuY29sdW1uLFxuICAgICAgICBmaWxlbmFtZTogZnJhbWUudXJsIHx8IGxvY2FsU3RhY2tbMF0udXJsLFxuICAgICAgICBmdW5jdGlvbjogZnJhbWUuZnVuYyB8fCAnPycsXG4gICAgICAgIGluX2FwcDogdHJ1ZSxcbiAgICAgICAgbGluZW5vOiBmcmFtZS5saW5lID09PSBudWxsID8gdW5kZWZpbmVkIDogZnJhbWUubGluZSxcbiAgICB9KTsgfSlcbiAgICAgICAgLnJldmVyc2UoKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXBhcnNlcnMuanMubWFwIiwiaW1wb3J0IHsgZ2V0Q3VycmVudEh1YiwgaW5pdEFuZEJpbmQsIEludGVncmF0aW9ucyBhcyBDb3JlSW50ZWdyYXRpb25zIH0gZnJvbSAnQHNlbnRyeS9jb3JlJztcbmltcG9ydCB7IGdldEdsb2JhbE9iamVjdCwgU3luY1Byb21pc2UgfSBmcm9tICdAc2VudHJ5L3V0aWxzJztcbmltcG9ydCB7IEJyb3dzZXJDbGllbnQgfSBmcm9tICcuL2NsaWVudCc7XG5pbXBvcnQgeyB3cmFwIGFzIGludGVybmFsV3JhcCB9IGZyb20gJy4vaGVscGVycyc7XG5pbXBvcnQgeyBCcmVhZGNydW1icywgR2xvYmFsSGFuZGxlcnMsIExpbmtlZEVycm9ycywgVHJ5Q2F0Y2gsIFVzZXJBZ2VudCB9IGZyb20gJy4vaW50ZWdyYXRpb25zJztcbmV4cG9ydCB2YXIgZGVmYXVsdEludGVncmF0aW9ucyA9IFtcbiAgICBuZXcgQ29yZUludGVncmF0aW9ucy5JbmJvdW5kRmlsdGVycygpLFxuICAgIG5ldyBDb3JlSW50ZWdyYXRpb25zLkZ1bmN0aW9uVG9TdHJpbmcoKSxcbiAgICBuZXcgVHJ5Q2F0Y2goKSxcbiAgICBuZXcgQnJlYWRjcnVtYnMoKSxcbiAgICBuZXcgR2xvYmFsSGFuZGxlcnMoKSxcbiAgICBuZXcgTGlua2VkRXJyb3JzKCksXG4gICAgbmV3IFVzZXJBZ2VudCgpLFxuXTtcbi8qKlxuICogVGhlIFNlbnRyeSBCcm93c2VyIFNESyBDbGllbnQuXG4gKlxuICogVG8gdXNlIHRoaXMgU0RLLCBjYWxsIHRoZSB7QGxpbmsgaW5pdH0gZnVuY3Rpb24gYXMgZWFybHkgYXMgcG9zc2libGUgd2hlblxuICogbG9hZGluZyB0aGUgd2ViIHBhZ2UuIFRvIHNldCBjb250ZXh0IGluZm9ybWF0aW9uIG9yIHNlbmQgbWFudWFsIGV2ZW50cywgdXNlXG4gKiB0aGUgcHJvdmlkZWQgbWV0aG9kcy5cbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqIGBgYFxuICpcbiAqIGltcG9ydCB7IGluaXQgfSBmcm9tICdAc2VudHJ5L2Jyb3dzZXInO1xuICpcbiAqIGluaXQoe1xuICogICBkc246ICdfX0RTTl9fJyxcbiAqICAgLy8gLi4uXG4gKiB9KTtcbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGBcbiAqXG4gKiBpbXBvcnQgeyBjb25maWd1cmVTY29wZSB9IGZyb20gJ0BzZW50cnkvYnJvd3Nlcic7XG4gKiBjb25maWd1cmVTY29wZSgoc2NvcGU6IFNjb3BlKSA9PiB7XG4gKiAgIHNjb3BlLnNldEV4dHJhKHsgYmF0dGVyeTogMC43IH0pO1xuICogICBzY29wZS5zZXRUYWcoeyB1c2VyX21vZGU6ICdhZG1pbicgfSk7XG4gKiAgIHNjb3BlLnNldFVzZXIoeyBpZDogJzQ3MTEnIH0pO1xuICogfSk7XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgXG4gKlxuICogaW1wb3J0IHsgYWRkQnJlYWRjcnVtYiB9IGZyb20gJ0BzZW50cnkvYnJvd3Nlcic7XG4gKiBhZGRCcmVhZGNydW1iKHtcbiAqICAgbWVzc2FnZTogJ015IEJyZWFkY3J1bWInLFxuICogICAvLyAuLi5cbiAqIH0pO1xuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiBgYGBcbiAqXG4gKiBpbXBvcnQgKiBhcyBTZW50cnkgZnJvbSAnQHNlbnRyeS9icm93c2VyJztcbiAqIFNlbnRyeS5jYXB0dXJlTWVzc2FnZSgnSGVsbG8sIHdvcmxkIScpO1xuICogU2VudHJ5LmNhcHR1cmVFeGNlcHRpb24obmV3IEVycm9yKCdHb29kIGJ5ZScpKTtcbiAqIFNlbnRyeS5jYXB0dXJlRXZlbnQoe1xuICogICBtZXNzYWdlOiAnTWFudWFsJyxcbiAqICAgc3RhY2t0cmFjZTogW1xuICogICAgIC8vIC4uLlxuICogICBdLFxuICogfSk7XG4gKiBgYGBcbiAqXG4gKiBAc2VlIHtAbGluayBCcm93c2VyT3B0aW9uc30gZm9yIGRvY3VtZW50YXRpb24gb24gY29uZmlndXJhdGlvbiBvcHRpb25zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5pdChvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkgeyBvcHRpb25zID0ge307IH1cbiAgICBpZiAob3B0aW9ucy5kZWZhdWx0SW50ZWdyYXRpb25zID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgb3B0aW9ucy5kZWZhdWx0SW50ZWdyYXRpb25zID0gZGVmYXVsdEludGVncmF0aW9ucztcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMucmVsZWFzZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHZhciB3aW5kb3dfMSA9IGdldEdsb2JhbE9iamVjdCgpO1xuICAgICAgICAvLyBUaGlzIHN1cHBvcnRzIHRoZSB2YXJpYWJsZSB0aGF0IHNlbnRyeS13ZWJwYWNrLXBsdWdpbiBpbmplY3RzXG4gICAgICAgIGlmICh3aW5kb3dfMS5TRU5UUllfUkVMRUFTRSAmJiB3aW5kb3dfMS5TRU5UUllfUkVMRUFTRS5pZCkge1xuICAgICAgICAgICAgb3B0aW9ucy5yZWxlYXNlID0gd2luZG93XzEuU0VOVFJZX1JFTEVBU0UuaWQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaW5pdEFuZEJpbmQoQnJvd3NlckNsaWVudCwgb3B0aW9ucyk7XG59XG4vKipcbiAqIFByZXNlbnQgdGhlIHVzZXIgd2l0aCBhIHJlcG9ydCBkaWFsb2cuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgRXZlcnl0aGluZyBpcyBvcHRpb25hbCwgd2UgdHJ5IHRvIGZldGNoIGFsbCBpbmZvIG5lZWQgZnJvbSB0aGUgZ2xvYmFsIHNjb3BlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2hvd1JlcG9ydERpYWxvZyhvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkgeyBvcHRpb25zID0ge307IH1cbiAgICBpZiAoIW9wdGlvbnMuZXZlbnRJZCkge1xuICAgICAgICBvcHRpb25zLmV2ZW50SWQgPSBnZXRDdXJyZW50SHViKCkubGFzdEV2ZW50SWQoKTtcbiAgICB9XG4gICAgdmFyIGNsaWVudCA9IGdldEN1cnJlbnRIdWIoKS5nZXRDbGllbnQoKTtcbiAgICBpZiAoY2xpZW50KSB7XG4gICAgICAgIGNsaWVudC5zaG93UmVwb3J0RGlhbG9nKG9wdGlvbnMpO1xuICAgIH1cbn1cbi8qKlxuICogVGhpcyBpcyB0aGUgZ2V0dGVyIGZvciBsYXN0RXZlbnRJZC5cbiAqXG4gKiBAcmV0dXJucyBUaGUgbGFzdCBldmVudCBpZCBvZiBhIGNhcHR1cmVkIGV2ZW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gbGFzdEV2ZW50SWQoKSB7XG4gICAgcmV0dXJuIGdldEN1cnJlbnRIdWIoKS5sYXN0RXZlbnRJZCgpO1xufVxuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIGlzIGhlcmUgdG8gYmUgQVBJIGNvbXBhdGlibGUgd2l0aCB0aGUgbG9hZGVyLlxuICogQGhpZGRlblxuICovXG5leHBvcnQgZnVuY3Rpb24gZm9yY2VMb2FkKCkge1xuICAgIC8vIE5vb3Bcbn1cbi8qKlxuICogVGhpcyBmdW5jdGlvbiBpcyBoZXJlIHRvIGJlIEFQSSBjb21wYXRpYmxlIHdpdGggdGhlIGxvYWRlci5cbiAqIEBoaWRkZW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9uTG9hZChjYWxsYmFjaykge1xuICAgIGNhbGxiYWNrKCk7XG59XG4vKipcbiAqIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gYWxsIGN1cnJlbnQgZXZlbnRzIGhhdmUgYmVlbiBzZW50LlxuICogSWYgeW91IHByb3ZpZGUgYSB0aW1lb3V0IGFuZCB0aGUgcXVldWUgdGFrZXMgbG9uZ2VyIHRvIGRyYWluIHRoZSBwcm9taXNlIHJldHVybnMgZmFsc2UuXG4gKlxuICogQHBhcmFtIHRpbWVvdXQgTWF4aW11bSB0aW1lIGluIG1zIHRoZSBjbGllbnQgc2hvdWxkIHdhaXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmbHVzaCh0aW1lb3V0KSB7XG4gICAgdmFyIGNsaWVudCA9IGdldEN1cnJlbnRIdWIoKS5nZXRDbGllbnQoKTtcbiAgICBpZiAoY2xpZW50KSB7XG4gICAgICAgIHJldHVybiBjbGllbnQuZmx1c2godGltZW91dCk7XG4gICAgfVxuICAgIHJldHVybiBTeW5jUHJvbWlzZS5yZWplY3QoZmFsc2UpO1xufVxuLyoqXG4gKiBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIGFsbCBjdXJyZW50IGV2ZW50cyBoYXZlIGJlZW4gc2VudC5cbiAqIElmIHlvdSBwcm92aWRlIGEgdGltZW91dCBhbmQgdGhlIHF1ZXVlIHRha2VzIGxvbmdlciB0byBkcmFpbiB0aGUgcHJvbWlzZSByZXR1cm5zIGZhbHNlLlxuICpcbiAqIEBwYXJhbSB0aW1lb3V0IE1heGltdW0gdGltZSBpbiBtcyB0aGUgY2xpZW50IHNob3VsZCB3YWl0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2xvc2UodGltZW91dCkge1xuICAgIHZhciBjbGllbnQgPSBnZXRDdXJyZW50SHViKCkuZ2V0Q2xpZW50KCk7XG4gICAgaWYgKGNsaWVudCkge1xuICAgICAgICByZXR1cm4gY2xpZW50LmNsb3NlKHRpbWVvdXQpO1xuICAgIH1cbiAgICByZXR1cm4gU3luY1Byb21pc2UucmVqZWN0KGZhbHNlKTtcbn1cbi8qKlxuICogV3JhcCBjb2RlIHdpdGhpbiBhIHRyeS9jYXRjaCBibG9jayBzbyB0aGUgU0RLIGlzIGFibGUgdG8gY2FwdHVyZSBlcnJvcnMuXG4gKlxuICogQHBhcmFtIGZuIEEgZnVuY3Rpb24gdG8gd3JhcC5cbiAqXG4gKiBAcmV0dXJucyBUaGUgcmVzdWx0IG9mIHdyYXBwZWQgZnVuY3Rpb24gY2FsbC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdyYXAoZm4pIHtcbiAgICByZXR1cm4gaW50ZXJuYWxXcmFwKGZuKSgpOyAvLyB0c2xpbnQ6ZGlzYWJsZS1saW5lOm5vLXVuc2FmZS1hbnlcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNkay5qcy5tYXAiLCIvLyB0c2xpbnQ6ZGlzYWJsZTpvYmplY3QtbGl0ZXJhbC1zb3J0LWtleXNcbmltcG9ydCAqIGFzIHRzbGliXzEgZnJvbSBcInRzbGliXCI7XG4vLyBnbG9iYWwgcmVmZXJlbmNlIHRvIHNsaWNlXG52YXIgVU5LTk9XTl9GVU5DVElPTiA9ICc/Jztcbi8vIENocm9taXVtIGJhc2VkIGJyb3dzZXJzOiBDaHJvbWUsIEJyYXZlLCBuZXcgT3BlcmEsIG5ldyBFZGdlXG52YXIgY2hyb21lID0gL15cXHMqYXQgKD86KC4qPykgP1xcKCk/KCg/OmZpbGV8aHR0cHM/fGJsb2J8Y2hyb21lLWV4dGVuc2lvbnxhZGRyZXNzfG5hdGl2ZXxldmFsfHdlYnBhY2t8PGFub255bW91cz58Wy1hLXpdKzp8LipidW5kbGV8XFwvKS4qPykoPzo6KFxcZCspKT8oPzo6KFxcZCspKT9cXCk/XFxzKiQvaTtcbi8vIGdlY2tvIHJlZ2V4OiBgKD86YnVuZGxlfFxcZCtcXC5qcylgOiBgYnVuZGxlYCBpcyBmb3IgcmVhY3QgbmF0aXZlLCBgXFxkK1xcLmpzYCBhbHNvIGJ1dCBzcGVjaWZpY2FsbHkgZm9yIHJhbSBidW5kbGVzIGJlY2F1c2UgaXRcbi8vIGdlbmVyYXRlcyBmaWxlbmFtZXMgd2l0aG91dCBhIHByZWZpeCBsaWtlIGBmaWxlOi8vYCB0aGUgZmlsZW5hbWVzIGluIHRoZSBzdGFja3RyYWNlIGFyZSBqdXN0IDQyLmpzXG4vLyBXZSBuZWVkIHRoaXMgc3BlY2lmaWMgY2FzZSBmb3Igbm93IGJlY2F1c2Ugd2Ugd2FudCBubyBvdGhlciByZWdleCB0byBtYXRjaC5cbnZhciBnZWNrbyA9IC9eXFxzKiguKj8pKD86XFwoKC4qPylcXCkpPyg/Ol58QCk/KCg/OmZpbGV8aHR0cHM/fGJsb2J8Y2hyb21lfHdlYnBhY2t8cmVzb3VyY2V8bW96LWV4dGVuc2lvbikuKj86XFwvLio/fFxcW25hdGl2ZSBjb2RlXFxdfFteQF0qKD86YnVuZGxlfFxcZCtcXC5qcykpKD86OihcXGQrKSk/KD86OihcXGQrKSk/XFxzKiQvaTtcbnZhciB3aW5qcyA9IC9eXFxzKmF0ICg/OigoPzpcXFtvYmplY3Qgb2JqZWN0XFxdKT8uKykgKT9cXCg/KCg/OmZpbGV8bXMtYXBweHxodHRwcz98d2VicGFja3xibG9iKTouKj8pOihcXGQrKSg/OjooXFxkKykpP1xcKT9cXHMqJC9pO1xudmFyIGdlY2tvRXZhbCA9IC8oXFxTKykgbGluZSAoXFxkKykoPzogPiBldmFsIGxpbmUgXFxkKykqID4gZXZhbC9pO1xudmFyIGNocm9tZUV2YWwgPSAvXFwoKFxcUyopKD86OihcXGQrKSkoPzo6KFxcZCspKVxcKS87XG4vKiogSlNEb2MgKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlU3RhY2tUcmFjZShleCkge1xuICAgIC8vIHRzbGludDpkaXNhYmxlOm5vLXVuc2FmZS1hbnlcbiAgICB2YXIgc3RhY2sgPSBudWxsO1xuICAgIHZhciBwb3BTaXplID0gZXggJiYgZXguZnJhbWVzVG9Qb3A7XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gVGhpcyBtdXN0IGJlIHRyaWVkIGZpcnN0IGJlY2F1c2UgT3BlcmEgMTAgKmRlc3Ryb3lzKlxuICAgICAgICAvLyBpdHMgc3RhY2t0cmFjZSBwcm9wZXJ0eSBpZiB5b3UgdHJ5IHRvIGFjY2VzcyB0aGUgc3RhY2tcbiAgICAgICAgLy8gcHJvcGVydHkgZmlyc3QhIVxuICAgICAgICBzdGFjayA9IGNvbXB1dGVTdGFja1RyYWNlRnJvbVN0YWNrdHJhY2VQcm9wKGV4KTtcbiAgICAgICAgaWYgKHN0YWNrKSB7XG4gICAgICAgICAgICByZXR1cm4gcG9wRnJhbWVzKHN0YWNrLCBwb3BTaXplKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjYXRjaCAoZSkge1xuICAgICAgICAvLyBuby1lbXB0eVxuICAgIH1cbiAgICB0cnkge1xuICAgICAgICBzdGFjayA9IGNvbXB1dGVTdGFja1RyYWNlRnJvbVN0YWNrUHJvcChleCk7XG4gICAgICAgIGlmIChzdGFjaykge1xuICAgICAgICAgICAgcmV0dXJuIHBvcEZyYW1lcyhzdGFjaywgcG9wU2l6ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gbm8tZW1wdHlcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgbWVzc2FnZTogZXh0cmFjdE1lc3NhZ2UoZXgpLFxuICAgICAgICBuYW1lOiBleCAmJiBleC5uYW1lLFxuICAgICAgICBzdGFjazogW10sXG4gICAgICAgIGZhaWxlZDogdHJ1ZSxcbiAgICB9O1xufVxuLyoqIEpTRG9jICovXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6Y3ljbG9tYXRpYy1jb21wbGV4aXR5XG5mdW5jdGlvbiBjb21wdXRlU3RhY2tUcmFjZUZyb21TdGFja1Byb3AoZXgpIHtcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZTpuby1jb25kaXRpb25hbC1hc3NpZ25tZW50XG4gICAgaWYgKCFleCB8fCAhZXguc3RhY2spIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHZhciBzdGFjayA9IFtdO1xuICAgIHZhciBsaW5lcyA9IGV4LnN0YWNrLnNwbGl0KCdcXG4nKTtcbiAgICB2YXIgaXNFdmFsO1xuICAgIHZhciBzdWJtYXRjaDtcbiAgICB2YXIgcGFydHM7XG4gICAgdmFyIGVsZW1lbnQ7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7ICsraSkge1xuICAgICAgICBpZiAoKHBhcnRzID0gY2hyb21lLmV4ZWMobGluZXNbaV0pKSkge1xuICAgICAgICAgICAgdmFyIGlzTmF0aXZlID0gcGFydHNbMl0gJiYgcGFydHNbMl0uaW5kZXhPZignbmF0aXZlJykgPT09IDA7IC8vIHN0YXJ0IG9mIGxpbmVcbiAgICAgICAgICAgIGlzRXZhbCA9IHBhcnRzWzJdICYmIHBhcnRzWzJdLmluZGV4T2YoJ2V2YWwnKSA9PT0gMDsgLy8gc3RhcnQgb2YgbGluZVxuICAgICAgICAgICAgaWYgKGlzRXZhbCAmJiAoc3VibWF0Y2ggPSBjaHJvbWVFdmFsLmV4ZWMocGFydHNbMl0pKSkge1xuICAgICAgICAgICAgICAgIC8vIHRocm93IG91dCBldmFsIGxpbmUvY29sdW1uIGFuZCB1c2UgdG9wLW1vc3QgbGluZS9jb2x1bW4gbnVtYmVyXG4gICAgICAgICAgICAgICAgcGFydHNbMl0gPSBzdWJtYXRjaFsxXTsgLy8gdXJsXG4gICAgICAgICAgICAgICAgcGFydHNbM10gPSBzdWJtYXRjaFsyXTsgLy8gbGluZVxuICAgICAgICAgICAgICAgIHBhcnRzWzRdID0gc3VibWF0Y2hbM107IC8vIGNvbHVtblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxlbWVudCA9IHtcbiAgICAgICAgICAgICAgICAvLyB3b3JraW5nIHdpdGggdGhlIHJlZ2V4cCBhYm92ZSBpcyBzdXBlciBwYWluZnVsLiBpdCBpcyBxdWl0ZSBhIGhhY2ssIGJ1dCBqdXN0IHN0cmlwcGluZyB0aGUgYGFkZHJlc3MgYXQgYFxuICAgICAgICAgICAgICAgIC8vIHByZWZpeCBoZXJlIHNlZW1zIGxpa2UgdGhlIHF1aWNrZXN0IHNvbHV0aW9uIGZvciBub3cuXG4gICAgICAgICAgICAgICAgdXJsOiBwYXJ0c1syXSAmJiBwYXJ0c1syXS5pbmRleE9mKCdhZGRyZXNzIGF0ICcpID09PSAwID8gcGFydHNbMl0uc3Vic3RyKCdhZGRyZXNzIGF0ICcubGVuZ3RoKSA6IHBhcnRzWzJdLFxuICAgICAgICAgICAgICAgIGZ1bmM6IHBhcnRzWzFdIHx8IFVOS05PV05fRlVOQ1RJT04sXG4gICAgICAgICAgICAgICAgYXJnczogaXNOYXRpdmUgPyBbcGFydHNbMl1dIDogW10sXG4gICAgICAgICAgICAgICAgbGluZTogcGFydHNbM10gPyArcGFydHNbM10gOiBudWxsLFxuICAgICAgICAgICAgICAgIGNvbHVtbjogcGFydHNbNF0gPyArcGFydHNbNF0gOiBudWxsLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICgocGFydHMgPSB3aW5qcy5leGVjKGxpbmVzW2ldKSkpIHtcbiAgICAgICAgICAgIGVsZW1lbnQgPSB7XG4gICAgICAgICAgICAgICAgdXJsOiBwYXJ0c1syXSxcbiAgICAgICAgICAgICAgICBmdW5jOiBwYXJ0c1sxXSB8fCBVTktOT1dOX0ZVTkNUSU9OLFxuICAgICAgICAgICAgICAgIGFyZ3M6IFtdLFxuICAgICAgICAgICAgICAgIGxpbmU6ICtwYXJ0c1szXSxcbiAgICAgICAgICAgICAgICBjb2x1bW46IHBhcnRzWzRdID8gK3BhcnRzWzRdIDogbnVsbCxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoKHBhcnRzID0gZ2Vja28uZXhlYyhsaW5lc1tpXSkpKSB7XG4gICAgICAgICAgICBpc0V2YWwgPSBwYXJ0c1szXSAmJiBwYXJ0c1szXS5pbmRleE9mKCcgPiBldmFsJykgPiAtMTtcbiAgICAgICAgICAgIGlmIChpc0V2YWwgJiYgKHN1Ym1hdGNoID0gZ2Vja29FdmFsLmV4ZWMocGFydHNbM10pKSkge1xuICAgICAgICAgICAgICAgIC8vIHRocm93IG91dCBldmFsIGxpbmUvY29sdW1uIGFuZCB1c2UgdG9wLW1vc3QgbGluZSBudW1iZXJcbiAgICAgICAgICAgICAgICBwYXJ0c1sxXSA9IHBhcnRzWzFdIHx8IFwiZXZhbFwiO1xuICAgICAgICAgICAgICAgIHBhcnRzWzNdID0gc3VibWF0Y2hbMV07XG4gICAgICAgICAgICAgICAgcGFydHNbNF0gPSBzdWJtYXRjaFsyXTtcbiAgICAgICAgICAgICAgICBwYXJ0c1s1XSA9ICcnOyAvLyBubyBjb2x1bW4gd2hlbiBldmFsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChpID09PSAwICYmICFwYXJ0c1s1XSAmJiBleC5jb2x1bW5OdW1iZXIgIT09IHZvaWQgMCkge1xuICAgICAgICAgICAgICAgIC8vIEZpcmVGb3ggdXNlcyB0aGlzIGF3ZXNvbWUgY29sdW1uTnVtYmVyIHByb3BlcnR5IGZvciBpdHMgdG9wIGZyYW1lXG4gICAgICAgICAgICAgICAgLy8gQWxzbyBub3RlLCBGaXJlZm94J3MgY29sdW1uIG51bWJlciBpcyAwLWJhc2VkIGFuZCBldmVyeXRoaW5nIGVsc2UgZXhwZWN0cyAxLWJhc2VkLFxuICAgICAgICAgICAgICAgIC8vIHNvIGFkZGluZyAxXG4gICAgICAgICAgICAgICAgLy8gTk9URTogdGhpcyBoYWNrIGRvZXNuJ3Qgd29yayBpZiB0b3AtbW9zdCBmcmFtZSBpcyBldmFsXG4gICAgICAgICAgICAgICAgc3RhY2tbMF0uY29sdW1uID0gZXguY29sdW1uTnVtYmVyICsgMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsZW1lbnQgPSB7XG4gICAgICAgICAgICAgICAgdXJsOiBwYXJ0c1szXSxcbiAgICAgICAgICAgICAgICBmdW5jOiBwYXJ0c1sxXSB8fCBVTktOT1dOX0ZVTkNUSU9OLFxuICAgICAgICAgICAgICAgIGFyZ3M6IHBhcnRzWzJdID8gcGFydHNbMl0uc3BsaXQoJywnKSA6IFtdLFxuICAgICAgICAgICAgICAgIGxpbmU6IHBhcnRzWzRdID8gK3BhcnRzWzRdIDogbnVsbCxcbiAgICAgICAgICAgICAgICBjb2x1bW46IHBhcnRzWzVdID8gK3BhcnRzWzVdIDogbnVsbCxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWVsZW1lbnQuZnVuYyAmJiBlbGVtZW50LmxpbmUpIHtcbiAgICAgICAgICAgIGVsZW1lbnQuZnVuYyA9IFVOS05PV05fRlVOQ1RJT047XG4gICAgICAgIH1cbiAgICAgICAgc3RhY2sucHVzaChlbGVtZW50KTtcbiAgICB9XG4gICAgaWYgKCFzdGFjay5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIG1lc3NhZ2U6IGV4dHJhY3RNZXNzYWdlKGV4KSxcbiAgICAgICAgbmFtZTogZXgubmFtZSxcbiAgICAgICAgc3RhY2s6IHN0YWNrLFxuICAgIH07XG59XG4vKiogSlNEb2MgKi9cbmZ1bmN0aW9uIGNvbXB1dGVTdGFja1RyYWNlRnJvbVN0YWNrdHJhY2VQcm9wKGV4KSB7XG4gICAgaWYgKCFleCB8fCAhZXguc3RhY2t0cmFjZSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgLy8gQWNjZXNzIGFuZCBzdG9yZSB0aGUgc3RhY2t0cmFjZSBwcm9wZXJ0eSBiZWZvcmUgZG9pbmcgQU5ZVEhJTkdcbiAgICAvLyBlbHNlIHRvIGl0IGJlY2F1c2UgT3BlcmEgaXMgbm90IHZlcnkgZ29vZCBhdCBwcm92aWRpbmcgaXRcbiAgICAvLyByZWxpYWJseSBpbiBvdGhlciBjaXJjdW1zdGFuY2VzLlxuICAgIHZhciBzdGFja3RyYWNlID0gZXguc3RhY2t0cmFjZTtcbiAgICB2YXIgb3BlcmExMFJlZ2V4ID0gLyBsaW5lIChcXGQrKS4qc2NyaXB0ICg/OmluICk/KFxcUyspKD86OiBpbiBmdW5jdGlvbiAoXFxTKykpPyQvaTtcbiAgICB2YXIgb3BlcmExMVJlZ2V4ID0gLyBsaW5lIChcXGQrKSwgY29sdW1uIChcXGQrKVxccyooPzppbiAoPzo8YW5vbnltb3VzIGZ1bmN0aW9uOiAoW14+XSspPnwoW15cXCldKykpXFwoKC4qKVxcKSk/IGluICguKik6XFxzKiQvaTtcbiAgICB2YXIgbGluZXMgPSBzdGFja3RyYWNlLnNwbGl0KCdcXG4nKTtcbiAgICB2YXIgc3RhY2sgPSBbXTtcbiAgICB2YXIgcGFydHM7XG4gICAgZm9yICh2YXIgbGluZSA9IDA7IGxpbmUgPCBsaW5lcy5sZW5ndGg7IGxpbmUgKz0gMikge1xuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZTpuby1jb25kaXRpb25hbC1hc3NpZ25tZW50XG4gICAgICAgIHZhciBlbGVtZW50ID0gbnVsbDtcbiAgICAgICAgaWYgKChwYXJ0cyA9IG9wZXJhMTBSZWdleC5leGVjKGxpbmVzW2xpbmVdKSkpIHtcbiAgICAgICAgICAgIGVsZW1lbnQgPSB7XG4gICAgICAgICAgICAgICAgdXJsOiBwYXJ0c1syXSxcbiAgICAgICAgICAgICAgICBmdW5jOiBwYXJ0c1szXSxcbiAgICAgICAgICAgICAgICBhcmdzOiBbXSxcbiAgICAgICAgICAgICAgICBsaW5lOiArcGFydHNbMV0sXG4gICAgICAgICAgICAgICAgY29sdW1uOiBudWxsLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICgocGFydHMgPSBvcGVyYTExUmVnZXguZXhlYyhsaW5lc1tsaW5lXSkpKSB7XG4gICAgICAgICAgICBlbGVtZW50ID0ge1xuICAgICAgICAgICAgICAgIHVybDogcGFydHNbNl0sXG4gICAgICAgICAgICAgICAgZnVuYzogcGFydHNbM10gfHwgcGFydHNbNF0sXG4gICAgICAgICAgICAgICAgYXJnczogcGFydHNbNV0gPyBwYXJ0c1s1XS5zcGxpdCgnLCcpIDogW10sXG4gICAgICAgICAgICAgICAgbGluZTogK3BhcnRzWzFdLFxuICAgICAgICAgICAgICAgIGNvbHVtbjogK3BhcnRzWzJdLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICAgICAgaWYgKCFlbGVtZW50LmZ1bmMgJiYgZWxlbWVudC5saW5lKSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudC5mdW5jID0gVU5LTk9XTl9GVU5DVElPTjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN0YWNrLnB1c2goZWxlbWVudCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFzdGFjay5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIG1lc3NhZ2U6IGV4dHJhY3RNZXNzYWdlKGV4KSxcbiAgICAgICAgbmFtZTogZXgubmFtZSxcbiAgICAgICAgc3RhY2s6IHN0YWNrLFxuICAgIH07XG59XG4vKiogUmVtb3ZlIE4gbnVtYmVyIG9mIGZyYW1lcyBmcm9tIHRoZSBzdGFjayAqL1xuZnVuY3Rpb24gcG9wRnJhbWVzKHN0YWNrdHJhY2UsIHBvcFNpemUpIHtcbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gdHNsaWJfMS5fX2Fzc2lnbih7fSwgc3RhY2t0cmFjZSwgeyBzdGFjazogc3RhY2t0cmFjZS5zdGFjay5zbGljZShwb3BTaXplKSB9KTtcbiAgICB9XG4gICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIHN0YWNrdHJhY2U7XG4gICAgfVxufVxuLyoqXG4gKiBUaGVyZSBhcmUgY2FzZXMgd2hlcmUgc3RhY2t0cmFjZS5tZXNzYWdlIGlzIGFuIEV2ZW50IG9iamVjdFxuICogaHR0cHM6Ly9naXRodWIuY29tL2dldHNlbnRyeS9zZW50cnktamF2YXNjcmlwdC9pc3N1ZXMvMTk0OVxuICogSW4gdGhpcyBzcGVjaWZpYyBjYXNlIHdlIHRyeSB0byBleHRyYWN0IHN0YWNrdHJhY2UubWVzc2FnZS5lcnJvci5tZXNzYWdlXG4gKi9cbmZ1bmN0aW9uIGV4dHJhY3RNZXNzYWdlKGV4KSB7XG4gICAgdmFyIG1lc3NhZ2UgPSBleCAmJiBleC5tZXNzYWdlO1xuICAgIGlmICghbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gJ05vIGVycm9yIG1lc3NhZ2UnO1xuICAgIH1cbiAgICBpZiAobWVzc2FnZS5lcnJvciAmJiB0eXBlb2YgbWVzc2FnZS5lcnJvci5tZXNzYWdlID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gbWVzc2FnZS5lcnJvci5tZXNzYWdlO1xuICAgIH1cbiAgICByZXR1cm4gbWVzc2FnZTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXRyYWNla2l0LmpzLm1hcCIsImltcG9ydCB7IEFQSSB9IGZyb20gJ0BzZW50cnkvY29yZSc7XG5pbXBvcnQgeyBQcm9taXNlQnVmZmVyLCBTZW50cnlFcnJvciB9IGZyb20gJ0BzZW50cnkvdXRpbHMnO1xuLyoqIEJhc2UgVHJhbnNwb3J0IGNsYXNzIGltcGxlbWVudGF0aW9uICovXG52YXIgQmFzZVRyYW5zcG9ydCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBCYXNlVHJhbnNwb3J0KG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICAgICAgLyoqIEEgc2ltcGxlIGJ1ZmZlciBob2xkaW5nIGFsbCByZXF1ZXN0cy4gKi9cbiAgICAgICAgdGhpcy5fYnVmZmVyID0gbmV3IFByb21pc2VCdWZmZXIoMzApO1xuICAgICAgICB0aGlzLl9hcGkgPSBuZXcgQVBJKHRoaXMub3B0aW9ucy5kc24pO1xuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6ZGVwcmVjYXRpb25cbiAgICAgICAgdGhpcy51cmwgPSB0aGlzLl9hcGkuZ2V0U3RvcmVFbmRwb2ludFdpdGhVcmxFbmNvZGVkQXV0aCgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuICAgIEJhc2VUcmFuc3BvcnQucHJvdG90eXBlLnNlbmRFdmVudCA9IGZ1bmN0aW9uIChfKSB7XG4gICAgICAgIHRocm93IG5ldyBTZW50cnlFcnJvcignVHJhbnNwb3J0IENsYXNzIGhhcyB0byBpbXBsZW1lbnQgYHNlbmRFdmVudGAgbWV0aG9kJyk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuICAgIEJhc2VUcmFuc3BvcnQucHJvdG90eXBlLmNsb3NlID0gZnVuY3Rpb24gKHRpbWVvdXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2J1ZmZlci5kcmFpbih0aW1lb3V0KTtcbiAgICB9O1xuICAgIHJldHVybiBCYXNlVHJhbnNwb3J0O1xufSgpKTtcbmV4cG9ydCB7IEJhc2VUcmFuc3BvcnQgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWJhc2UuanMubWFwIiwiaW1wb3J0ICogYXMgdHNsaWJfMSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IGV2ZW50VG9TZW50cnlSZXF1ZXN0IH0gZnJvbSAnQHNlbnRyeS9jb3JlJztcbmltcG9ydCB7IFN0YXR1cyB9IGZyb20gJ0BzZW50cnkvdHlwZXMnO1xuaW1wb3J0IHsgZ2V0R2xvYmFsT2JqZWN0LCBsb2dnZXIsIHBhcnNlUmV0cnlBZnRlckhlYWRlciwgc3VwcG9ydHNSZWZlcnJlclBvbGljeSwgU3luY1Byb21pc2UgfSBmcm9tICdAc2VudHJ5L3V0aWxzJztcbmltcG9ydCB7IEJhc2VUcmFuc3BvcnQgfSBmcm9tICcuL2Jhc2UnO1xudmFyIGdsb2JhbCA9IGdldEdsb2JhbE9iamVjdCgpO1xuLyoqIGBmZXRjaGAgYmFzZWQgdHJhbnNwb3J0ICovXG52YXIgRmV0Y2hUcmFuc3BvcnQgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgdHNsaWJfMS5fX2V4dGVuZHMoRmV0Y2hUcmFuc3BvcnQsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gRmV0Y2hUcmFuc3BvcnQoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlciAhPT0gbnVsbCAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuICAgICAgICAvKiogTG9ja3MgdHJhbnNwb3J0IGFmdGVyIHJlY2VpdmluZyA0MjkgcmVzcG9uc2UgKi9cbiAgICAgICAgX3RoaXMuX2Rpc2FibGVkVW50aWwgPSBuZXcgRGF0ZShEYXRlLm5vdygpKTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuICAgIEZldGNoVHJhbnNwb3J0LnByb3RvdHlwZS5zZW5kRXZlbnQgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgaWYgKG5ldyBEYXRlKERhdGUubm93KCkpIDwgdGhpcy5fZGlzYWJsZWRVbnRpbCkge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KHtcbiAgICAgICAgICAgICAgICBldmVudDogZXZlbnQsXG4gICAgICAgICAgICAgICAgcmVhc29uOiBcIlRyYW5zcG9ydCBsb2NrZWQgdGlsbCBcIiArIHRoaXMuX2Rpc2FibGVkVW50aWwgKyBcIiBkdWUgdG8gdG9vIG1hbnkgcmVxdWVzdHMuXCIsXG4gICAgICAgICAgICAgICAgc3RhdHVzOiA0MjksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgc2VudHJ5UmVxID0gZXZlbnRUb1NlbnRyeVJlcXVlc3QoZXZlbnQsIHRoaXMuX2FwaSk7XG4gICAgICAgIHZhciBvcHRpb25zID0ge1xuICAgICAgICAgICAgYm9keTogc2VudHJ5UmVxLmJvZHksXG4gICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgIC8vIERlc3BpdGUgYWxsIHN0YXJzIGluIHRoZSBza3kgc2F5aW5nIHRoYXQgRWRnZSBzdXBwb3J0cyBvbGQgZHJhZnQgc3ludGF4LCBha2EgJ25ldmVyJywgJ2Fsd2F5cycsICdvcmlnaW4nIGFuZCAnZGVmYXVsdFxuICAgICAgICAgICAgLy8gaHR0cHM6Ly9jYW5pdXNlLmNvbS8jZmVhdD1yZWZlcnJlci1wb2xpY3lcbiAgICAgICAgICAgIC8vIEl0IGRvZXNuJ3QuIEFuZCBpdCB0aHJvdyBleGNlcHRpb24gaW5zdGVhZCBvZiBpZ25vcmluZyB0aGlzIHBhcmFtZXRlci4uLlxuICAgICAgICAgICAgLy8gUkVGOiBodHRwczovL2dpdGh1Yi5jb20vZ2V0c2VudHJ5L3JhdmVuLWpzL2lzc3Vlcy8xMjMzXG4gICAgICAgICAgICByZWZlcnJlclBvbGljeTogKHN1cHBvcnRzUmVmZXJyZXJQb2xpY3koKSA/ICdvcmlnaW4nIDogJycpLFxuICAgICAgICB9O1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmhlYWRlcnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgb3B0aW9ucy5oZWFkZXJzID0gdGhpcy5vcHRpb25zLmhlYWRlcnM7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2J1ZmZlci5hZGQobmV3IFN5bmNQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICAgIGdsb2JhbFxuICAgICAgICAgICAgICAgIC5mZXRjaChzZW50cnlSZXEudXJsLCBvcHRpb25zKVxuICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChyZXNwb25zZSkge1xuICAgICAgICAgICAgICAgIHZhciBzdGF0dXMgPSBTdGF0dXMuZnJvbUh0dHBDb2RlKHJlc3BvbnNlLnN0YXR1cyk7XG4gICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PT0gU3RhdHVzLlN1Y2Nlc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh7IHN0YXR1czogc3RhdHVzIH0pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT09IFN0YXR1cy5SYXRlTGltaXQpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG5vdyA9IERhdGUubm93KCk7XG4gICAgICAgICAgICAgICAgICAgIF90aGlzLl9kaXNhYmxlZFVudGlsID0gbmV3IERhdGUobm93ICsgcGFyc2VSZXRyeUFmdGVySGVhZGVyKG5vdywgcmVzcG9uc2UuaGVhZGVycy5nZXQoJ1JldHJ5LUFmdGVyJykpKTtcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oXCJUb28gbWFueSByZXF1ZXN0cywgYmFja2luZyBvZmYgdGlsbDogXCIgKyBfdGhpcy5fZGlzYWJsZWRVbnRpbCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJlamVjdChyZXNwb25zZSk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5jYXRjaChyZWplY3QpO1xuICAgICAgICB9KSk7XG4gICAgfTtcbiAgICByZXR1cm4gRmV0Y2hUcmFuc3BvcnQ7XG59KEJhc2VUcmFuc3BvcnQpKTtcbmV4cG9ydCB7IEZldGNoVHJhbnNwb3J0IH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1mZXRjaC5qcy5tYXAiLCJleHBvcnQgeyBCYXNlVHJhbnNwb3J0IH0gZnJvbSAnLi9iYXNlJztcbmV4cG9ydCB7IEZldGNoVHJhbnNwb3J0IH0gZnJvbSAnLi9mZXRjaCc7XG5leHBvcnQgeyBYSFJUcmFuc3BvcnQgfSBmcm9tICcuL3hocic7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCJpbXBvcnQgKiBhcyB0c2xpYl8xIGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgZXZlbnRUb1NlbnRyeVJlcXVlc3QgfSBmcm9tICdAc2VudHJ5L2NvcmUnO1xuaW1wb3J0IHsgU3RhdHVzIH0gZnJvbSAnQHNlbnRyeS90eXBlcyc7XG5pbXBvcnQgeyBsb2dnZXIsIHBhcnNlUmV0cnlBZnRlckhlYWRlciwgU3luY1Byb21pc2UgfSBmcm9tICdAc2VudHJ5L3V0aWxzJztcbmltcG9ydCB7IEJhc2VUcmFuc3BvcnQgfSBmcm9tICcuL2Jhc2UnO1xuLyoqIGBYSFJgIGJhc2VkIHRyYW5zcG9ydCAqL1xudmFyIFhIUlRyYW5zcG9ydCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICB0c2xpYl8xLl9fZXh0ZW5kcyhYSFJUcmFuc3BvcnQsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gWEhSVHJhbnNwb3J0KCkge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICAgICAgLyoqIExvY2tzIHRyYW5zcG9ydCBhZnRlciByZWNlaXZpbmcgNDI5IHJlc3BvbnNlICovXG4gICAgICAgIF90aGlzLl9kaXNhYmxlZFVudGlsID0gbmV3IERhdGUoRGF0ZS5ub3coKSk7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGluaGVyaXREb2NcbiAgICAgKi9cbiAgICBYSFJUcmFuc3BvcnQucHJvdG90eXBlLnNlbmRFdmVudCA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICBpZiAobmV3IERhdGUoRGF0ZS5ub3coKSkgPCB0aGlzLl9kaXNhYmxlZFVudGlsKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3Qoe1xuICAgICAgICAgICAgICAgIGV2ZW50OiBldmVudCxcbiAgICAgICAgICAgICAgICByZWFzb246IFwiVHJhbnNwb3J0IGxvY2tlZCB0aWxsIFwiICsgdGhpcy5fZGlzYWJsZWRVbnRpbCArIFwiIGR1ZSB0byB0b28gbWFueSByZXF1ZXN0cy5cIixcbiAgICAgICAgICAgICAgICBzdGF0dXM6IDQyOSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHZhciBzZW50cnlSZXEgPSBldmVudFRvU2VudHJ5UmVxdWVzdChldmVudCwgdGhpcy5fYXBpKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2J1ZmZlci5hZGQobmV3IFN5bmNQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICAgIHZhciByZXF1ZXN0ID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgICAgICAgICByZXF1ZXN0Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBpZiAocmVxdWVzdC5yZWFkeVN0YXRlICE9PSA0KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIHN0YXR1cyA9IFN0YXR1cy5mcm9tSHR0cENvZGUocmVxdWVzdC5zdGF0dXMpO1xuICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT09IFN0YXR1cy5TdWNjZXNzKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoeyBzdGF0dXM6IHN0YXR1cyB9KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09PSBTdGF0dXMuUmF0ZUxpbWl0KSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgICAgICAgICBfdGhpcy5fZGlzYWJsZWRVbnRpbCA9IG5ldyBEYXRlKG5vdyArIHBhcnNlUmV0cnlBZnRlckhlYWRlcihub3csIHJlcXVlc3QuZ2V0UmVzcG9uc2VIZWFkZXIoJ1JldHJ5LUFmdGVyJykpKTtcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oXCJUb28gbWFueSByZXF1ZXN0cywgYmFja2luZyBvZmYgdGlsbDogXCIgKyBfdGhpcy5fZGlzYWJsZWRVbnRpbCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJlamVjdChyZXF1ZXN0KTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXF1ZXN0Lm9wZW4oJ1BPU1QnLCBzZW50cnlSZXEudXJsKTtcbiAgICAgICAgICAgIGZvciAodmFyIGhlYWRlciBpbiBfdGhpcy5vcHRpb25zLmhlYWRlcnMpIHtcbiAgICAgICAgICAgICAgICBpZiAoX3RoaXMub3B0aW9ucy5oZWFkZXJzLmhhc093blByb3BlcnR5KGhlYWRlcikpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5zZXRSZXF1ZXN0SGVhZGVyKGhlYWRlciwgX3RoaXMub3B0aW9ucy5oZWFkZXJzW2hlYWRlcl0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlcXVlc3Quc2VuZChzZW50cnlSZXEuYm9keSk7XG4gICAgICAgIH0pKTtcbiAgICB9O1xuICAgIHJldHVybiBYSFJUcmFuc3BvcnQ7XG59KEJhc2VUcmFuc3BvcnQpKTtcbmV4cG9ydCB7IFhIUlRyYW5zcG9ydCB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9eGhyLmpzLm1hcCIsImV4cG9ydCB2YXIgU0RLX05BTUUgPSAnc2VudHJ5LmphdmFzY3JpcHQuYnJvd3Nlcic7XG5leHBvcnQgdmFyIFNES19WRVJTSU9OID0gJzUuMTYuMSc7XG4vLyMgc291cmNlTWFwcGluZ1VSTD12ZXJzaW9uLmpzLm1hcCIsImltcG9ydCB7IERzbiwgdXJsRW5jb2RlIH0gZnJvbSAnQHNlbnRyeS91dGlscyc7XG52YXIgU0VOVFJZX0FQSV9WRVJTSU9OID0gJzcnO1xuLyoqIEhlbHBlciBjbGFzcyB0byBwcm92aWRlIHVybHMgdG8gZGlmZmVyZW50IFNlbnRyeSBlbmRwb2ludHMuICovXG52YXIgQVBJID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIC8qKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgQVBJICovXG4gICAgZnVuY3Rpb24gQVBJKGRzbikge1xuICAgICAgICB0aGlzLmRzbiA9IGRzbjtcbiAgICAgICAgdGhpcy5fZHNuT2JqZWN0ID0gbmV3IERzbihkc24pO1xuICAgIH1cbiAgICAvKiogUmV0dXJucyB0aGUgRHNuIG9iamVjdC4gKi9cbiAgICBBUEkucHJvdG90eXBlLmdldERzbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Rzbk9iamVjdDtcbiAgICB9O1xuICAgIC8qKiBSZXR1cm5zIHRoZSBwcmVmaXggdG8gY29uc3RydWN0IFNlbnRyeSBpbmdlc3Rpb24gQVBJIGVuZHBvaW50cy4gKi9cbiAgICBBUEkucHJvdG90eXBlLmdldEJhc2VBcGlFbmRwb2ludCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGRzbiA9IHRoaXMuX2Rzbk9iamVjdDtcbiAgICAgICAgdmFyIHByb3RvY29sID0gZHNuLnByb3RvY29sID8gZHNuLnByb3RvY29sICsgXCI6XCIgOiAnJztcbiAgICAgICAgdmFyIHBvcnQgPSBkc24ucG9ydCA/IFwiOlwiICsgZHNuLnBvcnQgOiAnJztcbiAgICAgICAgcmV0dXJuIHByb3RvY29sICsgXCIvL1wiICsgZHNuLmhvc3QgKyBwb3J0ICsgKGRzbi5wYXRoID8gXCIvXCIgKyBkc24ucGF0aCA6ICcnKSArIFwiL2FwaS9cIjtcbiAgICB9O1xuICAgIC8qKiBSZXR1cm5zIHRoZSBzdG9yZSBlbmRwb2ludCBVUkwuICovXG4gICAgQVBJLnByb3RvdHlwZS5nZXRTdG9yZUVuZHBvaW50ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0SW5nZXN0RW5kcG9pbnQoJ3N0b3JlJyk7XG4gICAgfTtcbiAgICAvKiogUmV0dXJucyB0aGUgZW52ZWxvcGUgZW5kcG9pbnQgVVJMLiAqL1xuICAgIEFQSS5wcm90b3R5cGUuX2dldEVudmVsb3BlRW5kcG9pbnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRJbmdlc3RFbmRwb2ludCgnZW52ZWxvcGUnKTtcbiAgICB9O1xuICAgIC8qKiBSZXR1cm5zIHRoZSBpbmdlc3QgQVBJIGVuZHBvaW50IGZvciB0YXJnZXQuICovXG4gICAgQVBJLnByb3RvdHlwZS5fZ2V0SW5nZXN0RW5kcG9pbnQgPSBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgICAgIHZhciBiYXNlID0gdGhpcy5nZXRCYXNlQXBpRW5kcG9pbnQoKTtcbiAgICAgICAgdmFyIGRzbiA9IHRoaXMuX2Rzbk9iamVjdDtcbiAgICAgICAgcmV0dXJuIFwiXCIgKyBiYXNlICsgZHNuLnByb2plY3RJZCArIFwiL1wiICsgdGFyZ2V0ICsgXCIvXCI7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBzdG9yZSBlbmRwb2ludCBVUkwgd2l0aCBhdXRoIGluIHRoZSBxdWVyeSBzdHJpbmcuXG4gICAgICpcbiAgICAgKiBTZW5kaW5nIGF1dGggYXMgcGFydCBvZiB0aGUgcXVlcnkgc3RyaW5nIGFuZCBub3QgYXMgY3VzdG9tIEhUVFAgaGVhZGVycyBhdm9pZHMgQ09SUyBwcmVmbGlnaHQgcmVxdWVzdHMuXG4gICAgICovXG4gICAgQVBJLnByb3RvdHlwZS5nZXRTdG9yZUVuZHBvaW50V2l0aFVybEVuY29kZWRBdXRoID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRTdG9yZUVuZHBvaW50KCkgKyBcIj9cIiArIHRoaXMuX2VuY29kZWRBdXRoKCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBlbnZlbG9wZSBlbmRwb2ludCBVUkwgd2l0aCBhdXRoIGluIHRoZSBxdWVyeSBzdHJpbmcuXG4gICAgICpcbiAgICAgKiBTZW5kaW5nIGF1dGggYXMgcGFydCBvZiB0aGUgcXVlcnkgc3RyaW5nIGFuZCBub3QgYXMgY3VzdG9tIEhUVFAgaGVhZGVycyBhdm9pZHMgQ09SUyBwcmVmbGlnaHQgcmVxdWVzdHMuXG4gICAgICovXG4gICAgQVBJLnByb3RvdHlwZS5nZXRFbnZlbG9wZUVuZHBvaW50V2l0aFVybEVuY29kZWRBdXRoID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0RW52ZWxvcGVFbmRwb2ludCgpICsgXCI/XCIgKyB0aGlzLl9lbmNvZGVkQXV0aCgpO1xuICAgIH07XG4gICAgLyoqIFJldHVybnMgYSBVUkwtZW5jb2RlZCBzdHJpbmcgd2l0aCBhdXRoIGNvbmZpZyBzdWl0YWJsZSBmb3IgYSBxdWVyeSBzdHJpbmcuICovXG4gICAgQVBJLnByb3RvdHlwZS5fZW5jb2RlZEF1dGggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBkc24gPSB0aGlzLl9kc25PYmplY3Q7XG4gICAgICAgIHZhciBhdXRoID0ge1xuICAgICAgICAgICAgLy8gV2Ugc2VuZCBvbmx5IHRoZSBtaW5pbXVtIHNldCBvZiByZXF1aXJlZCBpbmZvcm1hdGlvbi4gU2VlXG4gICAgICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZ2V0c2VudHJ5L3NlbnRyeS1qYXZhc2NyaXB0L2lzc3Vlcy8yNTcyLlxuICAgICAgICAgICAgc2VudHJ5X2tleTogZHNuLnVzZXIsXG4gICAgICAgICAgICBzZW50cnlfdmVyc2lvbjogU0VOVFJZX0FQSV9WRVJTSU9OLFxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gdXJsRW5jb2RlKGF1dGgpO1xuICAgIH07XG4gICAgLyoqIFJldHVybnMgb25seSB0aGUgcGF0aCBjb21wb25lbnQgZm9yIHRoZSBzdG9yZSBlbmRwb2ludC4gKi9cbiAgICBBUEkucHJvdG90eXBlLmdldFN0b3JlRW5kcG9pbnRQYXRoID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZHNuID0gdGhpcy5fZHNuT2JqZWN0O1xuICAgICAgICByZXR1cm4gKGRzbi5wYXRoID8gXCIvXCIgKyBkc24ucGF0aCA6ICcnKSArIFwiL2FwaS9cIiArIGRzbi5wcm9qZWN0SWQgKyBcIi9zdG9yZS9cIjtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYW4gb2JqZWN0IHRoYXQgY2FuIGJlIHVzZWQgaW4gcmVxdWVzdCBoZWFkZXJzLlxuICAgICAqIFRoaXMgaXMgbmVlZGVkIGZvciBub2RlIGFuZCB0aGUgb2xkIC9zdG9yZSBlbmRwb2ludCBpbiBzZW50cnlcbiAgICAgKi9cbiAgICBBUEkucHJvdG90eXBlLmdldFJlcXVlc3RIZWFkZXJzID0gZnVuY3Rpb24gKGNsaWVudE5hbWUsIGNsaWVudFZlcnNpb24pIHtcbiAgICAgICAgdmFyIGRzbiA9IHRoaXMuX2Rzbk9iamVjdDtcbiAgICAgICAgdmFyIGhlYWRlciA9IFtcIlNlbnRyeSBzZW50cnlfdmVyc2lvbj1cIiArIFNFTlRSWV9BUElfVkVSU0lPTl07XG4gICAgICAgIGhlYWRlci5wdXNoKFwic2VudHJ5X2NsaWVudD1cIiArIGNsaWVudE5hbWUgKyBcIi9cIiArIGNsaWVudFZlcnNpb24pO1xuICAgICAgICBoZWFkZXIucHVzaChcInNlbnRyeV9rZXk9XCIgKyBkc24udXNlcik7XG4gICAgICAgIGlmIChkc24ucGFzcykge1xuICAgICAgICAgICAgaGVhZGVyLnB1c2goXCJzZW50cnlfc2VjcmV0PVwiICsgZHNuLnBhc3MpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgJ1gtU2VudHJ5LUF1dGgnOiBoZWFkZXIuam9pbignLCAnKSxcbiAgICAgICAgfTtcbiAgICB9O1xuICAgIC8qKiBSZXR1cm5zIHRoZSB1cmwgdG8gdGhlIHJlcG9ydCBkaWFsb2cgZW5kcG9pbnQuICovXG4gICAgQVBJLnByb3RvdHlwZS5nZXRSZXBvcnREaWFsb2dFbmRwb2ludCA9IGZ1bmN0aW9uIChkaWFsb2dPcHRpb25zKSB7XG4gICAgICAgIGlmIChkaWFsb2dPcHRpb25zID09PSB2b2lkIDApIHsgZGlhbG9nT3B0aW9ucyA9IHt9OyB9XG4gICAgICAgIHZhciBkc24gPSB0aGlzLl9kc25PYmplY3Q7XG4gICAgICAgIHZhciBlbmRwb2ludCA9IHRoaXMuZ2V0QmFzZUFwaUVuZHBvaW50KCkgKyBcImVtYmVkL2Vycm9yLXBhZ2UvXCI7XG4gICAgICAgIHZhciBlbmNvZGVkT3B0aW9ucyA9IFtdO1xuICAgICAgICBlbmNvZGVkT3B0aW9ucy5wdXNoKFwiZHNuPVwiICsgZHNuLnRvU3RyaW5nKCkpO1xuICAgICAgICBmb3IgKHZhciBrZXkgaW4gZGlhbG9nT3B0aW9ucykge1xuICAgICAgICAgICAgaWYgKGtleSA9PT0gJ3VzZXInKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFkaWFsb2dPcHRpb25zLnVzZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChkaWFsb2dPcHRpb25zLnVzZXIubmFtZSkge1xuICAgICAgICAgICAgICAgICAgICBlbmNvZGVkT3B0aW9ucy5wdXNoKFwibmFtZT1cIiArIGVuY29kZVVSSUNvbXBvbmVudChkaWFsb2dPcHRpb25zLnVzZXIubmFtZSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoZGlhbG9nT3B0aW9ucy51c2VyLmVtYWlsKSB7XG4gICAgICAgICAgICAgICAgICAgIGVuY29kZWRPcHRpb25zLnB1c2goXCJlbWFpbD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChkaWFsb2dPcHRpb25zLnVzZXIuZW1haWwpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBlbmNvZGVkT3B0aW9ucy5wdXNoKGVuY29kZVVSSUNvbXBvbmVudChrZXkpICsgXCI9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoZGlhbG9nT3B0aW9uc1trZXldKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVuY29kZWRPcHRpb25zLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIGVuZHBvaW50ICsgXCI/XCIgKyBlbmNvZGVkT3B0aW9ucy5qb2luKCcmJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVuZHBvaW50O1xuICAgIH07XG4gICAgcmV0dXJuIEFQSTtcbn0oKSk7XG5leHBvcnQgeyBBUEkgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWFwaS5qcy5tYXAiLCJpbXBvcnQgeyBsb2dnZXIsIFNlbnRyeUVycm9yIH0gZnJvbSAnQHNlbnRyeS91dGlscyc7XG5pbXBvcnQgeyBOb29wVHJhbnNwb3J0IH0gZnJvbSAnLi90cmFuc3BvcnRzL25vb3AnO1xuLyoqXG4gKiBUaGlzIGlzIHRoZSBiYXNlIGltcGxlbWVudGlvbiBvZiBhIEJhY2tlbmQuXG4gKiBAaGlkZGVuXG4gKi9cbnZhciBCYXNlQmFja2VuZCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAvKiogQ3JlYXRlcyBhIG5ldyBiYWNrZW5kIGluc3RhbmNlLiAqL1xuICAgIGZ1bmN0aW9uIEJhc2VCYWNrZW5kKG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5fb3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgICAgIGlmICghdGhpcy5fb3B0aW9ucy5kc24pIHtcbiAgICAgICAgICAgIGxvZ2dlci53YXJuKCdObyBEU04gcHJvdmlkZWQsIGJhY2tlbmQgd2lsbCBub3QgZG8gYW55dGhpbmcuJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fdHJhbnNwb3J0ID0gdGhpcy5fc2V0dXBUcmFuc3BvcnQoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyB1cCB0aGUgdHJhbnNwb3J0IHNvIGl0IGNhbiBiZSB1c2VkIGxhdGVyIHRvIHNlbmQgcmVxdWVzdHMuXG4gICAgICovXG4gICAgQmFzZUJhY2tlbmQucHJvdG90eXBlLl9zZXR1cFRyYW5zcG9ydCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBOb29wVHJhbnNwb3J0KCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuICAgIEJhc2VCYWNrZW5kLnByb3RvdHlwZS5ldmVudEZyb21FeGNlcHRpb24gPSBmdW5jdGlvbiAoX2V4Y2VwdGlvbiwgX2hpbnQpIHtcbiAgICAgICAgdGhyb3cgbmV3IFNlbnRyeUVycm9yKCdCYWNrZW5kIGhhcyB0byBpbXBsZW1lbnQgYGV2ZW50RnJvbUV4Y2VwdGlvbmAgbWV0aG9kJyk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuICAgIEJhc2VCYWNrZW5kLnByb3RvdHlwZS5ldmVudEZyb21NZXNzYWdlID0gZnVuY3Rpb24gKF9tZXNzYWdlLCBfbGV2ZWwsIF9oaW50KSB7XG4gICAgICAgIHRocm93IG5ldyBTZW50cnlFcnJvcignQmFja2VuZCBoYXMgdG8gaW1wbGVtZW50IGBldmVudEZyb21NZXNzYWdlYCBtZXRob2QnKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEBpbmhlcml0RG9jXG4gICAgICovXG4gICAgQmFzZUJhY2tlbmQucHJvdG90eXBlLnNlbmRFdmVudCA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICB0aGlzLl90cmFuc3BvcnQuc2VuZEV2ZW50KGV2ZW50KS50aGVuKG51bGwsIGZ1bmN0aW9uIChyZWFzb24pIHtcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcihcIkVycm9yIHdoaWxlIHNlbmRpbmcgZXZlbnQ6IFwiICsgcmVhc29uKTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuICAgIEJhc2VCYWNrZW5kLnByb3RvdHlwZS5nZXRUcmFuc3BvcnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQ7XG4gICAgfTtcbiAgICByZXR1cm4gQmFzZUJhY2tlbmQ7XG59KCkpO1xuZXhwb3J0IHsgQmFzZUJhY2tlbmQgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWJhc2ViYWNrZW5kLmpzLm1hcCIsImltcG9ydCAqIGFzIHRzbGliXzEgZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBTY29wZSB9IGZyb20gJ0BzZW50cnkvaHViJztcbmltcG9ydCB7IERzbiwgaXNQcmltaXRpdmUsIGlzVGhlbmFibGUsIGxvZ2dlciwgbm9ybWFsaXplLCBTeW5jUHJvbWlzZSwgdGltZXN0YW1wV2l0aE1zLCB0cnVuY2F0ZSwgdXVpZDQsIH0gZnJvbSAnQHNlbnRyeS91dGlscyc7XG5pbXBvcnQgeyBzZXR1cEludGVncmF0aW9ucyB9IGZyb20gJy4vaW50ZWdyYXRpb24nO1xuLyoqXG4gKiBCYXNlIGltcGxlbWVudGF0aW9uIGZvciBhbGwgSmF2YVNjcmlwdCBTREsgY2xpZW50cy5cbiAqXG4gKiBDYWxsIHRoZSBjb25zdHJ1Y3RvciB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIGJhY2tlbmQgY29uc3RydWN0b3IgYW5kIG9wdGlvbnNcbiAqIHNwZWNpZmljIHRvIHRoZSBjbGllbnQgc3ViY2xhc3MuIFRvIGFjY2VzcyB0aGVzZSBvcHRpb25zIGxhdGVyLCB1c2VcbiAqIHtAbGluayBDbGllbnQuZ2V0T3B0aW9uc30uIEFsc28sIHRoZSBCYWNrZW5kIGluc3RhbmNlIGlzIGF2YWlsYWJsZSB2aWFcbiAqIHtAbGluayBDbGllbnQuZ2V0QmFja2VuZH0uXG4gKlxuICogSWYgYSBEc24gaXMgc3BlY2lmaWVkIGluIHRoZSBvcHRpb25zLCBpdCB3aWxsIGJlIHBhcnNlZCBhbmQgc3RvcmVkLiBVc2VcbiAqIHtAbGluayBDbGllbnQuZ2V0RHNufSB0byByZXRyaWV2ZSB0aGUgRHNuIGF0IGFueSBtb21lbnQuIEluIGNhc2UgdGhlIERzbiBpc1xuICogaW52YWxpZCwgdGhlIGNvbnN0cnVjdG9yIHdpbGwgdGhyb3cgYSB7QGxpbmsgU2VudHJ5RXhjZXB0aW9ufS4gTm90ZSB0aGF0XG4gKiB3aXRob3V0IGEgdmFsaWQgRHNuLCB0aGUgU0RLIHdpbGwgbm90IHNlbmQgYW55IGV2ZW50cyB0byBTZW50cnkuXG4gKlxuICogQmVmb3JlIHNlbmRpbmcgYW4gZXZlbnQgdmlhIHRoZSBiYWNrZW5kLCBpdCBpcyBwYXNzZWQgdGhyb3VnaFxuICoge0BsaW5rIEJhc2VDbGllbnQucHJlcGFyZUV2ZW50fSB0byBhZGQgU0RLIGluZm9ybWF0aW9uIGFuZCBzY29wZSBkYXRhXG4gKiAoYnJlYWRjcnVtYnMgYW5kIGNvbnRleHQpLiBUbyBhZGQgbW9yZSBjdXN0b20gaW5mb3JtYXRpb24sIG92ZXJyaWRlIHRoaXNcbiAqIG1ldGhvZCBhbmQgZXh0ZW5kIHRoZSByZXN1bHRpbmcgcHJlcGFyZWQgZXZlbnQuXG4gKlxuICogVG8gaXNzdWUgYXV0b21hdGljYWxseSBjcmVhdGVkIGV2ZW50cyAoZS5nLiB2aWEgaW5zdHJ1bWVudGF0aW9uKSwgdXNlXG4gKiB7QGxpbmsgQ2xpZW50LmNhcHR1cmVFdmVudH0uIEl0IHdpbGwgcHJlcGFyZSB0aGUgZXZlbnQgYW5kIHBhc3MgaXQgdGhyb3VnaFxuICogdGhlIGNhbGxiYWNrIGxpZmVjeWNsZS4gVG8gaXNzdWUgYXV0by1icmVhZGNydW1icywgdXNlXG4gKiB7QGxpbmsgQ2xpZW50LmFkZEJyZWFkY3J1bWJ9LlxuICpcbiAqIEBleGFtcGxlXG4gKiBjbGFzcyBOb2RlQ2xpZW50IGV4dGVuZHMgQmFzZUNsaWVudDxOb2RlQmFja2VuZCwgTm9kZU9wdGlvbnM+IHtcbiAqICAgcHVibGljIGNvbnN0cnVjdG9yKG9wdGlvbnM6IE5vZGVPcHRpb25zKSB7XG4gKiAgICAgc3VwZXIoTm9kZUJhY2tlbmQsIG9wdGlvbnMpO1xuICogICB9XG4gKlxuICogICAvLyAuLi5cbiAqIH1cbiAqL1xudmFyIEJhc2VDbGllbnQgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgLyoqXG4gICAgICogSW5pdGlhbGl6ZXMgdGhpcyBjbGllbnQgaW5zdGFuY2UuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gYmFja2VuZENsYXNzIEEgY29uc3RydWN0b3IgZnVuY3Rpb24gdG8gY3JlYXRlIHRoZSBiYWNrZW5kLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgZm9yIHRoZSBjbGllbnQuXG4gICAgICovXG4gICAgZnVuY3Rpb24gQmFzZUNsaWVudChiYWNrZW5kQ2xhc3MsIG9wdGlvbnMpIHtcbiAgICAgICAgLyoqIEFycmF5IG9mIHVzZWQgaW50ZWdyYXRpb25zLiAqL1xuICAgICAgICB0aGlzLl9pbnRlZ3JhdGlvbnMgPSB7fTtcbiAgICAgICAgLyoqIElzIHRoZSBjbGllbnQgc3RpbGwgcHJvY2Vzc2luZyBhIGNhbGw/ICovXG4gICAgICAgIHRoaXMuX3Byb2Nlc3NpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fYmFja2VuZCA9IG5ldyBiYWNrZW5kQ2xhc3Mob3B0aW9ucyk7XG4gICAgICAgIHRoaXMuX29wdGlvbnMgPSBvcHRpb25zO1xuICAgICAgICBpZiAob3B0aW9ucy5kc24pIHtcbiAgICAgICAgICAgIHRoaXMuX2RzbiA9IG5ldyBEc24ob3B0aW9ucy5kc24pO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBpbmhlcml0RG9jXG4gICAgICovXG4gICAgQmFzZUNsaWVudC5wcm90b3R5cGUuY2FwdHVyZUV4Y2VwdGlvbiA9IGZ1bmN0aW9uIChleGNlcHRpb24sIGhpbnQsIHNjb3BlKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBldmVudElkID0gaGludCAmJiBoaW50LmV2ZW50X2lkO1xuICAgICAgICB0aGlzLl9wcm9jZXNzaW5nID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5fZ2V0QmFja2VuZCgpXG4gICAgICAgICAgICAuZXZlbnRGcm9tRXhjZXB0aW9uKGV4Y2VwdGlvbiwgaGludClcbiAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgICAgZXZlbnRJZCA9IF90aGlzLmNhcHR1cmVFdmVudChldmVudCwgaGludCwgc2NvcGUpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGV2ZW50SWQ7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuICAgIEJhc2VDbGllbnQucHJvdG90eXBlLmNhcHR1cmVNZXNzYWdlID0gZnVuY3Rpb24gKG1lc3NhZ2UsIGxldmVsLCBoaW50LCBzY29wZSkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgZXZlbnRJZCA9IGhpbnQgJiYgaGludC5ldmVudF9pZDtcbiAgICAgICAgdGhpcy5fcHJvY2Vzc2luZyA9IHRydWU7XG4gICAgICAgIHZhciBwcm9taXNlZEV2ZW50ID0gaXNQcmltaXRpdmUobWVzc2FnZSlcbiAgICAgICAgICAgID8gdGhpcy5fZ2V0QmFja2VuZCgpLmV2ZW50RnJvbU1lc3NhZ2UoXCJcIiArIG1lc3NhZ2UsIGxldmVsLCBoaW50KVxuICAgICAgICAgICAgOiB0aGlzLl9nZXRCYWNrZW5kKCkuZXZlbnRGcm9tRXhjZXB0aW9uKG1lc3NhZ2UsIGhpbnQpO1xuICAgICAgICBwcm9taXNlZEV2ZW50LnRoZW4oZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgICBldmVudElkID0gX3RoaXMuY2FwdHVyZUV2ZW50KGV2ZW50LCBoaW50LCBzY29wZSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gZXZlbnRJZDtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEBpbmhlcml0RG9jXG4gICAgICovXG4gICAgQmFzZUNsaWVudC5wcm90b3R5cGUuY2FwdHVyZUV2ZW50ID0gZnVuY3Rpb24gKGV2ZW50LCBoaW50LCBzY29wZSkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgZXZlbnRJZCA9IGhpbnQgJiYgaGludC5ldmVudF9pZDtcbiAgICAgICAgdGhpcy5fcHJvY2Vzc2luZyA9IHRydWU7XG4gICAgICAgIHRoaXMuX3Byb2Nlc3NFdmVudChldmVudCwgaGludCwgc2NvcGUpXG4gICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoZmluYWxFdmVudCkge1xuICAgICAgICAgICAgLy8gV2UgbmVlZCB0byBjaGVjayBmb3IgZmluYWxFdmVudCBpbiBjYXNlIGJlZm9yZVNlbmQgcmV0dXJuZWQgbnVsbFxuICAgICAgICAgICAgZXZlbnRJZCA9IGZpbmFsRXZlbnQgJiYgZmluYWxFdmVudC5ldmVudF9pZDtcbiAgICAgICAgICAgIF90aGlzLl9wcm9jZXNzaW5nID0gZmFsc2U7XG4gICAgICAgIH0pXG4gICAgICAgICAgICAudGhlbihudWxsLCBmdW5jdGlvbiAocmVhc29uKSB7XG4gICAgICAgICAgICBsb2dnZXIuZXJyb3IocmVhc29uKTtcbiAgICAgICAgICAgIF90aGlzLl9wcm9jZXNzaW5nID0gZmFsc2U7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gZXZlbnRJZDtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEBpbmhlcml0RG9jXG4gICAgICovXG4gICAgQmFzZUNsaWVudC5wcm90b3R5cGUuZ2V0RHNuID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZHNuO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQGluaGVyaXREb2NcbiAgICAgKi9cbiAgICBCYXNlQ2xpZW50LnByb3RvdHlwZS5nZXRPcHRpb25zID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fb3B0aW9ucztcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEBpbmhlcml0RG9jXG4gICAgICovXG4gICAgQmFzZUNsaWVudC5wcm90b3R5cGUuZmx1c2ggPSBmdW5jdGlvbiAodGltZW91dCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICByZXR1cm4gdGhpcy5faXNDbGllbnRQcm9jZXNzaW5nKHRpbWVvdXQpLnRoZW4oZnVuY3Rpb24gKHN0YXR1cykge1xuICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChzdGF0dXMuaW50ZXJ2YWwpO1xuICAgICAgICAgICAgcmV0dXJuIF90aGlzLl9nZXRCYWNrZW5kKClcbiAgICAgICAgICAgICAgICAuZ2V0VHJhbnNwb3J0KClcbiAgICAgICAgICAgICAgICAuY2xvc2UodGltZW91dClcbiAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbiAodHJhbnNwb3J0Rmx1c2hlZCkgeyByZXR1cm4gc3RhdHVzLnJlYWR5ICYmIHRyYW5zcG9ydEZsdXNoZWQ7IH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEBpbmhlcml0RG9jXG4gICAgICovXG4gICAgQmFzZUNsaWVudC5wcm90b3R5cGUuY2xvc2UgPSBmdW5jdGlvbiAodGltZW91dCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICByZXR1cm4gdGhpcy5mbHVzaCh0aW1lb3V0KS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHtcbiAgICAgICAgICAgIF90aGlzLmdldE9wdGlvbnMoKS5lbmFibGVkID0gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFNldHMgdXAgdGhlIGludGVncmF0aW9uc1xuICAgICAqL1xuICAgIEJhc2VDbGllbnQucHJvdG90eXBlLnNldHVwSW50ZWdyYXRpb25zID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5faXNFbmFibGVkKCkpIHtcbiAgICAgICAgICAgIHRoaXMuX2ludGVncmF0aW9ucyA9IHNldHVwSW50ZWdyYXRpb25zKHRoaXMuX29wdGlvbnMpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuICAgIEJhc2VDbGllbnQucHJvdG90eXBlLmdldEludGVncmF0aW9uID0gZnVuY3Rpb24gKGludGVncmF0aW9uKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5faW50ZWdyYXRpb25zW2ludGVncmF0aW9uLmlkXSB8fCBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChfb08pIHtcbiAgICAgICAgICAgIGxvZ2dlci53YXJuKFwiQ2Fubm90IHJldHJpZXZlIGludGVncmF0aW9uIFwiICsgaW50ZWdyYXRpb24uaWQgKyBcIiBmcm9tIHRoZSBjdXJyZW50IENsaWVudFwiKTtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKiogV2FpdHMgZm9yIHRoZSBjbGllbnQgdG8gYmUgZG9uZSB3aXRoIHByb2Nlc3NpbmcuICovXG4gICAgQmFzZUNsaWVudC5wcm90b3R5cGUuX2lzQ2xpZW50UHJvY2Vzc2luZyA9IGZ1bmN0aW9uICh0aW1lb3V0KSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHJldHVybiBuZXcgU3luY1Byb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICAgICAgICAgIHZhciB0aWNrZWQgPSAwO1xuICAgICAgICAgICAgdmFyIHRpY2sgPSAxO1xuICAgICAgICAgICAgdmFyIGludGVydmFsID0gMDtcbiAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWwpO1xuICAgICAgICAgICAgaW50ZXJ2YWwgPSBzZXRJbnRlcnZhbChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFfdGhpcy5fcHJvY2Vzc2luZykge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGludGVydmFsOiBpbnRlcnZhbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlYWR5OiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRpY2tlZCArPSB0aWNrO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGltZW91dCAmJiB0aWNrZWQgPj0gdGltZW91dCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJ2YWw6IGludGVydmFsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWR5OiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwgdGljayk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqIFJldHVybnMgdGhlIGN1cnJlbnQgYmFja2VuZC4gKi9cbiAgICBCYXNlQ2xpZW50LnByb3RvdHlwZS5fZ2V0QmFja2VuZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2JhY2tlbmQ7XG4gICAgfTtcbiAgICAvKiogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoaXMgU0RLIGlzIGVuYWJsZWQgYW5kIGEgdmFsaWQgRHNuIGlzIHByZXNlbnQuICovXG4gICAgQmFzZUNsaWVudC5wcm90b3R5cGUuX2lzRW5hYmxlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T3B0aW9ucygpLmVuYWJsZWQgIT09IGZhbHNlICYmIHRoaXMuX2RzbiAhPT0gdW5kZWZpbmVkO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQWRkcyBjb21tb24gaW5mb3JtYXRpb24gdG8gZXZlbnRzLlxuICAgICAqXG4gICAgICogVGhlIGluZm9ybWF0aW9uIGluY2x1ZGVzIHJlbGVhc2UgYW5kIGVudmlyb25tZW50IGZyb20gYG9wdGlvbnNgLFxuICAgICAqIGJyZWFkY3J1bWJzIGFuZCBjb250ZXh0IChleHRyYSwgdGFncyBhbmQgdXNlcikgZnJvbSB0aGUgc2NvcGUuXG4gICAgICpcbiAgICAgKiBJbmZvcm1hdGlvbiB0aGF0IGlzIGFscmVhZHkgcHJlc2VudCBpbiB0aGUgZXZlbnQgaXMgbmV2ZXIgb3ZlcndyaXR0ZW4uIEZvclxuICAgICAqIG5lc3RlZCBvYmplY3RzLCBzdWNoIGFzIHRoZSBjb250ZXh0LCBrZXlzIGFyZSBtZXJnZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZXZlbnQgVGhlIG9yaWdpbmFsIGV2ZW50LlxuICAgICAqIEBwYXJhbSBoaW50IE1heSBjb250YWluIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG9yaWdpbmFsIGV4Y2VwdGlvbi5cbiAgICAgKiBAcGFyYW0gc2NvcGUgQSBzY29wZSBjb250YWluaW5nIGV2ZW50IG1ldGFkYXRhLlxuICAgICAqIEByZXR1cm5zIEEgbmV3IGV2ZW50IHdpdGggbW9yZSBpbmZvcm1hdGlvbi5cbiAgICAgKi9cbiAgICBCYXNlQ2xpZW50LnByb3RvdHlwZS5fcHJlcGFyZUV2ZW50ID0gZnVuY3Rpb24gKGV2ZW50LCBzY29wZSwgaGludCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgX2EgPSB0aGlzLmdldE9wdGlvbnMoKS5ub3JtYWxpemVEZXB0aCwgbm9ybWFsaXplRGVwdGggPSBfYSA9PT0gdm9pZCAwID8gMyA6IF9hO1xuICAgICAgICB2YXIgcHJlcGFyZWQgPSB0c2xpYl8xLl9fYXNzaWduKHt9LCBldmVudCwgeyBldmVudF9pZDogZXZlbnQuZXZlbnRfaWQgfHwgKGhpbnQgJiYgaGludC5ldmVudF9pZCA/IGhpbnQuZXZlbnRfaWQgOiB1dWlkNCgpKSwgdGltZXN0YW1wOiBldmVudC50aW1lc3RhbXAgfHwgdGltZXN0YW1wV2l0aE1zKCkgfSk7XG4gICAgICAgIHRoaXMuX2FwcGx5Q2xpZW50T3B0aW9ucyhwcmVwYXJlZCk7XG4gICAgICAgIHRoaXMuX2FwcGx5SW50ZWdyYXRpb25zTWV0YWRhdGEocHJlcGFyZWQpO1xuICAgICAgICAvLyBJZiB3ZSBoYXZlIHNjb3BlIGdpdmVuIHRvIHVzLCB1c2UgaXQgYXMgdGhlIGJhc2UgZm9yIGZ1cnRoZXIgbW9kaWZpY2F0aW9ucy5cbiAgICAgICAgLy8gVGhpcyBhbGxvd3MgdXMgdG8gcHJldmVudCB1bm5lY2Vzc2FyeSBjb3B5aW5nIG9mIGRhdGEgaWYgYGNhcHR1cmVDb250ZXh0YCBpcyBub3QgcHJvdmlkZWQuXG4gICAgICAgIHZhciBmaW5hbFNjb3BlID0gc2NvcGU7XG4gICAgICAgIGlmIChoaW50ICYmIGhpbnQuY2FwdHVyZUNvbnRleHQpIHtcbiAgICAgICAgICAgIGZpbmFsU2NvcGUgPSBTY29wZS5jbG9uZShmaW5hbFNjb3BlKS51cGRhdGUoaGludC5jYXB0dXJlQ29udGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gV2UgcHJlcGFyZSB0aGUgcmVzdWx0IGhlcmUgd2l0aCBhIHJlc29sdmVkIEV2ZW50LlxuICAgICAgICB2YXIgcmVzdWx0ID0gU3luY1Byb21pc2UucmVzb2x2ZShwcmVwYXJlZCk7XG4gICAgICAgIC8vIFRoaXMgc2hvdWxkIGJlIHRoZSBsYXN0IHRoaW5nIGNhbGxlZCwgc2luY2Ugd2Ugd2FudCB0aGF0XG4gICAgICAgIC8vIHtAbGluayBIdWIuYWRkRXZlbnRQcm9jZXNzb3J9IGdldHMgdGhlIGZpbmlzaGVkIHByZXBhcmVkIGV2ZW50LlxuICAgICAgICBpZiAoZmluYWxTY29wZSkge1xuICAgICAgICAgICAgLy8gSW4gY2FzZSB3ZSBoYXZlIGEgaHViIHdlIHJlYXNzaWduIGl0LlxuICAgICAgICAgICAgcmVzdWx0ID0gZmluYWxTY29wZS5hcHBseVRvRXZlbnQocHJlcGFyZWQsIGhpbnQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQudGhlbihmdW5jdGlvbiAoZXZ0KSB7XG4gICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6c3RyaWN0LXR5cGUtcHJlZGljYXRlc1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBub3JtYWxpemVEZXB0aCA9PT0gJ251bWJlcicgJiYgbm9ybWFsaXplRGVwdGggPiAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF90aGlzLl9ub3JtYWxpemVFdmVudChldnQsIG5vcm1hbGl6ZURlcHRoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBldnQ7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQXBwbGllcyBgbm9ybWFsaXplYCBmdW5jdGlvbiBvbiBuZWNlc3NhcnkgYEV2ZW50YCBhdHRyaWJ1dGVzIHRvIG1ha2UgdGhlbSBzYWZlIGZvciBzZXJpYWxpemF0aW9uLlxuICAgICAqIE5vcm1hbGl6ZWQga2V5czpcbiAgICAgKiAtIGBicmVhZGNydW1icy5kYXRhYFxuICAgICAqIC0gYHVzZXJgXG4gICAgICogLSBgY29udGV4dHNgXG4gICAgICogLSBgZXh0cmFgXG4gICAgICogQHBhcmFtIGV2ZW50IEV2ZW50XG4gICAgICogQHJldHVybnMgTm9ybWFsaXplZCBldmVudFxuICAgICAqL1xuICAgIEJhc2VDbGllbnQucHJvdG90eXBlLl9ub3JtYWxpemVFdmVudCA9IGZ1bmN0aW9uIChldmVudCwgZGVwdGgpIHtcbiAgICAgICAgaWYgKCFldmVudCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGU6bm8tdW5zYWZlLWFueVxuICAgICAgICByZXR1cm4gdHNsaWJfMS5fX2Fzc2lnbih7fSwgZXZlbnQsIChldmVudC5icmVhZGNydW1icyAmJiB7XG4gICAgICAgICAgICBicmVhZGNydW1iczogZXZlbnQuYnJlYWRjcnVtYnMubWFwKGZ1bmN0aW9uIChiKSB7IHJldHVybiAodHNsaWJfMS5fX2Fzc2lnbih7fSwgYiwgKGIuZGF0YSAmJiB7XG4gICAgICAgICAgICAgICAgZGF0YTogbm9ybWFsaXplKGIuZGF0YSwgZGVwdGgpLFxuICAgICAgICAgICAgfSkpKTsgfSksXG4gICAgICAgIH0pLCAoZXZlbnQudXNlciAmJiB7XG4gICAgICAgICAgICB1c2VyOiBub3JtYWxpemUoZXZlbnQudXNlciwgZGVwdGgpLFxuICAgICAgICB9KSwgKGV2ZW50LmNvbnRleHRzICYmIHtcbiAgICAgICAgICAgIGNvbnRleHRzOiBub3JtYWxpemUoZXZlbnQuY29udGV4dHMsIGRlcHRoKSxcbiAgICAgICAgfSksIChldmVudC5leHRyYSAmJiB7XG4gICAgICAgICAgICBleHRyYTogbm9ybWFsaXplKGV2ZW50LmV4dHJhLCBkZXB0aCksXG4gICAgICAgIH0pKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqICBFbmhhbmNlcyBldmVudCB1c2luZyB0aGUgY2xpZW50IGNvbmZpZ3VyYXRpb24uXG4gICAgICogIEl0IHRha2VzIGNhcmUgb2YgYWxsIFwic3RhdGljXCIgdmFsdWVzIGxpa2UgZW52aXJvbm1lbnQsIHJlbGVhc2UgYW5kIGBkaXN0YCxcbiAgICAgKiAgYXMgd2VsbCBhcyB0cnVuY2F0aW5nIG92ZXJseSBsb25nIHZhbHVlcy5cbiAgICAgKiBAcGFyYW0gZXZlbnQgZXZlbnQgaW5zdGFuY2UgdG8gYmUgZW5oYW5jZWRcbiAgICAgKi9cbiAgICBCYXNlQ2xpZW50LnByb3RvdHlwZS5fYXBwbHlDbGllbnRPcHRpb25zID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIHZhciBfYSA9IHRoaXMuZ2V0T3B0aW9ucygpLCBlbnZpcm9ubWVudCA9IF9hLmVudmlyb25tZW50LCByZWxlYXNlID0gX2EucmVsZWFzZSwgZGlzdCA9IF9hLmRpc3QsIF9iID0gX2EubWF4VmFsdWVMZW5ndGgsIG1heFZhbHVlTGVuZ3RoID0gX2IgPT09IHZvaWQgMCA/IDI1MCA6IF9iO1xuICAgICAgICBpZiAoZXZlbnQuZW52aXJvbm1lbnQgPT09IHVuZGVmaW5lZCAmJiBlbnZpcm9ubWVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBldmVudC5lbnZpcm9ubWVudCA9IGVudmlyb25tZW50O1xuICAgICAgICB9XG4gICAgICAgIGlmIChldmVudC5yZWxlYXNlID09PSB1bmRlZmluZWQgJiYgcmVsZWFzZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBldmVudC5yZWxlYXNlID0gcmVsZWFzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXZlbnQuZGlzdCA9PT0gdW5kZWZpbmVkICYmIGRpc3QgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZXZlbnQuZGlzdCA9IGRpc3Q7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV2ZW50Lm1lc3NhZ2UpIHtcbiAgICAgICAgICAgIGV2ZW50Lm1lc3NhZ2UgPSB0cnVuY2F0ZShldmVudC5tZXNzYWdlLCBtYXhWYWx1ZUxlbmd0aCk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGV4Y2VwdGlvbiA9IGV2ZW50LmV4Y2VwdGlvbiAmJiBldmVudC5leGNlcHRpb24udmFsdWVzICYmIGV2ZW50LmV4Y2VwdGlvbi52YWx1ZXNbMF07XG4gICAgICAgIGlmIChleGNlcHRpb24gJiYgZXhjZXB0aW9uLnZhbHVlKSB7XG4gICAgICAgICAgICBleGNlcHRpb24udmFsdWUgPSB0cnVuY2F0ZShleGNlcHRpb24udmFsdWUsIG1heFZhbHVlTGVuZ3RoKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcmVxdWVzdCA9IGV2ZW50LnJlcXVlc3Q7XG4gICAgICAgIGlmIChyZXF1ZXN0ICYmIHJlcXVlc3QudXJsKSB7XG4gICAgICAgICAgICByZXF1ZXN0LnVybCA9IHRydW5jYXRlKHJlcXVlc3QudXJsLCBtYXhWYWx1ZUxlbmd0aCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gYWRkcyBhbGwgdXNlZCBpbnRlZ3JhdGlvbnMgdG8gdGhlIFNESyBpbmZvIGluIHRoZSBldmVudC5cbiAgICAgKiBAcGFyYW0gc2RrSW5mbyBUaGUgc2RrSW5mbyBvZiB0aGUgZXZlbnQgdGhhdCB3aWxsIGJlIGZpbGxlZCB3aXRoIGFsbCBpbnRlZ3JhdGlvbnMuXG4gICAgICovXG4gICAgQmFzZUNsaWVudC5wcm90b3R5cGUuX2FwcGx5SW50ZWdyYXRpb25zTWV0YWRhdGEgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgdmFyIHNka0luZm8gPSBldmVudC5zZGs7XG4gICAgICAgIHZhciBpbnRlZ3JhdGlvbnNBcnJheSA9IE9iamVjdC5rZXlzKHRoaXMuX2ludGVncmF0aW9ucyk7XG4gICAgICAgIGlmIChzZGtJbmZvICYmIGludGVncmF0aW9uc0FycmF5Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHNka0luZm8uaW50ZWdyYXRpb25zID0gaW50ZWdyYXRpb25zQXJyYXk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFRlbGxzIHRoZSBiYWNrZW5kIHRvIHNlbmQgdGhpcyBldmVudFxuICAgICAqIEBwYXJhbSBldmVudCBUaGUgU2VudHJ5IGV2ZW50IHRvIHNlbmRcbiAgICAgKi9cbiAgICBCYXNlQ2xpZW50LnByb3RvdHlwZS5fc2VuZEV2ZW50ID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIHRoaXMuX2dldEJhY2tlbmQoKS5zZW5kRXZlbnQoZXZlbnQpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUHJvY2Vzc2VzIGFuIGV2ZW50IChlaXRoZXIgZXJyb3Igb3IgbWVzc2FnZSkgYW5kIHNlbmRzIGl0IHRvIFNlbnRyeS5cbiAgICAgKlxuICAgICAqIFRoaXMgYWxzbyBhZGRzIGJyZWFkY3J1bWJzIGFuZCBjb250ZXh0IGluZm9ybWF0aW9uIHRvIHRoZSBldmVudC4gSG93ZXZlcixcbiAgICAgKiBwbGF0Zm9ybSBzcGVjaWZpYyBtZXRhIGRhdGEgKHN1Y2ggYXMgdGhlIFVzZXIncyBJUCBhZGRyZXNzKSBtdXN0IGJlIGFkZGVkXG4gICAgICogYnkgdGhlIFNESyBpbXBsZW1lbnRvci5cbiAgICAgKlxuICAgICAqXG4gICAgICogQHBhcmFtIGV2ZW50IFRoZSBldmVudCB0byBzZW5kIHRvIFNlbnRyeS5cbiAgICAgKiBAcGFyYW0gaGludCBNYXkgY29udGFpbiBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBvcmlnaW5hbCBleGNlcHRpb24uXG4gICAgICogQHBhcmFtIHNjb3BlIEEgc2NvcGUgY29udGFpbmluZyBldmVudCBtZXRhZGF0YS5cbiAgICAgKiBAcmV0dXJucyBBIFN5bmNQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgZXZlbnQgb3IgcmVqZWN0cyBpbiBjYXNlIGV2ZW50IHdhcy93aWxsIG5vdCBiZSBzZW5kLlxuICAgICAqL1xuICAgIEJhc2VDbGllbnQucHJvdG90eXBlLl9wcm9jZXNzRXZlbnQgPSBmdW5jdGlvbiAoZXZlbnQsIGhpbnQsIHNjb3BlKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBfYSA9IHRoaXMuZ2V0T3B0aW9ucygpLCBiZWZvcmVTZW5kID0gX2EuYmVmb3JlU2VuZCwgc2FtcGxlUmF0ZSA9IF9hLnNhbXBsZVJhdGU7XG4gICAgICAgIGlmICghdGhpcy5faXNFbmFibGVkKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBTeW5jUHJvbWlzZS5yZWplY3QoJ1NESyBub3QgZW5hYmxlZCwgd2lsbCBub3Qgc2VuZCBldmVudC4nKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgaXNUcmFuc2FjdGlvbiA9IGV2ZW50LnR5cGUgPT09ICd0cmFuc2FjdGlvbic7XG4gICAgICAgIC8vIDEuMCA9PT0gMTAwJSBldmVudHMgYXJlIHNlbnRcbiAgICAgICAgLy8gMC4wID09PSAwJSBldmVudHMgYXJlIHNlbnRcbiAgICAgICAgLy8gU2FtcGxpbmcgZm9yIHRyYW5zYWN0aW9uIGhhcHBlbnMgc29tZXdoZXJlIGVsc2VcbiAgICAgICAgaWYgKCFpc1RyYW5zYWN0aW9uICYmIHR5cGVvZiBzYW1wbGVSYXRlID09PSAnbnVtYmVyJyAmJiBNYXRoLnJhbmRvbSgpID4gc2FtcGxlUmF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIFN5bmNQcm9taXNlLnJlamVjdCgnVGhpcyBldmVudCBoYXMgYmVlbiBzYW1wbGVkLCB3aWxsIG5vdCBzZW5kIGV2ZW50LicpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgU3luY1Byb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgICAgX3RoaXMuX3ByZXBhcmVFdmVudChldmVudCwgc2NvcGUsIGhpbnQpXG4gICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKHByZXBhcmVkKSB7XG4gICAgICAgICAgICAgICAgaWYgKHByZXBhcmVkID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdCgnQW4gZXZlbnQgcHJvY2Vzc29yIHJldHVybmVkIG51bGwsIHdpbGwgbm90IHNlbmQgZXZlbnQuJyk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIGZpbmFsRXZlbnQgPSBwcmVwYXJlZDtcbiAgICAgICAgICAgICAgICB2YXIgaXNJbnRlcm5hbEV4Y2VwdGlvbiA9IGhpbnQgJiYgaGludC5kYXRhICYmIGhpbnQuZGF0YS5fX3NlbnRyeV9fID09PSB0cnVlO1xuICAgICAgICAgICAgICAgIC8vIFdlIHNraXAgYmVmb3JlU2VuZCBpbiBjYXNlIG9mIHRyYW5zYWN0aW9uc1xuICAgICAgICAgICAgICAgIGlmIChpc0ludGVybmFsRXhjZXB0aW9uIHx8ICFiZWZvcmVTZW5kIHx8IGlzVHJhbnNhY3Rpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMuX3NlbmRFdmVudChmaW5hbEV2ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShmaW5hbEV2ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgYmVmb3JlU2VuZFJlc3VsdCA9IGJlZm9yZVNlbmQocHJlcGFyZWQsIGhpbnQpO1xuICAgICAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpzdHJpY3QtdHlwZS1wcmVkaWNhdGVzXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBiZWZvcmVTZW5kUmVzdWx0ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoJ2BiZWZvcmVTZW5kYCBtZXRob2QgaGFzIHRvIHJldHVybiBgbnVsbGAgb3IgYSB2YWxpZCBldmVudC4nKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoaXNUaGVuYWJsZShiZWZvcmVTZW5kUmVzdWx0KSkge1xuICAgICAgICAgICAgICAgICAgICBfdGhpcy5faGFuZGxlQXN5bmNCZWZvcmVTZW5kKGJlZm9yZVNlbmRSZXN1bHQsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBmaW5hbEV2ZW50ID0gYmVmb3JlU2VuZFJlc3VsdDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZpbmFsRXZlbnQgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5sb2coJ2BiZWZvcmVTZW5kYCByZXR1cm5lZCBgbnVsbGAsIHdpbGwgbm90IHNlbmQgZXZlbnQuJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKG51bGwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIEZyb20gaGVyZSBvbiB3ZSBhcmUgcmVhbGx5IGFzeW5jXG4gICAgICAgICAgICAgICAgICAgIF90aGlzLl9zZW5kRXZlbnQoZmluYWxFdmVudCk7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZmluYWxFdmVudCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAudGhlbihudWxsLCBmdW5jdGlvbiAocmVhc29uKSB7XG4gICAgICAgICAgICAgICAgX3RoaXMuY2FwdHVyZUV4Y2VwdGlvbihyZWFzb24sIHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICAgICAgICAgICAgX19zZW50cnlfXzogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxFeGNlcHRpb246IHJlYXNvbixcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZWplY3QoXCJFdmVudCBwcm9jZXNzaW5nIHBpcGVsaW5lIHRocmV3IGFuIGVycm9yLCBvcmlnaW5hbCBldmVudCB3aWxsIG5vdCBiZSBzZW50LiBEZXRhaWxzIGhhdmUgYmVlbiBzZW50IGFzIGEgbmV3IGV2ZW50LlxcblJlYXNvbjogXCIgKyByZWFzb24pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmVzb2x2ZXMgYmVmb3JlIHNlbmQgUHJvbWlzZSBhbmQgY2FsbHMgcmVzb2x2ZS9yZWplY3Qgb24gcGFyZW50IFN5bmNQcm9taXNlLlxuICAgICAqL1xuICAgIEJhc2VDbGllbnQucHJvdG90eXBlLl9oYW5kbGVBc3luY0JlZm9yZVNlbmQgPSBmdW5jdGlvbiAoYmVmb3JlU2VuZCwgcmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIGJlZm9yZVNlbmRcbiAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChwcm9jZXNzZWRFdmVudCkge1xuICAgICAgICAgICAgaWYgKHByb2Nlc3NlZEV2ZW50ID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmVqZWN0KCdgYmVmb3JlU2VuZGAgcmV0dXJuZWQgYG51bGxgLCB3aWxsIG5vdCBzZW5kIGV2ZW50LicpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEZyb20gaGVyZSBvbiB3ZSBhcmUgcmVhbGx5IGFzeW5jXG4gICAgICAgICAgICBfdGhpcy5fc2VuZEV2ZW50KHByb2Nlc3NlZEV2ZW50KTtcbiAgICAgICAgICAgIHJlc29sdmUocHJvY2Vzc2VkRXZlbnQpO1xuICAgICAgICB9KVxuICAgICAgICAgICAgLnRoZW4obnVsbCwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgIHJlamVjdChcImJlZm9yZVNlbmQgcmVqZWN0ZWQgd2l0aCBcIiArIGUpO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIHJldHVybiBCYXNlQ2xpZW50O1xufSgpKTtcbmV4cG9ydCB7IEJhc2VDbGllbnQgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWJhc2VjbGllbnQuanMubWFwIiwiZXhwb3J0IHsgYWRkQnJlYWRjcnVtYiwgY2FwdHVyZUV4Y2VwdGlvbiwgY2FwdHVyZUV2ZW50LCBjYXB0dXJlTWVzc2FnZSwgY29uZmlndXJlU2NvcGUsIHN0YXJ0VHJhbnNhY3Rpb24sIHNldENvbnRleHQsIHNldEV4dHJhLCBzZXRFeHRyYXMsIHNldFRhZywgc2V0VGFncywgc2V0VXNlciwgd2l0aFNjb3BlLCB9IGZyb20gJ0BzZW50cnkvbWluaW1hbCc7XG5leHBvcnQgeyBhZGRHbG9iYWxFdmVudFByb2Nlc3NvciwgZ2V0Q3VycmVudEh1YiwgZ2V0SHViRnJvbUNhcnJpZXIsIEh1YiwgU2NvcGUgfSBmcm9tICdAc2VudHJ5L2h1Yic7XG5leHBvcnQgeyBBUEkgfSBmcm9tICcuL2FwaSc7XG5leHBvcnQgeyBCYXNlQ2xpZW50IH0gZnJvbSAnLi9iYXNlY2xpZW50JztcbmV4cG9ydCB7IEJhc2VCYWNrZW5kIH0gZnJvbSAnLi9iYXNlYmFja2VuZCc7XG5leHBvcnQgeyBldmVudFRvU2VudHJ5UmVxdWVzdCB9IGZyb20gJy4vcmVxdWVzdCc7XG5leHBvcnQgeyBpbml0QW5kQmluZCB9IGZyb20gJy4vc2RrJztcbmV4cG9ydCB7IE5vb3BUcmFuc3BvcnQgfSBmcm9tICcuL3RyYW5zcG9ydHMvbm9vcCc7XG5pbXBvcnQgKiBhcyBJbnRlZ3JhdGlvbnMgZnJvbSAnLi9pbnRlZ3JhdGlvbnMnO1xuZXhwb3J0IHsgSW50ZWdyYXRpb25zIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCJpbXBvcnQgKiBhcyB0c2xpYl8xIGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgYWRkR2xvYmFsRXZlbnRQcm9jZXNzb3IsIGdldEN1cnJlbnRIdWIgfSBmcm9tICdAc2VudHJ5L2h1Yic7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICdAc2VudHJ5L3V0aWxzJztcbmV4cG9ydCB2YXIgaW5zdGFsbGVkSW50ZWdyYXRpb25zID0gW107XG4vKiogR2V0cyBpbnRlZ3JhdGlvbiB0byBpbnN0YWxsICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0SW50ZWdyYXRpb25zVG9TZXR1cChvcHRpb25zKSB7XG4gICAgdmFyIGRlZmF1bHRJbnRlZ3JhdGlvbnMgPSAob3B0aW9ucy5kZWZhdWx0SW50ZWdyYXRpb25zICYmIHRzbGliXzEuX19zcHJlYWQob3B0aW9ucy5kZWZhdWx0SW50ZWdyYXRpb25zKSkgfHwgW107XG4gICAgdmFyIHVzZXJJbnRlZ3JhdGlvbnMgPSBvcHRpb25zLmludGVncmF0aW9ucztcbiAgICB2YXIgaW50ZWdyYXRpb25zID0gW107XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodXNlckludGVncmF0aW9ucykpIHtcbiAgICAgICAgdmFyIHVzZXJJbnRlZ3JhdGlvbnNOYW1lc18xID0gdXNlckludGVncmF0aW9ucy5tYXAoZnVuY3Rpb24gKGkpIHsgcmV0dXJuIGkubmFtZTsgfSk7XG4gICAgICAgIHZhciBwaWNrZWRJbnRlZ3JhdGlvbnNOYW1lc18xID0gW107XG4gICAgICAgIC8vIExlYXZlIG9ubHkgdW5pcXVlIGRlZmF1bHQgaW50ZWdyYXRpb25zLCB0aGF0IHdlcmUgbm90IG92ZXJyaWRkZW4gd2l0aCBwcm92aWRlZCB1c2VyIGludGVncmF0aW9uc1xuICAgICAgICBkZWZhdWx0SW50ZWdyYXRpb25zLmZvckVhY2goZnVuY3Rpb24gKGRlZmF1bHRJbnRlZ3JhdGlvbikge1xuICAgICAgICAgICAgaWYgKHVzZXJJbnRlZ3JhdGlvbnNOYW1lc18xLmluZGV4T2YoZGVmYXVsdEludGVncmF0aW9uLm5hbWUpID09PSAtMSAmJlxuICAgICAgICAgICAgICAgIHBpY2tlZEludGVncmF0aW9uc05hbWVzXzEuaW5kZXhPZihkZWZhdWx0SW50ZWdyYXRpb24ubmFtZSkgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgaW50ZWdyYXRpb25zLnB1c2goZGVmYXVsdEludGVncmF0aW9uKTtcbiAgICAgICAgICAgICAgICBwaWNrZWRJbnRlZ3JhdGlvbnNOYW1lc18xLnB1c2goZGVmYXVsdEludGVncmF0aW9uLm5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgLy8gRG9uJ3QgYWRkIHNhbWUgdXNlciBpbnRlZ3JhdGlvbiB0d2ljZVxuICAgICAgICB1c2VySW50ZWdyYXRpb25zLmZvckVhY2goZnVuY3Rpb24gKHVzZXJJbnRlZ3JhdGlvbikge1xuICAgICAgICAgICAgaWYgKHBpY2tlZEludGVncmF0aW9uc05hbWVzXzEuaW5kZXhPZih1c2VySW50ZWdyYXRpb24ubmFtZSkgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgaW50ZWdyYXRpb25zLnB1c2godXNlckludGVncmF0aW9uKTtcbiAgICAgICAgICAgICAgICBwaWNrZWRJbnRlZ3JhdGlvbnNOYW1lc18xLnB1c2godXNlckludGVncmF0aW9uLm5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZW9mIHVzZXJJbnRlZ3JhdGlvbnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgaW50ZWdyYXRpb25zID0gdXNlckludGVncmF0aW9ucyhkZWZhdWx0SW50ZWdyYXRpb25zKTtcbiAgICAgICAgaW50ZWdyYXRpb25zID0gQXJyYXkuaXNBcnJheShpbnRlZ3JhdGlvbnMpID8gaW50ZWdyYXRpb25zIDogW2ludGVncmF0aW9uc107XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBpbnRlZ3JhdGlvbnMgPSB0c2xpYl8xLl9fc3ByZWFkKGRlZmF1bHRJbnRlZ3JhdGlvbnMpO1xuICAgIH1cbiAgICAvLyBNYWtlIHN1cmUgdGhhdCBpZiBwcmVzZW50LCBgRGVidWdgIGludGVncmF0aW9uIHdpbGwgYWx3YXlzIHJ1biBsYXN0XG4gICAgdmFyIGludGVncmF0aW9uc05hbWVzID0gaW50ZWdyYXRpb25zLm1hcChmdW5jdGlvbiAoaSkgeyByZXR1cm4gaS5uYW1lOyB9KTtcbiAgICB2YXIgYWx3YXlzTGFzdFRvUnVuID0gJ0RlYnVnJztcbiAgICBpZiAoaW50ZWdyYXRpb25zTmFtZXMuaW5kZXhPZihhbHdheXNMYXN0VG9SdW4pICE9PSAtMSkge1xuICAgICAgICBpbnRlZ3JhdGlvbnMucHVzaC5hcHBseShpbnRlZ3JhdGlvbnMsIHRzbGliXzEuX19zcHJlYWQoaW50ZWdyYXRpb25zLnNwbGljZShpbnRlZ3JhdGlvbnNOYW1lcy5pbmRleE9mKGFsd2F5c0xhc3RUb1J1biksIDEpKSk7XG4gICAgfVxuICAgIHJldHVybiBpbnRlZ3JhdGlvbnM7XG59XG4vKiogU2V0dXAgZ2l2ZW4gaW50ZWdyYXRpb24gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXR1cEludGVncmF0aW9uKGludGVncmF0aW9uKSB7XG4gICAgaWYgKGluc3RhbGxlZEludGVncmF0aW9ucy5pbmRleE9mKGludGVncmF0aW9uLm5hbWUpICE9PSAtMSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGludGVncmF0aW9uLnNldHVwT25jZShhZGRHbG9iYWxFdmVudFByb2Nlc3NvciwgZ2V0Q3VycmVudEh1Yik7XG4gICAgaW5zdGFsbGVkSW50ZWdyYXRpb25zLnB1c2goaW50ZWdyYXRpb24ubmFtZSk7XG4gICAgbG9nZ2VyLmxvZyhcIkludGVncmF0aW9uIGluc3RhbGxlZDogXCIgKyBpbnRlZ3JhdGlvbi5uYW1lKTtcbn1cbi8qKlxuICogR2l2ZW4gYSBsaXN0IG9mIGludGVncmF0aW9uIGluc3RhbmNlcyB0aGlzIGluc3RhbGxzIHRoZW0gYWxsLiBXaGVuIGB3aXRoRGVmYXVsdHNgIGlzIHNldCB0byBgdHJ1ZWAgdGhlbiBhbGwgZGVmYXVsdFxuICogaW50ZWdyYXRpb25zIGFyZSBhZGRlZCB1bmxlc3MgdGhleSB3ZXJlIGFscmVhZHkgcHJvdmlkZWQgYmVmb3JlLlxuICogQHBhcmFtIGludGVncmF0aW9ucyBhcnJheSBvZiBpbnRlZ3JhdGlvbiBpbnN0YW5jZXNcbiAqIEBwYXJhbSB3aXRoRGVmYXVsdCBzaG91bGQgZW5hYmxlIGRlZmF1bHQgaW50ZWdyYXRpb25zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXR1cEludGVncmF0aW9ucyhvcHRpb25zKSB7XG4gICAgdmFyIGludGVncmF0aW9ucyA9IHt9O1xuICAgIGdldEludGVncmF0aW9uc1RvU2V0dXAob3B0aW9ucykuZm9yRWFjaChmdW5jdGlvbiAoaW50ZWdyYXRpb24pIHtcbiAgICAgICAgaW50ZWdyYXRpb25zW2ludGVncmF0aW9uLm5hbWVdID0gaW50ZWdyYXRpb247XG4gICAgICAgIHNldHVwSW50ZWdyYXRpb24oaW50ZWdyYXRpb24pO1xuICAgIH0pO1xuICAgIHJldHVybiBpbnRlZ3JhdGlvbnM7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbnRlZ3JhdGlvbi5qcy5tYXAiLCJ2YXIgb3JpZ2luYWxGdW5jdGlvblRvU3RyaW5nO1xuLyoqIFBhdGNoIHRvU3RyaW5nIGNhbGxzIHRvIHJldHVybiBwcm9wZXIgbmFtZSBmb3Igd3JhcHBlZCBmdW5jdGlvbnMgKi9cbnZhciBGdW5jdGlvblRvU3RyaW5nID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEZ1bmN0aW9uVG9TdHJpbmcoKSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAaW5oZXJpdERvY1xuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5uYW1lID0gRnVuY3Rpb25Ub1N0cmluZy5pZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGluaGVyaXREb2NcbiAgICAgKi9cbiAgICBGdW5jdGlvblRvU3RyaW5nLnByb3RvdHlwZS5zZXR1cE9uY2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIG9yaWdpbmFsRnVuY3Rpb25Ub1N0cmluZyA9IEZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZztcbiAgICAgICAgRnVuY3Rpb24ucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGFyZ3MgPSBbXTtcbiAgICAgICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICAgICAgYXJnc1tfaV0gPSBhcmd1bWVudHNbX2ldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGNvbnRleHQgPSB0aGlzLl9fc2VudHJ5X29yaWdpbmFsX18gfHwgdGhpcztcbiAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby11bnNhZmUtYW55XG4gICAgICAgICAgICByZXR1cm4gb3JpZ2luYWxGdW5jdGlvblRvU3RyaW5nLmFwcGx5KGNvbnRleHQsIGFyZ3MpO1xuICAgICAgICB9O1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQGluaGVyaXREb2NcbiAgICAgKi9cbiAgICBGdW5jdGlvblRvU3RyaW5nLmlkID0gJ0Z1bmN0aW9uVG9TdHJpbmcnO1xuICAgIHJldHVybiBGdW5jdGlvblRvU3RyaW5nO1xufSgpKTtcbmV4cG9ydCB7IEZ1bmN0aW9uVG9TdHJpbmcgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWZ1bmN0aW9udG9zdHJpbmcuanMubWFwIiwiaW1wb3J0ICogYXMgdHNsaWJfMSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IGFkZEdsb2JhbEV2ZW50UHJvY2Vzc29yLCBnZXRDdXJyZW50SHViIH0gZnJvbSAnQHNlbnRyeS9odWInO1xuaW1wb3J0IHsgZ2V0RXZlbnREZXNjcmlwdGlvbiwgaXNNYXRjaGluZ1BhdHRlcm4sIGxvZ2dlciB9IGZyb20gJ0BzZW50cnkvdXRpbHMnO1xuLy8gXCJTY3JpcHQgZXJyb3IuXCIgaXMgaGFyZCBjb2RlZCBpbnRvIGJyb3dzZXJzIGZvciBlcnJvcnMgdGhhdCBpdCBjYW4ndCByZWFkLlxuLy8gdGhpcyBpcyB0aGUgcmVzdWx0IG9mIGEgc2NyaXB0IGJlaW5nIHB1bGxlZCBpbiBmcm9tIGFuIGV4dGVybmFsIGRvbWFpbiBhbmQgQ09SUy5cbnZhciBERUZBVUxUX0lHTk9SRV9FUlJPUlMgPSBbL15TY3JpcHQgZXJyb3JcXC4/JC8sIC9eSmF2YXNjcmlwdCBlcnJvcjogU2NyaXB0IGVycm9yXFwuPyBvbiBsaW5lIDAkL107XG4vKiogSW5ib3VuZCBmaWx0ZXJzIGNvbmZpZ3VyYWJsZSBieSB0aGUgdXNlciAqL1xudmFyIEluYm91bmRGaWx0ZXJzID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEluYm91bmRGaWx0ZXJzKF9vcHRpb25zKSB7XG4gICAgICAgIGlmIChfb3B0aW9ucyA9PT0gdm9pZCAwKSB7IF9vcHRpb25zID0ge307IH1cbiAgICAgICAgdGhpcy5fb3B0aW9ucyA9IF9vcHRpb25zO1xuICAgICAgICAvKipcbiAgICAgICAgICogQGluaGVyaXREb2NcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMubmFtZSA9IEluYm91bmRGaWx0ZXJzLmlkO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuICAgIEluYm91bmRGaWx0ZXJzLnByb3RvdHlwZS5zZXR1cE9uY2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGFkZEdsb2JhbEV2ZW50UHJvY2Vzc29yKGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgICAgdmFyIGh1YiA9IGdldEN1cnJlbnRIdWIoKTtcbiAgICAgICAgICAgIGlmICghaHViKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGV2ZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHNlbGYgPSBodWIuZ2V0SW50ZWdyYXRpb24oSW5ib3VuZEZpbHRlcnMpO1xuICAgICAgICAgICAgaWYgKHNlbGYpIHtcbiAgICAgICAgICAgICAgICB2YXIgY2xpZW50ID0gaHViLmdldENsaWVudCgpO1xuICAgICAgICAgICAgICAgIHZhciBjbGllbnRPcHRpb25zID0gY2xpZW50ID8gY2xpZW50LmdldE9wdGlvbnMoKSA6IHt9O1xuICAgICAgICAgICAgICAgIHZhciBvcHRpb25zID0gc2VsZi5fbWVyZ2VPcHRpb25zKGNsaWVudE9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIGlmIChzZWxmLl9zaG91bGREcm9wRXZlbnQoZXZlbnQsIG9wdGlvbnMpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBldmVudDtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKiogSlNEb2MgKi9cbiAgICBJbmJvdW5kRmlsdGVycy5wcm90b3R5cGUuX3Nob3VsZERyb3BFdmVudCA9IGZ1bmN0aW9uIChldmVudCwgb3B0aW9ucykge1xuICAgICAgICBpZiAodGhpcy5faXNTZW50cnlFcnJvcihldmVudCwgb3B0aW9ucykpIHtcbiAgICAgICAgICAgIGxvZ2dlci53YXJuKFwiRXZlbnQgZHJvcHBlZCBkdWUgdG8gYmVpbmcgaW50ZXJuYWwgU2VudHJ5IEVycm9yLlxcbkV2ZW50OiBcIiArIGdldEV2ZW50RGVzY3JpcHRpb24oZXZlbnQpKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9pc0lnbm9yZWRFcnJvcihldmVudCwgb3B0aW9ucykpIHtcbiAgICAgICAgICAgIGxvZ2dlci53YXJuKFwiRXZlbnQgZHJvcHBlZCBkdWUgdG8gYmVpbmcgbWF0Y2hlZCBieSBgaWdub3JlRXJyb3JzYCBvcHRpb24uXFxuRXZlbnQ6IFwiICsgZ2V0RXZlbnREZXNjcmlwdGlvbihldmVudCkpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX2lzQmxhY2tsaXN0ZWRVcmwoZXZlbnQsIG9wdGlvbnMpKSB7XG4gICAgICAgICAgICBsb2dnZXIud2FybihcIkV2ZW50IGRyb3BwZWQgZHVlIHRvIGJlaW5nIG1hdGNoZWQgYnkgYGJsYWNrbGlzdFVybHNgIG9wdGlvbi5cXG5FdmVudDogXCIgKyBnZXRFdmVudERlc2NyaXB0aW9uKGV2ZW50KSArIFwiLlxcblVybDogXCIgKyB0aGlzLl9nZXRFdmVudEZpbHRlclVybChldmVudCkpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLl9pc1doaXRlbGlzdGVkVXJsKGV2ZW50LCBvcHRpb25zKSkge1xuICAgICAgICAgICAgbG9nZ2VyLndhcm4oXCJFdmVudCBkcm9wcGVkIGR1ZSB0byBub3QgYmVpbmcgbWF0Y2hlZCBieSBgd2hpdGVsaXN0VXJsc2Agb3B0aW9uLlxcbkV2ZW50OiBcIiArIGdldEV2ZW50RGVzY3JpcHRpb24oZXZlbnQpICsgXCIuXFxuVXJsOiBcIiArIHRoaXMuX2dldEV2ZW50RmlsdGVyVXJsKGV2ZW50KSk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfTtcbiAgICAvKiogSlNEb2MgKi9cbiAgICBJbmJvdW5kRmlsdGVycy5wcm90b3R5cGUuX2lzU2VudHJ5RXJyb3IgPSBmdW5jdGlvbiAoZXZlbnQsIG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkgeyBvcHRpb25zID0ge307IH1cbiAgICAgICAgaWYgKCFvcHRpb25zLmlnbm9yZUludGVybmFsKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiAoKGV2ZW50ICYmXG4gICAgICAgICAgICAgICAgZXZlbnQuZXhjZXB0aW9uICYmXG4gICAgICAgICAgICAgICAgZXZlbnQuZXhjZXB0aW9uLnZhbHVlcyAmJlxuICAgICAgICAgICAgICAgIGV2ZW50LmV4Y2VwdGlvbi52YWx1ZXNbMF0gJiZcbiAgICAgICAgICAgICAgICBldmVudC5leGNlcHRpb24udmFsdWVzWzBdLnR5cGUgPT09ICdTZW50cnlFcnJvcicpIHx8XG4gICAgICAgICAgICAgICAgZmFsc2UpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChfb08pIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLyoqIEpTRG9jICovXG4gICAgSW5ib3VuZEZpbHRlcnMucHJvdG90eXBlLl9pc0lnbm9yZWRFcnJvciA9IGZ1bmN0aW9uIChldmVudCwgb3B0aW9ucykge1xuICAgICAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7IG9wdGlvbnMgPSB7fTsgfVxuICAgICAgICBpZiAoIW9wdGlvbnMuaWdub3JlRXJyb3JzIHx8ICFvcHRpb25zLmlnbm9yZUVycm9ycy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0UG9zc2libGVFdmVudE1lc3NhZ2VzKGV2ZW50KS5zb21lKGZ1bmN0aW9uIChtZXNzYWdlKSB7XG4gICAgICAgICAgICAvLyBOb3Qgc3VyZSB3aHkgVHlwZVNjcmlwdCBjb21wbGFpbnMgaGVyZS4uLlxuICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMuaWdub3JlRXJyb3JzLnNvbWUoZnVuY3Rpb24gKHBhdHRlcm4pIHsgcmV0dXJuIGlzTWF0Y2hpbmdQYXR0ZXJuKG1lc3NhZ2UsIHBhdHRlcm4pOyB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKiogSlNEb2MgKi9cbiAgICBJbmJvdW5kRmlsdGVycy5wcm90b3R5cGUuX2lzQmxhY2tsaXN0ZWRVcmwgPSBmdW5jdGlvbiAoZXZlbnQsIG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkgeyBvcHRpb25zID0ge307IH1cbiAgICAgICAgLy8gVE9ETzogVXNlIEdsb2IgaW5zdGVhZD9cbiAgICAgICAgaWYgKCFvcHRpb25zLmJsYWNrbGlzdFVybHMgfHwgIW9wdGlvbnMuYmxhY2tsaXN0VXJscy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgdXJsID0gdGhpcy5fZ2V0RXZlbnRGaWx0ZXJVcmwoZXZlbnQpO1xuICAgICAgICByZXR1cm4gIXVybCA/IGZhbHNlIDogb3B0aW9ucy5ibGFja2xpc3RVcmxzLnNvbWUoZnVuY3Rpb24gKHBhdHRlcm4pIHsgcmV0dXJuIGlzTWF0Y2hpbmdQYXR0ZXJuKHVybCwgcGF0dGVybik7IH0pO1xuICAgIH07XG4gICAgLyoqIEpTRG9jICovXG4gICAgSW5ib3VuZEZpbHRlcnMucHJvdG90eXBlLl9pc1doaXRlbGlzdGVkVXJsID0gZnVuY3Rpb24gKGV2ZW50LCBvcHRpb25zKSB7XG4gICAgICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHsgb3B0aW9ucyA9IHt9OyB9XG4gICAgICAgIC8vIFRPRE86IFVzZSBHbG9iIGluc3RlYWQ/XG4gICAgICAgIGlmICghb3B0aW9ucy53aGl0ZWxpc3RVcmxzIHx8ICFvcHRpb25zLndoaXRlbGlzdFVybHMubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgdXJsID0gdGhpcy5fZ2V0RXZlbnRGaWx0ZXJVcmwoZXZlbnQpO1xuICAgICAgICByZXR1cm4gIXVybCA/IHRydWUgOiBvcHRpb25zLndoaXRlbGlzdFVybHMuc29tZShmdW5jdGlvbiAocGF0dGVybikgeyByZXR1cm4gaXNNYXRjaGluZ1BhdHRlcm4odXJsLCBwYXR0ZXJuKTsgfSk7XG4gICAgfTtcbiAgICAvKiogSlNEb2MgKi9cbiAgICBJbmJvdW5kRmlsdGVycy5wcm90b3R5cGUuX21lcmdlT3B0aW9ucyA9IGZ1bmN0aW9uIChjbGllbnRPcHRpb25zKSB7XG4gICAgICAgIGlmIChjbGllbnRPcHRpb25zID09PSB2b2lkIDApIHsgY2xpZW50T3B0aW9ucyA9IHt9OyB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBibGFja2xpc3RVcmxzOiB0c2xpYl8xLl9fc3ByZWFkKCh0aGlzLl9vcHRpb25zLmJsYWNrbGlzdFVybHMgfHwgW10pLCAoY2xpZW50T3B0aW9ucy5ibGFja2xpc3RVcmxzIHx8IFtdKSksXG4gICAgICAgICAgICBpZ25vcmVFcnJvcnM6IHRzbGliXzEuX19zcHJlYWQoKHRoaXMuX29wdGlvbnMuaWdub3JlRXJyb3JzIHx8IFtdKSwgKGNsaWVudE9wdGlvbnMuaWdub3JlRXJyb3JzIHx8IFtdKSwgREVGQVVMVF9JR05PUkVfRVJST1JTKSxcbiAgICAgICAgICAgIGlnbm9yZUludGVybmFsOiB0eXBlb2YgdGhpcy5fb3B0aW9ucy5pZ25vcmVJbnRlcm5hbCAhPT0gJ3VuZGVmaW5lZCcgPyB0aGlzLl9vcHRpb25zLmlnbm9yZUludGVybmFsIDogdHJ1ZSxcbiAgICAgICAgICAgIHdoaXRlbGlzdFVybHM6IHRzbGliXzEuX19zcHJlYWQoKHRoaXMuX29wdGlvbnMud2hpdGVsaXN0VXJscyB8fCBbXSksIChjbGllbnRPcHRpb25zLndoaXRlbGlzdFVybHMgfHwgW10pKSxcbiAgICAgICAgfTtcbiAgICB9O1xuICAgIC8qKiBKU0RvYyAqL1xuICAgIEluYm91bmRGaWx0ZXJzLnByb3RvdHlwZS5fZ2V0UG9zc2libGVFdmVudE1lc3NhZ2VzID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIGlmIChldmVudC5tZXNzYWdlKSB7XG4gICAgICAgICAgICByZXR1cm4gW2V2ZW50Lm1lc3NhZ2VdO1xuICAgICAgICB9XG4gICAgICAgIGlmIChldmVudC5leGNlcHRpb24pIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdmFyIF9hID0gKGV2ZW50LmV4Y2VwdGlvbi52YWx1ZXMgJiYgZXZlbnQuZXhjZXB0aW9uLnZhbHVlc1swXSkgfHwge30sIF9iID0gX2EudHlwZSwgdHlwZSA9IF9iID09PSB2b2lkIDAgPyAnJyA6IF9iLCBfYyA9IF9hLnZhbHVlLCB2YWx1ZSA9IF9jID09PSB2b2lkIDAgPyAnJyA6IF9jO1xuICAgICAgICAgICAgICAgIHJldHVybiBbXCJcIiArIHZhbHVlLCB0eXBlICsgXCI6IFwiICsgdmFsdWVdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKG9PKSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKFwiQ2Fubm90IGV4dHJhY3QgbWVzc2FnZSBmb3IgZXZlbnQgXCIgKyBnZXRFdmVudERlc2NyaXB0aW9uKGV2ZW50KSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9O1xuICAgIC8qKiBKU0RvYyAqL1xuICAgIEluYm91bmRGaWx0ZXJzLnByb3RvdHlwZS5fZ2V0RXZlbnRGaWx0ZXJVcmwgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmIChldmVudC5zdGFja3RyYWNlKSB7XG4gICAgICAgICAgICAgICAgdmFyIGZyYW1lc18xID0gZXZlbnQuc3RhY2t0cmFjZS5mcmFtZXM7XG4gICAgICAgICAgICAgICAgcmV0dXJuIChmcmFtZXNfMSAmJiBmcmFtZXNfMVtmcmFtZXNfMS5sZW5ndGggLSAxXS5maWxlbmFtZSkgfHwgbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChldmVudC5leGNlcHRpb24pIHtcbiAgICAgICAgICAgICAgICB2YXIgZnJhbWVzXzIgPSBldmVudC5leGNlcHRpb24udmFsdWVzICYmIGV2ZW50LmV4Y2VwdGlvbi52YWx1ZXNbMF0uc3RhY2t0cmFjZSAmJiBldmVudC5leGNlcHRpb24udmFsdWVzWzBdLnN0YWNrdHJhY2UuZnJhbWVzO1xuICAgICAgICAgICAgICAgIHJldHVybiAoZnJhbWVzXzIgJiYgZnJhbWVzXzJbZnJhbWVzXzIubGVuZ3RoIC0gMV0uZmlsZW5hbWUpIHx8IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAob08pIHtcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcihcIkNhbm5vdCBleHRyYWN0IHVybCBmb3IgZXZlbnQgXCIgKyBnZXRFdmVudERlc2NyaXB0aW9uKGV2ZW50KSk7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLyoqXG4gICAgICogQGluaGVyaXREb2NcbiAgICAgKi9cbiAgICBJbmJvdW5kRmlsdGVycy5pZCA9ICdJbmJvdW5kRmlsdGVycyc7XG4gICAgcmV0dXJuIEluYm91bmRGaWx0ZXJzO1xufSgpKTtcbmV4cG9ydCB7IEluYm91bmRGaWx0ZXJzIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmJvdW5kZmlsdGVycy5qcy5tYXAiLCJleHBvcnQgeyBGdW5jdGlvblRvU3RyaW5nIH0gZnJvbSAnLi9mdW5jdGlvbnRvc3RyaW5nJztcbmV4cG9ydCB7IEluYm91bmRGaWx0ZXJzIH0gZnJvbSAnLi9pbmJvdW5kZmlsdGVycyc7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCJpbXBvcnQgeyB0aW1lc3RhbXBXaXRoTXMgfSBmcm9tICdAc2VudHJ5L3V0aWxzJztcbi8qKiBDcmVhdGVzIGEgU2VudHJ5UmVxdWVzdCBmcm9tIGFuIGV2ZW50LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV2ZW50VG9TZW50cnlSZXF1ZXN0KGV2ZW50LCBhcGkpIHtcbiAgICB2YXIgdXNlRW52ZWxvcGUgPSBldmVudC50eXBlID09PSAndHJhbnNhY3Rpb24nO1xuICAgIHZhciByZXEgPSB7XG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGV2ZW50KSxcbiAgICAgICAgdXJsOiB1c2VFbnZlbG9wZSA/IGFwaS5nZXRFbnZlbG9wZUVuZHBvaW50V2l0aFVybEVuY29kZWRBdXRoKCkgOiBhcGkuZ2V0U3RvcmVFbmRwb2ludFdpdGhVcmxFbmNvZGVkQXV0aCgpLFxuICAgIH07XG4gICAgLy8gaHR0cHM6Ly9kZXZlbG9wLnNlbnRyeS5kZXYvc2RrL2VudmVsb3Blcy9cbiAgICAvLyBTaW5jZSB3ZSBkb24ndCBuZWVkIHRvIG1hbmlwdWxhdGUgZW52ZWxvcGVzIG5vciBzdG9yZSB0aGVtLCB0aGVyZSBpcyBub1xuICAgIC8vIGV4cG9ydGVkIGNvbmNlcHQgb2YgYW4gRW52ZWxvcGUgd2l0aCBvcGVyYXRpb25zIGluY2x1ZGluZyBzZXJpYWxpemF0aW9uIGFuZFxuICAgIC8vIGRlc2VyaWFsaXphdGlvbi4gSW5zdGVhZCwgd2Ugb25seSBpbXBsZW1lbnQgYSBtaW5pbWFsIHN1YnNldCBvZiB0aGUgc3BlYyB0b1xuICAgIC8vIHNlcmlhbGl6ZSBldmVudHMgaW5saW5lIGhlcmUuXG4gICAgaWYgKHVzZUVudmVsb3BlKSB7XG4gICAgICAgIHZhciBlbnZlbG9wZUhlYWRlcnMgPSBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICBldmVudF9pZDogZXZlbnQuZXZlbnRfaWQsXG4gICAgICAgICAgICAvLyBXZSBuZWVkIHRvIGFkZCAqIDEwMDAgc2luY2Ugd2UgZGl2aWRlIGl0IGJ5IDEwMDAgYnkgZGVmYXVsdCBidXQgSlMgd29ya3Mgd2l0aCBtcyBwcmVjaXNpb25cbiAgICAgICAgICAgIC8vIFRoZSByZWFzb24gd2UgdXNlIHRpbWVzdGFtcFdpdGhNcyBoZXJlIGlzIHRoYXQgYWxsIGNsb2NrcyBhY3Jvc3MgdGhlIFNESyB1c2UgdGhlIHNhbWUgY2xvY2tcbiAgICAgICAgICAgIHNlbnRfYXQ6IG5ldyBEYXRlKHRpbWVzdGFtcFdpdGhNcygpICogMTAwMCkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgfSk7XG4gICAgICAgIHZhciBpdGVtSGVhZGVycyA9IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgIHR5cGU6IGV2ZW50LnR5cGUsXG4gICAgICAgIH0pO1xuICAgICAgICAvLyBUaGUgdHJhaWxpbmcgbmV3bGluZSBpcyBvcHRpb25hbC4gV2UgaW50ZW50aW9uYWxseSBkb24ndCBzZW5kIGl0IHRvIGF2b2lkXG4gICAgICAgIC8vIHNlbmRpbmcgdW5uZWNlc3NhcnkgYnl0ZXMuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIGNvbnN0IGVudmVsb3BlID0gYCR7ZW52ZWxvcGVIZWFkZXJzfVxcbiR7aXRlbUhlYWRlcnN9XFxuJHtyZXEuYm9keX1cXG5gO1xuICAgICAgICB2YXIgZW52ZWxvcGUgPSBlbnZlbG9wZUhlYWRlcnMgKyBcIlxcblwiICsgaXRlbUhlYWRlcnMgKyBcIlxcblwiICsgcmVxLmJvZHk7XG4gICAgICAgIHJlcS5ib2R5ID0gZW52ZWxvcGU7XG4gICAgfVxuICAgIHJldHVybiByZXE7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1yZXF1ZXN0LmpzLm1hcCIsImltcG9ydCB7IGdldEN1cnJlbnRIdWIgfSBmcm9tICdAc2VudHJ5L2h1Yic7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICdAc2VudHJ5L3V0aWxzJztcbi8qKlxuICogSW50ZXJuYWwgZnVuY3Rpb24gdG8gY3JlYXRlIGEgbmV3IFNESyBjbGllbnQgaW5zdGFuY2UuIFRoZSBjbGllbnQgaXNcbiAqIGluc3RhbGxlZCBhbmQgdGhlbiBib3VuZCB0byB0aGUgY3VycmVudCBzY29wZS5cbiAqXG4gKiBAcGFyYW0gY2xpZW50Q2xhc3MgVGhlIGNsaWVudCBjbGFzcyB0byBpbnN0YW5jaWF0ZS5cbiAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgdG8gcGFzcyB0byB0aGUgY2xpZW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5pdEFuZEJpbmQoY2xpZW50Q2xhc3MsIG9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucy5kZWJ1ZyA9PT0gdHJ1ZSkge1xuICAgICAgICBsb2dnZXIuZW5hYmxlKCk7XG4gICAgfVxuICAgIHZhciBodWIgPSBnZXRDdXJyZW50SHViKCk7XG4gICAgdmFyIGNsaWVudCA9IG5ldyBjbGllbnRDbGFzcyhvcHRpb25zKTtcbiAgICBodWIuYmluZENsaWVudChjbGllbnQpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c2RrLmpzLm1hcCIsImltcG9ydCB7IFN0YXR1cyB9IGZyb20gJ0BzZW50cnkvdHlwZXMnO1xuaW1wb3J0IHsgU3luY1Byb21pc2UgfSBmcm9tICdAc2VudHJ5L3V0aWxzJztcbi8qKiBOb29wIHRyYW5zcG9ydCAqL1xudmFyIE5vb3BUcmFuc3BvcnQgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gTm9vcFRyYW5zcG9ydCgpIHtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGluaGVyaXREb2NcbiAgICAgKi9cbiAgICBOb29wVHJhbnNwb3J0LnByb3RvdHlwZS5zZW5kRXZlbnQgPSBmdW5jdGlvbiAoXykge1xuICAgICAgICByZXR1cm4gU3luY1Byb21pc2UucmVzb2x2ZSh7XG4gICAgICAgICAgICByZWFzb246IFwiTm9vcFRyYW5zcG9ydDogRXZlbnQgaGFzIGJlZW4gc2tpcHBlZCBiZWNhdXNlIG5vIERzbiBpcyBjb25maWd1cmVkLlwiLFxuICAgICAgICAgICAgc3RhdHVzOiBTdGF0dXMuU2tpcHBlZCxcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuICAgIE5vb3BUcmFuc3BvcnQucHJvdG90eXBlLmNsb3NlID0gZnVuY3Rpb24gKF8pIHtcbiAgICAgICAgcmV0dXJuIFN5bmNQcm9taXNlLnJlc29sdmUodHJ1ZSk7XG4gICAgfTtcbiAgICByZXR1cm4gTm9vcFRyYW5zcG9ydDtcbn0oKSk7XG5leHBvcnQgeyBOb29wVHJhbnNwb3J0IH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1ub29wLmpzLm1hcCIsImltcG9ydCAqIGFzIHRzbGliXzEgZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBjb25zb2xlU2FuZGJveCwgZ2V0R2xvYmFsT2JqZWN0LCBpc05vZGVFbnYsIGxvZ2dlciwgdGltZXN0YW1wV2l0aE1zLCB1dWlkNCB9IGZyb20gJ0BzZW50cnkvdXRpbHMnO1xuaW1wb3J0IHsgU2NvcGUgfSBmcm9tICcuL3Njb3BlJztcbi8qKlxuICogQVBJIGNvbXBhdGliaWxpdHkgdmVyc2lvbiBvZiB0aGlzIGh1Yi5cbiAqXG4gKiBXQVJOSU5HOiBUaGlzIG51bWJlciBzaG91bGQgb25seSBiZSBpbmNyZXNlZCB3aGVuIHRoZSBnbG9iYWwgaW50ZXJmYWNlXG4gKiBjaGFuZ2VzIGEgYW5kIG5ldyBtZXRob2RzIGFyZSBpbnRyb2R1Y2VkLlxuICpcbiAqIEBoaWRkZW5cbiAqL1xuZXhwb3J0IHZhciBBUElfVkVSU0lPTiA9IDM7XG4vKipcbiAqIERlZmF1bHQgbWF4aW11bSBudW1iZXIgb2YgYnJlYWRjcnVtYnMgYWRkZWQgdG8gYW4gZXZlbnQuIENhbiBiZSBvdmVyd3JpdHRlblxuICogd2l0aCB7QGxpbmsgT3B0aW9ucy5tYXhCcmVhZGNydW1ic30uXG4gKi9cbnZhciBERUZBVUxUX0JSRUFEQ1JVTUJTID0gMTAwO1xuLyoqXG4gKiBBYnNvbHV0ZSBtYXhpbXVtIG51bWJlciBvZiBicmVhZGNydW1icyBhZGRlZCB0byBhbiBldmVudC4gVGhlXG4gKiBgbWF4QnJlYWRjcnVtYnNgIG9wdGlvbiBjYW5ub3QgYmUgaGlnaGVyIHRoYW4gdGhpcyB2YWx1ZS5cbiAqL1xudmFyIE1BWF9CUkVBRENSVU1CUyA9IDEwMDtcbi8qKlxuICogQGluaGVyaXREb2NcbiAqL1xudmFyIEh1YiA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBodWIsIHdpbGwgcHVzaCBvbmUge0BsaW5rIExheWVyfSBpbnRvIHRoZVxuICAgICAqIGludGVybmFsIHN0YWNrIG9uIGNyZWF0aW9uLlxuICAgICAqXG4gICAgICogQHBhcmFtIGNsaWVudCBib3VuZCB0byB0aGUgaHViLlxuICAgICAqIEBwYXJhbSBzY29wZSBib3VuZCB0byB0aGUgaHViLlxuICAgICAqIEBwYXJhbSB2ZXJzaW9uIG51bWJlciwgaGlnaGVyIG51bWJlciBtZWFucyBoaWdoZXIgcHJpb3JpdHkuXG4gICAgICovXG4gICAgZnVuY3Rpb24gSHViKGNsaWVudCwgc2NvcGUsIF92ZXJzaW9uKSB7XG4gICAgICAgIGlmIChzY29wZSA9PT0gdm9pZCAwKSB7IHNjb3BlID0gbmV3IFNjb3BlKCk7IH1cbiAgICAgICAgaWYgKF92ZXJzaW9uID09PSB2b2lkIDApIHsgX3ZlcnNpb24gPSBBUElfVkVSU0lPTjsgfVxuICAgICAgICB0aGlzLl92ZXJzaW9uID0gX3ZlcnNpb247XG4gICAgICAgIC8qKiBJcyBhIHtAbGluayBMYXllcn1bXSBjb250YWluaW5nIHRoZSBjbGllbnQgYW5kIHNjb3BlICovXG4gICAgICAgIHRoaXMuX3N0YWNrID0gW107XG4gICAgICAgIHRoaXMuX3N0YWNrLnB1c2goeyBjbGllbnQ6IGNsaWVudCwgc2NvcGU6IHNjb3BlIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJbnRlcm5hbCBoZWxwZXIgZnVuY3Rpb24gdG8gY2FsbCBhIG1ldGhvZCBvbiB0aGUgdG9wIGNsaWVudCBpZiBpdCBleGlzdHMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbWV0aG9kIFRoZSBtZXRob2QgdG8gY2FsbCBvbiB0aGUgY2xpZW50LlxuICAgICAqIEBwYXJhbSBhcmdzIEFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBjbGllbnQgZnVuY3Rpb24uXG4gICAgICovXG4gICAgSHViLnByb3RvdHlwZS5faW52b2tlQ2xpZW50ID0gZnVuY3Rpb24gKG1ldGhvZCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHZhciBhcmdzID0gW107XG4gICAgICAgIGZvciAodmFyIF9pID0gMTsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICBhcmdzW19pIC0gMV0gPSBhcmd1bWVudHNbX2ldO1xuICAgICAgICB9XG4gICAgICAgIHZhciB0b3AgPSB0aGlzLmdldFN0YWNrVG9wKCk7XG4gICAgICAgIGlmICh0b3AgJiYgdG9wLmNsaWVudCAmJiB0b3AuY2xpZW50W21ldGhvZF0pIHtcbiAgICAgICAgICAgIChfYSA9IHRvcC5jbGllbnQpW21ldGhvZF0uYXBwbHkoX2EsIHRzbGliXzEuX19zcHJlYWQoYXJncywgW3RvcC5zY29wZV0pKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLyoqXG4gICAgICogQGluaGVyaXREb2NcbiAgICAgKi9cbiAgICBIdWIucHJvdG90eXBlLmlzT2xkZXJUaGFuID0gZnVuY3Rpb24gKHZlcnNpb24pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3ZlcnNpb24gPCB2ZXJzaW9uO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQGluaGVyaXREb2NcbiAgICAgKi9cbiAgICBIdWIucHJvdG90eXBlLmJpbmRDbGllbnQgPSBmdW5jdGlvbiAoY2xpZW50KSB7XG4gICAgICAgIHZhciB0b3AgPSB0aGlzLmdldFN0YWNrVG9wKCk7XG4gICAgICAgIHRvcC5jbGllbnQgPSBjbGllbnQ7XG4gICAgICAgIGlmIChjbGllbnQgJiYgY2xpZW50LnNldHVwSW50ZWdyYXRpb25zKSB7XG4gICAgICAgICAgICBjbGllbnQuc2V0dXBJbnRlZ3JhdGlvbnMoKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLyoqXG4gICAgICogQGluaGVyaXREb2NcbiAgICAgKi9cbiAgICBIdWIucHJvdG90eXBlLnB1c2hTY29wZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gV2Ugd2FudCB0byBjbG9uZSB0aGUgY29udGVudCBvZiBwcmV2IHNjb3BlXG4gICAgICAgIHZhciBzdGFjayA9IHRoaXMuZ2V0U3RhY2soKTtcbiAgICAgICAgdmFyIHBhcmVudFNjb3BlID0gc3RhY2subGVuZ3RoID4gMCA/IHN0YWNrW3N0YWNrLmxlbmd0aCAtIDFdLnNjb3BlIDogdW5kZWZpbmVkO1xuICAgICAgICB2YXIgc2NvcGUgPSBTY29wZS5jbG9uZShwYXJlbnRTY29wZSk7XG4gICAgICAgIHRoaXMuZ2V0U3RhY2soKS5wdXNoKHtcbiAgICAgICAgICAgIGNsaWVudDogdGhpcy5nZXRDbGllbnQoKSxcbiAgICAgICAgICAgIHNjb3BlOiBzY29wZSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBzY29wZTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEBpbmhlcml0RG9jXG4gICAgICovXG4gICAgSHViLnByb3RvdHlwZS5wb3BTY29wZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0U3RhY2soKS5wb3AoKSAhPT0gdW5kZWZpbmVkO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQGluaGVyaXREb2NcbiAgICAgKi9cbiAgICBIdWIucHJvdG90eXBlLndpdGhTY29wZSA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgICB2YXIgc2NvcGUgPSB0aGlzLnB1c2hTY29wZSgpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY2FsbGJhY2soc2NvcGUpO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgdGhpcy5wb3BTY29wZSgpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuICAgIEh1Yi5wcm90b3R5cGUuZ2V0Q2xpZW50ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRTdGFja1RvcCgpLmNsaWVudDtcbiAgICB9O1xuICAgIC8qKiBSZXR1cm5zIHRoZSBzY29wZSBvZiB0aGUgdG9wIHN0YWNrLiAqL1xuICAgIEh1Yi5wcm90b3R5cGUuZ2V0U2NvcGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFN0YWNrVG9wKCkuc2NvcGU7XG4gICAgfTtcbiAgICAvKiogUmV0dXJucyB0aGUgc2NvcGUgc3RhY2sgZm9yIGRvbWFpbnMgb3IgdGhlIHByb2Nlc3MuICovXG4gICAgSHViLnByb3RvdHlwZS5nZXRTdGFjayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0YWNrO1xuICAgIH07XG4gICAgLyoqIFJldHVybnMgdGhlIHRvcG1vc3Qgc2NvcGUgbGF5ZXIgaW4gdGhlIG9yZGVyIGRvbWFpbiA+IGxvY2FsID4gcHJvY2Vzcy4gKi9cbiAgICBIdWIucHJvdG90eXBlLmdldFN0YWNrVG9wID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc3RhY2tbdGhpcy5fc3RhY2subGVuZ3RoIC0gMV07XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuICAgIEh1Yi5wcm90b3R5cGUuY2FwdHVyZUV4Y2VwdGlvbiA9IGZ1bmN0aW9uIChleGNlcHRpb24sIGhpbnQpIHtcbiAgICAgICAgdmFyIGV2ZW50SWQgPSAodGhpcy5fbGFzdEV2ZW50SWQgPSB1dWlkNCgpKTtcbiAgICAgICAgdmFyIGZpbmFsSGludCA9IGhpbnQ7XG4gICAgICAgIC8vIElmIHRoZXJlJ3Mgbm8gZXhwbGljaXQgaGludCBwcm92aWRlZCwgbWltaWNrIHRoZSBzYW1lIHRoaW5nIHRoYXQgd291bGQgaGFwcGVuXG4gICAgICAgIC8vIGluIHRoZSBtaW5pbWFsIGl0c2VsZiB0byBjcmVhdGUgYSBjb25zaXN0ZW50IGJlaGF2aW9yLlxuICAgICAgICAvLyBXZSBkb24ndCBkbyB0aGlzIGluIHRoZSBjbGllbnQsIGFzIGl0J3MgdGhlIGxvd2VzdCBsZXZlbCBBUEksIGFuZCBkb2luZyB0aGlzLFxuICAgICAgICAvLyB3b3VsZCBwcmV2ZW50IHVzZXIgZnJvbSBoYXZpbmcgZnVsbCBjb250cm9sIG92ZXIgZGlyZWN0IGNhbGxzLlxuICAgICAgICBpZiAoIWhpbnQpIHtcbiAgICAgICAgICAgIHZhciBzeW50aGV0aWNFeGNlcHRpb24gPSB2b2lkIDA7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignU2VudHJ5IHN5bnRoZXRpY0V4Y2VwdGlvbicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGV4Y2VwdGlvbikge1xuICAgICAgICAgICAgICAgIHN5bnRoZXRpY0V4Y2VwdGlvbiA9IGV4Y2VwdGlvbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpbmFsSGludCA9IHtcbiAgICAgICAgICAgICAgICBvcmlnaW5hbEV4Y2VwdGlvbjogZXhjZXB0aW9uLFxuICAgICAgICAgICAgICAgIHN5bnRoZXRpY0V4Y2VwdGlvbjogc3ludGhldGljRXhjZXB0aW9uLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9pbnZva2VDbGllbnQoJ2NhcHR1cmVFeGNlcHRpb24nLCBleGNlcHRpb24sIHRzbGliXzEuX19hc3NpZ24oe30sIGZpbmFsSGludCwgeyBldmVudF9pZDogZXZlbnRJZCB9KSk7XG4gICAgICAgIHJldHVybiBldmVudElkO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQGluaGVyaXREb2NcbiAgICAgKi9cbiAgICBIdWIucHJvdG90eXBlLmNhcHR1cmVNZXNzYWdlID0gZnVuY3Rpb24gKG1lc3NhZ2UsIGxldmVsLCBoaW50KSB7XG4gICAgICAgIHZhciBldmVudElkID0gKHRoaXMuX2xhc3RFdmVudElkID0gdXVpZDQoKSk7XG4gICAgICAgIHZhciBmaW5hbEhpbnQgPSBoaW50O1xuICAgICAgICAvLyBJZiB0aGVyZSdzIG5vIGV4cGxpY2l0IGhpbnQgcHJvdmlkZWQsIG1pbWljayB0aGUgc2FtZSB0aGluZyB0aGF0IHdvdWxkIGhhcHBlblxuICAgICAgICAvLyBpbiB0aGUgbWluaW1hbCBpdHNlbGYgdG8gY3JlYXRlIGEgY29uc2lzdGVudCBiZWhhdmlvci5cbiAgICAgICAgLy8gV2UgZG9uJ3QgZG8gdGhpcyBpbiB0aGUgY2xpZW50LCBhcyBpdCdzIHRoZSBsb3dlc3QgbGV2ZWwgQVBJLCBhbmQgZG9pbmcgdGhpcyxcbiAgICAgICAgLy8gd291bGQgcHJldmVudCB1c2VyIGZyb20gaGF2aW5nIGZ1bGwgY29udHJvbCBvdmVyIGRpcmVjdCBjYWxscy5cbiAgICAgICAgaWYgKCFoaW50KSB7XG4gICAgICAgICAgICB2YXIgc3ludGhldGljRXhjZXB0aW9uID0gdm9pZCAwO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXhjZXB0aW9uKSB7XG4gICAgICAgICAgICAgICAgc3ludGhldGljRXhjZXB0aW9uID0gZXhjZXB0aW9uO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmluYWxIaW50ID0ge1xuICAgICAgICAgICAgICAgIG9yaWdpbmFsRXhjZXB0aW9uOiBtZXNzYWdlLFxuICAgICAgICAgICAgICAgIHN5bnRoZXRpY0V4Y2VwdGlvbjogc3ludGhldGljRXhjZXB0aW9uLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9pbnZva2VDbGllbnQoJ2NhcHR1cmVNZXNzYWdlJywgbWVzc2FnZSwgbGV2ZWwsIHRzbGliXzEuX19hc3NpZ24oe30sIGZpbmFsSGludCwgeyBldmVudF9pZDogZXZlbnRJZCB9KSk7XG4gICAgICAgIHJldHVybiBldmVudElkO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQGluaGVyaXREb2NcbiAgICAgKi9cbiAgICBIdWIucHJvdG90eXBlLmNhcHR1cmVFdmVudCA9IGZ1bmN0aW9uIChldmVudCwgaGludCkge1xuICAgICAgICB2YXIgZXZlbnRJZCA9ICh0aGlzLl9sYXN0RXZlbnRJZCA9IHV1aWQ0KCkpO1xuICAgICAgICB0aGlzLl9pbnZva2VDbGllbnQoJ2NhcHR1cmVFdmVudCcsIGV2ZW50LCB0c2xpYl8xLl9fYXNzaWduKHt9LCBoaW50LCB7IGV2ZW50X2lkOiBldmVudElkIH0pKTtcbiAgICAgICAgcmV0dXJuIGV2ZW50SWQ7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuICAgIEh1Yi5wcm90b3R5cGUubGFzdEV2ZW50SWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sYXN0RXZlbnRJZDtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEBpbmhlcml0RG9jXG4gICAgICovXG4gICAgSHViLnByb3RvdHlwZS5hZGRCcmVhZGNydW1iID0gZnVuY3Rpb24gKGJyZWFkY3J1bWIsIGhpbnQpIHtcbiAgICAgICAgdmFyIHRvcCA9IHRoaXMuZ2V0U3RhY2tUb3AoKTtcbiAgICAgICAgaWYgKCF0b3Auc2NvcGUgfHwgIXRvcC5jbGllbnQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgX2EgPSAodG9wLmNsaWVudC5nZXRPcHRpb25zICYmIHRvcC5jbGllbnQuZ2V0T3B0aW9ucygpKSB8fCB7fSwgX2IgPSBfYS5iZWZvcmVCcmVhZGNydW1iLCBiZWZvcmVCcmVhZGNydW1iID0gX2IgPT09IHZvaWQgMCA/IG51bGwgOiBfYiwgX2MgPSBfYS5tYXhCcmVhZGNydW1icywgbWF4QnJlYWRjcnVtYnMgPSBfYyA9PT0gdm9pZCAwID8gREVGQVVMVF9CUkVBRENSVU1CUyA6IF9jO1xuICAgICAgICBpZiAobWF4QnJlYWRjcnVtYnMgPD0gMCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHZhciB0aW1lc3RhbXAgPSB0aW1lc3RhbXBXaXRoTXMoKTtcbiAgICAgICAgdmFyIG1lcmdlZEJyZWFkY3J1bWIgPSB0c2xpYl8xLl9fYXNzaWduKHsgdGltZXN0YW1wOiB0aW1lc3RhbXAgfSwgYnJlYWRjcnVtYik7XG4gICAgICAgIHZhciBmaW5hbEJyZWFkY3J1bWIgPSBiZWZvcmVCcmVhZGNydW1iXG4gICAgICAgICAgICA/IGNvbnNvbGVTYW5kYm94KGZ1bmN0aW9uICgpIHsgcmV0dXJuIGJlZm9yZUJyZWFkY3J1bWIobWVyZ2VkQnJlYWRjcnVtYiwgaGludCk7IH0pXG4gICAgICAgICAgICA6IG1lcmdlZEJyZWFkY3J1bWI7XG4gICAgICAgIGlmIChmaW5hbEJyZWFkY3J1bWIgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0b3Auc2NvcGUuYWRkQnJlYWRjcnVtYihmaW5hbEJyZWFkY3J1bWIsIE1hdGgubWluKG1heEJyZWFkY3J1bWJzLCBNQVhfQlJFQURDUlVNQlMpKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEBpbmhlcml0RG9jXG4gICAgICovXG4gICAgSHViLnByb3RvdHlwZS5zZXRVc2VyID0gZnVuY3Rpb24gKHVzZXIpIHtcbiAgICAgICAgdmFyIHRvcCA9IHRoaXMuZ2V0U3RhY2tUb3AoKTtcbiAgICAgICAgaWYgKCF0b3Auc2NvcGUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0b3Auc2NvcGUuc2V0VXNlcih1c2VyKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEBpbmhlcml0RG9jXG4gICAgICovXG4gICAgSHViLnByb3RvdHlwZS5zZXRUYWdzID0gZnVuY3Rpb24gKHRhZ3MpIHtcbiAgICAgICAgdmFyIHRvcCA9IHRoaXMuZ2V0U3RhY2tUb3AoKTtcbiAgICAgICAgaWYgKCF0b3Auc2NvcGUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0b3Auc2NvcGUuc2V0VGFncyh0YWdzKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEBpbmhlcml0RG9jXG4gICAgICovXG4gICAgSHViLnByb3RvdHlwZS5zZXRFeHRyYXMgPSBmdW5jdGlvbiAoZXh0cmFzKSB7XG4gICAgICAgIHZhciB0b3AgPSB0aGlzLmdldFN0YWNrVG9wKCk7XG4gICAgICAgIGlmICghdG9wLnNjb3BlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdG9wLnNjb3BlLnNldEV4dHJhcyhleHRyYXMpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQGluaGVyaXREb2NcbiAgICAgKi9cbiAgICBIdWIucHJvdG90eXBlLnNldFRhZyA9IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gICAgICAgIHZhciB0b3AgPSB0aGlzLmdldFN0YWNrVG9wKCk7XG4gICAgICAgIGlmICghdG9wLnNjb3BlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdG9wLnNjb3BlLnNldFRhZyhrZXksIHZhbHVlKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEBpbmhlcml0RG9jXG4gICAgICovXG4gICAgSHViLnByb3RvdHlwZS5zZXRFeHRyYSA9IGZ1bmN0aW9uIChrZXksIGV4dHJhKSB7XG4gICAgICAgIHZhciB0b3AgPSB0aGlzLmdldFN0YWNrVG9wKCk7XG4gICAgICAgIGlmICghdG9wLnNjb3BlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdG9wLnNjb3BlLnNldEV4dHJhKGtleSwgZXh0cmEpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQGluaGVyaXREb2NcbiAgICAgKi9cbiAgICBIdWIucHJvdG90eXBlLnNldENvbnRleHQgPSBmdW5jdGlvbiAobmFtZSwgY29udGV4dCkge1xuICAgICAgICB2YXIgdG9wID0gdGhpcy5nZXRTdGFja1RvcCgpO1xuICAgICAgICBpZiAoIXRvcC5zY29wZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRvcC5zY29wZS5zZXRDb250ZXh0KG5hbWUsIGNvbnRleHQpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQGluaGVyaXREb2NcbiAgICAgKi9cbiAgICBIdWIucHJvdG90eXBlLmNvbmZpZ3VyZVNjb3BlID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgICAgIHZhciB0b3AgPSB0aGlzLmdldFN0YWNrVG9wKCk7XG4gICAgICAgIGlmICh0b3Auc2NvcGUgJiYgdG9wLmNsaWVudCkge1xuICAgICAgICAgICAgY2FsbGJhY2sodG9wLnNjb3BlKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLyoqXG4gICAgICogQGluaGVyaXREb2NcbiAgICAgKi9cbiAgICBIdWIucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgICB2YXIgb2xkSHViID0gbWFrZU1haW4odGhpcyk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjYWxsYmFjayh0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIG1ha2VNYWluKG9sZEh1Yik7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEBpbmhlcml0RG9jXG4gICAgICovXG4gICAgSHViLnByb3RvdHlwZS5nZXRJbnRlZ3JhdGlvbiA9IGZ1bmN0aW9uIChpbnRlZ3JhdGlvbikge1xuICAgICAgICB2YXIgY2xpZW50ID0gdGhpcy5nZXRDbGllbnQoKTtcbiAgICAgICAgaWYgKCFjbGllbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gY2xpZW50LmdldEludGVncmF0aW9uKGludGVncmF0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoX29PKSB7XG4gICAgICAgICAgICBsb2dnZXIud2FybihcIkNhbm5vdCByZXRyaWV2ZSBpbnRlZ3JhdGlvbiBcIiArIGludGVncmF0aW9uLmlkICsgXCIgZnJvbSB0aGUgY3VycmVudCBIdWJcIik7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLyoqXG4gICAgICogQGluaGVyaXREb2NcbiAgICAgKi9cbiAgICBIdWIucHJvdG90eXBlLnN0YXJ0U3BhbiA9IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jYWxsRXh0ZW5zaW9uTWV0aG9kKCdzdGFydFNwYW4nLCBjb250ZXh0KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEBpbmhlcml0RG9jXG4gICAgICovXG4gICAgSHViLnByb3RvdHlwZS5zdGFydFRyYW5zYWN0aW9uID0gZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NhbGxFeHRlbnNpb25NZXRob2QoJ3N0YXJ0VHJhbnNhY3Rpb24nLCBjb250ZXh0KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEBpbmhlcml0RG9jXG4gICAgICovXG4gICAgSHViLnByb3RvdHlwZS50cmFjZUhlYWRlcnMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jYWxsRXh0ZW5zaW9uTWV0aG9kKCd0cmFjZUhlYWRlcnMnKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENhbGxzIGdsb2JhbCBleHRlbnNpb24gbWV0aG9kIGFuZCBiaW5kaW5nIGN1cnJlbnQgaW5zdGFuY2UgdG8gdGhlIGZ1bmN0aW9uIGNhbGxcbiAgICAgKi9cbiAgICAvLyBAdHMtaWdub3JlXG4gICAgSHViLnByb3RvdHlwZS5fY2FsbEV4dGVuc2lvbk1ldGhvZCA9IGZ1bmN0aW9uIChtZXRob2QpIHtcbiAgICAgICAgdmFyIGFyZ3MgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgX2kgPSAxOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgIGFyZ3NbX2kgLSAxXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNhcnJpZXIgPSBnZXRNYWluQ2FycmllcigpO1xuICAgICAgICB2YXIgc2VudHJ5ID0gY2Fycmllci5fX1NFTlRSWV9fO1xuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IHN0cmljdC10eXBlLXByZWRpY2F0ZXNcbiAgICAgICAgaWYgKHNlbnRyeSAmJiBzZW50cnkuZXh0ZW5zaW9ucyAmJiB0eXBlb2Ygc2VudHJ5LmV4dGVuc2lvbnNbbWV0aG9kXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgcmV0dXJuIHNlbnRyeS5leHRlbnNpb25zW21ldGhvZF0uYXBwbHkodGhpcywgYXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgbG9nZ2VyLndhcm4oXCJFeHRlbnNpb24gbWV0aG9kIFwiICsgbWV0aG9kICsgXCIgY291bGRuJ3QgYmUgZm91bmQsIGRvaW5nIG5vdGhpbmcuXCIpO1xuICAgIH07XG4gICAgcmV0dXJuIEh1Yjtcbn0oKSk7XG5leHBvcnQgeyBIdWIgfTtcbi8qKiBSZXR1cm5zIHRoZSBnbG9iYWwgc2hpbSByZWdpc3RyeS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRNYWluQ2FycmllcigpIHtcbiAgICB2YXIgY2FycmllciA9IGdldEdsb2JhbE9iamVjdCgpO1xuICAgIGNhcnJpZXIuX19TRU5UUllfXyA9IGNhcnJpZXIuX19TRU5UUllfXyB8fCB7XG4gICAgICAgIGV4dGVuc2lvbnM6IHt9LFxuICAgICAgICBodWI6IHVuZGVmaW5lZCxcbiAgICB9O1xuICAgIHJldHVybiBjYXJyaWVyO1xufVxuLyoqXG4gKiBSZXBsYWNlcyB0aGUgY3VycmVudCBtYWluIGh1YiB3aXRoIHRoZSBwYXNzZWQgb25lIG9uIHRoZSBnbG9iYWwgb2JqZWN0XG4gKlxuICogQHJldHVybnMgVGhlIG9sZCByZXBsYWNlZCBodWJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1ha2VNYWluKGh1Yikge1xuICAgIHZhciByZWdpc3RyeSA9IGdldE1haW5DYXJyaWVyKCk7XG4gICAgdmFyIG9sZEh1YiA9IGdldEh1YkZyb21DYXJyaWVyKHJlZ2lzdHJ5KTtcbiAgICBzZXRIdWJPbkNhcnJpZXIocmVnaXN0cnksIGh1Yik7XG4gICAgcmV0dXJuIG9sZEh1Yjtcbn1cbi8qKlxuICogUmV0dXJucyB0aGUgZGVmYXVsdCBodWIgaW5zdGFuY2UuXG4gKlxuICogSWYgYSBodWIgaXMgYWxyZWFkeSByZWdpc3RlcmVkIGluIHRoZSBnbG9iYWwgY2FycmllciBidXQgdGhpcyBtb2R1bGVcbiAqIGNvbnRhaW5zIGEgbW9yZSByZWNlbnQgdmVyc2lvbiwgaXQgcmVwbGFjZXMgdGhlIHJlZ2lzdGVyZWQgdmVyc2lvbi5cbiAqIE90aGVyd2lzZSwgdGhlIGN1cnJlbnRseSByZWdpc3RlcmVkIGh1YiB3aWxsIGJlIHJldHVybmVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q3VycmVudEh1YigpIHtcbiAgICAvLyBHZXQgbWFpbiBjYXJyaWVyIChnbG9iYWwgZm9yIGV2ZXJ5IGVudmlyb25tZW50KVxuICAgIHZhciByZWdpc3RyeSA9IGdldE1haW5DYXJyaWVyKCk7XG4gICAgLy8gSWYgdGhlcmUncyBubyBodWIsIG9yIGl0cyBhbiBvbGQgQVBJLCBhc3NpZ24gYSBuZXcgb25lXG4gICAgaWYgKCFoYXNIdWJPbkNhcnJpZXIocmVnaXN0cnkpIHx8IGdldEh1YkZyb21DYXJyaWVyKHJlZ2lzdHJ5KS5pc09sZGVyVGhhbihBUElfVkVSU0lPTikpIHtcbiAgICAgICAgc2V0SHViT25DYXJyaWVyKHJlZ2lzdHJ5LCBuZXcgSHViKCkpO1xuICAgIH1cbiAgICAvLyBQcmVmZXIgZG9tYWlucyBvdmVyIGdsb2JhbCBpZiB0aGV5IGFyZSB0aGVyZSAoYXBwbGljYWJsZSBvbmx5IHRvIE5vZGUgZW52aXJvbm1lbnQpXG4gICAgaWYgKGlzTm9kZUVudigpKSB7XG4gICAgICAgIHJldHVybiBnZXRIdWJGcm9tQWN0aXZlRG9tYWluKHJlZ2lzdHJ5KTtcbiAgICB9XG4gICAgLy8gUmV0dXJuIGh1YiB0aGF0IGxpdmVzIG9uIGEgZ2xvYmFsIG9iamVjdFxuICAgIHJldHVybiBnZXRIdWJGcm9tQ2FycmllcihyZWdpc3RyeSk7XG59XG4vKipcbiAqIFRyeSB0byByZWFkIHRoZSBodWIgZnJvbSBhbiBhY3RpdmUgZG9tYWluLCBmYWxsYmFjayB0byB0aGUgcmVnaXN0cnkgaWYgb25lIGRvZXNudCBleGlzdFxuICogQHJldHVybnMgZGlzY292ZXJlZCBodWJcbiAqL1xuZnVuY3Rpb24gZ2V0SHViRnJvbUFjdGl2ZURvbWFpbihyZWdpc3RyeSkge1xuICAgIHRyeSB7XG4gICAgICAgIHZhciBwcm9wZXJ0eSA9ICdkb21haW4nO1xuICAgICAgICB2YXIgY2FycmllciA9IGdldE1haW5DYXJyaWVyKCk7XG4gICAgICAgIHZhciBzZW50cnkgPSBjYXJyaWVyLl9fU0VOVFJZX187XG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogc3RyaWN0LXR5cGUtcHJlZGljYXRlc1xuICAgICAgICBpZiAoIXNlbnRyeSB8fCAhc2VudHJ5LmV4dGVuc2lvbnMgfHwgIXNlbnRyeS5leHRlbnNpb25zW3Byb3BlcnR5XSkge1xuICAgICAgICAgICAgcmV0dXJuIGdldEh1YkZyb21DYXJyaWVyKHJlZ2lzdHJ5KTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZG9tYWluID0gc2VudHJ5LmV4dGVuc2lvbnNbcHJvcGVydHldO1xuICAgICAgICB2YXIgYWN0aXZlRG9tYWluID0gZG9tYWluLmFjdGl2ZTtcbiAgICAgICAgLy8gSWYgdGhlcmUgbm8gYWN0aXZlIGRvbWFpbiwganVzdCByZXR1cm4gZ2xvYmFsIGh1YlxuICAgICAgICBpZiAoIWFjdGl2ZURvbWFpbikge1xuICAgICAgICAgICAgcmV0dXJuIGdldEh1YkZyb21DYXJyaWVyKHJlZ2lzdHJ5KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBJZiB0aGVyZSdzIG5vIGh1YiBvbiBjdXJyZW50IGRvbWFpbiwgb3IgaXRzIGFuIG9sZCBBUEksIGFzc2lnbiBhIG5ldyBvbmVcbiAgICAgICAgaWYgKCFoYXNIdWJPbkNhcnJpZXIoYWN0aXZlRG9tYWluKSB8fCBnZXRIdWJGcm9tQ2FycmllcihhY3RpdmVEb21haW4pLmlzT2xkZXJUaGFuKEFQSV9WRVJTSU9OKSkge1xuICAgICAgICAgICAgdmFyIHJlZ2lzdHJ5SHViVG9wU3RhY2sgPSBnZXRIdWJGcm9tQ2FycmllcihyZWdpc3RyeSkuZ2V0U3RhY2tUb3AoKTtcbiAgICAgICAgICAgIHNldEh1Yk9uQ2FycmllcihhY3RpdmVEb21haW4sIG5ldyBIdWIocmVnaXN0cnlIdWJUb3BTdGFjay5jbGllbnQsIFNjb3BlLmNsb25lKHJlZ2lzdHJ5SHViVG9wU3RhY2suc2NvcGUpKSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gUmV0dXJuIGh1YiB0aGF0IGxpdmVzIG9uIGEgZG9tYWluXG4gICAgICAgIHJldHVybiBnZXRIdWJGcm9tQ2FycmllcihhY3RpdmVEb21haW4pO1xuICAgIH1cbiAgICBjYXRjaCAoX09vKSB7XG4gICAgICAgIC8vIFJldHVybiBodWIgdGhhdCBsaXZlcyBvbiBhIGdsb2JhbCBvYmplY3RcbiAgICAgICAgcmV0dXJuIGdldEh1YkZyb21DYXJyaWVyKHJlZ2lzdHJ5KTtcbiAgICB9XG59XG4vKipcbiAqIFRoaXMgd2lsbCB0ZWxsIHdoZXRoZXIgYSBjYXJyaWVyIGhhcyBhIGh1YiBvbiBpdCBvciBub3RcbiAqIEBwYXJhbSBjYXJyaWVyIG9iamVjdFxuICovXG5mdW5jdGlvbiBoYXNIdWJPbkNhcnJpZXIoY2Fycmllcikge1xuICAgIGlmIChjYXJyaWVyICYmIGNhcnJpZXIuX19TRU5UUllfXyAmJiBjYXJyaWVyLl9fU0VOVFJZX18uaHViKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG4vKipcbiAqIFRoaXMgd2lsbCBjcmVhdGUgYSBuZXcge0BsaW5rIEh1Yn0gYW5kIGFkZCB0byB0aGUgcGFzc2VkIG9iamVjdCBvblxuICogX19TRU5UUllfXy5odWIuXG4gKiBAcGFyYW0gY2FycmllciBvYmplY3RcbiAqIEBoaWRkZW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEh1YkZyb21DYXJyaWVyKGNhcnJpZXIpIHtcbiAgICBpZiAoY2FycmllciAmJiBjYXJyaWVyLl9fU0VOVFJZX18gJiYgY2Fycmllci5fX1NFTlRSWV9fLmh1Yikge1xuICAgICAgICByZXR1cm4gY2Fycmllci5fX1NFTlRSWV9fLmh1YjtcbiAgICB9XG4gICAgY2Fycmllci5fX1NFTlRSWV9fID0gY2Fycmllci5fX1NFTlRSWV9fIHx8IHt9O1xuICAgIGNhcnJpZXIuX19TRU5UUllfXy5odWIgPSBuZXcgSHViKCk7XG4gICAgcmV0dXJuIGNhcnJpZXIuX19TRU5UUllfXy5odWI7XG59XG4vKipcbiAqIFRoaXMgd2lsbCBzZXQgcGFzc2VkIHtAbGluayBIdWJ9IG9uIHRoZSBwYXNzZWQgb2JqZWN0J3MgX19TRU5UUllfXy5odWIgYXR0cmlidXRlXG4gKiBAcGFyYW0gY2FycmllciBvYmplY3RcbiAqIEBwYXJhbSBodWIgSHViXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRIdWJPbkNhcnJpZXIoY2FycmllciwgaHViKSB7XG4gICAgaWYgKCFjYXJyaWVyKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY2Fycmllci5fX1NFTlRSWV9fID0gY2Fycmllci5fX1NFTlRSWV9fIHx8IHt9O1xuICAgIGNhcnJpZXIuX19TRU5UUllfXy5odWIgPSBodWI7XG4gICAgcmV0dXJuIHRydWU7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1odWIuanMubWFwIiwiZXhwb3J0IHsgYWRkR2xvYmFsRXZlbnRQcm9jZXNzb3IsIFNjb3BlIH0gZnJvbSAnLi9zY29wZSc7XG5leHBvcnQgeyBnZXRDdXJyZW50SHViLCBnZXRIdWJGcm9tQ2FycmllciwgZ2V0TWFpbkNhcnJpZXIsIEh1YiwgbWFrZU1haW4sIHNldEh1Yk9uQ2FycmllciB9IGZyb20gJy4vaHViJztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsImltcG9ydCAqIGFzIHRzbGliXzEgZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBnZXRHbG9iYWxPYmplY3QsIGlzUGxhaW5PYmplY3QsIGlzVGhlbmFibGUsIFN5bmNQcm9taXNlLCB0aW1lc3RhbXBXaXRoTXMgfSBmcm9tICdAc2VudHJ5L3V0aWxzJztcbi8qKlxuICogSG9sZHMgYWRkaXRpb25hbCBldmVudCBpbmZvcm1hdGlvbi4ge0BsaW5rIFNjb3BlLmFwcGx5VG9FdmVudH0gd2lsbCBiZVxuICogY2FsbGVkIGJ5IHRoZSBjbGllbnQgYmVmb3JlIGFuIGV2ZW50IHdpbGwgYmUgc2VudC5cbiAqL1xudmFyIFNjb3BlID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFNjb3BlKCkge1xuICAgICAgICAvKiogRmxhZyBpZiBub3RpZml5aW5nIGlzIGhhcHBlbmluZy4gKi9cbiAgICAgICAgdGhpcy5fbm90aWZ5aW5nTGlzdGVuZXJzID0gZmFsc2U7XG4gICAgICAgIC8qKiBDYWxsYmFjayBmb3IgY2xpZW50IHRvIHJlY2VpdmUgc2NvcGUgY2hhbmdlcy4gKi9cbiAgICAgICAgdGhpcy5fc2NvcGVMaXN0ZW5lcnMgPSBbXTtcbiAgICAgICAgLyoqIENhbGxiYWNrIGxpc3QgdGhhdCB3aWxsIGJlIGNhbGxlZCBhZnRlciB7QGxpbmsgYXBwbHlUb0V2ZW50fS4gKi9cbiAgICAgICAgdGhpcy5fZXZlbnRQcm9jZXNzb3JzID0gW107XG4gICAgICAgIC8qKiBBcnJheSBvZiBicmVhZGNydW1icy4gKi9cbiAgICAgICAgdGhpcy5fYnJlYWRjcnVtYnMgPSBbXTtcbiAgICAgICAgLyoqIFVzZXIgKi9cbiAgICAgICAgdGhpcy5fdXNlciA9IHt9O1xuICAgICAgICAvKiogVGFncyAqL1xuICAgICAgICB0aGlzLl90YWdzID0ge307XG4gICAgICAgIC8qKiBFeHRyYSAqL1xuICAgICAgICB0aGlzLl9leHRyYSA9IHt9O1xuICAgICAgICAvKiogQ29udGV4dHMgKi9cbiAgICAgICAgdGhpcy5fY29udGV4dHMgPSB7fTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkIGludGVybmFsIG9uIGNoYW5nZSBsaXN0ZW5lci4gVXNlZCBmb3Igc3ViIFNES3MgdGhhdCBuZWVkIHRvIHN0b3JlIHRoZSBzY29wZS5cbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgU2NvcGUucHJvdG90eXBlLmFkZFNjb3BlTGlzdGVuZXIgPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICAgICAgdGhpcy5fc2NvcGVMaXN0ZW5lcnMucHVzaChjYWxsYmFjayk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuICAgIFNjb3BlLnByb3RvdHlwZS5hZGRFdmVudFByb2Nlc3NvciA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgICB0aGlzLl9ldmVudFByb2Nlc3NvcnMucHVzaChjYWxsYmFjayk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogVGhpcyB3aWxsIGJlIGNhbGxlZCBvbiBldmVyeSBzZXQgY2FsbC5cbiAgICAgKi9cbiAgICBTY29wZS5wcm90b3R5cGUuX25vdGlmeVNjb3BlTGlzdGVuZXJzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICBpZiAoIXRoaXMuX25vdGlmeWluZ0xpc3RlbmVycykge1xuICAgICAgICAgICAgdGhpcy5fbm90aWZ5aW5nTGlzdGVuZXJzID0gdHJ1ZTtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIF90aGlzLl9zY29wZUxpc3RlbmVycy5mb3JFYWNoKGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhfdGhpcyk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgX3RoaXMuX25vdGlmeWluZ0xpc3RlbmVycyA9IGZhbHNlO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFRoaXMgd2lsbCBiZSBjYWxsZWQgYWZ0ZXIge0BsaW5rIGFwcGx5VG9FdmVudH0gaXMgZmluaXNoZWQuXG4gICAgICovXG4gICAgU2NvcGUucHJvdG90eXBlLl9ub3RpZnlFdmVudFByb2Nlc3NvcnMgPSBmdW5jdGlvbiAocHJvY2Vzc29ycywgZXZlbnQsIGhpbnQsIGluZGV4KSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIGlmIChpbmRleCA9PT0gdm9pZCAwKSB7IGluZGV4ID0gMDsgfVxuICAgICAgICByZXR1cm4gbmV3IFN5bmNQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICAgIHZhciBwcm9jZXNzb3IgPSBwcm9jZXNzb3JzW2luZGV4XTtcbiAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpzdHJpY3QtdHlwZS1wcmVkaWNhdGVzXG4gICAgICAgICAgICBpZiAoZXZlbnQgPT09IG51bGwgfHwgdHlwZW9mIHByb2Nlc3NvciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIHJlc29sdmUoZXZlbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHByb2Nlc3Nvcih0c2xpYl8xLl9fYXNzaWduKHt9LCBldmVudCksIGhpbnQpO1xuICAgICAgICAgICAgICAgIGlmIChpc1RoZW5hYmxlKHJlc3VsdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0XG4gICAgICAgICAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoZmluYWwpIHsgcmV0dXJuIF90aGlzLl9ub3RpZnlFdmVudFByb2Nlc3NvcnMocHJvY2Vzc29ycywgZmluYWwsIGhpbnQsIGluZGV4ICsgMSkudGhlbihyZXNvbHZlKTsgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKG51bGwsIHJlamVjdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBfdGhpcy5fbm90aWZ5RXZlbnRQcm9jZXNzb3JzKHByb2Nlc3NvcnMsIHJlc3VsdCwgaGludCwgaW5kZXggKyAxKVxuICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4ocmVzb2x2ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKG51bGwsIHJlamVjdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEBpbmhlcml0RG9jXG4gICAgICovXG4gICAgU2NvcGUucHJvdG90eXBlLnNldFVzZXIgPSBmdW5jdGlvbiAodXNlcikge1xuICAgICAgICB0aGlzLl91c2VyID0gdXNlciB8fCB7fTtcbiAgICAgICAgdGhpcy5fbm90aWZ5U2NvcGVMaXN0ZW5lcnMoKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuICAgIFNjb3BlLnByb3RvdHlwZS5zZXRUYWdzID0gZnVuY3Rpb24gKHRhZ3MpIHtcbiAgICAgICAgdGhpcy5fdGFncyA9IHRzbGliXzEuX19hc3NpZ24oe30sIHRoaXMuX3RhZ3MsIHRhZ3MpO1xuICAgICAgICB0aGlzLl9ub3RpZnlTY29wZUxpc3RlbmVycygpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEBpbmhlcml0RG9jXG4gICAgICovXG4gICAgU2NvcGUucHJvdG90eXBlLnNldFRhZyA9IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgdGhpcy5fdGFncyA9IHRzbGliXzEuX19hc3NpZ24oe30sIHRoaXMuX3RhZ3MsIChfYSA9IHt9LCBfYVtrZXldID0gdmFsdWUsIF9hKSk7XG4gICAgICAgIHRoaXMuX25vdGlmeVNjb3BlTGlzdGVuZXJzKCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQGluaGVyaXREb2NcbiAgICAgKi9cbiAgICBTY29wZS5wcm90b3R5cGUuc2V0RXh0cmFzID0gZnVuY3Rpb24gKGV4dHJhcykge1xuICAgICAgICB0aGlzLl9leHRyYSA9IHRzbGliXzEuX19hc3NpZ24oe30sIHRoaXMuX2V4dHJhLCBleHRyYXMpO1xuICAgICAgICB0aGlzLl9ub3RpZnlTY29wZUxpc3RlbmVycygpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEBpbmhlcml0RG9jXG4gICAgICovXG4gICAgU2NvcGUucHJvdG90eXBlLnNldEV4dHJhID0gZnVuY3Rpb24gKGtleSwgZXh0cmEpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICB0aGlzLl9leHRyYSA9IHRzbGliXzEuX19hc3NpZ24oe30sIHRoaXMuX2V4dHJhLCAoX2EgPSB7fSwgX2Fba2V5XSA9IGV4dHJhLCBfYSkpO1xuICAgICAgICB0aGlzLl9ub3RpZnlTY29wZUxpc3RlbmVycygpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEBpbmhlcml0RG9jXG4gICAgICovXG4gICAgU2NvcGUucHJvdG90eXBlLnNldEZpbmdlcnByaW50ID0gZnVuY3Rpb24gKGZpbmdlcnByaW50KSB7XG4gICAgICAgIHRoaXMuX2ZpbmdlcnByaW50ID0gZmluZ2VycHJpbnQ7XG4gICAgICAgIHRoaXMuX25vdGlmeVNjb3BlTGlzdGVuZXJzKCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQGluaGVyaXREb2NcbiAgICAgKi9cbiAgICBTY29wZS5wcm90b3R5cGUuc2V0TGV2ZWwgPSBmdW5jdGlvbiAobGV2ZWwpIHtcbiAgICAgICAgdGhpcy5fbGV2ZWwgPSBsZXZlbDtcbiAgICAgICAgdGhpcy5fbm90aWZ5U2NvcGVMaXN0ZW5lcnMoKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdERvY1xuICAgICAqL1xuICAgIFNjb3BlLnByb3RvdHlwZS5zZXRUcmFuc2FjdGlvbiA9IGZ1bmN0aW9uICh0cmFuc2FjdGlvbikge1xuICAgICAgICB0aGlzLl90cmFuc2FjdGlvbiA9IHRyYW5zYWN0aW9uO1xuICAgICAgICB0aGlzLl9ub3RpZnlTY29wZUxpc3RlbmVycygpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEBpbmhlcml0RG9jXG4gICAgICovXG4gICAgU2NvcGUucHJvdG90eXBlLnNldENvbnRleHQgPSBmdW5jdGlvbiAoa2V5LCBjb250ZXh0KSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgdGhpcy5fY29udGV4dHMgPSB0c2xpYl8xLl9fYXNzaWduKHt9LCB0aGlzLl9jb250ZXh0cywgKF9hID0ge30sIF9hW2tleV0gPSBjb250ZXh0LCBfYSkpO1xuICAgICAgICB0aGlzLl9ub3RpZnlTY29wZUxpc3RlbmVycygpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEBpbmhlcml0RG9jXG4gICAgICovXG4gICAgU2NvcGUucHJvdG90eXBlLnNldFNwYW4gPSBmdW5jdGlvbiAoc3Bhbikge1xuICAgICAgICB0aGlzLl9zcGFuID0gc3BhbjtcbiAgICAgICAgdGhpcy5fbm90aWZ5U2NvcGVMaXN0ZW5lcnMoKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBJbnRlcm5hbCBnZXR0ZXIgZm9yIFNwYW4sIHVzZWQgaW4gSHViLlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBTY29wZS5wcm90b3R5cGUuZ2V0U3BhbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NwYW47XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBJbmhlcml0IHZhbHVlcyBmcm9tIHRoZSBwYXJlbnQgc2NvcGUuXG4gICAgICogQHBhcmFtIHNjb3BlIHRvIGNsb25lLlxuICAgICAqL1xuICAgIFNjb3BlLmNsb25lID0gZnVuY3Rpb24gKHNjb3BlKSB7XG4gICAgICAgIHZhciBuZXdTY29wZSA9IG5ldyBTY29wZSgpO1xuICAgICAgICBpZiAoc2NvcGUpIHtcbiAgICAgICAgICAgIG5ld1Njb3BlLl9icmVhZGNydW1icyA9IHRzbGliXzEuX19zcHJlYWQoc2NvcGUuX2JyZWFkY3J1bWJzKTtcbiAgICAgICAgICAgIG5ld1Njb3BlLl90YWdzID0gdHNsaWJfMS5fX2Fzc2lnbih7fSwgc2NvcGUuX3RhZ3MpO1xuICAgICAgICAgICAgbmV3U2NvcGUuX2V4dHJhID0gdHNsaWJfMS5fX2Fzc2lnbih7fSwgc2NvcGUuX2V4dHJhKTtcbiAgICAgICAgICAgIG5ld1Njb3BlLl9jb250ZXh0cyA9IHRzbGliXzEuX19hc3NpZ24oe30sIHNjb3BlLl9jb250ZXh0cyk7XG4gICAgICAgICAgICBuZXdTY29wZS5fdXNlciA9IHNjb3BlLl91c2VyO1xuICAgICAgICAgICAgbmV3U2NvcGUuX2xldmVsID0gc2NvcGUuX2xldmVsO1xuICAgICAgICAgICAgbmV3U2NvcGUuX3NwYW4gPSBzY29wZS5fc3BhbjtcbiAgICAgICAgICAgIG5ld1Njb3BlLl90cmFuc2FjdGlvbiA9IHNjb3BlLl90cmFuc2FjdGlvbjtcbiAgICAgICAgICAgIG5ld1Njb3BlLl9maW5nZXJwcmludCA9IHNjb3BlLl9maW5nZXJwcmludDtcbiAgICAgICAgICAgIG5ld1Njb3BlLl9ldmVudFByb2Nlc3NvcnMgPSB0c2xpYl8xLl9fc3ByZWFkKHNjb3BlLl9ldmVudFByb2Nlc3NvcnMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXdTY29wZTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEBpbmhlcml0RG9jXG4gICAgICovXG4gICAgU2NvcGUucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uIChjYXB0dXJlQ29udGV4dCkge1xuICAgICAgICBpZiAoIWNhcHR1cmVDb250ZXh0KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGNhcHR1cmVDb250ZXh0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB2YXIgdXBkYXRlZFNjb3BlID0gY2FwdHVyZUNvbnRleHQodGhpcyk7XG4gICAgICAgICAgICByZXR1cm4gdXBkYXRlZFNjb3BlIGluc3RhbmNlb2YgU2NvcGUgPyB1cGRhdGVkU2NvcGUgOiB0aGlzO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjYXB0dXJlQ29udGV4dCBpbnN0YW5jZW9mIFNjb3BlKSB7XG4gICAgICAgICAgICB0aGlzLl90YWdzID0gdHNsaWJfMS5fX2Fzc2lnbih7fSwgdGhpcy5fdGFncywgY2FwdHVyZUNvbnRleHQuX3RhZ3MpO1xuICAgICAgICAgICAgdGhpcy5fZXh0cmEgPSB0c2xpYl8xLl9fYXNzaWduKHt9LCB0aGlzLl9leHRyYSwgY2FwdHVyZUNvbnRleHQuX2V4dHJhKTtcbiAgICAgICAgICAgIHRoaXMuX2NvbnRleHRzID0gdHNsaWJfMS5fX2Fzc2lnbih7fSwgdGhpcy5fY29udGV4dHMsIGNhcHR1cmVDb250ZXh0Ll9jb250ZXh0cyk7XG4gICAgICAgICAgICBpZiAoY2FwdHVyZUNvbnRleHQuX3VzZXIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl91c2VyID0gY2FwdHVyZUNvbnRleHQuX3VzZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY2FwdHVyZUNvbnRleHQuX2xldmVsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbGV2ZWwgPSBjYXB0dXJlQ29udGV4dC5fbGV2ZWw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY2FwdHVyZUNvbnRleHQuX2ZpbmdlcnByaW50KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZmluZ2VycHJpbnQgPSBjYXB0dXJlQ29udGV4dC5fZmluZ2VycHJpbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNQbGFpbk9iamVjdChjYXB0dXJlQ29udGV4dCkpIHtcbiAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1wYXJhbWV0ZXItcmVhc3NpZ25tZW50XG4gICAgICAgICAgICBjYXB0dXJlQ29udGV4dCA9IGNhcHR1cmVDb250ZXh0O1xuICAgICAgICAgICAgdGhpcy5fdGFncyA9IHRzbGliXzEuX19hc3NpZ24oe30sIHRoaXMuX3RhZ3MsIGNhcHR1cmVDb250ZXh0LnRhZ3MpO1xuICAgICAgICAgICAgdGhpcy5fZXh0cmEgPSB0c2xpYl8xLl9fYXNzaWduKHt9LCB0aGlzLl9leHRyYSwgY2FwdHVyZUNvbnRleHQuZXh0cmEpO1xuICAgICAgICAgICAgdGhpcy5fY29udGV4dHMgPSB0c2xpYl8xLl9fYXNzaWduKHt9LCB0aGlzLl9jb250ZXh0cywgY2FwdHVyZUNvbnRleHQuY29udGV4dHMpO1xuICAgICAgICAgICAgaWYgKGNhcHR1cmVDb250ZXh0LnVzZXIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl91c2VyID0gY2FwdHVyZUNvbnRleHQudXNlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjYXB0dXJlQ29udGV4dC5sZXZlbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2xldmVsID0gY2FwdHVyZUNvbnRleHQubGV2ZWw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY2FwdHVyZUNvbnRleHQuZmluZ2VycHJpbnQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9maW5nZXJwcmludCA9IGNhcHR1cmVDb250ZXh0LmZpbmdlcnByaW50O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQGluaGVyaXREb2NcbiAgICAgKi9cbiAgICBTY29wZS5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuX2JyZWFkY3J1bWJzID0gW107XG4gICAgICAgIHRoaXMuX3RhZ3MgPSB7fTtcbiAgICAgICAgdGhpcy5fZXh0cmEgPSB7fTtcbiAgICAgICAgdGhpcy5fdXNlciA9IHt9O1xuICAgICAgICB0aGlzLl9jb250ZXh0cyA9IHt9O1xuICAgICAgICB0aGlzLl9sZXZlbCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fdHJhbnNhY3Rpb24gPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuX2ZpbmdlcnByaW50ID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLl9zcGFuID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLl9ub3RpZnlTY29wZUxpc3RlbmVycygpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEBpbmhlcml0RG9jXG4gICAgICovXG4gICAgU2NvcGUucHJvdG90eXBlLmFkZEJyZWFkY3J1bWIgPSBmdW5jdGlvbiAoYnJlYWRjcnVtYiwgbWF4QnJlYWRjcnVtYnMpIHtcbiAgICAgICAgdmFyIG1lcmdlZEJyZWFkY3J1bWIgPSB0c2xpYl8xLl9fYXNzaWduKHsgdGltZXN0YW1wOiB0aW1lc3RhbXBXaXRoTXMoKSB9LCBicmVhZGNydW1iKTtcbiAgICAgICAgdGhpcy5fYnJlYWRjcnVtYnMgPVxuICAgICAgICAgICAgbWF4QnJlYWRjcnVtYnMgIT09IHVuZGVmaW5lZCAmJiBtYXhCcmVhZGNydW1icyA+PSAwXG4gICAgICAgICAgICAgICAgPyB0c2xpYl8xLl9fc3ByZWFkKHRoaXMuX2JyZWFkY3J1bWJzLCBbbWVyZ2VkQnJlYWRjcnVtYl0pLnNsaWNlKC1tYXhCcmVhZGNydW1icylcbiAgICAgICAgICAgICAgICA6IHRzbGliXzEuX19zcHJlYWQodGhpcy5fYnJlYWRjcnVtYnMsIFttZXJnZWRCcmVhZGNydW1iXSk7XG4gICAgICAgIHRoaXMuX25vdGlmeVNjb3BlTGlzdGVuZXJzKCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQGluaGVyaXREb2NcbiAgICAgKi9cbiAgICBTY29wZS5wcm90b3R5cGUuY2xlYXJCcmVhZGNydW1icyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5fYnJlYWRjcnVtYnMgPSBbXTtcbiAgICAgICAgdGhpcy5fbm90aWZ5U2NvcGVMaXN0ZW5lcnMoKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBBcHBsaWVzIGZpbmdlcnByaW50IGZyb20gdGhlIHNjb3BlIHRvIHRoZSBldmVudCBpZiB0aGVyZSdzIG9uZSxcbiAgICAgKiB1c2VzIG1lc3NhZ2UgaWYgdGhlcmUncyBvbmUgaW5zdGVhZCBvciBnZXQgcmlkIG9mIGVtcHR5IGZpbmdlcnByaW50XG4gICAgICovXG4gICAgU2NvcGUucHJvdG90eXBlLl9hcHBseUZpbmdlcnByaW50ID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIC8vIE1ha2Ugc3VyZSBpdCdzIGFuIGFycmF5IGZpcnN0IGFuZCB3ZSBhY3R1YWxseSBoYXZlIHNvbWV0aGluZyBpbiBwbGFjZVxuICAgICAgICBldmVudC5maW5nZXJwcmludCA9IGV2ZW50LmZpbmdlcnByaW50XG4gICAgICAgICAgICA/IEFycmF5LmlzQXJyYXkoZXZlbnQuZmluZ2VycHJpbnQpXG4gICAgICAgICAgICAgICAgPyBldmVudC5maW5nZXJwcmludFxuICAgICAgICAgICAgICAgIDogW2V2ZW50LmZpbmdlcnByaW50XVxuICAgICAgICAgICAgOiBbXTtcbiAgICAgICAgLy8gSWYgd2UgaGF2ZSBzb21ldGhpbmcgb24gdGhlIHNjb3BlLCB0aGVuIG1lcmdlIGl0IHdpdGggZXZlbnRcbiAgICAgICAgaWYgKHRoaXMuX2ZpbmdlcnByaW50KSB7XG4gICAgICAgICAgICBldmVudC5maW5nZXJwcmludCA9IGV2ZW50LmZpbmdlcnByaW50LmNvbmNhdCh0aGlzLl9maW5nZXJwcmludCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgd2UgaGF2ZSBubyBkYXRhIGF0IGFsbCwgcmVtb3ZlIGVtcHR5IGFycmF5IGRlZmF1bHRcbiAgICAgICAgaWYgKGV2ZW50LmZpbmdlcnByaW50ICYmICFldmVudC5maW5nZXJwcmludC5sZW5ndGgpIHtcbiAgICAgICAgICAgIGRlbGV0ZSBldmVudC5maW5nZXJwcmludDtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLyoqXG4gICAgICogQXBwbGllcyB0aGUgY3VycmVudCBjb250ZXh0IGFuZCBmaW5nZXJwcmludCB0byB0aGUgZXZlbnQuXG4gICAgICogTm90ZSB0aGF0IGJyZWFkY3J1bWJzIHdpbGwgYmUgYWRkZWQgYnkgdGhlIGNsaWVudC5cbiAgICAgKiBBbHNvIGlmIHRoZSBldmVudCBoYXMgYWxyZWFkeSBicmVhZGNydW1icyBvbiBpdCwgd2UgZG8gbm90IG1lcmdlIHRoZW0uXG4gICAgICogQHBhcmFtIGV2ZW50IEV2ZW50XG4gICAgICogQHBhcmFtIGhpbnQgTWF5IGNvbnRhaW4gYWRkaXRpb25hbCBpbmZvcm1hcnRpb24gYWJvdXQgdGhlIG9yaWdpbmFsIGV4Y2VwdGlvbi5cbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgU2NvcGUucHJvdG90eXBlLmFwcGx5VG9FdmVudCA9IGZ1bmN0aW9uIChldmVudCwgaGludCkge1xuICAgICAgICBpZiAodGhpcy5fZXh0cmEgJiYgT2JqZWN0LmtleXModGhpcy5fZXh0cmEpLmxlbmd0aCkge1xuICAgICAgICAgICAgZXZlbnQuZXh0cmEgPSB0c2xpYl8xLl9fYXNzaWduKHt9LCB0aGlzLl9leHRyYSwgZXZlbnQuZXh0cmEpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl90YWdzICYmIE9iamVjdC5rZXlzKHRoaXMuX3RhZ3MpLmxlbmd0aCkge1xuICAgICAgICAgICAgZXZlbnQudGFncyA9IHRzbGliXzEuX19hc3NpZ24oe30sIHRoaXMuX3RhZ3MsIGV2ZW50LnRhZ3MpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl91c2VyICYmIE9iamVjdC5rZXlzKHRoaXMuX3VzZXIpLmxlbmd0aCkge1xuICAgICAgICAgICAgZXZlbnQudXNlciA9IHRzbGliXzEuX19hc3NpZ24oe30sIHRoaXMuX3VzZXIsIGV2ZW50LnVzZXIpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9jb250ZXh0cyAmJiBPYmplY3Qua2V5cyh0aGlzLl9jb250ZXh0cykubGVuZ3RoKSB7XG4gICAgICAgICAgICBldmVudC5jb250ZXh0cyA9IHRzbGliXzEuX19hc3NpZ24oe30sIHRoaXMuX2NvbnRleHRzLCBldmVudC5jb250ZXh0cyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX2xldmVsKSB7XG4gICAgICAgICAgICBldmVudC5sZXZlbCA9IHRoaXMuX2xldmVsO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl90cmFuc2FjdGlvbikge1xuICAgICAgICAgICAgZXZlbnQudHJhbnNhY3Rpb24gPSB0aGlzLl90cmFuc2FjdGlvbjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9hcHBseUZpbmdlcnByaW50KGV2ZW50KTtcbiAgICAgICAgZXZlbnQuYnJlYWRjcnVtYnMgPSB0c2xpYl8xLl9fc3ByZWFkKChldmVudC5icmVhZGNydW1icyB8fCBbXSksIHRoaXMuX2JyZWFkY3J1bWJzKTtcbiAgICAgICAgZXZlbnQuYnJlYWRjcnVtYnMgPSBldmVudC5icmVhZGNydW1icy5sZW5ndGggPiAwID8gZXZlbnQuYnJlYWRjcnVtYnMgOiB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiB0aGlzLl9ub3RpZnlFdmVudFByb2Nlc3NvcnModHNsaWJfMS5fX3NwcmVhZChnZXRHbG9iYWxFdmVudFByb2Nlc3NvcnMoKSwgdGhpcy5fZXZlbnRQcm9jZXNzb3JzKSwgZXZlbnQsIGhpbnQpO1xuICAgIH07XG4gICAgcmV0dXJuIFNjb3BlO1xufSgpKTtcbmV4cG9ydCB7IFNjb3BlIH07XG4vKipcbiAqIFJldHJ1bnMgdGhlIGdsb2JhbCBldmVudCBwcm9jZXNzb3JzLlxuICovXG5mdW5jdGlvbiBnZXRHbG9iYWxFdmVudFByb2Nlc3NvcnMoKSB7XG4gICAgdmFyIGdsb2JhbCA9IGdldEdsb2JhbE9iamVjdCgpO1xuICAgIGdsb2JhbC5fX1NFTlRSWV9fID0gZ2xvYmFsLl9fU0VOVFJZX18gfHwge307XG4gICAgZ2xvYmFsLl9fU0VOVFJZX18uZ2xvYmFsRXZlbnRQcm9jZXNzb3JzID0gZ2xvYmFsLl9fU0VOVFJZX18uZ2xvYmFsRXZlbnRQcm9jZXNzb3JzIHx8IFtdO1xuICAgIHJldHVybiBnbG9iYWwuX19TRU5UUllfXy5nbG9iYWxFdmVudFByb2Nlc3NvcnM7XG59XG4vKipcbiAqIEFkZCBhIEV2ZW50UHJvY2Vzc29yIHRvIGJlIGtlcHQgZ2xvYmFsbHkuXG4gKiBAcGFyYW0gY2FsbGJhY2sgRXZlbnRQcm9jZXNzb3IgdG8gYWRkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZGRHbG9iYWxFdmVudFByb2Nlc3NvcihjYWxsYmFjaykge1xuICAgIGdldEdsb2JhbEV2ZW50UHJvY2Vzc29ycygpLnB1c2goY2FsbGJhY2spO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c2NvcGUuanMubWFwIiwiaW1wb3J0ICogYXMgdHNsaWJfMSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IGdldEN1cnJlbnRIdWIgfSBmcm9tICdAc2VudHJ5L2h1Yic7XG4vKipcbiAqIFRoaXMgY2FsbHMgYSBmdW5jdGlvbiBvbiB0aGUgY3VycmVudCBodWIuXG4gKiBAcGFyYW0gbWV0aG9kIGZ1bmN0aW9uIHRvIGNhbGwgb24gaHViLlxuICogQHBhcmFtIGFyZ3MgdG8gcGFzcyB0byBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gY2FsbE9uSHViKG1ldGhvZCkge1xuICAgIHZhciBhcmdzID0gW107XG4gICAgZm9yICh2YXIgX2kgPSAxOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgYXJnc1tfaSAtIDFdID0gYXJndW1lbnRzW19pXTtcbiAgICB9XG4gICAgdmFyIGh1YiA9IGdldEN1cnJlbnRIdWIoKTtcbiAgICBpZiAoaHViICYmIGh1YlttZXRob2RdKSB7XG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby11bnNhZmUtYW55XG4gICAgICAgIHJldHVybiBodWJbbWV0aG9kXS5hcHBseShodWIsIHRzbGliXzEuX19zcHJlYWQoYXJncykpO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBodWIgZGVmaW5lZCBvciBcIiArIG1ldGhvZCArIFwiIHdhcyBub3QgZm91bmQgb24gdGhlIGh1YiwgcGxlYXNlIG9wZW4gYSBidWcgcmVwb3J0LlwiKTtcbn1cbi8qKlxuICogQ2FwdHVyZXMgYW4gZXhjZXB0aW9uIGV2ZW50IGFuZCBzZW5kcyBpdCB0byBTZW50cnkuXG4gKlxuICogQHBhcmFtIGV4Y2VwdGlvbiBBbiBleGNlcHRpb24tbGlrZSBvYmplY3QuXG4gKiBAcmV0dXJucyBUaGUgZ2VuZXJhdGVkIGV2ZW50SWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYXB0dXJlRXhjZXB0aW9uKGV4Y2VwdGlvbiwgY2FwdHVyZUNvbnRleHQpIHtcbiAgICB2YXIgc3ludGhldGljRXhjZXB0aW9uO1xuICAgIHRyeSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignU2VudHJ5IHN5bnRoZXRpY0V4Y2VwdGlvbicpO1xuICAgIH1cbiAgICBjYXRjaCAoZXhjZXB0aW9uKSB7XG4gICAgICAgIHN5bnRoZXRpY0V4Y2VwdGlvbiA9IGV4Y2VwdGlvbjtcbiAgICB9XG4gICAgcmV0dXJuIGNhbGxPbkh1YignY2FwdHVyZUV4Y2VwdGlvbicsIGV4Y2VwdGlvbiwge1xuICAgICAgICBjYXB0dXJlQ29udGV4dDogY2FwdHVyZUNvbnRleHQsXG4gICAgICAgIG9yaWdpbmFsRXhjZXB0aW9uOiBleGNlcHRpb24sXG4gICAgICAgIHN5bnRoZXRpY0V4Y2VwdGlvbjogc3ludGhldGljRXhjZXB0aW9uLFxuICAgIH0pO1xufVxuLyoqXG4gKiBDYXB0dXJlcyBhIG1lc3NhZ2UgZXZlbnQgYW5kIHNlbmRzIGl0IHRvIFNlbnRyeS5cbiAqXG4gKiBAcGFyYW0gbWVzc2FnZSBUaGUgbWVzc2FnZSB0byBzZW5kIHRvIFNlbnRyeS5cbiAqIEBwYXJhbSBsZXZlbCBEZWZpbmUgdGhlIGxldmVsIG9mIHRoZSBtZXNzYWdlLlxuICogQHJldHVybnMgVGhlIGdlbmVyYXRlZCBldmVudElkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2FwdHVyZU1lc3NhZ2UobWVzc2FnZSwgY2FwdHVyZUNvbnRleHQpIHtcbiAgICB2YXIgc3ludGhldGljRXhjZXB0aW9uO1xuICAgIHRyeSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgICB9XG4gICAgY2F0Y2ggKGV4Y2VwdGlvbikge1xuICAgICAgICBzeW50aGV0aWNFeGNlcHRpb24gPSBleGNlcHRpb247XG4gICAgfVxuICAgIC8vIFRoaXMgaXMgbmVjZXNzYXJ5IHRvIHByb3ZpZGUgZXhwbGljaXQgc2NvcGVzIHVwZ3JhZGUsIHdpdGhvdXQgY2hhbmdpbmcgdGhlIG9yaWdpbmFsXG4gICAgLy8gYXJyaXR5IG9mIHRoZSBgY2FwdHVyZU1lc3NhZ2UobWVzc2FnZSwgbGV2ZWwpYCBtZXRob2QuXG4gICAgdmFyIGxldmVsID0gdHlwZW9mIGNhcHR1cmVDb250ZXh0ID09PSAnc3RyaW5nJyA/IGNhcHR1cmVDb250ZXh0IDogdW5kZWZpbmVkO1xuICAgIHZhciBjb250ZXh0ID0gdHlwZW9mIGNhcHR1cmVDb250ZXh0ICE9PSAnc3RyaW5nJyA/IHsgY2FwdHVyZUNvbnRleHQ6IGNhcHR1cmVDb250ZXh0IH0gOiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIGNhbGxPbkh1YignY2FwdHVyZU1lc3NhZ2UnLCBtZXNzYWdlLCBsZXZlbCwgdHNsaWJfMS5fX2Fzc2lnbih7IG9yaWdpbmFsRXhjZXB0aW9uOiBtZXNzYWdlLCBzeW50aGV0aWNFeGNlcHRpb246IHN5bnRoZXRpY0V4Y2VwdGlvbiB9LCBjb250ZXh0KSk7XG59XG4vKipcbiAqIENhcHR1cmVzIGEgbWFudWFsbHkgY3JlYXRlZCBldmVudCBhbmQgc2VuZHMgaXQgdG8gU2VudHJ5LlxuICpcbiAqIEBwYXJhbSBldmVudCBUaGUgZXZlbnQgdG8gc2VuZCB0byBTZW50cnkuXG4gKiBAcmV0dXJucyBUaGUgZ2VuZXJhdGVkIGV2ZW50SWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYXB0dXJlRXZlbnQoZXZlbnQpIHtcbiAgICByZXR1cm4gY2FsbE9uSHViKCdjYXB0dXJlRXZlbnQnLCBldmVudCk7XG59XG4vKipcbiAqIENhbGxiYWNrIHRvIHNldCBjb250ZXh0IGluZm9ybWF0aW9uIG9udG8gdGhlIHNjb3BlLlxuICogQHBhcmFtIGNhbGxiYWNrIENhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgcmVjZWl2ZXMgU2NvcGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb25maWd1cmVTY29wZShjYWxsYmFjaykge1xuICAgIGNhbGxPbkh1YignY29uZmlndXJlU2NvcGUnLCBjYWxsYmFjayk7XG59XG4vKipcbiAqIFJlY29yZHMgYSBuZXcgYnJlYWRjcnVtYiB3aGljaCB3aWxsIGJlIGF0dGFjaGVkIHRvIGZ1dHVyZSBldmVudHMuXG4gKlxuICogQnJlYWRjcnVtYnMgd2lsbCBiZSBhZGRlZCB0byBzdWJzZXF1ZW50IGV2ZW50cyB0byBwcm92aWRlIG1vcmUgY29udGV4dCBvblxuICogdXNlcidzIGFjdGlvbnMgcHJpb3IgdG8gYW4gZXJyb3Igb3IgY3Jhc2guXG4gKlxuICogQHBhcmFtIGJyZWFkY3J1bWIgVGhlIGJyZWFkY3J1bWIgdG8gcmVjb3JkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYWRkQnJlYWRjcnVtYihicmVhZGNydW1iKSB7XG4gICAgY2FsbE9uSHViKCdhZGRCcmVhZGNydW1iJywgYnJlYWRjcnVtYik7XG59XG4vKipcbiAqIFNldHMgY29udGV4dCBkYXRhIHdpdGggdGhlIGdpdmVuIG5hbWUuXG4gKiBAcGFyYW0gbmFtZSBvZiB0aGUgY29udGV4dFxuICogQHBhcmFtIGNvbnRleHQgQW55IGtpbmQgb2YgZGF0YS4gVGhpcyBkYXRhIHdpbGwgYmUgbm9ybWFsaXplZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldENvbnRleHQobmFtZSwgY29udGV4dCkge1xuICAgIGNhbGxPbkh1Yignc2V0Q29udGV4dCcsIG5hbWUsIGNvbnRleHQpO1xufVxuLyoqXG4gKiBTZXQgYW4gb2JqZWN0IHRoYXQgd2lsbCBiZSBtZXJnZWQgc2VudCBhcyBleHRyYSBkYXRhIHdpdGggdGhlIGV2ZW50LlxuICogQHBhcmFtIGV4dHJhcyBFeHRyYXMgb2JqZWN0IHRvIG1lcmdlIGludG8gY3VycmVudCBjb250ZXh0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0RXh0cmFzKGV4dHJhcykge1xuICAgIGNhbGxPbkh1Yignc2V0RXh0cmFzJywgZXh0cmFzKTtcbn1cbi8qKlxuICogU2V0IGFuIG9iamVjdCB0aGF0IHdpbGwgYmUgbWVyZ2VkIHNlbnQgYXMgdGFncyBkYXRhIHdpdGggdGhlIGV2ZW50LlxuICogQHBhcmFtIHRhZ3MgVGFncyBjb250ZXh0IG9iamVjdCB0byBtZXJnZSBpbnRvIGN1cnJlbnQgY29udGV4dC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldFRhZ3ModGFncykge1xuICAgIGNhbGxPbkh1Yignc2V0VGFncycsIHRhZ3MpO1xufVxuLyoqXG4gKiBTZXQga2V5OnZhbHVlIHRoYXQgd2lsbCBiZSBzZW50IGFzIGV4dHJhIGRhdGEgd2l0aCB0aGUgZXZlbnQuXG4gKiBAcGFyYW0ga2V5IFN0cmluZyBvZiBleHRyYVxuICogQHBhcmFtIGV4dHJhIEFueSBraW5kIG9mIGRhdGEuIFRoaXMgZGF0YSB3aWxsIGJlIG5vcm1hbGl6ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRFeHRyYShrZXksIGV4dHJhKSB7XG4gICAgY2FsbE9uSHViKCdzZXRFeHRyYScsIGtleSwgZXh0cmEpO1xufVxuLyoqXG4gKiBTZXQga2V5OnZhbHVlIHRoYXQgd2lsbCBiZSBzZW50IGFzIHRhZ3MgZGF0YSB3aXRoIHRoZSBldmVudC5cbiAqIEBwYXJhbSBrZXkgU3RyaW5nIGtleSBvZiB0YWdcbiAqIEBwYXJhbSB2YWx1ZSBTdHJpbmcgdmFsdWUgb2YgdGFnXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRUYWcoa2V5LCB2YWx1ZSkge1xuICAgIGNhbGxPbkh1Yignc2V0VGFnJywga2V5LCB2YWx1ZSk7XG59XG4vKipcbiAqIFVwZGF0ZXMgdXNlciBjb250ZXh0IGluZm9ybWF0aW9uIGZvciBmdXR1cmUgZXZlbnRzLlxuICpcbiAqIEBwYXJhbSB1c2VyIFVzZXIgY29udGV4dCBvYmplY3QgdG8gYmUgc2V0IGluIHRoZSBjdXJyZW50IGNvbnRleHQuIFBhc3MgYG51bGxgIHRvIHVuc2V0IHRoZSB1c2VyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0VXNlcih1c2VyKSB7XG4gICAgY2FsbE9uSHViKCdzZXRVc2VyJywgdXNlcik7XG59XG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgc2NvcGUgd2l0aCBhbmQgZXhlY3V0ZXMgdGhlIGdpdmVuIG9wZXJhdGlvbiB3aXRoaW4uXG4gKiBUaGUgc2NvcGUgaXMgYXV0b21hdGljYWxseSByZW1vdmVkIG9uY2UgdGhlIG9wZXJhdGlvblxuICogZmluaXNoZXMgb3IgdGhyb3dzLlxuICpcbiAqIFRoaXMgaXMgZXNzZW50aWFsbHkgYSBjb252ZW5pZW5jZSBmdW5jdGlvbiBmb3I6XG4gKlxuICogICAgIHB1c2hTY29wZSgpO1xuICogICAgIGNhbGxiYWNrKCk7XG4gKiAgICAgcG9wU2NvcGUoKTtcbiAqXG4gKiBAcGFyYW0gY2FsbGJhY2sgdGhhdCB3aWxsIGJlIGVuY2xvc2VkIGludG8gcHVzaC9wb3BTY29wZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdpdGhTY29wZShjYWxsYmFjaykge1xuICAgIGNhbGxPbkh1Yignd2l0aFNjb3BlJywgY2FsbGJhY2spO1xufVxuLyoqXG4gKiBDYWxscyBhIGZ1bmN0aW9uIG9uIHRoZSBsYXRlc3QgY2xpZW50LiBVc2UgdGhpcyB3aXRoIGNhdXRpb24sIGl0J3MgbWVhbnQgYXNcbiAqIGluIFwiaW50ZXJuYWxcIiBoZWxwZXIgc28gd2UgZG9uJ3QgbmVlZCB0byBleHBvc2UgZXZlcnkgcG9zc2libGUgZnVuY3Rpb24gaW5cbiAqIHRoZSBzaGltLiBJdCBpcyBub3QgZ3VhcmFudGVlZCB0aGF0IHRoZSBjbGllbnQgYWN0dWFsbHkgaW1wbGVtZW50cyB0aGVcbiAqIGZ1bmN0aW9uLlxuICpcbiAqIEBwYXJhbSBtZXRob2QgVGhlIG1ldGhvZCB0byBjYWxsIG9uIHRoZSBjbGllbnQvY2xpZW50LlxuICogQHBhcmFtIGFyZ3MgQXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIGNsaWVudC9mb250ZW5kLlxuICogQGhpZGRlblxuICovXG5leHBvcnQgZnVuY3Rpb24gX2NhbGxPbkNsaWVudChtZXRob2QpIHtcbiAgICB2YXIgYXJncyA9IFtdO1xuICAgIGZvciAodmFyIF9pID0gMTsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgIGFyZ3NbX2kgLSAxXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgfVxuICAgIGNhbGxPbkh1Yi5hcHBseSh2b2lkIDAsIHRzbGliXzEuX19zcHJlYWQoWydfaW52b2tlQ2xpZW50JywgbWV0aG9kXSwgYXJncykpO1xufVxuLyoqXG4gKiBTdGFydHMgYSBUcmFuc2FjdGlvbi4gVGhpcyBpcyB0aGUgZW50cnkgcG9pbnQgdG8gZG8gbWFudWFsIHRyYWNpbmcuIFlvdSBjYW5cbiAqIGFkZCBjaGlsZCBzcGFucyB0byB0cmFuc2FjdGlvbnMuIFNwYW5zIHRoZW1zZWx2ZXMgY2FuIGhhdmUgY2hpbGRyZW4sIGJ1aWxkaW5nXG4gKiBhIHRyZWUgc3RydWN0dXJlLiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSBUcmFuc2FjdGlvbiBhbmQgeW91IG5lZWQgdG8ga2VlcFxuICogdHJhY2sgb2YgdGhlIGluc3RhbmNlIHlvdXJzZWxmLiBXaGVuIHlvdSBjYWxsIGAuZmluaXNoKClgIG9uIHRoZSB0cmFuc2FjdGlvblxuICogaXQgd2lsbCBiZSBzZW50IHRvIFNlbnRyeS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0YXJ0VHJhbnNhY3Rpb24oY29udGV4dCkge1xuICAgIHJldHVybiBjYWxsT25IdWIoJ3N0YXJ0VHJhbnNhY3Rpb24nLCB0c2xpYl8xLl9fYXNzaWduKHt9LCBjb250ZXh0KSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCJleHBvcnQgeyBMb2dMZXZlbCB9IGZyb20gJy4vbG9nbGV2ZWwnO1xuZXhwb3J0IHsgU2V2ZXJpdHkgfSBmcm9tICcuL3NldmVyaXR5JztcbmV4cG9ydCB7IFN0YXR1cyB9IGZyb20gJy4vc3RhdHVzJztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsIi8qKiBDb25zb2xlIGxvZ2dpbmcgdmVyYm9zaXR5IGZvciB0aGUgU0RLLiAqL1xuZXhwb3J0IHZhciBMb2dMZXZlbDtcbihmdW5jdGlvbiAoTG9nTGV2ZWwpIHtcbiAgICAvKiogTm8gbG9ncyB3aWxsIGJlIGdlbmVyYXRlZC4gKi9cbiAgICBMb2dMZXZlbFtMb2dMZXZlbFtcIk5vbmVcIl0gPSAwXSA9IFwiTm9uZVwiO1xuICAgIC8qKiBPbmx5IFNESyBpbnRlcm5hbCBlcnJvcnMgd2lsbCBiZSBsb2dnZWQuICovXG4gICAgTG9nTGV2ZWxbTG9nTGV2ZWxbXCJFcnJvclwiXSA9IDFdID0gXCJFcnJvclwiO1xuICAgIC8qKiBJbmZvcm1hdGlvbiB1c2VmdWwgZm9yIGRlYnVnZ2luZyB0aGUgU0RLIHdpbGwgYmUgbG9nZ2VkLiAqL1xuICAgIExvZ0xldmVsW0xvZ0xldmVsW1wiRGVidWdcIl0gPSAyXSA9IFwiRGVidWdcIjtcbiAgICAvKiogQWxsIFNESyBhY3Rpb25zIHdpbGwgYmUgbG9nZ2VkLiAqL1xuICAgIExvZ0xldmVsW0xvZ0xldmVsW1wiVmVyYm9zZVwiXSA9IDNdID0gXCJWZXJib3NlXCI7XG59KShMb2dMZXZlbCB8fCAoTG9nTGV2ZWwgPSB7fSkpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bG9nbGV2ZWwuanMubWFwIiwiLyoqIEpTRG9jICovXG5leHBvcnQgdmFyIFNldmVyaXR5O1xuKGZ1bmN0aW9uIChTZXZlcml0eSkge1xuICAgIC8qKiBKU0RvYyAqL1xuICAgIFNldmVyaXR5W1wiRmF0YWxcIl0gPSBcImZhdGFsXCI7XG4gICAgLyoqIEpTRG9jICovXG4gICAgU2V2ZXJpdHlbXCJFcnJvclwiXSA9IFwiZXJyb3JcIjtcbiAgICAvKiogSlNEb2MgKi9cbiAgICBTZXZlcml0eVtcIldhcm5pbmdcIl0gPSBcIndhcm5pbmdcIjtcbiAgICAvKiogSlNEb2MgKi9cbiAgICBTZXZlcml0eVtcIkxvZ1wiXSA9IFwibG9nXCI7XG4gICAgLyoqIEpTRG9jICovXG4gICAgU2V2ZXJpdHlbXCJJbmZvXCJdID0gXCJpbmZvXCI7XG4gICAgLyoqIEpTRG9jICovXG4gICAgU2V2ZXJpdHlbXCJEZWJ1Z1wiXSA9IFwiZGVidWdcIjtcbiAgICAvKiogSlNEb2MgKi9cbiAgICBTZXZlcml0eVtcIkNyaXRpY2FsXCJdID0gXCJjcml0aWNhbFwiO1xufSkoU2V2ZXJpdHkgfHwgKFNldmVyaXR5ID0ge30pKTtcbi8vIHRzbGludDpkaXNhYmxlOmNvbXBsZXRlZC1kb2NzXG4vLyB0c2xpbnQ6ZGlzYWJsZTpuby11bm5lY2Vzc2FyeS1xdWFsaWZpZXIgbm8tbmFtZXNwYWNlXG4oZnVuY3Rpb24gKFNldmVyaXR5KSB7XG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYSBzdHJpbmctYmFzZWQgbGV2ZWwgaW50byBhIHtAbGluayBTZXZlcml0eX0uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbGV2ZWwgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIFNldmVyaXR5XG4gICAgICogQHJldHVybnMgU2V2ZXJpdHlcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmcm9tU3RyaW5nKGxldmVsKSB7XG4gICAgICAgIHN3aXRjaCAobGV2ZWwpIHtcbiAgICAgICAgICAgIGNhc2UgJ2RlYnVnJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gU2V2ZXJpdHkuRGVidWc7XG4gICAgICAgICAgICBjYXNlICdpbmZvJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gU2V2ZXJpdHkuSW5mbztcbiAgICAgICAgICAgIGNhc2UgJ3dhcm4nOlxuICAgICAgICAgICAgY2FzZSAnd2FybmluZyc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFNldmVyaXR5Lldhcm5pbmc7XG4gICAgICAgICAgICBjYXNlICdlcnJvcic6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFNldmVyaXR5LkVycm9yO1xuICAgICAgICAgICAgY2FzZSAnZmF0YWwnOlxuICAgICAgICAgICAgICAgIHJldHVybiBTZXZlcml0eS5GYXRhbDtcbiAgICAgICAgICAgIGNhc2UgJ2NyaXRpY2FsJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gU2V2ZXJpdHkuQ3JpdGljYWw7XG4gICAgICAgICAgICBjYXNlICdsb2cnOlxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gU2V2ZXJpdHkuTG9nO1xuICAgICAgICB9XG4gICAgfVxuICAgIFNldmVyaXR5LmZyb21TdHJpbmcgPSBmcm9tU3RyaW5nO1xufSkoU2V2ZXJpdHkgfHwgKFNldmVyaXR5ID0ge30pKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNldmVyaXR5LmpzLm1hcCIsIi8qKiBUaGUgc3RhdHVzIG9mIGFuIGV2ZW50LiAqL1xuZXhwb3J0IHZhciBTdGF0dXM7XG4oZnVuY3Rpb24gKFN0YXR1cykge1xuICAgIC8qKiBUaGUgc3RhdHVzIGNvdWxkIG5vdCBiZSBkZXRlcm1pbmVkLiAqL1xuICAgIFN0YXR1c1tcIlVua25vd25cIl0gPSBcInVua25vd25cIjtcbiAgICAvKiogVGhlIGV2ZW50IHdhcyBza2lwcGVkIGR1ZSB0byBjb25maWd1cmF0aW9uIG9yIGNhbGxiYWNrcy4gKi9cbiAgICBTdGF0dXNbXCJTa2lwcGVkXCJdID0gXCJza2lwcGVkXCI7XG4gICAgLyoqIFRoZSBldmVudCB3YXMgc2VudCB0byBTZW50cnkgc3VjY2Vzc2Z1bGx5LiAqL1xuICAgIFN0YXR1c1tcIlN1Y2Nlc3NcIl0gPSBcInN1Y2Nlc3NcIjtcbiAgICAvKiogVGhlIGNsaWVudCBpcyBjdXJyZW50bHkgcmF0ZSBsaW1pdGVkIGFuZCB3aWxsIHRyeSBhZ2FpbiBsYXRlci4gKi9cbiAgICBTdGF0dXNbXCJSYXRlTGltaXRcIl0gPSBcInJhdGVfbGltaXRcIjtcbiAgICAvKiogVGhlIGV2ZW50IGNvdWxkIG5vdCBiZSBwcm9jZXNzZWQuICovXG4gICAgU3RhdHVzW1wiSW52YWxpZFwiXSA9IFwiaW52YWxpZFwiO1xuICAgIC8qKiBBIHNlcnZlci1zaWRlIGVycm9yIG9jdXJyZWQgZHVyaW5nIHN1Ym1pc3Npb24uICovXG4gICAgU3RhdHVzW1wiRmFpbGVkXCJdID0gXCJmYWlsZWRcIjtcbn0pKFN0YXR1cyB8fCAoU3RhdHVzID0ge30pKTtcbi8vIHRzbGludDpkaXNhYmxlOmNvbXBsZXRlZC1kb2NzXG4vLyB0c2xpbnQ6ZGlzYWJsZTpuby11bm5lY2Vzc2FyeS1xdWFsaWZpZXIgbm8tbmFtZXNwYWNlXG4oZnVuY3Rpb24gKFN0YXR1cykge1xuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGEgSFRUUCBzdGF0dXMgY29kZSBpbnRvIGEge0BsaW5rIFN0YXR1c30uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY29kZSBUaGUgSFRUUCByZXNwb25zZSBzdGF0dXMgY29kZS5cbiAgICAgKiBAcmV0dXJucyBUaGUgc2VuZCBzdGF0dXMgb3Ige0BsaW5rIFN0YXR1cy5Vbmtub3dufS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmcm9tSHR0cENvZGUoY29kZSkge1xuICAgICAgICBpZiAoY29kZSA+PSAyMDAgJiYgY29kZSA8IDMwMCkge1xuICAgICAgICAgICAgcmV0dXJuIFN0YXR1cy5TdWNjZXNzO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb2RlID09PSA0MjkpIHtcbiAgICAgICAgICAgIHJldHVybiBTdGF0dXMuUmF0ZUxpbWl0O1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb2RlID49IDQwMCAmJiBjb2RlIDwgNTAwKSB7XG4gICAgICAgICAgICByZXR1cm4gU3RhdHVzLkludmFsaWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvZGUgPj0gNTAwKSB7XG4gICAgICAgICAgICByZXR1cm4gU3RhdHVzLkZhaWxlZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gU3RhdHVzLlVua25vd247XG4gICAgfVxuICAgIFN0YXR1cy5mcm9tSHR0cENvZGUgPSBmcm9tSHR0cENvZGU7XG59KShTdGF0dXMgfHwgKFN0YXR1cyA9IHt9KSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zdGF0dXMuanMubWFwIiwiLyoqXG4gKiBDb25zdW1lcyB0aGUgcHJvbWlzZSBhbmQgbG9ncyB0aGUgZXJyb3Igd2hlbiBpdCByZWplY3RzLlxuICogQHBhcmFtIHByb21pc2UgQSBwcm9taXNlIHRvIGZvcmdldC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcmdldChwcm9taXNlKSB7XG4gICAgcHJvbWlzZS50aGVuKG51bGwsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIC8vIFRPRE86IFVzZSBhIGJldHRlciBsb2dnaW5nIG1lY2hhbmlzbVxuICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgIH0pO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YXN5bmMuanMubWFwIiwiaW1wb3J0ICogYXMgdHNsaWJfMSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IFNlbnRyeUVycm9yIH0gZnJvbSAnLi9lcnJvcic7XG4vKiogUmVndWxhciBleHByZXNzaW9uIHVzZWQgdG8gcGFyc2UgYSBEc24uICovXG52YXIgRFNOX1JFR0VYID0gL14oPzooXFx3Kyk6KVxcL1xcLyg/OihcXHcrKSg/OjooXFx3KykpP0ApKFtcXHdcXC4tXSspKD86OihcXGQrKSk/XFwvKC4rKS87XG4vKiogRXJyb3IgbWVzc2FnZSAqL1xudmFyIEVSUk9SX01FU1NBR0UgPSAnSW52YWxpZCBEc24nO1xuLyoqIFRoZSBTZW50cnkgRHNuLCBpZGVudGlmeWluZyBhIFNlbnRyeSBpbnN0YW5jZSBhbmQgcHJvamVjdC4gKi9cbnZhciBEc24gPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgLyoqIENyZWF0ZXMgYSBuZXcgRHNuIGNvbXBvbmVudCAqL1xuICAgIGZ1bmN0aW9uIERzbihmcm9tKSB7XG4gICAgICAgIGlmICh0eXBlb2YgZnJvbSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHRoaXMuX2Zyb21TdHJpbmcoZnJvbSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9mcm9tQ29tcG9uZW50cyhmcm9tKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl92YWxpZGF0ZSgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZW5kZXJzIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBEc24uXG4gICAgICpcbiAgICAgKiBCeSBkZWZhdWx0LCB0aGlzIHdpbGwgcmVuZGVyIHRoZSBwdWJsaWMgcmVwcmVzZW50YXRpb24gd2l0aG91dCB0aGUgcGFzc3dvcmRcbiAgICAgKiBjb21wb25lbnQuIFRvIGdldCB0aGUgZGVwcmVjYXRlZCBwcml2YXRlIHJlcHJlc2VudGF0aW9uLCBzZXQgYHdpdGhQYXNzd29yZGBcbiAgICAgKiB0byB0cnVlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHdpdGhQYXNzd29yZCBXaGVuIHNldCB0byB0cnVlLCB0aGUgcGFzc3dvcmQgd2lsbCBiZSBpbmNsdWRlZC5cbiAgICAgKi9cbiAgICBEc24ucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKHdpdGhQYXNzd29yZCkge1xuICAgICAgICBpZiAod2l0aFBhc3N3b3JkID09PSB2b2lkIDApIHsgd2l0aFBhc3N3b3JkID0gZmFsc2U7IH1cbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLXRoaXMtYXNzaWdubWVudFxuICAgICAgICB2YXIgX2EgPSB0aGlzLCBob3N0ID0gX2EuaG9zdCwgcGF0aCA9IF9hLnBhdGgsIHBhc3MgPSBfYS5wYXNzLCBwb3J0ID0gX2EucG9ydCwgcHJvamVjdElkID0gX2EucHJvamVjdElkLCBwcm90b2NvbCA9IF9hLnByb3RvY29sLCB1c2VyID0gX2EudXNlcjtcbiAgICAgICAgcmV0dXJuIChwcm90b2NvbCArIFwiOi8vXCIgKyB1c2VyICsgKHdpdGhQYXNzd29yZCAmJiBwYXNzID8gXCI6XCIgKyBwYXNzIDogJycpICtcbiAgICAgICAgICAgIChcIkBcIiArIGhvc3QgKyAocG9ydCA/IFwiOlwiICsgcG9ydCA6ICcnKSArIFwiL1wiICsgKHBhdGggPyBwYXRoICsgXCIvXCIgOiBwYXRoKSArIHByb2plY3RJZCkpO1xuICAgIH07XG4gICAgLyoqIFBhcnNlcyBhIHN0cmluZyBpbnRvIHRoaXMgRHNuLiAqL1xuICAgIERzbi5wcm90b3R5cGUuX2Zyb21TdHJpbmcgPSBmdW5jdGlvbiAoc3RyKSB7XG4gICAgICAgIHZhciBtYXRjaCA9IERTTl9SRUdFWC5leGVjKHN0cik7XG4gICAgICAgIGlmICghbWF0Y2gpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBTZW50cnlFcnJvcihFUlJPUl9NRVNTQUdFKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgX2EgPSB0c2xpYl8xLl9fcmVhZChtYXRjaC5zbGljZSgxKSwgNiksIHByb3RvY29sID0gX2FbMF0sIHVzZXIgPSBfYVsxXSwgX2IgPSBfYVsyXSwgcGFzcyA9IF9iID09PSB2b2lkIDAgPyAnJyA6IF9iLCBob3N0ID0gX2FbM10sIF9jID0gX2FbNF0sIHBvcnQgPSBfYyA9PT0gdm9pZCAwID8gJycgOiBfYywgbGFzdFBhdGggPSBfYVs1XTtcbiAgICAgICAgdmFyIHBhdGggPSAnJztcbiAgICAgICAgdmFyIHByb2plY3RJZCA9IGxhc3RQYXRoO1xuICAgICAgICB2YXIgc3BsaXQgPSBwcm9qZWN0SWQuc3BsaXQoJy8nKTtcbiAgICAgICAgaWYgKHNwbGl0Lmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgIHBhdGggPSBzcGxpdC5zbGljZSgwLCAtMSkuam9pbignLycpO1xuICAgICAgICAgICAgcHJvamVjdElkID0gc3BsaXQucG9wKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fZnJvbUNvbXBvbmVudHMoeyBob3N0OiBob3N0LCBwYXNzOiBwYXNzLCBwYXRoOiBwYXRoLCBwcm9qZWN0SWQ6IHByb2plY3RJZCwgcG9ydDogcG9ydCwgcHJvdG9jb2w6IHByb3RvY29sLCB1c2VyOiB1c2VyIH0pO1xuICAgIH07XG4gICAgLyoqIE1hcHMgRHNuIGNvbXBvbmVudHMgaW50byB0aGlzIGluc3RhbmNlLiAqL1xuICAgIERzbi5wcm90b3R5cGUuX2Zyb21Db21wb25lbnRzID0gZnVuY3Rpb24gKGNvbXBvbmVudHMpIHtcbiAgICAgICAgdGhpcy5wcm90b2NvbCA9IGNvbXBvbmVudHMucHJvdG9jb2w7XG4gICAgICAgIHRoaXMudXNlciA9IGNvbXBvbmVudHMudXNlcjtcbiAgICAgICAgdGhpcy5wYXNzID0gY29tcG9uZW50cy5wYXNzIHx8ICcnO1xuICAgICAgICB0aGlzLmhvc3QgPSBjb21wb25lbnRzLmhvc3Q7XG4gICAgICAgIHRoaXMucG9ydCA9IGNvbXBvbmVudHMucG9ydCB8fCAnJztcbiAgICAgICAgdGhpcy5wYXRoID0gY29tcG9uZW50cy5wYXRoIHx8ICcnO1xuICAgICAgICB0aGlzLnByb2plY3RJZCA9IGNvbXBvbmVudHMucHJvamVjdElkO1xuICAgIH07XG4gICAgLyoqIFZhbGlkYXRlcyB0aGlzIERzbiBhbmQgdGhyb3dzIG9uIGVycm9yLiAqL1xuICAgIERzbi5wcm90b3R5cGUuX3ZhbGlkYXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICBbJ3Byb3RvY29sJywgJ3VzZXInLCAnaG9zdCcsICdwcm9qZWN0SWQnXS5mb3JFYWNoKGZ1bmN0aW9uIChjb21wb25lbnQpIHtcbiAgICAgICAgICAgIGlmICghX3RoaXNbY29tcG9uZW50XSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBTZW50cnlFcnJvcihFUlJPUl9NRVNTQUdFKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGlmICh0aGlzLnByb3RvY29sICE9PSAnaHR0cCcgJiYgdGhpcy5wcm90b2NvbCAhPT0gJ2h0dHBzJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFNlbnRyeUVycm9yKEVSUk9SX01FU1NBR0UpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnBvcnQgJiYgaXNOYU4ocGFyc2VJbnQodGhpcy5wb3J0LCAxMCkpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgU2VudHJ5RXJyb3IoRVJST1JfTUVTU0FHRSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBEc247XG59KCkpO1xuZXhwb3J0IHsgRHNuIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kc24uanMubWFwIiwiaW1wb3J0ICogYXMgdHNsaWJfMSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IHNldFByb3RvdHlwZU9mIH0gZnJvbSAnLi9wb2x5ZmlsbCc7XG4vKiogQW4gZXJyb3IgZW1pdHRlZCBieSBTZW50cnkgU0RLcyBhbmQgcmVsYXRlZCB1dGlsaXRpZXMuICovXG52YXIgU2VudHJ5RXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgdHNsaWJfMS5fX2V4dGVuZHMoU2VudHJ5RXJyb3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gU2VudHJ5RXJyb3IobWVzc2FnZSkge1xuICAgICAgICB2YXIgX25ld1RhcmdldCA9IHRoaXMuY29uc3RydWN0b3I7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIG1lc3NhZ2UpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLm1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZTpuby11bnNhZmUtYW55XG4gICAgICAgIF90aGlzLm5hbWUgPSBfbmV3VGFyZ2V0LnByb3RvdHlwZS5jb25zdHJ1Y3Rvci5uYW1lO1xuICAgICAgICBzZXRQcm90b3R5cGVPZihfdGhpcywgX25ld1RhcmdldC5wcm90b3R5cGUpO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIHJldHVybiBTZW50cnlFcnJvcjtcbn0oRXJyb3IpKTtcbmV4cG9ydCB7IFNlbnRyeUVycm9yIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1lcnJvci5qcy5tYXAiLCJleHBvcnQgKiBmcm9tICcuL2FzeW5jJztcbmV4cG9ydCAqIGZyb20gJy4vZXJyb3InO1xuZXhwb3J0ICogZnJvbSAnLi9pcyc7XG5leHBvcnQgKiBmcm9tICcuL2xvZ2dlcic7XG5leHBvcnQgKiBmcm9tICcuL21lbW8nO1xuZXhwb3J0ICogZnJvbSAnLi9taXNjJztcbmV4cG9ydCAqIGZyb20gJy4vb2JqZWN0JztcbmV4cG9ydCAqIGZyb20gJy4vcGF0aCc7XG5leHBvcnQgKiBmcm9tICcuL3Byb21pc2VidWZmZXInO1xuZXhwb3J0ICogZnJvbSAnLi9zdHJpbmcnO1xuZXhwb3J0ICogZnJvbSAnLi9zdXBwb3J0cyc7XG5leHBvcnQgKiBmcm9tICcuL3N5bmNwcm9taXNlJztcbmV4cG9ydCAqIGZyb20gJy4vaW5zdHJ1bWVudCc7XG5leHBvcnQgKiBmcm9tICcuL2Rzbic7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCIvKiB0c2xpbnQ6ZGlzYWJsZTpvbmx5LWFycm93LWZ1bmN0aW9ucyBuby11bnNhZmUtYW55ICovXG5pbXBvcnQgKiBhcyB0c2xpYl8xIGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgaXNJbnN0YW5jZU9mLCBpc1N0cmluZyB9IGZyb20gJy4vaXMnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXInO1xuaW1wb3J0IHsgZ2V0RnVuY3Rpb25OYW1lLCBnZXRHbG9iYWxPYmplY3QgfSBmcm9tICcuL21pc2MnO1xuaW1wb3J0IHsgZmlsbCB9IGZyb20gJy4vb2JqZWN0JztcbmltcG9ydCB7IHN1cHBvcnRzSGlzdG9yeSwgc3VwcG9ydHNOYXRpdmVGZXRjaCB9IGZyb20gJy4vc3VwcG9ydHMnO1xudmFyIGdsb2JhbCA9IGdldEdsb2JhbE9iamVjdCgpO1xuLyoqXG4gKiBJbnN0cnVtZW50IG5hdGl2ZSBBUElzIHRvIGNhbGwgaGFuZGxlcnMgdGhhdCBjYW4gYmUgdXNlZCB0byBjcmVhdGUgYnJlYWRjcnVtYnMsIEFQTSBzcGFucyBldGMuXG4gKiAgLSBDb25zb2xlIEFQSVxuICogIC0gRmV0Y2ggQVBJXG4gKiAgLSBYSFIgQVBJXG4gKiAgLSBIaXN0b3J5IEFQSVxuICogIC0gRE9NIEFQSSAoY2xpY2svdHlwaW5nKVxuICogIC0gRXJyb3IgQVBJXG4gKiAgLSBVbmhhbmRsZWRSZWplY3Rpb24gQVBJXG4gKi9cbnZhciBoYW5kbGVycyA9IHt9O1xudmFyIGluc3RydW1lbnRlZCA9IHt9O1xuLyoqIEluc3RydW1lbnRzIGdpdmVuIEFQSSAqL1xuZnVuY3Rpb24gaW5zdHJ1bWVudCh0eXBlKSB7XG4gICAgaWYgKGluc3RydW1lbnRlZFt0eXBlXSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGluc3RydW1lbnRlZFt0eXBlXSA9IHRydWU7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgIGNhc2UgJ2NvbnNvbGUnOlxuICAgICAgICAgICAgaW5zdHJ1bWVudENvbnNvbGUoKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdkb20nOlxuICAgICAgICAgICAgaW5zdHJ1bWVudERPTSgpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3hocic6XG4gICAgICAgICAgICBpbnN0cnVtZW50WEhSKCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnZmV0Y2gnOlxuICAgICAgICAgICAgaW5zdHJ1bWVudEZldGNoKCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnaGlzdG9yeSc6XG4gICAgICAgICAgICBpbnN0cnVtZW50SGlzdG9yeSgpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2Vycm9yJzpcbiAgICAgICAgICAgIGluc3RydW1lbnRFcnJvcigpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3VuaGFuZGxlZHJlamVjdGlvbic6XG4gICAgICAgICAgICBpbnN0cnVtZW50VW5oYW5kbGVkUmVqZWN0aW9uKCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGxvZ2dlci53YXJuKCd1bmtub3duIGluc3RydW1lbnRhdGlvbiB0eXBlOicsIHR5cGUpO1xuICAgIH1cbn1cbi8qKlxuICogQWRkIGhhbmRsZXIgdGhhdCB3aWxsIGJlIGNhbGxlZCB3aGVuIGdpdmVuIHR5cGUgb2YgaW5zdHJ1bWVudGF0aW9uIHRyaWdnZXJzLlxuICogVXNlIGF0IHlvdXIgb3duIHJpc2ssIHRoaXMgbWlnaHQgYnJlYWsgd2l0aG91dCBjaGFuZ2Vsb2cgbm90aWNlLCBvbmx5IHVzZWQgaW50ZXJuYWxseS5cbiAqIEBoaWRkZW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkZEluc3RydW1lbnRhdGlvbkhhbmRsZXIoaGFuZGxlcikge1xuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpzdHJpY3QtdHlwZS1wcmVkaWNhdGVzXG4gICAgaWYgKCFoYW5kbGVyIHx8IHR5cGVvZiBoYW5kbGVyLnR5cGUgIT09ICdzdHJpbmcnIHx8IHR5cGVvZiBoYW5kbGVyLmNhbGxiYWNrICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaGFuZGxlcnNbaGFuZGxlci50eXBlXSA9IGhhbmRsZXJzW2hhbmRsZXIudHlwZV0gfHwgW107XG4gICAgaGFuZGxlcnNbaGFuZGxlci50eXBlXS5wdXNoKGhhbmRsZXIuY2FsbGJhY2spO1xuICAgIGluc3RydW1lbnQoaGFuZGxlci50eXBlKTtcbn1cbi8qKiBKU0RvYyAqL1xuZnVuY3Rpb24gdHJpZ2dlckhhbmRsZXJzKHR5cGUsIGRhdGEpIHtcbiAgICB2YXIgZV8xLCBfYTtcbiAgICBpZiAoIXR5cGUgfHwgIWhhbmRsZXJzW3R5cGVdKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgZm9yICh2YXIgX2IgPSB0c2xpYl8xLl9fdmFsdWVzKGhhbmRsZXJzW3R5cGVdIHx8IFtdKSwgX2MgPSBfYi5uZXh0KCk7ICFfYy5kb25lOyBfYyA9IF9iLm5leHQoKSkge1xuICAgICAgICAgICAgdmFyIGhhbmRsZXIgPSBfYy52YWx1ZTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaGFuZGxlcihkYXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKFwiRXJyb3Igd2hpbGUgdHJpZ2dlcmluZyBpbnN0cnVtZW50YXRpb24gaGFuZGxlci5cXG5UeXBlOiBcIiArIHR5cGUgKyBcIlxcbk5hbWU6IFwiICsgZ2V0RnVuY3Rpb25OYW1lKGhhbmRsZXIpICsgXCJcXG5FcnJvcjogXCIgKyBlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBjYXRjaCAoZV8xXzEpIHsgZV8xID0geyBlcnJvcjogZV8xXzEgfTsgfVxuICAgIGZpbmFsbHkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKF9jICYmICFfYy5kb25lICYmIChfYSA9IF9iLnJldHVybikpIF9hLmNhbGwoX2IpO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkgeyBpZiAoZV8xKSB0aHJvdyBlXzEuZXJyb3I7IH1cbiAgICB9XG59XG4vKiogSlNEb2MgKi9cbmZ1bmN0aW9uIGluc3RydW1lbnRDb25zb2xlKCkge1xuICAgIGlmICghKCdjb25zb2xlJyBpbiBnbG9iYWwpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgWydkZWJ1ZycsICdpbmZvJywgJ3dhcm4nLCAnZXJyb3InLCAnbG9nJywgJ2Fzc2VydCddLmZvckVhY2goZnVuY3Rpb24gKGxldmVsKSB7XG4gICAgICAgIGlmICghKGxldmVsIGluIGdsb2JhbC5jb25zb2xlKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGZpbGwoZ2xvYmFsLmNvbnNvbGUsIGxldmVsLCBmdW5jdGlvbiAob3JpZ2luYWxDb25zb2xlTGV2ZWwpIHtcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBbXTtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgICAgICAgICBhcmdzW19pXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRyaWdnZXJIYW5kbGVycygnY29uc29sZScsIHsgYXJnczogYXJncywgbGV2ZWw6IGxldmVsIH0pO1xuICAgICAgICAgICAgICAgIC8vIHRoaXMgZmFpbHMgZm9yIHNvbWUgYnJvd3NlcnMuIDooXG4gICAgICAgICAgICAgICAgaWYgKG9yaWdpbmFsQ29uc29sZUxldmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseS5jYWxsKG9yaWdpbmFsQ29uc29sZUxldmVsLCBnbG9iYWwuY29uc29sZSwgYXJncyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG59XG4vKiogSlNEb2MgKi9cbmZ1bmN0aW9uIGluc3RydW1lbnRGZXRjaCgpIHtcbiAgICBpZiAoIXN1cHBvcnRzTmF0aXZlRmV0Y2goKSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGZpbGwoZ2xvYmFsLCAnZmV0Y2gnLCBmdW5jdGlvbiAob3JpZ2luYWxGZXRjaCkge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGFyZ3MgPSBbXTtcbiAgICAgICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICAgICAgYXJnc1tfaV0gPSBhcmd1bWVudHNbX2ldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGNvbW1vbkhhbmRsZXJEYXRhID0ge1xuICAgICAgICAgICAgICAgIGFyZ3M6IGFyZ3MsXG4gICAgICAgICAgICAgICAgZmV0Y2hEYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgIG1ldGhvZDogZ2V0RmV0Y2hNZXRob2QoYXJncyksXG4gICAgICAgICAgICAgICAgICAgIHVybDogZ2V0RmV0Y2hVcmwoYXJncyksXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzdGFydFRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0cmlnZ2VySGFuZGxlcnMoJ2ZldGNoJywgdHNsaWJfMS5fX2Fzc2lnbih7fSwgY29tbW9uSGFuZGxlckRhdGEpKTtcbiAgICAgICAgICAgIHJldHVybiBvcmlnaW5hbEZldGNoLmFwcGx5KGdsb2JhbCwgYXJncykudGhlbihmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICB0cmlnZ2VySGFuZGxlcnMoJ2ZldGNoJywgdHNsaWJfMS5fX2Fzc2lnbih7fSwgY29tbW9uSGFuZGxlckRhdGEsIHsgZW5kVGltZXN0YW1wOiBEYXRlLm5vdygpLCByZXNwb25zZTogcmVzcG9uc2UgfSkpO1xuICAgICAgICAgICAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgICAgICAgIHRyaWdnZXJIYW5kbGVycygnZmV0Y2gnLCB0c2xpYl8xLl9fYXNzaWduKHt9LCBjb21tb25IYW5kbGVyRGF0YSwgeyBlbmRUaW1lc3RhbXA6IERhdGUubm93KCksIGVycm9yOiBlcnJvciB9KSk7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcbiAgICB9KTtcbn1cbi8qKiBFeHRyYWN0IGBtZXRob2RgIGZyb20gZmV0Y2ggY2FsbCBhcmd1bWVudHMgKi9cbmZ1bmN0aW9uIGdldEZldGNoTWV0aG9kKGZldGNoQXJncykge1xuICAgIGlmIChmZXRjaEFyZ3MgPT09IHZvaWQgMCkgeyBmZXRjaEFyZ3MgPSBbXTsgfVxuICAgIGlmICgnUmVxdWVzdCcgaW4gZ2xvYmFsICYmIGlzSW5zdGFuY2VPZihmZXRjaEFyZ3NbMF0sIFJlcXVlc3QpICYmIGZldGNoQXJnc1swXS5tZXRob2QpIHtcbiAgICAgICAgcmV0dXJuIFN0cmluZyhmZXRjaEFyZ3NbMF0ubWV0aG9kKS50b1VwcGVyQ2FzZSgpO1xuICAgIH1cbiAgICBpZiAoZmV0Y2hBcmdzWzFdICYmIGZldGNoQXJnc1sxXS5tZXRob2QpIHtcbiAgICAgICAgcmV0dXJuIFN0cmluZyhmZXRjaEFyZ3NbMV0ubWV0aG9kKS50b1VwcGVyQ2FzZSgpO1xuICAgIH1cbiAgICByZXR1cm4gJ0dFVCc7XG59XG4vKiogRXh0cmFjdCBgdXJsYCBmcm9tIGZldGNoIGNhbGwgYXJndW1lbnRzICovXG5mdW5jdGlvbiBnZXRGZXRjaFVybChmZXRjaEFyZ3MpIHtcbiAgICBpZiAoZmV0Y2hBcmdzID09PSB2b2lkIDApIHsgZmV0Y2hBcmdzID0gW107IH1cbiAgICBpZiAodHlwZW9mIGZldGNoQXJnc1swXSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIGZldGNoQXJnc1swXTtcbiAgICB9XG4gICAgaWYgKCdSZXF1ZXN0JyBpbiBnbG9iYWwgJiYgaXNJbnN0YW5jZU9mKGZldGNoQXJnc1swXSwgUmVxdWVzdCkpIHtcbiAgICAgICAgcmV0dXJuIGZldGNoQXJnc1swXS51cmw7XG4gICAgfVxuICAgIHJldHVybiBTdHJpbmcoZmV0Y2hBcmdzWzBdKTtcbn1cbi8qKiBKU0RvYyAqL1xuZnVuY3Rpb24gaW5zdHJ1bWVudFhIUigpIHtcbiAgICBpZiAoISgnWE1MSHR0cFJlcXVlc3QnIGluIGdsb2JhbCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgeGhycHJvdG8gPSBYTUxIdHRwUmVxdWVzdC5wcm90b3R5cGU7XG4gICAgZmlsbCh4aHJwcm90bywgJ29wZW4nLCBmdW5jdGlvbiAob3JpZ2luYWxPcGVuKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgYXJncyA9IFtdO1xuICAgICAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgICAgICBhcmdzW19pXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgdXJsID0gYXJnc1sxXTtcbiAgICAgICAgICAgIHRoaXMuX19zZW50cnlfeGhyX18gPSB7XG4gICAgICAgICAgICAgICAgbWV0aG9kOiBpc1N0cmluZyhhcmdzWzBdKSA/IGFyZ3NbMF0udG9VcHBlckNhc2UoKSA6IGFyZ3NbMF0sXG4gICAgICAgICAgICAgICAgdXJsOiBhcmdzWzFdLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIC8vIGlmIFNlbnRyeSBrZXkgYXBwZWFycyBpbiBVUkwsIGRvbid0IGNhcHR1cmUgaXQgYXMgYSByZXF1ZXN0XG4gICAgICAgICAgICBpZiAoaXNTdHJpbmcodXJsKSAmJiB0aGlzLl9fc2VudHJ5X3hocl9fLm1ldGhvZCA9PT0gJ1BPU1QnICYmIHVybC5tYXRjaCgvc2VudHJ5X2tleS8pKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fX3NlbnRyeV9vd25fcmVxdWVzdF9fID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBvcmlnaW5hbE9wZW4uYXBwbHkodGhpcywgYXJncyk7XG4gICAgICAgIH07XG4gICAgfSk7XG4gICAgZmlsbCh4aHJwcm90bywgJ3NlbmQnLCBmdW5jdGlvbiAob3JpZ2luYWxTZW5kKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgYXJncyA9IFtdO1xuICAgICAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgICAgICBhcmdzW19pXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgeGhyID0gdGhpczsgLy8gdHNsaW50OmRpc2FibGUtbGluZTpuby10aGlzLWFzc2lnbm1lbnRcbiAgICAgICAgICAgIHZhciBjb21tb25IYW5kbGVyRGF0YSA9IHtcbiAgICAgICAgICAgICAgICBhcmdzOiBhcmdzLFxuICAgICAgICAgICAgICAgIHN0YXJ0VGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgICAgICAgICAgIHhocjogeGhyLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRyaWdnZXJIYW5kbGVycygneGhyJywgdHNsaWJfMS5fX2Fzc2lnbih7fSwgY29tbW9uSGFuZGxlckRhdGEpKTtcbiAgICAgICAgICAgIHhoci5hZGRFdmVudExpc3RlbmVyKCdyZWFkeXN0YXRlY2hhbmdlJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmICh4aHIucmVhZHlTdGF0ZSA9PT0gNCkge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG91Y2hpbmcgc3RhdHVzQ29kZSBpbiBzb21lIHBsYXRmb3JtcyB0aHJvd3NcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuIGV4Y2VwdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHhoci5fX3NlbnRyeV94aHJfXykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhoci5fX3NlbnRyeV94aHJfXy5zdGF0dXNfY29kZSA9IHhoci5zdGF0dXM7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRvIG5vdGhpbmcgKi9cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0cmlnZ2VySGFuZGxlcnMoJ3hocicsIHRzbGliXzEuX19hc3NpZ24oe30sIGNvbW1vbkhhbmRsZXJEYXRhLCB7IGVuZFRpbWVzdGFtcDogRGF0ZS5ub3coKSB9KSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gb3JpZ2luYWxTZW5kLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgICAgICB9O1xuICAgIH0pO1xufVxudmFyIGxhc3RIcmVmO1xuLyoqIEpTRG9jICovXG5mdW5jdGlvbiBpbnN0cnVtZW50SGlzdG9yeSgpIHtcbiAgICBpZiAoIXN1cHBvcnRzSGlzdG9yeSgpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIG9sZE9uUG9wU3RhdGUgPSBnbG9iYWwub25wb3BzdGF0ZTtcbiAgICBnbG9iYWwub25wb3BzdGF0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGFyZ3MgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgIGFyZ3NbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgdG8gPSBnbG9iYWwubG9jYXRpb24uaHJlZjtcbiAgICAgICAgLy8ga2VlcCB0cmFjayBvZiB0aGUgY3VycmVudCBVUkwgc3RhdGUsIGFzIHdlIGFsd2F5cyByZWNlaXZlIG9ubHkgdGhlIHVwZGF0ZWQgc3RhdGVcbiAgICAgICAgdmFyIGZyb20gPSBsYXN0SHJlZjtcbiAgICAgICAgbGFzdEhyZWYgPSB0bztcbiAgICAgICAgdHJpZ2dlckhhbmRsZXJzKCdoaXN0b3J5Jywge1xuICAgICAgICAgICAgZnJvbTogZnJvbSxcbiAgICAgICAgICAgIHRvOiB0byxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChvbGRPblBvcFN0YXRlKSB7XG4gICAgICAgICAgICByZXR1cm4gb2xkT25Qb3BTdGF0ZS5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBmdW5jdGlvbiBoaXN0b3J5UmVwbGFjZW1lbnRGdW5jdGlvbihvcmlnaW5hbEhpc3RvcnlGdW5jdGlvbikge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGFyZ3MgPSBbXTtcbiAgICAgICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICAgICAgYXJnc1tfaV0gPSBhcmd1bWVudHNbX2ldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHVybCA9IGFyZ3MubGVuZ3RoID4gMiA/IGFyZ3NbMl0gOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBpZiAodXJsKSB7XG4gICAgICAgICAgICAgICAgLy8gY29lcmNlIHRvIHN0cmluZyAodGhpcyBpcyB3aGF0IHB1c2hTdGF0ZSBkb2VzKVxuICAgICAgICAgICAgICAgIHZhciBmcm9tID0gbGFzdEhyZWY7XG4gICAgICAgICAgICAgICAgdmFyIHRvID0gU3RyaW5nKHVybCk7XG4gICAgICAgICAgICAgICAgLy8ga2VlcCB0cmFjayBvZiB0aGUgY3VycmVudCBVUkwgc3RhdGUsIGFzIHdlIGFsd2F5cyByZWNlaXZlIG9ubHkgdGhlIHVwZGF0ZWQgc3RhdGVcbiAgICAgICAgICAgICAgICBsYXN0SHJlZiA9IHRvO1xuICAgICAgICAgICAgICAgIHRyaWdnZXJIYW5kbGVycygnaGlzdG9yeScsIHtcbiAgICAgICAgICAgICAgICAgICAgZnJvbTogZnJvbSxcbiAgICAgICAgICAgICAgICAgICAgdG86IHRvLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsSGlzdG9yeUZ1bmN0aW9uLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgICAgICB9O1xuICAgIH1cbiAgICBmaWxsKGdsb2JhbC5oaXN0b3J5LCAncHVzaFN0YXRlJywgaGlzdG9yeVJlcGxhY2VtZW50RnVuY3Rpb24pO1xuICAgIGZpbGwoZ2xvYmFsLmhpc3RvcnksICdyZXBsYWNlU3RhdGUnLCBoaXN0b3J5UmVwbGFjZW1lbnRGdW5jdGlvbik7XG59XG4vKiogSlNEb2MgKi9cbmZ1bmN0aW9uIGluc3RydW1lbnRET00oKSB7XG4gICAgaWYgKCEoJ2RvY3VtZW50JyBpbiBnbG9iYWwpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gQ2FwdHVyZSBicmVhZGNydW1icyBmcm9tIGFueSBjbGljayB0aGF0IGlzIHVuaGFuZGxlZCAvIGJ1YmJsZWQgdXAgYWxsIHRoZSB3YXlcbiAgICAvLyB0byB0aGUgZG9jdW1lbnQuIERvIHRoaXMgYmVmb3JlIHdlIGluc3RydW1lbnQgYWRkRXZlbnRMaXN0ZW5lci5cbiAgICBnbG9iYWwuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBkb21FdmVudEhhbmRsZXIoJ2NsaWNrJywgdHJpZ2dlckhhbmRsZXJzLmJpbmQobnVsbCwgJ2RvbScpKSwgZmFsc2UpO1xuICAgIGdsb2JhbC5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlwcmVzcycsIGtleXByZXNzRXZlbnRIYW5kbGVyKHRyaWdnZXJIYW5kbGVycy5iaW5kKG51bGwsICdkb20nKSksIGZhbHNlKTtcbiAgICAvLyBBZnRlciBob29raW5nIGludG8gZG9jdW1lbnQgYnViYmxlZCB1cCBjbGljayBhbmQga2V5cHJlc3NlcyBldmVudHMsIHdlIGFsc28gaG9vayBpbnRvIHVzZXIgaGFuZGxlZCBjbGljayAmIGtleXByZXNzZXMuXG4gICAgWydFdmVudFRhcmdldCcsICdOb2RlJ10uZm9yRWFjaChmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgICAgIHZhciBwcm90byA9IGdsb2JhbFt0YXJnZXRdICYmIGdsb2JhbFt0YXJnZXRdLnByb3RvdHlwZTtcbiAgICAgICAgaWYgKCFwcm90byB8fCAhcHJvdG8uaGFzT3duUHJvcGVydHkgfHwgIXByb3RvLmhhc093blByb3BlcnR5KCdhZGRFdmVudExpc3RlbmVyJykpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBmaWxsKHByb3RvLCAnYWRkRXZlbnRMaXN0ZW5lcicsIGZ1bmN0aW9uIChvcmlnaW5hbCkge1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChldmVudE5hbWUsIGZuLCBvcHRpb25zKSB7XG4gICAgICAgICAgICAgICAgaWYgKGZuICYmIGZuLmhhbmRsZUV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChldmVudE5hbWUgPT09ICdjbGljaycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGwoZm4sICdoYW5kbGVFdmVudCcsIGZ1bmN0aW9uIChpbm5lck9yaWdpbmFsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb21FdmVudEhhbmRsZXIoJ2NsaWNrJywgdHJpZ2dlckhhbmRsZXJzLmJpbmQobnVsbCwgJ2RvbScpKShldmVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpbm5lck9yaWdpbmFsLmNhbGwodGhpcywgZXZlbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnROYW1lID09PSAna2V5cHJlc3MnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxsKGZuLCAnaGFuZGxlRXZlbnQnLCBmdW5jdGlvbiAoaW5uZXJPcmlnaW5hbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5cHJlc3NFdmVudEhhbmRsZXIodHJpZ2dlckhhbmRsZXJzLmJpbmQobnVsbCwgJ2RvbScpKShldmVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpbm5lck9yaWdpbmFsLmNhbGwodGhpcywgZXZlbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGV2ZW50TmFtZSA9PT0gJ2NsaWNrJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZG9tRXZlbnRIYW5kbGVyKCdjbGljaycsIHRyaWdnZXJIYW5kbGVycy5iaW5kKG51bGwsICdkb20nKSwgdHJ1ZSkodGhpcyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGV2ZW50TmFtZSA9PT0gJ2tleXByZXNzJykge1xuICAgICAgICAgICAgICAgICAgICAgICAga2V5cHJlc3NFdmVudEhhbmRsZXIodHJpZ2dlckhhbmRsZXJzLmJpbmQobnVsbCwgJ2RvbScpKSh0aGlzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gb3JpZ2luYWwuY2FsbCh0aGlzLCBldmVudE5hbWUsIGZuLCBvcHRpb25zKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgICAgICBmaWxsKHByb3RvLCAncmVtb3ZlRXZlbnRMaXN0ZW5lcicsIGZ1bmN0aW9uIChvcmlnaW5hbCkge1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChldmVudE5hbWUsIGZuLCBvcHRpb25zKSB7XG4gICAgICAgICAgICAgICAgdmFyIGNhbGxiYWNrID0gZm47XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayAmJiAoY2FsbGJhY2suX19zZW50cnlfd3JhcHBlZF9fIHx8IGNhbGxiYWNrKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlLCBhY2Nlc3NpbmcgX19zZW50cnlfd3JhcHBlZF9fIHdpbGwgdGhyb3cgaW4gc29tZSBTZWxlbml1bSBlbnZpcm9ubWVudHNcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsLmNhbGwodGhpcywgZXZlbnROYW1lLCBjYWxsYmFjaywgb3B0aW9ucyk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICB9KTtcbn1cbnZhciBkZWJvdW5jZUR1cmF0aW9uID0gMTAwMDtcbnZhciBkZWJvdW5jZVRpbWVyID0gMDtcbnZhciBrZXlwcmVzc1RpbWVvdXQ7XG52YXIgbGFzdENhcHR1cmVkRXZlbnQ7XG4vKipcbiAqIFdyYXBzIGFkZEV2ZW50TGlzdGVuZXIgdG8gY2FwdHVyZSBVSSBicmVhZGNydW1ic1xuICogQHBhcmFtIG5hbWUgdGhlIGV2ZW50IG5hbWUgKGUuZy4gXCJjbGlja1wiKVxuICogQHBhcmFtIGhhbmRsZXIgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIHRyaWdnZXJlZFxuICogQHBhcmFtIGRlYm91bmNlIGRlY2lkZXMgd2hldGhlciBpdCBzaG91bGQgd2FpdCB0aWxsIGFub3RoZXIgZXZlbnQgbG9vcFxuICogQHJldHVybnMgd3JhcHBlZCBicmVhZGNydW1iIGV2ZW50cyBoYW5kbGVyXG4gKiBAaGlkZGVuXG4gKi9cbmZ1bmN0aW9uIGRvbUV2ZW50SGFuZGxlcihuYW1lLCBoYW5kbGVyLCBkZWJvdW5jZSkge1xuICAgIGlmIChkZWJvdW5jZSA9PT0gdm9pZCAwKSB7IGRlYm91bmNlID0gZmFsc2U7IH1cbiAgICByZXR1cm4gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIC8vIHJlc2V0IGtleXByZXNzIHRpbWVvdXQ7IGUuZy4gdHJpZ2dlcmluZyBhICdjbGljaycgYWZ0ZXJcbiAgICAgICAgLy8gYSAna2V5cHJlc3MnIHdpbGwgcmVzZXQgdGhlIGtleXByZXNzIGRlYm91bmNlIHNvIHRoYXQgYSBuZXdcbiAgICAgICAgLy8gc2V0IG9mIGtleXByZXNzZXMgY2FuIGJlIHJlY29yZGVkXG4gICAgICAgIGtleXByZXNzVGltZW91dCA9IHVuZGVmaW5lZDtcbiAgICAgICAgLy8gSXQncyBwb3NzaWJsZSB0aGlzIGhhbmRsZXIgbWlnaHQgdHJpZ2dlciBtdWx0aXBsZSB0aW1lcyBmb3IgdGhlIHNhbWVcbiAgICAgICAgLy8gZXZlbnQgKGUuZy4gZXZlbnQgcHJvcGFnYXRpb24gdGhyb3VnaCBub2RlIGFuY2VzdG9ycykuIElnbm9yZSBpZiB3ZSd2ZVxuICAgICAgICAvLyBhbHJlYWR5IGNhcHR1cmVkIHRoZSBldmVudC5cbiAgICAgICAgaWYgKCFldmVudCB8fCBsYXN0Q2FwdHVyZWRFdmVudCA9PT0gZXZlbnQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBsYXN0Q2FwdHVyZWRFdmVudCA9IGV2ZW50O1xuICAgICAgICBpZiAoZGVib3VuY2VUaW1lcikge1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGRlYm91bmNlVGltZXIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkZWJvdW5jZSkge1xuICAgICAgICAgICAgZGVib3VuY2VUaW1lciA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGhhbmRsZXIoeyBldmVudDogZXZlbnQsIG5hbWU6IG5hbWUgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGhhbmRsZXIoeyBldmVudDogZXZlbnQsIG5hbWU6IG5hbWUgfSk7XG4gICAgICAgIH1cbiAgICB9O1xufVxuLyoqXG4gKiBXcmFwcyBhZGRFdmVudExpc3RlbmVyIHRvIGNhcHR1cmUga2V5cHJlc3MgVUkgZXZlbnRzXG4gKiBAcGFyYW0gaGFuZGxlciBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgdHJpZ2dlcmVkXG4gKiBAcmV0dXJucyB3cmFwcGVkIGtleXByZXNzIGV2ZW50cyBoYW5kbGVyXG4gKiBAaGlkZGVuXG4gKi9cbmZ1bmN0aW9uIGtleXByZXNzRXZlbnRIYW5kbGVyKGhhbmRsZXIpIHtcbiAgICAvLyBUT0RPOiBpZiBzb21laG93IHVzZXIgc3dpdGNoZXMga2V5cHJlc3MgdGFyZ2V0IGJlZm9yZVxuICAgIC8vICAgICAgIGRlYm91bmNlIHRpbWVvdXQgaXMgdHJpZ2dlcmVkLCB3ZSB3aWxsIG9ubHkgY2FwdHVyZVxuICAgIC8vICAgICAgIGEgc2luZ2xlIGJyZWFkY3J1bWIgZnJvbSB0aGUgRklSU1QgdGFyZ2V0IChhY2NlcHRhYmxlPylcbiAgICByZXR1cm4gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIHZhciB0YXJnZXQ7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0YXJnZXQgPSBldmVudC50YXJnZXQ7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIC8vIGp1c3QgYWNjZXNzaW5nIGV2ZW50IHByb3BlcnRpZXMgY2FuIHRocm93IGFuIGV4Y2VwdGlvbiBpbiBzb21lIHJhcmUgY2lyY3Vtc3RhbmNlc1xuICAgICAgICAgICAgLy8gc2VlOiBodHRwczovL2dpdGh1Yi5jb20vZ2V0c2VudHJ5L3JhdmVuLWpzL2lzc3Vlcy84MzhcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgdGFnTmFtZSA9IHRhcmdldCAmJiB0YXJnZXQudGFnTmFtZTtcbiAgICAgICAgLy8gb25seSBjb25zaWRlciBrZXlwcmVzcyBldmVudHMgb24gYWN0dWFsIGlucHV0IGVsZW1lbnRzXG4gICAgICAgIC8vIHRoaXMgd2lsbCBkaXNyZWdhcmQga2V5cHJlc3NlcyB0YXJnZXRpbmcgYm9keSAoZS5nLiB0YWJiaW5nXG4gICAgICAgIC8vIHRocm91Z2ggZWxlbWVudHMsIGhvdGtleXMsIGV0YylcbiAgICAgICAgaWYgKCF0YWdOYW1lIHx8ICh0YWdOYW1lICE9PSAnSU5QVVQnICYmIHRhZ05hbWUgIT09ICdURVhUQVJFQScgJiYgIXRhcmdldC5pc0NvbnRlbnRFZGl0YWJsZSkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyByZWNvcmQgZmlyc3Qga2V5cHJlc3MgaW4gYSBzZXJpZXMsIGJ1dCBpZ25vcmUgc3Vic2VxdWVudFxuICAgICAgICAvLyBrZXlwcmVzc2VzIHVudGlsIGRlYm91bmNlIGNsZWFyc1xuICAgICAgICBpZiAoIWtleXByZXNzVGltZW91dCkge1xuICAgICAgICAgICAgZG9tRXZlbnRIYW5kbGVyKCdpbnB1dCcsIGhhbmRsZXIpKGV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgICBjbGVhclRpbWVvdXQoa2V5cHJlc3NUaW1lb3V0KTtcbiAgICAgICAga2V5cHJlc3NUaW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBrZXlwcmVzc1RpbWVvdXQgPSB1bmRlZmluZWQ7XG4gICAgICAgIH0sIGRlYm91bmNlRHVyYXRpb24pO1xuICAgIH07XG59XG52YXIgX29sZE9uRXJyb3JIYW5kbGVyID0gbnVsbDtcbi8qKiBKU0RvYyAqL1xuZnVuY3Rpb24gaW5zdHJ1bWVudEVycm9yKCkge1xuICAgIF9vbGRPbkVycm9ySGFuZGxlciA9IGdsb2JhbC5vbmVycm9yO1xuICAgIGdsb2JhbC5vbmVycm9yID0gZnVuY3Rpb24gKG1zZywgdXJsLCBsaW5lLCBjb2x1bW4sIGVycm9yKSB7XG4gICAgICAgIHRyaWdnZXJIYW5kbGVycygnZXJyb3InLCB7XG4gICAgICAgICAgICBjb2x1bW46IGNvbHVtbixcbiAgICAgICAgICAgIGVycm9yOiBlcnJvcixcbiAgICAgICAgICAgIGxpbmU6IGxpbmUsXG4gICAgICAgICAgICBtc2c6IG1zZyxcbiAgICAgICAgICAgIHVybDogdXJsLFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKF9vbGRPbkVycm9ySGFuZGxlcikge1xuICAgICAgICAgICAgcmV0dXJuIF9vbGRPbkVycm9ySGFuZGxlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xufVxudmFyIF9vbGRPblVuaGFuZGxlZFJlamVjdGlvbkhhbmRsZXIgPSBudWxsO1xuLyoqIEpTRG9jICovXG5mdW5jdGlvbiBpbnN0cnVtZW50VW5oYW5kbGVkUmVqZWN0aW9uKCkge1xuICAgIF9vbGRPblVuaGFuZGxlZFJlamVjdGlvbkhhbmRsZXIgPSBnbG9iYWwub251bmhhbmRsZWRyZWplY3Rpb247XG4gICAgZ2xvYmFsLm9udW5oYW5kbGVkcmVqZWN0aW9uID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgdHJpZ2dlckhhbmRsZXJzKCd1bmhhbmRsZWRyZWplY3Rpb24nLCBlKTtcbiAgICAgICAgaWYgKF9vbGRPblVuaGFuZGxlZFJlamVjdGlvbkhhbmRsZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBfb2xkT25VbmhhbmRsZWRSZWplY3Rpb25IYW5kbGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluc3RydW1lbnQuanMubWFwIiwiLyoqXG4gKiBDaGVja3Mgd2hldGhlciBnaXZlbiB2YWx1ZSdzIHR5cGUgaXMgb25lIG9mIGEgZmV3IEVycm9yIG9yIEVycm9yLWxpa2VcbiAqIHtAbGluayBpc0Vycm9yfS5cbiAqXG4gKiBAcGFyYW0gd2F0IEEgdmFsdWUgdG8gYmUgY2hlY2tlZC5cbiAqIEByZXR1cm5zIEEgYm9vbGVhbiByZXByZXNlbnRpbmcgdGhlIHJlc3VsdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRXJyb3Iod2F0KSB7XG4gICAgc3dpdGNoIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwod2F0KSkge1xuICAgICAgICBjYXNlICdbb2JqZWN0IEVycm9yXSc6XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgY2FzZSAnW29iamVjdCBFeGNlcHRpb25dJzpcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBjYXNlICdbb2JqZWN0IERPTUV4Y2VwdGlvbl0nOlxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gaXNJbnN0YW5jZU9mKHdhdCwgRXJyb3IpO1xuICAgIH1cbn1cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgZ2l2ZW4gdmFsdWUncyB0eXBlIGlzIEVycm9yRXZlbnRcbiAqIHtAbGluayBpc0Vycm9yRXZlbnR9LlxuICpcbiAqIEBwYXJhbSB3YXQgQSB2YWx1ZSB0byBiZSBjaGVja2VkLlxuICogQHJldHVybnMgQSBib29sZWFuIHJlcHJlc2VudGluZyB0aGUgcmVzdWx0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNFcnJvckV2ZW50KHdhdCkge1xuICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwod2F0KSA9PT0gJ1tvYmplY3QgRXJyb3JFdmVudF0nO1xufVxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBnaXZlbiB2YWx1ZSdzIHR5cGUgaXMgRE9NRXJyb3JcbiAqIHtAbGluayBpc0RPTUVycm9yfS5cbiAqXG4gKiBAcGFyYW0gd2F0IEEgdmFsdWUgdG8gYmUgY2hlY2tlZC5cbiAqIEByZXR1cm5zIEEgYm9vbGVhbiByZXByZXNlbnRpbmcgdGhlIHJlc3VsdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRE9NRXJyb3Iod2F0KSB7XG4gICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh3YXQpID09PSAnW29iamVjdCBET01FcnJvcl0nO1xufVxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBnaXZlbiB2YWx1ZSdzIHR5cGUgaXMgRE9NRXhjZXB0aW9uXG4gKiB7QGxpbmsgaXNET01FeGNlcHRpb259LlxuICpcbiAqIEBwYXJhbSB3YXQgQSB2YWx1ZSB0byBiZSBjaGVja2VkLlxuICogQHJldHVybnMgQSBib29sZWFuIHJlcHJlc2VudGluZyB0aGUgcmVzdWx0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNET01FeGNlcHRpb24od2F0KSB7XG4gICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh3YXQpID09PSAnW29iamVjdCBET01FeGNlcHRpb25dJztcbn1cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgZ2l2ZW4gdmFsdWUncyB0eXBlIGlzIGEgc3RyaW5nXG4gKiB7QGxpbmsgaXNTdHJpbmd9LlxuICpcbiAqIEBwYXJhbSB3YXQgQSB2YWx1ZSB0byBiZSBjaGVja2VkLlxuICogQHJldHVybnMgQSBib29sZWFuIHJlcHJlc2VudGluZyB0aGUgcmVzdWx0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNTdHJpbmcod2F0KSB7XG4gICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh3YXQpID09PSAnW29iamVjdCBTdHJpbmddJztcbn1cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgZ2l2ZW4gdmFsdWUncyBpcyBhIHByaW1pdGl2ZSAodW5kZWZpbmVkLCBudWxsLCBudW1iZXIsIGJvb2xlYW4sIHN0cmluZylcbiAqIHtAbGluayBpc1ByaW1pdGl2ZX0uXG4gKlxuICogQHBhcmFtIHdhdCBBIHZhbHVlIHRvIGJlIGNoZWNrZWQuXG4gKiBAcmV0dXJucyBBIGJvb2xlYW4gcmVwcmVzZW50aW5nIHRoZSByZXN1bHQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ByaW1pdGl2ZSh3YXQpIHtcbiAgICByZXR1cm4gd2F0ID09PSBudWxsIHx8ICh0eXBlb2Ygd2F0ICE9PSAnb2JqZWN0JyAmJiB0eXBlb2Ygd2F0ICE9PSAnZnVuY3Rpb24nKTtcbn1cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgZ2l2ZW4gdmFsdWUncyB0eXBlIGlzIGFuIG9iamVjdCBsaXRlcmFsXG4gKiB7QGxpbmsgaXNQbGFpbk9iamVjdH0uXG4gKlxuICogQHBhcmFtIHdhdCBBIHZhbHVlIHRvIGJlIGNoZWNrZWQuXG4gKiBAcmV0dXJucyBBIGJvb2xlYW4gcmVwcmVzZW50aW5nIHRoZSByZXN1bHQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1BsYWluT2JqZWN0KHdhdCkge1xuICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwod2F0KSA9PT0gJ1tvYmplY3QgT2JqZWN0XSc7XG59XG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGdpdmVuIHZhbHVlJ3MgdHlwZSBpcyBhbiBFdmVudCBpbnN0YW5jZVxuICoge0BsaW5rIGlzRXZlbnR9LlxuICpcbiAqIEBwYXJhbSB3YXQgQSB2YWx1ZSB0byBiZSBjaGVja2VkLlxuICogQHJldHVybnMgQSBib29sZWFuIHJlcHJlc2VudGluZyB0aGUgcmVzdWx0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNFdmVudCh3YXQpIHtcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6c3RyaWN0LXR5cGUtcHJlZGljYXRlc1xuICAgIHJldHVybiB0eXBlb2YgRXZlbnQgIT09ICd1bmRlZmluZWQnICYmIGlzSW5zdGFuY2VPZih3YXQsIEV2ZW50KTtcbn1cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgZ2l2ZW4gdmFsdWUncyB0eXBlIGlzIGFuIEVsZW1lbnQgaW5zdGFuY2VcbiAqIHtAbGluayBpc0VsZW1lbnR9LlxuICpcbiAqIEBwYXJhbSB3YXQgQSB2YWx1ZSB0byBiZSBjaGVja2VkLlxuICogQHJldHVybnMgQSBib29sZWFuIHJlcHJlc2VudGluZyB0aGUgcmVzdWx0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNFbGVtZW50KHdhdCkge1xuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpzdHJpY3QtdHlwZS1wcmVkaWNhdGVzXG4gICAgcmV0dXJuIHR5cGVvZiBFbGVtZW50ICE9PSAndW5kZWZpbmVkJyAmJiBpc0luc3RhbmNlT2Yod2F0LCBFbGVtZW50KTtcbn1cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgZ2l2ZW4gdmFsdWUncyB0eXBlIGlzIGFuIHJlZ2V4cFxuICoge0BsaW5rIGlzUmVnRXhwfS5cbiAqXG4gKiBAcGFyYW0gd2F0IEEgdmFsdWUgdG8gYmUgY2hlY2tlZC5cbiAqIEByZXR1cm5zIEEgYm9vbGVhbiByZXByZXNlbnRpbmcgdGhlIHJlc3VsdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUmVnRXhwKHdhdCkge1xuICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwod2F0KSA9PT0gJ1tvYmplY3QgUmVnRXhwXSc7XG59XG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGdpdmVuIHZhbHVlIGhhcyBhIHRoZW4gZnVuY3Rpb24uXG4gKiBAcGFyYW0gd2F0IEEgdmFsdWUgdG8gYmUgY2hlY2tlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVGhlbmFibGUod2F0KSB7XG4gICAgLy8gdHNsaW50OmRpc2FibGU6bm8tdW5zYWZlLWFueVxuICAgIHJldHVybiBCb29sZWFuKHdhdCAmJiB3YXQudGhlbiAmJiB0eXBlb2Ygd2F0LnRoZW4gPT09ICdmdW5jdGlvbicpO1xuICAgIC8vIHRzbGludDplbmFibGU6bm8tdW5zYWZlLWFueVxufVxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBnaXZlbiB2YWx1ZSdzIHR5cGUgaXMgYSBTeW50aGV0aWNFdmVudFxuICoge0BsaW5rIGlzU3ludGhldGljRXZlbnR9LlxuICpcbiAqIEBwYXJhbSB3YXQgQSB2YWx1ZSB0byBiZSBjaGVja2VkLlxuICogQHJldHVybnMgQSBib29sZWFuIHJlcHJlc2VudGluZyB0aGUgcmVzdWx0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNTeW50aGV0aWNFdmVudCh3YXQpIHtcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tdW5zYWZlLWFueVxuICAgIHJldHVybiBpc1BsYWluT2JqZWN0KHdhdCkgJiYgJ25hdGl2ZUV2ZW50JyBpbiB3YXQgJiYgJ3ByZXZlbnREZWZhdWx0JyBpbiB3YXQgJiYgJ3N0b3BQcm9wYWdhdGlvbicgaW4gd2F0O1xufVxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBnaXZlbiB2YWx1ZSdzIHR5cGUgaXMgYW4gaW5zdGFuY2Ugb2YgcHJvdmlkZWQgY29uc3RydWN0b3IuXG4gKiB7QGxpbmsgaXNJbnN0YW5jZU9mfS5cbiAqXG4gKiBAcGFyYW0gd2F0IEEgdmFsdWUgdG8gYmUgY2hlY2tlZC5cbiAqIEBwYXJhbSBiYXNlIEEgY29uc3RydWN0b3IgdG8gYmUgdXNlZCBpbiBhIGNoZWNrLlxuICogQHJldHVybnMgQSBib29sZWFuIHJlcHJlc2VudGluZyB0aGUgcmVzdWx0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNJbnN0YW5jZU9mKHdhdCwgYmFzZSkge1xuICAgIHRyeSB7XG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby11bnNhZmUtYW55XG4gICAgICAgIHJldHVybiB3YXQgaW5zdGFuY2VvZiBiYXNlO1xuICAgIH1cbiAgICBjYXRjaCAoX2UpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWlzLmpzLm1hcCIsImltcG9ydCB7IGNvbnNvbGVTYW5kYm94LCBnZXRHbG9iYWxPYmplY3QgfSBmcm9tICcuL21pc2MnO1xuLy8gVE9ETzogSW1wbGVtZW50IGRpZmZlcmVudCBsb2dnZXJzIGZvciBkaWZmZXJlbnQgZW52aXJvbm1lbnRzXG52YXIgZ2xvYmFsID0gZ2V0R2xvYmFsT2JqZWN0KCk7XG4vKiogUHJlZml4IGZvciBsb2dnaW5nIHN0cmluZ3MgKi9cbnZhciBQUkVGSVggPSAnU2VudHJ5IExvZ2dlciAnO1xuLyoqIEpTRG9jICovXG52YXIgTG9nZ2VyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIC8qKiBKU0RvYyAqL1xuICAgIGZ1bmN0aW9uIExvZ2dlcigpIHtcbiAgICAgICAgdGhpcy5fZW5hYmxlZCA9IGZhbHNlO1xuICAgIH1cbiAgICAvKiogSlNEb2MgKi9cbiAgICBMb2dnZXIucHJvdG90eXBlLmRpc2FibGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuX2VuYWJsZWQgPSBmYWxzZTtcbiAgICB9O1xuICAgIC8qKiBKU0RvYyAqL1xuICAgIExvZ2dlci5wcm90b3R5cGUuZW5hYmxlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLl9lbmFibGVkID0gdHJ1ZTtcbiAgICB9O1xuICAgIC8qKiBKU0RvYyAqL1xuICAgIExvZ2dlci5wcm90b3R5cGUubG9nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgYXJncyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgYXJnc1tfaV0gPSBhcmd1bWVudHNbX2ldO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5fZW5hYmxlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGVTYW5kYm94KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGdsb2JhbC5jb25zb2xlLmxvZyhQUkVGSVggKyBcIltMb2ddOiBcIiArIGFyZ3Muam9pbignICcpKTsgLy8gdHNsaW50OmRpc2FibGUtbGluZTpuby1jb25zb2xlXG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqIEpTRG9jICovXG4gICAgTG9nZ2VyLnByb3RvdHlwZS53YXJuID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgYXJncyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgYXJnc1tfaV0gPSBhcmd1bWVudHNbX2ldO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5fZW5hYmxlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGVTYW5kYm94KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGdsb2JhbC5jb25zb2xlLndhcm4oUFJFRklYICsgXCJbV2Fybl06IFwiICsgYXJncy5qb2luKCcgJykpOyAvLyB0c2xpbnQ6ZGlzYWJsZS1saW5lOm5vLWNvbnNvbGVcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKiogSlNEb2MgKi9cbiAgICBMb2dnZXIucHJvdG90eXBlLmVycm9yID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgYXJncyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgYXJnc1tfaV0gPSBhcmd1bWVudHNbX2ldO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5fZW5hYmxlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGVTYW5kYm94KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGdsb2JhbC5jb25zb2xlLmVycm9yKFBSRUZJWCArIFwiW0Vycm9yXTogXCIgKyBhcmdzLmpvaW4oJyAnKSk7IC8vIHRzbGludDpkaXNhYmxlLWxpbmU6bm8tY29uc29sZVxuICAgICAgICB9KTtcbiAgICB9O1xuICAgIHJldHVybiBMb2dnZXI7XG59KCkpO1xuLy8gRW5zdXJlIHdlIG9ubHkgaGF2ZSBhIHNpbmdsZSBsb2dnZXIgaW5zdGFuY2UsIGV2ZW4gaWYgbXVsdGlwbGUgdmVyc2lvbnMgb2YgQHNlbnRyeS91dGlscyBhcmUgYmVpbmcgdXNlZFxuZ2xvYmFsLl9fU0VOVFJZX18gPSBnbG9iYWwuX19TRU5UUllfXyB8fCB7fTtcbnZhciBsb2dnZXIgPSBnbG9iYWwuX19TRU5UUllfXy5sb2dnZXIgfHwgKGdsb2JhbC5fX1NFTlRSWV9fLmxvZ2dlciA9IG5ldyBMb2dnZXIoKSk7XG5leHBvcnQgeyBsb2dnZXIgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWxvZ2dlci5qcy5tYXAiLCIvLyB0c2xpbnQ6ZGlzYWJsZTpuby11bnNhZmUtYW55XG4vKipcbiAqIE1lbW8gY2xhc3MgdXNlZCBmb3IgZGVjeWNsZSBqc29uIG9iamVjdHMuIFVzZXMgV2Vha1NldCBpZiBhdmFpbGFibGUgb3RoZXJ3aXNlIGFycmF5LlxuICovXG52YXIgTWVtbyA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBNZW1vKCkge1xuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmVcbiAgICAgICAgdGhpcy5faGFzV2Vha1NldCA9IHR5cGVvZiBXZWFrU2V0ID09PSAnZnVuY3Rpb24nO1xuICAgICAgICB0aGlzLl9pbm5lciA9IHRoaXMuX2hhc1dlYWtTZXQgPyBuZXcgV2Vha1NldCgpIDogW107XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldHMgb2JqIHRvIHJlbWVtYmVyLlxuICAgICAqIEBwYXJhbSBvYmogT2JqZWN0IHRvIHJlbWVtYmVyXG4gICAgICovXG4gICAgTWVtby5wcm90b3R5cGUubWVtb2l6ZSA9IGZ1bmN0aW9uIChvYmopIHtcbiAgICAgICAgaWYgKHRoaXMuX2hhc1dlYWtTZXQpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9pbm5lci5oYXMob2JqKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5faW5uZXIuYWRkKG9iaik7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnByZWZlci1mb3Itb2ZcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLl9pbm5lci5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIHZhbHVlID0gdGhpcy5faW5uZXJbaV07XG4gICAgICAgICAgICBpZiAodmFsdWUgPT09IG9iaikge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2lubmVyLnB1c2gob2JqKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBvYmplY3QgZnJvbSBpbnRlcm5hbCBzdG9yYWdlLlxuICAgICAqIEBwYXJhbSBvYmogT2JqZWN0IHRvIGZvcmdldFxuICAgICAqL1xuICAgIE1lbW8ucHJvdG90eXBlLnVubWVtb2l6ZSA9IGZ1bmN0aW9uIChvYmopIHtcbiAgICAgICAgaWYgKHRoaXMuX2hhc1dlYWtTZXQpIHtcbiAgICAgICAgICAgIHRoaXMuX2lubmVyLmRlbGV0ZShvYmopO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLl9pbm5lci5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9pbm5lcltpXSA9PT0gb2JqKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2lubmVyLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gTWVtbztcbn0oKSk7XG5leHBvcnQgeyBNZW1vIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1tZW1vLmpzLm1hcCIsImltcG9ydCB7IGlzU3RyaW5nIH0gZnJvbSAnLi9pcyc7XG5pbXBvcnQgeyBzbmlwTGluZSB9IGZyb20gJy4vc3RyaW5nJztcbi8qKlxuICogUmVxdWlyZXMgYSBtb2R1bGUgd2hpY2ggaXMgcHJvdGVjdGVkIGFnYWluc3QgYnVuZGxlciBtaW5pZmljYXRpb24uXG4gKlxuICogQHBhcmFtIHJlcXVlc3QgVGhlIG1vZHVsZSBwYXRoIHRvIHJlc29sdmVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGR5bmFtaWNSZXF1aXJlKG1vZCwgcmVxdWVzdCkge1xuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tdW5zYWZlLWFueVxuICAgIHJldHVybiBtb2QucmVxdWlyZShyZXF1ZXN0KTtcbn1cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgd2UncmUgaW4gdGhlIE5vZGUuanMgb3IgQnJvd3NlciBlbnZpcm9ubWVudFxuICpcbiAqIEByZXR1cm5zIEFuc3dlciB0byBnaXZlbiBxdWVzdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNOb2RlRW52KCkge1xuICAgIC8vIHRzbGludDpkaXNhYmxlOnN0cmljdC10eXBlLXByZWRpY2F0ZXNcbiAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyA/IHByb2Nlc3MgOiAwKSA9PT0gJ1tvYmplY3QgcHJvY2Vzc10nO1xufVxudmFyIGZhbGxiYWNrR2xvYmFsT2JqZWN0ID0ge307XG4vKipcbiAqIFNhZmVseSBnZXQgZ2xvYmFsIHNjb3BlIG9iamVjdFxuICpcbiAqIEByZXR1cm5zIEdsb2JhbCBzY29wZSBvYmplY3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEdsb2JhbE9iamVjdCgpIHtcbiAgICByZXR1cm4gKGlzTm9kZUVudigpXG4gICAgICAgID8gZ2xvYmFsXG4gICAgICAgIDogdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAgICAgID8gd2luZG93XG4gICAgICAgICAgICA6IHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICAgICAgICAgID8gc2VsZlxuICAgICAgICAgICAgICAgIDogZmFsbGJhY2tHbG9iYWxPYmplY3QpO1xufVxuLyoqXG4gKiBVVUlENCBnZW5lcmF0b3JcbiAqXG4gKiBAcmV0dXJucyBzdHJpbmcgR2VuZXJhdGVkIFVVSUQ0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gdXVpZDQoKSB7XG4gICAgdmFyIGdsb2JhbCA9IGdldEdsb2JhbE9iamVjdCgpO1xuICAgIHZhciBjcnlwdG8gPSBnbG9iYWwuY3J5cHRvIHx8IGdsb2JhbC5tc0NyeXB0bztcbiAgICBpZiAoIShjcnlwdG8gPT09IHZvaWQgMCkgJiYgY3J5cHRvLmdldFJhbmRvbVZhbHVlcykge1xuICAgICAgICAvLyBVc2Ugd2luZG93LmNyeXB0byBBUEkgaWYgYXZhaWxhYmxlXG4gICAgICAgIHZhciBhcnIgPSBuZXcgVWludDE2QXJyYXkoOCk7XG4gICAgICAgIGNyeXB0by5nZXRSYW5kb21WYWx1ZXMoYXJyKTtcbiAgICAgICAgLy8gc2V0IDQgaW4gYnl0ZSA3XG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1iaXR3aXNlXG4gICAgICAgIGFyclszXSA9IChhcnJbM10gJiAweGZmZikgfCAweDQwMDA7XG4gICAgICAgIC8vIHNldCAyIG1vc3Qgc2lnbmlmaWNhbnQgYml0cyBvZiBieXRlIDkgdG8gJzEwJ1xuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYml0d2lzZVxuICAgICAgICBhcnJbNF0gPSAoYXJyWzRdICYgMHgzZmZmKSB8IDB4ODAwMDtcbiAgICAgICAgdmFyIHBhZCA9IGZ1bmN0aW9uIChudW0pIHtcbiAgICAgICAgICAgIHZhciB2ID0gbnVtLnRvU3RyaW5nKDE2KTtcbiAgICAgICAgICAgIHdoaWxlICh2Lmxlbmd0aCA8IDQpIHtcbiAgICAgICAgICAgICAgICB2ID0gXCIwXCIgKyB2O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHY7XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiAocGFkKGFyclswXSkgKyBwYWQoYXJyWzFdKSArIHBhZChhcnJbMl0pICsgcGFkKGFyclszXSkgKyBwYWQoYXJyWzRdKSArIHBhZChhcnJbNV0pICsgcGFkKGFycls2XSkgKyBwYWQoYXJyWzddKSk7XG4gICAgfVxuICAgIC8vIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMTA1MDM0L2hvdy10by1jcmVhdGUtYS1ndWlkLXV1aWQtaW4tamF2YXNjcmlwdC8yMTE3NTIzIzIxMTc1MjNcbiAgICByZXR1cm4gJ3h4eHh4eHh4eHh4eDR4eHh5eHh4eHh4eHh4eHh4eHh4Jy5yZXBsYWNlKC9beHldL2csIGZ1bmN0aW9uIChjKSB7XG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1iaXR3aXNlXG4gICAgICAgIHZhciByID0gKE1hdGgucmFuZG9tKCkgKiAxNikgfCAwO1xuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYml0d2lzZVxuICAgICAgICB2YXIgdiA9IGMgPT09ICd4JyA/IHIgOiAociAmIDB4MykgfCAweDg7XG4gICAgICAgIHJldHVybiB2LnRvU3RyaW5nKDE2KTtcbiAgICB9KTtcbn1cbi8qKlxuICogUGFyc2VzIHN0cmluZyBmb3JtIG9mIFVSTCBpbnRvIGFuIG9iamVjdFxuICogLy8gYm9ycm93ZWQgZnJvbSBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMzk4NiNhcHBlbmRpeC1CXG4gKiAvLyBpbnRlbnRpb25hbGx5IHVzaW5nIHJlZ2V4IGFuZCBub3QgPGEvPiBocmVmIHBhcnNpbmcgdHJpY2sgYmVjYXVzZSBSZWFjdCBOYXRpdmUgYW5kIG90aGVyXG4gKiAvLyBlbnZpcm9ubWVudHMgd2hlcmUgRE9NIG1pZ2h0IG5vdCBiZSBhdmFpbGFibGVcbiAqIEByZXR1cm5zIHBhcnNlZCBVUkwgb2JqZWN0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVVybCh1cmwpIHtcbiAgICBpZiAoIXVybCkge1xuICAgICAgICByZXR1cm4ge307XG4gICAgfVxuICAgIHZhciBtYXRjaCA9IHVybC5tYXRjaCgvXigoW146XFwvPyNdKyk6KT8oXFwvXFwvKFteXFwvPyNdKikpPyhbXj8jXSopKFxcPyhbXiNdKikpPygjKC4qKSk/JC8pO1xuICAgIGlmICghbWF0Y2gpIHtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbiAgICAvLyBjb2VyY2UgdG8gdW5kZWZpbmVkIHZhbHVlcyB0byBlbXB0eSBzdHJpbmcgc28gd2UgZG9uJ3QgZ2V0ICd1bmRlZmluZWQnXG4gICAgdmFyIHF1ZXJ5ID0gbWF0Y2hbNl0gfHwgJyc7XG4gICAgdmFyIGZyYWdtZW50ID0gbWF0Y2hbOF0gfHwgJyc7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgaG9zdDogbWF0Y2hbNF0sXG4gICAgICAgIHBhdGg6IG1hdGNoWzVdLFxuICAgICAgICBwcm90b2NvbDogbWF0Y2hbMl0sXG4gICAgICAgIHJlbGF0aXZlOiBtYXRjaFs1XSArIHF1ZXJ5ICsgZnJhZ21lbnQsXG4gICAgfTtcbn1cbi8qKlxuICogRXh0cmFjdHMgZWl0aGVyIG1lc3NhZ2Ugb3IgdHlwZSt2YWx1ZSBmcm9tIGFuIGV2ZW50IHRoYXQgY2FuIGJlIHVzZWQgZm9yIHVzZXItZmFjaW5nIGxvZ3NcbiAqIEByZXR1cm5zIGV2ZW50J3MgZGVzY3JpcHRpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEV2ZW50RGVzY3JpcHRpb24oZXZlbnQpIHtcbiAgICBpZiAoZXZlbnQubWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gZXZlbnQubWVzc2FnZTtcbiAgICB9XG4gICAgaWYgKGV2ZW50LmV4Y2VwdGlvbiAmJiBldmVudC5leGNlcHRpb24udmFsdWVzICYmIGV2ZW50LmV4Y2VwdGlvbi52YWx1ZXNbMF0pIHtcbiAgICAgICAgdmFyIGV4Y2VwdGlvbiA9IGV2ZW50LmV4Y2VwdGlvbi52YWx1ZXNbMF07XG4gICAgICAgIGlmIChleGNlcHRpb24udHlwZSAmJiBleGNlcHRpb24udmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybiBleGNlcHRpb24udHlwZSArIFwiOiBcIiArIGV4Y2VwdGlvbi52YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZXhjZXB0aW9uLnR5cGUgfHwgZXhjZXB0aW9uLnZhbHVlIHx8IGV2ZW50LmV2ZW50X2lkIHx8ICc8dW5rbm93bj4nO1xuICAgIH1cbiAgICByZXR1cm4gZXZlbnQuZXZlbnRfaWQgfHwgJzx1bmtub3duPic7XG59XG4vKiogSlNEb2MgKi9cbmV4cG9ydCBmdW5jdGlvbiBjb25zb2xlU2FuZGJveChjYWxsYmFjaykge1xuICAgIHZhciBnbG9iYWwgPSBnZXRHbG9iYWxPYmplY3QoKTtcbiAgICB2YXIgbGV2ZWxzID0gWydkZWJ1ZycsICdpbmZvJywgJ3dhcm4nLCAnZXJyb3InLCAnbG9nJywgJ2Fzc2VydCddO1xuICAgIGlmICghKCdjb25zb2xlJyBpbiBnbG9iYWwpKSB7XG4gICAgICAgIHJldHVybiBjYWxsYmFjaygpO1xuICAgIH1cbiAgICB2YXIgb3JpZ2luYWxDb25zb2xlID0gZ2xvYmFsLmNvbnNvbGU7XG4gICAgdmFyIHdyYXBwZWRMZXZlbHMgPSB7fTtcbiAgICAvLyBSZXN0b3JlIGFsbCB3cmFwcGVkIGNvbnNvbGUgbWV0aG9kc1xuICAgIGxldmVscy5mb3JFYWNoKGZ1bmN0aW9uIChsZXZlbCkge1xuICAgICAgICBpZiAobGV2ZWwgaW4gZ2xvYmFsLmNvbnNvbGUgJiYgb3JpZ2luYWxDb25zb2xlW2xldmVsXS5fX3NlbnRyeV9vcmlnaW5hbF9fKSB7XG4gICAgICAgICAgICB3cmFwcGVkTGV2ZWxzW2xldmVsXSA9IG9yaWdpbmFsQ29uc29sZVtsZXZlbF07XG4gICAgICAgICAgICBvcmlnaW5hbENvbnNvbGVbbGV2ZWxdID0gb3JpZ2luYWxDb25zb2xlW2xldmVsXS5fX3NlbnRyeV9vcmlnaW5hbF9fO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgLy8gUGVyZm9ybSBjYWxsYmFjayBtYW5pcHVsYXRpb25zXG4gICAgdmFyIHJlc3VsdCA9IGNhbGxiYWNrKCk7XG4gICAgLy8gUmV2ZXJ0IHJlc3RvcmF0aW9uIHRvIHdyYXBwZWQgc3RhdGVcbiAgICBPYmplY3Qua2V5cyh3cmFwcGVkTGV2ZWxzKS5mb3JFYWNoKGZ1bmN0aW9uIChsZXZlbCkge1xuICAgICAgICBvcmlnaW5hbENvbnNvbGVbbGV2ZWxdID0gd3JhcHBlZExldmVsc1tsZXZlbF07XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbi8qKlxuICogQWRkcyBleGNlcHRpb24gdmFsdWVzLCB0eXBlIGFuZCB2YWx1ZSB0byBhbiBzeW50aGV0aWMgRXhjZXB0aW9uLlxuICogQHBhcmFtIGV2ZW50IFRoZSBldmVudCB0byBtb2RpZnkuXG4gKiBAcGFyYW0gdmFsdWUgVmFsdWUgb2YgdGhlIGV4Y2VwdGlvbi5cbiAqIEBwYXJhbSB0eXBlIFR5cGUgb2YgdGhlIGV4Y2VwdGlvbi5cbiAqIEBoaWRkZW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkZEV4Y2VwdGlvblR5cGVWYWx1ZShldmVudCwgdmFsdWUsIHR5cGUpIHtcbiAgICBldmVudC5leGNlcHRpb24gPSBldmVudC5leGNlcHRpb24gfHwge307XG4gICAgZXZlbnQuZXhjZXB0aW9uLnZhbHVlcyA9IGV2ZW50LmV4Y2VwdGlvbi52YWx1ZXMgfHwgW107XG4gICAgZXZlbnQuZXhjZXB0aW9uLnZhbHVlc1swXSA9IGV2ZW50LmV4Y2VwdGlvbi52YWx1ZXNbMF0gfHwge307XG4gICAgZXZlbnQuZXhjZXB0aW9uLnZhbHVlc1swXS52YWx1ZSA9IGV2ZW50LmV4Y2VwdGlvbi52YWx1ZXNbMF0udmFsdWUgfHwgdmFsdWUgfHwgJyc7XG4gICAgZXZlbnQuZXhjZXB0aW9uLnZhbHVlc1swXS50eXBlID0gZXZlbnQuZXhjZXB0aW9uLnZhbHVlc1swXS50eXBlIHx8IHR5cGUgfHwgJ0Vycm9yJztcbn1cbi8qKlxuICogQWRkcyBleGNlcHRpb24gbWVjaGFuaXNtIHRvIGEgZ2l2ZW4gZXZlbnQuXG4gKiBAcGFyYW0gZXZlbnQgVGhlIGV2ZW50IHRvIG1vZGlmeS5cbiAqIEBwYXJhbSBtZWNoYW5pc20gTWVjaGFuaXNtIG9mIHRoZSBtZWNoYW5pc20uXG4gKiBAaGlkZGVuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZGRFeGNlcHRpb25NZWNoYW5pc20oZXZlbnQsIG1lY2hhbmlzbSkge1xuICAgIGlmIChtZWNoYW5pc20gPT09IHZvaWQgMCkgeyBtZWNoYW5pc20gPSB7fTsgfVxuICAgIC8vIFRPRE86IFVzZSByZWFsIHR5cGUgd2l0aCBga2V5b2YgTWVjaGFuaXNtYCB0aGluZ3kgYW5kIG1heWJlIG1ha2UgaXQgYmV0dGVyP1xuICAgIHRyeSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGU6bm8tbm9uLW51bGwtYXNzZXJ0aW9uXG4gICAgICAgIGV2ZW50LmV4Y2VwdGlvbi52YWx1ZXNbMF0ubWVjaGFuaXNtID0gZXZlbnQuZXhjZXB0aW9uLnZhbHVlc1swXS5tZWNoYW5pc20gfHwge307XG4gICAgICAgIE9iamVjdC5rZXlzKG1lY2hhbmlzbSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBldmVudC5leGNlcHRpb24udmFsdWVzWzBdLm1lY2hhbmlzbVtrZXldID0gbWVjaGFuaXNtW2tleV07XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBjYXRjaCAoX29PKSB7XG4gICAgICAgIC8vIG5vLWVtcHR5XG4gICAgfVxufVxuLyoqXG4gKiBBIHNhZmUgZm9ybSBvZiBsb2NhdGlvbi5ocmVmXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRMb2NhdGlvbkhyZWYoKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGRvY3VtZW50LmxvY2F0aW9uLmhyZWY7XG4gICAgfVxuICAgIGNhdGNoIChvTykge1xuICAgICAgICByZXR1cm4gJyc7XG4gICAgfVxufVxuLyoqXG4gKiBHaXZlbiBhIGNoaWxkIERPTSBlbGVtZW50LCByZXR1cm5zIGEgcXVlcnktc2VsZWN0b3Igc3RhdGVtZW50IGRlc2NyaWJpbmcgdGhhdFxuICogYW5kIGl0cyBhbmNlc3RvcnNcbiAqIGUuZy4gW0hUTUxFbGVtZW50XSA9PiBib2R5ID4gZGl2ID4gaW5wdXQjZm9vLmJ0bltuYW1lPWJhel1cbiAqIEByZXR1cm5zIGdlbmVyYXRlZCBET00gcGF0aFxuICovXG5leHBvcnQgZnVuY3Rpb24gaHRtbFRyZWVBc1N0cmluZyhlbGVtKSB7XG4gICAgLy8gdHJ5L2NhdGNoIGJvdGg6XG4gICAgLy8gLSBhY2Nlc3NpbmcgZXZlbnQudGFyZ2V0IChzZWUgZ2V0c2VudHJ5L3JhdmVuLWpzIzgzOCwgIzc2OClcbiAgICAvLyAtIGBodG1sVHJlZUFzU3RyaW5nYCBiZWNhdXNlIGl0J3MgY29tcGxleCwgYW5kIGp1c3QgYWNjZXNzaW5nIHRoZSBET00gaW5jb3JyZWN0bHlcbiAgICAvLyAtIGNhbiB0aHJvdyBhbiBleGNlcHRpb24gaW4gc29tZSBjaXJjdW1zdGFuY2VzLlxuICAgIHRyeSB7XG4gICAgICAgIHZhciBjdXJyZW50RWxlbSA9IGVsZW07XG4gICAgICAgIHZhciBNQVhfVFJBVkVSU0VfSEVJR0hUID0gNTtcbiAgICAgICAgdmFyIE1BWF9PVVRQVVRfTEVOID0gODA7XG4gICAgICAgIHZhciBvdXQgPSBbXTtcbiAgICAgICAgdmFyIGhlaWdodCA9IDA7XG4gICAgICAgIHZhciBsZW4gPSAwO1xuICAgICAgICB2YXIgc2VwYXJhdG9yID0gJyA+ICc7XG4gICAgICAgIHZhciBzZXBMZW5ndGggPSBzZXBhcmF0b3IubGVuZ3RoO1xuICAgICAgICB2YXIgbmV4dFN0ciA9IHZvaWQgMDtcbiAgICAgICAgd2hpbGUgKGN1cnJlbnRFbGVtICYmIGhlaWdodCsrIDwgTUFYX1RSQVZFUlNFX0hFSUdIVCkge1xuICAgICAgICAgICAgbmV4dFN0ciA9IF9odG1sRWxlbWVudEFzU3RyaW5nKGN1cnJlbnRFbGVtKTtcbiAgICAgICAgICAgIC8vIGJhaWwgb3V0IGlmXG4gICAgICAgICAgICAvLyAtIG5leHRTdHIgaXMgdGhlICdodG1sJyBlbGVtZW50XG4gICAgICAgICAgICAvLyAtIHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZyB0aGF0IHdvdWxkIGJlIGNyZWF0ZWQgZXhjZWVkcyBNQVhfT1VUUFVUX0xFTlxuICAgICAgICAgICAgLy8gICAoaWdub3JlIHRoaXMgbGltaXQgaWYgd2UgYXJlIG9uIHRoZSBmaXJzdCBpdGVyYXRpb24pXG4gICAgICAgICAgICBpZiAobmV4dFN0ciA9PT0gJ2h0bWwnIHx8IChoZWlnaHQgPiAxICYmIGxlbiArIG91dC5sZW5ndGggKiBzZXBMZW5ndGggKyBuZXh0U3RyLmxlbmd0aCA+PSBNQVhfT1VUUFVUX0xFTikpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG91dC5wdXNoKG5leHRTdHIpO1xuICAgICAgICAgICAgbGVuICs9IG5leHRTdHIubGVuZ3RoO1xuICAgICAgICAgICAgY3VycmVudEVsZW0gPSBjdXJyZW50RWxlbS5wYXJlbnROb2RlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvdXQucmV2ZXJzZSgpLmpvaW4oc2VwYXJhdG9yKTtcbiAgICB9XG4gICAgY2F0Y2ggKF9vTykge1xuICAgICAgICByZXR1cm4gJzx1bmtub3duPic7XG4gICAgfVxufVxuLyoqXG4gKiBSZXR1cm5zIGEgc2ltcGxlLCBxdWVyeS1zZWxlY3RvciByZXByZXNlbnRhdGlvbiBvZiBhIERPTSBlbGVtZW50XG4gKiBlLmcuIFtIVE1MRWxlbWVudF0gPT4gaW5wdXQjZm9vLmJ0bltuYW1lPWJhel1cbiAqIEByZXR1cm5zIGdlbmVyYXRlZCBET00gcGF0aFxuICovXG5mdW5jdGlvbiBfaHRtbEVsZW1lbnRBc1N0cmluZyhlbCkge1xuICAgIHZhciBlbGVtID0gZWw7XG4gICAgdmFyIG91dCA9IFtdO1xuICAgIHZhciBjbGFzc05hbWU7XG4gICAgdmFyIGNsYXNzZXM7XG4gICAgdmFyIGtleTtcbiAgICB2YXIgYXR0cjtcbiAgICB2YXIgaTtcbiAgICBpZiAoIWVsZW0gfHwgIWVsZW0udGFnTmFtZSkge1xuICAgICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIG91dC5wdXNoKGVsZW0udGFnTmFtZS50b0xvd2VyQ2FzZSgpKTtcbiAgICBpZiAoZWxlbS5pZCkge1xuICAgICAgICBvdXQucHVzaChcIiNcIiArIGVsZW0uaWQpO1xuICAgIH1cbiAgICBjbGFzc05hbWUgPSBlbGVtLmNsYXNzTmFtZTtcbiAgICBpZiAoY2xhc3NOYW1lICYmIGlzU3RyaW5nKGNsYXNzTmFtZSkpIHtcbiAgICAgICAgY2xhc3NlcyA9IGNsYXNzTmFtZS5zcGxpdCgvXFxzKy8pO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY2xhc3Nlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgb3V0LnB1c2goXCIuXCIgKyBjbGFzc2VzW2ldKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB2YXIgYXR0cldoaXRlbGlzdCA9IFsndHlwZScsICduYW1lJywgJ3RpdGxlJywgJ2FsdCddO1xuICAgIGZvciAoaSA9IDA7IGkgPCBhdHRyV2hpdGVsaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGtleSA9IGF0dHJXaGl0ZWxpc3RbaV07XG4gICAgICAgIGF0dHIgPSBlbGVtLmdldEF0dHJpYnV0ZShrZXkpO1xuICAgICAgICBpZiAoYXR0cikge1xuICAgICAgICAgICAgb3V0LnB1c2goXCJbXCIgKyBrZXkgKyBcIj1cXFwiXCIgKyBhdHRyICsgXCJcXFwiXVwiKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gb3V0LmpvaW4oJycpO1xufVxudmFyIElOSVRJQUxfVElNRSA9IERhdGUubm93KCk7XG52YXIgcHJldk5vdyA9IDA7XG52YXIgcGVyZm9ybWFuY2VGYWxsYmFjayA9IHtcbiAgICBub3c6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIG5vdyA9IERhdGUubm93KCkgLSBJTklUSUFMX1RJTUU7XG4gICAgICAgIGlmIChub3cgPCBwcmV2Tm93KSB7XG4gICAgICAgICAgICBub3cgPSBwcmV2Tm93O1xuICAgICAgICB9XG4gICAgICAgIHByZXZOb3cgPSBub3c7XG4gICAgICAgIHJldHVybiBub3c7XG4gICAgfSxcbiAgICB0aW1lT3JpZ2luOiBJTklUSUFMX1RJTUUsXG59O1xuZXhwb3J0IHZhciBjcm9zc1BsYXRmb3JtUGVyZm9ybWFuY2UgPSAoZnVuY3Rpb24gKCkge1xuICAgIGlmIChpc05vZGVFbnYoKSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdmFyIHBlcmZIb29rcyA9IGR5bmFtaWNSZXF1aXJlKG1vZHVsZSwgJ3BlcmZfaG9va3MnKTtcbiAgICAgICAgICAgIHJldHVybiBwZXJmSG9va3MucGVyZm9ybWFuY2U7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKF8pIHtcbiAgICAgICAgICAgIHJldHVybiBwZXJmb3JtYW5jZUZhbGxiYWNrO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChnZXRHbG9iYWxPYmplY3QoKS5wZXJmb3JtYW5jZSkge1xuICAgICAgICAvLyBQb2x5ZmlsbCBmb3IgcGVyZm9ybWFuY2UudGltZU9yaWdpbi5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gV2hpbGUgcGVyZm9ybWFuY2UudGltaW5nLm5hdmlnYXRpb25TdGFydCBpcyBkZXByZWNhdGVkIGluIGZhdm9yIG9mIHBlcmZvcm1hbmNlLnRpbWVPcmlnaW4sIHBlcmZvcm1hbmNlLnRpbWVPcmlnaW5cbiAgICAgICAgLy8gaXMgbm90IGFzIHdpZGVseSBzdXBwb3J0ZWQuIE5hbWVseSwgcGVyZm9ybWFuY2UudGltZU9yaWdpbiBpcyB1bmRlZmluZWQgaW4gU2FmYXJpIGFzIG9mIHdyaXRpbmcuXG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpzdHJpY3QtdHlwZS1wcmVkaWNhdGVzXG4gICAgICAgIGlmIChwZXJmb3JtYW5jZS50aW1lT3JpZ2luID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIC8vIEFzIG9mIHdyaXRpbmcsIHBlcmZvcm1hbmNlLnRpbWluZyBpcyBub3QgYXZhaWxhYmxlIGluIFdlYiBXb3JrZXJzIGluIG1haW5zdHJlYW0gYnJvd3NlcnMsIHNvIGl0IGlzIG5vdCBhbHdheXMgYVxuICAgICAgICAgICAgLy8gdmFsaWQgZmFsbGJhY2suIEluIHRoZSBhYnNlbmNlIG9mIGEgaW5pdGlhbCB0aW1lIHByb3ZpZGVkIGJ5IHRoZSBicm93c2VyLCBmYWxsYmFjayB0byBJTklUSUFMX1RJTUUuXG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6ZGVwcmVjYXRpb25cbiAgICAgICAgICAgIHBlcmZvcm1hbmNlLnRpbWVPcmlnaW4gPSAocGVyZm9ybWFuY2UudGltaW5nICYmIHBlcmZvcm1hbmNlLnRpbWluZy5uYXZpZ2F0aW9uU3RhcnQpIHx8IElOSVRJQUxfVElNRTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZ2V0R2xvYmFsT2JqZWN0KCkucGVyZm9ybWFuY2UgfHwgcGVyZm9ybWFuY2VGYWxsYmFjaztcbn0pKCk7XG4vKipcbiAqIFJldHVybnMgYSB0aW1lc3RhbXAgaW4gc2Vjb25kcyB3aXRoIG1pbGxpc2Vjb25kcyBwcmVjaXNpb24gc2luY2UgdGhlIFVOSVggZXBvY2ggY2FsY3VsYXRlZCB3aXRoIHRoZSBtb25vdG9uaWMgY2xvY2suXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0aW1lc3RhbXBXaXRoTXMoKSB7XG4gICAgcmV0dXJuIChjcm9zc1BsYXRmb3JtUGVyZm9ybWFuY2UudGltZU9yaWdpbiArIGNyb3NzUGxhdGZvcm1QZXJmb3JtYW5jZS5ub3coKSkgLyAxMDAwO1xufVxuLy8gaHR0cHM6Ly9zZW12ZXIub3JnLyNpcy10aGVyZS1hLXN1Z2dlc3RlZC1yZWd1bGFyLWV4cHJlc3Npb24tcmVnZXgtdG8tY2hlY2stYS1zZW12ZXItc3RyaW5nXG52YXIgU0VNVkVSX1JFR0VYUCA9IC9eKDB8WzEtOV1cXGQqKVxcLigwfFsxLTldXFxkKilcXC4oMHxbMS05XVxcZCopKD86LSgoPzowfFsxLTldXFxkKnxcXGQqW2EtekEtWi1dWzAtOWEtekEtWi1dKikoPzpcXC4oPzowfFsxLTldXFxkKnxcXGQqW2EtekEtWi1dWzAtOWEtekEtWi1dKikpKikpPyg/OlxcKyhbMC05YS16QS1aLV0rKD86XFwuWzAtOWEtekEtWi1dKykqKSk/JC87XG4vKipcbiAqIFBhcnNlcyBpbnB1dCBpbnRvIGEgU2VtVmVyIGludGVyZmFjZVxuICogQHBhcmFtIGlucHV0IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIHNlbXZlciB2ZXJzaW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVNlbXZlcihpbnB1dCkge1xuICAgIHZhciBtYXRjaCA9IGlucHV0Lm1hdGNoKFNFTVZFUl9SRUdFWFApIHx8IFtdO1xuICAgIHZhciBtYWpvciA9IHBhcnNlSW50KG1hdGNoWzFdLCAxMCk7XG4gICAgdmFyIG1pbm9yID0gcGFyc2VJbnQobWF0Y2hbMl0sIDEwKTtcbiAgICB2YXIgcGF0Y2ggPSBwYXJzZUludChtYXRjaFszXSwgMTApO1xuICAgIHJldHVybiB7XG4gICAgICAgIGJ1aWxkbWV0YWRhdGE6IG1hdGNoWzVdLFxuICAgICAgICBtYWpvcjogaXNOYU4obWFqb3IpID8gdW5kZWZpbmVkIDogbWFqb3IsXG4gICAgICAgIG1pbm9yOiBpc05hTihtaW5vcikgPyB1bmRlZmluZWQgOiBtaW5vcixcbiAgICAgICAgcGF0Y2g6IGlzTmFOKHBhdGNoKSA/IHVuZGVmaW5lZCA6IHBhdGNoLFxuICAgICAgICBwcmVyZWxlYXNlOiBtYXRjaFs0XSxcbiAgICB9O1xufVxudmFyIGRlZmF1bHRSZXRyeUFmdGVyID0gNjAgKiAxMDAwOyAvLyA2MCBzZWNvbmRzXG4vKipcbiAqIEV4dHJhY3RzIFJldHJ5LUFmdGVyIHZhbHVlIGZyb20gdGhlIHJlcXVlc3QgaGVhZGVyIG9yIHJldHVybnMgZGVmYXVsdCB2YWx1ZVxuICogQHBhcmFtIG5vdyBjdXJyZW50IHVuaXggdGltZXN0YW1wXG4gKiBAcGFyYW0gaGVhZGVyIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiAnUmV0cnktQWZ0ZXInIGhlYWRlclxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VSZXRyeUFmdGVySGVhZGVyKG5vdywgaGVhZGVyKSB7XG4gICAgaWYgKCFoZWFkZXIpIHtcbiAgICAgICAgcmV0dXJuIGRlZmF1bHRSZXRyeUFmdGVyO1xuICAgIH1cbiAgICB2YXIgaGVhZGVyRGVsYXkgPSBwYXJzZUludChcIlwiICsgaGVhZGVyLCAxMCk7XG4gICAgaWYgKCFpc05hTihoZWFkZXJEZWxheSkpIHtcbiAgICAgICAgcmV0dXJuIGhlYWRlckRlbGF5ICogMTAwMDtcbiAgICB9XG4gICAgdmFyIGhlYWRlckRhdGUgPSBEYXRlLnBhcnNlKFwiXCIgKyBoZWFkZXIpO1xuICAgIGlmICghaXNOYU4oaGVhZGVyRGF0ZSkpIHtcbiAgICAgICAgcmV0dXJuIGhlYWRlckRhdGUgLSBub3c7XG4gICAgfVxuICAgIHJldHVybiBkZWZhdWx0UmV0cnlBZnRlcjtcbn1cbnZhciBkZWZhdWx0RnVuY3Rpb25OYW1lID0gJzxhbm9ueW1vdXM+Jztcbi8qKlxuICogU2FmZWx5IGV4dHJhY3QgZnVuY3Rpb24gbmFtZSBmcm9tIGl0c2VsZlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RnVuY3Rpb25OYW1lKGZuKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKCFmbiB8fCB0eXBlb2YgZm4gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHJldHVybiBkZWZhdWx0RnVuY3Rpb25OYW1lO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmbi5uYW1lIHx8IGRlZmF1bHRGdW5jdGlvbk5hbWU7XG4gICAgfVxuICAgIGNhdGNoIChlKSB7XG4gICAgICAgIC8vIEp1c3QgYWNjZXNzaW5nIGN1c3RvbSBwcm9wcyBpbiBzb21lIFNlbGVuaXVtIGVudmlyb25tZW50c1xuICAgICAgICAvLyBjYW4gY2F1c2UgYSBcIlBlcm1pc3Npb24gZGVuaWVkXCIgZXhjZXB0aW9uIChzZWUgcmF2ZW4tanMjNDk1KS5cbiAgICAgICAgcmV0dXJuIGRlZmF1bHRGdW5jdGlvbk5hbWU7XG4gICAgfVxufVxuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIGFkZHMgY29udGV4dCAocHJlL3Bvc3QvbGluZSkgbGluZXMgdG8gdGhlIHByb3ZpZGVkIGZyYW1lXG4gKlxuICogQHBhcmFtIGxpbmVzIHN0cmluZ1tdIGNvbnRhaW5pbmcgYWxsIGxpbmVzXG4gKiBAcGFyYW0gZnJhbWUgU3RhY2tGcmFtZSB0aGF0IHdpbGwgYmUgbXV0YXRlZFxuICogQHBhcmFtIGxpbmVzT2ZDb250ZXh0IG51bWJlciBvZiBjb250ZXh0IGxpbmVzIHdlIHdhbnQgdG8gYWRkIHByZS9wb3N0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZGRDb250ZXh0VG9GcmFtZShsaW5lcywgZnJhbWUsIGxpbmVzT2ZDb250ZXh0KSB7XG4gICAgaWYgKGxpbmVzT2ZDb250ZXh0ID09PSB2b2lkIDApIHsgbGluZXNPZkNvbnRleHQgPSA1OyB9XG4gICAgdmFyIGxpbmVubyA9IGZyYW1lLmxpbmVubyB8fCAwO1xuICAgIHZhciBtYXhMaW5lcyA9IGxpbmVzLmxlbmd0aDtcbiAgICB2YXIgc291cmNlTGluZSA9IE1hdGgubWF4KE1hdGgubWluKG1heExpbmVzLCBsaW5lbm8gLSAxKSwgMCk7XG4gICAgZnJhbWUucHJlX2NvbnRleHQgPSBsaW5lc1xuICAgICAgICAuc2xpY2UoTWF0aC5tYXgoMCwgc291cmNlTGluZSAtIGxpbmVzT2ZDb250ZXh0KSwgc291cmNlTGluZSlcbiAgICAgICAgLm1hcChmdW5jdGlvbiAobGluZSkgeyByZXR1cm4gc25pcExpbmUobGluZSwgMCk7IH0pO1xuICAgIGZyYW1lLmNvbnRleHRfbGluZSA9IHNuaXBMaW5lKGxpbmVzW01hdGgubWluKG1heExpbmVzIC0gMSwgc291cmNlTGluZSldLCBmcmFtZS5jb2xubyB8fCAwKTtcbiAgICBmcmFtZS5wb3N0X2NvbnRleHQgPSBsaW5lc1xuICAgICAgICAuc2xpY2UoTWF0aC5taW4oc291cmNlTGluZSArIDEsIG1heExpbmVzKSwgc291cmNlTGluZSArIDEgKyBsaW5lc09mQ29udGV4dClcbiAgICAgICAgLm1hcChmdW5jdGlvbiAobGluZSkgeyByZXR1cm4gc25pcExpbmUobGluZSwgMCk7IH0pO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bWlzYy5qcy5tYXAiLCJpbXBvcnQgKiBhcyB0c2xpYl8xIGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgaXNFbGVtZW50LCBpc0Vycm9yLCBpc0V2ZW50LCBpc0luc3RhbmNlT2YsIGlzUGxhaW5PYmplY3QsIGlzUHJpbWl0aXZlLCBpc1N5bnRoZXRpY0V2ZW50IH0gZnJvbSAnLi9pcyc7XG5pbXBvcnQgeyBNZW1vIH0gZnJvbSAnLi9tZW1vJztcbmltcG9ydCB7IGdldEZ1bmN0aW9uTmFtZSwgaHRtbFRyZWVBc1N0cmluZyB9IGZyb20gJy4vbWlzYyc7XG5pbXBvcnQgeyB0cnVuY2F0ZSB9IGZyb20gJy4vc3RyaW5nJztcbi8qKlxuICogV3JhcCBhIGdpdmVuIG9iamVjdCBtZXRob2Qgd2l0aCBhIGhpZ2hlci1vcmRlciBmdW5jdGlvblxuICpcbiAqIEBwYXJhbSBzb3VyY2UgQW4gb2JqZWN0IHRoYXQgY29udGFpbnMgYSBtZXRob2QgdG8gYmUgd3JhcHBlZC5cbiAqIEBwYXJhbSBuYW1lIEEgbmFtZSBvZiBtZXRob2QgdG8gYmUgd3JhcHBlZC5cbiAqIEBwYXJhbSByZXBsYWNlbWVudCBBIGZ1bmN0aW9uIHRoYXQgc2hvdWxkIGJlIHVzZWQgdG8gd3JhcCBhIGdpdmVuIG1ldGhvZC5cbiAqIEByZXR1cm5zIHZvaWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbGwoc291cmNlLCBuYW1lLCByZXBsYWNlbWVudCkge1xuICAgIGlmICghKG5hbWUgaW4gc291cmNlKSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciBvcmlnaW5hbCA9IHNvdXJjZVtuYW1lXTtcbiAgICB2YXIgd3JhcHBlZCA9IHJlcGxhY2VtZW50KG9yaWdpbmFsKTtcbiAgICAvLyBNYWtlIHN1cmUgaXQncyBhIGZ1bmN0aW9uIGZpcnN0LCBhcyB3ZSBuZWVkIHRvIGF0dGFjaCBhbiBlbXB0eSBwcm90b3R5cGUgZm9yIGBkZWZpbmVQcm9wZXJ0aWVzYCB0byB3b3JrXG4gICAgLy8gb3RoZXJ3aXNlIGl0J2xsIHRocm93IFwiVHlwZUVycm9yOiBPYmplY3QuZGVmaW5lUHJvcGVydGllcyBjYWxsZWQgb24gbm9uLW9iamVjdFwiXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnN0cmljdC10eXBlLXByZWRpY2F0ZXNcbiAgICBpZiAodHlwZW9mIHdyYXBwZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHdyYXBwZWQucHJvdG90eXBlID0gd3JhcHBlZC5wcm90b3R5cGUgfHwge307XG4gICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh3cmFwcGVkLCB7XG4gICAgICAgICAgICAgICAgX19zZW50cnlfb3JpZ2luYWxfXzoge1xuICAgICAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG9yaWdpbmFsLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoX09vKSB7XG4gICAgICAgICAgICAvLyBUaGlzIGNhbiB0aHJvdyBpZiBtdWx0aXBsZSBmaWxsIGhhcHBlbnMgb24gYSBnbG9iYWwgb2JqZWN0IGxpa2UgWE1MSHR0cFJlcXVlc3RcbiAgICAgICAgICAgIC8vIEZpeGVzIGh0dHBzOi8vZ2l0aHViLmNvbS9nZXRzZW50cnkvc2VudHJ5LWphdmFzY3JpcHQvaXNzdWVzLzIwNDNcbiAgICAgICAgfVxuICAgIH1cbiAgICBzb3VyY2VbbmFtZV0gPSB3cmFwcGVkO1xufVxuLyoqXG4gKiBFbmNvZGVzIGdpdmVuIG9iamVjdCBpbnRvIHVybC1mcmllbmRseSBmb3JtYXRcbiAqXG4gKiBAcGFyYW0gb2JqZWN0IEFuIG9iamVjdCB0aGF0IGNvbnRhaW5zIHNlcmlhbGl6YWJsZSB2YWx1ZXNcbiAqIEByZXR1cm5zIHN0cmluZyBFbmNvZGVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cmxFbmNvZGUob2JqZWN0KSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKG9iamVjdClcbiAgICAgICAgLm1hcChcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tdW5zYWZlLWFueVxuICAgIGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChrZXkpICsgXCI9XCIgKyBlbmNvZGVVUklDb21wb25lbnQob2JqZWN0W2tleV0pOyB9KVxuICAgICAgICAuam9pbignJicpO1xufVxuLyoqXG4gKiBUcmFuc2Zvcm1zIGFueSBvYmplY3QgaW50byBhbiBvYmplY3QgbGl0ZXJhbCB3aXRoIGFsbCBpdCdzIGF0dHJpYnV0ZXNcbiAqIGF0dGFjaGVkIHRvIGl0LlxuICpcbiAqIEBwYXJhbSB2YWx1ZSBJbml0aWFsIHNvdXJjZSB0aGF0IHdlIGhhdmUgdG8gdHJhbnNmb3JtIGluIG9yZGVyIHRvIGJlIHVzYWJsZSBieSB0aGUgc2VyaWFsaXplclxuICovXG5mdW5jdGlvbiBnZXRXYWxrU291cmNlKHZhbHVlKSB7XG4gICAgaWYgKGlzRXJyb3IodmFsdWUpKSB7XG4gICAgICAgIHZhciBlcnJvciA9IHZhbHVlO1xuICAgICAgICB2YXIgZXJyID0ge1xuICAgICAgICAgICAgbWVzc2FnZTogZXJyb3IubWVzc2FnZSxcbiAgICAgICAgICAgIG5hbWU6IGVycm9yLm5hbWUsXG4gICAgICAgICAgICBzdGFjazogZXJyb3Iuc3RhY2ssXG4gICAgICAgIH07XG4gICAgICAgIGZvciAodmFyIGkgaW4gZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZXJyb3IsIGkpKSB7XG4gICAgICAgICAgICAgICAgZXJyW2ldID0gZXJyb3JbaV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVycjtcbiAgICB9XG4gICAgaWYgKGlzRXZlbnQodmFsdWUpKSB7XG4gICAgICAgIHZhciBldmVudF8xID0gdmFsdWU7XG4gICAgICAgIHZhciBzb3VyY2UgPSB7fTtcbiAgICAgICAgc291cmNlLnR5cGUgPSBldmVudF8xLnR5cGU7XG4gICAgICAgIC8vIEFjY2Vzc2luZyBldmVudC50YXJnZXQgY2FuIHRocm93IChzZWUgZ2V0c2VudHJ5L3JhdmVuLWpzIzgzOCwgIzc2OClcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHNvdXJjZS50YXJnZXQgPSBpc0VsZW1lbnQoZXZlbnRfMS50YXJnZXQpXG4gICAgICAgICAgICAgICAgPyBodG1sVHJlZUFzU3RyaW5nKGV2ZW50XzEudGFyZ2V0KVxuICAgICAgICAgICAgICAgIDogT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGV2ZW50XzEudGFyZ2V0KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoX29PKSB7XG4gICAgICAgICAgICBzb3VyY2UudGFyZ2V0ID0gJzx1bmtub3duPic7XG4gICAgICAgIH1cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHNvdXJjZS5jdXJyZW50VGFyZ2V0ID0gaXNFbGVtZW50KGV2ZW50XzEuY3VycmVudFRhcmdldClcbiAgICAgICAgICAgICAgICA/IGh0bWxUcmVlQXNTdHJpbmcoZXZlbnRfMS5jdXJyZW50VGFyZ2V0KVxuICAgICAgICAgICAgICAgIDogT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGV2ZW50XzEuY3VycmVudFRhcmdldCk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKF9vTykge1xuICAgICAgICAgICAgc291cmNlLmN1cnJlbnRUYXJnZXQgPSAnPHVua25vd24+JztcbiAgICAgICAgfVxuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6c3RyaWN0LXR5cGUtcHJlZGljYXRlc1xuICAgICAgICBpZiAodHlwZW9mIEN1c3RvbUV2ZW50ICE9PSAndW5kZWZpbmVkJyAmJiBpc0luc3RhbmNlT2YodmFsdWUsIEN1c3RvbUV2ZW50KSkge1xuICAgICAgICAgICAgc291cmNlLmRldGFpbCA9IGV2ZW50XzEuZGV0YWlsO1xuICAgICAgICB9XG4gICAgICAgIGZvciAodmFyIGkgaW4gZXZlbnRfMSkge1xuICAgICAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChldmVudF8xLCBpKSkge1xuICAgICAgICAgICAgICAgIHNvdXJjZVtpXSA9IGV2ZW50XzE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNvdXJjZTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xufVxuLyoqIENhbGN1bGF0ZXMgYnl0ZXMgc2l6ZSBvZiBpbnB1dCBzdHJpbmcgKi9cbmZ1bmN0aW9uIHV0ZjhMZW5ndGgodmFsdWUpIHtcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYml0d2lzZVxuICAgIHJldHVybiB+LWVuY29kZVVSSSh2YWx1ZSkuc3BsaXQoLyUuLnwuLykubGVuZ3RoO1xufVxuLyoqIENhbGN1bGF0ZXMgYnl0ZXMgc2l6ZSBvZiBpbnB1dCBvYmplY3QgKi9cbmZ1bmN0aW9uIGpzb25TaXplKHZhbHVlKSB7XG4gICAgcmV0dXJuIHV0ZjhMZW5ndGgoSlNPTi5zdHJpbmdpZnkodmFsdWUpKTtcbn1cbi8qKiBKU0RvYyAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZVRvU2l6ZShvYmplY3QsIFxuLy8gRGVmYXVsdCBOb2RlLmpzIFJFUEwgZGVwdGhcbmRlcHRoLCBcbi8vIDEwMGtCLCBhcyAyMDBrQiBpcyBtYXggcGF5bG9hZCBzaXplLCBzbyBoYWxmIHNvdW5kcyByZWFzb25hYmxlXG5tYXhTaXplKSB7XG4gICAgaWYgKGRlcHRoID09PSB2b2lkIDApIHsgZGVwdGggPSAzOyB9XG4gICAgaWYgKG1heFNpemUgPT09IHZvaWQgMCkgeyBtYXhTaXplID0gMTAwICogMTAyNDsgfVxuICAgIHZhciBzZXJpYWxpemVkID0gbm9ybWFsaXplKG9iamVjdCwgZGVwdGgpO1xuICAgIGlmIChqc29uU2l6ZShzZXJpYWxpemVkKSA+IG1heFNpemUpIHtcbiAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZVRvU2l6ZShvYmplY3QsIGRlcHRoIC0gMSwgbWF4U2l6ZSk7XG4gICAgfVxuICAgIHJldHVybiBzZXJpYWxpemVkO1xufVxuLyoqIFRyYW5zZm9ybXMgYW55IGlucHV0IHZhbHVlIGludG8gYSBzdHJpbmcgZm9ybSwgZWl0aGVyIHByaW1pdGl2ZSB2YWx1ZSBvciBhIHR5cGUgb2YgdGhlIGlucHV0ICovXG5mdW5jdGlvbiBzZXJpYWxpemVWYWx1ZSh2YWx1ZSkge1xuICAgIHZhciB0eXBlID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKTtcbiAgICAvLyBOb2RlLmpzIFJFUEwgbm90YXRpb25cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICAgIGlmICh0eXBlID09PSAnW29iamVjdCBPYmplY3RdJykge1xuICAgICAgICByZXR1cm4gJ1tPYmplY3RdJztcbiAgICB9XG4gICAgaWYgKHR5cGUgPT09ICdbb2JqZWN0IEFycmF5XScpIHtcbiAgICAgICAgcmV0dXJuICdbQXJyYXldJztcbiAgICB9XG4gICAgdmFyIG5vcm1hbGl6ZWQgPSBub3JtYWxpemVWYWx1ZSh2YWx1ZSk7XG4gICAgcmV0dXJuIGlzUHJpbWl0aXZlKG5vcm1hbGl6ZWQpID8gbm9ybWFsaXplZCA6IHR5cGU7XG59XG4vKipcbiAqIG5vcm1hbGl6ZVZhbHVlKClcbiAqXG4gKiBUYWtlcyB1bnNlcmlhbGl6YWJsZSBpbnB1dCBhbmQgbWFrZSBpdCBzZXJpYWxpemFibGUgZnJpZW5kbHlcbiAqXG4gKiAtIHRyYW5zbGF0ZXMgdW5kZWZpbmVkL05hTiB2YWx1ZXMgdG8gXCJbdW5kZWZpbmVkXVwiL1wiW05hTl1cIiByZXNwZWN0aXZlbHksXG4gKiAtIHNlcmlhbGl6ZXMgRXJyb3Igb2JqZWN0c1xuICogLSBmaWx0ZXIgZ2xvYmFsIG9iamVjdHNcbiAqL1xuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOmN5Y2xvbWF0aWMtY29tcGxleGl0eVxuZnVuY3Rpb24gbm9ybWFsaXplVmFsdWUodmFsdWUsIGtleSkge1xuICAgIGlmIChrZXkgPT09ICdkb21haW4nICYmIHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUuX2V2ZW50cykge1xuICAgICAgICByZXR1cm4gJ1tEb21haW5dJztcbiAgICB9XG4gICAgaWYgKGtleSA9PT0gJ2RvbWFpbkVtaXR0ZXInKSB7XG4gICAgICAgIHJldHVybiAnW0RvbWFpbkVtaXR0ZXJdJztcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBnbG9iYWwgIT09ICd1bmRlZmluZWQnICYmIHZhbHVlID09PSBnbG9iYWwpIHtcbiAgICAgICAgcmV0dXJuICdbR2xvYmFsXSc7XG4gICAgfVxuICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB2YWx1ZSA9PT0gd2luZG93KSB7XG4gICAgICAgIHJldHVybiAnW1dpbmRvd10nO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJyAmJiB2YWx1ZSA9PT0gZG9jdW1lbnQpIHtcbiAgICAgICAgcmV0dXJuICdbRG9jdW1lbnRdJztcbiAgICB9XG4gICAgLy8gUmVhY3QncyBTeW50aGV0aWNFdmVudCB0aGluZ3lcbiAgICBpZiAoaXNTeW50aGV0aWNFdmVudCh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuICdbU3ludGhldGljRXZlbnRdJztcbiAgICB9XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLXRhdXRvbG9neS1leHByZXNzaW9uXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiYgdmFsdWUgIT09IHZhbHVlKSB7XG4gICAgICAgIHJldHVybiAnW05hTl0nO1xuICAgIH1cbiAgICBpZiAodmFsdWUgPT09IHZvaWQgMCkge1xuICAgICAgICByZXR1cm4gJ1t1bmRlZmluZWRdJztcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gXCJbRnVuY3Rpb246IFwiICsgZ2V0RnVuY3Rpb25OYW1lKHZhbHVlKSArIFwiXVwiO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG59XG4vKipcbiAqIFdhbGtzIGFuIG9iamVjdCB0byBwZXJmb3JtIGEgbm9ybWFsaXphdGlvbiBvbiBpdFxuICpcbiAqIEBwYXJhbSBrZXkgb2Ygb2JqZWN0IHRoYXQncyB3YWxrZWQgaW4gY3VycmVudCBpdGVyYXRpb25cbiAqIEBwYXJhbSB2YWx1ZSBvYmplY3QgdG8gYmUgd2Fsa2VkXG4gKiBAcGFyYW0gZGVwdGggT3B0aW9uYWwgbnVtYmVyIGluZGljYXRpbmcgaG93IGRlZXAgc2hvdWxkIHdhbGtpbmcgYmUgcGVyZm9ybWVkXG4gKiBAcGFyYW0gbWVtbyBPcHRpb25hbCBNZW1vIGNsYXNzIGhhbmRsaW5nIGRlY3ljbGluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gd2FsayhrZXksIHZhbHVlLCBkZXB0aCwgbWVtbykge1xuICAgIGlmIChkZXB0aCA9PT0gdm9pZCAwKSB7IGRlcHRoID0gK0luZmluaXR5OyB9XG4gICAgaWYgKG1lbW8gPT09IHZvaWQgMCkgeyBtZW1vID0gbmV3IE1lbW8oKTsgfVxuICAgIC8vIElmIHdlIHJlYWNoIHRoZSBtYXhpbXVtIGRlcHRoLCBzZXJpYWxpemUgd2hhdGV2ZXIgaGFzIGxlZnRcbiAgICBpZiAoZGVwdGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIHNlcmlhbGl6ZVZhbHVlKHZhbHVlKTtcbiAgICB9XG4gICAgLy8gSWYgdmFsdWUgaW1wbGVtZW50cyBgdG9KU09OYCBtZXRob2QsIGNhbGwgaXQgYW5kIHJldHVybiBlYXJseVxuICAgIC8vIHRzbGludDpkaXNhYmxlOm5vLXVuc2FmZS1hbnlcbiAgICBpZiAodmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgdmFsdWUudG9KU09OID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZS50b0pTT04oKTtcbiAgICB9XG4gICAgLy8gdHNsaW50OmVuYWJsZTpuby11bnNhZmUtYW55XG4gICAgLy8gSWYgbm9ybWFsaXplZCB2YWx1ZSBpcyBhIHByaW1pdGl2ZSwgdGhlcmUgYXJlIG5vIGJyYW5jaGVzIGxlZnQgdG8gd2Fsaywgc28gd2UgY2FuIGp1c3QgYmFpbCBvdXQsIGFzIHRoZXJlcyBubyBwb2ludCBpbiBnb2luZyBkb3duIHRoYXQgYnJhbmNoIGFueSBmdXJ0aGVyXG4gICAgdmFyIG5vcm1hbGl6ZWQgPSBub3JtYWxpemVWYWx1ZSh2YWx1ZSwga2V5KTtcbiAgICBpZiAoaXNQcmltaXRpdmUobm9ybWFsaXplZCkpIHtcbiAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZWQ7XG4gICAgfVxuICAgIC8vIENyZWF0ZSBzb3VyY2UgdGhhdCB3ZSB3aWxsIHVzZSBmb3IgbmV4dCBpdHRlcmF0aW9ucywgZWl0aGVyIG9iamVjdGlmaWVkIGVycm9yIG9iamVjdCAoRXJyb3IgdHlwZSB3aXRoIGV4dHJhY3RlZCBrZXlzOnZhbHVlIHBhaXJzKSBvciB0aGUgaW5wdXQgaXRzZWxmXG4gICAgdmFyIHNvdXJjZSA9IGdldFdhbGtTb3VyY2UodmFsdWUpO1xuICAgIC8vIENyZWF0ZSBhbiBhY2N1bXVsYXRvciB0aGF0IHdpbGwgYWN0IGFzIGEgcGFyZW50IGZvciBhbGwgZnV0dXJlIGl0dGVyYXRpb25zIG9mIHRoYXQgYnJhbmNoXG4gICAgdmFyIGFjYyA9IEFycmF5LmlzQXJyYXkodmFsdWUpID8gW10gOiB7fTtcbiAgICAvLyBJZiB3ZSBhbHJlYWR5IHdhbGtlZCB0aGF0IGJyYW5jaCwgYmFpbCBvdXQsIGFzIGl0J3MgY2lyY3VsYXIgcmVmZXJlbmNlXG4gICAgaWYgKG1lbW8ubWVtb2l6ZSh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuICdbQ2lyY3VsYXIgfl0nO1xuICAgIH1cbiAgICAvLyBXYWxrIGFsbCBrZXlzIG9mIHRoZSBzb3VyY2VcbiAgICBmb3IgKHZhciBpbm5lcktleSBpbiBzb3VyY2UpIHtcbiAgICAgICAgLy8gQXZvaWQgaXRlcmF0aW5nIG92ZXIgZmllbGRzIGluIHRoZSBwcm90b3R5cGUgaWYgdGhleSd2ZSBzb21laG93IGJlZW4gZXhwb3NlZCB0byBlbnVtZXJhdGlvbi5cbiAgICAgICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBpbm5lcktleSkpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIC8vIFJlY3Vyc2l2ZWx5IHdhbGsgdGhyb3VnaCBhbGwgdGhlIGNoaWxkIG5vZGVzXG4gICAgICAgIGFjY1tpbm5lcktleV0gPSB3YWxrKGlubmVyS2V5LCBzb3VyY2VbaW5uZXJLZXldLCBkZXB0aCAtIDEsIG1lbW8pO1xuICAgIH1cbiAgICAvLyBPbmNlIHdhbGtlZCB0aHJvdWdoIGFsbCB0aGUgYnJhbmNoZXMsIHJlbW92ZSB0aGUgcGFyZW50IGZyb20gbWVtbyBzdG9yYWdlXG4gICAgbWVtby51bm1lbW9pemUodmFsdWUpO1xuICAgIC8vIFJldHVybiBhY2N1bXVsYXRlZCB2YWx1ZXNcbiAgICByZXR1cm4gYWNjO1xufVxuLyoqXG4gKiBub3JtYWxpemUoKVxuICpcbiAqIC0gQ3JlYXRlcyBhIGNvcHkgdG8gcHJldmVudCBvcmlnaW5hbCBpbnB1dCBtdXRhdGlvblxuICogLSBTa2lwIG5vbi1lbnVtZXJhYmxlcnNcbiAqIC0gQ2FsbHMgYHRvSlNPTmAgaWYgaW1wbGVtZW50ZWRcbiAqIC0gUmVtb3ZlcyBjaXJjdWxhciByZWZlcmVuY2VzXG4gKiAtIFRyYW5zbGF0ZXMgbm9uLXNlcmlhbGl6ZWFibGUgdmFsdWVzICh1bmRlZmluZWQvTmFOL0Z1bmN0aW9ucykgdG8gc2VyaWFsaXphYmxlIGZvcm1hdFxuICogLSBUcmFuc2xhdGVzIGtub3duIGdsb2JhbCBvYmplY3RzL0NsYXNzZXMgdG8gYSBzdHJpbmcgcmVwcmVzZW50YXRpb25zXG4gKiAtIFRha2VzIGNhcmUgb2YgRXJyb3Igb2JqZWN0cyBzZXJpYWxpemF0aW9uXG4gKiAtIE9wdGlvbmFsbHkgbGltaXQgZGVwdGggb2YgZmluYWwgb3V0cHV0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemUoaW5wdXQsIGRlcHRoKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLXVuc2FmZS1hbnlcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoaW5wdXQsIGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7IHJldHVybiB3YWxrKGtleSwgdmFsdWUsIGRlcHRoKTsgfSkpO1xuICAgIH1cbiAgICBjYXRjaCAoX29PKSB7XG4gICAgICAgIHJldHVybiAnKipub24tc2VyaWFsaXphYmxlKionO1xuICAgIH1cbn1cbi8qKlxuICogR2l2ZW4gYW55IGNhcHR1cmVkIGV4Y2VwdGlvbiwgZXh0cmFjdCBpdHMga2V5cyBhbmQgY3JlYXRlIGEgc29ydGVkXG4gKiBhbmQgdHJ1bmNhdGVkIGxpc3QgdGhhdCB3aWxsIGJlIHVzZWQgaW5zaWRlIHRoZSBldmVudCBtZXNzYWdlLlxuICogZWcuIGBOb24tZXJyb3IgZXhjZXB0aW9uIGNhcHR1cmVkIHdpdGgga2V5czogZm9vLCBiYXIsIGJhemBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RFeGNlcHRpb25LZXlzRm9yTWVzc2FnZShleGNlcHRpb24sIG1heExlbmd0aCkge1xuICAgIGlmIChtYXhMZW5ndGggPT09IHZvaWQgMCkgeyBtYXhMZW5ndGggPSA0MDsgfVxuICAgIC8vIHRzbGludDpkaXNhYmxlOnN0cmljdC10eXBlLXByZWRpY2F0ZXNcbiAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKGdldFdhbGtTb3VyY2UoZXhjZXB0aW9uKSk7XG4gICAga2V5cy5zb3J0KCk7XG4gICAgaWYgKCFrZXlzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gJ1tvYmplY3QgaGFzIG5vIGtleXNdJztcbiAgICB9XG4gICAgaWYgKGtleXNbMF0ubGVuZ3RoID49IG1heExlbmd0aCkge1xuICAgICAgICByZXR1cm4gdHJ1bmNhdGUoa2V5c1swXSwgbWF4TGVuZ3RoKTtcbiAgICB9XG4gICAgZm9yICh2YXIgaW5jbHVkZWRLZXlzID0ga2V5cy5sZW5ndGg7IGluY2x1ZGVkS2V5cyA+IDA7IGluY2x1ZGVkS2V5cy0tKSB7XG4gICAgICAgIHZhciBzZXJpYWxpemVkID0ga2V5cy5zbGljZSgwLCBpbmNsdWRlZEtleXMpLmpvaW4oJywgJyk7XG4gICAgICAgIGlmIChzZXJpYWxpemVkLmxlbmd0aCA+IG1heExlbmd0aCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGluY2x1ZGVkS2V5cyA9PT0ga2V5cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBzZXJpYWxpemVkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVuY2F0ZShzZXJpYWxpemVkLCBtYXhMZW5ndGgpO1xuICAgIH1cbiAgICByZXR1cm4gJyc7XG59XG4vKipcbiAqIEdpdmVuIGFueSBvYmplY3QsIHJldHVybiB0aGUgbmV3IG9iamVjdCB3aXRoIHJlbW92ZWQga2V5cyB0aGF0IHZhbHVlIHdhcyBgdW5kZWZpbmVkYC5cbiAqIFdvcmtzIHJlY3Vyc2l2ZWx5IG9uIG9iamVjdHMgYW5kIGFycmF5cy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRyb3BVbmRlZmluZWRLZXlzKHZhbCkge1xuICAgIHZhciBlXzEsIF9hO1xuICAgIGlmIChpc1BsYWluT2JqZWN0KHZhbCkpIHtcbiAgICAgICAgdmFyIG9iaiA9IHZhbDtcbiAgICAgICAgdmFyIHJ2ID0ge307XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBmb3IgKHZhciBfYiA9IHRzbGliXzEuX192YWx1ZXMoT2JqZWN0LmtleXMob2JqKSksIF9jID0gX2IubmV4dCgpOyAhX2MuZG9uZTsgX2MgPSBfYi5uZXh0KCkpIHtcbiAgICAgICAgICAgICAgICB2YXIga2V5ID0gX2MudmFsdWU7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBvYmpba2V5XSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgcnZba2V5XSA9IGRyb3BVbmRlZmluZWRLZXlzKG9ialtrZXldKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVfMV8xKSB7IGVfMSA9IHsgZXJyb3I6IGVfMV8xIH07IH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmIChfYyAmJiAhX2MuZG9uZSAmJiAoX2EgPSBfYi5yZXR1cm4pKSBfYS5jYWxsKF9iKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpbmFsbHkgeyBpZiAoZV8xKSB0aHJvdyBlXzEuZXJyb3I7IH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcnY7XG4gICAgfVxuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbCkpIHtcbiAgICAgICAgcmV0dXJuIHZhbC5tYXAoZHJvcFVuZGVmaW5lZEtleXMpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9b2JqZWN0LmpzLm1hcCIsIi8vIFNsaWdodGx5IG1vZGlmaWVkIChubyBJRTggc3VwcG9ydCwgRVM2KSBhbmQgdHJhbnNjcmliZWQgdG8gVHlwZVNjcmlwdFxuLy8gaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2NhbHZpbm1ldGNhbGYvcm9sbHVwLXBsdWdpbi1ub2RlLWJ1aWx0aW5zL21hc3Rlci9zcmMvZXM2L3BhdGguanNcbi8qKiBKU0RvYyAqL1xuZnVuY3Rpb24gbm9ybWFsaXplQXJyYXkocGFydHMsIGFsbG93QWJvdmVSb290KSB7XG4gICAgLy8gaWYgdGhlIHBhdGggdHJpZXMgdG8gZ28gYWJvdmUgdGhlIHJvb3QsIGB1cGAgZW5kcyB1cCA+IDBcbiAgICB2YXIgdXAgPSAwO1xuICAgIGZvciAodmFyIGkgPSBwYXJ0cy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICB2YXIgbGFzdCA9IHBhcnRzW2ldO1xuICAgICAgICBpZiAobGFzdCA9PT0gJy4nKSB7XG4gICAgICAgICAgICBwYXJ0cy5zcGxpY2UoaSwgMSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobGFzdCA9PT0gJy4uJykge1xuICAgICAgICAgICAgcGFydHMuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgdXArKztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh1cCkge1xuICAgICAgICAgICAgcGFydHMuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgdXAtLTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBpZiB0aGUgcGF0aCBpcyBhbGxvd2VkIHRvIGdvIGFib3ZlIHRoZSByb290LCByZXN0b3JlIGxlYWRpbmcgLi5zXG4gICAgaWYgKGFsbG93QWJvdmVSb290KSB7XG4gICAgICAgIGZvciAoOyB1cC0tOyB1cCkge1xuICAgICAgICAgICAgcGFydHMudW5zaGlmdCgnLi4nKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcGFydHM7XG59XG4vLyBTcGxpdCBhIGZpbGVuYW1lIGludG8gW3Jvb3QsIGRpciwgYmFzZW5hbWUsIGV4dF0sIHVuaXggdmVyc2lvblxuLy8gJ3Jvb3QnIGlzIGp1c3QgYSBzbGFzaCwgb3Igbm90aGluZy5cbnZhciBzcGxpdFBhdGhSZSA9IC9eKFxcLz98KShbXFxzXFxTXSo/KSgoPzpcXC57MSwyfXxbXlxcL10rP3wpKFxcLlteLlxcL10qfCkpKD86W1xcL10qKSQvO1xuLyoqIEpTRG9jICovXG5mdW5jdGlvbiBzcGxpdFBhdGgoZmlsZW5hbWUpIHtcbiAgICB2YXIgcGFydHMgPSBzcGxpdFBhdGhSZS5leGVjKGZpbGVuYW1lKTtcbiAgICByZXR1cm4gcGFydHMgPyBwYXJ0cy5zbGljZSgxKSA6IFtdO1xufVxuLy8gcGF0aC5yZXNvbHZlKFtmcm9tIC4uLl0sIHRvKVxuLy8gcG9zaXggdmVyc2lvblxuLyoqIEpTRG9jICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZSgpIHtcbiAgICB2YXIgYXJncyA9IFtdO1xuICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgIGFyZ3NbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgICB9XG4gICAgdmFyIHJlc29sdmVkUGF0aCA9ICcnO1xuICAgIHZhciByZXNvbHZlZEFic29sdXRlID0gZmFsc2U7XG4gICAgZm9yICh2YXIgaSA9IGFyZ3MubGVuZ3RoIC0gMTsgaSA+PSAtMSAmJiAhcmVzb2x2ZWRBYnNvbHV0ZTsgaS0tKSB7XG4gICAgICAgIHZhciBwYXRoID0gaSA+PSAwID8gYXJnc1tpXSA6ICcvJztcbiAgICAgICAgLy8gU2tpcCBlbXB0eSBlbnRyaWVzXG4gICAgICAgIGlmICghcGF0aCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgcmVzb2x2ZWRQYXRoID0gcGF0aCArIFwiL1wiICsgcmVzb2x2ZWRQYXRoO1xuICAgICAgICByZXNvbHZlZEFic29sdXRlID0gcGF0aC5jaGFyQXQoMCkgPT09ICcvJztcbiAgICB9XG4gICAgLy8gQXQgdGhpcyBwb2ludCB0aGUgcGF0aCBzaG91bGQgYmUgcmVzb2x2ZWQgdG8gYSBmdWxsIGFic29sdXRlIHBhdGgsIGJ1dFxuICAgIC8vIGhhbmRsZSByZWxhdGl2ZSBwYXRocyB0byBiZSBzYWZlIChtaWdodCBoYXBwZW4gd2hlbiBwcm9jZXNzLmN3ZCgpIGZhaWxzKVxuICAgIC8vIE5vcm1hbGl6ZSB0aGUgcGF0aFxuICAgIHJlc29sdmVkUGF0aCA9IG5vcm1hbGl6ZUFycmF5KHJlc29sdmVkUGF0aC5zcGxpdCgnLycpLmZpbHRlcihmdW5jdGlvbiAocCkgeyByZXR1cm4gISFwOyB9KSwgIXJlc29sdmVkQWJzb2x1dGUpLmpvaW4oJy8nKTtcbiAgICByZXR1cm4gKHJlc29sdmVkQWJzb2x1dGUgPyAnLycgOiAnJykgKyByZXNvbHZlZFBhdGggfHwgJy4nO1xufVxuLyoqIEpTRG9jICovXG5mdW5jdGlvbiB0cmltKGFycikge1xuICAgIHZhciBzdGFydCA9IDA7XG4gICAgZm9yICg7IHN0YXJ0IDwgYXJyLmxlbmd0aDsgc3RhcnQrKykge1xuICAgICAgICBpZiAoYXJyW3N0YXJ0XSAhPT0gJycpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICAgIHZhciBlbmQgPSBhcnIubGVuZ3RoIC0gMTtcbiAgICBmb3IgKDsgZW5kID49IDA7IGVuZC0tKSB7XG4gICAgICAgIGlmIChhcnJbZW5kXSAhPT0gJycpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChzdGFydCA+IGVuZCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIHJldHVybiBhcnIuc2xpY2Uoc3RhcnQsIGVuZCAtIHN0YXJ0ICsgMSk7XG59XG4vLyBwYXRoLnJlbGF0aXZlKGZyb20sIHRvKVxuLy8gcG9zaXggdmVyc2lvblxuLyoqIEpTRG9jICovXG5leHBvcnQgZnVuY3Rpb24gcmVsYXRpdmUoZnJvbSwgdG8pIHtcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZTpuby1wYXJhbWV0ZXItcmVhc3NpZ25tZW50XG4gICAgZnJvbSA9IHJlc29sdmUoZnJvbSkuc3Vic3RyKDEpO1xuICAgIHRvID0gcmVzb2x2ZSh0bykuc3Vic3RyKDEpO1xuICAgIHZhciBmcm9tUGFydHMgPSB0cmltKGZyb20uc3BsaXQoJy8nKSk7XG4gICAgdmFyIHRvUGFydHMgPSB0cmltKHRvLnNwbGl0KCcvJykpO1xuICAgIHZhciBsZW5ndGggPSBNYXRoLm1pbihmcm9tUGFydHMubGVuZ3RoLCB0b1BhcnRzLmxlbmd0aCk7XG4gICAgdmFyIHNhbWVQYXJ0c0xlbmd0aCA9IGxlbmd0aDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChmcm9tUGFydHNbaV0gIT09IHRvUGFydHNbaV0pIHtcbiAgICAgICAgICAgIHNhbWVQYXJ0c0xlbmd0aCA9IGk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICB2YXIgb3V0cHV0UGFydHMgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gc2FtZVBhcnRzTGVuZ3RoOyBpIDwgZnJvbVBhcnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIG91dHB1dFBhcnRzLnB1c2goJy4uJyk7XG4gICAgfVxuICAgIG91dHB1dFBhcnRzID0gb3V0cHV0UGFydHMuY29uY2F0KHRvUGFydHMuc2xpY2Uoc2FtZVBhcnRzTGVuZ3RoKSk7XG4gICAgcmV0dXJuIG91dHB1dFBhcnRzLmpvaW4oJy8nKTtcbn1cbi8vIHBhdGgubm9ybWFsaXplKHBhdGgpXG4vLyBwb3NpeCB2ZXJzaW9uXG4vKiogSlNEb2MgKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVQYXRoKHBhdGgpIHtcbiAgICB2YXIgaXNQYXRoQWJzb2x1dGUgPSBpc0Fic29sdXRlKHBhdGgpO1xuICAgIHZhciB0cmFpbGluZ1NsYXNoID0gcGF0aC5zdWJzdHIoLTEpID09PSAnLyc7XG4gICAgLy8gTm9ybWFsaXplIHRoZSBwYXRoXG4gICAgdmFyIG5vcm1hbGl6ZWRQYXRoID0gbm9ybWFsaXplQXJyYXkocGF0aC5zcGxpdCgnLycpLmZpbHRlcihmdW5jdGlvbiAocCkgeyByZXR1cm4gISFwOyB9KSwgIWlzUGF0aEFic29sdXRlKS5qb2luKCcvJyk7XG4gICAgaWYgKCFub3JtYWxpemVkUGF0aCAmJiAhaXNQYXRoQWJzb2x1dGUpIHtcbiAgICAgICAgbm9ybWFsaXplZFBhdGggPSAnLic7XG4gICAgfVxuICAgIGlmIChub3JtYWxpemVkUGF0aCAmJiB0cmFpbGluZ1NsYXNoKSB7XG4gICAgICAgIG5vcm1hbGl6ZWRQYXRoICs9ICcvJztcbiAgICB9XG4gICAgcmV0dXJuIChpc1BhdGhBYnNvbHV0ZSA/ICcvJyA6ICcnKSArIG5vcm1hbGl6ZWRQYXRoO1xufVxuLy8gcG9zaXggdmVyc2lvblxuLyoqIEpTRG9jICovXG5leHBvcnQgZnVuY3Rpb24gaXNBYnNvbHV0ZShwYXRoKSB7XG4gICAgcmV0dXJuIHBhdGguY2hhckF0KDApID09PSAnLyc7XG59XG4vLyBwb3NpeCB2ZXJzaW9uXG4vKiogSlNEb2MgKi9cbmV4cG9ydCBmdW5jdGlvbiBqb2luKCkge1xuICAgIHZhciBhcmdzID0gW107XG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgYXJnc1tfaV0gPSBhcmd1bWVudHNbX2ldO1xuICAgIH1cbiAgICByZXR1cm4gbm9ybWFsaXplUGF0aChhcmdzLmpvaW4oJy8nKSk7XG59XG4vKiogSlNEb2MgKi9cbmV4cG9ydCBmdW5jdGlvbiBkaXJuYW1lKHBhdGgpIHtcbiAgICB2YXIgcmVzdWx0ID0gc3BsaXRQYXRoKHBhdGgpO1xuICAgIHZhciByb290ID0gcmVzdWx0WzBdO1xuICAgIHZhciBkaXIgPSByZXN1bHRbMV07XG4gICAgaWYgKCFyb290ICYmICFkaXIpIHtcbiAgICAgICAgLy8gTm8gZGlybmFtZSB3aGF0c29ldmVyXG4gICAgICAgIHJldHVybiAnLic7XG4gICAgfVxuICAgIGlmIChkaXIpIHtcbiAgICAgICAgLy8gSXQgaGFzIGEgZGlybmFtZSwgc3RyaXAgdHJhaWxpbmcgc2xhc2hcbiAgICAgICAgZGlyID0gZGlyLnN1YnN0cigwLCBkaXIubGVuZ3RoIC0gMSk7XG4gICAgfVxuICAgIHJldHVybiByb290ICsgZGlyO1xufVxuLyoqIEpTRG9jICovXG5leHBvcnQgZnVuY3Rpb24gYmFzZW5hbWUocGF0aCwgZXh0KSB7XG4gICAgdmFyIGYgPSBzcGxpdFBhdGgocGF0aClbMl07XG4gICAgaWYgKGV4dCAmJiBmLnN1YnN0cihleHQubGVuZ3RoICogLTEpID09PSBleHQpIHtcbiAgICAgICAgZiA9IGYuc3Vic3RyKDAsIGYubGVuZ3RoIC0gZXh0Lmxlbmd0aCk7XG4gICAgfVxuICAgIHJldHVybiBmO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cGF0aC5qcy5tYXAiLCJleHBvcnQgdmFyIHNldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8ICh7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ID8gc2V0UHJvdG9PZiA6IG1peGluUHJvcGVydGllcyk7IC8vIHRzbGludDpkaXNhYmxlLWxpbmU6bm8tdW5ib3VuZC1tZXRob2Rcbi8qKlxuICogc2V0UHJvdG90eXBlT2YgcG9seWZpbGwgdXNpbmcgX19wcm90b19fXG4gKi9cbmZ1bmN0aW9uIHNldFByb3RvT2Yob2JqLCBwcm90bykge1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBvYmouX19wcm90b19fID0gcHJvdG87XG4gICAgcmV0dXJuIG9iajtcbn1cbi8qKlxuICogc2V0UHJvdG90eXBlT2YgcG9seWZpbGwgdXNpbmcgbWl4aW5cbiAqL1xuZnVuY3Rpb24gbWl4aW5Qcm9wZXJ0aWVzKG9iaiwgcHJvdG8pIHtcbiAgICBmb3IgKHZhciBwcm9wIGluIHByb3RvKSB7XG4gICAgICAgIGlmICghb2JqLmhhc093blByb3BlcnR5KHByb3ApKSB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBvYmpbcHJvcF0gPSBwcm90b1twcm9wXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gb2JqO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cG9seWZpbGwuanMubWFwIiwiaW1wb3J0IHsgU2VudHJ5RXJyb3IgfSBmcm9tICcuL2Vycm9yJztcbmltcG9ydCB7IFN5bmNQcm9taXNlIH0gZnJvbSAnLi9zeW5jcHJvbWlzZSc7XG4vKiogQSBzaW1wbGUgcXVldWUgdGhhdCBob2xkcyBwcm9taXNlcy4gKi9cbnZhciBQcm9taXNlQnVmZmVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFByb21pc2VCdWZmZXIoX2xpbWl0KSB7XG4gICAgICAgIHRoaXMuX2xpbWl0ID0gX2xpbWl0O1xuICAgICAgICAvKiogSW50ZXJuYWwgc2V0IG9mIHF1ZXVlZCBQcm9taXNlcyAqL1xuICAgICAgICB0aGlzLl9idWZmZXIgPSBbXTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2F5cyBpZiB0aGUgYnVmZmVyIGlzIHJlYWR5IHRvIHRha2UgbW9yZSByZXF1ZXN0c1xuICAgICAqL1xuICAgIFByb21pc2VCdWZmZXIucHJvdG90eXBlLmlzUmVhZHkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9saW1pdCA9PT0gdW5kZWZpbmVkIHx8IHRoaXMubGVuZ3RoKCkgPCB0aGlzLl9saW1pdDtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEFkZCBhIHByb21pc2UgdG8gdGhlIHF1ZXVlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHRhc2sgQ2FuIGJlIGFueSBQcm9taXNlTGlrZTxUPlxuICAgICAqIEByZXR1cm5zIFRoZSBvcmlnaW5hbCBwcm9taXNlLlxuICAgICAqL1xuICAgIFByb21pc2VCdWZmZXIucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uICh0YXNrKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIGlmICghdGhpcy5pc1JlYWR5KCkpIHtcbiAgICAgICAgICAgIHJldHVybiBTeW5jUHJvbWlzZS5yZWplY3QobmV3IFNlbnRyeUVycm9yKCdOb3QgYWRkaW5nIFByb21pc2UgZHVlIHRvIGJ1ZmZlciBsaW1pdCByZWFjaGVkLicpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fYnVmZmVyLmluZGV4T2YodGFzaykgPT09IC0xKSB7XG4gICAgICAgICAgICB0aGlzLl9idWZmZXIucHVzaCh0YXNrKTtcbiAgICAgICAgfVxuICAgICAgICB0YXNrXG4gICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoKSB7IHJldHVybiBfdGhpcy5yZW1vdmUodGFzayk7IH0pXG4gICAgICAgICAgICAudGhlbihudWxsLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gX3RoaXMucmVtb3ZlKHRhc2spLnRoZW4obnVsbCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIC8vIFdlIGhhdmUgdG8gYWRkIHRoaXMgY2F0Y2ggaGVyZSBvdGhlcndpc2Ugd2UgaGF2ZSBhbiB1bmhhbmRsZWRQcm9taXNlUmVqZWN0aW9uXG4gICAgICAgICAgICAgICAgLy8gYmVjYXVzZSBpdCdzIGEgbmV3IFByb21pc2UgY2hhaW4uXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0YXNrO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmVtb3ZlIGEgcHJvbWlzZSB0byB0aGUgcXVldWUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdGFzayBDYW4gYmUgYW55IFByb21pc2VMaWtlPFQ+XG4gICAgICogQHJldHVybnMgUmVtb3ZlZCBwcm9taXNlLlxuICAgICAqL1xuICAgIFByb21pc2VCdWZmZXIucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uICh0YXNrKSB7XG4gICAgICAgIHZhciByZW1vdmVkVGFzayA9IHRoaXMuX2J1ZmZlci5zcGxpY2UodGhpcy5fYnVmZmVyLmluZGV4T2YodGFzayksIDEpWzBdO1xuICAgICAgICByZXR1cm4gcmVtb3ZlZFRhc2s7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIG51bWJlciBvZiB1bnJlc29sdmVkIHByb21pc2VzIGluIHRoZSBxdWV1ZS5cbiAgICAgKi9cbiAgICBQcm9taXNlQnVmZmVyLnByb3RvdHlwZS5sZW5ndGggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9idWZmZXIubGVuZ3RoO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogVGhpcyB3aWxsIGRyYWluIHRoZSB3aG9sZSBxdWV1ZSwgcmV0dXJucyB0cnVlIGlmIHF1ZXVlIGlzIGVtcHR5IG9yIGRyYWluZWQuXG4gICAgICogSWYgdGltZW91dCBpcyBwcm92aWRlZCBhbmQgdGhlIHF1ZXVlIHRha2VzIGxvbmdlciB0byBkcmFpbiwgdGhlIHByb21pc2Ugc3RpbGwgcmVzb2x2ZXMgYnV0IHdpdGggZmFsc2UuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdGltZW91dCBOdW1iZXIgaW4gbXMgdG8gd2FpdCB1bnRpbCBpdCByZXNvbHZlcyB3aXRoIGZhbHNlLlxuICAgICAqL1xuICAgIFByb21pc2VCdWZmZXIucHJvdG90eXBlLmRyYWluID0gZnVuY3Rpb24gKHRpbWVvdXQpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgcmV0dXJuIG5ldyBTeW5jUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgICAgICAgICAgdmFyIGNhcHR1cmVkU2V0VGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmICh0aW1lb3V0ICYmIHRpbWVvdXQgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIHRpbWVvdXQpO1xuICAgICAgICAgICAgU3luY1Byb21pc2UuYWxsKF90aGlzLl9idWZmZXIpXG4gICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChjYXB0dXJlZFNldFRpbWVvdXQpO1xuICAgICAgICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC50aGVuKG51bGwsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgcmV0dXJuIFByb21pc2VCdWZmZXI7XG59KCkpO1xuZXhwb3J0IHsgUHJvbWlzZUJ1ZmZlciB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cHJvbWlzZWJ1ZmZlci5qcy5tYXAiLCJpbXBvcnQgeyBpc1JlZ0V4cCwgaXNTdHJpbmcgfSBmcm9tICcuL2lzJztcbi8qKlxuICogVHJ1bmNhdGVzIGdpdmVuIHN0cmluZyB0byB0aGUgbWF4aW11bSBjaGFyYWN0ZXJzIGNvdW50XG4gKlxuICogQHBhcmFtIHN0ciBBbiBvYmplY3QgdGhhdCBjb250YWlucyBzZXJpYWxpemFibGUgdmFsdWVzXG4gKiBAcGFyYW0gbWF4IE1heGltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gdHJ1bmNhdGVkIHN0cmluZ1xuICogQHJldHVybnMgc3RyaW5nIEVuY29kZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRydW5jYXRlKHN0ciwgbWF4KSB7XG4gICAgaWYgKG1heCA9PT0gdm9pZCAwKSB7IG1heCA9IDA7IH1cbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6c3RyaWN0LXR5cGUtcHJlZGljYXRlc1xuICAgIGlmICh0eXBlb2Ygc3RyICE9PSAnc3RyaW5nJyB8fCBtYXggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIHN0cjtcbiAgICB9XG4gICAgcmV0dXJuIHN0ci5sZW5ndGggPD0gbWF4ID8gc3RyIDogc3RyLnN1YnN0cigwLCBtYXgpICsgXCIuLi5cIjtcbn1cbi8qKlxuICogVGhpcyBpcyBiYXNpY2FsbHkganVzdCBgdHJpbV9saW5lYCBmcm9tXG4gKiBodHRwczovL2dpdGh1Yi5jb20vZ2V0c2VudHJ5L3NlbnRyeS9ibG9iL21hc3Rlci9zcmMvc2VudHJ5L2xhbmcvamF2YXNjcmlwdC9wcm9jZXNzb3IucHkjTDY3XG4gKlxuICogQHBhcmFtIHN0ciBBbiBvYmplY3QgdGhhdCBjb250YWlucyBzZXJpYWxpemFibGUgdmFsdWVzXG4gKiBAcGFyYW0gbWF4IE1heGltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gdHJ1bmNhdGVkIHN0cmluZ1xuICogQHJldHVybnMgc3RyaW5nIEVuY29kZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNuaXBMaW5lKGxpbmUsIGNvbG5vKSB7XG4gICAgdmFyIG5ld0xpbmUgPSBsaW5lO1xuICAgIHZhciBsbCA9IG5ld0xpbmUubGVuZ3RoO1xuICAgIGlmIChsbCA8PSAxNTApIHtcbiAgICAgICAgcmV0dXJuIG5ld0xpbmU7XG4gICAgfVxuICAgIGlmIChjb2xubyA+IGxsKSB7XG4gICAgICAgIGNvbG5vID0gbGw7IC8vIHRzbGludDpkaXNhYmxlLWxpbmU6bm8tcGFyYW1ldGVyLXJlYXNzaWdubWVudFxuICAgIH1cbiAgICB2YXIgc3RhcnQgPSBNYXRoLm1heChjb2xubyAtIDYwLCAwKTtcbiAgICBpZiAoc3RhcnQgPCA1KSB7XG4gICAgICAgIHN0YXJ0ID0gMDtcbiAgICB9XG4gICAgdmFyIGVuZCA9IE1hdGgubWluKHN0YXJ0ICsgMTQwLCBsbCk7XG4gICAgaWYgKGVuZCA+IGxsIC0gNSkge1xuICAgICAgICBlbmQgPSBsbDtcbiAgICB9XG4gICAgaWYgKGVuZCA9PT0gbGwpIHtcbiAgICAgICAgc3RhcnQgPSBNYXRoLm1heChlbmQgLSAxNDAsIDApO1xuICAgIH1cbiAgICBuZXdMaW5lID0gbmV3TGluZS5zbGljZShzdGFydCwgZW5kKTtcbiAgICBpZiAoc3RhcnQgPiAwKSB7XG4gICAgICAgIG5ld0xpbmUgPSBcIid7c25pcH0gXCIgKyBuZXdMaW5lO1xuICAgIH1cbiAgICBpZiAoZW5kIDwgbGwpIHtcbiAgICAgICAgbmV3TGluZSArPSAnIHtzbmlwfSc7XG4gICAgfVxuICAgIHJldHVybiBuZXdMaW5lO1xufVxuLyoqXG4gKiBKb2luIHZhbHVlcyBpbiBhcnJheVxuICogQHBhcmFtIGlucHV0IGFycmF5IG9mIHZhbHVlcyB0byBiZSBqb2luZWQgdG9nZXRoZXJcbiAqIEBwYXJhbSBkZWxpbWl0ZXIgc3RyaW5nIHRvIGJlIHBsYWNlZCBpbi1iZXR3ZWVuIHZhbHVlc1xuICogQHJldHVybnMgSm9pbmVkIHZhbHVlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gc2FmZUpvaW4oaW5wdXQsIGRlbGltaXRlcikge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShpbnB1dCkpIHtcbiAgICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICB2YXIgb3V0cHV0ID0gW107XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnByZWZlci1mb3Itb2ZcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGlucHV0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IGlucHV0W2ldO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgb3V0cHV0LnB1c2goU3RyaW5nKHZhbHVlKSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIG91dHB1dC5wdXNoKCdbdmFsdWUgY2Fubm90IGJlIHNlcmlhbGl6ZWRdJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG91dHB1dC5qb2luKGRlbGltaXRlcik7XG59XG4vKipcbiAqIENoZWNrcyBpZiB0aGUgdmFsdWUgbWF0Y2hlcyBhIHJlZ2V4IG9yIGluY2x1ZGVzIHRoZSBzdHJpbmdcbiAqIEBwYXJhbSB2YWx1ZSBUaGUgc3RyaW5nIHZhbHVlIHRvIGJlIGNoZWNrZWQgYWdhaW5zdFxuICogQHBhcmFtIHBhdHRlcm4gRWl0aGVyIGEgcmVnZXggb3IgYSBzdHJpbmcgdGhhdCBtdXN0IGJlIGNvbnRhaW5lZCBpbiB2YWx1ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNNYXRjaGluZ1BhdHRlcm4odmFsdWUsIHBhdHRlcm4pIHtcbiAgICBpZiAoIWlzU3RyaW5nKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChpc1JlZ0V4cChwYXR0ZXJuKSkge1xuICAgICAgICByZXR1cm4gcGF0dGVybi50ZXN0KHZhbHVlKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBwYXR0ZXJuID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gdmFsdWUuaW5kZXhPZihwYXR0ZXJuKSAhPT0gLTE7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXN0cmluZy5qcy5tYXAiLCJpbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuL2xvZ2dlcic7XG5pbXBvcnQgeyBnZXRHbG9iYWxPYmplY3QgfSBmcm9tICcuL21pc2MnO1xuLyoqXG4gKiBUZWxscyB3aGV0aGVyIGN1cnJlbnQgZW52aXJvbm1lbnQgc3VwcG9ydHMgRXJyb3JFdmVudCBvYmplY3RzXG4gKiB7QGxpbmsgc3VwcG9ydHNFcnJvckV2ZW50fS5cbiAqXG4gKiBAcmV0dXJucyBBbnN3ZXIgdG8gdGhlIGdpdmVuIHF1ZXN0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc3VwcG9ydHNFcnJvckV2ZW50KCkge1xuICAgIHRyeSB7XG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlOm5vLXVudXNlZC1leHByZXNzaW9uXG4gICAgICAgIG5ldyBFcnJvckV2ZW50KCcnKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG4vKipcbiAqIFRlbGxzIHdoZXRoZXIgY3VycmVudCBlbnZpcm9ubWVudCBzdXBwb3J0cyBET01FcnJvciBvYmplY3RzXG4gKiB7QGxpbmsgc3VwcG9ydHNET01FcnJvcn0uXG4gKlxuICogQHJldHVybnMgQW5zd2VyIHRvIHRoZSBnaXZlbiBxdWVzdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN1cHBvcnRzRE9NRXJyb3IoKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gSXQgcmVhbGx5IG5lZWRzIDEgYXJndW1lbnQsIG5vdCAwLlxuICAgICAgICAvLyBDaHJvbWU6IFZNODk6MSBVbmNhdWdodCBUeXBlRXJyb3I6IEZhaWxlZCB0byBjb25zdHJ1Y3QgJ0RPTUVycm9yJzpcbiAgICAgICAgLy8gMSBhcmd1bWVudCByZXF1aXJlZCwgYnV0IG9ubHkgMCBwcmVzZW50LlxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlOm5vLXVudXNlZC1leHByZXNzaW9uXG4gICAgICAgIG5ldyBET01FcnJvcignJyk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuLyoqXG4gKiBUZWxscyB3aGV0aGVyIGN1cnJlbnQgZW52aXJvbm1lbnQgc3VwcG9ydHMgRE9NRXhjZXB0aW9uIG9iamVjdHNcbiAqIHtAbGluayBzdXBwb3J0c0RPTUV4Y2VwdGlvbn0uXG4gKlxuICogQHJldHVybnMgQW5zd2VyIHRvIHRoZSBnaXZlbiBxdWVzdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN1cHBvcnRzRE9NRXhjZXB0aW9uKCkge1xuICAgIHRyeSB7XG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlOm5vLXVudXNlZC1leHByZXNzaW9uXG4gICAgICAgIG5ldyBET01FeGNlcHRpb24oJycpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn1cbi8qKlxuICogVGVsbHMgd2hldGhlciBjdXJyZW50IGVudmlyb25tZW50IHN1cHBvcnRzIEZldGNoIEFQSVxuICoge0BsaW5rIHN1cHBvcnRzRmV0Y2h9LlxuICpcbiAqIEByZXR1cm5zIEFuc3dlciB0byB0aGUgZ2l2ZW4gcXVlc3Rpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdXBwb3J0c0ZldGNoKCkge1xuICAgIGlmICghKCdmZXRjaCcgaW4gZ2V0R2xvYmFsT2JqZWN0KCkpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLXVudXNlZC1leHByZXNzaW9uXG4gICAgICAgIG5ldyBIZWFkZXJzKCk7XG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby11bnVzZWQtZXhwcmVzc2lvblxuICAgICAgICBuZXcgUmVxdWVzdCgnJyk7XG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby11bnVzZWQtZXhwcmVzc2lvblxuICAgICAgICBuZXcgUmVzcG9uc2UoKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG4vKipcbiAqIGlzTmF0aXZlRmV0Y2ggY2hlY2tzIGlmIHRoZSBnaXZlbiBmdW5jdGlvbiBpcyBhIG5hdGl2ZSBpbXBsZW1lbnRhdGlvbiBvZiBmZXRjaCgpXG4gKi9cbmZ1bmN0aW9uIGlzTmF0aXZlRmV0Y2goZnVuYykge1xuICAgIHJldHVybiBmdW5jICYmIC9eZnVuY3Rpb24gZmV0Y2hcXChcXClcXHMrXFx7XFxzK1xcW25hdGl2ZSBjb2RlXFxdXFxzK1xcfSQvLnRlc3QoZnVuYy50b1N0cmluZygpKTtcbn1cbi8qKlxuICogVGVsbHMgd2hldGhlciBjdXJyZW50IGVudmlyb25tZW50IHN1cHBvcnRzIEZldGNoIEFQSSBuYXRpdmVseVxuICoge0BsaW5rIHN1cHBvcnRzTmF0aXZlRmV0Y2h9LlxuICpcbiAqIEByZXR1cm5zIHRydWUgaWYgYHdpbmRvdy5mZXRjaGAgaXMgbmF0aXZlbHkgaW1wbGVtZW50ZWQsIGZhbHNlIG90aGVyd2lzZVxuICovXG5leHBvcnQgZnVuY3Rpb24gc3VwcG9ydHNOYXRpdmVGZXRjaCgpIHtcbiAgICBpZiAoIXN1cHBvcnRzRmV0Y2goKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHZhciBnbG9iYWwgPSBnZXRHbG9iYWxPYmplY3QoKTtcbiAgICAvLyBGYXN0IHBhdGggdG8gYXZvaWQgRE9NIEkvT1xuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby11bmJvdW5kLW1ldGhvZFxuICAgIGlmIChpc05hdGl2ZUZldGNoKGdsb2JhbC5mZXRjaCkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIC8vIHdpbmRvdy5mZXRjaCBpcyBpbXBsZW1lbnRlZCwgYnV0IGlzIHBvbHlmaWxsZWQgb3IgYWxyZWFkeSB3cmFwcGVkIChlLmc6IGJ5IGEgY2hyb21lIGV4dGVuc2lvbilcbiAgICAvLyBzbyBjcmVhdGUgYSBcInB1cmVcIiBpZnJhbWUgdG8gc2VlIGlmIHRoYXQgaGFzIG5hdGl2ZSBmZXRjaFxuICAgIHZhciByZXN1bHQgPSBmYWxzZTtcbiAgICB2YXIgZG9jID0gZ2xvYmFsLmRvY3VtZW50O1xuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby11bmJvdW5kLW1ldGhvZCBkZXByZWNhdGlvblxuICAgIGlmIChkb2MgJiYgdHlwZW9mIGRvYy5jcmVhdGVFbGVtZW50ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHZhciBzYW5kYm94ID0gZG9jLmNyZWF0ZUVsZW1lbnQoJ2lmcmFtZScpO1xuICAgICAgICAgICAgc2FuZGJveC5oaWRkZW4gPSB0cnVlO1xuICAgICAgICAgICAgZG9jLmhlYWQuYXBwZW5kQ2hpbGQoc2FuZGJveCk7XG4gICAgICAgICAgICBpZiAoc2FuZGJveC5jb250ZW50V2luZG93ICYmIHNhbmRib3guY29udGVudFdpbmRvdy5mZXRjaCkge1xuICAgICAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby11bmJvdW5kLW1ldGhvZFxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGlzTmF0aXZlRmV0Y2goc2FuZGJveC5jb250ZW50V2luZG93LmZldGNoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRvYy5oZWFkLnJlbW92ZUNoaWxkKHNhbmRib3gpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGxvZ2dlci53YXJuKCdDb3VsZCBub3QgY3JlYXRlIHNhbmRib3ggaWZyYW1lIGZvciBwdXJlIGZldGNoIGNoZWNrLCBiYWlsaW5nIHRvIHdpbmRvdy5mZXRjaDogJywgZXJyKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuLyoqXG4gKiBUZWxscyB3aGV0aGVyIGN1cnJlbnQgZW52aXJvbm1lbnQgc3VwcG9ydHMgUmVwb3J0aW5nT2JzZXJ2ZXIgQVBJXG4gKiB7QGxpbmsgc3VwcG9ydHNSZXBvcnRpbmdPYnNlcnZlcn0uXG4gKlxuICogQHJldHVybnMgQW5zd2VyIHRvIHRoZSBnaXZlbiBxdWVzdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN1cHBvcnRzUmVwb3J0aW5nT2JzZXJ2ZXIoKSB7XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby11bnNhZmUtYW55XG4gICAgcmV0dXJuICdSZXBvcnRpbmdPYnNlcnZlcicgaW4gZ2V0R2xvYmFsT2JqZWN0KCk7XG59XG4vKipcbiAqIFRlbGxzIHdoZXRoZXIgY3VycmVudCBlbnZpcm9ubWVudCBzdXBwb3J0cyBSZWZlcnJlciBQb2xpY3kgQVBJXG4gKiB7QGxpbmsgc3VwcG9ydHNSZWZlcnJlclBvbGljeX0uXG4gKlxuICogQHJldHVybnMgQW5zd2VyIHRvIHRoZSBnaXZlbiBxdWVzdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN1cHBvcnRzUmVmZXJyZXJQb2xpY3koKSB7XG4gICAgLy8gRGVzcGl0ZSBhbGwgc3RhcnMgaW4gdGhlIHNreSBzYXlpbmcgdGhhdCBFZGdlIHN1cHBvcnRzIG9sZCBkcmFmdCBzeW50YXgsIGFrYSAnbmV2ZXInLCAnYWx3YXlzJywgJ29yaWdpbicgYW5kICdkZWZhdWx0XG4gICAgLy8gaHR0cHM6Ly9jYW5pdXNlLmNvbS8jZmVhdD1yZWZlcnJlci1wb2xpY3lcbiAgICAvLyBJdCBkb2Vzbid0LiBBbmQgaXQgdGhyb3cgZXhjZXB0aW9uIGluc3RlYWQgb2YgaWdub3JpbmcgdGhpcyBwYXJhbWV0ZXIuLi5cbiAgICAvLyBSRUY6IGh0dHBzOi8vZ2l0aHViLmNvbS9nZXRzZW50cnkvcmF2ZW4tanMvaXNzdWVzLzEyMzNcbiAgICBpZiAoIXN1cHBvcnRzRmV0Y2goKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlOm5vLXVudXNlZC1leHByZXNzaW9uXG4gICAgICAgIG5ldyBSZXF1ZXN0KCdfJywge1xuICAgICAgICAgICAgcmVmZXJyZXJQb2xpY3k6ICdvcmlnaW4nLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG4vKipcbiAqIFRlbGxzIHdoZXRoZXIgY3VycmVudCBlbnZpcm9ubWVudCBzdXBwb3J0cyBIaXN0b3J5IEFQSVxuICoge0BsaW5rIHN1cHBvcnRzSGlzdG9yeX0uXG4gKlxuICogQHJldHVybnMgQW5zd2VyIHRvIHRoZSBnaXZlbiBxdWVzdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN1cHBvcnRzSGlzdG9yeSgpIHtcbiAgICAvLyBOT1RFOiBpbiBDaHJvbWUgQXBwIGVudmlyb25tZW50LCB0b3VjaGluZyBoaXN0b3J5LnB1c2hTdGF0ZSwgKmV2ZW4gaW5zaWRlXG4gICAgLy8gICAgICAgYSB0cnkvY2F0Y2ggYmxvY2sqLCB3aWxsIGNhdXNlIENocm9tZSB0byBvdXRwdXQgYW4gZXJyb3IgdG8gY29uc29sZS5lcnJvclxuICAgIC8vIGJvcnJvd2VkIGZyb206IGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIuanMvcHVsbC8xMzk0NS9maWxlc1xuICAgIHZhciBnbG9iYWwgPSBnZXRHbG9iYWxPYmplY3QoKTtcbiAgICB2YXIgY2hyb21lID0gZ2xvYmFsLmNocm9tZTtcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tdW5zYWZlLWFueVxuICAgIHZhciBpc0Nocm9tZVBhY2thZ2VkQXBwID0gY2hyb21lICYmIGNocm9tZS5hcHAgJiYgY2hyb21lLmFwcC5ydW50aW1lO1xuICAgIHZhciBoYXNIaXN0b3J5QXBpID0gJ2hpc3RvcnknIGluIGdsb2JhbCAmJiAhIWdsb2JhbC5oaXN0b3J5LnB1c2hTdGF0ZSAmJiAhIWdsb2JhbC5oaXN0b3J5LnJlcGxhY2VTdGF0ZTtcbiAgICByZXR1cm4gIWlzQ2hyb21lUGFja2FnZWRBcHAgJiYgaGFzSGlzdG9yeUFwaTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXN1cHBvcnRzLmpzLm1hcCIsImltcG9ydCB7IGlzVGhlbmFibGUgfSBmcm9tICcuL2lzJztcbi8qKiBTeW5jUHJvbWlzZSBpbnRlcm5hbCBzdGF0ZXMgKi9cbnZhciBTdGF0ZXM7XG4oZnVuY3Rpb24gKFN0YXRlcykge1xuICAgIC8qKiBQZW5kaW5nICovXG4gICAgU3RhdGVzW1wiUEVORElOR1wiXSA9IFwiUEVORElOR1wiO1xuICAgIC8qKiBSZXNvbHZlZCAvIE9LICovXG4gICAgU3RhdGVzW1wiUkVTT0xWRURcIl0gPSBcIlJFU09MVkVEXCI7XG4gICAgLyoqIFJlamVjdGVkIC8gRXJyb3IgKi9cbiAgICBTdGF0ZXNbXCJSRUpFQ1RFRFwiXSA9IFwiUkVKRUNURURcIjtcbn0pKFN0YXRlcyB8fCAoU3RhdGVzID0ge30pKTtcbi8qKlxuICogVGhlbmFibGUgY2xhc3MgdGhhdCBiZWhhdmVzIGxpa2UgYSBQcm9taXNlIGFuZCBmb2xsb3dzIGl0J3MgaW50ZXJmYWNlXG4gKiBidXQgaXMgbm90IGFzeW5jIGludGVybmFsbHlcbiAqL1xudmFyIFN5bmNQcm9taXNlID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFN5bmNQcm9taXNlKGV4ZWN1dG9yKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHRoaXMuX3N0YXRlID0gU3RhdGVzLlBFTkRJTkc7XG4gICAgICAgIHRoaXMuX2hhbmRsZXJzID0gW107XG4gICAgICAgIC8qKiBKU0RvYyAqL1xuICAgICAgICB0aGlzLl9yZXNvbHZlID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICBfdGhpcy5fc2V0UmVzdWx0KFN0YXRlcy5SRVNPTFZFRCwgdmFsdWUpO1xuICAgICAgICB9O1xuICAgICAgICAvKiogSlNEb2MgKi9cbiAgICAgICAgdGhpcy5fcmVqZWN0ID0gZnVuY3Rpb24gKHJlYXNvbikge1xuICAgICAgICAgICAgX3RoaXMuX3NldFJlc3VsdChTdGF0ZXMuUkVKRUNURUQsIHJlYXNvbik7XG4gICAgICAgIH07XG4gICAgICAgIC8qKiBKU0RvYyAqL1xuICAgICAgICB0aGlzLl9zZXRSZXN1bHQgPSBmdW5jdGlvbiAoc3RhdGUsIHZhbHVlKSB7XG4gICAgICAgICAgICBpZiAoX3RoaXMuX3N0YXRlICE9PSBTdGF0ZXMuUEVORElORykge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpc1RoZW5hYmxlKHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHZhbHVlLnRoZW4oX3RoaXMuX3Jlc29sdmUsIF90aGlzLl9yZWplY3QpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF90aGlzLl9zdGF0ZSA9IHN0YXRlO1xuICAgICAgICAgICAgX3RoaXMuX3ZhbHVlID0gdmFsdWU7XG4gICAgICAgICAgICBfdGhpcy5fZXhlY3V0ZUhhbmRsZXJzKCk7XG4gICAgICAgIH07XG4gICAgICAgIC8vIFRPRE86IEZJWE1FXG4gICAgICAgIC8qKiBKU0RvYyAqL1xuICAgICAgICB0aGlzLl9hdHRhY2hIYW5kbGVyID0gZnVuY3Rpb24gKGhhbmRsZXIpIHtcbiAgICAgICAgICAgIF90aGlzLl9oYW5kbGVycyA9IF90aGlzLl9oYW5kbGVycy5jb25jYXQoaGFuZGxlcik7XG4gICAgICAgICAgICBfdGhpcy5fZXhlY3V0ZUhhbmRsZXJzKCk7XG4gICAgICAgIH07XG4gICAgICAgIC8qKiBKU0RvYyAqL1xuICAgICAgICB0aGlzLl9leGVjdXRlSGFuZGxlcnMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAoX3RoaXMuX3N0YXRlID09PSBTdGF0ZXMuUEVORElORykge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBjYWNoZWRIYW5kbGVycyA9IF90aGlzLl9oYW5kbGVycy5zbGljZSgpO1xuICAgICAgICAgICAgX3RoaXMuX2hhbmRsZXJzID0gW107XG4gICAgICAgICAgICBjYWNoZWRIYW5kbGVycy5mb3JFYWNoKGZ1bmN0aW9uIChoYW5kbGVyKSB7XG4gICAgICAgICAgICAgICAgaWYgKGhhbmRsZXIuZG9uZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChfdGhpcy5fc3RhdGUgPT09IFN0YXRlcy5SRVNPTFZFRCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaGFuZGxlci5vbmZ1bGZpbGxlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlci5vbmZ1bGZpbGxlZChfdGhpcy5fdmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChfdGhpcy5fc3RhdGUgPT09IFN0YXRlcy5SRUpFQ1RFRCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaGFuZGxlci5vbnJlamVjdGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVyLm9ucmVqZWN0ZWQoX3RoaXMuX3ZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBoYW5kbGVyLmRvbmUgPSB0cnVlO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBleGVjdXRvcih0aGlzLl9yZXNvbHZlLCB0aGlzLl9yZWplY3QpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aGlzLl9yZWplY3QoZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqIEpTRG9jICovXG4gICAgU3luY1Byb21pc2UucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gJ1tvYmplY3QgU3luY1Byb21pc2VdJztcbiAgICB9O1xuICAgIC8qKiBKU0RvYyAqL1xuICAgIFN5bmNQcm9taXNlLnJlc29sdmUgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTeW5jUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgICAgICAgICAgcmVzb2x2ZSh2YWx1ZSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqIEpTRG9jICovXG4gICAgU3luY1Byb21pc2UucmVqZWN0ID0gZnVuY3Rpb24gKHJlYXNvbikge1xuICAgICAgICByZXR1cm4gbmV3IFN5bmNQcm9taXNlKGZ1bmN0aW9uIChfLCByZWplY3QpIHtcbiAgICAgICAgICAgIHJlamVjdChyZWFzb24pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKiBKU0RvYyAqL1xuICAgIFN5bmNQcm9taXNlLmFsbCA9IGZ1bmN0aW9uIChjb2xsZWN0aW9uKSB7XG4gICAgICAgIHJldHVybiBuZXcgU3luY1Byb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGNvbGxlY3Rpb24pKSB7XG4gICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBUeXBlRXJyb3IoXCJQcm9taXNlLmFsbCByZXF1aXJlcyBhbiBhcnJheSBhcyBpbnB1dC5cIikpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjb2xsZWN0aW9uLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJlc29sdmUoW10pO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBjb3VudGVyID0gY29sbGVjdGlvbi5sZW5ndGg7XG4gICAgICAgICAgICB2YXIgcmVzb2x2ZWRDb2xsZWN0aW9uID0gW107XG4gICAgICAgICAgICBjb2xsZWN0aW9uLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0sIGluZGV4KSB7XG4gICAgICAgICAgICAgICAgU3luY1Byb21pc2UucmVzb2x2ZShpdGVtKVxuICAgICAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZWRDb2xsZWN0aW9uW2luZGV4XSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICBjb3VudGVyIC09IDE7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb3VudGVyICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXNvbHZlZENvbGxlY3Rpb24pO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIC50aGVuKG51bGwsIHJlamVjdCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKiogSlNEb2MgKi9cbiAgICBTeW5jUHJvbWlzZS5wcm90b3R5cGUudGhlbiA9IGZ1bmN0aW9uIChvbmZ1bGZpbGxlZCwgb25yZWplY3RlZCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICByZXR1cm4gbmV3IFN5bmNQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICAgIF90aGlzLl9hdHRhY2hIYW5kbGVyKHtcbiAgICAgICAgICAgICAgICBkb25lOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBvbmZ1bGZpbGxlZDogZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIW9uZnVsZmlsbGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiDCr1xcXyjjg4QpXy/Cr1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogRklYTUVcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShvbmZ1bGZpbGxlZChyZXN1bHQpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBvbnJlamVjdGVkOiBmdW5jdGlvbiAocmVhc29uKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghb25yZWplY3RlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KHJlYXNvbik7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUob25yZWplY3RlZChyZWFzb24pKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKiBKU0RvYyAqL1xuICAgIFN5bmNQcm9taXNlLnByb3RvdHlwZS5jYXRjaCA9IGZ1bmN0aW9uIChvbnJlamVjdGVkKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRoZW4oZnVuY3Rpb24gKHZhbCkgeyByZXR1cm4gdmFsOyB9LCBvbnJlamVjdGVkKTtcbiAgICB9O1xuICAgIC8qKiBKU0RvYyAqL1xuICAgIFN5bmNQcm9taXNlLnByb3RvdHlwZS5maW5hbGx5ID0gZnVuY3Rpb24gKG9uZmluYWxseSkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICByZXR1cm4gbmV3IFN5bmNQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICAgIHZhciB2YWw7XG4gICAgICAgICAgICB2YXIgaXNSZWplY3RlZDtcbiAgICAgICAgICAgIHJldHVybiBfdGhpcy50aGVuKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlzUmVqZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB2YWwgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICBpZiAob25maW5hbGx5KSB7XG4gICAgICAgICAgICAgICAgICAgIG9uZmluYWxseSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChyZWFzb24pIHtcbiAgICAgICAgICAgICAgICBpc1JlamVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB2YWwgPSByZWFzb247XG4gICAgICAgICAgICAgICAgaWYgKG9uZmluYWxseSkge1xuICAgICAgICAgICAgICAgICAgICBvbmZpbmFsbHkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBpZiAoaXNSZWplY3RlZCkge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QodmFsKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXNvbHZlKHZhbCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICByZXR1cm4gU3luY1Byb21pc2U7XG59KCkpO1xuZXhwb3J0IHsgU3luY1Byb21pc2UgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXN5bmNwcm9taXNlLmpzLm1hcCIsIi8vIHNoaW0gZm9yIHVzaW5nIHByb2Nlc3MgaW4gYnJvd3NlclxudmFyIHByb2Nlc3MgPSBtb2R1bGUuZXhwb3J0cyA9IHt9O1xuXG4vLyBjYWNoZWQgZnJvbSB3aGF0ZXZlciBnbG9iYWwgaXMgcHJlc2VudCBzbyB0aGF0IHRlc3QgcnVubmVycyB0aGF0IHN0dWIgaXRcbi8vIGRvbid0IGJyZWFrIHRoaW5ncy4gIEJ1dCB3ZSBuZWVkIHRvIHdyYXAgaXQgaW4gYSB0cnkgY2F0Y2ggaW4gY2FzZSBpdCBpc1xuLy8gd3JhcHBlZCBpbiBzdHJpY3QgbW9kZSBjb2RlIHdoaWNoIGRvZXNuJ3QgZGVmaW5lIGFueSBnbG9iYWxzLiAgSXQncyBpbnNpZGUgYVxuLy8gZnVuY3Rpb24gYmVjYXVzZSB0cnkvY2F0Y2hlcyBkZW9wdGltaXplIGluIGNlcnRhaW4gZW5naW5lcy5cblxudmFyIGNhY2hlZFNldFRpbWVvdXQ7XG52YXIgY2FjaGVkQ2xlYXJUaW1lb3V0O1xuXG5mdW5jdGlvbiBkZWZhdWx0U2V0VGltb3V0KCkge1xuICAgIHRocm93IG5ldyBFcnJvcignc2V0VGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCcpO1xufVxuZnVuY3Rpb24gZGVmYXVsdENsZWFyVGltZW91dCAoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdjbGVhclRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQnKTtcbn1cbihmdW5jdGlvbiAoKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKHR5cGVvZiBzZXRUaW1lb3V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gc2V0VGltZW91dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBkZWZhdWx0U2V0VGltb3V0O1xuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gZGVmYXVsdFNldFRpbW91dDtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKHR5cGVvZiBjbGVhclRpbWVvdXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGNsZWFyVGltZW91dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGRlZmF1bHRDbGVhclRpbWVvdXQ7XG4gICAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGRlZmF1bHRDbGVhclRpbWVvdXQ7XG4gICAgfVxufSAoKSlcbmZ1bmN0aW9uIHJ1blRpbWVvdXQoZnVuKSB7XG4gICAgaWYgKGNhY2hlZFNldFRpbWVvdXQgPT09IHNldFRpbWVvdXQpIHtcbiAgICAgICAgLy9ub3JtYWwgZW52aXJvbWVudHMgaW4gc2FuZSBzaXR1YXRpb25zXG4gICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1biwgMCk7XG4gICAgfVxuICAgIC8vIGlmIHNldFRpbWVvdXQgd2Fzbid0IGF2YWlsYWJsZSBidXQgd2FzIGxhdHRlciBkZWZpbmVkXG4gICAgaWYgKChjYWNoZWRTZXRUaW1lb3V0ID09PSBkZWZhdWx0U2V0VGltb3V0IHx8ICFjYWNoZWRTZXRUaW1lb3V0KSAmJiBzZXRUaW1lb3V0KSB7XG4gICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBzZXRUaW1lb3V0O1xuICAgICAgICByZXR1cm4gc2V0VGltZW91dChmdW4sIDApO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICAvLyB3aGVuIHdoZW4gc29tZWJvZHkgaGFzIHNjcmV3ZWQgd2l0aCBzZXRUaW1lb3V0IGJ1dCBubyBJLkUuIG1hZGRuZXNzXG4gICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0KGZ1biwgMCk7XG4gICAgfSBjYXRjaChlKXtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFdoZW4gd2UgYXJlIGluIEkuRS4gYnV0IHRoZSBzY3JpcHQgaGFzIGJlZW4gZXZhbGVkIHNvIEkuRS4gZG9lc24ndCB0cnVzdCB0aGUgZ2xvYmFsIG9iamVjdCB3aGVuIGNhbGxlZCBub3JtYWxseVxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQuY2FsbChudWxsLCBmdW4sIDApO1xuICAgICAgICB9IGNhdGNoKGUpe1xuICAgICAgICAgICAgLy8gc2FtZSBhcyBhYm92ZSBidXQgd2hlbiBpdCdzIGEgdmVyc2lvbiBvZiBJLkUuIHRoYXQgbXVzdCBoYXZlIHRoZSBnbG9iYWwgb2JqZWN0IGZvciAndGhpcycsIGhvcGZ1bGx5IG91ciBjb250ZXh0IGNvcnJlY3Qgb3RoZXJ3aXNlIGl0IHdpbGwgdGhyb3cgYSBnbG9iYWwgZXJyb3JcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0LmNhbGwodGhpcywgZnVuLCAwKTtcbiAgICAgICAgfVxuICAgIH1cblxuXG59XG5mdW5jdGlvbiBydW5DbGVhclRpbWVvdXQobWFya2VyKSB7XG4gICAgaWYgKGNhY2hlZENsZWFyVGltZW91dCA9PT0gY2xlYXJUaW1lb3V0KSB7XG4gICAgICAgIC8vbm9ybWFsIGVudmlyb21lbnRzIGluIHNhbmUgc2l0dWF0aW9uc1xuICAgICAgICByZXR1cm4gY2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfVxuICAgIC8vIGlmIGNsZWFyVGltZW91dCB3YXNuJ3QgYXZhaWxhYmxlIGJ1dCB3YXMgbGF0dGVyIGRlZmluZWRcbiAgICBpZiAoKGNhY2hlZENsZWFyVGltZW91dCA9PT0gZGVmYXVsdENsZWFyVGltZW91dCB8fCAhY2FjaGVkQ2xlYXJUaW1lb3V0KSAmJiBjbGVhclRpbWVvdXQpIHtcbiAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gY2xlYXJUaW1lb3V0O1xuICAgICAgICByZXR1cm4gY2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIC8vIHdoZW4gd2hlbiBzb21lYm9keSBoYXMgc2NyZXdlZCB3aXRoIHNldFRpbWVvdXQgYnV0IG5vIEkuRS4gbWFkZG5lc3NcbiAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH0gY2F0Y2ggKGUpe1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gV2hlbiB3ZSBhcmUgaW4gSS5FLiBidXQgdGhlIHNjcmlwdCBoYXMgYmVlbiBldmFsZWQgc28gSS5FLiBkb2Vzbid0ICB0cnVzdCB0aGUgZ2xvYmFsIG9iamVjdCB3aGVuIGNhbGxlZCBub3JtYWxseVxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dC5jYWxsKG51bGwsIG1hcmtlcik7XG4gICAgICAgIH0gY2F0Y2ggKGUpe1xuICAgICAgICAgICAgLy8gc2FtZSBhcyBhYm92ZSBidXQgd2hlbiBpdCdzIGEgdmVyc2lvbiBvZiBJLkUuIHRoYXQgbXVzdCBoYXZlIHRoZSBnbG9iYWwgb2JqZWN0IGZvciAndGhpcycsIGhvcGZ1bGx5IG91ciBjb250ZXh0IGNvcnJlY3Qgb3RoZXJ3aXNlIGl0IHdpbGwgdGhyb3cgYSBnbG9iYWwgZXJyb3IuXG4gICAgICAgICAgICAvLyBTb21lIHZlcnNpb25zIG9mIEkuRS4gaGF2ZSBkaWZmZXJlbnQgcnVsZXMgZm9yIGNsZWFyVGltZW91dCB2cyBzZXRUaW1lb3V0XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0LmNhbGwodGhpcywgbWFya2VyKTtcbiAgICAgICAgfVxuICAgIH1cblxuXG5cbn1cbnZhciBxdWV1ZSA9IFtdO1xudmFyIGRyYWluaW5nID0gZmFsc2U7XG52YXIgY3VycmVudFF1ZXVlO1xudmFyIHF1ZXVlSW5kZXggPSAtMTtcblxuZnVuY3Rpb24gY2xlYW5VcE5leHRUaWNrKCkge1xuICAgIGlmICghZHJhaW5pbmcgfHwgIWN1cnJlbnRRdWV1ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGRyYWluaW5nID0gZmFsc2U7XG4gICAgaWYgKGN1cnJlbnRRdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgcXVldWUgPSBjdXJyZW50UXVldWUuY29uY2F0KHF1ZXVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBxdWV1ZUluZGV4ID0gLTE7XG4gICAgfVxuICAgIGlmIChxdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgZHJhaW5RdWV1ZSgpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZHJhaW5RdWV1ZSgpIHtcbiAgICBpZiAoZHJhaW5pbmcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgdGltZW91dCA9IHJ1blRpbWVvdXQoY2xlYW5VcE5leHRUaWNrKTtcbiAgICBkcmFpbmluZyA9IHRydWU7XG5cbiAgICB2YXIgbGVuID0gcXVldWUubGVuZ3RoO1xuICAgIHdoaWxlKGxlbikge1xuICAgICAgICBjdXJyZW50UXVldWUgPSBxdWV1ZTtcbiAgICAgICAgcXVldWUgPSBbXTtcbiAgICAgICAgd2hpbGUgKCsrcXVldWVJbmRleCA8IGxlbikge1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRRdWV1ZSkge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRRdWV1ZVtxdWV1ZUluZGV4XS5ydW4oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBxdWV1ZUluZGV4ID0gLTE7XG4gICAgICAgIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB9XG4gICAgY3VycmVudFF1ZXVlID0gbnVsbDtcbiAgICBkcmFpbmluZyA9IGZhbHNlO1xuICAgIHJ1bkNsZWFyVGltZW91dCh0aW1lb3V0KTtcbn1cblxucHJvY2Vzcy5uZXh0VGljayA9IGZ1bmN0aW9uIChmdW4pIHtcbiAgICB2YXIgYXJncyA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoIC0gMSk7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBhcmdzW2kgLSAxXSA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBxdWV1ZS5wdXNoKG5ldyBJdGVtKGZ1biwgYXJncykpO1xuICAgIGlmIChxdWV1ZS5sZW5ndGggPT09IDEgJiYgIWRyYWluaW5nKSB7XG4gICAgICAgIHJ1blRpbWVvdXQoZHJhaW5RdWV1ZSk7XG4gICAgfVxufTtcblxuLy8gdjggbGlrZXMgcHJlZGljdGlibGUgb2JqZWN0c1xuZnVuY3Rpb24gSXRlbShmdW4sIGFycmF5KSB7XG4gICAgdGhpcy5mdW4gPSBmdW47XG4gICAgdGhpcy5hcnJheSA9IGFycmF5O1xufVxuSXRlbS5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuZnVuLmFwcGx5KG51bGwsIHRoaXMuYXJyYXkpO1xufTtcbnByb2Nlc3MudGl0bGUgPSAnYnJvd3Nlcic7XG5wcm9jZXNzLmJyb3dzZXIgPSB0cnVlO1xucHJvY2Vzcy5lbnYgPSB7fTtcbnByb2Nlc3MuYXJndiA9IFtdO1xucHJvY2Vzcy52ZXJzaW9uID0gJyc7IC8vIGVtcHR5IHN0cmluZyB0byBhdm9pZCByZWdleHAgaXNzdWVzXG5wcm9jZXNzLnZlcnNpb25zID0ge307XG5cbmZ1bmN0aW9uIG5vb3AoKSB7fVxuXG5wcm9jZXNzLm9uID0gbm9vcDtcbnByb2Nlc3MuYWRkTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5vbmNlID0gbm9vcDtcbnByb2Nlc3Mub2ZmID0gbm9vcDtcbnByb2Nlc3MucmVtb3ZlTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5yZW1vdmVBbGxMaXN0ZW5lcnMgPSBub29wO1xucHJvY2Vzcy5lbWl0ID0gbm9vcDtcbnByb2Nlc3MucHJlcGVuZExpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3MucHJlcGVuZE9uY2VMaXN0ZW5lciA9IG5vb3A7XG5cbnByb2Nlc3MubGlzdGVuZXJzID0gZnVuY3Rpb24gKG5hbWUpIHsgcmV0dXJuIFtdIH1cblxucHJvY2Vzcy5iaW5kaW5nID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuYmluZGluZyBpcyBub3Qgc3VwcG9ydGVkJyk7XG59O1xuXG5wcm9jZXNzLmN3ZCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuICcvJyB9O1xucHJvY2Vzcy5jaGRpciA9IGZ1bmN0aW9uIChkaXIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuY2hkaXIgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcbnByb2Nlc3MudW1hc2sgPSBmdW5jdGlvbigpIHsgcmV0dXJuIDA7IH07XG4iLCIvKiEgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZVxyXG50aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZVxyXG5MaWNlbnNlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG5cclxuVEhJUyBDT0RFIElTIFBST1ZJREVEIE9OIEFOICpBUyBJUyogQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxyXG5LSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIEFOWSBJTVBMSUVEXHJcbldBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsXHJcbk1FUkNIQU5UQUJMSVRZIE9SIE5PTi1JTkZSSU5HRU1FTlQuXHJcblxyXG5TZWUgdGhlIEFwYWNoZSBWZXJzaW9uIDIuMCBMaWNlbnNlIGZvciBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnNcclxuYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xyXG4vKiBnbG9iYWwgUmVmbGVjdCwgUHJvbWlzZSAqL1xyXG5cclxudmFyIGV4dGVuZFN0YXRpY3MgPSBmdW5jdGlvbihkLCBiKSB7XHJcbiAgICBleHRlbmRTdGF0aWNzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8XHJcbiAgICAgICAgKHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHsgZC5fX3Byb3RvX18gPSBiOyB9KSB8fFxyXG4gICAgICAgIGZ1bmN0aW9uIChkLCBiKSB7IGZvciAodmFyIHAgaW4gYikgaWYgKGIuaGFzT3duUHJvcGVydHkocCkpIGRbcF0gPSBiW3BdOyB9O1xyXG4gICAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZCwgYik7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19leHRlbmRzKGQsIGIpIHtcclxuICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7XHJcbiAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cclxuICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcclxufVxyXG5cclxuZXhwb3J0IHZhciBfX2Fzc2lnbiA9IGZ1bmN0aW9uKCkge1xyXG4gICAgX19hc3NpZ24gPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIF9fYXNzaWduKHQpIHtcclxuICAgICAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcclxuICAgICAgICAgICAgcyA9IGFyZ3VtZW50c1tpXTtcclxuICAgICAgICAgICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApKSB0W3BdID0gc1twXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHQ7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVzdChzLCBlKSB7XHJcbiAgICB2YXIgdCA9IHt9O1xyXG4gICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApXHJcbiAgICAgICAgdFtwXSA9IHNbcF07XHJcbiAgICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpXHJcbiAgICAgICAgICAgICAgICB0W3BbaV1dID0gc1twW2ldXTtcclxuICAgICAgICB9XHJcbiAgICByZXR1cm4gdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpIHtcclxuICAgIHZhciBjID0gYXJndW1lbnRzLmxlbmd0aCwgciA9IGMgPCAzID8gdGFyZ2V0IDogZGVzYyA9PT0gbnVsbCA/IGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KSA6IGRlc2MsIGQ7XHJcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QuZGVjb3JhdGUgPT09IFwiZnVuY3Rpb25cIikgciA9IFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpO1xyXG4gICAgZWxzZSBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgaWYgKGQgPSBkZWNvcmF0b3JzW2ldKSByID0gKGMgPCAzID8gZChyKSA6IGMgPiAzID8gZCh0YXJnZXQsIGtleSwgcikgOiBkKHRhcmdldCwga2V5KSkgfHwgcjtcclxuICAgIHJldHVybiBjID4gMyAmJiByICYmIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgciksIHI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3BhcmFtKHBhcmFtSW5kZXgsIGRlY29yYXRvcikge1xyXG4gICAgcmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQsIGtleSkgeyBkZWNvcmF0b3IodGFyZ2V0LCBrZXksIHBhcmFtSW5kZXgpOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX21ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKSB7XHJcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QubWV0YWRhdGEgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIFJlZmxlY3QubWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hd2FpdGVyKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xyXG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XHJcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxyXG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxyXG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZShyZXN1bHQudmFsdWUpOyB9KS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XHJcbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xyXG4gICAgfSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2dlbmVyYXRvcih0aGlzQXJnLCBib2R5KSB7XHJcbiAgICB2YXIgXyA9IHsgbGFiZWw6IDAsIHNlbnQ6IGZ1bmN0aW9uKCkgeyBpZiAodFswXSAmIDEpIHRocm93IHRbMV07IHJldHVybiB0WzFdOyB9LCB0cnlzOiBbXSwgb3BzOiBbXSB9LCBmLCB5LCB0LCBnO1xyXG4gICAgcmV0dXJuIGcgPSB7IG5leHQ6IHZlcmIoMCksIFwidGhyb3dcIjogdmVyYigxKSwgXCJyZXR1cm5cIjogdmVyYigyKSB9LCB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgKGdbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpczsgfSksIGc7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgcmV0dXJuIGZ1bmN0aW9uICh2KSB7IHJldHVybiBzdGVwKFtuLCB2XSk7IH07IH1cclxuICAgIGZ1bmN0aW9uIHN0ZXAob3ApIHtcclxuICAgICAgICBpZiAoZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkdlbmVyYXRvciBpcyBhbHJlYWR5IGV4ZWN1dGluZy5cIik7XHJcbiAgICAgICAgd2hpbGUgKF8pIHRyeSB7XHJcbiAgICAgICAgICAgIGlmIChmID0gMSwgeSAmJiAodCA9IG9wWzBdICYgMiA/IHlbXCJyZXR1cm5cIl0gOiBvcFswXSA/IHlbXCJ0aHJvd1wiXSB8fCAoKHQgPSB5W1wicmV0dXJuXCJdKSAmJiB0LmNhbGwoeSksIDApIDogeS5uZXh0KSAmJiAhKHQgPSB0LmNhbGwoeSwgb3BbMV0pKS5kb25lKSByZXR1cm4gdDtcclxuICAgICAgICAgICAgaWYgKHkgPSAwLCB0KSBvcCA9IFtvcFswXSAmIDIsIHQudmFsdWVdO1xyXG4gICAgICAgICAgICBzd2l0Y2ggKG9wWzBdKSB7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDA6IGNhc2UgMTogdCA9IG9wOyBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgNDogXy5sYWJlbCsrOyByZXR1cm4geyB2YWx1ZTogb3BbMV0sIGRvbmU6IGZhbHNlIH07XHJcbiAgICAgICAgICAgICAgICBjYXNlIDU6IF8ubGFiZWwrKzsgeSA9IG9wWzFdOyBvcCA9IFswXTsgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDc6IG9wID0gXy5vcHMucG9wKCk7IF8udHJ5cy5wb3AoKTsgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgIGlmICghKHQgPSBfLnRyeXMsIHQgPSB0Lmxlbmd0aCA+IDAgJiYgdFt0Lmxlbmd0aCAtIDFdKSAmJiAob3BbMF0gPT09IDYgfHwgb3BbMF0gPT09IDIpKSB7IF8gPSAwOyBjb250aW51ZTsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gMyAmJiAoIXQgfHwgKG9wWzFdID4gdFswXSAmJiBvcFsxXSA8IHRbM10pKSkgeyBfLmxhYmVsID0gb3BbMV07IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSA2ICYmIF8ubGFiZWwgPCB0WzFdKSB7IF8ubGFiZWwgPSB0WzFdOyB0ID0gb3A7IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHQgJiYgXy5sYWJlbCA8IHRbMl0pIHsgXy5sYWJlbCA9IHRbMl07IF8ub3BzLnB1c2gob3ApOyBicmVhazsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0WzJdKSBfLm9wcy5wb3AoKTtcclxuICAgICAgICAgICAgICAgICAgICBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG9wID0gYm9keS5jYWxsKHRoaXNBcmcsIF8pO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHsgb3AgPSBbNiwgZV07IHkgPSAwOyB9IGZpbmFsbHkgeyBmID0gdCA9IDA7IH1cclxuICAgICAgICBpZiAob3BbMF0gJiA1KSB0aHJvdyBvcFsxXTsgcmV0dXJuIHsgdmFsdWU6IG9wWzBdID8gb3BbMV0gOiB2b2lkIDAsIGRvbmU6IHRydWUgfTtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZXhwb3J0U3RhcihtLCBleHBvcnRzKSB7XHJcbiAgICBmb3IgKHZhciBwIGluIG0pIGlmICghZXhwb3J0cy5oYXNPd25Qcm9wZXJ0eShwKSkgZXhwb3J0c1twXSA9IG1bcF07XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3ZhbHVlcyhvKSB7XHJcbiAgICB2YXIgbSA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvW1N5bWJvbC5pdGVyYXRvcl0sIGkgPSAwO1xyXG4gICAgaWYgKG0pIHJldHVybiBtLmNhbGwobyk7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIG5leHQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKG8gJiYgaSA+PSBvLmxlbmd0aCkgbyA9IHZvaWQgMDtcclxuICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IG8gJiYgb1tpKytdLCBkb25lOiAhbyB9O1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3JlYWQobywgbikge1xyXG4gICAgdmFyIG0gPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdO1xyXG4gICAgaWYgKCFtKSByZXR1cm4gbztcclxuICAgIHZhciBpID0gbS5jYWxsKG8pLCByLCBhciA9IFtdLCBlO1xyXG4gICAgdHJ5IHtcclxuICAgICAgICB3aGlsZSAoKG4gPT09IHZvaWQgMCB8fCBuLS0gPiAwKSAmJiAhKHIgPSBpLm5leHQoKSkuZG9uZSkgYXIucHVzaChyLnZhbHVlKTtcclxuICAgIH1cclxuICAgIGNhdGNoIChlcnJvcikgeyBlID0geyBlcnJvcjogZXJyb3IgfTsgfVxyXG4gICAgZmluYWxseSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKHIgJiYgIXIuZG9uZSAmJiAobSA9IGlbXCJyZXR1cm5cIl0pKSBtLmNhbGwoaSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZpbmFsbHkgeyBpZiAoZSkgdGhyb3cgZS5lcnJvcjsgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGFyO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWQoKSB7XHJcbiAgICBmb3IgKHZhciBhciA9IFtdLCBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKylcclxuICAgICAgICBhciA9IGFyLmNvbmNhdChfX3JlYWQoYXJndW1lbnRzW2ldKSk7XHJcbiAgICByZXR1cm4gYXI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZEFycmF5cygpIHtcclxuICAgIGZvciAodmFyIHMgPSAwLCBpID0gMCwgaWwgPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgaWw7IGkrKykgcyArPSBhcmd1bWVudHNbaV0ubGVuZ3RoO1xyXG4gICAgZm9yICh2YXIgciA9IEFycmF5KHMpLCBrID0gMCwgaSA9IDA7IGkgPCBpbDsgaSsrKVxyXG4gICAgICAgIGZvciAodmFyIGEgPSBhcmd1bWVudHNbaV0sIGogPSAwLCBqbCA9IGEubGVuZ3RoOyBqIDwgamw7IGorKywgaysrKVxyXG4gICAgICAgICAgICByW2tdID0gYVtqXTtcclxuICAgIHJldHVybiByO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXdhaXQodikge1xyXG4gICAgcmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBfX2F3YWl0ID8gKHRoaXMudiA9IHYsIHRoaXMpIDogbmV3IF9fYXdhaXQodik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jR2VuZXJhdG9yKHRoaXNBcmcsIF9hcmd1bWVudHMsIGdlbmVyYXRvcikge1xyXG4gICAgaWYgKCFTeW1ib2wuYXN5bmNJdGVyYXRvcikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxuICAgIHZhciBnID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pLCBpLCBxID0gW107XHJcbiAgICByZXR1cm4gaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIpLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGk7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgaWYgKGdbbl0pIGlbbl0gPSBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKGEsIGIpIHsgcS5wdXNoKFtuLCB2LCBhLCBiXSkgPiAxIHx8IHJlc3VtZShuLCB2KTsgfSk7IH07IH1cclxuICAgIGZ1bmN0aW9uIHJlc3VtZShuLCB2KSB7IHRyeSB7IHN0ZXAoZ1tuXSh2KSk7IH0gY2F0Y2ggKGUpIHsgc2V0dGxlKHFbMF1bM10sIGUpOyB9IH1cclxuICAgIGZ1bmN0aW9uIHN0ZXAocikgeyByLnZhbHVlIGluc3RhbmNlb2YgX19hd2FpdCA/IFByb21pc2UucmVzb2x2ZShyLnZhbHVlLnYpLnRoZW4oZnVsZmlsbCwgcmVqZWN0KSA6IHNldHRsZShxWzBdWzJdLCByKTsgfVxyXG4gICAgZnVuY3Rpb24gZnVsZmlsbCh2YWx1ZSkgeyByZXN1bWUoXCJuZXh0XCIsIHZhbHVlKTsgfVxyXG4gICAgZnVuY3Rpb24gcmVqZWN0KHZhbHVlKSB7IHJlc3VtZShcInRocm93XCIsIHZhbHVlKTsgfVxyXG4gICAgZnVuY3Rpb24gc2V0dGxlKGYsIHYpIHsgaWYgKGYodiksIHEuc2hpZnQoKSwgcS5sZW5ndGgpIHJlc3VtZShxWzBdWzBdLCBxWzBdWzFdKTsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY0RlbGVnYXRvcihvKSB7XHJcbiAgICB2YXIgaSwgcDtcclxuICAgIHJldHVybiBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiwgZnVuY3Rpb24gKGUpIHsgdGhyb3cgZTsgfSksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGk7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4sIGYpIHsgaVtuXSA9IG9bbl0gPyBmdW5jdGlvbiAodikgeyByZXR1cm4gKHAgPSAhcCkgPyB7IHZhbHVlOiBfX2F3YWl0KG9bbl0odikpLCBkb25lOiBuID09PSBcInJldHVyblwiIH0gOiBmID8gZih2KSA6IHY7IH0gOiBmOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jVmFsdWVzKG8pIHtcclxuICAgIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbiAgICB2YXIgbSA9IG9bU3ltYm9sLmFzeW5jSXRlcmF0b3JdLCBpO1xyXG4gICAgcmV0dXJuIG0gPyBtLmNhbGwobykgOiAobyA9IHR5cGVvZiBfX3ZhbHVlcyA9PT0gXCJmdW5jdGlvblwiID8gX192YWx1ZXMobykgOiBvW1N5bWJvbC5pdGVyYXRvcl0oKSwgaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIpLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGkpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IGlbbl0gPSBvW25dICYmIGZ1bmN0aW9uICh2KSB7IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7IHYgPSBvW25dKHYpLCBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCB2LmRvbmUsIHYudmFsdWUpOyB9KTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgZCwgdikgeyBQcm9taXNlLnJlc29sdmUodikudGhlbihmdW5jdGlvbih2KSB7IHJlc29sdmUoeyB2YWx1ZTogdiwgZG9uZTogZCB9KTsgfSwgcmVqZWN0KTsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19tYWtlVGVtcGxhdGVPYmplY3QoY29va2VkLCByYXcpIHtcclxuICAgIGlmIChPYmplY3QuZGVmaW5lUHJvcGVydHkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvb2tlZCwgXCJyYXdcIiwgeyB2YWx1ZTogcmF3IH0pOyB9IGVsc2UgeyBjb29rZWQucmF3ID0gcmF3OyB9XHJcbiAgICByZXR1cm4gY29va2VkO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9faW1wb3J0U3Rhcihtb2QpIHtcclxuICAgIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XHJcbiAgICB2YXIgcmVzdWx0ID0ge307XHJcbiAgICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgaW4gbW9kKSBpZiAoT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwobW9kLCBrKSkgcmVzdWx0W2tdID0gbW9kW2tdO1xyXG4gICAgcmVzdWx0LmRlZmF1bHQgPSBtb2Q7XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19pbXBvcnREZWZhdWx0KG1vZCkge1xyXG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBkZWZhdWx0OiBtb2QgfTtcclxufVxyXG4iLCJ2YXIgZztcblxuLy8gVGhpcyB3b3JrcyBpbiBub24tc3RyaWN0IG1vZGVcbmcgPSAoZnVuY3Rpb24oKSB7XG5cdHJldHVybiB0aGlzO1xufSkoKTtcblxudHJ5IHtcblx0Ly8gVGhpcyB3b3JrcyBpZiBldmFsIGlzIGFsbG93ZWQgKHNlZSBDU1ApXG5cdGcgPSBnIHx8IG5ldyBGdW5jdGlvbihcInJldHVybiB0aGlzXCIpKCk7XG59IGNhdGNoIChlKSB7XG5cdC8vIFRoaXMgd29ya3MgaWYgdGhlIHdpbmRvdyByZWZlcmVuY2UgaXMgYXZhaWxhYmxlXG5cdGlmICh0eXBlb2Ygd2luZG93ID09PSBcIm9iamVjdFwiKSBnID0gd2luZG93O1xufVxuXG4vLyBnIGNhbiBzdGlsbCBiZSB1bmRlZmluZWQsIGJ1dCBub3RoaW5nIHRvIGRvIGFib3V0IGl0Li4uXG4vLyBXZSByZXR1cm4gdW5kZWZpbmVkLCBpbnN0ZWFkIG9mIG5vdGhpbmcgaGVyZSwgc28gaXQnc1xuLy8gZWFzaWVyIHRvIGhhbmRsZSB0aGlzIGNhc2UuIGlmKCFnbG9iYWwpIHsgLi4ufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGc7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKG9yaWdpbmFsTW9kdWxlKSB7XG5cdGlmICghb3JpZ2luYWxNb2R1bGUud2VicGFja1BvbHlmaWxsKSB7XG5cdFx0dmFyIG1vZHVsZSA9IE9iamVjdC5jcmVhdGUob3JpZ2luYWxNb2R1bGUpO1xuXHRcdC8vIG1vZHVsZS5wYXJlbnQgPSB1bmRlZmluZWQgYnkgZGVmYXVsdFxuXHRcdGlmICghbW9kdWxlLmNoaWxkcmVuKSBtb2R1bGUuY2hpbGRyZW4gPSBbXTtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobW9kdWxlLCBcImxvYWRlZFwiLCB7XG5cdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuXHRcdFx0Z2V0OiBmdW5jdGlvbigpIHtcblx0XHRcdFx0cmV0dXJuIG1vZHVsZS5sO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShtb2R1bGUsIFwiaWRcIiwge1xuXHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcblx0XHRcdGdldDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHJldHVybiBtb2R1bGUuaTtcblx0XHRcdH1cblx0XHR9KTtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobW9kdWxlLCBcImV4cG9ydHNcIiwge1xuXHRcdFx0ZW51bWVyYWJsZTogdHJ1ZVxuXHRcdH0pO1xuXHRcdG1vZHVsZS53ZWJwYWNrUG9seWZpbGwgPSAxO1xuXHR9XG5cdHJldHVybiBtb2R1bGU7XG59O1xuIiwiLyoqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiAgRGVwZW5kZW5jaWVzXG4gKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG5cbi8vIFdlIGZpcnN0IGltcG9ydCBTZW50cnkgYW5kIHRyaWdnZXIgaXQgaWYgdGhlIHNlbnRyeSBkc24gaXMgZGVmaW5lZFxuLy8gQmVjYXVzZSB0aGVuIGFsbCBlcnJvcnMgYXJlIGxvZ2dlZFxuaW1wb3J0ICogYXMgU2VudHJ5IGZyb20gJ0BzZW50cnkvYnJvd3Nlcic7XG5pZih3aW5kb3cuc2VudHJ5X2RzbiAhPT0gdW5kZWZpbmVkKSBTZW50cnkuaW5pdCh7IGRzbjogd2luZG93LnNlbnRyeV9kc24gfSk7XG5cbi8qKlxuICogRXh0ZXJuYWxcbiAqL1xucmVxdWlyZSgnaGFtbWVyanMnKTtcbnJlcXVpcmUoJ29iamVjdEZpdFBvbHlmaWxsJyk7XG5cbi8qKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogIEdsb2JhbCBmdW5jdGlvbmFsaXRpZXNcbiAqICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cblxucmVxdWlyZSgnLi9nbG9iYWwvaGVscGVycycpOyAvLyBTaG91bGQgYmUgZmlyc3RcbnJlcXVpcmUoJy4vZ2xvYmFsL2Jyb3dzZXJIYW5kbGVyJyk7XG5yZXF1aXJlKCcuL2dsb2JhbC9zY3JvbGxIYW5kbGVyJyk7XG5cblxuLyoqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiAgQ29tcG9uZW50IGZ1bmN0aW9uYWxpdGllc1xuICogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuXG5yZXF1aXJlKCcuL2NvbXBvbmVudHMvY2hvY29sYXRlRmFjdG9yeScpO1xucmVxdWlyZSgnLi9jb21wb25lbnRzL2Nvb2tpZUhhbmRsZXInKTtcbi8vIHJlcXVpcmUoJy4vY29tcG9uZW50cy9JbnB1dEhhbmRsZXInKTtcbnJlcXVpcmUoJy4vY29tcG9uZW50cy9tYXBzSGFuZGxlcicpO1xucmVxdWlyZSgnLi9jb21wb25lbnRzL292ZXJsYXlNZW51SGFuZGxlcicpO1xucmVxdWlyZSgnLi9jb21wb25lbnRzL3Njcm9sbFRvSGFuZGxlcicpO1xucmVxdWlyZSgnLi9jb21wb25lbnRzL3NsaWRlckhhbmRsZXInKTtcbnJlcXVpcmUoJy4vY29tcG9uZW50cy90YWJzSGFuZGxlcicpO1xucmVxdWlyZSgnLi9jb21wb25lbnRzL3lvdXR1YmVIYW5kbGVyJyk7IiwiLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiB8IFByZXZlbnQgQm90cyBoYW5kbGVyXG4gfFxuIHwgV2UgbmFtZWQgdGhpcyBjaG9jb2xhdGUgZmFjdG9yeSBhbmQgYmVsb25naW5nIGNvbmZ1c2luZyBqcyBob29rc1xuIHwgdG8gcHJldmVudCBzbWFydCBib3RzIGZyb20gYmxvY2tpbmcgdGhlc2UgdmFyaWFibGUgb3IgZnVuY3Rpb25zLlxuIHxcbiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG5jb25zdCBDaG9jb2xhdGVGYWN0b3J5ID0ge1xuXG4gICAgYmFubmVkVmlzaXRvcjogW10sXG5cbiAgICAvKiogR2V0IGFsbCB0aGUgY2hvY29sYXRlIGZhY3RvcnkgYW5kIHN0YXJ0XG4gICAgICogIExvb3BpbmcgdGhyb3VnaCB0aG9zZSBzdGFydCBmbGFzaGluZyB0aWNrZXRzXG4gICAgICovXG4gICAgZW50ZXI6IGZ1bmN0aW9uKClcbiAgICB7XG5cbiAgICAgICAgY29uc3QgY2hvY29sYXRlRmFjdG9yaWVzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmpzLWNob2NvbGF0ZS1mYWN0b3J5Jyk7XG5cbiAgICAgICAgaWYoaXNzZXQoY2hvY29sYXRlRmFjdG9yaWVzKSl7XG5cbiAgICAgICAgICAgIGNvbnN0IGFtb3VudE9mQ2hvY29sYXRlRmFjdG9yaWVzID0gY2hvY29sYXRlRmFjdG9yaWVzLmxlbmd0aDtcbiAgICAgICAgICAgIGZvcihsZXQgaSA9IDA7IGkgPCBhbW91bnRPZkNob2NvbGF0ZUZhY3RvcmllczsgaSsrKXtcblxuICAgICAgICAgICAgICAgIGNvbnN0IENob2NvbGF0ZUJhciA9IGNob2NvbGF0ZUZhY3Rvcmllc1tpXTtcbiAgICAgICAgICAgICAgICBDaG9jb2xhdGVGYWN0b3J5Ll9mbGFzaFRpY2tldChDaG9jb2xhdGVCYXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIElmIGZhY3RvcnkgaGFzIGEgZ29sZGVuIHRpY2tldFxuICAgICAqIFRoZW4gd2UgY2FuIG1ha2UgdGhlbSBnbyBvbiB0aGUgdG91ciBpZiB0aGVyZSBoYXMgYmVlbiBjbGljayBvbiB0aGUgdGlja2V0XG4gICAgICpcbiAgICAgKiBAcGFyYW0gY2hvY29sYXRlQmFyXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfZmxhc2hUaWNrZXQ6IGZ1bmN0aW9uIChjaG9jb2xhdGVCYXIpIHtcblxuICAgICAgICAvLyBUcnkgZ2V0IHRoZSB0aWNrZXQgZnJvbSB0aGUgY2hvY29sYXRlQmFyXG4gICAgICAgIGNvbnN0IGdvbGRlblRpY2tldCA9IGNob2NvbGF0ZUJhci5xdWVyeVNlbGVjdG9yKCcuanMtZ29sZGVuLXRpY2tldCcpO1xuXG4gICAgICAgIC8vIE9ubHkgY29udGludWUgaWYgY2hvY29sYXRlIGJhciBoYXMgYSBnb2xkZW4gdGlja2V0XG4gICAgICAgIGlmKGlzc2V0KGdvbGRlblRpY2tldCkpe1xuXG4gICAgICAgICAgICBnb2xkZW5UaWNrZXQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgQ2hvY29sYXRlRmFjdG9yeS5lbmpveVRoZVRvdXIoY2hvY29sYXRlQmFyKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2V7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnVG8gYmFkLCBubyBnb2xkZW4gdGlja2V0cyBoYXMgYmVlbiBmb3VuZC4nKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBTdGFydCB0aGUgdG91ciB0aHJvdWdoIHRoZSBmYWN0b3J5XG4gICAgICogQW5kIGdldCB0aGUgbmFtZXMgYW5kIHByb3BlcnRpZXMgb2YgdGhlIG1lbWJlcnMgb2YgdGhlIGdyb3VwXG4gICAgICogSWYgdGhlcmUgYXJlIG1lbWJlcnMgaW4gdGhlIGdyb3VwIG9mIGNvdXJzZVxuICAgICAqXG4gICAgICogQHBhcmFtIGNob2NvbGF0ZUZhY3RvcnlcbiAgICAgKi9cbiAgICBlbmpveVRoZVRvdXIoY2hvY29sYXRlRmFjdG9yeSl7XG5cbiAgICAgICAgLy8gQXNrIGZvciB0aGUgdG91ciBncm91cFxuICAgICAgICBjb25zdCB0b3VyR3JvdXAgPSBjaG9jb2xhdGVGYWN0b3J5LnF1ZXJ5U2VsZWN0b3JBbGwoJ2lucHV0LCB0ZXh0YXJlYScpO1xuXG4gICAgICAgIGlmKGlzc2V0KHRvdXJHcm91cCkpe1xuXG4gICAgICAgICAgICAvLyBGb3IgZWFjaCB2aXNpdG9yIHdlIHdhbnQgYSBiZWxvbmdpbmcgT29tcGEgTG9vbXBhXG4gICAgICAgICAgICBsZXQgb29tcGFMb29tcGFzID0ge307XG4gICAgICAgICAgICBsZXQgYW1vdW50T2ZPb21wYUxvb21wYXMgPSAwO1xuXG4gICAgICAgICAgICBjb25zdCB0b3VyR3JvdXBTaXplID0gdG91ckdyb3VwLmxlbmd0aDtcbiAgICAgICAgICAgIGZvcihsZXQgaSA9IDA7IGkgPCB0b3VyR3JvdXBTaXplOyBpKyspe1xuXG4gICAgICAgICAgICAgICAgLy8gR2V0IHRoZSB2aXNpdG9yIGZyb20gdGhlIGdyb3VwXG4gICAgICAgICAgICAgICAgY29uc3QgdmlzaXRvciA9IHRvdXJHcm91cFtpXTtcblxuICAgICAgICAgICAgICAgIC8vIEFzayBmb3IgaXRzIG5hbWVcbiAgICAgICAgICAgICAgICBjb25zdCB2aXNpdG9yTmFtZSA9IHZpc2l0b3IuZ2V0QXR0cmlidXRlKCduYW1lJyk7XG5cbiAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgdmlzaXRvciBpcyBiYW5uZWRcbiAgICAgICAgICAgICAgICBpZiggQ2hvY29sYXRlRmFjdG9yeS5faXNWaXNpdG9yQmFubmVkKHZpc2l0b3JOYW1lKSkgY29udGludWU7XG5cbiAgICAgICAgICAgICAgICBvb21wYUxvb21wYXNbIHZpc2l0b3JOYW1lIF0gPSBDaG9jb2xhdGVGYWN0b3J5Ll9nZXRBcnJhbmdlbWVudCh2aXNpdG9yKTtcbiAgICAgICAgICAgICAgICBhbW91bnRPZk9vbXBhTG9vbXBhcysrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBDaGVjayBmb3IgaW5zdXJhbmNlIHRoYXQgdGhlcmUgYXJlIG9vbXBhIGxvb21wYXNcbiAgICAgICAgICAgIGlmKGFtb3VudE9mT29tcGFMb29tcGFzID09PSAwKSByZXR1cm47XG5cbiAgICAgICAgICAgIC8vIFNlbmQgc3VibWl0IHJlcXVlc3RcbiAgICAgICAgICAgIENob2NvbGF0ZUZhY3RvcnkuX2ZpbmlzaFRvdXIob29tcGFMb29tcGFzLCBjaG9jb2xhdGVGYWN0b3J5KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNle1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ1RvIGJhZCwgbm8gbWVtYmVycyB0byB2aXNpdCB0aGlzIGZhY3RvcnknKVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIHRoZSB2aXNpdG9yIG5hbWUgaXNuJ3QgYWxsb3dcbiAgICAgKlxuICAgICAqIEBwYXJhbSB2aXNpdG9yTmFtZVxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX2lzVmlzaXRvckJhbm5lZDogZnVuY3Rpb24odmlzaXRvck5hbWUpe1xuICAgICAgICBpZihDaG9jb2xhdGVGYWN0b3J5LmJhbm5lZFZpc2l0b3IuaW5kZXhPZih2aXNpdG9yTmFtZSkgIT09IC0xKXtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogTW9zdCBnZXQgdmlzaXRvciBoYXZlIGEgbm9ybWFsIGFycmFuZ2VtZW50XG4gICAgICogQnV0IHNvbWV0aW1lcyB0aGVyZSBhcmUgc3BlY2lhbCBjYXNlc1xuICAgICAqIExpa2UgYSBTZWxlY3RvciBvciBjaGVja2JveFxuICAgICAqXG4gICAgICogQHBhcmFtIHZpc2l0b3JcbiAgICAgKiBAcmV0dXJucyB7Kn1cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF9nZXRBcnJhbmdlbWVudDogZnVuY3Rpb24odmlzaXRvcilcbiAgICB7XG5cbiAgICAgICAgY29uc3QgdmlzaXRvclR5cGUgPSB2aXNpdG9yLm5vZGVOYW1lO1xuXG4gICAgICAgIHN3aXRjaCAodmlzaXRvclR5cGUpIHtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZpc2l0b3IudmFsdWU7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogRmluaXNoIHRoZSB0b3VyXG4gICAgICogSWYgc3VjY2Vzc2Z1bCBzaG93IHRoYW5rcyBtZXNzYWdlXG4gICAgICogT3Igc2hvdyBkZWZpbmVkIGVycm9yIG1lc3NhZ2Ugb3IgZmFsbGJhY2tcbiAgICAgKlxuICAgICAqIEBwYXJhbSBncm91cFxuICAgICAqIEBwYXJhbSBjaG9jb2xhdGVGYWN0b3J5XG4gICAgICogQHJldHVybnMgeyp8dm9pZH1cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF9maW5pc2hUb3VyOiBmdW5jdGlvbihncm91cCwgY2hvY29sYXRlRmFjdG9yeSlcbiAgICB7XG4gICAgICAgIC8vIEFkZCB3aWxsaWUgdG8gdGhlIGdyb3VwXG4gICAgICAgIGdyb3VwID0gQ2hvY29sYXRlRmFjdG9yeS5fYWRkV2lsbGllV29ua2EoZ3JvdXApO1xuXG4gICAgICAgIC8vIEdldCB0aGUgZ2F0ZSBmb3IgZmluaXNoIHRoZSB0b3VyXG4gICAgICAgIGNvbnN0IGdhdGUgPSAnL2NvbnRhY3QvcHJvY2Vzcyc7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIEFqYXgucG9zdChnYXRlLCBncm91cCwgZnVuY3Rpb24gKEh0dHBSZXF1ZXN0KSB7XG5cbiAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IEpTT04ucGFyc2UoSHR0cFJlcXVlc3QucmVzcG9uc2UpO1xuXG4gICAgICAgICAgICAgICAgc3dpdGNoIChIdHRwUmVxdWVzdC5zdGF0dXMpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyMDA6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ2hvY29sYXRlRmFjdG9yeS5fdGhhbmtzRm9yVmlzaXRpbmcocmVzcG9uc2UucmVkaXJlY3RVcmwpO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQyMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBDaG9jb2xhdGVGYWN0b3J5Ll9naXZlRmVlZGJhY2tUb01lbWJlcnMocmVzcG9uc2UuZXJyb3JzLCBjaG9jb2xhdGVGYWN0b3J5KTtcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiBDaG9jb2xhdGVGYWN0b3J5Ll91bmtub3duR2FwSW5GYWN0b3J5KGNob2NvbGF0ZUZhY3RvcnkpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHJldHVybiBDaG9jb2xhdGVGYWN0b3J5Ll91bmtub3duR2FwSW5GYWN0b3J5KGNob2NvbGF0ZUZhY3RvcnkpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEFkZCB3aWxsaWUgd29ua2EgdG8gdGhlIGdyb3VwXG4gICAgICogUHMuLi4gaXQgYWN0dWFsbHkgdGhlIHNlY3JldCBjb2RlIVxuICAgICAqXG4gICAgICogQHBhcmFtIGdyb3VwXG4gICAgICogQHJldHVybnMgeyp9XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfYWRkV2lsbGllV29ua2E6IGZ1bmN0aW9uKGdyb3VwKXtcbiAgICAgICAgZ3JvdXAuX3dpbGxpZSA9ICd3b25rYSc7XG4gICAgICAgIHJldHVybiBncm91cDtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQWRkIHRoZSBmZWVkYmFjayB0byB0aGUgZGVzaXJlZCBhcmVhLlxuICAgICAqIE1vc3QgbGlrZWx5IHRvIHRoZSB2aXNpdG9yIGRpcmVjdGx5LCBidXQgc29tZXRpbWUgdG8gdGhlIGZhY3RvcnkgZGVzaXJlZCBmZWVkYmFjayBhcmVhXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZXJyb3JzXG4gICAgICogQHBhcmFtIGNob2NvbGF0ZUZhY3RvcnlcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF9naXZlRmVlZGJhY2tUb01lbWJlcnM6IGZ1bmN0aW9uKGVycm9ycywgY2hvY29sYXRlRmFjdG9yeSl7XG5cbiAgICAgICAgLy8gR3JhYiB0aGUgZmFjdG9yeSBmZWVkYmFjayBhcmVhXG4gICAgICAgIGNvbnN0IGZlZWRiYWNrQXJlYSA9IGNob2NvbGF0ZUZhY3RvcnkucXVlcnlTZWxlY3RvcignLmpzLWVycm9yLWFyZWEnKTtcblxuICAgICAgICAvLyBDbGVhciB0aGUgY3VycmVudCBodG1sXG4gICAgICAgIGlmKGlzc2V0KGZlZWRiYWNrQXJlYSkpIGZlZWRiYWNrQXJlYS5pbm5lckhUTUwgPSAnJztcblxuICAgICAgICAvLyBDbGVhciB0aGUgcHJldmlvdXMgbWFya2VkIGphY2tldHNcbiAgICAgICAgQ2hvY29sYXRlRmFjdG9yeS5fY2xlYXJQcmV2aW91c01hcmtlZEphY2tldHMoY2hvY29sYXRlRmFjdG9yeSk7XG5cbiAgICAgICAgT2JqZWN0LmtleXMoZXJyb3JzKS5mb3JFYWNoKGZ1bmN0aW9uKHZpc2l0b3IpIHtcblxuICAgICAgICAgICAgbGV0IGphY2tldCA9IG51bGw7XG4gICAgICAgICAgICBsZXQgdmlzaXRvckZlZWRiYWNrQXJlYSA9IG51bGw7XG5cbiAgICAgICAgICAgIC8vIEhvbmV5IGVsZW1lbnRzIGRvZXNuJ3QgaGFzIGEgYWNjZXNzaWJsZSBlbGVtZW50XG4gICAgICAgICAgICBpZih2aXNpdG9yICE9PSAnX2hvbmV5JyAmJiB2aXNpdG9yICE9PSAnX3NlY3JldENvZGUnKSB7XG5cbiAgICAgICAgICAgICAgICAvLyBHcmFiIHRoZSB2aXNpdG9yXG4gICAgICAgICAgICAgICAgY29uc3QgdmlzaXRvck5vZGUgPSBjaG9jb2xhdGVGYWN0b3J5LnF1ZXJ5U2VsZWN0b3IoJyMnICsgdmlzaXRvcik7XG5cbiAgICAgICAgICAgICAgICAvLyBGaW5kIHRoZSBqYWNrZXQgb2YgYSB2aXNpdG9yXG4gICAgICAgICAgICAgICAgamFja2V0ID0gQ2hvY29sYXRlRmFjdG9yeS5fZ3JhYlZpc2l0b3JKYWNrZXQodmlzaXRvck5vZGUpO1xuXG4gICAgICAgICAgICAgICAgLy8gSWYgZm91bmQgZ2V0IHRoZSBkZXNpcmVkIGFyZWFcbiAgICAgICAgICAgICAgICBpZihpc3NldChqYWNrZXQpKSB2aXNpdG9yRmVlZGJhY2tBcmVhID0gamFja2V0LnF1ZXJ5U2VsZWN0b3IoJy5qcy1mb3JtLWdyb3VwLWVycm9yJyk7XG5cbiAgICAgICAgICAgICAgICAvLyBDbGVhciB0aGUgY3VycmVudCBodG1sXG4gICAgICAgICAgICAgICAgaWYoaXNzZXQodmlzaXRvckZlZWRiYWNrQXJlYSkpIHZpc2l0b3JGZWVkYmFja0FyZWEuaW5uZXJIVE1MID0gJyc7XG5cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gR2V0IHRoZSBmZWVkYmFjayBmb3IgdGhpcyB2aXNpdG9yXG4gICAgICAgICAgICBjb25zdCB2aXNpdG9yRmVlZGJhY2sgPSBlcnJvcnNbdmlzaXRvcl07XG5cbiAgICAgICAgICAgIC8vIFNwaXQgb3V0IGVhY2ggbGluZVxuICAgICAgICAgICAgY29uc3QgdmlzaXRvckZlZWRiYWNrQW1vdW50ID0gdmlzaXRvckZlZWRiYWNrLmxlbmd0aDtcbiAgICAgICAgICAgIGZvcihsZXQgaSA9IDA7IGkgPCB2aXNpdG9yRmVlZGJhY2tBbW91bnQ7IGkrKyl7XG4gICAgICAgICAgICAgICAgY29uc3QgdmlzaXRvckZlZWRiYWNrTGluZSA9IHZpc2l0b3JGZWVkYmFja1tpXTtcblxuICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKHZpc2l0b3IsIHZpc2l0b3JGZWVkYmFja0xpbmUpO1xuXG4gICAgICAgICAgICAgICAgLy8gSG9uZXkgZWxlbWVudHMgZG9lc24ndCBoYXMgYSBhY2Nlc3NpYmxlIGVsZW1lbnQgYXJlYVxuICAgICAgICAgICAgICAgIGlmKHZpc2l0b3IgIT09ICdfaG9uZXknICYmIHZpc2l0b3IgIT09ICdfc2VjcmV0Q29kZScpIHtcblxuICAgICAgICAgICAgICAgICAgICAvLyBNYXJrIHRoZSBqYWNrZXRcbiAgICAgICAgICAgICAgICAgICAgaWYoaXNzZXQoamFja2V0KSkgamFja2V0LmNsYXNzTGlzdC5hZGQoJ2hhcy1lcnJvcicpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIEFwcGVuZCBmZWVkYmFjayB0byB2aXNpdG9yIGZlZWRiYWNrIGFyZWEgaWYgZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICBpZihpc3NldCh2aXNpdG9yRmVlZGJhY2tBcmVhKSAmJiB2aXNpdG9yRmVlZGJhY2tMaW5lLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjdXJyZW50RmVlZGJhY2tBcmVhID0gdmlzaXRvckZlZWRiYWNrQXJlYS5pbm5lckhUTUw7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50RmVlZGJhY2tBcmVhICs9ICc8c3Bhbj4nICsgY2FwaXRhbGl6ZUZpcnN0TGV0dGVyKHZpc2l0b3JGZWVkYmFja0xpbmUpICsgJzwvc3Bhbj4nO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmlzaXRvckZlZWRiYWNrQXJlYS5pbm5lckhUTUwgPSBjdXJyZW50RmVlZGJhY2tBcmVhO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gQXBwZW5kIGZlZWRiYWNrIHRvIGZhY3RvcnkgZmVlZGJhY2sgYXJlYSBpZiBkZWZpbmVkXG4gICAgICAgICAgICAgICAgaWYoaXNzZXQoZmVlZGJhY2tBcmVhKSAmJiB2aXNpdG9yRmVlZGJhY2tMaW5lLmxlbmd0aCA+IDApe1xuICAgICAgICAgICAgICAgICAgICBsZXQgY3VycmVudEZlZWRiYWNrQXJlYSA9IGZlZWRiYWNrQXJlYS5pbm5lckhUTUw7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRGZWVkYmFja0FyZWEgKz0gJzxsaT4nICsgY2FwaXRhbGl6ZUZpcnN0TGV0dGVyKHZpc2l0b3JGZWVkYmFja0xpbmUpICsgJzwvbGk+JztcbiAgICAgICAgICAgICAgICAgICAgZmVlZGJhY2tBcmVhLmlubmVySFRNTCA9IGN1cnJlbnRGZWVkYmFja0FyZWE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQ2xlYXIgdGhlIHByZXZpb3VzIG1hcmtlZCBqYWNrZXRzXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY2hvY29sYXRlRmFjdG9yeVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX2NsZWFyUHJldmlvdXNNYXJrZWRKYWNrZXRzKGNob2NvbGF0ZUZhY3RvcnkpIHtcblxuICAgICAgICBjb25zdCBtYXJrZWRKYWNrZXRzID0gY2hvY29sYXRlRmFjdG9yeS5xdWVyeVNlbGVjdG9yQWxsKCcuaGFzLWVycm9yJyk7XG4gICAgICAgIGNvbnN0IG1hcmtlZEphY2tldHNBbW91bnQgPSBtYXJrZWRKYWNrZXRzLmxlbmd0aDtcblxuICAgICAgICBmb3IobGV0IGkgPSAwOyBpIDwgbWFya2VkSmFja2V0c0Ftb3VudDsgaSsrKXtcbiAgICAgICAgICAgIG1hcmtlZEphY2tldHNbaV0uY2xhc3NMaXN0LnJlbW92ZSgnaGFzLWVycm9yJyk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogR3JhYiB0aGUgamFja2V0IG9mIHRoZSB2aXNpdG9yXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmlzaXRvclxuICAgICAqIEByZXR1cm5zIHtudWxsfCp8KCgpID0+IChOb2RlIHwgbnVsbCkpfEFjdGl2ZVguSVhNTERPTU5vZGV8KE5vZGUgJiBQYXJlbnROb2RlKX1cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF9ncmFiVmlzaXRvckphY2tldDogZnVuY3Rpb24odmlzaXRvcil7XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgdmlzaXRvciBpcyBkZWZpbmVkXG4gICAgICAgIGlmICghaXNzZXQodmlzaXRvcikpIHJldHVybiBudWxsO1xuXG4gICAgICAgIC8vIERvIGxvb3Agc2V0dGluZ3NcbiAgICAgICAgY3VycmVudExheWVyID0gdmlzaXRvcjtcbiAgICAgICAgc2FmZXR5QnJlYWsgPSAwO1xuXG4gICAgICAgIC8vIEdyYWIgdGhlIG5leHQgbGF5ZXIgdGlsbCBpdCBpcyB0aGUgamFja2V0IChvciBzYWZldHlCcmVhayBoYXMgYmVlbiByZWFjaGVkXG4gICAgICAgIGRvIHtcbiAgICAgICAgICAgIHNhZmV0eUJyZWFrKys7XG4gICAgICAgICAgICBjdXJyZW50TGF5ZXIgPSBjdXJyZW50TGF5ZXIucGFyZW50Tm9kZTtcbiAgICAgICAgICAgIGlmKGN1cnJlbnRMYXllci5jbGFzc0xpc3QuY29udGFpbnMoJ2pzLWZvcm0tZ3JvdXAnKSkgcmV0dXJuIGN1cnJlbnRMYXllcjtcbiAgICAgICAgfSB3aGlsZSAoY3VycmVudExheWVyLnRhZ05hbWUgIT09ICdCT0RZJyAmJiBzYWZldHlCcmVhayA8PSAxMCk7XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFJlZGlyZWN0IHRoZSB2aXNpdG9yIHRvIHRoZSB0aGFua3MgcGFnZVxuICAgICAqXG4gICAgICogQHBhcmFtIG5leHRTdG9wXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfdGhhbmtzRm9yVmlzaXRpbmc6IGZ1bmN0aW9uIChuZXh0U3RvcCkge1xuICAgICAgICB3aW5kb3cubG9jYXRpb24gPSBuZXh0U3RvcDtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogVW5rbm93biBlcnJvciBvY2N1cnJlZCwgbG9nIHRoZSBlcnJvclxuICAgICAqXG4gICAgICogQHBhcmFtIGNob2NvbGF0ZUZhY3RvcnlcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF91bmtub3duR2FwSW5GYWN0b3J5OiBmdW5jdGlvbiAoY2hvY29sYXRlRmFjdG9yeSkge1xuICAgICAgICBjb25zb2xlLmxvZyhjaG9jb2xhdGVGYWN0b3J5KTtcbiAgICAgICAgY29uc29sZS5sb2coJ0Nob2NvbGF0ZUZhY3Rvcnk6IFVua293biBFcnJvcicpO1xuICAgIH0sXG59O1xuXG5DaG9jb2xhdGVGYWN0b3J5LmVudGVyKCk7IiwiLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgIENvb2tpZSBoYW5kbGVyXG4gICAtIFByaW1hcnkgdXNhZ2UgZm9yIHRvZ2dsaW5nIHRoZSBjb29raWUgbWVzc2FnZSBhbmQvb3Igc3dpdGNoXG4gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuY29uc3QgQ29va2llSGFuZGxlciA9IHtcbiAgICBjb29raWVCYXIgOiBudWxsLFxuICAgIGNvb2tpZU1lc3NhZ2UgOiBudWxsLFxuICAgIGNvb2tpZUZhZGVPdXRBbmltYXRpb25EdXJhdGlvbiA6IDQwMCxcbiAgICBhY2NlcHRUcmFja2luZyA6IGZhbHNlLFxuXG4gICAgLy8gSW5pdGlhbGl6ZSBjb29raWUgaGFuZGxlclxuICAgIGluaXQgOiBmdW5jdGlvbigpXG4gICAge1xuICAgICAgICAvLyBCaW5kIGNvb2tpZSBiYXIgdG8gY29va2llTWVzc2FnZVxuICAgICAgICBDb29raWVIYW5kbGVyLmNvb2tpZU1lc3NhZ2UgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuanMtY29va2llLWJhcicpO1xuXG4gICAgICAgIC8vIEJpbmQgY29va2llIGJhciB0byBjb29raWVCYXJcbiAgICAgICAgQ29va2llSGFuZGxlci5jb29raWVCYXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuanMtY29va2llLWJhcicpO1xuXG4gICAgICAgIC8vIElmIGlzc2V0IGluaXQgdGhlIGZ1bmN0aW9ucyBmb3IgY29va2llIGJhclxuICAgICAgICBpZihpc3NldChDb29raWVIYW5kbGVyLmNvb2tpZUJhcikpe1xuICAgICAgICAgICAgQ29va2llSGFuZGxlci5pbml0Q29va2llQmFyKCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiBlaXRoZXIgdHlwZSBvZiBjb29raWUgaGFzIGJlZW4gZm91bmQgY2hlY2sgaWYgc2V0dGluZ3MgYXJlIGRlZmluZWRcbiAgICAgICAgaWYoaXNzZXQoQ29va2llSGFuZGxlci5jb29raWVNZXNzYWdlKSl7XG4gICAgICAgICAgICBDb29raWVIYW5kbGVyLmNoZWNrRm9yQ29va2llU2V0dGluZ3MoKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyBJbml0IHRoZSBjb29raWUgYmFyIGFjdGlvbnNcbiAgICBpbml0Q29va2llQmFyOiBmdW5jdGlvbigpe1xuICAgICAgICBjb25zdCBjbG9zZUJ1dHRvbiA9IENvb2tpZUhhbmRsZXIuY29va2llQmFyLnF1ZXJ5U2VsZWN0b3IoJy5qcy1kaXNhYmxlLWNvb2tpZS1iYXInKTtcbiAgICAgICAgaWYoaXNzZXQoY2xvc2VCdXR0b24pKXtcbiAgICAgICAgICAgIGNsb3NlQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgQ29va2llSGFuZGxlci5jbG9zZUNvb2tpZU1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIGNoZWNrRm9yQ29va2llU2V0dGluZ3M6IGZ1bmN0aW9uKCl7XG4gICAgICAgIGlmIChDb29raWUuZ2V0KCdjb29raWVNZXNzYWdlJykpIHtcbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgnaXMtY29va2llcy1hY2NlcHRlZCcpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QucmVtb3ZlKCdpcy1jb29raWVzLWFjY2VwdGVkJyk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgY2xvc2VDb29raWVNZXNzYWdlOiBmdW5jdGlvbiAoKXtcbiAgICAgICAgQ29va2llLnNldCgnY29va2llTWVzc2FnZScsIHRydWUsIDkwKTtcbiAgICAgICAgQ29va2llSGFuZGxlci5jb29raWVNZXNzYWdlLmNsYXNzTGlzdC5hZGQoJ2lzLXRyYW5zaXRpb25pbmctb3V0Jyk7XG4gICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgnaXMtY29va2llcy1hY2NlcHRlZCcpO1xuICAgIH0sXG59O1xuXG5Db29raWVIYW5kbGVyLmluaXQoKTsiLCIvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIEdvb2dsZSBNYXBzIGhhbmRsZXJcbiAgICAtIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL21hcHMvZG9jdW1lbnRhdGlvbi9qYXZhc2NyaXB0L2FkZGluZy1hLWdvb2dsZS1tYXBcbiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG5jb25zdCBNYXBzSGFuZGxlciA9IHtcblxuICAgIG1hcDogJycsXG4gICAga2V5OiAnQUl6YVN5Q1ZHUFVtUm1RUnhYdnp6V3UzWHl1NzdYZWJReFEtZjRZJyxcbiAgICBsb2NhdGlvbjoge2xhdDogNTEuMjYxMDg5LCBsbmc6IDUuNTk4MTcyfSxcbiAgICBzdHlsaW5nOiAnJyxcblxuICAgIGluaXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gR2V0IG1hcCBieSBpZFxuICAgICAgICBNYXBzSGFuZGxlci5tYXAgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuanMtZ29vZ2xlLW1hcCcpO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIGEgbWFwIGlzIGRlZmluZWRcbiAgICAgICAgaWYgKGlzc2V0KE1hcHNIYW5kbGVyLm1hcCkpIHtcblxuICAgICAgICAgICAgaWYoTWFwc0hhbmRsZXIubWFwLmhhc0F0dHJpYnV0ZSgnZGF0YS1nb29nbGUtbGF0JykpIE1hcHNIYW5kbGVyLmxvY2F0aW9uLmxhdCA9IHBhcnNlRmxvYXQoTWFwc0hhbmRsZXIubWFwLmdldEF0dHJpYnV0ZSgnZGF0YS1nb29nbGUtbGF0JykpO1xuICAgICAgICAgICAgaWYoTWFwc0hhbmRsZXIubWFwLmhhc0F0dHJpYnV0ZSgnZGF0YS1nb29nbGUtbG5nJykpIE1hcHNIYW5kbGVyLmxvY2F0aW9uLmxuZyA9IHBhcnNlRmxvYXQoTWFwc0hhbmRsZXIubWFwLmdldEF0dHJpYnV0ZSgnZGF0YS1nb29nbGUtbG5nJykpO1xuXG4gICAgICAgICAgICBNYXBzSGFuZGxlci5zZXRDdXN0b21TdHlsaW5nKCk7XG5cbiAgICAgICAgICAgIC8vIFNlZSBpZiBnb29nbGUgdmFyaWFibGUgZXhpc3RzXG4gICAgICAgICAgICBpZiAodHlwZW9mKGdvb2dsZSkgPT0gJ3VuZGVmaW5lZCcgfHwgdHlwZW9mKGdvb2dsZS5tYXBzKSA9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIC8vIExvYWQgZXh0ZXJuYWwgc2NyaXB0XG4gICAgICAgICAgICAgICAgZ2V0U2NyaXB0KCdodHRwczovL21hcHMuZ29vZ2xlYXBpcy5jb20vbWFwcy9hcGkvanM/a2V5PScgKyBNYXBzSGFuZGxlci5rZXksIE1hcHNIYW5kbGVyLmRyYXdNYXApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBNYXBzSGFuZGxlci5kcmF3TWFwKClcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9XG4gICAgfSxcblxuICAgIGRyYXdNYXA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gQ3JlYXRlIGEgbWFwXG4gICAgICAgIGxldCBtYXAgPSBuZXcgZ29vZ2xlLm1hcHMuTWFwKE1hcHNIYW5kbGVyLm1hcCwge1xuICAgICAgICAgICAgem9vbTogMTQsXG4gICAgICAgICAgICBjZW50ZXI6IE1hcHNIYW5kbGVyLmxvY2F0aW9uLFxuICAgICAgICAgICAgZGlzYWJsZURlZmF1bHRVSTogdHJ1ZSxcbiAgICAgICAgICAgIHN0eWxlczogTWFwc0hhbmRsZXIuc3R5bGluZ1xuICAgICAgICB9KTtcblxuICAgICAgICB2YXIgY29udGVudFN0cmluZyA9ICc8ZGl2PjxwPlBsYW4gZWVuIHJvdXRlIG9wICcrXG4gICAgICAgICAgICAnPGEgdGFyZ2V0PVwiX2JsYW5rXCIgaHJlZj1cImh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vbWFwcy9kaXIvP2FwaT0xJmRlc3RpbmF0aW9uPScgKyBNYXBzSGFuZGxlci5sb2NhdGlvbi5sYXQgKyAnLCcgKyBNYXBzSGFuZGxlci5sb2NhdGlvbi5sbmcgKydcIiBjbGFzcz1cImxpbmtcIj4nK1xuICAgICAgICAgICAgJ2dvb2dsZSBtYXBzPC9hPiAnK1xuICAgICAgICAgICAgJzwvcD48L2Rpdj4nO1xuXG4gICAgICAgIHZhciBpbmZvd2luZG93ID0gbmV3IGdvb2dsZS5tYXBzLkluZm9XaW5kb3coe1xuICAgICAgICAgICAgY29udGVudDogY29udGVudFN0cmluZ1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBBZGQgYSBtYXJrZXJcbiAgICAgICAgbGV0IG1hcmtlciA9IG5ldyBnb29nbGUubWFwcy5NYXJrZXIoe1xuICAgICAgICAgICAgcG9zaXRpb246IE1hcHNIYW5kbGVyLmxvY2F0aW9uLFxuICAgICAgICAgICAgbWFwOiBtYXAsXG4gICAgICAgICAgICAvLyBsYWJlbDogJ0EnXG4gICAgICAgIH0pO1xuXG4gICAgICAgIG1hcmtlci5hZGRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGluZm93aW5kb3cub3BlbihtYXAsIG1hcmtlcik7XG4gICAgICAgIH0pO1xuXG4gICAgfSxcblxuICAgIHNldEN1c3RvbVN0eWxpbmc6IGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBNYXBzSGFuZGxlci5zdHlsaW5nID1cbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwiZmVhdHVyZVR5cGVcIjogXCJ3YXRlclwiLFxuICAgICAgICAgICAgICAgICAgICBcImVsZW1lbnRUeXBlXCI6IFwiZ2VvbWV0cnlcIixcbiAgICAgICAgICAgICAgICAgICAgXCJzdHlsZXJzXCI6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImNvbG9yXCI6IFwiI2U5ZTllOVwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibGlnaHRuZXNzXCI6IDE3XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJmZWF0dXJlVHlwZVwiOiBcImxhbmRzY2FwZVwiLFxuICAgICAgICAgICAgICAgICAgICBcImVsZW1lbnRUeXBlXCI6IFwiZ2VvbWV0cnlcIixcbiAgICAgICAgICAgICAgICAgICAgXCJzdHlsZXJzXCI6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImNvbG9yXCI6IFwiI2Y1ZjVmNVwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibGlnaHRuZXNzXCI6IDIwXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJmZWF0dXJlVHlwZVwiOiBcInJvYWQuaGlnaHdheVwiLFxuICAgICAgICAgICAgICAgICAgICBcImVsZW1lbnRUeXBlXCI6IFwiZ2VvbWV0cnkuZmlsbFwiLFxuICAgICAgICAgICAgICAgICAgICBcInN0eWxlcnNcIjogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiY29sb3JcIjogXCIjZmZmZmZmXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJsaWdodG5lc3NcIjogMTdcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcImZlYXR1cmVUeXBlXCI6IFwicm9hZC5oaWdod2F5XCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZWxlbWVudFR5cGVcIjogXCJnZW9tZXRyeS5zdHJva2VcIixcbiAgICAgICAgICAgICAgICAgICAgXCJzdHlsZXJzXCI6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImNvbG9yXCI6IFwiI2ZmZmZmZlwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibGlnaHRuZXNzXCI6IDI5XG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwid2VpZ2h0XCI6IDAuMlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwiZmVhdHVyZVR5cGVcIjogXCJyb2FkLmFydGVyaWFsXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZWxlbWVudFR5cGVcIjogXCJnZW9tZXRyeVwiLFxuICAgICAgICAgICAgICAgICAgICBcInN0eWxlcnNcIjogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiY29sb3JcIjogXCIjZmZmZmZmXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJsaWdodG5lc3NcIjogMThcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcImZlYXR1cmVUeXBlXCI6IFwicm9hZC5sb2NhbFwiLFxuICAgICAgICAgICAgICAgICAgICBcImVsZW1lbnRUeXBlXCI6IFwiZ2VvbWV0cnlcIixcbiAgICAgICAgICAgICAgICAgICAgXCJzdHlsZXJzXCI6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImNvbG9yXCI6IFwiI2ZmZmZmZlwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibGlnaHRuZXNzXCI6IDE2XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJmZWF0dXJlVHlwZVwiOiBcInBvaVwiLFxuICAgICAgICAgICAgICAgICAgICBcImVsZW1lbnRUeXBlXCI6IFwiZ2VvbWV0cnlcIixcbiAgICAgICAgICAgICAgICAgICAgXCJzdHlsZXJzXCI6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImNvbG9yXCI6IFwiI2Y1ZjVmNVwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibGlnaHRuZXNzXCI6IDIxXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJmZWF0dXJlVHlwZVwiOiBcInBvaS5wYXJrXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZWxlbWVudFR5cGVcIjogXCJnZW9tZXRyeVwiLFxuICAgICAgICAgICAgICAgICAgICBcInN0eWxlcnNcIjogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiY29sb3JcIjogXCIjZGVkZWRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJsaWdodG5lc3NcIjogMjFcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcImVsZW1lbnRUeXBlXCI6IFwibGFiZWxzLnRleHQuc3Ryb2tlXCIsXG4gICAgICAgICAgICAgICAgICAgIFwic3R5bGVyc1wiOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ2aXNpYmlsaXR5XCI6IFwib25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImNvbG9yXCI6IFwiI2ZmZmZmZlwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibGlnaHRuZXNzXCI6IDE2XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJlbGVtZW50VHlwZVwiOiBcImxhYmVscy50ZXh0LmZpbGxcIixcbiAgICAgICAgICAgICAgICAgICAgXCJzdHlsZXJzXCI6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInNhdHVyYXRpb25cIjogMzZcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJjb2xvclwiOiBcIiMzMzMzMzNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImxpZ2h0bmVzc1wiOiA0MFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwiZWxlbWVudFR5cGVcIjogXCJsYWJlbHMuaWNvblwiLFxuICAgICAgICAgICAgICAgICAgICBcInN0eWxlcnNcIjogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidmlzaWJpbGl0eVwiOiBcIm9mZlwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJmZWF0dXJlVHlwZVwiOiBcInRyYW5zaXRcIixcbiAgICAgICAgICAgICAgICAgICAgXCJlbGVtZW50VHlwZVwiOiBcImdlb21ldHJ5XCIsXG4gICAgICAgICAgICAgICAgICAgIFwic3R5bGVyc1wiOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJjb2xvclwiOiBcIiNmMmYyZjJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImxpZ2h0bmVzc1wiOiAxOVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwiZmVhdHVyZVR5cGVcIjogXCJhZG1pbmlzdHJhdGl2ZVwiLFxuICAgICAgICAgICAgICAgICAgICBcImVsZW1lbnRUeXBlXCI6IFwiZ2VvbWV0cnkuZmlsbFwiLFxuICAgICAgICAgICAgICAgICAgICBcInN0eWxlcnNcIjogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiY29sb3JcIjogXCIjZmVmZWZlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJsaWdodG5lc3NcIjogMjBcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcImZlYXR1cmVUeXBlXCI6IFwiYWRtaW5pc3RyYXRpdmVcIixcbiAgICAgICAgICAgICAgICAgICAgXCJlbGVtZW50VHlwZVwiOiBcImdlb21ldHJ5LnN0cm9rZVwiLFxuICAgICAgICAgICAgICAgICAgICBcInN0eWxlcnNcIjogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiY29sb3JcIjogXCIjZmVmZWZlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJsaWdodG5lc3NcIjogMTdcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ3ZWlnaHRcIjogMS4yXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdO1xuXG4gICAgfVxufTtcblxuTWFwc0hhbmRsZXIuaW5pdCgpOyIsIi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICBOYXZpZ2F0aW9uIGhhbmRsZXJcbiAgIC0gSGFuZGxlcyB0aGUgc2hvd2luZyBhbmQgaGlkaW5nIG9mIHRoZSBvdmVybGF5LW1lbnUgY29tcG9uZW50IHdoaWNoIGhhcyB0aGUgcHJvcGVyIGNsYXNzZXMuXG4gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuY29uc3QgYm9keVNjcm9sbExvY2sgPSByZXF1aXJlKCdib2R5LXNjcm9sbC1sb2NrJyk7XG5cbmNvbnN0IE92ZXJsYXlNZW51SGFuZGxlciA9IHtcblxuICAgIC8vIGluaXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAvLyAgICAgY29uc3Qgb3ZlcmxheU1lbnVUcmlnZ2VyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmpzLW92ZXJsYXktbWVudS10cmlnZ2VyJyk7XG4gICAgLy8gICAgIE92ZXJsYXlNZW51SGFuZGxlci5pbml0T3ZlcmxheU1lbnUob3ZlcmxheU1lbnVUcmlnZ2VyKTtcbiAgICAvLyB9LFxuXG4gICAgaW5pdDogZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIGNvbnN0IG92ZXJsYXlNZW51VHJpZ2dlckxpc3QgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuanMtb3ZlcmxheS1tZW51LXRyaWdnZXInKTtcbiAgICAgICAgY29uc3Qgb3ZlcmxheU1lbnVUcmlnZ2VyTGlzdENvdW50ID0gb3ZlcmxheU1lbnVUcmlnZ2VyTGlzdC5sZW5ndGg7XG5cbiAgICAgICAgaWYoaXNzZXQob3ZlcmxheU1lbnVUcmlnZ2VyTGlzdCkgJiYgb3ZlcmxheU1lbnVUcmlnZ2VyTGlzdENvdW50ICE9PSAwKXtcbiAgICAgICAgICAgIGZvcihsZXQgaSA9IDA7IGkgPCBvdmVybGF5TWVudVRyaWdnZXJMaXN0Q291bnQ7IGkrKyl7XG4gICAgICAgICAgICAgICAgY29uc3Qgb3ZlcmxheU1lbnVUcmlnZ2VyID0gb3ZlcmxheU1lbnVUcmlnZ2VyTGlzdFtpXTtcbiAgICAgICAgICAgICAgICBPdmVybGF5TWVudUhhbmRsZXIuaW5pdE92ZXJsYXlNZW51KG92ZXJsYXlNZW51VHJpZ2dlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgaW5pdE92ZXJsYXlNZW51OiBmdW5jdGlvbiAob3ZlcmxheU1lbnVUcmlnZ2VyKSB7XG4gICAgICAgIG92ZXJsYXlNZW51VHJpZ2dlci5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIE92ZXJsYXlNZW51SGFuZGxlci50b2dnbGVPdmVybGF5TWVudSwgZmFsc2UpO1xuICAgIH0sXG5cbiAgICB0b2dnbGVPdmVybGF5TWVudTogZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIGNvbnN0IG92ZXJsYXlNZW51TmF2ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmpzLW92ZXJsYXktbWVudScpO1xuICAgICAgICAvLyBjb25zdCBvdmVybGF5TWVudUJvZHkgPSBvdmVybGF5TWVudS5xdWVyeVNlbGVjdG9yKCcuanMtb3ZlcmxheS1tZW51LXBlcnNpc3Qtc2Nyb2xsaW5nJyk7XG5cbiAgICAgICAgLy8gQmFpbCBpZiBvdmVybGF5TWVudSBkb2Vzbid0IGV4aXN0XG4gICAgICAgIGlmICghb3ZlcmxheU1lbnVOYXYpIHJldHVybjtcblxuICAgICAgICAvLyBDbGVhciBwcmV2aW91c2x5IGxvY2tlZCBzY3JvbGwgb24gdGhlIGJvZHlcbiAgICAgICAgYm9keVNjcm9sbExvY2suZW5hYmxlQm9keVNjcm9sbChvdmVybGF5TWVudU5hdik7XG5cbiAgICAgICAgLy8gSWYgdGhlIG92ZXJsYXlNZW51IGlzIGFscmVhZHkgYWN0aXZlLCBjb2xsYXBzZSBpdCBhbmQgcXVpdFxuICAgICAgICBpZiAoZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuY29udGFpbnMoJ2lzLW92ZXJsYXktbWVudS1hY3RpdmUnKSkge1xuICAgICAgICAgICAgb3ZlcmxheU1lbnVOYXYucXVlcnlTZWxlY3RvckFsbCgnW3RhYmluZGV4PVwiMFwiXScpLmZvckVhY2goZnVuY3Rpb24oZWxlbSkge1xuICAgICAgICAgICAgICAgIGVsZW0udGFiSW5kZXggPSAtMTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5yZW1vdmUoJ2lzLW92ZXJsYXktbWVudS1hY3RpdmUnKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIExvY2sgc2Nyb2xsaW5nIG9uIHRoZSBib2R5XG4gICAgICAgIGJvZHlTY3JvbGxMb2NrLmRpc2FibGVCb2R5U2Nyb2xsKG92ZXJsYXlNZW51TmF2KTtcblxuICAgICAgICBvdmVybGF5TWVudU5hdi5xdWVyeVNlbGVjdG9yQWxsKCdbdGFiaW5kZXg9XCItMVwiXScpLmZvckVhY2goZnVuY3Rpb24oZWxlbSkge1xuICAgICAgICAgICAgZWxlbS50YWJJbmRleCA9IDA7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFRvZ2dsZSBhY3RpdmUgb3ZlcmxheU1lbnUgYnkgc2V0dGluZyBhIGNsYXNzIG9uIHRoZSBib2R5XG4gICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnRvZ2dsZSgnaXMtb3ZlcmxheS1tZW51LWFjdGl2ZScpO1xuICAgICAgICBvdmVybGF5TWVudU5hdi5oaWRkZW4gPSBmYWxzZTtcbiAgICB9XG59O1xuXG5PdmVybGF5TWVudUhhbmRsZXIuaW5pdCgpOyIsIi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgU2Nyb2xsIFRvIENsaWNrIGhhbmRsZXJcbiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG5jb25zdCBTY3JvbGxUb0hhbmRsZXIgPSB7XG5cbiAgICAvLyBBbmltYXRpb24gc2V0dGluZ3NcbiAgICBvZmZzZXQgOiA2MCwgLy9waXhlbFxuICAgIGR1cmF0aW9uIDogMTQwMCwgLy9tc1xuXG4gICAgLy8gQW5pbWF0aW9uIHZhcmlhYmxlc1xuICAgIGJvZHkgOiBudWxsLFxuICAgIHN0YXJ0IDogMCxcbiAgICBjaGFuZ2UgOiAwLFxuICAgIGN1cnJlbnRUaW1lIDogMCxcbiAgICBhbGxvd0FuaW1hdGlvbiA6IGZhbHNlLFxuICAgIHNjcm9sbFRvQW5pbWF0aW9uIDogbnVsbCxcblxuICAgIC8vIFdhdGNoIHRoZSBFYXNpbmdGdW5jdGlvbiBoZWxwZXIgZm9yIHRoZSBhdmFpbGFibGUgbWV0aG9kc1xuICAgIGVhc2luZzogJ2Vhc2VJbk91dFF1YWQnLFxuXG4gICAgaW5pdCA6IGZ1bmN0aW9uKCl7XG5cbiAgICAgICAgY29uc3QgYW5jaG9yTGlua3MgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuanMtc2Nyb2xsLXRvLXRhcmdldCcpO1xuICAgICAgICBjb25zdCBhbmNob3JMaW5rc0Ftb3VudCA9IGFuY2hvckxpbmtzLmxlbmd0aDtcblxuICAgICAgICBmb3IobGV0IGkgPSAwOyBpIDwgYW5jaG9yTGlua3NBbW91bnQ7IGkrKykge1xuXG4gICAgICAgICAgICBjb25zdCBhbmNob3JMaW5rID0gYW5jaG9yTGlua3NbaV07XG5cbiAgICAgICAgICAgIGFuY2hvckxpbmsuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICAgICAgICBTY3JvbGxUb0hhbmRsZXIucHJlcGFyZVNjcm9sbFRvKHRoaXMuZ2V0QXR0cmlidXRlKCdocmVmJykpO1xuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBQcmVwYXJlIHRoZSBIYW5kbGVyIGZvciB0aGUgYW5pbWF0aW9uXG4gICAgICovXG4gICAgcHJlcGFyZVNjcm9sbFRvIDogZnVuY3Rpb24oZWxlbWVudElkKXtcblxuICAgICAgICAvLyBHZXQgdGhlIHNjcm9sbCB0byBlbGVtZW50XG4gICAgICAgIGVsZW1lbnRJZCA9IGVsZW1lbnRJZC5zdWJzdHIoZWxlbWVudElkLmluZGV4T2YoJyMnKSsxKTtcbiAgICAgICAgY29uc3Qgc2Nyb2xsVG9FbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWxlbWVudElkKTtcbiAgICAgICAgaWYoc2Nyb2xsVG9FbGVtZW50ID09IG51bGwpIHJldHVybjtcbiAgICAgICAgY29uc3Qgc2Nyb2xsVG9FbGVtZW50UG9zaXRpb24gPSBzY3JvbGxUb0VsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICAgICAgLy8gUmVzZXQgb3IgZGVmaW5lIHRoZSBIYW5kbGVyIHZhcmlhYmxlc1xuICAgICAgICBTY3JvbGxUb0hhbmRsZXIuYm9keSA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiAgICAgICAgU2Nyb2xsVG9IYW5kbGVyLnN0YXJ0ID0gTWF0aC5tYXgoU2Nyb2xsVG9IYW5kbGVyLmJvZHkuc2Nyb2xsVG9wLCBkb2N1bWVudC5ib2R5LnNjcm9sbFRvcCwgd2luZG93LnBhZ2VZT2Zmc2V0KTsgLy9Vc2UgTWF0aC5tYXggYmVjYXVzZSBzYWZhcmkgZG9lc24ndCBzdXBwb3J0IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3BcbiAgICAgICAgU2Nyb2xsVG9IYW5kbGVyLmNoYW5nZSA9ICgoc2Nyb2xsVG9FbGVtZW50UG9zaXRpb24udG9wICsgU2Nyb2xsVG9IYW5kbGVyLnN0YXJ0KSAtIFNjcm9sbFRvSGFuZGxlci5zdGFydCkgLSBTY3JvbGxUb0hhbmRsZXIub2Zmc2V0O1xuICAgICAgICBTY3JvbGxUb0hhbmRsZXIuc3RhcnRUaW1lID0gJ25vdycgaW4gd2luZG93LnBlcmZvcm1hbmNlID8gcGVyZm9ybWFuY2Uubm93KCkgOiBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgICAgICAgU2Nyb2xsVG9IYW5kbGVyLmFsbG93QW5pbWF0aW9uID0gdHJ1ZTtcblxuICAgICAgICAvLyBUcmlnZ2VyIGFuaW1hdGlvblxuICAgICAgICBzY3JvbGxUb0FuaW1hdGlvbiA9IHJlcXVlc3RBbmltYXRpb25GcmFtZShTY3JvbGxUb0hhbmRsZXIuYW5pbWF0ZVNjcm9sbCk7XG5cbiAgICAgICAgLy8gU3RvcCBvbiBzY3JvbGxcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIFNjcm9sbFRvSGFuZGxlci5hYm9ydFNjcm9sbEFuaW1hdGlvbik7XG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCd3aGVlbCcsIFNjcm9sbFRvSGFuZGxlci5hYm9ydFNjcm9sbEFuaW1hdGlvbik7XG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdET01Nb3VzZVNjcm9sbCcsIFNjcm9sbFRvSGFuZGxlci5hYm9ydFNjcm9sbEFuaW1hdGlvbik7XG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXdoZWVsJywgU2Nyb2xsVG9IYW5kbGVyLmFib3J0U2Nyb2xsQW5pbWF0aW9uKTtcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2tleXVwJywgU2Nyb2xsVG9IYW5kbGVyLmFib3J0U2Nyb2xsQW5pbWF0aW9uKTtcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIFNjcm9sbFRvSGFuZGxlci5hYm9ydFNjcm9sbEFuaW1hdGlvbik7XG5cbiAgICB9LFxuXG4gICAgLypcbiAgICAgKiBBbmltYXRlIHRoZSBzY3JvbGwgcG9zaXRpb25cbiAgICAgKi9cbiAgICBhbmltYXRlU2Nyb2xsIDogZnVuY3Rpb24gKHRpbWVzdGFtcCkge1xuXG4gICAgICAgIC8vIENhbGN1bGF0ZSBwcm9ncmVzcyBmcm9tIDAgLSAxXG4gICAgICAgIGxldCBwcm9ncmVzcyA9IE1hdGgubWluKDEsICh0aW1lc3RhbXAgLSAgU2Nyb2xsVG9IYW5kbGVyLnN0YXJ0VGltZSkgLyBTY3JvbGxUb0hhbmRsZXIuZHVyYXRpb24pO1xuICAgICAgICBpZihwcm9ncmVzcyA8IDApIHByb2dyZXNzID0gMDtcblxuICAgICAgICAvLyBDb252ZXJ0IHByb2dyZXNzIHdpdGggZWFzaW5nIGZ1bmN0aW9uXG4gICAgICAgIHByb2dyZXNzID0gRWFzaW5nRnVuY3Rpb25zW1Njcm9sbFRvSGFuZGxlci5lYXNpbmddKHByb2dyZXNzKTtcblxuICAgICAgICBjb25zdCBuZXdTY3JvbGxUb3AgPSBTY3JvbGxUb0hhbmRsZXIuc3RhcnQgKyAoIFNjcm9sbFRvSGFuZGxlci5jaGFuZ2UgKiBwcm9ncmVzcyApO1xuXG4gICAgICAgIFNjcm9sbFRvSGFuZGxlci5ib2R5LnNjcm9sbFRvcCA9IG5ld1Njcm9sbFRvcDtcbiAgICAgICAgaWYoIFNjcm9sbFRvSGFuZGxlci5ib2R5LnNjcm9sbFRvcCA9PT0gMCApIGRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wID0gbmV3U2Nyb2xsVG9wOyAvLyBTYWZhcmkgZG9lc24ndCBzdXBwb3J0IHNvIGlmIFNjcm9sbFRvSGFuZGxlci5ib2R5LnNjcm9sbFRvcCBpcyAwIGZvcmNlIHRoZSBzY3JvbGwgcG9zaXRpb24gdGhyb3VnaCBkb2N1bWVudC5ib2R5LnNjcm9sbFRvcFxuXG4gICAgICAgIGlmKHByb2dyZXNzIDwgMSAmJiBTY3JvbGxUb0hhbmRsZXIuYWxsb3dBbmltYXRpb24pe1xuICAgICAgICAgICAgc2Nyb2xsVG9BbmltYXRpb24gPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoU2Nyb2xsVG9IYW5kbGVyLmFuaW1hdGVTY3JvbGwpO1xuICAgICAgICB9XG5cbiAgICB9LFxuXG4gICAgLypcbiAgICAgKiBBYm9ydCB0aGUgc2Nyb2xsIGFuaW1hdGlvblxuICAgICAqL1xuICAgIGFib3J0U2Nyb2xsQW5pbWF0aW9uIDogZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIFNjcm9sbFRvSGFuZGxlci5hbGxvd0FuaW1hdGlvbiA9IGZhbHNlO1xuICAgICAgICBjYW5jZWxBbmltYXRpb25GcmFtZShTY3JvbGxUb0hhbmRsZXIuc2Nyb2xsVG9BbmltYXRpb24pO1xuICAgIH1cblxufTtcblxuU2Nyb2xsVG9IYW5kbGVyLmluaXQoKTsiLCJcbi8qIEV4YW1wbGVcblxuY29uc3QgaGVhZGVySW1hZ2VTbGlkZXJTZXR0aW5nID0gbmV3IFNsaWRlclByb2plY3RvclNldHRpbmcoe1xuICAgIHNsaWRlclByb2plY3RvcklkOiAnaGVhZGVyLWltYWdlLXNsaWRlcicsXG4gICAgc2xpZGVRdWVyeTogJyNoZWFkZXItaW1hZ2Utc2xpZGVyIC5wbGFjZWhvbGRlciBmaWd1cmUnLFxuICAgIGRvdHM6ICcjaGVhZGVyLWltYWdlLXNsaWRlciAuc2xpZGVyLW5hdmlnYXRpb24tbGFiZWxzIC5uYXZpZ2F0aW9uIHNwYW4nLFxuICAgIGF1dG9TbGlkZXI6IHRydWUsXG4gICAgc2xpZGVySW50ZXJ2YWw6IDQwMDBcbn0pO1xuaGVhZGVySW1hZ2VTbGlkZXJTZXR0aW5nID0gaGVhZGVySW1hZ2VTbGlkZXJTZXR0aW5nLnByZXBhcmVQYXJhbWV0ZXJzKCk7XG5cbmNvbnN0IGhlYWRlckltYWdlU2xpZGVyID0gbmV3IFNsaWRlclByb2plY3RvcihoZWFkZXJJbWFnZVNsaWRlclNldHRpbmcpLmluaXQoKTtcblxuICovXG5cbmxldCBTbGlkZXJzID0gW107XG5cbmNvbnN0IHNsaWRlckNvbnRhaW5lcnMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuanMtc2xpZGVyJyk7XG5jb25zdCBzbGlkZXJDb250YWluZXJzTGVuZ3RoID0gc2xpZGVyQ29udGFpbmVycy5sZW5ndGg7XG5cbmZvcihsZXQgaSA9MDsgaSA8IHNsaWRlckNvbnRhaW5lcnNMZW5ndGg7IGkrKyl7XG5cbiAgICBjb25zdCBzbGlkZXIgPSBzbGlkZXJDb250YWluZXJzW2ldO1xuICAgIGNvbnN0IHNsaWRlcklkID0gc2xpZGVyLmdldEF0dHJpYnV0ZSgnaWQnKTtcblxuICAgIGlmKHNsaWRlcklkICE9PSBudWxsKXtcblxuICAgICAgICBjb25zdCBTbGlkZXJzZXR0aW5nID0gbmV3IFNsaWRlclNldHRpbmcoe1xuICAgICAgICAgICAgc2xpZGVySWQ6IHNsaWRlcklkLFxuICAgICAgICAgICAgYXV0b1NsaWRlcjogc2xpZGVyLmdldEF0dHJpYnV0ZSgnZGF0YS1hdXRvLXNsaWRlJyksXG4gICAgICAgICAgICBzbGlkZVF1ZXJ5OiAnIycgKyBzbGlkZXJJZCArJyAuanMtc2xpZGVyLXNsaWRlJyxcbiAgICAgICAgICAgIG5hdmlnYXRpb25CdXR0b25zOiAnIycgKyBzbGlkZXJJZCArJyAuanMtc2xpZGVyLWJ1dHRvbicsXG4gICAgICAgICAgICBkb3RzOiAnIycgKyBzbGlkZXJJZCArJyAuanMtc2xpZGVyLWluZGljYXRvcicsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIFNsaWRlcnMucHVzaCggbmV3IFNsaWRlcihTbGlkZXJzZXR0aW5nLnByZXBhcmVQYXJhbWV0ZXJzKCkpLmluaXQoKSApO1xuICAgIH1cbiAgICBlbHNlIGNvbnNvbGUubG9nKCdBbiBpbWFnZSBzbGlkZXIgaGFzIG5vIGlkLi4uJyk7XG59XG5cblxuZnVuY3Rpb24gU2xpZGVyU2V0dGluZyhzZXR0aW5nc09iamVjdCkge1xuXG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG5cbiAgICB0aGlzLnNsaWRlcklkID0gJyc7XG4gICAgdGhpcy5hdXRvU2xpZGVyID0gZmFsc2U7XG4gICAgdGhpcy5zbGlkZXJJbnRlcnZhbCA9IDQwMDA7XG4gICAgdGhpcy5uYXZpZ2F0aW9uQnV0dG9ucyA9ICcnO1xuICAgIHRoaXMuZG90cyA9ICcnO1xuICAgIHRoaXMuc2xpZGVRdWVyeSA9ICcnO1xuXG4gICAgdGhpcy5zZXRTbGlkZXJJZCA9IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5zbGlkZXJJZCA9IHN0cmluZztcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICB0aGlzLnNldEF1dG9TbGlkZXIgPSBmdW5jdGlvbiAoYm9vbGVhbikge1xuICAgICAgICB0aGlzLmF1dG9TbGlkZXIgPSBib29sZWFuO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIHRoaXMuc2V0U2xpZGVySW50ZXJ2YWwgPSBmdW5jdGlvbiAoaW50ZWdlcikge1xuICAgICAgICB0aGlzLnNsaWRlckludGVydmFsID0gaW50ZWdlcjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICB0aGlzLnNldFNsaWRlUXVlcnkgPSBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuc2xpZGVRdWVyeSA9IHN0cmluZztcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICB0aGlzLnNldE5hdmlnYXRpb25CdXR0b25zID0gZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICB0aGlzLm5hdmlnYXRpb25CdXR0b25zID0gc3RyaW5nO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIHRoaXMuc2V0RG90cyA9IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5kb3RzID0gc3RyaW5nO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIHRoaXMuZ2V0U2xpZGVySWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNsaWRlcklkO1xuICAgIH07XG4gICAgdGhpcy5nZXRBdXRvU2xpZGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBsZXQgYXV0b1NsaWRlID0gdGhpcy5hdXRvU2xpZGVyO1xuICAgICAgICBpZighTnVtYmVyLmlzSW50ZWdlcihhdXRvU2xpZGUpKXtcbiAgICAgICAgICAgIGlmKGF1dG9TbGlkZSA9PSBmYWxzZSkgYXV0b1NsaWRlID0gZmFsc2U7XG4gICAgICAgICAgICBlbHNlIGF1dG9TbGlkZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGF1dG9TbGlkZTtcbiAgICB9O1xuICAgIHRoaXMuZ2V0U2xpZGVySW50ZXJ2YWwgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNsaWRlckludGVydmFsO1xuICAgIH07XG4gICAgdGhpcy5nZXRTbGlkZVF1ZXJ5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zbGlkZVF1ZXJ5O1xuICAgIH07XG4gICAgdGhpcy5nZXROYXZpZ2F0aW9uQnV0dG9ucyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmF2aWdhdGlvbkJ1dHRvbnM7XG4gICAgfTtcbiAgICB0aGlzLmdldERvdHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRvdHM7XG4gICAgfTtcblxuICAgIC8vIEludmVydCBzZXR0ZXJzIHRvIGdldHRlcnNcbiAgICB0aGlzLnByZXBhcmVQYXJhbWV0ZXJzID0gZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzbGlkZXJJZDogc2VsZi5nZXRTbGlkZXJJZCgpLFxuICAgICAgICAgICAgYXV0b1NsaWRlcjogc2VsZi5nZXRBdXRvU2xpZGVyKCksXG4gICAgICAgICAgICBzbGlkZXJJbnRlcnZhbDogc2VsZi5nZXRTbGlkZXJJbnRlcnZhbCgpLFxuICAgICAgICAgICAgbmF2aWdhdGlvbkJ1dHRvbnM6IHNlbGYuZ2V0TmF2aWdhdGlvbkJ1dHRvbnMoKSxcbiAgICAgICAgICAgIGRvdHM6IHNlbGYuZ2V0RG90cygpLFxuICAgICAgICAgICAgc2xpZGVRdWVyeTogc2VsZi5nZXRTbGlkZVF1ZXJ5KClcbiAgICAgICAgfVxuXG4gICAgfTtcblxuICAgIC8vIE1hc3MgYXNzaWduIHNldHRpbmdzXG4gICAgdGhpcy5maWxsID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyBPYmplY3Qua2V5cyhzZXR0aW5nc09iamVjdCkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIC8vICAgICBzZWxmW2tleV0gPSBzZXR0aW5nc09iamVjdFtrZXldO1xuICAgICAgICAvLyB9KTtcblxuICAgICAgICBjb25zdCBzZXR0aW5nc09iamVjdEtleXMgPSBPYmplY3Qua2V5cyhzZXR0aW5nc09iamVjdCk7XG4gICAgICAgIGNvbnN0IHNldHRpbmdzT2JqZWN0TGVuZ3RoID0gc2V0dGluZ3NPYmplY3RLZXlzLmxlbmd0aDtcblxuICAgICAgICBmb3IobGV0IGkgPSAwOyBpIDwgc2V0dGluZ3NPYmplY3RMZW5ndGg7IGkrKyl7XG4gICAgICAgICAgICBjb25zdCBrZXkgPSBzZXR0aW5nc09iamVjdEtleXNbaV07XG4gICAgICAgICAgICBzZWxmW2tleV0gPSBzZXR0aW5nc09iamVjdFtrZXldO1xuICAgICAgICB9XG5cbiAgICB9O1xuXG4gICAgdGhpcy5maWxsKCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBzbGlkZXJJZDogc2VsZi5zZXRTbGlkZXJJZCxcbiAgICAgICAgYXV0b1NsaWRlcjogc2VsZi5zZXRBdXRvU2xpZGVyLFxuICAgICAgICBzbGlkZXJJbnRlcnZhbDogc2VsZi5zZXRTbGlkZXJJbnRlcnZhbCxcbiAgICAgICAgbmF2aWdhdGlvbkJ1dHRvbnM6IHNlbGYuc2V0TmF2aWdhdGlvbkJ1dHRvbnMsXG4gICAgICAgIGRvdHM6IHNlbGYuc2V0RG90cyxcbiAgICAgICAgc2xpZGVRdWVyeTogc2VsZi5zZXRTbGlkZVF1ZXJ5LFxuICAgICAgICBwcmVwYXJlUGFyYW1ldGVyczogc2VsZi5wcmVwYXJlUGFyYW1ldGVyc1xuICAgIH07XG59XG5cbmZ1bmN0aW9uIFNsaWRlcihzZXR0aW5ncykge1xuXG4gICAgLy9EZWZpbmUgU2xpZGVyIG9iamVjdFxuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIHRoaXMuc2xpZGVyT2JqZWN0ID0gJyc7XG5cbiAgICAvL1NsaWRlUGFyYW1ldGVyc1xuICAgIHRoaXMuYWN0aXZlU2xpZGVJZCA9IDA7XG4gICAgdGhpcy5wcmV2aW91c1NsaWRlSWQgPSAwO1xuICAgIHRoaXMubmV4dFNsaWRlSWQgPSAwO1xuICAgIHRoaXMuYXZhaWxhYmxlU2xpZGVzID0gMTtcbiAgICB0aGlzLnNsaWRlcyA9IFtdO1xuICAgIHRoaXMuYXV0b1NsaWRlckludGVydmFsID0gbnVsbDtcblxuICAgIHRoaXMuc2V0dGluZ3MgPSB7fTtcblxuICAgIHRoaXMuaW5pdCA9IGZ1bmN0aW9uICgpIHtcblxuICAgICAgICAvL0FwcGVuZCBzZXR0aW5ncyB0byBzZWxmXG4gICAgICAgIHRoaXMuc2V0dGluZ3MgPSBzZXR0aW5ncztcblxuICAgICAgICAvL0Fzc2lnbiBuZWVkZWQgZWxlbWVudHMgYW5kIGNhbGN1bGF0aW9uc1xuICAgICAgICB0aGlzLnNsaWRlck9iamVjdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuc2V0dGluZ3Muc2xpZGVySWQpO1xuICAgICAgICB0aGlzLnNsaWRlcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwodGhpcy5zZXR0aW5ncy5zbGlkZVF1ZXJ5KTtcbiAgICAgICAgdGhpcy5hdmFpbGFibGVTbGlkZXMgPSB0aGlzLnNsaWRlcy5sZW5ndGg7XG4gICAgICAgIHRoaXMuYWN0aXZlU2xpZGVJZCA9IDA7XG5cbiAgICAgICAgLy8gU2V0IGFjdGl2ZSBzbGlkZSAoYW5kIHBvc3NpYmxlIHByZXZpb3VzIGFuZCBuZXh0IGNsYXNzZXMpXG4gICAgICAgIHRoaXMuc2V0U2xpZGUoKTtcblxuICAgICAgICAvLyBTd2lwZSBpbnRlcmFjdGlvblxuICAgICAgICBjb25zdCBzd2lwZUdlc3R1cmVzID0gbmV3IEhhbW1lcih0aGlzLnNsaWRlck9iamVjdCk7XG4gICAgICAgIHN3aXBlR2VzdHVyZXMub24oJ3N3aXBlbGVmdCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHNlbGYucmVzZXRBdXRvU2xpZGVyKCk7XG4gICAgICAgICAgICBzZWxmLm5leHRTbGlkZSgpO1xuICAgICAgICAgICAgc2VsZi5zZXRTbGlkZSgpO1xuICAgICAgICB9KTtcbiAgICAgICAgc3dpcGVHZXN0dXJlcy5vbignc3dpcGVyaWdodCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHNlbGYucmVzZXRBdXRvU2xpZGVyKCk7XG4gICAgICAgICAgICBzZWxmLnByZXZpb3VzU2xpZGUoKTtcbiAgICAgICAgICAgIHNlbGYuc2V0U2xpZGUoKTtcbiAgICAgICAgfSk7XG5cblxuICAgICAgICBpZiAodGhpcy5zZXR0aW5ncy5uYXZpZ2F0aW9uQnV0dG9ucyAhPT0gJycpIHtcblxuICAgICAgICAgICAgLy8gQ2xpY2sgaW50ZXJhY3Rpb25cbiAgICAgICAgICAgIGNvbnN0IG5hdmlnYXRpb25CdXR0b25zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCh0aGlzLnNldHRpbmdzLm5hdmlnYXRpb25CdXR0b25zKTtcbiAgICAgICAgICAgIGNvbnN0IG5hdmlnYXRpb25CdXR0b25zTGVuZ3RoID0gbmF2aWdhdGlvbkJ1dHRvbnMubGVuZ3RoO1xuICAgICAgICAgICAgZm9yKGxldCBpID0gMDsgaSA8IG5hdmlnYXRpb25CdXR0b25zTGVuZ3RoOyBpKyspe1xuICAgICAgICAgICAgICAgIGNvbnN0IG5hdmlnYXRpb25CdXR0b24gPSBuYXZpZ2F0aW9uQnV0dG9uc1tpXTtcbiAgICAgICAgICAgICAgICBuYXZpZ2F0aW9uQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBzZWxmLmNsaWNrTmF2aWdhdGlvbkJ1dHRvbih0aGlzKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnNldHRpbmdzLmRvdHMgIT09ICcnKSB7XG4gICAgICAgICAgICAvLyBDbGljayBpbnRlcmFjdGlvblxuICAgICAgICAgICAgY29uc3QgZG90cyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwodGhpcy5zZXR0aW5ncy5kb3RzKTtcbiAgICAgICAgICAgIGNvbnN0IGRvdHNMZW5ndGggPSBkb3RzLmxlbmd0aDtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKHRoaXMuc2V0dGluZ3MuZG90cyk7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhkb3RzKTtcbiAgICAgICAgICAgIGZvcihsZXQgaSA9IDA7IGkgPCBkb3RzTGVuZ3RoOyBpKyspe1xuICAgICAgICAgICAgICAgIGNvbnN0IGRvdCA9IGRvdHNbaV07XG4gICAgICAgICAgICAgICAgZG90LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBzZWxmLmNsaWNrRG90KHRoaXMpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH1cblxuICAgICAgICBzZWxmLmF1dG9TbGlkZXIoKTtcbiAgICB9O1xuXG5cbiAgICB0aGlzLmF1dG9TbGlkZXIgPSBmdW5jdGlvbiAoKXtcblxuICAgICAgICAvLyBSZXNldCB0aGUgaW50ZXJ2YWwgaWYgZGVmaW5lZFxuICAgICAgICBpZih0aGlzLmF1dG9TbGlkZXJJbnRlcnZhbCAhPT0gbnVsbCkgY2xlYXJJbnRlcnZhbCh0aGlzLmF1dG9TbGlkZXJJbnRlcnZhbCk7XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgc2hvdWxkIGF1dG8gc2xpZGUgYmVmb3JlIGNyZWF0aW5nIHRoZSBpbnRlcnZhbFxuICAgICAgICAvLyBXZSBkbyB0aGlzIGluaGVyZSwgYmVjYXVzZSB0aGUgYXV0b3NsaWRlIGZ1bmN0aW9uIGlzIGFsc28gY2FsbGVkIGJ5IG90aGVyIGZ1bmN0aW9uYWxpdHlcbiAgICAgICAgaWYodGhpcy5zZXR0aW5ncy5hdXRvU2xpZGVyICE9PSBmYWxzZSAmJiBOdW1iZXIuaXNJbnRlZ2VyKHRoaXMuc2V0dGluZ3Muc2xpZGVySW50ZXJ2YWwpICApe1xuXG4gICAgICAgICAgICB0aGlzLmF1dG9TbGlkZXJJbnRlcnZhbCA9IHNldEludGVydmFsKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICBzZWxmLm5leHRTbGlkZSgpO1xuICAgICAgICAgICAgICAgICAgICBzZWxmLnNldFNsaWRlKCk7XG4gICAgICAgICAgICAgICAgfSwgdGhpcy5zZXR0aW5ncy5zbGlkZXJJbnRlcnZhbFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICB0aGlzLnJlc2V0QXV0b1NsaWRlciA9IHNlbGYuYXV0b1NsaWRlcjtcblxuICAgIHRoaXMubmV4dFNsaWRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmFjdGl2ZVNsaWRlSWQrKztcbiAgICAgICAgaWYgKHRoaXMuYWN0aXZlU2xpZGVJZCA+PSB0aGlzLmF2YWlsYWJsZVNsaWRlcykgdGhpcy5hY3RpdmVTbGlkZUlkID0gMDtcbiAgICB9O1xuXG4gICAgdGhpcy5wcmV2aW91c1NsaWRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmFjdGl2ZVNsaWRlSWQtLTtcbiAgICAgICAgaWYgKHRoaXMuYWN0aXZlU2xpZGVJZCA8IDApIHRoaXMuYWN0aXZlU2xpZGVJZCA9IHRoaXMuYXZhaWxhYmxlU2xpZGVzIC0gMTtcbiAgICB9O1xuXG5cbiAgICB0aGlzLnNldFNsaWRlID0gZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIC8vIExvb3AgdGhyb3VnaCB0aGUgZm9ybSBlbGVtZW50c1xuICAgICAgICBjb25zdCBzbGlkZXNMZW5ndGggPSBzZWxmLnNsaWRlcy5sZW5ndGg7XG4gICAgICAgIGZvcihsZXQgaSA9IDA7IGkgPCBzbGlkZXNMZW5ndGg7IGkrKyl7XG4gICAgICAgICAgICBjb25zdCBzbGlkZSA9IHNlbGYuc2xpZGVzW2ldO1xuXG4gICAgICAgICAgICBzbGlkZS5zdHlsZS5wb2ludGVyRXZlbnRzID0gXCJub25lXCI7IC8vIE5lZWRlZCBmb3Igc3dpcGUgZnVuY3Rpb25hbGl0eVxuXG4gICAgICAgICAgICAvLyBDb252ZXJ0IGRhdGEgc2V0IGF0dHJpYnV0ZSB0byBkZXNpcmVkIHR5cGVcbiAgICAgICAgICAgIGNvbnN0IHNsaWRlT3JkZXIgPSBwYXJzZUludChzbGlkZS5nZXRBdHRyaWJ1dGUoJ2RhdGEtb3JkZXInKSk7XG5cbiAgICAgICAgICAgIC8vIFJlbW92ZSBhbmQgc2V0IGFjdGl2ZSBmb3IgYWxsIHNsaWRlc1xuICAgICAgICAgICAgaWYgKHNsaWRlT3JkZXIgIT09IHNlbGYuYWN0aXZlU2xpZGVJZCkgc2xpZGUuY2xhc3NMaXN0LnJlbW92ZSgnaXMtYWN0aXZlJyk7XG4gICAgICAgICAgICBlbHNlIHNsaWRlLmNsYXNzTGlzdC5hZGQoJ2lzLWFjdGl2ZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNlbGYuc2V0dGluZ3MuZG90cyAhPT0gJycpIHsgc2VsZi5zZXRBY3RpdmVEb3QoKTsgfVxuICAgIH07XG5cbiAgICB0aGlzLmNsaWNrTmF2aWdhdGlvbkJ1dHRvbiA9IGZ1bmN0aW9uIChuYXZCdXR0b24pIHtcblxuICAgICAgICBjb25zdCBuYXZCdXR0b25EaXJlY3Rpb24gPSBuYXZCdXR0b24uZ2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJyk7XG5cbiAgICAgICAgaWYobmF2QnV0dG9uRGlyZWN0aW9uID09PSAnbmV4dCcpIHRoaXMubmV4dFNsaWRlKCk7XG4gICAgICAgIGVsc2UgaWYobmF2QnV0dG9uRGlyZWN0aW9uID09PSAncHJldmlvdXMnKSB0aGlzLnByZXZpb3VzU2xpZGUoKTtcblxuICAgICAgICBzZWxmLnNldFNsaWRlKCk7XG4gICAgICAgIHNlbGYucmVzZXRBdXRvU2xpZGVyKCk7XG4gICAgfTtcblxuICAgIHRoaXMuY2xpY2tEb3QgPSBmdW5jdGlvbiAoY2xpY2tlZERvdCkge1xuICAgICAgICBzZWxmLmFjdGl2ZVNsaWRlSWQgPSBwYXJzZUludChjbGlja2VkRG90LmdldEF0dHJpYnV0ZSgnZGF0YS1vcmRlcicpKTtcbiAgICAgICAgc2VsZi5zZXRTbGlkZSgpO1xuICAgICAgICBzZWxmLnJlc2V0QXV0b1NsaWRlcigpO1xuICAgIH07XG5cbiAgICB0aGlzLnNldEFjdGl2ZURvdCA9IGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBjb25zdCBkb3RzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCh0aGlzLnNldHRpbmdzLmRvdHMpO1xuICAgICAgICBjb25zdCBkb3RzTGVuZ3RoID0gZG90cy5sZW5ndGg7XG4gICAgICAgIGZvcihsZXQgaSA9IDA7IGkgPCBkb3RzTGVuZ3RoOyBpKyspe1xuICAgICAgICAgICAgY29uc3QgZG90ID0gZG90c1tpXTtcbiAgICAgICAgICAgIGRvdE9yZGVyID0gcGFyc2VJbnQoZG90LmdldEF0dHJpYnV0ZSgnZGF0YS1vcmRlcicpKTtcblxuICAgICAgICAgICAgaWYoZG90T3JkZXIgIT09IHNlbGYuYWN0aXZlU2xpZGVJZCkge1xuICAgICAgICAgICAgICAgIGRvdC5jbGFzc0xpc3QucmVtb3ZlKCdpcy1hY3RpdmUnKTtcbiAgICAgICAgICAgICAgICBkb3QudGFiSW5kZXggPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZG90LmNsYXNzTGlzdC5hZGQoJ2lzLWFjdGl2ZScpO1xuICAgICAgICAgICAgICAgIGRvdC50YWJJbmRleCA9IC0xO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbn0iLCIvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgVGFicyBoYW5kbGVyXG4gICAtIEhhbmRsZXMgdGhlIHRhYnMgY29tcG9uZW50IHdoaWNoIGhhcyB0aGUgcHJvcGVyIGNsYXNzZXMuXG4gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuY29uc3QgVGFic0hhbmRsZXIgPSB7XG4gICAgdGFic0xpc3QgOiBudWxsLFxuICAgIHRhYnMgOiBudWxsLFxuXG4gICAgaW5pdDogZnVuY3Rpb24gKCkge1xuICAgICAgICBUYWJzSGFuZGxlci50YWJzTGlzdCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5qcy10YWJzJyk7XG4gICAgICAgIGNvbnN0IHRhYnNMaXN0Q291bnQgPSBUYWJzSGFuZGxlci50YWJzTGlzdC5sZW5ndGg7XG5cbiAgICAgICAgaWYoaXNzZXQoVGFic0hhbmRsZXIudGFic0xpc3QpICYmIHRhYnNMaXN0Q291bnQgIT09IDApe1xuICAgICAgICAgICAgZm9yKGxldCBpID0gMDsgaSA8IHRhYnNMaXN0Q291bnQ7IGkrKyl7XG4gICAgICAgICAgICAgICAgY29uc3QgdGFicyA9IFRhYnNIYW5kbGVyLnRhYnNMaXN0W2ldO1xuICAgICAgICAgICAgICAgIFRhYnNIYW5kbGVyLmluaXRUYWJzKHRhYnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIGluaXRUYWJzOiBmdW5jdGlvbiAodGFicykge1xuICAgICAgICBjb25zdCBjb250YWluZXIgPSB0YWJzLnF1ZXJ5U2VsZWN0b3IoJy5qcy10YWJzLWNvbnRhaW5lcicpO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIGNvbnRhaW5lciBlbGVtZW50IGV4aXN0c1xuICAgICAgICBpZiAoY29udGFpbmVyID09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYFRoZXJlIGlzIG5vIGNvbnRhaW5lciBmb3IgdGhlIGNvbnRlbnQgdGFicyBkZWZpbmVkLmApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdHJpZ2dlcnMgPSB0YWJzLnF1ZXJ5U2VsZWN0b3JBbGwoJy5qcy10YWJzLXRyaWdnZXInKTtcbiAgICAgICAgY29uc3QgdGFic0NvbnRlbnQgPSBjb250YWluZXIucXVlcnlTZWxlY3RvckFsbCgnLmpzLXRhYnMtY29udGVudCcpO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIG51bWJlciBvZiB0cmlnZ2VycyBhbmQgdGFicyBtYXRjaFxuICAgICAgICBpZih0cmlnZ2Vycy5sZW5ndGggIT09IHRhYnMubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGBUaGVyZSBhcmUgJHt0cmlnZ2Vycy5sZW5ndGh9IHRyaWdnZXIgYnV0dG9ucyBhbmQgJHt0YWJzLmxlbmd0aH0gdGFicy4gVGhlc2UgbXVzdCBtYXRjaC5gKVxuICAgICAgICB9XG5cbiAgICAgICAgdGFicy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uIChldmVudCkge1xuXG4gICAgICAgICAgICAvLyBDaGVjayBpZiBjbGlja2VkIG9uIGEgc3RlcCBidXR0b24gKHByZXYgb3IgbmV4dClcbiAgICAgICAgICAgIGlmKGV2ZW50LnRhcmdldC5jbG9zZXN0KCcuanMtdGFicy1zdGVwJykpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkaXIgPSBldmVudC50YXJnZXQuY2xvc2VzdCgnLmpzLXRhYnMtc3RlcCcpLmdldEF0dHJpYnV0ZSgnZGF0YS1zdGVwJyk7XG4gICAgICAgICAgICAgICAgVGFic0hhbmRsZXIuc3RlcFRhYnMoZGlyLCB0cmlnZ2VycywgdGFic0NvbnRlbnQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBCYWlsIGlmIHdlIGRpZG4ndCBjbGljayBvbiB0aGUgdHJpZ2dlciBlbGVtZW50XG4gICAgICAgICAgICBpZiAoIWV2ZW50LnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoJ2pzLXRhYnMtdHJpZ2dlcicpKSByZXR1cm47XG5cbiAgICAgICAgICAgIC8vIEJhaWwgaWYgYWxyZWFkeSBhY3RpdmVcbiAgICAgICAgICAgIGlmIChldmVudC50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCdpcy1hY3RpdmUnKSkgeyByZXR1cm47IH1cblxuICAgICAgICAgICAgVGFic0hhbmRsZXIudG9nZ2xlVGFicyhldmVudC50YXJnZXQuZGF0YXNldC50YWJJZCwgdHJpZ2dlcnMsIHRhYnNDb250ZW50KTtcblxuICAgICAgICB9KTtcbiAgICB9LFxuXG4gICAgdG9nZ2xlVGFiczogZnVuY3Rpb24gKHRhYklkLCB0cmlnZ2VycywgdGFic0NvbnRlbnQpIHtcblxuICAgICAgICBpZihpc3NldCh0cmlnZ2VycykgJiYgdHJpZ2dlcnMubGVuZ3RoID4gMCl7XG5cbiAgICAgICAgICAgIC8vIExvb3AgdGhyb3VnaCBhbGwgdGFic1xuICAgICAgICAgICAgZm9yKGxldCBpID0gMDsgaSA8IHRyaWdnZXJzLmxlbmd0aDsgaSsrKXtcbiAgICAgICAgICAgICAgICBjb25zdCB0YWJzVGFiID0gdGFic0NvbnRlbnRbaV07XG4gICAgICAgICAgICAgICAgY29uc3QgdGFic1RyaWdnZXIgPSB0cmlnZ2Vyc1tpXTtcblxuICAgICAgICAgICAgICAgIHRhYnNUcmlnZ2VyLmNsYXNzTGlzdC5yZW1vdmUoJ2lzLWFjdGl2ZScpO1xuICAgICAgICAgICAgICAgIHRhYnNUcmlnZ2VyLnRhYkluZGV4ID0gMDtcbiAgICAgICAgICAgICAgICB0YWJzVGFiLmNsYXNzTGlzdC5yZW1vdmUoJ2lzLWFjdGl2ZScpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHRhYnNUYWIuZGF0YXNldC50YWJJZCA9PT0gdGFiSWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGFic1RyaWdnZXIuY2xhc3NMaXN0LmFkZCgnaXMtYWN0aXZlJyk7XG4gICAgICAgICAgICAgICAgICAgIHRhYnNUcmlnZ2VyLnRhYkluZGV4ID0gLTE7XG4gICAgICAgICAgICAgICAgICAgIHRhYnNUYWIuY2xhc3NMaXN0LmFkZCgnaXMtYWN0aXZlJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIHN0ZXBUYWJzOiBmdW5jdGlvbiAoZGlyLCB0cmlnZ2VycywgdGFic0NvbnRlbnQpIHtcbiAgICAgICAgY29uc3QgdHJpZ2dlckNvdW50ID0gdHJpZ2dlcnMubGVuZ3RoO1xuICAgICAgICBsZXQgYWN0aXZlSWQgPSAxO1xuICAgICAgICBsZXQgbmV3SWQgPSAwO1xuXG4gICAgICAgIGlmKGlzc2V0KHRyaWdnZXJzKSAmJiB0cmlnZ2VyQ291bnQgPiAwKXtcblxuICAgICAgICAgICAgLy8gTG9vcCB0aHJvdWdoIGFsbCB0YWJzXG4gICAgICAgICAgICBmb3IobGV0IGkgPSAwOyBpIDwgdHJpZ2dlckNvdW50OyBpKyspe1xuICAgICAgICAgICAgICAgIGNvbnN0IHRhYnNUYWIgPSB0YWJzQ29udGVudFtpXTtcbiAgICAgICAgICAgICAgICBjb25zdCB0YWJzVHJpZ2dlciA9IHRyaWdnZXJzW2ldO1xuXG4gICAgICAgICAgICAgICAgLy8gU2V0IGFjdGl2ZUlkXG4gICAgICAgICAgICAgICAgaWYodGFic1RhYi5jbGFzc0xpc3QuY29udGFpbnMoJ2lzLWFjdGl2ZScpKXtcbiAgICAgICAgICAgICAgICAgICAgYWN0aXZlSWQgPSBOdW1iZXIodGFic1RhYi5nZXRBdHRyaWJ1dGUoJ2RhdGEtdGFiLWlkJykpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIENoZWNrIHdoYXQgbmV4dCBJZCB3aWxsIGJlXG4gICAgICAgICAgICAgICAgaWYoZGlyID09PSAnbmV4dCcpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGl2ZUlkID09PSB0cmlnZ2VyQ291bnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld0lkID0gMDtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld0lkID0gYWN0aXZlSWQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRpciA9PT0gJ3ByZXYnKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChhY3RpdmVJZCA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbmV3SWQgPSB0cmlnZ2VyQ291bnQgLSAxO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbmV3SWQgPSBhY3RpdmVJZCAtIDI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBSZW1vdmUgYWN0aXZlIGNsYXNzXG4gICAgICAgICAgICAgICAgdGFic1RyaWdnZXIudGFiSW5kZXggPSAwO1xuICAgICAgICAgICAgICAgIHRhYnNUYWIuY2xhc3NMaXN0LnJlbW92ZSgnaXMtYWN0aXZlJyk7XG4gICAgICAgICAgICAgICAgdGFic1RyaWdnZXIuY2xhc3NMaXN0LnJlbW92ZSgnaXMtYWN0aXZlJyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRyaWdnZXJzW25ld0lkXS50YWJJbmRleCA9IC0xO1xuICAgICAgICAgICAgdHJpZ2dlcnNbbmV3SWRdLmNsYXNzTGlzdC5hZGQoJ2lzLWFjdGl2ZScpO1xuICAgICAgICAgICAgdGFic1tuZXdJZF0uY2xhc3NMaXN0LmFkZCgnaXMtYWN0aXZlJyk7XG5cbiAgICAgICAgfVxuICAgIH1cbn07XG5cblRhYnNIYW5kbGVyLmluaXQoKTsiLCIvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIFlvdXR1YmUgaGFuZGxlclxuID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cbmNvbnN0IFlvdXR1YmVIYW5kbGVyID0ge1xuXG4gICAgeW91dHViZUNsYXNzIDogJy5qcy15b3V0dWJlLXBsYXllcicsXG4gICAgcGxheWVyczogW10sXG5cbiAgICBpbml0IDogZnVuY3Rpb24oKVxuICAgIHtcbiAgICAgICAgLy8gR2V0IHRoZSB5b3V0dWJlIHBsYXllcnMgY29udGFpbmVyc1xuICAgICAgICBjb25zdCB5b3V0dWJlUGxheWVycyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoWW91dHViZUhhbmRsZXIueW91dHViZUNsYXNzKTtcbiAgICAgICAgY29uc3QgeW91dHViZVBsYXllcnNBbW91bnQgPSB5b3V0dWJlUGxheWVycy5sZW5ndGg7XG5cbiAgICAgICAgZm9yKGxldCBpID0gMDsgaSA8IHlvdXR1YmVQbGF5ZXJzQW1vdW50OyBpKyspe1xuXG4gICAgICAgICAgICBjb25zdCB5b3V0dWJlUGxheWVyID0geW91dHViZVBsYXllcnNbaV07XG5cblxuICAgICAgICAgICAgY29uc3QgeW91dHViZVBsYXllcklkID0geW91dHViZVBsYXllci5nZXRBdHRyaWJ1dGUoJ2lkJyk7XG4gICAgICAgICAgICBpZih5b3V0dWJlUGxheWVySWQgIT09IG51bGwgKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIC8vIFN0cmlwIHRoZSBuZWNlc3NhcnkgZGF0YSBmcm9tIHRoZSBodG1sIGFuZCBjcmVhdGUgb2JqZWN0cyBmcm9tIGl0XG4gICAgICAgICAgICAgICAgY29uc3QgeW91dHViZUVsZW1lbnQgPSB7XG4gICAgICAgICAgICAgICAgICAgIGlkOiB5b3V0dWJlUGxheWVyLmdldEF0dHJpYnV0ZSgnaWQnKSxcbiAgICAgICAgICAgICAgICAgICAgbGluazogeW91dHViZVBsYXllci5nZXRBdHRyaWJ1dGUoJ2RhdGEteW91dHViZS1saW5rJyksXG4gICAgICAgICAgICAgICAgICAgIGF1dG9QbGF5OiBwYXJzZUludCh5b3V0dWJlUGxheWVyLmdldEF0dHJpYnV0ZSgnZGF0YS1hdXRvLXBsYXknKSksXG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIFlvdXR1YmVIYW5kbGVyLnBsYXllcnMucHVzaCh5b3V0dWJlRWxlbWVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNle1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRWxlbWVudCBub3QgaW5jbHVkZSBiZWNhdXNlIHRoZXJlIGlzbid0IGEgaWQgb24gdGhlIHBsYXllclwiKTtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyh5b3V0dWJlUGxheWVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmKHlvdXR1YmVQbGF5ZXJzQW1vdW50ID49IDEpIFlvdXR1YmVIYW5kbGVyLmluaXRZb3V0dWJlKCk7XG5cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgZXh0ZXJuYWwgc2NyaXB0IGlzIGxvYWRlZFxuICAgICAqXG4gICAgICovXG4gICAgaW5pdFlvdXR1YmU6IGZ1bmN0aW9uKCkge1xuICAgICAgICAvLyBTZWUgaWYgWVQgdmFyaWFibGUgZXhpc3RzXG4gICAgICAgIGlmICh0eXBlb2YoWVQpID09ICd1bmRlZmluZWQnIHx8IHR5cGVvZihZVC5QbGF5ZXIpID09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAvLyBTZXR1cCBBUEkgcmVhZHkgZnVuY3Rpb25cbiAgICAgICAgICAgIHdpbmRvdy5vbllvdVR1YmVQbGF5ZXJBUElSZWFkeSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIFlvdXR1YmVIYW5kbGVyLmxvYWRQbGF5ZXJzKCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgLy8gTG9hZCBleHRlcm5hbCBzY3JpcHRcbiAgICAgICAgICAgIGdldFNjcmlwdCgnaHR0cHM6Ly93d3cueW91dHViZS5jb20vaWZyYW1lX2FwaScpO1xuICAgICAgICAgICAgLy8gSWYgWVQgYWxyZWFkeSBleGlzdHMgbG9hZCBwbGF5ZXJcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIFlvdXR1YmVIYW5kbGVyLmxvYWRQbGF5ZXJzKCk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIHRoZSBZb3V0dWJlIHBsYXllcihzKSB3aXRoIHBhcmFtZXRlcnNcbiAgICAgKiBBbmQgcmV3cml0ZSB0aGUgcGxheWVycyB0byBrZXkgdGhlbSBieSB0aGUgZWxlbWVudCBpZFxuICAgICAqXG4gICAgICovXG4gICAgbG9hZFBsYXllcnM6IGZ1bmN0aW9uKCkge1xuXG4gICAgICAgIGxldCBwbGF5ZXJzID0gW107XG5cbiAgICAgICAgY29uc3QgeW91dHViZVBsYXllcnNBbW91bnQgPSBZb3V0dWJlSGFuZGxlci5wbGF5ZXJzLmxlbmd0aDtcbiAgICAgICAgZm9yKGxldCBpID0gMDsgaSA8IHlvdXR1YmVQbGF5ZXJzQW1vdW50OyBpKyspe1xuXG4gICAgICAgICAgICBsZXQgeW91dHViZVBsYXllciA9IFlvdXR1YmVIYW5kbGVyLnBsYXllcnNbaV07XG5cbiAgICAgICAgICAgIC8vIExvYWQgcGxheWVyXG4gICAgICAgICAgICB5b3V0dWJlUGxheWVyLnBsYXllciA9IG5ldyBZVC5QbGF5ZXIoeW91dHViZVBsYXllci5pZCx7XG4gICAgICAgICAgICAgICAgaGVpZ2h0OiAyMDAsXG4gICAgICAgICAgICAgICAgd2lkdGg6IDIwMCxcbiAgICAgICAgICAgICAgICB2aWRlb0lkOiB5b3V0dWJlUGxheWVyLmxpbmssXG4gICAgICAgICAgICAgICAgaG9zdDogJ2h0dHBzOi8vd3d3LnlvdXR1YmUtbm9jb29raWUuY29tJyxcbiAgICAgICAgICAgICAgICBwbGF5ZXJWYXJzOiB7XG4gICAgICAgICAgICAgICAgICAgIG1vZGVzdGJyYW5kaW5nOiAwLFxuICAgICAgICAgICAgICAgICAgICByZWw6IDAsXG4gICAgICAgICAgICAgICAgICAgIGRpc2FibGVrYjogMSxcbiAgICAgICAgICAgICAgICAgICAgYXV0b3BsYXk6IHlvdXR1YmVQbGF5ZXIuYXV0b1BsYXlcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGV2ZW50czoge1xuICAgICAgICAgICAgICAgICAgICAvLyAnb25SZWFkeSc6IFlvdXR1YmVIYW5kbGVyLm9uUmVhZHksXG4gICAgICAgICAgICAgICAgICAgICdvblN0YXRlQ2hhbmdlJzogWW91dHViZUhhbmRsZXIub25TdGF0ZUNoYW5nZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBwbGF5ZXJzW3lvdXR1YmVQbGF5ZXIuaWRdID0geW91dHViZVBsYXllcjtcblxuICAgICAgICB9XG5cbiAgICAgICAgWW91dHViZUhhbmRsZXIucGxheWVycyA9IHBsYXllcnM7XG5cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogV2hlbiBwbGF5ZXIgaXMgcmVhZHkgdG8gcGxheVxuICAgICAqL1xuICAgIG9uUmVhZHkgOiBmdW5jdGlvbihldmVudCkge1xuXG4gICAgICAgIGNvbnN0IHBsYXllckNvbnRhaW5lcklkID0gZXZlbnQudGFyZ2V0LmdldElmcmFtZSgpLmdldEF0dHJpYnV0ZSgnaWQnKTtcbiAgICAgICAgY29uc3QgcGxheWVyID0gWW91dHViZUhhbmRsZXIucGxheWVyc1twbGF5ZXJDb250YWluZXJJZF0ucGxheWVyO1xuXG4gICAgICAgIC8vIFNob3cgdmlkZW9cbiAgICAgICAgLy8gc2V0VGltZW91dChmdW5jdGlvbigpeyAkKCcjJyArIHBsYXllckNvbnRhaW5lcklkKS5zdG9wKCkuYW5pbWF0ZSh7IG9wYWNpdHk6IDEgfSwxMDAwKSB9LDgwMCk7XG5cbiAgICAgICAgLy8gSWYgbm90IG9uIHRhYmxldCBvciBtb2JpbGUsIHBsYXkgb24gaGlnaCBxdWFsaXR5XG4gICAgICAgIC8vIHBsYXllci5tdXRlKCk7XG4gICAgICAgIC8vIHBsYXllci5wbGF5VmlkZW8oKTtcbiAgICAgICAgLy8gcGxheWVyLnNldFBsYXliYWNrUXVhbGl0eSgnaGQxMDgwJyk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIExpc3RlbmVyIGZvciBZb3V0dWJlIHN0YXRlIGNoYW5nZVxuICAgICAqL1xuICAgIG9uU3RhdGVDaGFuZ2UgOiBmdW5jdGlvbihldmVudCkge1xuXG4gICAgICAgIGNvbnN0IHBsYXllckNvbnRhaW5lcklkID0gZXZlbnQudGFyZ2V0LmdldElmcmFtZSgpLmdldEF0dHJpYnV0ZSgnaWQnKTtcbiAgICAgICAgY29uc3QgcGxheWVyID0gWW91dHViZUhhbmRsZXIucGxheWVyc1twbGF5ZXJDb250YWluZXJJZF0ucGxheWVyO1xuXG4gICAgICAgIGNvbnN0IHZpZGVvU3RhdGUgPSBldmVudC5kYXRhO1xuXG4gICAgICAgIC8vIExvb3AgdmlkZW9cbiAgICAgICAgaWYgKGV2ZW50LmRhdGEgPT09IFlULlBsYXllclN0YXRlLkVOREVEICkge1xuICAgICAgICAgICAgcGxheWVyLnBsYXlWaWRlbygpO1xuICAgICAgICB9XG4gICAgfVxufTtcblxuWW91dHViZUhhbmRsZXIuaW5pdCgpOyIsIi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICBCcm93c2VyIEhhbmRsZXJcbiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG5jb25zdCBCcm93c2VySGFuZGxlciA9IHtcblxuICAgIHVzZXJBZ2VudDogJycsXG4gICAgYnJvd3NlckluZm86ICcnLFxuXG5cbiAgICBpbml0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIEJyb3dzZXJIYW5kbGVyLnVzZXJBZ2VudCA9IHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50O1xuICAgICAgICBCcm93c2VySGFuZGxlci5icm93c2VySW5mbyA9IEJyb3dzZXJIYW5kbGVyLmdldEJyb3dzZXJJbmZvKCk7XG4gICAgICAgIEJyb3dzZXJIYW5kbGVyLmhhbmRsZUlFKCk7XG4gICAgICAgIEJyb3dzZXJIYW5kbGVyLmhhbmRsZVNhZmFyaSgpO1xuICAgIH0sXG5cbiAgICBoYW5kbGVJRTogZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIC8vIERldGVjdCB2ZXJzaW9ucyBiZWxvdyBpZTExXG4gICAgICAgIGxldCBtc2llID0gQnJvd3NlckhhbmRsZXIudXNlckFnZW50LmluZGV4T2YoJ01TSUUgJyk7XG4gICAgICAgIGNvbnN0IGllbHQxMSA9IG1zaWUgPiAwO1xuXG4gICAgICAgIC8vIERldGVjdCBpZTExXG4gICAgICAgIGNvbnN0IGllMTEgPSAhIW5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1RyaWRlbnQuKnJ2XFw6MTFcXC4vKTtcblxuICAgICAgICAvLyBJZiBJbnRlcm5ldCBFeHBsb3JlclxuICAgICAgICBpZiAoaWVsdDExIHx8IGllMTEpIHtcbiAgICAgICAgICAgIC8vIERlZmF1bHQgdmVyc2lvblxuICAgICAgICAgICAgbGV0IHZlcnNpb24gPSAnMTEnO1xuXG4gICAgICAgICAgICAvLyBXYXkgdG8gZGV0ZWN0IHZlcnNpb24gPCAxMVxuICAgICAgICAgICAgaWYgKGllbHQxMSkgdmVyc2lvbiA9IHBhcnNlSW50KEJyb3dzZXJIYW5kbGVyLnVzZXJBZ2VudC5zdWJzdHJpbmcoXG4gICAgICAgICAgICAgICAgbXNpZSArIDUsXG4gICAgICAgICAgICAgICAgQnJvd3NlckhhbmRsZXIudXNlckFnZW50LmluZGV4T2YoXCIuXCIsIG1zaWUpXG4gICAgICAgICAgICApKTtcblxuICAgICAgICAgICAgLy8gQXBwZW5kIGNsYXNzZXMgdG8gSFRNTCAod2UgaGF2ZSB0byBkbyB0aGlzIHNlcGFyYXRlbHkgYmVjYXVzZSBlbHNlIGllIHdpbGwgZmFpbClcbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgnaWUnKTtcbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgndicrdmVyc2lvbik7XG4gICAgICAgIH1cblxuICAgIH0sXG5cbiAgICAvLyBGYWxsYmFjayBmb3Igb2xkZXIgc2FmYXJpIHZlcnNpb25cbiAgICBoYW5kbGVTYWZhcmk6IGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBpZihCcm93c2VySGFuZGxlci5icm93c2VySW5mby5uYW1lID09PSAnU2FmYXJpJyAmJiBCcm93c2VySGFuZGxlci5icm93c2VySW5mby52ZXJzaW9uIDw9IDEwKXtcbiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdodG1sJylbMF0uY2xhc3NMaXN0LmFkZCgnaWUnKTtcbiAgICAgICAgfVxuXG4gICAgfSxcblxuICAgIGdldEJyb3dzZXJJbmZvOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGxldCB1YT1uYXZpZ2F0b3IudXNlckFnZW50LHRlbSxNPXVhLm1hdGNoKC8ob3BlcmF8Y2hyb21lfHNhZmFyaXxmaXJlZm94fG1zaWV8dHJpZGVudCg/PVxcLykpXFwvP1xccyooXFxkKykvaSkgfHwgW107XG4gICAgICAgIGlmKC90cmlkZW50L2kudGVzdChNWzFdKSl7XG4gICAgICAgICAgICB0ZW09L1xcYnJ2WyA6XSsoXFxkKykvZy5leGVjKHVhKSB8fCBbXTtcbiAgICAgICAgICAgIHJldHVybiB7bmFtZTonSUUgJyx2ZXJzaW9uOih0ZW1bMV18fCcnKX07XG4gICAgICAgIH1cbiAgICAgICAgaWYoTVsxXT09PSdDaHJvbWUnKXtcbiAgICAgICAgICAgIHRlbT11YS5tYXRjaCgvXFxiT1BSXFwvKFxcZCspLylcbiAgICAgICAgICAgIGlmKHRlbSE9bnVsbCkgICB7cmV0dXJuIHtuYW1lOidPcGVyYScsIHZlcnNpb246dGVtWzFdfTt9XG4gICAgICAgIH1cbiAgICAgICAgTT1NWzJdPyBbTVsxXSwgTVsyXV06IFtuYXZpZ2F0b3IuYXBwTmFtZSwgbmF2aWdhdG9yLmFwcFZlcnNpb24sICctPyddO1xuICAgICAgICBpZigodGVtPXVhLm1hdGNoKC92ZXJzaW9uXFwvKFxcZCspL2kpKSE9bnVsbCkge00uc3BsaWNlKDEsMSx0ZW1bMV0pO31cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5hbWU6IE1bMF0sXG4gICAgICAgICAgICB2ZXJzaW9uOiBNWzFdXG4gICAgICAgIH07XG4gICAgfVxufTtcblxuQnJvd3NlckhhbmRsZXIuaW5pdCgpOyIsIi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgSGVscGVyIGZ1bmN0aW9uc1xuID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cbi8qXG4gKiBTaW1wbGUgaXNzZXQgbWV0aG9kIGZvciB0aGlzIGRvZXMgbm90IGV4aXN0IGluIGphdmFzY3JpcHRcbiAqL1xud2luZG93Lmlzc2V0ID0gZnVuY3Rpb24gKG9iaikge1xuICAgIHJldHVybiB0eXBlb2Ygb2JqICE9PSAndW5kZWZpbmVkJyAmJiBvYmogIT09IG51bGw7XG59O1xuXG4vKlxuICogRWFzaW5nIEZ1bmN0aW9ucyAtIGluc3BpcmVkIGZyb20gaHR0cDovL2dpem1hLmNvbS9lYXNpbmcvXG4gKiBvbmx5IGNvbnNpZGVyaW5nIHRoZSB0IHZhbHVlIGZvciB0aGUgcmFuZ2UgWzAsIDFdID0+IFswLCAxXVxuICovXG53aW5kb3cuRWFzaW5nRnVuY3Rpb25zID0ge1xuICAgIC8vIG5vIGVhc2luZywgbm8gYWNjZWxlcmF0aW9uXG4gICAgbGluZWFyOiBmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gdFxuICAgIH0sXG4gICAgLy8gYWNjZWxlcmF0aW5nIGZyb20gemVybyB2ZWxvY2l0eVxuICAgIGVhc2VJblF1YWQ6IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHJldHVybiB0ICogdFxuICAgIH0sXG4gICAgLy8gZGVjZWxlcmF0aW5nIHRvIHplcm8gdmVsb2NpdHlcbiAgICBlYXNlT3V0UXVhZDogZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIHQgKiAoMiAtIHQpXG4gICAgfSxcbiAgICAvLyBhY2NlbGVyYXRpb24gdW50aWwgaGFsZndheSwgdGhlbiBkZWNlbGVyYXRpb25cbiAgICBlYXNlSW5PdXRRdWFkOiBmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gdCA8IC41ID8gMiAqIHQgKiB0IDogLTEgKyAoNCAtIDIgKiB0KSAqIHRcbiAgICB9LFxuICAgIC8vIGFjY2VsZXJhdGluZyBmcm9tIHplcm8gdmVsb2NpdHlcbiAgICBlYXNlSW5DdWJpYzogZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIHQgKiB0ICogdFxuICAgIH0sXG4gICAgLy8gZGVjZWxlcmF0aW5nIHRvIHplcm8gdmVsb2NpdHlcbiAgICBlYXNlT3V0Q3ViaWM6IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHJldHVybiAoLS10KSAqIHQgKiB0ICsgMVxuICAgIH0sXG4gICAgLy8gYWNjZWxlcmF0aW9uIHVudGlsIGhhbGZ3YXksIHRoZW4gZGVjZWxlcmF0aW9uXG4gICAgZWFzZUluT3V0Q3ViaWM6IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHJldHVybiB0IDwgLjUgPyA0ICogdCAqIHQgKiB0IDogKHQgLSAxKSAqICgyICogdCAtIDIpICogKDIgKiB0IC0gMikgKyAxXG4gICAgfSxcbiAgICAvLyBhY2NlbGVyYXRpbmcgZnJvbSB6ZXJvIHZlbG9jaXR5XG4gICAgZWFzZUluUXVhcnQ6IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHJldHVybiB0ICogdCAqIHQgKiB0XG4gICAgfSxcbiAgICAvLyBkZWNlbGVyYXRpbmcgdG8gemVybyB2ZWxvY2l0eVxuICAgIGVhc2VPdXRRdWFydDogZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIDEgLSAoLS10KSAqIHQgKiB0ICogdFxuICAgIH0sXG4gICAgLy8gYWNjZWxlcmF0aW9uIHVudGlsIGhhbGZ3YXksIHRoZW4gZGVjZWxlcmF0aW9uXG4gICAgZWFzZUluT3V0UXVhcnQ6IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHJldHVybiB0IDwgLjUgPyA4ICogdCAqIHQgKiB0ICogdCA6IDEgLSA4ICogKC0tdCkgKiB0ICogdCAqIHRcbiAgICB9LFxuICAgIC8vIGFjY2VsZXJhdGluZyBmcm9tIHplcm8gdmVsb2NpdHlcbiAgICBlYXNlSW5RdWludDogZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIHQgKiB0ICogdCAqIHQgKiB0XG4gICAgfSxcbiAgICAvLyBkZWNlbGVyYXRpbmcgdG8gemVybyB2ZWxvY2l0eVxuICAgIGVhc2VPdXRRdWludDogZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIDEgKyAoLS10KSAqIHQgKiB0ICogdCAqIHRcbiAgICB9LFxuICAgIC8vIGFjY2VsZXJhdGlvbiB1bnRpbCBoYWxmd2F5LCB0aGVuIGRlY2VsZXJhdGlvblxuICAgIGVhc2VJbk91dFF1aW50OiBmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gdCA8IC41ID8gMTYgKiB0ICogdCAqIHQgKiB0ICogdCA6IDEgKyAxNiAqICgtLXQpICogdCAqIHQgKiB0ICogdFxuICAgIH1cbn07XG5cbi8qXG4gKiBWYW5pbGxhIHZlcnNpb24gb2YgdGhlICQuZ2V0U2NyaXB0XG4gKi9cbndpbmRvdy5nZXRTY3JpcHQgPSBmdW5jdGlvbiAoc291cmNlLCBjYWxsYmFjaykge1xuICAgIGxldCBzY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtcbiAgICBzY3JpcHQuYXN5bmMgPSAxO1xuXG4gICAgd2luZG93LnNjcmlwdHMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnc2NyaXB0Jyk7XG4gICAgbGV0IHByaW9yID0gc2NyaXB0c1tzY3JpcHRzLmxlbmd0aCAtIDFdO1xuXG4gICAgc2NyaXB0Lm9ubG9hZCA9IHNjcmlwdC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbiAoXywgaXNBYm9ydCkge1xuICAgICAgICBpZiAoaXNBYm9ydCB8fCAhc2NyaXB0LnJlYWR5U3RhdGUgfHwgL2xvYWRlZHxjb21wbGV0ZS8udGVzdChzY3JpcHQucmVhZHlTdGF0ZSkpIHtcbiAgICAgICAgICAgIHNjcmlwdC5vbmxvYWQgPSBzY3JpcHQub25yZWFkeXN0YXRlY2hhbmdlID0gbnVsbDtcbiAgICAgICAgICAgIHNjcmlwdCA9IHVuZGVmaW5lZDtcblxuICAgICAgICAgICAgaWYgKCFpc0Fib3J0KSB7XG4gICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrKSBjYWxsYmFjaygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcblxuICAgIHNjcmlwdC5zcmMgPSBzb3VyY2U7XG4gICAgcHJpb3IucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoc2NyaXB0LCBwcmlvcik7XG59O1xuXG4vKipcbiAqIFJldHVybnMgYSBmdW5jdGlvbiwgdGhhdCwgYXMgbG9uZyBhcyBpdCBjb250aW51ZXMgdG8gYmUgaW52b2tlZCwgd2lsbCBub3RcbiAqIGJlIHRyaWdnZXJlZC4gVGhlIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIGFmdGVyIGl0IHN0b3BzIGJlaW5nIGNhbGxlZCBmb3JcbiAqIE4gbWlsbGlzZWNvbmRzLiBJZiBgaW1tZWRpYXRlYCBpcyBwYXNzZWQsIHRyaWdnZXIgdGhlIGZ1bmN0aW9uIG9uIHRoZVxuICogbGVhZGluZyBlZGdlLCBpbnN0ZWFkIG9mIHRoZSB0cmFpbGluZy5cbiAqIEBwYXJhbSBmdW5jXG4gKiBAcGFyYW0gd2FpdFxuICogQHBhcmFtIGltbWVkaWF0ZVxuICogQHJldHVybnMge0Z1bmN0aW9ufVxuICovXG53aW5kb3cuZGVib3VuY2UgPSBmdW5jdGlvbihmdW5jLCB3YWl0LCBpbW1lZGlhdGUpIHtcbiAgICBsZXQgdGltZW91dDtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICBsZXQgY29udGV4dCA9IHRoaXMsIGFyZ3MgPSBhcmd1bWVudHM7XG4gICAgICAgIGxldCBsYXRlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHRpbWVvdXQgPSBudWxsO1xuICAgICAgICAgICAgaWYgKCFpbW1lZGlhdGUpIGZ1bmMuYXBwbHkoY29udGV4dCwgYXJncyk7XG4gICAgICAgIH07XG4gICAgICAgIGxldCBjYWxsTm93ID0gaW1tZWRpYXRlICYmICF0aW1lb3V0O1xuICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dCk7XG4gICAgICAgIHRpbWVvdXQgPSBzZXRUaW1lb3V0KGxhdGVyLCB3YWl0KTtcbiAgICAgICAgaWYgKGNhbGxOb3cpIGZ1bmMuYXBwbHkoY29udGV4dCwgYXJncyk7XG4gICAgfTtcbn07XG5cbi8qXG4gKiBDb29raWUgaGVscGVyIGNsYXNzXG4gKi9cbndpbmRvdy5Db29raWUgPSB7XG4gICAgc2V0OiBmdW5jdGlvbiAobmFtZSwgdmFsdWUsIGRheXMpIHtcbiAgICAgICAgbGV0IGRvbWFpbiwgZG9tYWluUGFydHMsIGRhdGUsIGV4cGlyZXMsIGhvc3Q7XG5cbiAgICAgICAgaWYgKGRheXMpIHtcbiAgICAgICAgICAgIGRhdGUgPSBuZXcgRGF0ZSgpO1xuICAgICAgICAgICAgZGF0ZS5zZXRUaW1lKGRhdGUuZ2V0VGltZSgpICsgKGRheXMgKiAyNCAqIDYwICogNjAgKiAxMDAwKSk7XG4gICAgICAgICAgICBleHBpcmVzID0gXCI7IGV4cGlyZXM9XCIgKyBkYXRlLnRvR01UU3RyaW5nKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBleHBpcmVzID0gXCJcIjtcbiAgICAgICAgfVxuXG4gICAgICAgIGhvc3QgPSBsb2NhdGlvbi5ob3N0O1xuICAgICAgICBpZiAoaXNJUE9yTG9jYWxIb3N0KGxvY2F0aW9uLmhvc3RuYW1lKSkge1xuICAgICAgICAgICAgZG9jdW1lbnQuY29va2llID0gbmFtZSArIFwiPVwiICsgdmFsdWUgKyBleHBpcmVzICsgXCI7IHBhdGg9L1wiO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gUmVtZW1iZXIgdGhlIGNvb2tpZSBvbiBhbGwgc3ViIGRvbWFpbnMuXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy8gU3RhcnQgd2l0aCB0cnlpbmcgdG8gc2V0IGNvb2tpZSB0byB0aGUgdG9wIGRvbWFpbi5cbiAgICAgICAgICAgIC8vIChleGFtcGxlOiBpZiB1c2VyIGlzIG9uIGZvby5jb20sIHRyeSB0byBzZXRcbiAgICAgICAgICAgIC8vICBjb29raWUgdG8gZG9tYWluIFwiLmNvbVwiKVxuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vIElmIHRoZSBjb29raWUgd2lsbCBub3QgYmUgc2V0LCBpdCBtZWFucyBcIi5jb21cIlxuICAgICAgICAgICAgLy8gaXMgYSB0b3AgbGV2ZWwgZG9tYWluIGFuZCB3ZSBuZWVkIHRvXG4gICAgICAgICAgICAvLyBzZXQgdGhlIGNvb2tpZSB0byBcIi5mb28uY29tXCJcbiAgICAgICAgICAgIGRvbWFpblBhcnRzID0gaG9zdC5zcGxpdCgnLicpO1xuICAgICAgICAgICAgZG9tYWluUGFydHMuc2hpZnQoKTtcbiAgICAgICAgICAgIGRvbWFpbiA9ICcuJyArIGRvbWFpblBhcnRzLmpvaW4oJy4nKTtcblxuICAgICAgICAgICAgLy8gRm9yIGRldmVsb3BtZW50IHB1cnBvc2UsIHJlbW92ZSB0aGlzIHdoZW4gbW92aW5nIHRvIHByb2R1Y3Rpb25cbiAgICAgICAgICAgIC8vIGRvbWFpbiA9ICcua29tbWEucHJvJztcblxuICAgICAgICAgICAgZG9jdW1lbnQuY29va2llID0gbmFtZSArIFwiPVwiICsgdmFsdWUgKyBleHBpcmVzICsgXCI7IHBhdGg9LzsgZG9tYWluPVwiICsgZG9tYWluO1xuXG4gICAgICAgICAgICAvLyBjaGVjayBpZiBjb29raWUgd2FzIHN1Y2Nlc3NmdWx5IHNldCB0byB0aGUgZ2l2ZW4gZG9tYWluXG4gICAgICAgICAgICAvLyAob3RoZXJ3aXNlIGl0IHdhcyBhIFRvcC1MZXZlbCBEb21haW4pXG4gICAgICAgICAgICBpZiAoQ29va2llLmdldChuYW1lKSA9PSBudWxsIHx8IENvb2tpZS5nZXQobmFtZSkgIT0gdmFsdWUpIHtcbiAgICAgICAgICAgICAgICAvLyBhcHBlbmQgXCIuXCIgdG8gY3VycmVudCBkb21haW5cbiAgICAgICAgICAgICAgICBkb21haW4gPSAnLicgKyBob3N0O1xuICAgICAgICAgICAgICAgIGRvY3VtZW50LmNvb2tpZSA9IG5hbWUgKyBcIj1cIiArIHZhbHVlICsgZXhwaXJlcyArIFwiOyBwYXRoPS87IGRvbWFpbj1cIiArIGRvbWFpbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBnZXQ6IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgIHdpbmRvdy5uYW1lRVEgPSBuYW1lICsgXCI9XCI7XG4gICAgICAgIHdpbmRvdy5jYSA9IGRvY3VtZW50LmNvb2tpZS5zcGxpdCgnOycpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNhLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgYyA9IGNhW2ldO1xuICAgICAgICAgICAgd2hpbGUgKGMuY2hhckF0KDApID09PSAnICcpIHtcbiAgICAgICAgICAgICAgICBjID0gYy5zdWJzdHJpbmcoMSwgYy5sZW5ndGgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoYy5pbmRleE9mKG5hbWVFUSkgPT09IDApIHJldHVybiBjLnN1YnN0cmluZyhuYW1lRVEubGVuZ3RoLCBjLmxlbmd0aCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSxcblxuICAgIGVyYXNlOiBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICBDb29raWUuc2V0KG5hbWUsICcnLCAtMSk7XG4gICAgfSxcblxuXG59O1xuXG53aW5kb3cuaXNJUE9yTG9jYWxIb3N0ID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICByZXR1cm4gKFxuICAgICAgICBpc0lwQWRkcmVzcyh2YWx1ZSkgfHxcbiAgICAgICAgKHZhbHVlID09PSAnbG9jYWxob3N0JylcbiAgICApXG59O1xuXG53aW5kb3cuaXNJcEFkZHJlc3MgPSBmdW5jdGlvbiAoaXBhZGRyZXNzKSB7XG4gICAgcmV0dXJuICgvXigyNVswLTVdfDJbMC00XVswLTldfFswMV0/WzAtOV1bMC05XT8pXFwuKDI1WzAtNV18MlswLTRdWzAtOV18WzAxXT9bMC05XVswLTldPylcXC4oMjVbMC01XXwyWzAtNF1bMC05XXxbMDFdP1swLTldWzAtOV0/KVxcLigyNVswLTVdfDJbMC00XVswLTldfFswMV0/WzAtOV1bMC05XT8pJC8udGVzdChpcGFkZHJlc3MpKVxufTtcblxuLypcbiAqIEphdmFzY3JpcHQgdmVyc2lvbiBvZiB0aGUgbnVtYmVyX2Zvcm1hdCBtZXRob2Qgb2YgUEhQXG4gKi9cbndpbmRvdy5udW1iZXJfZm9ybWF0ID0gZnVuY3Rpb24gKG51bWJlciwgZGVjaW1hbHMsIGRlY19wb2ludCwgdGhvdXNhbmRzX3NlcCkge1xuICAgIC8vIFN0cmlwIGFsbCBjaGFyYWN0ZXJzIGJ1dCBudW1lcmljYWwgb25lcy5cbiAgICBudW1iZXIgPSAobnVtYmVyICsgJycpLnJlcGxhY2UoL1teMC05K1xcLUVlLl0vZywgJycpO1xuICAgIGxldCBuID0gIWlzRmluaXRlKCtudW1iZXIpID8gMCA6ICtudW1iZXIsXG4gICAgICAgIHByZWMgPSAhaXNGaW5pdGUoK2RlY2ltYWxzKSA/IDAgOiBNYXRoLmFicyhkZWNpbWFscyksXG4gICAgICAgIHNlcCA9ICh0eXBlb2YgdGhvdXNhbmRzX3NlcCA9PT0gJ3VuZGVmaW5lZCcpID8gJywnIDogdGhvdXNhbmRzX3NlcCxcbiAgICAgICAgZGVjID0gKHR5cGVvZiBkZWNfcG9pbnQgPT09ICd1bmRlZmluZWQnKSA/ICcuJyA6IGRlY19wb2ludCxcbiAgICAgICAgcyA9ICcnLFxuICAgICAgICB0b0ZpeGVkRml4ID0gZnVuY3Rpb24gKG4sIHByZWMpIHtcbiAgICAgICAgICAgIHZhciBrID0gTWF0aC5wb3coMTAsIHByZWMpO1xuICAgICAgICAgICAgcmV0dXJuICcnICsgTWF0aC5yb3VuZChuICogaykgLyBrO1xuICAgICAgICB9O1xuICAgIC8vIEZpeCBmb3IgSUUgcGFyc2VGbG9hdCgwLjU1KS50b0ZpeGVkKDApID0gMDtcbiAgICBzID0gKHByZWMgPyB0b0ZpeGVkRml4KG4sIHByZWMpIDogJycgKyBNYXRoLnJvdW5kKG4pKS5zcGxpdCgnLicpO1xuICAgIGlmIChzWzBdLmxlbmd0aCA+IDMpIHtcbiAgICAgICAgc1swXSA9IHNbMF0ucmVwbGFjZSgvXFxCKD89KD86XFxkezN9KSsoPyFcXGQpKS9nLCBzZXApO1xuICAgIH1cbiAgICBpZiAoKHNbMV0gfHwgJycpLmxlbmd0aCA8IHByZWMpIHtcbiAgICAgICAgc1sxXSA9IHNbMV0gfHwgJyc7XG4gICAgICAgIHNbMV0gKz0gbmV3IEFycmF5KHByZWMgLSBzWzFdLmxlbmd0aCArIDEpLmpvaW4oJzAnKTtcbiAgICB9XG4gICAgcmV0dXJuIHMuam9pbihkZWMpO1xufTtcblxuXG4vKipcbiAqIEVsZW1lbnQuY2xvc2VzdCgpIHBvbHlmaWxsXG4gKiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRWxlbWVudC9jbG9zZXN0I1BvbHlmaWxsXG4gKi9cbmlmICghRWxlbWVudC5wcm90b3R5cGUuY2xvc2VzdCkge1xuICAgIGlmICghRWxlbWVudC5wcm90b3R5cGUubWF0Y2hlcykge1xuICAgICAgICBFbGVtZW50LnByb3RvdHlwZS5tYXRjaGVzID0gRWxlbWVudC5wcm90b3R5cGUubXNNYXRjaGVzU2VsZWN0b3IgfHwgRWxlbWVudC5wcm90b3R5cGUud2Via2l0TWF0Y2hlc1NlbGVjdG9yO1xuICAgIH1cbiAgICBFbGVtZW50LnByb3RvdHlwZS5jbG9zZXN0ID0gZnVuY3Rpb24gKHMpIHtcbiAgICAgICAgdmFyIGVsID0gdGhpcztcbiAgICAgICAgdmFyIGFuY2VzdG9yID0gdGhpcztcbiAgICAgICAgaWYgKCFkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY29udGFpbnMoZWwpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgZG8ge1xuICAgICAgICAgICAgaWYgKGFuY2VzdG9yLm1hdGNoZXMocykpIHJldHVybiBhbmNlc3RvcjtcbiAgICAgICAgICAgIGFuY2VzdG9yID0gYW5jZXN0b3IucGFyZW50RWxlbWVudDtcbiAgICAgICAgfSB3aGlsZSAoYW5jZXN0b3IgIT09IG51bGwpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9O1xufVxuXG53aW5kb3cuQWpheCA9IHtcblxuICAgIC8vVE9ETzogQ2FuIHdlIGNyZWF0ZSBhIHByZXBhcmUgcmVxdWVzdCBmdW5jdGlvbiA/P1xuXG4gICAgZ2V0OiBmdW5jdGlvbih1cmwsIGNhbGxiYWNrKSB7XG4gICAgICAgIGxldCB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICAgICAgbGV0IHRva2VuID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignbWV0YVtuYW1lPVwiY3NyZi10b2tlblwiXScpLmNvbnRlbnQ7XG5cbiAgICAgICAgeGhyLm9wZW4oJ2dldCcsIHVybCwgdHJ1ZSk7XG4gICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKCdDb250ZW50LVR5cGUnLCAnYXBwbGljYXRpb24vanNvbicpO1xuICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcignWC1DU1JGLVRPS0VOJywgdG9rZW4pO1xuICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcignWC1SZXF1ZXN0ZWQtV2l0aCcsICdYTUxIdHRwUmVxdWVzdCcpO1xuICAgICAgICB4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBpZiAoeGhyLnJlYWR5U3RhdGUgPT09IDQpIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayh4aHIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICB4aHIuc2VuZCgpO1xuICAgIH0sXG5cbiAgICBwb3N0OiBmdW5jdGlvbih1cmwsIGRhdGEsIGNhbGxiYWNrKSB7XG4gICAgICAgIGxldCB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICAgICAgbGV0IHRva2VuID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignbWV0YVtuYW1lPVwiY3NyZi10b2tlblwiXScpLmNvbnRlbnQ7XG5cbiAgICAgICAgeGhyLm9wZW4oJ3Bvc3QnLCB1cmwsIHRydWUpO1xuICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcignQ29udGVudC1UeXBlJywgJ2FwcGxpY2F0aW9uL2pzb24nKTtcbiAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoJ1gtQ1NSRi1UT0tFTicsIHRva2VuKTtcbiAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoJ1gtUmVxdWVzdGVkLVdpdGgnLCAnWE1MSHR0cFJlcXVlc3QnKTtcbiAgICAgICAgeGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgaWYgKHhoci5yZWFkeVN0YXRlID09PSA0KSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2soeGhyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgeGhyLnNlbmQoIEpTT04uc3RyaW5naWZ5KGRhdGEpKTtcbiAgICB9XG59O1xuXG4vKipcbiAqIENhcGl0YWxpemUgdGhlIGZpcnN0IGxldHRlciBvZiB0aGUgc3RyaW5nXG4gKiBAcGFyYW0gc3RyaW5nXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG53aW5kb3cuY2FwaXRhbGl6ZUZpcnN0TGV0dGVyID0gZnVuY3Rpb24gKHN0cmluZykge1xuICAgIHJldHVybiBzdHJpbmcuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBzdHJpbmcuc2xpY2UoMSk7XG59O1xuXG4vKipcbiAqIENvbnZlcnQgc25ha2UgY2FzZSBpbnRvIGNhbWVsY2FzZVxuICpcbiAqIEBwYXJhbSBzdHJpbmdcbiAqIEByZXR1cm5zIHsqfVxuICovXG5mdW5jdGlvbiBzbmFrZVRvQ2FtZWwoc3RyaW5nKXtcbiAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoLyhcXC1cXHcpL2csIGZ1bmN0aW9uKG0pe3JldHVybiBtWzFdLnRvVXBwZXJDYXNlKCk7fSk7XG59XG5cbi8qKlxuICogR2V0IHRoZSBpbmRleCBvZiBhbiBlbGVtZW50IGluc2lkZSBpdHMgcGFyZW50XG4gKi9cbmZ1bmN0aW9uIGluZGV4SW5QYXJlbnQobm9kZSkge1xuICAgIHdpbmRvdy5jaGlsZHJlbiA9IG5vZGUucGFyZW50Tm9kZS5jaGlsZE5vZGVzO1xuICAgIGxldCBudW0gPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGNoaWxkcmVuW2ldID09IG5vZGUpIHJldHVybiBudW07XG4gICAgICAgIGlmIChjaGlsZHJlbltpXS5ub2RlVHlwZSA9PSAxKSBudW0rKztcbiAgICB9XG4gICAgcmV0dXJuIC0xO1xufVxuXG4vKipcbiAqIEZvciBzZWN1cml0eSByZWFzb25zIGlPUyBTYWZhcmkgb25seSBhbGxvd3MgZG9jdW1lbnQuZXhlY0NvbW1hbmQoJ2NvcHknKSBmb3IgdGV4dCB3aXRoaW4gYSBjb250ZW50RWRpdGFibGUgY29udGFpbmVyLlxuICogVGhlIHdvcmthcm91bmQgaXMgdG8gZGV0ZWN0IGlPUyBTYWZhcmkgYW5kIHF1aWNrbHkgdG9nZ2xlIGNvbnRlbnRFZGl0YWJsZSBiZWZvcmUgZXhlY3V0aW5nIGRvY3VtZW50LmV4ZWNDb21tYW5kKCdjb3B5JykuXG4gKiBXaGViIGlucHV0IG9yIHRleHRhcmVhIGlzIFJFQURPTkxZIHlvdSBjYW4gcHJldmVudCB0aGUgdW53YW50ZWQgcG9wdXAgd2l0aCBjb3B5L3Bhc3RlIGZ1bmN0aW9ucyBhbmQgdGhlIGlucHV0IGtleWJvYXJkXG4gKiBDb2RlIGZyb206IGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS80Njk4MTg0N1xuICovXG5mdW5jdGlvbiBjb3B5VG9DbGlwYm9hcmQoZWwpIHtcblxuICAgIC8vIHJlc29sdmUgdGhlIGVsZW1lbnRcbiAgICBlbCA9ICh0eXBlb2YgZWwgPT09ICdzdHJpbmcnKSA/IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoZWwpIDogZWw7XG5cbiAgICAvLyBoYW5kbGUgaU9TIGFzIGEgc3BlY2lhbCBjYXNlXG4gICAgaWYgKG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lwYWR8aXBvZHxpcGhvbmUvaSkpIHtcblxuICAgICAgICAvLyBzYXZlIGN1cnJlbnQgY29udGVudEVkaXRhYmxlL3JlYWRPbmx5IHN0YXR1c1xuICAgICAgICB3aW5kb3cuZWRpdGFibGUgPSBlbC5jb250ZW50RWRpdGFibGU7XG4gICAgICAgIHdpbmRvdy5yZWFkT25seSA9IGVsLnJlYWRPbmx5O1xuXG4gICAgICAgIC8vIGNvbnZlcnQgdG8gZWRpdGFibGUgd2l0aCByZWFkb25seSB0byBzdG9wIGlPUyBrZXlib2FyZCBvcGVuaW5nXG4gICAgICAgIGVsLmNvbnRlbnRFZGl0YWJsZSA9IHRydWU7XG4gICAgICAgIGVsLnJlYWRPbmx5ID0gdHJ1ZTtcblxuICAgICAgICAvLyBjcmVhdGUgYSBzZWxlY3RhYmxlIHJhbmdlXG4gICAgICAgIHZhciByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XG4gICAgICAgIHJhbmdlLnNlbGVjdE5vZGVDb250ZW50cyhlbCk7XG5cbiAgICAgICAgLy8gc2VsZWN0IHRoZSByYW5nZVxuICAgICAgICB3aW5kb3cuc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xuICAgICAgICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7XG4gICAgICAgIHNlbGVjdGlvbi5hZGRSYW5nZShyYW5nZSk7XG4gICAgICAgIGVsLnNldFNlbGVjdGlvblJhbmdlKDAsIDk5OTk5OSk7XG5cbiAgICAgICAgLy8gcmVzdG9yZSBjb250ZW50RWRpdGFibGUvcmVhZE9ubHkgdG8gb3JpZ2luYWwgc3RhdGVcbiAgICAgICAgZWwuY29udGVudEVkaXRhYmxlID0gZWRpdGFibGU7XG4gICAgICAgIGVsLnJlYWRPbmx5ID0gcmVhZE9ubHk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBlbC5zZWxlY3QoKTtcbiAgICB9XG5cbiAgICAvLyBleGVjdXRlIGNvcHkgY29tbWFuZFxuICAgIGRvY3VtZW50LmV4ZWNDb21tYW5kKCdjb3B5Jyk7XG59IiwiLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgIFNjcm9sbCBoYW5kbGVyXG4gICAtIEhhbmRsZXIgdGhlIG9iamVjdHMgd2hpY2ggYXJlIGJpbmQgb24gc2Nyb2xsIGV2ZW50cyBvciB2aXNpYmxlIGluIHZpZXdwb3J0XG4gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuY29uc3QgU2Nyb2xsSGFuZGxlciA9IHtcblxuICAgIC8vIFZhcmlhYmxlcyBmb3IgZGVib3VuY2UgYW5kIHRocm90dGxlIGVmZmVjdHNcbiAgICB0aW1lOiBEYXRlLm5vdygpLFxuICAgIHRpbWVvdXQ6IG51bGwsXG4gICAgd2FpdFRocm90dGxlOiAxMDAwLFxuICAgIHdhaXREZWJvdW5jZTogMzAwLFxuXG4gICAgLy8gVmFyaWFibGVzIGZvciBzY3JvbGwgZGlyZWN0aW9uXG4gICAgbGFzdFNjcm9sbFRvcFBvc2l0aW9uOiAwLFxuICAgIHNjcm9sbERpcmVjdGlvbkRvd246IHRydWUsXG4gICAgc2Nyb2xsRGlyZWN0aW9uVXA6IGZhbHNlLFxuXG4gICAgLy9Jbml0aWFsaXNhdGlvblxuICAgIGluaXQ6IGZ1bmN0aW9uICgpIHtcblxuICAgICAgICAvLyBUcmlnZ2VyIHN0YXJ0IG9uIHN0YXJ0IHVwXG4gICAgICAgIFNjcm9sbEhhbmRsZXIudHJpZ2dlck9uSW5pdCgpO1xuXG4gICAgICAgIC8vIFRocm90dGxlIHNjcm9sbFxuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKChTY3JvbGxIYW5kbGVyLnRpbWUgKyBTY3JvbGxIYW5kbGVyLndhaXRUaHJvdHRsZSAtIERhdGUubm93KCkpIDwgMCkge1xuICAgICAgICAgICAgICAgIFNjcm9sbEhhbmRsZXIudHJpZ2dlclRocm90dGxlKCk7XG4gICAgICAgICAgICAgICAgU2Nyb2xsSGFuZGxlci50aW1lID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gU21vb3RoIHNjcm9sbFxuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgU2Nyb2xsSGFuZGxlci50cmlnZ2VyU21vb3RoKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIERlYm91bmNlIHNjcm9sbFxuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYoaXNzZXQoU2Nyb2xsSGFuZGxlci50aW1lb3V0KSkgY2xlYXJUaW1lb3V0KFNjcm9sbEhhbmRsZXIudGltZW91dCk7XG4gICAgICAgICAgICBTY3JvbGxIYW5kbGVyLnRpbWVvdXQgPSBzZXRUaW1lb3V0KFNjcm9sbEhhbmRsZXIudHJpZ2dlckRlYm91bmNlLCBTY3JvbGxIYW5kbGVyLndhaXREZWJvdW5jZSk7XG4gICAgICAgIH0pO1xuICAgIH0sXG5cbiAgICAvLyBUcmlnZ2VyIG9uIHN0YXJ0IHVwXG4gICAgdHJpZ2dlck9uSW5pdDogZnVuY3Rpb24gKCkge1xuICAgICAgICBTY3JvbGxIYW5kbGVyLnRyaWdnZXJFbGVtZW50SW5WaWV3cG9ydEFuaW1hdGlvbigpO1xuICAgIH0sXG5cbiAgICAvLyBUcmlnZ2VyIHNjcm9sbCBmdW5jdGlvbnMgd2l0aCB0aHJvdHRsZSAocHJlZmVycmVkKVxuICAgIHRyaWdnZXJUaHJvdHRsZTogZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyBjb25zb2xlLmxvZygnVGhyb3R0bGVkIHNjcm9sbCcpO1xuICAgICAgICBTY3JvbGxIYW5kbGVyLnRyaWdnZXJFbGVtZW50SW5WaWV3cG9ydEFuaW1hdGlvbigpO1xuICAgIH0sXG5cbiAgICAvLyBUcmlnZ2VyIHNjcm9sbCBvbiBkZWJvdW5jZVxuICAgIHRyaWdnZXJEZWJvdW5jZTogZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyBjb25zb2xlLmxvZygnRGVib3VuY2Ugc2Nyb2xsJyk7XG4gICAgfSxcblxuICAgIC8vIFRyaWdnZXIgc2Nyb2xsIG9uIHRoZSBmbGlnaHRcbiAgICB0cmlnZ2VyU21vb3RoOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCdTbW9vdGggc2Nyb2xsJyk7XG4gICAgICAgIFNjcm9sbEhhbmRsZXIuZGV0ZWN0U2Nyb2xsRGlyZWN0aW9uKCk7XG4gICAgICAgIFNjcm9sbEhhbmRsZXIudG9nZ2xlU3RpY2t5SGVhZGVyKCk7XG4gICAgfSxcblxuICAgIC8vIERldGVjdCBpZiBwYXJ0IG9mIGEgZ2l2ZW4gZWxlbWVudCBpcyB2aXNpYmxlIGluIHRoZSB2aWV3cG9ydFxuICAgIC8vIEVsIG11c3QgYmUgYSBub2RlIGVsZW1lbnRcbiAgICBkZXRlY3RJZkVsZW1lbnRJc1BhcnRseUluVmlld3BvcnQ6IGZ1bmN0aW9uKGVsKVxuICAgIHtcbiAgICAgICAgaWYoaXNzZXQoZWwpKXtcblxuICAgICAgICAgICAgY29uc3QgcmVjdCA9IGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgLy8gRE9NUmVjdCB7IHg6IDgsIHk6IDgsIHdpZHRoOiAxMDAsIGhlaWdodDogMTAwLCB0b3A6IDgsIHJpZ2h0OiAxMDgsIGJvdHRvbTogMTA4LCBsZWZ0OiA4IH1cbiAgICAgICAgICAgIGNvbnN0IHdpbmRvd0hlaWdodCA9ICh3aW5kb3cuaW5uZXJIZWlnaHQgfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCk7XG4gICAgICAgICAgICBjb25zdCB3aW5kb3dXaWR0aCA9ICh3aW5kb3cuaW5uZXJXaWR0aCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpO1xuXG4gICAgICAgICAgICBjb25zdCB2ZXJ0aWNhbEluVmlldyA9IChyZWN0LnRvcCA8PSAod2luZG93SGVpZ2h0KSkgJiYgKChyZWN0LnRvcCArIHJlY3QuaGVpZ2h0KSA+PSAwKTtcbiAgICAgICAgICAgIGNvbnN0IGhvcml6b250YWxJblZpZXcgPSAocmVjdC5sZWZ0IDw9IHdpbmRvd1dpZHRoKSAmJiAoKHJlY3QubGVmdCArIHJlY3Qud2lkdGgpID49IDApO1xuXG4gICAgICAgICAgICByZXR1cm4gKHZlcnRpY2FsSW5WaWV3ICYmIGhvcml6b250YWxJblZpZXcpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIERldGVjdCBpZiBhIGdpdmVuIGVsZW1lbnQgaXMgZnVsbHkgdmlzaWJsZSBpbiB0aGUgdmlld3BvcnRcbiAgICAvLyBFbCBtdXN0IGJlIGEgbm9kZSBlbGVtZW50XG4gICAgZGV0ZWN0SWZFbGVtZW50SXNGdWxseUluVmlld3BvcnQ6IGZ1bmN0aW9uKGVsKVxuICAgIHtcbiAgICAgICAgaWYoaXNzZXQoZWwpKXtcbiAgICAgICAgICAgIGNvbnN0IHJlY3QgPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICByZWN0LnRvcCA+PSAwICYmXG4gICAgICAgICAgICAgICAgcmVjdC5ib3R0b20gPD0gd2luZG93LmlubmVySGVpZ2h0XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIGRldGVjdFNjcm9sbERpcmVjdGlvbjogZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBzY3JvbGxUb3BQb3NpdGlvbiA9IHdpbmRvdy5wYWdlWU9mZnNldCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wOyAvLyBDcmVkaXRzOiBcImh0dHBzOi8vZ2l0aHViLmNvbS9xZXJlbXkvc28vYmxvYi9tYXN0ZXIvc28uZG9tLmpzI0w0MjZcIlxuICAgICAgICBpZiAoc2Nyb2xsVG9wUG9zaXRpb24gPj0gU2Nyb2xsSGFuZGxlci5sYXN0U2Nyb2xsVG9wUG9zaXRpb24pe1xuICAgICAgICAgICAgU2Nyb2xsSGFuZGxlci5zY3JvbGxEaXJlY3Rpb25Eb3duID0gdHJ1ZTtcbiAgICAgICAgICAgIFNjcm9sbEhhbmRsZXIuc2Nyb2xsRGlyZWN0aW9uVXAgPSBmYWxzZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIFNjcm9sbEhhbmRsZXIuc2Nyb2xsRGlyZWN0aW9uRG93biA9IGZhbHNlO1xuICAgICAgICAgICAgU2Nyb2xsSGFuZGxlci5zY3JvbGxEaXJlY3Rpb25VcCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgU2Nyb2xsSGFuZGxlci5sYXN0U2Nyb2xsVG9wUG9zaXRpb24gPSBzY3JvbGxUb3BQb3NpdGlvbjtcbiAgICB9LFxuXG4gICAgLy8gVHJpZ2dlciBhbmltYXRpb24gb24gZWxlbWVudHMgdGhhdCBoYXZlICdlbGVtZW50LWluLXZpZXdwb3J0JyBhbmQgdGhhdCBhcmUgaW4gdGhlIHZpZXdwb3J0XG4gICAgLy8gVGhlc2UgYW5pbWF0aW9uIGNhbiBvbmx5IGJlIHRyaWdnZXJlZCBvbmNlLCBpZiB5b3Ugd2FudCBtb3JlIHRoZW4gdGhhdCB5b3Ugc2hvdWxkIHdyaXRlIGFuIHNwZWNpZmljIGZ1bmN0aW9uIGZvciB0aGlzXG4gICAgdHJpZ2dlckVsZW1lbnRJblZpZXdwb3J0QW5pbWF0aW9uOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmVsZW1lbnQtaW4tdmlld3BvcnQnKTtcbiAgICAgICAgY29uc3QgZWxlbWVudHNMZW5ndGggPSBlbGVtZW50cy5sZW5ndGg7XG5cbiAgICAgICAgZm9yKGxldCBlID0gMDsgZSA8IGVsZW1lbnRzTGVuZ3RoOyBlKyspe1xuXG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gZWxlbWVudHNbZV07XG4gICAgICAgICAgICBpZihTY3JvbGxIYW5kbGVyLmRldGVjdElmRWxlbWVudElzUGFydGx5SW5WaWV3cG9ydChlbGVtZW50KSl7XG4gICAgICAgICAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdlbGVtZW50LWluLXZpZXdwb3J0Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgIH0sXG5cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ1VTVE9NIFNDUk9MTCBIQU5ETEVSUyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAgIC8vIEhpZGUgb3Igc2hvdyBzdGlja3kgbmF2aWdhdGlvbiB3aGVuIGhlYWRlciBpc24ndCB2aXNpYmxlXG4gICAgdG9nZ2xlU3RpY2t5SGVhZGVyOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHN0aWNreUhlYWRlciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5qcy1zdGlja3ktaGVhZGVyJyk7XG4gICAgICAgIGNvbnN0IHZpc2libGVTdGlja3lIZWFkZXJDbGFzcyA9ICdpcy1zdGlja3ktaGVhZGVyLXZpc2libGUnO1xuICAgICAgICBjb25zdCBzdWJuYXZMaXN0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmpzLXN1Ym5hdicpO1xuICAgICAgICB2YXIgc3ViTmF2SXNWaXNpYmxlID0gZmFsc2U7XG4gICAgICAgIGlmKHN0aWNreUhlYWRlcikgc3RpY2t5SGVhZGVyLmhpZGRlbiA9IGZhbHNlO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3VibmF2TGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHN1Ym5hdkxpc3RbaV0sIG51bGwpLnZpc2liaWxpdHkgPT0gXCJ2aXNpYmxlXCIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc3ViTmF2SXNWaXNpYmxlID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmKGlzc2V0KHN0aWNreUhlYWRlcikgJiYgIXN1Yk5hdklzVmlzaWJsZSl7XG4gICAgICAgICAgICAvLyBIaWRlIHdoZW4gc2Nyb2xsaW5nIERPV04gKE9SIHdpdGhpbiBvZmZzZXQpXG4gICAgICAgICAgICBpZihTY3JvbGxIYW5kbGVyLnNjcm9sbERpcmVjdGlvbkRvd24gfHwgU2Nyb2xsSGFuZGxlci5sYXN0U2Nyb2xsVG9wUG9zaXRpb24gPCAxMTApe1xuICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnJlbW92ZSh2aXNpYmxlU3RpY2t5SGVhZGVyQ2xhc3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gU2hvdyB3aGVuIHNjcm9sbGluZyBVUCBhbmQgb3V0c2lkZSBvZiBvZmZzZXRcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCh2aXNpYmxlU3RpY2t5SGVhZGVyQ2xhc3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxufTtcblxuU2Nyb2xsSGFuZGxlci5pbml0KCk7IiwiLy8gcmVtb3ZlZCBieSBleHRyYWN0LXRleHQtd2VicGFjay1wbHVnaW4iXSwic291cmNlUm9vdCI6IiJ9