From 9ef09a4407a46c1b35e766af8dced15a68523912 Mon Sep 17 00:00:00 2001 From: xconverge Date: Mon, 7 Oct 2019 18:12:36 -0700 Subject: [PATCH 1/6] Simplify dependencies --- extension.ts | 3 +++ package-lock.json | 5 ----- package.json | 1 - src/globals.ts | 2 ++ src/util/util.ts | 9 ++------- 5 files changed, 7 insertions(+), 13 deletions(-) diff --git a/extension.ts b/extension.ts index 71a3923425c..12e818372a0 100644 --- a/extension.ts +++ b/extension.ts @@ -98,6 +98,9 @@ export async function activate(context: vscode.ExtensionContext) { extensionContext = context; extensionContext.subscriptions.push(StatusBar); + // Set the storage path to be used by history files + Globals.extensionStoragePath = context.globalStoragePath; + if (vscode.window.activeTextEditor) { const filepathComponents = vscode.window.activeTextEditor.document.fileName.split(/\\|\//); Register.putByKey(filepathComponents[filepathComponents.length - 1], '%', undefined, true); diff --git a/package-lock.json b/package-lock.json index 2f557fa1cb9..e72b5bae803 100644 --- a/package-lock.json +++ b/package-lock.json @@ -452,11 +452,6 @@ "normalize-path": "^2.1.1" } }, - "appdirectory": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/appdirectory/-/appdirectory-0.1.0.tgz", - "integrity": "sha1-62yBYyDnsqsW9e2ZfyjYIF31Y3U=" - }, "append-buffer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/append-buffer/-/append-buffer-1.0.2.tgz", diff --git a/package.json b/package.json index d5c57ceb47c..c25f7068a7c 100644 --- a/package.json +++ b/package.json @@ -848,7 +848,6 @@ "postinstall": "node ./node_modules/vscode/bin/install" }, "dependencies": { - "appdirectory": "0.1.0", "diff-match-patch": "1.0.4", "lodash.escaperegexp": "4.1.2", "mkdirp": "0.5.1", diff --git a/src/globals.ts b/src/globals.ts index 7c03a638167..1bb74c23a5d 100644 --- a/src/globals.ts +++ b/src/globals.ts @@ -10,4 +10,6 @@ export class Globals { static mockModeHandler: ModeHandler; static mockConfiguration: IConfiguration; + + static extensionStoragePath: string; } diff --git a/src/util/util.ts b/src/util/util.ts index 9da0842ef1c..69b12a85b03 100644 --- a/src/util/util.ts +++ b/src/util/util.ts @@ -1,9 +1,9 @@ import * as vscode from 'vscode'; -import AppDirectory = require('appdirectory'); import { Logger } from './logger'; import { Position } from '../common/motion/position'; import { Range } from '../common/motion/range'; import { exec } from 'child_process'; +import { Globals } from '../globals'; /** * This is certainly quite janky! The problem we're trying to solve @@ -39,12 +39,7 @@ export async function getCursorsAfterSync(timeoutInMilliseconds: number = 0): Pr } export function getExtensionDirPath(): string { - const logger = Logger.get('getExtensionDirPath'); - const dirs = new AppDirectory('VSCodeVim'); - - logger.debug('VSCodeVim Cache Directory: ' + dirs.userCache()); - - return dirs.userCache(); + return Globals.extensionStoragePath; } /** From 08e4ad56b5ae5767d866300281be5d86ce4a6f7c Mon Sep 17 00:00:00 2001 From: xconverge Date: Tue, 8 Oct 2019 18:11:12 -0700 Subject: [PATCH 2/6] Cleanup --- src/history/historyFile.ts | 24 +++++++++++------------- src/state/globalState.ts | 1 - src/util/util.ts | 5 ----- test/cmd_line/historyFile.test.ts | 5 +++-- 4 files changed, 14 insertions(+), 21 deletions(-) diff --git a/src/history/historyFile.ts b/src/history/historyFile.ts index 31bad299e12..bd15f39e669 100644 --- a/src/history/historyFile.ts +++ b/src/history/historyFile.ts @@ -2,24 +2,22 @@ import * as fs from 'fs'; import * as path from 'path'; import { Logger } from '../util/logger'; import { configuration } from '../configuration/configuration'; -import { getExtensionDirPath } from '../util/util'; import { promisify } from 'util'; +import { Globals } from './../globals'; const mkdirp = require('mkdirp'); export class HistoryFile { private readonly _logger = Logger.get('HistoryFile'); private _historyFileName: string; - private _historyDir: string; private _history: string[] = []; public get historyFilePath(): string { - return path.join(this._historyDir, this._historyFileName); + return path.join(Globals.extensionStoragePath, this._historyFileName); } - constructor(historyFileName: string, historyDir?: string) { + constructor(historyFileName: string) { this._historyFileName = historyFileName; - this._historyDir = historyDir ? historyDir : getExtensionDirPath(); } public async add(value: string | undefined): Promise { @@ -69,9 +67,9 @@ export class HistoryFile { data = await promisify(fs.readFile)(this.historyFilePath, 'utf-8'); } catch (err) { if (err.code === 'ENOENT') { - this._logger.debug(`History does not exist. path=${this._historyDir}`); + this._logger.debug(`History does not exist. path=${this.historyFilePath}`); } else { - this._logger.warn(`Failed to load history. path=${this._historyDir} err=${err}.`); + this._logger.warn(`Failed to load history. path=${this.historyFilePath} err=${err}.`); } return; } @@ -87,7 +85,7 @@ export class HistoryFile { } this._history = parsedData; } catch (e) { - this._logger.warn(`Deleting corrupted history file. path=${this._historyDir} err=${e}.`); + this._logger.warn(`Deleting corrupted history file. path=${this.historyFilePath} err=${e}.`); this.clear(); } } @@ -95,7 +93,7 @@ export class HistoryFile { private async save(): Promise { try { // create supplied directory. if directory already exists, do nothing. - await promisify(mkdirp)(this._historyDir, 0o775); + await promisify(mkdirp)(Globals.extensionStoragePath, 0o775); // create file await promisify(fs.writeFile)(this.historyFilePath, JSON.stringify(this._history), 'utf-8'); } catch (err) { @@ -106,13 +104,13 @@ export class HistoryFile { } export class SearchHistory extends HistoryFile { - constructor(historyFileDir?: string) { - super('.search_history', historyFileDir); + constructor() { + super('.search_history'); } } export class CommandLineHistory extends HistoryFile { - constructor(historyFileDir?: string) { - super('.cmdline_history', historyFileDir); + constructor() { + super('.cmdline_history'); } } diff --git a/src/state/globalState.ts b/src/state/globalState.ts index 7cdaa1efd43..9f5b4158234 100644 --- a/src/state/globalState.ts +++ b/src/state/globalState.ts @@ -7,7 +7,6 @@ import { SearchHistory } from '../history/historyFile'; import { SearchState, SearchDirection } from './searchState'; import { SubstituteState } from './substituteState'; import { configuration } from '../configuration/configuration'; -import { VimState } from './vimState'; /** * State which stores global state (across editors) diff --git a/src/util/util.ts b/src/util/util.ts index 69b12a85b03..01bf05f81b4 100644 --- a/src/util/util.ts +++ b/src/util/util.ts @@ -3,7 +3,6 @@ import { Logger } from './logger'; import { Position } from '../common/motion/position'; import { Range } from '../common/motion/range'; import { exec } from 'child_process'; -import { Globals } from '../globals'; /** * This is certainly quite janky! The problem we're trying to solve @@ -38,10 +37,6 @@ export async function getCursorsAfterSync(timeoutInMilliseconds: number = 0): Pr ); } -export function getExtensionDirPath(): string { - return Globals.extensionStoragePath; -} - /** * This function execute a shell command and return the standard output as string. */ diff --git a/test/cmd_line/historyFile.test.ts b/test/cmd_line/historyFile.test.ts index ca6c05f4d41..c0f18151f4d 100644 --- a/test/cmd_line/historyFile.test.ts +++ b/test/cmd_line/historyFile.test.ts @@ -4,11 +4,11 @@ import * as os from 'os'; import { HistoryFile } from '../../src/history/historyFile'; import { assertEqual, setupWorkspace, cleanUpWorkspace, rndName } from '../testUtils'; import { configuration } from '../../src/configuration/configuration'; +import { Globals } from '../../src/globals'; suite('HistoryFile', () => { let history: HistoryFile; let run_cmds: string[]; - const tmpDir = os.tmpdir(); const assertArrayEquals = (expected: any[], actual: any[]) => { assertEqual(expected.length, actual.length); @@ -25,7 +25,8 @@ suite('HistoryFile', () => { run_cmds.push(i.toString()); } - history = new HistoryFile(rndName(), tmpDir); + Globals.extensionStoragePath = os.tmpdir(); + history = new HistoryFile(rndName()); await history.load(); }); From 41e630021a9938d1cee14e8a085a883e28975d3c Mon Sep 17 00:00:00 2001 From: xconverge Date: Wed, 9 Oct 2019 17:04:27 -0700 Subject: [PATCH 3/6] Remove mkdirp dependency --- package-lock.json | 15 --------------- package.json | 1 - src/history/historyFile.ts | 13 +++++++++---- 3 files changed, 9 insertions(+), 20 deletions(-) diff --git a/package-lock.json b/package-lock.json index e72b5bae803..58c301b4eb5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4739,21 +4739,6 @@ } } }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "requires": { - "minimist": "0.0.8" - }, - "dependencies": { - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" - } - } - }, "mocha": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/mocha/-/mocha-6.2.1.tgz", diff --git a/package.json b/package.json index c25f7068a7c..fe4e3eb9972 100644 --- a/package.json +++ b/package.json @@ -850,7 +850,6 @@ "dependencies": { "diff-match-patch": "1.0.4", "lodash.escaperegexp": "4.1.2", - "mkdirp": "0.5.1", "neovim": "4.5.0", "untildify": "4.0.0", "winston": "3.2.1", diff --git a/src/history/historyFile.ts b/src/history/historyFile.ts index bd15f39e669..3977b19ff28 100644 --- a/src/history/historyFile.ts +++ b/src/history/historyFile.ts @@ -5,8 +5,6 @@ import { configuration } from '../configuration/configuration'; import { promisify } from 'util'; import { Globals } from './../globals'; -const mkdirp = require('mkdirp'); - export class HistoryFile { private readonly _logger = Logger.get('HistoryFile'); private _historyFileName: string; @@ -92,8 +90,15 @@ export class HistoryFile { private async save(): Promise { try { - // create supplied directory. if directory already exists, do nothing. - await promisify(mkdirp)(Globals.extensionStoragePath, 0o775); + // create supplied directory. if directory already exists, do nothing and move on + try { + await promisify(fs.mkdir)(Globals.extensionStoragePath, { recursive: true }); + } catch (createDirectoryErr) { + if (createDirectoryErr.code !== 'EEXIST') { + throw createDirectoryErr; + } + } + // create file await promisify(fs.writeFile)(this.historyFilePath, JSON.stringify(this._history), 'utf-8'); } catch (err) { From 29350c029ad168d24bb3a139a721fca273285c90 Mon Sep 17 00:00:00 2001 From: xconverge Date: Wed, 9 Oct 2019 19:24:08 -0700 Subject: [PATCH 4/6] Revert package-lock change --- package-lock.json | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/package-lock.json b/package-lock.json index 58c301b4eb5..2f557fa1cb9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -452,6 +452,11 @@ "normalize-path": "^2.1.1" } }, + "appdirectory": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/appdirectory/-/appdirectory-0.1.0.tgz", + "integrity": "sha1-62yBYyDnsqsW9e2ZfyjYIF31Y3U=" + }, "append-buffer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/append-buffer/-/append-buffer-1.0.2.tgz", @@ -4739,6 +4744,21 @@ } } }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "requires": { + "minimist": "0.0.8" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + } + } + }, "mocha": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/mocha/-/mocha-6.2.1.tgz", From 14a7a834c838656c529ce9bfc54c0e3c4d69043f Mon Sep 17 00:00:00 2001 From: xconverge Date: Wed, 9 Oct 2019 19:25:22 -0700 Subject: [PATCH 5/6] Remove appdirectory dependency from package-lock --- package-lock.json | 56 ++++++++++++++--------------------------------- 1 file changed, 17 insertions(+), 39 deletions(-) diff --git a/package-lock.json b/package-lock.json index 2f557fa1cb9..b3c3a2298e9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -452,11 +452,6 @@ "normalize-path": "^2.1.1" } }, - "appdirectory": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/appdirectory/-/appdirectory-0.1.0.tgz", - "integrity": "sha1-62yBYyDnsqsW9e2ZfyjYIF31Y3U=" - }, "append-buffer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/append-buffer/-/append-buffer-1.0.2.tgz", @@ -1892,7 +1887,7 @@ }, "enabled": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/enabled/-/enabled-1.0.2.tgz", + "resolved": "http://registry.npmjs.org/enabled/-/enabled-1.0.2.tgz", "integrity": "sha1-ll9lE9LC0cX0ZStkouM5ZGf8L5M=", "requires": { "env-variable": "0.0.x" @@ -2289,7 +2284,7 @@ }, "fecha": { "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fecha/-/fecha-2.3.3.tgz", + "resolved": "http://registry.npmjs.org/fecha/-/fecha-2.3.3.tgz", "integrity": "sha512-lUGBnIamTAwk4znq5BcqsDaxSmZ9nDVJaij6NvRt/Tg4R69gERA+otPKbS86ROw9nxVMw2/mp1fnaiWqbs6Sdg==" }, "figgy-pudding": { @@ -2636,8 +2631,7 @@ "ansi-regex": { "version": "2.1.1", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "aproba": { "version": "1.2.0", @@ -2658,14 +2652,12 @@ "balanced-match": { "version": "1.0.0", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "brace-expansion": { "version": "1.1.11", "bundled": true, "dev": true, - "optional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -2680,20 +2672,17 @@ "code-point-at": { "version": "1.1.0", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "concat-map": { "version": "0.0.1", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "console-control-strings": { "version": "1.1.0", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "core-util-is": { "version": "1.0.2", @@ -2810,8 +2799,7 @@ "inherits": { "version": "2.0.3", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "ini": { "version": "1.3.5", @@ -2823,7 +2811,6 @@ "version": "1.0.0", "bundled": true, "dev": true, - "optional": true, "requires": { "number-is-nan": "^1.0.0" } @@ -2838,7 +2825,6 @@ "version": "3.0.4", "bundled": true, "dev": true, - "optional": true, "requires": { "brace-expansion": "^1.1.7" } @@ -2846,14 +2832,12 @@ "minimist": { "version": "0.0.8", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "minipass": { "version": "2.3.5", "bundled": true, "dev": true, - "optional": true, "requires": { "safe-buffer": "^5.1.2", "yallist": "^3.0.0" @@ -2872,7 +2856,6 @@ "version": "0.5.1", "bundled": true, "dev": true, - "optional": true, "requires": { "minimist": "0.0.8" } @@ -2953,8 +2936,7 @@ "number-is-nan": { "version": "1.0.1", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "object-assign": { "version": "4.1.1", @@ -2966,7 +2948,6 @@ "version": "1.4.0", "bundled": true, "dev": true, - "optional": true, "requires": { "wrappy": "1" } @@ -3052,8 +3033,7 @@ "safe-buffer": { "version": "5.1.2", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "safer-buffer": { "version": "2.1.2", @@ -3089,7 +3069,6 @@ "version": "1.0.2", "bundled": true, "dev": true, - "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -3109,7 +3088,6 @@ "version": "3.0.1", "bundled": true, "dev": true, - "optional": true, "requires": { "ansi-regex": "^2.0.0" } @@ -3153,14 +3131,12 @@ "wrappy": { "version": "1.0.2", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "yallist": { "version": "3.0.3", "bundled": true, - "dev": true, - "optional": true + "dev": true } } }, @@ -4746,8 +4722,9 @@ }, "mkdirp": { "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, "requires": { "minimist": "0.0.8" }, @@ -4755,7 +4732,8 @@ "minimist": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true } } }, From 018c9be18d875cf248fb54a14bb767c9e67962ef Mon Sep 17 00:00:00 2001 From: xconverge Date: Wed, 9 Oct 2019 19:26:28 -0700 Subject: [PATCH 6/6] Only change appdirectory portion of packagelock --- package-lock.json | 51 +++++++++++++++++++++++++++++++---------------- 1 file changed, 34 insertions(+), 17 deletions(-) diff --git a/package-lock.json b/package-lock.json index b3c3a2298e9..e72b5bae803 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1887,7 +1887,7 @@ }, "enabled": { "version": "1.0.2", - "resolved": "http://registry.npmjs.org/enabled/-/enabled-1.0.2.tgz", + "resolved": "https://registry.npmjs.org/enabled/-/enabled-1.0.2.tgz", "integrity": "sha1-ll9lE9LC0cX0ZStkouM5ZGf8L5M=", "requires": { "env-variable": "0.0.x" @@ -2284,7 +2284,7 @@ }, "fecha": { "version": "2.3.3", - "resolved": "http://registry.npmjs.org/fecha/-/fecha-2.3.3.tgz", + "resolved": "https://registry.npmjs.org/fecha/-/fecha-2.3.3.tgz", "integrity": "sha512-lUGBnIamTAwk4znq5BcqsDaxSmZ9nDVJaij6NvRt/Tg4R69gERA+otPKbS86ROw9nxVMw2/mp1fnaiWqbs6Sdg==" }, "figgy-pudding": { @@ -2631,7 +2631,8 @@ "ansi-regex": { "version": "2.1.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "aproba": { "version": "1.2.0", @@ -2652,12 +2653,14 @@ "balanced-match": { "version": "1.0.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "brace-expansion": { "version": "1.1.11", "bundled": true, "dev": true, + "optional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -2672,17 +2675,20 @@ "code-point-at": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "concat-map": { "version": "0.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "console-control-strings": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "core-util-is": { "version": "1.0.2", @@ -2799,7 +2805,8 @@ "inherits": { "version": "2.0.3", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "ini": { "version": "1.3.5", @@ -2811,6 +2818,7 @@ "version": "1.0.0", "bundled": true, "dev": true, + "optional": true, "requires": { "number-is-nan": "^1.0.0" } @@ -2825,6 +2833,7 @@ "version": "3.0.4", "bundled": true, "dev": true, + "optional": true, "requires": { "brace-expansion": "^1.1.7" } @@ -2832,12 +2841,14 @@ "minimist": { "version": "0.0.8", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "minipass": { "version": "2.3.5", "bundled": true, "dev": true, + "optional": true, "requires": { "safe-buffer": "^5.1.2", "yallist": "^3.0.0" @@ -2856,6 +2867,7 @@ "version": "0.5.1", "bundled": true, "dev": true, + "optional": true, "requires": { "minimist": "0.0.8" } @@ -2936,7 +2948,8 @@ "number-is-nan": { "version": "1.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "object-assign": { "version": "4.1.1", @@ -2948,6 +2961,7 @@ "version": "1.4.0", "bundled": true, "dev": true, + "optional": true, "requires": { "wrappy": "1" } @@ -3033,7 +3047,8 @@ "safe-buffer": { "version": "5.1.2", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "safer-buffer": { "version": "2.1.2", @@ -3069,6 +3084,7 @@ "version": "1.0.2", "bundled": true, "dev": true, + "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -3088,6 +3104,7 @@ "version": "3.0.1", "bundled": true, "dev": true, + "optional": true, "requires": { "ansi-regex": "^2.0.0" } @@ -3131,12 +3148,14 @@ "wrappy": { "version": "1.0.2", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "yallist": { "version": "3.0.3", "bundled": true, - "dev": true + "dev": true, + "optional": true } } }, @@ -4722,9 +4741,8 @@ }, "mkdirp": { "version": "0.5.1", - "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, "requires": { "minimist": "0.0.8" }, @@ -4732,8 +4750,7 @@ "minimist": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" } } },