anylang
Version:
A translator's kit that uses the free APIs of Google Translate, Yandex, Bing, ChatGPT, and other LLMs
167 lines (165 loc) • 24.3 kB
JavaScript
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());
});
};
import { z } from 'zod';
import { LanguageAliases } from '../../languages/LanguageAliases';
import { BaseTranslator } from '../BaseTranslator';
const ResponseScheme = z
.object({
translations: z
.object({
text: z.string(),
})
.array(),
})
.array()
.or(z.object({
error: z.object({
code: z.number(),
message: z.string(),
}),
}));
// eslint-disable
// prettier-ignore
const supportedLanguagesMap = new LanguageAliases([
"ace", "af", "sq", "am", "ar", "arz", "ary", "arb", "hy", "as",
"ast", "az", "ban", "bn", "ba", "eu", "bbc", "be", "bho", "bik",
"brx", "bs", "bg", "yue", "ca", "ceb", "hne", "lzh", "zh-Hans",
"zh-Hant", "co", "hr", "cs", "da", "prs", "dv", "doi", "nl", "en",
"en-GB", "epo", "et", "fo", "fj", "fil", "fi", "fr", "fr-CA", "fy",
"fur", "gl", "lug", "ka", "de", "el", "gu", "ht", "ha", "he", "hil",
"hi", "mww", "hu", "iba", "is", "ig", "ilo", "id", "ikt", "iu", "iu-Latn",
"ga", "it", "jam", "ja", "jav", "kea", "kn", "pam", "ks", "kk", "km",
"rw", "tlh-Latn", "gom", "ko", "kri", "ku", "kmr", "ky", "lo", "la", "lv",
"lij", "lim", "ln", "lt", "lmo", "dsb", "lb", "mk", "mai", "mg", "ms",
"ml", "mt", "mr", "mwr", "mfe", "min", "mn-Cyrl", "mn-Mong", "my", "mi",
"ne", "nb", "nno", "nya", "oc", "or", "pap", "ps", "fa", "pl", "pt",
"pt-PT", "pa", "pnb", "otq", "ro", "run", "ru", "sm", "sa", "srd",
"sr-Cyrl", "sr-Latn", "st", "nso", "tn", "crs", "sn", "scn", "sd", "si",
"sk", "sl", "so", "es", "su", "sw", "sv", "ty", "tgk", "ta", "tt", "te",
"tet", "th", "bo", "ti", "tpi", "to", "tr", "tk", "uk", "hsb", "ur", "ug",
"uz", "vec", "vi", "war", "cy", "xh", "ydd", "yo", "yua", "zu"
]);
// eslint-enable
export class MicrosoftTranslator extends BaseTranslator {
constructor() {
super(...arguments);
this.token = null;
}
static getSupportedLanguages() {
return supportedLanguagesMap.getAll();
}
getLengthLimit() {
return 50000;
}
getRequestsTimeout() {
return 300;
}
checkLimitExceeding(text) {
if (Array.isArray(text)) {
const arrayLen = text.reduce((acc, text) => acc + text.length, 0);
const extra = arrayLen - this.getLengthLimit();
return extra > 0 ? extra : 0;
}
else {
const extra = text.length - this.getLengthLimit();
return extra > 0 ? extra : 0;
}
}
translate(text, from, to) {
return __awaiter(this, void 0, void 0, function* () {
return this.translateBatch([text], from, to).then((resp) => resp[0]);
});
}
translateBatch(text, from, to) {
return __awaiter(this, void 0, void 0, function* () {
const sourceLanguage = from === 'auto' ? 'auto' : supportedLanguagesMap.get(from);
const targetLanguage = supportedLanguagesMap.get(to);
if (!sourceLanguage)
throw new TypeError(`Unsupported source language ${from}`);
if (!targetLanguage)
throw new TypeError(`Unsupported source language ${to}`);
const token = yield this.getToken();
const url = 'https://api-edge.cognitive.microsofttranslator.com/translate?' +
// Omit `from` parameter for auto detection of language
(sourceLanguage !== 'auto'
? `from=${encodeURIComponent(sourceLanguage)}&`
: '') +
`to=${encodeURIComponent(targetLanguage)}&api-version=3.0&includeSentenceLength=true`;
return this.fetch(url, {
responseType: 'json',
method: 'POST',
headers: {
accept: '*/*',
'accept-language': 'zh-TW,zh;q=0.9,ja;q=0.8,zh-CN;q=0.7,en-US;q=0.6,en;q=0.5',
authorization: `Bearer ${token}`,
'cache-control': 'no-cache',
'content-type': 'application/json',
pragma: 'no-cache',
priority: 'u=1, i',
'referrer-policy': 'strict-origin-when-cross-origin',
'sec-fetch-dest': 'empty',
'sec-fetch-mode': 'cors',
'sec-fetch-site': 'none',
'sec-fetch-storage-access': 'active',
},
body: JSON.stringify(text.map((text) => ({ Text: text }))),
}).then((rawResult) => {
const result = ResponseScheme.parse(rawResult.data);
if ('error' in result) {
throw new Error(`Code ${result.error.code}: ${result.error.message}`);
}
// Transform translations array
return result.map((translationItem) =>
// Build translation for single text
translationItem.translations
.map((translationSegment) => translationSegment.text)
.join(' '));
});
});
}
getToken() {
return __awaiter(this, void 0, void 0, function* () {
var _a;
// Wait resolution if pending
if (this.token instanceof Promise)
return this.token;
// Fetch new token
const tokenLifetime = (_a = this.options.tokenLifetime) !== null && _a !== void 0 ? _a : 30000;
if (!this.token || Date.now() - this.token.issuedAt > tokenLifetime) {
this.token = this.fetch('https://edge.microsoft.com/translate/auth', {
responseType: 'text',
method: 'GET',
headers: {
accept: '*/*',
'accept-language': 'zh-TW,zh;q=0.9,ja;q=0.8,zh-CN;q=0.7,en-US;q=0.6,en;q=0.5',
'cache-control': 'no-cache',
pragma: 'no-cache',
priority: 'u=1, i',
'referrer-policy': 'strict-origin-when-cross-origin',
'sec-fetch-dest': 'empty',
'sec-fetch-mode': 'cors',
'sec-fetch-site': 'none',
'sec-fetch-storage-access': 'active',
},
body: null,
}).then(({ data: token }) => {
this.token = { value: token, issuedAt: Date.now() };
return token;
});
return yield this.token;
}
// Use cached value
return this.token.value;
});
}
}
MicrosoftTranslator.translatorName = 'MicrosoftTranslator';
MicrosoftTranslator.isSupportedAutoFrom = () => true;
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRyYW5zbGF0b3JzL01pY3Jvc29mdFRyYW5zbGF0b3IvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUEsT0FBTyxFQUFFLENBQUMsRUFBRSxNQUFNLEtBQUssQ0FBQztBQUV4QixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFFbEUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRW5ELE1BQU0sY0FBYyxHQUFHLENBQUM7S0FDdEIsTUFBTSxDQUFDO0lBQ1AsWUFBWSxFQUFFLENBQUM7U0FDYixNQUFNLENBQUM7UUFDUCxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRTtLQUNoQixDQUFDO1NBQ0QsS0FBSyxFQUFFO0NBQ1QsQ0FBQztLQUNELEtBQUssRUFBRTtLQUNQLEVBQUUsQ0FDRixDQUFDLENBQUMsTUFBTSxDQUFDO0lBQ1IsS0FBSyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUM7UUFDZixJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRTtRQUNoQixPQUFPLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRTtLQUNuQixDQUFDO0NBQ0YsQ0FBQyxDQUNGLENBQUM7QUFFSCxpQkFBaUI7QUFDakIsa0JBQWtCO0FBQ2xCLE1BQU0scUJBQXFCLEdBQUcsSUFBSSxlQUFlLENBQUM7SUFDakQsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSTtJQUM5RCxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLO0lBQy9ELEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsU0FBUztJQUM5RCxTQUFTLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJO0lBQ2pFLE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLElBQUk7SUFDbEUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUs7SUFDbkUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLFNBQVM7SUFDekUsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUk7SUFDcEUsSUFBSSxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUk7SUFDekUsS0FBSyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUk7SUFDckUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsSUFBSTtJQUN2RSxJQUFJLEVBQUUsSUFBSSxFQUFF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QUNiLE9BQU8sRUFBRTt3QkFDUixNQUFNLEVBQUUsS0FBSzt3QkFDYixpQkFBaUIsRUFDaEIsMERBQTBEO3dCQUMzRCxlQUFlLEVBQUUsVUFBVTt3QkFDM0IsTUFBTSxFQUFFLFVBQVU7d0JBQ2xCLFFBQVEsRUFBRSxRQUFRO3dCQUNsQixpQkFBaUIsRUFBRSxpQ0FBaUM7d0JBQ3BELGdCQUFnQixFQUFFLE9BQU87d0JBQ3pCLGdCQUFnQixFQUFFLE1BQU07d0JBQ3hCLGdCQUFnQixFQUFFLE1BQU07d0JBQ3hCLDBCQUEwQixFQUFFLFFBQVE7cUJBQ3BDO29CQUNELElBQUksRUFBRSxJQUFJO2lCQUNWLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFO29CQUMzQixJQUFJLENBQUMsS0FBSyxHQUFHLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUM7b0JBQ3BELE9BQU8sS0FBSyxDQUFDO2dCQUNkLENBQUMsQ0FBQyxDQUFDO2dCQUVILE9BQU8sTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDO1lBQ3pCLENBQUM7WUFFRCxtQkFBbUI7WUFDbkIsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQztRQUN6QixDQUFDO0tBQUE7O0FBL0hzQixrQ0FBYyxHQUFHLHFCQUFILEFBQXdCLENBQUM7QUFFaEQsdUNBQW1CLEdBQUcsR0FBRyxFQUFFLENBQUMsSUFBVCxBQUFhLENBQUMiLCJmaWxlIjoidHJhbnNsYXRvcnMvTWljcm9zb2Z0VHJhbnNsYXRvci9pbmRleC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHogfSBmcm9tICd6b2QnO1xuXG5pbXBvcnQgeyBMYW5ndWFnZUFsaWFzZXMgfSBmcm9tICcuLi8uLi9sYW5ndWFnZXMvTGFuZ3VhZ2VBbGlhc2VzJztcblxuaW1wb3J0IHsgQmFzZVRyYW5zbGF0b3IgfSBmcm9tICcuLi9CYXNlVHJhbnNsYXRvcic7XG5cbmNvbnN0IFJlc3BvbnNlU2NoZW1lID0gelxuXHQub2JqZWN0KHtcblx0XHR0cmFuc2xhdGlvbnM6IHpcblx0XHRcdC5vYmplY3Qoe1xuXHRcdFx0XHR0ZXh0OiB6LnN0cmluZygpLFxuXHRcdFx0fSlcblx0XHRcdC5hcnJheSgpLFxuXHR9KVxuXHQuYXJyYXkoKVxuXHQub3IoXG5cdFx0ei5vYmplY3Qoe1xuXHRcdFx0ZXJyb3I6IHoub2JqZWN0KHtcblx0XHRcdFx0Y29kZTogei5udW1iZXIoKSxcblx0XHRcdFx0bWVzc2FnZTogei5zdHJpbmcoKSxcblx0XHRcdH0pLFxuXHRcdH0pLFxuXHQpO1xuXG4vLyBlc2xpbnQtZGlzYWJsZVxuLy8gcHJldHRpZXItaWdub3JlXG5jb25zdCBzdXBwb3J0ZWRMYW5ndWFnZXNNYXAgPSBuZXcgTGFuZ3VhZ2VBbGlhc2VzKFtcblx0XCJhY2VcIiwgXCJhZlwiLCBcInNxXCIsIFwiYW1cIiwgXCJhclwiLCBcImFyelwiLCBcImFyeVwiLCBcImFyYlwiLCBcImh5XCIsIFwiYXNcIixcblx0XCJhc3RcIiwgXCJhelwiLCBcImJhblwiLCBcImJuXCIsIFwiYmFcIiwgXCJldVwiLCBcImJiY1wiLCBcImJlXCIsIFwiYmhvXCIsIFwiYmlrXCIsXG5cdFwiYnJ4XCIsIFwiYnNcIiwgXCJiZ1wiLCBcInl1ZVwiLCBcImNhXCIsIFwiY2ViXCIsIFwiaG5lXCIsIFwibHpoXCIsIFwiemgtSGFuc1wiLFxuXHRcInpoLUhhbnRcIiwgXCJjb1wiLCBcImhyXCIsIFwiY3NcIiwgXCJkYVwiLCBcInByc1wiLCBcImR2XCIsIFwiZG9pXCIsIFwibmxcIiwgXCJlblwiLFxuXHRcImVuLUdCXCIsIFwiZXBvXCIsIFwiZXRcIiwgXCJmb1wiLCBcImZqXCIsIFwiZmlsXCIsIFwiZmlcIiwgXCJmclwiLCBcImZyLUNBXCIsIFwiZnlcIixcblx0XCJmdXJcIiwgXCJnbFwiLCBcImx1Z1wiLCBcImthXCIsIFwiZGVcIiwgXCJlbFwiLCBcImd1XCIsIFwiaHRcIiwgXCJoYVwiLCBcImhlXCIsIFwiaGlsXCIsXG5cdFwiaGlcIiwgXCJtd3dcIiwgXCJodVwiLCBcImliYVwiLCBcImlzXCIsIFwiaWdcIiwgXCJpbG9cIiwgXCJpZFwiLCBcImlrdFwiLCBcIml1XCIsIFwiaXUtTGF0blwiLFxuXHRcImdhXCIsIFwiaXRcIiwgXCJqYW1cIiwgXCJqYVwiLCBcImphdlwiLCBcImtlYVwiLCBcImtuXCIsIFwicGFtXCIsIFwia3NcIiwgXCJra1wiLCBcImttXCIsXG5cdFwicndcIiwgXCJ0bGgtTGF0blwiLCBcImdvbVwiLCBcImtvXCIsIFwia3JpXCIsIFwia3VcIiwgXCJrbXJcIiwgXCJreVwiLCBcImxvXCIsIFwibGFcIiwgXCJsdlwiLFxuXHRcImxpalwiLCBcImxpbVwiLCBcImxuXCIsIFwibHRcIiwgXCJsbW9cIiwgXCJkc2JcIiwgXCJsYlwiLCBcIm1rXCIsIFwibWFpXCIsIFwibWdcIiwgXCJtc1wiLFxuXHRcIm1sXCIsIFwibXRcIiwgXCJtclwiLCBcIm13clwiLCBcIm1mZVwiLCBcIm1pblwiLCBcIm1uLUN5cmxcIiwgXCJtbi1Nb25nXCIsIFwibXlcIiwgXCJtaVwiLFxuXHRcIm5lXCIsIFwibmJcIiwgXCJubm9cIiwgXCJueWFcIiwgXCJvY1wiLCBcIm9yXCIsIFwicGFwXCIsIFwicHNcIiwgXCJmYVwiLCBcInBsXCIsIFwicHRcIixcblx0XCJwdC1QVFwiLCBcInBhXCIsIFwicG5iXCIsIFwib3RxXCIsIFwicm9cIiwgXCJydW5cIiwgXCJydVwiLCBcInNtXCIsIFwic2FcIiwgXCJzcmRcIixcblx0XCJzci1DeXJsXCIsIFwic3ItTGF0blwiLCBcInN0XCIsIFwibnNvXCIsIFwidG5cIiwgXCJjcnNcIiwgXCJzblwiLCBcInNjblwiLCBcInNkXCIsIFwic2lcIixcblx0XCJza1wiLCBcInNsXCIsIFwic29cIiwgXCJlc1wiLCBcInN1XCIsIFwic3dcIiwgXCJzdlwiLCBcInR5XCIsIFwidGdrXCIsIFwidGFcIiwgXCJ0dFwiLCBcInRlXCIsXG5cdFwidGV0XCIsIFwidGhcIiwgXCJib1wiLCBcInRpXCIsIFwidHBpXCIsIFwidG9cIiwgXCJ0clwiLCBcInRrXCIsIFwidWtcIiwgXCJoc2JcIiwgXCJ1clwiLCBcInVnXCIsXG5cdFwidXpcIiwgXCJ2ZWNcIiwgXCJ2aVwiLCBcIndhclwiLCBcImN5XCIsIFwieGhcIiwgXCJ5ZGRcIiwgXCJ5b1wiLCBcInl1YVwiLCBcInp1XCJcbl0pO1xuLy8gZXNsaW50LWVuYWJsZVxuXG5leHBvcnQgY2xhc3MgTWljcm9zb2Z0VHJhbnNsYXRvciBleHRlbmRzIEJhc2VUcmFuc2xhdG9yPHsgdG9rZW5MaWZldGltZT86IG51bWJlciB9PiB7XG5cdHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgdHJhbnNsYXRvck5hbWUgPSAnTWljcm9zb2Z0VHJhbnNsYXRvcic7XG5cblx0cHVibGljIHN0YXRpYyBpc1N1cHBvcnRlZEF1dG9Gcm9tID0gKCkgPT4gdHJ1ZTtcblxuXHRwdWJsaWMgc3RhdGljIGdldFN1cHBvcnRlZExhbmd1YWdlcygpOiBzdHJpbmdbXSB7XG5cdFx0cmV0dXJuIHN1cHBvcnRlZExhbmd1YWdlc01hcC5nZXRBbGwoKTtcblx0fVxuXG5cdHB1YmxpYyBnZXRMZW5ndGhMaW1pdCgpIHtcblx0XHRyZXR1cm4gNTBfMDAwO1xuXHR9XG5cblx0cHVibGljIGdldFJlcXVlc3RzVGltZW91dCgpIHtcblx0XHRyZXR1cm4gMzAwO1xuXHR9XG5cblx0cHVibGljIGNoZWNrTGltaXRFeGNlZWRpbmcodGV4dDogc3RyaW5nIHwgc3RyaW5nW10pIHtcblx0XHRpZiAoQXJyYXkuaXNBcnJheSh0ZXh0KSkge1xuXHRcdFx0Y29uc3QgYXJyYXlMZW4gPSB0ZXh0LnJlZHVjZSgoYWNjLCB0ZXh0KSA9PiBhY2MgKyB0ZXh0Lmxlbmd0aCwgMCk7XG5cdFx0XHRjb25zdCBleHRyYSA9IGFycmF5TGVuIC0gdGhpcy5nZXRMZW5ndGhMaW1pdCgpO1xuXHRcdFx0cmV0dXJuIGV4dHJhID4gMCA/IGV4dHJhIDogMDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Y29uc3QgZXh0cmEgPSB0ZXh0Lmxlbmd0aCAtIHRoaXMuZ2V0TGVuZ3RoTGltaXQoKTtcblx0XHRcdHJldHVybiBleHRyYSA+IDAgPyBleHRyYSA6IDA7XG5cdFx0fVxuXHR9XG5cblx0cHVibGljIGFzeW5jIHRyYW5zbGF0ZSh0ZXh0OiBzdHJpbmcsIGZyb206IHN0cmluZywgdG86IHN0cmluZykge1xuXHRcdHJldHVybiB0aGlzLnRyYW5zbGF0ZUJhdGNoKFt0ZXh0XSwgZnJvbSwgdG8pLnRoZW4oKHJlc3ApID0+IHJlc3BbMF0pO1xuXHR9XG5cblx0cHVibGljIGFzeW5jIHRyYW5zbGF0ZUJhdGNoKHRleHQ6IHN0cmluZ1tdLCBmcm9tOiBzdHJpbmcsIHRvOiBzdHJpbmcpIHtcblx0XHRjb25zdCBzb3VyY2VMYW5ndWFnZSA9IGZyb20gPT09ICdhdXRvJyA/ICdhdXRvJyA6IHN1cHBvcnRlZExhbmd1YWdlc01hcC5nZXQoZnJvbSk7XG5cdFx0Y29uc3QgdGFyZ2V0TGFuZ3VhZ2UgPSBzdXBwb3J0ZWRMYW5ndWFnZXNNYXAuZ2V0KHRvKTtcblxuXHRcdGlmICghc291cmNlTGFuZ3VhZ2UpIHRocm93IG5ldyBUeXBlRXJyb3IoYFVuc3VwcG9ydGVkIHNvdXJjZSBsYW5ndWFnZSAke2Zyb219YCk7XG5cdFx0aWYgKCF0YXJnZXRMYW5ndWFnZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihgVW5zdXBwb3J0ZWQgc291cmNlIGxhbmd1YWdlICR7dG99YCk7XG5cblx0XHRjb25zdCB0b2tlbiA9IGF3YWl0IHRoaXMuZ2V0VG9rZW4oKTtcblxuXHRcdGNvbnN0IHVybCA9XG5cdFx0XHQnaHR0cHM6Ly9hcGktZWRnZS5jb2duaXRpdmUubWljcm9zb2Z0dHJhbnNsYXRvci5jb20vdHJhbnNsYXRlPycgK1xuXHRcdFx0Ly8gT21pdCBgZnJvbWAgcGFyYW1ldGVyIGZvciBhdXRvIGRldGVjdGlvbiBvZiBsYW5ndWFnZVxuXHRcdFx0KHNvdXJjZUxhbmd1YWdlICE9PSAnYXV0bydcblx0XHRcdFx0PyBgZnJvbT0ke2VuY29kZVVSSUNvbXBvbmVudChzb3VyY2VMYW5ndWFnZSl9JmBcblx0XHRcdFx0OiAnJykgK1xuXHRcdFx0YHRvPSR7ZW5jb2RlVVJJQ29tcG9uZW50KFxuXHRcdFx0XHR0YXJnZXRMYW5ndWFnZSxcblx0XHRcdCl9JmFwaS12ZXJzaW9uPTMuMCZpbmNsdWRlU2VudGVuY2VMZW5ndGg9dHJ1ZWA7XG5cblx0XHRyZXR1cm4gdGhpcy5mZXRjaCh1cmwsIHtcblx0XHRcdHJlc3BvbnNlVHlwZTogJ2pzb24nLFxuXHRcdFx0bWV0aG9kOiAnUE9TVCcsXG5cdFx0XHRoZWFkZXJzOiB7XG5cdFx0XHRcdGFjY2VwdDogJyovKicsXG5cdFx0XHRcdCdhY2NlcHQtbGFuZ3VhZ2UnOlxuXHRcdFx0XHRcdCd6aC1UVyx6aDtxPTAuOSxqYTtxPTAuOCx6aC1DTjtxPTAuNyxlbi1VUztxPTAuNixlbjtxPTAuNScsXG5cdFx0XHRcdGF1dGhvcml6YXRpb246IGBCZWFyZXIgJHt0b2tlbn1gLFxuXHRcdFx0XHQnY2FjaGUtY29udHJvbCc6ICduby1jYWNoZScsXG5cdFx0XHRcdCdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG5cdFx0XHRcdHByYWdtYTogJ25vLWNhY2hlJyxcblx0XHRcdFx0cHJpb3JpdHk6ICd1PTEsIGknLFxuXHRcdFx0XHQncmVmZXJyZXItcG9saWN5JzogJ3N0cmljdC1vcmlnaW4td2hlbi1jcm9zcy1vcmlnaW4nLFxuXHRcdFx0XHQnc2VjLWZldGNoLWRlc3QnOiAnZW1wdHknLFxuXHRcdFx0XHQnc2VjLWZldGNoLW1vZGUnOiAnY29ycycsXG5cdFx0XHRcdCdzZWMtZmV0Y2gtc2l0ZSc6ICdub25lJyxcblx0XHRcdFx0J3NlYy1mZXRjaC1zdG9yYWdlLWFjY2Vzcyc6ICdhY3RpdmUnLFxuXHRcdFx0fSxcblx0XHRcdGJvZHk6IEpTT04uc3RyaW5naWZ5KHRleHQubWFwKCh0ZXh0KSA9PiAoeyBUZXh0OiB0ZXh0IH0pKSksXG5cdFx0fSkudGhlbigocmF3UmVzdWx0KSA9PiB7XG5cdFx0XHRjb25zdCByZXN1bHQgPSBSZXNwb25zZVNjaGVtZS5wYXJzZShyYXdSZXN1bHQuZGF0YSk7XG5cblx0XHRcdGlmICgnZXJyb3InIGluIHJlc3VsdCkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoYENvZGUgJHtyZXN1bHQuZXJyb3IuY29kZX06ICR7cmVzdWx0LmVycm9yLm1lc3NhZ2V9YCk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFRyYW5zZm9ybSB0cmFuc2xhdGlvbnMgYXJyYXlcblx0XHRcdHJldHVybiByZXN1bHQubWFwKCh0cmFuc2xhdGlvbkl0ZW0pID0+XG5cdFx0XHRcdC8vIEJ1aWxkIHRyYW5zbGF0aW9uIGZvciBzaW5nbGUgdGV4dFxuXHRcdFx0XHR0cmFuc2xhdGlvbkl0ZW0udHJhbnNsYXRpb25zXG5cdFx0XHRcdFx0Lm1hcCgodHJhbnNsYXRpb25TZWdtZW50KSA9PiB0cmFuc2xhdGlvblNlZ21lbnQudGV4dClcblx0XHRcdFx0XHQuam9pbignICcpLFxuXHRcdFx0KTtcblx0XHR9KTtcblx0fVxuXG5cdHByb3RlY3RlZCB0b2tlbjpcblx0XHR8IHtcblx0XHRcdFx0dmFsdWU6IHN0cmluZztcblx0XHRcdFx0aXNzdWVkQXQ6IG51bWJlcjtcblx0XHQgIH1cblx0XHR8IFByb21pc2U8c3RyaW5nPlxuXHRcdHwgbnVsbCA9IG51bGw7XG5cdHByb3RlY3RlZCBhc3luYyBnZXRUb2tlbigpIHtcblx0XHQvLyBXYWl0IHJlc29sdXRpb24gaWYgcGVuZGluZ1xuXHRcdGlmICh0aGlzLnRva2VuIGluc3RhbmNlb2YgUHJvbWlzZSkgcmV0dXJuIHRoaXMudG9rZW47XG5cblx0XHQvLyBGZXRjaCBuZXcgdG9rZW5cblx0XHRjb25zdCB0b2tlbkxpZmV0aW1lID0gdGhpcy5vcHRpb25zLnRva2VuTGlmZXRpbWUgPz8gMzBfMDAwO1xuXHRcdGlmICghdGhpcy50b2tlbiB8fCBEYXRlLm5vdygpIC0gdGhpcy50b2tlbi5pc3N1ZWRBdCA+IHRva2VuTGlmZXRpbWUpIHtcblx0XHRcdHRoaXMudG9rZW4gPSB0aGlzLmZldGNoKCdodHRwczovL2VkZ2UubWljcm9zb2Z0LmNvbS90cmFuc2xhdGUvYXV0aCcsIHtcblx0XHRcdFx0cmVzcG9uc2VUeXBlOiAndGV4dCcsXG5cdFx0XHRcdG1ldGhvZDogJ0dFVCcsXG5cdFx0XHRcdGhlYWRlcnM6IHtcblx0XHRcdFx0XHRhY2NlcHQ6ICcqLyonLFxuXHRcdFx0XHRcdCdhY2NlcHQtbGFuZ3VhZ2UnOlxuXHRcdFx0XHRcdFx0J3poLVRXLHpoO3E9MC45LGphO3E9MC44LHpoLUNOO3E9MC43LGVuLVVTO3E9MC42LGVuO3E9MC41Jyxcblx0XHRcdFx0XHQnY2FjaGUtY29udHJvbCc6ICduby1jYWNoZScsXG5cdFx0XHRcdFx0cHJhZ21hOiAnbm8tY2FjaGUnLFxuXHRcdFx0XHRcdHByaW9yaXR5OiAndT0xLCBpJyxcblx0XHRcdFx0XHQncmVmZXJyZXItcG9saWN5JzogJ3N0cmljdC1vcmlnaW4td2hlbi1jcm9zcy1vcmlnaW4nLFxuXHRcdFx0XHRcdCdzZWMtZmV0Y2gtZGVzdCc6ICdlbXB0eScsXG5cdFx0XHRcdFx0J3NlYy1mZXRjaC1tb2RlJzogJ2NvcnMnLFxuXHRcdFx0XHRcdCdzZWMtZmV0Y2gtc2l0ZSc6ICdub25lJyxcblx0XHRcdFx0XHQnc2VjLWZldGNoLXN0b3JhZ2UtYWNjZXNzJzogJ2FjdGl2ZScsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdGJvZHk6IG51bGwsXG5cdFx0XHR9KS50aGVuKCh7IGRhdGE6IHRva2VuIH0pID0+IHtcblx0XHRcdFx0dGhpcy50b2tlbiA9IHsgdmFsdWU6IHRva2VuLCBpc3N1ZWRBdDogRGF0ZS5ub3coKSB9O1xuXHRcdFx0XHRyZXR1cm4gdG9rZW47XG5cdFx0XHR9KTtcblxuXHRcdFx0cmV0dXJuIGF3YWl0IHRoaXMudG9rZW47XG5cdFx0fVxuXG5cdFx0Ly8gVXNlIGNhY2hlZCB2YWx1ZVxuXHRcdHJldHVybiB0aGlzLnRva2VuLnZhbHVlO1xuXHR9XG59XG4iXX0=