UNPKG

filestack-js

Version:

Official JavaScript library for Filestack

268 lines (266 loc) 32.6 kB
"use strict"; /* * Copyright (c) 2018 by Filestack. * Some rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ Object.defineProperty(exports, "__esModule", { value: true }); exports.CloudClient = exports.CALLBACK_URL_KEY = exports.PICKER_KEY = void 0; var utils_1 = require("../utils"); var filestack_error_1 = require("./../../filestack_error"); var request_1 = require("../request"); var store_1 = require("./../utils/store"); /** * @private */ exports.PICKER_KEY = '__fs_picker_token'; /** * key for picker callback url (specifies which tab will be opened after opening picker) * @private */ exports.CALLBACK_URL_KEY = 'fs-tab'; /** * @private */ var CloudClient = /** @class */ (function () { function CloudClient(session, options) { /** * Returns flag if token should be cached in local storage * * @private * @type {boolean} * @memberof CloudClient */ this.cache = false; this.session = session; this.storeAdapter = new store_1.Store(); this.cloudApiUrl = session.urls.cloudApiUrl; if (options && options.sessionCache) { this.cache = options.sessionCache; } } Object.defineProperty(CloudClient.prototype, "token", { get: function () { if (this.cache) { var token = this.storeAdapter.getItem(exports.PICKER_KEY, store_1.STORE_TYPE.LOCAL); if (token) return token; } if (this.isInAppBrowser) { return this.storeAdapter.getItem(exports.PICKER_KEY, store_1.STORE_TYPE.SESSION); } return this._token; }, set: function (key) { if (this.cache) { this.storeAdapter.setItem(exports.PICKER_KEY, key, store_1.STORE_TYPE.LOCAL); } if (this.isInAppBrowser) { this.storeAdapter.setItem(exports.PICKER_KEY, key, store_1.STORE_TYPE.SESSION); } this._token = key; }, enumerable: false, configurable: true }); Object.defineProperty(CloudClient.prototype, "isInAppBrowser", { /** * Return information is inappbrowser flag is set * * @readonly * @memberof CloudClient */ get: function () { if (this.session && this.session.prefetch && this.session.prefetch.settings && this.session.prefetch.settings.inapp_browser) { return this.session.prefetch.settings.inapp_browser; } return false; }, enumerable: false, configurable: true }); CloudClient.prototype.list = function (clouds, cancelTokenInput, accept) { var _this = this; var payload = { apikey: this.session.apikey, clouds: clouds, flow: 'web', token: this.token, }; if (accept) { if (!Array.isArray(accept)) { accept = [accept]; } // FS-11013. // google-drive storing uncommon file-types in incorrect format, eg .srt (subrip) file is stored in bin (octet-stream) format // so if user wants to accept subrip files, we should search google drive for octet-steam file. if (accept.includes('application/x-subrip') && !accept.includes('application/octet-stream')) { accept.push('application/octet-stream'); } // filtering mimetypes in clouds payload.accept = accept; } if (this.isInAppBrowser) { payload.appurl = this.currentAppUrl(); } if (this.session.policy && this.session.signature) { payload.policy = this.session.policy; payload.signature = this.session.signature; } var options = {}; if (cancelTokenInput) { var cancelToken = new request_1.FsCancelToken(); cancelTokenInput.cancel = cancelToken.cancel.bind(cancelToken); options.cancelToken = cancelToken; } return request_1.FsRequest.post("".concat(this.cloudApiUrl, "/folder/list"), payload, options).then(function (res) { if (res.data && res.data.token) { _this.token = res.data.token; } return res.data; }); }; CloudClient.prototype.store = function (name, path, options, customSource, cancelTokenInput, uploadTags, pickerSessionId) { var _a; var _this = this; if (options === void 0) { options = {}; } if (customSource === void 0) { customSource = {}; } if (uploadTags === void 0) { uploadTags = null; } // Default to S3 if (options.location === undefined) { options.location = 's3'; } var payload = { apikey: this.session.apikey, token: this.token, flow: 'web', upload_tags: uploadTags ? uploadTags : undefined, clouds: (_a = {}, _a[name] = { path: path, picker_session_id: pickerSessionId, store: (0, utils_1.removeEmpty)(options), }, _a), }; if (name === 'customsource' && customSource.customSourcePath) { payload.clouds.customsource.customSourcePath = customSource.customSourcePath; } if (name === 'customsource' && customSource.customSourceContainer) { payload.clouds.customsource.customSourceContainer = customSource.customSourceContainer; } if (this.session.policy && this.session.signature) { payload.policy = this.session.policy; payload.signature = this.session.signature; } var requestOptions = {}; if (cancelTokenInput) { var cancelToken = new request_1.FsCancelToken(); cancelTokenInput.cancel = cancelToken.cancel.bind(cancelToken); requestOptions.cancelToken = cancelToken; } return request_1.FsRequest.post("".concat(this.cloudApiUrl, "/store/"), payload, requestOptions).then(function (res) { if (res.data && res.data.token) { _this.token = res.data.token; } if (res.data && res.data[name]) { return res.data[name]; } return res.data; }); }; CloudClient.prototype.logout = function (name) { var _a; var payload = { apikey: this.session.apikey, flow: 'web', token: this.token, }; if (name) { payload.clouds = (_a = {}, _a[name] = {}, _a); } else { if (this.cache) { // No name means logout of ALL clouds. Clear local session. this.storeAdapter.removeItem(exports.PICKER_KEY, store_1.STORE_TYPE.LOCAL); } if (this.isInAppBrowser) { this.storeAdapter.removeItem(exports.PICKER_KEY, store_1.STORE_TYPE.SESSION); } } return request_1.FsRequest.post("".concat(this.cloudApiUrl, "/auth/logout"), payload).then(function (res) { if (res.data && res.data[name]) { return res.data[name]; } return res.data; }); }; CloudClient.prototype.metadata = function (url, headers) { var payload = { apikey: this.session.apikey, url: url, headers: headers, }; if (this.session.policy && this.session.signature) { payload.policy = this.session.policy; payload.signature = this.session.signature; } return request_1.FsRequest.post("".concat(this.cloudApiUrl, "/metadata"), payload).then(function (res) { return res.data; }); }; // OpenTok API Endpoints CloudClient.prototype.tokInit = function (type) { if (type !== 'video' && type !== 'audio') { throw new filestack_error_1.FilestackError('Type must be one of video or audio.'); } return request_1.FsRequest.post("".concat(this.cloudApiUrl, "/recording/").concat(type, "/init")).then(function (res) { return res.data; }); }; CloudClient.prototype.tokStart = function (type, key, sessionId) { if (type !== 'video' && type !== 'audio') { throw new filestack_error_1.FilestackError('Type must be one of video or audio.'); } var payload = { apikey: key, session_id: sessionId, }; return request_1.FsRequest.post("".concat(this.cloudApiUrl, "/recording/").concat(type, "/start"), payload).then(function (res) { return res.data; }); }; CloudClient.prototype.tokStop = function (type, key, sessionId, archiveId) { if (type !== 'video' && type !== 'audio') { throw new filestack_error_1.FilestackError('Type must be one of video or audio.'); } var payload = { apikey: key, session_id: sessionId, archive_id: archiveId, }; return request_1.FsRequest.post("".concat(this.cloudApiUrl, "/recording/").concat(type, "/stop"), payload).then(function (res) { return res.data; }); }; CloudClient.prototype.currentAppUrl = function () { if (!window.URLSearchParams) { return undefined; } // set init string for clouds backend, // After this cloud service can make redirect back to current page url with selected tab for given cloud // if param exists and its value is init, backend will fill it with cloud name var searchParams = new URLSearchParams(window.location.search); searchParams.set(exports.CALLBACK_URL_KEY, 'init'); return "".concat(window.location.protocol, "//").concat(window.location.host).concat(window.location.pathname, "?").concat(searchParams.toString()); }; return CloudClient; }()); exports.CloudClient = CloudClient; //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9saWIvYXBpL2Nsb3VkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7OztBQUVILGtDQUF1QztBQUd2QywyREFBeUQ7QUFFekQsc0NBQXNEO0FBQ3RELDBDQUFxRDtBQUVyRDs7R0FFRztBQUNVLFFBQUEsVUFBVSxHQUFHLG1CQUFtQixDQUFDO0FBRTlDOzs7R0FHRztBQUNVLFFBQUEsZ0JBQWdCLEdBQUcsUUFBUSxDQUFDO0FBRXpDOztHQUVHO0FBQ0g7SUErQkUscUJBQVksT0FBZ0IsRUFBRSxPQUF1QjtRQTNCckQ7Ozs7OztXQU1HO1FBQ0ssVUFBSyxHQUFZLEtBQUssQ0FBQztRQXFCN0IsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFDdkIsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLGFBQUssRUFBRSxDQUFDO1FBRWhDLElBQUksQ0FBQyxXQUFXLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUM7UUFFNUMsSUFBSSxPQUFPLElBQUksT0FBTyxDQUFDLFlBQVksRUFBRTtZQUNuQyxJQUFJLENBQUMsS0FBSyxHQUFHLE9BQU8sQ0FBQyxZQUFZLENBQUM7U0FDbkM7SUFDSCxDQUFDO0lBRUQsc0JBQUksOEJBQUs7YUFBVDtZQUNFLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRTtnQkFDZCxJQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxrQkFBVSxFQUFFLGtCQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3RFLElBQUksS0FBSztvQkFBRSxPQUFPLEtBQUssQ0FBQzthQUN6QjtZQUVELElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRTtnQkFDdkIsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxrQkFBVSxFQUFFLGtCQUFVLENBQUMsT0FBTyxDQUFDLENBQUM7YUFDbEU7WUFFRCxPQUFPLElBQUksQ0FBQyxNQUFNLENB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QkFBQztBQUFELENBcFJBLEFBb1JDLElBQUE7QUFwUlksa0NBQVciLCJmaWxlIjoibGliL2FwaS9jbG91ZC5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTggYnkgRmlsZXN0YWNrLlxuICogU29tZSByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IHJlbW92ZUVtcHR5IH0gZnJvbSAnLi4vdXRpbHMnO1xuaW1wb3J0IHsgU3RvcmVQYXJhbXMgfSBmcm9tICcuLi9maWxlbGluayc7XG5pbXBvcnQgeyBDbGllbnRPcHRpb25zLCBTZXNzaW9uIH0gZnJvbSAnLi4vY2xpZW50JztcbmltcG9ydCB7IEZpbGVzdGFja0Vycm9yIH0gZnJvbSAnLi8uLi8uLi9maWxlc3RhY2tfZXJyb3InO1xuaW1wb3J0IHsgVXBsb2FkVGFncyB9IGZyb20gJy4vdXBsb2FkL2ZpbGUnO1xuaW1wb3J0IHsgRnNSZXF1ZXN0LCBGc0NhbmNlbFRva2VuIH0gZnJvbSAnLi4vcmVxdWVzdCc7XG5pbXBvcnQgeyBTdG9yZSwgU1RPUkVfVFlQRSB9IGZyb20gJy4vLi4vdXRpbHMvc3RvcmUnO1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBjb25zdCBQSUNLRVJfS0VZID0gJ19fZnNfcGlja2VyX3Rva2VuJztcblxuLyoqXG4gKiBrZXkgZm9yIHBpY2tlciBjYWxsYmFjayB1cmwgKHNwZWNpZmllcyB3aGljaCB0YWIgd2lsbCBiZSBvcGVuZWQgYWZ0ZXIgb3BlbmluZyBwaWNrZXIpXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgY29uc3QgQ0FMTEJBQ0tfVVJMX0tFWSA9ICdmcy10YWInO1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBjbGFzcyBDbG91ZENsaWVudCB7XG4gIHNlc3Npb246IFNlc3Npb247XG4gIGNsb3VkQXBpVXJsOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFJldHVybnMgZmxhZyBpZiB0b2tlbiBzaG91bGQgYmUgY2FjaGVkIGluIGxvY2FsIHN0b3JhZ2VcbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHR5cGUge2Jvb2xlYW59XG4gICAqIEBtZW1iZXJvZiBDbG91ZENsaWVudFxuICAgKi9cbiAgcHJpdmF0ZSBjYWNoZTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBUb2tlbiByZXR1cm5lZCBmcm9tIGFwaSBmb3IgYWNjZXNzaW5nIGNsb3Vkc1xuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKiBAbWVtYmVyb2YgQ2xvdWRDbGllbnRcbiAgICovXG4gIHByaXZhdGUgX3Rva2VuOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFN0b3JlIGFkYXB0ZXIgaW5zdGFuY2VcbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHR5cGUge1N0b3JlfVxuICAgKiBAbWVtYmVyb2YgQ2xvdWRDbGllbnRcbiAgICovXG4gIHByaXZhdGUgc3RvcmVBZGFwdGVyOiBTdG9yZTtcblxuICBjb25zdHJ1Y3RvcihzZXNzaW9uOiBTZXNzaW9uLCBvcHRpb25zPzogQ2xpZW50T3B0aW9ucykge1xuICAgIHRoaXMuc2Vzc2lvbiA9IHNlc3Npb247XG4gICAgdGhpcy5zdG9yZUFkYXB0ZXIgPSBuZXcgU3RvcmUoKTtcblxuICAgIHRoaXMuY2xvdWRBcGlVcmwgPSBzZXNzaW9uLnVybHMuY2xvdWRBcGlVcmw7XG5cbiAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLnNlc3Npb25DYWNoZSkge1xuICAgICAgdGhpcy5jYWNoZSA9IG9wdGlvbnMuc2Vzc2lvbkNhY2hlO1xuICAgIH1cbiAgfVxuXG4gIGdldCB0b2tlbigpIHtcbiAgICBpZiAodGhpcy5jYWNoZSkge1xuICAgICAgY29uc3QgdG9rZW4gPSB0aGlzLnN0b3JlQWRhcHRlci5nZXRJdGVtKFBJQ0tFUl9LRVksIFNUT1JFX1RZUEUuTE9DQUwpO1xuICAgICAgaWYgKHRva2VuKSByZXR1cm4gdG9rZW47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaXNJbkFwcEJyb3dzZXIpIHtcbiAgICAgIHJldHVybiB0aGlzLnN0b3JlQWRhcHRlci5nZXRJdGVtKFBJQ0tFUl9LRVksIFNUT1JFX1RZUEUuU0VTU0lPTik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX3Rva2VuO1xuICB9XG5cbiAgc2V0IHRva2VuKGtleSkge1xuICAgIGlmICh0aGlzLmNhY2hlKSB7XG4gICAgICB0aGlzLnN0b3JlQWRhcHRlci5zZXRJdGVtKFBJQ0tFUl9LRVksIGtleSwgU1RPUkVfVFlQRS5MT0NBTCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaXNJbkFwcEJyb3dzZXIpIHtcbiAgICAgIHRoaXMuc3RvcmVBZGFwdGVyLnNldEl0ZW0oUElDS0VSX0tFWSwga2V5LCBTVE9SRV9UWVBFLlNFU1NJT04pO1xuICAgIH1cblxuICAgIHRoaXMuX3Rva2VuID0ga2V5O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBpbmZvcm1hdGlvbiBpcyBpbmFwcGJyb3dzZXIgZmxhZyBpcyBzZXRcbiAgICpcbiAgICogQHJlYWRvbmx5XG4gICAqIEBtZW1iZXJvZiBDbG91ZENsaWVudFxuICAgKi9cbiAgcHJpdmF0ZSBnZXQgaXNJbkFwcEJyb3dzZXIoKSB7XG4gICAgaWYgKHRoaXMuc2Vzc2lvblxuICAgICAgJiYgdGhpcy5zZXNzaW9uLnByZWZldGNoXG4gICAgICAmJiB0aGlzLnNlc3Npb24ucHJlZmV0Y2guc2V0dGluZ3NcbiAgICAgICYmIHRoaXMuc2Vzc2lvbi5wcmVmZXRjaC5zZXR0aW5ncy5pbmFwcF9icm93c2VyKSB7XG4gICAgICByZXR1cm4gdGhpcy5zZXNzaW9uLnByZWZldGNoLnNldHRpbmdzLmluYXBwX2Jyb3dzZXI7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgbGlzdChjbG91ZHM6IGFueSwgY2FuY2VsVG9rZW5JbnB1dD86IGFueSwgYWNjZXB0Pzogc3RyaW5nW10gfCBzdHJpbmcpIHtcbiAgICBjb25zdCBwYXlsb2FkOiBhbnkgPSB7XG4gICAgICBhcGlrZXk6IHRoaXMuc2Vzc2lvbi5hcGlrZXksXG4gICAgICBjbG91ZHMsXG4gICAgICBmbG93OiAnd2ViJyxcbiAgICAgIHRva2VuOiB0aGlzLnRva2VuLFxuICAgIH07XG5cbiAgICBpZiAoYWNjZXB0KSB7XG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkoYWNjZXB0KSkge1xuICAgICAgICBhY2NlcHQgPSBbYWNjZXB0XTtcbiAgICAgIH1cbiAgICAgIC8vIEZTLTExMDEzLlxuICAgICAgLy8gZ29vZ2xlLWRyaXZlIHN0b3JpbmcgdW5jb21tb24gZmlsZS10eXBlcyBpbiBpbmNvcnJlY3QgZm9ybWF0LCBlZyAuc3J0IChzdWJyaXApIGZpbGUgaXMgc3RvcmVkIGluIGJpbiAob2N0ZXQtc3RyZWFtKSBmb3JtYXRcbiAgICAgIC8vIHNvIGlmIHVzZXIgd2FudHMgdG8gYWNjZXB0IHN1YnJpcCBmaWxlcywgd2Ugc2hvdWxkIHNlYXJjaCBnb29nbGUgZHJpdmUgZm9yIG9jdGV0LXN0ZWFtIGZpbGUuXG4gICAgICBpZiAoYWNjZXB0LmluY2x1ZGVzKCdhcHBsaWNhdGlvbi94LXN1YnJpcCcpICYmICFhY2NlcHQuaW5jbHVkZXMoJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbScpKSB7XG4gICAgICAgIGFjY2VwdC5wdXNoKCdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nKTtcbiAgICAgIH1cbiAgICAgIC8vIGZpbHRlcmluZyBtaW1ldHlwZXMgaW4gY2xvdWRzXG4gICAgICBwYXlsb2FkLmFjY2VwdCA9IGFjY2VwdDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc0luQXBwQnJvd3Nlcikge1xuICAgICAgcGF5bG9hZC5hcHB1cmwgPSB0aGlzLmN1cnJlbnRBcHBVcmwoKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zZXNzaW9uLnBvbGljeSAmJiB0aGlzLnNlc3Npb24uc2lnbmF0dXJlKSB7XG4gICAgICBwYXlsb2FkLnBvbGljeSA9IHRoaXMuc2Vzc2lvbi5wb2xpY3k7XG4gICAgICBwYXlsb2FkLnNpZ25hdHVyZSA9IHRoaXMuc2Vzc2lvbi5zaWduYXR1cmU7XG4gICAgfVxuXG4gICAgbGV0IG9wdGlvbnM6IGFueSA9IHt9O1xuXG4gICAgaWYgKGNhbmNlbFRva2VuSW5wdXQpIHtcbiAgICAgIGNvbnN0IGNhbmNlbFRva2VuID0gbmV3IEZzQ2FuY2VsVG9rZW4oKTtcbiAgICAgIGNhbmNlbFRva2VuSW5wdXQuY2FuY2VsID0gY2FuY2VsVG9rZW4uY2FuY2VsLmJpbmQoY2FuY2VsVG9rZW4pO1xuICAgICAgb3B0aW9ucy5jYW5jZWxUb2tlbiA9IGNhbmNlbFRva2VuO1xuICAgIH1cblxuICAgIHJldHVybiBGc1JlcXVlc3QucG9zdChgJHt0aGlzLmNsb3VkQXBpVXJsfS9mb2xkZXIvbGlzdGAsIHBheWxvYWQsIG9wdGlvbnMpLnRoZW4ocmVzID0+IHtcbiAgICAgIGlmIChyZXMuZGF0YSAmJiByZXMuZGF0YS50b2tlbikge1xuICAgICAgICB0aGlzLnRva2VuID0gcmVzLmRhdGEudG9rZW47XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXMuZGF0YTtcbiAgICB9KTtcbiAgfVxuXG4gIHN0b3JlKG5hbWU6IHN0cmluZywgcGF0aDogc3RyaW5nLCBvcHRpb25zOiBTdG9yZVBhcmFtcyA9IHt9LCBjdXN0b21Tb3VyY2U6IGFueSA9IHt9LCBjYW5jZWxUb2tlbklucHV0PzogYW55LCB1cGxvYWRUYWdzOiBVcGxvYWRUYWdzID0gbnVsbCwgcGlja2VyU2Vzc2lvbklkPzogc3RyaW5nKSB7XG4gICAgLy8gRGVmYXVsdCB0byBTM1xuICAgIGlmIChvcHRpb25zLmxvY2F0aW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgIG9wdGlvbnMubG9jYXRpb24gPSAnczMnO1xuICAgIH1cblxuICAgIGNvbnN0IHBheWxvYWQ6IGFueSA9IHtcbiAgICAgIGFwaWtleTogdGhpcy5zZXNzaW9uLmFwaWtleSxcbiAgICAgIHRva2VuOiB0aGlzLnRva2VuLFxuICAgICAgZmxvdzogJ3dlYicsXG4gICAgICB1cGxvYWRfdGFnczogdXBsb2FkVGFncyA/IHVwbG9hZFRhZ3MgOiB1bmRlZmluZWQsXG4gICAgICBjbG91ZHM6IHtcbiAgICAgICAgW25hbWVdOiB7XG4gICAgICAgICAgcGF0aCxcbiAgICAgICAgICBwaWNrZXJfc2Vzc2lvbl9pZDogcGlja2VyU2Vzc2lvbklkLFxuICAgICAgICAgIHN0b3JlOiByZW1vdmVFbXB0eShvcHRpb25zKSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfTtcblxuICAgIGlmIChuYW1lID09PSAnY3VzdG9tc291cmNlJyAmJiBjdXN0b21Tb3VyY2UuY3VzdG9tU291cmNlUGF0aCkge1xuICAgICAgcGF5bG9hZC5jbG91ZHMuY3VzdG9tc291cmNlLmN1c3RvbVNvdXJjZVBhdGggPSBjdXN0b21Tb3VyY2UuY3VzdG9tU291cmNlUGF0aDtcbiAgICB9XG5cbiAgICBpZiAobmFtZSA9PT0gJ2N1c3RvbXNvdXJjZScgJiYgY3VzdG9tU291cmNlLmN1c3RvbVNvdXJjZUNvbnRhaW5lcikge1xuICAgICAgcGF5bG9hZC5jbG91ZHMuY3VzdG9tc291cmNlLmN1c3RvbVNvdXJjZUNvbnRhaW5lciA9IGN1c3RvbVNvdXJjZS5jdXN0b21Tb3VyY2VDb250YWluZXI7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc2Vzc2lvbi5wb2xpY3kgJiYgdGhpcy5zZXNzaW9uLnNpZ25hdHVyZSkge1xuICAgICAgcGF5bG9hZC5wb2xpY3kgPSB0aGlzLnNlc3Npb24ucG9saWN5O1xuICAgICAgcGF5bG9hZC5zaWduYXR1cmUgPSB0aGlzLnNlc3Npb24uc2lnbmF0dXJlO1xuICAgIH1cblxuICAgIGxldCByZXF1ZXN0T3B0aW9uczogYW55ID0ge307XG5cbiAgICBpZiAoY2FuY2VsVG9rZW5JbnB1dCkge1xuICAgICAgY29uc3QgY2FuY2VsVG9rZW4gPSBuZXcgRnNDYW5jZWxUb2tlbigpO1xuICAgICAgY2FuY2VsVG9rZW5JbnB1dC5jYW5jZWwgPSBjYW5jZWxUb2tlbi5jYW5jZWwuYmluZChjYW5jZWxUb2tlbik7XG4gICAgICByZXF1ZXN0T3B0aW9ucy5jYW5jZWxUb2tlbiA9IGNhbmNlbFRva2VuO1xuICAgIH1cblxuICAgIHJldHVybiBGc1JlcXVlc3QucG9zdChgJHt0aGlzLmNsb3VkQXBpVXJsfS9zdG9yZS9gLCBwYXlsb2FkLCByZXF1ZXN0T3B0aW9ucykudGhlbihyZXMgPT4ge1xuICAgICAgaWYgKHJlcy5kYXRhICYmIHJlcy5kYXRhLnRva2VuKSB7XG4gICAgICAgIHRoaXMudG9rZW4gPSByZXMuZGF0YS50b2tlbjtcbiAgICAgIH1cblxuICAgICAgaWYgKHJlcy5kYXRhICYmIHJlcy5kYXRhW25hbWVdKSB7XG4gICAgICAgIHJldHVybiByZXMuZGF0YVtuYW1lXTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlcy5kYXRhO1xuICAgIH0pO1xuICB9XG5cbiAgbG9nb3V0KG5hbWU/OiBzdHJpbmcpIHtcbiAgICBjb25zdCBwYXlsb2FkOiBhbnkgPSB7XG4gICAgICBhcGlrZXk6IHRoaXMuc2Vzc2lvbi5hcGlrZXksXG4gICAgICBmbG93OiAnd2ViJyxcbiAgICAgIHRva2VuOiB0aGlzLnRva2VuLFxuICAgIH07XG5cbiAgICBpZiAobmFtZSkge1xuICAgICAgcGF5bG9hZC5jbG91ZHMgPSB7IFtuYW1lXToge30gfTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRoaXMuY2FjaGUpIHtcbiAgICAgICAgLy8gTm8gbmFtZSBtZWFucyBsb2dvdXQgb2YgQUxMIGNsb3Vkcy4gQ2xlYXIgbG9jYWwgc2Vzc2lvbi5cbiAgICAgICAgdGhpcy5zdG9yZUFkYXB0ZXIucmVtb3ZlSXRlbShQSUNLRVJfS0VZLCBTVE9SRV9UWVBFLkxPQ0FMKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuaXNJbkFwcEJyb3dzZXIpIHtcbiAgICAgICAgdGhpcy5zdG9yZUFkYXB0ZXIucmVtb3ZlSXRlbShQSUNLRVJfS0VZLCBTVE9SRV9UWVBFLlNFU1NJT04pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBGc1JlcXVlc3QucG9zdChgJHt0aGlzLmNsb3VkQXBpVXJsfS9hdXRoL2xvZ291dGAsIHBheWxvYWQpLnRoZW4ocmVzID0+IHtcbiAgICAgIGlmIChyZXMuZGF0YSAmJiByZXMuZGF0YVtuYW1lXSkge1xuICAgICAgICByZXR1cm4gcmVzLmRhdGFbbmFtZV07XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzLmRhdGE7XG4gICAgfSk7XG4gIH1cblxuICBtZXRhZGF0YSh1cmw6IHN0cmluZywgaGVhZGVycz86IHtba2V5OiBzdHJpbmddOiBzdHJpbmd9KSB7XG4gICAgY29uc3QgcGF5bG9hZDogYW55ID0ge1xuICAgICAgYXBpa2V5OiB0aGlzLnNlc3Npb24uYXBpa2V5LFxuICAgICAgdXJsLFxuICAgICAgaGVhZGVycyxcbiAgICB9O1xuXG4gICAgaWYgKHRoaXMuc2Vzc2lvbi5wb2xpY3kgJiYgdGhpcy5zZXNzaW9uLnNpZ25hdHVyZSkge1xuICAgICAgcGF5bG9hZC5wb2xpY3kgPSB0aGlzLnNlc3Npb24ucG9saWN5O1xuICAgICAgcGF5bG9hZC5zaWduYXR1cmUgPSB0aGlzLnNlc3Npb24uc2lnbmF0dXJlO1xuICAgIH1cblxuICAgIHJldHVybiBGc1JlcXVlc3QucG9zdChgJHt0aGlzLmNsb3VkQXBpVXJsfS9tZXRhZGF0YWAsIHBheWxvYWQpLnRoZW4ocmVzID0+IHJlcy5kYXRhKTtcbiAgfVxuXG4gIC8vIE9wZW5Ub2sgQVBJIEVuZHBvaW50c1xuICB0b2tJbml0KHR5cGU6IHN0cmluZykge1xuICAgIGlmICh0eXBlICE9PSAndmlkZW8nICYmIHR5cGUgIT09ICdhdWRpbycpIHtcbiAgICAgIHRocm93IG5ldyBGaWxlc3RhY2tFcnJvcignVHlwZSBtdXN0IGJlIG9uZSBvZiB2aWRlbyBvciBhdWRpby4nKTtcbiAgICB9XG4gICAgcmV0dXJuIEZzUmVxdWVzdC5wb3N0KGAke3RoaXMuY2xvdWRBcGlVcmx9L3JlY29yZGluZy8ke3R5cGV9L2luaXRgKS50aGVuKHJlcyA9PiByZXMuZGF0YSk7XG4gIH1cblxuICB0b2tTdGFydCh0eXBlOiBzdHJpbmcsIGtleTogc3RyaW5nLCBzZXNzaW9uSWQ6IHN0cmluZykge1xuICAgIGlmICh0eXBlICE9PSAndmlkZW8nICYmIHR5cGUgIT09ICdhdWRpbycpIHtcbiAgICAgIHRocm93IG5ldyBGaWxlc3RhY2tFcnJvcignVHlwZSBtdXN0IGJlIG9uZSBvZiB2aWRlbyBvciBhdWRpby4nKTtcbiAgICB9XG4gICAgY29uc3QgcGF5bG9hZCA9IHtcbiAgICAgIGFwaWtleToga2V5LFxuICAgICAgc2Vzc2lvbl9pZDogc2Vzc2lvbklkLFxuICAgIH07XG5cbiAgICByZXR1cm4gRnNSZXF1ZXN0LnBvc3QoYCR7dGhpcy5jbG91ZEFwaVVybH0vcmVjb3JkaW5nLyR7dHlwZX0vc3RhcnRgLCBwYXlsb2FkKS50aGVuKHJlcyA9PiByZXMuZGF0YSk7XG4gIH1cblxuICB0b2tTdG9wKHR5cGU6IHN0cmluZywga2V5OiBzdHJpbmcsIHNlc3Npb25JZDogc3RyaW5nLCBhcmNoaXZlSWQ6IHN0cmluZykge1xuICAgIGlmICh0eXBlICE9PSAndmlkZW8nICYmIHR5cGUgIT09ICdhdWRpbycpIHtcbiAgICAgIHRocm93IG5ldyBGaWxlc3RhY2tFcnJvcignVHlwZSBtdXN0IGJlIG9uZSBvZiB2aWRlbyBvciBhdWRpby4nKTtcbiAgICB9XG5cbiAgICBjb25zdCBwYXlsb2FkID0ge1xuICAgICAgYXBpa2V5OiBrZXksXG4gICAgICBzZXNzaW9uX2lkOiBzZXNzaW9uSWQsXG4gICAgICBhcmNoaXZlX2lkOiBhcmNoaXZlSWQsXG4gICAgfTtcblxuICAgIHJldHVybiBGc1JlcXVlc3QucG9zdChgJHt0aGlzLmNsb3VkQXBpVXJsfS9yZWNvcmRpbmcvJHt0eXBlfS9zdG9wYCwgcGF5bG9hZCkudGhlbihyZXMgPT4gcmVzLmRhdGEpO1xuICB9XG5cbiAgcHJpdmF0ZSBjdXJyZW50QXBwVXJsKCkge1xuICAgIGlmICghd2luZG93LlVSTFNlYXJjaFBhcmFtcykge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvLyBzZXQgaW5pdCBzdHJpbmcgZm9yIGNsb3VkcyBiYWNrZW5kLFxuICAgIC8vIEFmdGVyIHRoaXMgY2xvdWQgc2VydmljZSBjYW4gbWFrZSByZWRpcmVjdCBiYWNrIHRvIGN1cnJlbnQgcGFnZSB1cmwgd2l0aCBzZWxlY3RlZCB0YWIgZm9yIGdpdmVuIGNsb3VkXG4gICAgLy8gaWYgcGFyYW0gZXhpc3RzIGFuZCBpdHMgdmFsdWUgaXMgaW5pdCwgYmFja2VuZCB3aWxsIGZpbGwgaXQgd2l0aCBjbG91ZCBuYW1lXG4gICAgY29uc3Qgc2VhcmNoUGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh3aW5kb3cubG9jYXRpb24uc2VhcmNoKTtcbiAgICBzZWFyY2hQYXJhbXMuc2V0KENBTExCQUNLX1VSTF9LRVksICdpbml0Jyk7XG5cbiAgICByZXR1cm4gYCR7d2luZG93LmxvY2F0aW9uLnByb3RvY29sfS8vJHt3aW5kb3cubG9jYXRpb24uaG9zdH0ke3dpbmRvdy5sb2NhdGlvbi5wYXRobmFtZX0/JHtzZWFyY2hQYXJhbXMudG9TdHJpbmcoKX1gO1xuICB9XG59XG4iXX0=