UNPKG

testcafe

Version:

Automated browser testing for the modern web development stack.

168 lines (165 loc) 28.4 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const lodash_1 = require("lodash"); const dedent_1 = __importDefault(require("dedent")); const client_function_builder_1 = __importDefault(require("../client-function-builder")); const replicator_1 = require("../replicator"); const runtime_1 = require("../../errors/runtime"); const builder_symbol_1 = __importDefault(require("../builder-symbol")); const types_1 = require("../../errors/types"); const type_assertions_1 = require("../../errors/runtime/type-assertions"); const execute_client_function_1 = require("../../test-run/commands/execute-client-function"); const define_lazy_property_1 = __importDefault(require("../../utils/define-lazy-property")); const add_api_1 = require("./add-api"); const create_snapshot_methods_1 = __importDefault(require("./create-snapshot-methods")); const prepare_api_args_1 = __importDefault(require("./prepare-api-args")); const return_single_prop_mode_1 = __importDefault(require("../return-single-prop-mode")); const escape_unsafe_chars_1 = __importDefault(require("../../utils/escape-unsafe-chars")); class SelectorBuilder extends client_function_builder_1.default { constructor(fn, options, callsiteNames, callsite) { const apiFn = options && options.apiFn; const apiFnID = options && options.apiFnID; const builderFromSelector = fn && fn[builder_symbol_1.default]; const builderFromPromiseOrSnapshot = fn && fn.selector && fn.selector[builder_symbol_1.default]; let builder = builderFromSelector || builderFromPromiseOrSnapshot; builder = builder instanceof SelectorBuilder ? builder : null; if (builder) { fn = builder.fn; if (options === void 0 || typeof options === 'object') options = (0, lodash_1.merge)({}, builder.options, options, { sourceSelectorBuilder: builder }); } super(fn, options, callsiteNames); if (!this.options.apiFnChain) { const fnType = typeof this.fn; let item = fnType === 'string' ? `'${this.fn}'` : `[${fnType}]`; item = `Selector(${item})`; this.options.apiFn = item; this.options.apiFnChain = [item]; } if (apiFn) this.options.apiFnChain.push(apiFn); this.options.apiFnID = typeof apiFnID === 'number' ? apiFnID : this.options.apiFnChain.length - 1; this.callsite = callsite; } _getCompiledFnCode() { // OPTIMIZATION: if selector was produced from another selector and // it has same dependencies as source selector, then we can // avoid recompilation and just re-use already compiled code. const hasSameDependenciesAsSourceSelector = this.options.sourceSelectorBuilder && this.options.sourceSelectorBuilder.options.dependencies === this.options.dependencies; if (hasSameDependenciesAsSourceSelector) return this.options.sourceSelectorBuilder.compiledFnCode; const code = typeof this.fn === 'string' ? `(function(){return document.querySelectorAll(${(0, escape_unsafe_chars_1.default)(JSON.stringify(this.fn))});});` : super._getCompiledFnCode(); if (code) { return (0, dedent_1.default)(`(function(){ var __f$=${code}; return function(){ var args = __dependencies$.boundArgs || arguments; var selectorFilter = __dependencies$.selectorFilter; var nodes = __f$.apply(this, args); nodes = selectorFilter.cast(nodes); if (!nodes.length && !selectorFilter.error) selectorFilter.error = __dependencies$.apiInfo.apiFnID; return selectorFilter.filter(nodes, __dependencies$.filterOptions, __dependencies$.apiInfo); }; })();`); } return null; } _createInvalidFnTypeError() { return new runtime_1.ClientFunctionAPIError(this.callsiteNames.instantiation, this.callsiteNames.instantiation, types_1.RUNTIME_ERRORS.selectorInitializedWithWrongType, typeof this.fn); } _executeCommand(args, testRun, callsite) { const resultPromise = super._executeCommand(args, testRun, this.callsite || callsite); this._addBoundArgsSelectorGetter(resultPromise, args); // OPTIMIZATION: use buffer function as selector not to trigger lazy property ahead of time (0, add_api_1.addAPI)(resultPromise, () => resultPromise.selector, SelectorBuilder, this.options.customDOMProperties, this.options.customMethods); return resultPromise; } _getSourceSelectorBuilderApiFnID() { let selectorAncestor = this; while (selectorAncestor.options.sourceSelectorBuilder) selectorAncestor = selectorAncestor.options.sourceSelectorBuilder; return selectorAncestor.options.apiFnID; } getFunctionDependencies() { const dependencies = super.getFunctionDependencies(); const { filterVisible, filterHidden, counterMode, collectionMode, getVisibleValueMode, index, customDOMProperties, customMethods, apiFnChain, boundArgs, } = this.options; return (0, lodash_1.merge)({}, dependencies, { filterOptions: { filterVisible, filterHidden, counterMode, collectionMode, index: (0, lodash_1.isNil)(index) ? null : index, getVisibleValueMode, }, apiInfo: { apiFnChain, apiFnID: this._getSourceSelectorBuilderApiFnID(), }, boundArgs, customDOMProperties, customMethods, }); } _createTestRunCommand(encodedArgs, encodedDependencies) { return new execute_client_function_1.ExecuteSelectorCommand({ instantiationCallsiteName: this.callsiteNames.instantiation, fnCode: this.compiledFnCode, args: encodedArgs, dependencies: encodedDependencies, needError: this.options.needError, apiFnChain: this.options.apiFnChain, visibilityCheck: !!this.options.visibilityCheck, timeout: this.options.timeout, strictError: this.options.strictError, }); } _validateOptions(options) { super._validateOptions(options); if (!(0, lodash_1.isNil)(options.visibilityCheck)) (0, type_assertions_1.assertType)(type_assertions_1.is.boolean, this.callsiteNames.instantiation, 'The "visibilityCheck" option', options.visibilityCheck); if (!(0, lodash_1.isNil)(options.timeout)) (0, type_assertions_1.assertType)(type_assertions_1.is.nonNegativeNumber, this.callsiteNames.instantiation, 'The "timeout" option', options.timeout); } _getReplicatorTransforms() { const transforms = super._getReplicatorTransforms(); transforms.push(new replicator_1.SelectorNodeTransform()); return transforms; } _addBoundArgsSelectorGetter(obj, selectorArgs) { (0, define_lazy_property_1.default)(obj, 'selector', () => { const builder = new SelectorBuilder(this.getFunction(), { boundArgs: selectorArgs }); return builder.getFunction(); }); } _decorateFunction(selectorFn) { super._decorateFunction(selectorFn); (0, add_api_1.addAPI)(selectorFn, () => selectorFn, SelectorBuilder, this.options.customDOMProperties, this.options.customMethods, this._getObservedCallsites()); } _getClientFnWithOverriddenOptions(options) { const apiFn = (0, prepare_api_args_1.default)('with', options); const previousSelectorID = this.options.apiFnChain.length - 1; return super._getClientFnWithOverriddenOptions(Object.assign(options, { apiFn, apiFnID: previousSelectorID })); } _processResult(result, selectorArgs) { const snapshot = super._processResult(result, selectorArgs); if (snapshot && !(0, return_single_prop_mode_1.default)(this.options)) { this._addBoundArgsSelectorGetter(snapshot, selectorArgs); (0, create_snapshot_methods_1.default)(snapshot); if (this.options.customMethods) (0, add_api_1.addCustomMethods)(snapshot, () => snapshot.selector, SelectorBuilder, this.options.customMethods); } return snapshot; } } exports.default = SelectorBuilder; module.exports = exports.default; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0b3ItYnVpbGRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jbGllbnQtZnVuY3Rpb25zL3NlbGVjdG9ycy9zZWxlY3Rvci1idWlsZGVyLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsbUNBQTJEO0FBQzNELG9EQUE0QjtBQUM1Qix5RkFBK0Q7QUFDL0QsOENBQXNEO0FBQ3RELGtEQUE4RDtBQUM5RCx1RUFBc0Q7QUFDdEQsOENBQW9EO0FBQ3BELDBFQUFzRTtBQUN0RSw2RkFBeUY7QUFDekYsNEZBQWtFO0FBQ2xFLHVDQUFxRDtBQUNyRCx3RkFBOEQ7QUFDOUQsMEVBQWtEO0FBQ2xELHlGQUE4RDtBQUM5RCwwRkFBZ0U7QUFFaEUsTUFBcUIsZUFBZ0IsU0FBUSxpQ0FBcUI7SUFDOUQsWUFBYSxFQUFFLEVBQUUsT0FBTyxFQUFFLGFBQWEsRUFBRSxRQUFRO1FBQzdDLE1BQU0sS0FBSyxHQUEwQixPQUFPLElBQUksT0FBTyxDQUFDLEtBQUssQ0FBQztRQUM5RCxNQUFNLE9BQU8sR0FBd0IsT0FBTyxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUM7UUFDaEUsTUFBTSxtQkFBbUIsR0FBWSxFQUFFLElBQUksRUFBRSxDQUFDLHdCQUFxQixDQUFDLENBQUM7UUFDckUsTUFBTSw0QkFBNEIsR0FBRyxFQUFFLElBQUksRUFBRSxDQUFDLFFBQVEsSUFBSSxFQUFFLENBQUMsUUFBUSxDQUFDLHdCQUFxQixDQUFDLENBQUM7UUFDN0YsSUFBSSxPQUFPLEdBQTBCLG1CQUFtQixJQUFJLDRCQUE0QixDQUFDO1FBRXpGLE9BQU8sR0FBRyxPQUFPLFlBQVksZUFBZSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUU5RCxJQUFJLE9BQU8sRUFBRTtZQUNULEVBQUUsR0FBRyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBRWhCLElBQUksT0FBTyxLQUFLLEtBQUssQ0FBQyxJQUFJLE9B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SSxDQUFDLElBQUEsaUNBQW9CLEVBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ2pELElBQUksQ0FBQywyQkFBMkIsQ0FBQyxRQUFRLEVBQUUsWUFBWSxDQUFDLENBQUM7WUFDekQsSUFBQSxpQ0FBcUIsRUFBQyxRQUFRLENBQUMsQ0FBQztZQUVoQyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYTtnQkFDMUIsSUFBQSwwQkFBZ0IsRUFBQyxRQUFRLEVBQUUsR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxlQUFlLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQztTQUN4RztRQUVELE9BQU8sUUFBUSxDQUFDO0lBQ3BCLENBQUM7Q0FDSjtBQTdNRCxrQ0E2TUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpc05pbCBhcyBpc051bGxPclVuZGVmaW5lZCwgbWVyZ2UgfSBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IGRlZGVudCBmcm9tICdkZWRlbnQnO1xuaW1wb3J0IENsaWVudEZ1bmN0aW9uQnVpbGRlciBmcm9tICcuLi9jbGllbnQtZnVuY3Rpb24tYnVpbGRlcic7XG5pbXBvcnQgeyBTZWxlY3Rvck5vZGVUcmFuc2Zvcm0gfSBmcm9tICcuLi9yZXBsaWNhdG9yJztcbmltcG9ydCB7IENsaWVudEZ1bmN0aW9uQVBJRXJyb3IgfSBmcm9tICcuLi8uLi9lcnJvcnMvcnVudGltZSc7XG5pbXBvcnQgZnVuY3Rpb25CdWlsZGVyU3ltYm9sIGZyb20gJy4uL2J1aWxkZXItc3ltYm9sJztcbmltcG9ydCB7IFJVTlRJTUVfRVJST1JTIH0gZnJvbSAnLi4vLi4vZXJyb3JzL3R5cGVzJztcbmltcG9ydCB7IGFzc2VydFR5cGUsIGlzIH0gZnJvbSAnLi4vLi4vZXJyb3JzL3J1bnRpbWUvdHlwZS1hc3NlcnRpb25zJztcbmltcG9ydCB7IEV4ZWN1dGVTZWxlY3RvckNvbW1hbmQgfSBmcm9tICcuLi8uLi90ZXN0LXJ1bi9jb21tYW5kcy9leGVjdXRlLWNsaWVudC1mdW5jdGlvbic7XG5pbXBvcnQgZGVmaW5lTGF6eVByb3BlcnR5IGZyb20gJy4uLy4uL3V0aWxzL2RlZmluZS1sYXp5LXByb3BlcnR5JztcbmltcG9ydCB7IGFkZEFQSSwgYWRkQ3VzdG9tTWV0aG9kcyB9IGZyb20gJy4vYWRkLWFwaSc7XG5pbXBvcnQgY3JlYXRlU25hcHNob3RNZXRob2RzIGZyb20gJy4vY3JlYXRlLXNuYXBzaG90LW1ldGhvZHMnO1xuaW1wb3J0IHByZXBhcmVBcGlGbkFyZ3MgZnJvbSAnLi9wcmVwYXJlLWFwaS1hcmdzJztcbmltcG9ydCByZXR1cm5TaW5nbGVQcm9wTW9kZSBmcm9tICcuLi9yZXR1cm4tc2luZ2xlLXByb3AtbW9kZSc7XG5pbXBvcnQgZXNjYXBlVW5zYWZlQ2hhcnMgZnJvbSAnLi4vLi4vdXRpbHMvZXNjYXBlLXVuc2FmZS1jaGFycyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNlbGVjdG9yQnVpbGRlciBleHRlbmRzIENsaWVudEZ1bmN0aW9uQnVpbGRlciB7XG4gICAgY29uc3RydWN0b3IgKGZuLCBvcHRpb25zLCBjYWxsc2l0ZU5hbWVzLCBjYWxsc2l0ZSkge1xuICAgICAgICBjb25zdCBhcGlGbiAgICAgICAgICAgICAgICAgICAgICAgID0gb3B0aW9ucyAmJiBvcHRpb25zLmFwaUZuO1xuICAgICAgICBjb25zdCBhcGlGbklEICAgICAgICAgICAgICAgICAgICAgID0gb3B0aW9ucyAmJiBvcHRpb25zLmFwaUZuSUQ7XG4gICAgICAgIGNvbnN0IGJ1aWxkZXJGcm9tU2VsZWN0b3IgICAgICAgICAgPSBmbiAmJiBmbltmdW5jdGlvbkJ1aWxkZXJTeW1ib2xdO1xuICAgICAgICBjb25zdCBidWlsZGVyRnJvbVByb21pc2VPclNuYXBzaG90ID0gZm4gJiYgZm4uc2VsZWN0b3IgJiYgZm4uc2VsZWN0b3JbZnVuY3Rpb25CdWlsZGVyU3ltYm9sXTtcbiAgICAgICAgbGV0IGJ1aWxkZXIgICAgICAgICAgICAgICAgICAgICAgICA9IGJ1aWxkZXJGcm9tU2VsZWN0b3IgfHwgYnVpbGRlckZyb21Qcm9taXNlT3JTbmFwc2hvdDtcblxuICAgICAgICBidWlsZGVyID0gYnVpbGRlciBpbnN0YW5jZW9mIFNlbGVjdG9yQnVpbGRlciA/IGJ1aWxkZXIgOiBudWxsO1xuXG4gICAgICAgIGlmIChidWlsZGVyKSB7XG4gICAgICAgICAgICBmbiA9IGJ1aWxkZXIuZm47XG5cbiAgICAgICAgICAgIGlmIChvcHRpb25zID09PSB2b2lkIDAgfHwgdHlwZW9mIG9wdGlvbnMgPT09ICdvYmplY3QnKVxuICAgICAgICAgICAgICAgIG9wdGlvbnMgPSBtZXJnZSh7fSwgYnVpbGRlci5vcHRpb25zLCBvcHRpb25zLCB7IHNvdXJjZVNlbGVjdG9yQnVpbGRlcjogYnVpbGRlciB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHN1cGVyKGZuLCBvcHRpb25zLCBjYWxsc2l0ZU5hbWVzKTtcblxuICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5hcGlGbkNoYWluKSB7XG4gICAgICAgICAgICBjb25zdCBmblR5cGUgPSB0eXBlb2YgdGhpcy5mbjtcbiAgICAgICAgICAgIGxldCBpdGVtICAgICA9IGZuVHlwZSA9PT0gJ3N0cmluZycgPyBgJyR7dGhpcy5mbn0nYCA6IGBbJHtmblR5cGV9XWA7XG5cbiAgICAgICAgICAgIGl0ZW0gICAgICAgICAgICAgICAgICAgID0gYFNlbGVjdG9yKCR7aXRlbX0pYDtcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5hcGlGbiAgICAgID0gaXRlbTtcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5hcGlGbkNoYWluID0gW2l0ZW1dO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGFwaUZuKVxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLmFwaUZuQ2hhaW4ucHVzaChhcGlGbik7XG5cbiAgICAgICAgdGhpcy5vcHRpb25zLmFwaUZuSUQgPSB0eXBlb2YgYXBpRm5JRCA9PT0gJ251bWJlcicgPyBhcGlGbklEIDogdGhpcy5vcHRpb25zLmFwaUZuQ2hhaW4ubGVuZ3RoIC0gMTtcbiAgICAgICAgdGhpcy5jYWxsc2l0ZSAgICAgICAgPSBjYWxsc2l0ZTtcbiAgICB9XG5cbiAgICBfZ2V0Q29tcGlsZWRGbkNvZGUgKCkge1xuICAgICAgICAvLyBPUFRJTUlaQVRJT046IGlmIHNlbGVjdG9yIHdhcyBwcm9kdWNlZCBmcm9tIGFub3RoZXIgc2VsZWN0b3IgYW5kXG4gICAgICAgIC8vIGl0IGhhcyBzYW1lIGRlcGVuZGVuY2llcyBhcyBzb3VyY2Ugc2VsZWN0b3IsIHRoZW4gd2UgY2FuXG4gICAgICAgIC8vIGF2b2lkIHJlY29tcGlsYXRpb24gYW5kIGp1c3QgcmUtdXNlIGFscmVhZHkgY29tcGlsZWQgY29kZS5cbiAgICAgICAgY29uc3QgaGFzU2FtZURlcGVuZGVuY2llc0FzU291cmNlU2VsZWN0b3IgPSB0aGlzLm9wdGlvbnMuc291cmNlU2VsZWN0b3JCdWlsZGVyICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnNvdXJjZVNlbGVjdG9yQnVpbGRlci5vcHRpb25zLmRlcGVuZGVuY2llcyA9PT1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuZGVwZW5kZW5jaWVzO1xuXG4gICAgICAgIGlmIChoYXNTYW1lRGVwZW5kZW5jaWVzQXNTb3VyY2VTZWxlY3RvcilcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMuc291cmNlU2VsZWN0b3JCdWlsZGVyLmNvbXBpbGVkRm5Db2RlO1xuXG4gICAgICAgIGNvbnN0IGNvZGUgPSB0eXBlb2YgdGhpcy5mbiA9PT0gJ3N0cmluZycgP1xuICAgICAgICAgICAgYChmdW5jdGlvbigpe3JldHVybiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCR7ZXNjYXBlVW5zYWZlQ2hhcnMoSlNPTi5zdHJpbmdpZnkodGhpcy5mbikpfSk7fSk7YCA6XG4gICAgICAgICAgICBzdXBlci5fZ2V0Q29tcGlsZWRGbkNvZGUoKTtcblxuICAgICAgICBpZiAoY29kZSkge1xuICAgICAgICAgICAgcmV0dXJuIGRlZGVudChcbiAgICAgICAgICAgICAgICBgKGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICAgICAgICAgIHZhciBfX2YkPSR7Y29kZX07XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbigpe1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFyZ3MgICAgICAgICAgID0gX19kZXBlbmRlbmNpZXMkLmJvdW5kQXJncyB8fCBhcmd1bWVudHM7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2VsZWN0b3JGaWx0ZXIgPSBfX2RlcGVuZGVuY2llcyQuc2VsZWN0b3JGaWx0ZXI7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBub2RlcyA9IF9fZiQuYXBwbHkodGhpcywgYXJncyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBub2RlcyAgICAgPSBzZWxlY3RvckZpbHRlci5jYXN0KG5vZGVzKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFub2Rlcy5sZW5ndGggJiYgIXNlbGVjdG9yRmlsdGVyLmVycm9yKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yRmlsdGVyLmVycm9yID0gX19kZXBlbmRlbmNpZXMkLmFwaUluZm8uYXBpRm5JRDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGVjdG9yRmlsdGVyLmZpbHRlcihub2RlcywgX19kZXBlbmRlbmNpZXMkLmZpbHRlck9wdGlvbnMsIF9fZGVwZW5kZW5jaWVzJC5hcGlJbmZvKTtcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgfSkoKTtgXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgX2NyZWF0ZUludmFsaWRGblR5cGVFcnJvciAoKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ2xpZW50RnVuY3Rpb25BUElFcnJvcih0aGlzLmNhbGxzaXRlTmFtZXMuaW5zdGFudGlhdGlvbiwgdGhpcy5jYWxsc2l0ZU5hbWVzLmluc3RhbnRpYXRpb24sIFJVTlRJTUVfRVJST1JTLnNlbGVjdG9ySW5pdGlhbGl6ZWRXaXRoV3JvbmdUeXBlLCB0eXBlb2YgdGhpcy5mbik7XG4gICAgfVxuXG4gICAgX2V4ZWN1dGVDb21tYW5kIChhcmdzLCB0ZXN0UnVuLCBjYWxsc2l0ZSkge1xuICAgICAgICBjb25zdCByZXN1bHRQcm9taXNlID0gc3VwZXIuX2V4ZWN1dGVDb21tYW5kKGFyZ3MsIHRlc3RSdW4sIHRoaXMuY2FsbHNpdGUgfHwgY2FsbHNpdGUpO1xuXG4gICAgICAgIHRoaXMuX2FkZEJvdW5kQXJnc1NlbGVjdG9yR2V0dGVyKHJlc3VsdFByb21pc2UsIGFyZ3MpO1xuXG4gICAgICAgIC8vIE9QVElNSVpBVElPTjogdXNlIGJ1ZmZlciBmdW5jdGlvbiBhcyBzZWxlY3RvciBub3QgdG8gdHJpZ2dlciBsYXp5IHByb3BlcnR5IGFoZWFkIG9mIHRpbWVcbiAgICAgICAgYWRkQVBJKHJlc3VsdFByb21pc2UsICgpID0+IHJlc3VsdFByb21pc2Uuc2VsZWN0b3IsIFNlbGVjdG9yQnVpbGRlciwgdGhpcy5vcHRpb25zLmN1c3RvbURPTVByb3BlcnRpZXMsIHRoaXMub3B0aW9ucy5jdXN0b21NZXRob2RzKTtcblxuICAgICAgICByZXR1cm4gcmVzdWx0UHJvbWlzZTtcbiAgICB9XG5cbiAgICBfZ2V0U291cmNlU2VsZWN0b3JCdWlsZGVyQXBpRm5JRCAoKSB7XG4gICAgICAgIGxldCBzZWxlY3RvckFuY2VzdG9yID0gdGhpcztcblxuICAgICAgICB3aGlsZSAoc2VsZWN0b3JBbmNlc3Rvci5vcHRpb25zLnNvdXJjZVNlbGVjdG9yQnVpbGRlcilcbiAgICAgICAgICAgIHNlbGVjdG9yQW5jZXN0b3IgPSBzZWxlY3RvckFuY2VzdG9yLm9wdGlvbnMuc291cmNlU2VsZWN0b3JCdWlsZGVyO1xuXG4gICAgICAgIHJldHVybiBzZWxlY3RvckFuY2VzdG9yLm9wdGlvbnMuYXBpRm5JRDtcbiAgICB9XG5cbiAgICBnZXRGdW5jdGlvbkRlcGVuZGVuY2llcyAoKSB7XG4gICAgICAgIGNvbnN0IGRlcGVuZGVuY2llcyA9IHN1cGVyLmdldEZ1bmN0aW9uRGVwZW5kZW5jaWVzKCk7XG5cbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgZmlsdGVyVmlzaWJsZSxcbiAgICAgICAgICAgIGZpbHRlckhpZGRlbixcbiAgICAgICAgICAgIGNvdW50ZXJNb2RlLFxuICAgICAgICAgICAgY29sbGVjdGlvbk1vZGUsXG4gICAgICAgICAgICBnZXRWaXNpYmxlVmFsdWVNb2RlLFxuICAgICAgICAgICAgaW5kZXgsXG4gICAgICAgICAgICBjdXN0b21ET01Qcm9wZXJ0aWVzLFxuICAgICAgICAgICAgY3VzdG9tTWV0aG9kcyxcbiAgICAgICAgICAgIGFwaUZuQ2hhaW4sXG4gICAgICAgICAgICBib3VuZEFyZ3MsXG4gICAgICAgIH0gPSB0aGlzLm9wdGlvbnM7XG5cbiAgICAgICAgcmV0dXJuIG1lcmdlKHt9LCBkZXBlbmRlbmNpZXMsIHtcbiAgICAgICAgICAgIGZpbHRlck9wdGlvbnM6IHtcbiAgICAgICAgICAgICAgICBmaWx0ZXJWaXNpYmxlLFxuICAgICAgICAgICAgICAgIGZpbHRlckhpZGRlbixcbiAgICAgICAgICAgICAgICBjb3VudGVyTW9kZSxcbiAgICAgICAgICAgICAgICBjb2xsZWN0aW9uTW9kZSxcbiAgICAgICAgICAgICAgICBpbmRleDogaXNOdWxsT3JVbmRlZmluZWQoaW5kZXgpID8gbnVsbCA6IGluZGV4LFxuICAgICAgICAgICAgICAgIGdldFZpc2libGVWYWx1ZU1vZGUsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYXBpSW5mbzoge1xuICAgICAgICAgICAgICAgIGFwaUZuQ2hhaW4sXG4gICAgICAgICAgICAgICAgYXBpRm5JRDogdGhpcy5fZ2V0U291cmNlU2VsZWN0b3JCdWlsZGVyQXBpRm5JRCgpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGJvdW5kQXJncyxcbiAgICAgICAgICAgIGN1c3RvbURPTVByb3BlcnRpZXMsXG4gICAgICAgICAgICBjdXN0b21NZXRob2RzLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBfY3JlYXRlVGVzdFJ1bkNvbW1hbmQgKGVuY29kZWRBcmdzLCBlbmNvZGVkRGVwZW5kZW5jaWVzKSB7XG4gICAgICAgIHJldHVybiBuZXcgRXhlY3V0ZVNlbGVjdG9yQ29tbWFuZCh7XG4gICAgICAgICAgICBpbnN0YW50aWF0aW9uQ2FsbHNpdGVOYW1lOiB0aGlzLmNhbGxzaXRlTmFtZXMuaW5zdGFudGlhdGlvbixcbiAgICAgICAgICAgIGZuQ29kZTogICAgICAgICAgICAgICAgICAgIHRoaXMuY29tcGlsZWRGbkNvZGUsXG4gICAgICAgICAgICBhcmdzOiAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVkQXJncyxcbiAgICAgICAgICAgIGRlcGVuZGVuY2llczogICAgICAgICAgICAgIGVuY29kZWREZXBlbmRlbmNpZXMsXG4gICAgICAgICAgICBuZWVkRXJyb3I6ICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMubmVlZEVycm9yLFxuICAgICAgICAgICAgYXBpRm5DaGFpbjogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmFwaUZuQ2hhaW4sXG4gICAgICAgICAgICB2aXNpYmlsaXR5Q2hlY2s6ICAgICAgICAgICAhIXRoaXMub3B0aW9ucy52aXNpYmlsaXR5Q2hlY2ssXG4gICAgICAgICAgICB0aW1lb3V0OiAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMudGltZW91dCxcbiAgICAgICAgICAgIHN0cmljdEVycm9yOiAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5zdHJpY3RFcnJvcixcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgX3ZhbGlkYXRlT3B0aW9ucyAob3B0aW9ucykge1xuICAgICAgICBzdXBlci5fdmFsaWRhdGVPcHRpb25zKG9wdGlvbnMpO1xuXG4gICAgICAgIGlmICghaXNOdWxsT3JVbmRlZmluZWQob3B0aW9ucy52aXNpYmlsaXR5Q2hlY2spKVxuICAgICAgICAgICAgYXNzZXJ0VHlwZShpcy5ib29sZWFuLCB0aGlzLmNhbGxzaXRlTmFtZXMuaW5zdGFudGlhdGlvbiwgJ1RoZSBcInZpc2liaWxpdHlDaGVja1wiIG9wdGlvbicsIG9wdGlvbnMudmlzaWJpbGl0eUNoZWNrKTtcblxuICAgICAgICBpZiAoIWlzTnVsbE9yVW5kZWZpbmVkKG9wdGlvbnMudGltZW91dCkpXG4gICAgICAgICAgICBhc3NlcnRUeXBlKGlzLm5vbk5lZ2F0aXZlTnVtYmVyLCB0aGlzLmNhbGxzaXRlTmFtZXMuaW5zdGFudGlhdGlvbiwgJ1RoZSBcInRpbWVvdXRcIiBvcHRpb24nLCBvcHRpb25zLnRpbWVvdXQpO1xuICAgIH1cblxuICAgIF9nZXRSZXBsaWNhdG9yVHJhbnNmb3JtcyAoKSB7XG4gICAgICAgIGNvbnN0IHRyYW5zZm9ybXMgPSBzdXBlci5fZ2V0UmVwbGljYXRvclRyYW5zZm9ybXMoKTtcblxuICAgICAgICB0cmFuc2Zvcm1zLnB1c2gobmV3IFNlbGVjdG9yTm9kZVRyYW5zZm9ybSgpKTtcblxuICAgICAgICByZXR1cm4gdHJhbnNmb3JtcztcbiAgICB9XG5cbiAgICBfYWRkQm91bmRBcmdzU2VsZWN0b3JHZXR0ZXIgKG9iaiwgc2VsZWN0b3JBcmdzKSB7XG4gICAgICAgIGRlZmluZUxhenlQcm9wZXJ0eShvYmosICdzZWxlY3RvcicsICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgU2VsZWN0b3JCdWlsZGVyKHRoaXMuZ2V0RnVuY3Rpb24oKSwgeyBib3VuZEFyZ3M6IHNlbGVjdG9yQXJncyB9KTtcblxuICAgICAgICAgICAgcmV0dXJuIGJ1aWxkZXIuZ2V0RnVuY3Rpb24oKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgX2RlY29yYXRlRnVuY3Rpb24gKHNlbGVjdG9yRm4pIHtcbiAgICAgICAgc3VwZXIuX2RlY29yYXRlRnVuY3Rpb24oc2VsZWN0b3JGbik7XG5cbiAgICAgICAgYWRkQVBJKFxuICAgICAgICAgICAgc2VsZWN0b3JGbixcbiAgICAgICAgICAgICgpID0+IHNlbGVjdG9yRm4sXG4gICAgICAgICAgICBTZWxlY3RvckJ1aWxkZXIsXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMuY3VzdG9tRE9NUHJvcGVydGllcyxcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5jdXN0b21NZXRob2RzLFxuICAgICAgICAgICAgdGhpcy5fZ2V0T2JzZXJ2ZWRDYWxsc2l0ZXMoKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIF9nZXRDbGllbnRGbldpdGhPdmVycmlkZGVuT3B0aW9ucyAob3B0aW9ucykge1xuICAgICAgICBjb25zdCBhcGlGbiAgICAgICAgICAgICAgPSBwcmVwYXJlQXBpRm5BcmdzKCd3aXRoJywgb3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IHByZXZpb3VzU2VsZWN0b3JJRCA9IHRoaXMub3B0aW9ucy5hcGlGbkNoYWluLmxlbmd0aCAtIDE7XG5cbiAgICAgICAgcmV0dXJuIHN1cGVyLl9nZXRDbGllbnRGbldpdGhPdmVycmlkZGVuT3B0aW9ucyhPYmplY3QuYXNzaWduKG9wdGlvbnMsIHsgYXBpRm4sIGFwaUZuSUQ6IHByZXZpb3VzU2VsZWN0b3JJRCB9KSk7XG4gICAgfVxuXG4gICAgX3Byb2Nlc3NSZXN1bHQgKHJlc3VsdCwgc2VsZWN0b3JBcmdzKSB7XG4gICAgICAgIGNvbnN0IHNuYXBzaG90ID0gc3VwZXIuX3Byb2Nlc3NSZXN1bHQocmVzdWx0LCBzZWxlY3RvckFyZ3MpO1xuXG4gICAgICAgIGlmIChzbmFwc2hvdCAmJiAhcmV0dXJuU2luZ2xlUHJvcE1vZGUodGhpcy5vcHRpb25zKSkge1xuICAgICAgICAgICAgdGhpcy5fYWRkQm91bmRBcmdzU2VsZWN0b3JHZXR0ZXIoc25hcHNob3QsIHNlbGVjdG9yQXJncyk7XG4gICAgICAgICAgICBjcmVhdGVTbmFwc2hvdE1ldGhvZHMoc25hcHNob3QpO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmN1c3RvbU1ldGhvZHMpXG4gICAgICAgICAgICAgICAgYWRkQ3VzdG9tTWV0aG9kcyhzbmFwc2hvdCwgKCkgPT4gc25hcHNob3Quc2VsZWN0b3IsIFNlbGVjdG9yQnVpbGRlciwgdGhpcy5vcHRpb25zLmN1c3RvbU1ldGhvZHMpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHNuYXBzaG90O1xuICAgIH1cbn1cblxuIl19