testcafe
Version:
Automated browser testing for the modern web development stack.
454 lines • 55.7 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.SwitchToWindowPredicateError = exports.CannotCloseWindowWithoutParentError = exports.CannotCloseWindowWithChildrenError = exports.CloseChildWindowError = exports.CannotSwitchToWindowError = exports.ChildWindowIsNotLoadedError = exports.ChildWindowNotFoundError = exports.CurrentIframeIsNotLoadedError = exports.ActionIframeIsNotLoadedError = exports.ActionElementNotIframeError = exports.InvalidElementScreenshotDimensionsError = exports.ActionInvalidScrollTargetError = exports.ActionElementIsNotFileInputError = exports.ActionCannotFindFileToUploadError = exports.ActionIncorrectKeysError = exports.ActionRootContainerNotFoundError = exports.ActionElementNonContentEditableError = exports.ActionElementNotTextAreaError = exports.ActionElementNonEditableError = exports.ActionAdditionalSelectorMatchesWrongNodeTypeError = exports.ActionAdditionalElementIsInvisibleError = exports.ActionElementIsNotTargetError = exports.ActionAdditionalElementNotFoundError = exports.ActionSelectorMatchesWrongNodeTypeError = exports.ActionElementIsInvisibleError = exports.ActionElementNotFoundError = exports.ActionInvalidObjectPropertyError = exports.ActionFunctionOptionError = exports.ActionObjectOptionError = exports.ActionUrlSearchParamsOptionError = exports.ActionUrlOptionError = exports.ActionNumberOptionError = exports.ActionDateOptionError = exports.ActionStringOrRegexOptionError = exports.ActionStringOptionError = exports.ActionSpeedOptionError = exports.ActionBooleanOptionError = exports.ActionPositiveIntegerOptionError = exports.ActionIntegerOptionError = exports.UncaughtErrorInCustomClientScriptLoadedFromModule = exports.UncaughtErrorInCustomClientScriptCode = exports.UncaughtErrorInCustomDOMPropertyCode = exports.UncaughtErrorInClientFunctionCode = exports.UncaughtErrorOnPage = exports.CannotObtainInfoForElementSpecifiedBySelectorError = exports.InvalidSelectorResultError = exports.SelectorErrorBase = exports.DomNodeClientFunctionResultError = exports.ClientFunctionExecutionInterruptionError = exports.TestRunErrorBase = void 0;
exports.MultipleWindowsModeIsNotSupportedInNativeAutomationModeError = exports.UncaughtErrorInNativeDialogHandler = exports.NativeDialogNotHandledError = exports.CurrentIframeIsInvisibleError = exports.CurrentIframeNotFoundError = exports.CannotRestoreChildWindowError = exports.ChildWindowClosedBeforeSwitchingError = exports.PreviousWindowNotFoundError = exports.ParentWindowNotFoundError = exports.WindowNotFoundError = void 0;
// -------------------------------------------------------------
// WARNING: this file is used by both the client and the server.
// Do not use any browser or node-specific API!
// -------------------------------------------------------------
const types_1 = require("../../errors/types");
// Base
//--------------------------------------------------------------------
class TestRunErrorBase {
constructor(code, callsite) {
this.code = code;
this.isTestCafeError = true;
this.callsite = callsite || null;
}
}
exports.TestRunErrorBase = TestRunErrorBase;
class ActionOptionErrorBase extends TestRunErrorBase {
constructor(code, optionName, actualValue) {
super(code);
this.optionName = optionName;
this.actualValue = actualValue;
}
}
// Client function errors
//--------------------------------------------------------------------
class ClientFunctionExecutionInterruptionError extends TestRunErrorBase {
constructor(instantiationCallsiteName, callsite) {
super(types_1.TEST_RUN_ERRORS.clientFunctionExecutionInterruptionError, callsite);
this.instantiationCallsiteName = instantiationCallsiteName;
}
}
exports.ClientFunctionExecutionInterruptionError = ClientFunctionExecutionInterruptionError;
class DomNodeClientFunctionResultError extends TestRunErrorBase {
constructor(instantiationCallsiteName, callsite) {
super(types_1.TEST_RUN_ERRORS.domNodeClientFunctionResultError, callsite);
this.instantiationCallsiteName = instantiationCallsiteName;
}
}
exports.DomNodeClientFunctionResultError = DomNodeClientFunctionResultError;
// Selector errors
//--------------------------------------------------------------------
class SelectorErrorBase extends TestRunErrorBase {
constructor(code, { apiFnChain, apiFnIndex, reason } = {}, callsite) {
super(code, callsite);
this.apiFnChain = apiFnChain;
this.apiFnIndex = apiFnIndex;
this.reason = reason;
}
}
exports.SelectorErrorBase = SelectorErrorBase;
class InvalidSelectorResultError extends TestRunErrorBase {
constructor(callsite) {
super(types_1.TEST_RUN_ERRORS.invalidSelectorResultError, callsite);
}
}
exports.InvalidSelectorResultError = InvalidSelectorResultError;
class CannotObtainInfoForElementSpecifiedBySelectorError extends SelectorErrorBase {
constructor(callsite, apiFnArgs) {
super(types_1.TEST_RUN_ERRORS.cannotObtainInfoForElementSpecifiedBySelectorError, apiFnArgs, callsite);
}
}
exports.CannotObtainInfoForElementSpecifiedBySelectorError = CannotObtainInfoForElementSpecifiedBySelectorError;
// Uncaught errors
//--------------------------------------------------------------------
class UncaughtErrorOnPage extends TestRunErrorBase {
constructor(errStack, pageDestUrl) {
super(types_1.TEST_RUN_ERRORS.uncaughtErrorOnPage);
this.errStack = errStack;
this.pageDestUrl = pageDestUrl;
}
}
exports.UncaughtErrorOnPage = UncaughtErrorOnPage;
class UncaughtErrorInClientFunctionCode extends TestRunErrorBase {
constructor(instantiationCallsiteName, err, callsite) {
super(types_1.TEST_RUN_ERRORS.uncaughtErrorInClientFunctionCode, callsite);
this.errMsg = String(err);
this.instantiationCallsiteName = instantiationCallsiteName;
}
}
exports.UncaughtErrorInClientFunctionCode = UncaughtErrorInClientFunctionCode;
class UncaughtErrorInCustomDOMPropertyCode extends TestRunErrorBase {
constructor(instantiationCallsiteName, err, prop, callsite) {
super(types_1.TEST_RUN_ERRORS.uncaughtErrorInCustomDOMPropertyCode, callsite);
this.errMsg = String(err);
this.property = prop;
this.instantiationCallsiteName = instantiationCallsiteName;
}
}
exports.UncaughtErrorInCustomDOMPropertyCode = UncaughtErrorInCustomDOMPropertyCode;
class UncaughtErrorInCustomClientScriptCode extends TestRunErrorBase {
constructor(err) {
super(types_1.TEST_RUN_ERRORS.uncaughtErrorInCustomClientScriptCode);
this.errMsg = String(err);
}
}
exports.UncaughtErrorInCustomClientScriptCode = UncaughtErrorInCustomClientScriptCode;
class UncaughtErrorInCustomClientScriptLoadedFromModule extends TestRunErrorBase {
constructor(err, moduleName) {
super(types_1.TEST_RUN_ERRORS.uncaughtErrorInCustomClientScriptCodeLoadedFromModule);
this.errMsg = String(err);
this.moduleName = moduleName;
}
}
exports.UncaughtErrorInCustomClientScriptLoadedFromModule = UncaughtErrorInCustomClientScriptLoadedFromModule;
// Action parameters errors
//--------------------------------------------------------------------
// Options errors
//--------------------------------------------------------------------
class ActionIntegerOptionError extends ActionOptionErrorBase {
constructor(optionName, actualValue) {
super(types_1.TEST_RUN_ERRORS.actionIntegerOptionError, optionName, actualValue);
}
}
exports.ActionIntegerOptionError = ActionIntegerOptionError;
class ActionPositiveIntegerOptionError extends ActionOptionErrorBase {
constructor(optionName, actualValue) {
super(types_1.TEST_RUN_ERRORS.actionPositiveIntegerOptionError, optionName, actualValue);
}
}
exports.ActionPositiveIntegerOptionError = ActionPositiveIntegerOptionError;
class ActionBooleanOptionError extends ActionOptionErrorBase {
constructor(optionName, actualValue) {
super(types_1.TEST_RUN_ERRORS.actionBooleanOptionError, optionName, actualValue);
}
}
exports.ActionBooleanOptionError = ActionBooleanOptionError;
class ActionSpeedOptionError extends ActionOptionErrorBase {
constructor(optionName, actualValue) {
super(types_1.TEST_RUN_ERRORS.actionSpeedOptionError, optionName, actualValue);
}
}
exports.ActionSpeedOptionError = ActionSpeedOptionError;
class ActionStringOptionError extends ActionOptionErrorBase {
constructor(optionName, actualValue) {
super(types_1.TEST_RUN_ERRORS.actionStringOptionError, optionName, actualValue);
}
}
exports.ActionStringOptionError = ActionStringOptionError;
class ActionStringOrRegexOptionError extends ActionOptionErrorBase {
constructor(optionName, actualValue) {
super(types_1.TEST_RUN_ERRORS.actionStringOrRegexOptionError, optionName, actualValue);
}
}
exports.ActionStringOrRegexOptionError = ActionStringOrRegexOptionError;
class ActionDateOptionError extends ActionOptionErrorBase {
constructor(optionName, actualValue) {
super(types_1.TEST_RUN_ERRORS.actionDateOptionError, optionName, actualValue);
}
}
exports.ActionDateOptionError = ActionDateOptionError;
class ActionNumberOptionError extends ActionOptionErrorBase {
constructor(optionName, actualValue) {
super(types_1.TEST_RUN_ERRORS.actionNumberOptionError, optionName, actualValue);
}
}
exports.ActionNumberOptionError = ActionNumberOptionError;
class ActionUrlOptionError extends ActionOptionErrorBase {
constructor(optionName, actualValue) {
super(types_1.TEST_RUN_ERRORS.actionUrlOptionError, optionName, actualValue);
}
}
exports.ActionUrlOptionError = ActionUrlOptionError;
class ActionUrlSearchParamsOptionError extends ActionOptionErrorBase {
constructor(optionName, actualValue) {
super(types_1.TEST_RUN_ERRORS.actionUrlSearchParamsOptionError, optionName, actualValue);
}
}
exports.ActionUrlSearchParamsOptionError = ActionUrlSearchParamsOptionError;
class ActionObjectOptionError extends ActionOptionErrorBase {
constructor(optionName, actualValue) {
super(types_1.TEST_RUN_ERRORS.actionObjectOptionError, optionName, actualValue);
}
}
exports.ActionObjectOptionError = ActionObjectOptionError;
class ActionFunctionOptionError extends ActionOptionErrorBase {
constructor(optionName, actualValue) {
super(types_1.TEST_RUN_ERRORS.actionFunctionOptionError, optionName, actualValue);
}
}
exports.ActionFunctionOptionError = ActionFunctionOptionError;
class ActionInvalidObjectPropertyError extends TestRunErrorBase {
constructor(objectName, propertyName, availableProperties) {
super(types_1.TEST_RUN_ERRORS.actionInvalidObjectPropertyError);
this.objectName = objectName;
this.propertyName = propertyName;
this.availableProperties = availableProperties;
}
}
exports.ActionInvalidObjectPropertyError = ActionInvalidObjectPropertyError;
// Action execution errors
//--------------------------------------------------------------------
class ActionElementNotFoundError extends SelectorErrorBase {
constructor(callsite, apiFnArgs) {
super(types_1.TEST_RUN_ERRORS.actionElementNotFoundError, apiFnArgs, callsite);
}
}
exports.ActionElementNotFoundError = ActionElementNotFoundError;
class ActionElementIsInvisibleError extends SelectorErrorBase {
constructor(callsite, apiFnArgs) {
super(types_1.TEST_RUN_ERRORS.actionElementIsInvisibleError, apiFnArgs, callsite);
}
}
exports.ActionElementIsInvisibleError = ActionElementIsInvisibleError;
class ActionSelectorMatchesWrongNodeTypeError extends TestRunErrorBase {
constructor(nodeDescription) {
super(types_1.TEST_RUN_ERRORS.actionSelectorMatchesWrongNodeTypeError);
this.nodeDescription = nodeDescription;
}
}
exports.ActionSelectorMatchesWrongNodeTypeError = ActionSelectorMatchesWrongNodeTypeError;
class ActionAdditionalElementNotFoundError extends SelectorErrorBase {
constructor(argumentName, apiFnArgs) {
super(types_1.TEST_RUN_ERRORS.actionAdditionalElementNotFoundError, apiFnArgs);
this.argumentName = argumentName;
}
}
exports.ActionAdditionalElementNotFoundError = ActionAdditionalElementNotFoundError;
class ActionElementIsNotTargetError extends TestRunErrorBase {
constructor(callsite) {
super(types_1.TEST_RUN_ERRORS.actionElementIsNotTargetError, callsite);
}
}
exports.ActionElementIsNotTargetError = ActionElementIsNotTargetError;
class ActionAdditionalElementIsInvisibleError extends SelectorErrorBase {
constructor(argumentName, apiFnArgs) {
super(types_1.TEST_RUN_ERRORS.actionAdditionalElementIsInvisibleError, apiFnArgs);
this.argumentName = argumentName;
}
}
exports.ActionAdditionalElementIsInvisibleError = ActionAdditionalElementIsInvisibleError;
class ActionAdditionalSelectorMatchesWrongNodeTypeError extends TestRunErrorBase {
constructor(argumentName, nodeDescription) {
super(types_1.TEST_RUN_ERRORS.actionAdditionalSelectorMatchesWrongNodeTypeError);
this.argumentName = argumentName;
this.nodeDescription = nodeDescription;
}
}
exports.ActionAdditionalSelectorMatchesWrongNodeTypeError = ActionAdditionalSelectorMatchesWrongNodeTypeError;
class ActionElementNonEditableError extends TestRunErrorBase {
constructor() {
super(types_1.TEST_RUN_ERRORS.actionElementNonEditableError);
}
}
exports.ActionElementNonEditableError = ActionElementNonEditableError;
class ActionElementNotTextAreaError extends TestRunErrorBase {
constructor() {
super(types_1.TEST_RUN_ERRORS.actionElementNotTextAreaError);
}
}
exports.ActionElementNotTextAreaError = ActionElementNotTextAreaError;
class ActionElementNonContentEditableError extends TestRunErrorBase {
constructor(argumentName) {
super(types_1.TEST_RUN_ERRORS.actionElementNonContentEditableError);
this.argumentName = argumentName;
}
}
exports.ActionElementNonContentEditableError = ActionElementNonContentEditableError;
class ActionRootContainerNotFoundError extends TestRunErrorBase {
constructor() {
super(types_1.TEST_RUN_ERRORS.actionRootContainerNotFoundError);
}
}
exports.ActionRootContainerNotFoundError = ActionRootContainerNotFoundError;
class ActionIncorrectKeysError extends TestRunErrorBase {
constructor(argumentName) {
super(types_1.TEST_RUN_ERRORS.actionIncorrectKeysError);
this.argumentName = argumentName;
}
}
exports.ActionIncorrectKeysError = ActionIncorrectKeysError;
class ActionCannotFindFileToUploadError extends TestRunErrorBase {
constructor(filePaths, scannedFilePaths) {
super(types_1.TEST_RUN_ERRORS.actionCannotFindFileToUploadError);
this.filePaths = filePaths;
this.scannedFilePaths = scannedFilePaths;
}
}
exports.ActionCannotFindFileToUploadError = ActionCannotFindFileToUploadError;
class ActionElementIsNotFileInputError extends TestRunErrorBase {
constructor() {
super(types_1.TEST_RUN_ERRORS.actionElementIsNotFileInputError);
}
}
exports.ActionElementIsNotFileInputError = ActionElementIsNotFileInputError;
class ActionInvalidScrollTargetError extends TestRunErrorBase {
constructor(scrollTargetXValid, scrollTargetYValid) {
super(types_1.TEST_RUN_ERRORS.actionInvalidScrollTargetError);
if (!scrollTargetXValid) {
if (!scrollTargetYValid)
this.properties = 'scrollTargetX and scrollTargetY properties';
else
this.properties = 'scrollTargetX property';
}
else
this.properties = 'scrollTargetY property';
}
}
exports.ActionInvalidScrollTargetError = ActionInvalidScrollTargetError;
class InvalidElementScreenshotDimensionsError extends TestRunErrorBase {
constructor(width, height) {
super(types_1.TEST_RUN_ERRORS.invalidElementScreenshotDimensionsError);
const widthIsInvalid = width <= 0;
const heightIsInvalid = height <= 0;
if (widthIsInvalid) {
if (heightIsInvalid) {
this.verb = 'are';
this.dimensions = 'width and height';
}
else {
this.verb = 'is';
this.dimensions = 'width';
}
}
else {
this.verb = 'is';
this.dimensions = 'height';
}
}
}
exports.InvalidElementScreenshotDimensionsError = InvalidElementScreenshotDimensionsError;
// Iframe errors
//--------------------------------------------------------------------
class ActionElementNotIframeError extends TestRunErrorBase {
constructor(callsite) {
super(types_1.TEST_RUN_ERRORS.actionElementNotIframeError, callsite);
}
}
exports.ActionElementNotIframeError = ActionElementNotIframeError;
class ActionIframeIsNotLoadedError extends TestRunErrorBase {
constructor() {
super(types_1.TEST_RUN_ERRORS.actionIframeIsNotLoadedError);
}
}
exports.ActionIframeIsNotLoadedError = ActionIframeIsNotLoadedError;
class CurrentIframeIsNotLoadedError extends TestRunErrorBase {
constructor() {
super(types_1.TEST_RUN_ERRORS.currentIframeIsNotLoadedError);
}
}
exports.CurrentIframeIsNotLoadedError = CurrentIframeIsNotLoadedError;
class ChildWindowNotFoundError extends TestRunErrorBase {
constructor() {
super(types_1.TEST_RUN_ERRORS.childWindowNotFoundError);
}
}
exports.ChildWindowNotFoundError = ChildWindowNotFoundError;
class ChildWindowIsNotLoadedError extends TestRunErrorBase {
constructor() {
super(types_1.TEST_RUN_ERRORS.childWindowIsNotLoadedError);
}
}
exports.ChildWindowIsNotLoadedError = ChildWindowIsNotLoadedError;
class CannotSwitchToWindowError extends TestRunErrorBase {
constructor() {
super(types_1.TEST_RUN_ERRORS.cannotSwitchToWindowError);
}
}
exports.CannotSwitchToWindowError = CannotSwitchToWindowError;
class CloseChildWindowError extends TestRunErrorBase {
constructor() {
super(types_1.TEST_RUN_ERRORS.closeChildWindowError);
}
}
exports.CloseChildWindowError = CloseChildWindowError;
class CannotCloseWindowWithChildrenError extends TestRunErrorBase {
constructor() {
super(types_1.TEST_RUN_ERRORS.cannotCloseWindowWithChildrenError);
}
}
exports.CannotCloseWindowWithChildrenError = CannotCloseWindowWithChildrenError;
class CannotCloseWindowWithoutParentError extends TestRunErrorBase {
constructor() {
super(types_1.TEST_RUN_ERRORS.cannotCloseWindowWithoutParent);
}
}
exports.CannotCloseWindowWithoutParentError = CannotCloseWindowWithoutParentError;
class SwitchToWindowPredicateError extends TestRunErrorBase {
constructor(errMsg) {
super(types_1.TEST_RUN_ERRORS.switchToWindowPredicateError);
this.errMsg = errMsg;
}
}
exports.SwitchToWindowPredicateError = SwitchToWindowPredicateError;
class WindowNotFoundError extends TestRunErrorBase {
constructor() {
super(types_1.TEST_RUN_ERRORS.targetWindowNotFoundError);
}
}
exports.WindowNotFoundError = WindowNotFoundError;
class ParentWindowNotFoundError extends TestRunErrorBase {
constructor() {
super(types_1.TEST_RUN_ERRORS.parentWindowNotFoundError);
}
}
exports.ParentWindowNotFoundError = ParentWindowNotFoundError;
class PreviousWindowNotFoundError extends TestRunErrorBase {
constructor() {
super(types_1.TEST_RUN_ERRORS.previousWindowNotFoundError);
}
}
exports.PreviousWindowNotFoundError = PreviousWindowNotFoundError;
class ChildWindowClosedBeforeSwitchingError extends TestRunErrorBase {
constructor() {
super(types_1.TEST_RUN_ERRORS.childWindowClosedBeforeSwitchingError);
}
}
exports.ChildWindowClosedBeforeSwitchingError = ChildWindowClosedBeforeSwitchingError;
class CannotRestoreChildWindowError extends TestRunErrorBase {
constructor() {
super(types_1.TEST_RUN_ERRORS.cannotRestoreChildWindowError);
}
}
exports.CannotRestoreChildWindowError = CannotRestoreChildWindowError;
class CurrentIframeNotFoundError extends TestRunErrorBase {
constructor() {
super(types_1.TEST_RUN_ERRORS.currentIframeNotFoundError);
}
}
exports.CurrentIframeNotFoundError = CurrentIframeNotFoundError;
class CurrentIframeIsInvisibleError extends TestRunErrorBase {
constructor() {
super(types_1.TEST_RUN_ERRORS.currentIframeIsInvisibleError);
}
}
exports.CurrentIframeIsInvisibleError = CurrentIframeIsInvisibleError;
// Native dialog errors
//--------------------------------------------------------------------
class NativeDialogNotHandledError extends TestRunErrorBase {
constructor(dialogType, url) {
super(types_1.TEST_RUN_ERRORS.nativeDialogNotHandledError);
this.dialogType = dialogType;
this.pageUrl = url;
}
}
exports.NativeDialogNotHandledError = NativeDialogNotHandledError;
class UncaughtErrorInNativeDialogHandler extends TestRunErrorBase {
constructor(dialogType, errMsg, url) {
super(types_1.TEST_RUN_ERRORS.uncaughtErrorInNativeDialogHandler);
this.dialogType = dialogType;
this.errMsg = errMsg;
this.pageUrl = url;
}
}
exports.UncaughtErrorInNativeDialogHandler = UncaughtErrorInNativeDialogHandler;
class MultipleWindowsModeIsNotSupportedInNativeAutomationModeError extends TestRunErrorBase {
constructor() {
super(types_1.TEST_RUN_ERRORS.multipleWindowsModeIsNotSupportedInNativeAutomationError);
}
}
exports.MultipleWindowsModeIsNotSupportedInNativeAutomationModeError = MultipleWindowsModeIsNotSupportedInNativeAutomationModeError;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2hhcmVkL2Vycm9ycy9pbmRleC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsZ0VBQWdFO0FBQ2hFLGdFQUFnRTtBQUNoRSwrQ0FBK0M7QUFDL0MsZ0VBQWdFO0FBQ2hFLDhDQUFxRDtBQUVyRCxPQUFPO0FBQ1Asc0VBQXNFO0FBQ3RFLE1BQWEsZ0JBQWdCO0lBQ3pCLFlBQWEsSUFBSSxFQUFFLFFBQVE7UUFDdkIsSUFBSSxDQUFDLElBQUksR0FBYyxJQUFJLENBQUM7UUFDNUIsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUM7UUFDNUIsSUFBSSxDQUFDLFFBQVEsR0FBVSxRQUFRLElBQUksSUFBSSxDQUFDO0lBQzVDLENBQUM7Q0FDSjtBQU5ELDRDQU1DO0FBRUQsTUFBTSxxQkFBc0IsU0FBUSxnQkFBZ0I7SUFDaEQsWUFBYSxJQUFJLEVBQUUsVUFBVSxFQUFFLFdBQVc7UUFDdEMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRVosSUFBSSxDQUFDLFVBQVUsR0FBSSxVQUFVLENBQUM7UUFDOUIsSUFBSSxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUM7SUFDbkMsQ0FBQztDQUNKO0FBR0QseUJBQXlCO0FBQ3pCLHNFQUFzRTtBQUN0RSxNQUFhLHdDQUF5QyxTQUFRLGdCQUFnQjtJQUMxRSxZQUFhLHlCQUF5QixFQUFFLFFBQVE7UUFDNUMsS0FBSyxDQUFDLHVCQUFlLENBQUMsd0NBQXdDLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFFMUUsSUFBSSxDQUFDLHlCQUF5QixHQUFHLHlCQUF5QixDQUFDO0lBQy9ELENBQUM7Q0FDSjtBQU5ELDRGQU1DO0FBRUQsTUFBYSxnQ0FBaUMsU0FBUSxnQkFBZ0I7SUFDbEUsWUFBYSx5QkFBeUIsRUFBRSxRQUFRO1FBQzVDLEtBQUssQ0FBQyx1QkFBZSxDQUFDLGdDQUFnQyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FB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QyxPQUFPLEdBQU0sR0FBRyxDQUFDO0lBQzFCLENBQUM7Q0FDSjtBQVJELGdGQVFDO0FBRUQsTUFBYSw0REFBNkQsU0FBUSxnQkFBZ0I7SUFDOUY7UUFDSSxLQUFLLENBQUMsdUJBQWUsQ0FBQyx3REFBd0QsQ0FBQyxDQUFDO0lBQ3BGLENBQUM7Q0FDSjtBQUpELG9JQUlDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gV0FSTklORzogdGhpcyBmaWxlIGlzIHVzZWQgYnkgYm90aCB0aGUgY2xpZW50IGFuZCB0aGUgc2VydmVyLlxuLy8gRG8gbm90IHVzZSBhbnkgYnJvd3NlciBvciBub2RlLXNwZWNpZmljIEFQSSFcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbmltcG9ydCB7IFRFU1RfUlVOX0VSUk9SUyB9IGZyb20gJy4uLy4uL2Vycm9ycy90eXBlcyc7XG5cbi8vIEJhc2Vcbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbmV4cG9ydCBjbGFzcyBUZXN0UnVuRXJyb3JCYXNlIHtcbiAgICBjb25zdHJ1Y3RvciAoY29kZSwgY2FsbHNpdGUpIHtcbiAgICAgICAgdGhpcy5jb2RlICAgICAgICAgICAgPSBjb2RlO1xuICAgICAgICB0aGlzLmlzVGVzdENhZmVFcnJvciA9IHRydWU7XG4gICAgICAgIHRoaXMuY2FsbHNpdGUgICAgICAgID0gY2FsbHNpdGUgfHwgbnVsbDtcbiAgICB9XG59XG5cbmNsYXNzIEFjdGlvbk9wdGlvbkVycm9yQmFzZSBleHRlbmRzIFRlc3RSdW5FcnJvckJhc2Uge1xuICAgIGNvbnN0cnVjdG9yIChjb2RlLCBvcHRpb25OYW1lLCBhY3R1YWxWYWx1ZSkge1xuICAgICAgICBzdXBlcihjb2RlKTtcblxuICAgICAgICB0aGlzLm9wdGlvbk5hbWUgID0gb3B0aW9uTmFtZTtcbiAgICAgICAgdGhpcy5hY3R1YWxWYWx1ZSA9IGFjdHVhbFZhbHVlO1xuICAgIH1cbn1cblxuXG4vLyBDbGllbnQgZnVuY3Rpb24gZXJyb3JzXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5leHBvcnQgY2xhc3MgQ2xpZW50RnVuY3Rpb25FeGVjdXRpb25JbnRlcnJ1cHRpb25FcnJvciBleHRlbmRzIFRlc3RSdW5FcnJvckJhc2Uge1xuICAgIGNvbnN0cnVjdG9yIChpbnN0YW50aWF0aW9uQ2FsbHNpdGVOYW1lLCBjYWxsc2l0ZSkge1xuICAgICAgICBzdXBlcihURVNUX1JVTl9FUlJPUlMuY2xpZW50RnVuY3Rpb25FeGVjdXRpb25JbnRlcnJ1cHRpb25FcnJvciwgY2FsbHNpdGUpO1xuXG4gICAgICAgIHRoaXMuaW5zdGFudGlhdGlvbkNhbGxzaXRlTmFtZSA9IGluc3RhbnRpYXRpb25DYWxsc2l0ZU5hbWU7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgRG9tTm9kZUNsaWVudEZ1bmN0aW9uUmVzdWx0RXJyb3IgZXh0ZW5kcyBUZXN0UnVuRXJyb3JCYXNlIHtcbiAgICBjb25zdHJ1Y3RvciAoaW5zdGFudGlhdGlvbkNhbGxzaXRlTmFtZSwgY2FsbHNpdGUpIHtcbiAgICAgICAgc3VwZXIoVEVTVF9SVU5fRVJST1JTLmRvbU5vZGVDbGllbnRGdW5jdGlvblJlc3VsdEVycm9yLCBjYWxsc2l0ZSk7XG5cbiAgICAgICAgdGhpcy5pbnN0YW50aWF0aW9uQ2FsbHNpdGVOYW1lID0gaW5zdGFudGlhdGlvbkNhbGxzaXRlTmFtZTtcbiAgICB9XG59XG5cbi8vIFNlbGVjdG9yIGVycm9yc1xuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuZXhwb3J0IGNsYXNzIFNlbGVjdG9yRXJyb3JCYXNlIGV4dGVuZHMgVGVzdFJ1bkVycm9yQmFzZSB7XG4gICAgY29uc3RydWN0b3IgKGNvZGUsIHsgYXBpRm5DaGFpbiwgYXBpRm5JbmRleCwgcmVhc29uIH0gPSB7fSwgY2FsbHNpdGUpIHtcbiAgICAgICAgc3VwZXIoY29kZSwgY2FsbHNpdGUpO1xuXG4gICAgICAgIHRoaXMuYXBpRm5DaGFpbiA9IGFwaUZuQ2hhaW47XG4gICAgICAgIHRoaXMuYXBpRm5JbmRleCA9IGFwaUZuSW5kZXg7XG4gICAgICAgIHRoaXMucmVhc29uICAgICA9IHJlYXNvbjtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBJbnZhbGlkU2VsZWN0b3JSZXN1bHRFcnJvciBleHRlbmRzIFRlc3RSdW5FcnJvckJhc2Uge1xuICAgIGNvbnN0cnVjdG9yIChjYWxsc2l0ZSkge1xuICAgICAgICBzdXBlcihURVNUX1JVTl9FUlJPUlMuaW52YWxpZFNlbGVjdG9yUmVzdWx0RXJyb3IsIGNhbGxzaXRlKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDYW5ub3RPYnRhaW5JbmZvRm9yRWxlbWVudFNwZWNpZmllZEJ5U2VsZWN0b3JFcnJvciBleHRlbmRzIFNlbGVjdG9yRXJyb3JCYXNlIHtcbiAgICBjb25zdHJ1Y3RvciAoY2FsbHNpdGUsIGFwaUZuQXJncykge1xuICAgICAgICBzdXBlcihURVNUX1JVTl9FUlJPUlMuY2Fubm90T2J0YWluSW5mb0ZvckVsZW1lbnRTcGVjaWZpZWRCeVNlbGVjdG9yRXJyb3IsIGFwaUZuQXJncywgY2FsbHNpdGUpO1xuICAgIH1cbn1cblxuXG4vLyBVbmNhdWdodCBlcnJvcnNcbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbmV4cG9ydCBjbGFzcyBVbmNhdWdodEVycm9yT25QYWdlIGV4dGVuZHMgVGVzdFJ1bkVycm9yQmFzZSB7XG4gICAgY29uc3RydWN0b3IgKGVyclN0YWNrLCBwYWdlRGVzdFVybCkge1xuICAgICAgICBzdXBlcihURVNUX1JVTl9FUlJPUlMudW5jYXVnaHRFcnJvck9uUGFnZSk7XG5cbiAgICAgICAgdGhpcy5lcnJTdGFjayAgICA9IGVyclN0YWNrO1xuICAgICAgICB0aGlzLnBhZ2VEZXN0VXJsID0gcGFnZURlc3RVcmw7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgVW5jYXVnaHRFcnJvckluQ2xpZW50RnVuY3Rpb25Db2RlIGV4dGVuZHMgVGVzdFJ1bkVycm9yQmFzZSB7XG4gICAgY29uc3RydWN0b3IgKGluc3RhbnRpYXRpb25DYWxsc2l0ZU5hbWUsIGVyciwgY2FsbHNpdGUpIHtcbiAgICAgICAgc3VwZXIoVEVTVF9SVU5fRVJST1JTLnVuY2F1Z2h0RXJyb3JJbkNsaWVudEZ1bmN0aW9uQ29kZSwgY2FsbHNpdGUpO1xuXG4gICAgICAgIHRoaXMuZXJyTXNnICAgICAgICAgICAgICAgICAgICA9IFN0cmluZyhlcnIpO1xuICAgICAgICB0aGlzLmluc3RhbnRpYXRpb25DYWxsc2l0ZU5hbWUgPSBpbnN0YW50aWF0aW9uQ2FsbHNpdGVOYW1lO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFVuY2F1Z2h0RXJyb3JJbkN1c3RvbURPTVByb3BlcnR5Q29kZSBleHRlbmRzIFRlc3RSdW5FcnJvckJhc2Uge1xuICAgIGNvbnN0cnVjdG9yIChpbnN0YW50aWF0aW9uQ2FsbHNpdGVOYW1lLCBlcnIsIHByb3AsIGNhbGxzaXRlKSB7XG4gICAgICAgIHN1cGVyKFRFU1RfUlVOX0VSUk9SUy51bmNhdWdodEVycm9ySW5DdXN0b21ET01Qcm9wZXJ0eUNvZGUsIGNhbGxzaXRlKTtcblxuICAgICAgICB0aGlzLmVyck1zZyAgICAgICAgICAgICAgICAgICAgPSBTdHJpbmcoZXJyKTtcbiAgICAgICAgdGhpcy5wcm9wZXJ0eSAgICAgICAgICAgICAgICAgID0gcHJvcDtcbiAgICAgICAgdGhpcy5pbnN0YW50aWF0aW9uQ2FsbHNpdGVOYW1lID0gaW5zdGFudGlhdGlvbkNhbGxzaXRlTmFtZTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBVbmNhdWdodEVycm9ySW5DdXN0b21DbGllbnRTY3JpcHRDb2RlIGV4dGVuZHMgVGVzdFJ1bkVycm9yQmFzZSB7XG4gICAgY29uc3RydWN0b3IgKGVycikge1xuICAgICAgICBzdXBlcihURVNUX1JVTl9FUlJPUlMudW5jYXVnaHRFcnJvckluQ3VzdG9tQ2xpZW50U2NyaXB0Q29kZSk7XG5cbiAgICAgICAgdGhpcy5lcnJNc2cgPSBTdHJpbmcoZXJyKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBVbmNhdWdodEVycm9ySW5DdXN0b21DbGllbnRTY3JpcHRMb2FkZWRGcm9tTW9kdWxlIGV4dGVuZHMgVGVzdFJ1bkVycm9yQmFzZSB7XG4gICAgY29uc3RydWN0b3IgKGVyciwgbW9kdWxlTmFtZSkge1xuICAgICAgICBzdXBlcihURVNUX1JVTl9FUlJPUlMudW5jYXVnaHRFcnJvckluQ3VzdG9tQ2xpZW50U2NyaXB0Q29kZUxvYWRlZEZyb21Nb2R1bGUpO1xuXG4gICAgICAgIHRoaXMuZXJyTXNnICAgICA9IFN0cmluZyhlcnIpO1xuICAgICAgICB0aGlzLm1vZHVsZU5hbWUgPSBtb2R1bGVOYW1lO1xuICAgIH1cbn1cblxuXG4vLyBBY3Rpb24gcGFyYW1ldGVycyBlcnJvcnNcbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIE9wdGlvbnMgZXJyb3JzXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5leHBvcnQgY2xhc3MgQWN0aW9uSW50ZWdlck9wdGlvbkVycm9yIGV4dGVuZHMgQWN0aW9uT3B0aW9uRXJyb3JCYXNlIHtcbiAgICBjb25zdHJ1Y3RvciAob3B0aW9uTmFtZSwgYWN0dWFsVmFsdWUpIHtcbiAgICAgICAgc3VwZXIoVEVTVF9SVU5fRVJST1JTLmFjdGlvbkludGVnZXJPcHRpb25FcnJvciwgb3B0aW9uTmFtZSwgYWN0dWFsVmFsdWUpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFjdGlvblBvc2l0aXZlSW50ZWdlck9wdGlvbkVycm9yIGV4dGVuZHMgQWN0aW9uT3B0aW9uRXJyb3JCYXNlIHtcbiAgICBjb25zdHJ1Y3RvciAob3B0aW9uTmFtZSwgYWN0dWFsVmFsdWUpIHtcbiAgICAgICAgc3VwZXIoVEVTVF9SVU5fRVJST1JTLmFjdGlvblBvc2l0aXZlSW50ZWdlck9wdGlvbkVycm9yLCBvcHRpb25OYW1lLCBhY3R1YWxWYWx1ZSk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQWN0aW9uQm9vbGVhbk9wdGlvbkVycm9yIGV4dGVuZHMgQWN0aW9uT3B0aW9uRXJyb3JCYXNlIHtcbiAgICBjb25zdHJ1Y3RvciAob3B0aW9uTmFtZSwgYWN0dWFsVmFsdWUpIHtcbiAgICAgICAgc3VwZXIoVEVTVF9SVU5fRVJST1JTLmFjdGlvbkJvb2xlYW5PcHRpb25FcnJvciwgb3B0aW9uTmFtZSwgYWN0dWFsVmFsdWUpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFjdGlvblNwZWVkT3B0aW9uRXJyb3IgZXh0ZW5kcyBBY3Rpb25PcHRpb25FcnJvckJhc2Uge1xuICAgIGNvbnN0cnVjdG9yIChvcHRpb25OYW1lLCBhY3R1YWxWYWx1ZSkge1xuICAgICAgICBzdXBlcihURVNUX1JVTl9FUlJPUlMuYWN0aW9uU3BlZWRPcHRpb25FcnJvciwgb3B0aW9uTmFtZSwgYWN0dWFsVmFsdWUpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFjdGlvblN0cmluZ09wdGlvbkVycm9yIGV4dGVuZHMgQWN0aW9uT3B0aW9uRXJyb3JCYXNlIHtcbiAgICBjb25zdHJ1Y3RvciAob3B0aW9uTmFtZSwgYWN0dWFsVmFsdWUpIHtcbiAgICAgICAgc3VwZXIoVEVTVF9SVU5fRVJST1JTLmFjdGlvblN0cmluZ09wdGlvbkVycm9yLCBvcHRpb25OYW1lLCBhY3R1YWxWYWx1ZSk7XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIEFjdGlvblN0cmluZ09yUmVnZXhPcHRpb25FcnJvciBleHRlbmRzIEFjdGlvbk9wdGlvbkVycm9yQmFzZSB7XG4gICAgY29uc3RydWN0b3IgKG9wdGlvbk5hbWUsIGFjdHVhbFZhbHVlKSB7XG4gICAgICAgIHN1cGVyKFRFU1RfUlVOX0VSUk9SUy5hY3Rpb25TdHJpbmdPclJlZ2V4T3B0aW9uRXJyb3IsIG9wdGlvbk5hbWUsIGFjdHVhbFZhbHVlKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBBY3Rpb25EYXRlT3B0aW9uRXJyb3IgZXh0ZW5kcyBBY3Rpb25PcHRpb25FcnJvckJhc2Uge1xuICAgIGNvbnN0cnVjdG9yIChvcHRpb25OYW1lLCBhY3R1YWxWYWx1ZSkge1xuICAgICAgICBzdXBlcihURVNUX1JVTl9FUlJPUlMuYWN0aW9uRGF0ZU9wdGlvbkVycm9yLCBvcHRpb25OYW1lLCBhY3R1YWxWYWx1ZSk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQWN0aW9uTnVtYmVyT3B0aW9uRXJyb3IgZXh0ZW5kcyBBY3Rpb25PcHRpb25FcnJvckJhc2Uge1xuICAgIGNvbnN0cnVjdG9yIChvcHRpb25OYW1lLCBhY3R1YWxWYWx1ZSkge1xuICAgICAgICBzdXBlcihURVNUX1JVTl9FUlJPUlMuYWN0aW9uTnVtYmVyT3B0aW9uRXJyb3IsIG9wdGlvbk5hbWUsIGFjdHVhbFZhbHVlKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBBY3Rpb25VcmxPcHRpb25FcnJvciBleHRlbmRzIEFjdGlvbk9wdGlvbkVycm9yQmFzZSB7XG4gICAgY29uc3RydWN0b3IgKG9wdGlvbk5hbWUsIGFjdHVhbFZhbHVlKSB7XG4gICAgICAgIHN1cGVyKFRFU1RfUlVOX0VSUk9SUy5hY3Rpb25VcmxPcHRpb25FcnJvciwgb3B0aW9uTmFtZSwgYWN0dWFsVmFsdWUpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFjdGlvblVybFNlYXJjaFBhcmFtc09wdGlvbkVycm9yIGV4dGVuZHMgQWN0aW9uT3B0aW9uRXJyb3JCYXNlIHtcbiAgICBjb25zdHJ1Y3RvciAob3B0aW9uTmFtZSwgYWN0dWFsVmFsdWUpIHtcbiAgICAgICAgc3VwZXIoVEVTVF9SVU5fRVJST1JTLmFjdGlvblVybFNlYXJjaFBhcmFtc09wdGlvbkVycm9yLCBvcHRpb25OYW1lLCBhY3R1YWxWYWx1ZSk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQWN0aW9uT2JqZWN0T3B0aW9uRXJyb3IgZXh0ZW5kcyBBY3Rpb25PcHRpb25FcnJvckJhc2Uge1xuICAgIGNvbnN0cnVjdG9yIChvcHRpb25OYW1lLCBhY3R1YWxWYWx1ZSkge1xuICAgICAgICBzdXBlcihURVNUX1JVTl9FUlJPUlMuYWN0aW9uT2JqZWN0T3B0aW9uRXJyb3IsIG9wdGlvbk5hbWUsIGFjdHVhbFZhbHVlKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBBY3Rpb25GdW5jdGlvbk9wdGlvbkVycm9yIGV4dGVuZHMgQWN0aW9uT3B0aW9uRXJyb3JCYXNlIHtcbiAgICBjb25zdHJ1Y3RvciAob3B0aW9uTmFtZSwgYWN0dWFsVmFsdWUpIHtcbiAgICAgICAgc3VwZXIoVEVTVF9SVU5fRVJST1JTLmFjdGlvbkZ1bmN0aW9uT3B0aW9uRXJyb3IsIG9wdGlvbk5hbWUsIGFjdHVhbFZhbHVlKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBBY3Rpb25JbnZhbGlkT2JqZWN0UHJvcGVydHlFcnJvciBleHRlbmRzIFRlc3RSdW5FcnJvckJhc2Uge1xuICAgIGNvbnN0cnVjdG9yIChvYmplY3ROYW1lLCBwcm9wZXJ0eU5hbWUsIGF2YWlsYWJsZVByb3BlcnRpZXMpIHtcbiAgICAgICAgc3VwZXIoVEVTVF9SVU5fRVJST1JTLmFjdGlvbkludmFsaWRPYmplY3RQcm9wZXJ0eUVycm9yKTtcblxuICAgICAgICB0aGlzLm9iamVjdE5hbWUgICAgICAgICAgPSBvYmplY3ROYW1lO1xuICAgICAgICB0aGlzLnByb3BlcnR5TmFtZSAgICAgICAgPSBwcm9wZXJ0eU5hbWU7XG4gICAgICAgIHRoaXMuYXZhaWxhYmxlUHJvcGVydGllcyA9IGF2YWlsYWJsZVByb3BlcnRpZXM7XG4gICAgfVxufVxuXG4vLyBBY3Rpb24gZXhlY3V0aW9uIGVycm9yc1xuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuZXhwb3J0IGNsYXNzIEFjdGlvbkVsZW1lbnROb3RGb3VuZEVycm9yIGV4dGVuZHMgU2VsZWN0b3JFcnJvckJhc2Uge1xuICAgIGNvbnN0cnVjdG9yIChjYWxsc2l0ZSwgYXBpRm5BcmdzKSB7XG4gICAgICAgIHN1cGVyKFRFU1RfUlVOX0VSUk9SUy5hY3Rpb25FbGVtZW50Tm90Rm91bmRFcnJvciwgYXBpRm5BcmdzLCBjYWxsc2l0ZSk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQWN0aW9uRWxlbWVudElzSW52aXNpYmxlRXJyb3IgZXh0ZW5kcyBTZWxlY3RvckVycm9yQmFzZSB7XG4gICAgY29uc3RydWN0b3IgKGNhbGxzaXRlLCBhcGlGbkFyZ3MpIHtcbiAgICAgICAgc3VwZXIoVEVTVF9SVU5fRVJST1JTLmFjdGlvbkVsZW1lbnRJc0ludmlzaWJsZUVycm9yLCBhcGlGbkFyZ3MsIGNhbGxzaXRlKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBBY3Rpb25TZWxlY3Rvck1hdGNoZXNXcm9uZ05vZGVUeXBlRXJyb3IgZXh0ZW5kcyBUZXN0UnVuRXJyb3JCYXNlIHtcbiAgICBjb25zdHJ1Y3RvciAobm9kZURlc2NyaXB0aW9uKSB7XG4gICAgICAgIHN1cGVyKFRFU1RfUlVOX0VSUk9SUy5hY3Rpb25TZWxlY3Rvck1hdGNoZXNXcm9uZ05vZGVUeXBlRXJyb3IpO1xuXG4gICAgICAgIHRoaXMubm9kZURlc2NyaXB0aW9uID0gbm9kZURlc2NyaXB0aW9uO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFjdGlvbkFkZGl0aW9uYWxFbGVtZW50Tm90Rm91bmRFcnJvciBleHRlbmRzIFNlbGVjdG9yRXJyb3JCYXNlIHtcbiAgICBjb25zdHJ1Y3RvciAoYXJndW1lbnROYW1lLCBhcGlGbkFyZ3MpIHtcbiAgICAgICAgc3VwZXIoVEVTVF9SVU5fRVJST1JTLmFjdGlvbkFkZGl0aW9uYWxFbGVtZW50Tm90Rm91bmRFcnJvciwgYXBpRm5BcmdzKTtcblxuICAgICAgICB0aGlzLmFyZ3VtZW50TmFtZSA9IGFyZ3VtZW50TmFtZTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBBY3Rpb25FbGVtZW50SXNOb3RUYXJnZXRFcnJvciBleHRlbmRzIFRlc3RSdW5FcnJvckJhc2Uge1xuICAgIGNvbnN0cnVjdG9yIChjYWxsc2l0ZSkge1xuICAgICAgICBzdXBlcihURVNUX1JVTl9FUlJPUlMuYWN0aW9uRWxlbWVudElzTm90VGFyZ2V0RXJyb3IsIGNhbGxzaXRlKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBBY3Rpb25BZGRpdGlvbmFsRWxlbWVudElzSW52aXNpYmxlRXJyb3IgZXh0ZW5kcyBTZWxlY3RvckVycm9yQmFzZSB7XG4gICAgY29uc3RydWN0b3IgKGFyZ3VtZW50TmFtZSwgYXBpRm5BcmdzKSB7XG4gICAgICAgIHN1cGVyKFRFU1RfUlVOX0VSUk9SUy5hY3Rpb25BZGRpdGlvbmFsRWxlbWVudElzSW52aXNpYmxlRXJyb3IsIGFwaUZuQXJncyk7XG5cbiAgICAgICAgdGhpcy5hcmd1bWVudE5hbWUgPSBhcmd1bWVudE5hbWU7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQWN0aW9uQWRkaXRpb25hbFNlbGVjdG9yTWF0Y2hlc1dyb25nTm9kZVR5cGVFcnJvciBleHRlbmRzIFRlc3RSdW5FcnJvckJhc2Uge1xuICAgIGNvbnN0cnVjdG9yIChhcmd1bWVudE5hbWUsIG5vZGVEZXNjcmlwdGlvbikge1xuICAgICAgICBzdXBlcihURVNUX1JVTl9FUlJPUlMuYWN0aW9uQWRkaXRpb25hbFNlbGVjdG9yTWF0Y2hlc1dyb25nTm9kZVR5cGVFcnJvcik7XG5cbiAgICAgICAgdGhpcy5hcmd1bWVudE5hbWUgICAgPSBhcmd1bWVudE5hbWU7XG4gICAgICAgIHRoaXMubm9kZURlc2NyaXB0aW9uID0gbm9kZURlc2NyaXB0aW9uO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFjdGlvbkVsZW1lbnROb25FZGl0YWJsZUVycm9yIGV4dGVuZHMgVGVzdFJ1bkVycm9yQmFzZSB7XG4gICAgY29uc3RydWN0b3IgKCkge1xuICAgICAgICBzdXBlcihURVNUX1JVTl9FUlJPUlMuYWN0aW9uRWxlbWVudE5vbkVkaXRhYmxlRXJyb3IpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFjdGlvbkVsZW1lbnROb3RUZXh0QXJlYUVycm9yIGV4dGVuZHMgVGVzdFJ1bkVycm9yQmFzZSB7XG4gICAgY29uc3RydWN0b3IgKCkge1xuICAgICAgICBzdXBlcihURVNUX1JVTl9FUlJPUlMuYWN0aW9uRWxlbWVudE5vdFRleHRBcmVhRXJyb3IpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFjdGlvbkVsZW1lbnROb25Db250ZW50RWRpdGFibGVFcnJvciBleHRlbmRzIFRlc3RSdW5FcnJvckJhc2Uge1xuICAgIGNvbnN0cnVjdG9yIChhcmd1bWVudE5hbWUpIHtcbiAgICAgICAgc3VwZXIoVEVTVF9SVU5fRVJST1JTLmFjdGlvbkVsZW1lbnROb25Db250ZW50RWRpdGFibGVFcnJvcik7XG5cbiAgICAgICAgdGhpcy5hcmd1bWVudE5hbWUgPSBhcmd1bWVudE5hbWU7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQWN0aW9uUm9vdENvbnRhaW5lck5vdEZvdW5kRXJyb3IgZXh0ZW5kcyBUZXN0UnVuRXJyb3JCYXNlIHtcbiAgICBjb25zdHJ1Y3RvciAoKSB7XG4gICAgICAgIHN1cGVyKFRFU1RfUlVOX0VSUk9SUy5hY3Rpb25Sb290Q29udGFpbmVyTm90Rm91bmRFcnJvcik7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQWN0aW9uSW5jb3JyZWN0S2V5c0Vycm9yIGV4dGVuZHMgVGVzdFJ1bkVycm9yQmFzZSB7XG4gICAgY29uc3RydWN0b3IgKGFyZ3VtZW50TmFtZSkge1xuICAgICAgICBzdXBlcihURVNUX1JVTl9FUlJPUlMuYWN0aW9uSW5jb3JyZWN0S2V5c0Vycm9yKTtcblxuICAgICAgICB0aGlzLmFyZ3VtZW50TmFtZSA9IGFyZ3VtZW50TmFtZTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBBY3Rpb25DYW5ub3RGaW5kRmlsZVRvVXBsb2FkRXJyb3IgZXh0ZW5kcyBUZXN0UnVuRXJyb3JCYXNlIHtcbiAgICBjb25zdHJ1Y3RvciAoZmlsZVBhdGhzLCBzY2FubmVkRmlsZVBhdGhzKSB7XG4gICAgICAgIHN1cGVyKFRFU1RfUlVOX0VSUk9SUy5hY3Rpb25DYW5ub3RGaW5kRmlsZVRvVXBsb2FkRXJyb3IpO1xuXG4gICAgICAgIHRoaXMuZmlsZVBhdGhzICAgICAgICA9IGZpbGVQYXRocztcbiAgICAgICAgdGhpcy5zY2FubmVkRmlsZVBhdGhzID0gc2Nhbm5lZEZpbGVQYXRocztcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBBY3Rpb25FbGVtZW50SXNOb3RGaWxlSW5wdXRFcnJvciBleHRlbmRzIFRlc3RSdW5FcnJvckJhc2Uge1xuICAgIGNvbnN0cnVjdG9yICgpIHtcbiAgICAgICAgc3VwZXIoVEVTVF9SVU5fRVJST1JTLmFjdGlvbkVsZW1lbnRJc05vdEZpbGVJbnB1dEVycm9yKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBBY3Rpb25JbnZhbGlkU2Nyb2xsVGFyZ2V0RXJyb3IgZXh0ZW5kcyBUZXN0UnVuRXJyb3JCYXNlIHtcbiAgICBjb25zdHJ1Y3RvciAoc2Nyb2xsVGFyZ2V0WFZhbGlkLCBzY3JvbGxUYXJnZXRZVmFsaWQpIHtcbiAgICAgICAgc3VwZXIoVEVTVF9SVU5fRVJST1JTLmFjdGlvbkludmFsaWRTY3JvbGxUYXJnZXRFcnJvcik7XG5cbiAgICAgICAgaWYgKCFzY3JvbGxUYXJnZXRYVmFsaWQpIHtcbiAgICAgICAgICAgIGlmICghc2Nyb2xsVGFyZ2V0WVZhbGlkKVxuICAgICAgICAgICAgICAgIHRoaXMucHJvcGVydGllcyA9ICdzY3JvbGxUYXJnZXRYIGFuZCBzY3JvbGxUYXJnZXRZIHByb3BlcnRpZXMnO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHRoaXMucHJvcGVydGllcyA9ICdzY3JvbGxUYXJnZXRYIHByb3BlcnR5JztcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgICAgICB0aGlzLnByb3BlcnRpZXMgPSAnc2Nyb2xsVGFyZ2V0WSBwcm9wZXJ0eSc7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgSW52YWxpZEVsZW1lbnRTY3JlZW5zaG90RGltZW5zaW9uc0Vycm9yIGV4dGVuZHMgVGVzdFJ1bkVycm9yQmFzZSB7XG4gICAgY29uc3RydWN0b3IgKHdpZHRoLCBoZWlnaHQpIHtcbiAgICAgICAgc3VwZXIoVEVTVF9SVU5fRVJST1JTLmludmFsaWRFbGVtZW50U2NyZWVuc2hvdERpbWVuc2lvbnNFcnJvcik7XG5cbiAgICAgICAgY29uc3Qgd2lkdGhJc0ludmFsaWQgID0gd2lkdGggPD0gMDtcbiAgICAgICAgY29uc3QgaGVpZ2h0SXNJbnZhbGlkID0gaGVpZ