From f46f4982e9fb44e625d11d6fe43e58352e1781a8 Mon Sep 17 00:00:00 2001 From: Fabian Stamm Date: Mon, 24 Dec 2018 00:05:15 +0100 Subject: [PATCH] Adding compiled output to repository, till it will be published as npm package --- .gitignore | 1 - lib/index.d.ts | 62 +++++++++++++ lib/index.js | 208 ++++++++++++++++++++++++++++++++++++++++++ lib/index.js.map | 1 + lib/lock.d.ts | 12 +++ lib/lock.js | 49 ++++++++++ lib/lock.js.map | 1 + lib/observable.d.ts | 14 +++ lib/observable.js | 40 ++++++++ lib/observable.js.map | 1 + lib/test.d.ts | 1 + lib/test.js | 122 +++++++++++++++++++++++++ lib/test.js.map | 1 + 13 files changed, 512 insertions(+), 1 deletion(-) create mode 100644 lib/index.d.ts create mode 100644 lib/index.js create mode 100644 lib/index.js.map create mode 100644 lib/lock.d.ts create mode 100644 lib/lock.js create mode 100644 lib/lock.js.map create mode 100644 lib/observable.d.ts create mode 100644 lib/observable.js create mode 100644 lib/observable.js.map create mode 100644 lib/test.d.ts create mode 100644 lib/test.js create mode 100644 lib/test.js.map diff --git a/.gitignore b/.gitignore index 0d6b477..18c3786 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,3 @@ node_modules/ yarn.lock private.pem -lib/ diff --git a/lib/index.d.ts b/lib/index.d.ts new file mode 100644 index 0000000..d49a8c8 --- /dev/null +++ b/lib/index.d.ts @@ -0,0 +1,62 @@ +import Lock from "./lock"; +export interface IFileVersion { + version: string; + time: Date; + preview: string; + deleted: boolean; +} +export interface IFile { + _id: string; + type: string; + name: string; + folder: string; + deleted: boolean; + active: IFileVersion; + versions: IFileVersion[]; + user: string; + application: string; +} +export interface IHistory { + file: IFile; + history: IFileVersion[]; +} +export declare class NoConnection extends Error { + type: string; + constructor(); +} +export declare class Unauthorized extends Error { + type: string; + constructor(); +} +export declare class NoPermission extends Error { + type: string; + constructor(); +} +export declare class NotFound extends Error { + type: string; + constructor(); +} +export declare class BadRequest extends Error { + type: string; + constructor(); +} +export default class SecureFileWrapper { + private server; + private _jwtObservableServer; + jwtObservable: { + subscribe: (callback: import("./observable").ObserverCallback<((jwt: string) => void)[]>) => void; + unsubscribe: (callback: import("./observable").ObserverCallback<((jwt: string) => void)[]>) => void; + }; + jwt: string; + auth_lock: Lock; + constructor(server: string); + getJWT(): Promise; + makeRequest(endpoint: string, method: "POST" | "GET" | "PUT" | "DELETE", query: any, body?: ArrayBuffer | ArrayBufferView, second?: boolean): any; + list(folder?: string): Promise; + create(name: string, data: ArrayBuffer | ArrayBufferView, type: "text" | "binary", folder?: string, preview?: string): Promise; + get(id: string, version?: string): Promise; + update(id: string, data: ArrayBuffer | ArrayBufferView, preview?: string): Promise; + delete(id: string): Promise; + history(id: string): Promise; + restore(id: string, version: string): Promise; +} diff --git a/lib/index.js b/lib/index.js new file mode 100644 index 0000000..8755220 --- /dev/null +++ b/lib/index.js @@ -0,0 +1,208 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + 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) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const observable_1 = require("./observable"); +const lock_1 = require("./lock"); +class NoConnection extends Error { + constructor() { + super("No connection"); + this.type = "noconnection"; + } +} +exports.NoConnection = NoConnection; +class Unauthorized extends Error { + constructor() { + super("Not authorized"); + this.type = "unauthorized"; + } +} +exports.Unauthorized = Unauthorized; +class NoPermission extends Error { + constructor() { + super("No permission"); + this.type = "nopermission"; + } +} +exports.NoPermission = NoPermission; +class NotFound extends Error { + constructor() { + super("Not found"); + this.type = "notfound"; + } +} +exports.NotFound = NotFound; +class BadRequest extends Error { + constructor() { + super("Bad request"); + this.type = "badrequest"; + } +} +exports.BadRequest = BadRequest; +const fetch = require("isomorphic-fetch"); +function statusParser(res) { + if (res.status !== 200) { + switch (res.status) { + case 400: + throw new BadRequest(); + case 404: + throw new NotFound(); + case 403: + throw new NoPermission(); + case 401: + throw new Unauthorized(); + default: + throw new Error(res.statusText); + } + } +} +class SecureFileWrapper { + constructor(server) { + this.server = server; + this._jwtObservableServer = new observable_1.default(); + this.jwtObservable = this._jwtObservableServer.getPublicApi(); + this.auth_lock = new lock_1.default(); + if (this.server.endsWith("/")) { + this.server += "api/v1"; + } + else { + this.server += "/api/v1"; + } + } + getJWT() { + return __awaiter(this, void 0, void 0, function* () { + if (!this.auth_lock.locked) { + let lock = yield this.auth_lock.getLock(); + this._jwtObservableServer.send((jwt) => { + this.jwt = jwt; + lock.release(); + }); + } + yield this.auth_lock.getLock().then(lock => lock.release()); + }); + } + makeRequest(endpoint, method, query, body, second = false) { + return __awaiter(this, void 0, void 0, function* () { + if (!this.jwt || this.jwt === undefined) { + yield this.getJWT(); + } + query.jwt = this.jwt; + let query_str = "?"; + let first = true; + for (let key in query) { + if (!first) + query_str += "&"; + query_str += encodeURIComponent(key) + "=" + encodeURIComponent(query[key]); + first = false; + } + var headers = { + "pragme": "no-cache", + "cache-control": "no-cache" + }; + let body_n; + if (body) { + headers["Content-Type"] = "application/octet-stream"; + body_n = Buffer ? Buffer.from(body instanceof ArrayBuffer ? body : body.buffer) : body; + } + try { + let res = yield fetch(this.server + endpoint + query_str, { method, body: body_n, headers }); + if (res.status === 401 && !second) { + yield this.getJWT(); + return this.makeRequest(endpoint, method, query, body, true); + } + else { + statusParser(res); + return res; + } + } + catch (err) { + if (err instanceof TypeError || err.errno === "ECONNREFUSED") + throw new NoConnection(); + throw err; + } + }); + } + // async test(jwt): Promise<{ user: string, test: true }> { + // let res = await this.makeRequest("/test", "GET", {}, undefined, this.jwt_enabled); + // statusParser(res); + // return await res.json(); + // } + list(folder) { + return __awaiter(this, void 0, void 0, function* () { + let query = {}; + if (folder) + query.folder = folder; + let res = yield this.makeRequest("/files", "GET", query); + let d = yield res.json(); + return d.files; + }); + } + create(name, data, type, folder, preview) { + return __awaiter(this, void 0, void 0, function* () { + let params = { type: type, name: name }; + if (preview) { + params.preview = preview; + } + if (folder) { + params.folder = folder; + } + let res = yield this.makeRequest("/files", "POST", params, data); + return (yield res.json()).file; + }); + } + get(id, version) { + return __awaiter(this, void 0, void 0, function* () { + let res; + if (typeof version === "string") { + res = yield this.makeRequest(`/files/${id}/history/${version}`, "GET", {}); + } + else { + res = yield this.makeRequest("/files/" + id, "GET", {}); + } + if (res.arrayBuffer) { + return res.arrayBuffer(); + } + else { + let blob = yield res.buffer(); + // console.log(blob.length); + return Uint8Array.from(blob).buffer; + } + }); + } + update(id, data, preview) { + return __awaiter(this, void 0, void 0, function* () { + let put = {}; + if (preview) + put.preview = preview; + let res = yield this.makeRequest("/files/" + id, "PUT", put, data); + let json = yield res.json(); + return json.file; + }); + } + delete(id) { + return __awaiter(this, void 0, void 0, function* () { + let res = yield this.makeRequest("/files/" + id, "DELETE", {}); + return res.json(); + }); + } + history(id) { + return __awaiter(this, void 0, void 0, function* () { + let res = yield this.makeRequest(`/files/${id}/history`, "GET", {}); + statusParser(res); + return res.json(); + }); + } + restore(id, version) { + return __awaiter(this, void 0, void 0, function* () { + yield this.makeRequest(`/files/${id}/history/${version}/restore`, "PUT", {}); + }); + } +} +exports.default = SecureFileWrapper; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/lib/index.js.map b/lib/index.js.map new file mode 100644 index 0000000..bcfd97d --- /dev/null +++ b/lib/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/lib/lock.d.ts b/lib/lock.d.ts new file mode 100644 index 0000000..ac1e98d --- /dev/null +++ b/lib/lock.d.ts @@ -0,0 +1,12 @@ +export declare type Release = { + release: () => void; +}; +export default class Lock { + private _locked; + readonly locked: boolean; + private toCome; + constructor(); + getLock(): Promise; + private lock; + private release; +} diff --git a/lib/lock.js b/lib/lock.js new file mode 100644 index 0000000..19f88a8 --- /dev/null +++ b/lib/lock.js @@ -0,0 +1,49 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + 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) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +class Lock { + constructor() { + this._locked = false; + this.toCome = []; + this.release = this.release.bind(this); + } + get locked() { + return this._locked; + } + getLock() { + return __awaiter(this, void 0, void 0, function* () { + if (!this._locked) + return { release: this.lock() }; + else { + return new Promise((resolve) => { + this.toCome.push(() => { + resolve({ release: this.lock() }); + }); + }); + } + }); + } + lock() { + this._locked = true; + return this.release; + } + release() { + return __awaiter(this, void 0, void 0, function* () { + if (this.toCome.length > 0) { + this.toCome.shift()(); + } + else { + this._locked = false; + } + }); + } +} +exports.default = Lock; +//# sourceMappingURL=lock.js.map \ No newline at end of file diff --git a/lib/lock.js.map b/lib/lock.js.map new file mode 100644 index 0000000..235b5a2 --- /dev/null +++ b/lib/lock.js.map @@ -0,0 +1 @@ +{"version":3,"file":"lock.js","sourceRoot":"","sources":["../src/lock.ts"],"names":[],"mappings":";;;;;;;;;;AACA,MAAqB,IAAI;IAOtB;QANQ,YAAO,GAAY,KAAK,CAAC;QAIzB,WAAM,GAAmB,EAAE,CAAC;QAGjC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1C,CAAC;IAPD,IAAI,MAAM;QACP,OAAO,IAAI,CAAC,OAAO,CAAC;IACvB,CAAC;IAOK,OAAO;;YACV,IAAI,CAAC,IAAI,CAAC,OAAO;gBAAE,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;iBAC9C;gBACF,OAAO,IAAI,OAAO,CAAU,CAAC,OAAO,EAAE,EAAE;oBACrC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE;wBACnB,OAAO,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;oBACrC,CAAC,CAAC,CAAA;gBACL,CAAC,CAAC,CAAA;aACJ;QACJ,CAAC;KAAA;IAEO,IAAI;QACT,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,OAAO,IAAI,CAAC,OAAO,CAAC;IACvB,CAAC;IAEa,OAAO;;YAClB,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;gBACzB,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC;aACxB;iBAAM;gBACJ,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;aACvB;QACJ,CAAC;KAAA;CACH;AAlCD,uBAkCC"} \ No newline at end of file diff --git a/lib/observable.d.ts b/lib/observable.d.ts new file mode 100644 index 0000000..9c5f6b2 --- /dev/null +++ b/lib/observable.d.ts @@ -0,0 +1,14 @@ +export declare type ObserverCallback = (data: T) => void; +export default class Observable { + private collect; + private collect_intervall; + private subscriber; + private events; + private timeout; + constructor(collect?: boolean, collect_intervall?: number); + getPublicApi(): { + subscribe: (callback: ObserverCallback) => void; + unsubscribe: (callback: ObserverCallback) => void; + }; + send(data: T): void; +} diff --git a/lib/observable.js b/lib/observable.js new file mode 100644 index 0000000..c38af8f --- /dev/null +++ b/lib/observable.js @@ -0,0 +1,40 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +class Observable { + constructor(collect = true, collect_intervall = 100) { + this.collect = collect; + this.collect_intervall = collect_intervall; + this.subscriber = []; + this.events = []; + this.timeout = undefined; + } + getPublicApi() { + return { + subscribe: (callback) => { + if (this.subscriber.indexOf(callback) < 0) + this.subscriber.push(callback); + }, + unsubscribe: (callback) => { + let idx = this.subscriber.indexOf(callback); + if (idx >= 0) { + this.subscriber.splice(idx, 1); + } + } + }; + } + send(data) { + if (!this.collect) + this.subscriber.forEach(e => e([data])); + else { + this.events.push(data); + if (!this.timeout) { + this.timeout = setTimeout(() => { + this.subscriber.forEach(e => e(this.events)); + this.timeout = 0; + }, this.collect_intervall); + } + } + } +} +exports.default = Observable; +//# sourceMappingURL=observable.js.map \ No newline at end of file diff --git a/lib/observable.js.map b/lib/observable.js.map new file mode 100644 index 0000000..1259ae3 --- /dev/null +++ b/lib/observable.js.map @@ -0,0 +1 @@ +{"version":3,"file":"observable.js","sourceRoot":"","sources":["../src/observable.ts"],"names":[],"mappings":";;AAEA,MAAqB,UAAU;IAK5B,YAAoB,UAAmB,IAAI,EAAU,oBAA4B,GAAG;QAAhE,YAAO,GAAP,OAAO,CAAgB;QAAU,sBAAiB,GAAjB,iBAAiB,CAAc;QAJ5E,eAAU,GAA4B,EAAE,CAAC;QACzC,WAAM,GAAQ,EAAE,CAAC;QACjB,YAAO,GAAG,SAAS,CAAC;IAE4D,CAAC;IAEzF,YAAY;QACT,OAAO;YACJ,SAAS,EAAE,CAAC,QAA+B,EAAE,EAAE;gBAC5C,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC;oBACtC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;YACpC,CAAC;YACD,WAAW,EAAE,CAAC,QAA+B,EAAE,EAAE;gBAC9C,IAAI,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;gBAC5C,IAAI,GAAG,IAAI,CAAC,EAAE;oBACX,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;iBACjC;YACJ,CAAC;SACH,CAAA;IACJ,CAAC;IAED,IAAI,CAAC,IAAO;QACT,IAAI,CAAC,IAAI,CAAC,OAAO;YACd,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;aACtC;YACF,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACvB,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;gBAChB,IAAI,CAAC,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;oBAC5B,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;oBAC7C,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC;gBACpB,CAAC,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC;aAC7B;SACH;IACJ,CAAC;CACH;AAnCD,6BAmCC"} \ No newline at end of file diff --git a/lib/test.d.ts b/lib/test.d.ts new file mode 100644 index 0000000..cb0ff5c --- /dev/null +++ b/lib/test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/lib/test.js b/lib/test.js new file mode 100644 index 0000000..deb3055 --- /dev/null +++ b/lib/test.js @@ -0,0 +1,122 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + 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) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const index_1 = require("./index"); +const util_1 = require("util"); +const testname = "ouiavgbsop687463743"; +const encoder = new util_1.TextEncoder(); +const decoder = new util_1.TextDecoder(); +const testdata = encoder.encode("Ich bin ein Test"); +const newTestData = encoder.encode("neue test daten"); +const testprev = "Ich bin..."; +const testfolder = "iabos"; +let ftestid; +const chai_1 = require("chai"); +function test(sf) { + let testid; + let testver; + let testver2; + it("create", () => __awaiter(this, void 0, void 0, function* () { + let res = yield sf.create(testname, testdata, "text", undefined, testprev); + chai_1.expect(res, "Res isnnot set").to.exist; + chai_1.expect(res._id, "Res has no _id").to.exist; + testid = res._id; + testver = res.active.version; + })); + it("get", () => __awaiter(this, void 0, void 0, function* () { + let res = yield sf.get(testid); + chai_1.expect(res, "No data returned").to.exist; + chai_1.expect(decoder.decode(res), "Returned data not equal to stored").to.be.equal(decoder.decode(testdata)); + })); + it("get - fail", () => __awaiter(this, void 0, void 0, function* () { + const inverr = new Error("Should have failed!"); + try { + yield sf.get(testid + "asod"); + throw inverr; + } + catch (err) { + if (err !== inverr) { + chai_1.expect(err).to.be.instanceOf(index_1.NotFound); + } + } + })); + it("list", () => __awaiter(this, void 0, void 0, function* () { + let res = yield sf.list(); + chai_1.expect(Array.isArray(res), "Is not from type Array").to.be.true; + chai_1.expect(res.length, "No elements returned").to.greaterThan(0); + let found = !!res.find(e => e._id === testid); + chai_1.expect(found, "Element not in List").to.be.true; + })); + it("update", () => __awaiter(this, void 0, void 0, function* () { + let res = yield sf.update(testid, newTestData, undefined); + chai_1.expect(res, "No data returned").to.exist; + chai_1.expect(res._id, "_id missing").to.exist; + chai_1.expect(res.active.version, "No new version was created").to.not.equal(testver); + testver2 = res.active.version; + let res2 = yield sf.get(testid); + chai_1.expect(decoder.decode(res2), "Fetched data not updated").to.be.equal(decoder.decode(newTestData)); + })); + it("history", () => __awaiter(this, void 0, void 0, function* () { + let his = yield sf.history(testid); + chai_1.expect(his, "no data returned").to.exist; + chai_1.expect(his.file, "file not set").to.exist; + chai_1.expect(his.history, "history not set").to.exist; + chai_1.expect(his.history.length, `Not expected history length. Expected 1 got ${his.history.length}`).to.be.equal(1); + chai_1.expect(his.history[0].version, "Wrong version on history").to.be.equal(testver); + chai_1.expect(his.file.active.version, "Wrong version on file").to.be.equal(testver2); + })); + it("history get old", () => __awaiter(this, void 0, void 0, function* () { + let arch = yield sf.get(testid, testver); + chai_1.expect(decoder.decode(arch), "Old version has wrong data").to.be.equal(decoder.decode(testdata)); + })); + it("history restore", () => __awaiter(this, void 0, void 0, function* () { + yield sf.restore(testid, testver); + let res = yield sf.get(testid); + chai_1.expect(res, "No data returned").to.exist; + chai_1.expect(decoder.decode(res), "Returned data not equal to stored").to.be.equal(decoder.decode(testdata)); + })); + it("delete", () => __awaiter(this, void 0, void 0, function* () { + let res = yield sf.delete(testid); + chai_1.expect(res, "Res not set").to.exist; + })); + describe("folder", () => { + it("create", () => __awaiter(this, void 0, void 0, function* () { + let res = yield sf.create(testname, testdata, "text", testfolder, testprev); + chai_1.expect(res, "Res not set").to.exist; + chai_1.expect(res._id, "No _id field").to.exist; + ftestid = res._id; + testver = res.active.version; + })); + it("list", () => __awaiter(this, void 0, void 0, function* () { + let res = yield sf.list(testfolder); + chai_1.expect(Array.isArray(res), "Is from type Array").to.be.true; + chai_1.expect(res.length, "Do elements exist?").to.be.greaterThan(0); + let found = false; + res.forEach(e => { + if (e._id === ftestid) { + found = true; + } + }); + chai_1.expect(found, "Element is not in List").to.exist; + })); + it("delete", () => __awaiter(this, void 0, void 0, function* () { + let res = yield sf.delete(ftestid); + chai_1.expect(res, "Res not set").to.exist; + })); + }); +} +describe("SecureFile Tests", function () { + let sf = new index_1.default("http://localhost:3004"); + sf.jwtObservable.subscribe((callback) => { + callback[0]("TESTJWT"); + }); + test(sf); +}); +//# sourceMappingURL=test.js.map \ No newline at end of file diff --git a/lib/test.js.map b/lib/test.js.map new file mode 100644 index 0000000..37b3a1d --- /dev/null +++ b/lib/test.js.map @@ -0,0 +1 @@ +{"version":3,"file":"test.js","sourceRoot":"","sources":["../src/test.ts"],"names":[],"mappings":"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"} \ No newline at end of file