UNPKG

breeze-client

Version:

Breeze data management for JavaScript clients

135 lines 18.2 kB
import { config, core } from 'breeze-client'; import { appendQueryStringParameter, encodeParams } from './adapter-core'; /** Breeze AJAX adapter using fetch API * See https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch */ export class AjaxFetchAdapter { static adapterName = "fetch"; name; defaultSettings; requestInterceptor; constructor() { this.name = AjaxFetchAdapter.adapterName; this.defaultSettings = {}; this.requestInterceptor = undefined; } static register(breezeConfig) { breezeConfig = breezeConfig || config; breezeConfig.registerAdapter("ajax", AjaxFetchAdapter); return breezeConfig.initializeAdapterInstance("ajax", AjaxFetchAdapter.adapterName, true); } initialize() { } ajax(config) { if (!fetch) { throw new Error("fetch API not supported in this browser"); } let init = { method: config.type, mode: 'cors', cache: 'no-cache', credentials: 'include', headers: { 'Content-Type': config.contentType || 'application/json', // ...config.headers // 'Content-Type': 'application/x-www-form-urlencoded', }, redirect: 'follow', referrer: 'client', // no-referrer, *client }; if (config.type !== "GET" && config.type !== "HEAD") { // body data type must match "Content-Type" header // let data = config.params || config.data; let data = config.data; if (typeof (data) !== "string") { data = JSON.stringify(data); } init.body = data; } let url = config.url; if (!core.isEmpty(config.params)) { // Hack: Not sure how Fetch handles writing 'search' parameters to the url. // so this approach takes over the url param writing completely. url = appendQueryStringParameter(url, encodeParams(config.params)); } if (!core.isEmpty(this.defaultSettings)) { let compositeConfig = core.extend({}, this.defaultSettings); init = core.extend(compositeConfig, init); // extend is shallow; extend headers separately let headers = core.extend({}, this.defaultSettings.headers); // copy default headers 1st init.headers = core.extend(headers, init.headers); } let requestInfo = { adapter: this, config: init, dsaConfig: config, success: successFn, error: errorFn, // adapter's error callback }; if (core.isFunction(this.requestInterceptor)) { let ri = this.requestInterceptor; ri(requestInfo); if (ri.oneTime) { this.requestInterceptor = undefined; } } if (requestInfo.config) { // exists unless requestInterceptor killed it. fetch(url, requestInfo.config).then(response => { if (!response.ok) { response.text().then(s => { requestInfo.error(response.status, response.statusText, s, response, null); }); } else { response.json().then(j => { requestInfo.success(j, response.statusText, response); }); } }).catch(err => { requestInfo.error(0, err && err.message || err, null, null, err); }); } function successFn(data, statusText, response) { let httpResponse = { config: config, data: data, getHeaders: getHeadersFn(response), status: response.status, statusText: statusText }; config.success(httpResponse); } function errorFn(status, statusText, body, response, errorThrown) { let httpResponse = { config: config, data: body, error: errorThrown || statusText, getHeaders: getHeadersFn(response), status: status, statusText: statusText }; config.error(httpResponse); } } } config.registerAdapter("ajax", AjaxFetchAdapter); function getHeadersFn(response) { if (!response || response.status === 0) { // timeout or abort; no headers return function (headerName) { return (headerName && headerName.length > 0) ? "" : {}; }; } else { return function (headerName) { if (headerName && headerName.length > 0) { return response.headers.get(headerName); } let hob = {}; response.headers.forEach((val, key) => { hob[key] = val; }); return hob; }; } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRhcHRlci1hamF4LWZldGNoLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FkYXB0ZXItYWpheC1mZXRjaC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWlFLE1BQU0sRUFBRSxJQUFJLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDNUcsT0FBTyxFQUFFLDBCQUEwQixFQUFFLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTFFOztFQUVFO0FBQ0YsTUFBTSxPQUFPLGdCQUFnQjtJQUMzQixNQUFNLENBQUMsV0FBVyxHQUFHLE9BQU8sQ0FBQztJQUM3QixJQUFJLENBQVM7SUFDYixlQUFlLENBQTJDO0lBQzFELGtCQUFrQixDQUEwQjtJQUU1QztRQUNFLElBQUksQ0FBQyxJQUFJLEdBQUcsZ0JBQWdCLENBQUMsV0FBVyxDQUFDO1FBQ3pDLElBQUksQ0FBQyxlQUFlLEdBQUcsRUFBRyxDQUFDO1FBQzNCLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxTQUFTLENBQUM7SUFDdEMsQ0FBQztJQUVELE1BQU0sQ0FBQyxRQUFRLENBQUMsWUFBMkI7UUFDekMsWUFBWSxHQUFHLFlBQVksSUFBSSxNQUFNLENBQUM7UUFDdEMsWUFBWSxDQUFDLGVBQWUsQ0FBQyxNQUFNLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztRQUN2RCxPQUFPLFlBQVksQ0FBQyx5QkFBeUIsQ0FBQyxNQUFNLEVBQUUsZ0JBQWdCLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBcUIsQ0FBQztJQUNoSCxDQUFDO0lBRUQsVUFBVTtJQUNWLENBQUM7SUFFRCxJQUFJLENBQUMsTUFBa0I7UUFDckIsSUFBSSxDQUFDLEtBQUssRUFBRTtZQUNWLE1BQU0sSUFBSSxLQUFLLENBQUMseUNBQXlDLENBQUMsQ0FBQztTQUM1RDtRQUVELElBQUksSUFBSSxHQUFnQjtZQUN0QixNQUFNLEVBQUUsTUFBTSxDQUFDLElBQUk7WUFDbkIsSUFBSSxFQUFFLE1BQU07WUFD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QUFDOztBQUdILE1BQU0sQ0FBQyxlQUFlLENBQUMsTUFBTSxFQUFFLGdCQUFnQixDQUFDLENBQUM7QUFFakQsU0FBUyxZQUFZLENBQUMsUUFBa0I7SUFDdEMsSUFBSSxDQUFDLFFBQVEsSUFBSSxRQUFRLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxFQUFFLCtCQUErQjtRQUN2RSxPQUFPLFVBQVUsVUFBa0I7WUFDakMsT0FBTyxDQUFDLFVBQVUsSUFBSSxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUN6RCxDQUFDLENBQUM7S0FDSDtTQUFNO1FBQ0wsT0FBTyxVQUFVLFVBQWtCO1lBQ2pDLElBQUksVUFBVSxJQUFJLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dCQUN2QyxPQUFPLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDO2FBQ3pDO1lBQ0QsSUFBSSxHQUFHLEdBQUcsRUFBRSxDQUFDO1lBQ2IsUUFBUSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUU7Z0JBQ3BDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7WUFDakIsQ0FBQyxDQUFDLENBQUM7WUFDSCxPQUFPLEdBQUcsQ0FBQztRQUNiLENBQUMsQ0FBQztLQUNIO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFqYXhBZGFwdGVyLCBBamF4Q29uZmlnLCBBamF4UmVxdWVzdEludGVyY2VwdG9yLCBCcmVlemVDb25maWcsIGNvbmZpZywgY29yZSB9IGZyb20gJ2JyZWV6ZS1jbGllbnQnO1xyXG5pbXBvcnQgeyBhcHBlbmRRdWVyeVN0cmluZ1BhcmFtZXRlciwgZW5jb2RlUGFyYW1zIH0gZnJvbSAnLi9hZGFwdGVyLWNvcmUnO1xyXG5cclxuLyoqIEJyZWV6ZSBBSkFYIGFkYXB0ZXIgdXNpbmcgZmV0Y2ggQVBJIFxyXG4gKiBTZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0ZldGNoX0FQSS9Vc2luZ19GZXRjaFxyXG4qL1xyXG5leHBvcnQgY2xhc3MgQWpheEZldGNoQWRhcHRlciBpbXBsZW1lbnRzIEFqYXhBZGFwdGVyIHtcclxuICBzdGF0aWMgYWRhcHRlck5hbWUgPSBcImZldGNoXCI7XHJcbiAgbmFtZTogc3RyaW5nO1xyXG4gIGRlZmF1bHRTZXR0aW5nczogeyBoZWFkZXJzPzogeyBbbmFtZTogc3RyaW5nXTogc3RyaW5nIH0gfTtcclxuICByZXF1ZXN0SW50ZXJjZXB0b3I/OiBBamF4UmVxdWVzdEludGVyY2VwdG9yO1xyXG5cclxuICBjb25zdHJ1Y3RvcigpIHtcclxuICAgIHRoaXMubmFtZSA9IEFqYXhGZXRjaEFkYXB0ZXIuYWRhcHRlck5hbWU7XHJcbiAgICB0aGlzLmRlZmF1bHRTZXR0aW5ncyA9IHsgfTtcclxuICAgIHRoaXMucmVxdWVzdEludGVyY2VwdG9yID0gdW5kZWZpbmVkO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIHJlZ2lzdGVyKGJyZWV6ZUNvbmZpZz86IEJyZWV6ZUNvbmZpZykge1xyXG4gICAgYnJlZXplQ29uZmlnID0gYnJlZXplQ29uZmlnIHx8IGNvbmZpZztcclxuICAgIGJyZWV6ZUNvbmZpZy5yZWdpc3RlckFkYXB0ZXIoXCJhamF4XCIsIEFqYXhGZXRjaEFkYXB0ZXIpO1xyXG4gICAgcmV0dXJuIGJyZWV6ZUNvbmZpZy5pbml0aWFsaXplQWRhcHRlckluc3RhbmNlKFwiYWpheFwiLCBBamF4RmV0Y2hBZGFwdGVyLmFkYXB0ZXJOYW1lLCB0cnVlKSBhcyBBamF4RmV0Y2hBZGFwdGVyO1xyXG4gIH1cclxuXHJcbiAgaW5pdGlhbGl6ZSgpIHtcclxuICB9XHJcblxyXG4gIGFqYXgoY29uZmlnOiBBamF4Q29uZmlnKSB7XHJcbiAgICBpZiAoIWZldGNoKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihcImZldGNoIEFQSSBub3Qgc3VwcG9ydGVkIGluIHRoaXMgYnJvd3NlclwiKTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgaW5pdDogUmVxdWVzdEluaXQgPSB7XHJcbiAgICAgIG1ldGhvZDogY29uZmlnLnR5cGUsIC8vICpHRVQsIFBPU1QsIFBVVCwgREVMRVRFLCBldGMuXHJcbiAgICAgIG1vZGU6ICdjb3JzJywgLy8gbm8tY29ycywgKmNvcnMsIHNhbWUtb3JpZ2luXHJcbiAgICAgIGNhY2hlOiAnbm8tY2FjaGUnLCAvLyAqZGVmYXVsdCwgbm8tY2FjaGUsIHJlbG9hZCwgZm9yY2UtY2FjaGUsIG9ubHktaWYtY2FjaGVkXHJcbiAgICAgIGNyZWRlbnRpYWxzOiAnaW5jbHVkZScsIC8vIGluY2x1ZGUsICpzYW1lLW9yaWdpbiwgb21pdFxyXG4gICAgICBoZWFkZXJzOiB7XHJcbiAgICAgICAgJ0NvbnRlbnQtVHlwZSc6IGNvbmZpZy5jb250ZW50VHlwZSB8fCAnYXBwbGljYXRpb24vanNvbicsXHJcbiAgICAgICAgLy8gLi4uY29uZmlnLmhlYWRlcnNcclxuICAgICAgICAvLyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcsXHJcbiAgICAgIH0sXHJcbiAgICAgIHJlZGlyZWN0OiAnZm9sbG93JywgLy8gbWFudWFsLCAqZm9sbG93LCBlcnJvclxyXG4gICAgICByZWZlcnJlcjogJ2NsaWVudCcsIC8vIG5vLXJlZmVycmVyLCAqY2xpZW50XHJcbiAgICB9O1xyXG4gICAgaWYgKGNvbmZpZy50eXBlICE9PSBcIkdFVFwiICYmIGNvbmZpZy50eXBlICE9PSBcIkhFQURcIikge1xyXG4gICAgICAvLyBib2R5IGRhdGEgdHlwZSBtdXN0IG1hdGNoIFwiQ29udGVudC1UeXBlXCIgaGVhZGVyXHJcbiAgICAgIC8vIGxldCBkYXRhID0gY29uZmlnLnBhcmFtcyB8fCBjb25maWcuZGF0YTtcclxuICAgICAgbGV0IGRhdGEgPSBjb25maWcuZGF0YTtcclxuICAgICAgaWYgKHR5cGVvZihkYXRhKSAhPT0gXCJzdHJpbmdcIikge1xyXG4gICAgICAgIGRhdGEgPSBKU09OLnN0cmluZ2lmeShkYXRhKTtcclxuICAgICAgfVxyXG4gICAgICBpbml0LmJvZHkgPSBkYXRhO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCB1cmwgPSBjb25maWcudXJsO1xyXG4gICAgaWYgKCFjb3JlLmlzRW1wdHkoY29uZmlnLnBhcmFtcykpIHtcclxuICAgICAgLy8gSGFjazogTm90IHN1cmUgaG93IEZldGNoIGhhbmRsZXMgd3JpdGluZyAnc2VhcmNoJyBwYXJhbWV0ZXJzIHRvIHRoZSB1cmwuXHJcbiAgICAgIC8vIHNvIHRoaXMgYXBwcm9hY2ggdGFrZXMgb3ZlciB0aGUgdXJsIHBhcmFtIHdyaXRpbmcgY29tcGxldGVseS5cclxuICAgICAgdXJsID0gYXBwZW5kUXVlcnlTdHJpbmdQYXJhbWV0ZXIodXJsLCBlbmNvZGVQYXJhbXMoY29uZmlnLnBhcmFtcykpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghY29yZS5pc0VtcHR5KHRoaXMuZGVmYXVsdFNldHRpbmdzKSkge1xyXG4gICAgICBsZXQgY29tcG9zaXRlQ29uZmlnID0gY29yZS5leHRlbmQoe30sIHRoaXMuZGVmYXVsdFNldHRpbmdzKTtcclxuICAgICAgaW5pdCA9IGNvcmUuZXh0ZW5kKGNvbXBvc2l0ZUNvbmZpZywgaW5pdCkgYXMgYW55O1xyXG4gICAgICAvLyBleHRlbmQgaXMgc2hhbGxvdzsgZXh0ZW5kIGhlYWRlcnMgc2VwYXJhdGVseVxyXG4gICAgICBsZXQgaGVhZGVycyA9IGNvcmUuZXh0ZW5kKHt9LCB0aGlzLmRlZmF1bHRTZXR0aW5ncy5oZWFkZXJzKTsgLy8gY29weSBkZWZhdWx0IGhlYWRlcnMgMXN0XHJcbiAgICAgIGluaXQuaGVhZGVycyA9IGNvcmUuZXh0ZW5kKGhlYWRlcnMsIGluaXQuaGVhZGVycykgYXMgYW55O1xyXG4gICAgfVxyXG5cclxuICAgIGxldCByZXF1ZXN0SW5mbyA9IHtcclxuICAgICAgYWRhcHRlcjogdGhpcywgICAgICAvLyB0aGlzIGFkYXB0ZXJcclxuICAgICAgY29uZmlnOiBpbml0LCAgIC8vIGZldGNoIGFwaSAnaW5pdCcgb2JqZWN0XHJcbiAgICAgIGRzYUNvbmZpZzogY29uZmlnLCAgLy8gdGhlIGNvbmZpZyBhcmcgZnJvbSB0aGUgY2FsbGluZyBCcmVlemUgRGF0YVNlcnZpY2VBZGFwdGVyXHJcbiAgICAgIHN1Y2Nlc3M6IHN1Y2Nlc3NGbiwgLy8gYWRhcHRlcidzIHN1Y2Nlc3MgY2FsbGJhY2tcclxuICAgICAgZXJyb3I6IGVycm9yRm4sICAgICAgLy8gYWRhcHRlcidzIGVycm9yIGNhbGxiYWNrXHJcbiAgICB9O1xyXG5cclxuICAgIGlmIChjb3JlLmlzRnVuY3Rpb24odGhpcy5yZXF1ZXN0SW50ZXJjZXB0b3IpKSB7XHJcbiAgICAgIGxldCByaSA9IHRoaXMucmVxdWVzdEludGVyY2VwdG9yIGFzIGFueTtcclxuICAgICAgcmkocmVxdWVzdEluZm8pO1xyXG4gICAgICBpZiAocmkub25lVGltZSkge1xyXG4gICAgICAgIHRoaXMucmVxdWVzdEludGVyY2VwdG9yID0gdW5kZWZpbmVkO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHJlcXVlc3RJbmZvLmNvbmZpZykgeyAvLyBleGlzdHMgdW5sZXNzIHJlcXVlc3RJbnRlcmNlcHRvciBraWxsZWQgaXQuXHJcbiAgICAgIGZldGNoKHVybCwgcmVxdWVzdEluZm8uY29uZmlnKS50aGVuKHJlc3BvbnNlID0+IHtcclxuICAgICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XHJcbiAgICAgICAgICByZXNwb25zZS50ZXh0KCkudGhlbihzID0+IHtcclxuICAgICAgICAgICAgcmVxdWVzdEluZm8uZXJyb3IocmVzcG9uc2Uuc3RhdHVzLCByZXNwb25zZS5zdGF0dXNUZXh0LCBzLCByZXNwb25zZSwgbnVsbCk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcmVzcG9uc2UuanNvbigpLnRoZW4oaiA9PiB7XHJcbiAgICAgICAgICAgIHJlcXVlc3RJbmZvLnN1Y2Nlc3MoaiwgcmVzcG9uc2Uuc3RhdHVzVGV4dCwgcmVzcG9uc2UpO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KS5jYXRjaChlcnIgPT4ge1xyXG4gICAgICAgIHJlcXVlc3RJbmZvLmVycm9yKDAsIGVyciAmJiBlcnIubWVzc2FnZSB8fCBlcnIsIG51bGwsIG51bGwsIGVycik7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHN1Y2Nlc3NGbihkYXRhOiBhbnksIHN0YXR1c1RleHQ6IHN0cmluZywgcmVzcG9uc2U6IFJlc3BvbnNlKSB7XHJcbiAgICAgIGxldCBodHRwUmVzcG9uc2UgPSB7XHJcbiAgICAgICAgY29uZmlnOiBjb25maWcsXHJcbiAgICAgICAgZGF0YTogZGF0YSxcclxuICAgICAgICBnZXRIZWFkZXJzOiBnZXRIZWFkZXJzRm4ocmVzcG9uc2UpLFxyXG4gICAgICAgIHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzLFxyXG4gICAgICAgIHN0YXR1c1RleHQ6IHN0YXR1c1RleHRcclxuICAgICAgfTtcclxuICAgICAgY29uZmlnLnN1Y2Nlc3MoaHR0cFJlc3BvbnNlKTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBlcnJvckZuKHN0YXR1czogbnVtYmVyLCBzdGF0dXNUZXh0OiBzdHJpbmcsIGJvZHk6IHN0cmluZywgcmVzcG9uc2U6IFJlc3BvbnNlLCBlcnJvclRocm93bjogYW55KSB7XHJcbiAgICAgIGxldCBodHRwUmVzcG9uc2UgPSB7XHJcbiAgICAgICAgY29uZmlnOiBjb25maWcsXHJcbiAgICAgICAgZGF0YTogYm9keSxcclxuICAgICAgICBlcnJvcjogZXJyb3JUaHJvd24gfHwgc3RhdHVzVGV4dCxcclxuICAgICAgICBnZXRIZWFkZXJzOiBnZXRIZWFkZXJzRm4ocmVzcG9uc2UpLFxyXG4gICAgICAgIHN0YXR1czogc3RhdHVzLFxyXG4gICAgICAgIHN0YXR1c1RleHQ6IHN0YXR1c1RleHRcclxuICAgICAgfTtcclxuICAgICAgY29uZmlnLmVycm9yKGh0dHBSZXNwb25zZSk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG5jb25maWcucmVnaXN0ZXJBZGFwdGVyKFwiYWpheFwiLCBBamF4RmV0Y2hBZGFwdGVyKTtcclxuXHJcbmZ1bmN0aW9uIGdldEhlYWRlcnNGbihyZXNwb25zZTogUmVzcG9uc2UpOiBhbnkge1xyXG4gIGlmICghcmVzcG9uc2UgfHwgcmVzcG9uc2Uuc3RhdHVzID09PSAwKSB7IC8vIHRpbWVvdXQgb3IgYWJvcnQ7IG5vIGhlYWRlcnNcclxuICAgIHJldHVybiBmdW5jdGlvbiAoaGVhZGVyTmFtZTogc3RyaW5nKSB7XHJcbiAgICAgIHJldHVybiAoaGVhZGVyTmFtZSAmJiBoZWFkZXJOYW1lLmxlbmd0aCA+IDApID8gXCJcIiA6IHt9O1xyXG4gICAgfTtcclxuICB9IGVsc2Uge1xyXG4gICAgcmV0dXJuIGZ1bmN0aW9uIChoZWFkZXJOYW1lOiBzdHJpbmcpIHtcclxuICAgICAgaWYgKGhlYWRlck5hbWUgJiYgaGVhZGVyTmFtZS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlLmhlYWRlcnMuZ2V0KGhlYWRlck5hbWUpO1xyXG4gICAgICB9XHJcbiAgICAgIGxldCBob2IgPSB7fTtcclxuICAgICAgcmVzcG9uc2UuaGVhZGVycy5mb3JFYWNoKCh2YWwsIGtleSkgPT4ge1xyXG4gICAgICAgIGhvYltrZXldID0gdmFsO1xyXG4gICAgICB9KTtcclxuICAgICAgcmV0dXJuIGhvYjtcclxuICAgIH07XHJcbiAgfVxyXG59XHJcbiJdfQ==