rbx.cp 0.13.8__py3-none-any.whl → 0.16.0__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 (77) hide show
  1. rbx/__version__.py +1 -0
  2. rbx/box/cli.py +74 -70
  3. rbx/box/code.py +3 -0
  4. rbx/box/contest/build_contest_statements.py +65 -23
  5. rbx/box/contest/contest_package.py +8 -1
  6. rbx/box/contest/main.py +9 -3
  7. rbx/box/contest/schema.py +17 -13
  8. rbx/box/contest/statements.py +12 -8
  9. rbx/box/dump_schemas.py +2 -1
  10. rbx/box/environment.py +1 -1
  11. rbx/box/fields.py +22 -4
  12. rbx/box/generators.py +32 -13
  13. rbx/box/git_utils.py +29 -1
  14. rbx/box/limits_info.py +161 -0
  15. rbx/box/package.py +18 -1
  16. rbx/box/packaging/boca/boca_language_utils.py +26 -0
  17. rbx/box/packaging/boca/boca_outcome_utils.py +10 -0
  18. rbx/box/packaging/boca/packager.py +7 -5
  19. rbx/box/packaging/contest_main.py +20 -12
  20. rbx/box/packaging/packager.py +24 -14
  21. rbx/box/packaging/polygon/packager.py +7 -3
  22. rbx/box/packaging/polygon/upload.py +2 -1
  23. rbx/box/presets/__init__.py +143 -78
  24. rbx/box/presets/fetch.py +10 -2
  25. rbx/box/presets/schema.py +16 -1
  26. rbx/box/remote.py +3 -3
  27. rbx/box/sanitizers/issue_stack.py +124 -0
  28. rbx/box/schema.py +87 -27
  29. rbx/box/solutions.py +74 -117
  30. rbx/box/statements/build_statements.py +12 -1
  31. rbx/box/statements/builders.py +5 -3
  32. rbx/box/statements/latex_jinja.py +73 -23
  33. rbx/box/statements/schema.py +7 -9
  34. rbx/box/stressing/generator_parser.py +3 -1
  35. rbx/box/tasks.py +10 -10
  36. rbx/box/testcase_extractors.py +8 -0
  37. rbx/box/testing/testing_preset.py +129 -2
  38. rbx/box/testing/testing_shared.py +3 -1
  39. rbx/box/timing.py +305 -0
  40. rbx/box/tooling/boca/debug_utils.py +88 -0
  41. rbx/box/tooling/boca/manual_scrape.py +20 -0
  42. rbx/box/tooling/boca/scraper.py +660 -57
  43. rbx/box/unit.py +0 -2
  44. rbx/box/validators.py +0 -4
  45. rbx/grading/judge/cacher.py +36 -0
  46. rbx/grading/judge/program.py +12 -2
  47. rbx/grading/judge/sandbox.py +1 -1
  48. rbx/grading/judge/sandboxes/stupid_sandbox.py +2 -1
  49. rbx/grading/judge/storage.py +36 -3
  50. rbx/grading/limits.py +4 -0
  51. rbx/grading/steps.py +3 -2
  52. rbx/resources/presets/default/contest/contest.rbx.yml +7 -1
  53. rbx/resources/presets/default/contest/statement/info.rbx.tex +46 -0
  54. rbx/resources/presets/default/preset.rbx.yml +1 -0
  55. rbx/resources/presets/default/problem/.gitignore +1 -0
  56. rbx/resources/presets/default/problem/problem.rbx.yml +19 -3
  57. rbx/resources/presets/default/problem/rbx.h +52 -5
  58. rbx/resources/presets/default/problem/statement/statement.rbx.tex +6 -2
  59. rbx/resources/presets/default/problem/testlib.h +6299 -0
  60. rbx/resources/presets/default/problem/validator.cpp +4 -3
  61. rbx/resources/presets/default/shared/contest_template.rbx.tex +8 -4
  62. rbx/resources/presets/default/shared/icpc.sty +18 -3
  63. rbx/resources/presets/default/shared/problem_template.rbx.tex +4 -1
  64. rbx/testing_utils.py +17 -1
  65. rbx/utils.py +45 -0
  66. {rbx_cp-0.13.8.dist-info → rbx_cp-0.16.0.dist-info}/METADATA +5 -2
  67. {rbx_cp-0.13.8.dist-info → rbx_cp-0.16.0.dist-info}/RECORD +71 -67
  68. {rbx_cp-0.13.8.dist-info → rbx_cp-0.16.0.dist-info}/entry_points.txt +0 -1
  69. rbx/providers/__init__.py +0 -43
  70. rbx/providers/codeforces.py +0 -73
  71. rbx/providers/provider.py +0 -26
  72. rbx/submitors/__init__.py +0 -18
  73. rbx/submitors/codeforces.py +0 -121
  74. rbx/submitors/submitor.py +0 -25
  75. /rbx/resources/presets/default/problem/sols/{wa.cpp → wa-overflow.cpp} +0 -0
  76. {rbx_cp-0.13.8.dist-info → rbx_cp-0.16.0.dist-info}/LICENSE +0 -0
  77. {rbx_cp-0.13.8.dist-info → rbx_cp-0.16.0.dist-info}/WHEEL +0 -0
@@ -7,11 +7,12 @@ int main(int argc, char *argv[]) {
7
7
  registerValidation(argc, argv);
8
8
  prepareOpts(argc, argv);
9
9
 
10
- int MAX_N = getVar<int>("MAX_N"); // Read from package vars.
10
+ int MIN_N = getVar<int>("N.min"); // Read from package vars.
11
+ int MAX_N = getVar<int>("N.max");
11
12
 
12
- inf.readInt(1, MAX_N, "A");
13
+ inf.readInt(MIN_N, MAX_N, "A");
13
14
  inf.readSpace();
14
- inf.readInt(1, MAX_N, "B");
15
+ inf.readInt(MIN_N, MAX_N, "B");
15
16
  inf.readEoln();
16
17
  inf.readEof();
17
18
  }
@@ -1,4 +1,3 @@
1
- %- if problem.vars.show_problem is truthy or problem.vars.editorial is falsy
2
1
  \includeProblem
3
2
  %- if problem.short_name is defined
4
3
  [\VAR{problem.short_name}]
@@ -6,11 +5,16 @@
6
5
  {\VAR{problem.title | escape}}{
7
6
 
8
7
  %- if problem.vars.show_limits is truthy
9
- \includeLimits{\VAR{problem.package.timeLimit} ms}{\VAR{problem.package.memoryLimit} MiB}
8
+ \includeLimits
9
+ {\VAR{problem.limits.timeLimit} ms}
10
+ {\VAR{problem.limits.memoryLimit} MiB}
11
+ {\VAR{problem.vars.author if problem.vars.author is truthy and problem.vars.editorial is truthy else ''}}
10
12
  %- else
11
- \vspace{0.55cm}
13
+ \vspace{0.55cm}
12
14
  %- endif
13
15
 
16
+ %- if problem.vars.show_problem is truthy or problem.vars.editorial is falsy
17
+
14
18
  \VAR{problem.blocks.legend}
15
19
 
16
20
  %- if problem.blocks.input is defined
@@ -48,8 +52,8 @@
48
52
  \subsection*{\strNotes}
49
53
  \VAR{problem.blocks.notes}
50
54
  %- endif
51
- }
52
55
  %- endif
56
+ }
53
57
  %- if problem.blocks.editorial is nonnull and problem.vars.editorial is truthy
54
58
  \subsection*{\strSolution}
55
59
  \VAR{problem.blocks.editorial}
@@ -100,6 +100,7 @@
100
100
  \def\strHosted{Realização}
101
101
  \def\strOrganized{Organização}
102
102
  \def\strProblem{Problema }
103
+ \def\strAuthor{Autor}
103
104
  \def\strExplanation{Explicação do exemplo }
104
105
  \def\strInput{Entrada}
105
106
  \def\strOutput{Saída}
@@ -112,6 +113,10 @@
112
113
  \def\strExamples{Exemplos}
113
114
  \def\strSolution{Solução}
114
115
  \def\strNotes{Observações}
116
+ \def\strInfoSheet{Folha de Informações}
117
+ \def\strLimits{Limites}
118
+ \def\strTimeLimit{Tempo limite}
119
+ \def\strMemoryLimit{Memória limite}
115
120
  \else
116
121
  \def\strTaskSheet{Task Sheet}
117
122
  \def\strSolutionSheet{Solution Sheet}
@@ -119,6 +124,7 @@
119
124
  \def\strHosted{Hosted by}
120
125
  \def\strOrganized{Organized by}
121
126
  \def\strProblem{Problem }
127
+ \def\strAuthor{Author}
122
128
  \def\strExplanation{Explanation of sample }
123
129
  \def\strInput{Input}
124
130
  \def\strOutput{Output}
@@ -131,6 +137,10 @@
131
137
  \def\strExamples{Examples}
132
138
  \def\strSolution{Solution}
133
139
  \def\strNotes{Notes}
140
+ \def\strInfoSheet{Information Sheet}
141
+ \def\strLimits{Limits}
142
+ \def\strTimeLimit{Time limit}
143
+ \def\strMemoryLimit{Memory limit}
134
144
  \fi
135
145
 
136
146
  \newcommand{\includeProblem}[3][]
@@ -145,11 +155,16 @@
145
155
  #3
146
156
  }
147
157
 
148
- \newcommand{\includeLimits}[2]{
158
+ \newcommand{\includeLimits}[3]{
149
159
  \vspace{0.2cm}
150
160
  \begin{center}
151
161
  \textit{\strTimeLimit: #1}\\
152
162
  \textit{\strMemoryLimit: #2}
163
+ \ifx#3\empty
164
+ \else
165
+ \\
166
+ \textit{\strAuthor: #3}
167
+ \fi
153
168
  \end{center}
154
169
  \vspace{0.25cm}
155
170
  }
@@ -293,7 +308,7 @@
293
308
  \newcommand{\InsertTitlePage}
294
309
  {
295
310
  \pagestyle{myheadings}
296
- \markright{\Title -- \Year}
311
+ \markright{{\Title} -- \Year}
297
312
 
298
313
  %%% Title Page
299
314
  \begin{titlepage}
@@ -332,7 +347,7 @@
332
347
  \newcommand{\InsertEditorialTitlePage}
333
348
  {
334
349
  \pagestyle{myheadings}
335
- \markright{\Title -- \Year}
350
+ \markright{{\Title} -- \Year}
336
351
 
337
352
  %%% Title Page
338
353
  \begin{titlepage}
@@ -16,7 +16,10 @@
16
16
  {\VAR{problem.title | escape}}{
17
17
 
18
18
  %- if problem.vars.show_limits is truthy
19
- \includeLimits{\VAR{problem.package.timeLimit} ms}{\VAR{problem.package.memoryLimit} MiB}
19
+ \includeLimits
20
+ {\VAR{problem.limits.timeLimit} ms}
21
+ {\VAR{problem.limits.memoryLimit} MiB}
22
+ {\VAR{problem.vars.author if problem.vars.author is truthy and problem.vars.editorial is truthy else ''}}
20
23
  %- else
21
24
  \vspace{0.55cm}
22
25
  %- endif
rbx/testing_utils.py CHANGED
@@ -1,4 +1,5 @@
1
1
  import importlib.resources
2
+ import os
2
3
  import pathlib
3
4
 
4
5
  import rich.markup
@@ -59,9 +60,24 @@ def walk_directory(
59
60
  text_filename = rich.text.Text(path.name, 'green')
60
61
  text_filename.highlight_regex(r'\..*$', 'bold red')
61
62
  text_filename.stylize(f'link file://{path}')
63
+
64
+ # Check if it's a symlink and show the resolved path
65
+ if path.is_symlink():
66
+ try:
67
+ resolved = path.resolve()
68
+ text_filename.append(' → ', 'cyan')
69
+ text_filename.append(str(resolved), 'cyan italic')
70
+ except (OSError, RuntimeError):
71
+ text_filename.append(' → ', 'red')
72
+ text_filename.append(f'{os.readlink(path)}', 'red italic')
73
+
62
74
  file_size = path.stat().st_size
63
75
  text_filename.append(f' ({decimal(file_size)})', 'blue')
64
- icon = '🐍 ' if path.suffix == '.py' else '📄 '
76
+ icon = (
77
+ '🔗 '
78
+ if path.is_symlink()
79
+ else ('🐍 ' if path.suffix == '.py' else '📄 ')
80
+ )
65
81
  tree.add(rich.text.Text(icon) + text_filename)
66
82
 
67
83
 
rbx/utils.py CHANGED
@@ -1,4 +1,5 @@
1
1
  import contextlib
2
+ import enum
2
3
  import fcntl
3
4
  import functools
4
5
  import json
@@ -17,19 +18,63 @@ import rich.markup
17
18
  import rich.prompt
18
19
  import rich.status
19
20
  import ruyaml
21
+ import semver
20
22
  import typer
21
23
  import yaml
22
24
  from pydantic import BaseModel
23
25
  from rich import text
24
26
  from rich.highlighter import JSONHighlighter
25
27
 
28
+ from rbx import __version__
26
29
  from rbx.console import console
27
30
 
28
31
  T = TypeVar('T', bound=BaseModel)
29
32
  APP_NAME = 'rbx'
33
+ PIP_NAME = 'rbx.cp'
30
34
  PathOrStr = Union[pathlib.Path, str]
31
35
 
32
36
 
37
+ class SemVerCompatibility(enum.Enum):
38
+ COMPATIBLE = 'compatible'
39
+ OUTDATED = 'outdated'
40
+ BREAKING_CHANGE = 'breaking_change'
41
+
42
+
43
+ def get_version() -> str:
44
+ return __version__.__version__
45
+
46
+
47
+ def get_semver() -> semver.VersionInfo:
48
+ return semver.VersionInfo.parse(get_version())
49
+
50
+
51
+ def get_upgrade_command(
52
+ version: Optional[Union[str, semver.VersionInfo]] = None,
53
+ ) -> str:
54
+ parsed_version = (
55
+ semver.VersionInfo.parse(version) if isinstance(version, str) else version
56
+ ) or get_semver()
57
+ return f'pipx install --upgrade {PIP_NAME}@{parsed_version.major}'
58
+
59
+
60
+ def check_version_compatibility_between(
61
+ installed: str,
62
+ required: str,
63
+ ) -> SemVerCompatibility:
64
+ installed_version = semver.VersionInfo.parse(installed)
65
+ required_version = semver.VersionInfo.parse(required)
66
+ if installed_version < required_version:
67
+ return SemVerCompatibility.OUTDATED
68
+ if installed_version.major > required_version.major:
69
+ return SemVerCompatibility.BREAKING_CHANGE
70
+ return SemVerCompatibility.COMPATIBLE
71
+
72
+
73
+ def check_version_compatibility(required: str) -> SemVerCompatibility:
74
+ installed = get_version()
75
+ return check_version_compatibility_between(installed, required)
76
+
77
+
33
78
  def create_and_write(path: pathlib.Path, *args, **kwargs):
34
79
  path.parent.mkdir(parents=True, exist_ok=True)
35
80
  path.write_text(*args, **kwargs)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: rbx.cp
3
- Version: 0.13.8
3
+ Version: 0.16.0
4
4
  Summary:
5
5
  Author: Roberto Sales
6
6
  Requires-Python: >=3.9.1,<4.0.0
@@ -30,7 +30,7 @@ Requires-Dist: more-itertools (>=10.5.0,<11.0.0)
30
30
  Requires-Dist: nest-asyncio (>=1.6.0,<2.0.0)
31
31
  Requires-Dist: ordered-set (>=4.1.0,<5.0.0)
32
32
  Requires-Dist: psutil (>=7.0.0,<8.0.0)
33
- Requires-Dist: pydantic (==2.8.2)
33
+ Requires-Dist: pydantic (>=2.11.7,<3.0.0)
34
34
  Requires-Dist: pydantic-xml[lxml] (>=2.11.0,<3.0.0)
35
35
  Requires-Dist: pypandoc (>=1.15,<2.0)
36
36
  Requires-Dist: pyte (>=0.8.2,<0.9.0)
@@ -40,11 +40,14 @@ Requires-Dist: requests (>=2.32.3,<3.0.0)
40
40
  Requires-Dist: rich (>=13.9.4,<14.0.0)
41
41
  Requires-Dist: ruamel-yaml (>=0.18.14,<0.19.0)
42
42
  Requires-Dist: ruyaml (>=0.91.0,<0.92.0)
43
+ Requires-Dist: semver (>=3.0.4,<4.0.0)
43
44
  Requires-Dist: sqlitedict (>=2.1.0,<3.0.0)
44
45
  Requires-Dist: syncer (>=2.0.3,<3.0.0)
45
46
  Requires-Dist: textual (>=3.1.1,<4.0.0)
46
47
  Requires-Dist: textual-serve (>=1.1.2,<2.0.0)
48
+ Requires-Dist: throttlex (>=1.0.0,<2.0.0)
47
49
  Requires-Dist: typer (>=0.15.1,<0.16.0)
50
+ Requires-Dist: typing-extensions (>=4.14.1,<5.0.0)
48
51
  Requires-Dist: yamlfix (>=1.17.0,<2.0.0)
49
52
  Description-Content-Type: text/markdown
50
53
 
@@ -1,92 +1,100 @@
1
1
  rbx/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
+ rbx/__version__.py,sha256=ZkVXSbnNkhhpmMRr5ur6FqBcUYuqHyK0KUV5Je_XFn8,23
2
3
  rbx/annotations.py,sha256=_TkLhgZWiUyon3bonHwUo03ls1jY8LwgcR4bVgtgnc0,3519
3
4
  rbx/autoenum.py,sha256=cusv8ClXRlDVvhZ8eDrtYcL_2peXlHugAey_ht8roXk,12025
4
5
  rbx/box/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
5
6
  rbx/box/builder.py,sha256=umrTdVAwvsOosBDVvDZ6kq1yWg3Z2Lxp2o1zK-V7BBk,3594
6
7
  rbx/box/cd.py,sha256=_XAzb3kV1NUaaRs8hc9SGDo10O1yh2_gr1EiAKzfUjI,2711
7
8
  rbx/box/checkers.py,sha256=mRovZyTZdySFEaYFVc3Lc-xgEsu6F9FjVPOxDwub7aY,13226
8
- rbx/box/cli.py,sha256=eBXiy3zG6IzrIHPYplFWhGn7cB7nmA7F1GiAGoYFWp0,29904
9
- rbx/box/code.py,sha256=2e1tDdrVqHUIT6qaW-MiU2YeuYSdRBhTCTJX78E82do,25465
9
+ rbx/box/cli.py,sha256=ybtCWnH0uYhUe95s6ZhBGoPmanMMleaTaWB78tA3kag,29773
10
+ rbx/box/code.py,sha256=TWF-o8fTh5nAtndKuO9Ti7KL-Ye6mkOoUnRzS4POrfw,25524
10
11
  rbx/box/compile.py,sha256=Kzn5mEQu4vb91W9vjyt0DS6cfPJzFLTUoowFj7uHLUo,2539
11
12
  rbx/box/contest/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
12
- rbx/box/contest/build_contest_statements.py,sha256=N7TQ8Ki7ZM94sATHploDsSKbY41Xey_FlXclEdCBpJI,13010
13
- rbx/box/contest/contest_package.py,sha256=r6BGq3S4Ezj3Ep7pCmtvz3SN44npb2_rKJEoT5lSOqk,2985
13
+ rbx/box/contest/build_contest_statements.py,sha256=y-jODWc5ANm5uhj2kTHxyYnEOr4CzpxynJFvFjClTso,14734
14
+ rbx/box/contest/contest_package.py,sha256=d7PoUHIWVtqaRGatYOfRvZbQ-bz4MPGmv-H94Eg1yyQ,3289
14
15
  rbx/box/contest/contest_utils.py,sha256=fsWHG1e65wq9zvRY3tdf32VF0nU1yzGTOBX5yjXiNk4,1102
15
- rbx/box/contest/main.py,sha256=e_DjbrwpXTFZQaVWJO7prJyehJ702GkVEAGEraRK6h4,8352
16
- rbx/box/contest/schema.py,sha256=21kP3v5aPMOjjp832R7Q_QzJirCVKQCSAklT8nnssdk,7435
17
- rbx/box/contest/statements.py,sha256=dI3AmaTYfOzyB1uh75ST9se9o_QqXzar4pNkIdC-_G8,3956
16
+ rbx/box/contest/main.py,sha256=-aBmlwbEbGMHxWlF7ulIAeKLy2v7VVsvpb4c-kkqKK8,8564
17
+ rbx/box/contest/schema.py,sha256=PgJ8eDiwR6iW4bx1E2MB6T4XiD5FpChSboveOcxMVg0,7376
18
+ rbx/box/contest/statements.py,sha256=f_fn-6e_1406L5EDsnDprz1_8q8qrJ4AjSUpTJqZ1MA,4051
18
19
  rbx/box/creation.py,sha256=oTAC11XV2Pw2YAlF_d11Eo7A1fD6ItlpFMpLEzMLyFI,1331
19
20
  rbx/box/deferred.py,sha256=II3X9e87JCOZtmspnHh-n4PFqh-FsH_oc0XJHZ9ZYVQ,691
20
21
  rbx/box/download.py,sha256=tLW5gLVeLk0gHMEMwScSoHIXQPkXuPsqXzItsrsnUZY,3070
21
- rbx/box/dump_schemas.py,sha256=3j5t47_vJmXj0BCczxDX6ByOcsfolGEDNCBXlPpk86w,593
22
- rbx/box/environment.py,sha256=rwUXuIEfuH-nbnkpQUSazZdi0Z0MUrcCmiYuC5yIxAw,14014
22
+ rbx/box/dump_schemas.py,sha256=HXJ195h4e017DpfoFfW3MRDukON2ZhcKtJjkRPX-dX4,649
23
+ rbx/box/environment.py,sha256=BRwbeqE5To4yBGP7CJbKPMUxUXIlOWscXw1Vp8glrQ0,14018
23
24
  rbx/box/extensions.py,sha256=Von8kIeXvNFTkGlMRMTvL2HIHPwlkuiMswr-ydbGV1w,519
24
- rbx/box/fields.py,sha256=rai4gE95mavvRPBLgnMj2jG5b2W76fvGuFQRXO0O4fM,1792
25
+ rbx/box/fields.py,sha256=Gsox7Q1M7I8I2FtKvwiAfYUC6USpwghk8fel2Q9Eyhg,2291
25
26
  rbx/box/formatting.py,sha256=i3vXHpo_L_VpVPxOe4wHlai1WhlDJlfxUexS9DC0Szg,1249
26
- rbx/box/generators.py,sha256=Q7xZ0BQVrh4eTwiYgxdpaHJqqZT4_X_YPl-uReZz5tw,16880
27
- rbx/box/git_utils.py,sha256=VlUgzuHOCnrjjiJQnDB32qDHbHw_zkwgA7wm4bloibc,750
27
+ rbx/box/generators.py,sha256=trI4i3BFAzIK4wA0hdCjU1rf8QLwSXKWzSFtCZX17SA,17739
28
+ rbx/box/git_utils.py,sha256=WTK8lfmkrBtJpSBuFSwjlSXpkdHnKcVYJgGWTr5V1lY,1513
28
29
  rbx/box/global_package.py,sha256=YfFGw2vxFspF2v3phBEeBCrLe1sfbANrctGqii3I2X4,2106
29
30
  rbx/box/header.py,sha256=OZJD2J0fdIiYyiEAwQ3x3M8TwM1v1J9nhIjnPVz4Zy8,3029
30
31
  rbx/box/lang.py,sha256=CSD-yxFUC3LWdGpv4IVFOLdgONc_JbsI45BEN3bjaFw,888
31
32
  rbx/box/lazy_importing_main.py,sha256=6Z8As7qVFFT619xHH9Xt8VCH57NjC4aDxfAgkWiUwT8,116
33
+ rbx/box/limits_info.py,sha256=NTtcZTlDzemOtQQXbNbLORpl3RM9nYHc2-cGMnGYfF8,5370
32
34
  rbx/box/linting.py,sha256=wRE0hKCduTBHZYBFmmis_d9AMTsDu0Q-AjByCeTnkrY,3187
33
35
  rbx/box/main.py,sha256=a8CYi77kOywPFly4-ucEIJLXQW-1NFp91kK2fA42YTE,86
34
36
  rbx/box/naming.py,sha256=pOG37X_wQM9CCSYwJIUf-b-ZHEs_nchO7wQEdP_quJg,1367
35
- rbx/box/package.py,sha256=66MqTVfb5V-IVjnTndH3CwrGgWWaHW_RTUiR86QcKt4,14756
37
+ rbx/box/package.py,sha256=FjJWSr5yom4_S2k-HZfmDYRB954WaefFaVVME90CdEE,15382
36
38
  rbx/box/packaging/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
37
39
  rbx/box/packaging/boca/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
40
+ rbx/box/packaging/boca/boca_language_utils.py,sha256=bd5-KxN-0h6yg74Jx3NUsgwf_euBU95zC2GLw0MAFS4,1071
41
+ rbx/box/packaging/boca/boca_outcome_utils.py,sha256=MhO7aKTJ1weCgSJBA9MF_ejK3HFBFwC5dIsiR4wA1Mw,310
38
42
  rbx/box/packaging/boca/extension.py,sha256=EQALNEOv4zVDXSKs_dk11n92y7cBZVn8TogIK683lE0,890
39
- rbx/box/packaging/boca/packager.py,sha256=MEVXTGtMWxcXetvXZ4td-AtOUTM68WeRqy5yt-7Lg28,13675
40
- rbx/box/packaging/contest_main.py,sha256=CRgpCvnMOtAzroolNXhlemg8d4W97IORgEqhoXdvumQ,4065
43
+ rbx/box/packaging/boca/packager.py,sha256=31fwscJR0JZTr-55i070fOpb6lAXtEGu50xWFTC2U4o,13746
44
+ rbx/box/packaging/contest_main.py,sha256=G3CO4RILxGbUhyLsTdeDqPXEJ3sK2pSH9X8piqU61FQ,4486
41
45
  rbx/box/packaging/importer.py,sha256=qcKpDQyf6EvYXorofLs5abteBEWV9AezA8tcihCw5wk,909
42
46
  rbx/box/packaging/main.py,sha256=hP4UEKjLowRHBzttGKWx0UMAw8_8lVAAhQ9I9Y3khXA,2724
43
47
  rbx/box/packaging/moj/packager.py,sha256=FjghOe5CPlaF1GqK0NZgWVV_eYWpdTmz88bh04yeAyI,8708
44
- rbx/box/packaging/packager.py,sha256=jOxxAyDOq-VAA173yZ1765NFxPN5hKzUYp-SIIAizLk,6852
48
+ rbx/box/packaging/packager.py,sha256=2a2yldbVZzEQLoQnfGc8fHDHasFRdLUwAGlQuxudLBs,7324
45
49
  rbx/box/packaging/pkg/packager.py,sha256=4pt4cZa_MU9gsWNVvh5Um1KEIh_axBHlXmPf6rpFoHg,4904
46
50
  rbx/box/packaging/polygon/importer.py,sha256=xmtKQo5q81s30u41cEe5PWsepDMJx2XbZRxa6vA4p9c,7571
47
- rbx/box/packaging/polygon/packager.py,sha256=JYVT6FjFh2PJi8ZjjmmgiIe_CNrYUX15LUhkYi1aF3Y,12194
51
+ rbx/box/packaging/polygon/packager.py,sha256=1ddKbUJ-RgzgolDZTkmDJFF5N3JGTXRYVA84L4QU62c,12311
48
52
  rbx/box/packaging/polygon/polygon_api.py,sha256=mPKEqiwANJ1nr-JhOgzGMaDhnbljsAgzzPHW6kkf7R4,41016
49
53
  rbx/box/packaging/polygon/test.py,sha256=bgEju5PwudgyfwxXJagm8fM6CJVlWM6l_-2q1V-oKaQ,3069
50
- rbx/box/packaging/polygon/upload.py,sha256=wFUOEPa5bnKiIoUcwPY5rhfrz9doq-2B2fJqrsZFSdk,13722
54
+ rbx/box/packaging/polygon/upload.py,sha256=w7F0ejfEwhXrAyKADkA2FGuOfTCq96nMNi1YJNRyrtU,13801
51
55
  rbx/box/packaging/polygon/xml_schema.py,sha256=TSl4BWwMWv7V07BKJ56mcLXNr_3zlRgNmqN2q-wnk4M,3128
52
- rbx/box/presets/__init__.py,sha256=Vm9Xievtn1fbFMHubPh6Ngz-GvMx3ycfx15tkvwcvfA,33421
53
- rbx/box/presets/fetch.py,sha256=900aq9S8e12TlgSenG0iHgtF4OWgqavZsptgI_a1YKM,2508
56
+ rbx/box/presets/__init__.py,sha256=6CJpyIpx7wdUqPvRB5hQY5mIPDo6m1NTOSAYrfF3t5Q,36382
57
+ rbx/box/presets/fetch.py,sha256=d37Pze32iQK2uWDr5I55cFeKwobZ6aczRNwpBoUJqoM,2755
54
58
  rbx/box/presets/lock_schema.py,sha256=8PKL7UMX4dkdVpCPLwYtaNIIrZpAfHGvTfnF8bRFedM,1708
55
- rbx/box/presets/schema.py,sha256=iOGWHqJ9Z-ljQV8ljOjQMuCwqJQLJKm_pYX9cLjZbmE,2432
56
- rbx/box/remote.py,sha256=PsJ4i3suQEr3cxiKk4nCho98QBGs5b2v8_TEvn_nE-o,5204
59
+ rbx/box/presets/schema.py,sha256=5Nw72QrSsA39cUCCLlVfSYMImK_-TfJEGu5TSIDv3W8,2918
60
+ rbx/box/remote.py,sha256=hCdiZSmh6Y1vnSEwLZ_gtAMYV-WLVlU3iVnvcObRpRc,5274
57
61
  rbx/box/retries.py,sha256=BZsi4sYBjm3VK5zb_pBQSYQuKo3ZntmtEFoVPZHg4QI,4982
62
+ rbx/box/sanitizers/issue_stack.py,sha256=N4RVVHnswNPsZZaPcVAkNIhRH32AUo8fxfoka4lgRrQ,3420
58
63
  rbx/box/sanitizers/warning_stack.py,sha256=6-rr3dkMq6MpfjrVZ8lSQjF4RZ5YzZSAPMzHCfm-6h4,2876
59
- rbx/box/schema.py,sha256=YLziLE5X-gI76844cCARHo0EmnUZSpr_ngEWzS8M5uM,18187
64
+ rbx/box/schema.py,sha256=SfGQYGrB6To4pRm4Y1ly5ON6Ng3oKBFQ6GVKpeSslr0,19808
60
65
  rbx/box/setter_config.py,sha256=vyZbsbgkjelZOblMLX5A1j4CLqPNQkrv83IZr_3-46Y,5301
61
- rbx/box/solutions.py,sha256=uTODZEvdb6H8hKhrmD-KrRg1hhmwiExq33tN3oh1vXg,54036
66
+ rbx/box/solutions.py,sha256=Id5X9711p5VX0kZfVXpj_klADPz8k5GvQsV3oXvhgrU,52848
62
67
  rbx/box/state.py,sha256=MMf3DvfQji0jKEliCHct2Tpp_0epL1tvP8HbHNArQIc,166
63
68
  rbx/box/statements/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
64
- rbx/box/statements/build_statements.py,sha256=gzhYVtxO0Pk3AgWr9cOXU7dYo_U-eSk_vpt-Ld8UXg8,12841
65
- rbx/box/statements/builders.py,sha256=t3q1BX1SaELQVZB0tynuhAs_0UI3yzpUcvsQEEaUE-w,13666
69
+ rbx/box/statements/build_statements.py,sha256=ZbciKblRUnRnTuuZfqU4W4EK6XhKkxuT1ByGMPjzNQU,13298
70
+ rbx/box/statements/builders.py,sha256=OkT8f9mRSZKztobrzEAXW5KTbPpUknFeL1Jns7Xx2K0,13778
66
71
  rbx/box/statements/expander.py,sha256=sdbMtNcJQCbXGIkFIl9h24pGr77vhFLnM31V5AfuduI,1715
67
72
  rbx/box/statements/joiners.py,sha256=jItNXkAbTjFQpPMgfDMW86n3vMTbaE8sgo9I8Yf4Txg,2886
68
73
  rbx/box/statements/latex.py,sha256=ipTGjL4kjAsnqgiH6Pk1PwKFegBumQP4-y0pFAbNN8I,1584
69
- rbx/box/statements/latex_jinja.py,sha256=1VWabl8dD0ix3XNABANA1Qt00D4ww0HR2L5lmywmdWU,10383
70
- rbx/box/statements/schema.py,sha256=n1OXbcmte-cGQn7PlSGOzBEYi0gRYUNDSubgYFKxo7I,5429
74
+ rbx/box/statements/latex_jinja.py,sha256=UQyD3hOFsiEQdFjqMswRrPXyGCiRPgnzZPmAcvJuPyM,11671
75
+ rbx/box/statements/schema.py,sha256=mTaowRbRvtgspQk9JqejIxc2BERz3ooP4xT1ZudZmcw,5381
71
76
  rbx/box/stats.py,sha256=rUAnmp7kTgUvIQ56NLpQaIQkazB37MVcUos5en3xUQw,3258
72
77
  rbx/box/stresses.py,sha256=SV0Hx7SPZZEIhwasWDVpTWuMhWWTjfJs2IEW-H0xJZw,12092
73
78
  rbx/box/stressing/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
74
79
  rbx/box/stressing/finder_parser.py,sha256=PnONJD2yun5X5EmHqkaz-rh3DHhn_BkTPHZrIXRKZbw,11898
75
- rbx/box/stressing/generator_parser.py,sha256=oHZryjR3YohgaSO9WEirQ7b2e-98WgZStF0N99W4Thw,7380
76
- rbx/box/tasks.py,sha256=CJ7TqzhVMPP4VUSrMpp3ofSDJn0rbuwIUWgFOiup_vE,11426
77
- rbx/box/testcase_extractors.py,sha256=vyT3Qw9FkQ-SABcgjyL9UBdKT1SktJ3-_4A-HRj6FQA,11942
80
+ rbx/box/stressing/generator_parser.py,sha256=0L5ST9YEByGL8k8jjWYtrBVpJpoUqYm3456b5Tpb-RQ,7428
81
+ rbx/box/tasks.py,sha256=XLLFVOVMkL-PCuetuDx_XGHVnlDkaUnXl7PCRyv-9dE,11393
82
+ rbx/box/testcase_extractors.py,sha256=-Pk3N1URV6HPdszfSAjae_Dt4obhTNBeDe1TD3a-nYM,12353
78
83
  rbx/box/testcase_utils.py,sha256=gFBs6OqdYk9NYhVuCP2BMxKvqKCmBUnbW5nKm0AKqoc,6941
79
84
  rbx/box/testcases/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
80
85
  rbx/box/testcases/main.py,sha256=_I7h_obRcpNLRQ6dDJDIE5NAvTyn5nBOhdsBhRA_PvU,5442
81
86
  rbx/box/testing/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
82
87
  rbx/box/testing/testing_package.py,sha256=szNc8GcxI0ywCjzV8fOuZh5F0fMtQ6_tLOfivF7hu10,15401
83
- rbx/box/testing/testing_preset.py,sha256=7TxfL4fT9JetRMRkQ3Iko99N5gzfKz8_lPM0rkkQx_k,1135
84
- rbx/box/testing/testing_shared.py,sha256=3j1n61ROVDxU2vZbLLIQuGEeYDs_CxsnnK9d7lT6hPI,2649
88
+ rbx/box/testing/testing_preset.py,sha256=pY8Vh0Y9emZXv6LPqYkXtARCBeTDvKe6c8-CX7mN_t8,5766
89
+ rbx/box/testing/testing_shared.py,sha256=W4JCUo_tKvGRDSeeUx6THjGkzngSqjQlPjn_FYTa-kU,2720
90
+ rbx/box/timing.py,sha256=vvghTagSTM9UiL98Tin6MMhDfE_9WMH8Vs-eFryMcIE,10268
85
91
  rbx/box/tooling/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
86
92
  rbx/box/tooling/boca/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
93
+ rbx/box/tooling/boca/debug_utils.py,sha256=Rs1ptMWsy32jl_DJZASeOfyqh8HCJdhIXufdbxpE_oM,4732
87
94
  rbx/box/tooling/boca/main.py,sha256=knl1rpaHIwA63KkzMJMZQrejzMpbTPBhYqGx1IpuNm4,289
95
+ rbx/box/tooling/boca/manual_scrape.py,sha256=iuNtOHrWczdaWNNRMKGYkgr-wSwgtjZedpz5-sX5IRQ,724
88
96
  rbx/box/tooling/boca/scrape.py,sha256=q1BoVstfLbw5CwB9e2hQnseBv6HQMnXq2z_tk18ui6M,1024
89
- rbx/box/tooling/boca/scraper.py,sha256=BVs3GRS7VRY1I6YzfPDc0Se0cSB_OUB61bvkJxFhUc8,12682
97
+ rbx/box/tooling/boca/scraper.py,sha256=6B3aI62YdzD7o1zykh9qavl6Qm6cTD--mEvVIjPvEaI,33701
90
98
  rbx/box/tooling/converter.py,sha256=CvZXDjmKqYLTFq9oaQjERa4Gqjlq3rK5dfQl1HFuRrI,2537
91
99
  rbx/box/tooling/main.py,sha256=uj6XHjJMF3nyb4enbbTK8XbUAuiRLT_RP1kVwSMqV5E,2003
92
100
  rbx/box/ui/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -113,8 +121,8 @@ rbx/box/ui/widgets/interaction_box.py,sha256=mJoQjHegxkIL00OgiCULmV0_w-2ZcwsQEa-
113
121
  rbx/box/ui/widgets/rich_log_box.py,sha256=mF565c_Y3RYUZ_GJEFj5Eb86SFjsib31wE5qu1K0UBM,91
114
122
  rbx/box/ui/widgets/test_output_box.py,sha256=ws7Oa2E8ZABM6Q4ZtL2UQiq59sJzKYPe-STrqhZJI8M,3871
115
123
  rbx/box/ui/widgets/two_sided_test_output_box.py,sha256=L-ORiDwd6CP5DFpavrKGBaX0ZHkSoQqbJrGZ4BdFUWc,2289
116
- rbx/box/unit.py,sha256=B1GOt537hOh-E0KAhB7AAgTpcu9UbA8n3JLNlX-2tRg,7887
117
- rbx/box/validators.py,sha256=z34cUMkuSlCPWnaCqaHqegCxuvmfhAvWlsqSeaduL6s,10580
124
+ rbx/box/unit.py,sha256=fOltTLM2ONkUbKhetpRrgUyphEXvmvn8_kPH26LPXmo,7860
125
+ rbx/box/validators.py,sha256=nugrsZ6NMJa1SCH-VybDTDDf_hLP3tJehksessNv75s,10445
118
126
  rbx/config.py,sha256=Tj0NHSf13fXxbNpif5C4qnaL1k3S-G87OnzuykEAcNQ,8463
119
127
  rbx/console.py,sha256=X8EJy68OROgh6ao3ZcUjZm5Y56VFMzen58ywAuQ7pAU,990
120
128
  rbx/grading/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -122,21 +130,18 @@ rbx/grading/caching.py,sha256=hasSs10PV4J_3e6b3xc7BDCnUNzT9uwrDZcZ_h_hL1I,16951
122
130
  rbx/grading/debug_context.py,sha256=kuAXEI8yRG8xfhS9WKKIRh9X0e5JUD8zvl_cpczJTC8,699
123
131
  rbx/grading/grading_context.py,sha256=TaRyLwPkkxvspQIFUFk8Ok0T8EST2pHMMNoVDx9lbFU,3416
124
132
  rbx/grading/judge/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
125
- rbx/grading/judge/cacher.py,sha256=QiVa74gFUuN4pyw_0hT3qg4oMF0frc1Iu56svpRUa9k,20413
133
+ rbx/grading/judge/cacher.py,sha256=zPyOqd7hP_zjuAGAauckFs6EvQE8pP7Mrug7fylIZvY,21929
126
134
  rbx/grading/judge/digester.py,sha256=gtOIe_iL4PEWA7OKelW1gjSI-nBvbOpDPJGV8VQyjSg,912
127
- rbx/grading/judge/program.py,sha256=ttT7X_uLls4ARIbid0MnSteo8Eti1fRw73FL_Ej6S_o,9683
128
- rbx/grading/judge/sandbox.py,sha256=mcqJscMPhMfjKhxKFkwIP-I4bnQHHMWeBcXiWHGVS-k,21324
135
+ rbx/grading/judge/program.py,sha256=8hVme1IbyZlrgg8j-po3KZJsYqUbgqfpax-vSZbobRA,9993
136
+ rbx/grading/judge/sandbox.py,sha256=tSJKSkupSqSiIPHx4rjZ_fhZKzJ9tqqqlsLNSfy9tcc,21334
129
137
  rbx/grading/judge/sandboxes/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
130
- rbx/grading/judge/sandboxes/stupid_sandbox.py,sha256=QJkazyqvTq9nQjupLVkH0HbdP13RH52T2jLBExAEQwE,11554
138
+ rbx/grading/judge/sandboxes/stupid_sandbox.py,sha256=QuIP93lBOm7bnkwB3NlhHWxRTs4DTosa_EYPqHq2QCY,11600
131
139
  rbx/grading/judge/sandboxes/tee.py,sha256=fLulB8fV7k5cO-ikRgURpsETrvr6LoUSjGxFM3GZs5U,672
132
- rbx/grading/judge/storage.py,sha256=A88O81-vzv8vMBGrO9gtFk8iB5fTD7ObpO8mvNH4OmA,14576
133
- rbx/grading/limits.py,sha256=ev312UTOo8S4-3AAVibQdXZclWCxS96CdbZxqW4y1kE,770
140
+ rbx/grading/judge/storage.py,sha256=yE9eIOW7tnmv_h3nTmWe4YFwErBTh84Ny4C1KLoZ2js,15613
141
+ rbx/grading/limits.py,sha256=zCyRTEtUQFd1RKL_fFKl3qSiRSIDCalBaSLlt1yhi0Y,896
134
142
  rbx/grading/profiling.py,sha256=OEdtoAzjYjLfi-QI5Ke7tLZzJeqvGpMB2utQBNuH3E4,3369
135
- rbx/grading/steps.py,sha256=MkeWH3VfTcwBkKW8Jn5q32ttdJKw0m0_4Cl5rZiL5WI,26604
143
+ rbx/grading/steps.py,sha256=qJ0tVWSggGhWj6zUuCV8HTJD9NE11JzRFZN41_jBz_0,26674
136
144
  rbx/grading/steps_with_caching.py,sha256=RWHtmlEfszKnKM9ADrfbCUZbxZSTD-BiHV3XSiGW8WY,4797
137
- rbx/providers/__init__.py,sha256=gHXg1BTiXJ_0Z_HoVTZrqhi5IIZ57Dhy0pt7K2ETbA4,1378
138
- rbx/providers/codeforces.py,sha256=HWQN3Zb9UfXgCfwcNMEk6m1HoXQ-UE2odVfZoPukyCg,2294
139
- rbx/providers/provider.py,sha256=CNRB-uJZkNFIWv8xhW2s8PY9EwUSK8Ey1Yvxk4YLvcg,688
140
145
  rbx/resources/checkers/boilerplate.cpp,sha256=vj1Qjy59JKEzb4ZpaX_MkL1FaZn_tTLZXjrIkP0nGfc,363
141
146
  rbx/resources/checkers/noop.cpp,sha256=aZI6EfZEWq2opbb-kysvl0UeUoYGLU682LccP7cfBG8,214
142
147
  rbx/resources/default_config.json,sha256=8GZVHns4nci0-e5ALk9C1lfO6TO9W2ZlmZtxHkL6ibA,949
@@ -190,37 +195,36 @@ rbx/resources/packagers/moj/scripts/py3/compile.sh,sha256=XPn8qDR_gPAAZD9h5lVEMd
190
195
  rbx/resources/packagers/moj/scripts/py3/prep.sh,sha256=it1e07QRpsnku3-rXOO1ovaw-RJlVVPy9R3I6WWwgMM,126
191
196
  rbx/resources/packagers/moj/scripts/py3/run.sh,sha256=LrMi7Tap9no8gh64QNGUXbWauP6ZpSl-wEwXZ2qhPo0,197
192
197
  rbx/resources/presets/default/contest/.gitignore,sha256=CMwGD717vKcbQrXjha2D4LMwjDfQcev8rjFPg0AIi4A,131
193
- rbx/resources/presets/default/contest/contest.rbx.yml,sha256=NsF5QNWKgFRdrLDiG6voH9rXethSZmaDUmlGgxQ_BCk,1058
198
+ rbx/resources/presets/default/contest/contest.rbx.yml,sha256=qa-FJEUP2o4mTfkfw8vb3TcSYRMC_N3yVoe7ZhjpP3U,1236
194
199
  rbx/resources/presets/default/contest/statement/contest.rbx.tex,sha256=Jx6op_WdVpQOMekvOAZnBzDxxvBzg1_9ZFWtbzGasLo,793
200
+ rbx/resources/presets/default/contest/statement/info.rbx.tex,sha256=Wz8Tbmi2lPWMgDbJsJolUi1xaQMwSnHmpZ3JwAy_Tb0,998
195
201
  rbx/resources/presets/default/contest/statement/instructions.tex,sha256=JG_eR13ukZgEahrrmrbg40H8cUzpoUE8QLocihN-fZ8,2414
196
202
  rbx/resources/presets/default/contest/statement/logo.png,sha256=RLNYmZoc-BR6AZKkmr4UEg3h01YeFzvy604jMAQC7aA,414485
197
203
  rbx/resources/presets/default/env.rbx.yml,sha256=quSPG5Xs9KroYLATNLPNtORLGRWtrLLt2Fx81T1enAM,1692
198
- rbx/resources/presets/default/preset.rbx.yml,sha256=s7OFotxoe3aFFEstJv5QG7LU3UP370dGe5hA9gWRQpg,498
199
- rbx/resources/presets/default/problem/.gitignore,sha256=CMwGD717vKcbQrXjha2D4LMwjDfQcev8rjFPg0AIi4A,131
204
+ rbx/resources/presets/default/preset.rbx.yml,sha256=fcpit12HmIjhsfFdeq9mORnYr4J21Ex-7HPJnbuSfWo,520
205
+ rbx/resources/presets/default/problem/.gitignore,sha256=1rt95y9Q7ZHIQn28JyZQUdD5zkpRosjAl9ZqoQmX2cE,149
200
206
  rbx/resources/presets/default/problem/gens/gen.cpp,sha256=rn6sGRjZ1sFE1Rq02r6488iquY9xTrutcvLv4d1sohA,178
201
207
  rbx/resources/presets/default/problem/manual_tests/samples/000.in,sha256=w66OEtCJGqjUNj8cJrqgImgGVm8W_OlIUtF255ds-ow,4
202
208
  rbx/resources/presets/default/problem/manual_tests/samples/001.in,sha256=P4QInDX87xXoDWu4PVIzUeNW5LtTlUKbMCvJ9uZOPGw,20
203
- rbx/resources/presets/default/problem/problem.rbx.yml,sha256=jawPzfJJ17pVSiWGRqjSqDm3PTD5kF_KO19eTLFsAC4,1725
204
- rbx/resources/presets/default/problem/rbx.h,sha256=LBkbC3gbDPW2Fdm1p99hNhF7oKpZLLSY7dE4zpepp5w,2161
209
+ rbx/resources/presets/default/problem/problem.rbx.yml,sha256=MMqCKkrRMoycIg5CmuV9hkGo45aUHCyRHQehzwZwzpo,2215
210
+ rbx/resources/presets/default/problem/rbx.h,sha256=iMNSI9tKGK8KJkl0Cgw1jhGdlRjqN_frFs-MFFS5Oq8,3760
205
211
  rbx/resources/presets/default/problem/sols/main.cpp,sha256=AW-j65DiFYUN18rddTKCWc_VyYCMgCbjZ0jAJ-0JLuA,124
206
- rbx/resources/presets/default/problem/sols/wa.cpp,sha256=Bj7tejPIlXG_JqUHWY1zi9TDbHdRZzgT_JDbCLRdhbQ,136
207
- rbx/resources/presets/default/problem/statement/statement.rbx.tex,sha256=JHdiMN3NQQsysDA1w3RfOGmDFobCc68YCB6SURy2hHo,360
212
+ rbx/resources/presets/default/problem/sols/wa-overflow.cpp,sha256=Bj7tejPIlXG_JqUHWY1zi9TDbHdRZzgT_JDbCLRdhbQ,136
213
+ rbx/resources/presets/default/problem/statement/statement.rbx.tex,sha256=iJhNF-OCskYJQA7XIC5CayZY1DZCcvnQ2XBkCESFlwI,431
214
+ rbx/resources/presets/default/problem/testlib.h,sha256=JvrK8SWQcesU_54BG2tQRzoUqw4KjnAgh7c8_9H7G5A,207138
208
215
  rbx/resources/presets/default/problem/testplan/random.py,sha256=XclCB6pw9NT1ahu9bjr3fLZidNGi1E8OnNAPYZEY-Yk,103
209
216
  rbx/resources/presets/default/problem/testplan/random.txt,sha256=XDrow4p79owKnjqyvaIVSNTXwWQDe3X1k_9-2zH43O8,34
210
- rbx/resources/presets/default/problem/validator.cpp,sha256=I_Vs12xQnJnwkRtCu4EjazdaERms4GktZhME7zGaQjU,337
217
+ rbx/resources/presets/default/problem/validator.cpp,sha256=Dqd3y4v8W4A3sYXHEqxsS4rZnMqQpUrNQfwVetxPdlo,381
211
218
  rbx/resources/presets/default/problem/wcmp.cpp,sha256=gbjJe3Vf9-YzHCEqBUq30aI3jMZXhqBDn3jjecYOn-w,902
212
- rbx/resources/presets/default/shared/contest_template.rbx.tex,sha256=iGUXFeob2Jw1jEr0qyP9M8D0jVZJEf2j0heyLy4t90M,1484
213
- rbx/resources/presets/default/shared/icpc.sty,sha256=d2fdlIcC559pq-Z4aEd2VGcAUE-z-qrltYSd2clTXhY,8451
214
- rbx/resources/presets/default/shared/problem_template.rbx.tex,sha256=xn4wE4mlc5yRR4QVDR5cfj14e8zFJXo2iBRftXQgQqw,1594
219
+ rbx/resources/presets/default/shared/contest_template.rbx.tex,sha256=9leq7cJFP1sB-gLSBdXAjTDuZTD89S4y18_nvifUTjE,1589
220
+ rbx/resources/presets/default/shared/icpc.sty,sha256=QUWdYOvQDue-bn27Lu8LsBh4FBmCDQqeFnB7ENZ-aV8,8831
221
+ rbx/resources/presets/default/shared/problem_template.rbx.tex,sha256=KDibf4LtUio9hNFgIfd1VarQxfp9XLrxhyk_nWEQGa4,1706
215
222
  rbx/resources/templates/rbx.h,sha256=0AZds9R0PmuPgnlTENb33Y81LW0LlnmOJFaoN8oG3Yo,3638
216
223
  rbx/resources/templates/template.cpp,sha256=xXWpWo7fa7HfmPNqkmHcmv3i46Wm0ZL-gPmkRfGvLn4,317
217
- rbx/submitors/__init__.py,sha256=sVcRNnuKMZatmpGkQURaEVHK-MfU2U0nH4nOatuqywE,620
218
- rbx/submitors/codeforces.py,sha256=s8c7sXfm5k76SKMC8g0Y93-RRf8wY2uWbBtA8ODD5eM,4030
219
- rbx/submitors/submitor.py,sha256=8q-Hbdahxt30ciT_R9j_xF6lEPUh9IcfAUnzjQjbvHU,457
220
- rbx/testing_utils.py,sha256=965vlkQpUW8cEqjB6S2g_C_avL5fn503mJPbqjY_zt4,2317
221
- rbx/utils.py,sha256=xDqmry5rpqRGPFrx3ipNGBt2WxWDAD5LwU7jvgibXkk,8630
222
- rbx_cp-0.13.8.dist-info/LICENSE,sha256=QwcOLU5TJoTeUhuIXzhdCEEDDvorGiC6-3YTOl4TecE,11356
223
- rbx_cp-0.13.8.dist-info/METADATA,sha256=Aj2dEF0ykkbumQpqjho-udy2bLahFJ2Yh_ynTQkuzn0,4659
224
- rbx_cp-0.13.8.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
225
- rbx_cp-0.13.8.dist-info/entry_points.txt,sha256=qBTLBOeifT1F00LWaEewRRE_jQPgvH7BUdJfZ-dYsFU,57
226
- rbx_cp-0.13.8.dist-info/RECORD,,
224
+ rbx/testing_utils.py,sha256=vNNdaytowJfuopszVHeFzVtHWlPfipPW4zpqCOvdZKU,2908
225
+ rbx/utils.py,sha256=AUIknhhED-ZIp6w-VcfPkaG1cYjQkovlX5WCvbVLNHg,9930
226
+ rbx_cp-0.16.0.dist-info/LICENSE,sha256=QwcOLU5TJoTeUhuIXzhdCEEDDvorGiC6-3YTOl4TecE,11356
227
+ rbx_cp-0.16.0.dist-info/METADATA,sha256=NWiKQeON30wdiUVjK3so6HKwBBN05aJydDUZ1w6svS8,4799
228
+ rbx_cp-0.16.0.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
229
+ rbx_cp-0.16.0.dist-info/entry_points.txt,sha256=Gw2_BZ5Jon61biaH_ETbAQGXy8fR5On9gw2U4A1erpo,40
230
+ rbx_cp-0.16.0.dist-info/RECORD,,
@@ -1,4 +1,3 @@
1
1
  [console_scripts]
2
- rbc=rbx.main:app
3
2
  rbx=rbx.box.main:app
4
3
 
rbx/providers/__init__.py DELETED
@@ -1,43 +0,0 @@
1
- from typing import List
2
-
3
- from rbx.providers.codeforces import CodeforcesProvider
4
- from rbx.providers.provider import ProviderInterface
5
- from rbx.schema import Problem
6
-
7
- ALL_PROVIDERS: List[ProviderInterface] = [
8
- CodeforcesProvider(),
9
- ]
10
-
11
-
12
- def is_contest(problems: List[Problem]) -> bool:
13
- for provider in ALL_PROVIDERS:
14
- handle_all = all(provider.should_handle(problem.url) for problem in problems)
15
- if handle_all:
16
- return provider.is_contest(problems)
17
- return False
18
-
19
-
20
- def should_simplify_contest_problems(problems: List[Problem]) -> bool:
21
- if not is_contest(problems):
22
- return False
23
- for provider in ALL_PROVIDERS:
24
- handle_all = all(provider.should_handle(problem.url) for problem in problems)
25
- if handle_all:
26
- return provider.should_simplify_contest_problems()
27
- return False
28
-
29
-
30
- def get_code(problem: Problem, simplify: bool = False) -> str:
31
- for provider in ALL_PROVIDERS:
32
- if provider.should_handle(problem.url):
33
- if simplify:
34
- return provider.get_problem_code_within_contest(problem)
35
- return provider.get_code(problem)
36
- return problem.get_normalized_name()
37
-
38
-
39
- def get_aliases(problem: Problem) -> List[str]:
40
- for provider in ALL_PROVIDERS:
41
- if provider.should_handle(problem.url):
42
- return provider.get_aliases(problem)
43
- return []
@@ -1,73 +0,0 @@
1
- import re
2
- from typing import List, Optional
3
-
4
- from rbx.providers.provider import ProviderInterface
5
- from rbx.schema import Problem
6
-
7
-
8
- def _add_underscores(matches: List[str]) -> List[str]:
9
- if len(matches) <= 2:
10
- return matches
11
- return [f'{x}_' for x in matches[:-2]] + matches[-2:]
12
-
13
-
14
- _PATTERNS = [
15
- r'https?://(?:.*\.)?codeforces.(?:com|ml|es)/(?:contest|gym)/(\d+)/problem/([^/]+)',
16
- r'https?://(?:.*\.)?codeforces.(?:com|ml|es)/problemset/problem/(\d+)/([^/]+)',
17
- (
18
- r'https?://(?:.*\.)?codeforces.(?:com|ml|es)/group/([^/]+)/contest/(\d+)/problem/([^/]+)',
19
- _add_underscores,
20
- ),
21
- r'https?://(?:.*\.)?codeforces.(?:com|ml|es)/problemset/(gym)Problem/([^/]+)',
22
- r'https?://(?:.*\.)?codeforces.(?:com|ml|es)/problemsets/(acm)sguru/problem/(?:\d+)/([^/]+)',
23
- # TODO: add EDU
24
- ]
25
-
26
-
27
- def _compiled_pattern(pattern):
28
- if isinstance(pattern, tuple):
29
- return (re.compile(pattern[0]), pattern[1])
30
- return re.compile(pattern)
31
-
32
-
33
- _COMPILED_PATTERNS = [_compiled_pattern(pattern) for pattern in _PATTERNS]
34
-
35
-
36
- def get_code_tuple(url: str) -> Optional[List[str]]:
37
- for pattern_obj in _COMPILED_PATTERNS:
38
- if isinstance(pattern_obj, tuple):
39
- pattern, extract = pattern_obj
40
- else:
41
- pattern = pattern_obj
42
- extract = lambda x: x # noqa: E731
43
-
44
- if match := pattern.match(url):
45
- return extract(list(match.groups()))
46
- return None
47
-
48
-
49
- class CodeforcesProvider(ProviderInterface):
50
- def should_handle(self, url: str) -> bool:
51
- return 'codeforces.com/' in url
52
-
53
- def should_simplify_contest_problems(self) -> bool:
54
- return True
55
-
56
- def get_problem_code_within_contest(self, problem: Problem) -> str:
57
- return self.get_aliases(problem)[-1]
58
-
59
- def get_code(self, problem: Problem) -> str:
60
- code_tuple = get_code_tuple(problem.url)
61
- if not code_tuple:
62
- return super().get_code(problem)
63
- return ''.join(code_tuple)
64
-
65
- def get_aliases(self, problem: Problem) -> List[str]:
66
- code_tuple = get_code_tuple(problem.url)
67
- if not code_tuple:
68
- return super().get_aliases(problem)
69
-
70
- aliases = []
71
- for i in range(len(code_tuple)):
72
- aliases.append(''.join(code_tuple[i:]))
73
- return aliases