arelle-release 2.17.1__py3-none-any.whl → 2.37.71__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.
Files changed (893) hide show
  1. arelle/Aspect.py +6 -3
  2. arelle/BetaFeatures.py +3 -0
  3. arelle/Cntlr.py +117 -413
  4. arelle/CntlrCmdLine.py +364 -227
  5. arelle/CntlrQuickBooks.py +4 -2
  6. arelle/CntlrWebMain.py +179 -119
  7. arelle/CntlrWinMain.py +342 -124
  8. arelle/DialogAbout.py +1 -1
  9. arelle/DialogArcroleGroup.py +1 -1
  10. arelle/DialogFind.py +1 -1
  11. arelle/DialogFormulaParameters.py +2 -2
  12. arelle/DialogLanguage.py +45 -36
  13. arelle/DialogNewFactItem.py +1 -1
  14. arelle/DialogOpenArchive.py +30 -34
  15. arelle/DialogPackageManager.py +11 -8
  16. arelle/DialogPluginManager.py +43 -89
  17. arelle/DialogRssWatch.py +2 -2
  18. arelle/DialogURL.py +1 -1
  19. arelle/DialogUserPassword.py +1 -1
  20. arelle/DisclosureSystem.py +69 -1
  21. arelle/ErrorManager.py +321 -0
  22. arelle/FileSource.py +201 -99
  23. arelle/FunctionFn.py +44 -5
  24. arelle/FunctionIxt.py +16 -13
  25. arelle/FunctionUtil.py +1 -1
  26. arelle/FunctionXfi.py +68 -24
  27. arelle/FunctionXs.py +1 -1
  28. arelle/HtmlUtil.py +5 -4
  29. arelle/LeiUtil.py +63 -43
  30. arelle/LinkbaseType.py +94 -0
  31. arelle/LocalViewer.py +8 -2
  32. arelle/Locale.py +239 -79
  33. arelle/ModelDocument.py +180 -48
  34. arelle/ModelDtsObject.py +32 -27
  35. arelle/ModelFormulaObject.py +14 -6
  36. arelle/ModelInstanceObject.py +43 -14
  37. arelle/ModelManager.py +6 -1
  38. arelle/ModelObject.py +12 -8
  39. arelle/ModelObjectFactory.py +18 -2
  40. arelle/ModelRelationshipSet.py +46 -3
  41. arelle/ModelRenderingObject.py +899 -951
  42. arelle/ModelRssItem.py +2 -4
  43. arelle/ModelTestcaseObject.py +41 -4
  44. arelle/ModelValue.py +42 -14
  45. arelle/ModelVersReport.py +1 -1
  46. arelle/ModelXbrl.py +133 -273
  47. arelle/PackageManager.py +202 -176
  48. arelle/PluginManager.py +551 -239
  49. arelle/PluginUtils.py +54 -0
  50. arelle/PrototypeInstanceObject.py +53 -12
  51. arelle/PythonUtil.py +166 -25
  52. arelle/RuntimeOptions.py +32 -18
  53. arelle/SocketUtils.py +3 -0
  54. arelle/SystemInfo.py +1 -1
  55. arelle/TkTableWrapper.py +33 -5
  56. arelle/UITkTable.py +27 -21
  57. arelle/Updater.py +7 -3
  58. arelle/UrlUtil.py +6 -2
  59. arelle/Validate.py +596 -402
  60. arelle/ValidateDuplicateFacts.py +584 -0
  61. arelle/ValidateFileSource.py +38 -0
  62. arelle/ValidateFilingText.py +46 -29
  63. arelle/ValidateInfoset.py +104 -32
  64. arelle/ValidateUtr.py +31 -4
  65. arelle/ValidateXbrl.py +144 -120
  66. arelle/ValidateXbrlCalcs.py +51 -66
  67. arelle/ValidateXbrlDTS.py +98 -29
  68. arelle/Version.py +2 -7
  69. arelle/ViewFile.py +2 -0
  70. arelle/ViewFileDTS.py +7 -2
  71. arelle/ViewFileFactList.py +1 -1
  72. arelle/ViewFileFactTable.py +4 -4
  73. arelle/ViewFileRelationshipSet.py +36 -19
  74. arelle/ViewFileRenderedGrid.py +164 -753
  75. arelle/ViewFileRenderedLayout.py +174 -0
  76. arelle/ViewFileRenderedStructure.py +108 -0
  77. arelle/ViewWinDTS.py +4 -1
  78. arelle/ViewWinFactList.py +1 -1
  79. arelle/ViewWinFactTable.py +1 -1
  80. arelle/ViewWinRelationshipSet.py +14 -8
  81. arelle/ViewWinRenderedGrid.py +397 -287
  82. arelle/ViewWinRssFeed.py +4 -0
  83. arelle/ViewWinTree.py +15 -9
  84. arelle/ViewWinXml.py +1 -1
  85. arelle/WebCache.py +510 -272
  86. arelle/XbrlConst.py +202 -196
  87. arelle/XbrlUtil.py +2 -1
  88. arelle/XhtmlValidate.py +9 -23
  89. arelle/XmlUtil.py +24 -19
  90. arelle/XmlValidate.py +95 -67
  91. arelle/XmlValidateParticles.py +4 -4
  92. arelle/_version.py +33 -3
  93. arelle/api/Session.py +183 -0
  94. arelle/config/creationSoftwareNames.json +24 -10
  95. arelle/config/disclosuresystems.xml +1 -1
  96. arelle/config/disclosuresystems.xsd +3 -0
  97. arelle/config/sbr-text-formatting.xsd +737 -0
  98. arelle/conformance/CSVTestcaseLoader.py +102 -0
  99. arelle/formula/FactAspectsCache.py +10 -4
  100. arelle/formula/ValidateFormula.py +82 -194
  101. arelle/formula/XPathContext.py +42 -28
  102. arelle/formula/XPathParser.py +15 -9
  103. arelle/locale/ar_EG/LC_MESSAGES/ar_EG.po +3 -4
  104. arelle/locale/messages.pot +1 -2
  105. arelle/locale/ru/LC_MESSAGES/ru.po +2 -2
  106. arelle/logging/formatters/LogFormatter.py +47 -0
  107. arelle/logging/handlers/LogHandlerWithXml.py +94 -0
  108. arelle/logging/handlers/LogToBufferHandler.py +20 -0
  109. arelle/logging/handlers/LogToPrintHandler.py +41 -0
  110. arelle/logging/handlers/LogToXmlHandler.py +244 -0
  111. arelle/logging/handlers/StructuredMessageLogHandler.py +74 -0
  112. arelle/model/CommentBase.py +3 -0
  113. arelle/model/ElementBase.py +3 -0
  114. arelle/model/PIBase.py +3 -0
  115. arelle/model/__init__.py +3 -0
  116. arelle/oim/Load.py +2869 -0
  117. arelle/oim/Validate.py +155 -0
  118. arelle/oim/xml/Save.py +21 -0
  119. arelle/packages/PackageConst.py +7 -0
  120. arelle/packages/PackageType.py +13 -0
  121. arelle/packages/PackageUtils.py +22 -0
  122. arelle/packages/PackageValidation.py +200 -0
  123. arelle/packages/report/DetectReportPackage.py +13 -0
  124. arelle/packages/report/ReportPackage.py +265 -0
  125. arelle/packages/report/ReportPackageConst.py +79 -0
  126. arelle/packages/report/ReportPackageValidator.py +207 -0
  127. arelle/plugin/EdgarRendererAllReports.py +12 -12
  128. arelle/plugin/OimTaxonomy/ModelValueMore.py +15 -0
  129. arelle/plugin/OimTaxonomy/ValidateDTS.py +484 -0
  130. arelle/plugin/OimTaxonomy/ViewXbrlTxmyObj.py +239 -0
  131. arelle/plugin/OimTaxonomy/XbrlAbstract.py +16 -0
  132. arelle/plugin/OimTaxonomy/XbrlConcept.py +68 -0
  133. arelle/plugin/OimTaxonomy/XbrlConst.py +261 -0
  134. arelle/plugin/OimTaxonomy/XbrlCube.py +91 -0
  135. arelle/plugin/OimTaxonomy/XbrlDimension.py +38 -0
  136. arelle/plugin/OimTaxonomy/XbrlDts.py +152 -0
  137. arelle/plugin/OimTaxonomy/XbrlEntity.py +16 -0
  138. arelle/plugin/OimTaxonomy/XbrlGroup.py +22 -0
  139. arelle/plugin/OimTaxonomy/XbrlImportedTaxonomy.py +22 -0
  140. arelle/plugin/OimTaxonomy/XbrlLabel.py +31 -0
  141. arelle/plugin/OimTaxonomy/XbrlNetwork.py +100 -0
  142. arelle/plugin/OimTaxonomy/XbrlProperty.py +28 -0
  143. arelle/plugin/OimTaxonomy/XbrlReference.py +33 -0
  144. arelle/plugin/OimTaxonomy/XbrlReport.py +24 -0
  145. arelle/plugin/OimTaxonomy/XbrlTableTemplate.py +35 -0
  146. arelle/plugin/OimTaxonomy/XbrlTaxonomy.py +93 -0
  147. arelle/plugin/OimTaxonomy/XbrlTaxonomyObject.py +154 -0
  148. arelle/plugin/OimTaxonomy/XbrlTransform.py +17 -0
  149. arelle/plugin/OimTaxonomy/XbrlTypes.py +23 -0
  150. arelle/plugin/OimTaxonomy/XbrlUnit.py +17 -0
  151. arelle/plugin/OimTaxonomy/__init__.py +1037 -0
  152. arelle/plugin/OimTaxonomy/resources/iso4217.json +4479 -0
  153. arelle/plugin/OimTaxonomy/resources/oim-taxonomy-schema.json +935 -0
  154. arelle/plugin/OimTaxonomy/resources/ref.json +333 -0
  155. arelle/plugin/OimTaxonomy/resources/transform-types.json +2481 -0
  156. arelle/plugin/OimTaxonomy/resources/types.json +727 -0
  157. arelle/plugin/OimTaxonomy/resources/utr.json +3046 -0
  158. arelle/plugin/OimTaxonomy/resources/xbrlSpec.json +1082 -0
  159. arelle/plugin/formulaLoader.py +3 -3
  160. arelle/plugin/formulaSaver.py +4 -4
  161. arelle/plugin/inlineXbrlDocumentSet.py +331 -102
  162. arelle/plugin/internet/proxyNTLM/HTTPNtlmAuthHandler.py +1 -1
  163. arelle/plugin/loadFromExcel.py +13 -10
  164. arelle/plugin/loadFromOIM.py +16 -3096
  165. arelle/plugin/logging/saveMessages.py +1 -1
  166. arelle/plugin/saveHtmlEBAtables.py +293 -213
  167. arelle/plugin/saveLoadableOIM.py +652 -361
  168. arelle/plugin/saveOIMTaxonomy.py +311 -0
  169. arelle/plugin/streamingExtensions.py +1 -1
  170. arelle/plugin/systemInfo.py +46 -0
  171. arelle/plugin/transforms/tester.py +4 -4
  172. arelle/plugin/validate/CIPC/Const.py +18 -0
  173. arelle/plugin/validate/CIPC/__init__.py +34 -13
  174. arelle/plugin/validate/DBA/DisclosureSystems.py +12 -0
  175. arelle/plugin/validate/DBA/PluginValidationDataExtension.py +165 -0
  176. arelle/plugin/validate/DBA/ValidationPluginExtension.py +545 -0
  177. arelle/plugin/validate/DBA/__init__.py +49 -0
  178. arelle/plugin/validate/DBA/resources/config.xml +21 -0
  179. arelle/plugin/validate/DBA/rules/__init__.py +323 -0
  180. arelle/plugin/validate/DBA/rules/fr.py +1377 -0
  181. arelle/plugin/validate/DBA/rules/tc.py +45 -0
  182. arelle/plugin/validate/DBA/rules/th.py +172 -0
  183. arelle/plugin/validate/DBA/rules/tm.py +351 -0
  184. arelle/plugin/validate/DBA/rules/tr.py +373 -0
  185. arelle/plugin/validate/EBA/__init__.py +11 -12
  186. arelle/plugin/validate/EDINET/Constants.py +208 -0
  187. arelle/plugin/validate/EDINET/ContextRequirement.py +58 -0
  188. arelle/plugin/validate/EDINET/ControllerPluginData.py +298 -0
  189. arelle/plugin/validate/EDINET/CoverItemRequirements.py +42 -0
  190. arelle/plugin/validate/EDINET/DeiRequirements.py +118 -0
  191. arelle/plugin/validate/EDINET/DisclosureSystems.py +1 -0
  192. arelle/plugin/validate/EDINET/FilingFormat.py +275 -0
  193. arelle/plugin/validate/EDINET/FormType.py +134 -0
  194. arelle/plugin/validate/EDINET/ManifestInstance.py +236 -0
  195. arelle/plugin/validate/EDINET/PluginValidationDataExtension.py +640 -0
  196. arelle/plugin/validate/EDINET/ReportFolderType.py +162 -0
  197. arelle/plugin/validate/EDINET/Statement.py +139 -0
  198. arelle/plugin/validate/EDINET/TableOfContentsBuilder.py +493 -0
  199. arelle/plugin/validate/EDINET/UploadContents.py +48 -0
  200. arelle/plugin/validate/EDINET/ValidationPluginExtension.py +64 -0
  201. arelle/plugin/validate/EDINET/__init__.py +109 -0
  202. arelle/plugin/validate/EDINET/resources/config.xml +22 -0
  203. arelle/plugin/validate/EDINET/resources/cover-item-requirements.json +793 -0
  204. arelle/plugin/validate/EDINET/resources/dei-requirements.csv +27 -0
  205. arelle/plugin/validate/EDINET/resources/edinet-taxonomies.xml +62 -0
  206. arelle/plugin/validate/EDINET/rules/contexts.py +547 -0
  207. arelle/plugin/validate/EDINET/rules/edinet.py +1991 -0
  208. arelle/plugin/validate/EDINET/rules/frta.py +301 -0
  209. arelle/plugin/validate/EDINET/rules/gfm.py +2394 -0
  210. arelle/plugin/validate/EDINET/rules/manifests.py +88 -0
  211. arelle/plugin/validate/EDINET/rules/upload.py +1370 -0
  212. arelle/plugin/validate/ESEF/Const.py +16 -75
  213. arelle/plugin/validate/ESEF/Dimensions.py +2 -2
  214. arelle/plugin/validate/ESEF/ESEF_2021/DTS.py +6 -1
  215. arelle/plugin/validate/ESEF/ESEF_2021/Image.py +7 -4
  216. arelle/plugin/validate/ESEF/ESEF_2021/ValidateXbrlFinally.py +80 -57
  217. arelle/plugin/validate/ESEF/ESEF_Current/DTS.py +60 -22
  218. arelle/plugin/validate/ESEF/ESEF_Current/ValidateXbrlFinally.py +272 -133
  219. arelle/plugin/validate/ESEF/Util.py +5 -19
  220. arelle/plugin/validate/ESEF/__init__.py +61 -46
  221. arelle/plugin/validate/ESEF/resources/authority-validations.json +120 -10
  222. arelle/plugin/validate/ESEF/resources/config.xml +44 -3
  223. arelle/plugin/validate/FERC/__init__.py +31 -18
  224. arelle/plugin/validate/FERC/config.xml +18 -18
  225. arelle/plugin/validate/NL/DisclosureSystems.py +19 -3
  226. arelle/plugin/validate/NL/PluginValidationDataExtension.py +710 -7
  227. arelle/plugin/validate/NL/ValidationPluginExtension.py +117 -12
  228. arelle/plugin/validate/NL/__init__.py +21 -10
  229. arelle/plugin/validate/NL/resources/config.xml +27 -6
  230. arelle/plugin/validate/NL/rules/br_kvk.py +81 -21
  231. arelle/plugin/validate/NL/rules/fg_nl.py +292 -0
  232. arelle/plugin/validate/NL/rules/fr_kvk.py +60 -7
  233. arelle/plugin/validate/NL/rules/fr_nl.py +705 -24
  234. arelle/plugin/validate/NL/rules/nl_kvk.py +2182 -0
  235. arelle/plugin/validate/ROS/DisclosureSystems.py +1 -0
  236. arelle/plugin/validate/ROS/PluginValidationDataExtension.py +109 -0
  237. arelle/plugin/validate/ROS/ValidationPluginExtension.py +27 -0
  238. arelle/plugin/validate/ROS/__init__.py +28 -341
  239. arelle/plugin/validate/ROS/resources/config.xml +20 -0
  240. arelle/plugin/validate/ROS/rules/__init__.py +56 -0
  241. arelle/plugin/validate/ROS/rules/ros.py +393 -0
  242. arelle/plugin/validate/UK/ValidateUK.py +1372 -0
  243. arelle/plugin/validate/{HMRC → UK}/__init__.py +195 -189
  244. arelle/plugin/validate/{HMRC → UK}/config.xml +1 -1
  245. arelle/plugin/xbrlDB/SqlDb.py +1 -1
  246. arelle/plugin/xbrlDB/XbrlOpenSqlDB.py +5 -5
  247. arelle/plugin/xbrlDB/XbrlPublicPostgresDB.py +1 -1
  248. arelle/plugin/xbrlDB/XbrlSemanticJsonDB.py +1 -1
  249. arelle/plugin/xbrlDB/XbrlSemanticRdfDB.py +1 -1
  250. arelle/plugin/xbrlDB/__init__.py +4 -1
  251. arelle/{RenderingEvaluator.py → rendering/RenderingEvaluator.py} +120 -99
  252. arelle/rendering/RenderingLayout.py +476 -0
  253. arelle/rendering/RenderingResolution.py +814 -0
  254. arelle/resources/cache/http/www.eurofiling.info/eu/fr/xbrl/ext/filing-indicators.xsd +20 -0
  255. arelle/resources/cache/http/www.w3.org/2001/03/xml.xsd +117 -0
  256. arelle/resources/cache/http/www.w3.org/2001/XMLSchema.xsd +2534 -0
  257. arelle/resources/cache/http/www.w3.org/2001/xml.xsd +287 -0
  258. arelle/resources/cache/http/www.xbrl.org/2003/xbrl-instance-2003-12-31.xsd +779 -0
  259. arelle/resources/cache/http/www.xbrl.org/2003/xbrl-linkbase-2003-12-31.xsd +486 -0
  260. arelle/resources/cache/http/www.xbrl.org/2003/xl-2003-12-31.xsd +251 -0
  261. arelle/resources/cache/http/www.xbrl.org/2003/xlink-2003-12-31.xsd +121 -0
  262. arelle/resources/cache/http/www.xbrl.org/2004/ref-2004-08-10.xsd +129 -0
  263. arelle/resources/cache/http/www.xbrl.org/2005/xbrldt-2005.xsd +53 -0
  264. arelle/resources/cache/http/www.xbrl.org/2006/ref-2006-02-27.xsd +120 -0
  265. arelle/resources/cache/http/www.xbrl.org/2006/xbrldi-2006.xsd +41 -0
  266. arelle/resources/cache/http/www.xbrl.org/2008/boolean-filter.xsd +51 -0
  267. arelle/resources/cache/http/www.xbrl.org/2008/concept-filter.xsd +127 -0
  268. arelle/resources/cache/http/www.xbrl.org/2008/conformance.xsd +116 -0
  269. arelle/resources/cache/http/www.xbrl.org/2008/conformanceFunction.xsd +51 -0
  270. arelle/resources/cache/http/www.xbrl.org/2008/consistency-assertion.xsd +66 -0
  271. arelle/resources/cache/http/www.xbrl.org/2008/dimension-filter.xsd +86 -0
  272. arelle/resources/cache/http/www.xbrl.org/2008/entity-filter.xsd +92 -0
  273. arelle/resources/cache/http/www.xbrl.org/2008/existence-assertion.xsd +44 -0
  274. arelle/resources/cache/http/www.xbrl.org/2008/formula.xsd +261 -0
  275. arelle/resources/cache/http/www.xbrl.org/2008/function.xsd +90 -0
  276. arelle/resources/cache/http/www.xbrl.org/2008/general-filter.xsd +38 -0
  277. arelle/resources/cache/http/www.xbrl.org/2008/generic-label.xsd +80 -0
  278. arelle/resources/cache/http/www.xbrl.org/2008/generic-link.xsd +81 -0
  279. arelle/resources/cache/http/www.xbrl.org/2008/generic-reference.xsd +63 -0
  280. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xbrl/xbrl-instance-2003-12-31-ixmod.xsd +788 -0
  281. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xbrl/xbrl-linkbase-2003-12-31-ixmod.xsd +488 -0
  282. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xbrl/xl-2003-12-31.xsd +248 -0
  283. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xbrl/xlink-2003-12-31.xsd +117 -0
  284. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xframes-1.xsd +166 -0
  285. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-applet-1.xsd +66 -0
  286. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-attribs-1.xsd +72 -0
  287. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-base-1.xsd +36 -0
  288. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-basic-form-1.xsd +195 -0
  289. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-basic-table-1.xsd +169 -0
  290. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-basic10-model-1.xsd +376 -0
  291. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-basic10-module-redefines-1.xsd +61 -0
  292. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-basic10-modules-1.xsd +259 -0
  293. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-basic10.xsd +98 -0
  294. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-bdo-1.xsd +78 -0
  295. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-blkphras-1.xsd +161 -0
  296. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-blkpres-1.xsd +37 -0
  297. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-blkstruct-1.xsd +49 -0
  298. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-charent-1.xsd +38 -0
  299. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-copyright-1.xsd +29 -0
  300. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-csismap-1.xsd +96 -0
  301. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-datatypes-1.xsd +128 -0
  302. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-edit-1.xsd +39 -0
  303. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-events-1.xsd +130 -0
  304. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-form-1.xsd +326 -0
  305. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-frames-1.xsd +113 -0
  306. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-framework-1.xsd +66 -0
  307. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-hypertext-1.xsd +47 -0
  308. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-iframe-1.xsd +68 -0
  309. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-image-1.xsd +45 -0
  310. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-inlphras-1.xsd +163 -0
  311. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-inlpres-1.xsd +39 -0
  312. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-inlstruct-1.xsd +50 -0
  313. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-inlstyle-1.xsd +27 -0
  314. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-legacy-1.xsd +97 -0
  315. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-link-1.xsd +45 -0
  316. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-list-1.xsd +99 -0
  317. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-meta-1.xsd +42 -0
  318. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-misc-1.xsd +441 -0
  319. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-nameident-1.xsd +63 -0
  320. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-notations-1.xsd +69 -0
  321. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-object-1.xsd +76 -0
  322. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-param-1.xsd +51 -0
  323. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-pres-1.xsd +51 -0
  324. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-ruby-1.xsd +171 -0
  325. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-ruby-basic-1.xsd +89 -0
  326. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-script-1.xsd +70 -0
  327. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-ssismap-1.xsd +43 -0
  328. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-struct-1.xsd +112 -0
  329. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-style-1.xsd +52 -0
  330. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-table-1.xsd +272 -0
  331. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-target-1.xsd +53 -0
  332. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-text-1.xsd +67 -0
  333. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml11-model-1.xsd +677 -0
  334. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml11-module-redefines-1.xsd +335 -0
  335. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml11-modules-1.xsd +528 -0
  336. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml11.xsd +104 -0
  337. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml2.xsd +21 -0
  338. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xml-events-1.xsd +73 -0
  339. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xml-events-2.xsd +74 -0
  340. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xml-events-attribs-1.xsd +73 -0
  341. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xml-events-attribs-2.xsd +75 -0
  342. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xml-events-copyright-1.xsd +34 -0
  343. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xml-events-copyright-2.xsd +34 -0
  344. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xml-handlers-2.xsd +98 -0
  345. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml-inlinexbrl-1_0-definitions.xsd +225 -0
  346. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml-inlinexbrl-1_0-model.xsd +681 -0
  347. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml-inlinexbrl-1_0-modules.xsd +535 -0
  348. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml-inlinexbrl-1_0.xsd +40 -0
  349. arelle/resources/cache/http/www.xbrl.org/2008/match-filter.xsd +94 -0
  350. arelle/resources/cache/http/www.xbrl.org/2008/period-filter.xsd +86 -0
  351. arelle/resources/cache/http/www.xbrl.org/2008/registry.xsd +145 -0
  352. arelle/resources/cache/http/www.xbrl.org/2008/relative-filter.xsd +38 -0
  353. arelle/resources/cache/http/www.xbrl.org/2008/segment-scenario-filter.xsd +41 -0
  354. arelle/resources/cache/http/www.xbrl.org/2008/tuple-filter.xsd +83 -0
  355. arelle/resources/cache/http/www.xbrl.org/2008/unit-filter.xsd +58 -0
  356. arelle/resources/cache/http/www.xbrl.org/2008/validation.xsd +78 -0
  357. arelle/resources/cache/http/www.xbrl.org/2008/value-assertion.xsd +43 -0
  358. arelle/resources/cache/http/www.xbrl.org/2008/value-filter.xsd +43 -0
  359. arelle/resources/cache/http/www.xbrl.org/2008/variable.xsd +240 -0
  360. arelle/resources/cache/http/www.xbrl.org/2010/aspect-cover-filter.xsd +67 -0
  361. arelle/resources/cache/http/www.xbrl.org/2010/concept-relation-filter.xsd +108 -0
  362. arelle/resources/cache/http/www.xbrl.org/2010/custom-function-implementation.xsd +71 -0
  363. arelle/resources/cache/http/www.xbrl.org/2010/generic-message.xsd +68 -0
  364. arelle/resources/cache/http/www.xbrl.org/2010/validation-message.xsd +50 -0
  365. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xbrl/xbrl-instance-2003-12-31-ixmod.xsd +788 -0
  366. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xbrl/xbrl-linkbase-2003-12-31-ixmod.xsd +488 -0
  367. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xbrl/xl-2003-12-31.xsd +248 -0
  368. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xbrl/xlink-2003-12-31.xsd +117 -0
  369. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xframes-1.xsd +166 -0
  370. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-applet-1.xsd +66 -0
  371. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-attribs-1.xsd +72 -0
  372. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-base-1.xsd +36 -0
  373. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-basic-form-1.xsd +195 -0
  374. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-basic-table-1.xsd +169 -0
  375. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-basic10-model-1.xsd +376 -0
  376. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-basic10-module-redefines-1.xsd +61 -0
  377. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-basic10-modules-1.xsd +259 -0
  378. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-basic10.xsd +98 -0
  379. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-bdo-1.xsd +78 -0
  380. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-blkphras-1.xsd +161 -0
  381. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-blkpres-1.xsd +37 -0
  382. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-blkstruct-1.xsd +49 -0
  383. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-charent-1.xsd +38 -0
  384. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-copyright-1.xsd +29 -0
  385. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-csismap-1.xsd +96 -0
  386. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-datatypes-1.xsd +128 -0
  387. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-edit-1.xsd +39 -0
  388. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-events-1.xsd +130 -0
  389. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-form-1.xsd +326 -0
  390. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-frames-1.xsd +113 -0
  391. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-framework-1.xsd +66 -0
  392. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-hypertext-1.xsd +47 -0
  393. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-iframe-1.xsd +68 -0
  394. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-image-1.xsd +45 -0
  395. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-inlphras-1.xsd +163 -0
  396. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-inlpres-1.xsd +39 -0
  397. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-inlstruct-1.xsd +50 -0
  398. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-inlstyle-1.xsd +27 -0
  399. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-legacy-1.xsd +97 -0
  400. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-link-1.xsd +45 -0
  401. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-list-1.xsd +99 -0
  402. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-meta-1.xsd +42 -0
  403. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-misc-1.xsd +441 -0
  404. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-nameident-1.xsd +63 -0
  405. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-notations-1.xsd +69 -0
  406. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-object-1.xsd +76 -0
  407. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-param-1.xsd +51 -0
  408. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-pres-1.xsd +51 -0
  409. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-ruby-1.xsd +171 -0
  410. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-ruby-basic-1.xsd +89 -0
  411. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-script-1.xsd +70 -0
  412. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-ssismap-1.xsd +43 -0
  413. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-struct-1.xsd +112 -0
  414. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-style-1.xsd +52 -0
  415. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-table-1.xsd +272 -0
  416. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-target-1.xsd +53 -0
  417. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-text-1.xsd +67 -0
  418. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml11-model-1.xsd +677 -0
  419. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml11-module-redefines-1.xsd +335 -0
  420. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml11-modules-1.xsd +528 -0
  421. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml11.xsd +104 -0
  422. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml2.xsd +21 -0
  423. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xml-events-1.xsd +73 -0
  424. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xml-events-2.xsd +74 -0
  425. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xml-events-attribs-1.xsd +73 -0
  426. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xml-events-attribs-2.xsd +75 -0
  427. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xml-events-copyright-1.xsd +34 -0
  428. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xml-events-copyright-2.xsd +34 -0
  429. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xml-handlers-2.xsd +98 -0
  430. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml-inlinexbrl-1_1-definitions.xsd +252 -0
  431. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml-inlinexbrl-1_1-model.xsd +681 -0
  432. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml-inlinexbrl-1_1-modules.xsd +535 -0
  433. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml-inlinexbrl-1_1.xsd +40 -0
  434. arelle/resources/cache/http/www.xbrl.org/2013/match-filter.xsd +94 -0
  435. arelle/resources/cache/http/www.xbrl.org/2013/preferred-label.xsd +12 -0
  436. arelle/resources/cache/http/www.xbrl.org/2013/versioning-base.xsd +142 -0
  437. arelle/resources/cache/http/www.xbrl.org/2013/versioning-concept-details.xsd +143 -0
  438. arelle/resources/cache/http/www.xbrl.org/2013/versioning-concept-use.xsd +64 -0
  439. arelle/resources/cache/http/www.xbrl.org/2013/versioning-dimensions.xsd +162 -0
  440. arelle/resources/cache/http/www.xbrl.org/2014/extensible-enumerations.xsd +27 -0
  441. arelle/resources/cache/http/www.xbrl.org/2014/table.xsd +356 -0
  442. arelle/resources/cache/http/www.xbrl.org/2014/tablemodel.xsd +156 -0
  443. arelle/resources/cache/http/www.xbrl.org/2016/assertion-severity.xsd +29 -0
  444. arelle/resources/cache/http/www.xbrl.org/2016/severities.xml +21 -0
  445. arelle/resources/cache/http/www.xbrl.org/2016/taxonomy-package-catalog.xsd +38 -0
  446. arelle/resources/cache/http/www.xbrl.org/2016/taxonomy-package.xsd +154 -0
  447. arelle/resources/cache/http/www.xbrl.org/2022/assertion-severity.xsd +43 -0
  448. arelle/resources/cache/http/www.xbrl.org/2022/severities.xml +21 -0
  449. arelle/resources/cache/http/www.xbrl.org/dtr/type/nonNumeric-2009-12-16.xsd +76 -0
  450. arelle/resources/cache/http/www.xbrl.org/dtr/type/numeric-2009-12-16.xsd +78 -0
  451. arelle/resources/cache/http/www.xbrl.org/lrr/arcrole/accounting-arcrole-2023-01-04.xsd +39 -0
  452. arelle/resources/cache/http/www.xbrl.org/lrr/arcrole/deprecated-2009-12-16.xsd +29 -0
  453. arelle/resources/cache/http/www.xbrl.org/lrr/arcrole/esma-arcrole-2018-11-21.xsd +14 -0
  454. arelle/resources/cache/http/www.xbrl.org/lrr/arcrole/factExplanatory-2009-12-16.xsd +13 -0
  455. arelle/resources/cache/http/www.xbrl.org/lrr/arcrole/jpfr-arcrole-2007-11-07.xsd +27 -0
  456. arelle/resources/cache/http/www.xbrl.org/lrr/arcrole/parent-child-2013-09-19.xsd +12 -0
  457. arelle/resources/cache/http/www.xbrl.org/lrr/role/deprecated-2009-12-16.xsd +17 -0
  458. arelle/resources/cache/http/www.xbrl.org/lrr/role/jpfr-role-2007-11-07.xsd +47 -0
  459. arelle/resources/cache/http/www.xbrl.org/lrr/role/negated-2008-03-31.xsd +30 -0
  460. arelle/resources/cache/http/www.xbrl.org/lrr/role/negated-2009-12-16.xsd +33 -0
  461. arelle/resources/cache/http/www.xbrl.org/lrr/role/negative-2009-12-16.xsd +25 -0
  462. arelle/resources/cache/http/www.xbrl.org/lrr/role/net-2009-12-16.xsd +13 -0
  463. arelle/resources/cache/http/www.xbrl.org/lrr/role/positive-2009-12-16.xsd +25 -0
  464. arelle/resources/cache/http/www.xbrl.org/lrr/role/property-2022-09-28.xsd +15 -0
  465. arelle/resources/cache/http/www.xbrl.org/lrr/role/reference-2009-12-16.xsd +21 -0
  466. arelle/resources/cache/http/www.xbrl.org/lrr/role/restated-2006-02-21.xsd +19 -0
  467. arelle/resources/cache/http/www.xbrl.org/utr/2012-01-30/utr.xml +4543 -0
  468. arelle/resources/cache/http/www.xbrl.org/utr/2012-10-31/utr.xml +4510 -0
  469. arelle/resources/cache/http/www.xbrl.org/utr/2012-11-30/utr.xml +4567 -0
  470. arelle/resources/cache/http/www.xbrl.org/utr/2013-02-28/utr.xml +5180 -0
  471. arelle/resources/cache/http/www.xbrl.org/utr/2013-05-17/utr.xml +5349 -0
  472. arelle/resources/cache/http/www.xbrl.org/utr/2016-08-10/utr.xml +5363 -0
  473. arelle/resources/cache/http/www.xbrl.org/utr/2017-07-12/utr.xml +6164 -0
  474. arelle/resources/cache/http/www.xbrl.org/utr/2021-02-16/utr.xml +6370 -0
  475. arelle/resources/cache/http/www.xbrl.org/utr/2021-12-08/utr.xml +6493 -0
  476. arelle/resources/cache/http/www.xbrl.org/utr/2022-02-16/utr.xml +6551 -0
  477. arelle/resources/cache/http/www.xbrl.org/utr/2022-07-20/utr.xml +6638 -0
  478. arelle/resources/cache/http/www.xbrl.org/utr/2023-12-20/utr.xml +6680 -0
  479. arelle/resources/cache/http/www.xbrl.org/utr/2024-01-31/utr.xml +6680 -0
  480. arelle/resources/cache/http/www.xbrl.org/utr/2024-10-22/utr.xml +6693 -0
  481. arelle/resources/cache/http/www.xbrl.org/utr/utr.xml +6693 -0
  482. arelle/resources/cache/https/www.xbrl.org/2005/conformance.xsd +87 -0
  483. arelle/resources/cache/https/www.xbrl.org/2020/extensible-enumerations-2.0.xsd +51 -0
  484. arelle/resources/cache/https/www.xbrl.org/2023/calculation-1.1.xsd +27 -0
  485. arelle/resources/cache/https/www.xbrl.org/dtr/type/2020-01-21/types.xsd +812 -0
  486. arelle/resources/cache/https/www.xbrl.org/dtr/type/2022-03-31/types.xsd +847 -0
  487. arelle/resources/cache/https/www.xbrl.org/dtr/type/2024-01-31/types.xsd +897 -0
  488. arelle/resources/cache/https/www.xbrl.org/taxonomy/int/filing-indicators/REC/2021-02-03/filing-indicators-def.xml +68 -0
  489. arelle/resources/cache/https/www.xbrl.org/taxonomy/int/filing-indicators/REC/2021-02-03/filing-indicators-label.xml +84 -0
  490. arelle/resources/cache/https/www.xbrl.org/taxonomy/int/filing-indicators/REC/2021-02-03/filing-indicators.xsd +67 -0
  491. arelle/resources/libs/Tktable2.11/linux-x86_64/README.txt +149 -0
  492. arelle/resources/libs/Tktable2.11/linux-x86_64/html/tkTable.html +2039 -0
  493. arelle/resources/libs/Tktable2.11/linux-x86_64/libTktable2.11.so +0 -0
  494. arelle/resources/libs/Tktable2.11/linux-x86_64/license.txt +51 -0
  495. arelle/resources/libs/Tktable2.11/linux-x86_64/pkgIndex.tcl +3 -0
  496. arelle/resources/libs/Tktable2.11/linux-x86_64/tkTable.tcl +825 -0
  497. arelle/resources/libs/Tktable2.11/linux-x86_64/tktable.py +674 -0
  498. arelle/resources/libs/Tktable2.11/macos-arm64/README.txt +149 -0
  499. arelle/resources/libs/Tktable2.11/macos-arm64/html/tkTable.html +2039 -0
  500. arelle/resources/libs/Tktable2.11/macos-arm64/libTktable2.11.dylib +0 -0
  501. arelle/resources/libs/Tktable2.11/macos-arm64/license.txt +51 -0
  502. arelle/resources/libs/Tktable2.11/macos-arm64/pkgIndex.tcl +2 -0
  503. arelle/resources/libs/Tktable2.11/macos-arm64/tkTable.tcl +825 -0
  504. arelle/resources/libs/Tktable2.11/macos-arm64/tktable.py +674 -0
  505. arelle/resources/libs/Tktable2.11/macos-x86_64/README.txt +149 -0
  506. arelle/resources/libs/Tktable2.11/macos-x86_64/html/tkTable.html +2039 -0
  507. arelle/resources/libs/Tktable2.11/macos-x86_64/libTktable2.11.dylib +0 -0
  508. arelle/resources/libs/Tktable2.11/macos-x86_64/license.txt +51 -0
  509. arelle/resources/libs/Tktable2.11/macos-x86_64/pkgIndex.tcl +2 -0
  510. arelle/resources/libs/Tktable2.11/macos-x86_64/tkTable.tcl +825 -0
  511. arelle/resources/libs/Tktable2.11/macos-x86_64/tktable.py +674 -0
  512. arelle/resources/libs/Tktable2.11/win-x86_64/Tktable.dll +0 -0
  513. arelle/resources/libs/Tktable2.11/win-x86_64/pkgIndex.tcl +2 -0
  514. arelle/resources/libs/Tktable2.11/win-x86_64/tkTable.tcl +825 -0
  515. arelle/typing.py +9 -4
  516. arelle/utils/Contexts.py +38 -0
  517. arelle/utils/EntryPointDetection.py +139 -0
  518. arelle/utils/Equivalence.py +22 -0
  519. arelle/utils/{validate/PluginValidationData.py → PluginData.py} +5 -2
  520. arelle/utils/PluginHooks.py +256 -5
  521. arelle/utils/Units.py +36 -0
  522. arelle/utils/validate/Decorator.py +5 -3
  523. arelle/utils/validate/DetectScriptsInXhtml.py +99 -0
  524. arelle/utils/validate/ESEFImage.py +283 -0
  525. arelle/utils/validate/Validation.py +9 -1
  526. arelle/utils/validate/ValidationPlugin.py +74 -11
  527. arelle/utils/validate/ValidationUtil.py +55 -0
  528. arelle/webserver/bottle.py +5 -4424
  529. {arelle_release-2.17.1.dist-info → arelle_release-2.37.71.dist-info}/METADATA +51 -42
  530. arelle_release-2.37.71.dist-info/RECORD +697 -0
  531. {arelle_release-2.17.1.dist-info → arelle_release-2.37.71.dist-info}/WHEEL +1 -1
  532. {arelle_release-2.17.1.dist-info → arelle_release-2.37.71.dist-info/licenses}/LICENSE.md +1 -4
  533. {arelle_release-2.17.1.dist-info → arelle_release-2.37.71.dist-info}/top_level.txt +0 -1
  534. arelle/DialogOpenTaxonomyPackage.py +0 -1
  535. arelle/RenderingResolver.py +0 -624
  536. arelle/examples/.pydevproject +0 -5
  537. arelle/examples/CustomLogger.py +0 -43
  538. arelle/examples/LoadEFMvalidate.py +0 -32
  539. arelle/examples/LoadSavePreLbCsv.py +0 -26
  540. arelle/examples/LoadValidate.cs +0 -31
  541. arelle/examples/LoadValidate.py +0 -36
  542. arelle/examples/LoadValidateCmdLine.java +0 -69
  543. arelle/examples/LoadValidatePostedZip.java +0 -57
  544. arelle/examples/LoadValidateWebService.java +0 -34
  545. arelle/examples/SaveTableToExelle.py +0 -140
  546. arelle/examples/TR3toTR4.py +0 -88
  547. arelle/examples/plugin/bigInstance.py +0 -394
  548. arelle/examples/plugin/cmdWebServerExtension.py +0 -42
  549. arelle/examples/plugin/crashTest.py +0 -38
  550. arelle/examples/plugin/formulaSuiteConverter.py +0 -212
  551. arelle/examples/plugin/functionsCustom.py +0 -59
  552. arelle/examples/plugin/hello_dolly.py +0 -64
  553. arelle/examples/plugin/hello_i18n.pot +0 -26
  554. arelle/examples/plugin/hello_i18n.py +0 -32
  555. arelle/examples/plugin/importTestChild1.py +0 -21
  556. arelle/examples/plugin/importTestChild2.py +0 -22
  557. arelle/examples/plugin/importTestGrandchild1.py +0 -21
  558. arelle/examples/plugin/importTestGrandchild2.py +0 -21
  559. arelle/examples/plugin/importTestImported1.py +0 -23
  560. arelle/examples/plugin/importTestImported11.py +0 -22
  561. arelle/examples/plugin/importTestParent.py +0 -48
  562. arelle/examples/plugin/locale/fr/LC_MESSAGES/hello_i18n.po +0 -25
  563. arelle/examples/plugin/packagedImportTest/__init__.py +0 -47
  564. arelle/examples/plugin/packagedImportTest/importTestChild1.py +0 -21
  565. arelle/examples/plugin/packagedImportTest/importTestChild2.py +0 -22
  566. arelle/examples/plugin/packagedImportTest/importTestGrandchild1.py +0 -21
  567. arelle/examples/plugin/packagedImportTest/importTestGrandchild2.py +0 -21
  568. arelle/examples/plugin/packagedImportTest/importTestImported1.py +0 -24
  569. arelle/examples/plugin/packagedImportTest/importTestImported11.py +0 -21
  570. arelle/examples/plugin/packagedImportTest/subdir/importTestImported111.py +0 -21
  571. arelle/examples/plugin/packagedImportTest/subdir/subsubdir/importTestImported1111.py +0 -21
  572. arelle/examples/plugin/sakaCalendar.py +0 -215
  573. arelle/examples/plugin/saveInstanceInfoset.py +0 -121
  574. arelle/examples/plugin/streamingExtensions.py +0 -335
  575. arelle/examples/plugin/testcaseCalc11ValidateSetup.py +0 -32
  576. arelle/examples/plugin/testcaseIxExpectedHtmlFixup.py +0 -45
  577. arelle/examples/plugin/updateTableLB.py +0 -242
  578. arelle/examples/plugin/validate/XYZ/DisclosureSystems.py +0 -2
  579. arelle/examples/plugin/validate/XYZ/PluginValidationDataExtension.py +0 -10
  580. arelle/examples/plugin/validate/XYZ/ValidationPluginExtension.py +0 -49
  581. arelle/examples/plugin/validate/XYZ/__init__.py +0 -75
  582. arelle/examples/plugin/validate/XYZ/resources/config.xml +0 -16
  583. arelle/examples/plugin/validate/XYZ/rules/rules01.py +0 -109
  584. arelle/examples/plugin/validate/XYZ/rules/rules02.py +0 -58
  585. arelle/examples/plugin/validateSchemaLxml.py +0 -156
  586. arelle/examples/plugin/validateTableInfoset.py +0 -52
  587. arelle/examples/us-gaap-dei-docType-extraction-frm.xml +0 -90
  588. arelle/examples/us-gaap-dei-ratio-cash-frm.xml +0 -150
  589. arelle/plugin/functionsXmlCreation.py +0 -106
  590. arelle/plugin/instanceInfo.py +0 -306
  591. arelle/plugin/loadFromOIM-2018.py +0 -1282
  592. arelle/plugin/objectmaker.py +0 -285
  593. arelle/plugin/sphinx/FormulaGenerator.py +0 -823
  594. arelle/plugin/sphinx/SphinxContext.py +0 -404
  595. arelle/plugin/sphinx/SphinxEvaluator.py +0 -783
  596. arelle/plugin/sphinx/SphinxMethods.py +0 -1287
  597. arelle/plugin/sphinx/SphinxParser.py +0 -1093
  598. arelle/plugin/sphinx/SphinxValidator.py +0 -163
  599. arelle/plugin/sphinx/US-GAAP Ratios Example.xsr +0 -52
  600. arelle/plugin/sphinx/__init__.py +0 -285
  601. arelle/plugin/transforms/SEC/__init__.py +0 -308
  602. arelle/plugin/transforms/SEC/conf/README.md +0 -39
  603. arelle/plugin/transforms/SEC/conf/extractTestcase.sh +0 -2
  604. arelle/plugin/transforms/SEC/conf/extractTestcase.xsl +0 -109
  605. arelle/plugin/transforms/SEC/conf/runIxtSecTests.sh +0 -16
  606. arelle/plugin/transforms/SEC/conf/saxon9.jar +0 -0
  607. arelle/plugin/transforms/SEC/conf/testcase.xml +0 -7117
  608. arelle/plugin/transforms/SEC/conf/tests.xml +0 -848
  609. arelle/plugin/transforms/SEC/text2num.py +0 -110
  610. arelle/plugin/transforms/SEC/transformationRegistry/registry/ixt-sec-boolballotbox.xml +0 -66
  611. arelle/plugin/transforms/SEC/transformationRegistry/registry/ixt-sec-countrynameen.xml +0 -65
  612. arelle/plugin/transforms/SEC/transformationRegistry/registry/ixt-sec-datequarterend.xml +0 -66
  613. arelle/plugin/transforms/SEC/transformationRegistry/registry/ixt-sec-durday.xml +0 -61
  614. arelle/plugin/transforms/SEC/transformationRegistry/registry/ixt-sec-durhour.xml +0 -69
  615. arelle/plugin/transforms/SEC/transformationRegistry/registry/ixt-sec-durmonth.xml +0 -71
  616. arelle/plugin/transforms/SEC/transformationRegistry/registry/ixt-sec-durweek.xml +0 -70
  617. arelle/plugin/transforms/SEC/transformationRegistry/registry/ixt-sec-durwordsen.xml +0 -56
  618. arelle/plugin/transforms/SEC/transformationRegistry/registry/ixt-sec-duryear.xml +0 -64
  619. arelle/plugin/transforms/SEC/transformationRegistry/registry/ixt-sec-edgarprovcountryen.xml +0 -65
  620. arelle/plugin/transforms/SEC/transformationRegistry/registry/ixt-sec-entityfilercategoryen.xml +0 -63
  621. arelle/plugin/transforms/SEC/transformationRegistry/registry/ixt-sec-exchnameen.xml +0 -86
  622. arelle/plugin/transforms/SEC/transformationRegistry/registry/ixt-sec-numwordsen.xml +0 -55
  623. arelle/plugin/transforms/SEC/transformationRegistry/registry/ixt-sec-stateprovnameen.xml +0 -64
  624. arelle/plugin/transforms/SEC/transformationRegistry/registry/ixt-sec-yesnoballotbox.xml +0 -66
  625. arelle/plugin/transforms/SEC/transformationRegistry/registry/transform-registry.xml +0 -314
  626. arelle/plugin/transforms/SEC/transformationRegistry/schema/inlinexbrl-sec-transformation.xsd +0 -418
  627. arelle/plugin/validate/EFM/Consts.py +0 -362
  628. arelle/plugin/validate/EFM/DTS.py +0 -569
  629. arelle/plugin/validate/EFM/Dimensions.py +0 -264
  630. arelle/plugin/validate/EFM/Document.py +0 -206
  631. arelle/plugin/validate/EFM/Filing.py +0 -4383
  632. arelle/plugin/validate/EFM/IsolateSeparateIXDSes.py +0 -19
  633. arelle/plugin/validate/EFM/MessageNumericId.py +0 -142
  634. arelle/plugin/validate/EFM/PreCalAlignment.py +0 -324
  635. arelle/plugin/validate/EFM/Util.py +0 -688
  636. arelle/plugin/validate/EFM/__init__.py +0 -843
  637. arelle/plugin/validate/EFM/config.xml +0 -333
  638. arelle/plugin/validate/EFM/resources/README.md +0 -57
  639. arelle/plugin/validate/EFM/resources/axiswarnings.json +0 -27
  640. arelle/plugin/validate/EFM/resources/cef-deprecated-concepts.json +0 -8
  641. arelle/plugin/validate/EFM/resources/country-deprecated-concepts.json +0 -19
  642. arelle/plugin/validate/EFM/resources/currency-deprecated-concepts.json +0 -7
  643. arelle/plugin/validate/EFM/resources/dei-deprecated-concepts.json +0 -8
  644. arelle/plugin/validate/EFM/resources/dei-validations.json +0 -2884
  645. arelle/plugin/validate/EFM/resources/dqc-us-rules.json +0 -1389
  646. arelle/plugin/validate/EFM/resources/ecd-deprecated-concepts.json +0 -1
  647. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-16-4.xml +0 -115
  648. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-17-0-4.xml +0 -300
  649. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-17-1.xml +0 -304
  650. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-17-2.xml +0 -290
  651. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-17-3-1.xml +0 -294
  652. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-18.1.xml +0 -549
  653. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-18.2.xml +0 -506
  654. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-18.3.xml +0 -496
  655. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-19-1.xml +0 -662
  656. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-19-2.xml +0 -3761
  657. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-19-3.xml +0 -3577
  658. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-20-1.xml +0 -4020
  659. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-20-2.xml +0 -3320
  660. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-20-3.xml +0 -2998
  661. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-2012.xml +0 -957
  662. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-2013.xml +0 -982
  663. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-2014.xml +0 -1001
  664. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-2015.xml +0 -1076
  665. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-2016.xml +0 -120
  666. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-21-1.xml +0 -3329
  667. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-21-2.xml +0 -1230
  668. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-21-3.xml +0 -1113
  669. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-21-4.xml +0 -1321
  670. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-22-1-preview.xml +0 -1721
  671. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-22-1.xml +0 -1841
  672. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-22-2-2.xml +0 -1450
  673. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-22-2.xml +0 -1429
  674. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-22-4.xml +0 -1527
  675. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-23-1-1.xml +0 -2049
  676. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-23-1.xml +0 -2065
  677. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-23-2.xml +0 -1674
  678. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-23-3.xml +0 -1715
  679. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-all-years.xml +0 -10671
  680. arelle/plugin/validate/EFM/resources/edgartaxonomies/erxl.xsd +0 -69
  681. arelle/plugin/validate/EFM/resources/edgartaxonomies/extendedtaxonomies-all-years.xml +0 -18
  682. arelle/plugin/validate/EFM/resources/edgartaxonomies/ifrs-taxonomies.xml +0 -3126
  683. arelle/plugin/validate/EFM/resources/edgartaxonomies/ifrstaxonomies-all-years.xml +0 -22
  684. arelle/plugin/validate/EFM/resources/ex26-validations.json +0 -255
  685. arelle/plugin/validate/EFM/resources/exch-deprecated-concepts.json +0 -163
  686. arelle/plugin/validate/EFM/resources/ifrs-full-deprecated-concepts.json +0 -204
  687. arelle/plugin/validate/EFM/resources/invest-deprecated-concepts.json +0 -99
  688. arelle/plugin/validate/EFM/resources/ixbrl-transform-registries.json +0 -16
  689. arelle/plugin/validate/EFM/resources/naics-deprecated-concepts.json +0 -295
  690. arelle/plugin/validate/EFM/resources/oef-deprecated-concepts.json +0 -59
  691. arelle/plugin/validate/EFM/resources/other-standard-taxonomies.json +0 -12
  692. arelle/plugin/validate/EFM/resources/rr-deprecated-concepts.json +0 -14
  693. arelle/plugin/validate/EFM/resources/rxp-deprecated-concepts.json +0 -1
  694. arelle/plugin/validate/EFM/resources/shr-deprecated-concepts.json +0 -1
  695. arelle/plugin/validate/EFM/resources/sic-deprecated-concepts.json +0 -1
  696. arelle/plugin/validate/EFM/resources/signwarnings.json +0 -112
  697. arelle/plugin/validate/EFM/resources/srt-deprecated-concepts.json +0 -1
  698. arelle/plugin/validate/EFM/resources/stpr-deprecated-concepts.json +0 -1
  699. arelle/plugin/validate/EFM/resources/taxonomy-compatibility.json +0 -79
  700. arelle/plugin/validate/EFM/resources/us-gaap-deprecated-concepts.json +0 -2886
  701. arelle/plugin/validate/EFM/resources/us-gaap-rels-2020.json +0 -29068
  702. arelle/plugin/validate/EFM/resources/us-gaap-rels-2021.json +0 -29598
  703. arelle/plugin/validate/EFM/resources/us-gaap-rels-2022.json +0 -29141
  704. arelle/plugin/validate/EFM/resources/us-gaap-rels-2023.json +0 -29400
  705. arelle/plugin/validate/EFM/resources/vip-deprecated-concepts.json +0 -1
  706. arelle/plugin/validate/EFM/tools/CheckTxmyRefs.py +0 -180
  707. arelle/plugin/validate/EFM-htm/Const.py +0 -205
  708. arelle/plugin/validate/EFM-htm/__init__.py +0 -217
  709. arelle/plugin/validate/EFM-htm/config.xml +0 -17
  710. arelle/plugin/validate/EFM-htm/resources/efm-htm.dtd +0 -664
  711. arelle/plugin/validate/ESEF/ESEF_Current/Image.py +0 -199
  712. arelle/plugin/validate/ESEF_2022/__init__.py +0 -47
  713. arelle/plugin/validate/GFM/__init__.py +0 -59
  714. arelle/plugin/validate/GFM/config.xml +0 -82
  715. arelle/plugin/validate/SBRnl/CustomLoader.py +0 -19
  716. arelle/plugin/validate/SBRnl/DTS.py +0 -305
  717. arelle/plugin/validate/SBRnl/Dimensions.py +0 -357
  718. arelle/plugin/validate/SBRnl/Document.py +0 -799
  719. arelle/plugin/validate/SBRnl/Filing.py +0 -467
  720. arelle/plugin/validate/SBRnl/__init__.py +0 -75
  721. arelle/plugin/validate/SBRnl/config.xml +0 -26
  722. arelle/plugin/validate/SBRnl/sbr-nl-taxonomies.xml +0 -754
  723. arelle/plugin/validate/USBestPractices.py +0 -570
  724. arelle/plugin/validate/USCorpAction.py +0 -557
  725. arelle/plugin/validate/USSecTagging.py +0 -337
  726. arelle/plugin/validate/XDC/__init__.py +0 -77
  727. arelle/plugin/validate/XDC/config.xml +0 -20
  728. arelle/plugin/validate/XFsyntax/__init__.py +0 -64
  729. arelle/plugin/validate/XFsyntax/xf.py +0 -2227
  730. arelle/plugin/validate/__init__.py +0 -20
  731. arelle/plugin/validate/calc2.py +0 -536
  732. arelle/plugin/validateSBRnl.py +0 -530
  733. arelle/scripts-macOS/startWebServer.command +0 -3
  734. arelle/scripts-unix/startWebServer.sh +0 -1
  735. arelle/scripts-windows/startWebServer.bat +0 -5
  736. arelle_release-2.17.1.dist-info/RECORD +0 -676
  737. tests/__init__.py +0 -0
  738. tests/integration_tests/ui_tests/ArelleGUITest/ArelleGUITest/ArelleGUITest.csproj +0 -30
  739. tests/integration_tests/ui_tests/ArelleGUITest/ArelleGUITest/Tests.cs +0 -381
  740. tests/integration_tests/ui_tests/ArelleGUITest/ArelleGUITest/Usings.cs +0 -1
  741. tests/integration_tests/ui_tests/ArelleGUITest/ArelleGUITest.sln +0 -31
  742. tests/integration_tests/ui_tests/resources/workiva.zip +0 -0
  743. tests/integration_tests/validation/README.md +0 -50
  744. tests/integration_tests/validation/conformance_suite_config.py +0 -59
  745. tests/integration_tests/validation/conformance_suite_configs.py +0 -63
  746. tests/integration_tests/validation/conformance_suite_configurations/efm_current.py +0 -261
  747. tests/integration_tests/validation/conformance_suite_configurations/esef_ixbrl_2021.py +0 -85
  748. tests/integration_tests/validation/conformance_suite_configurations/esef_ixbrl_2022.py +0 -90
  749. tests/integration_tests/validation/conformance_suite_configurations/esef_xhtml_2021.py +0 -15
  750. tests/integration_tests/validation/conformance_suite_configurations/esef_xhtml_2022.py +0 -15
  751. tests/integration_tests/validation/conformance_suite_configurations/nl_nt16.py +0 -13
  752. tests/integration_tests/validation/conformance_suite_configurations/nl_nt17.py +0 -13
  753. tests/integration_tests/validation/conformance_suite_configurations/nl_nt18.py +0 -13
  754. tests/integration_tests/validation/conformance_suite_configurations/xbrl_2_1.py +0 -34
  755. tests/integration_tests/validation/conformance_suite_configurations/xbrl_calculations_1_1.py +0 -40
  756. tests/integration_tests/validation/conformance_suite_configurations/xbrl_dimensions_1_0.py +0 -28
  757. tests/integration_tests/validation/conformance_suite_configurations/xbrl_extensible_enumerations_1_0.py +0 -10
  758. tests/integration_tests/validation/conformance_suite_configurations/xbrl_extensible_enumerations_2_0.py +0 -10
  759. tests/integration_tests/validation/conformance_suite_configurations/xbrl_formula_1_0.py +0 -9
  760. tests/integration_tests/validation/conformance_suite_configurations/xbrl_formula_1_0_assertion_severity_2_0.py +0 -9
  761. tests/integration_tests/validation/conformance_suite_configurations/xbrl_formula_1_0_function_registry.py +0 -14
  762. tests/integration_tests/validation/conformance_suite_configurations/xbrl_ixbrl_1_1.py +0 -22
  763. tests/integration_tests/validation/conformance_suite_configurations/xbrl_link_role_registry_1_0.py +0 -11
  764. tests/integration_tests/validation/conformance_suite_configurations/xbrl_oim_1_0.py +0 -19
  765. tests/integration_tests/validation/conformance_suite_configurations/xbrl_table_linkbase_1_0.py +0 -296
  766. tests/integration_tests/validation/conformance_suite_configurations/xbrl_taxonomy_packages_1_0.py +0 -13
  767. tests/integration_tests/validation/conformance_suite_configurations/xbrl_transformation_registry_3.py +0 -13
  768. tests/integration_tests/validation/conformance_suite_configurations/xbrl_transformation_registry_4.py +0 -13
  769. tests/integration_tests/validation/conformance_suite_configurations/xbrl_transformation_registry_5.py +0 -13
  770. tests/integration_tests/validation/conformance_suite_configurations/xbrl_utr_malformed_1_0.py +0 -31
  771. tests/integration_tests/validation/conformance_suite_configurations/xbrl_utr_registry_1_0.py +0 -22
  772. tests/integration_tests/validation/conformance_suite_configurations/xbrl_utr_structure_1_0.py +0 -18
  773. tests/integration_tests/validation/conftest.py +0 -24
  774. tests/integration_tests/validation/discover_tests.py +0 -22
  775. tests/integration_tests/validation/download_conformance_suites.py +0 -47
  776. tests/integration_tests/validation/run_conformance_suites.py +0 -175
  777. tests/integration_tests/validation/test_conformance_suites.py +0 -14
  778. tests/integration_tests/validation/validation_util.py +0 -271
  779. tests/resources/conformance_suites/nl_nt16/br_kvk/2-04-invalid-period.xbrl +0 -63
  780. tests/resources/conformance_suites/nl_nt16/br_kvk/2-04-testcase.xml +0 -22
  781. tests/resources/conformance_suites/nl_nt16/br_kvk/3-01-missing.xbrl +0 -53
  782. tests/resources/conformance_suites/nl_nt16/br_kvk/3-01-multiple.xbrl +0 -60
  783. tests/resources/conformance_suites/nl_nt16/br_kvk/3-01-testcase.xml +0 -33
  784. tests/resources/conformance_suites/nl_nt16/br_kvk/4-07-invalid.xbrl +0 -57
  785. tests/resources/conformance_suites/nl_nt16/br_kvk/4-07-testcase.xml +0 -22
  786. tests/resources/conformance_suites/nl_nt16/br_kvk/4-10-invalid.xbrl +0 -58
  787. tests/resources/conformance_suites/nl_nt16/br_kvk/4-10-testcase.xml +0 -22
  788. tests/resources/conformance_suites/nl_nt16/br_kvk/4-12-invalid.xbrl +0 -63
  789. tests/resources/conformance_suites/nl_nt16/br_kvk/4-12-testcase.xml +0 -22
  790. tests/resources/conformance_suites/nl_nt16/br_kvk/4-16-missing.xbrl +0 -61
  791. tests/resources/conformance_suites/nl_nt16/br_kvk/4-16-testcase.xml +0 -22
  792. tests/resources/conformance_suites/nl_nt16/br_kvk/4-20-invalid-date.xbrl +0 -89
  793. tests/resources/conformance_suites/nl_nt16/br_kvk/4-20-testcase.xml +0 -22
  794. tests/resources/conformance_suites/nl_nt16/fr_kvk/1-01-invalid-file-extension.xml +0 -56
  795. tests/resources/conformance_suites/nl_nt16/fr_kvk/1-01-testcase.xml +0 -22
  796. tests/resources/conformance_suites/nl_nt16/fr_kvk/2-01-invalid-lang.xbrl +0 -56
  797. tests/resources/conformance_suites/nl_nt16/fr_kvk/2-01-missing-lang.xbrl +0 -55
  798. tests/resources/conformance_suites/nl_nt16/fr_kvk/2-01-testcase.xml +0 -33
  799. tests/resources/conformance_suites/nl_nt16/fr_kvk/2-03-entrypoint.xsd +0 -6
  800. tests/resources/conformance_suites/nl_nt16/fr_kvk/2-03-invalid-entrypoint.xbrl +0 -63
  801. tests/resources/conformance_suites/nl_nt16/fr_kvk/2-03-testcase.xml +0 -22
  802. tests/resources/conformance_suites/nl_nt16/fr_kvk/5-01-invalid-decimals.xbrl +0 -49
  803. tests/resources/conformance_suites/nl_nt16/fr_kvk/5-01-testcase.xml +0 -22
  804. tests/resources/conformance_suites/nl_nt16/fr_kvk/5-02-invalid-decimals.xbrl +0 -49
  805. tests/resources/conformance_suites/nl_nt16/fr_kvk/5-02-testcase.xml +0 -22
  806. tests/resources/conformance_suites/nl_nt16/fr_nl/1-01-invalid-file.xbrl +0 -2
  807. tests/resources/conformance_suites/nl_nt16/fr_nl/1-01-invalid-zip.zip +0 -0
  808. tests/resources/conformance_suites/nl_nt16/fr_nl/1-01-testcase.xml +0 -33
  809. tests/resources/conformance_suites/nl_nt16/fr_nl/1-03-invalid-doctype.xbrl +0 -4
  810. tests/resources/conformance_suites/nl_nt16/fr_nl/1-03-testcase.xml +0 -22
  811. tests/resources/conformance_suites/nl_nt16/fr_nl/1-05-invalid-encoding.xbrl +0 -0
  812. tests/resources/conformance_suites/nl_nt16/fr_nl/1-05-testcase.xml +0 -22
  813. tests/resources/conformance_suites/nl_nt16/fr_nl/1-06-testcase.xml +0 -22
  814. tests/resources/conformance_suites/nl_nt16/fr_nl/1-06.invalid.xbrl +0 -2
  815. tests/resources/conformance_suites/nl_nt16/fr_nl/2-06-invalid-file.xbrl +0 -8
  816. tests/resources/conformance_suites/nl_nt16/fr_nl/2-06-invalid-zip.zip +0 -0
  817. tests/resources/conformance_suites/nl_nt16/fr_nl/2-06-testcase.xml +0 -33
  818. tests/resources/conformance_suites/nl_nt16/index.xml +0 -20
  819. tests/resources/conformance_suites/nl_nt17/br_kvk/2-04-invalid-period.xbrl +0 -63
  820. tests/resources/conformance_suites/nl_nt17/br_kvk/2-04-testcase.xml +0 -22
  821. tests/resources/conformance_suites/nl_nt17/br_kvk/3-01-missing.xbrl +0 -53
  822. tests/resources/conformance_suites/nl_nt17/br_kvk/3-01-multiple.xbrl +0 -60
  823. tests/resources/conformance_suites/nl_nt17/br_kvk/3-01-testcase.xml +0 -33
  824. tests/resources/conformance_suites/nl_nt17/br_kvk/4-07-invalid.xbrl +0 -57
  825. tests/resources/conformance_suites/nl_nt17/br_kvk/4-07-testcase.xml +0 -22
  826. tests/resources/conformance_suites/nl_nt17/br_kvk/4-10-invalid.xbrl +0 -58
  827. tests/resources/conformance_suites/nl_nt17/br_kvk/4-10-testcase.xml +0 -22
  828. tests/resources/conformance_suites/nl_nt17/br_kvk/4-12-invalid.xbrl +0 -63
  829. tests/resources/conformance_suites/nl_nt17/br_kvk/4-12-testcase.xml +0 -22
  830. tests/resources/conformance_suites/nl_nt17/br_kvk/4-16-missing.xbrl +0 -61
  831. tests/resources/conformance_suites/nl_nt17/br_kvk/4-16-testcase.xml +0 -22
  832. tests/resources/conformance_suites/nl_nt17/br_kvk/4-20-invalid-date.xbrl +0 -89
  833. tests/resources/conformance_suites/nl_nt17/br_kvk/4-20-testcase.xml +0 -22
  834. tests/resources/conformance_suites/nl_nt17/fr_kvk/1-01-invalid-file-extension.xml +0 -56
  835. tests/resources/conformance_suites/nl_nt17/fr_kvk/1-01-testcase.xml +0 -22
  836. tests/resources/conformance_suites/nl_nt17/fr_kvk/2-01-invalid-lang.xbrl +0 -56
  837. tests/resources/conformance_suites/nl_nt17/fr_kvk/2-01-missing-lang.xbrl +0 -55
  838. tests/resources/conformance_suites/nl_nt17/fr_kvk/2-01-testcase.xml +0 -33
  839. tests/resources/conformance_suites/nl_nt17/fr_kvk/2-03-entrypoint.xsd +0 -6
  840. tests/resources/conformance_suites/nl_nt17/fr_kvk/2-03-invalid-entrypoint.xbrl +0 -63
  841. tests/resources/conformance_suites/nl_nt17/fr_kvk/2-03-testcase.xml +0 -22
  842. tests/resources/conformance_suites/nl_nt17/fr_kvk/5-01-invalid-decimals.xbrl +0 -49
  843. tests/resources/conformance_suites/nl_nt17/fr_kvk/5-01-testcase.xml +0 -22
  844. tests/resources/conformance_suites/nl_nt17/fr_kvk/5-02-invalid-decimals.xbrl +0 -49
  845. tests/resources/conformance_suites/nl_nt17/fr_kvk/5-02-testcase.xml +0 -22
  846. tests/resources/conformance_suites/nl_nt17/fr_nl/1-01-invalid-file.xbrl +0 -2
  847. tests/resources/conformance_suites/nl_nt17/fr_nl/1-01-invalid-zip.zip +0 -0
  848. tests/resources/conformance_suites/nl_nt17/fr_nl/1-01-testcase.xml +0 -33
  849. tests/resources/conformance_suites/nl_nt17/fr_nl/1-03-invalid-doctype.xbrl +0 -4
  850. tests/resources/conformance_suites/nl_nt17/fr_nl/1-03-testcase.xml +0 -22
  851. tests/resources/conformance_suites/nl_nt17/fr_nl/1-05-invalid-encoding.xbrl +0 -0
  852. tests/resources/conformance_suites/nl_nt17/fr_nl/1-05-testcases.xml +0 -22
  853. tests/resources/conformance_suites/nl_nt17/fr_nl/1-06-testcase.xml +0 -22
  854. tests/resources/conformance_suites/nl_nt17/fr_nl/1-06.invalid.xbrl +0 -2
  855. tests/resources/conformance_suites/nl_nt17/fr_nl/2-06-invalid-file.xbrl +0 -8
  856. tests/resources/conformance_suites/nl_nt17/fr_nl/2-06-invalid-zip.zip +0 -0
  857. tests/resources/conformance_suites/nl_nt17/fr_nl/2-06-testcase.xml +0 -33
  858. tests/resources/conformance_suites/nl_nt17/index.xml +0 -20
  859. tests/resources/conformance_suites/nl_nt18/fr_nl/1-03-invalid-doctype.xbrl +0 -4
  860. tests/resources/conformance_suites/nl_nt18/fr_nl/1-03-testcase.xml +0 -22
  861. tests/resources/conformance_suites/nl_nt18/fr_nl/1-05-invalid-encoding.xbrl +0 -0
  862. tests/resources/conformance_suites/nl_nt18/fr_nl/1-05-testcases.xml +0 -22
  863. tests/resources/conformance_suites/nl_nt18/fr_nl/1-06-testcase.xml +0 -22
  864. tests/resources/conformance_suites/nl_nt18/fr_nl/1-06.invalid.xbrl +0 -2
  865. tests/resources/conformance_suites/nl_nt18/fr_nl/1.01-invalid-file.xbrl +0 -2
  866. tests/resources/conformance_suites/nl_nt18/fr_nl/1.01-invalid-zip.zip +0 -0
  867. tests/resources/conformance_suites/nl_nt18/fr_nl/1.01-testcase.xml +0 -33
  868. tests/resources/conformance_suites/nl_nt18/fr_nl/2-06-invalid-file.xbrl +0 -8
  869. tests/resources/conformance_suites/nl_nt18/fr_nl/2-06-invalid-zip.zip +0 -0
  870. tests/resources/conformance_suites/nl_nt18/fr_nl/2-06-testcase.xml +0 -33
  871. tests/resources/conformance_suites/nl_nt18/index.xml +0 -8
  872. tests/unit_tests/arelle/conftest.py +0 -16
  873. tests/unit_tests/arelle/formula/test_fact_aspects_cache.py +0 -170
  874. tests/unit_tests/arelle/plugin/test_loadfromoim.py +0 -40
  875. tests/unit_tests/arelle/plugin/test_plugin_imports.py +0 -27
  876. tests/unit_tests/arelle/test_betafeatures.py +0 -81
  877. tests/unit_tests/arelle/test_cntlr.py +0 -28
  878. tests/unit_tests/arelle/test_import.py +0 -40
  879. tests/unit_tests/arelle/test_locale.py +0 -73
  880. tests/unit_tests/arelle/test_modelmanager.py +0 -15
  881. tests/unit_tests/arelle/test_packagemanager.py +0 -65
  882. tests/unit_tests/arelle/test_pluginmanager.py +0 -176
  883. tests/unit_tests/arelle/test_qname.py +0 -140
  884. tests/unit_tests/arelle/test_runtimeoptions.py +0 -56
  885. tests/unit_tests/arelle/test_system_info.py +0 -26
  886. tests/unit_tests/arelle/test_updater.py +0 -507
  887. tests/unit_tests/arelle/test_urlutil.py +0 -49
  888. tests/unit_tests/arelle/test_version.py +0 -46
  889. tests/unit_tests/arelle/utils/validate/test_decorator.py +0 -59
  890. /arelle/{examples/plugin/validate/XYZ → plugin/validate/EDINET}/rules/__init__.py +0 -0
  891. /arelle/plugin/validate/{HMRC → UK}/consistencyChecksByName.json +0 -0
  892. /arelle/plugin/validate/{HMRC → UK}/hmrc-taxonomies.xml +0 -0
  893. {arelle_release-2.17.1.dist-info → arelle_release-2.37.71.dist-info}/entry_points.txt +0 -0
@@ -0,0 +1,1370 @@
1
+ """
2
+ See COPYRIGHT.md for copyright information.
3
+ """
4
+ from __future__ import annotations
5
+
6
+ from collections import defaultdict
7
+ from collections.abc import Iterable
8
+ from pathlib import Path
9
+ from typing import TYPE_CHECKING, Any
10
+
11
+ import regex
12
+
13
+ from arelle import UrlUtil, XbrlConst
14
+ from arelle.Cntlr import Cntlr
15
+ from arelle.FileSource import FileSource
16
+ from arelle.ModelDocument import Type as ModelDocumentType
17
+ from arelle.ModelInstanceObject import ModelFact, ModelInlineFact
18
+ from arelle.ModelObject import ModelObject
19
+ from arelle.typing import TypeGetText
20
+ from arelle.utils.PluginHooks import ValidationHook
21
+ from arelle.utils.validate.Decorator import validation
22
+ from arelle.utils.validate.Validation import Validation
23
+ from arelle.ValidateXbrl import ValidateXbrl
24
+ from arelle.XmlValidateConst import VALID
25
+
26
+ from ..Constants import JAPAN_LANGUAGE_CODES
27
+ from ..DisclosureSystems import DISCLOSURE_SYSTEM_EDINET
28
+ from ..FilingFormat import Ordinance, Taxonomy
29
+ from ..PluginValidationDataExtension import PluginValidationDataExtension
30
+ from ..ReportFolderType import HTML_EXTENSIONS, IMAGE_EXTENSIONS, ReportFolderType
31
+
32
+ if TYPE_CHECKING:
33
+ from ..ControllerPluginData import ControllerPluginData
34
+
35
+ _: TypeGetText
36
+
37
+ ALLOWED_ROOT_FOLDERS = {
38
+ "AttachDoc",
39
+ "AuditDoc",
40
+ "PrivateAttach",
41
+ "PrivateDoc",
42
+ "PublicAttach",
43
+ "PublicDoc",
44
+ "XBRL",
45
+ }
46
+
47
+ FILE_COUNT_LIMITS = {
48
+ Path("AttachDoc"): 990,
49
+ Path("AuditDoc"): 990,
50
+ Path("PrivateDoc"): 9_990,
51
+ Path("PublicDoc"): 9_990,
52
+ Path("XBRL") / "AttachDoc": 990,
53
+ Path("XBRL") / "AuditDoc": 990,
54
+ Path("XBRL") / "PrivateDoc": 9_990,
55
+ Path("XBRL") / "PublicDoc": 9_990,
56
+ Path("XBRL"): 99_990,
57
+ }
58
+
59
+ FILENAME_STEM_PATTERN = regex.compile(r'[a-zA-Z0-9_-]*')
60
+
61
+
62
+ @validation(
63
+ hook=ValidationHook.FILESOURCE,
64
+ disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
65
+ )
66
+ def rule_EC0100E(
67
+ pluginData: ControllerPluginData,
68
+ cntlr: Cntlr,
69
+ fileSource: FileSource,
70
+ *args: Any,
71
+ **kwargs: Any,
72
+ ) -> Iterable[Validation]:
73
+ """
74
+ EDINET.EC0100E: An illegal directory is found directly under the transferred directory.
75
+ Only the following root folders are allowed:
76
+ AttachDoc
77
+ AuditDoc*
78
+ PrivateAttach
79
+ PrivateDoc*
80
+ PublicAttach
81
+ PublicDoc*
82
+ XBRL
83
+ * Only when reporting corrections
84
+
85
+ NOTE: since we do not have access to the submission type, we can't determine if the submission is a correction or not.
86
+ For this implementation, we will allow all directories that may be valid for at least one submission type.
87
+ This allows for a false-negative outcome when a non-correction submission has a correction-only root directory.
88
+ """
89
+ uploadContents = pluginData.getUploadContents()
90
+ if uploadContents is None:
91
+ return
92
+ for path, pathInfo in uploadContents.uploadPathsByPath.items():
93
+ if pathInfo.isRoot and path.name not in ALLOWED_ROOT_FOLDERS:
94
+ yield Validation.error(
95
+ codes='EDINET.EC0100E',
96
+ msg=_("An illegal directory is found directly under the transferred directory. "
97
+ "Directory name or file name: '%(rootDirectory)s'. "
98
+ "Delete all folders except the following folders that exist directly "
99
+ "under the root folder, and then upload again: %(allowedDirectories)s."),
100
+ rootDirectory=path.name,
101
+ allowedDirectories=', '.join(f"'{d}'" for d in ALLOWED_ROOT_FOLDERS)
102
+ )
103
+
104
+
105
+ @validation(
106
+ hook=ValidationHook.FILESOURCE,
107
+ disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
108
+ )
109
+ def rule_EC0124E_EC0187E(
110
+ pluginData: ControllerPluginData,
111
+ cntlr: Cntlr,
112
+ fileSource: FileSource,
113
+ *args: Any,
114
+ **kwargs: Any,
115
+ ) -> Iterable[Validation]:
116
+ """
117
+ EDINET.EC0124E: There are no empty root directories.
118
+ EDINET.EC0187E: There are no empty subdirectories.
119
+ """
120
+ uploadFilepaths = pluginData.getUploadFilepaths(fileSource)
121
+ emptyDirectories = []
122
+ for path, zipPath in uploadFilepaths.items():
123
+ if not zipPath.is_dir():
124
+ continue
125
+ if not any(path in p.parents for p in uploadFilepaths):
126
+ emptyDirectories.append(path)
127
+ for emptyDirectory in emptyDirectories:
128
+ if len(emptyDirectory.parts) <= 1:
129
+ yield Validation.error(
130
+ codes='EDINET.EC0124E',
131
+ msg=_("There is no file directly under '%(emptyDirectory)s'. "
132
+ "No empty root folders. "
133
+ "Please store the file in the appropriate folder or delete the folder and upload again."),
134
+ emptyDirectory=str(emptyDirectory),
135
+ )
136
+ else:
137
+ yield Validation.error(
138
+ codes='EDINET.EC0187E',
139
+ msg=_("'%(parentDirectory)s' contains a subordinate directory ('%(emptyDirectory)s') with no files. "
140
+ "Please store the file in the corresponding subfolder or delete the subfolder and upload again."),
141
+ parentDirectory=str(emptyDirectory.parent),
142
+ emptyDirectory=str(emptyDirectory),
143
+ )
144
+
145
+
146
+ @validation(
147
+ hook=ValidationHook.FILESOURCE,
148
+ disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
149
+ )
150
+ def rule_EC0129E(
151
+ pluginData: ControllerPluginData,
152
+ cntlr: Cntlr,
153
+ fileSource: FileSource,
154
+ *args: Any,
155
+ **kwargs: Any,
156
+ ) -> Iterable[Validation]:
157
+ """
158
+ EDINET.EC0129E: Limit the number of subfolders to 3 or less from the XBRL directory.
159
+ """
160
+ startingDirectory = 'XBRL'
161
+ uploadFilepaths = pluginData.getUploadFilepaths(fileSource)
162
+ for path in uploadFilepaths:
163
+ parents = [parent.name for parent in path.parents]
164
+ if startingDirectory in parents:
165
+ parents = parents[:parents.index(startingDirectory)]
166
+ else:
167
+ # TODO: Do we validate amendment subfolders too? These aren't placed beneath the XBRL directory.
168
+ continue
169
+ depth = len(parents)
170
+ if depth > 3:
171
+ yield Validation.error(
172
+ codes='EDINET.EC0129E',
173
+ msg=_("The subordinate directories of %(path)s go up to the level %(depth)s (directories: %(parents)s). "
174
+ "Please limit the number of subfolders to 3 or less and upload again."),
175
+ path=str(path),
176
+ depth=depth,
177
+ parents=', '.join(f"'{parent}'" for parent in reversed(parents)),
178
+ file=str(path)
179
+ )
180
+
181
+
182
+ @validation(
183
+ hook=ValidationHook.FILESOURCE,
184
+ disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
185
+ )
186
+ def rule_EC0130E(
187
+ pluginData: ControllerPluginData,
188
+ cntlr: Cntlr,
189
+ fileSource: FileSource,
190
+ *args: Any,
191
+ **kwargs: Any,
192
+ ) -> Iterable[Validation]:
193
+ """
194
+ EDINET.EC0130E: File extensions must match the file extensions allowed in Figure 2-1-3 and Figure 2-1-5.
195
+ """
196
+ uploadContents = pluginData.getUploadContents()
197
+ if uploadContents is None:
198
+ return
199
+ for path, pathInfo in uploadContents.uploadPathsByPath.items():
200
+ if pathInfo.reportFolderType is None or pathInfo.isDirectory:
201
+ continue
202
+ validExtensions = pathInfo.reportFolderType.getValidExtensions(pathInfo.isCorrection, pathInfo.isSubdirectory)
203
+ if validExtensions is None:
204
+ continue
205
+ ext = path.suffix
206
+ if ext not in validExtensions:
207
+ yield Validation.error(
208
+ codes='EDINET.EC0130E',
209
+ msg=_("The file extension '%(ext)s' is not valid at '%(path)s'. "
210
+ "Valid extensions at this location are: %(validExtensions)s. "
211
+ "Please change the file extension to a configurable extension and upload it again. "
212
+ "For information on configurable file extensions, please refer to 'Table 2-1-3 Storable File Formats (1)' "
213
+ "in the 'Document File Specifications' and 'Table 2-1-5 Storable File Formats (2)' in the "
214
+ "'Document File Specifications'."),
215
+ ext=ext,
216
+ path=str(path),
217
+ validExtensions=', '.join(f"'{e}'" for e in validExtensions),
218
+ file=str(path)
219
+ )
220
+
221
+
222
+ @validation(
223
+ hook=ValidationHook.FILESOURCE,
224
+ disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
225
+ )
226
+ def rule_EC0132E(
227
+ pluginData: ControllerPluginData,
228
+ cntlr: Cntlr,
229
+ fileSource: FileSource,
230
+ *args: Any,
231
+ **kwargs: Any,
232
+ ) -> Iterable[Validation]:
233
+ """
234
+ EDINET.EC0132E: Cover page or manifest file is missing.
235
+
236
+ Note: Cover page is not required in AuditDoc.
237
+ """
238
+ uploadContents = pluginData.getUploadContents()
239
+ if uploadContents is None:
240
+ return
241
+ for reportFolderType, paths in uploadContents.reports.items():
242
+ if reportFolderType.isAttachment:
243
+ # These rules don't apply to "Attach" directories
244
+ continue
245
+ coverPageFound = False
246
+ manifestFound = False
247
+ for path in paths:
248
+ pathInfo = uploadContents.uploadPathsByPath[path]
249
+ if pathInfo.isCoverPage:
250
+ coverPageFound = True
251
+ if path == reportFolderType.manifestPath:
252
+ manifestFound = True
253
+ if not coverPageFound and reportFolderType != ReportFolderType.AUDIT_DOC:
254
+ yield Validation.error(
255
+ codes='EDINET.EC0132E',
256
+ msg=_("Cover page does not exist in '%(expectedManifestDirectory)s'. "
257
+ "Please store the cover file directly under the relevant folder and upload it again. "),
258
+ expectedManifestDirectory=str(reportFolderType.manifestPath.parent),
259
+ )
260
+ if not manifestFound:
261
+ yield Validation.error(
262
+ codes='EDINET.EC0132E',
263
+ msg=_("'%(expectedManifestName)s' does not exist in '%(expectedManifestDirectory)s'. "
264
+ "Please store the manifest file directly under the relevant folder and upload it again. "),
265
+ expectedManifestName=reportFolderType.manifestPath.name,
266
+ expectedManifestDirectory=str(reportFolderType.manifestPath.parent),
267
+ )
268
+
269
+
270
+ @validation(
271
+ hook=ValidationHook.FILESOURCE,
272
+ disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
273
+ )
274
+ def rule_EC0183E(
275
+ pluginData: ControllerPluginData,
276
+ cntlr: Cntlr,
277
+ fileSource: FileSource,
278
+ *args: Any,
279
+ **kwargs: Any,
280
+ ) -> Iterable[Validation]:
281
+ """
282
+ EDINET.EC0183E: The compressed file size exceeds 55MB.
283
+ """
284
+ size = fileSource.getBytesSize()
285
+ if size is None:
286
+ return # File size is not available, cannot validate
287
+ if size > 55_000_000: # Interpretting MB as megabytes (1,000,000 bytes)
288
+ yield Validation.error(
289
+ codes='EDINET.EC0183E',
290
+ msg=_("The compressed file size exceeds 55MB. "
291
+ "Please compress the file to a size of 55MB or less and upload it again."),
292
+ )
293
+
294
+
295
+ @validation(
296
+ hook=ValidationHook.FILESOURCE,
297
+ disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
298
+ )
299
+ def rule_EC0188E(
300
+ pluginData: ControllerPluginData,
301
+ cntlr: Cntlr,
302
+ fileSource: FileSource,
303
+ *args: Any,
304
+ **kwargs: Any,
305
+ ) -> Iterable[Validation]:
306
+ """
307
+ EDINET.EC0188E: There is an HTML file directly under PublicDoc or PrivateDoc whose first 7 characters are not numbers.
308
+ """
309
+ pattern = regex.compile(r'^\d{7}')
310
+ uploadFilepaths = pluginData.getUploadFilepaths(fileSource)
311
+ docFolders = frozenset({"PublicDoc", "PrivateDoc"})
312
+ for path in uploadFilepaths:
313
+ if path.suffix not in HTML_EXTENSIONS:
314
+ continue
315
+ if path.parent.name not in docFolders:
316
+ continue
317
+ if pattern.match(path.name) is None:
318
+ yield Validation.error(
319
+ codes='EDINET.EC0188E',
320
+ msg=_("There is an html file directly under PublicDoc or PrivateDoc whose first 7 characters are not numbers: '%(path)s'."
321
+ "Please change the first 7 characters of the file name of the file directly under the folder to numbers "
322
+ "and upload it again."),
323
+ path=str(path),
324
+ file=str(path),
325
+ )
326
+
327
+
328
+ @validation(
329
+ hook=ValidationHook.FILESOURCE,
330
+ disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
331
+ )
332
+ def rule_EC0192E(
333
+ pluginData: ControllerPluginData,
334
+ cntlr: Cntlr,
335
+ fileSource: FileSource,
336
+ *args: Any,
337
+ **kwargs: Any,
338
+ ) -> Iterable[Validation]:
339
+ """
340
+ EDINET.EC0192E: The cover file for PrivateDoc cannot be set because it uses a
341
+ PublicDoc cover file. Please delete the cover file from PrivateDoc and upload
342
+ it again.
343
+ """
344
+ uploadContents = pluginData.getUploadContents()
345
+ if uploadContents is None:
346
+ return
347
+ for path, pathInfo in uploadContents.uploadPathsByPath.items():
348
+ if not pathInfo.isCoverPage:
349
+ continue
350
+ # Only applies to PrivateDoc correction reports
351
+ if pathInfo.isCorrection and pathInfo.reportFolderType == ReportFolderType.PRIVATE_DOC:
352
+ yield Validation.error(
353
+ codes='EDINET.EC0192E',
354
+ msg=_("The cover file for PrivateDoc ('%(file)s') cannot be set because it uses a PublicDoc cover file. "
355
+ "Please delete the cover file from PrivateDoc and upload it again."),
356
+ file=str(path),
357
+ )
358
+
359
+
360
+ @validation(
361
+ hook=ValidationHook.FILESOURCE,
362
+ disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
363
+ )
364
+ def rule_EC0198E(
365
+ pluginData: ControllerPluginData,
366
+ cntlr: Cntlr,
367
+ fileSource: FileSource,
368
+ *args: Any,
369
+ **kwargs: Any,
370
+ ) -> Iterable[Validation]:
371
+ """
372
+ EDINET.EC0198E: The number of files in the total submission and directories can not exceed the upper limit.
373
+ """
374
+ fileCounts: dict[Path, int] = defaultdict(int)
375
+ uploadFilepaths = pluginData.getUploadFilepaths(fileSource)
376
+ for path, zipPath in uploadFilepaths.items():
377
+ if zipPath.is_dir():
378
+ continue
379
+ for directory in FILE_COUNT_LIMITS.keys():
380
+ if directory in path.parents:
381
+ fileCounts[directory] += 1
382
+ break
383
+ for directory, limit in FILE_COUNT_LIMITS.items():
384
+ actual = fileCounts[directory]
385
+ if actual > limit:
386
+ yield Validation.error(
387
+ codes='EDINET.EC0198E',
388
+ msg=_("The number of files in %(directory)s exceeds the upper limit (%(actual)s > %(limit)s). "
389
+ "Please reduce the number of files in the folder to below the maximum and try uploading again."),
390
+ directory=str(directory),
391
+ actual="{:,}".format(actual),
392
+ limit="{:,}".format(limit),
393
+ )
394
+
395
+
396
+ @validation(
397
+ hook=ValidationHook.FILESOURCE,
398
+ disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
399
+ )
400
+ def rule_EC0233E(
401
+ pluginData: ControllerPluginData,
402
+ cntlr: Cntlr,
403
+ fileSource: FileSource,
404
+ *args: Any,
405
+ **kwargs: Any,
406
+ ) -> Iterable[Validation]:
407
+ """
408
+ EDINET.EC0233E: There is a file in the report directory that comes before the cover file
409
+ in file name sort order.
410
+
411
+ NOTE: This includes files in subdirectories. For example, PublicDoc/00000000_images/image.png
412
+ comes before PublicDoc/0000000_header_*.htm
413
+ """
414
+ uploadContents = pluginData.getUploadContents()
415
+ if uploadContents is None:
416
+ return
417
+ directories = defaultdict(list)
418
+ for path in uploadContents.sortedPaths:
419
+ pathInfo = uploadContents.uploadPathsByPath[path]
420
+ if pathInfo.isDirectory:
421
+ continue
422
+ if pathInfo.reportFolderType in (ReportFolderType.PRIVATE_DOC, ReportFolderType.PUBLIC_DOC):
423
+ directories[pathInfo.reportPath].append(pathInfo)
424
+ for reportPath, pathInfos in directories.items():
425
+ coverPagePath = next(iter(p for p in pathInfos if p.isCoverPage), None)
426
+ if coverPagePath is None:
427
+ continue
428
+ errorPathInfos = pathInfos[:pathInfos.index(coverPagePath)]
429
+ for pathInfo in errorPathInfos:
430
+ yield Validation.error(
431
+ codes='EDINET.EC0233E',
432
+ msg=_("There is a file in the report directory in '%(reportPath)s' that comes before the cover "
433
+ "file ('%(coverPage)s') in file name sort order. "
434
+ "Directory name or file name: '%(path)s'. "
435
+ "Please make sure that there are no files that come before the cover file in the file "
436
+ "name sort order, and then upload again."),
437
+ reportPath=str(reportPath),
438
+ coverPage=str(coverPagePath.path.name),
439
+ path=str(pathInfo.path),
440
+ )
441
+
442
+
443
+ @validation(
444
+ hook=ValidationHook.FILESOURCE,
445
+ disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
446
+ )
447
+ def rule_EC0234E(
448
+ pluginData: ControllerPluginData,
449
+ cntlr: Cntlr,
450
+ fileSource: FileSource,
451
+ *args: Any,
452
+ **kwargs: Any,
453
+ ) -> Iterable[Validation]:
454
+ """
455
+ EDINET.EC0234E: A cover file exists in an unsupported subdirectory.
456
+ """
457
+ uploadContents = pluginData.getUploadContents()
458
+ if uploadContents is None:
459
+ return
460
+ for path, pathInfo in uploadContents.uploadPathsByPath.items():
461
+ if pathInfo.isDirectory:
462
+ continue
463
+ if pathInfo.reportFolderType not in (ReportFolderType.PRIVATE_DOC, ReportFolderType.PUBLIC_DOC):
464
+ continue
465
+ if pathInfo.isSubdirectory and pathInfo.isCoverPage:
466
+ yield Validation.error(
467
+ codes='EDINET.EC0234E',
468
+ msg=_("A cover file ('%(coverPage)s') exists in an unsupported subdirectory. "
469
+ "Directory: '%(directory)s'. "
470
+ "Please make sure there is no cover file in the subfolder and upload again."),
471
+ coverPage=str(path.name),
472
+ directory=str(path.parent),
473
+ )
474
+
475
+
476
+ @validation(
477
+ hook=ValidationHook.FILESOURCE,
478
+ disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
479
+ )
480
+ def rule_EC0237E(
481
+ pluginData: ControllerPluginData,
482
+ cntlr: Cntlr,
483
+ fileSource: FileSource,
484
+ *args: Any,
485
+ **kwargs: Any,
486
+ ) -> Iterable[Validation]:
487
+ """
488
+ EDINET.EC0237E: The directory or file path to the lowest level exceeds the maximum value (259 characters).
489
+ """
490
+ uploadFilepaths = pluginData.getUploadFilepaths(fileSource)
491
+ for path in uploadFilepaths:
492
+ if len(str(path)) <= 259:
493
+ continue
494
+ yield Validation.error(
495
+ codes='EDINET.EC0237E',
496
+ msg=_("The directory or file path ('%(path)s') to the lowest level exceeds the maximum value (259 characters). "
497
+ "Please shorten the absolute path of the folder (or file) "
498
+ "to 259 characters or less and try uploading again."),
499
+ path=str(path),
500
+ file=str(path),
501
+ )
502
+
503
+
504
+ @validation(
505
+ hook=ValidationHook.FILESOURCE,
506
+ disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
507
+ )
508
+ def rule_EC0206E(
509
+ pluginData: ControllerPluginData,
510
+ cntlr: Cntlr,
511
+ fileSource: FileSource,
512
+ *args: Any,
513
+ **kwargs: Any,
514
+ ) -> Iterable[Validation]:
515
+ """
516
+ EDINET.EC0206E: Empty files are not permitted.
517
+ """
518
+ for path, size in pluginData.getUploadFileSizes(fileSource).items():
519
+ if size > 0:
520
+ continue
521
+ yield Validation.error(
522
+ codes='EDINET.EC0206E',
523
+ msg=_("An empty file exists. "
524
+ "File name: '%(path)s'. "
525
+ "Please delete the empty file and upload again."),
526
+ path=str(path),
527
+ file=str(path),
528
+ )
529
+
530
+
531
+ @validation(
532
+ hook=ValidationHook.FILESOURCE,
533
+ disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
534
+ )
535
+ def rule_EC0349E(
536
+ pluginData: ControllerPluginData,
537
+ cntlr: Cntlr,
538
+ fileSource: FileSource,
539
+ *args: Any,
540
+ **kwargs: Any,
541
+ ) -> Iterable[Validation]:
542
+ """
543
+ EDINET.EC0349E: An unexpected directory or file exists directly beneath the XBRL directory.
544
+ Only PublicDoc, PrivateDoc, or AuditDoc directories may exist directly beneath the XBRL directory.
545
+ """
546
+ uploadContents = pluginData.getUploadContents()
547
+ if uploadContents is None:
548
+ return
549
+ xbrlDirectoryPath = Path('XBRL')
550
+ allowedPaths = {p.xbrlDirectory for p in (
551
+ ReportFolderType.AUDIT_DOC,
552
+ ReportFolderType.PRIVATE_DOC,
553
+ ReportFolderType.PUBLIC_DOC,
554
+ )}
555
+ for path, pathInfo in uploadContents.uploadPathsByPath.items():
556
+ if path.parent != xbrlDirectoryPath:
557
+ continue
558
+ if path not in allowedPaths:
559
+ yield Validation.error(
560
+ codes='EDINET.EC0349E',
561
+ msg=_("An unexpected directory or file exists directly beneath the XBRL directory. "
562
+ "Directory or file name: '%(file)s'."),
563
+ file=path.name,
564
+ )
565
+
566
+
567
+ @validation(
568
+ hook=ValidationHook.FILESOURCE,
569
+ disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
570
+ )
571
+ def rule_EC0352E(
572
+ pluginData: ControllerPluginData,
573
+ cntlr: Cntlr,
574
+ fileSource: FileSource,
575
+ *args: Any,
576
+ **kwargs: Any,
577
+ ) -> Iterable[Validation]:
578
+ """
579
+ EDINET.EC0352E: An XBRL file with an invalid name exists.
580
+ """
581
+ uploadContents = pluginData.getUploadContents()
582
+ if uploadContents is None:
583
+ return
584
+ for path, pathInfo in uploadContents.uploadPathsByPath.items():
585
+ if (
586
+ pathInfo.isDirectory or
587
+ pathInfo.isCorrection or
588
+ pathInfo.isSubdirectory or
589
+ pathInfo.isAttachment or
590
+ pathInfo.reportFolderType is None or
591
+ any(path == t.manifestPath for t in ReportFolderType)
592
+ ):
593
+ continue
594
+ patterns = pathInfo.reportFolderType.ixbrlFilenamePatterns
595
+ if not any(pattern.fullmatch(path.name) for pattern in patterns):
596
+ yield Validation.error(
597
+ codes='EDINET.EC0352E',
598
+ msg=_("A file with an invalid name exists. "
599
+ "File path: '%(path)s'."),
600
+ path=str(path),
601
+ )
602
+
603
+
604
+ @validation(
605
+ hook=ValidationHook.XBRL_FINALLY,
606
+ disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
607
+ )
608
+ def rule_cover_items(
609
+ pluginData: PluginValidationDataExtension,
610
+ val: ValidateXbrl,
611
+ *args: Any,
612
+ **kwargs: Any,
613
+ ) -> Iterable[Validation]:
614
+ """
615
+ EDINET.EC1000E: Cover page must contain "【表紙】".
616
+ EDINET.EC1001E: A required item is missing from the cover page.
617
+ EDINET.EC1002E: A duplicate item is included on the cover page.
618
+ EDINET.EC1003E: An unnecessary item is included on the cover page.
619
+ EDINET.EC1004E: An item on the cover page is out of order.
620
+ EDINET.EC1005E: A required item on the cover page is missing a valid value.
621
+ """
622
+ uploadContents = pluginData.getUploadContents(val.modelXbrl)
623
+ if uploadContents is None:
624
+ return
625
+ for url, doc in val.modelXbrl.urlDocs.items():
626
+ path = Path(url)
627
+ pathInfo = uploadContents.uploadPathsByFullPath.get(path)
628
+ if pathInfo is None or not pathInfo.isCoverPage:
629
+ continue
630
+ rootElt = doc.xmlRootElement
631
+ coverPageTextFound = False
632
+ for elt in rootElt.iterdescendants():
633
+ if not coverPageTextFound and elt.text and '【表紙】' in elt.text:
634
+ coverPageTextFound = True
635
+ break
636
+ if not coverPageTextFound:
637
+ yield Validation.error(
638
+ codes='EDINET.EC1000E',
639
+ msg=_("There is no '【表紙】' on the cover page. "
640
+ "File name: '%(file)s'. "
641
+ "Please add '【表紙】' to the relevant file."),
642
+ file=doc.basename,
643
+ )
644
+ filingFormat = pluginData.getFilingFormat(val.modelXbrl)
645
+ if filingFormat is None:
646
+ return
647
+ allCoverItems = pluginData.getCoverItems(val.modelXbrl)
648
+ requiredCoverItems = pluginData.getCoverItemRequirements(val.modelXbrl)
649
+ if requiredCoverItems is None:
650
+ return
651
+ prohibitedCoverItems = allCoverItems - set(requiredCoverItems)
652
+ sequenceQueue = list(requiredCoverItems)
653
+
654
+ ixNStag = doc.ixNStag
655
+ rootElt = doc.xmlRootElement
656
+ foundFactsByQname = defaultdict(list)
657
+ outOfSequence = False
658
+ seenInSequence = set()
659
+ for elt in rootElt.iterdescendants(ixNStag + "nonNumeric", ixNStag + "nonFraction", ixNStag + "fraction"):
660
+ if not isinstance(elt, ModelFact):
661
+ continue
662
+ if not elt.qname in allCoverItems:
663
+ continue
664
+ if elt.qname in prohibitedCoverItems:
665
+ yield Validation.error(
666
+ codes='EDINET.EC1003E',
667
+ msg=_("Cover item %(localName)s is not necessary. "
668
+ "File name: '%(file)s' (line %(line)s). "
669
+ "Please add the cover item %(localName)s to the relevant file."),
670
+ localName=elt.qname.localName,
671
+ file=doc.basename,
672
+ line=elt.sourceline,
673
+ modelObject=elt,
674
+ )
675
+ continue
676
+ foundFactsByQname[elt.qname].append(elt)
677
+ if elt.qname in seenInSequence:
678
+ yield Validation.error(
679
+ codes='EDINET.EC1002E',
680
+ msg=_("Cover item %(localName)s is duplicated. "
681
+ "File name: '%(file)s'. "
682
+ "Please check the cover item %(localName)s of the relevant file "
683
+ "and make sure there are no duplicates."),
684
+ localName=elt.qname.localName,
685
+ file=doc.basename,
686
+ modelObject=elt,
687
+ )
688
+ continue
689
+ seenInSequence.add(elt.qname)
690
+ if len(sequenceQueue) == 0:
691
+ continue
692
+ if outOfSequence:
693
+ continue
694
+ if not sequenceQueue[0] == elt.qname:
695
+ outOfSequence = True
696
+ yield Validation.error(
697
+ codes='EDINET.EC1004E',
698
+ msg=_("Cover item %(localName)s is not in the correct order. "
699
+ "File name: '%(file)s'. "
700
+ "Please correct the order of cover items in the appropriate file."),
701
+ localName=elt.qname.localName,
702
+ file=doc.basename,
703
+ modelObject=elt,
704
+ )
705
+ if elt.qname in sequenceQueue:
706
+ sequenceQueue.remove(elt.qname)
707
+
708
+ for qname in requiredCoverItems:
709
+ foundFacts = foundFactsByQname.get(qname, [])
710
+ # No facts found.
711
+ if len(foundFacts) == 0:
712
+ yield Validation.error(
713
+ codes='EDINET.EC1001E',
714
+ msg=_("Cover item %(localName)s is missing. "
715
+ "File name: '%(file)s'. "
716
+ "Please add the cover item %(localName)s to the relevant file."),
717
+ localName=qname.localName,
718
+ file=doc.basename,
719
+ )
720
+ # Fact(s) found, but no valid, non-nil value.
721
+ elif not any(f.xValid >= VALID and not f.isNil for f in foundFacts):
722
+ yield Validation.error(
723
+ codes='EDINET.EC1005E',
724
+ msg=_("Cover item %(localName)s is missing a valid value. "
725
+ "File name: '%(file)s'. "
726
+ "Please enter a valid value for %(localName)s in the relevant file."),
727
+ localName=qname.localName,
728
+ file=doc.basename,
729
+ modelObject=foundFacts,
730
+ )
731
+
732
+
733
+ @validation(
734
+ hook=ValidationHook.XBRL_FINALLY,
735
+ disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
736
+ )
737
+ def rule_EC1006E(
738
+ pluginData: PluginValidationDataExtension,
739
+ val: ValidateXbrl,
740
+ *args: Any,
741
+ **kwargs: Any,
742
+ ) -> Iterable[Validation]:
743
+ """
744
+ EDINET.EC1006E: Prohibited tag is used in HTML.
745
+ """
746
+ for doc in val.modelXbrl.urlDocs.values():
747
+ for elt in pluginData.getProhibitedTagElements(doc):
748
+ yield Validation.error(
749
+ codes='EDINET.EC1006E',
750
+ msg=_("Prohibited tag (%(tag)s) is used in HTML. File name: %(file)s (line %(line)s). "
751
+ "Please correct the prohibited tags for the relevant files. "
752
+ "For information on prohibited tags, please refer to \"4-1-4 Prohibited Rules\" "
753
+ "in the Validation Guidelines."),
754
+ tag=elt.qname.localName,
755
+ file=doc.basename,
756
+ line=elt.sourceline,
757
+ modelObject=elt,
758
+ )
759
+
760
+
761
+ @validation(
762
+ hook=ValidationHook.XBRL_FINALLY,
763
+ disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
764
+ )
765
+ def rule_uri_references(
766
+ pluginData: PluginValidationDataExtension,
767
+ val: ValidateXbrl,
768
+ *args: Any,
769
+ **kwargs: Any,
770
+ ) -> Iterable[Validation]:
771
+ """
772
+ EDINET.EC1007E: A URI in an HTML file must not be a URL or absolute path.
773
+ EDINET.EC1013E: A URI in an HTML file directly beneath a report folder
774
+ must specify a path under a subdirectory.
775
+ EDINET.EC1014E: A URI in an HTML file must not specify a path to a directory.
776
+ EDINET.EC1015E: A URI in an HTML file within a subdirectory
777
+ must not specify a path directly beneath the report folder.
778
+ EDINET.EC1021E: A URI in an HTML file must not specify a path to a file that doesn't exist.
779
+ EDINET.EC1023E: A URI in an HTML file must not specify a path to a PDF file.
780
+ EDINET.EC1035E: A URI in an HTML file must not specify a path to a location higher than the report path.
781
+
782
+ Note: See "図表 3-4-8 PublicDoc フォルダ全体のイメージ" in "File Specification for EDINET".
783
+ """
784
+ uploadContents = pluginData.getUploadContents(val.modelXbrl)
785
+ if uploadContents is None:
786
+ return
787
+ for uriReference in pluginData.uriReferences:
788
+ if UrlUtil.isAbsolute(uriReference.attributeValue):
789
+ yield Validation.error(
790
+ codes='EDINET.EC1007E',
791
+ msg=_("The URI in the HTML specifies a URL or absolute path. "
792
+ "File name: '%(file)s' (line %(line)s). "
793
+ "Please change the links in the files to relative paths."),
794
+ file=uriReference.document.basename,
795
+ line=uriReference.element.sourceline,
796
+ modelObject=uriReference.element,
797
+ )
798
+ continue
799
+
800
+ uriPath = Path(uriReference.attributeValue)
801
+ documentFullPath = Path(uriReference.document.uri)
802
+ referenceFullPath = (documentFullPath.parent / uriPath).resolve()
803
+ documentPathInfo = uploadContents.uploadPathsByFullPath.get(documentFullPath)
804
+ assert documentPathInfo is not None # Should always be present, as it must exist to have a uriReference discovered.
805
+ reportFullPath = Path(str(val.modelXbrl.fileSource.baseurl)) / (documentPathInfo.reportPath or "")
806
+
807
+ if reportFullPath not in referenceFullPath.parents:
808
+ yield Validation.error(
809
+ codes='EDINET.EC1035E',
810
+ msg=_("The URI in the HTML specifies a path that navigates "
811
+ "outside of the report folder '%(reportPath)s'. "
812
+ "File name: '%(file)s' (line %(line)s). "
813
+ "You cannot create a link from a subfolder to a parent folder. "
814
+ "Please delete the link."),
815
+ reportPath=str(documentPathInfo.reportPath),
816
+ file=uriReference.document.basename,
817
+ line=uriReference.element.sourceline,
818
+ modelObject=uriReference.element,
819
+ )
820
+ continue
821
+
822
+ if not documentPathInfo.isSubdirectory:
823
+ if documentFullPath.parent not in referenceFullPath.parent.parents:
824
+ yield Validation.error(
825
+ codes='EDINET.EC1013E',
826
+ msg=_("The URI in the HTML file directly beneath '%(reportPath)s' "
827
+ "specifies a path not under a subdirectory. "
828
+ "File name: '%(file)s' (line %(line)s). "
829
+ "Please move the referenced file into a subfolder beneath "
830
+ "'%(reportPath)s', or correct the URI."),
831
+ reportPath=str(documentPathInfo.reportPath),
832
+ file=uriReference.document.basename,
833
+ line=uriReference.element.sourceline,
834
+ modelObject=uriReference.element,
835
+ )
836
+ continue
837
+
838
+ elif referenceFullPath.parent == reportFullPath:
839
+ yield Validation.error(
840
+ codes='EDINET.EC1015E',
841
+ msg=_("The URI in the HTML file within a subdirectory specifies a "
842
+ "path to a file located directly beneath '%(reportPath)s'. "
843
+ "File name: '%(file)s' (line %(line)s). "
844
+ "You cannot create a link from a subfolder to this parent folder. "
845
+ "Please correct the relevant link."),
846
+ reportPath=str(documentPathInfo.reportPath),
847
+ file=uriReference.document.basename,
848
+ line=uriReference.element.sourceline,
849
+ modelObject=uriReference.element,
850
+ )
851
+ continue
852
+
853
+ referencePathInfo = uploadContents.uploadPathsByFullPath.get(referenceFullPath)
854
+ if referencePathInfo is not None and referencePathInfo.isDirectory:
855
+ yield Validation.error(
856
+ codes='EDINET.EC1014E',
857
+ msg=_("The URI in the HTML specifies a path to a directory. "
858
+ "File name: '%(file)s' (line %(line)s). "
859
+ "Please update the URI to reference a file."),
860
+ file=uriReference.document.basename,
861
+ line=uriReference.element.sourceline,
862
+ modelObject=uriReference.element,
863
+ )
864
+ continue
865
+
866
+ if referenceFullPath.suffix.lower() == '.pdf':
867
+ yield Validation.error(
868
+ codes='EDINET.EC1023E',
869
+ msg=_("The URI in the HTML specifies a path to a PDF file. "
870
+ "File name: '%(file)s' (line %(line)s). "
871
+ "Please remove the link from the relevant file."),
872
+ file=uriReference.document.basename,
873
+ line=uriReference.element.sourceline,
874
+ modelObject=uriReference.element,
875
+ )
876
+ continue
877
+
878
+ if not val.modelXbrl.fileSource.exists(str(referenceFullPath)):
879
+ yield Validation.error(
880
+ codes='EDINET.EC1021E',
881
+ msg=_("The linked file ('%(path)s') does not exist. "
882
+ "File name: '%(file)s' (line %(line)s). "
883
+ "Please update the URI to reference a file."),
884
+ path=str(uriPath),
885
+ file=uriReference.document.basename,
886
+ line=uriReference.element.sourceline,
887
+ modelObject=uriReference.element,
888
+ )
889
+ continue
890
+
891
+
892
+ @validation(
893
+ hook=ValidationHook.FILESOURCE,
894
+ disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
895
+ )
896
+ def rule_EC1009R(
897
+ pluginData: ControllerPluginData,
898
+ cntlr: Cntlr,
899
+ fileSource: FileSource,
900
+ *args: Any,
901
+ **kwargs: Any,
902
+ ) -> Iterable[Validation]:
903
+ """
904
+ EDINET.EC1009R: The HTML file size must be 2.5MB (megabytes) or less.
905
+ """
906
+ for path, size in pluginData.getUploadFileSizes(fileSource).items():
907
+ if path.suffix not in HTML_EXTENSIONS:
908
+ continue
909
+ if size > 2_500_000:
910
+ yield Validation.warning(
911
+ codes='EDINET.EC1009R',
912
+ msg=_("The HTML file size exceeds the maximum limit. "
913
+ "File name: '%(path)s'. "
914
+ "Please split the file so that the file size is 2.5MB or less."),
915
+ path=str(path),
916
+ )
917
+
918
+
919
+ @validation(
920
+ hook=ValidationHook.FILESOURCE,
921
+ disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
922
+ )
923
+ def rule_EC1016E(
924
+ pluginData: ControllerPluginData,
925
+ cntlr: Cntlr,
926
+ fileSource: FileSource,
927
+ *args: Any,
928
+ **kwargs: Any,
929
+ ) -> Iterable[Validation]:
930
+ """
931
+ EDINET.EC1016E: The image file is over 300KB.
932
+ """
933
+ for path, size in pluginData.getUploadFileSizes(fileSource).items():
934
+ if path.suffix not in IMAGE_EXTENSIONS:
935
+ continue
936
+ if size <= 300_000: # Interpretting KB as kilobytes (1,000 bytes)
937
+ continue
938
+ yield Validation.error(
939
+ codes='EDINET.EC1016E',
940
+ msg=_("The image file is over 300KB. "
941
+ "File name: '%(path)s'. "
942
+ "Please create an image file with a size of 300KB or less."),
943
+ path=str(path),
944
+ file=str(path),
945
+ )
946
+
947
+
948
+ @validation(
949
+ hook=ValidationHook.COMPLETE,
950
+ disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
951
+ )
952
+ def rule_EC1017E(
953
+ pluginData: ControllerPluginData,
954
+ cntlr: Cntlr,
955
+ fileSource: FileSource,
956
+ *args: Any,
957
+ **kwargs: Any,
958
+ ) -> Iterable[Validation]:
959
+ """
960
+ EDINET.EC1017E: There is an unused file.
961
+ """
962
+ uploadContents = pluginData.getUploadContents()
963
+ if uploadContents is None:
964
+ return
965
+ existingSubdirectoryFilepaths = {
966
+ path
967
+ for path, pathInfo in uploadContents.uploadPathsByPath.items()
968
+ if pathInfo.isSubdirectory and not pathInfo.isDirectory
969
+ }
970
+ usedFilepaths = pluginData.getUsedFilepaths()
971
+ unusedSubdirectoryFilepaths = existingSubdirectoryFilepaths - usedFilepaths
972
+ for path in unusedSubdirectoryFilepaths:
973
+ yield Validation.error(
974
+ codes='EDINET.EC1017E',
975
+ msg=_("There is an unused file. "
976
+ "File name: '%(file)s'. "
977
+ "Please remove the file or reference it in the HTML."),
978
+ file=str(path),
979
+ )
980
+
981
+
982
+ @validation(
983
+ hook=ValidationHook.COMPLETE,
984
+ disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
985
+ )
986
+ def rule_toc(
987
+ pluginData: ControllerPluginData,
988
+ cntlr: Cntlr,
989
+ fileSource: FileSource,
990
+ *args: Any,
991
+ **kwargs: Any,
992
+ ) -> Iterable[Validation]:
993
+ """
994
+ Performs validation via controller-level TableOfContentsBuilder.
995
+ """
996
+ tocBuilder = pluginData.getTableOfContentsBuilder()
997
+ yield from tocBuilder.validate()
998
+
999
+
1000
+ @validation(
1001
+ hook=ValidationHook.XBRL_FINALLY,
1002
+ disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
1003
+ )
1004
+ def rule_toc_pre(
1005
+ pluginData: PluginValidationDataExtension,
1006
+ val: ValidateXbrl,
1007
+ *args: Any,
1008
+ **kwargs: Any,
1009
+ ) -> Iterable[Validation]:
1010
+ """
1011
+ Doesn't perform validations, but prepares data for TableOfContentsBuilder.
1012
+ """
1013
+ manifestInstance = pluginData.getManifestInstance(val.modelXbrl)
1014
+ if manifestInstance is not None and manifestInstance.type == ReportFolderType.PUBLIC_DOC.value:
1015
+ pluginData.addToTableOfContents(val.modelXbrl)
1016
+ return iter(())
1017
+
1018
+
1019
+ @validation(
1020
+ hook=ValidationHook.XBRL_FINALLY,
1021
+ disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
1022
+ )
1023
+ def rule_html_elements(
1024
+ pluginData: PluginValidationDataExtension,
1025
+ val: ValidateXbrl,
1026
+ *args: Any,
1027
+ **kwargs: Any,
1028
+ ) -> Iterable[Validation]:
1029
+ """
1030
+ EDINET.EC1011E: The HTML lang attribute is not Japanese.
1031
+ EDINET.EC1020E: When writing a DOCTYPE declaration, do not define it multiple times.
1032
+ Also, please modify the relevant file so that there is only one html tag, one head tag, and one body tag each.
1033
+
1034
+ Note: Some violations of EC1020E (such as multiple DOCTYPE declarations) prevent Arelle from parsing
1035
+ the XML at all, and thus an XML schema error will be triggered rather than this validation error.
1036
+ """
1037
+ checkNames = frozenset({'body', 'head', 'html'})
1038
+ for modelDocument in val.modelXbrl.urlDocs.values():
1039
+ path = Path(modelDocument.uri)
1040
+ if path.suffix not in HTML_EXTENSIONS:
1041
+ continue
1042
+ rootElt = modelDocument.xmlRootElement
1043
+ eltCounts = {
1044
+ rootElt.qname.localName: 1
1045
+ }
1046
+ for elt in rootElt.iterdescendants():
1047
+ if not isinstance(elt, ModelObject):
1048
+ continue
1049
+ name = elt.qname.localName
1050
+ if name in checkNames:
1051
+ eltCounts[name] = eltCounts.get(name, 0) + 1
1052
+ if not isinstance(elt, ModelFact):
1053
+ lang = elt.get(XbrlConst.qnXmlLang.clarkNotation)
1054
+ if lang is not None and lang not in JAPAN_LANGUAGE_CODES:
1055
+ yield Validation.error(
1056
+ codes='EDINET.EC1011E',
1057
+ msg=_("The language setting is not Japanese. "
1058
+ "File name: %(file)s (line %(line)s). "
1059
+ "Please set the lang attribute on the given line of the "
1060
+ "relevant file to one of the following: %(langValues)s."),
1061
+ file=modelDocument.basename,
1062
+ line=elt.sourceline,
1063
+ langValues=', '.join(JAPAN_LANGUAGE_CODES),
1064
+ )
1065
+
1066
+ if any(count > 1 for count in eltCounts.values()):
1067
+ yield Validation.error(
1068
+ codes='EDINET.EC1020E',
1069
+ msg=_("The HTML syntax is incorrect. "
1070
+ "File name: '%(path)s'. "
1071
+ "When writing a DOCTYPE declaration, do not define it multiple times. "
1072
+ "Also, please modify the relevant file so that there is only one html tag, "
1073
+ "one head tag, and one body tag each."),
1074
+ path=str(path),
1075
+ file=str(path),
1076
+ )
1077
+
1078
+
1079
+ @validation(
1080
+ hook=ValidationHook.XBRL_FINALLY,
1081
+ disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
1082
+ )
1083
+ def rule_EC1031E(
1084
+ pluginData: PluginValidationDataExtension,
1085
+ val: ValidateXbrl,
1086
+ *args: Any,
1087
+ **kwargs: Any,
1088
+ ) -> Iterable[Validation]:
1089
+ """
1090
+ EDINET.EC1031E: Prohibited attribute is used in HTML.
1091
+ """
1092
+ for doc in val.modelXbrl.urlDocs.values():
1093
+ for elt, attributeName in pluginData.getProhibitedAttributeElements(doc):
1094
+ yield Validation.error(
1095
+ codes='EDINET.EC1031E',
1096
+ msg=_("Prohibited attribute '%(attributeName)s' is used in HTML. "
1097
+ "File name: %(file)s (line %(line)s). "
1098
+ "Please correct the tag attributes of the relevant file."),
1099
+ attributeName=attributeName,
1100
+ file=doc.basename,
1101
+ line=elt.sourceline,
1102
+ modelObject=elt,
1103
+ )
1104
+
1105
+
1106
+ @validation(
1107
+ hook=ValidationHook.FILESOURCE,
1108
+ disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
1109
+ )
1110
+ def rule_EC5032E(
1111
+ pluginData: ControllerPluginData,
1112
+ cntlr: Cntlr,
1113
+ fileSource: FileSource,
1114
+ *args: Any,
1115
+ **kwargs: Any,
1116
+ ) -> Iterable[Validation]:
1117
+ """
1118
+ EDINET.EC5032E: A manifest file for an IFRS submission must not define multiple instances.
1119
+ """
1120
+ instances = pluginData.getManifestInstances()
1121
+ instancesByManifest = defaultdict(list)
1122
+ for instance in instances:
1123
+ instancesByManifest[instance.path].append(instance)
1124
+ for manifestPath, instances in instancesByManifest.items():
1125
+ if len(instances) < 2:
1126
+ continue
1127
+ for instance in instances:
1128
+ if instance.filingFormat is None:
1129
+ continue
1130
+ if (
1131
+ instance.filingFormat.ordinance == Ordinance.IFRS or
1132
+ Taxonomy.IFRS in instance.filingFormat.taxonomies
1133
+ ):
1134
+ yield Validation.error(
1135
+ codes='EDINET.EC5032E',
1136
+ msg=_("A manifest file for an IFRS submission defines multiple instances. "
1137
+ "File: '%(path)s'. "
1138
+ "If you use the IFRS taxonomy, please specify only one instance."),
1139
+ path=str(manifestPath),
1140
+ )
1141
+ break
1142
+
1143
+
1144
+ @validation(
1145
+ hook=ValidationHook.XBRL_FINALLY,
1146
+ disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
1147
+ )
1148
+ def rule_EC8023W(
1149
+ pluginData: PluginValidationDataExtension,
1150
+ val: ValidateXbrl,
1151
+ *args: Any,
1152
+ **kwargs: Any,
1153
+ ) -> Iterable[Validation]:
1154
+ """
1155
+ EDINET.EC8023W: In IXBRL files, 'nonFraction' elements should be immediately preceded by
1156
+ '△' if and only if the sign attribute is '-'.
1157
+
1158
+ * Tagging using International Financial Reporting Standards taxonomy elements is not checked.
1159
+ * Tagging using Japanese GAAP notes or IFRS financial statement filer-specific additional elements
1160
+ may be identified as an exception and a warning displayed, even if the data content is correct.
1161
+
1162
+ Note: This implementation interprets "immediately preceded" to mean that the symbol is present in the text
1163
+ immediately before the target element, not nested within, or separated by, siblings elements. The use of
1164
+ this symbol in sample filings support this interpretation.
1165
+ """
1166
+ negativeChar = '△'
1167
+ for fact in val.modelXbrl.facts:
1168
+ if not isinstance(fact, ModelInlineFact):
1169
+ continue
1170
+ if fact.localName != 'nonFraction':
1171
+ continue
1172
+ if fact.qname.namespaceURI == pluginData.jpigpNamespace:
1173
+ continue
1174
+
1175
+ precedingChar = None
1176
+ precedingSibling = fact.getprevious()
1177
+ # Check for the tail of the preceding sibling first.
1178
+ if precedingSibling is not None:
1179
+ if precedingSibling.tail:
1180
+ strippedText = precedingSibling.tail.strip()
1181
+ if strippedText:
1182
+ precedingChar = strippedText[-1]
1183
+ # If nothing found, check the parent element if this is the first child.
1184
+ elif (parent := fact.getparent()) is not None:
1185
+ if fact == list(parent)[0] and parent.text:
1186
+ strippedText = parent.text.strip()
1187
+ if strippedText:
1188
+ precedingChar = strippedText[-1]
1189
+
1190
+ if fact.sign == '-' :
1191
+ if precedingChar != negativeChar:
1192
+ yield Validation.error(
1193
+ codes='EDINET.EC8023W',
1194
+ msg=_("In an inline XBRL file, if the sign attribute of the ix:nonFraction "
1195
+ "element is set to \"-\" (minus), you must set \"△\" immediately "
1196
+ "before the ix:nonFraction element tag."),
1197
+ modelObject=fact,
1198
+ )
1199
+ else:
1200
+ if precedingChar == negativeChar:
1201
+ yield Validation.error(
1202
+ codes='EDINET.EC8023W',
1203
+ msg=_("In an inline XBRL file, if the sign attribute of the ix:nonFraction "
1204
+ "element is not set to \"-\" (minus), there is no need to set \"△\" "
1205
+ "immediately before the ix:nonFraction element tag."),
1206
+ modelObject=fact,
1207
+ )
1208
+
1209
+
1210
+
1211
+ @validation(
1212
+ hook=ValidationHook.FILESOURCE,
1213
+ disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
1214
+ )
1215
+ def rule_filenames(
1216
+ pluginData: ControllerPluginData,
1217
+ cntlr: Cntlr,
1218
+ fileSource: FileSource,
1219
+ *args: Any,
1220
+ **kwargs: Any,
1221
+ ) -> Iterable[Validation]:
1222
+ """
1223
+ EDINET.EC0121E: There is a directory or file that contains
1224
+ more than 31 characters or uses characters other than those allowed (alphanumeric characters,
1225
+ '-' and '_').
1226
+ Note: Applies to everything EXCEPT files directly beneath non-correction report folders.
1227
+
1228
+ EDINET.EC0200E: There is a file that uses characters other
1229
+ than those allowed (alphanumeric characters, '-' and '_').
1230
+ Note: Applies ONLY to files directly beneath non-correction report folders.
1231
+ """
1232
+ uploadContents = pluginData.getUploadContents()
1233
+ if uploadContents is None:
1234
+ return
1235
+ for path, pathInfo in uploadContents.uploadPathsByPath.items():
1236
+ isReportFile = (
1237
+ not pathInfo.isAttachment and
1238
+ not pathInfo.isCorrection and
1239
+ not pathInfo.isDirectory and
1240
+ not pathInfo.isSubdirectory
1241
+ )
1242
+ charactersAreValid = FILENAME_STEM_PATTERN.fullmatch(path.stem)
1243
+ lengthIsValid = isReportFile or (len(path.name) <= 31)
1244
+ if charactersAreValid and lengthIsValid:
1245
+ continue
1246
+ if isReportFile:
1247
+ yield Validation.error(
1248
+ codes='EDINET.EC0200E',
1249
+ msg=_("There is a file inside the XBRL directory that uses characters "
1250
+ "other than those allowed (alphanumeric characters, '-' and '_'). "
1251
+ "File: '%(path)s'. "
1252
+ "Please change the filename to usable characters, and upload again."),
1253
+ path=str(path)
1254
+ )
1255
+ else:
1256
+ yield Validation.error(
1257
+ codes='EDINET.EC0121E',
1258
+ msg=_("There is a directory or file in '%(directory)s' that contains more "
1259
+ "than 31 characters or uses characters other than those allowed "
1260
+ "(alphanumeric characters, '-' and '_'). "
1261
+ "Directory or filename: '%(basename)s'. "
1262
+ "Please change the file name (or folder name) to within 31 characters and to usable "
1263
+ "characters, and upload again."),
1264
+ directory=str(path.parent),
1265
+ basename=path.name,
1266
+ )
1267
+
1268
+
1269
+ @validation(
1270
+ hook=ValidationHook.FILESOURCE,
1271
+ disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
1272
+ )
1273
+ def rule_manifest_preferredFilename(
1274
+ pluginData: ControllerPluginData,
1275
+ cntlr: Cntlr,
1276
+ fileSource: FileSource,
1277
+ *args: Any,
1278
+ **kwargs: Any,
1279
+ ) -> Iterable[Validation]:
1280
+ """
1281
+ EDINET.EC5804E: The preferredFilename attribute must be set on the instance
1282
+ element in the manifest file.
1283
+
1284
+ EDINET.EC5805E: The instance file extension is not ".xbrl". File name: xxx
1285
+ Please change the extension of the instance name set in the preferredFilename
1286
+ attribute value of the instance element in the manifest file to ".xbrl".
1287
+
1288
+ EDINET.EC5806E: The same instance file name is set multiple times. File name: xxx
1289
+ The preferredFilename attribute value of the instance element in the manifest
1290
+ file must be unique within the same file.
1291
+
1292
+ EDINET.EC8008W: The file name of the report instance set in the manifest file
1293
+ does not conform to the rules.
1294
+
1295
+ EDINET.EC8009W: The file name of the audit report instance set in the manifest file
1296
+ does not conform to the rules.
1297
+ """
1298
+ instances = pluginData.getManifestInstances()
1299
+ preferredFilenames: dict[Path, set[str]] = defaultdict(set)
1300
+ duplicateFilenames = defaultdict(set)
1301
+ for instance in instances:
1302
+ if len(instance.preferredFilename) == 0:
1303
+ yield Validation.error(
1304
+ codes='EDINET.EC5804E',
1305
+ msg=_("The instance file name is not set. "
1306
+ "Set the instance name as the preferredFilename attribute value "
1307
+ "of the instance element in the manifest file. (manifest: '%(manifest)s', id: %(id)s)"),
1308
+ manifest=str(instance.path),
1309
+ id=instance.id,
1310
+ )
1311
+ continue
1312
+
1313
+ preferredFilename = Path(instance.preferredFilename)
1314
+ if preferredFilename.suffix != '.xbrl':
1315
+ yield Validation.error(
1316
+ codes='EDINET.EC5805E',
1317
+ msg=_("The instance file extension is not '.xbrl'. "
1318
+ "File name: '%(preferredFilename)s'. "
1319
+ "Please change the extension of the instance name set in the "
1320
+ "preferredFilename attribute value of the instance element in "
1321
+ "the manifest file to '.xbrl'. (manifest: '%(manifest)s', id: %(id)s)"),
1322
+ preferredFilename=instance.preferredFilename,
1323
+ manifest=str(instance.path),
1324
+ id=instance.id,
1325
+ )
1326
+ continue
1327
+
1328
+ reportFolderType = ReportFolderType.parse(instance.type)
1329
+ match = True if reportFolderType is None else any(
1330
+ pattern.fullmatch(preferredFilename.name)
1331
+ for pattern in reportFolderType.xbrlFilenamePatterns
1332
+ )
1333
+ if not match:
1334
+ if reportFolderType == ReportFolderType.AUDIT_DOC:
1335
+ yield Validation.warning(
1336
+ codes='EDINET.EC8009W',
1337
+ msg=_("The file name of the audit report instance set in the manifest "
1338
+ "file does not conform to the rules. "
1339
+ "File name: '%(file)s'. "
1340
+ "Please set the file name of the corresponding audit report instance "
1341
+ "according to the rules. Please correct the contents of the manifest file."),
1342
+ file=preferredFilename.name,
1343
+ )
1344
+ else:
1345
+ yield Validation.warning(
1346
+ codes='EDINET.EC8008W',
1347
+ msg=_("The file name of the report instance set in the manifest "
1348
+ "file does not comply with the regulations. "
1349
+ "File name: '%(file)s'. "
1350
+ "Please set the file name of the corresponding report instance "
1351
+ "according to the rules. Please correct the contents of the manifest file."),
1352
+ file=preferredFilename.name,
1353
+ )
1354
+
1355
+ if instance.preferredFilename in preferredFilenames[instance.path]:
1356
+ duplicateFilenames[instance.path].add(instance.preferredFilename)
1357
+ continue
1358
+ preferredFilenames[instance.path].add(instance.preferredFilename)
1359
+ for path, filenames in duplicateFilenames.items():
1360
+ for filename in filenames:
1361
+ yield Validation.error(
1362
+ codes='EDINET.EC5806E',
1363
+ msg=_("The same instance file name is set multiple times. "
1364
+ "File name: '%(preferredFilename)s'. "
1365
+ "The preferredFilename attribute value of the instance "
1366
+ "element in the manifest file must be unique within the "
1367
+ "same file. (manifest: '%(manifest)s')"),
1368
+ manifest=str(path),
1369
+ preferredFilename=filename,
1370
+ )