arelle-release 2.37.32__py3-none-any.whl → 2.37.33__py3-none-any.whl

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.

Potentially problematic release.


This version of arelle-release might be problematic. Click here for more details.

arelle/CntlrCmdLine.py CHANGED
@@ -634,7 +634,7 @@ class CntlrCmdLine(Cntlr.Cntlr):
634
634
  super().__init__(hasGui=False, uiLang=uiLang, disable_persistent_config=disable_persistent_config, logFileName=logFileName)
635
635
  self.preloadedPlugins = {}
636
636
 
637
- def run(self, options: RuntimeOptions, sourceZipStream=None, responseZipStream=None, sourceZipStreamFileName=None) -> bool:
637
+ def run(self, options: RuntimeOptions, sourceZipStream=None, responseZipStream=None) -> bool:
638
638
  """Process command line arguments or web service request, such as to load and validate an XBRL document, or start web server.
639
639
 
640
640
  When a web server has been requested, this method may be called multiple times, once for each web service (REST) request that requires processing.
@@ -998,7 +998,7 @@ class CntlrCmdLine(Cntlr.Cntlr):
998
998
  _entryPoints.append({"file":f})
999
999
  filesource = None # file source for all instances if not None
1000
1000
  if sourceZipStream:
1001
- filesource = FileSource.openFileSource(None, self, sourceZipStream=sourceZipStream, sourceZipStreamFileName=sourceZipStreamFileName)
1001
+ filesource = FileSource.openFileSource(None, self, sourceZipStream)
1002
1002
  elif len(_entryPoints) == 1 and "file" in _entryPoints[0]: # check if an archive and need to discover entry points (and not IXDS)
1003
1003
  entryPath = PackageManager.mappedUrl(_entryPoints[0]["file"])
1004
1004
  filesource = FileSource.openFileSource(entryPath, self, checkIfXmlIsEis=_checkIfXmlIsEis)
arelle/CntlrWebMain.py CHANGED
@@ -19,7 +19,7 @@ from bottle import Bottle, HTTPResponse, request, response, static_file # type:
19
19
 
20
20
  from arelle import Version
21
21
  from arelle.CntlrCmdLine import CntlrCmdLine
22
- from arelle.FileSource import FileNamedStringIO
22
+ from arelle.FileSource import FileNamedBytesIO, FileNamedStringIO
23
23
  from arelle.logging.formatters.LogFormatter import LogFormatter
24
24
  from arelle.logging.handlers.LogToBufferHandler import LogToBufferHandler
25
25
  from arelle.PluginManager import pluginClassMethods
@@ -263,19 +263,16 @@ def validation(file: str | None = None) -> str | bytes:
263
263
  isValidation = 'validation' == requestPathParts[-1] or 'validation' == requestPathParts[-2]
264
264
  view = request.query.view
265
265
  viewArcrole = request.query.viewArcrole
266
- sourceZipStreamFileName = None
267
266
  sourceZipStream = None
268
267
  if request.method == 'POST':
269
268
  mimeType = request.get_header("Content-Type")
270
269
  if mimeType and mimeType.startswith("multipart/form-data"):
271
270
  if upload := request.files.get("upload"):
272
- sourceZipStreamFileName = upload.filename
273
- sourceZipStream = upload.file
271
+ sourceZipStream = FileNamedBytesIO(upload.filename, upload.file.read())
274
272
  else:
275
273
  errors.append(_("POST 'multipart/form-data' request must include 'upload' part containing the XBRL file to process."))
276
274
  elif mimeType in ('application/zip', 'application/x-zip', 'application/x-zip-compressed', 'multipart/x-zip'):
277
- sourceZipStreamFileName = request.get_header("X-File-Name")
278
- sourceZipStream = request.body
275
+ sourceZipStream = FileNamedBytesIO(request.get_header("X-File-Name"), request.body.read())
279
276
  else:
280
277
  errors.append(_("POST request must provide an XBRL zip file to process. Content-Type '{0}' not recognized as a zip file.").format(mimeType))
281
278
  if not view and not viewArcrole:
@@ -349,14 +346,13 @@ def validation(file: str | None = None) -> str | bytes:
349
346
  viewFile = FileNamedStringIO(media)
350
347
  options.viewArcrole = viewArcrole
351
348
  options.viewFile = viewFile
352
- return runOptionsAndGetResult(options, media, viewFile, sourceZipStream, sourceZipStreamFileName)
349
+ return runOptionsAndGetResult(options, media, viewFile, sourceZipStream)
353
350
 
354
351
  def runOptionsAndGetResult(
355
352
  options: RuntimeOptions,
356
353
  media: str,
357
354
  viewFile: FileNamedStringIO | None,
358
- sourceZipStream: FileNamedStringIO | None = None,
359
- sourceZipStreamFileName: str | None = None,
355
+ sourceZipStream: FileNamedBytesIO | None = None,
360
356
  ) -> str | bytes:
361
357
  """Execute request according to options, for result in media, with *post*ed file in sourceZipStream, if any.
362
358
 
@@ -381,7 +377,7 @@ def runOptionsAndGetResult(
381
377
  else:
382
378
  responseZipStream = None
383
379
  cntlr = getCntlr()
384
- successful = cntlr.run(options, sourceZipStream, responseZipStream, sourceZipStreamFileName)
380
+ successful = cntlr.run(options, sourceZipStream, responseZipStream)
385
381
  if media == "xml":
386
382
  response.content_type = 'text/xml; charset=UTF-8'
387
383
  elif media == "csv":
arelle/FileSource.py CHANGED
@@ -13,7 +13,7 @@ import struct
13
13
  import tarfile
14
14
  import zipfile
15
15
  import zlib
16
- from typing import IO, TYPE_CHECKING, Any, Optional, TextIO, cast
16
+ from typing import IO, TYPE_CHECKING, Any, BinaryIO, Optional, TextIO, cast
17
17
 
18
18
  import regex as re
19
19
  from lxml import etree
@@ -44,15 +44,17 @@ TAXONOMY_PACKAGE_FILE_NAMES = ('.taxonomyPackage.xml', 'catalog.xml') # pre-PWD
44
44
  def openFileSource(
45
45
  filename: str | None,
46
46
  cntlr: Cntlr | None = None,
47
- sourceZipStream: str | None = None,
47
+ sourceZipStream: BinaryIO | FileNamedBytesIO | None = None,
48
48
  checkIfXmlIsEis: bool = False,
49
49
  reloadCache: bool = False,
50
50
  base: str | None = None,
51
51
  sourceFileSource: FileSource | None = None,
52
- sourceZipStreamFileName: str | None = None,
53
52
  ) -> FileSource:
54
53
  if sourceZipStream:
55
- sourceZipStreamFileName = os.sep + (sourceZipStreamFileName or "POSTupload.zip")
54
+ if isinstance(sourceZipStream, FileNamedBytesIO) and sourceZipStream.fileName:
55
+ sourceZipStreamFileName = os.sep + sourceZipStream.fileName
56
+ else:
57
+ sourceZipStreamFileName = os.sep + "POSTupload.zip"
56
58
  filesource = FileSource(sourceZipStreamFileName, cntlr)
57
59
  filesource.openZipStream(sourceZipStream)
58
60
  if filename:
@@ -390,7 +392,7 @@ class FileSource:
390
392
  assert self.taxonomyPackage is not None
391
393
  self.mappedPaths = cast('dict[str, str]', self.taxonomyPackage.get("remappings"))
392
394
 
393
- def openZipStream(self, sourceZipStream: str) -> None:
395
+ def openZipStream(self, sourceZipStream: BinaryIO) -> None:
394
396
  if not self.isOpen:
395
397
  assert isinstance(self.url, str)
396
398
  self.basefile = self.url
@@ -655,6 +657,30 @@ class FileSource:
655
657
  else:
656
658
  return openXmlFileStream(self.cntlr, filepath, stripDeclaration)
657
659
 
660
+ def getBytesSize(self) -> int | None:
661
+ """
662
+ Get the size of the zip file in bytes.
663
+ :return: Size of the zip file in bytes, or None if not applicable.
664
+ """
665
+ if isinstance(self.basefile, str) and os.path.isfile(self.basefile):
666
+ return os.path.getsize(self.basefile)
667
+ # ZipFile.fp is a private field, but is currently the simplest way for us to
668
+ # access the internal stream
669
+ if isinstance(self.fs, zipfile.ZipFile) and (fp := getattr(self.fs, 'fp')) is not None:
670
+ stream = cast(IO[Any], fp)
671
+ stream.seek(0, 2) # Move to the end of the file
672
+ return stream.tell() # Report the current position, which is the size of the file
673
+ return None
674
+
675
+ def getBytesSizeEstimate(self) -> int | None:
676
+ """
677
+ Get an estimated size of the zip file in bytes.
678
+ :return: Estimated size of the zip file in bytes, or None if not applicable.
679
+ """
680
+ if not isinstance(self.fs, zipfile.ZipFile):
681
+ return None
682
+ return sum(zi.compress_size for zi in self.fs.infolist())
683
+
658
684
  def exists(self, filepath: str) -> bool:
659
685
  archiveFileSource = self.fileSourceContainingFilepath(filepath)
660
686
  if archiveFileSource is not None:
arelle/_version.py CHANGED
@@ -17,5 +17,5 @@ __version__: str
17
17
  __version_tuple__: VERSION_TUPLE
18
18
  version_tuple: VERSION_TUPLE
19
19
 
20
- __version__ = version = '2.37.32'
21
- __version_tuple__ = version_tuple = (2, 37, 32)
20
+ __version__ = version = '2.37.33'
21
+ __version_tuple__ = version_tuple = (2, 37, 33)
arelle/api/Session.py CHANGED
@@ -12,6 +12,7 @@ from typing import Any, BinaryIO
12
12
 
13
13
  from arelle import PackageManager, PluginManager
14
14
  from arelle.CntlrCmdLine import CntlrCmdLine, createCntlrAndPreloadPlugins
15
+ from arelle.FileSource import FileNamedBytesIO
15
16
  from arelle.ModelXbrl import ModelXbrl
16
17
  from arelle.RuntimeOptions import RuntimeOptions
17
18
 
@@ -102,11 +103,10 @@ class Session:
102
103
  def run(
103
104
  self,
104
105
  options: RuntimeOptions,
105
- sourceZipStream: BinaryIO | None = None,
106
+ sourceZipStream: BinaryIO | FileNamedBytesIO | None = None,
106
107
  responseZipStream: BinaryIO | None = None,
107
108
  logHandler: logging.Handler | None = None,
108
109
  logFilters: list[logging.Filter] | None = None,
109
- sourceZipStreamFileName: str | None = None,
110
110
  ) -> bool:
111
111
  """
112
112
  Perform a run using the given options.
@@ -114,13 +114,10 @@ class Session:
114
114
  :param sourceZipStream: Optional stream to read source data from.
115
115
  :param responseZipStream: Options stream to write response data to.
116
116
  :param logHandler: Optional log handler to use for logging.
117
- :param sourceZipStreamFileName: Optional file name to use for the passed zip stream.
118
117
  :return: True if the run was successful, False otherwise.
119
118
  """
120
119
  with _session_lock:
121
120
  self._check_thread()
122
- if sourceZipStreamFileName is not None and sourceZipStream is None:
123
- raise ValueError("sourceZipStreamFileName may only be provided if sourceZipStream is not None.")
124
121
  PackageManager.reset()
125
122
  PluginManager.reset()
126
123
  if self._cntlr is None:
@@ -174,5 +171,4 @@ class Session:
174
171
  options,
175
172
  sourceZipStream=sourceZipStream,
176
173
  responseZipStream=responseZipStream,
177
- sourceZipStreamFileName=sourceZipStreamFileName,
178
174
  )
arelle/oim/Load.py CHANGED
@@ -1532,7 +1532,7 @@ def _loadFromOIM(cntlr, error, warning, modelXbrl, oimFile, mappedUri):
1532
1532
  hasRowError = True
1533
1533
  elif propGrpColValue in propGrpObjects:
1534
1534
  rowPropGroups[propGrpName] = propGrpObjects[propGrpColValue]
1535
- else:
1535
+ elif propGrpColValue is not EMPTY_CELL:
1536
1536
  error("xbrlce:unknownPropertyGroup",
1537
1537
  _("Table %(table)s unknown property group row %(row)s column %(column)s group %(propertyGroup)s, url: %(url)s"),
1538
1538
  table=tableId, row=rowIndex+1, column=rowIdColName, url=tableUrl, propertyGroup=propGrpName)
@@ -1573,12 +1573,11 @@ def _loadFromOIM(cntlr, error, warning, modelXbrl, oimFile, mappedUri):
1573
1573
  if _isParamRef(val):
1574
1574
  rowPropGrpParamRefs.add(_getParamRefName(val))
1575
1575
  if factDimensions[colName] is None:
1576
- if colName in paramRefColNames:
1577
- value = _cellValue(row[colNameIndex[colName]])
1578
- if value:
1579
- paramColsWithValue.add(colName)
1580
- elif value is EMPTY_CELL or value is NONE_CELL:
1581
- emptyCols.add(colName)
1576
+ value = _cellValue(row[colNameIndex[colName]])
1577
+ if value is EMPTY_CELL or value is NONE_CELL:
1578
+ emptyCols.add(colName)
1579
+ elif colName in paramRefColNames:
1580
+ paramColsWithValue.add(colName)
1582
1581
  if not cellPropGroup:
1583
1582
  continue # not a fact column
1584
1583
  for rowPropGrpParamRef in rowPropGrpParamRefs:
@@ -238,11 +238,10 @@ def rule_EC0183E(
238
238
  """
239
239
  if not pluginData.shouldValidateUpload(val):
240
240
  return
241
- zipFile = cast(zipfile.ZipFile, val.modelXbrl.fileSource.fs)
242
- file = cast(IO[Any], zipFile.fp)
243
- file.seek(0, 2) # Move to the end of the file
244
- size = file.tell()
245
- if size > 55 * 1000 * 1000: # Interpretting MB as megabytes (1,000,000 bytes)
241
+ size = val.modelXbrl.fileSource.getBytesSize()
242
+ if size is None:
243
+ return # File size is not available, cannot validate
244
+ if size > 55_000_000: # Interpretting MB as megabytes (1,000,000 bytes)
246
245
  yield Validation.error(
247
246
  codes='EDINET.EC0183E',
248
247
  msg=_("The compressed file size exceeds 55MB. "
@@ -88,12 +88,25 @@ def validateXbrlFinally(val: ValidateXbrl, *args: Any, **kwargs: Any) -> None:
88
88
  if reportPackageMaxMB is not None and modelXbrl.fileSource.fs: # must be a zip to be a report package
89
89
  assert isinstance(modelXbrl.fileSource.fs, zipfile.ZipFile)
90
90
  maxMB = float(reportPackageMaxMB)
91
+ _size: int | None = None
92
+ _sizeExact = True
91
93
  if val.authParam["reportPackageMeasurement"] == "unzipped":
92
94
  _size = sum(zi.file_size for zi in modelXbrl.fileSource.fs.infolist())
95
+ _sizeExact = False
93
96
  else:
94
- _size = sum(zi.compress_size for zi in modelXbrl.fileSource.fs.infolist())
95
- # not usable because zip may be posted or streamed: _size = os.path.getsize(modelXbrl.fileSource.basefile)
96
- if _size > maxMB * 1048576:
97
+ try:
98
+ _size = modelXbrl.fileSource.getBytesSize()
99
+ except Exception:
100
+ pass
101
+ if _size is None:
102
+ _size = modelXbrl.fileSource.getBytesSizeEstimate()
103
+ _sizeExact = False
104
+ modelXbrl.info("arelle.ESEF.reportPackageSize",
105
+ _("The %(estimated)s report package %(reportPackageMeasurement)s size is %(size)s bytes."),
106
+ estimated=_("exact") if _sizeExact else _("estimated"),
107
+ reportPackageMeasurement=_(val.authParam["reportPackageMeasurement"]) or _("zipped"),
108
+ size=_size)
109
+ if _size is not None and _size > maxMB * 1048576:
97
110
  modelXbrl.error("arelle.ESEF.maximumReportPackageSize",
98
111
  _("The authority %(authority)s requires a report package size under %(maxSize)s MB, size is %(size)s."),
99
112
  modelObject=modelXbrl, authority=val.authority, maxSize=reportPackageMaxMB, size=_size)
@@ -93,12 +93,25 @@ def validateXbrlFinally(val: ValidateXbrl, *args: Any, **kwargs: Any) -> None:
93
93
  assert isinstance(modelXbrl.fileSource.fs, zipfile.ZipFile)
94
94
 
95
95
  maxMB = float(reportPackageMaxMB)
96
+ _size: int | None = None
97
+ _sizeExact = True
96
98
  if val.authParam["reportPackageMeasurement"] == "unzipped":
97
99
  _size = sum(zi.file_size for zi in modelXbrl.fileSource.fs.infolist())
100
+ _sizeExact = False
98
101
  else:
99
- _size = sum(zi.compress_size for zi in modelXbrl.fileSource.fs.infolist())
100
- # not usable because zip may be posted or streamed: _size = os.path.getsize(modelXbrl.fileSource.basefile)
101
- if _size > maxMB * 1048576:
102
+ try:
103
+ _size = modelXbrl.fileSource.getBytesSize()
104
+ except Exception:
105
+ pass
106
+ if _size is None:
107
+ _size = modelXbrl.fileSource.getBytesSizeEstimate()
108
+ _sizeExact = False
109
+ modelXbrl.info("arelle.ESEF.reportPackageSize",
110
+ _("The %(estimated)s report package %(reportPackageMeasurement)s size is %(size)s bytes."),
111
+ estimated=_("exact") if _sizeExact else _("estimated"),
112
+ reportPackageMeasurement=_(val.authParam["reportPackageMeasurement"]) or _("zipped"),
113
+ size=_size)
114
+ if _size is not None and _size > maxMB * 1048576:
102
115
  modelXbrl.error("arelle.ESEF.maximumReportPackageSize",
103
116
  _("The authority %(authority)s requires a report package size under %(maxSize)s MB, size is %(size)s."),
104
117
  modelObject=modelXbrl, authority=val.authority, maxSize=reportPackageMaxMB, size=_size)
@@ -1785,17 +1785,15 @@ def rule_nl_kvk_6_1_1_1(
1785
1785
  """
1786
1786
  NL-KVK.6.1.1.1: The size of the report package MUST NOT exceed 100 MB.
1787
1787
  """
1788
- if val.modelXbrl.fileSource.fs and isinstance(val.modelXbrl.fileSource.fs, zipfile.ZipFile):
1789
- maxMB = float(MAX_REPORT_PACKAGE_SIZE_MBS)
1790
- # The following code computes report package size by adding the compressed file sizes within the package.
1791
- # This method of computation is over 99% accurate and gets more accurate the larger the filesize is.
1792
- _size = sum(zi.compress_size for zi in val.modelXbrl.fileSource.fs.infolist())
1793
- if _size > maxMB * 1000000:
1794
- yield Validation.error(
1795
- codes='NL.NL-KVK.6.1.1.1.reportPackageMaximumSizeExceeded',
1796
- msg=_('The size of the report package must not exceed %(maxSize)s MBs, size is %(size)s MBs.'),
1797
- modelObject=val.modelXbrl, maxSize=MAX_REPORT_PACKAGE_SIZE_MBS, size=int(_size/1000000)
1798
- )
1788
+ size = val.modelXbrl.fileSource.getBytesSize()
1789
+ if size is None:
1790
+ return # File size is not available, cannot validate
1791
+ if size > MAX_REPORT_PACKAGE_SIZE_MBS * 1_000_000: # Interpretting MB as megabytes (1,000,000 bytes)
1792
+ yield Validation.error(
1793
+ codes='NL.NL-KVK.6.1.1.1.reportPackageMaximumSizeExceeded',
1794
+ msg=_('The size of the report package must not exceed %(maxSize)s MBs, size is %(size)s MBs.'),
1795
+ modelObject=val.modelXbrl, maxSize=MAX_REPORT_PACKAGE_SIZE_MBS, size=int(size/1000000)
1796
+ )
1799
1797
 
1800
1798
 
1801
1799
  @validation(
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: arelle-release
3
- Version: 2.37.32
3
+ Version: 2.37.33
4
4
  Summary: An open source XBRL platform.
5
5
  Author-email: "arelle.org" <support@arelle.org>
6
6
  License-Expression: Apache-2.0
@@ -1,11 +1,11 @@
1
1
  arelle/Aspect.py,sha256=Pn9I91D1os1RTVj6htuxTfRzVMhmVDtrbKvV_zy9xMI,5470
2
2
  arelle/BetaFeatures.py,sha256=T_tPac-FiozHyYLCemt0RoHJ1JahUE71L-0tHmIRKpE,858
3
3
  arelle/Cntlr.py,sha256=sf5Xe19t5E0wKzhdlXl1p5r6gMtCmPhYAi8RVY0jz7Y,30449
4
- arelle/CntlrCmdLine.py,sha256=uCpv_MaDGwMX1A3EZdN5h678aDaI0MTgRCQwOEKlimY,90250
4
+ arelle/CntlrCmdLine.py,sha256=tSbTlREbJkppAZ9HlB_99KpDKx3EwWBV9veWnXg6hVQ,90155
5
5
  arelle/CntlrComServer.py,sha256=h1KPf31uMbErpxTZn_iklDqUMGFgQnjZkFkFjd8gtLQ,1888
6
6
  arelle/CntlrProfiler.py,sha256=2VQJudiUhxryVypxjODx2ccP1-n60icTiWs5lSEokhQ,972
7
7
  arelle/CntlrQuickBooks.py,sha256=BMqd5nkNQOZyNFPefkTeWUUDCYNS6BQavaG8k1Lepu4,31543
8
- arelle/CntlrWebMain.py,sha256=x5vtiopqGdp6L5s7PrUTEABXCGqtb5oy7yqWIVePtgE,50860
8
+ arelle/CntlrWebMain.py,sha256=_jhosP0Pg-erutBRzTVsL0cmWVgbc6z0WIIlNO-z1N4,50712
9
9
  arelle/CntlrWinMain.py,sha256=53lRaGTh8-4vG-hpuNVkxUhFa60u0jIHM9WvFdwdv-o,97273
10
10
  arelle/CntlrWinTooltip.py,sha256=6MzoAIfkYnNu_bl_je8n0adhwmKxAIcymkg9Tij9Z4M,7951
11
11
  arelle/DialogAbout.py,sha256=XXzMV0fO4BQ3-l1Puirzmn7EZEdmgJg7JNYdJm1FueM,1987
@@ -21,7 +21,7 @@ arelle/DialogRssWatch.py,sha256=mjc4pqyFDISY4tQtME0uSRQ3NlcWnNsOsMu9Zj8tTd0,1378
21
21
  arelle/DialogURL.py,sha256=JH88OPFf588E8RW90uMaieok7A_4kOAURQ8kHWVhnao,4354
22
22
  arelle/DialogUserPassword.py,sha256=kWPlCCihhwvsykDjanME9qBDtv6cxZlsrJyoMqiRep4,13769
23
23
  arelle/DisclosureSystem.py,sha256=g3XXMjuyKJk2eoqvHGqoyIs2bMfcODwOeISDRCcY9gc,24749
24
- arelle/FileSource.py,sha256=OHWArRo30BfqC4vmNsSsUVOjRXvhDGlW4EVmE5uG9ZM,46652
24
+ arelle/FileSource.py,sha256=S19Rll9CoRPZ2zJCAlNHv1jt2UUfiLbSgI2tDdJq5Xc,47899
25
25
  arelle/FunctionCustom.py,sha256=d1FsBG14eykvpLpgaXpN8IdxnlG54dfGcsXPYfdpA9Q,5880
26
26
  arelle/FunctionFn.py,sha256=BcZKah1rpfquSVPwjvknM1pgFXOnK4Hr1e_ArG_mcJY,38058
27
27
  arelle/FunctionIxt.py,sha256=8JELGh1l4o8Ul4_G7JgwX8Ebch9it2DblI6OkfL33Cw,80082
@@ -123,9 +123,9 @@ arelle/XmlValidateConst.py,sha256=U_wN0Q-nWKwf6dKJtcu_83FXPn9c6P8JjzGA5b0w7P0,33
123
123
  arelle/XmlValidateParticles.py,sha256=Mn6vhFl0ZKC_vag1mBwn1rH_x2jmlusJYqOOuxFPO2k,9231
124
124
  arelle/XmlValidateSchema.py,sha256=6frtZOc1Yrx_5yYF6V6oHbScnglWrVbWr6xW4EHtLQI,7428
125
125
  arelle/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
126
- arelle/_version.py,sha256=m-gO1caTwfeHVfdBB-QTMwoN7CB9yG_i_tAd7ghMNoo,515
126
+ arelle/_version.py,sha256=RAjXCgP-9p3VBfxEV85KcfgMP1noD9OimvpQH9hUuu8,515
127
127
  arelle/typing.py,sha256=PRe-Fxwr2SBqYYUVPCJ3E7ddDX0_oOISNdT5Q97EbRM,1246
128
- arelle/api/Session.py,sha256=5KPjCIPiNuanKrz1MdFdKIx8Bg40Pk9sf2cL9OU4x-E,7770
128
+ arelle/api/Session.py,sha256=27HVuK3Bz1_21l4_RLn1IQg6v0MNsUEYrHajymyWwxI,7429
129
129
  arelle/archive/CustomLogger.py,sha256=v_JXOCQLDZcfaFWzxC9FRcEf9tQi4rCI4Sx7jCuAVQI,1231
130
130
  arelle/archive/LoadEFMvalidate.py,sha256=HR1ZJmOvWGUlWEsWd0tGCa2TTtZSNzeL6tgN1TFfrl0,986
131
131
  arelle/archive/LoadSavePreLbCsv.py,sha256=mekr1R6OE5d3xdUCZIVfSeolyet0HO8R6wsHnW4eyaA,767
@@ -294,7 +294,7 @@ arelle/model/CommentBase.py,sha256=NtC2lFd9Mt1y7kzWwrpvexwqBdfSe1nvGFiIJeio3rU,1
294
294
  arelle/model/ElementBase.py,sha256=pZX836d4-s-OvzPMUusvEDezI9D_6YKO7_j6iDcUXm4,404
295
295
  arelle/model/PIBase.py,sha256=easZ3pKXJ5wq3NFB2pDtBeXNDcjwMAXylpXz6mnumOg,257
296
296
  arelle/model/__init__.py,sha256=RLmC1rTus3T_2Vvnu3yHtdw1r0wrZCHZoqxe8BLg_wE,595
297
- arelle/oim/Load.py,sha256=kqKvs3q6VE6fKxCv9X0kxnyTywKMyC_qGGAB__v51TU,182910
297
+ arelle/oim/Load.py,sha256=jLDidnntV78Pwzw0MvOLWSHXC8QxDkHO41TrdmsQuOQ,182874
298
298
  arelle/oim/Validate.py,sha256=IaBClr2KYMiVC_GKYy4_A9gF7hcnm-lxXpQrDCqIWGs,9012
299
299
  arelle/oim/xml/Save.py,sha256=MdaJiGcEo4nbQCX9sRgWfVIoxp6fd2N-wuLiDAS9D-I,607
300
300
  arelle/packages/PackageConst.py,sha256=iIIF-Ic8zlMPiiCq3PcV57aWci6ispBtilSG4W7ZW4U,121
@@ -399,17 +399,17 @@ arelle/plugin/validate/EDINET/ValidationPluginExtension.py,sha256=HIGOpBOyuVs5SE
399
399
  arelle/plugin/validate/EDINET/__init__.py,sha256=1kJUaV2AbNZdakKSa_v3opdyCRKO3gva62RpHVOrpIE,4398
400
400
  arelle/plugin/validate/EDINET/resources/config.xml,sha256=7uxn_HZT3USgbs2GQkew-dCUzlEgUGs62PiqEfljPgk,514
401
401
  arelle/plugin/validate/EDINET/rules/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
402
- arelle/plugin/validate/EDINET/rules/upload.py,sha256=KehSxCyqC9aujaPYucK4b5VpXmjT7L6Gz_D0u82w6GY,17096
402
+ arelle/plugin/validate/EDINET/rules/upload.py,sha256=sZFDSRWukJZEEBfg_RsG1q3Qw1IHhD0LZjl9LL1i9Ao,17048
403
403
  arelle/plugin/validate/ESEF/Const.py,sha256=JujF_XV-_TNsxjGbF-8SQS4OOZIcJ8zhCMnr-C1O5Ho,22660
404
404
  arelle/plugin/validate/ESEF/Dimensions.py,sha256=MOJM7vwNPEmV5cu-ZzPrhx3347ZvxgD6643OB2HRnIk,10597
405
405
  arelle/plugin/validate/ESEF/Util.py,sha256=QH3btcGqBpr42M7WSKZLSdNXygZaZLfEiEjlxoG21jE,7950
406
406
  arelle/plugin/validate/ESEF/__init__.py,sha256=LL7uYOcGPHgjwTlcfW2oWMqWiqrZ5yABzcKkJZFrZis,20391
407
407
  arelle/plugin/validate/ESEF/ESEF_2021/DTS.py,sha256=6Za7BANwwc_egxLCgbgWzwUGOXZv9IF1I7JCkDNt2Tw,26277
408
408
  arelle/plugin/validate/ESEF/ESEF_2021/Image.py,sha256=4bnhuy5viBU0viPjb4FhcRRjVVKlNdnKLFdSGg3sZvs,4871
409
- arelle/plugin/validate/ESEF/ESEF_2021/ValidateXbrlFinally.py,sha256=l4Nl-QuYJlM4WDpg87YjTwMUh05VP7tNq86gLFhWHyE,63380
409
+ arelle/plugin/validate/ESEF/ESEF_2021/ValidateXbrlFinally.py,sha256=Oh_Qy2Shug3wN1-uwct0BCnuNe36RoCQvLEJxdmE1HY,63941
410
410
  arelle/plugin/validate/ESEF/ESEF_2021/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
411
411
  arelle/plugin/validate/ESEF/ESEF_Current/DTS.py,sha256=epp-PBh1NJzQqgxUE6C468HmoDc2w3j54rMwfiOAry4,29334
412
- arelle/plugin/validate/ESEF/ESEF_Current/ValidateXbrlFinally.py,sha256=tGoQSorcO-lhuL37aqrfSDBBRtsMyHQuwILAiFbzwHs,73769
412
+ arelle/plugin/validate/ESEF/ESEF_Current/ValidateXbrlFinally.py,sha256=DL6k5ebGTgIdUDWz9BtN6x9VQFzRin_xje5iMhXx3_8,74330
413
413
  arelle/plugin/validate/ESEF/ESEF_Current/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
414
414
  arelle/plugin/validate/ESEF/resources/authority-validations.json,sha256=JriLZ45KmUYlQiPbXJCAahobqdrst64Ay77bofZhB5Q,14940
415
415
  arelle/plugin/validate/ESEF/resources/config.xml,sha256=t3STU_-QYM7Ay8YwZRPapnohiWVWhjfr4L2Rjx9xN9U,3902
@@ -427,7 +427,7 @@ arelle/plugin/validate/NL/rules/br_kvk.py,sha256=0SwKieWzTDm3YMsXPS6zTdgbk7_Z9Cz
427
427
  arelle/plugin/validate/NL/rules/fg_nl.py,sha256=4Puq5wAjtK_iNd4wisH_R0Z_EKJ7MT2OCai5g4t1MPE,10714
428
428
  arelle/plugin/validate/NL/rules/fr_kvk.py,sha256=kYqXt45S6eM32Yg9ii7pUhOMfJaHurgYqQ73FyQALs8,8171
429
429
  arelle/plugin/validate/NL/rules/fr_nl.py,sha256=-M1WtXp06khhtkfOVPCa-b8UbC281gk4YfDhvtAVlnI,31424
430
- arelle/plugin/validate/NL/rules/nl_kvk.py,sha256=oDEFuHtrTsHyTFncJ0haWYifNxr6LcQ7Q4JDm0cUxWQ,90426
430
+ arelle/plugin/validate/NL/rules/nl_kvk.py,sha256=WW56HvQNSAqGOkPKTAFSuzZEXz-ECAYKvJlNKvZmsKM,90151
431
431
  arelle/plugin/validate/ROS/DisclosureSystems.py,sha256=rJ81mwQDYTi6JecFZ_zhqjjz3VNQRgjHNSh0wcQWAQE,18
432
432
  arelle/plugin/validate/ROS/PluginValidationDataExtension.py,sha256=IV7ILhNvgKwQXqbpSA6HRNt9kEnejCyMADI3wyyIgk0,4036
433
433
  arelle/plugin/validate/ROS/ValidationPluginExtension.py,sha256=FBhEp8t396vGdvCbMEimfcxmGiGnhXMen-yVLWnkFaI,758
@@ -750,9 +750,9 @@ arelle/utils/validate/ValidationUtil.py,sha256=9vmSvShn-EdQy56dfesyV8JjSRVPj7txr
750
750
  arelle/utils/validate/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
751
751
  arelle/webserver/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
752
752
  arelle/webserver/bottle.py,sha256=P-JECd9MCTNcxCnKoDUvGcoi03ezYVOgoWgv2_uH-6M,362
753
- arelle_release-2.37.32.dist-info/licenses/LICENSE.md,sha256=Q0tn6q0VUbr-NM8916513NCIG8MNzo24Ev-sxMUBRZc,3959
754
- arelle_release-2.37.32.dist-info/METADATA,sha256=iMCJccDRHFwxm12EgJp0s1_-vKC9Z77dQUKe1Pc5MzQ,9137
755
- arelle_release-2.37.32.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
756
- arelle_release-2.37.32.dist-info/entry_points.txt,sha256=Uj5niwfwVsx3vaQ3fYj8hrZ1xpfCJyTUA09tYKWbzpo,111
757
- arelle_release-2.37.32.dist-info/top_level.txt,sha256=fwU7SYawL4_r-sUMRg7r1nYVGjFMSDvRWx8VGAXEw7w,7
758
- arelle_release-2.37.32.dist-info/RECORD,,
753
+ arelle_release-2.37.33.dist-info/licenses/LICENSE.md,sha256=Q0tn6q0VUbr-NM8916513NCIG8MNzo24Ev-sxMUBRZc,3959
754
+ arelle_release-2.37.33.dist-info/METADATA,sha256=uXm8EVfOHE2g5IEWyUcC9UDreYR5taOMDuwboUuNANw,9137
755
+ arelle_release-2.37.33.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
756
+ arelle_release-2.37.33.dist-info/entry_points.txt,sha256=Uj5niwfwVsx3vaQ3fYj8hrZ1xpfCJyTUA09tYKWbzpo,111
757
+ arelle_release-2.37.33.dist-info/top_level.txt,sha256=fwU7SYawL4_r-sUMRg7r1nYVGjFMSDvRWx8VGAXEw7w,7
758
+ arelle_release-2.37.33.dist-info/RECORD,,