arelle-release 2.37.40__py3-none-any.whl → 2.37.42__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/_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.40'
21
- __version_tuple__ = version_tuple = (2, 37, 40)
20
+ __version__ = version = '2.37.42'
21
+ __version_tuple__ = version_tuple = (2, 37, 42)
@@ -10,9 +10,12 @@ from functools import lru_cache
10
10
  from pathlib import Path
11
11
 
12
12
  from arelle.ModelDocument import Type as ModelDocumentType
13
+ from arelle.ModelInstanceObject import ModelFact
13
14
  from arelle.ModelObject import ModelObject
15
+ from arelle.ModelValue import QName, qname
14
16
  from arelle.ModelXbrl import ModelXbrl
15
17
  from arelle.PrototypeDtsObject import LinkPrototype
18
+ from arelle.ValidateDuplicateFacts import getDeduplicatedFacts, DeduplicationType
16
19
  from arelle.ValidateXbrl import ValidateXbrl
17
20
  from arelle.typing import TypeGetText
18
21
  from arelle.utils.PluginData import PluginData
@@ -31,8 +34,17 @@ class UploadContents:
31
34
 
32
35
  @dataclass
33
36
  class PluginValidationDataExtension(PluginData):
37
+ assetsIfrsQn: QName
38
+ liabilitiesAndEquityIfrsQn: QName
39
+
34
40
  _primaryModelXbrl: ModelXbrl | None = None
35
41
 
42
+ def __init__(self, name: str):
43
+ super().__init__(name)
44
+ jpigpNamespace = "http://disclosure.edinet-fsa.go.jp/taxonomy/jpigp/2024-11-01/jpigp_cor"
45
+ self.assetsIfrsQn = qname(jpigpNamespace, 'AssetsIFRS')
46
+ self.liabilitiesAndEquityIfrsQn = qname(jpigpNamespace, "LiabilitiesAndEquityIFRS")
47
+
36
48
  # Identity hash for caching.
37
49
  def __hash__(self) -> int:
38
50
  return id(self)
@@ -63,6 +75,10 @@ class PluginValidationDataExtension(PluginData):
63
75
  return False # Not a zipfile
64
76
  return True
65
77
 
78
+ @lru_cache(1)
79
+ def getDeduplicatedFacts(self, modelXbrl: ModelXbrl) -> list[ModelFact]:
80
+ return getDeduplicatedFacts(modelXbrl, DeduplicationType.CONSISTENT_PAIRS)
81
+
66
82
  @lru_cache(1)
67
83
  def getFootnoteLinkElements(self, modelXbrl: ModelXbrl) -> list[ModelObject | LinkPrototype]:
68
84
  # TODO: Consolidate with similar implementations in EDGAR and FERC
@@ -6,6 +6,7 @@
6
6
  <DisclosureSystem
7
7
  names="EDINET|edinet"
8
8
  description="Checks for EDINET."
9
+ defaultXmlLang="ja"
9
10
  blockDisallowedReferences="true"
10
11
  validationType="EDINET"
11
12
  validTaxonomiesUrl="edinet-taxonomies.xml"
@@ -3,11 +3,14 @@ See COPYRIGHT.md for copyright information.
3
3
  """
4
4
  from __future__ import annotations
5
5
 
6
- import itertools
7
- from collections.abc import Iterable
8
- from typing import Any
6
+ from collections import defaultdict
7
+ from decimal import Decimal
8
+ from typing import Any, Iterable, cast
9
9
 
10
- from arelle import XbrlConst
10
+ import regex
11
+
12
+ from arelle import XbrlConst, ValidateDuplicateFacts
13
+ from arelle.ValidateDuplicateFacts import DuplicateType
11
14
  from arelle.ValidateXbrl import ValidateXbrl
12
15
  from arelle.typing import TypeGetText
13
16
  from arelle.utils.PluginHooks import ValidationHook
@@ -62,6 +65,41 @@ def rule_EC5002E(
62
65
  )
63
66
 
64
67
 
68
+ @validation(
69
+ hook=ValidationHook.XBRL_FINALLY,
70
+ disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
71
+ )
72
+ def rule_EC8024E(
73
+ pluginData: PluginValidationDataExtension,
74
+ val: ValidateXbrl,
75
+ *args: Any,
76
+ **kwargs: Any,
77
+ ) -> Iterable[Validation]:
78
+ """
79
+ EDINET.EC8024E: Instance values of the same element, context, and unit may not
80
+ have different values or different decimals attributes.
81
+ Correct the element with the relevant context ID. For elements in an inline XBRL file that have
82
+ duplicate elements, context IDs, and unit IDs, set the same values for the value and
83
+ decimals attribute.
84
+ """
85
+ duplicateFactSets = ValidateDuplicateFacts.getDuplicateFactSetsWithType(val.modelXbrl.facts, DuplicateType.INCOMPLETE)
86
+ for duplicateFactSet in duplicateFactSets:
87
+ fact = duplicateFactSet.facts[0]
88
+ yield Validation.error(
89
+ codes='EDINET.EC8024E',
90
+ msg=_("Instance values of the same element, context, and unit may not "
91
+ "have different values or different decimals attributes. <element=%(concept)s> "
92
+ "<contextID=%(context)s> <unit=%(unit)s>. Correct the element with the relevant "
93
+ "context ID. For elements in an inline XBRL file that have duplicate "
94
+ "elements, context IDs, and unit IDs, set the same values for the value and "
95
+ "decimals attribute."),
96
+ concept=fact.qname,
97
+ context=fact.contextID,
98
+ unit=fact.unitID,
99
+ modelObject=duplicateFactSet.facts,
100
+ )
101
+
102
+
65
103
  @validation(
66
104
  hook=ValidationHook.XBRL_FINALLY,
67
105
  disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
@@ -84,6 +122,13 @@ def rule_EC8033W(
84
122
  and context.endDatetime is not None
85
123
  and context.isStartEndPeriod
86
124
  ]
125
+ latestPriorYearContext = None
126
+ for priorYearContext in priorYearContexts:
127
+ if latestPriorYearContext is None or \
128
+ priorYearContext.endDatetime > latestPriorYearContext.endDatetime:
129
+ latestPriorYearContext = priorYearContext
130
+ if latestPriorYearContext is None:
131
+ return
87
132
  currentYearContexts = [
88
133
  context
89
134
  for contextId, context in val.modelXbrl.contexts.items()
@@ -91,17 +136,72 @@ def rule_EC8033W(
91
136
  and context.startDatetime is not None
92
137
  and context.isStartEndPeriod
93
138
  ]
94
- for priorYearContext, currentYearContext in itertools.product(priorYearContexts, currentYearContexts):
95
- if priorYearContext.endDatetime > currentYearContext.startDatetime:
139
+ earliestCurrentYearContext = None
140
+ for currentYearContext in currentYearContexts:
141
+ if earliestCurrentYearContext is None or \
142
+ currentYearContext.endDatetime > earliestCurrentYearContext.startDatetime:
143
+ earliestCurrentYearContext = currentYearContext
144
+ if earliestCurrentYearContext is None:
145
+ return
146
+ if latestPriorYearContext.endDatetime > earliestCurrentYearContext.startDatetime:
147
+ yield Validation.warning(
148
+ codes='EDINET.EC8033W',
149
+ msg=_("The startDate element of the current year context (id=%(currentYearContextId)s) is "
150
+ "set to a date that is earlier than the endDate element of the prior year context "
151
+ "(id=%(priorYearContextId)s). Please check the corresponding context ID "
152
+ "%(currentYearContextId)s and %(priorYearContextId)s. Set the startDate element of "
153
+ "context ID %(currentYearContextId)s to a date that is later than or equal to the "
154
+ "endDate element of context ID %(priorYearContextId)s."),
155
+ currentYearContextId=earliestCurrentYearContext.id,
156
+ priorYearContextId=latestPriorYearContext.id,
157
+ modelObject=priorYearContexts + currentYearContexts,
158
+ )
159
+
160
+
161
+ @validation(
162
+ hook=ValidationHook.XBRL_FINALLY,
163
+ disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
164
+ )
165
+ def rule_EC8062W(
166
+ pluginData: PluginValidationDataExtension,
167
+ val: ValidateXbrl,
168
+ *args: Any,
169
+ **kwargs: Any,
170
+ ) -> Iterable[Validation]:
171
+ """
172
+ EDINET.EC8062W: The sum of all liabilities and equity must equal the sum of all assets.
173
+ """
174
+ deduplicatedFacts = pluginData.getDeduplicatedFacts(val.modelXbrl)
175
+ contextIdPattern = regex.compile(r'^(Prior[1-9]Year|CurrentYear|Prior[1-9]Interim|Interim)(Duration|Instant)$')
176
+
177
+ factsByContextId = defaultdict(list)
178
+ for fact in deduplicatedFacts:
179
+ if fact.qname not in (pluginData.assetsIfrsQn, pluginData.liabilitiesAndEquityIfrsQn):
180
+ continue
181
+ if fact.contextID is None or not contextIdPattern.match(fact.contextID):
182
+ continue
183
+ factsByContextId[fact.contextID].append(fact)
184
+
185
+ for facts in factsByContextId.values():
186
+ assetSum = Decimal(0)
187
+ liabilitiesAndEquitySum = Decimal(0)
188
+ for fact in facts:
189
+ if isinstance(fact.xValue, float):
190
+ value = Decimal(fact.xValue)
191
+ else:
192
+ value = cast(Decimal, fact.xValue)
193
+ if fact.qname == pluginData.assetsIfrsQn:
194
+ assetSum += value
195
+ elif fact.qname == pluginData.liabilitiesAndEquityIfrsQn:
196
+ liabilitiesAndEquitySum += value
197
+ if assetSum != liabilitiesAndEquitySum:
96
198
  yield Validation.warning(
97
- codes='EDINET.EC8033W',
98
- msg=_("The startDate element of the current year context (id=%(currentYearContextId)s) is "
99
- "set to a date that is earlier than the endDate element of the prior year context "
100
- "(id=%(priorYearContextId)s). Please check the corresponding context ID "
101
- "%(currentYearContextId)s and %(priorYearContextId)s. Set the startDate element of "
102
- "context ID %(currentYearContextId)s to a date that is later than or equal to the "
103
- "endDate element of context ID %(priorYearContextId)s."),
104
- currentYearContextId=currentYearContext.id,
105
- priorYearContextId=priorYearContext.id,
106
- modelObject=(priorYearContext, currentYearContext),
199
+ codes='EDINET.EC8062W',
200
+ msg=_("The consolidated statement of financial position is not reconciled. "
201
+ "The sum of all liabilities and equity must equal the sum of all assets. "
202
+ "Please correct the debit (%(liabilitiesAndEquitySum)s) and credit (%(assetSum)s) "
203
+ "values so that they match."),
204
+ liabilitiesAndEquitySum=f"{liabilitiesAndEquitySum:,}",
205
+ assetSum=f"{assetSum:,}",
206
+ modelObject=facts,
107
207
  )
@@ -3,13 +3,16 @@ See COPYRIGHT.md for copyright information.
3
3
  """
4
4
  from __future__ import annotations
5
5
 
6
+ from collections import defaultdict
6
7
  from datetime import timedelta
7
8
  from typing import Any, cast, Iterable
8
9
 
9
10
  import regex
10
11
 
11
12
  from arelle import XbrlConst, XmlUtil
13
+ from arelle.ModelInstanceObject import ModelFact
12
14
  from arelle.ModelObject import ModelObject
15
+ from arelle.ModelValue import QName
13
16
  from arelle.PrototypeDtsObject import LocPrototype, ArcPrototype
14
17
  from arelle.UrlUtil import isHttpUrl, splitDecodeFragment
15
18
  from arelle.ValidateXbrl import ValidateXbrl
@@ -311,6 +314,42 @@ def rule_gfm_1_2_10(
311
314
  )
312
315
 
313
316
 
317
+ @validation(
318
+ hook=ValidationHook.XBRL_FINALLY,
319
+ disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
320
+ )
321
+ def rule_gfm_1_2_13(
322
+ pluginData: PluginValidationDataExtension,
323
+ val: ValidateXbrl,
324
+ *args: Any,
325
+ **kwargs: Any,
326
+ ) -> Iterable[Validation]:
327
+ """
328
+ EDINET.EC5700W: [GFM 1.2.13] An instance having a fact with non-nil content and the xml:lang
329
+ attribute of value different than the default language must also contain a fact using the same element
330
+ and all other attributes with an xml:lang attribute that represents the default language.
331
+ """
332
+ defaultLang = cast(str, val.disclosureSystem.defaultXmlLang)
333
+ languageFacts: dict[str,dict[QName, set[ModelFact]]] = defaultdict(lambda: defaultdict(set))
334
+ for fact in val.modelXbrl.facts:
335
+ if fact.xValid >= VALID and fact.xmlLang is not None and not fact.isNil:
336
+ languageFacts[fact.xmlLang][fact.qname].add(fact)
337
+ for language, qnames in languageFacts.items():
338
+ if language != defaultLang:
339
+ for qname, facts in qnames.items():
340
+ matchingQnames = languageFacts[defaultLang][qname]
341
+ for fact in facts:
342
+ if not any(fact.context.isEqualTo(mq.context) for mq in matchingQnames):
343
+ yield Validation.warning(
344
+ codes='EDINET.EC5700W.GFM.1.2.13',
345
+ msg=_('There is an element whose xml:lang attribute is in a language other than Japanese, '
346
+ 'but there is no element whose xml:lang attribute is in Japanese. Delete the non-Japanese element, '
347
+ 'or set an element whose xml:lang attribute is in Japanese.'),
348
+ modelObject = fact
349
+ )
350
+
351
+
352
+
314
353
  @validation(
315
354
  hook=ValidationHook.XBRL_FINALLY,
316
355
  disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
@@ -4,10 +4,11 @@ See COPYRIGHT.md for copyright information.
4
4
  from __future__ import annotations
5
5
 
6
6
  import os
7
- from typing import Any
7
+ from typing import Any, cast
8
8
 
9
9
  from collections import Counter
10
10
  from collections.abc import Iterable
11
+ from decimal import Decimal
11
12
 
12
13
  from arelle.typing import TypeGetText
13
14
  from arelle.ValidateXbrl import ValidateXbrl
@@ -296,23 +297,25 @@ def rule_ros19(
296
297
  """
297
298
  ROS: Rule 19: DPLTurnoverRevenue should be tested to be less than or equal to 10x the absolute value of Equity
298
299
  """
300
+ def convertToDecimal(value):
301
+ return Decimal(value) if isinstance(value, float) else cast(Decimal, value)
299
302
  equity_facts = val.modelXbrl.factsByLocalName.get(EQUITY, set())
300
303
  largest_equity_fact = None
301
304
  for e_fact in equity_facts:
302
305
  if e_fact.xValid >= VALID:
303
- if largest_equity_fact is None or abs(int(e_fact.value)) > abs(int(largest_equity_fact.value)):
306
+ if largest_equity_fact is None or abs(convertToDecimal(e_fact.xValue)) > abs(convertToDecimal(largest_equity_fact.xValue)):
304
307
  largest_equity_fact = e_fact
305
308
 
306
309
  turnover_facts = val.modelXbrl.factsByLocalName.get(TURNOVER_REVENUE, set())
307
310
  largest_turnover_fact = None
308
311
  for t_fact in turnover_facts:
309
312
  if t_fact.xValid >= VALID:
310
- if largest_turnover_fact is None or int(t_fact.value) > int(largest_turnover_fact.value):
313
+ if largest_turnover_fact is None or convertToDecimal(t_fact.xValue) > convertToDecimal(largest_turnover_fact.xValue):
311
314
  largest_turnover_fact = t_fact
312
315
 
313
316
  if (largest_equity_fact is not None and
314
317
  largest_turnover_fact is not None and
315
- int(largest_turnover_fact.value) > (10 * abs(int(largest_equity_fact.value)))):
318
+ convertToDecimal(largest_turnover_fact.xValue) > (10 * abs(convertToDecimal(largest_equity_fact.xValue)))):
316
319
  yield Validation.error(
317
320
  "ROS.19",
318
321
  _("Turnover / Revenue (DPLTurnoverRevenue) may exceed the maximum expected value. Please review the submission and, if correct, test your submission with Revenue Online's iXBRL test facility."),
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: arelle-release
3
- Version: 2.37.40
3
+ Version: 2.37.42
4
4
  Summary: An open source XBRL platform.
5
5
  Author-email: "arelle.org" <support@arelle.org>
6
6
  License-Expression: Apache-2.0
@@ -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=rxJ_q4vyjbOfPG_eNhLacH0vqtMeCXGlM6EfD3QLIcE,515
126
+ arelle/_version.py,sha256=ksGS-4a5qZTGFbhhxaUO_PlhVGdAJc3Vdh01X5jVPGA,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
@@ -396,15 +396,15 @@ arelle/plugin/validate/EDINET/Constants.py,sha256=QG69rWdpIrpQzZQkRcDWk2i3rlBVoh
396
396
  arelle/plugin/validate/EDINET/DisclosureSystems.py,sha256=3rKG42Eg-17Xx_KXU_V5yHW6I3LTwQunvf4a44C9k_4,36
397
397
  arelle/plugin/validate/EDINET/FormType.py,sha256=pJfKjdjqFcRLFgH6xbEixvpwatZBBHI8uI3xjjhaPI0,3175
398
398
  arelle/plugin/validate/EDINET/Manifest.py,sha256=VWenzA1ndOp802zpTELSLREbCrzrA-nM1UCRpRf1Q3M,4849
399
- arelle/plugin/validate/EDINET/PluginValidationDataExtension.py,sha256=vJPs5GgNJbRUBTKP0ULMb4UqvDoGATPC9dTFsKG4HyI,6347
399
+ arelle/plugin/validate/EDINET/PluginValidationDataExtension.py,sha256=8w0C-H4hskBN9rho0M6wGgQfkTZMgM3aot6L0sYLVwc,7084
400
400
  arelle/plugin/validate/EDINET/ValidationPluginExtension.py,sha256=HIGOpBOyuVs5SEh573M3IzdouRdEuNIBkdumieZi8r0,959
401
401
  arelle/plugin/validate/EDINET/__init__.py,sha256=ew9Rc2qJe5d3XvOOFzhX6MfzxNUtxIYfxRGX-wkfR1c,3555
402
- arelle/plugin/validate/EDINET/resources/config.xml,sha256=GmLcW7UIj5koXJkN19P6Nq5EZJcs6gKQLQ5f2V6u78w,614
402
+ arelle/plugin/validate/EDINET/resources/config.xml,sha256=7uT4GcRgk5veMLpFhPPQJxbGKiQvM52P8EMrjn0qd0g,646
403
403
  arelle/plugin/validate/EDINET/resources/edinet-taxonomies.xml,sha256=997I3RGTLg5OY3vn5hQxVFAAxOmDSOYpuyQe6VnWSY0,16285
404
404
  arelle/plugin/validate/EDINET/rules/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
405
- arelle/plugin/validate/EDINET/rules/edinet.py,sha256=PKbylqzhbi2ItMCW-eliaQysCzYg_rAkWzwRJmX1RtQ,4180
405
+ arelle/plugin/validate/EDINET/rules/edinet.py,sha256=DTSQY1iEeJ6TTgLFRwi99Pxu8hUdZd51M398RILhf8c,8494
406
406
  arelle/plugin/validate/EDINET/rules/frta.py,sha256=N0YglHYZuLD2IuwE26viR2ViwUYjneBuMFU9vlrS0aQ,7616
407
- arelle/plugin/validate/EDINET/rules/gfm.py,sha256=Zn803dztEEVAFqOdOnbkWTPt3h6e7DXAulc68U14ylc,20062
407
+ arelle/plugin/validate/EDINET/rules/gfm.py,sha256=4EKMho6eX-Ygl8yMBVabHQpbC-wxMvi067ubN9mp27U,21982
408
408
  arelle/plugin/validate/EDINET/rules/upload.py,sha256=HZ-9Gk6WtIichTGcSsSGIrMXNgsgJYQYwfUKeLs1XWU,20369
409
409
  arelle/plugin/validate/ESEF/Const.py,sha256=JujF_XV-_TNsxjGbF-8SQS4OOZIcJ8zhCMnr-C1O5Ho,22660
410
410
  arelle/plugin/validate/ESEF/Dimensions.py,sha256=MOJM7vwNPEmV5cu-ZzPrhx3347ZvxgD6643OB2HRnIk,10597
@@ -441,7 +441,7 @@ arelle/plugin/validate/ROS/__init__.py,sha256=KuWg1MHVzA2S6eaHFptvP3Vu_5gQWf3OUY
441
441
  arelle/plugin/validate/ROS/config.xml,sha256=ZCpCFgr1ZAjoUuhb1eRpDnmKrae-sXA9yl6SOWnrfm8,654
442
442
  arelle/plugin/validate/ROS/resources/config.xml,sha256=HXWume5HlrAqOx5AtiWWqgADbRatA8YSfm_JvZGwdgQ,657
443
443
  arelle/plugin/validate/ROS/rules/__init__.py,sha256=wW7BUAIb7sRkOxC1Amc_ZKrz03FM-Qh1TyZe6wxYaAU,1567
444
- arelle/plugin/validate/ROS/rules/ros.py,sha256=pkEDeMeDibxGO597VWQrp4sz7JAxttWbKkn-ncKHvus,19635
444
+ arelle/plugin/validate/ROS/rules/ros.py,sha256=Dk5BkfKQYItImdx5FcFvkMWT5BlJ1r_L7Vn-EsCG85A,19870
445
445
  arelle/plugin/validate/UK/ValidateUK.py,sha256=0UhSwsY1lrY-EAEBJJR9QY38YXGBZ6PEgmuC5gQfBlI,57813
446
446
  arelle/plugin/validate/UK/__init__.py,sha256=KE6s_B-EvrHDCtWQz2N_wQwyx_ZbWhYNV2GfQnluxMw,30655
447
447
  arelle/plugin/validate/UK/config.xml,sha256=mUFhWDfBzGTn7v0ZSmf4HaweQTMJh_4ZcJmD9mzCHrA,1547
@@ -759,9 +759,9 @@ arelle/utils/validate/ValidationUtil.py,sha256=9vmSvShn-EdQy56dfesyV8JjSRVPj7txr
759
759
  arelle/utils/validate/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
760
760
  arelle/webserver/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
761
761
  arelle/webserver/bottle.py,sha256=P-JECd9MCTNcxCnKoDUvGcoi03ezYVOgoWgv2_uH-6M,362
762
- arelle_release-2.37.40.dist-info/licenses/LICENSE.md,sha256=Q0tn6q0VUbr-NM8916513NCIG8MNzo24Ev-sxMUBRZc,3959
763
- arelle_release-2.37.40.dist-info/METADATA,sha256=APvbQz9C9vSm13meJ_BiDNePwH_bHMXmYHcrFeemYbo,9137
764
- arelle_release-2.37.40.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
765
- arelle_release-2.37.40.dist-info/entry_points.txt,sha256=Uj5niwfwVsx3vaQ3fYj8hrZ1xpfCJyTUA09tYKWbzpo,111
766
- arelle_release-2.37.40.dist-info/top_level.txt,sha256=fwU7SYawL4_r-sUMRg7r1nYVGjFMSDvRWx8VGAXEw7w,7
767
- arelle_release-2.37.40.dist-info/RECORD,,
762
+ arelle_release-2.37.42.dist-info/licenses/LICENSE.md,sha256=Q0tn6q0VUbr-NM8916513NCIG8MNzo24Ev-sxMUBRZc,3959
763
+ arelle_release-2.37.42.dist-info/METADATA,sha256=y-aLY_rzUkLN5s8wSNwDLgALr5YnSDDGAqVHrP1lRnI,9137
764
+ arelle_release-2.37.42.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
765
+ arelle_release-2.37.42.dist-info/entry_points.txt,sha256=Uj5niwfwVsx3vaQ3fYj8hrZ1xpfCJyTUA09tYKWbzpo,111
766
+ arelle_release-2.37.42.dist-info/top_level.txt,sha256=fwU7SYawL4_r-sUMRg7r1nYVGjFMSDvRWx8VGAXEw7w,7
767
+ arelle_release-2.37.42.dist-info/RECORD,,