UNPKG

@cloudbase/app

Version:
205 lines 20.5 kB
var __assign = (this && this.__assign) || function () { __assign = Object.assign || function(t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; return __assign.apply(this, arguments); }; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __generator = (this && this.__generator) || function (thisArg, body) { var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; function verb(n) { return function (v) { return step([n, v]); }; } function step(op) { if (f) throw new TypeError("Generator is already executing."); while (g && (g = 0, op[0] && (_ = 0)), _) try { if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; if (y = 0, t) op = [op[0] & 2, t.value]; switch (op[0]) { case 0: case 1: t = op; break; case 4: _.label++; return { value: op[1], done: false }; case 5: _.label++; y = op[1]; op = [0]; continue; case 7: op = _.ops.pop(); _.trys.pop(); continue; default: if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } if (t[2]) _.ops.pop(); _.trys.pop(); continue; } op = body.call(thisArg, _); } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; } }; var _a; import { utils } from '@cloudbase/utilities'; import { ReadableStream } from 'web-streams-polyfill'; import { ERROR, checkCustomUserIdRegex } from './constants'; import { lookupAppId } from './metadata'; export var isFormData = (_a = utils, _a.isFormData), toQueryString = _a.toQueryString; export function getEnv(key) { if (typeof process === 'undefined' || !process.env) { return key !== undefined ? undefined : {}; } return key !== undefined ? process.env[key] : process.env; } export var checkIsInScf = function () { return getEnv('TENCENTCLOUD_RUNENV') === 'SCF'; }; export function checkIsInCBR() { return !!getEnv('CBR_ENV_ID'); } var kSumeruEnvSet = new Set(['formal', 'pre', 'test']); export function checkIsInSumeru() { return kSumeruEnvSet.has(getEnv('SUMERU_ENV') || ''); } export function isNonEmptyString(str) { return typeof str === 'string' && str !== ''; } export function checkIsInTencentCloud() { return __awaiter(this, void 0, void 0, function () { var _a; return __generator(this, function (_b) { switch (_b.label) { case 0: if (getEnv('TENCENTCLOUD') === 'true') { return [2, true]; } _a = isNonEmptyString; return [4, lookupAppId()]; case 1: return [2, _a.apply(void 0, [_b.sent()])]; } }); }); } export var getCurrRunEnvTag = function () { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) { switch (_a.label) { case 0: if (checkIsInScf()) { return [2, 'scf']; } if (checkIsInCBR()) { return [2, 'cbr']; } if (checkIsInSumeru()) { return [2, 'sumeru']; } return [4, checkIsInTencentCloud()]; case 1: if (_a.sent()) { return [2, 'tencentcloud']; } return [2, 'unknown']; } }); }); }; export var validateUid = function (uid) { if (typeof uid !== 'string') { throw __assign(__assign({}, ERROR.INVALID_PARAM), { message: 'uid must be a string' }); } if (!checkCustomUserIdRegex.test(uid)) { throw __assign(__assign({}, ERROR.INVALID_PARAM), { message: "Invalid uid: \"".concat(uid, "\"") }); } }; export function safeParseJson(text) { if (!text || !text.trim()) { return null; } try { return JSON.parse(text); } catch (e) { console.warn('catch an error', { e: e, text: text }); return text; } } export function obj2StrRecord(obj) { return Object.entries(obj).reduce(function (acc, cur) { var key = cur[0], value = cur[1]; acc[key] = String(value); return acc; }, {}); } export function headersInit2Indexable(h) { if (isHeaders(h)) { var ret_1 = {}; h.forEach(function (val, key) { ret_1[key] = val; }); return ret_1; } return h; function isHeaders(h) { try { return h instanceof Headers; } catch (_) { return false; } } } export function parseQueryString(search) { var params = {}; var cleanSearch = search.replace(/^[?#]/, ''); if (!cleanSearch) { return params; } var pairs = cleanSearch.split('&'); pairs.forEach(function (item) { var _a = item.split('='), key = _a[0], value = _a[1]; key = decodeURIComponent(key); value = decodeURIComponent(value || ''); if (key) { if (params[key]) { if (Array.isArray(params[key])) { params[key].push(value); } else { params[key] = [params[key], value]; } } else { params[key] = value; } } }); return params; } export function createWebStreamFromNodeReadableStream(stream) { var asyncIterator = stream[Symbol.asyncIterator](); return new ReadableStream({ pull: function (controller) { return __awaiter(this, void 0, void 0, function () { var next; return __generator(this, function (_a) { switch (_a.label) { case 0: return [4, asyncIterator.next()]; case 1: next = _a.sent(); if (next.done) { controller.close(); } else { controller.enqueue(next.value); } return [2]; } }); }); }, }); } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGlicy9hZGFwdGVyLW5vZGUvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLHNCQUFzQixDQUFBO0FBQzVDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQTtBQUNyRCxPQUFPLEVBQUUsS0FBSyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sYUFBYSxDQUFBO0FBQzNELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxZQUFZLENBQUE7QUFHeEMsTUFBTSxDQUFTLElBQUEsVUFBVSxJQUFaLEtBQWdDLEtBRzVDLGdCQUh3QixFQUFFLGFBQWEsbUJBQUEsQ0FHdkM7QUFRRCxNQUFNLFVBQVUsTUFBTSxDQUFDLEdBQVk7SUFDakMsSUFBSSxPQUFPLE9BQU8sS0FBSyxXQUFXLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFO1FBQ2xELE9BQU8sR0FBRyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUE7S0FDMUM7SUFDRCxPQUFPLEdBQUcsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUE7QUFDM0QsQ0FBQztBQUdELE1BQU0sQ0FBQyxJQUFNLFlBQVksR0FBRyxjQUFNLE9BQUEsTUFBTSxDQUFDLHFCQUFxQixDQUFDLEtBQUssS0FBSyxFQUF2QyxDQUF1QyxDQUFBO0FBRXpFLE1BQU0sVUFBVSxZQUFZO0lBRTFCLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQTtBQUMvQixDQUFDO0FBRUQsSUFBTSxhQUFhLEdBQUcsSUFB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QyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUE7aUJBQ25DO2FBQ0Y7aUJBQU07Z0JBQ0wsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQTthQUNwQjtTQUNGO0lBQ0gsQ0FBQyxDQUFDLENBQUE7SUFDRixPQUFPLE1BQU0sQ0FBQTtBQUNmLENBQUM7QUFNRCxNQUFNLFVBQVUscUNBQXFDLENBQUMsTUFBNkI7SUFDakYsSUFBTSxhQUFhLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFBO0lBRXBELE9BQU8sSUFBSSxjQUFjLENBQUM7UUFDbEIsSUFBSSxZQUFDLFVBQVU7Ozs7O2dDQUNOLFdBQU0sYUFBYSxDQUFDLElBQUksRUFBRSxFQUFBOzs0QkFBakMsSUFBSSxHQUFHLFNBQTBCOzRCQUV2QyxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUU7Z0NBQ2IsVUFBVSxDQUFDLEtBQUssRUFBRSxDQUFBOzZCQUNuQjtpQ0FBTTtnQ0FDTCxVQUFVLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQTs2QkFDL0I7Ozs7O1NBQ0Y7S0FDRixDQUFDLENBQUE7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdXRpbHMgfSBmcm9tICdAY2xvdWRiYXNlL3V0aWxpdGllcydcbmltcG9ydCB7IFJlYWRhYmxlU3RyZWFtIH0gZnJvbSAnd2ViLXN0cmVhbXMtcG9seWZpbGwnXG5pbXBvcnQgeyBFUlJPUiwgY2hlY2tDdXN0b21Vc2VySWRSZWdleCB9IGZyb20gJy4vY29uc3RhbnRzJ1xuaW1wb3J0IHsgbG9va3VwQXBwSWQgfSBmcm9tICcuL21ldGFkYXRhJ1xuXG4vKiog5LuOIEBjbG91ZGJhc2UvdXRpbGl0aWVzIOS4reaPkOWPlueahOihqOWNleWSjOafpeivouWtl+espuS4suW3peWFtyAqL1xuZXhwb3J0IGNvbnN0IHsgaXNGb3JtRGF0YSwgdG9RdWVyeVN0cmluZyB9ID0gdXRpbHMgYXMge1xuICBpc0Zvcm1EYXRhOiAob2JqOiB1bmtub3duKSA9PiBib29sZWFuXG4gIHRvUXVlcnlTdHJpbmc6IChkYXRhOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSA9PiBzdHJpbmdcbn1cblxuLyoqXG4gKiDot6jnq6/lronlhajojrflj5bnjq/looPlj5jph49cbiAqIFdlYiDnq6/jgIHlsI/muLjmiI/nq6/nrYnmsqHmnIkgcHJvY2VzcyDlhajlsYDlr7nosaHvvIznm7TmjqXorr/pl64gcHJvY2Vzcy5lbnYg5Lya5oql6ZSZXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRFbnYoKTogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPlxuZXhwb3J0IGZ1bmN0aW9uIGdldEVudihrZXk6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZFxuZXhwb3J0IGZ1bmN0aW9uIGdldEVudihrZXk/OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQgfCBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgaWYgKHR5cGVvZiBwcm9jZXNzID09PSAndW5kZWZpbmVkJyB8fCAhcHJvY2Vzcy5lbnYpIHtcbiAgICByZXR1cm4ga2V5ICE9PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiB7fVxuICB9XG4gIHJldHVybiBrZXkgIT09IHVuZGVmaW5lZCA/IHByb2Nlc3MuZW52W2tleV0gOiBwcm9jZXNzLmVudlxufVxuXG4vKiog5Yik5pat5b2T5YmN5piv5ZCm5ZyoIFNDRu+8iOS6keWHveaVsO+8iei/kOihjOeOr+Wig+S4rSAqL1xuZXhwb3J0IGNvbnN0IGNoZWNrSXNJblNjZiA9ICgpID0+IGdldEVudignVEVOQ0VOVENMT1VEX1JVTkVOVicpID09PSAnU0NGJ1xuXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tJc0luQ0JSKCkge1xuICAvLyBDQlIgPSBDTE9VREJBU0VfUlVOXG4gIHJldHVybiAhIWdldEVudignQ0JSX0VOVl9JRCcpXG59XG5cbmNvbnN0IGtTdW1lcnVFbnZTZXQgPSBuZXcgU2V0KFsnZm9ybWFsJywgJ3ByZScsICd0ZXN0J10pXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tJc0luU3VtZXJ1KCkge1xuICAvLyBTVU1FUlVfRU5WPWZvcm1hbCB8IHRlc3QgfCBwcmVcbiAgcmV0dXJuIGtTdW1lcnVFbnZTZXQuaGFzKGdldEVudignU1VNRVJVX0VOVicpIHx8ICcnKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNOb25FbXB0eVN0cmluZyhzdHI6IHN0cmluZykge1xuICByZXR1cm4gdHlwZW9mIHN0ciA9PT0gJ3N0cmluZycgJiYgc3RyICE9PSAnJ1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY2hlY2tJc0luVGVuY2VudENsb3VkKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBpZiAoZ2V0RW52KCdURU5DRU5UQ0xPVUQnKSA9PT0gJ3RydWUnKSB7XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuICByZXR1cm4gaXNOb25FbXB0eVN0cmluZyhhd2FpdCBsb29rdXBBcHBJZCgpKVxufVxuXG5leHBvcnQgY29uc3QgZ2V0Q3VyclJ1bkVudlRhZyA9IGFzeW5jICgpOiBQcm9taXNlPHN0cmluZz4gPT4ge1xuICBpZiAoY2hlY2tJc0luU2NmKCkpIHtcbiAgICByZXR1cm4gJ3NjZidcbiAgfSBpZiAoY2hlY2tJc0luQ0JSKCkpIHtcbiAgICByZXR1cm4gJ2NicidcbiAgfSBpZiAoY2hlY2tJc0luU3VtZXJ1KCkpIHtcbiAgICByZXR1cm4gJ3N1bWVydSdcbiAgfSBpZiAoYXdhaXQgY2hlY2tJc0luVGVuY2VudENsb3VkKCkpIHtcbiAgICByZXR1cm4gJ3RlbmNlbnRjbG91ZCdcbiAgfVxuICByZXR1cm4gJ3Vua25vd24nXG59XG5cbi8qKlxuICog5qCh6aqM6Ieq5a6a5LmJ55So5oi3IElEIOagvOW8j1xuICogQHRocm93cyDmoLzlvI/kuI3lkIjms5Xml7bmipvlh7ogSU5WQUxJRF9QQVJBTSDplJnor69cbiAqL1xuZXhwb3J0IGNvbnN0IHZhbGlkYXRlVWlkID0gKHVpZDogc3RyaW5nKTogdm9pZCA9PiB7XG4gIGlmICh0eXBlb2YgdWlkICE9PSAnc3RyaW5nJykge1xuICAgIHRocm93IHsgLi4uRVJST1IuSU5WQUxJRF9QQVJBTSwgbWVzc2FnZTogJ3VpZCBtdXN0IGJlIGEgc3RyaW5nJyB9XG4gIH1cbiAgaWYgKCFjaGVja0N1c3RvbVVzZXJJZFJlZ2V4LnRlc3QodWlkKSkge1xuICAgIHRocm93IHsgLi4uRVJST1IuSU5WQUxJRF9QQVJBTSwgbWVzc2FnZTogYEludmFsaWQgdWlkOiBcIiR7dWlkfVwiYCB9XG4gIH1cbn1cblxuLyoqXG4gKiDlronlhajnmoQgSlNPTiDop6PmnpDvvIzop6PmnpDlpLHotKXml7bov5Tlm57ljp/lp4vmlofmnKzogIzpnZ7mipvlvILluLhcbiAqIEBwYXJhbSB0ZXh0IC0g5b6F6Kej5p6Q55qE5a2X56ym5LiyXG4gKiBAcmV0dXJucyDop6PmnpDlkI7nmoTlr7nosaHvvIznqbrlrZfnrKbkuLLov5Tlm54gbnVsbO+8jOino+aekOWksei0pei/lOWbnuWOn+Wni+aWh+acrFxuICovXG5leHBvcnQgZnVuY3Rpb24gc2FmZVBhcnNlSnNvbih0ZXh0OiBzdHJpbmcpOiBhbnkge1xuICBpZiAoIXRleHQgfHwgIXRleHQudHJpbSgpKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuICB0cnkge1xuICAgIHJldHVybiBKU09OLnBhcnNlKHRleHQpXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBjb25zb2xlLndhcm4oJ2NhdGNoIGFuIGVycm9yJywgeyBlLCB0ZXh0IH0pXG4gICAgcmV0dXJuIHRleHRcbiAgfVxufVxuXG4vKipcbiAqIOWwhuWvueixoeeahOaJgOacieWAvOi9rOS4uuWtl+espuS4suexu+Wei1xuICog55So5LqO5bCGIGhlYWRlcnMg562J5a+56LGh57uf5LiA5Li6IFJlY29yZDxzdHJpbmcsIHN0cmluZz5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9iajJTdHJSZWNvcmQob2JqOiBvYmplY3QpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKG9iaikucmVkdWNlPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+KChhY2MsIGN1cjogW3N0cmluZywgdW5rbm93bl0pID0+IHtcbiAgICBjb25zdCBba2V5LCB2YWx1ZV0gPSBjdXJcbiAgICBhY2Nba2V5XSA9IFN0cmluZyh2YWx1ZSlcbiAgICByZXR1cm4gYWNjXG4gIH0sIHt9KVxufVxuXG4vKipcbiAqIOWwhiBIZWFkZXJzSW5pdCDovazkuLrlj6/ntKLlvJXnmoTmma7pgJrlr7nosaFcbiAqIOWFvOWuuSBIZWFkZXJzIOWunuS+i+WSjOaZrumAmuWvueixoeS4pOenjeW9ouW8j1xuICovXG5leHBvcnQgZnVuY3Rpb24gaGVhZGVyc0luaXQySW5kZXhhYmxlKGg6IEhlYWRlcnNJbml0KSB7XG4gIGlmIChpc0hlYWRlcnMoaCkpIHtcbiAgICBjb25zdCByZXQ6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fVxuICAgIGguZm9yRWFjaCgodmFsLCBrZXkpID0+IHtcbiAgICAgIHJldFtrZXldID0gdmFsXG4gICAgfSlcbiAgICByZXR1cm4gcmV0XG4gIH1cbiAgcmV0dXJuIGhcblxuICBmdW5jdGlvbiBpc0hlYWRlcnMoaDogSGVhZGVyc0luaXQpOiBoIGlzIEhlYWRlcnMge1xuICAgIHRyeSB7XG4gICAgICAvLyBOb2RlIOS9jueJiOacrOWPr+iDveayoeacieWFqOWxgCBIZWFkZXJzXG4gICAgICByZXR1cm4gaCBpbnN0YW5jZW9mIEhlYWRlcnNcbiAgICB9IGNhdGNoIChfKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiDmiYvliqjop6PmnpDmn6Xor6LlrZfnrKbkuLLvvIzpgb/lhY0gVVJMU2VhcmNoUGFyYW1zIOeahOWFvOWuueaAp+mXrumimFxuICog5pSv5oyB6YeN5aSNIGtleSDoh6rliqjovazkuLrmlbDnu4RcbiAqIEBwYXJhbSBzZWFyY2ggLSDmn6Xor6LlrZfnrKbkuLLvvIzlj6/luKbliY3lr7wgPyDmiJYgI1xuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VRdWVyeVN0cmluZyhzZWFyY2g6IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHN0cmluZ1tdPiB7XG4gIGNvbnN0IHBhcmFtczogYW55ID0ge31cbiAgY29uc3QgY2xlYW5TZWFyY2ggPSBzZWFyY2gucmVwbGFjZSgvXls/I10vLCAnJylcblxuICBpZiAoIWNsZWFuU2VhcmNoKSB7XG4gICAgcmV0dXJuIHBhcmFtc1xuICB9XG5cbiAgY29uc3QgcGFpcnMgPSBjbGVhblNlYXJjaC5zcGxpdCgnJicpXG5cbiAgcGFpcnMuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgIGxldCBba2V5LCB2YWx1ZV0gPSBpdGVtLnNwbGl0KCc9JylcbiAgICBrZXkgPSBkZWNvZGVVUklDb21wb25lbnQoa2V5KVxuICAgIHZhbHVlID0gZGVjb2RlVVJJQ29tcG9uZW50KHZhbHVlIHx8ICcnKVxuICAgIGlmIChrZXkpIHtcbiAgICAgIGlmIChwYXJhbXNba2V5XSkge1xuICAgICAgICAvLyDlt7LlrZjlnKjlkIzlkI0ga2V577yM6L2s5Li65pWw57uEXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHBhcmFtc1trZXldKSkge1xuICAgICAgICAgIHBhcmFtc1trZXldLnB1c2godmFsdWUpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGFyYW1zW2tleV0gPSBbcGFyYW1zW2tleV0sIHZhbHVlXVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwYXJhbXNba2V5XSA9IHZhbHVlXG4gICAgICB9XG4gICAgfVxuICB9KVxuICByZXR1cm4gcGFyYW1zXG59XG5cbi8qKlxuICog5bCGIE5vZGUgUmVhZGFibGVTdHJlYW0g6L2s5o2i5Li6IFdlYiBSZWFkYWJsZVN0cmVhbSAocG9seWZpbGwpXG4gKiDnlKjkuo4gZmV0Y2gg5rWB5byP5ZON5bqU5ZyoIE5vZGUg546v5aKD5LiL55qE6YCC6YWNXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVXZWJTdHJlYW1Gcm9tTm9kZVJlYWRhYmxlU3RyZWFtKHN0cmVhbTogTm9kZUpTLlJlYWRhYmxlU3RyZWFtKTogUmVhZGFibGVTdHJlYW0ge1xuICBjb25zdCBhc3luY0l0ZXJhdG9yID0gc3RyZWFtW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpXG5cbiAgcmV0dXJuIG5ldyBSZWFkYWJsZVN0cmVhbSh7XG4gICAgYXN5bmMgcHVsbChjb250cm9sbGVyKSB7XG4gICAgICBjb25zdCBuZXh0ID0gYXdhaXQgYXN5bmNJdGVyYXRvci5uZXh0KClcblxuICAgICAgaWYgKG5leHQuZG9uZSkge1xuICAgICAgICBjb250cm9sbGVyLmNsb3NlKClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZShuZXh0LnZhbHVlKVxuICAgICAgfVxuICAgIH0sXG4gIH0pXG59XG4iXX0=