Socket
Socket
Sign inDemoInstall

tse-client

Package Overview
Dependencies
15
Maintainers
1
Versions
136
Alerts
File Explorer

Advanced tools

Install Socket

Detect and block malicious and high-risk dependencies

Install

Comparing version 2.18.1 to 2.18.2

dist/tse.dev.js

104

dist/tse.js

@@ -17,5 +17,5 @@ (function () {

if (isNode) {
const { existsSync, mkdirSync, readFileSync, writeFileSync, statSync, readdirSync } = require('fs');
const { readFileSync: read, writeFileSync: write, existsSync: exists, mkdirSync: mkdir, statSync: stat, readdirSync: readdir } = require('fs');
const { join } = require('path');
const { gzipSync, gunzipSync } = require('zlib');
const { gzip, gunzip } = require('zlib');

@@ -25,10 +25,10 @@ let datadir;

const defaultdir = join(home, 'tse-cache');
const pathfile = join(home, '.tse');
if ( existsSync(pathfile) ) {
datadir = readFileSync(pathfile, 'utf8');
try { statSync(datadir).isDirectory(); } catch { datadir = defaultdir; }
const tracker = join(home, '.tse');
if ( exists(tracker) ) {
datadir = read(tracker, 'utf8');
try { stat(datadir).isDirectory(); } catch { datadir = defaultdir; }
} else {
datadir = defaultdir;
if ( !existsSync(datadir) ) mkdirSync(datadir, {recursive: true});
writeFileSync(pathfile, datadir);
if ( !exists(datadir) ) mkdir(datadir, {recursive: true});
write(tracker, datadir);
}

@@ -40,4 +40,4 @@

const file = join(dir, `${key}.csv`);
if ( !existsSync(file) ) writeFileSync(file, '');
return readFileSync(file, 'utf8');
if ( !exists(file) ) write(file, '');
return read(file, 'utf8');
};

@@ -48,3 +48,3 @@

const dir = key.startsWith('prices.') ? join(datadir, 'prices') : datadir;
writeFileSync(join(dir, `${key}.csv`), value);
write(join(dir, `${key}.csv`), value);
};

@@ -56,9 +56,9 @@

const file = join(dir, `${key}.csv` + (zip?'.gz':''));
if ( !existsSync(file) ) {
writeFileSync(file, '');
if ( !exists(file) ) {
write(file, '');
done('');
return;
}
const content = readFileSync(file, zip?undefined:'utf8');
done(zip ? gunzipSync(content).toString() : content);
const content = read(file, zip?undefined:'utf8');
done(zip ? gunzip(content).toString() : content);
});

@@ -74,3 +74,3 @@

const file = join(dir, `${key}.csv` + (zip?'.gz':''));
writeFileSync(file, zip ? gzipSync(value) : value);
write(file, zip ? gzip(value) : value);
done();

@@ -81,7 +81,7 @@ });

const d = join(datadir, 'prices');
if (!existsSync(d)) mkdirSync(d);
for (const i of readdirSync(d)) {
if (!exists(d)) mkdir(d);
for (const i of readdir(d)) {
const key = i.replace('.csv','');
if ( !selins.has(key) ) continue;
result[key] = readFileSync(join(d,i),'utf8');
result[key] = read(join(d,i),'utf8');
}

@@ -92,10 +92,10 @@ };

const d = join(datadir, 'intraday');
if (!existsSync(d)) mkdirSync(d);
const dirs = readdirSync(d).filter( i => statSync(join(d,i)).isDirectory() && selins.has(i) );
if (!exists(d)) mkdir(d);
const dirs = readdir(d).filter( i => stat(join(d,i)).isDirectory() && selins.has(i) );
let result;
if (full) {
result = dirs.map(i => {
const files = readdirSync(join(d,i)).map(j => {
const files = readdir(join(d,i)).map(j => {
const z = j.slice(-3) === '.gz';
return [ z ? j.slice(0,-3) : j, readFileSync(join(d,i,j), z ? null : 'utf8') ];
return [ z ? j.slice(0,-3) : j, read(join(d,i,j), z ? null : 'utf8') ];
});

@@ -106,3 +106,3 @@ return [ i, Object.fromEntries(files) ];

result = dirs.map(i => {
const files = readdirSync(join(d,i)).map(j => {
const files = readdir(join(d,i)).map(j => {
const z = j.slice(-3) === '.gz';

@@ -120,7 +120,7 @@ return [z ? j.slice(0,-3) : j, true];

const dir = join(d, key);
if ( !existsSync(dir) ) mkdirSync(dir);
if ( !exists(dir) ) mkdir(dir);
Object.keys(obj).forEach(k => {
const cont = obj[k];
const filename = k + (cont === 'N/A' ? '': '.gz');
writeFileSync(join(dir, filename), obj[k]);
const filename = k + (cont==='N/A'?'':'.gz');
write(join(dir, filename), obj[k]);
});

@@ -134,6 +134,6 @@ };

if (typeof newdir === 'string') {
if ( !existsSync(newdir) ) mkdirSync(newdir, {recursive: true});
if ( statSync(newdir).isDirectory() ) {
if ( !exists(newdir) ) mkdir(newdir, {recursive: true});
if ( stat(newdir).isDirectory() ) {
datadir = newdir;
writeFileSync(pathfile, datadir);
write(tracker, datadir);
}

@@ -460,4 +460,3 @@ }

Big.RM = 2; // http://mikemcl.github.io/big.js/#rm
function adjust(cond, closingPrices, allShares, inscodes) {
const shares = new Map(allShares.filter(share => inscodes.has(share.InsCode)).map(i => [i.DEven, i]));
function adjust(cond, closingPrices, shares) {
const cp = closingPrices;

@@ -469,3 +468,3 @@ const len = closingPrices.length;

let gaps = new Big('0.0');
let num = new Big('1.0');
let coef = new Big('1.0');
adjustedClosingPrices.push( cp[len-1] );

@@ -480,3 +479,5 @@ if (cond === 1) {

}
if ( (cond === 1 && gaps.div(len).lt('0.08')) || cond === 2 ) {
const gapsToLifespanRatio = gaps.div(len);
const hasValidRatio = gapsToLifespanRatio.lt('0.08');
if ( (cond === 1 && hasValidRatio) || cond === 2 ) {
for (let i=len-2; i>=0; i-=1) {

@@ -488,16 +489,17 @@ const [curr, next] = [ cp[i], cp[i+1] ];

if (cond === 1 && pricesDontMatch) {
num = num.times(next.PriceYesterday).div(curr.PClosing);
coef = coef.times(next.PriceYesterday).div(curr.PClosing);
} else if (cond === 2 && pricesDontMatch && targetShare) {
const oldShares = targetShare.NumberOfShareOld;
const newShares = targetShare.NumberOfShareNew;
num = num.times(oldShares).div(newShares);
coef = coef.times(oldShares).div(newShares);
}
let
close = num.times(curr.PClosing).round(2).toFixed(2),
last = num.times(curr.PDrCotVal).round(2).toFixed(2),
low = num.times(curr.PriceMin).round().toString(),
high = num.times(curr.PriceMax).round().toString(),
yday = num.times(curr.PriceYesterday).round().toString(),
first = num.times(curr.PriceFirst).round(2).toFixed(2);
close = coef.times(curr.PClosing).round(2).toFixed(2),
last = coef.times(curr.PDrCotVal).round(2).toFixed(2),
low = coef.times(curr.PriceMin).round().toString(),
high = coef.times(curr.PriceMax).round().toString(),
yday = coef.times(curr.PriceYesterday).round().toString(),
first = coef.times(curr.PriceFirst).round(2).toFixed(2);
// note: the `toFixed()` calls are necessary and not redundant

@@ -882,3 +884,3 @@ const adjustedClosingPrice = {

if (succs.length && shouldCache) {
str = Object.keys(lastdevens).map(k => [k, lastdevens[k]].join(',')).join('\n');
const str = Object.keys(lastdevens).map(k => [k, lastdevens[k]].join(',')).join('\n');
storage.setItem('tse.inscode_lastdeven', str);

@@ -949,3 +951,6 @@ }

const selsyms = new Set(selection.map(i=> i.Symbol));
const extras = selection.map(({Symbol: sym}) =>
!selsyms.has(sym) &&
merges.has(sym) &&

@@ -955,4 +960,6 @@ merges.get(sym).slice(1).map(i => instruments[i.sym])

extrasIndex = selection.length;
selection.push(...extras);
if (extras.length) {
extrasIndex = selection.length;
selection.push(...extras);
}
}

@@ -980,3 +987,3 @@

if (mergeSimilarSymbols) selection.splice(extrasIndex);
if (mergeSimilarSymbols && extrasIndex > -1) selection.splice(extrasIndex);

@@ -991,3 +998,3 @@ const columns = settings.columns.map(i => {

const { adjustPrices, daysWithoutTrade, startDate, csv } = settings;
const shares = parseShares(true);
const allShares = parseShares(true);
const pi = Big(ptot).mul(0.20).div(selection.length);

@@ -1024,3 +1031,4 @@

if (adjustPrices === 1 || adjustPrices === 2) {
prices = adjust(adjustPrices, prices, shares, inscodes);
const relatedShares = new Map(allShares.filter(share => inscodes.has(share.InsCode)).map(i => [i.DEven, i]));
prices = adjust(adjustPrices, prices, relatedShares);
}

@@ -1027,0 +1035,0 @@

@@ -1,1 +0,1 @@

!function(){const e=function(){return"undefined"!=typeof global&&this===global}(),t=function(){return"undefined"!=typeof window&&this===window}(),s=e?require("node-fetch"):t?window.fetch:void 0,n=e?require("big.js"):t?window.Big:void 0,r=e?require("jalaali-js"):t?window.jalaali:void 0;if(t){if(!n)throw new Error("Cannot find required dependency: Big");if(!localforage)throw new Error("Cannot find required dependency: localforage")}const i=function(){let s;if(e){const{existsSync:e,mkdirSync:t,readFileSync:n,writeFileSync:r,statSync:i,readdirSync:a}=require("fs"),{join:o}=require("path"),{gzipSync:l,gunzipSync:c}=require("zlib");let p;const u=require("os").homedir(),m=o(u,"tse-cache"),d=o(u,".tse");if(e(d)){p=n(d,"utf8");try{i(p).isDirectory()}catch{p=m}}else p=m,e(p)||t(p,{recursive:!0}),r(d,p);const f=(t,s=!1)=>new Promise(((i,a)=>{const l=(t=t.replace("tse.","")).startsWith("prices.")?o(p,"prices"):p,u=o(l,`${t}.csv`+(s?".gz":""));if(!e(u))return r(u,""),void i("");const m=n(u,s?void 0:"utf8");i(s?c(m).toString():m)})),h=(e,t,s=!1)=>new Promise(((n,i)=>{e=e.replace("tse.","");let a=p;e.startsWith("prices.")&&(a=o(p,"prices"),e=e.replace("prices.",""));const c=o(a,`${e}.csv`+(s?".gz":""));r(c,s?l(t):t),n()}));s={getItem:t=>{const s=(t=t.replace("tse.","")).startsWith("prices.")?o(p,"prices"):p,i=o(s,`${t}.csv`);return e(i)||r(i,""),n(i,"utf8")},setItem:(e,t)=>{const s=(e=e.replace("tse.","")).startsWith("prices.")?o(p,"prices"):p;r(o(s,`${e}.csv`),t)},getItemAsync:f,setItemAsync:h,getItems:async function(s=new Set,r={}){const i=o(p,"prices");e(i)||t(i);for(const e of a(i)){const t=e.replace(".csv","");s.has(t)&&(r[t]=n(o(i,e),"utf8"))}},get CACHE_DIR(){return p},set CACHE_DIR(s){"string"==typeof s&&(e(s)||t(s,{recursive:!0}),i(s).isDirectory()&&(p=s,r(d,p)))},itd:{getItems:async function(s=new Set,r=!1){const l=o(p,"intraday");e(l)||t(l);const c=a(l).filter((e=>i(o(l,e)).isDirectory()&&s.has(e)));let u;return u=r?c.map((e=>{const t=a(o(l,e)).map((t=>{const s=".gz"===t.slice(-3);return[s?t.slice(0,-3):t,n(o(l,e,t),s?null:"utf8")]}));return[e,Object.fromEntries(t)]})):c.map((e=>{const t=a(o(l,e)).map((e=>[".gz"===e.slice(-3)?e.slice(0,-3):e,!0]));return[e,Object.fromEntries(t)]})),Object.fromEntries(u)},setItem:async function(s,n){s=s.replace("tse.","");const i=o(p,"intraday"),a=o(i,s);e(a)||t(a),Object.keys(n).forEach((e=>{const t=n[e];r(o(a,e+("N/A"===t?"":".gz")),n[e])}))}}}}else if(t){const e=window.pako||void 0,t=localforage.createInstance({name:"tse.prices"}),n=async(s,n=!1)=>{let r=localforage;s.startsWith("tse.prices.")&&(s=s.replace("prices.",""),r=t);const i=await r.getItem(s);return i?e&&n?e.ungzip(i,{to:"string"}):i:""},r=async(s,n,r=!1)=>{let i=localforage;if(s.startsWith("tse.prices.")&&(s=s.replace("tse.prices.",""),i=t),!e)return void await i.setItem(s,n);const a=r?e.gzip(n):n;await i.setItem(s,a)},i=async function(e=new Set,s={}){await t.iterate(((t,n)=>{let r=n.replace("tse.","");e.has(r)&&(s[r]=t)}))},a=localforage.createInstance({name:"tse.intraday"}),o=async(t,s,n=!1)=>{if(!e)return void await a.setItem(t,s);const r=n?e.gzip(s):s;await a.setItem(t,r)};s={getItem:e=>localStorage.getItem(e)||"",setItem:(e,t)=>localStorage.setItem(e,t),getItemAsync:n,setItemAsync:r,getItems:i,itd:{getItems:async function(e=new Set,t=!1){const s={};return t?await a.iterate(((t,n)=>{e.has(n)&&(s[n]=t)})):await a.iterate(((t,n)=>{e.has(n)&&(s[n]=Object.keys(t).reduce(((e,t)=>(e[t]=!0,e)),{}))})),s},setItem:o}}}return s}();let a="http://service.tsetmc.com/tsev2/data/TseClient2.aspx";const o={Instrument(e){const t={t:"Instrument",a:""+e};return this.makeRequest(t)},InstrumentAndShare(e,t=0){const s={t:"InstrumentAndShare",a:""+e,a2:""+t};return this.makeRequest(s)},LastPossibleDeven(){return this.makeRequest({t:"LastPossibleDeven"})},ClosingPrices(e){const t={t:"ClosingPrices",a:""+e};return this.makeRequest(t)},makeRequest(e){const t=new URL(a);return t.search=new URLSearchParams(e).toString(),new Promise(((e,n)=>{s(t).then((async t=>{200===t.status?e(await t.text()):n(t.status+" "+t.statusText)})).catch((e=>n(e)))}))}};class l{constructor(e=""){const t=e.split(",");if(11!==t.length)throw new Error("Invalid ClosingPrice data!");this.InsCode=t[0],this.DEven=t[1],this.PClosing=t[2],this.PDrCotVal=t[3],this.ZTotTran=t[4],this.QTotTran5J=t[5],this.QTotCap=t[6],this.PriceMin=t[7],this.PriceMax=t[8],this.PriceYesterday=t[9],this.PriceFirst=t[10]}}const c=["date","dateshamsi","open","high","low","last","close","vol","count","value","yesterday","symbol","name","namelatin","companycode"],p=["تاریخ میلادی","تاریخ شمسی","اولین قیمت","بیشترین قیمت","کمترین قیمت","آخرین قیمت","قیمت پایانی","حجم معاملات","تعداد معاملات","ارزش معاملات","قیمت پایانی دیروز","نماد","نام","نام لاتین","کد شرکت"];class u{constructor(e=[]){const t=e.length;if(t>2||t<1)throw new Error("Invalid Column data!");this.name=c[e[0]],this.fname=p[e[0]],this.header=e[1]}}class m{constructor(e=""){const t=e.split(",");if(![18,19].includes(t.length))throw new Error("Invalid Instrument data!");this.InsCode=t[0],this.InstrumentID=t[1],this.LatinSymbol=t[2],this.LatinName=t[3],this.CompanyCode=t[4],this.Symbol=I(t[5]).trim(),this.Name=t[6],this.CIsin=t[7],this.DEven=t[8],this.Flow=t[9],this.LSoc30=t[10],this.CGdSVal=t[11],this.CGrValCot=t[12],this.YMarNSC=t[13],this.CComVal=t[14],this.CSecVal=t[15],this.CSoSecVal=t[16],this.YVal=t[17],t[18]&&(this.SymbolOriginal=I(t[18]).trim())}}class d{constructor(e=""){const t=e.split(",");if(11!==t.length)throw new Error("Invalid InstrumentITD data!");this.InsCode=t[0],this.LVal30=I(t[1]),this.LVal18AFC=I(t[2]),this.FlowTitle=I(t[3]),this.CGrValCotTitle=I(t[4]),this.Flow=t[5],this.CGrValCot=t[6],this.CIsin=t[7],this.InstrumentID=t[8],this.ZTitad=t[9],this.BaseVol=t[10]}}class f{constructor(e=""){const t=e.split(",");if(5!==t.length)throw new Error("Invalid Share data!");this.Idn=t[0],this.InsCode=t[1],this.DEven=t[2],this.NumberOfShareNew=parseInt(t[3]),this.NumberOfShareOld=parseInt(t[4])}}function h(e=!1,t=!1,s="InsCode",n=!1){let r=i.getItem("tse.instruments"+(n?".intraday":""));r=r?r.split("\n"):[];const a=t?[]:{},o=n?d:m;for(const n of r){const r=e?new o(n):n;if(t)a.push(r);else{a[e?r[s]:n.split(",",1)[0]]=r}}return a}function g(e=!1,t=!0){let s=i.getItem("tse.shares");s=s?s.split("\n"):[];const n=t?[]:{};for(const r of s){const s=e?new f(r):r;if(t)n.push(s);else{const t=e?s.InsCode:r.split(",",2)[1];n[t]||(n[t]=[]),n[t].push(s)}}return n}function y(e){return 1e4*e.getFullYear()+100*(e.getMonth()+1)+e.getDate()+""}function I(e){return e.replace(/\u200B/g,"").replace(/\s?\u200C\s?/g," ").replace(/\u200D/g,"").replace(/\uFEFF/g,"").replace(/ك/g,"ک").replace(/ي/g,"ی")}function v(e){return"[object Object]"===Object.prototype.toString.call(e)}function w(e){return Number.isInteger(e)&&e>=0}let D=1,C=50,T=300,b=3,S=1e3;const A="merged",E={columns:[0,2,3,4,5,6,7,8,9],adjustPrices:0,daysWithoutTrade:!1,startDate:"20010321",mergeSimilarSymbols:!0,cache:!0,csv:!1,csvHeaders:!0,csvDelimiter:",",onprogress:void 0,progressTotal:100};let P={},j={};function _(e,t,s){const n=e;return"date"===n?s.DEven:"dateshamsi"===n?r&&function(e){const{jy:t,jm:s,jd:n}=r.toJalaali(+e.slice(0,4),+e.slice(4,6),+e.slice(6,8));return 1e4*t+100*s+n+""}(s.DEven):"open"===n?s.PriceFirst:"high"===n?s.PriceMax:"low"===n?s.PriceMin:"last"===n?s.PDrCotVal:"close"===n?s.PClosing:"vol"===n?s.QTotTran5J:"count"===n?s.ZTotTran:"value"===n?s.QTotCap:"yesterday"===n?s.PriceYesterday:"symbol"===n?t.Symbol:"name"===n?t.Name:"namelatin"===n?t.LatinName:"companycode"===n?t.CompanyCode:""}function R(e="",t){if(!e||"0"===e)return!0;const s=new Date,n=y(s),r=function(e,t){const s=+new Date(+e.slice(0,4),+e.slice(4,6)-1,+e.slice(6,8)),n=+new Date(+t.slice(0,4),+t.slice(4,6)-1,+t.slice(6,8)),r=Math.abs(n-s);return Math.ceil(r/864e5)}(t,e),i=[4,5].includes(s.getDay()),a=(o=t,new Date(+o.slice(0,4),+o.slice(4,6)-1,+o.slice(6,8))).getDay();var o;return r>=D&&(n!==t||s.getHours()>16)&&!(i&&3!==a&&r<=3)}async function O(){let e,t;const s=i.getItem("tse.lastPossibleDevens");s&&([e,t]=s.split(","));const n=y(new Date);if(!s||R(n,e)||R(n,t)){let s;const n=await o.LastPossibleDeven().catch((e=>s=e));if(s)return{title:"Failed request: LastPossibleDeven",detail:s};if(!/^\d{8};\d{8}$/.test(n))return{title:"Invalid server response: LastPossibleDeven"};const r=n.split(";");i.setItem("tse.lastPossibleDevens",r.join(",")),[e,t]=r}return[e,t]}async function N(){let e,t,s,n;if(i.getItem("tse.lastInstrumentUpdate")){s=h(),n=g();const r=Object.keys(s).map((e=>+s[e].split(",",9)[8])),i=n.map((e=>+e.split(",",1)[0]));e=Math.max(...r),t=Math.max(...i)}else e=0,t=0;const r=await O();if(v(r))return r;const a=""+e,[l,c]=r;if(!R(a,l)&&!R(a,c))return;let p;const u=await o.InstrumentAndShare(+y(new Date),t).catch((e=>p=e));if(p)return{title:"Failed request: InstrumentAndShare",detail:p};let m=u.split("@")[1];p=0;let d=await o.Instrument(e).catch((e=>p=e));if(p)return{title:"Failed request: Instrument",detail:p};if(""!==d&&"*"!==d){let e;if(s){let t=Object.fromEntries(Object.keys(s).map((e=>(19===(e=s[e].split(",")).length&&(e[5]=e[18],e.pop()),[e[0],e.join(",")]))));d.split(";").forEach(((e,s)=>(s=e.split(",",1)[0],t[s]=e))),e=Object.keys(t).map((e=>t[e].split(",")))}else e=d.split(";").map((e=>e.split(",")));let t=[...e.map((e=>((e=[...e])[5]=I(e[5]).trim(),e)))],n=[...new Set(t.map((e=>e[5])).filter(((e,t,s)=>s.indexOf(e)!==t)))].map((e=>t.filter((t=>t[5]===e)))),r=new Map(e.map(((e,t)=>[e[0],t])));for(let t of n){t.sort(((e,t)=>+t[8]-e[8])).forEach(((t,s)=>{let n=r.get(t[0]),i=e[n][5];if(s>0){let e="-ق"+(s+1);t.push(i),t[5]=i.trim()+e}else t[5]=i}))}n.flat().forEach((t=>{let s=r.get(t[0]);e[s]=t})),d=e,r=void 0,t=void 0,e=void 0,s&&Object.keys(s).length?(d.forEach((e=>s[e[0]]=e.join(","))),d=Object.keys(s).map((e=>s[e])).join("\n")):d=d.map((e=>e.join(","))).join("\n"),i.setItem("tse.instruments",d)}""!==m&&(m=n&&n.length?n.concat(m.split(";")).join("\n"):m.replace(/;/g,"\n"),i.setItem("tse.shares",m)),(""!==d&&"*"!==d||""!==m)&&i.setItem("tse.lastInstrumentUpdate",y(new Date))}n.DP=40,n.RM=2;const U=function(){let e,t,s,r,a,l,c,p,u=0,m=[],d=[],f=0,h=[],g=new Map,y=[];function I(){if(g.size>0||e)setTimeout(I,200);else{if(m.length===u||f>=b){const e=[...m],s=[...d];return m=[],d=[],void Promise.all(y).then((()=>{y=[],t({succs:e,fails:s,pn:r})}))}if(h.length){const t=h.flat().map((e=>e[0]));d=d.filter((e=>-1===t.indexOf(e))),f++,e=setTimeout(D,S,h),h=[],setTimeout(I,S)}}}function v(e,t,a){const o=t.map((([e])=>e));if("string"!=typeof e||!/^[\d.,;@-]+$/.test(e)&&""!==e)d.push(...o),h.push(t);else{const a=e.replace(/;/g,"\n").split("@").map(((e,s)=>[t[s][0],e]));for(const[e,t]of a)if(m.push(e),t){const s=j[e],n=s?s+"\n"+t:t;j[e]=n,P[e]=t.split("\n").slice(-1)[0].split(",",2)[1],y.push(p&&i.setItemAsync("tse.prices."+e,n))}if(d=d.filter((e=>-1===o.indexOf(e))),s){const e=l.div(b+2).mul(f+1);s(r=+n(r).plus(l.sub(e)))}}g.delete(a)}function w(e=[],t){const i=e.map((e=>e.join(","))).join(";");o.ClosingPrices(i).then((s=>v(s,e,t))).catch((()=>v(void 0,e,t))),s&&s(r=+n(r).plus(c))}function D(t=[]){e&&(e=void 0);const s=t.map(((e,t)=>"a"+t));for(let e=0,n=0,r=t.length;e<r;e++,n+=T){const r=s[e],i=setTimeout(w,n,t[e],r);g.set(r,i)}}return function(i=[],o,y={}){var v,w;return p=o,({pf:s,pn:r,ptot:a}=y),u=i.length,l=a.div(Math.ceil(n(u).div(C))),c=l.div(b+2),m=[],d=[],f=0,h=[],g=new Map,e=void 0,D((w=C,(v=i).map(((e,t)=>t%w==0?v.slice(t,t+w):void 0)).filter((e=>e)))),I(),new Promise((e=>t=e))}}();async function k(e=[],t,{pf:s,pn:r,ptot:a}={}){P=i.getItem("tse.inscode_lastdeven");let o=new Set;if(P){const e=P.split("\n").map((e=>e.split(",")));P=Object.fromEntries(e),o=new Set(Object.keys(P))}else P={};let l={succs:[],fails:[],error:void 0,pn:r};const c=+n(r).plus(a),p=await O();if(v(p))return l.error=p,s&&s(r=c),l;const[u,m]=p,{startDate:d}=E,f=e.map((e=>{const{InsCode:t,YMarNSC:s}=e,n="NO"===s?0:1;if(!o.has(t))return[t,d,n];{const e=P[t];if(!e)return;if(R(e,"NO"!==s?m:u))return[t,e,n]}})).filter((e=>e));s&&s(r=+n(r).plus(a.mul(.01)));const h=new Set(e.map((e=>e.InsCode))),g=new Set(Object.keys(j));if(g.size&&![...h].find((e=>!g.has(e)))||await i.getItems(h,j),s&&s(r=+n(r).plus(a.mul(.01))),f.length){const e=await U(f,t,{pf:s,pn:r,ptot:a.sub(a.mul(.02))}),{succs:n,fails:o}=e;({pn:r}=e),n.length&&t&&(str=Object.keys(P).map((e=>[e,P[e]].join(","))).join("\n"),i.setItem("tse.inscode_lastdeven",str)),l={succs:n,fails:o}}return s&&r!==c&&s(r=c),l.pn=r,l}let Y=(e="",t="",s="")=>`http://${e>0?"cdn"+e+".":e<0?"":"cdn."}tsetmc.com/Loader.aspx?ParTree=15131P&i=${t}&d=${s}`,L=100,M=6e4,x=3,z=1e3,F=[-1,0];const q={startDate:"20010321",endDate:"",cache:!0,gzip:!0,reUpdateNoTrades:!1,updateOnly:!1,onprogress:void 0,progressTotal:100,chunkDelay:L,chunkMaxWait:M,retryCount:x,retryDelay:z,servers:F};let V,H,W={};if(e){const{gzipSync:e,gunzipSync:t}=require("zlib");V=t=>e(t),H=e=>t(e).toString()}else if(t){const{gzip:e,ungzip:t}=window.pako||{};V=t=>e(t),H=e=>t(e,{to:"string"})}function $(e,t={}){for(let[s,n]of e)"[object Map]"===Map.prototype.toString.call(n)||Array.isArray(n)?t[s]=$(n,t[s]):t[s]=n;return t}function K(e,t){let s=t.split(e)[1].split("];",1)[0];return s="["+s.replace(/'/g,'"')+"]",JSON.parse(s)}async function Q(e="",t=[],s){W[e]||(W[e]={});let n=W[e];for(let[e,s]of t){if("N/A"===s){n[e]=s;continue}let t,r=K("var ClosingPriceData=[",s),i=K("var BestLimitData=[",s),a=K("var IntraTradeData=[",s),o=K("var ClientTypeData=[",s),l=K("var InstrumentStateData=[",s),c=K("var StaticTreshholdData=[",s),p=K("var InstSimpleData=[",s),u=K("var ShareHolderData=[",s);t=[12,2,3,4,6,7,8,9,10,11];let m=r.map((e=>t.map((t=>e[t])).join(","))).join("\n");t=[0,1,2,3,4,5,6,7];let d=i.map((e=>t.map((t=>e[t])).join(","))).join("\n");t=[1,0,2,3,4];let f=a.map((e=>{let[s,n,r]=e[1].split(":"),i=1e4*+s+100*+n+ +r+"";return e[1]=i,t.map((t=>e[t]))})).sort(((e,t)=>+e[0]-t[0])).map((e=>e.join(","))).join("\n");t=[4,0,12,16,8,6,2,14,18,10,5,1,13,17,9,7,3,15,19,11,20];let h,g,y=t.map((e=>o[e])).join(","),[v,w]=[l,c],D=v.length&&v[0].length?v[0][2]:"";w.length&&w[1].length&&(h=w[1][2],g=w[1][1]);let[C,T]=[4,9].map((e=>p[e])),b=[T,C,h,g,D].join(",");t=[2,3,4,0,5];let S=u.filter((e=>e[4])).map((e=>(e[4]={ArrowUp:"+",ArrowDown:"-"}[e[4]],e[5]=I(e[5]),t.map((t=>e[t])).join(",")))).join("\n"),A=[m,d,f,y,b];S&&A.push(S),n[e]=V(A.join("\n\n"))}let r=n,a=Object.keys(r).filter((e=>!0!==r[e])).reduce(((e,t)=>(e[t]=r[t],e)),{});if(s)return i.itd.setItem(e,a)}const J=function(){let e,r,a,o,l,c,p,u,m,d,f,g,y={},I=0,v=[],w=[],D=0,C=[],T=new Map,b=-1,S=[],A={},E={};function P(){if(T.size>0||b)setTimeout(P,200);else{if(v.length===I||D>=o){let s=[...v],n=[...w.map((e=>e.slice(1)))];v=[],w=[],t&&(y={});let r=h(!1,!1,void 0,!0);return r={...r,...E},r=Object.keys(r).map((e=>r[e])).join("\n"),i.setItem("tse.instruments.intraday",r),A={},E={},void Promise.all(S).then((()=>{S=[],e({succs:s,fails:n})}))}if(C.length){let e=C.map((e=>e.join("")));w=w.filter((t=>-1===e.indexOf(t.join("")))),D++,C.forEach((e=>{return e[0]=(t=e[0],t=c.indexOf(t)+1,c[t<c.length?t:0]);var t})),b=setTimeout(R,l,C,!0),C=[],setTimeout(P,l)}}}function j(e,s,r){if("string"==typeof e){let r=e;if("N/A"!==e){let t="var InstSimpleData"+e.split("var InstSimpleData")[1].split(";")[0]+";",s="var StaticTreshholdData"+e.split("var StaticTreshholdData")[1];r=t.replace(/\t/g,"\\t")+s}let i=s.slice(1);v.push(i);let[a,l]=i;if(l===A[a]&&"N/A"!==e){let e=JSON.parse(r.split("var InstSimpleData=")[1].split(";")[0].replace(/'/g,'"'));E[a]=[a,...e].join(",")}if(t){let e=y[a];if(e[l]=r,!Object.keys(e).find((t=>!e[t]))){let t=Object.keys(e).map((t=>[t,e[t]]));S.push(Q(a,t,p))}}else S.push(Q(a,[[l,r]],p));if(w=w.filter((e=>e.join()!==s.join())),u){let e=f.div(o+2).mul(D+1);u(m=+n(m).plus(f.sub(e)))}}else w.push(s),C.push(s);T.delete(r)}async function _(e=[],t){let r,i,[o,l,c]=e;"undefined"!=typeof AbortController&&(r=new AbortController,i=r.signal),s(Y(o,l,c),i?{signal:i}:void 0).then((async s=>{let{status:n}=s;if(200===n){let n=await s.text();if(n.includes('Object moved to <a href="/GeneralError.aspx?aspxerrorpath=/Loader.aspx">here</a>'))j("N/A",e,t);else{let s=n.split("var StaticTreshholdData")[1];j(["ClosingPrice","IntraDayPrice","IntraTrade","ClientType","BestLimit"].some((e=>s.split(`var ${e}Data=[`)[1].split("];")[0]))?n:void 0,e,t)}}else j(void 0,e,t)})).catch((()=>j(void 0,e,t))),r&&setTimeout((()=>r.abort()),a),u&&u(m=+n(m).plus(g))}function R(e=[]){b&&(b=void 0);let t=e.map(((e,t)=>"a"+t));for(let s=0,n=0,i=e.length;s<i;s++,n+=r){let r=t[s],i=setTimeout(_,n,e[s],r);T.set(r,i)}}return async function(s,n,i){({chunkDelay:r,chunkMaxWait:a,retryCount:o,retryDelay:l,servers:c,shouldCache:p}=n),({pf:u,pn:m,ptot:d}=i),t&&(y=$(s.map((([e,t])=>[e,t.map((e=>[e,void 0]))]))));let h=[...s].reduce(((e,[t,s])=>[...e,...s?s.map((e=>[c[0],t,""+e])):[]]),[]);return I=h.length,f=d.div(I),g=f.div(o+2),v=[],w=[],D=0,C=[],T=new Map,b=void 0,S=[],A=$(s.map((([e,t])=>[e,""+t[t.length-1]]))),E={},R(h),P(),new Promise((t=>e=t))}}();const B={getPrices:async function(e=[],t={}){if(!e.length)return;const s={...E,...t},r={data:[],error:void 0};let{onprogress:i,progressTotal:a}=s;"function"!=typeof i&&(i=void 0),"number"!=typeof a&&(a=E.progressTotal);let o=0;a=n(a);const c=await N();if(i&&i(o=+n(o).plus(a.mul(.01))),c){const{title:e,detail:t}=c;return r.error={code:1,title:e,detail:t},i&&i(+a),r}const p=h(!0,void 0,"Symbol"),m=e.map((e=>p[e])),d=e.filter(((e,t)=>!m[t]));if(i&&i(o=+n(o).plus(a.mul(.01))),d.length)return r.error={code:2,title:"Incorrect Symbol",symbols:d},i&&i(+a),r;const{mergeSimilarSymbols:f}=s;let y=new Map,I=-1;if(f){const e=Object.keys(p).map((e=>p[e])),t=new Set(e.filter((e=>e.SymbolOriginal)).map((e=>e.SymbolOriginal)));y=new Map([...t].map((e=>[e,[]]))),e.forEach(((e,t)=>{const{SymbolOriginal:s,Symbol:n,InsCode:r}=e,i=s||n;if(!y.has(i))return;const a=new RegExp("-ق(\\d+)");y.get(i).push({sym:n,code:r,order:s?+n.match(a)[1]:1})})),[...y].forEach((([,e])=>e.sort(((e,t)=>e.order-t.order))));const s=m.map((({Symbol:e})=>y.has(e)&&y.get(e).slice(1).map((e=>p[e.sym])))).flat().filter((e=>e));I=m.length,m.push(...s)}const v=await k(m,s.cache,{pf:i,pn:o,ptot:a.mul(.78)}),{succs:w,fails:D,error:C}=v;if(({pn:o}=v),C){const{title:e,detail:t}=C;return r.error={code:1,title:e,detail:t},i&&i(+a),r}if(D.length){const e=Object.fromEntries(m.map((e=>[e.InsCode,e.Symbol])));r.error={code:3,title:"Incomplete Price Update",fails:D.map((t=>e[t])),succs:w.map((t=>e[t]))},m.forEach(((e,t,s)=>D.includes(e.InsCode)?s[t]=void 0:0))}f&&m.splice(I);const T=s.columns.map((e=>{const t=Array.isArray(e)?e:[e],s=new u(t),n=s.header||s.name;return{...s,header:n}})),{adjustPrices:b,daysWithoutTrade:S,startDate:P,csv:R}=s,O=g(!0),U=n(a).mul(.2).div(m.length),Y={};if(f)for(const[,e]of[...y]){const t=e.map((e=>e.code)),[s]=t;Y[s]=t.map((e=>j[e])).reverse().filter((e=>e)).join("\n")}const L=e=>{const{InsCode:t,Symbol:s,SymbolOriginal:r}=e;let i,a;if(r){if(f)return A;i=j[t],a=new Set([t])}else{const e=y.has(s);i=e?Y[t]:j[t],a=new Set(e?y.get(s).map((e=>e.code)):[t])}if(i)return i=i.split("\n").map((e=>new l(e))),1!==b&&2!==b||(i=function(e,t,s,r){const i=new Map(s.filter((e=>r.has(e.InsCode))).map((e=>[e.DEven,e]))),a=t,o=t.length,l=[];let c=a;if((1===e||2===e)&&o>1){let t=new n("0.0"),s=new n("1.0");if(l.push(a[o-1]),1===e)for(let e=o-2;e>=0;e-=1){const[s,r]=[a[e],a[e+1]];n(s.PClosing).eq(r.PriceYesterday)||s.InsCode!==r.InsCode||(t=t.plus(1))}if(1===e&&t.div(o).lt("0.08")||2===e){for(let t=o-2;t>=0;t-=1){const[r,o]=[a[t],a[t+1]],c=!n(r.PClosing).eq(o.PriceYesterday)&&r.InsCode===o.InsCode,p=i.get(o.DEven);if(1===e&&c)s=s.times(o.PriceYesterday).div(r.PClosing);else if(2===e&&c&&p){const e=p.NumberOfShareOld,t=p.NumberOfShareNew;s=s.times(e).div(t)}let u=s.times(r.PClosing).round(2).toFixed(2),m=s.times(r.PDrCotVal).round(2).toFixed(2),d=s.times(r.PriceMin).round().toString(),f=s.times(r.PriceMax).round().toString(),h=s.times(r.PriceYesterday).round().toString(),g=s.times(r.PriceFirst).round(2).toFixed(2);const y={InsCode:r.InsCode,DEven:r.DEven,PClosing:u,PDrCotVal:m,ZTotTran:r.ZTotTran,QTotTran5J:r.QTotTran5J,QTotCap:r.QTotCap,PriceMin:d,PriceMax:f,PriceYesterday:h,PriceFirst:g};l.push(y)}c=l.reverse()}}return c}(b,i,O,a)),S||(i=i.filter((e=>+e.ZTotTran>0))),i=i.filter((e=>+e.DEven>+P)),i};if(R){const{csvHeaders:e,csvDelimiter:t}=s,a=e?T.map((e=>e.header)).join()+"\n":"";r.data=m.map((e=>{if(!e)return;let s=a;const r=L(e);return r?r===A?r:(s+=r.map((s=>T.map((t=>_(t.name,e,s))).join(t))).join("\n"),i&&i(o=+n(o).plus(U)),s):s}))}else{const e=new Set(["CompanyCode","LatinName","Symbol","Name"]);r.data=m.map((t=>{if(!t)return;const s=Object.fromEntries(T.map((e=>[e.header,[]]))),r=L(t);if(!r)return s;if(r===A)return r;for(const n of r)for(const{header:r,name:i}of T){const a=_(i,t,n);s[r].push(e.has(i)?a:parseFloat(a))}return i&&i(o=+n(o).plus(U)),s}))}return i&&o!==a&&i(o=a),r},getInstruments:async function(e=!0,t=!0,s="InsCode"){-1===Object.keys(new m([...Array(18).keys()].join(","))).indexOf(s)&&(s="InsCode");const n=i.getItem("tse.lastInstrumentUpdate"),r=await N();if(r&&!n)throw r;return h(e,t,s)},get API_URL(){return a},set API_URL(e){if("string"!=typeof e)return;let t;try{new URL(e)}catch(e){throw t=!0,e}t||(a=e)},get UPDATE_INTERVAL(){return D},set UPDATE_INTERVAL(e){w(e)&&(D=e)},get PRICES_UPDATE_CHUNK(){return C},set PRICES_UPDATE_CHUNK(e){Number.isInteger(e)&&e>0&&e<60&&(C=e)},get PRICES_UPDATE_CHUNK_DELAY(){return T},set PRICES_UPDATE_CHUNK_DELAY(e){w(e)&&(T=e)},get PRICES_UPDATE_RETRY_COUNT(){return b},set PRICES_UPDATE_RETRY_COUNT(e){w(e)&&(b=e)},get PRICES_UPDATE_RETRY_DELAY(){return S},set PRICES_UPDATE_RETRY_DELAY(e){w(e)&&(S=e)},get columnList(){return[...Array(15)].map(((e,t)=>({name:c[t],fname:p[t]})))},getIntraday:async function(e=[],t={}){if(!e.length)return;const s={...q,...t},r={data:[],error:void 0};let{onprogress:a,progressTotal:o}=s;"function"!=typeof a&&(a=void 0),"number"!=typeof o&&(o=q.progressTotal);let l=0;o=n(o);const c=await N();if(a&&a(l=+n(l).plus(o.mul(.01))),c){const{title:e,detail:t}=c;return r.error={code:1,title:e,detail:t},a&&a(+o),r}const p=h(!0,void 0,"Symbol"),u=e.map((e=>p[e])),m=e.filter(((e,t)=>!u[t]));if(a&&a(l=+n(l).plus(o.mul(.01))),m.length)return r.error={code:2,title:"Incorrect Symbol",symbols:m},a&&a(+o),r;const d=new Set(u.map((e=>e&&e.InsCode)));let f=await i.getItemAsync("tse.inscode_devens");f=f?f.split("\n").map((e=>e.split(";"))).map((([e,t])=>[e,t.split(",").map((e=>+e))])):[];const g=new Set(f.map((e=>e[0]))),I=[...new Set(f.map((([,e])=>e[e.length-1])))],v=+s.endDate,w=v||+y(new Date),{cache:D}=s;if(!f.length||[...d].some((e=>!g.has(e)))||I.some((e=>e<w))){const e=await k(u,D,{pf:a,pn:l,ptot:o.mul(.1)}),{succs:t,fails:s,error:n}=e;if(({pn:l}=e),n){const{title:e,detail:t}=n;return r.error={code:1,title:e,detail:t},a&&a(+o),r}if(s.length){const e=Object.fromEntries(u.map((e=>[e.InsCode,e.Symbol])));r.error={code:3,title:"Incomplete Price Update",fails:s.map((t=>e[t])),succs:t.map((t=>e[t]))},u.forEach(((e,t,n)=>s.includes(e.InsCode)?n[t]=void 0:0))}if(f=Object.keys(j).map((e=>{const t=j[e];if(!t)return;return[e,t.split("\n").filter((e=>+e.split(",",5)[4]>0)).map((e=>+e.split(",",2)[1]))]})).filter((e=>e)),D){const e=f.map((([e,t])=>[e,t.join(",")].join(";"))).join("\n");await i.setItemAsync("tse.inscode_devens",e)}}f=Object.fromEntries(f),a&&a(l=+n(l).plus(o.mul(.01)));let C=+s.startDate,T=v?e=>e>=C&&e<=v:e=>e>=C,b=[...d].map((e=>{if(!e)return[];let t=f[e];return t?[e,t.filter(T)]:[e,[]]})),{reUpdateNoTrades:S,updateOnly:A}=s;W=await i.itd.getItems(d,!A||S);let E=b.map((([e,t])=>{if(!e||!t.length)return;if(!W[e])return[e,t];let s=S?t.filter((t=>{let s=W[e][t];if(!s)return!0;let[,,n]=H(s).split("\n\n");return!n})):t.filter((t=>!W[e][t]));return s.length?[e,s]:void 0})).filter((e=>e));a&&a(l=+n(l).plus(o.mul(.01)));let{chunkDelay:P,chunkMaxWait:_,retryCount:R,retryDelay:O,servers:U}=s;if(Array.isArray(U)&&!U.some((e=>!Number.isInteger(e)||e<0))||(U=q.servers),E.length>0){let{succs:e,fails:t}=await J(E,{shouldCache:D,chunkDelay:P,chunkMaxWait:_,retryCount:R,retryDelay:O,servers:U},{pf:a,pn:l,ptot:o.mul(.85)});if(t.length){let s=Object.fromEntries(u.map((e=>[e.InsCode,e.Symbol]))),n=(e,[t,n])=>(!e[s[t]]&&(e[s[t]]=[]),e[s[t]].push(n),e);r.error={code:4,title:"Incomplete Intraday Update",fails:t.reduce(n,{}),succs:e.reduce(n,{})}}}if(a&&a(l=+o.mul(.99)),!A){let{gzip:e}=s;r.data=b.map((([t,s])=>{let n=W[t];if(n)return e?s.map((e=>[e,n[e]])):s.map((e=>[e,n[e]&&"string"!=typeof n[e]?H(n[e]):n[e]]))}))}return a&&a(+o),r},getIntradayInstruments:async function(e=!0,t=!0,s="InsCode"){return-1===Object.keys(new d([...Array(11).keys()].join(","))).indexOf(s)&&(s="InsCode"),h(e,t,s,!0)},get INTRADAY_URL(){return Y},set INTRADAY_URL(e){if("function"!=typeof e)return;let t;try{new URL(e())}catch(e){throw t=!0,e}t||(Y=e)},get INTRADAY_UPDATE_CHUNK_DELAY(){return L},set INTRADAY_UPDATE_CHUNK_DELAY(e){w(e)&&(L=e)},get INTRADAY_UPDATE_CHUNK_MAX_WAIT(){return M},set INTRADAY_UPDATE_CHUNK_MAX_WAIT(e){w(e)&&(M=e)},get INTRADAY_UPDATE_RETRY_COUNT(){return x},set INTRADAY_UPDATE_RETRY_COUNT(e){w(e)&&(x=e)},get INTRADAY_UPDATE_RETRY_DELAY(){return z},set INTRADAY_UPDATE_RETRY_DELAY(e){w(e)&&(z=e)},get INTRADAY_UPDATE_SERVERS(){return F},set INTRADAY_UPDATE_SERVERS(e){Array.isArray(e)&&!e.some((e=>!Number.isInteger(e)))&&(F=e)},itdGroupCols:[["price",["time","last","close","open","high","low","count","volume","value","discarded"]],["order",["time","row","askcount","askvol","askprice","bidprice","bidvol","bidcount"]],["trade",["time","count","volume","price","discarded"]],["client",["pbvol","pbcount","pbval","pbprice","pbvolpot","psvol","pscount","psval","psprice","psvolpot","lbvol","lbcount","lbval","lbprice","lbvolpot","lsvol","lscount","lsval","lsprice","lsvolpot","lpchg"]],["misc",["basevol","flow","daymin","daymax","state"]],["shareholder",["shares","sharespot","change","companycode","companyname"]]]};e?(Object.defineProperty(B,"CACHE_DIR",{get:()=>i.CACHE_DIR,set:e=>i.CACHE_DIR=e}),module.exports=B):t&&(window.tse=B)}();
!function(){const e=function(){return"undefined"!=typeof global&&this===global}(),t=function(){return"undefined"!=typeof window&&this===window}(),s=e?require("node-fetch"):t?window.fetch:void 0,n=e?require("big.js"):t?window.Big:void 0,r=e?require("jalaali-js"):t?window.jalaali:void 0;if(t){if(!n)throw new Error("Cannot find required dependency: Big");if(!localforage)throw new Error("Cannot find required dependency: localforage")}const i=function(){let s;if(e){const{readFileSync:e,writeFileSync:t,existsSync:n,mkdirSync:r,statSync:i,readdirSync:a}=require("fs"),{join:o}=require("path"),{gzip:l,gunzip:c}=require("zlib");let p;const u=require("os").homedir(),m=o(u,"tse-cache"),d=o(u,".tse");if(n(d)){p=e(d,"utf8");try{i(p).isDirectory()}catch{p=m}}else p=m,n(p)||r(p,{recursive:!0}),t(d,p);const f=(s,r=!1)=>new Promise(((i,a)=>{const l=(s=s.replace("tse.","")).startsWith("prices.")?o(p,"prices"):p,u=o(l,`${s}.csv`+(r?".gz":""));if(!n(u))return t(u,""),void i("");const m=e(u,r?void 0:"utf8");i(r?c(m).toString():m)})),h=(e,s,n=!1)=>new Promise(((r,i)=>{e=e.replace("tse.","");let a=p;e.startsWith("prices.")&&(a=o(p,"prices"),e=e.replace("prices.",""));const c=o(a,`${e}.csv`+(n?".gz":""));t(c,n?l(s):s),r()}));s={getItem:s=>{const r=(s=s.replace("tse.","")).startsWith("prices.")?o(p,"prices"):p,i=o(r,`${s}.csv`);return n(i)||t(i,""),e(i,"utf8")},setItem:(e,s)=>{const n=(e=e.replace("tse.","")).startsWith("prices.")?o(p,"prices"):p;t(o(n,`${e}.csv`),s)},getItemAsync:f,setItemAsync:h,getItems:async function(t=new Set,s={}){const i=o(p,"prices");n(i)||r(i);for(const n of a(i)){const r=n.replace(".csv","");t.has(r)&&(s[r]=e(o(i,n),"utf8"))}},get CACHE_DIR(){return p},set CACHE_DIR(e){"string"==typeof e&&(n(e)||r(e,{recursive:!0}),i(e).isDirectory()&&(p=e,t(d,p)))},itd:{getItems:async function(t=new Set,s=!1){const l=o(p,"intraday");n(l)||r(l);const c=a(l).filter((e=>i(o(l,e)).isDirectory()&&t.has(e)));let u;return u=s?c.map((t=>{const s=a(o(l,t)).map((s=>{const n=".gz"===s.slice(-3);return[n?s.slice(0,-3):s,e(o(l,t,s),n?null:"utf8")]}));return[t,Object.fromEntries(s)]})):c.map((e=>{const t=a(o(l,e)).map((e=>[".gz"===e.slice(-3)?e.slice(0,-3):e,!0]));return[e,Object.fromEntries(t)]})),Object.fromEntries(u)},setItem:async function(e,s){e=e.replace("tse.","");const i=o(p,"intraday"),a=o(i,e);n(a)||r(a),Object.keys(s).forEach((e=>{const n=s[e];t(o(a,e+("N/A"===n?"":".gz")),s[e])}))}}}}else if(t){const e=window.pako||void 0,t=localforage.createInstance({name:"tse.prices"}),n=async(s,n=!1)=>{let r=localforage;s.startsWith("tse.prices.")&&(s=s.replace("prices.",""),r=t);const i=await r.getItem(s);return i?e&&n?e.ungzip(i,{to:"string"}):i:""},r=async(s,n,r=!1)=>{let i=localforage;if(s.startsWith("tse.prices.")&&(s=s.replace("tse.prices.",""),i=t),!e)return void await i.setItem(s,n);const a=r?e.gzip(n):n;await i.setItem(s,a)},i=async function(e=new Set,s={}){await t.iterate(((t,n)=>{let r=n.replace("tse.","");e.has(r)&&(s[r]=t)}))},a=localforage.createInstance({name:"tse.intraday"}),o=async(t,s,n=!1)=>{if(!e)return void await a.setItem(t,s);const r=n?e.gzip(s):s;await a.setItem(t,r)};s={getItem:e=>localStorage.getItem(e)||"",setItem:(e,t)=>localStorage.setItem(e,t),getItemAsync:n,setItemAsync:r,getItems:i,itd:{getItems:async function(e=new Set,t=!1){const s={};return t?await a.iterate(((t,n)=>{e.has(n)&&(s[n]=t)})):await a.iterate(((t,n)=>{e.has(n)&&(s[n]=Object.keys(t).reduce(((e,t)=>(e[t]=!0,e)),{}))})),s},setItem:o}}}return s}();let a="http://service.tsetmc.com/tsev2/data/TseClient2.aspx";const o={Instrument(e){const t={t:"Instrument",a:""+e};return this.makeRequest(t)},InstrumentAndShare(e,t=0){const s={t:"InstrumentAndShare",a:""+e,a2:""+t};return this.makeRequest(s)},LastPossibleDeven(){return this.makeRequest({t:"LastPossibleDeven"})},ClosingPrices(e){const t={t:"ClosingPrices",a:""+e};return this.makeRequest(t)},makeRequest(e){const t=new URL(a);return t.search=new URLSearchParams(e).toString(),new Promise(((e,n)=>{s(t).then((async t=>{200===t.status?e(await t.text()):n(t.status+" "+t.statusText)})).catch((e=>n(e)))}))}};class l{constructor(e=""){const t=e.split(",");if(11!==t.length)throw new Error("Invalid ClosingPrice data!");this.InsCode=t[0],this.DEven=t[1],this.PClosing=t[2],this.PDrCotVal=t[3],this.ZTotTran=t[4],this.QTotTran5J=t[5],this.QTotCap=t[6],this.PriceMin=t[7],this.PriceMax=t[8],this.PriceYesterday=t[9],this.PriceFirst=t[10]}}const c=["date","dateshamsi","open","high","low","last","close","vol","count","value","yesterday","symbol","name","namelatin","companycode"],p=["تاریخ میلادی","تاریخ شمسی","اولین قیمت","بیشترین قیمت","کمترین قیمت","آخرین قیمت","قیمت پایانی","حجم معاملات","تعداد معاملات","ارزش معاملات","قیمت پایانی دیروز","نماد","نام","نام لاتین","کد شرکت"];class u{constructor(e=[]){const t=e.length;if(t>2||t<1)throw new Error("Invalid Column data!");this.name=c[e[0]],this.fname=p[e[0]],this.header=e[1]}}class m{constructor(e=""){const t=e.split(",");if(![18,19].includes(t.length))throw new Error("Invalid Instrument data!");this.InsCode=t[0],this.InstrumentID=t[1],this.LatinSymbol=t[2],this.LatinName=t[3],this.CompanyCode=t[4],this.Symbol=I(t[5]).trim(),this.Name=t[6],this.CIsin=t[7],this.DEven=t[8],this.Flow=t[9],this.LSoc30=t[10],this.CGdSVal=t[11],this.CGrValCot=t[12],this.YMarNSC=t[13],this.CComVal=t[14],this.CSecVal=t[15],this.CSoSecVal=t[16],this.YVal=t[17],t[18]&&(this.SymbolOriginal=I(t[18]).trim())}}class d{constructor(e=""){const t=e.split(",");if(11!==t.length)throw new Error("Invalid InstrumentITD data!");this.InsCode=t[0],this.LVal30=I(t[1]),this.LVal18AFC=I(t[2]),this.FlowTitle=I(t[3]),this.CGrValCotTitle=I(t[4]),this.Flow=t[5],this.CGrValCot=t[6],this.CIsin=t[7],this.InstrumentID=t[8],this.ZTitad=t[9],this.BaseVol=t[10]}}class f{constructor(e=""){const t=e.split(",");if(5!==t.length)throw new Error("Invalid Share data!");this.Idn=t[0],this.InsCode=t[1],this.DEven=t[2],this.NumberOfShareNew=parseInt(t[3]),this.NumberOfShareOld=parseInt(t[4])}}function h(e=!1,t=!1,s="InsCode",n=!1){let r=i.getItem("tse.instruments"+(n?".intraday":""));r=r?r.split("\n"):[];const a=t?[]:{},o=n?d:m;for(const n of r){const r=e?new o(n):n;if(t)a.push(r);else{a[e?r[s]:n.split(",",1)[0]]=r}}return a}function g(e=!1,t=!0){let s=i.getItem("tse.shares");s=s?s.split("\n"):[];const n=t?[]:{};for(const r of s){const s=e?new f(r):r;if(t)n.push(s);else{const t=e?s.InsCode:r.split(",",2)[1];n[t]||(n[t]=[]),n[t].push(s)}}return n}function y(e){return 1e4*e.getFullYear()+100*(e.getMonth()+1)+e.getDate()+""}function I(e){return e.replace(/\u200B/g,"").replace(/\s?\u200C\s?/g," ").replace(/\u200D/g,"").replace(/\uFEFF/g,"").replace(/ك/g,"ک").replace(/ي/g,"ی")}function v(e){return"[object Object]"===Object.prototype.toString.call(e)}function w(e){return Number.isInteger(e)&&e>=0}let D=1,C=50,T=300,b=3,S=1e3;const A="merged",E={columns:[0,2,3,4,5,6,7,8,9],adjustPrices:0,daysWithoutTrade:!1,startDate:"20010321",mergeSimilarSymbols:!0,cache:!0,csv:!1,csvHeaders:!0,csvDelimiter:",",onprogress:void 0,progressTotal:100};let P={},j={};function _(e,t,s){const n=e;return"date"===n?s.DEven:"dateshamsi"===n?r&&function(e){const{jy:t,jm:s,jd:n}=r.toJalaali(+e.slice(0,4),+e.slice(4,6),+e.slice(6,8));return 1e4*t+100*s+n+""}(s.DEven):"open"===n?s.PriceFirst:"high"===n?s.PriceMax:"low"===n?s.PriceMin:"last"===n?s.PDrCotVal:"close"===n?s.PClosing:"vol"===n?s.QTotTran5J:"count"===n?s.ZTotTran:"value"===n?s.QTotCap:"yesterday"===n?s.PriceYesterday:"symbol"===n?t.Symbol:"name"===n?t.Name:"namelatin"===n?t.LatinName:"companycode"===n?t.CompanyCode:""}function R(e="",t){if(!e||"0"===e)return!0;const s=new Date,n=y(s),r=function(e,t){const s=+new Date(+e.slice(0,4),+e.slice(4,6)-1,+e.slice(6,8)),n=+new Date(+t.slice(0,4),+t.slice(4,6)-1,+t.slice(6,8)),r=Math.abs(n-s);return Math.ceil(r/864e5)}(t,e),i=[4,5].includes(s.getDay()),a=(o=t,new Date(+o.slice(0,4),+o.slice(4,6)-1,+o.slice(6,8))).getDay();var o;return r>=D&&(n!==t||s.getHours()>16)&&!(i&&3!==a&&r<=3)}async function O(){let e,t;const s=i.getItem("tse.lastPossibleDevens");s&&([e,t]=s.split(","));const n=y(new Date);if(!s||R(n,e)||R(n,t)){let s;const n=await o.LastPossibleDeven().catch((e=>s=e));if(s)return{title:"Failed request: LastPossibleDeven",detail:s};if(!/^\d{8};\d{8}$/.test(n))return{title:"Invalid server response: LastPossibleDeven"};const r=n.split(";");i.setItem("tse.lastPossibleDevens",r.join(",")),[e,t]=r}return[e,t]}async function N(){let e,t,s,n;if(i.getItem("tse.lastInstrumentUpdate")){s=h(),n=g();const r=Object.keys(s).map((e=>+s[e].split(",",9)[8])),i=n.map((e=>+e.split(",",1)[0]));e=Math.max(...r),t=Math.max(...i)}else e=0,t=0;const r=await O();if(v(r))return r;const a=""+e,[l,c]=r;if(!R(a,l)&&!R(a,c))return;let p;const u=await o.InstrumentAndShare(+y(new Date),t).catch((e=>p=e));if(p)return{title:"Failed request: InstrumentAndShare",detail:p};let m=u.split("@")[1];p=0;let d=await o.Instrument(e).catch((e=>p=e));if(p)return{title:"Failed request: Instrument",detail:p};if(""!==d&&"*"!==d){let e;if(s){let t=Object.fromEntries(Object.keys(s).map((e=>(19===(e=s[e].split(",")).length&&(e[5]=e[18],e.pop()),[e[0],e.join(",")]))));d.split(";").forEach(((e,s)=>(s=e.split(",",1)[0],t[s]=e))),e=Object.keys(t).map((e=>t[e].split(",")))}else e=d.split(";").map((e=>e.split(",")));let t=[...e.map((e=>((e=[...e])[5]=I(e[5]).trim(),e)))],n=[...new Set(t.map((e=>e[5])).filter(((e,t,s)=>s.indexOf(e)!==t)))].map((e=>t.filter((t=>t[5]===e)))),r=new Map(e.map(((e,t)=>[e[0],t])));for(let t of n){t.sort(((e,t)=>+t[8]-e[8])).forEach(((t,s)=>{let n=r.get(t[0]),i=e[n][5];if(s>0){let e="-ق"+(s+1);t.push(i),t[5]=i.trim()+e}else t[5]=i}))}n.flat().forEach((t=>{let s=r.get(t[0]);e[s]=t})),d=e,r=void 0,t=void 0,e=void 0,s&&Object.keys(s).length?(d.forEach((e=>s[e[0]]=e.join(","))),d=Object.keys(s).map((e=>s[e])).join("\n")):d=d.map((e=>e.join(","))).join("\n"),i.setItem("tse.instruments",d)}""!==m&&(m=n&&n.length?n.concat(m.split(";")).join("\n"):m.replace(/;/g,"\n"),i.setItem("tse.shares",m)),(""!==d&&"*"!==d||""!==m)&&i.setItem("tse.lastInstrumentUpdate",y(new Date))}n.DP=40,n.RM=2;const U=function(){let e,t,s,r,a,l,c,p,u=0,m=[],d=[],f=0,h=[],g=new Map,y=[];function I(){if(g.size>0||e)setTimeout(I,200);else{if(m.length===u||f>=b){const e=[...m],s=[...d];return m=[],d=[],void Promise.all(y).then((()=>{y=[],t({succs:e,fails:s,pn:r})}))}if(h.length){const t=h.flat().map((e=>e[0]));d=d.filter((e=>-1===t.indexOf(e))),f++,e=setTimeout(D,S,h),h=[],setTimeout(I,S)}}}function v(e,t,a){const o=t.map((([e])=>e));if("string"!=typeof e||!/^[\d.,;@-]+$/.test(e)&&""!==e)d.push(...o),h.push(t);else{const a=e.replace(/;/g,"\n").split("@").map(((e,s)=>[t[s][0],e]));for(const[e,t]of a)if(m.push(e),t){const s=j[e],n=s?s+"\n"+t:t;j[e]=n,P[e]=t.split("\n").slice(-1)[0].split(",",2)[1],y.push(p&&i.setItemAsync("tse.prices."+e,n))}if(d=d.filter((e=>-1===o.indexOf(e))),s){const e=l.div(b+2).mul(f+1);s(r=+n(r).plus(l.sub(e)))}}g.delete(a)}function w(e=[],t){const i=e.map((e=>e.join(","))).join(";");o.ClosingPrices(i).then((s=>v(s,e,t))).catch((()=>v(void 0,e,t))),s&&s(r=+n(r).plus(c))}function D(t=[]){e&&(e=void 0);const s=t.map(((e,t)=>"a"+t));for(let e=0,n=0,r=t.length;e<r;e++,n+=T){const r=s[e],i=setTimeout(w,n,t[e],r);g.set(r,i)}}return function(i=[],o,y={}){var v,w;return p=o,({pf:s,pn:r,ptot:a}=y),u=i.length,l=a.div(Math.ceil(n(u).div(C))),c=l.div(b+2),m=[],d=[],f=0,h=[],g=new Map,e=void 0,D((w=C,(v=i).map(((e,t)=>t%w==0?v.slice(t,t+w):void 0)).filter((e=>e)))),I(),new Promise((e=>t=e))}}();async function k(e=[],t,{pf:s,pn:r,ptot:a}={}){P=i.getItem("tse.inscode_lastdeven");let o=new Set;if(P){const e=P.split("\n").map((e=>e.split(",")));P=Object.fromEntries(e),o=new Set(Object.keys(P))}else P={};let l={succs:[],fails:[],error:void 0,pn:r};const c=+n(r).plus(a),p=await O();if(v(p))return l.error=p,s&&s(r=c),l;const[u,m]=p,{startDate:d}=E,f=e.map((e=>{const{InsCode:t,YMarNSC:s}=e,n="NO"===s?0:1;if(!o.has(t))return[t,d,n];{const e=P[t];if(!e)return;if(R(e,"NO"!==s?m:u))return[t,e,n]}})).filter((e=>e));s&&s(r=+n(r).plus(a.mul(.01)));const h=new Set(e.map((e=>e.InsCode))),g=new Set(Object.keys(j));if(g.size&&![...h].find((e=>!g.has(e)))||await i.getItems(h,j),s&&s(r=+n(r).plus(a.mul(.01))),f.length){const e=await U(f,t,{pf:s,pn:r,ptot:a.sub(a.mul(.02))}),{succs:n,fails:o}=e;if(({pn:r}=e),n.length&&t){const e=Object.keys(P).map((e=>[e,P[e]].join(","))).join("\n");i.setItem("tse.inscode_lastdeven",e)}l={succs:n,fails:o}}return s&&r!==c&&s(r=c),l.pn=r,l}let Y=(e="",t="",s="")=>`http://${e>0?"cdn"+e+".":e<0?"":"cdn."}tsetmc.com/Loader.aspx?ParTree=15131P&i=${t}&d=${s}`,L=100,M=6e4,x=3,z=1e3,F=[-1,0];const q={startDate:"20010321",endDate:"",cache:!0,gzip:!0,reUpdateNoTrades:!1,updateOnly:!1,onprogress:void 0,progressTotal:100,chunkDelay:L,chunkMaxWait:M,retryCount:x,retryDelay:z,servers:F};let V,H,W={};if(e){const{gzipSync:e,gunzipSync:t}=require("zlib");V=t=>e(t),H=e=>t(e).toString()}else if(t){const{gzip:e,ungzip:t}=window.pako||{};V=t=>e(t),H=e=>t(e,{to:"string"})}function $(e,t={}){for(let[s,n]of e)"[object Map]"===Map.prototype.toString.call(n)||Array.isArray(n)?t[s]=$(n,t[s]):t[s]=n;return t}function K(e,t){let s=t.split(e)[1].split("];",1)[0];return s="["+s.replace(/'/g,'"')+"]",JSON.parse(s)}async function Q(e="",t=[],s){W[e]||(W[e]={});let n=W[e];for(let[e,s]of t){if("N/A"===s){n[e]=s;continue}let t,r=K("var ClosingPriceData=[",s),i=K("var BestLimitData=[",s),a=K("var IntraTradeData=[",s),o=K("var ClientTypeData=[",s),l=K("var InstrumentStateData=[",s),c=K("var StaticTreshholdData=[",s),p=K("var InstSimpleData=[",s),u=K("var ShareHolderData=[",s);t=[12,2,3,4,6,7,8,9,10,11];let m=r.map((e=>t.map((t=>e[t])).join(","))).join("\n");t=[0,1,2,3,4,5,6,7];let d=i.map((e=>t.map((t=>e[t])).join(","))).join("\n");t=[1,0,2,3,4];let f=a.map((e=>{let[s,n,r]=e[1].split(":"),i=1e4*+s+100*+n+ +r+"";return e[1]=i,t.map((t=>e[t]))})).sort(((e,t)=>+e[0]-t[0])).map((e=>e.join(","))).join("\n");t=[4,0,12,16,8,6,2,14,18,10,5,1,13,17,9,7,3,15,19,11,20];let h,g,y=t.map((e=>o[e])).join(","),[v,w]=[l,c],D=v.length&&v[0].length?v[0][2]:"";w.length&&w[1].length&&(h=w[1][2],g=w[1][1]);let[C,T]=[4,9].map((e=>p[e])),b=[T,C,h,g,D].join(",");t=[2,3,4,0,5];let S=u.filter((e=>e[4])).map((e=>(e[4]={ArrowUp:"+",ArrowDown:"-"}[e[4]],e[5]=I(e[5]),t.map((t=>e[t])).join(",")))).join("\n"),A=[m,d,f,y,b];S&&A.push(S),n[e]=V(A.join("\n\n"))}let r=n,a=Object.keys(r).filter((e=>!0!==r[e])).reduce(((e,t)=>(e[t]=r[t],e)),{});if(s)return i.itd.setItem(e,a)}const J=function(){let e,r,a,o,l,c,p,u,m,d,f,g,y={},I=0,v=[],w=[],D=0,C=[],T=new Map,b=-1,S=[],A={},E={};function P(){if(T.size>0||b)setTimeout(P,200);else{if(v.length===I||D>=o){let s=[...v],n=[...w.map((e=>e.slice(1)))];v=[],w=[],t&&(y={});let r=h(!1,!1,void 0,!0);return r={...r,...E},r=Object.keys(r).map((e=>r[e])).join("\n"),i.setItem("tse.instruments.intraday",r),A={},E={},void Promise.all(S).then((()=>{S=[],e({succs:s,fails:n})}))}if(C.length){let e=C.map((e=>e.join("")));w=w.filter((t=>-1===e.indexOf(t.join("")))),D++,C.forEach((e=>{return e[0]=(t=e[0],t=c.indexOf(t)+1,c[t<c.length?t:0]);var t})),b=setTimeout(R,l,C,!0),C=[],setTimeout(P,l)}}}function j(e,s,r){if("string"==typeof e){let r=e;if("N/A"!==e){let t="var InstSimpleData"+e.split("var InstSimpleData")[1].split(";")[0]+";",s="var StaticTreshholdData"+e.split("var StaticTreshholdData")[1];r=t.replace(/\t/g,"\\t")+s}let i=s.slice(1);v.push(i);let[a,l]=i;if(l===A[a]&&"N/A"!==e){let e=JSON.parse(r.split("var InstSimpleData=")[1].split(";")[0].replace(/'/g,'"'));E[a]=[a,...e].join(",")}if(t){let e=y[a];if(e[l]=r,!Object.keys(e).find((t=>!e[t]))){let t=Object.keys(e).map((t=>[t,e[t]]));S.push(Q(a,t,p))}}else S.push(Q(a,[[l,r]],p));if(w=w.filter((e=>e.join()!==s.join())),u){let e=f.div(o+2).mul(D+1);u(m=+n(m).plus(f.sub(e)))}}else w.push(s),C.push(s);T.delete(r)}async function _(e=[],t){let r,i,[o,l,c]=e;"undefined"!=typeof AbortController&&(r=new AbortController,i=r.signal),s(Y(o,l,c),i?{signal:i}:void 0).then((async s=>{let{status:n}=s;if(200===n){let n=await s.text();if(n.includes('Object moved to <a href="/GeneralError.aspx?aspxerrorpath=/Loader.aspx">here</a>'))j("N/A",e,t);else{let s=n.split("var StaticTreshholdData")[1];j(["ClosingPrice","IntraDayPrice","IntraTrade","ClientType","BestLimit"].some((e=>s.split(`var ${e}Data=[`)[1].split("];")[0]))?n:void 0,e,t)}}else j(void 0,e,t)})).catch((()=>j(void 0,e,t))),r&&setTimeout((()=>r.abort()),a),u&&u(m=+n(m).plus(g))}function R(e=[]){b&&(b=void 0);let t=e.map(((e,t)=>"a"+t));for(let s=0,n=0,i=e.length;s<i;s++,n+=r){let r=t[s],i=setTimeout(_,n,e[s],r);T.set(r,i)}}return async function(s,n,i){({chunkDelay:r,chunkMaxWait:a,retryCount:o,retryDelay:l,servers:c,shouldCache:p}=n),({pf:u,pn:m,ptot:d}=i),t&&(y=$(s.map((([e,t])=>[e,t.map((e=>[e,void 0]))]))));let h=[...s].reduce(((e,[t,s])=>[...e,...s?s.map((e=>[c[0],t,""+e])):[]]),[]);return I=h.length,f=d.div(I),g=f.div(o+2),v=[],w=[],D=0,C=[],T=new Map,b=void 0,S=[],A=$(s.map((([e,t])=>[e,""+t[t.length-1]]))),E={},R(h),P(),new Promise((t=>e=t))}}();const B={getPrices:async function(e=[],t={}){if(!e.length)return;const s={...E,...t},r={data:[],error:void 0};let{onprogress:i,progressTotal:a}=s;"function"!=typeof i&&(i=void 0),"number"!=typeof a&&(a=E.progressTotal);let o=0;a=n(a);const c=await N();if(i&&i(o=+n(o).plus(a.mul(.01))),c){const{title:e,detail:t}=c;return r.error={code:1,title:e,detail:t},i&&i(+a),r}const p=h(!0,void 0,"Symbol"),m=e.map((e=>p[e])),d=e.filter(((e,t)=>!m[t]));if(i&&i(o=+n(o).plus(a.mul(.01))),d.length)return r.error={code:2,title:"Incorrect Symbol",symbols:d},i&&i(+a),r;const{mergeSimilarSymbols:f}=s;let y=new Map,I=-1;if(f){const e=Object.keys(p).map((e=>p[e])),t=new Set(e.filter((e=>e.SymbolOriginal)).map((e=>e.SymbolOriginal)));y=new Map([...t].map((e=>[e,[]]))),e.forEach(((e,t)=>{const{SymbolOriginal:s,Symbol:n,InsCode:r}=e,i=s||n;if(!y.has(i))return;const a=new RegExp("-ق(\\d+)");y.get(i).push({sym:n,code:r,order:s?+n.match(a)[1]:1})})),[...y].forEach((([,e])=>e.sort(((e,t)=>e.order-t.order))));const s=new Set(m.map((e=>e.Symbol))),n=m.map((({Symbol:e})=>!s.has(e)&&y.has(e)&&y.get(e).slice(1).map((e=>p[e.sym])))).flat().filter((e=>e));n.length&&(I=m.length,m.push(...n))}const v=await k(m,s.cache,{pf:i,pn:o,ptot:a.mul(.78)}),{succs:w,fails:D,error:C}=v;if(({pn:o}=v),C){const{title:e,detail:t}=C;return r.error={code:1,title:e,detail:t},i&&i(+a),r}if(D.length){const e=Object.fromEntries(m.map((e=>[e.InsCode,e.Symbol])));r.error={code:3,title:"Incomplete Price Update",fails:D.map((t=>e[t])),succs:w.map((t=>e[t]))},m.forEach(((e,t,s)=>D.includes(e.InsCode)?s[t]=void 0:0))}f&&I>-1&&m.splice(I);const T=s.columns.map((e=>{const t=Array.isArray(e)?e:[e],s=new u(t),n=s.header||s.name;return{...s,header:n}})),{adjustPrices:b,daysWithoutTrade:S,startDate:P,csv:R}=s,O=g(!0),U=n(a).mul(.2).div(m.length),Y={};if(f)for(const[,e]of[...y]){const t=e.map((e=>e.code)),[s]=t;Y[s]=t.map((e=>j[e])).reverse().filter((e=>e)).join("\n")}const L=e=>{const{InsCode:t,Symbol:s,SymbolOriginal:r}=e;let i,a;if(r){if(f)return A;i=j[t],a=new Set([t])}else{const e=y.has(s);i=e?Y[t]:j[t],a=new Set(e?y.get(s).map((e=>e.code)):[t])}if(i){if(i=i.split("\n").map((e=>new l(e))),1===b||2===b){const e=new Map(O.filter((e=>a.has(e.InsCode))).map((e=>[e.DEven,e])));i=function(e,t,s){const r=t,i=t.length,a=[];let o=r;if((1===e||2===e)&&i>1){let t=new n("0.0"),l=new n("1.0");if(a.push(r[i-1]),1===e)for(let e=i-2;e>=0;e-=1){const[s,i]=[r[e],r[e+1]];n(s.PClosing).eq(i.PriceYesterday)||s.InsCode!==i.InsCode||(t=t.plus(1))}const c=t.div(i).lt("0.08");if(1===e&&c||2===e){for(let t=i-2;t>=0;t-=1){const[i,o]=[r[t],r[t+1]],c=!n(i.PClosing).eq(o.PriceYesterday)&&i.InsCode===o.InsCode,p=s.get(o.DEven);if(1===e&&c)l=l.times(o.PriceYesterday).div(i.PClosing);else if(2===e&&c&&p){const e=p.NumberOfShareOld,t=p.NumberOfShareNew;l=l.times(e).div(t)}let u=l.times(i.PClosing).round(2).toFixed(2),m=l.times(i.PDrCotVal).round(2).toFixed(2),d=l.times(i.PriceMin).round().toString(),f=l.times(i.PriceMax).round().toString(),h=l.times(i.PriceYesterday).round().toString(),g=l.times(i.PriceFirst).round(2).toFixed(2);const y={InsCode:i.InsCode,DEven:i.DEven,PClosing:u,PDrCotVal:m,ZTotTran:i.ZTotTran,QTotTran5J:i.QTotTran5J,QTotCap:i.QTotCap,PriceMin:d,PriceMax:f,PriceYesterday:h,PriceFirst:g};a.push(y)}o=a.reverse()}}return o}(b,i,e)}return S||(i=i.filter((e=>+e.ZTotTran>0))),i=i.filter((e=>+e.DEven>+P)),i}};if(R){const{csvHeaders:e,csvDelimiter:t}=s,a=e?T.map((e=>e.header)).join()+"\n":"";r.data=m.map((e=>{if(!e)return;let s=a;const r=L(e);return r?r===A?r:(s+=r.map((s=>T.map((t=>_(t.name,e,s))).join(t))).join("\n"),i&&i(o=+n(o).plus(U)),s):s}))}else{const e=new Set(["CompanyCode","LatinName","Symbol","Name"]);r.data=m.map((t=>{if(!t)return;const s=Object.fromEntries(T.map((e=>[e.header,[]]))),r=L(t);if(!r)return s;if(r===A)return r;for(const n of r)for(const{header:r,name:i}of T){const a=_(i,t,n);s[r].push(e.has(i)?a:parseFloat(a))}return i&&i(o=+n(o).plus(U)),s}))}return i&&o!==a&&i(o=a),r},getInstruments:async function(e=!0,t=!0,s="InsCode"){-1===Object.keys(new m([...Array(18).keys()].join(","))).indexOf(s)&&(s="InsCode");const n=i.getItem("tse.lastInstrumentUpdate"),r=await N();if(r&&!n)throw r;return h(e,t,s)},get API_URL(){return a},set API_URL(e){if("string"!=typeof e)return;let t;try{new URL(e)}catch(e){throw t=!0,e}t||(a=e)},get UPDATE_INTERVAL(){return D},set UPDATE_INTERVAL(e){w(e)&&(D=e)},get PRICES_UPDATE_CHUNK(){return C},set PRICES_UPDATE_CHUNK(e){Number.isInteger(e)&&e>0&&e<60&&(C=e)},get PRICES_UPDATE_CHUNK_DELAY(){return T},set PRICES_UPDATE_CHUNK_DELAY(e){w(e)&&(T=e)},get PRICES_UPDATE_RETRY_COUNT(){return b},set PRICES_UPDATE_RETRY_COUNT(e){w(e)&&(b=e)},get PRICES_UPDATE_RETRY_DELAY(){return S},set PRICES_UPDATE_RETRY_DELAY(e){w(e)&&(S=e)},get columnList(){return[...Array(15)].map(((e,t)=>({name:c[t],fname:p[t]})))},getIntraday:async function(e=[],t={}){if(!e.length)return;const s={...q,...t},r={data:[],error:void 0};let{onprogress:a,progressTotal:o}=s;"function"!=typeof a&&(a=void 0),"number"!=typeof o&&(o=q.progressTotal);let l=0;o=n(o);const c=await N();if(a&&a(l=+n(l).plus(o.mul(.01))),c){const{title:e,detail:t}=c;return r.error={code:1,title:e,detail:t},a&&a(+o),r}const p=h(!0,void 0,"Symbol"),u=e.map((e=>p[e])),m=e.filter(((e,t)=>!u[t]));if(a&&a(l=+n(l).plus(o.mul(.01))),m.length)return r.error={code:2,title:"Incorrect Symbol",symbols:m},a&&a(+o),r;const d=new Set(u.map((e=>e&&e.InsCode)));let f=await i.getItemAsync("tse.inscode_devens");f=f?f.split("\n").map((e=>e.split(";"))).map((([e,t])=>[e,t.split(",").map((e=>+e))])):[];const g=new Set(f.map((e=>e[0]))),I=[...new Set(f.map((([,e])=>e[e.length-1])))],v=+s.endDate,w=v||+y(new Date),{cache:D}=s;if(!f.length||[...d].some((e=>!g.has(e)))||I.some((e=>e<w))){const e=await k(u,D,{pf:a,pn:l,ptot:o.mul(.1)}),{succs:t,fails:s,error:n}=e;if(({pn:l}=e),n){const{title:e,detail:t}=n;return r.error={code:1,title:e,detail:t},a&&a(+o),r}if(s.length){const e=Object.fromEntries(u.map((e=>[e.InsCode,e.Symbol])));r.error={code:3,title:"Incomplete Price Update",fails:s.map((t=>e[t])),succs:t.map((t=>e[t]))},u.forEach(((e,t,n)=>s.includes(e.InsCode)?n[t]=void 0:0))}if(f=Object.keys(j).map((e=>{const t=j[e];if(!t)return;return[e,t.split("\n").filter((e=>+e.split(",",5)[4]>0)).map((e=>+e.split(",",2)[1]))]})).filter((e=>e)),D){const e=f.map((([e,t])=>[e,t.join(",")].join(";"))).join("\n");await i.setItemAsync("tse.inscode_devens",e)}}f=Object.fromEntries(f),a&&a(l=+n(l).plus(o.mul(.01)));let C=+s.startDate,T=v?e=>e>=C&&e<=v:e=>e>=C,b=[...d].map((e=>{if(!e)return[];let t=f[e];return t?[e,t.filter(T)]:[e,[]]})),{reUpdateNoTrades:S,updateOnly:A}=s;W=await i.itd.getItems(d,!A||S);let E=b.map((([e,t])=>{if(!e||!t.length)return;if(!W[e])return[e,t];let s=S?t.filter((t=>{let s=W[e][t];if(!s)return!0;let[,,n]=H(s).split("\n\n");return!n})):t.filter((t=>!W[e][t]));return s.length?[e,s]:void 0})).filter((e=>e));a&&a(l=+n(l).plus(o.mul(.01)));let{chunkDelay:P,chunkMaxWait:_,retryCount:R,retryDelay:O,servers:U}=s;if(Array.isArray(U)&&!U.some((e=>!Number.isInteger(e)||e<0))||(U=q.servers),E.length>0){let{succs:e,fails:t}=await J(E,{shouldCache:D,chunkDelay:P,chunkMaxWait:_,retryCount:R,retryDelay:O,servers:U},{pf:a,pn:l,ptot:o.mul(.85)});if(t.length){let s=Object.fromEntries(u.map((e=>[e.InsCode,e.Symbol]))),n=(e,[t,n])=>(!e[s[t]]&&(e[s[t]]=[]),e[s[t]].push(n),e);r.error={code:4,title:"Incomplete Intraday Update",fails:t.reduce(n,{}),succs:e.reduce(n,{})}}}if(a&&a(l=+o.mul(.99)),!A){let{gzip:e}=s;r.data=b.map((([t,s])=>{let n=W[t];if(n)return e?s.map((e=>[e,n[e]])):s.map((e=>[e,n[e]&&"string"!=typeof n[e]?H(n[e]):n[e]]))}))}return a&&a(+o),r},getIntradayInstruments:async function(e=!0,t=!0,s="InsCode"){return-1===Object.keys(new d([...Array(11).keys()].join(","))).indexOf(s)&&(s="InsCode"),h(e,t,s,!0)},get INTRADAY_URL(){return Y},set INTRADAY_URL(e){if("function"!=typeof e)return;let t;try{new URL(e())}catch(e){throw t=!0,e}t||(Y=e)},get INTRADAY_UPDATE_CHUNK_DELAY(){return L},set INTRADAY_UPDATE_CHUNK_DELAY(e){w(e)&&(L=e)},get INTRADAY_UPDATE_CHUNK_MAX_WAIT(){return M},set INTRADAY_UPDATE_CHUNK_MAX_WAIT(e){w(e)&&(M=e)},get INTRADAY_UPDATE_RETRY_COUNT(){return x},set INTRADAY_UPDATE_RETRY_COUNT(e){w(e)&&(x=e)},get INTRADAY_UPDATE_RETRY_DELAY(){return z},set INTRADAY_UPDATE_RETRY_DELAY(e){w(e)&&(z=e)},get INTRADAY_UPDATE_SERVERS(){return F},set INTRADAY_UPDATE_SERVERS(e){Array.isArray(e)&&!e.some((e=>!Number.isInteger(e)))&&(F=e)},itdGroupCols:[["price",["time","last","close","open","high","low","count","volume","value","discarded"]],["order",["time","row","askcount","askvol","askprice","bidprice","bidvol","bidcount"]],["trade",["time","count","volume","price","discarded"]],["client",["pbvol","pbcount","pbval","pbprice","pbvolpot","psvol","pscount","psval","psprice","psvolpot","lbvol","lbcount","lbval","lbprice","lbvolpot","lsvol","lscount","lsval","lsprice","lsvolpot","lpchg"]],["misc",["basevol","flow","daymin","daymax","state"]],["shareholder",["shares","sharespot","change","companycode","companyname"]]]};e?(Object.defineProperty(B,"CACHE_DIR",{get:()=>i.CACHE_DIR,set:e=>i.CACHE_DIR=e}),module.exports=B):t&&(window.tse=B)}();

@@ -0,0 +0,0 @@ #!/usr/bin/env node

{
"name": "tse-client",
"version": "2.18.1",
"version": "2.18.2",
"description": "A client for fetching stock data from the Tehran Stock Exchange (TSETMC). Works in Browser, Node and as CLI.",

@@ -31,5 +31,5 @@ "main": "index.js",

"dependencies": {
"big.js": "^6.1.1",
"big.js": "^6.2.1",
"commander": "^8.3.0",
"jalaali-js": "^1.2.3",
"jalaali-js": "^1.2.6",
"localforage": "^1.10.0",

@@ -36,0 +36,0 @@ "node-fetch": "^2.6.7",

@@ -17,5 +17,5 @@ (function () {

if (isNode) {
const { existsSync, mkdirSync, readFileSync, writeFileSync, statSync, readdirSync } = require('fs');
const { readFileSync: read, writeFileSync: write, existsSync: exists, mkdirSync: mkdir, statSync: stat, readdirSync: readdir } = require('fs');
const { join } = require('path');
const { gzipSync, gunzipSync } = require('zlib');
const { gzip, gunzip } = require('zlib');

@@ -25,10 +25,10 @@ let datadir;

const defaultdir = join(home, 'tse-cache');
const pathfile = join(home, '.tse');
if ( existsSync(pathfile) ) {
datadir = readFileSync(pathfile, 'utf8');
try { statSync(datadir).isDirectory(); } catch { datadir = defaultdir; }
const tracker = join(home, '.tse');
if ( exists(tracker) ) {
datadir = read(tracker, 'utf8');
try { stat(datadir).isDirectory(); } catch { datadir = defaultdir; }
} else {
datadir = defaultdir;
if ( !existsSync(datadir) ) mkdirSync(datadir, {recursive: true});
writeFileSync(pathfile, datadir);
if ( !exists(datadir) ) mkdir(datadir, {recursive: true});
write(tracker, datadir);
}

@@ -40,4 +40,4 @@

const file = join(dir, `${key}.csv`);
if ( !existsSync(file) ) writeFileSync(file, '');
return readFileSync(file, 'utf8');
if ( !exists(file) ) write(file, '');
return read(file, 'utf8');
};

@@ -48,3 +48,3 @@

const dir = key.startsWith('prices.') ? join(datadir, 'prices') : datadir;
writeFileSync(join(dir, `${key}.csv`), value);
write(join(dir, `${key}.csv`), value);
};

@@ -56,9 +56,9 @@

const file = join(dir, `${key}.csv` + (zip?'.gz':''));
if ( !existsSync(file) ) {
writeFileSync(file, '');
if ( !exists(file) ) {
write(file, '');
done('');
return;
}
const content = readFileSync(file, zip?undefined:'utf8');
done(zip ? gunzipSync(content).toString() : content);
const content = read(file, zip?undefined:'utf8');
done(zip ? gunzip(content).toString() : content);
});

@@ -74,3 +74,3 @@

const file = join(dir, `${key}.csv` + (zip?'.gz':''));
writeFileSync(file, zip ? gzipSync(value) : value);
write(file, zip ? gzip(value) : value);
done();

@@ -81,7 +81,7 @@ });

const d = join(datadir, 'prices');
if (!existsSync(d)) mkdirSync(d);
for (const i of readdirSync(d)) {
if (!exists(d)) mkdir(d);
for (const i of readdir(d)) {
const key = i.replace('.csv','');
if ( !selins.has(key) ) continue;
result[key] = readFileSync(join(d,i),'utf8');
result[key] = read(join(d,i),'utf8');
}

@@ -92,10 +92,10 @@ };

const d = join(datadir, 'intraday');
if (!existsSync(d)) mkdirSync(d);
const dirs = readdirSync(d).filter( i => statSync(join(d,i)).isDirectory() && selins.has(i) );
if (!exists(d)) mkdir(d);
const dirs = readdir(d).filter( i => stat(join(d,i)).isDirectory() && selins.has(i) );
let result;
if (full) {
result = dirs.map(i => {
const files = readdirSync(join(d,i)).map(j => {
const files = readdir(join(d,i)).map(j => {
const z = j.slice(-3) === '.gz';
return [ z ? j.slice(0,-3) : j, readFileSync(join(d,i,j), z ? null : 'utf8') ];
return [ z ? j.slice(0,-3) : j, read(join(d,i,j), z ? null : 'utf8') ];
});

@@ -106,3 +106,3 @@ return [ i, Object.fromEntries(files) ];

result = dirs.map(i => {
const files = readdirSync(join(d,i)).map(j => {
const files = readdir(join(d,i)).map(j => {
const z = j.slice(-3) === '.gz';

@@ -120,7 +120,7 @@ return [z ? j.slice(0,-3) : j, true];

const dir = join(d, key);
if ( !existsSync(dir) ) mkdirSync(dir);
if ( !exists(dir) ) mkdir(dir);
Object.keys(obj).forEach(k => {
const cont = obj[k];
const filename = k + (cont === 'N/A' ? '': '.gz');
writeFileSync(join(dir, filename), obj[k]);
const filename = k + (cont==='N/A'?'':'.gz');
write(join(dir, filename), obj[k]);
});

@@ -134,6 +134,6 @@ };

if (typeof newdir === 'string') {
if ( !existsSync(newdir) ) mkdirSync(newdir, {recursive: true});
if ( statSync(newdir).isDirectory() ) {
if ( !exists(newdir) ) mkdir(newdir, {recursive: true});
if ( stat(newdir).isDirectory() ) {
datadir = newdir;
writeFileSync(pathfile, datadir);
write(tracker, datadir);
}

@@ -460,4 +460,3 @@ }

Big.RM = 2; // http://mikemcl.github.io/big.js/#rm
function adjust(cond, closingPrices, allShares, inscodes) {
const shares = new Map(allShares.filter(share => inscodes.has(share.InsCode)).map(i => [i.DEven, i]));
function adjust(cond, closingPrices, shares) {
const cp = closingPrices;

@@ -469,3 +468,3 @@ const len = closingPrices.length;

let gaps = new Big('0.0');
let num = new Big('1.0');
let coef = new Big('1.0');
adjustedClosingPrices.push( cp[len-1] );

@@ -480,3 +479,5 @@ if (cond === 1) {

}
if ( (cond === 1 && gaps.div(len).lt('0.08')) || cond === 2 ) {
const gapsToLifespanRatio = gaps.div(len);
const hasValidRatio = gapsToLifespanRatio.lt('0.08');
if ( (cond === 1 && hasValidRatio) || cond === 2 ) {
for (let i=len-2; i>=0; i-=1) {

@@ -488,16 +489,17 @@ const [curr, next] = [ cp[i], cp[i+1] ];

if (cond === 1 && pricesDontMatch) {
num = num.times(next.PriceYesterday).div(curr.PClosing);
coef = coef.times(next.PriceYesterday).div(curr.PClosing);
} else if (cond === 2 && pricesDontMatch && targetShare) {
const oldShares = targetShare.NumberOfShareOld;
const newShares = targetShare.NumberOfShareNew;
num = num.times(oldShares).div(newShares);
coef = coef.times(oldShares).div(newShares);
}
let
close = num.times(curr.PClosing).round(2).toFixed(2),
last = num.times(curr.PDrCotVal).round(2).toFixed(2),
low = num.times(curr.PriceMin).round().toString(),
high = num.times(curr.PriceMax).round().toString(),
yday = num.times(curr.PriceYesterday).round().toString(),
first = num.times(curr.PriceFirst).round(2).toFixed(2);
close = coef.times(curr.PClosing).round(2).toFixed(2),
last = coef.times(curr.PDrCotVal).round(2).toFixed(2),
low = coef.times(curr.PriceMin).round().toString(),
high = coef.times(curr.PriceMax).round().toString(),
yday = coef.times(curr.PriceYesterday).round().toString(),
first = coef.times(curr.PriceFirst).round(2).toFixed(2);
// note: the `toFixed()` calls are necessary and not redundant

@@ -882,3 +884,3 @@ const adjustedClosingPrice = {

if (succs.length && shouldCache) {
str = Object.keys(lastdevens).map(k => [k, lastdevens[k]].join(',')).join('\n');
const str = Object.keys(lastdevens).map(k => [k, lastdevens[k]].join(',')).join('\n');
storage.setItem('tse.inscode_lastdeven', str);

@@ -949,3 +951,6 @@ }

const selsyms = new Set(selection.map(i=> i.Symbol));
const extras = selection.map(({Symbol: sym}) =>
!selsyms.has(sym) &&
merges.has(sym) &&

@@ -955,4 +960,6 @@ merges.get(sym).slice(1).map(i => instruments[i.sym])

extrasIndex = selection.length;
selection.push(...extras);
if (extras.length) {
extrasIndex = selection.length;
selection.push(...extras);
}
}

@@ -980,3 +987,3 @@

if (mergeSimilarSymbols) selection.splice(extrasIndex);
if (mergeSimilarSymbols && extrasIndex > -1) selection.splice(extrasIndex);

@@ -991,3 +998,3 @@ const columns = settings.columns.map(i => {

const { adjustPrices, daysWithoutTrade, startDate, csv } = settings;
const shares = parseShares(true);
const allShares = parseShares(true);
const pi = Big(ptot).mul(0.20).div(selection.length);

@@ -1024,3 +1031,4 @@

if (adjustPrices === 1 || adjustPrices === 2) {
prices = adjust(adjustPrices, prices, shares, inscodes);
const relatedShares = new Map(allShares.filter(share => inscodes.has(share.InsCode)).map(i => [i.DEven, i]));
prices = adjust(adjustPrices, prices, relatedShares);
}

@@ -1027,0 +1035,0 @@

Sorry, the diff of this file is too big to display

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc