UNPKG

12.6 kBJavaScriptView Raw
1"use strict";
2var __importDefault = (this && this.__importDefault) || function (mod) {
3 return (mod && mod.__esModule) ? mod : { "default": mod };
4};
5Object.defineProperty(exports, "__esModule", { value: true });
6const istanbul_lib_coverage_1 = __importDefault(require("istanbul-lib-coverage"));
7const istanbulize_1 = require("istanbulize");
8const node_script_url_1 = require("node-script-url");
9const url_1 = __importDefault(require("url"));
10const get_text_1 = require("./get-text");
11const istanbul_merge_1 = require("./istanbul-merge");
12const merge_1 = require("./merge");
13const source_map_1 = require("./source-map");
14const builder_1 = require("./source-map/builder");
15const source_store_1 = require("./source-map/source-store");
16async function processCovsToIstanbul(processCovs, getText = get_text_1.getText, unwrapCjs = true) {
17 const merged = merge_1.mergeRichProcessCovs(processCovs);
18 const processCov = unwrapCjs ? normalizeProcessCov(merged) : merged;
19 return toIstanbul(processCov, getText);
20}
21exports.processCovsToIstanbul = processCovsToIstanbul;
22/**
23 * Convert to an istanbul coverage map (applying source maps).
24 *
25 * @param processCov Process coverage to convert.
26 * @param getText Function used to load text from URLs (used to load source maps).
27 */
28async function toIstanbul(processCov, getText = get_text_1.getText) {
29 const rawCoverageMap = toRawIstanbul(processCov);
30 const generatedCovMap = Object.create(null);
31 const originalBuilder = new builder_1.CoverageMapBuilder();
32 const sourceStore = new source_store_1.MemorySourceStore();
33 for (const scriptCov of processCov.result) {
34 const rawFileCov = rawCoverageMap[scriptCov.url];
35 let useOriginal = false;
36 if (scriptCov.sourceMapUrl !== undefined && node_script_url_1.parseSys(scriptCov.url).isFileUrl) {
37 const sourceMapString = await getText(new url_1.default.URL(scriptCov.sourceMapUrl));
38 const rawSourceMap = JSON.parse(sourceMapString);
39 useOriginal = await source_map_1.addFromGeneratedFileCov(originalBuilder, sourceStore, rawFileCov, rawSourceMap, scriptCov.sourceMapUrl);
40 }
41 if (!useOriginal) {
42 sourceStore.set(scriptCov.url, scriptCov.sourceText);
43 generatedCovMap[scriptCov.url] = rawFileCov;
44 }
45 }
46 const coverageMap = istanbul_merge_1.mergeCovMaps([generatedCovMap, originalBuilder.build()]);
47 return {
48 coverageMap: istanbul_lib_coverage_1.default.createCoverageMap(coverageMap),
49 sources: new Map(sourceStore),
50 };
51}
52function normalizeProcessCov(processCov) {
53 return Object.assign({}, processCov, { result: processCov.result.map(normalizeScriptCov) });
54}
55exports.normalizeProcessCov = normalizeProcessCov;
56function normalizeScriptCov(scriptCov) {
57 const sourceType = scriptCov.sourceType;
58 if (sourceType !== istanbulize_1.SourceType.Script) {
59 return scriptCov;
60 }
61 const sourceText = istanbulize_1.unwrapSourceText(scriptCov.sourceText);
62 const { functions } = istanbulize_1.unwrapScriptCov(scriptCov);
63 return Object.assign({}, scriptCov, { functions, sourceText });
64}
65exports.normalizeScriptCov = normalizeScriptCov;
66/**
67 * Convert to an istanbul coverage map, without applying source maps.
68 *
69 * @param processCov Process coverage to convert.
70 */
71function toRawIstanbul(processCov) {
72 const coverageMap = Object.create(null);
73 for (const scriptCov of processCov.result) {
74 const generatedFileCov = istanbulize_1.istanbulize({
75 sourceType: scriptCov.sourceType,
76 sourceText: scriptCov.sourceText,
77 scriptCov,
78 });
79 coverageMap[scriptCov.url] = istanbul_lib_coverage_1.default.createFileCoverage(generatedFileCov);
80 }
81 return coverageMap;
82}
83exports.toRawIstanbul = toRawIstanbul;
84
85//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIl9zcmMvdG8taXN0YW5idWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxrRkFBZ0Q7QUFDaEQsNkNBQXlGO0FBQ3pGLHFEQUFpRTtBQUVqRSw4Q0FBeUI7QUFDekIseUNBQWdFO0FBQ2hFLHFEQUFnRDtBQUNoRCxtQ0FBK0M7QUFDL0MsNkNBQXVEO0FBQ3ZELGtEQUEwRDtBQUMxRCw0REFBa0Y7QUFRM0UsS0FBSyxnQ0FDVixXQUEwQyxFQUMxQyxVQUFtQixrQkFBYyxFQUNqQyxZQUFxQixJQUFJO0lBRXpCLE1BQU0sTUFBTSxHQUFtQiw0QkFBb0IsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNqRSxNQUFNLFVBQVUsR0FBbUIsU0FBUyxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQ3BGLE9BQU8sVUFBVSxDQUFDLFVBQVUsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUN6QyxDQUFDO0FBUkQsc0RBUUM7QUFFRDs7Ozs7R0FLRztBQUNILEtBQUsscUJBQ0gsVUFBMEIsRUFDMUIsVUFBbUIsa0JBQWM7SUFFakMsTUFBTSxjQUFjLEdBQWdDLGFBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUU5RSxNQUFNLGVBQWUsR0FBZ0MsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN6RSxNQUFNLGVBQWUsR0FBdUIsSUFBSSw0QkFBa0IsRUFBRSxDQUFDO0lBQ3JFLE1BQU0sV0FBVyxHQUFzQixJQUFJLGdDQUFpQixFQUFFLENBQUM7SUFFL0QsS0FBSyxNQUFNLFNBQVMsSUFBSSxVQUFVLENBQUMsTUFBTSxFQUFFO1FBQ3pDLE1BQU0sVUFBVSxHQUE2QixjQUFjLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzNFLElBQUksV0FBVyxHQUFZLEtBQUssQ0FBQztRQUNqQyxJQUFJLFNBQVMsQ0FBQyxZQUFZLEtBQUssU0FBUyxJQUFJLDBCQUFrQixDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLEVBQUU7WUFDdkYsTUFBTSxlQUFlLEdBQVcsTUFBTSxPQUFPLENBQUMsSUFBSSxhQUFNLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDO1lBQ3RGLE1BQU0sWUFBWSxHQUEyQixJQUFJLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBQ3pFLFdBQVcsR0FBRyxNQUFNLG9DQUF1QixDQUN6QyxlQUFlLEVBQ2YsV0FBVyxFQUNYLFVBQVUsRUFDVixZQUFZLEVBQ1osU0FBUyxDQUFDLFlBQVksQ0FDdkIsQ0FBQztTQUNIO1FBRUQsSUFBSSxDQUFDLFdBQVcsRUFBRTtZQUNoQixXQUFXLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ3JELGVBQWUsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEdBQUcsVUFBVSxDQUFDO1NBQzdDO0tBQ0Y7SUFFRCxNQUFNLFdBQVcsR0FBZ0MsNkJBQVksQ0FBQyxDQUFDLGVBQWUsRUFBRSxlQUFlLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBRTFHLE9BQU87UUFDTCxXQUFXLEVBQUUsK0JBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxXQUFXLENBQUM7UUFDdkQsT0FBTyxFQUFFLElBQUksR0FBRyxDQUFDLFdBQVcsQ0FBQztLQUM5QixDQUFDO0FBQ0osQ0FBQztBQUVELDZCQUFvQyxVQUEwQjtJQUM1RCx5QkFBVyxVQUFVLElBQUUsTUFBTSxFQUFFLFVBQVUsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLGtCQUFrQixDQUFDLElBQUU7QUFDNUUsQ0FBQztBQUZELGtEQUVDO0FBRUQsNEJBQW1DLFNBQXdCO0lBQ3pELE1BQU0sVUFBVSxHQUFlLFNBQVMsQ0FBQyxVQUFVLENBQUM7SUFDcEQsSUFBSSxVQUFVLEtBQUssd0JBQVUsQ0FBQyxNQUFNLEVBQUU7UUFDcEMsT0FBTyxTQUFTLENBQUM7S0FDbEI7SUFDRCxNQUFNLFVBQVUsR0FBVyw4QkFBZ0IsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDbEUsTUFBTSxFQUFDLFNBQVMsRUFBQyxHQUFHLDZCQUFlLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDL0MseUJBQVcsU0FBUyxJQUFFLFNBQVMsRUFBRSxVQUFVLElBQUU7QUFDL0MsQ0FBQztBQVJELGdEQVFDO0FBRUQ7Ozs7R0FJRztBQUNILHVCQUE4QixVQUEwQjtJQUN0RCxNQUFNLFdBQVcsR0FBZ0MsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUVyRSxLQUFLLE1BQU0sU0FBUyxJQUFJLFVBQVUsQ0FBQyxNQUFNLEVBQUU7UUFDekMsTUFBTSxnQkFBZ0IsR0FBaUMseUJBQVcsQ0FBQztZQUNqRSxVQUFVLEVBQUUsU0FBUyxDQUFDLFVBQVU7WUFDaEMsVUFBVSxFQUFFLFNBQVMsQ0FBQyxVQUFVO1lBQ2hDLFNBQVM7U0FDVixDQUFDLENBQUM7UUFDSCxXQUFXLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxHQUFHLCtCQUFXLENBQUMsa0JBQWtCLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztLQUMvRTtJQUVELE9BQU8sV0FBVyxDQUFDO0FBQ3JCLENBQUM7QUFiRCxzQ0FhQyIsImZpbGUiOiJ0by1pc3RhbmJ1bC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBsaWJDb3ZlcmFnZSBmcm9tIFwiaXN0YW5idWwtbGliLWNvdmVyYWdlXCI7XG5pbXBvcnQgeyBpc3RhbmJ1bGl6ZSwgU291cmNlVHlwZSwgdW53cmFwU2NyaXB0Q292LCB1bndyYXBTb3VyY2VUZXh0IH0gZnJvbSBcImlzdGFuYnVsaXplXCI7XG5pbXBvcnQgeyBwYXJzZVN5cyBhcyBwYXJzZU5vZGVTY3JpcHRVcmwgfSBmcm9tIFwibm9kZS1zY3JpcHQtdXJsXCI7XG5pbXBvcnQgc291cmNlTWFwIGZyb20gXCJzb3VyY2UtbWFwXCI7XG5pbXBvcnQgdXJsTW9kIGZyb20gXCJ1cmxcIjtcbmltcG9ydCB7IEdldFRleHQsIGdldFRleHQgYXMgZGVmYXVsdEdldFRleHQgfSBmcm9tIFwiLi9nZXQtdGV4dFwiO1xuaW1wb3J0IHsgbWVyZ2VDb3ZNYXBzIH0gZnJvbSBcIi4vaXN0YW5idWwtbWVyZ2VcIjtcbmltcG9ydCB7IG1lcmdlUmljaFByb2Nlc3NDb3ZzIH0gZnJvbSBcIi4vbWVyZ2VcIjtcbmltcG9ydCB7IGFkZEZyb21HZW5lcmF0ZWRGaWxlQ292IH0gZnJvbSBcIi4vc291cmNlLW1hcFwiO1xuaW1wb3J0IHsgQ292ZXJhZ2VNYXBCdWlsZGVyIH0gZnJvbSBcIi4vc291cmNlLW1hcC9idWlsZGVyXCI7XG5pbXBvcnQgeyBNZW1vcnlTb3VyY2VTdG9yZSwgTnVsbGFibGVTb3VyY2VUZXh0IH0gZnJvbSBcIi4vc291cmNlLW1hcC9zb3VyY2Utc3RvcmVcIjtcbmltcG9ydCB7IFJpY2hQcm9jZXNzQ292LCBSaWNoU2NyaXB0Q292IH0gZnJvbSBcIi4vc3Bhd24taW5zcGVjdGVkXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmljaElzdGFuYnVsQ292ZXJhZ2VNYXAge1xuICBjb3ZlcmFnZU1hcDogbGliQ292ZXJhZ2UuQ292ZXJhZ2VNYXA7XG4gIHNvdXJjZXM6IE1hcDxzdHJpbmcsIE51bGxhYmxlU291cmNlVGV4dD47XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwcm9jZXNzQ292c1RvSXN0YW5idWwoXG4gIHByb2Nlc3NDb3ZzOiBSZWFkb25seUFycmF5PFJpY2hQcm9jZXNzQ292PixcbiAgZ2V0VGV4dDogR2V0VGV4dCA9IGRlZmF1bHRHZXRUZXh0LFxuICB1bndyYXBDanM6IGJvb2xlYW4gPSB0cnVlLFxuKTogUHJvbWlzZTxSaWNoSXN0YW5idWxDb3ZlcmFnZU1hcD4ge1xuICBjb25zdCBtZXJnZWQ6IFJpY2hQcm9jZXNzQ292ID0gbWVyZ2VSaWNoUHJvY2Vzc0NvdnMocHJvY2Vzc0NvdnMpO1xuICBjb25zdCBwcm9jZXNzQ292OiBSaWNoUHJvY2Vzc0NvdiA9IHVud3JhcENqcyA/IG5vcm1hbGl6ZVByb2Nlc3NDb3YobWVyZ2VkKSA6IG1lcmdlZDtcbiAgcmV0dXJuIHRvSXN0YW5idWwocHJvY2Vzc0NvdiwgZ2V0VGV4dCk7XG59XG5cbi8qKlxuICogQ29udmVydCB0byBhbiBpc3RhbmJ1bCBjb3ZlcmFnZSBtYXAgKGFwcGx5aW5nIHNvdXJjZSBtYXBzKS5cbiAqXG4gKiBAcGFyYW0gcHJvY2Vzc0NvdiBQcm9jZXNzIGNvdmVyYWdlIHRvIGNvbnZlcnQuXG4gKiBAcGFyYW0gZ2V0VGV4dCBGdW5jdGlvbiB1c2VkIHRvIGxvYWQgdGV4dCBmcm9tIFVSTHMgKHVzZWQgdG8gbG9hZCBzb3VyY2UgbWFwcykuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHRvSXN0YW5idWwoXG4gIHByb2Nlc3NDb3Y6IFJpY2hQcm9jZXNzQ292LFxuICBnZXRUZXh0OiBHZXRUZXh0ID0gZGVmYXVsdEdldFRleHQsXG4pOiBQcm9taXNlPFJpY2hJc3RhbmJ1bENvdmVyYWdlTWFwPiB7XG4gIGNvbnN0IHJhd0NvdmVyYWdlTWFwOiBsaWJDb3ZlcmFnZS5Db3ZlcmFnZU1hcERhdGEgPSB0b1Jhd0lzdGFuYnVsKHByb2Nlc3NDb3YpO1xuXG4gIGNvbnN0IGdlbmVyYXRlZENvdk1hcDogbGliQ292ZXJhZ2UuQ292ZXJhZ2VNYXBEYXRhID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgY29uc3Qgb3JpZ2luYWxCdWlsZGVyOiBDb3ZlcmFnZU1hcEJ1aWxkZXIgPSBuZXcgQ292ZXJhZ2VNYXBCdWlsZGVyKCk7XG4gIGNvbnN0IHNvdXJjZVN0b3JlOiBNZW1vcnlTb3VyY2VTdG9yZSA9IG5ldyBNZW1vcnlTb3VyY2VTdG9yZSgpO1xuXG4gIGZvciAoY29uc3Qgc2NyaXB0Q292IG9mIHByb2Nlc3NDb3YucmVzdWx0KSB7XG4gICAgY29uc3QgcmF3RmlsZUNvdjogbGliQ292ZXJhZ2UuRmlsZUNvdmVyYWdlID0gcmF3Q292ZXJhZ2VNYXBbc2NyaXB0Q292LnVybF07XG4gICAgbGV0IHVzZU9yaWdpbmFsOiBib29sZWFuID0gZmFsc2U7XG4gICAgaWYgKHNjcmlwdENvdi5zb3VyY2VNYXBVcmwgIT09IHVuZGVmaW5lZCAmJiBwYXJzZU5vZGVTY3JpcHRVcmwoc2NyaXB0Q292LnVybCkuaXNGaWxlVXJsKSB7XG4gICAgICBjb25zdCBzb3VyY2VNYXBTdHJpbmc6IHN0cmluZyA9IGF3YWl0IGdldFRleHQobmV3IHVybE1vZC5VUkwoc2NyaXB0Q292LnNvdXJjZU1hcFVybCkpO1xuICAgICAgY29uc3QgcmF3U291cmNlTWFwOiBzb3VyY2VNYXAuUmF3U291cmNlTWFwID0gSlNPTi5wYXJzZShzb3VyY2VNYXBTdHJpbmcpO1xuICAgICAgdXNlT3JpZ2luYWwgPSBhd2FpdCBhZGRGcm9tR2VuZXJhdGVkRmlsZUNvdihcbiAgICAgICAgb3JpZ2luYWxCdWlsZGVyLFxuICAgICAgICBzb3VyY2VTdG9yZSxcbiAgICAgICAgcmF3RmlsZUNvdixcbiAgICAgICAgcmF3U291cmNlTWFwLFxuICAgICAgICBzY3JpcHRDb3Yuc291cmNlTWFwVXJsLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoIXVzZU9yaWdpbmFsKSB7XG4gICAgICBzb3VyY2VTdG9yZS5zZXQoc2NyaXB0Q292LnVybCwgc2NyaXB0Q292LnNvdXJjZVRleHQpO1xuICAgICAgZ2VuZXJhdGVkQ292TWFwW3NjcmlwdENvdi51cmxdID0gcmF3RmlsZUNvdjtcbiAgICB9XG4gIH1cblxuICBjb25zdCBjb3ZlcmFnZU1hcDogbGliQ292ZXJhZ2UuQ292ZXJhZ2VNYXBEYXRhID0gbWVyZ2VDb3ZNYXBzKFtnZW5lcmF0ZWRDb3ZNYXAsIG9yaWdpbmFsQnVpbGRlci5idWlsZCgpXSk7XG5cbiAgcmV0dXJuIHtcbiAgICBjb3ZlcmFnZU1hcDogbGliQ292ZXJhZ2UuY3JlYXRlQ292ZXJhZ2VNYXAoY292ZXJhZ2VNYXApLFxuICAgIHNvdXJjZXM6IG5ldyBNYXAoc291cmNlU3RvcmUpLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplUHJvY2Vzc0Nvdihwcm9jZXNzQ292OiBSaWNoUHJvY2Vzc0Nvdik6IFJpY2hQcm9jZXNzQ292IHtcbiAgcmV0dXJuIHsuLi5wcm9jZXNzQ292LCByZXN1bHQ6IHByb2Nlc3NDb3YucmVzdWx0Lm1hcChub3JtYWxpemVTY3JpcHRDb3YpfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZVNjcmlwdENvdihzY3JpcHRDb3Y6IFJpY2hTY3JpcHRDb3YpOiBSaWNoU2NyaXB0Q292IHtcbiAgY29uc3Qgc291cmNlVHlwZTogU291cmNlVHlwZSA9IHNjcmlwdENvdi5zb3VyY2VUeXBlO1xuICBpZiAoc291cmNlVHlwZSAhPT0gU291cmNlVHlwZS5TY3JpcHQpIHtcbiAgICByZXR1cm4gc2NyaXB0Q292O1xuICB9XG4gIGNvbnN0IHNvdXJjZVRleHQ6IHN0cmluZyA9IHVud3JhcFNvdXJjZVRleHQoc2NyaXB0Q292LnNvdXJjZVRleHQpO1xuICBjb25zdCB7ZnVuY3Rpb25zfSA9IHVud3JhcFNjcmlwdENvdihzY3JpcHRDb3YpO1xuICByZXR1cm4gey4uLnNjcmlwdENvdiwgZnVuY3Rpb25zLCBzb3VyY2VUZXh0fTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0IHRvIGFuIGlzdGFuYnVsIGNvdmVyYWdlIG1hcCwgd2l0aG91dCBhcHBseWluZyBzb3VyY2UgbWFwcy5cbiAqXG4gKiBAcGFyYW0gcHJvY2Vzc0NvdiBQcm9jZXNzIGNvdmVyYWdlIHRvIGNvbnZlcnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b1Jhd0lzdGFuYnVsKHByb2Nlc3NDb3Y6IFJpY2hQcm9jZXNzQ292KTogbGliQ292ZXJhZ2UuQ292ZXJhZ2VNYXBEYXRhIHtcbiAgY29uc3QgY292ZXJhZ2VNYXA6IGxpYkNvdmVyYWdlLkNvdmVyYWdlTWFwRGF0YSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cbiAgZm9yIChjb25zdCBzY3JpcHRDb3Ygb2YgcHJvY2Vzc0Nvdi5yZXN1bHQpIHtcbiAgICBjb25zdCBnZW5lcmF0ZWRGaWxlQ292OiBsaWJDb3ZlcmFnZS5GaWxlQ292ZXJhZ2VEYXRhID0gaXN0YW5idWxpemUoe1xuICAgICAgc291cmNlVHlwZTogc2NyaXB0Q292LnNvdXJjZVR5cGUsXG4gICAgICBzb3VyY2VUZXh0OiBzY3JpcHRDb3Yuc291cmNlVGV4dCxcbiAgICAgIHNjcmlwdENvdixcbiAgICB9KTtcbiAgICBjb3ZlcmFnZU1hcFtzY3JpcHRDb3YudXJsXSA9IGxpYkNvdmVyYWdlLmNyZWF0ZUZpbGVDb3ZlcmFnZShnZW5lcmF0ZWRGaWxlQ292KTtcbiAgfVxuXG4gIHJldHVybiBjb3ZlcmFnZU1hcDtcbn1cbiJdLCJzb3VyY2VSb290IjoiIn0=