@alwatr/async-queue 5.5.12 → 5.5.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -3,6 +3,14 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ ## [5.5.14](https://github.com/Alwatr/nanolib/compare/@alwatr/async-queue@5.5.13...@alwatr/async-queue@5.5.14) (2025-09-19)
7
+
8
+ **Note:** Version bump only for package @alwatr/async-queue
9
+
10
+ ## [5.5.13](https://github.com/Alwatr/nanolib/compare/@alwatr/async-queue@5.5.12...@alwatr/async-queue@5.5.13) (2025-09-15)
11
+
12
+ **Note:** Version bump only for package @alwatr/async-queue
13
+
6
14
  ## [5.5.12](https://github.com/Alwatr/nanolib/compare/@alwatr/async-queue@5.5.11...@alwatr/async-queue@5.5.12) (2025-09-13)
7
15
 
8
16
  **Note:** Version bump only for package @alwatr/async-queue
package/dist/main.cjs CHANGED
@@ -1,113 +1,3 @@
1
- /* @alwatr/async-queue v5.5.12 */
2
- "use strict";
3
- var __defProp = Object.defineProperty;
4
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
- var __getOwnPropNames = Object.getOwnPropertyNames;
6
- var __hasOwnProp = Object.prototype.hasOwnProperty;
7
- var __export = (target, all) => {
8
- for (var name in all)
9
- __defProp(target, name, { get: all[name], enumerable: true });
10
- };
11
- var __copyProps = (to, from, except, desc) => {
12
- if (from && typeof from === "object" || typeof from === "function") {
13
- for (let key of __getOwnPropNames(from))
14
- if (!__hasOwnProp.call(to, key) && key !== except)
15
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
16
- }
17
- return to;
18
- };
19
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
20
-
21
- // src/main.ts
22
- var main_exports = {};
23
- __export(main_exports, {
24
- AsyncQueue: () => AsyncQueue
25
- });
26
- module.exports = __toCommonJS(main_exports);
27
- var import_flatomise = require("@alwatr/flatomise");
28
- var AsyncQueue = class {
29
- constructor() {
30
- /**
31
- * A record of task IDs and their corresponding last queued task promises.
32
- */
33
- this.queue__ = {};
34
- }
35
- /**
36
- * Push a async task to the queue.
37
- *
38
- * @param taskId task id
39
- * @param task async task
40
- * @returns A promise that resolves when the task is done.
41
- *
42
- * @example
43
- * ```typescript
44
- * const queue = new AsyncQueue();
45
- *
46
- * function longTask() {
47
- * queue.push('longTaskId', async () => {
48
- * // ...
49
- * });
50
- * ```
51
- */
52
- async push(taskId, task) {
53
- const flatomise = (0, import_flatomise.newFlatomise)();
54
- const previousTaskPromise = this.queue__[taskId];
55
- this.queue__[taskId] = flatomise.promise;
56
- try {
57
- await previousTaskPromise;
58
- } catch (_e) {
59
- }
60
- setTimeout(() => {
61
- task().then(flatomise.resolve, flatomise.reject).then(() => {
62
- if (this.queue__[taskId] === flatomise.promise) {
63
- delete this.queue__[taskId];
64
- }
65
- });
66
- }, 0);
67
- return flatomise.promise;
68
- }
69
- /**
70
- * Check if the task running in the queue.
71
- *
72
- * @param taskId task id
73
- * @returns true if the task is running, otherwise false.
74
- * @example
75
- * ```typescript
76
- * if (queue.isRunning('longTaskId')) {
77
- * // ...
78
- * }
79
- * ```
80
- */
81
- isRunning(taskId) {
82
- return this.queue__[taskId] !== void 0;
83
- }
84
- /**
85
- * Wait for the all tasks in the queue to finish.
86
- *
87
- * @param taskId task id
88
- * @returns A promise that resolves when all tasks are done.
89
- * @example
90
- * ```typescript
91
- * await queue.waitForFinish('longTaskId');
92
- * ```
93
- */
94
- waitForFinish(taskId) {
95
- return this.queue__[taskId] ?? Promise.resolve();
96
- }
97
- /**
98
- * Wait for the all tasks in the queue to finish.
99
- * @returns A promise that resolves when all tasks are done.
100
- * @example
101
- * ```typescript
102
- * await queue.waitForAllFinish();
103
- * ```
104
- */
105
- waitForAllFinish() {
106
- return Promise.all(Object.values(this.queue__));
107
- }
108
- };
109
- // Annotate the CommonJS export names for ESM import in node:
110
- 0 && (module.exports = {
111
- AsyncQueue
112
- });
1
+ /* @alwatr/async-queue v5.5.14 */
2
+ "use strict";var __defProp=Object.defineProperty;var __getOwnPropDesc=Object.getOwnPropertyDescriptor;var __getOwnPropNames=Object.getOwnPropertyNames;var __hasOwnProp=Object.prototype.hasOwnProperty;var __export=(target,all)=>{for(var name in all)__defProp(target,name,{get:all[name],enumerable:true})};var __copyProps=(to,from,except,desc)=>{if(from&&typeof from==="object"||typeof from==="function"){for(let key of __getOwnPropNames(from))if(!__hasOwnProp.call(to,key)&&key!==except)__defProp(to,key,{get:()=>from[key],enumerable:!(desc=__getOwnPropDesc(from,key))||desc.enumerable})}return to};var __toCommonJS=mod=>__copyProps(__defProp({},"__esModule",{value:true}),mod);var main_exports={};__export(main_exports,{AsyncQueue:()=>AsyncQueue});module.exports=__toCommonJS(main_exports);var import_flatomise=require("@alwatr/flatomise");var AsyncQueue=class{constructor(){this.queue__={}}async push(taskId,task){const flatomise=(0,import_flatomise.newFlatomise)();const previousTaskPromise=this.queue__[taskId];this.queue__[taskId]=flatomise.promise;try{await previousTaskPromise}catch(_e){}setTimeout(()=>{task().then(flatomise.resolve,flatomise.reject).then(()=>{if(this.queue__[taskId]===flatomise.promise){delete this.queue__[taskId]}})},0);return flatomise.promise}isRunning(taskId){return this.queue__[taskId]!==void 0}waitForFinish(taskId){return this.queue__[taskId]??Promise.resolve()}waitForAllFinish(){return Promise.all(Object.values(this.queue__))}};0&&(module.exports={AsyncQueue});
113
3
  //# sourceMappingURL=main.cjs.map
package/dist/main.cjs.map CHANGED
@@ -2,6 +2,6 @@
2
2
  "version": 3,
3
3
  "sources": ["../src/main.ts"],
4
4
  "sourcesContent": ["import {newFlatomise} from '@alwatr/flatomise';\n\n/**\n * A queue that executes async tasks in order like mutex and semaphore methodology\n *\n * @example\n * ```ts\n * const queue = new AsyncQueue();\n *\n * function longTask() {\n * queue.push('longTaskId', async () => {\n * // ...\n * });\n * }\n * ```\n */\nexport class AsyncQueue {\n /**\n * A record of task IDs and their corresponding last queued task promises.\n */\n private queue__: DictionaryOpt<Promise<unknown>> = {};\n\n /**\n * Push a async task to the queue.\n *\n * @param taskId task id\n * @param task async task\n * @returns A promise that resolves when the task is done.\n *\n * @example\n * ```typescript\n * const queue = new AsyncQueue();\n *\n * function longTask() {\n * queue.push('longTaskId', async () => {\n * // ...\n * });\n * ```\n */\n public async push<T>(taskId: string, task: () => Promise<T>): Promise<T> {\n const flatomise = newFlatomise<T>();\n\n const previousTaskPromise = this.queue__[taskId];\n this.queue__[taskId] = flatomise.promise;\n\n try {\n await previousTaskPromise;\n }\n catch (_e) {\n // ignore\n }\n\n setTimeout(() => {\n task()\n .then(flatomise.resolve, flatomise.reject)\n .then(() => {\n if (this.queue__[taskId] === flatomise.promise) {\n delete this.queue__[taskId];\n }\n });\n }, 0);\n\n return flatomise.promise;\n }\n\n /**\n * Check if the task running in the queue.\n *\n * @param taskId task id\n * @returns true if the task is running, otherwise false.\n * @example\n * ```typescript\n * if (queue.isRunning('longTaskId')) {\n * // ...\n * }\n * ```\n */\n public isRunning(taskId: string): boolean {\n return this.queue__[taskId] !== undefined;\n }\n\n /**\n * Wait for the all tasks in the queue to finish.\n *\n * @param taskId task id\n * @returns A promise that resolves when all tasks are done.\n * @example\n * ```typescript\n * await queue.waitForFinish('longTaskId');\n * ```\n */\n public waitForFinish(taskId: string): Promise<unknown> {\n return this.queue__[taskId] ?? Promise.resolve();\n }\n\n /**\n * Wait for the all tasks in the queue to finish.\n * @returns A promise that resolves when all tasks are done.\n * @example\n * ```typescript\n * await queue.waitForAllFinish();\n * ```\n */\n public waitForAllFinish(): Promise<unknown[]> {\n return Promise.all(Object.values(this.queue__));\n }\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBAA2B;AAgBpB,IAAM,aAAN,MAAiB;AAAA,EAAjB;AAIL;AAAA;AAAA;AAAA,SAAQ,UAA2C,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBpD,MAAa,KAAQ,QAAgB,MAAoC;AACvE,UAAM,gBAAY,+BAAgB;AAElC,UAAM,sBAAsB,KAAK,QAAQ,MAAM;AAC/C,SAAK,QAAQ,MAAM,IAAI,UAAU;AAEjC,QAAI;AACF,YAAM;AAAA,IACR,SACO,IAAI;AAAA,IAEX;AAEA,eAAW,MAAM;AACf,WAAK,EACF,KAAK,UAAU,SAAS,UAAU,MAAM,EACxC,KAAK,MAAM;AACV,YAAI,KAAK,QAAQ,MAAM,MAAM,UAAU,SAAS;AAC9C,iBAAO,KAAK,QAAQ,MAAM;AAAA,QAC5B;AAAA,MACF,CAAC;AAAA,IACL,GAAG,CAAC;AAEJ,WAAO,UAAU;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcO,UAAU,QAAyB;AACxC,WAAO,KAAK,QAAQ,MAAM,MAAM;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYO,cAAc,QAAkC;AACrD,WAAO,KAAK,QAAQ,MAAM,KAAK,QAAQ,QAAQ;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUO,mBAAuC;AAC5C,WAAO,QAAQ,IAAI,OAAO,OAAO,KAAK,OAAO,CAAC;AAAA,EAChD;AACF;",
5
+ "mappings": ";qqBAAA,sIAA2B,6BAgBpB,IAAM,WAAN,KAAiB,CAAjB,cAIL,KAAQ,QAA2C,CAAC,EAmBpD,MAAa,KAAQ,OAAgB,KAAoC,CACvE,MAAM,aAAY,+BAAgB,EAElC,MAAM,oBAAsB,KAAK,QAAQ,MAAM,EAC/C,KAAK,QAAQ,MAAM,EAAI,UAAU,QAEjC,GAAI,CACF,MAAM,mBACR,OACO,GAAI,CAEX,CAEA,WAAW,IAAM,CACf,KAAK,EACF,KAAK,UAAU,QAAS,UAAU,MAAM,EACxC,KAAK,IAAM,CACV,GAAI,KAAK,QAAQ,MAAM,IAAM,UAAU,QAAS,CAC9C,OAAO,KAAK,QAAQ,MAAM,CAC5B,CACF,CAAC,CACL,EAAG,CAAC,EAEJ,OAAO,UAAU,OACnB,CAcO,UAAU,OAAyB,CACxC,OAAO,KAAK,QAAQ,MAAM,IAAM,MAClC,CAYO,cAAc,OAAkC,CACrD,OAAO,KAAK,QAAQ,MAAM,GAAK,QAAQ,QAAQ,CACjD,CAUO,kBAAuC,CAC5C,OAAO,QAAQ,IAAI,OAAO,OAAO,KAAK,OAAO,CAAC,CAChD,CACF",
6
6
  "names": []
7
7
  }
package/dist/main.mjs CHANGED
@@ -1,89 +1,3 @@
1
- /* @alwatr/async-queue v5.5.12 */
2
-
3
- // src/main.ts
4
- import { newFlatomise } from "@alwatr/flatomise";
5
- var AsyncQueue = class {
6
- constructor() {
7
- /**
8
- * A record of task IDs and their corresponding last queued task promises.
9
- */
10
- this.queue__ = {};
11
- }
12
- /**
13
- * Push a async task to the queue.
14
- *
15
- * @param taskId task id
16
- * @param task async task
17
- * @returns A promise that resolves when the task is done.
18
- *
19
- * @example
20
- * ```typescript
21
- * const queue = new AsyncQueue();
22
- *
23
- * function longTask() {
24
- * queue.push('longTaskId', async () => {
25
- * // ...
26
- * });
27
- * ```
28
- */
29
- async push(taskId, task) {
30
- const flatomise = newFlatomise();
31
- const previousTaskPromise = this.queue__[taskId];
32
- this.queue__[taskId] = flatomise.promise;
33
- try {
34
- await previousTaskPromise;
35
- } catch (_e) {
36
- }
37
- setTimeout(() => {
38
- task().then(flatomise.resolve, flatomise.reject).then(() => {
39
- if (this.queue__[taskId] === flatomise.promise) {
40
- delete this.queue__[taskId];
41
- }
42
- });
43
- }, 0);
44
- return flatomise.promise;
45
- }
46
- /**
47
- * Check if the task running in the queue.
48
- *
49
- * @param taskId task id
50
- * @returns true if the task is running, otherwise false.
51
- * @example
52
- * ```typescript
53
- * if (queue.isRunning('longTaskId')) {
54
- * // ...
55
- * }
56
- * ```
57
- */
58
- isRunning(taskId) {
59
- return this.queue__[taskId] !== void 0;
60
- }
61
- /**
62
- * Wait for the all tasks in the queue to finish.
63
- *
64
- * @param taskId task id
65
- * @returns A promise that resolves when all tasks are done.
66
- * @example
67
- * ```typescript
68
- * await queue.waitForFinish('longTaskId');
69
- * ```
70
- */
71
- waitForFinish(taskId) {
72
- return this.queue__[taskId] ?? Promise.resolve();
73
- }
74
- /**
75
- * Wait for the all tasks in the queue to finish.
76
- * @returns A promise that resolves when all tasks are done.
77
- * @example
78
- * ```typescript
79
- * await queue.waitForAllFinish();
80
- * ```
81
- */
82
- waitForAllFinish() {
83
- return Promise.all(Object.values(this.queue__));
84
- }
85
- };
86
- export {
87
- AsyncQueue
88
- };
1
+ /* @alwatr/async-queue v5.5.14 */
2
+ import{newFlatomise}from"@alwatr/flatomise";var AsyncQueue=class{constructor(){this.queue__={}}async push(taskId,task){const flatomise=newFlatomise();const previousTaskPromise=this.queue__[taskId];this.queue__[taskId]=flatomise.promise;try{await previousTaskPromise}catch(_e){}setTimeout(()=>{task().then(flatomise.resolve,flatomise.reject).then(()=>{if(this.queue__[taskId]===flatomise.promise){delete this.queue__[taskId]}})},0);return flatomise.promise}isRunning(taskId){return this.queue__[taskId]!==void 0}waitForFinish(taskId){return this.queue__[taskId]??Promise.resolve()}waitForAllFinish(){return Promise.all(Object.values(this.queue__))}};export{AsyncQueue};
89
3
  //# sourceMappingURL=main.mjs.map
package/dist/main.mjs.map CHANGED
@@ -2,6 +2,6 @@
2
2
  "version": 3,
3
3
  "sources": ["../src/main.ts"],
4
4
  "sourcesContent": ["import {newFlatomise} from '@alwatr/flatomise';\n\n/**\n * A queue that executes async tasks in order like mutex and semaphore methodology\n *\n * @example\n * ```ts\n * const queue = new AsyncQueue();\n *\n * function longTask() {\n * queue.push('longTaskId', async () => {\n * // ...\n * });\n * }\n * ```\n */\nexport class AsyncQueue {\n /**\n * A record of task IDs and their corresponding last queued task promises.\n */\n private queue__: DictionaryOpt<Promise<unknown>> = {};\n\n /**\n * Push a async task to the queue.\n *\n * @param taskId task id\n * @param task async task\n * @returns A promise that resolves when the task is done.\n *\n * @example\n * ```typescript\n * const queue = new AsyncQueue();\n *\n * function longTask() {\n * queue.push('longTaskId', async () => {\n * // ...\n * });\n * ```\n */\n public async push<T>(taskId: string, task: () => Promise<T>): Promise<T> {\n const flatomise = newFlatomise<T>();\n\n const previousTaskPromise = this.queue__[taskId];\n this.queue__[taskId] = flatomise.promise;\n\n try {\n await previousTaskPromise;\n }\n catch (_e) {\n // ignore\n }\n\n setTimeout(() => {\n task()\n .then(flatomise.resolve, flatomise.reject)\n .then(() => {\n if (this.queue__[taskId] === flatomise.promise) {\n delete this.queue__[taskId];\n }\n });\n }, 0);\n\n return flatomise.promise;\n }\n\n /**\n * Check if the task running in the queue.\n *\n * @param taskId task id\n * @returns true if the task is running, otherwise false.\n * @example\n * ```typescript\n * if (queue.isRunning('longTaskId')) {\n * // ...\n * }\n * ```\n */\n public isRunning(taskId: string): boolean {\n return this.queue__[taskId] !== undefined;\n }\n\n /**\n * Wait for the all tasks in the queue to finish.\n *\n * @param taskId task id\n * @returns A promise that resolves when all tasks are done.\n * @example\n * ```typescript\n * await queue.waitForFinish('longTaskId');\n * ```\n */\n public waitForFinish(taskId: string): Promise<unknown> {\n return this.queue__[taskId] ?? Promise.resolve();\n }\n\n /**\n * Wait for the all tasks in the queue to finish.\n * @returns A promise that resolves when all tasks are done.\n * @example\n * ```typescript\n * await queue.waitForAllFinish();\n * ```\n */\n public waitForAllFinish(): Promise<unknown[]> {\n return Promise.all(Object.values(this.queue__));\n }\n}\n"],
5
- "mappings": ";;;AAAA,SAAQ,oBAAmB;AAgBpB,IAAM,aAAN,MAAiB;AAAA,EAAjB;AAIL;AAAA;AAAA;AAAA,SAAQ,UAA2C,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBpD,MAAa,KAAQ,QAAgB,MAAoC;AACvE,UAAM,YAAY,aAAgB;AAElC,UAAM,sBAAsB,KAAK,QAAQ,MAAM;AAC/C,SAAK,QAAQ,MAAM,IAAI,UAAU;AAEjC,QAAI;AACF,YAAM;AAAA,IACR,SACO,IAAI;AAAA,IAEX;AAEA,eAAW,MAAM;AACf,WAAK,EACF,KAAK,UAAU,SAAS,UAAU,MAAM,EACxC,KAAK,MAAM;AACV,YAAI,KAAK,QAAQ,MAAM,MAAM,UAAU,SAAS;AAC9C,iBAAO,KAAK,QAAQ,MAAM;AAAA,QAC5B;AAAA,MACF,CAAC;AAAA,IACL,GAAG,CAAC;AAEJ,WAAO,UAAU;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcO,UAAU,QAAyB;AACxC,WAAO,KAAK,QAAQ,MAAM,MAAM;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYO,cAAc,QAAkC;AACrD,WAAO,KAAK,QAAQ,MAAM,KAAK,QAAQ,QAAQ;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUO,mBAAuC;AAC5C,WAAO,QAAQ,IAAI,OAAO,OAAO,KAAK,OAAO,CAAC;AAAA,EAChD;AACF;",
5
+ "mappings": ";AAAA,OAAQ,iBAAmB,oBAgBpB,IAAM,WAAN,KAAiB,CAAjB,cAIL,KAAQ,QAA2C,CAAC,EAmBpD,MAAa,KAAQ,OAAgB,KAAoC,CACvE,MAAM,UAAY,aAAgB,EAElC,MAAM,oBAAsB,KAAK,QAAQ,MAAM,EAC/C,KAAK,QAAQ,MAAM,EAAI,UAAU,QAEjC,GAAI,CACF,MAAM,mBACR,OACO,GAAI,CAEX,CAEA,WAAW,IAAM,CACf,KAAK,EACF,KAAK,UAAU,QAAS,UAAU,MAAM,EACxC,KAAK,IAAM,CACV,GAAI,KAAK,QAAQ,MAAM,IAAM,UAAU,QAAS,CAC9C,OAAO,KAAK,QAAQ,MAAM,CAC5B,CACF,CAAC,CACL,EAAG,CAAC,EAEJ,OAAO,UAAU,OACnB,CAcO,UAAU,OAAyB,CACxC,OAAO,KAAK,QAAQ,MAAM,IAAM,MAClC,CAYO,cAAc,OAAkC,CACrD,OAAO,KAAK,QAAQ,MAAM,GAAK,QAAQ,QAAQ,CACjD,CAUO,kBAAuC,CAC5C,OAAO,QAAQ,IAAI,OAAO,OAAO,KAAK,OAAO,CAAC,CAChD,CACF",
6
6
  "names": []
7
7
  }
package/package.json CHANGED
@@ -1,17 +1,17 @@
1
1
  {
2
2
  "name": "@alwatr/async-queue",
3
3
  "description": "A queue that executes async tasks in order like mutex and semaphore methodology for javascript and typescript.",
4
- "version": "5.5.12",
4
+ "version": "5.5.14",
5
5
  "author": "S. Ali Mihandoost <ali.mihandoost@gmail.com>",
6
6
  "bugs": "https://github.com/Alwatr/nanolib/issues",
7
7
  "dependencies": {
8
- "@alwatr/flatomise": "5.5.12"
8
+ "@alwatr/flatomise": "5.5.14"
9
9
  },
10
10
  "devDependencies": {
11
- "@alwatr/nano-build": "6.1.2",
11
+ "@alwatr/nano-build": "6.2.1",
12
12
  "@alwatr/prettier-config": "5.0.3",
13
13
  "@alwatr/tsconfig-base": "6.0.1",
14
- "@alwatr/type-helper": "6.0.2",
14
+ "@alwatr/type-helper": "6.1.0",
15
15
  "jest": "^30.1.3",
16
16
  "typescript": "^5.9.2"
17
17
  },
@@ -83,5 +83,5 @@
83
83
  },
84
84
  "type": "module",
85
85
  "types": "./dist/main.d.ts",
86
- "gitHead": "4da18811162df49c118acd71086cdbe38b27f250"
86
+ "gitHead": "7af0290f1dc91cce15d1324c026354a81c7e64ca"
87
87
  }