UNPKG

testcafe

Version:

Automated browser testing for the modern web development stack.

454 lines 81.4 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); // TODO: Fix https://github.com/DevExpress/testcafe/issues/4139 to get rid of Pinkie const pinkie_1 = __importDefault(require("pinkie")); const lodash_1 = require("lodash"); const get_callsite_1 = require("../../errors/get-callsite"); const client_function_builder_1 = __importDefault(require("../../client-functions/client-function-builder")); const assertion_1 = __importDefault(require("./assertion")); const delegated_api_1 = require("../../utils/delegated-api"); const add_rendered_warning_1 = __importDefault(require("../../notifications/add-rendered-warning")); const deprecated_1 = require("../../notifications/deprecated"); const actions_1 = require("../../test-run/commands/actions"); const browser_manipulation_1 = require("../../test-run/commands/browser-manipulation"); const observation_1 = require("../../test-run/commands/observation"); const execution_context_1 = require("./execution-context"); const types_1 = require("../../client-functions/types"); const test_run_1 = require("../../errors/test-run"); const assertion_2 = require("../../test-run/commands/assertion"); const callsite_1 = require("../../utils/callsite"); const re_executable_promise_1 = __importDefault(require("../../utils/re-executable-promise")); const send_1 = require("../../test-run/request/send"); const runtime_1 = require("../../errors/runtime"); const types_2 = require("../../errors/types"); const custom_actions_1 = __importDefault(require("./custom-actions")); const delegated_api_2 = __importDefault(require("./delegated-api")); const get_test_and_fixture_info_1 = require("../../utils/get-test-and-fixture-info"); const originalThen = pinkie_1.default.resolve().then; class TestController { constructor(testRun) { var _a; this._executionContext = null; this.testRun = testRun; this.executionChain = pinkie_1.default.resolve(); this.warningLog = testRun.warningLog; this._customActions = new custom_actions_1.default(this, (_a = testRun === null || testRun === void 0 ? void 0 : testRun.opts) === null || _a === void 0 ? void 0 : _a.customActions); this._addTestControllerToExecutionChain(); } _addTestControllerToExecutionChain() { this.executionChain._testController = this; } // NOTE: TestCafe executes actions and assertions asynchronously in the following cases: // a) The `await` keyword that proceeds the method declaration triggers the `then` function of a Promise. // b) The action is chained to another `awaited` method. // // In order to track missing `await` statements, TestCafe exposes a special Promise to the user. // When TestCafe detects a missing `await` statement, it compares the method's callsite to the call site of the exposed Promise. // This workaround is necessary for situations like these: // // var t2 = t.click('#btn1'); // <-- stores new callsiteWithoutAwait // await t2; // <-- callsiteWithoutAwait = null // t.click('#btn2'); // <-- stores new callsiteWithoutAwait // await t2.click('#btn3'); // <-- without check it will set callsiteWithoutAwait = null, so we will lost tracking _createExtendedPromise(promise, callsite) { const extendedPromise = promise.then(lodash_1.identity); const observedCallsites = this.testRun.observedCallsites; const markCallsiteAwaited = () => observedCallsites.callsitesWithoutAwait.delete(callsite); extendedPromise.then = function () { markCallsiteAwaited(); return originalThen.apply(this, arguments); }; (0, delegated_api_1.delegateAPI)(extendedPromise, TestController.API_LIST, { handler: this, proxyMethod: markCallsiteAwaited, }); return extendedPromise; } _createCommand(CmdCtor, cmdArgs, callsite) { try { return new CmdCtor(cmdArgs, this.testRun); } catch (err) { err.callsite = callsite; throw err; } } _enqueueTask(apiMethodName, createTaskExecutor, callsite) { const executor = createTaskExecutor(); this.executionChain.then = originalThen; this.executionChain = this.executionChain.then(executor); this.testRun.observedCallsites.callsitesWithoutAwait.add(callsite); this.executionChain = this._createExtendedPromise(this.executionChain, callsite); this._addTestControllerToExecutionChain(); return this.executionChain; } enqueueCommand(CmdCtor, cmdArgs, validateCommandFn, callsite) { callsite = callsite || (0, get_callsite_1.getCallsiteForMethod)(CmdCtor.methodName); const command = this._createCommand(CmdCtor, cmdArgs, callsite); if (typeof validateCommandFn === 'function') validateCommandFn(this, command, callsite); return this._enqueueTask(command.methodName, () => { return () => { return this.testRun.executeCommand(command, callsite) .catch(err => { this.executionChain = pinkie_1.default.resolve(); throw err; }); }; }, callsite); } _validateMultipleWindowCommand(apiMethodName) { const { disableMultipleWindows, activeWindowId } = this.testRun; if (this.testRun.isNativeAutomation && !this.testRun.isExperimentalMultipleWindows) throw new test_run_1.MultipleWindowsModeIsNotSupportedInNativeAutomationModeError(apiMethodName); if (disableMultipleWindows) throw new test_run_1.MultipleWindowsModeIsDisabledError(apiMethodName); if (!activeWindowId) throw new test_run_1.MultipleWindowsModeIsNotAvailableInRemoteBrowserError(apiMethodName); } getExecutionContext() { if (!this._executionContext) this._executionContext = (0, execution_context_1.createExecutionContext)(this.testRun); return this._executionContext; } // API implementation // We need implementation methods to obtain correct callsites. If we use plain API // methods in chained wrappers then we will have callsite for the wrapped method // in this file instead of chained method callsite in user code. _ctx$getter() { return this.testRun.ctx; } _ctx$setter(val) { this.testRun.ctx = val; return this.testRun.ctx; } _fixtureCtx$getter() { return this.testRun.fixtureCtx; } _browser$getter() { return this.testRun.browser; } _customActions$getter() { return this._customActions || new custom_actions_1.default(this, this.testRun.opts.customActions); } _test$getter() { return (0, get_test_and_fixture_info_1.getTestInfo)(this.testRun); } _fixture$getter() { return (0, get_test_and_fixture_info_1.getFixtureInfo)(this.testRun); } [(0, delegated_api_2.default)(actions_1.DispatchEventCommand.methodName)](selector, eventName, options = {}) { return this.enqueueCommand(actions_1.DispatchEventCommand, { selector, eventName, options, relatedTarget: options.relatedTarget }); } _prepareCookieArguments(args, isSetCommand = false) { const urlsArg = (0, lodash_1.castArray)(args[1]); const urls = Array.isArray(urlsArg) && typeof urlsArg[0] === 'string' ? urlsArg : []; const cookiesArg = urls.length ? args[0] : args; const cookies = []; (0, lodash_1.flattenDeep)((0, lodash_1.castArray)(cookiesArg)).forEach(cookie => { if (isSetCommand && !cookie.name && typeof cookie === 'object') Object.entries(cookie).forEach(([name, value]) => cookies.push({ name, value })); else if (!isSetCommand && typeof cookie === 'string') cookies.push({ name: cookie }); else cookies.push(cookie); }); return { urls, cookies }; } [(0, delegated_api_2.default)(actions_1.GetCookiesCommand.methodName)](...args) { return this.enqueueCommand(actions_1.GetCookiesCommand, this._prepareCookieArguments(args)); } [(0, delegated_api_2.default)(actions_1.SetCookiesCommand.methodName)](...args) { const { urls, cookies } = this._prepareCookieArguments(args, true); return this.enqueueCommand(actions_1.SetCookiesCommand, { cookies, url: urls[0] }); } [(0, delegated_api_2.default)(actions_1.DeleteCookiesCommand.methodName)](...args) { return this.enqueueCommand(actions_1.DeleteCookiesCommand, this._prepareCookieArguments(args)); } _prepareRequestArguments(bindOptions, ...args) { const [url, options] = typeof args[0] === 'object' ? [args[0].url, args[0]] : args; return { url, options: Object.assign({}, options, bindOptions), }; } _createRequestFunction(bindOptions = {}) { const controller = this; const callsite = (0, get_callsite_1.getCallsiteForMethod)(actions_1.RequestCommand.methodName); if (!controller.testRun) throw new runtime_1.RequestRuntimeError(callsite, types_2.RUNTIME_ERRORS.requestCannotResolveTestRun); return function (...args) { const cmdArgs = controller._prepareRequestArguments(bindOptions, ...args); const command = controller._createCommand(actions_1.RequestCommand, cmdArgs, callsite); const options = Object.assign(Object.assign({}, command.options), { url: command.url || command.options.url || '' }); const promise = re_executable_promise_1.default.fromFn(async () => { return (0, send_1.sendRequestThroughAPI)(controller.testRun, options, callsite); }); actions_1.RequestCommand.resultGetters.forEach(getter => { Object.defineProperty(promise, getter, { get: () => re_executable_promise_1.default.fromFn(async () => { const response = await (0, send_1.sendRequestThroughAPI)(controller.testRun, options, callsite); return response[getter]; }), }); }); return promise; }; } _decorateRequestFunction(fn) { actions_1.RequestCommand.extendedMethods.forEach(method => { Object.defineProperty(fn, method, { value: this._createRequestFunction({ method }), }); }); } [(0, delegated_api_2.default)(actions_1.RequestCommand.methodName, 'getter')]() { const fn = this._createRequestFunction(); this._decorateRequestFunction(fn); return fn; } [(0, delegated_api_2.default)(actions_1.ClickCommand.methodName)](selector, options) { return this.enqueueCommand(actions_1.ClickCommand, { selector, options }); } [(0, delegated_api_2.default)(actions_1.RightClickCommand.methodName)](selector, options) { return this.enqueueCommand(actions_1.RightClickCommand, { selector, options }); } [(0, delegated_api_2.default)(actions_1.DoubleClickCommand.methodName)](selector, options) { return this.enqueueCommand(actions_1.DoubleClickCommand, { selector, options }); } [(0, delegated_api_2.default)(actions_1.HoverCommand.methodName)](selector, options) { return this.enqueueCommand(actions_1.HoverCommand, { selector, options }); } [(0, delegated_api_2.default)(actions_1.DragCommand.methodName)](selector, dragOffsetX, dragOffsetY, options) { return this.enqueueCommand(actions_1.DragCommand, { selector, dragOffsetX, dragOffsetY, options }); } [(0, delegated_api_2.default)(actions_1.DragToElementCommand.methodName)](selector, destinationSelector, options) { return this.enqueueCommand(actions_1.DragToElementCommand, { selector, destinationSelector, options }); } _getSelectorForScroll(args) { const selector = typeof args[0] === 'string' || (0, types_1.isSelector)(args[0]) ? args[0] : null; if (selector) args.shift(); else // NOTE: here we use document.scrollingElement for old Safari versions // document.documentElement does not work as expected on Mojave Safari 12.1/ High Sierra Safari 11.1 // eslint-disable-next-line no-undef return () => document.scrollingElement || document.documentElement; return selector; } _getPosition(args) { const position = args.length === 1 && typeof args[0] === 'string' ? args[0] : null; if (position) args.shift(); return position; } [(0, delegated_api_2.default)(actions_1.ScrollCommand.methodName)](...args) { let position = this._getPosition(args); const selector = this._getSelectorForScroll(args); let x = void 0; let y = void 0; let options = void 0; if (typeof args[0] === 'string') [position, options] = args; if (typeof args[0] === 'number') [x, y, options] = args; return this.enqueueCommand(actions_1.ScrollCommand, { selector, x, y, position, options }); } [(0, delegated_api_2.default)(actions_1.ScrollByCommand.methodName)](...args) { const selector = this._getSelectorForScroll(args); const [byX, byY, options] = args; return this.enqueueCommand(actions_1.ScrollByCommand, { selector, byX, byY, options }); } [(0, delegated_api_2.default)(actions_1.ScrollIntoViewCommand.methodName)](selector, options) { return this.enqueueCommand(actions_1.ScrollIntoViewCommand, { selector, options }); } [(0, delegated_api_2.default)(actions_1.TypeTextCommand.methodName)](selector, text, options) { return this.enqueueCommand(actions_1.TypeTextCommand, { selector, text, options }); } [(0, delegated_api_2.default)(actions_1.SelectTextCommand.methodName)](selector, startPos, endPos, options) { return this.enqueueCommand(actions_1.SelectTextCommand, { selector, startPos, endPos, options }); } [(0, delegated_api_2.default)(actions_1.SelectTextAreaContentCommand.methodName)](selector, startLine, startPos, endLine, endPos, options) { return this.enqueueCommand(actions_1.SelectTextAreaContentCommand, { selector, startLine, startPos, endLine, endPos, options, }); } [(0, delegated_api_2.default)(actions_1.SelectEditableContentCommand.methodName)](startSelector, endSelector, options) { return this.enqueueCommand(actions_1.SelectEditableContentCommand, { startSelector, endSelector, options, }); } [(0, delegated_api_2.default)(actions_1.PressKeyCommand.methodName)](keys, options) { return this.enqueueCommand(actions_1.PressKeyCommand, { keys, options }); } [(0, delegated_api_2.default)(observation_1.WaitCommand.methodName)](timeout) { return this.enqueueCommand(observation_1.WaitCommand, { timeout }); } [(0, delegated_api_2.default)(actions_1.NavigateToCommand.methodName)](url) { return this.enqueueCommand(actions_1.NavigateToCommand, { url }); } [(0, delegated_api_2.default)(actions_1.SetFilesToUploadCommand.methodName)](selector, filePath) { return this.enqueueCommand(actions_1.SetFilesToUploadCommand, { selector, filePath }); } [(0, delegated_api_2.default)(actions_1.ClearUploadCommand.methodName)](selector) { return this.enqueueCommand(actions_1.ClearUploadCommand, { selector }); } [(0, delegated_api_2.default)(browser_manipulation_1.TakeScreenshotCommand.methodName)](options) { if (options && typeof options !== 'object') options = { path: options }; return this.enqueueCommand(browser_manipulation_1.TakeScreenshotCommand, options); } [(0, delegated_api_2.default)(browser_manipulation_1.TakeElementScreenshotCommand.methodName)](selector, ...args) { const commandArgs = { selector }; if (args[1]) { commandArgs.path = args[0]; commandArgs.options = args[1]; } else if (typeof args[0] === 'object') commandArgs.options = args[0]; else commandArgs.path = args[0]; return this.enqueueCommand(browser_manipulation_1.TakeElementScreenshotCommand, commandArgs); } [(0, delegated_api_2.default)(browser_manipulation_1.ResizeWindowCommand.methodName)](width, height) { return this.enqueueCommand(browser_manipulation_1.ResizeWindowCommand, { width, height }); } [(0, delegated_api_2.default)(browser_manipulation_1.ResizeWindowToFitDeviceCommand.methodName)](device, options) { return this.enqueueCommand(browser_manipulation_1.ResizeWindowToFitDeviceCommand, { device, options }); } [(0, delegated_api_2.default)(browser_manipulation_1.MaximizeWindowCommand.methodName)]() { return this.enqueueCommand(browser_manipulation_1.MaximizeWindowCommand); } [(0, delegated_api_2.default)(actions_1.SwitchToIframeCommand.methodName)](selector) { return this.enqueueCommand(actions_1.SwitchToIframeCommand, { selector }); } [(0, delegated_api_2.default)(actions_1.SwitchToMainWindowCommand.methodName)]() { return this.enqueueCommand(actions_1.SwitchToMainWindowCommand); } [(0, delegated_api_2.default)(actions_1.OpenWindowCommand.methodName)](url) { this._validateMultipleWindowCommand(actions_1.OpenWindowCommand.methodName); return this.enqueueCommand(actions_1.OpenWindowCommand, { url }); } [(0, delegated_api_2.default)(actions_1.CloseWindowCommand.methodName)](window) { const windowId = (window === null || window === void 0 ? void 0 : window.id) || null; this._validateMultipleWindowCommand(actions_1.CloseWindowCommand.methodName); return this.enqueueCommand(actions_1.CloseWindowCommand, { windowId }); } [(0, delegated_api_2.default)(actions_1.GetCurrentWindowCommand.methodName)]() { this._validateMultipleWindowCommand(actions_1.GetCurrentWindowCommand.methodName); return this.enqueueCommand(actions_1.GetCurrentWindowCommand); } [(0, delegated_api_2.default)(actions_1.GetCurrentCDPSessionCommand.methodName)]() { const callsite = (0, get_callsite_1.getCallsiteForMethod)(actions_1.GetCurrentCDPSessionCommand.methodName); const command = this._createCommand(actions_1.GetCurrentCDPSessionCommand, {}, callsite); return this.testRun.executeCommand(command, callsite); } [(0, delegated_api_2.default)(actions_1.SwitchToWindowCommand.methodName)](windowSelector) { this._validateMultipleWindowCommand(actions_1.SwitchToWindowCommand.methodName); let command; let args; if (typeof windowSelector === 'function') { command = actions_1.SwitchToWindowByPredicateCommand; args = { checkWindow: windowSelector }; } else { command = actions_1.SwitchToWindowCommand; args = { windowId: windowSelector === null || windowSelector === void 0 ? void 0 : windowSelector.id }; } return this.enqueueCommand(command, args); } [(0, delegated_api_2.default)(actions_1.SwitchToParentWindowCommand.methodName)]() { this._validateMultipleWindowCommand(actions_1.SwitchToParentWindowCommand.methodName); return this.enqueueCommand(actions_1.SwitchToParentWindowCommand); } [(0, delegated_api_2.default)(actions_1.SwitchToPreviousWindowCommand.methodName)]() { this._validateMultipleWindowCommand(actions_1.SwitchToPreviousWindowCommand.methodName); return this.enqueueCommand(actions_1.SwitchToPreviousWindowCommand); } _eval$(fn, options) { if (!(0, lodash_1.isNil)(options)) options = (0, lodash_1.assign)({}, options, { boundTestRun: this }); const builder = new client_function_builder_1.default(fn, options, { instantiation: 'eval', execution: 'eval' }); const clientFn = builder.getFunction(); return clientFn(); } [(0, delegated_api_2.default)(actions_1.SetNativeDialogHandlerCommand.methodName)](fn, options) { return this.enqueueCommand(actions_1.SetNativeDialogHandlerCommand, { dialogHandler: { fn, options }, }); } [(0, delegated_api_2.default)(actions_1.GetNativeDialogHistoryCommand.methodName)]() { const callsite = (0, get_callsite_1.getCallsiteForMethod)(actions_1.GetNativeDialogHistoryCommand.methodName); const command = this._createCommand(actions_1.GetNativeDialogHistoryCommand, {}, callsite); return this.testRun.executeCommand(command, callsite); } [(0, delegated_api_2.default)(actions_1.GetBrowserConsoleMessagesCommand.methodName)]() { const callsite = (0, get_callsite_1.getCallsiteForMethod)(actions_1.GetBrowserConsoleMessagesCommand.methodName); const command = this._createCommand(actions_1.GetBrowserConsoleMessagesCommand, {}, callsite); return this.testRun.executeCommand(command, callsite); } checkForExcessiveAwaits(checkedCallsite, { actionId }) { const snapshotPropertyCallsites = this.testRun.observedCallsites.snapshotPropertyCallsites; const callsiteId = (0, callsite_1.getCallsiteId)(checkedCallsite); // NOTE: If there are unasserted callsites, we should add all of them to awaitedSnapshotWarnings. // The warnings themselves are raised after the test run in wrap-test-function if (snapshotPropertyCallsites[callsiteId] && !snapshotPropertyCallsites[callsiteId].checked) { for (const propertyCallsite of snapshotPropertyCallsites[callsiteId].callsites) this.testRun.observedCallsites.awaitedSnapshotWarnings.set((0, callsite_1.getCallsiteStackFrameString)(propertyCallsite), { callsite: propertyCallsite, actionId }); delete snapshotPropertyCallsites[callsiteId]; } else snapshotPropertyCallsites[callsiteId] = { callsites: [], checked: true }; } [(0, delegated_api_2.default)(assertion_2.AssertionCommand.methodName)](actual) { const callsite = (0, get_callsite_1.getCallsiteForMethod)(assertion_2.AssertionCommand.methodName); return new assertion_1.default(actual, this, callsite); } [(0, delegated_api_2.default)(observation_1.DebugCommand.methodName)](selector) { return this.enqueueCommand(observation_1.DebugCommand, { selector }); } [(0, delegated_api_2.default)(actions_1.SetTestSpeedCommand.methodName)](speed) { return this.enqueueCommand(actions_1.SetTestSpeedCommand, { speed }); } [(0, delegated_api_2.default)(actions_1.SetPageLoadTimeoutCommand.methodName)](duration) { return this.enqueueCommand(actions_1.SetPageLoadTimeoutCommand, { duration }, (testController, command) => { (0, add_rendered_warning_1.default)(testController.warningLog, { message: (0, deprecated_1.getDeprecationMessage)(deprecated_1.DEPRECATED.setPageLoadTimeout), actionId: command.actionId }); }); } [(0, delegated_api_2.default)(actions_1.UseRoleCommand.methodName)](role) { return this.enqueueCommand(actions_1.UseRoleCommand, { role }); } [(0, delegated_api_2.default)(actions_1.SkipJsErrorsCommand.methodName)](options) { return this.enqueueCommand(actions_1.SkipJsErrorsCommand, { options }); } [(0, delegated_api_2.default)(actions_1.AddRequestHooksCommand.methodName)](...hooks) { hooks = (0, lodash_1.flattenDeep)(hooks); return this.enqueueCommand(actions_1.AddRequestHooksCommand, { hooks }); } [(0, delegated_api_2.default)(actions_1.RemoveRequestHooksCommand.methodName)](...hooks) { hooks = (0, lodash_1.flattenDeep)(hooks); return this.enqueueCommand(actions_1.RemoveRequestHooksCommand, { hooks }); } [(0, delegated_api_2.default)(actions_1.ReportCommand.methodName)](...args) { return this.enqueueCommand(actions_1.ReportCommand, { args }); } shouldStop(command) { // NOTE: should always stop on Debug command return command === 'debug'; } } exports.default = TestController; TestController.API_LIST = (0, delegated_api_1.getDelegatedAPIList)(TestController.prototype); (0, delegated_api_1.delegateAPI)(TestController.prototype, TestController.API_LIST, { useCurrentCtxAsHandler: true }); module.exports = exports.default; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBpL3Rlc3QtY29udHJvbGxlci9pbmRleC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLG9GQUFvRjtBQUNwRixvREFBNkI7QUFDN0IsbUNBTWdCO0FBRWhCLDREQUFpRTtBQUNqRSw2R0FBbUY7QUFDbkYsNERBQW9DO0FBQ3BDLDZEQUE2RTtBQUM3RSxvR0FBa0U7QUFDbEUsK0RBQW1GO0FBRW5GLDZEQTJDeUM7QUFFekMsdUZBTXNEO0FBRXRELHFFQUFnRjtBQUNoRiwyREFBOEU7QUFDOUUsd0RBQTBEO0FBRTFELG9EQUkrQjtBQUUvQixpRUFBcUU7QUFDckUsbURBQWtGO0FBQ2xGLDhGQUFvRTtBQUNwRSxzREFBbUY7QUFDbkYsa0RBQTJEO0FBQzNELDhDQUFvRDtBQUNwRCxzRUFBNkM7QUFDN0Msb0VBQTJDO0FBQzNDLHFGQUFvRjtBQUVwRixNQUFNLFlBQVksR0FBRyxnQkFBTyxDQUFDLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQztBQUU1QyxNQUFxQixjQUFjO0lBQy9CLFlBQWEsT0FBTzs7UUFDaEIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQztRQUU5QixJQUFJLENBQUMsT0FBTyxHQUFVLE9BQU8sQ0FBQztRQUM5QixJQUFJLENBQUMsY0FBYyxHQUFHLGdCQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDeEMsSUFBSSxDQUFDLFVBQVUsR0FBTyxPQUFPLENBQUMsVUFBVSxDQUFDO1FBQ3pDLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSx3QkFBYSxDQUFDLElBQUksRUFBRSxNQUFBLE9BQU8sYUFBUCxPQUFPLHVCQUFQLE9BQU8sQ0FBRSxJQUFJLDBDQUFFLGFBQWEsQ0FBQyxDQUFDO1FBRTVFLElBQUksQ0FBQyxrQ0FBa0MsRUFBRSxDQUFDO0lBQzlDLENBQUM7SUFFRCxrQ0FBa0M7UUFDOUIsSUFBSSxDQUFDLGNBQWMsQ0FB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LENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBRSxHQUFHLElBQUk7UUFDN0MsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLHVCQUFhLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ3hELENBQUM7SUFDRCxVQUFVLENBQUUsT0FBTztRQUNmLDRDQUE0QztRQUM1QyxPQUFPLE9BQU8sS0FBSyxPQUFPLENBQUM7SUFDL0IsQ0FBQztDQUNKO0FBampCRCxpQ0FpakJDO0FBRUQsY0FBYyxDQUFDLFFBQVEsR0FBRyxJQUFBLG1DQUFtQixFQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUV4RSxJQUFBLDJCQUFXLEVBQUMsY0FBYyxDQUFDLFNBQVMsRUFBRSxjQUFjLENBQUMsUUFBUSxFQUFFLEVBQUUsc0JBQXNCLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIFRPRE86IEZpeCBodHRwczovL2dpdGh1Yi5jb20vRGV2RXhwcmVzcy90ZXN0Y2FmZS9pc3N1ZXMvNDEzOSB0byBnZXQgcmlkIG9mIFBpbmtpZVxuaW1wb3J0IFByb21pc2UgZnJvbSAncGlua2llJztcbmltcG9ydCB7XG4gICAgaWRlbnRpdHksXG4gICAgYXNzaWduLFxuICAgIGlzTmlsIGFzIGlzTnVsbE9yVW5kZWZpbmVkLFxuICAgIGZsYXR0ZW5EZWVwLFxuICAgIGNhc3RBcnJheSxcbn0gZnJvbSAnbG9kYXNoJztcblxuaW1wb3J0IHsgZ2V0Q2FsbHNpdGVGb3JNZXRob2QgfSBmcm9tICcuLi8uLi9lcnJvcnMvZ2V0LWNhbGxzaXRlJztcbmltcG9ydCBDbGllbnRGdW5jdGlvbkJ1aWxkZXIgZnJvbSAnLi4vLi4vY2xpZW50LWZ1bmN0aW9ucy9jbGllbnQtZnVuY3Rpb24tYnVpbGRlcic7XG5pbXBvcnQgQXNzZXJ0aW9uIGZyb20gJy4vYXNzZXJ0aW9uJztcbmltcG9ydCB7IGdldERlbGVnYXRlZEFQS