arelle-release 2.37.34__py3-none-any.whl → 2.37.35__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/ModelValue.py CHANGED
@@ -35,11 +35,11 @@ def qname(value: ModelObject | str | QName, name: str | ModelObject | None = Non
35
35
  def qname(value: ModelObject, name: QName, noPrefixIsNoNamespace: bool) -> QName: ...
36
36
 
37
37
  @overload
38
- def qname(value: ModelObject | str | QName | Any | None, name: str | ModelObject | dict[str, str] | None) -> QName | None : ...
38
+ def qname(value: ModelObject | str | QName | Any | None, name: str | ModelObject | dict[str, str] | dict[str | None, str] | None) -> QName | None : ...
39
39
 
40
40
  def qname(
41
41
  value: ModelObject | str | QName | Any | None,
42
- name: str | QName | ModelObject | dict[str, str] | None = None,
42
+ name: str | QName | ModelObject | dict[str, str] | dict[str | None, str] | None = None,
43
43
  noPrefixIsNoNamespace: bool = False,
44
44
  castException: Exception | None = None,
45
45
  prefixException: Exception | None = None,
@@ -66,6 +66,7 @@ def qname(
66
66
  elif not isinstance(value, str):
67
67
  if castException: raise castException
68
68
  return None
69
+ namespaceDict: dict[str | None, str] | None
69
70
  if value and value[0] == '{': # clark notation (with optional prefix)
70
71
  namespaceURI,sep,prefixedLocalName = value[1:].rpartition('}')
71
72
  prefix: str | None
@@ -85,7 +86,7 @@ def qname(
85
86
  else:
86
87
  if isinstance(name, dict):
87
88
  namespaceURI = None
88
- namespaceDict = name # note that default prefix must be None, not '', in dict
89
+ namespaceDict = cast(dict[str | None, str], name) # note that default prefix must be None, not '', in dict
89
90
  elif name is not None:
90
91
  if name: # len > 0
91
92
  namespaceURI = value
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.34'
21
- __version_tuple__ = version_tuple = (2, 37, 34)
20
+ __version__ = version = '2.37.35'
21
+ __version_tuple__ = version_tuple = (2, 37, 35)
@@ -0,0 +1,12 @@
1
+ """
2
+ See COPYRIGHT.md for copyright information.
3
+ """
4
+ from arelle.ModelValue import qname
5
+
6
+ qnEdinetManifestInsert = qname("{http://disclosure.edinet-fsa.go.jp/2013/manifest}insert")
7
+ qnEdinetManifestInstance = qname("{http://disclosure.edinet-fsa.go.jp/2013/manifest}instance")
8
+ qnEdinetManifestItem = qname("{http://disclosure.edinet-fsa.go.jp/2013/manifest}item")
9
+ qnEdinetManifestIxbrl = qname("{http://disclosure.edinet-fsa.go.jp/2013/manifest}ixbrl")
10
+ qnEdinetManifestList = qname("{http://disclosure.edinet-fsa.go.jp/2013/manifest}list")
11
+ qnEdinetManifestTitle = qname("{http://disclosure.edinet-fsa.go.jp/2013/manifest}title")
12
+ qnEdinetManifestTocComposition = qname("{http://disclosure.edinet-fsa.go.jp/2013/manifest}tocComposition")
@@ -0,0 +1,124 @@
1
+ """
2
+ See COPYRIGHT.md for copyright information.
3
+ """
4
+ from __future__ import annotations
5
+
6
+ import zipfile
7
+ from dataclasses import dataclass
8
+ from functools import lru_cache
9
+ from pathlib import Path
10
+
11
+ from lxml import etree
12
+ from lxml.etree import _Element
13
+
14
+ from arelle import XbrlConst
15
+ from arelle.FileSource import FileSource
16
+ from arelle.ModelValue import QName, qname
17
+ from . import Constants
18
+
19
+
20
+ @dataclass(frozen=True)
21
+ class Manifest:
22
+ instances: list[ManifestInstance]
23
+ path: Path
24
+ titlesByLang: dict[str, str]
25
+ tocItems: list[ManifestTocItem]
26
+
27
+
28
+ @dataclass(frozen=True)
29
+ class ManifestTocItem:
30
+ extrole: str
31
+ childItems: list[ManifestTocItem]
32
+ itemIn: str
33
+ parent: QName | None
34
+ ref: str
35
+ start: QName | None
36
+
37
+
38
+ @dataclass(frozen=True)
39
+ class ManifestInstance:
40
+ id: str
41
+ ixbrlFiles: list[Path]
42
+ preferredFilename: str
43
+ type: str
44
+
45
+
46
+ def _parseManifestTocItems(parentElt: _Element, parentQName: QName | None) -> list[ManifestTocItem]:
47
+ tocItems = []
48
+ for itemElt in parentElt.iterchildren(tag=Constants.qnEdinetManifestItem.clarkNotation):
49
+ childTocItems = []
50
+ for insertElt in itemElt.iterchildren(tag=Constants.qnEdinetManifestInsert.clarkNotation):
51
+ childParentQName = qname(insertElt.attrib.get("parent"), insertElt.nsmap) if insertElt.attrib.get("parent") else None
52
+ childTocItems.extend(_parseManifestTocItems(insertElt, childParentQName))
53
+ tocItems.append(ManifestTocItem(
54
+ extrole=itemElt.attrib.get("extrole", ""),
55
+ childItems=childTocItems,
56
+ parent=parentQName,
57
+ itemIn=itemElt.attrib.get("in", ""),
58
+ ref=itemElt.attrib.get("ref", ""),
59
+ start=qname(itemElt.attrib.get("start"), itemElt.nsmap) if itemElt.attrib.get("start") else None,
60
+ ))
61
+ return tocItems
62
+
63
+
64
+ def _parseManifestDoc(xmlRootElement: _Element, path: Path) -> Manifest:
65
+ instances = []
66
+ titlesByLang = {}
67
+ base = path.parent
68
+ tocElts = list(xmlRootElement.iterchildren(tag=Constants.qnEdinetManifestTocComposition.clarkNotation))
69
+ assert len(tocElts) == 1, 'There should be exactly one tocComposition element in the manifest.'
70
+ for titleElt in tocElts[0].iterchildren(tag=Constants.qnEdinetManifestTitle.clarkNotation):
71
+ lang = titleElt.attrib.get(XbrlConst.qnXmlLang.clarkNotation, "")
72
+ titlesByLang[lang] = titleElt.text.strip() if titleElt.text else ""
73
+ tocItems = _parseManifestTocItems(tocElts[0], None)
74
+ listElts = list(xmlRootElement.iterchildren(tag=Constants.qnEdinetManifestList.clarkNotation))
75
+ assert len(listElts) == 1, 'There should be exactly one list element in the manifest.'
76
+ for instanceElt in listElts[0].iterchildren(tag=Constants.qnEdinetManifestInstance.clarkNotation):
77
+ instanceId = str(instanceElt.attrib.get("id", ""))
78
+ instanceType = str(instanceElt.attrib.get("type", ""))
79
+ preferredFilename = str(instanceElt.attrib.get("preferredFilename", ""))
80
+ ixbrlFiles = []
81
+ for ixbrlElt in instanceElt.iterchildren(tag=Constants.qnEdinetManifestIxbrl.clarkNotation):
82
+ uri = ixbrlElt.text.strip() if ixbrlElt.text is not None else None
83
+ if uri is not None and len(uri) > 0:
84
+ ixbrlFiles.append(base / uri)
85
+ instances.append(ManifestInstance(
86
+ id=instanceId,
87
+ ixbrlFiles=ixbrlFiles,
88
+ preferredFilename=preferredFilename,
89
+ type=instanceType,
90
+ ))
91
+ return Manifest(
92
+ instances=instances,
93
+ path=path,
94
+ titlesByLang=titlesByLang,
95
+ tocItems=tocItems,
96
+ )
97
+
98
+
99
+ @lru_cache(1)
100
+ def parseManifests(filesource: FileSource) -> list[Manifest]:
101
+ manifests: list[Manifest] = []
102
+ if filesource.isArchive:
103
+ if filesource.isTaxonomyPackage:
104
+ return manifests
105
+ if filesource.reportPackage is not None:
106
+ return manifests
107
+ for _archiveFile in (filesource.dir or ()):
108
+ if not Path(_archiveFile).stem.startswith('manifest'):
109
+ continue
110
+ assert isinstance(filesource.fs, zipfile.ZipFile), \
111
+ "The EDINET plugin only supports archives in .zip format."
112
+ with filesource.fs.open(_archiveFile) as manifestDoc:
113
+ xmlRootElement = etree.fromstring(manifestDoc.read())
114
+ manifests.append(_parseManifestDoc(xmlRootElement, Path(_archiveFile)))
115
+ elif (dirpath := Path(str(filesource.url))).is_dir():
116
+ for file in dirpath.rglob("*"):
117
+ if not file.is_file():
118
+ continue
119
+ if not file.stem.startswith('manifest'):
120
+ continue
121
+ with open(file, 'rb') as manifestDoc:
122
+ xmlRootElement = etree.fromstring(manifestDoc.read())
123
+ manifests.append(_parseManifestDoc(xmlRootElement, file))
124
+ return manifests
@@ -5,17 +5,15 @@ See COPYRIGHT.md for copyright information.
5
5
  """
6
6
  from __future__ import annotations
7
7
 
8
- import zipfile
9
8
  from collections import defaultdict
10
9
  from pathlib import Path
11
10
  from typing import Any
12
11
 
13
- from lxml import etree
14
- from lxml.etree import _Element
15
-
16
12
  from arelle.FileSource import FileSource
17
13
  from arelle.ModelXbrl import ModelXbrl
18
14
  from arelle.Version import authorLabel, copyrightLabel
15
+ from . import Constants
16
+ from .Manifest import Manifest, ManifestInstance, parseManifests
19
17
  from .ValidationPluginExtension import ValidationPluginExtension
20
18
  from .rules import edinet, frta, gfm, upload
21
19
 
@@ -52,53 +50,18 @@ def disclosureSystemConfigURL(*args: Any, **kwargs: Any) -> str:
52
50
  return validationPlugin.disclosureSystemConfigURL
53
51
 
54
52
 
55
- def _parseManifestDoc(xmlRootElement: _Element, base: Path) -> dict[str, list[Path]]:
56
- sets = defaultdict(list)
57
- for instanceElt in xmlRootElement.iter(tag="{http://disclosure.edinet-fsa.go.jp/2013/manifest}instance"):
58
- instanceId = str(instanceElt.attrib["id"])
59
- for ixbrlElt in instanceElt.iter(tag="{http://disclosure.edinet-fsa.go.jp/2013/manifest}ixbrl"):
60
- uri = ixbrlElt.text.strip() if ixbrlElt.text is not None else None
61
- if uri:
62
- sets[instanceId].append(base / uri)
63
- return sets
64
-
65
-
66
53
  def fileSourceEntrypointFiles(filesource: FileSource, inlineOnly: bool, *args: Any, **kwargs: Any) -> list[dict[str, Any]] | None:
67
- manifests = {}
68
- if filesource.isArchive:
69
- if filesource.isTaxonomyPackage:
70
- return None
71
- if filesource.reportPackage is not None:
72
- return None
73
- for _archiveFile in (filesource.dir or ()):
74
- if not Path(_archiveFile).stem.startswith('manifest'):
75
- continue
76
- assert isinstance(filesource.fs, zipfile.ZipFile), \
77
- "The EDINET plugin only supports archives in .zip format."
78
- with filesource.fs.open(_archiveFile) as manifestDoc:
79
- base = Path(_archiveFile).parent
80
- xmlRootElement = etree.fromstring(manifestDoc.read())
81
- manifests.update(_parseManifestDoc(xmlRootElement, base))
82
- elif (dirpath := Path(str(filesource.url))).is_dir():
83
- for file in dirpath.rglob("*"):
84
- if not file.is_file():
85
- continue
86
- if not file.stem.startswith('manifest'):
87
- continue
88
- with open(file, 'rb') as manifestDoc:
89
- base = file.parent
90
- xmlRootElement = etree.fromstring(manifestDoc.read())
91
- manifests.update(_parseManifestDoc(xmlRootElement, base))
54
+ manifests = parseManifests(filesource)
92
55
  if len(manifests) == 0:
93
56
  return None
94
-
95
57
  entrypointFiles = []
96
- for instanceId, uris in manifests.items():
97
- entrypoints = []
98
- for uri in uris:
99
- filesource.select(str(uri))
100
- entrypoints.append({"file": filesource.url})
101
- entrypointFiles.append({'ixds': entrypoints})
58
+ for manifest in manifests:
59
+ for instance in manifest.instances:
60
+ entrypoints = []
61
+ for ixbrlFile in instance.ixbrlFiles:
62
+ filesource.select(str(ixbrlFile))
63
+ entrypoints.append({"file": filesource.url})
64
+ entrypointFiles.append({'ixds': entrypoints})
102
65
  return entrypointFiles
103
66
 
104
67
 
@@ -4,11 +4,10 @@ See COPYRIGHT.md for copyright information.
4
4
  from __future__ import annotations
5
5
 
6
6
  import re
7
- import zipfile
8
7
  from collections import defaultdict
9
8
  from collections.abc import Iterable
10
9
  from pathlib import Path
11
- from typing import Any, cast, IO
10
+ from typing import Any
12
11
 
13
12
  from arelle.ValidateXbrl import ValidateXbrl
14
13
  from arelle.typing import TypeGetText
@@ -17,6 +16,7 @@ from arelle.utils.validate.Decorator import validation
17
16
  from arelle.utils.validate.Validation import Validation
18
17
  from ..DisclosureSystems import (DISCLOSURE_SYSTEM_EDINET)
19
18
  from ..FormType import FormType, HTML_EXTENSIONS, IMAGE_EXTENSIONS
19
+ from ..Manifest import parseManifests
20
20
  from ..PluginValidationDataExtension import PluginValidationDataExtension
21
21
 
22
22
  _: TypeGetText
@@ -452,3 +452,73 @@ def rule_EC1020E(
452
452
  path=str(path),
453
453
  file=str(path),
454
454
  )
455
+
456
+
457
+ @validation(
458
+ hook=ValidationHook.XBRL_FINALLY,
459
+ disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
460
+ )
461
+ def rule_manifest_preferredFilename(
462
+ pluginData: PluginValidationDataExtension,
463
+ val: ValidateXbrl,
464
+ *args: Any,
465
+ **kwargs: Any,
466
+ ) -> Iterable[Validation]:
467
+ """
468
+ EDINET.EC5804E: The preferredFilename attribute must be set on the instance
469
+ element in the manifest file.
470
+
471
+ EDINET.EC5805E: The instance file extension is not ".xbrl". File name: xxx
472
+ Please change the extension of the instance name set in the preferredFilename
473
+ attribute value of the instance element in the manifest file to ".xbrl".
474
+
475
+ EDINET.EC5806E: The same instance file name is set multiple times. File name: xxx
476
+ The preferredFilename attribute value of the instance element in the manifest
477
+ file must be unique within the same file.
478
+ """
479
+ if not pluginData.shouldValidateUpload(val):
480
+ return
481
+ manifests = parseManifests(val.modelXbrl.fileSource)
482
+ for manifest in manifests:
483
+ preferredFilenames = set()
484
+ duplicateFilenames = set()
485
+ for instance in manifest.instances:
486
+ if len(instance.preferredFilename) == 0:
487
+ yield Validation.error(
488
+ codes='EDINET.EC5804E',
489
+ msg=_("The instance file name is not set. "
490
+ "Set the instance name as the preferredFilename attribute value "
491
+ "of the instance element in the manifest file. (manifest: '%(manifest)s', id: %(id)s)"),
492
+ manifest=str(manifest.path),
493
+ id=instance.id,
494
+ )
495
+ continue
496
+ preferredFilename = Path(instance.preferredFilename)
497
+ if preferredFilename.suffix != '.xbrl':
498
+ yield Validation.error(
499
+ codes='EDINET.EC5805E',
500
+ msg=_("The instance file extension is not '.xbrl'. "
501
+ "File name: '%(preferredFilename)s'. "
502
+ "Please change the extension of the instance name set in the "
503
+ "preferredFilename attribute value of the instance element in "
504
+ "the manifest file to '.xbrl'. (manifest: '%(manifest)s', id: %(id)s)"),
505
+ preferredFilename=instance.preferredFilename,
506
+ manifest=str(manifest.path),
507
+ id=instance.id,
508
+ )
509
+ continue
510
+ if instance.preferredFilename in preferredFilenames:
511
+ duplicateFilenames.add(instance.preferredFilename)
512
+ continue
513
+ preferredFilenames.add(instance.preferredFilename)
514
+ for duplicateFilename in duplicateFilenames:
515
+ yield Validation.error(
516
+ codes='EDINET.EC5806E',
517
+ msg=_("The same instance file name is set multiple times. "
518
+ "File name: '%(preferredFilename)s'. "
519
+ "The preferredFilename attribute value of the instance "
520
+ "element in the manifest file must be unique within the "
521
+ "same file. (manifest: '%(manifest)s')"),
522
+ manifest=str(manifest.path),
523
+ preferredFilename=duplicateFilename,
524
+ )
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: arelle-release
3
- Version: 2.37.34
3
+ Version: 2.37.35
4
4
  Summary: An open source XBRL platform.
5
5
  Author-email: "arelle.org" <support@arelle.org>
6
6
  License-Expression: Apache-2.0
@@ -46,7 +46,7 @@ arelle/ModelRenderingObject.py,sha256=iPhSUlSBG-FLzAfIdUW06UZDgTCaZJ4K2mxvAtSe2B
46
46
  arelle/ModelRssItem.py,sha256=GzFkmluOlFsVcrxn9HAyOAcuE7rcHUOGkp4Q6F2IlT8,7713
47
47
  arelle/ModelRssObject.py,sha256=xjuwyJ8pU5sQmNPJFQakDEEnujZg2bMCTaj3zVezHL8,992
48
48
  arelle/ModelTestcaseObject.py,sha256=dnCxatJcFPlu5BgTuToqgrQowYNx4YtA5KrmW4vHko4,22432
49
- arelle/ModelValue.py,sha256=t0mVl3-EcE4MaXdRL9F94XaBwBfu1xG2DmFuHOczrEk,39447
49
+ arelle/ModelValue.py,sha256=0sr7njFjGI2W3Bct2dxf2LoG_fLerHQouQtM0v0ZY2E,39573
50
50
  arelle/ModelVersObject.py,sha256=cPD1IzhkCfuV1eMgVFWes88DH_6WkUj5kj7sgGF2M0I,26062
51
51
  arelle/ModelVersReport.py,sha256=bXEA9K3qkH57aABn5l-m3CTY0FAcF1yX6O4fo-URjl8,73326
52
52
  arelle/ModelXbrl.py,sha256=bj-_enkb2AV2KVCRrRf2YPGxOoO9cdqKnVqfy3bGFZk,72125
@@ -123,7 +123,7 @@ 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=UdKRHaB3pyxyxupZQ1MDG4KdlqxGBWeWxgwroLH2N_g,515
126
+ arelle/_version.py,sha256=xskzS16quHADstT6foQZG7ObyYWctCHF2zPFpKL4EAM,515
127
127
  arelle/typing.py,sha256=PRe-Fxwr2SBqYYUVPCJ3E7ddDX0_oOISNdT5Q97EbRM,1246
128
128
  arelle/api/Session.py,sha256=27HVuK3Bz1_21l4_RLn1IQg6v0MNsUEYrHajymyWwxI,7429
129
129
  arelle/archive/CustomLogger.py,sha256=v_JXOCQLDZcfaFWzxC9FRcEf9tQi4rCI4Sx7jCuAVQI,1231
@@ -392,18 +392,20 @@ arelle/plugin/validate/DBA/rules/tm.py,sha256=ui9oKBqlAForwkQ9kk9KBiUogTJE5pv1Rb
392
392
  arelle/plugin/validate/DBA/rules/tr.py,sha256=zdi3kQ82whmweVWRLbMvcNpM8sqtUliPsGfd81rgZws,14671
393
393
  arelle/plugin/validate/EBA/__init__.py,sha256=1kW-04W32sStSAL8wvW1ZpXnjlFv6KLbfE4aifYUB2A,46000
394
394
  arelle/plugin/validate/EBA/config.xml,sha256=37wMVUAObK-XEqakqD8zPNog20emYt4a_yfL1AKubF8,2022
395
+ arelle/plugin/validate/EDINET/Constants.py,sha256=QG69rWdpIrpQzZQkRcDWk2i3rlBVohr4VtSdW-IS5_w,734
395
396
  arelle/plugin/validate/EDINET/DisclosureSystems.py,sha256=3rKG42Eg-17Xx_KXU_V5yHW6I3LTwQunvf4a44C9k_4,36
396
397
  arelle/plugin/validate/EDINET/FormType.py,sha256=pJfKjdjqFcRLFgH6xbEixvpwatZBBHI8uI3xjjhaPI0,3175
398
+ arelle/plugin/validate/EDINET/Manifest.py,sha256=VWenzA1ndOp802zpTELSLREbCrzrA-nM1UCRpRf1Q3M,4849
397
399
  arelle/plugin/validate/EDINET/PluginValidationDataExtension.py,sha256=VSSffANEC5kuvLC54pWYQ7w8fuSKo5LGdiuZ3NwWktg,5061
398
400
  arelle/plugin/validate/EDINET/ValidationPluginExtension.py,sha256=HIGOpBOyuVs5SEh573M3IzdouRdEuNIBkdumieZi8r0,959
399
- arelle/plugin/validate/EDINET/__init__.py,sha256=7Z3IdTdx0OdSm65jYYeRx_0B_zSvUKQubgXpa76OlvA,5164
401
+ arelle/plugin/validate/EDINET/__init__.py,sha256=ew9Rc2qJe5d3XvOOFzhX6MfzxNUtxIYfxRGX-wkfR1c,3555
400
402
  arelle/plugin/validate/EDINET/resources/config.xml,sha256=GmLcW7UIj5koXJkN19P6Nq5EZJcs6gKQLQ5f2V6u78w,614
401
403
  arelle/plugin/validate/EDINET/resources/edinet-taxonomies.xml,sha256=997I3RGTLg5OY3vn5hQxVFAAxOmDSOYpuyQe6VnWSY0,16285
402
404
  arelle/plugin/validate/EDINET/rules/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
403
405
  arelle/plugin/validate/EDINET/rules/edinet.py,sha256=hm5T8PiQbOKP58BiSV9UFvKQX10uNBpxUZ06ORSU1cE,2117
404
406
  arelle/plugin/validate/EDINET/rules/frta.py,sha256=l7BQHOenDjYrpCX6bsXyUHgyvkjbfvJWfbpBthCHmBI,1713
405
407
  arelle/plugin/validate/EDINET/rules/gfm.py,sha256=rj1ylvRIoauyzlEW1z1UxOkgO6fzvoMl5myRKkEZzY4,3295
406
- arelle/plugin/validate/EDINET/rules/upload.py,sha256=sZFDSRWukJZEEBfg_RsG1q3Qw1IHhD0LZjl9LL1i9Ao,17048
408
+ arelle/plugin/validate/EDINET/rules/upload.py,sha256=HZ-9Gk6WtIichTGcSsSGIrMXNgsgJYQYwfUKeLs1XWU,20369
407
409
  arelle/plugin/validate/ESEF/Const.py,sha256=JujF_XV-_TNsxjGbF-8SQS4OOZIcJ8zhCMnr-C1O5Ho,22660
408
410
  arelle/plugin/validate/ESEF/Dimensions.py,sha256=MOJM7vwNPEmV5cu-ZzPrhx3347ZvxgD6643OB2HRnIk,10597
409
411
  arelle/plugin/validate/ESEF/Util.py,sha256=QH3btcGqBpr42M7WSKZLSdNXygZaZLfEiEjlxoG21jE,7950
@@ -754,9 +756,9 @@ arelle/utils/validate/ValidationUtil.py,sha256=9vmSvShn-EdQy56dfesyV8JjSRVPj7txr
754
756
  arelle/utils/validate/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
755
757
  arelle/webserver/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
756
758
  arelle/webserver/bottle.py,sha256=P-JECd9MCTNcxCnKoDUvGcoi03ezYVOgoWgv2_uH-6M,362
757
- arelle_release-2.37.34.dist-info/licenses/LICENSE.md,sha256=Q0tn6q0VUbr-NM8916513NCIG8MNzo24Ev-sxMUBRZc,3959
758
- arelle_release-2.37.34.dist-info/METADATA,sha256=580O6L8VeM_RIhUWVmkF7s_ifRMpg3mYX3e_8G3u33I,9137
759
- arelle_release-2.37.34.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
760
- arelle_release-2.37.34.dist-info/entry_points.txt,sha256=Uj5niwfwVsx3vaQ3fYj8hrZ1xpfCJyTUA09tYKWbzpo,111
761
- arelle_release-2.37.34.dist-info/top_level.txt,sha256=fwU7SYawL4_r-sUMRg7r1nYVGjFMSDvRWx8VGAXEw7w,7
762
- arelle_release-2.37.34.dist-info/RECORD,,
759
+ arelle_release-2.37.35.dist-info/licenses/LICENSE.md,sha256=Q0tn6q0VUbr-NM8916513NCIG8MNzo24Ev-sxMUBRZc,3959
760
+ arelle_release-2.37.35.dist-info/METADATA,sha256=s6_Ry1tzo2Rm-L8keJcCO6y-ChrtoedS5TjekOK7-Ec,9137
761
+ arelle_release-2.37.35.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
762
+ arelle_release-2.37.35.dist-info/entry_points.txt,sha256=Uj5niwfwVsx3vaQ3fYj8hrZ1xpfCJyTUA09tYKWbzpo,111
763
+ arelle_release-2.37.35.dist-info/top_level.txt,sha256=fwU7SYawL4_r-sUMRg7r1nYVGjFMSDvRWx8VGAXEw7w,7
764
+ arelle_release-2.37.35.dist-info/RECORD,,