certora-cli-alpha-master 20251012.8.16.603503__tar.gz → 20251012.20.20.862738__tar.gz

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 (87) hide show
  1. {certora_cli_alpha_master-20251012.8.16.603503/certora_cli_alpha_master.egg-info → certora_cli_alpha_master-20251012.20.20.862738}/PKG-INFO +2 -2
  2. certora_cli_alpha_master-20251012.20.20.862738/README.md +1 -0
  3. {certora_cli_alpha_master-20251012.8.16.603503 → certora_cli_alpha_master-20251012.20.20.862738}/certora_cli/CertoraProver/certoraBuild.py +4 -3
  4. {certora_cli_alpha_master-20251012.8.16.603503 → certora_cli_alpha_master-20251012.20.20.862738}/certora_cli/CertoraProver/certoraBuildCacheManager.py +6 -3
  5. {certora_cli_alpha_master-20251012.8.16.603503 → certora_cli_alpha_master-20251012.20.20.862738}/certora_cli/CertoraProver/certoraContextAttributes.py +11 -0
  6. {certora_cli_alpha_master-20251012.8.16.603503 → certora_cli_alpha_master-20251012.20.20.862738}/certora_cli/Shared/certoraUtils.py +12 -0
  7. {certora_cli_alpha_master-20251012.8.16.603503 → certora_cli_alpha_master-20251012.20.20.862738/certora_cli_alpha_master.egg-info}/PKG-INFO +2 -2
  8. {certora_cli_alpha_master-20251012.8.16.603503 → certora_cli_alpha_master-20251012.20.20.862738}/certora_jars/ASTExtraction.jar +0 -0
  9. certora_cli_alpha_master-20251012.20.20.862738/certora_jars/CERTORA-CLI-VERSION-METADATA.json +1 -0
  10. {certora_cli_alpha_master-20251012.8.16.603503 → certora_cli_alpha_master-20251012.20.20.862738}/certora_jars/Typechecker.jar +0 -0
  11. {certora_cli_alpha_master-20251012.8.16.603503 → certora_cli_alpha_master-20251012.20.20.862738}/setup.py +2 -2
  12. certora_cli_alpha_master-20251012.8.16.603503/README.md +0 -1
  13. certora_cli_alpha_master-20251012.8.16.603503/certora_jars/CERTORA-CLI-VERSION-METADATA.json +0 -1
  14. {certora_cli_alpha_master-20251012.8.16.603503 → certora_cli_alpha_master-20251012.20.20.862738}/LICENSE +0 -0
  15. {certora_cli_alpha_master-20251012.8.16.603503 → certora_cli_alpha_master-20251012.20.20.862738}/MANIFEST.in +0 -0
  16. {certora_cli_alpha_master-20251012.8.16.603503 → certora_cli_alpha_master-20251012.20.20.862738}/certora_bins/__init__.py +0 -0
  17. {certora_cli_alpha_master-20251012.8.16.603503 → certora_cli_alpha_master-20251012.20.20.862738}/certora_cli/CertoraProver/Compiler/CompilerCollector.py +0 -0
  18. {certora_cli_alpha_master-20251012.8.16.603503 → certora_cli_alpha_master-20251012.20.20.862738}/certora_cli/CertoraProver/Compiler/CompilerCollectorFactory.py +0 -0
  19. {certora_cli_alpha_master-20251012.8.16.603503 → certora_cli_alpha_master-20251012.20.20.862738}/certora_cli/CertoraProver/Compiler/CompilerCollectorSol.py +0 -0
  20. {certora_cli_alpha_master-20251012.8.16.603503 → certora_cli_alpha_master-20251012.20.20.862738}/certora_cli/CertoraProver/Compiler/CompilerCollectorSolBased.py +0 -0
  21. {certora_cli_alpha_master-20251012.8.16.603503 → certora_cli_alpha_master-20251012.20.20.862738}/certora_cli/CertoraProver/Compiler/CompilerCollectorVy.py +0 -0
  22. {certora_cli_alpha_master-20251012.8.16.603503 → certora_cli_alpha_master-20251012.20.20.862738}/certora_cli/CertoraProver/Compiler/CompilerCollectorYul.py +0 -0
  23. {certora_cli_alpha_master-20251012.8.16.603503 → certora_cli_alpha_master-20251012.20.20.862738}/certora_cli/CertoraProver/Compiler/__init__.py +0 -0
  24. {certora_cli_alpha_master-20251012.8.16.603503 → certora_cli_alpha_master-20251012.20.20.862738}/certora_cli/CertoraProver/__init__.py +0 -0
  25. {certora_cli_alpha_master-20251012.8.16.603503 → certora_cli_alpha_master-20251012.20.20.862738}/certora_cli/CertoraProver/certoraApp.py +0 -0
  26. {certora_cli_alpha_master-20251012.8.16.603503 → certora_cli_alpha_master-20251012.20.20.862738}/certora_cli/CertoraProver/certoraBuildDataClasses.py +0 -0
  27. {certora_cli_alpha_master-20251012.8.16.603503 → certora_cli_alpha_master-20251012.20.20.862738}/certora_cli/CertoraProver/certoraBuildRust.py +0 -0
  28. {certora_cli_alpha_master-20251012.8.16.603503 → certora_cli_alpha_master-20251012.20.20.862738}/certora_cli/CertoraProver/certoraBuildSui.py +0 -0
  29. {certora_cli_alpha_master-20251012.8.16.603503 → certora_cli_alpha_master-20251012.20.20.862738}/certora_cli/CertoraProver/certoraCloudIO.py +0 -0
  30. {certora_cli_alpha_master-20251012.8.16.603503 → certora_cli_alpha_master-20251012.20.20.862738}/certora_cli/CertoraProver/certoraCollectConfigurationLayout.py +0 -0
  31. {certora_cli_alpha_master-20251012.8.16.603503 → certora_cli_alpha_master-20251012.20.20.862738}/certora_cli/CertoraProver/certoraCollectRunMetadata.py +0 -0
  32. {certora_cli_alpha_master-20251012.8.16.603503 → certora_cli_alpha_master-20251012.20.20.862738}/certora_cli/CertoraProver/certoraCompilerParameters.py +0 -0
  33. {certora_cli_alpha_master-20251012.8.16.603503 → certora_cli_alpha_master-20251012.20.20.862738}/certora_cli/CertoraProver/certoraConfigIO.py +0 -0
  34. {certora_cli_alpha_master-20251012.8.16.603503 → certora_cli_alpha_master-20251012.20.20.862738}/certora_cli/CertoraProver/certoraContext.py +0 -0
  35. {certora_cli_alpha_master-20251012.8.16.603503 → certora_cli_alpha_master-20251012.20.20.862738}/certora_cli/CertoraProver/certoraContextClass.py +0 -0
  36. {certora_cli_alpha_master-20251012.8.16.603503 → certora_cli_alpha_master-20251012.20.20.862738}/certora_cli/CertoraProver/certoraContextValidator.py +0 -0
  37. {certora_cli_alpha_master-20251012.8.16.603503 → certora_cli_alpha_master-20251012.20.20.862738}/certora_cli/CertoraProver/certoraContractFuncs.py +0 -0
  38. {certora_cli_alpha_master-20251012.8.16.603503 → certora_cli_alpha_master-20251012.20.20.862738}/certora_cli/CertoraProver/certoraExtensionInfo.py +0 -0
  39. {certora_cli_alpha_master-20251012.8.16.603503 → certora_cli_alpha_master-20251012.20.20.862738}/certora_cli/CertoraProver/certoraJobList.py +0 -0
  40. {certora_cli_alpha_master-20251012.8.16.603503 → certora_cli_alpha_master-20251012.20.20.862738}/certora_cli/CertoraProver/certoraMiniSpecParser.py +0 -0
  41. {certora_cli_alpha_master-20251012.8.16.603503 → certora_cli_alpha_master-20251012.20.20.862738}/certora_cli/CertoraProver/certoraNodeFilters.py +0 -0
  42. {certora_cli_alpha_master-20251012.8.16.603503 → certora_cli_alpha_master-20251012.20.20.862738}/certora_cli/CertoraProver/certoraParseBuildScript.py +0 -0
  43. {certora_cli_alpha_master-20251012.8.16.603503 → certora_cli_alpha_master-20251012.20.20.862738}/certora_cli/CertoraProver/certoraProjectScanner.py +0 -0
  44. {certora_cli_alpha_master-20251012.8.16.603503 → certora_cli_alpha_master-20251012.20.20.862738}/certora_cli/CertoraProver/certoraSourceFinders.py +0 -0
  45. {certora_cli_alpha_master-20251012.8.16.603503 → certora_cli_alpha_master-20251012.20.20.862738}/certora_cli/CertoraProver/certoraType.py +0 -0
  46. {certora_cli_alpha_master-20251012.8.16.603503 → certora_cli_alpha_master-20251012.20.20.862738}/certora_cli/CertoraProver/certoraVerifyGenerator.py +0 -0
  47. {certora_cli_alpha_master-20251012.8.16.603503 → certora_cli_alpha_master-20251012.20.20.862738}/certora_cli/CertoraProver/erc7201.py +0 -0
  48. {certora_cli_alpha_master-20251012.8.16.603503 → certora_cli_alpha_master-20251012.20.20.862738}/certora_cli/CertoraProver/splitRules.py +0 -0
  49. {certora_cli_alpha_master-20251012.8.16.603503 → certora_cli_alpha_master-20251012.20.20.862738}/certora_cli/CertoraProver/storageExtension.py +0 -0
  50. {certora_cli_alpha_master-20251012.8.16.603503 → certora_cli_alpha_master-20251012.20.20.862738}/certora_cli/EquivalenceCheck/Eq_default.conf +0 -0
  51. {certora_cli_alpha_master-20251012.8.16.603503 → certora_cli_alpha_master-20251012.20.20.862738}/certora_cli/EquivalenceCheck/Eq_mc_no_out_template.spec +0 -0
  52. {certora_cli_alpha_master-20251012.8.16.603503 → certora_cli_alpha_master-20251012.20.20.862738}/certora_cli/EquivalenceCheck/Eq_mc_template.spec +0 -0
  53. {certora_cli_alpha_master-20251012.8.16.603503 → certora_cli_alpha_master-20251012.20.20.862738}/certora_cli/EquivalenceCheck/Eq_sanity.conf +0 -0
  54. {certora_cli_alpha_master-20251012.8.16.603503 → certora_cli_alpha_master-20251012.20.20.862738}/certora_cli/EquivalenceCheck/Eq_template.spec +0 -0
  55. {certora_cli_alpha_master-20251012.8.16.603503 → certora_cli_alpha_master-20251012.20.20.862738}/certora_cli/EquivalenceCheck/__init__.py +0 -0
  56. {certora_cli_alpha_master-20251012.8.16.603503 → certora_cli_alpha_master-20251012.20.20.862738}/certora_cli/EquivalenceCheck/equivCheck.py +0 -0
  57. {certora_cli_alpha_master-20251012.8.16.603503 → certora_cli_alpha_master-20251012.20.20.862738}/certora_cli/EquivalenceCheck/sanity.spec +0 -0
  58. {certora_cli_alpha_master-20251012.8.16.603503 → certora_cli_alpha_master-20251012.20.20.862738}/certora_cli/Mutate/__init__.py +0 -0
  59. {certora_cli_alpha_master-20251012.8.16.603503 → certora_cli_alpha_master-20251012.20.20.862738}/certora_cli/Mutate/mutateApp.py +0 -0
  60. {certora_cli_alpha_master-20251012.8.16.603503 → certora_cli_alpha_master-20251012.20.20.862738}/certora_cli/Mutate/mutateAttributes.py +0 -0
  61. {certora_cli_alpha_master-20251012.8.16.603503 → certora_cli_alpha_master-20251012.20.20.862738}/certora_cli/Mutate/mutateConstants.py +0 -0
  62. {certora_cli_alpha_master-20251012.8.16.603503 → certora_cli_alpha_master-20251012.20.20.862738}/certora_cli/Mutate/mutateUtil.py +0 -0
  63. {certora_cli_alpha_master-20251012.8.16.603503 → certora_cli_alpha_master-20251012.20.20.862738}/certora_cli/Mutate/mutateValidate.py +0 -0
  64. {certora_cli_alpha_master-20251012.8.16.603503 → certora_cli_alpha_master-20251012.20.20.862738}/certora_cli/Shared/ExpectedComparator.py +0 -0
  65. {certora_cli_alpha_master-20251012.8.16.603503 → certora_cli_alpha_master-20251012.20.20.862738}/certora_cli/Shared/__init__.py +0 -0
  66. {certora_cli_alpha_master-20251012.8.16.603503 → certora_cli_alpha_master-20251012.20.20.862738}/certora_cli/Shared/certoraAttrUtil.py +0 -0
  67. {certora_cli_alpha_master-20251012.8.16.603503 → certora_cli_alpha_master-20251012.20.20.862738}/certora_cli/Shared/certoraLogging.py +0 -0
  68. {certora_cli_alpha_master-20251012.8.16.603503 → certora_cli_alpha_master-20251012.20.20.862738}/certora_cli/Shared/certoraValidateFuncs.py +0 -0
  69. {certora_cli_alpha_master-20251012.8.16.603503 → certora_cli_alpha_master-20251012.20.20.862738}/certora_cli/Shared/proverCommon.py +0 -0
  70. {certora_cli_alpha_master-20251012.8.16.603503 → certora_cli_alpha_master-20251012.20.20.862738}/certora_cli/__init__.py +0 -0
  71. {certora_cli_alpha_master-20251012.8.16.603503 → certora_cli_alpha_master-20251012.20.20.862738}/certora_cli/certoraCVLFormatter.py +0 -0
  72. {certora_cli_alpha_master-20251012.8.16.603503 → certora_cli_alpha_master-20251012.20.20.862738}/certora_cli/certoraConcord.py +0 -0
  73. {certora_cli_alpha_master-20251012.8.16.603503 → certora_cli_alpha_master-20251012.20.20.862738}/certora_cli/certoraEVMProver.py +0 -0
  74. {certora_cli_alpha_master-20251012.8.16.603503 → certora_cli_alpha_master-20251012.20.20.862738}/certora_cli/certoraEqCheck.py +0 -0
  75. {certora_cli_alpha_master-20251012.8.16.603503 → certora_cli_alpha_master-20251012.20.20.862738}/certora_cli/certoraMutate.py +0 -0
  76. {certora_cli_alpha_master-20251012.8.16.603503 → certora_cli_alpha_master-20251012.20.20.862738}/certora_cli/certoraRanger.py +0 -0
  77. {certora_cli_alpha_master-20251012.8.16.603503 → certora_cli_alpha_master-20251012.20.20.862738}/certora_cli/certoraRun.py +0 -0
  78. {certora_cli_alpha_master-20251012.8.16.603503 → certora_cli_alpha_master-20251012.20.20.862738}/certora_cli/certoraSolanaProver.py +0 -0
  79. {certora_cli_alpha_master-20251012.8.16.603503 → certora_cli_alpha_master-20251012.20.20.862738}/certora_cli/certoraSorobanProver.py +0 -0
  80. {certora_cli_alpha_master-20251012.8.16.603503 → certora_cli_alpha_master-20251012.20.20.862738}/certora_cli/rustMutator.py +0 -0
  81. {certora_cli_alpha_master-20251012.8.16.603503 → certora_cli_alpha_master-20251012.20.20.862738}/certora_cli_alpha_master.egg-info/SOURCES.txt +0 -0
  82. {certora_cli_alpha_master-20251012.8.16.603503 → certora_cli_alpha_master-20251012.20.20.862738}/certora_cli_alpha_master.egg-info/dependency_links.txt +0 -0
  83. {certora_cli_alpha_master-20251012.8.16.603503 → certora_cli_alpha_master-20251012.20.20.862738}/certora_cli_alpha_master.egg-info/entry_points.txt +0 -0
  84. {certora_cli_alpha_master-20251012.8.16.603503 → certora_cli_alpha_master-20251012.20.20.862738}/certora_cli_alpha_master.egg-info/requires.txt +0 -0
  85. {certora_cli_alpha_master-20251012.8.16.603503 → certora_cli_alpha_master-20251012.20.20.862738}/certora_cli_alpha_master.egg-info/top_level.txt +0 -0
  86. {certora_cli_alpha_master-20251012.8.16.603503 → certora_cli_alpha_master-20251012.20.20.862738}/certora_jars/__init__.py +0 -0
  87. {certora_cli_alpha_master-20251012.8.16.603503 → certora_cli_alpha_master-20251012.20.20.862738}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: certora-cli-alpha-master
3
- Version: 20251012.8.16.603503
3
+ Version: 20251012.20.20.862738
4
4
  Summary: Runner for the Certora Prover
5
5
  Home-page: https://pypi.org/project/certora-cli-alpha-master
6
6
  Author: Certora
@@ -39,4 +39,4 @@ Dynamic: requires-dist
39
39
  Dynamic: requires-python
40
40
  Dynamic: summary
41
41
 
42
- Commit c99c312. Build and Run scripts for executing the Certora Prover on Solidity smart contracts.
42
+ Commit 67b032d. Build and Run scripts for executing the Certora Prover on Solidity smart contracts.
@@ -0,0 +1 @@
1
+ Commit 67b032d. Build and Run scripts for executing the Certora Prover on Solidity smart contracts.
@@ -1554,9 +1554,10 @@ class CertoraBuildGenerator:
1554
1554
  @param compiler_collector: Solidity or Vyper compiler collector
1555
1555
  @return:
1556
1556
  """
1557
+ solc_json_contract_key = contract_file_as_provided if self.context.use_relpaths_for_solc_json else contract_file_posix_abs
1557
1558
  compiler_collector_lang = compiler_collector.smart_contract_lang
1558
1559
  if compiler_collector_lang == CompilerLangSol() or compiler_collector_lang == CompilerLangYul():
1559
- sources_dict = {str(contract_file_posix_abs): {
1560
+ sources_dict = {str(solc_json_contract_key): {
1560
1561
  "urls": [str(contract_file_posix_abs)]}} # type: Dict[str, Dict[str, Any]]
1561
1562
  output_selection = ["transientStorageLayout", "storageLayout", "abi", "evm.bytecode",
1562
1563
  "evm.deployedBytecode", "evm.methodIdentifiers", "evm.assembly",
@@ -2008,7 +2009,7 @@ class CertoraBuildGenerator:
2008
2009
  srclist = {"0": file_abs_path}
2009
2010
  report_srclist = {"0": file_abs_path}
2010
2011
 
2011
- report_source_file = report_srclist[[idx for idx in srclist if srclist[idx] == file_abs_path][0]]
2012
+ report_source_file = report_srclist[[idx for idx in srclist if Util.abs_posix_path(srclist[idx]) == file_abs_path][0]]
2012
2013
 
2013
2014
  # all "contracts in SDC" are the same for every primary contract of the compiled file.
2014
2015
  # we can therefore compute those just once...
@@ -2086,7 +2087,7 @@ class CertoraBuildGenerator:
2086
2087
  if new_path is None:
2087
2088
  file_abs_path = Util.abs_posix_path(build_arg_contract_file)
2088
2089
  # for vyper, because there are no autofinders, at least find the main file
2089
- if (orig_file == file_abs_path and
2090
+ if (Util.abs_posix_path(orig_file) == file_abs_path and
2090
2091
  ((Util.get_certora_sources_dir() / build_arg_contract_file).exists() or
2091
2092
  Path(build_arg_contract_file).exists())):
2092
2093
  new_srclist_map[idx] = build_arg_contract_file
@@ -179,9 +179,12 @@ class CertoraBuildCacheManager:
179
179
  trg = trg_path_with_additional_included_files / post_autofinder_dir.name
180
180
  if post_autofinder_dir != trg:
181
181
  if post_autofinder_dir.is_dir():
182
- if trg.exists():
183
- shutil.rmtree(trg)
184
- Util.safe_copy_folder(post_autofinder_dir, trg, shutil.ignore_patterns())
182
+ # if we match on the cache, and we run a few certoraRun-s in parallel,
183
+ # it could be this folder already exists. But the exact contents do not matter and are likely to
184
+ # agree with the exception of spec files. So let's merge the folders so that the
185
+ # sources are in any case runnable
186
+ if not trg.exists():
187
+ Util.safe_merge_folder(post_autofinder_dir, trg, shutil.ignore_patterns())
185
188
  else:
186
189
  # highly unlikely .post_autofinder.[digit] will be a file and not a directory,
187
190
  # but would rather not crash and future-proof instead
@@ -753,6 +753,17 @@ class EvmAttributes(AttrUtil.Attributes):
753
753
  disables_build_cache=True # prefer to be extra careful with this rare option
754
754
  )
755
755
 
756
+ USE_RELPATHS_FOR_SOLC_JSON = AttrUtil.AttributeDefinition(
757
+ arg_type=AttrUtil.AttrArgType.BOOLEAN,
758
+ help_msg="Uses relative paths when constructing json keys for solc's standard-json input",
759
+ default_desc="By using relative paths for the standard json, some rare compilation errors can be prevented",
760
+ argparse_args={
761
+ 'action': AttrUtil.STORE_TRUE
762
+ },
763
+ affects_build_cache_key=True,
764
+ disables_build_cache=False
765
+ )
766
+
756
767
  IGNORE_SOLIDITY_WARNINGS = AttrUtil.AttributeDefinition(
757
768
  arg_type=AttrUtil.AttrArgType.BOOLEAN,
758
769
  help_msg="Ignore all Solidity compiler warnings",
@@ -514,6 +514,18 @@ def safe_copy_folder(source: Path, dest: Path, ignore_patterns: Callable[[str, L
514
514
  shutil.rmtree(copy_temp, ignore_errors=True)
515
515
 
516
516
 
517
+ def safe_merge_folder(source: Path, dest: Path, ignore_patterns: Callable[[str, List[str]], Iterable[str]]) -> None:
518
+ """
519
+ Safely merge source to dest. dest may exist. Will overwrite existing files
520
+ On certain OS/kernels/FS, copying a folder f into a subdirectory of f will
521
+ send copy tree into an infinite loop. This sidesteps the problem by first copying through a temporary folder.
522
+ """
523
+ copy_temp = tempfile.mkdtemp()
524
+ shutil.copytree(source, copy_temp, ignore=ignore_patterns, dirs_exist_ok=True)
525
+ shutil.copytree(copy_temp, dest, dirs_exist_ok=True)
526
+ shutil.rmtree(copy_temp, ignore_errors=True)
527
+
528
+
517
529
  def as_posix(path: str) -> str:
518
530
  """
519
531
  Converts path from windows to unix
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: certora-cli-alpha-master
3
- Version: 20251012.8.16.603503
3
+ Version: 20251012.20.20.862738
4
4
  Summary: Runner for the Certora Prover
5
5
  Home-page: https://pypi.org/project/certora-cli-alpha-master
6
6
  Author: Certora
@@ -39,4 +39,4 @@ Dynamic: requires-dist
39
39
  Dynamic: requires-python
40
40
  Dynamic: summary
41
41
 
42
- Commit c99c312. Build and Run scripts for executing the Certora Prover on Solidity smart contracts.
42
+ Commit 67b032d. Build and Run scripts for executing the Certora Prover on Solidity smart contracts.
@@ -0,0 +1 @@
1
+ {"name": "certora-cli-alpha-master", "tag": "", "branch": "master", "commit": "67b032d", "timestamp": "20251012.20.20.862738", "version": "20251012.20.20.862738+67b032d"}
@@ -3,11 +3,11 @@ import setuptools
3
3
 
4
4
  setuptools.setup(
5
5
  name="certora-cli-alpha-master",
6
- version="20251012.8.16.603503",
6
+ version="20251012.20.20.862738",
7
7
  author="Certora",
8
8
  author_email="support@certora.com",
9
9
  description="Runner for the Certora Prover",
10
- long_description="Commit c99c312. Build and Run scripts for executing the Certora Prover on Solidity smart contracts.",
10
+ long_description="Commit 67b032d. Build and Run scripts for executing the Certora Prover on Solidity smart contracts.",
11
11
  long_description_content_type="text/markdown",
12
12
  url="https://pypi.org/project/certora-cli-alpha-master",
13
13
  packages=setuptools.find_packages(),
@@ -1 +0,0 @@
1
- Commit c99c312. Build and Run scripts for executing the Certora Prover on Solidity smart contracts.
@@ -1 +0,0 @@
1
- {"name": "certora-cli-alpha-master", "tag": "", "branch": "master", "commit": "c99c312", "timestamp": "20251012.8.16.603503", "version": "20251012.8.16.603503+c99c312"}