rbx.cp 0.13.6__py3-none-any.whl → 0.13.8__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.
rbx/box/code.py CHANGED
@@ -174,7 +174,7 @@ def _ignore_warning_in_cxx_input(input: GradingFileInput):
174
174
  input.src = preprocessed_path
175
175
 
176
176
 
177
- def _maybe_rename_java_class(
177
+ def maybe_rename_java_class(
178
178
  compilable_path: pathlib.Path, file_mapping: FileMapping
179
179
  ) -> pathlib.Path:
180
180
  mapped_path = PosixPath(file_mapping.compilable)
@@ -540,7 +540,7 @@ def compile_item(
540
540
  download.maybe_add_testlib(code, artifacts)
541
541
  download.maybe_add_jngen(code, artifacts)
542
542
  download.maybe_add_rbx_header(code, artifacts)
543
- compilable_path = _maybe_rename_java_class(compilable_path, file_mapping)
543
+ compilable_path = maybe_rename_java_class(compilable_path, file_mapping)
544
544
  artifacts.inputs.append(
545
545
  GradingFileInput(src=compilable_path, dest=PosixPath(file_mapping.compilable))
546
546
  )
@@ -247,9 +247,15 @@ def _get_statement_for_language(language: str) -> Optional[Statement]:
247
247
  def _get_statement_blocks(statement: Statement) -> StatementBlocks:
248
248
  # TODO: actually try to convert to rbxTeX
249
249
  assert statement.type == StatementType.rbxTeX
250
+ pkg = package.find_problem_package_or_die()
251
+ # TODO: pull this from a library, too hacky at the moment
250
252
  builder_problem = StatementBuilderProblem(
251
- package=package.find_problem_package_or_die(),
253
+ package=pkg,
252
254
  statement=statement,
255
+ vars={
256
+ **pkg.expanded_vars,
257
+ **statement.expanded_vars,
258
+ },
253
259
  )
254
260
  with tempfile.TemporaryDirectory() as temp_dir:
255
261
  return render_jinja_blocks(
@@ -119,7 +119,7 @@ def scientific_notation(
119
119
  mult, exp, rest = _process_zeroes(value)
120
120
  if exp < zeroes:
121
121
  return str(value)
122
- res = '10' if exp == 1 else f'10^{exp}'
122
+ res = '10' if exp == 1 else f'10^{{{exp}}}'
123
123
  if rest > 0 and len(str(rest)) + 1 >= len(str(value)):
124
124
  # Should not convert numbers like 532 to 5*10^2 + 32.
125
125
  return str(value)
@@ -30,7 +30,7 @@ def _get_group_output(
30
30
  return group_path / f'{subgroup_prefix}{i:03d}.out'
31
31
 
32
32
 
33
- async def _run_generator_script(testcase: TestcaseSubgroup) -> str:
33
+ async def run_generator_script(testcase: TestcaseSubgroup) -> str:
34
34
  assert testcase.generatorScript is not None
35
35
 
36
36
  cacher = package.get_file_cacher()
@@ -240,7 +240,7 @@ async def run_testcase_visitor(visitor: TestcaseVisitor):
240
240
 
241
241
  # Run generator script.
242
242
  if subgroup.generatorScript is not None:
243
- script = await _run_generator_script(subgroup)
243
+ script = await run_generator_script(subgroup)
244
244
 
245
245
  # Run each line from generator script.
246
246
  for generator_name, args, line_number in _extract_script_lines(script):
rbx/box/testcase_utils.py CHANGED
@@ -40,6 +40,8 @@ class TestcaseEntry(BaseModel):
40
40
 
41
41
 
42
42
  class TestcasePattern(BaseModel):
43
+ __test__ = False
44
+
43
45
  group_prefix: List[str]
44
46
  index: Optional[int] = None
45
47
 
@@ -179,10 +181,10 @@ def parse_interaction(file: pathlib.Path) -> TestcaseInteraction:
179
181
 
180
182
  while line := f.readline().strip():
181
183
  if line.startswith(interactor_prefix):
182
- stripped = line[len(interactor_prefix) :].strip()
184
+ stripped = line[len(interactor_prefix) :].rstrip()
183
185
  entries.append(TestcaseInteractionEntry(data=stripped, pipe=0))
184
186
  elif line.startswith(solution_prefix):
185
- stripped = line[len(solution_prefix) :].strip()
187
+ stripped = line[len(solution_prefix) :].rstrip()
186
188
  entries.append(TestcaseInteractionEntry(data=stripped, pipe=1))
187
189
  else:
188
190
  raise TestcaseInteractionParsingError(
@@ -202,11 +204,11 @@ def get_alternate_interaction_texts(
202
204
  solution_entries = []
203
205
  for entry in interaction.entries:
204
206
  if entry.pipe == 1:
205
- solution_entries.append(entry.data)
206
- interactor_entries.extend(['\n'] * entry.data.count('\n'))
207
+ solution_entries.append(entry.data + '\n')
208
+ interactor_entries.extend(['\n'] * (entry.data.count('\n') + 1))
207
209
  else:
208
- interactor_entries.append(entry.data)
209
- solution_entries.extend(['\n'] * entry.data.count('\n'))
210
+ interactor_entries.append(entry.data + '\n')
211
+ solution_entries.extend(['\n'] * (entry.data.count('\n') + 1))
210
212
  return ''.join(interactor_entries), ''.join(solution_entries)
211
213
 
212
214
 
@@ -217,4 +219,4 @@ def print_interaction(interaction: TestcaseInteraction):
217
219
  text.stylize('status')
218
220
  else:
219
221
  text.stylize('info')
220
- console.console.print(text, end='')
222
+ console.console.print(text)
@@ -1,6 +1,6 @@
1
1
  import pathlib
2
2
  from dataclasses import dataclass
3
- from typing import Dict, List, Optional
3
+ from typing import Any, Dict, List, Optional
4
4
 
5
5
  from rbx import console, utils
6
6
  from rbx.box import package, presets
@@ -10,11 +10,14 @@ from rbx.box.schema import (
10
10
  CodeItem,
11
11
  ExpectedOutcome,
12
12
  Generator,
13
+ GeneratorCall,
13
14
  Interactor,
14
15
  Package,
15
16
  Solution,
16
17
  TaskType,
18
+ Testcase,
17
19
  TestcaseGroup,
20
+ TestcaseSubgroup,
18
21
  ValidatorOutcome,
19
22
  ValidatorTest,
20
23
  )
@@ -229,6 +232,154 @@ class TestingPackage(TestingShared):
229
232
  ]
230
233
  self.save()
231
234
 
235
+ def add_testgroup_with_subgroups(
236
+ self,
237
+ name: str,
238
+ subgroups: List[Dict[str, Any]],
239
+ validator: Optional[PathOrStr] = None,
240
+ extra_validators: Optional[List[PathOrStr]] = None,
241
+ ):
242
+ """Add a testgroup with subgroups.
243
+
244
+ Args:
245
+ name: Name of the testgroup
246
+ subgroups: List of subgroup definitions, each containing fields like:
247
+ - name: subgroup name
248
+ - generators: list of generator calls
249
+ - testcases: list of testcase objects
250
+ - testcaseGlob: glob pattern
251
+ - generatorScript: generator script path
252
+ - extraValidators: list of extra validators
253
+ """
254
+
255
+ subgroup_objects = []
256
+ for subgroup_data in subgroups:
257
+ subgroup_dict = {'name': subgroup_data['name']}
258
+
259
+ if 'generators' in subgroup_data:
260
+ subgroup_dict['generators'] = [
261
+ GeneratorCall(name=gen['name'], args=gen.get('args'))
262
+ for gen in subgroup_data['generators']
263
+ ]
264
+
265
+ if 'testcases' in subgroup_data:
266
+ subgroup_dict['testcases'] = [
267
+ Testcase(
268
+ inputPath=pathlib.Path(tc['inputPath']),
269
+ outputPath=pathlib.Path(tc['outputPath'])
270
+ if tc.get('outputPath')
271
+ else None,
272
+ )
273
+ for tc in subgroup_data['testcases']
274
+ ]
275
+
276
+ if 'testcaseGlob' in subgroup_data:
277
+ subgroup_dict['testcaseGlob'] = subgroup_data['testcaseGlob']
278
+
279
+ if 'generatorScript' in subgroup_data:
280
+ subgroup_dict['generatorScript'] = CodeItem(
281
+ path=pathlib.Path(subgroup_data['generatorScript'])
282
+ )
283
+
284
+ if 'extraValidators' in subgroup_data:
285
+ subgroup_dict['extraValidators'] = [
286
+ CodeItem(path=pathlib.Path(v))
287
+ for v in subgroup_data['extraValidators']
288
+ ]
289
+
290
+ subgroup_objects.append(TestcaseSubgroup(**subgroup_dict))
291
+
292
+ self.yml.testcases = self.yml.testcases + [
293
+ TestcaseGroup(
294
+ name=name,
295
+ subgroups=subgroup_objects,
296
+ validator=CodeItem(path=pathlib.Path(validator)) if validator else None,
297
+ extraValidators=[
298
+ CodeItem(path=pathlib.Path(v)) for v in extra_validators
299
+ ]
300
+ if extra_validators
301
+ else [],
302
+ )
303
+ ]
304
+ self.save()
305
+
306
+ def add_testgroup_with_manual_testcases(
307
+ self,
308
+ name: str,
309
+ testcases: List[Dict[str, str]],
310
+ validator: Optional[PathOrStr] = None,
311
+ extra_validators: Optional[List[PathOrStr]] = None,
312
+ ):
313
+ """Add a testgroup with manually defined testcases.
314
+
315
+ Args:
316
+ name: Name of the testgroup
317
+ testcases: List of testcase definitions, each containing:
318
+ - inputPath: path to input file
319
+ - outputPath: optional path to output file
320
+ """
321
+
322
+ testcase_objects = []
323
+ for tc_data in testcases:
324
+ testcase_objects.append(
325
+ Testcase(
326
+ inputPath=pathlib.Path(tc_data['inputPath']),
327
+ outputPath=pathlib.Path(tc_data['outputPath'])
328
+ if tc_data.get('outputPath')
329
+ else None,
330
+ )
331
+ )
332
+
333
+ self.yml.testcases = self.yml.testcases + [
334
+ TestcaseGroup(
335
+ name=name,
336
+ testcases=testcase_objects,
337
+ validator=CodeItem(path=pathlib.Path(validator)) if validator else None,
338
+ extraValidators=[
339
+ CodeItem(path=pathlib.Path(v)) for v in extra_validators
340
+ ]
341
+ if extra_validators
342
+ else [],
343
+ )
344
+ ]
345
+ self.save()
346
+
347
+ def add_testgroup_with_generators(
348
+ self,
349
+ name: str,
350
+ generators: List[Dict[str, str]],
351
+ validator: Optional[PathOrStr] = None,
352
+ extra_validators: Optional[List[PathOrStr]] = None,
353
+ ):
354
+ """Add a testgroup with generator calls.
355
+
356
+ Args:
357
+ name: Name of the testgroup
358
+ generators: List of generator definitions, each containing:
359
+ - name: generator name
360
+ - args: optional generator arguments
361
+ """
362
+
363
+ generator_objects = []
364
+ for gen_data in generators:
365
+ generator_objects.append(
366
+ GeneratorCall(name=gen_data['name'], args=gen_data.get('args'))
367
+ )
368
+
369
+ self.yml.testcases = self.yml.testcases + [
370
+ TestcaseGroup(
371
+ name=name,
372
+ generators=generator_objects,
373
+ validator=CodeItem(path=pathlib.Path(validator)) if validator else None,
374
+ extraValidators=[
375
+ CodeItem(path=pathlib.Path(v)) for v in extra_validators
376
+ ]
377
+ if extra_validators
378
+ else [],
379
+ )
380
+ ]
381
+ self.save()
382
+
232
383
  def get_build_testgroup_path(self, name: str) -> pathlib.Path:
233
384
  return self.root / 'build' / 'tests' / name
234
385
 
@@ -55,7 +55,10 @@ class TestingShared:
55
55
  return filename
56
56
 
57
57
  def relpath(self, path: PathOrStr) -> pathlib.Path:
58
- return pathlib.Path(path).relative_to(self.root)
58
+ path = pathlib.Path(path)
59
+ if not path.is_relative_to(self.root):
60
+ return path
61
+ return path.relative_to(self.root)
59
62
 
60
63
  def add_from_testdata(self, path: PathOrStr, src: PathOrStr):
61
64
  testdata_path = get_testdata_path()
@@ -316,7 +316,10 @@ class StupidSandbox(SandboxBase):
316
316
  interactor_tee.pipes.output.close()
317
317
 
318
318
  if idx == 0 and program_result.exitcode != 0:
319
- os.killpg(group_id, signal.SIGKILL)
319
+ try:
320
+ os.killpg(group_id, signal.SIGKILL)
321
+ except Exception:
322
+ pass
320
323
  elif pid == program.pid:
321
324
  program_result = program.process_exit(status, ru)
322
325
  results[0] = self._get_sandbox_log(program_result, params)
@@ -17,6 +17,10 @@ statements:
17
17
  configure:
18
18
  - type: "rbx-tex" # Convert rbxTeX to TeX
19
19
  template: "statement/template.rbx.tex"
20
+ vars:
21
+ # Turn into false to hide time limits and memory limits in the problem statement.
22
+ # Useful for ICPC-style contests where you distribute a separate info sheet.
23
+ show_limits: true
20
24
  - name: "editorial-en"
21
25
  extends: "statement-en"
22
26
  override:
@@ -31,6 +31,8 @@ statements:
31
31
  configure:
32
32
  - type: "rbx-tex" # Convert rbxTeX to TeX
33
33
  template: "statement/template.rbx.tex"
34
+ vars:
35
+ show_limits: true
34
36
  stresses:
35
37
  - name: "stress"
36
38
  generator:
@@ -1,10 +1,16 @@
1
- %- if vars.show_problem is truthy or vars.editorial is falsy
1
+ %- if problem.vars.show_problem is truthy or problem.vars.editorial is falsy
2
2
  \includeProblem
3
3
  %- if problem.short_name is defined
4
4
  [\VAR{problem.short_name}]
5
5
  %- endif
6
6
  {\VAR{problem.title | escape}}{
7
7
 
8
+ %- if problem.vars.show_limits is truthy
9
+ \includeLimits{\VAR{problem.package.timeLimit} ms}{\VAR{problem.package.memoryLimit} MiB}
10
+ %- else
11
+ \vspace{0.55cm}
12
+ %- endif
13
+
8
14
  \VAR{problem.blocks.legend}
9
15
 
10
16
  %- if problem.blocks.input is defined
@@ -20,7 +26,7 @@
20
26
  %- endif
21
27
 
22
28
  %- if problem.samples
23
- \vspace{0.3cm}
29
+ \vspace{0.1cm}
24
30
  \subsection*{\strExamples}
25
31
  %- for sample in problem.samples
26
32
  %- if sample.interaction is not none
@@ -16,6 +16,7 @@
16
16
  \let\mytitleformat\titleformat
17
17
  \let\titleformat\relax
18
18
  \usepackage{logicpuzzle}
19
+ \let\titleformat\mytitleformat
19
20
  \usepackage{enumitem}
20
21
  \usepackage{amsfonts}
21
22
  \usepackage[brazil]{babel}
@@ -76,6 +77,11 @@
76
77
 
77
78
  \setlength{\voffset}{-1in}
78
79
 
80
+ % Increase section text sizes
81
+ \titleformat{\section}{\LARGE\bfseries}{\thesection}{1em}{}
82
+ \titleformat{\subsection}{\Large\bfseries}{\thesubsection}{1em}{}
83
+ \titleformat{\subsubsection}{\normalsize\bfseries}{\thesubsubsection}{1em}{}
84
+
79
85
  \newcommand{\insereArquivo}[1]{
80
86
  \ifnum0\pdffilesize{#1}>0
81
87
  \VerbatimInput[xleftmargin=0mm,numbers=none,obeytabs=true]{#1}\vspace{.5em}
@@ -139,6 +145,15 @@
139
145
  #3
140
146
  }
141
147
 
148
+ \newcommand{\includeLimits}[2]{
149
+ \vspace{0.2cm}
150
+ \begin{center}
151
+ \textit{\strTimeLimit: #1}\\
152
+ \textit{\strMemoryLimit: #2}
153
+ \end{center}
154
+ \vspace{0.25cm}
155
+ }
156
+
142
157
  \newcommand{\inputdesc}[1]{
143
158
  \subsection*{\strInput}
144
159
  {#1} }
@@ -271,11 +286,9 @@
271
286
  \newcounter{pcounter}\setcounter{pcounter}{0}
272
287
  \newcounter{qcounter}\setcounter{qcounter}{0}
273
288
 
274
- \usepackage{titlesec}
275
-
276
- \titlespacing\section{0pt}{6pt plus 4pt minus 2pt}{0pt plus 2pt minus 2pt}
277
- \titlespacing\subsection{0pt}{6pt plus 4pt minus 2pt}{0pt plus 2pt minus 2pt}
278
- \titlespacing\subsubsection{0pt}{6t plus 4pt minus 2pt}{0pt plus 2pt minus 2pt}
289
+ \titlespacing\section{0pt}{12pt plus 0pt minus 2pt}{10pt plus 0pt minus 2pt}
290
+ \titlespacing\subsection{0pt}{12pt plus 0pt minus 2pt}{10pt plus 0pt minus 2pt}
291
+ \titlespacing\subsubsection{0pt}{12pt plus 0pt minus 2pt}{10pt plus 0pt minus 2pt}
279
292
 
280
293
  \newcommand{\InsertTitlePage}
281
294
  {
@@ -15,6 +15,12 @@
15
15
  %- endif
16
16
  {\VAR{problem.title | escape}}{
17
17
 
18
+ %- if problem.vars.show_limits is truthy
19
+ \includeLimits{\VAR{problem.package.timeLimit} ms}{\VAR{problem.package.memoryLimit} MiB}
20
+ %- else
21
+ \vspace{0.55cm}
22
+ %- endif
23
+
18
24
  \VAR{problem.blocks.legend}
19
25
 
20
26
  %- if problem.blocks.input is defined
@@ -30,7 +36,7 @@
30
36
  %- endif
31
37
 
32
38
  %- if problem.samples
33
- \vspace{0.3cm}
39
+ \vspace{0.1cm}
34
40
  \subsection*{\strExamples}
35
41
  %- for sample in problem.samples
36
42
  %- if sample.interaction is not none
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: rbx.cp
3
- Version: 0.13.6
3
+ Version: 0.13.8
4
4
  Summary:
5
5
  Author: Roberto Sales
6
6
  Requires-Python: >=3.9.1,<4.0.0
@@ -6,7 +6,7 @@ rbx/box/builder.py,sha256=umrTdVAwvsOosBDVvDZ6kq1yWg3Z2Lxp2o1zK-V7BBk,3594
6
6
  rbx/box/cd.py,sha256=_XAzb3kV1NUaaRs8hc9SGDo10O1yh2_gr1EiAKzfUjI,2711
7
7
  rbx/box/checkers.py,sha256=mRovZyTZdySFEaYFVc3Lc-xgEsu6F9FjVPOxDwub7aY,13226
8
8
  rbx/box/cli.py,sha256=eBXiy3zG6IzrIHPYplFWhGn7cB7nmA7F1GiAGoYFWp0,29904
9
- rbx/box/code.py,sha256=SXjce-rBr_B4bVNgCYBuN6KZJTtb9GfYqIxPmrO2XWo,25467
9
+ rbx/box/code.py,sha256=2e1tDdrVqHUIT6qaW-MiU2YeuYSdRBhTCTJX78E82do,25465
10
10
  rbx/box/compile.py,sha256=Kzn5mEQu4vb91W9vjyt0DS6cfPJzFLTUoowFj7uHLUo,2539
11
11
  rbx/box/contest/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
12
12
  rbx/box/contest/build_contest_statements.py,sha256=N7TQ8Ki7ZM94sATHploDsSKbY41Xey_FlXclEdCBpJI,13010
@@ -47,7 +47,7 @@ rbx/box/packaging/polygon/importer.py,sha256=xmtKQo5q81s30u41cEe5PWsepDMJx2XbZRx
47
47
  rbx/box/packaging/polygon/packager.py,sha256=JYVT6FjFh2PJi8ZjjmmgiIe_CNrYUX15LUhkYi1aF3Y,12194
48
48
  rbx/box/packaging/polygon/polygon_api.py,sha256=mPKEqiwANJ1nr-JhOgzGMaDhnbljsAgzzPHW6kkf7R4,41016
49
49
  rbx/box/packaging/polygon/test.py,sha256=bgEju5PwudgyfwxXJagm8fM6CJVlWM6l_-2q1V-oKaQ,3069
50
- rbx/box/packaging/polygon/upload.py,sha256=W9LcEe2D2ySOdyXETp529lP5BtB4GyOUD2lLPbSzCjE,13548
50
+ rbx/box/packaging/polygon/upload.py,sha256=wFUOEPa5bnKiIoUcwPY5rhfrz9doq-2B2fJqrsZFSdk,13722
51
51
  rbx/box/packaging/polygon/xml_schema.py,sha256=TSl4BWwMWv7V07BKJ56mcLXNr_3zlRgNmqN2q-wnk4M,3128
52
52
  rbx/box/presets/__init__.py,sha256=Vm9Xievtn1fbFMHubPh6Ngz-GvMx3ycfx15tkvwcvfA,33421
53
53
  rbx/box/presets/fetch.py,sha256=900aq9S8e12TlgSenG0iHgtF4OWgqavZsptgI_a1YKM,2508
@@ -66,7 +66,7 @@ rbx/box/statements/builders.py,sha256=t3q1BX1SaELQVZB0tynuhAs_0UI3yzpUcvsQEEaUE-
66
66
  rbx/box/statements/expander.py,sha256=sdbMtNcJQCbXGIkFIl9h24pGr77vhFLnM31V5AfuduI,1715
67
67
  rbx/box/statements/joiners.py,sha256=jItNXkAbTjFQpPMgfDMW86n3vMTbaE8sgo9I8Yf4Txg,2886
68
68
  rbx/box/statements/latex.py,sha256=ipTGjL4kjAsnqgiH6Pk1PwKFegBumQP4-y0pFAbNN8I,1584
69
- rbx/box/statements/latex_jinja.py,sha256=iMx47ynKMjLNcfymzHV24jtWrRVnit0Va9H8yTfgmiA,10379
69
+ rbx/box/statements/latex_jinja.py,sha256=1VWabl8dD0ix3XNABANA1Qt00D4ww0HR2L5lmywmdWU,10383
70
70
  rbx/box/statements/schema.py,sha256=n1OXbcmte-cGQn7PlSGOzBEYi0gRYUNDSubgYFKxo7I,5429
71
71
  rbx/box/stats.py,sha256=rUAnmp7kTgUvIQ56NLpQaIQkazB37MVcUos5en3xUQw,3258
72
72
  rbx/box/stresses.py,sha256=SV0Hx7SPZZEIhwasWDVpTWuMhWWTjfJs2IEW-H0xJZw,12092
@@ -74,14 +74,14 @@ rbx/box/stressing/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU
74
74
  rbx/box/stressing/finder_parser.py,sha256=PnONJD2yun5X5EmHqkaz-rh3DHhn_BkTPHZrIXRKZbw,11898
75
75
  rbx/box/stressing/generator_parser.py,sha256=oHZryjR3YohgaSO9WEirQ7b2e-98WgZStF0N99W4Thw,7380
76
76
  rbx/box/tasks.py,sha256=CJ7TqzhVMPP4VUSrMpp3ofSDJn0rbuwIUWgFOiup_vE,11426
77
- rbx/box/testcase_extractors.py,sha256=J43eG7vpxc5nP_2yhrXJODkd4EYlV4WiYVbM6hzipY4,11944
78
- rbx/box/testcase_utils.py,sha256=HoDr_RxWpfviLd2oTj_m2wg1e4XaY9LD-QBqx_QjDI0,6899
77
+ rbx/box/testcase_extractors.py,sha256=vyT3Qw9FkQ-SABcgjyL9UBdKT1SktJ3-_4A-HRj6FQA,11942
78
+ rbx/box/testcase_utils.py,sha256=gFBs6OqdYk9NYhVuCP2BMxKvqKCmBUnbW5nKm0AKqoc,6941
79
79
  rbx/box/testcases/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
80
80
  rbx/box/testcases/main.py,sha256=_I7h_obRcpNLRQ6dDJDIE5NAvTyn5nBOhdsBhRA_PvU,5442
81
81
  rbx/box/testing/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
82
- rbx/box/testing/testing_package.py,sha256=kzvSbL_4fkjD2l3hfYapyOezLHhhySi9sp4u92MoycY,10121
82
+ rbx/box/testing/testing_package.py,sha256=szNc8GcxI0ywCjzV8fOuZh5F0fMtQ6_tLOfivF7hu10,15401
83
83
  rbx/box/testing/testing_preset.py,sha256=7TxfL4fT9JetRMRkQ3Iko99N5gzfKz8_lPM0rkkQx_k,1135
84
- rbx/box/testing/testing_shared.py,sha256=rX7w5VrCzf4l9zYhq3eFW1iHaWDLU-Xkn5oCjnAavhA,2558
84
+ rbx/box/testing/testing_shared.py,sha256=3j1n61ROVDxU2vZbLLIQuGEeYDs_CxsnnK9d7lT6hPI,2649
85
85
  rbx/box/tooling/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
86
86
  rbx/box/tooling/boca/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
87
87
  rbx/box/tooling/boca/main.py,sha256=knl1rpaHIwA63KkzMJMZQrejzMpbTPBhYqGx1IpuNm4,289
@@ -127,7 +127,7 @@ rbx/grading/judge/digester.py,sha256=gtOIe_iL4PEWA7OKelW1gjSI-nBvbOpDPJGV8VQyjSg
127
127
  rbx/grading/judge/program.py,sha256=ttT7X_uLls4ARIbid0MnSteo8Eti1fRw73FL_Ej6S_o,9683
128
128
  rbx/grading/judge/sandbox.py,sha256=mcqJscMPhMfjKhxKFkwIP-I4bnQHHMWeBcXiWHGVS-k,21324
129
129
  rbx/grading/judge/sandboxes/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
130
- rbx/grading/judge/sandboxes/stupid_sandbox.py,sha256=-fSYt0WNf04rrakhxdrunYlmwO2uM2Pf1HmUX8qfxrI,11458
130
+ rbx/grading/judge/sandboxes/stupid_sandbox.py,sha256=QJkazyqvTq9nQjupLVkH0HbdP13RH52T2jLBExAEQwE,11554
131
131
  rbx/grading/judge/sandboxes/tee.py,sha256=fLulB8fV7k5cO-ikRgURpsETrvr6LoUSjGxFM3GZs5U,672
132
132
  rbx/grading/judge/storage.py,sha256=A88O81-vzv8vMBGrO9gtFk8iB5fTD7ObpO8mvNH4OmA,14576
133
133
  rbx/grading/limits.py,sha256=ev312UTOo8S4-3AAVibQdXZclWCxS96CdbZxqW4y1kE,770
@@ -190,7 +190,7 @@ rbx/resources/packagers/moj/scripts/py3/compile.sh,sha256=XPn8qDR_gPAAZD9h5lVEMd
190
190
  rbx/resources/packagers/moj/scripts/py3/prep.sh,sha256=it1e07QRpsnku3-rXOO1ovaw-RJlVVPy9R3I6WWwgMM,126
191
191
  rbx/resources/packagers/moj/scripts/py3/run.sh,sha256=LrMi7Tap9no8gh64QNGUXbWauP6ZpSl-wEwXZ2qhPo0,197
192
192
  rbx/resources/presets/default/contest/.gitignore,sha256=CMwGD717vKcbQrXjha2D4LMwjDfQcev8rjFPg0AIi4A,131
193
- rbx/resources/presets/default/contest/contest.rbx.yml,sha256=7ifI6vbQg9IOYA94Q6i1toj-S8wNwwDkK-gJLxEaCeU,845
193
+ rbx/resources/presets/default/contest/contest.rbx.yml,sha256=NsF5QNWKgFRdrLDiG6voH9rXethSZmaDUmlGgxQ_BCk,1058
194
194
  rbx/resources/presets/default/contest/statement/contest.rbx.tex,sha256=Jx6op_WdVpQOMekvOAZnBzDxxvBzg1_9ZFWtbzGasLo,793
195
195
  rbx/resources/presets/default/contest/statement/instructions.tex,sha256=JG_eR13ukZgEahrrmrbg40H8cUzpoUE8QLocihN-fZ8,2414
196
196
  rbx/resources/presets/default/contest/statement/logo.png,sha256=RLNYmZoc-BR6AZKkmr4UEg3h01YeFzvy604jMAQC7aA,414485
@@ -200,7 +200,7 @@ rbx/resources/presets/default/problem/.gitignore,sha256=CMwGD717vKcbQrXjha2D4LMw
200
200
  rbx/resources/presets/default/problem/gens/gen.cpp,sha256=rn6sGRjZ1sFE1Rq02r6488iquY9xTrutcvLv4d1sohA,178
201
201
  rbx/resources/presets/default/problem/manual_tests/samples/000.in,sha256=w66OEtCJGqjUNj8cJrqgImgGVm8W_OlIUtF255ds-ow,4
202
202
  rbx/resources/presets/default/problem/manual_tests/samples/001.in,sha256=P4QInDX87xXoDWu4PVIzUeNW5LtTlUKbMCvJ9uZOPGw,20
203
- rbx/resources/presets/default/problem/problem.rbx.yml,sha256=SX8ohULvaRiFI9kIpLQ0hDEx8r5ozsfraK9PYr4YmQM,1691
203
+ rbx/resources/presets/default/problem/problem.rbx.yml,sha256=jawPzfJJ17pVSiWGRqjSqDm3PTD5kF_KO19eTLFsAC4,1725
204
204
  rbx/resources/presets/default/problem/rbx.h,sha256=LBkbC3gbDPW2Fdm1p99hNhF7oKpZLLSY7dE4zpepp5w,2161
205
205
  rbx/resources/presets/default/problem/sols/main.cpp,sha256=AW-j65DiFYUN18rddTKCWc_VyYCMgCbjZ0jAJ-0JLuA,124
206
206
  rbx/resources/presets/default/problem/sols/wa.cpp,sha256=Bj7tejPIlXG_JqUHWY1zi9TDbHdRZzgT_JDbCLRdhbQ,136
@@ -209,9 +209,9 @@ rbx/resources/presets/default/problem/testplan/random.py,sha256=XclCB6pw9NT1ahu9
209
209
  rbx/resources/presets/default/problem/testplan/random.txt,sha256=XDrow4p79owKnjqyvaIVSNTXwWQDe3X1k_9-2zH43O8,34
210
210
  rbx/resources/presets/default/problem/validator.cpp,sha256=I_Vs12xQnJnwkRtCu4EjazdaERms4GktZhME7zGaQjU,337
211
211
  rbx/resources/presets/default/problem/wcmp.cpp,sha256=gbjJe3Vf9-YzHCEqBUq30aI3jMZXhqBDn3jjecYOn-w,902
212
- rbx/resources/presets/default/shared/contest_template.rbx.tex,sha256=bEbsVybLJ18V7Ez1i5g8H6-5Aru2Bk1qPsDly_c26lw,1301
213
- rbx/resources/presets/default/shared/icpc.sty,sha256=04feEwL7LRRvUFopwVAVjxdTvzE5gQtFsSkm6iJ5hLo,8042
214
- rbx/resources/presets/default/shared/problem_template.rbx.tex,sha256=SfBxSwz1sVBUV5P6JmROXvlIqRfzt7muJwGtZhtCM7E,1427
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
215
215
  rbx/resources/templates/rbx.h,sha256=0AZds9R0PmuPgnlTENb33Y81LW0LlnmOJFaoN8oG3Yo,3638
216
216
  rbx/resources/templates/template.cpp,sha256=xXWpWo7fa7HfmPNqkmHcmv3i46Wm0ZL-gPmkRfGvLn4,317
217
217
  rbx/submitors/__init__.py,sha256=sVcRNnuKMZatmpGkQURaEVHK-MfU2U0nH4nOatuqywE,620
@@ -219,8 +219,8 @@ rbx/submitors/codeforces.py,sha256=s8c7sXfm5k76SKMC8g0Y93-RRf8wY2uWbBtA8ODD5eM,4
219
219
  rbx/submitors/submitor.py,sha256=8q-Hbdahxt30ciT_R9j_xF6lEPUh9IcfAUnzjQjbvHU,457
220
220
  rbx/testing_utils.py,sha256=965vlkQpUW8cEqjB6S2g_C_avL5fn503mJPbqjY_zt4,2317
221
221
  rbx/utils.py,sha256=xDqmry5rpqRGPFrx3ipNGBt2WxWDAD5LwU7jvgibXkk,8630
222
- rbx_cp-0.13.6.dist-info/LICENSE,sha256=QwcOLU5TJoTeUhuIXzhdCEEDDvorGiC6-3YTOl4TecE,11356
223
- rbx_cp-0.13.6.dist-info/METADATA,sha256=YRfhn0e29x1tf9DRjJbTE2kL19oQN3gx7Cz1evofaUg,4659
224
- rbx_cp-0.13.6.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
225
- rbx_cp-0.13.6.dist-info/entry_points.txt,sha256=qBTLBOeifT1F00LWaEewRRE_jQPgvH7BUdJfZ-dYsFU,57
226
- rbx_cp-0.13.6.dist-info/RECORD,,
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,,