@nota/nativescript-webview-ext
Version:
Extended WebView for NativeScript which adds 'x-local' scheme for local-files. events between WebView and native-layer, javascript execution, injecting CSS and JS-files.
313 lines • 45.4 kB
JavaScript
"use strict";
function __export(m) {
for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
}
Object.defineProperty(exports, "__esModule", { value: true });
var fs = require("tns-core-modules/file-system");
var platform = require("tns-core-modules/platform");
var webview_ext_common_1 = require("./webview-ext-common");
__export(require("./webview-ext-common"));
var WebViewExtClient;
var WebViewBridgeInterface;
var extToMimeType = new Map([
['css', 'text/css'],
['js', 'text/javascript'],
['jpg', 'image/jpeg'],
['jpeg', 'image/jpeg'],
['png', 'image/png'],
['gif', 'image/gif'],
['svg', 'image/svg+xml'],
]);
function initializeWebViewClient() {
if (WebViewExtClient) {
return;
}
var WebViewExtClientImpl = (function (_super) {
__extends(WebViewExtClientImpl, _super);
function WebViewExtClientImpl() {
var _this = _super.call(this) || this;
return global.__native(_this);
}
WebViewExtClientImpl.prototype.shouldOverrideUrlLoading = function (view, request) {
var owner = this.owner;
if (!owner) {
return true;
}
var url = request;
if (typeof request === 'object') {
url = request.getUrl().toString();
}
var scheme = owner.interceptScheme + "://";
if (url.startsWith(scheme)) {
return true;
}
var urlOverrideHandlerFn = owner.urlOverrideHandler;
if (urlOverrideHandlerFn && urlOverrideHandlerFn(url) === true) {
return true;
}
if (webview_ext_common_1.traceEnabled()) {
webview_ext_common_1.traceWrite("WebViewClientClass.shouldOverrideUrlLoading(" + url + ")", webview_ext_common_1.traceCategories.Debug);
}
return false;
};
WebViewExtClientImpl.prototype.shouldInterceptRequest = function (view, request) {
var owner = this.owner;
if (!owner) {
return _super.prototype.shouldInterceptRequest.call(this, view, request);
}
var url = request;
if (typeof request === 'object') {
url = request.getUrl().toString();
}
if (typeof url !== 'string') {
return _super.prototype.shouldInterceptRequest.call(this, view, request);
}
if (!url.startsWith(owner.interceptScheme)) {
return _super.prototype.shouldInterceptRequest.call(this, view, request);
}
var filepath = owner.getRegistretLocalResource(url);
if (!filepath || !fs.File.exists(filepath)) {
return _super.prototype.shouldInterceptRequest.call(this, view, request);
}
var tnsFile = fs.File.fromPath(filepath);
var javaFile = new java.io.File(tnsFile.path);
var stream = new java.io.FileInputStream(javaFile);
var mimeType = extToMimeType.get(tnsFile.extension.substr(1)) || 'application/octet-stream';
var encoding = mimeType.startsWith('image/') || mimeType === 'application/octet-stream' ? 'binary' : 'UTF-8';
return new android.webkit.WebResourceResponse(mimeType, encoding, stream);
};
WebViewExtClientImpl.prototype.onPageStarted = function (view, url, favicon) {
_super.prototype.onPageStarted.call(this, view, url, favicon);
var owner = this.owner;
if (!owner) {
return;
}
if (webview_ext_common_1.traceEnabled()) {
webview_ext_common_1.traceWrite("WebViewClientClass.onPageStarted(" + url + ", " + favicon + ")", webview_ext_common_1.traceCategories.Debug);
}
owner._onLoadStarted(url, undefined);
};
WebViewExtClientImpl.prototype.onPageFinished = function (view, url) {
_super.prototype.onPageFinished.call(this, view, url);
var owner = this.owner;
if (!owner) {
return;
}
if (webview_ext_common_1.traceEnabled()) {
webview_ext_common_1.traceWrite("WebViewClientClass.onPageFinished(" + url + ")", webview_ext_common_1.traceCategories.Debug);
}
owner._onLoadFinished(url, undefined);
};
WebViewExtClientImpl.prototype.onReceivedError = function () {
if (arguments.length === 4) {
var _a = Array.from(arguments), view = _a[0], errorCode = _a[1], description = _a[2], failingUrl = _a[3];
this.onReceivedErrorBeforeAPI23(view, errorCode, description, failingUrl);
}
else {
var _b = Array.from(arguments), view = _b[0], request = _b[1], error = _b[2];
this.onReceivedErrorAPI23(view, request, error);
}
};
WebViewExtClientImpl.prototype.onReceivedErrorAPI23 = function (view, request, error) {
_super.prototype.onReceivedError.call(this, view, request, error);
var owner = this.owner;
if (owner) {
if (webview_ext_common_1.traceEnabled()) {
webview_ext_common_1.traceWrite("WebViewClientClass.onReceivedError(" + error.getErrorCode() + ", " + error.getDescription() + ", " + (error.getUrl && error.getUrl()) + ")", webview_ext_common_1.traceCategories.Debug);
}
owner._onLoadFinished(error.getUrl && error.getUrl(), error.getDescription() + "(" + error.getErrorCode() + ")");
}
};
WebViewExtClientImpl.prototype.onReceivedErrorBeforeAPI23 = function (view, errorCode, description, failingUrl) {
_super.prototype.onReceivedError.call(this, view, errorCode, description, failingUrl);
var owner = this.owner;
if (owner) {
if (webview_ext_common_1.traceEnabled()) {
webview_ext_common_1.traceWrite("WebViewClientClass.onReceivedError(" + errorCode + ", " + description + ", " + failingUrl + ")", webview_ext_common_1.traceCategories.Debug);
}
owner._onLoadFinished(failingUrl, description + "(" + errorCode + ")");
}
};
return WebViewExtClientImpl;
}(android.webkit.WebViewClient));
WebViewExtClient = WebViewExtClientImpl;
var WebViewBridgeInterfaceImpl = (function (_super) {
__extends(WebViewBridgeInterfaceImpl, _super);
function WebViewBridgeInterfaceImpl() {
var _this = _super.call(this) || this;
return global.__native(_this);
}
WebViewBridgeInterfaceImpl.prototype.emitEventToNativeScript = function (eventName, data) {
var owner = this.owner;
if (!owner) {
return;
}
owner.onWebViewEvent(eventName, JSON.parse(data));
};
return WebViewBridgeInterfaceImpl;
}(dk.nota.webviewinterface.WebViewBridgeInterface));
WebViewBridgeInterface = WebViewBridgeInterfaceImpl;
}
var instanceNo = 0;
var WebViewExt = (function (_super) {
__extends(WebViewExt, _super);
function WebViewExt() {
var _this = _super !== null && _super.apply(this, arguments) || this;
_this.localResourceMap = new Map();
_this.instance = ++instanceNo;
return _this;
}
Object.defineProperty(WebViewExt.prototype, "isUIWebView", {
get: function () {
return false;
},
enumerable: true,
configurable: true
});
Object.defineProperty(WebViewExt.prototype, "isWKWebView", {
get: function () {
return false;
},
enumerable: true,
configurable: true
});
WebViewExt.prototype.createNativeView = function () {
initializeWebViewClient();
var nativeView = new android.webkit.WebView(this._context);
var settings = nativeView.getSettings();
settings.setJavaScriptEnabled(true);
settings.setBuiltInZoomControls(true);
var client = new WebViewExtClient();
nativeView.setWebViewClient(client);
nativeView.client = client;
var bridgeInterface = new WebViewBridgeInterface();
nativeView.addJavascriptInterface(bridgeInterface, 'androidWebViewBridge');
nativeView.bridgeInterface = bridgeInterface;
return nativeView;
};
WebViewExt.prototype.initNativeView = function () {
_super.prototype.initNativeView.call(this);
this.nativeViewProtected.client.owner = this;
this.nativeViewProtected.bridgeInterface.owner = this;
};
WebViewExt.prototype.disposeNativeView = function () {
var nativeView = this.nativeViewProtected;
if (nativeView) {
nativeView.destroy();
nativeView.client.owner = null;
nativeView.bridgeInterface.owner = null;
}
_super.prototype.disposeNativeView.call(this);
};
WebViewExt.prototype._loadUrl = function (src) {
var nativeView = this.nativeViewProtected;
if (!nativeView) {
return;
}
this.writeTrace("WebViewExt<android>._loadUrl(" + src + ")");
nativeView.loadUrl(src);
};
WebViewExt.prototype._loadData = function (src) {
var nativeView = this.nativeViewProtected;
if (!nativeView) {
return;
}
var baseUrl = "file:///" + webview_ext_common_1.knownFolders.currentApp().path + "/";
this.writeTrace("WebViewExt<android>._loadData(" + src + ") -> baseUrl: " + baseUrl);
nativeView.loadDataWithBaseURL(baseUrl, src, "text/html", "utf-8", null);
};
Object.defineProperty(WebViewExt.prototype, "canGoBack", {
get: function () {
var nativeView = this.nativeViewProtected;
if (nativeView) {
return nativeView.canGoBack();
}
return false;
},
enumerable: true,
configurable: true
});
WebViewExt.prototype.stopLoading = function () {
var nativeView = this.nativeViewProtected;
if (nativeView) {
nativeView.stopLoading();
}
};
Object.defineProperty(WebViewExt.prototype, "canGoForward", {
get: function () {
var nativeView = this.nativeViewProtected;
if (nativeView) {
return nativeView.canGoForward();
}
return false;
},
enumerable: true,
configurable: true
});
WebViewExt.prototype.goBack = function () {
var nativeView = this.nativeViewProtected;
if (nativeView) {
return nativeView.goBack();
}
};
WebViewExt.prototype.goForward = function () {
var nativeView = this.nativeViewProtected;
if (nativeView) {
return nativeView.goForward();
}
};
WebViewExt.prototype.reload = function () {
var nativeView = this.nativeViewProtected;
if (nativeView) {
return nativeView.reload();
}
};
WebViewExt.prototype.registerLocalResource = function (resourceName, path) {
resourceName = this.fixLocalResourceName(resourceName);
var filepath = this.resolveLocalResourceFilePath(path);
if (!filepath) {
this.writeTrace("WebViewExt<android>.registerLocalResource(" + resourceName + ", " + path + ") -> file doesn't exist", webview_ext_common_1.traceMessageType.error);
return;
}
this.writeTrace("WebViewExt<android>.registerLocalResource(" + resourceName + ", " + path + ") -> file: " + filepath);
this.localResourceMap.set(resourceName, filepath);
};
WebViewExt.prototype.unregisterLocalResource = function (resourceName) {
this.writeTrace("WebViewExt<android>.unregisterLocalResource(" + resourceName + ")");
resourceName = this.fixLocalResourceName(resourceName);
this.localResourceMap.delete(resourceName);
};
WebViewExt.prototype.getRegistretLocalResource = function (resourceName) {
resourceName = this.fixLocalResourceName(resourceName);
var result = this.localResourceMap.get(resourceName);
this.writeTrace("WebViewExt<android>.getRegistretLocalResource(" + resourceName + ") -> " + result);
return result;
};
WebViewExt.prototype.executeJavaScript = function (scriptCode) {
var _this = this;
return new Promise(function (resolve, reject) {
if (Number(platform.device.sdkVersion) < 19) {
_this.writeTrace("WebViewExt<android>.executeJavaScript() -> SDK:" + platform.device.sdkVersion + " not supported", webview_ext_common_1.traceMessageType.error);
reject(new Error('Android API < 19 not supported'));
return;
}
if (!_this.android) {
_this.writeTrace("WebViewExt<android>.executeJavaScript() -> no nativeview?", webview_ext_common_1.traceMessageType.error);
reject(new Error('Native Android not inited, cannot call executeJavaScript'));
return;
}
var that = _this;
_this.android.evaluateJavascript(scriptCode, new android.webkit.ValueCallback({
onReceiveValue: function (result) {
resolve(that.parseWebViewJavascriptResult(result));
},
}));
});
};
WebViewExt.prototype.getTitle = function () {
return Promise.resolve(this.nativeViewProtected.getTitle());
};
return WebViewExt;
}(webview_ext_common_1.WebViewExtBase));
exports.WebViewExt = WebViewExt;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Vidmlldy1leHQuYW5kcm9pZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIndlYnZpZXctZXh0LmFuZHJvaWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFFQSxpREFBbUQ7QUFDbkQsb0RBQXNEO0FBRXRELDJEQUFpSTtBQUVqSSwwQ0FBcUM7QUFzQnJDLElBQUksZ0JBQWdELENBQUM7QUFDckQsSUFBSSxzQkFBaUYsQ0FBQztBQUV0RixJQUFNLGFBQWEsR0FBRyxJQUFJLEdBQUcsQ0FBaUI7SUFDMUMsQ0FBQyxLQUFLLEVBQUUsVUFBVSxDQUFDO0lBQ25CLENBQUMsSUFBSSxFQUFFLGlCQUFpQixDQUFDO0lBQ3pCLENBQUMsS0FBSyxFQUFFLFlBQVksQ0FBQztJQUNyQixDQUFDLE1BQU0sRUFBRSxZQUFZLENBQUM7SUFDdEIsQ0FBQyxLQUFLLEVBQUUsV0FBVyxDQUFDO0lBQ3BCLENBQUMsS0FBSyxFQUFFLFdBQVcsQ0FBQztJQUNwQixDQUFDLEtBQUssRUFBRSxlQUFlLENBQUM7Q0FDM0IsQ0FBQyxDQUFDO0FBRUg7SUFDSSxFQUFFLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUM7UUFDbkIsTUFBTSxDQUFDO0lBQ1gsQ0FBQztJQUVEO1FBQW1DLHdDQUE0QjtRQUczRDtZQUFBLFlBQ0ksaUJBQU8sU0FFVjtZQURHLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUksQ0FBQyxDQUFDO1FBQ2pDLENBQUM7UUFFTSx1REFBd0IsR0FBL0IsVUFBZ0MsSUFBNEIsRUFBRSxPQUFZO1lBQ3RFLElBQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7WUFDekIsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO2dCQUNULE1BQU0sQ0FBQyxJQUFJLENBQUM7WUFDaEIsQ0FBQztZQUVELElBQUksR0FBRyxHQUFHLE9BQWlCLENBQUM7WUFDNUIsRUFBRSxDQUFDLENBQUMsT0FBTyxPQUFP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WCxDQUFDO1lBQ0QsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztnQkFDaEIsS0FBSSxDQUFDLFVBQVUsQ0FBQywyREFBMkQsRUFBRSxxQ0FBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDckcsTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLDBEQUEwRCxDQUFDLENBQUMsQ0FBQztnQkFDOUUsTUFBTSxDQUFDO1lBQ1gsQ0FBQztZQUVELElBQU0sSUFBSSxHQUFHLEtBQUksQ0FBQztZQUNsQixLQUFJLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUFDLFVBQVUsRUFBRSxJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDO2dCQUN6RSxjQUFjLFlBQUMsTUFBTTtvQkFDakIsT0FBTyxDQUFDLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO2dCQUN2RCxDQUFDO2FBQ0osQ0FBQyxDQUFDLENBQUM7UUFDUixDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFTSw2QkFBUSxHQUFmO1FBQ0ksTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7SUFDaEUsQ0FBQztJQUNMLGlCQUFDO0FBQUQsQ0FBQyxBQTNLRCxDQUFnQyxtQ0FBYyxHQTJLN0M7QUEzS1ksZ0NBQVUiLCJzb3VyY2VzQ29udGVudCI6WyIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi9ub2RlX21vZHVsZXMvdG5zLXBsYXRmb3JtLWRlY2xhcmF0aW9ucy9hbmRyb2lkLmQudHNcIiAvPlxuXG5pbXBvcnQgKiBhcyBmcyBmcm9tICd0bnMtY29yZS1tb2R1bGVzL2ZpbGUtc3lzdGVtJztcbmltcG9ydCAqIGFzIHBsYXRmb3JtIGZyb20gXCJ0bnMtY29yZS1tb2R1bGVzL3BsYXRmb3JtXCI7XG5cbmltcG9ydCB7IGtub3duRm9sZGVycywgdHJhY2VDYXRlZ29yaWVzLCB0cmFjZUVuYWJsZWQsIHRyYWNlTWVzc2FnZVR5cGUsIHRyYWNlV3JpdGUsIFdlYlZpZXdFeHRCYXNlIH0gZnJvbSBcIi4vd2Vidmlldy1leHQtY29tbW9uXCI7XG5cbmV4cG9ydCAqIGZyb20gXCIuL3dlYnZpZXctZXh0LWNvbW1vblwiO1xuXG5leHBvcnQgZGVjbGFyZSBuYW1lc3BhY2UgZGsge1xuICAgIG5hbWVzcGFjZSBub3RhIHtcbiAgICAgICAgbmFtZXNwYWNlIHdlYnZpZXdpbnRlcmZhY2Uge1xuICAgICAgICAgICAgY2xhc3MgV2ViVmlld0JyaWRnZUludGVyZmFjZSBleHRlbmRzIGphdmEubGFuZy5PYmplY3Qge1xuICAgICAgICAgICAgICAgIHB1YmxpYyBvd25lcj86IFdlYlZpZXdFeHQ7XG5cbiAgICAgICAgICAgICAgICBlbWl0RXZlbnRUb05hdGl2ZVNjcmlwdChldmVudE5hbWU6IHN0cmluZywgZGF0YTogc3RyaW5nKTogdm9pZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydCBpbnRlcmZhY2UgQW5kcm9pZFdlYlZpZXdDbGllbnQgZXh0ZW5kcyBhbmRyb2lkLndlYmtpdC5XZWJWaWV3Q2xpZW50IHtcbiAgICBvd25lcj86IFdlYlZpZXdFeHQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQW5kcm9pZFdlYlZpZXcgZXh0ZW5kcyBhbmRyb2lkLndlYmtpdC5XZWJWaWV3IHtcbiAgICBjbGllbnQ/OiBBbmRyb2lkV2ViVmlld0NsaWVudDtcbiAgICBicmlkZ2VJbnRlcmZhY2U/OiBkay5ub3RhLndlYnZpZXdpbnRlcmZhY2UuV2ViVmlld0JyaWRnZUludGVyZmFjZTtcbn1cblxubGV0IFdlYlZpZXdFeHRDbGllbnQ6IG5ldyAoKSA9PiBBbmRyb2lkV2ViVmlld0NsaWVudDtcbmxldCBXZWJWaWV3QnJpZGdlSW50ZXJmYWNlOiBuZXcgKCkgPT4gZGsubm90YS53ZWJ2aWV3aW50ZXJmYWNlLldlYlZpZXdCcmlkZ2VJbnRlcmZhY2U7XG5cbmNvbnN0IGV4dFRvTWltZVR5cGUgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPihbXG4gICAgWydjc3MnLCAndGV4dC9jc3MnXSxcbiAgICBbJ2pzJywgJ3RleHQvamF2YXNjcmlwdCddLFxuICAgIFsnanBnJywgJ2ltYWdlL2pwZWcnXSxcbiAgICBbJ2pwZWcnLCAnaW1hZ2UvanBlZyddLFxuICAgIFsncG5nJywgJ2ltYWdlL3BuZyddLFxuICAgIFsnZ2lmJywgJ2ltYWdlL2dpZiddLFxuICAgIFsnc3ZnJywgJ2ltYWdlL3N2Zyt4bWwnXSxcbl0pO1xuXG5mdW5jdGlvbiBpbml0aWFsaXplV2ViVmlld0NsaWVudCgpOiB2b2lkIHtcbiAgICBpZiAoV2ViVmlld0V4dENsaWVudCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY2xhc3MgV2ViVmlld0V4dENsaWVudEltcGwgZXh0ZW5kcyBhbmRyb2lkLndlYmtpdC5XZWJWaWV3Q2xpZW50IHtcbiAgICAgICAgcHVibGljIG93bmVyOiBXZWJWaWV3RXh0O1xuXG4gICAgICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgICAgIHJldHVybiBnbG9iYWwuX19uYXRpdmUodGhpcyk7XG4gICAgICAgIH1cblxuICAgICAgICBwdWJsaWMgc2hvdWxkT3ZlcnJpZGVVcmxMb2FkaW5nKHZpZXc6IGFuZHJvaWQud2Via2l0LldlYlZpZXcsIHJlcXVlc3Q6IGFueSkge1xuICAgICAgICAgICAgY29uc3Qgb3duZXIgPSB0aGlzLm93bmVyO1xuICAgICAgICAgICAgaWYgKCFvd25lcikge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgdXJsID0gcmVxdWVzdCBhcyBzdHJpbmc7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHJlcXVlc3QgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgdXJsID0gcmVxdWVzdC5nZXRVcmwoKS50b1N0cmluZygpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBzY2hlbWUgPSBgJHtvd25lci5pbnRlcmNlcHRTY2hlbWV9Oi8vYDtcbiAgICAgICAgICAgIGlmICh1cmwuc3RhcnRzV2l0aChzY2hlbWUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCB1cmxPdmVycmlkZUhhbmRsZXJGbiA9IG93bmVyLnVybE92ZXJyaWRlSGFuZGxlcjtcbiAgICAgICAgICAgIGlmICh1cmxPdmVycmlkZUhhbmRsZXJGbiAmJiB1cmxPdmVycmlkZUhhbmRsZXJGbih1cmwpID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0cmFjZUVuYWJsZWQoKSkge1xuICAgICAgICAgICAgICAgIHRyYWNlV3JpdGUoXCJXZWJWaWV3Q2xpZW50Q2xhc3Muc2hvdWxkT3ZlcnJpZGVVcmxMb2FkaW5nKFwiICsgdXJsICsgXCIpXCIsIHRyYWNlQ2F0ZWdvcmllcy5EZWJ1Zyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBwdWJsaWMgc2hvdWxkSW50ZXJjZXB0UmVxdWVzdCh2aWV3OiBhbmRyb2lkLndlYmtpdC5XZWJWaWV3LCByZXF1ZXN0OiBhbnkpIHtcbiAgICAgICAgICAgIGNvbnN0IG93bmVyID0gdGhpcy5vd25lcjtcbiAgICAgICAgICAgIGlmICghb3duZXIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc3VwZXIuc2hvdWxkSW50ZXJjZXB0UmVxdWVzdCh2aWV3LCByZXF1ZXN0KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IHVybCA9IHJlcXVlc3QgYXMgc3RyaW5nO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiByZXF1ZXN0ID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgIHVybCA9IHJlcXVlc3QuZ2V0VXJsKCkudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHR5cGVvZiB1cmwgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN1cGVyLnNob3VsZEludGVyY2VwdFJlcXVlc3QodmlldywgcmVxdWVzdCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghdXJsLnN0YXJ0c1dpdGgob3duZXIuaW50ZXJjZXB0U2NoZW1lKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBzdXBlci5zaG91bGRJbnRlcmNlcHRSZXF1ZXN0KHZpZXcsIHJlcXVlc3QpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBmaWxlcGF0aCA9IG93bmVyLmdldFJlZ2lzdHJldExvY2FsUmVzb3VyY2UodXJsKTtcbiAgICAgICAgICAgIGlmICghZmlsZXBhdGggfHwgIWZzLkZpbGUuZXhpc3RzKGZpbGVwYXRoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBzdXBlci5zaG91bGRJbnRlcmNlcHRSZXF1ZXN0KHZpZXcsIHJlcXVlc3QpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCB0bnNGaWxlID0gZnMuRmlsZS5mcm9tUGF0aChmaWxlcGF0aCk7XG5cbiAgICAgICAgICAgIGNvbnN0IGphdmFGaWxlID0gbmV3IGphdmEuaW8uRmlsZSh0bnNGaWxlLnBhdGgpO1xuICAgICAgICAgICAgY29uc3Qgc3RyZWFtID0gbmV3IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtKGphdmFGaWxlKTtcbiAgICAgICAgICAgIGNvbnN0IG1pbWVUeXBlID0gZXh0VG9NaW1lVHlwZS5nZXQodG5zRmlsZS5leHRlbnNpb24uc3Vic3RyKDEpKSB8fCAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJztcbiAgICAgICAgICAgIGNvbnN0IGVuY29kaW5nID0gbWltZVR5cGUuc3RhcnRzV2l0aCgnaW1hZ2UvJykgfHwgbWltZVR5cGUgPT09ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nID8gJ2JpbmFyeScgOiAnVVRGLTgnO1xuXG4gICAgICAgICAgICByZXR1cm4gbmV3IGFuZHJvaWQud2Via2l0LldlYlJlc291cmNlUmVzcG9uc2UobWltZVR5cGUsIGVuY29kaW5nLCBzdHJlYW0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcHVibGljIG9uUGFnZVN0YXJ0ZWQodmlldzogYW5kcm9pZC53ZWJraXQuV2ViVmlldywgdXJsOiBzdHJpbmcsIGZhdmljb246IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwKSB7XG4gICAgICAgICAgICBzdXBlci5vblBhZ2VTdGFydGVkKHZpZXcsIHVybCwgZmF2aWNvbik7XG4gICAgICAgICAgICBjb25zdCBvd25lciA9IHRoaXMub3duZXI7XG4gICAgICAgICAgICBpZiAoIW93bmVyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRyYWNlRW5hYmxlZCgpKSB7XG4gICAgICAgICAgICAgICAgdHJhY2VXcml0ZShcIldlYlZpZXdDbGllbnRDbGFzcy5vblBhZ2VTdGFydGVkKFwiICsgdXJsICsgXCIsIFwiICsgZmF2aWNvbiArIFwiKVwiLCB0cmFjZUNhdGVnb3JpZXMuRGVidWcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb3duZXIuX29uTG9hZFN0YXJ0ZWQodXJsLCB1bmRlZmluZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgcHVibGljIG9uUGFnZUZpbmlzaGVkKHZpZXc6IGFuZHJvaWQud2Via2l0LldlYlZpZXcsIHVybDogc3RyaW5nKSB7XG4gICAgICAgICAgICBzdXBlci5vblBhZ2VGaW5pc2hlZCh2aWV3LCB1cmwpO1xuICAgICAgICAgICAgY29uc3Qgb3duZXIgPSB0aGlzLm93bmVyO1xuICAgICAgICAgICAgaWYgKCFvd25lcikge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0cmFjZUVuYWJsZWQoKSkge1xuICAgICAgICAgICAgICAgIHRyYWNlV3JpdGUoXCJXZWJWaWV3Q2xpZW50Q2xhc3Mub25QYWdlRmluaXNoZWQoXCIgKyB1cmwgKyBcIilcIiwgdHJhY2VDYXRlZ29yaWVzLkRlYnVnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG93bmVyLl9vbkxvYWRGaW5pc2hlZCh1cmwsIHVuZGVmaW5lZCk7XG4gICAgICAgIH1cblxuICAgICAgICBwdWJsaWMgb25SZWNlaXZlZEVycm9yKCkge1xuICAgICAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBbdmlldywgZXJyb3JDb2RlLCBkZXNjcmlwdGlvbiwgZmFpbGluZ1VybF0gPSBBcnJheS5mcm9tKGFyZ3VtZW50cykgYXMgW2FuZHJvaWQud2Via2l0LldlYlZpZXcsIG51bWJlciwgc3RyaW5nLCBzdHJpbmddO1xuICAgICAgICAgICAgICAgIHRoaXMub25SZWNlaXZlZEVycm9yQmVmb3JlQVBJMjModmlldywgZXJyb3JDb2RlLCBkZXNjcmlwdGlvbiwgZmFpbGluZ1VybCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IFt2aWV3LCByZXF1ZXN0LCBlcnJvcl0gPSBBcnJheS5mcm9tKGFyZ3VtZW50cykgYXMgW2FuZHJvaWQud2Via2l0LldlYlZpZXcsIGFueSwgYW55XTtcbiAgICAgICAgICAgICAgICB0aGlzLm9uUmVjZWl2ZWRFcnJvckFQSTIzKHZpZXcsIHJlcXVlc3QsIGVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHByaXZhdGUgb25SZWNlaXZlZEVycm9yQVBJMjModmlldzogYW5kcm9pZC53ZWJraXQuV2ViVmlldywgcmVxdWVzdDogYW55LCBlcnJvcjogYW55KSB7XG4gICAgICAgICAgICBzdXBlci5vblJlY2VpdmVkRXJyb3IodmlldywgcmVxdWVzdCwgZXJyb3IpO1xuICAgICAgICAgICAgY29uc3Qgb3duZXIgPSB0aGlzLm93bmVyO1xuICAgICAgICAgICAgaWYgKG93bmVyKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRyYWNlRW5hYmxlZCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRyYWNlV3JpdGUoXCJXZWJWaWV3Q2xpZW50Q2xhc3Mub25SZWNlaXZlZEVycm9yKFwiICsgZXJyb3IuZ2V0RXJyb3JDb2RlKCkgKyBcIiwgXCIgKyBlcnJvci5nZXREZXNjcmlwdGlvbigpICsgXCIsIFwiICsgKGVycm9yLmdldFVybCAmJiBlcnJvci5nZXRVcmwoKSkgKyBcIilcIiwgdHJhY2VDYXRlZ29yaWVzLkRlYnVnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgb3duZXIuX29uTG9hZEZpbmlzaGVkKGVycm9yLmdldFVybCAmJiBlcnJvci5nZXRVcmwoKSwgZXJyb3IuZ2V0RGVzY3JpcHRpb24oKSArIFwiKFwiICsgZXJyb3IuZ2V0RXJyb3JDb2RlKCkgKyBcIilcIik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfVxuXG4gICAgICAgIHByaXZhdGUgb25SZWNlaXZlZEVycm9yQmVmb3JlQVBJMjModmlldzogYW5kcm9pZC53ZWJraXQuV2ViVmlldywgZXJyb3JDb2RlOiBudW1iZXIsIGRlc2NyaXB0aW9uOiBzdHJpbmcsIGZhaWxpbmdVcmw6IHN0cmluZykge1xuICAgICAgICAgICAgc3VwZXIub25SZWNlaXZlZEVycm9yKHZpZXcsIGVycm9yQ29kZSwgZGVzY3JpcHRpb24sIGZhaWxpbmdVcmwpO1xuXG4gICAgICAgICAgICBjb25zdCBvd25lciA9IHRoaXMub3duZXI7XG4gICAgICAgICAgICBpZiAob3duZXIpIHtcbiAgICAgICAgICAgICAgICBpZiAodHJhY2VFbmFibGVkKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJhY2VXcml0ZShcIldlYlZpZXdDbGllbnRDbGFzcy5vblJlY2VpdmVkRXJyb3IoXCIgKyBlcnJvckNvZGUgKyBcIiwgXCIgKyBkZXNjcmlwdGlvbiArIFwiLCBcIiArIGZhaWxpbmdVcmwgKyBcIilcIiwgdHJhY2VDYXRlZ29yaWVzLkRlYnVnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgb3duZXIuX29uTG9hZEZpbmlzaGVkKGZhaWxpbmdVcmwsIGRlc2NyaXB0aW9uICsgXCIoXCIgKyBlcnJvckNvZGUgKyBcIilcIik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfVxuICAgIH1cblxuICAgIFdlYlZpZXdFeHRDbGllbnQgPSBXZWJWaWV3RXh0Q2xpZW50SW1wbDtcblxuICAgIGNsYXNzIFdlYlZpZXdCcmlkZ2VJbnRlcmZhY2VJbXBsIGV4dGVuZHMgZGsubm90YS53ZWJ2aWV3aW50ZXJmYWNlLldlYlZpZXdCcmlkZ2VJbnRlcmZhY2Uge1xuICAgICAgICBwdWJsaWMgb3duZXI6IFdlYlZpZXdFeHQ7XG5cbiAgICAgICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgICAgICBzdXBlcigpO1xuICAgICAgICAgICAgcmV0dXJuIGdsb2JhbC5fX25hdGl2ZSh0aGlzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGVtaXRFdmVudFRvTmF0aXZlU2NyaXB0KGV2ZW50TmFtZTogc3RyaW5nLCBkYXRhOiBzdHJpbmcpIHtcbiAgICAgICAgICAgIGNvbnN0IG93bmVyID0gdGhpcy5vd25lcjtcbiAgICAgICAgICAgIGlmICghb3duZXIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIG93bmVyLm9uV2ViVmlld0V2ZW50KGV2ZW50TmFtZSwgSlNPTi5wYXJzZShkYXRhKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBXZWJWaWV3QnJpZGdlSW50ZXJmYWNlID0gV2ViVmlld0JyaWRnZUludGVyZmFjZUltcGw7XG59XG5cbmRlY2xhcmUgZnVuY3Rpb24gZXNjYXBlKGlucHV0OiBzdHJpbmcpOiBzdHJpbmc7XG5cbmxldCBpbnN0YW5jZU5vID0gMDtcbmV4cG9ydCBjbGFzcyBXZWJWaWV3RXh0IGV4dGVuZHMgV2ViVmlld0V4dEJhc2Uge1xuICAgIHB1YmxpYyBuYXRpdmVWaWV3UHJvdGVjdGVkOiBBbmRyb2lkV2ViVmlldztcblxuICAgIHByb3RlY3RlZCByZWFkb25seSBsb2NhbFJlc291cmNlTWFwID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcblxuICAgIHB1YmxpYyBnZXQgaXNVSVdlYlZpZXcoKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGlzV0tXZWJWaWV3KCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcHVibGljIHJlYWRvbmx5IGluc3RhbmNlID0gKytpbnN0YW5jZU5vO1xuXG4gICAgcHVibGljIGNyZWF0ZU5hdGl2ZVZpZXcoKSB7XG4gICAgICAgIGluaXRpYWxpemVXZWJWaWV3Q2xpZW50KCk7XG5cbiAgICAgICAgY29uc3QgbmF0aXZlVmlldyA9IG5ldyBhbmRyb2lkLndlYmtpdC5XZWJWaWV3KHRoaXMuX2NvbnRleHQpO1xuICAgICAgICBjb25zdCBzZXR0aW5ncyA9IG5hdGl2ZVZpZXcuZ2V0U2V0dGluZ3MoKTtcbiAgICAgICAgc2V0dGluZ3Muc2V0SmF2YVNjcmlwdEVuYWJsZWQodHJ1ZSk7XG4gICAgICAgIHNldHRpbmdzLnNldEJ1aWx0SW5ab29tQ29udHJvbHModHJ1ZSk7XG5cbiAgICAgICAgY29uc3QgY2xpZW50ID0gbmV3IFdlYlZpZXdFeHRDbGllbnQoKTtcbiAgICAgICAgbmF0aXZlVmlldy5zZXRXZWJWaWV3Q2xpZW50KGNsaWVudCk7XG4gICAgICAgIChuYXRpdmVWaWV3IGFzIGFueSkuY2xpZW50ID0gY2xpZW50O1xuXG4gICAgICAgIGNvbnN0IGJyaWRnZUludGVyZmFjZSA9IG5ldyBXZWJWaWV3QnJpZGdlSW50ZXJmYWNlKCk7XG4gICAgICAgIG5hdGl2ZVZpZXcuYWRkSmF2YXNjcmlwdEludGVyZmFjZShicmlkZ2VJbnRlcmZhY2UsICdhbmRyb2lkV2ViVmlld0JyaWRnZScpO1xuICAgICAgICAobmF0aXZlVmlldyBhcyBhbnkpLmJyaWRnZUludGVyZmFjZSA9IGJyaWRnZUludGVyZmFjZTtcbiAgICAgICAgcmV0dXJuIG5hdGl2ZVZpZXc7XG4gICAgfVxuXG4gICAgcHVibGljIGluaXROYXRpdmVWaWV3KCkge1xuICAgICAgICBzdXBlci5pbml0TmF0aXZlVmlldygpO1xuICAgICAgICB0aGlzLm5hdGl2ZVZpZXdQcm90ZWN0ZWQuY2xpZW50Lm93bmVyID0gdGhpcztcbiAgICAgICAgdGhpcy5uYXRpdmVWaWV3UHJvdGVjdGVkLmJyaWRnZUludGVyZmFjZS5vd25lciA9IHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIGRpc3Bvc2VOYXRpdmVWaWV3KCkge1xuICAgICAgICBjb25zdCBuYXRpdmVWaWV3ID0gdGhpcy5uYXRpdmVWaWV3UHJvdGVjdGVkO1xuICAgICAgICBpZiAobmF0aXZlVmlldykge1xuICAgICAgICAgICAgbmF0aXZlVmlldy5kZXN0cm95KCk7XG4gICAgICAgICAgICBuYXRpdmVWaWV3LmNsaWVudC5vd25lciA9IG51bGw7XG4gICAgICAgICAgICBuYXRpdmVWaWV3LmJyaWRnZUludGVyZmFjZS5vd25lciA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBzdXBlci5kaXNwb3NlTmF0aXZlVmlldygpO1xuICAgIH1cblxuICAgIHB1YmxpYyBfbG9hZFVybChzcmM6IHN0cmluZykge1xuICAgICAgICBjb25zdCBuYXRpdmVWaWV3ID0gdGhpcy5uYXRpdmVWaWV3UHJvdGVjdGVkO1xuICAgICAgICBpZiAoIW5hdGl2ZVZpZXcpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMud3JpdGVUcmFjZShgV2ViVmlld0V4dDxhbmRyb2lkPi5fbG9hZFVybCgke3NyY30pYCk7XG4gICAgICAgIG5hdGl2ZVZpZXcubG9hZFVybChzcmMpO1xuICAgIH1cblxuICAgIHB1YmxpYyBfbG9hZERhdGEoc3JjOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgbmF0aXZlVmlldyA9IHRoaXMubmF0aXZlVmlld1Byb3RlY3RlZDtcbiAgICAgICAgaWYgKCFuYXRpdmVWaWV3KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBiYXNlVXJsID0gYGZpbGU6Ly8vJHtrbm93bkZvbGRlcnMuY3VycmVudEFwcCgpLnBhdGh9L2A7XG4gICAgICAgIHRoaXMud3JpdGVUcmFjZShgV2ViVmlld0V4dDxhbmRyb2lkPi5fbG9hZERhdGEoJHtzcmN9KSAtPiBiYXNlVXJsOiAke2Jhc2VVcmx9YCk7XG4gICAgICAgIG5hdGl2ZVZpZXcubG9hZERhdGFXaXRoQmFzZVVSTChiYXNlVXJsLCBzcmMsIFwidGV4dC9odG1sXCIsIFwidXRmLThcIiwgbnVsbCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBjYW5Hb0JhY2soKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IG5hdGl2ZVZpZXcgPSB0aGlzLm5hdGl2ZVZpZXdQcm90ZWN0ZWQ7XG4gICAgICAgIGlmIChuYXRpdmVWaWV3KSB7XG4gICAgICAgICAgICByZXR1cm4gbmF0aXZlVmlldy5jYW5Hb0JhY2soKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcHVibGljIHN0b3BMb2FkaW5nKCkge1xuICAgICAgICBjb25zdCBuYXRpdmVWaWV3ID0gdGhpcy5uYXRpdmVWaWV3UHJvdGVjdGVkO1xuICAgICAgICBpZiAobmF0aXZlVmlldykge1xuICAgICAgICAgICAgbmF0aXZlVmlldy5zdG9wTG9hZGluZygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0IGNhbkdvRm9yd2FyZCgpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgbmF0aXZlVmlldyA9IHRoaXMubmF0aXZlVmlld1Byb3RlY3RlZDtcbiAgICAgICAgaWYgKG5hdGl2ZVZpZXcpIHtcbiAgICAgICAgICAgIHJldHVybiBuYXRpdmVWaWV3LmNhbkdvRm9yd2FyZCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ29CYWNrKCkge1xuICAgICAgICBjb25zdCBuYXRpdmVWaWV3ID0gdGhpcy5uYXRpdmVWaWV3UHJvdGVjdGVkO1xuICAgICAgICBpZiAobmF0aXZlVmlldykge1xuICAgICAgICAgICAgcmV0dXJuIG5hdGl2ZVZpZXcuZ29CYWNrKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZ29Gb3J3YXJkKCkge1xuICAgICAgICBjb25zdCBuYXRpdmVWaWV3ID0gdGhpcy5uYXRpdmVWaWV3UHJvdGVjdGVkO1xuICAgICAgICBpZiAobmF0aXZlVmlldykge1xuICAgICAgICAgICAgcmV0dXJuIG5hdGl2ZVZpZXcuZ29Gb3J3YXJkKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgcmVsb2FkKCkge1xuICAgICAgICBjb25zdCBuYXRpdmVWaWV3ID0gdGhpcy5uYXRpdmVWaWV3UHJvdGVjdGVkO1xuICAgICAgICBpZiAobmF0aXZlVmlldykge1xuICAgICAgICAgICAgcmV0dXJuIG5hdGl2ZVZpZXcucmVsb2FkKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgcmVnaXN0ZXJMb2NhbFJlc291cmNlKHJlc291cmNlTmFtZTogc3RyaW5nLCBwYXRoOiBzdHJpbmcpIHtcbiAgICAgICAgcmVzb3VyY2VOYW1lID0gdGhpcy5maXhMb2NhbFJlc291cmNlTmFtZShyZXNvdXJjZU5hbWUpO1xuXG4gICAgICAgIGNvbnN0IGZpbGVwYXRoID0gdGhpcy5yZXNvbHZlTG9jYWxSZXNvdXJjZUZpbGVQYXRoKHBhdGgpO1xuICAgICAgICBpZiAoIWZpbGVwYXRoKSB7XG4gICAgICAgICAgICB0aGlzLndyaXRlVHJhY2UoYFdlYlZpZXdFeHQ8YW5kcm9pZD4ucmVnaXN0ZXJMb2NhbFJlc291cmNlKCR7cmVzb3VyY2VOYW1lfSwgJHtwYXRofSkgLT4gZmlsZSBkb2Vzbid0IGV4aXN0YCwgdHJhY2VNZXNzYWdlVHlwZS5lcnJvcik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLndyaXRlVHJhY2UoYFdlYlZpZXdFeHQ8YW5kcm9pZD4ucmVnaXN0ZXJMb2NhbFJlc291cmNlKCR7cmVzb3VyY2VOYW1lfSwgJHtwYXRofSkgLT4gZmlsZTogJHtmaWxlcGF0aH1gKTtcblxuICAgICAgICB0aGlzLmxvY2FsUmVzb3VyY2VNYXAuc2V0KHJlc291cmNlTmFtZSwgZmlsZXBhdGgpO1xuICAgIH1cblxuICAgIHB1YmxpYyB1bnJlZ2lzdGVyTG9jYWxSZXNvdXJjZShyZXNvdXJjZU5hbWU6IHN0cmluZykge1xuICAgICAgICB0aGlzLndyaXRlVHJhY2UoYFdlYlZpZXdFeHQ8YW5kcm9pZD4udW5yZWdpc3RlckxvY2FsUmVzb3VyY2UoJHtyZXNvdXJjZU5hbWV9KWApO1xuICAgICAgICByZXNvdXJjZU5hbWUgPSB0aGlzLmZpeExvY2FsUmVzb3VyY2VOYW1lKHJlc291cmNlTmFtZSk7XG5cbiAgICAgICAgdGhpcy5sb2NhbFJlc291cmNlTWFwLmRlbGV0ZShyZXNvdXJjZU5hbWUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRSZWdpc3RyZXRMb2NhbFJlc291cmNlKHJlc291cmNlTmFtZTogc3RyaW5nKSB7XG4gICAgICAgIHJlc291cmNlTmFtZSA9IHRoaXMuZml4TG9jYWxSZXNvdXJjZU5hbWUocmVzb3VyY2VOYW1lKTtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmxvY2FsUmVzb3VyY2VNYXAuZ2V0KHJlc291cmNlTmFtZSk7XG5cbiAgICAgICAgdGhpcy53cml0ZVRyYWNlKGBXZWJWaWV3RXh0PGFuZHJvaWQ+LmdldFJlZ2lzdHJldExvY2FsUmVzb3VyY2UoJHtyZXNvdXJjZU5hbWV9KSAtPiAke3Jlc3VsdH1gKTtcblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHB1YmxpYyBleGVjdXRlSmF2YVNjcmlwdDxUPihzY3JpcHRDb2RlOiBzdHJpbmcpOiBQcm9taXNlPFQ+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPFQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGlmIChOdW1iZXIocGxhdGZvcm0uZGV2aWNlLnNka1ZlcnNpb24pIDwgMTkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLndyaXRlVHJhY2UoYFdlYlZpZXdFeHQ8YW5kcm9pZD4uZXhlY3V0ZUphdmFTY3JpcHQoKSAtPiBTREs6JHtwbGF0Zm9ybS5kZXZpY2Uuc2RrVmVyc2lvbn0gbm90IHN1cHBvcnRlZGAsIHRyYWNlTWVzc2FnZVR5cGUuZXJyb3IpO1xuICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ0FuZHJvaWQgQVBJIDwgMTkgbm90IHN1cHBvcnRlZCcpKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXRoaXMuYW5kcm9pZCkge1xuICAgICAgICAgICAgICAgIHRoaXMud3JpdGVUcmFjZShgV2ViVmlld0V4dDxhbmRyb2lkPi5leGVjdXRlSmF2YVNjcmlwdCgpIC0+IG5vIG5hdGl2ZXZpZXc/YCwgdHJhY2VNZXNzYWdlVHlwZS5lcnJvcik7XG4gICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcignTmF0aXZlIEFuZHJvaWQgbm90IGluaXRlZCwgY2Fubm90IGNhbGwgZXhlY3V0ZUphdmFTY3JpcHQnKSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCB0aGF0ID0gdGhpcztcbiAgICAgICAgICAgIHRoaXMuYW5kcm9pZC5ldmFsdWF0ZUphdmFzY3JpcHQoc2NyaXB0Q29kZSwgbmV3IGFuZHJvaWQud2Via2l0LlZhbHVlQ2FsbGJhY2soe1xuICAgICAgICAgICAgICAgIG9uUmVjZWl2ZVZhbHVlKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHRoYXQucGFyc2VXZWJWaWV3SmF2YXNjcmlwdFJlc3VsdChyZXN1bHQpKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0VGl0bGUoKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5uYXRpdmVWaWV3UHJvdGVjdGVkLmdldFRpdGxlKCkpO1xuICAgIH1cbn1cbiJdfQ==