diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 000000000..c540d3701 --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,53 @@ +{ + "ignorePatterns": [ + "build/**" + ], + "env": { + "node": true, + "browser": true, + "es2021": true + }, + "extends": [ + "eslint:recommended" + ], + "parserOptions": { + "ecmaFeatures": { + "jsx": true + }, + "ecmaVersion": 12, + "sourceType": "module" + }, + "rules": { + "indent": [ + "error", + 4 + ], + "linebreak-style": [ + "error", + "unix" + ], + "quotes": [ + "error", + "double" + ], + "semi": [ + "error", + "always" + ], + "eol-last": [ + "error", + "always" + ], + "no-case-declarations": "off", + "object-curly-spacing": [ + "error", + "always" + ], + "no-unused-vars": [ + "warn" + ], + "react/prop-types": [ + "off" + ] + } +} \ No newline at end of file diff --git a/.gitattributes b/.gitattributes index cbdcbbc25..ca3f85b65 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1 +1,2 @@ *.js text eol=lf +*.dat text eol=crlf diff --git a/.github/workflows/dokka-gh-pages.yml b/.github/workflows/dokka-gh-pages.yml new file mode 100644 index 000000000..cc80d1411 --- /dev/null +++ b/.github/workflows/dokka-gh-pages.yml @@ -0,0 +1,49 @@ +name: Deploy Dokka with GitHub Pages + +on: + # Runs on pushes targeting the default branch + push: + branches: ["main"] + + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + +# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages +permissions: + contents: read + pages: write + id-token: write + +# Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued. +# However, do NOT cancel in-progress runs as we want to allow these production deployments to complete. +concurrency: + group: "pages" + cancel-in-progress: false + +jobs: + # Build job + build: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v3 + - name: Setup Pages + uses: actions/configure-pages@v3 + - name: Build with Dokka + uses: gradle/gradle-build-action@v2 + with: + arguments: doc -i + - name: Upload artifact + uses: actions/upload-pages-artifact@v2 + + # Deployment job + deploy: + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + runs-on: ubuntu-latest + needs: build + steps: + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v2 diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 000000000..8da7ff77c --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,71 @@ +name: Tests +on: + push: + branches: [main, master] + pull_request: + branches: [main, master] +jobs: + test: + timeout-minutes: 20 + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + + - uses: actions/setup-node@v3 + with: + node-version: '16' + cache: 'npm' + cache-dependency-path: 'src/frontend/package-lock.json' + + - uses: actions/setup-java@master + with: + distribution: adopt + java-version: 11 + + - uses: gradle/gradle-build-action@v2.4.2 + with: + arguments: build release --scan -Pnpm.download=false -i + + - name: Install dependencies + run: npm ci + + - name: Store Playwright's Version + run: | + PLAYWRIGHT_VERSION=$(npm ls @playwright/test | grep @playwright | sed 's/.*@//') + echo "Playwright's Version: $PLAYWRIGHT_VERSION" + echo "PLAYWRIGHT_VERSION=$PLAYWRIGHT_VERSION" >> $GITHUB_ENV + + - name: Cache Playwright Browsers for Playwright's Version + id: cache-playwright-browsers + uses: actions/cache@v3 + with: + path: ~/.cache/ms-playwright + key: playwright-browsers-${{ env.PLAYWRIGHT_VERSION }} + + - name: Setup Playwright + if: steps.cache-playwright-browsers.outputs.cache-hit != 'true' + run: npx playwright install --with-deps + + - name: Run Playwright tests + run: npx playwright test 2>&1 + + - uses: actions/upload-artifact@v3 + if: always() + with: + name: screenshots + path: tests/screenshots/ + retention-days: 3 + + - uses: actions/upload-artifact@v3 + if: always() + with: + name: playwright-report + path: playwright-report/ + retention-days: 3 + + - uses: actions/upload-artifact@v3 + if: always() + with: + name: artifacts + path: artifacts + retention-days: 3 diff --git a/.gitignore b/.gitignore index 73b51c2f0..5f2af5a40 100644 --- a/.gitignore +++ b/.gitignore @@ -355,3 +355,6 @@ gradle-app.setting .idea artifacts +/test-results/ +/playwright-report/ +/playwright/.cache/ diff --git a/.idea/jsonSchemas.xml b/.idea/jsonSchemas.xml new file mode 100644 index 000000000..c1309bfde --- /dev/null +++ b/.idea/jsonSchemas.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/README.md b/README.md index 5b4bbba91..3b8cb231e 100644 --- a/README.md +++ b/README.md @@ -5,47 +5,34 @@ Welcome to the ICPC Live Source Code Repository. # Run release version * Download release from https://github.com/icpc/live-v3/releases -* Create contest config files - * [Example for CLICS](https://github.com/icpc/live-v3/tree/main/config/icpc-rmc/2021) - * [Example for PCMS](https://github.com/icpc/live-v3/tree/main/config/icpc-nef/2021-2022/main) - * [Example for Codeforces](https://github.com/icpc/live-v3/tree/main/config/vkoshp/2022-junior) - * [Example for Yandex.Contest](https://github.com/icpc/live-v3/tree/main/config/_examples/_yandex/) - * [Example for Ejudge](https://github.com/icpc/live-v3/tree/main/config/lscpc/2022/) - * [See full archive for more examples](https://github.com/icpc/live-v3/tree/main/config) - * [How to fine tune imported data](https://github.com/icpc/live-v3/blob/main/advanced.json.md) - * [How to get current state of imported data](http://localhost:8080/api/admin/advancedJsonPreview?fields=all) -* - -Run `java -jar /path/to/jar/file -port=8080 -P:live.configDirectory=/path/to/config/directory -P:live.credsFile=creds.json` - -Possible java invocation options are: -* ```-P:live.configDirectory=config/icpc-nef/2022-2023``` -- path to config directory -* ```-P:live.credsFile=artifacts/creds.json``` -- path to credentials file -* ```-P:auth.disabled=true``` -- do not use credentials in admin interface -* ```-P:live.analyticsTemplatesFile=config/analyticsTemplateRu.json``` -- path to i18n configuration for Analytics and Analytics enable -* ```-P:live.allowUnsecureConnections=true``` -- allow non-https contest system urls -* ```-P:live.widgetPositionsFile=config/widget_positions.json.splitscreen``` -- set non-standard widget positions, for example for split screen or fullscreen leaderboard. - - -* Port 8080 is default, if you are okay with it this option can be omitted - -* Add source to OBS + * You can download [latest dev build](https://github.com/icpc/live-v3/actions/runs/5968512041) instead if you are brave enough +* Create [contest config files](https://github.com/icpc/live-v3/tree/main/docs/settings.md) +* (Optional) [Tune](https://github.com/icpc/live-v3/blob/main/docs/advanced.json.md) imported data, so it looks better +* Run `java -jar /path/to/jar/file -c /path/to/config/directory` + + Check for more options by running `java -jar /path/to/jar/file` without arguments. Here is the couple most useful + * ```--creds creds.json``` -- The path to the credential file. It can be used to avoid storing credentials in the main config file. + * ```--no-auth``` -- Disable auth in admin interface. It's useful if you are running the overlayer on localhost. + * ```-p 8080``` -- 8080 is default port to listen, but it can be changed. + +* (Optional) Check [imported contest data](http://localhost:8080/api/admin/advancedJsonPreview?fields=all) + +* Add a source to OBS * +Source * Browser * URL http://localhost:8080/overlay?noStatus * W H 1920x1080 - * OBS Custom css: - -```css -#root > div { - background: unset; -} -``` - -* Use http://localhost:8080/admin in your browser to control overlay - -Also, check emulation mode part of development doc for testing. - + * OBS Custom css: + ```css + #root > div { + background: unset; + } + ``` + +* Use [admin interface](http://localhost:8080/admin) in your browser to control overlay +* Check general broadcast production [schema](https://docs.google.com/document/d/1JcOhmkvbRtG3MLLYUpzVBMqiQOoNpamOz-MvppCgcYk) for other details of typical setup +* Check [emulation mode](https://github.com/icpc/live-v3/blob/main/docs/emulation.md) part of development doc for testing your setup before the contest started. +* Check [troubleshooting guide](https://github.com/icpc/live-v3/blob/main/docs/troubleshooting.md) is something looks wrong. # Authorisation For now http basic auth is used. If you try to login with @@ -55,141 +42,22 @@ someone with admin rights confirms, it's okay. Consider, if you are okay with passing your passwords using plain HTTP. -If you don't need auth, you can disable it by -P:auth.disabled=true command-line option, -or corresponding property in config file. +If you don't need auth, you can disable it by `--no-auth` command-line option. # Run in development mode -Requirements: - -* gradle -* jdk -* node:16 -* browser - -Before cloning on Windows configure correct crlf handling - -* `git config --global core.autocrlf false` -* `git config --global core.symlinks true` - -## Developing backend - -### To test your changes: - -1. `live-v3\gradlew :backend:run -Plive.dev.contest=nerc-onsite-2020` - * Or run one of configurations from IDEA stored in .run -2. open http://localhost:8080/admin to control overlay -3. open http://localhost:8080/overlay to view result - -### General backend architecture - -Backend is implemented in kotlin as [ktor](https://ktor.io/docs/) server. - -Admin api endpoints are `/api/admin`. They are using REST-like conventions for naming, -and mostly implemented in `org.icpclive.admin` package. All data is stored in json-files in -contest config directory for now. - -Overlay api endpoints are `/api/overlay`. They are websockets with updates, read by -overlay frontend part. Internally, they are implemented -as [flows](https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/-flow/) -from kotlinx.coroutines. - -Admin and overlay can be hosted over `/admin` and `/overlay` paths as SPA using ktor builtin -SPA hosting. - -Contest systems integrations are implemented in `org.icpclive.cds` package. Currently, -CLICS, PCMS, Codeforces and Yandex.Contest, Ejudge and KRSU are supported. Only ICPC mode -is supported at the moment. - -Basically, to add new contest data provider, you need to implement contest information updates -(start time, list of problems, list of teams, etc.) and runs updates (events like new run, run status changes, partial -and final testing). In simple cases, if you reload all data every time, it can be useful to inherit from FullReloadContestDataSource. - -Everything else should work automatically in the same manner for all CDS sources. - -### Emulation mode - -If `elmulation.startTime` property is defined, instead of regular updating, cds provider need to download all runs once, -and -they would be timely pushed further automatically. This is useful to check everything on already happened contest. - -``` -emulation.speed=10 -emulation.startTime=2022-04-03 22:50 -``` - -Emulation only works if contest is finished. - -## Developing frontend - -We have two front end packages: - -* overlay - webapp that is rendered in OBS (located in `overlay`) -* admin - admin app for controlling the overlay (located in `admin`) - -Install dependencies with `npm ci` in the root path of the project -(see package.json for more details) - -### Running frontend separate from backend - -If you are running locally replace `` with `localhost` - -#### overlay - -Overlay takes base url from environment variable `VITE_WEBSOCKET_URL` -A path to backend's path for websocket connection. -Exposed on /api/overlay path - -Run this in `overlay` directory to start the development server: -Linux: - -``` -VITE_WEBSOCKET_URL=ws://:8080/api/overlay npm run start -``` - -Windows: - -``` -set VITE_WEBSOCKET_URL=ws://:8080/api/overlay -npm run start -``` - -#### admin - -Admin panel takes two urls: - -* `VITE_BACKEND_URL` - for updating data and talking to the backend (exposed in /api/admin) -* `VITE_WEBSOCKET_URL` - for real time updates of presets and settings (exposed in /api/admin) - -Run this in `admin` directory to start the development server: -Linux: - -``` -VITE_BACKEND_URL=http://:8080/api/admin;VITE_WEBSOCKET_URL=ws://:8080/api/admin npm run start -``` - -Windows: - -``` -set VITE_BACKEND_URL=http://:8080/api/admin -set VITE_WEBSOCKET_URL=ws://:8080/api/admin -npm run start -``` # Previous versions: * https://github.com/icpc-live * https://github.com/Aksenov239/icpc-live-v2 -Other repos: +# Other repos: -* https://github.com/EgorKulikov/acm_profiles script that collects competitive programming historical data for +* [Script](https://github.com/EgorKulikov/acm_profiles) that collects competitive programming historical data for analytical information -* https://github.com/icpc-live/autoanalyst Autoanalyst -* https://github.com/pashkal/obs-video-scheduler OBS Video Scheduler Plugin with web interface -* https://github.com/pmavrin/obs-overlays/tree/master/overlaymaster OBS plugin for shared memory ( - dll https://drive.google.com/file/d/1MvCmhlSpftUFC3N2gj0Lv88-ZV2dtnhP) - -for more information email Live@icpc.global +* [Autoanalyst](https://github.com/icpc-live/autoanalyst) +* OBS Video Scheduler [Plugin](https://github.com/pashkal/obs-video-scheduler) with web interface +* Outdated OBS [plugin](https://github.com/pmavrin/obs-overlays/tree/master/overlaymaster) for shared memory ([dll](https://drive.google.com/file/d/1MvCmhlSpftUFC3N2gj0Lv88-ZV2dtnhP)) -General broadcast production schema: https://docs.google.com/document/d/1JcOhmkvbRtG3MLLYUpzVBMqiQOoNpamOz-MvppCgcYk +For more information, email `live@icpc.global` \ No newline at end of file diff --git a/build.gradle.kts b/build.gradle.kts index fe238bedf..6afd1bb3b 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,28 +1,62 @@ +import com.github.jengelman.gradle.plugins.shadow.ShadowJavaPlugin +import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar +import org.jetbrains.kotlin.gradle.tasks.KotlinCompile + plugins { // versions are set in dependencies block for build.gradle.kts - java + // apply false brings the plugins into the Gradle script classpath (see import above) alias(libs.plugins.kotlin.jvm) apply false - alias(libs.plugins.kotlin.serialization) apply false + alias(libs.plugins.shadow) apply false } +tasks { + register("doc") { + destinationDir = rootDir.resolve("_site/cds/") -allprojects { - tasks { - withType().all { - sourceCompatibility = "11" - targetCompatibility = "11" - } - withType().all { - kotlinOptions { - jvmTarget = "11" - kotlinOptions.allWarningsAsErrors = true + from(project(":cds").tasks.named("dokkaHtml")) + } + + // If you invoke a gen task, :schema-generator:gen will be invoked. It's defined in :schema-generator project + // since that project is already aware of global location for schema testing purposes. +} + +subprojects { + group = "org.icpclive" + version = rootProject.findProperty("build_version")!! + + plugins.withType { + configure { + toolchain { + languageVersion = JavaLanguageVersion.of(11) } } + + tasks.named("jar") { + archiveClassifier = "just" + } + + tasks.named("test") { + useJUnitPlatform() + } } -} + // Technically, Ktor pulls this too, but reconfigures... + plugins.withType { + tasks.register("release") { + destinationDir = rootDir.resolve("artifacts/") + preserve { include("*") } + from(tasks.named("shadowJar")) + } + tasks.named("shadowJar") { + mergeServiceFiles() -extensions.findByName("buildScan")?.withGroovyBuilder { - setProperty("termsOfServiceUrl", "https://gradle.com/terms-of-service") - setProperty("termsOfServiceAgree", "yes") + archiveClassifier = null + } + } + + tasks.withType().configureEach { + kotlinOptions { + allWarningsAsErrors = true + } + } } \ No newline at end of file diff --git a/config/_2019-test/events.properties b/config/_2019-test/events.properties deleted file mode 100644 index 454dbf483..000000000 --- a/config/_2019-test/events.properties +++ /dev/null @@ -1,13 +0,0 @@ -login=live -password=evMUzdqM - -url=archive/pcms-test/events-new.xml -teams.url=archive/pcms-test/participants.xml -problems.url=archive/pcms-test/problems.xml -problems.number=6 - -standings.type=PCMS - -running.time=18000000 -freeze.time=18000000 -#freeze.time=14400000 diff --git a/config/_2019-test/mainscreen.properties b/config/_2019-test/mainscreen.properties deleted file mode 100644 index 953006f79..000000000 --- a/config/_2019-test/mainscreen.properties +++ /dev/null @@ -1,82 +0,0 @@ -update.wait=500 -backup.persons=persons.txt -backup.advertisements=advertisements.txt -backup.pictures=pictures.txt -breakingnews.time=20000 -breakingnews.runs.number=10 -breakingnews.patterns.filename=patterns.txt -standings.blinking.time=10000 -advertisement.time=50000 -person.time=50000 -latency.time=2000 -data.update=1000 -data.host=localhost -data.port=25675 - -info.types=screen;camera;video -info.screen=https://live:evMUzdqM@192.168.1.207/video/desktop/%s -info.camera=https://live:evMUzdqM@192.168.1.207/video/webcam/%s -info.record=https://live:evMUzdqM@192.168.1.207:9080/video/reaction/%d -#info.screen=pics/screen.png -#info.camera=pics/team.jpg -#info.record=pics/team.jpg -#info.types=photo;screen -info.video=teamVideos/%03d.mp4 -#pics/BigBuckBunny_320x180.mp4 -#pics/team.jpg -#info.screen=pics/BigBuckBunny_320x180.mp4 -#pics/screen.png - -sleep.time=10000 -automated.show.time=20000 -automated.info=screen -team.double.video=false - -ticker.rotate.time=10000 -ticker.logo=#Clock#;#ICPC2018 -ticker.logo.time=5000 -ticker.clock.time=20000 -ticker.logo.change.time=1000 - -queue.show.verdict=true - -overlayed.delay=3000 - -width=1280 -height=720 -#width=1920 -#height=1080 - -rate=25 - -top.teams=S101,S105 -onsite.teams=S.* - -stylesheet=stylesheets/wf.jss - -polls.backup.file=polls.txt -poll.show.time=20000 -poll.top.teams=5 -poll.hashtag=#ICPC2019Vote - -twitch.chat.server=irc.chat.twitch.tv -twitch.chat.username=aksenov239 -twitch.chat.password=oauth:8yb7ygy3ey2wdwmlkvd7bs2o8guwf3 -twitch.chat.channel=#aksenov239;#icpclive1;#icpclive_ru - -twitter.hashtag=#ICPC2019 - -word.statistics.backup.file=words-statistics.txt -word.statistics.words=tweets;goose;energy -word.statistics.tweets.text=$tweets$ -word.statistics.tweets.picture= -word.statistics.goose.text=(*)> -word.statistics.goose.picture=pics/goose.jpg -word.statistics.energy.text=-- ? Ѝ_Ѝ -? -word.statistics.energy.picture=pics/energy.jpg -word.statistics.word.show.time=10000 - -backup.pictures=pictures.txt - -output.mode=window -#outputFile=d:/work/image.bin diff --git a/config/_2019-test/splitscreen.properties b/config/_2019-test/splitscreen.properties deleted file mode 100644 index f9ffcef2d..000000000 --- a/config/_2019-test/splitscreen.properties +++ /dev/null @@ -1,17 +0,0 @@ -sleep.time=20000 -update.wait=1000 - -switch.time=20000 -relevance.time=600000 -top.places=20 -replay.time=20000 -#choose at least 9 teams -setup=1,2,3,4 - -width=1920 -height=1080 -rate=25 - -main.hashtag=#ICPC2019 -account.wait.time=60000 -votes.to.show=3 \ No newline at end of file diff --git a/config/__sample/events.properties b/config/__sample/events.properties deleted file mode 100644 index 05df745f1..000000000 --- a/config/__sample/events.properties +++ /dev/null @@ -1,18 +0,0 @@ -login=live -password=live7218 - -url=archive/2018-test -#problems.url=archive/2016/problem.json -#teams.url=archive/2016/teams.json - -emulation.startTime=180 -emulation.speed=10 - -#url=https://192.168.1.207:9443/events -#problems.url=https://192.168.1.207:9443/contest/problem -#teams.url=https://192.168.1.207:9443/contest/team - -problemsNumber=13 -standings.type=WF - -#regions.mapping={"11738":"North America", "11735":"Europe", "11744":"Latin America", "11737":"Africa and the Middle East", "11743":"South Pacific", "11742":"Asia"} \ No newline at end of file diff --git a/config/__sample/mainscreen.properties b/config/__sample/mainscreen.properties deleted file mode 100644 index 315e85e99..000000000 --- a/config/__sample/mainscreen.properties +++ /dev/null @@ -1,75 +0,0 @@ -width=1920 -height=1080 -rate=25 -output.file=c:/work/image.bin -output.mode=file -#output.mode=window - -update.wait=500 -backup.persons=persons.txt -backup.advertisements=advertisements.txt -breakingnews.time=20000 -breakingnews.runs.number=10 -breakingnews.patterns.filename=patterns.txt -standings.blinking.time=10000 -advertisement.time=50000 -person.time=50000 -latency.time=2000 -data.update=1000 -data.host=localhost -data.port=25675 - -info.types=screen;camera;video -info.screen=http://192.168.1.207:9080/video/screen/%d -info.camera=http://192.168.1.207:9080/video/camera/%d -info.record=http://192.168.1.207:9080/video/reaction/%d -#info.screen=pics/screen.png -#info.camera=pics/team.jpg -#info.record=pics/team.jpg -#info.types=photo;screen -info.video=teamVideos/%03d.mp4 -#pics/BigBuckBunny_320x180.mp4 -#pics/team.jpg -#info.screen=pics/BigBuckBunny_320x180.mp4 -#pics/screen.png - -sleep.time=10000 -automated.show.time=20000 -automated.info=screen -team.double.video=false - -ticker.rotate.time=10000 -ticker.logo=#Clock#;#ICPC2017 -ticker.logo.time=5000 -ticker.clock.time=20000 -ticker.logo.change.time=1000 - -queue.show.verdict=true - -overlayed.delay=3000 - -top.teams=76,53 -onsite.teams=.* - -stylesheet=stylesheets/wf.jss - -polls.backup.file=polls.txt -poll.show.time=20000 -poll.top.teams=5 - -twitch.chat.server=irc.chat.twitch.tv -twitch.chat.username=aksenov239 -twitch.chat.password=oauth:8yb7ygy3ey2wdwmlkvd7bs2o8guwf3 -twitch.chat.channel=#aksenov239;#icpclive1;#icpclive_ru - -twitter.hashtag=#ICPC2017 - -word.statistics.backup.file=words-statistics.txt -word.statistics.words=tweets;goose;energy -word.statistics.tweets.text=$tweets$ -word.statistics.tweets.picture= -word.statistics.goose.text=(*)> -word.statistics.goose.picture=pics/goose.jpg -word.statistics.energy.text=ί-- ??φ Π?Ž_Π?Ž ί-ι??φ -word.statistics.energy.picture=pics/energy.jpg -word.statistics.word.show.time=10000 diff --git a/config/__sample/splitscreen.properties b/config/__sample/splitscreen.properties deleted file mode 100644 index 43537c6a5..000000000 --- a/config/__sample/splitscreen.properties +++ /dev/null @@ -1,17 +0,0 @@ -sleep.time=3000 -update.wait=1000 - -switch.time=20000 -relevance.time=60000 -top.places=12 -replay.time=20000 -#choose at least 9 teams -setup=1,2,3,4,5,6,7,8,9 - -width=1280 -height=720 -rate=25 - -main.hashtag=#ICPC2018 -votes.to.show=5 - diff --git a/config/fed/2023-voronezh/events.properties b/config/__tests/ejudge_icpc_unfreeze/2023-voronezh/events.properties similarity index 100% rename from config/fed/2023-voronezh/events.properties rename to config/__tests/ejudge_icpc_unfreeze/2023-voronezh/events.properties diff --git a/config/regionalroi/lpk-2021-d1/events.properties b/config/__tests/ejudge_ioi/regionalroi-lpk-2021-d1/events.properties similarity index 75% rename from config/regionalroi/lpk-2021-d1/events.properties rename to config/__tests/ejudge_ioi/regionalroi-lpk-2021-d1/events.properties index 2958fe36c..028faa7d0 100644 --- a/config/regionalroi/lpk-2021-d1/events.properties +++ b/config/__tests/ejudge_ioi/regionalroi-lpk-2021-d1/events.properties @@ -1,3 +1,3 @@ standings.type=EJUDGE -standings.resultType=IOI +standings.resultType=ioi url=https://ejudge.strategy48.ru/regional-2021-d1.xml \ No newline at end of file diff --git a/config/__tests/ejudge_ioi_virtual/mosh-2023-keldysh/advanced.json b/config/__tests/ejudge_ioi_virtual/mosh-2023-keldysh/advanced.json new file mode 100644 index 000000000..fdf1747e6 --- /dev/null +++ b/config/__tests/ejudge_ioi_virtual/mosh-2023-keldysh/advanced.json @@ -0,0 +1,924 @@ +{ + "teamOverrides": { + "143769": { + "shortname": "Абраров Нияз, 7, Уфа" + }, + "143770": { + "shortname": "Алахвердиева Камилла, 7, Лен. область" + }, + "143771": { + "shortname": "Александров Даниил, 7, Якутск" + }, + "143772": { + "shortname": "Александров Николай, 8, Якутск" + }, + "143773": { + "shortname": "Аллаяров Аскар, 7, Уфа" + }, + "143774": { + "shortname": "Ангелов Артур, 8, Лен. область" + }, + "143775": { + "shortname": "Антонов Александр, 7, Якутск" + }, + "143776": { + "shortname": "Анчуков Дмитрий, 7, Вологда" + }, + "143777": { + "shortname": "Арапов Рамир, 8, Уфа" + }, + "143778": { + "shortname": "Артемьев Егор, 8, Якутск" + }, + "143779": { + "shortname": "Арутюнов Давид, 5, Владикавказ" + }, + "143780": { + "shortname": "Архипова Арина, 7, Саранск" + }, + "143781": { + "shortname": "Атаев Артур, 7, Ухта" + }, + "143782": { + "shortname": "Атаев Семён, 8, Владикавказ" + }, + "143783": { + "shortname": "Афанасьева Мария, 8, Вологда" + }, + "143784": { + "shortname": "Афонин Евгений, 7, Вологда" + }, + "143785": { + "shortname": "Бабич Кирилл, 8, Вологда" + }, + "143786": { + "shortname": "Бабушкин Дмитрий, 8, Пермь" + }, + "143787": { + "shortname": "Баранцев Михаил, 8, Ульяновск" + }, + "143788": { + "shortname": "Батырев Иван, 8, Ульяновск" + }, + "143789": { + "shortname": "Батяева Ангелина, 8, Владикавказ" + }, + "143790": { + "shortname": "Бахарев Кирилл, 7, Вологда" + }, + "143791": { + "shortname": "Бацарова Елизавета, 6, Ульяновск" + }, + "143792": { + "shortname": "Безклубный Никита, 8, Лен. область" + }, + "143793": { + "shortname": "Безрукова Анастасия, 8, Вологда" + }, + "143794": { + "shortname": "Бектеев Михаил, 8, Ульяновск" + }, + "143795": { + "shortname": "Белозеров Артём, 8, Вологда" + }, + "143796": { + "shortname": "Березин Александр, 8, Вологда" + }, + "143797": { + "shortname": "Бечканов Ренат, 8, Нальчик" + }, + "143798": { + "shortname": "Богданов Егор, 8, Уфа" + }, + "143799": { + "shortname": "Бочкарева Ольга, 8, Вологда" + }, + "143800": { + "shortname": "Брага Арсений, 8, Омск" + }, + "143801": { + "shortname": "Бугрин Эмир, 7, Владикавказ" + }, + "143802": { + "shortname": "Ваничев Илья, 7, Лен. область" + }, + "143803": { + "shortname": "Васенин Матвей, 7, Лен. область" + }, + "143804": { + "shortname": "Васильев Богдан, 8, Вологда" + }, + "143805": { + "shortname": "Верин Иван, 8, Мос. область" + }, + "143806": { + "shortname": "Винокурова Светлана, 8, Якутск" + }, + "143807": { + "shortname": "Власов Артём, 7, Вологда" + }, + "143808": { + "shortname": "Воробьева Яна, 8, Лен. область" + }, + "143809": { + "shortname": "Воробьева Яна, 8, Лен. область" + }, + "143810": { + "shortname": "Гагарин Ярослав, 7, Якутск" + }, + "143811": { + "shortname": "Газюмова Милана, 8, Владикавказ" + }, + "143812": { + "shortname": "Газюмова Яна, 8, Владикавказ" + }, + "143813": { + "shortname": "Галеев Арсен, 7, Уфа" + }, + "143814": { + "shortname": "Герасимович Валерий, 8, Вологда" + }, + "143815": { + "shortname": "Гиниятов Динислам, 6, Уфа" + }, + "143816": { + "shortname": "Глисанов Александр, 8, Псков" + }, + "143817": { + "shortname": "Глущенко Александр, 7, Лен. область" + }, + "143818": { + "shortname": "Головина Анна, 7, Ульяновск" + }, + "143819": { + "shortname": "Горшков Кирилл, 7, Ульяновск" + }, + "143820": { + "shortname": "Громова Дарья, 8, Вологда" + }, + "143821": { + "shortname": "Грошев Олег, 8, Уфа" + }, + "143822": { + "shortname": "Гусев Арсений, 7, Вологда" + }, + "143823": { + "shortname": "Гуськова Диана, 5, Ульяновск" + }, + "143824": { + "shortname": "Давлетбаков Артур, 6, Уфа" + }, + "143825": { + "shortname": "Давлетханов Шамиль, 8, Уфа" + }, + "143826": { + "shortname": "Данилов Михаил, 8, Ульяновск" + }, + "143827": { + "shortname": "Дементьев Максим, 6, Ульяновск" + }, + "143828": { + "shortname": "Дергачев Василий, 7, Лен. область" + }, + "143829": { + "shortname": "Дзиов Марат, 8, Владикавказ" + }, + "143830": { + "shortname": "Домрачева Дарья, 8, Пермь" + }, + "143831": { + "shortname": "Доронин Денис, 7, Ульяновск" + }, + "143832": { + "shortname": "Доронин Илья, 5, Ульяновск" + }, + "143833": { + "shortname": "Доткулов Инал, 8, Нальчик" + }, + "143834": { + "shortname": "Душанбаев Ильдар, 7, Уфа" + }, + "143835": { + "shortname": "Еланский Максим, 8, Владикавказ" + }, + "143836": { + "shortname": "Елизаров Василий, 6, Якутск" + }, + "143837": { + "shortname": "Еловикова Татьяна, 7, Лен. область" + }, + "143838": { + "shortname": "Елфимов Илья, 8, Лен. область" + }, + "143839": { + "shortname": "Ефремов Арсений, 7, Лен. область" + }, + "143840": { + "shortname": "Зацепилина Елизавета, 7, Вологда" + }, + "143841": { + "shortname": "Зацепина Анастасия, 7, Липецк" + }, + "143842": { + "shortname": "Зубаиров Искандер, 6, Уфа" + }, + "143843": { + "shortname": "Иванов Александр, 8, Лен. область" + }, + "143844": { + "shortname": "Иванов Саян, 7, Якутск" + }, + "143845": { + "shortname": "Имангулов Самир, 7, Ульяновск" + }, + "143846": { + "shortname": "Исаев Александр, 8, Ульяновск" + }, + "143847": { + "shortname": "Калачев Павел, 8, Вологда" + }, + "143848": { + "shortname": "Калов Самир, 7, Нальчик" + }, + "143849": { + "shortname": "Калугин Александр, 8, Пермь" + }, + "143850": { + "shortname": "Кальянов Алексей, 8, Псков" + }, + "143851": { + "shortname": "Камалдинов Айрат, 6, Ульяновск" + }, + "143852": { + "shortname": "Камалов Айдар, 7, Уфа" + }, + "143853": { + "shortname": "Камболов Дзамболат, 7, Владикавказ" + }, + "143854": { + "shortname": "Карташов Григорий, 8, Вологда" + }, + "143855": { + "shortname": "Киляров Асланбек, 7, Нальчик" + }, + "143856": { + "shortname": "Ким Яна, 8, Улан-Удэ" + }, + "143857": { + "shortname": "Кирносов Константин, 7, Лен. область" + }, + "143858": { + "shortname": "Киселев Андрей, 8, Лен. область" + }, + "143859": { + "shortname": "Китаев Андрей, 5, Ульяновск" + }, + "143860": { + "shortname": "Колосов Владислав, 8, Лен. область" + }, + "143861": { + "shortname": "Колосов Владислав, 8, Лен. область" + }, + "143862": { + "shortname": "Кольцов Богдан, 8, Лен. область" + }, + "143863": { + "shortname": "Кондрашин Максим, 7, Липецк" + }, + "143864": { + "shortname": "Кондуков Никита, 8, Вологда" + }, + "143865": { + "shortname": "Корякин Виктор, 8, Якутск" + }, + "143866": { + "shortname": "Костин Александр, 6, Ульяновск" + }, + "143867": { + "shortname": "Коцоев Руслан, 8, Владикавказ" + }, + "143868": { + "shortname": "Крышень Владимир, 7, Лен. область" + }, + "143869": { + "shortname": "Куваев Кирилл, 7, Вологда" + }, + "143870": { + "shortname": "Куварин Илья, 7, Ульяновск" + }, + "143871": { + "shortname": "Кузнецов Александр, 8, Саранск" + }, + "143872": { + "shortname": "Кузнецов Вадим, 8, Вологда (Единство)" + }, + "143873": { + "shortname": "Кузнецов Иван, 7, Лен. область" + }, + "143874": { + "shortname": "Кулагин Богдан, 7, Ульяновск" + }, + "143875": { + "shortname": "Курзин Игорь, 6, Ульяновск" + }, + "143876": { + "shortname": "Лавриненко Егор, 8, Якутск" + }, + "143877": { + "shortname": "Лазуткин Дмитрий, 10, Мос. область" + }, + "143878": { + "shortname": "Логинов Кирилл, 7, Саранск" + }, + "143879": { + "shortname": "Майоров Артур, 8, Ухта" + }, + "143880": { + "shortname": "Малышев Никита, 8, Вологда" + }, + "143881": { + "shortname": "Малышева Полина, 8, Омск" + }, + "143882": { + "shortname": "Малькова Софья, 8, Саранск" + }, + "143883": { + "shortname": "Мамсуров Абисал, 7, Владикавказ" + }, + "143884": { + "shortname": "Марченко Максим, 7, Владикавказ" + }, + "143885": { + "shortname": "Матвеенков Игорь, 8, Лен. область" + }, + "143886": { + "shortname": "Меньщиков Егор, 5, Псков" + }, + "143887": { + "shortname": "Митусов Богдан, 7, Лен. область" + }, + "143888": { + "shortname": "Молчанов Матвей, 8, Лен. область" + }, + "143889": { + "shortname": "Монахов Никита, 8, Вологда (Единство)" + }, + "143890": { + "shortname": "Надыкто Илья, 7, Омск" + }, + "143891": { + "shortname": "Назаров Михаил, 8, Лен. область" + }, + "143892": { + "shortname": "Неграшев Денис, 7, Якутск" + }, + "143893": { + "shortname": "Никишин Иван, 6, Пермь" + }, + "143894": { + "shortname": "Николаев Артём, 7, Вологда" + }, + "143895": { + "shortname": "Новиков Михаил, 8, Лен. область" + }, + "143896": { + "shortname": "Ноговицын Дьулустаан, 8, Якутск" + }, + "143897": { + "shortname": "Няшин Алексей, 6, Пермь" + }, + "143898": { + "shortname": "Овчинников Дмитрий, 8, Вологда (Единство)" + }, + "143899": { + "shortname": "Окулов Дмитрий, 8, Вологда" + }, + "143900": { + "shortname": "Окулов Дмитрий, 8, Вологда (Единство)" + }, + "143901": { + "shortname": "Олейников Егор, 6, Вологда" + }, + "143902": { + "shortname": "Осокин Никита, 7, Пермь" + }, + "143903": { + "shortname": "Павлов Арсений, 6, Ульяновск" + }, + "143904": { + "shortname": "Панюгин Дмитрий, 8, Саранск" + }, + "143905": { + "shortname": "Парпиева Ольга, 6, Вологда" + }, + "143906": { + "shortname": "Паршин Павел, 6, Ульяновск" + }, + "143907": { + "shortname": "Пахомова Ольга, 5, Ульяновск" + }, + "143908": { + "shortname": "Песцов Захар, 8, Саранск" + }, + "143909": { + "shortname": "Петров Артем, 8, Якутск" + }, + "143910": { + "shortname": "Петров Матвей, 8, Лен. область" + }, + "143911": { + "shortname": "Петрова Елизавета, 8, Ухта" + }, + "143912": { + "shortname": "Петухова Анастасия, 8, Лен. область" + }, + "143913": { + "shortname": "Пилипенко Леонид, 8, Вологда" + }, + "143914": { + "shortname": "Платонов Алексей, 7, Лен. область" + }, + "143915": { + "shortname": "Покатилов Фёдор, 8, Лен. область" + }, + "143916": { + "shortname": "Полторабатько Роман, 7, Лен. область" + }, + "143917": { + "shortname": "Попов Максим, 8, Пермь" + }, + "143918": { + "shortname": "Потапов Кирилл, 6, Якутск" + }, + "143919": { + "shortname": "Прокопенко Герман, 7, Лен. область" + }, + "143920": { + "shortname": "Прокопьев Гаврил, 8, Якутск" + }, + "143921": { + "shortname": "Пулова Христина, 8, Саранск" + }, + "143922": { + "shortname": "Романов Даниил, 5, Омск" + }, + "143923": { + "shortname": "Руднев Костя, 8, Владикавказ" + }, + "143924": { + "shortname": "Румянцев Андрей, 8, Вологда" + }, + "143925": { + "shortname": "Рымарь Екатерина, 7, Омск" + }, + "143926": { + "shortname": "Рябов Михаил, 7, Ульяновск" + }, + "143927": { + "shortname": "Сабанов Виктор, 8, Владикавказ" + }, + "143928": { + "shortname": "Сабанова Лана, 7, Владикавказ" + }, + "143929": { + "shortname": "Сабанчиев Магомед, 7, Нальчик" + }, + "143930": { + "shortname": "Сабеев Ацамаз, 8, Владикавказ" + }, + "143931": { + "shortname": "Самигулин Андрей, 8, Ульяновск" + }, + "143932": { + "shortname": "Сауткин Алексей, 8, Пермь" + }, + "143933": { + "shortname": "Семëнов Матвей, 7, Ульяновск" + }, + "143934": { + "shortname": "Сергеев Мирослав, 8, Мос. область" + }, + "143935": { + "shortname": "Симендеев Константин, 8, Ульяновск" + }, + "143936": { + "shortname": "Скутин Александр, 8, Ухта" + }, + "143937": { + "shortname": "Смирнов Егор, 8, Вологда" + }, + "143938": { + "shortname": "Сорокин Юрий, 8, Ульяновск" + }, + "143939": { + "shortname": "Старостин Матвей, 8, Вологда" + }, + "143940": { + "shortname": "Степанов Аюр, 6, Улан-Удэ" + }, + "143941": { + "shortname": "Степанов Дмитрий, 7, Ульяновск" + }, + "143942": { + "shortname": "Султангулов Батыр, 8, Уфа" + }, + "143943": { + "shortname": "Супрун Иван, 6, Псков" + }, + "143944": { + "shortname": "Сыченов Артём, 7, Вологда" + }, + "143945": { + "shortname": "Тагиров Керим, 7, Владикавказ" + }, + "143946": { + "shortname": "Тансыккужин Линар, 8, Уфа" + }, + "143947": { + "shortname": "Темираев Сергей, 7, Владикавказ" + }, + "143948": { + "shortname": "Темиров Георгий, 7, Владикавказ" + }, + "143949": { + "shortname": "Типикин Артур, 5, Ульяновск" + }, + "143950": { + "shortname": "Тихонова Кира, 5, Ульяновск" + }, + "143951": { + "shortname": "Тишков Инал, 8, Нальчик" + }, + "143952": { + "shortname": "Токарь Артём, 8, Ульяновск" + }, + "143953": { + "shortname": "Туснин Александр, 6, Ульяновск" + }, + "143954": { + "shortname": "Удовиченко Владимир, 8, Лен. область" + }, + "143955": { + "shortname": "Федоренко София, 7, Нальчик" + }, + "143956": { + "shortname": "Федотов Егор, 7, Ульяновск" + }, + "143957": { + "shortname": "Фролов Прохор, 8, Ульяновск" + }, + "143958": { + "shortname": "Хайдаров Максим, 6, Ульяновск" + }, + "143959": { + "shortname": "Халикшина Алина, 7, Пермь" + }, + "143960": { + "shortname": "Халикшина Ульяна, 7, Пермь" + }, + "143961": { + "shortname": "Хандрыкин Артур, 8, Лен. область" + }, + "143962": { + "shortname": "Харламов Максим, 8, Вологда" + }, + "143963": { + "shortname": "Хрусталёв Егор, 6, Ульяновск" + }, + "143964": { + "shortname": "Царев Андрей, 8, Вологда" + }, + "143965": { + "shortname": "Цориева Ева, 8, Владикавказ" + }, + "143966": { + "shortname": "Чавкин Илья, 6, Ульяновск" + }, + "143967": { + "shortname": "Чашинова Алёна, 8, Вологда" + }, + "143968": { + "shortname": "Чепелин Дмитрий, 7, Лен. область" + }, + "143969": { + "shortname": "Черепанова Алина, 8, Вологда" + }, + "143970": { + "shortname": "Четвертной Илья, 7, Псков" + }, + "143971": { + "shortname": "Чиранов Александр, 8, Саранск" + }, + "143972": { + "shortname": "Шайбеков Артем, 8, Ухта" + }, + "143973": { + "shortname": "Шевченко Дарья, 8, Вологда" + }, + "143974": { + "shortname": "Шейкин Дмитрий, 7, Ульяновск" + }, + "143975": { + "shortname": "Шестакова Мария, 8, Вологда" + }, + "143976": { + "shortname": "Шилов Дмитрий, 7, Мос. область" + }, + "143977": { + "shortname": "Шириков Дмитрий, 8, Вологда" + }, + "143978": { + "shortname": "Шириков Дмитрий, 8, Вологда" + }, + "143979": { + "shortname": "Ширыханов Роман, 6, Пермь" + }, + "143980": { + "shortname": "Ширяев Иван, 7, Вологда" + }, + "143981": { + "shortname": "Шурыгина Мария, 8, Ульяновск" + }, + "143982": { + "shortname": "Юмшанов Эрчим, 8, Якутск" + }, + "143983": { + "shortname": "Явтушенко Максим, 5, Ульяновск" + }, + "143984": { + "shortname": "Якуничева Мария, 8, Вологда" + }, + "143985": { + "shortname": "Боброва Арина, 6, Ульяновск" + }, + "143986": { + "shortname": "mosolymp-2023-1218" + }, + "143987": { + "shortname": "mosolymp-2023-1219" + }, + "143988": { + "shortname": "mosolymp-2023-1220" + }, + "143989": { + "shortname": "mosolymp-2023-1221" + }, + "143990": { + "shortname": "mosolymp-2023-1222" + }, + "143991": { + "shortname": "mosolymp-2023-1223" + }, + "143992": { + "shortname": "mosolymp-2023-1224" + }, + "143993": { + "shortname": "mosolymp-2023-1225" + }, + "143994": { + "shortname": "mosolymp-2023-1226" + }, + "143995": { + "shortname": "mosolymp-2023-1227" + }, + "143996": { + "shortname": "mosolymp-2023-1228" + }, + "143997": { + "shortname": "mosolymp-2023-1229" + }, + "143998": { + "shortname": "mosolymp-2023-1230" + }, + "143999": { + "shortname": "mosolymp-2023-1231" + }, + "144000": { + "shortname": "mosolymp-2023-1232" + }, + "144001": { + "shortname": "mosolymp-2023-1233" + }, + "144002": { + "shortname": "mosolymp-2023-1234" + }, + "144003": { + "shortname": "mosolymp-2023-1235" + }, + "144004": { + "shortname": "mosolymp-2023-1236" + }, + "144005": { + "shortname": "mosolymp-2023-1237" + }, + "144006": { + "shortname": "mosolymp-2023-1238" + }, + "144007": { + "shortname": "mosolymp-2023-1239" + }, + "144008": { + "shortname": "mosolymp-2023-1240" + }, + "144009": { + "shortname": "mosolymp-2023-1241" + }, + "144010": { + "shortname": "mosolymp-2023-1242" + }, + "144011": { + "shortname": "mosolymp-2023-1243" + }, + "144012": { + "shortname": "mosolymp-2023-1244" + }, + "144013": { + "shortname": "mosolymp-2023-1245" + }, + "144014": { + "shortname": "mosolymp-2023-1246" + }, + "144015": { + "shortname": "mosolymp-2023-1247" + }, + "144016": { + "shortname": "mosolymp-2023-1248" + }, + "144017": { + "shortname": "mosolymp-2023-1249" + }, + "144018": { + "shortname": "mosolymp-2023-1250" + }, + "144019": { + "shortname": "mosolymp-2023-1251" + }, + "144020": { + "shortname": "mosolymp-2023-1252" + }, + "144021": { + "shortname": "mosolymp-2023-1253" + }, + "144022": { + "shortname": "mosolymp-2023-1254" + }, + "144023": { + "shortname": "mosolymp-2023-1255" + }, + "144024": { + "shortname": "mosolymp-2023-1256" + }, + "144025": { + "shortname": "mosolymp-2023-1257" + }, + "144026": { + "shortname": "mosolymp-2023-1258" + }, + "144027": { + "shortname": "mosolymp-2023-1259" + }, + "144028": { + "shortname": "mosolymp-2023-1260" + }, + "144029": { + "shortname": "mosolymp-2023-1261" + }, + "144030": { + "shortname": "mosolymp-2023-1262" + }, + "144031": { + "shortname": "mosolymp-2023-1263" + }, + "144032": { + "shortname": "mosolymp-2023-1264" + }, + "144033": { + "shortname": "mosolymp-2023-1265" + }, + "144034": { + "shortname": "mosolymp-2023-1266" + }, + "144035": { + "shortname": "mosolymp-2023-1267" + }, + "144036": { + "shortname": "mosolymp-2023-1268" + }, + "144037": { + "shortname": "mosolymp-2023-1269" + }, + "144038": { + "shortname": "mosolymp-2023-1270" + }, + "144039": { + "shortname": "mosolymp-2023-1271" + }, + "144040": { + "shortname": "mosolymp-2023-1272" + }, + "144041": { + "shortname": "mosolymp-2023-1273" + }, + "144042": { + "shortname": "mosolymp-2023-1274" + }, + "144043": { + "shortname": "mosolymp-2023-1275" + }, + "144044": { + "shortname": "mosolymp-2023-1276" + }, + "144045": { + "shortname": "mosolymp-2023-1277" + }, + "144046": { + "shortname": "mosolymp-2023-1278" + }, + "144047": { + "shortname": "mosolymp-2023-1279" + }, + "144048": { + "shortname": "mosolymp-2023-1280" + }, + "144049": { + "shortname": "mosolymp-2023-1281" + }, + "144050": { + "shortname": "mosolymp-2023-1282" + }, + "144051": { + "shortname": "mosolymp-2023-1283" + }, + "144052": { + "shortname": "mosolymp-2023-1284" + }, + "144053": { + "shortname": "mosolymp-2023-1285" + }, + "144054": { + "shortname": "mosolymp-2023-1286" + }, + "144055": { + "shortname": "mosolymp-2023-1287" + }, + "144056": { + "shortname": "mosolymp-2023-1288" + }, + "144057": { + "shortname": "mosolymp-2023-1289" + }, + "144058": { + "shortname": "mosolymp-2023-1290" + }, + "144059": { + "shortname": "mosolymp-2023-1291" + }, + "144060": { + "shortname": "mosolymp-2023-1292" + }, + "144061": { + "shortname": "mosolymp-2023-1293" + }, + "144062": { + "shortname": "mosolymp-2023-1294" + }, + "144063": { + "shortname": "mosolymp-2023-1295" + }, + "144064": { + "shortname": "mosolymp-2023-1296" + }, + "144065": { + "shortname": "mosolymp-2023-1297" + }, + "144066": { + "shortname": "mosolymp-2023-1298" + }, + "144067": { + "shortname": "mosolymp-2023-1299" + }, + "144068": { + "shortname": "mosolymp-2023-1300" + } + }, + "problemOverrides": { + "A": { + "color": "#e6194b" + }, + "B": { + "color": "#3cb44b" + }, + "C": { + "color": "#ffe119" + }, + "D": { + "color": "#4363d8" + }, + "E": { + "color": "#f58231" + }, + "F": { + "color": "#42d4f4" + } + } +} \ No newline at end of file diff --git a/config/mosh/2023/keldysh/events.properties b/config/__tests/ejudge_ioi_virtual/mosh-2023-keldysh/events.properties similarity index 88% rename from config/mosh/2023/keldysh/events.properties rename to config/__tests/ejudge_ioi_virtual/mosh-2023-keldysh/events.properties index 91e72d8a1..184827209 100644 --- a/config/mosh/2023/keldysh/events.properties +++ b/config/__tests/ejudge_ioi_virtual/mosh-2023-keldysh/events.properties @@ -1,5 +1,5 @@ standings.type=EJUDGE -standings.resultType=IOI +standings.resultType=ioi turl2=https://olympiads.ru/aBXA2lMYmx3hNaZW/external.xml turl3=https://olympiads.ru/LW96bHqAIXmwH1cD/external.xml url=https://olympiads.ru/GDUvPbXKZ6lXalSG/external.xml \ No newline at end of file diff --git a/config/icpc-nef/2022-2023/events.properties b/config/__tests/pcms_icpc_freeze/icpc-nef-2022-2023/events.properties similarity index 72% rename from config/icpc-nef/2022-2023/events.properties rename to config/__tests/pcms_icpc_freeze/icpc-nef-2022-2023/events.properties index 0439a706e..233a507fe 100644 --- a/config/icpc-nef/2022-2023/events.properties +++ b/config/__tests/pcms_icpc_freeze/icpc-nef-2022-2023/events.properties @@ -1,2 +1,2 @@ url=https://nerc.itmo.ru/archive/2022/standings.xml -standings.type=PCMS +standings.type=PCMS \ No newline at end of file diff --git a/config/__tests/pcms_icpc_overrides/icpc-nef-2021-2022/advanced.json b/config/__tests/pcms_icpc_overrides/icpc-nef-2021-2022/advanced.json new file mode 100644 index 000000000..b4ce42e7b --- /dev/null +++ b/config/__tests/pcms_icpc_overrides/icpc-nef-2021-2022/advanced.json @@ -0,0 +1,856 @@ +{ + "problemOverrides": { + "A":{"color":"#e6194B"}, + "B":{"color":"#3cb44b"}, + "C":{"color":"#ffe119"}, + "D":{"color":"#4363d8"}, + "E":{"color":"#f58231"}, + "F":{"color":"#42d4f4"}, + "G":{"color":"#f032e6"}, + "H":{"color":"#fabed4"}, + "I":{"color":"#469990"}, + "J":{"color":"#dcbeff"}, + "K":{"color":"#9A6324"}, + "L":{"color":"#fffac8"} + }, + "scoreboardOverrides": { + "medals": [ + { + "name": "gold", + "count": 4 + }, + { + "name": "silver", + "count": 4 + }, + { + "name": "bronze", + "count": 4 + } + ] + }, + "teamOverrides": { + "642163": { + "shortname": "Novosibirsk SU: Winnie the Pooh" + }, + "661436": { + "shortname": "Tomsk PU: 1" + }, + "661437": { + "shortname": "SibSUTI: 1 Neutral" + }, + "661438": { + "shortname": "OmSU: 3" + }, + "661439": { + "shortname": "Novosibirsk SU: Ia-Ia" + }, + "661440": { + "shortname": "Altai STU: 2" + }, + "661441": { + "shortname": "SibSUTI: 2 Fullstack_Pascal+HTML" + }, + "661442": { + "shortname": "NSTU: 5" + }, + "661443": { + "shortname": "Altai STU: 1" + }, + "661444": { + "shortname": "Novosibirsk SU: Piglet" + }, + "661445": { + "shortname": "Novosibirsk SU: Wrong Bees" + }, + "661446": { + "shortname": "Novosibirsk SU: Honey Pot" + }, + "661447": { + "shortname": "SibSUTI: 10" + }, + "661448": { + "shortname": "SibSUTI: 9 Brawl Stars" + }, + "661449": { + "shortname": "SibSUTI: 8 Experiment 626" + }, + "661450": { + "shortname": "SSTU: 3" + }, + "661451": { + "shortname": "NSTU: 1" + }, + "661452": { + "shortname": "NSTU: 2" + }, + "661453": { + "shortname": "OmSU: 1" + }, + "661454": { + "shortname": "OmSU: 2" + }, + "661455": { + "shortname": "NSTU: 4" + }, + "661456": { + "shortname": "Tomsk PU: 2" + }, + "661457": { + "shortname": "Tomsk PU: 3" + }, + "661458": { + "shortname": "SSTU: 2" + }, + "663462": { + "shortname": "AUCA: 1" + }, + "663463": { + "shortname": "KRSU: We_Love_Coffee" + }, + "663464": { + "shortname": "IAU: nothing to code" + }, + "663465": { + "shortname": "KGiAI: one_more_time" + }, + "663466": { + "shortname": "KRSU: 5" + }, + "663467": { + "shortname": "UCA: Team1" + }, + "663468": { + "shortname": "OshTU: 2" + }, + "663469": { + "shortname": "AUCA: MedSons" + }, + "663470": { + "shortname": "Kyrgyz-Turkey Manas U: 7" + }, + "663471": { + "shortname": "Kyrgyz-Turkey Manas U: 1" + }, + "663472": { + "shortname": "Kyrgyz-Turkey Manas U: 5" + }, + "663473": { + "shortname": "KRSU: blastMaker" + }, + "663474": { + "shortname": "Kyrgyz-Turkey Manas U: 4" + }, + "663475": { + "shortname": "AUCA: Dungeon masters" + }, + "663476": { + "shortname": "AUCA: dishmans" + }, + "667602": { + "shortname": "HSE: trained+Overpressured" + }, + "667603": { + "shortname": "MIPT: Log-rank conjecture" + }, + "667604": { + "shortname": "HSE: Yandex PTU" + }, + "667605": { + "shortname": "MIPT: The Phoenix" + }, + "667606": { + "shortname": "MIPT: LinkCat" + }, + "667607": { + "shortname": "HSE: Dirizhabl’" + }, + "667608": { + "shortname": "HSE: Mystery Machine" + }, + "667609": { + "shortname": "Moscow SU: NoNames" + }, + "667610": { + "shortname": "MAI: 1" + }, + "667611": { + "shortname": "Moscow SU: Johnnie Jack and Jim" + }, + "667612": { + "shortname": "MIPT: Never Trained" + }, + "667613": { + "shortname": "MIPT: Flying Penguins" + }, + "667614": { + "shortname": "MIPT: Wake up" + }, + "667615": { + "shortname": "Moscow SU: bebop" + }, + "667616": { + "shortname": "Moscow SU: MAN" + }, + "667617": { + "shortname": "MAI: 5" + }, + "667618": { + "shortname": "MPSU: Matemasters" + }, + "667619": { + "shortname": "MEPhI: Sweet Potato" + }, + "667620": { + "shortname": "MISiS: Palm_Hop_Selec" + }, + "667621": { + "shortname": "MAI: 2" + }, + "667622": { + "shortname": "MISiS: ICPC is overrated" + }, + "667623": { + "shortname": "MIREA: Team 1" + }, + "667624": { + "shortname": "MISiS: Solving meth problems" + }, + "667625": { + "shortname": "BMSTU: 30 seconds to parse" + }, + "667626": { + "shortname": "MISiS: Flip phone, telefon" + }, + "667627": { + "shortname": "MIET: NUM" + }, + "667628": { + "shortname": "BNTU: 4294967297" + }, + "667629": { + "shortname": "BelarusianSU: 2" + }, + "667630": { + "shortname": "BelarusianSU: 1" + }, + "667631": { + "shortname": "BelarusianSU: 6" + }, + "667632": { + "shortname": "BSUIR: 5 The last one" + }, + "667633": { + "shortname": "BSUIR: 9 si4uem s kaifom" + }, + "667634": { + "shortname": "BelarusianSU: 7 OSUTeam" + }, + "667635": { + "shortname": "GrSU: 1" + }, + "667636": { + "shortname": "BSUIR: 7 ugoschaet golubcami" + }, + "667637": { + "shortname": "GSU: -2" + }, + "667638": { + "shortname": "GSU: -1" + }, + "667639": { + "shortname": "BrSU: 1 AP Team" + }, + "667640": { + "shortname": "BNTU: FITRx3" + }, + "667641": { + "shortname": "GrSU: 2" + }, + "667642": { + "shortname": "BelSUT: _1" + }, + "667643": { + "shortname": "BelSTU: 1" + }, + "667644": { + "shortname": "GSTU: Si vis pacem, para bellum" + }, + "667645": { + "shortname": "SPb ITMO: pengzoo" + }, + "667646": { + "shortname": "SPb HSE: Lemon Tree" + }, + "667647": { + "shortname": "SPb SU: dataVase" + }, + "667648": { + "shortname": "SPb SU: Team Chill It" + }, + "667649": { + "shortname": "SPb SU: ?5" + }, + "667650": { + "shortname": "SPb SU: MCS: Andrew Sergeevich" + }, + "667651": { + "shortname": "SPb SU: jazz" + }, + "667652": { + "shortname": "SPb ITMO: Cataleptodius" + }, + "667653": { + "shortname": "SPb ITMO: Unexpected Value" + }, + "667654": { + "shortname": "SPb ITMO: hw" + }, + "667655": { + "shortname": "SPb ITMO: TaskAcceptedException" + }, + "667656": { + "shortname": "SPb HSE: HS of Abbreviations" + }, + "667657": { + "shortname": "SPb HSE: Just4Keks" + }, + "667658": { + "shortname": "Petrozavodsk SU: pgt Shya" + }, + "667659": { + "shortname": "Budenny MTA: Peacemakers" + }, + "667660": { + "shortname": "Petrozavodsk SU: Bukva yu" + }, + "667661": { + "shortname": "Polytech: Ab absurdo 4" + }, + "667662": { + "shortname": "Petrozavodsk SU: adamant" + }, + "667663": { + "shortname": "SUAI: MegaSmetanka" + }, + "667664": { + "shortname": "SUAI: 1703" + }, + "667665": { + "shortname": "CFUV: Vernadsky" + }, + "667666": { + "shortname": "CFUV: Endeavor" + }, + "667667": { + "shortname": "CFUV: pod3.14vasniki" + }, + "667668": { + "shortname": "CFUV: Team_Pepega" + }, + "667669": { + "shortname": "YarSU: 1 Yess we can" + }, + "667670": { + "shortname": "NArFU: 2" + }, + "667671": { + "shortname": "AFSO: 7" + }, + "667672": { + "shortname": "YarSU: 20 LigaDravena" + }, + "667673": { + "shortname": "YarSU: 2 chill_owls" + }, + "667674": { + "shortname": "RSATU: 4" + }, + "667675": { + "shortname": "TverSU: 3 Guerilla Gorillas" + }, + "667676": { + "shortname": "BSTU: 1 winx_v3.0" + }, + "667677": { + "shortname": "Ural FU: The Last Dance" + }, + "667678": { + "shortname": "Ural FU: ReFresh" + }, + "667679": { + "shortname": "Ural FU: CheezeKEK" + }, + "667680": { + "shortname": "Perm SU: Cats" + }, + "667681": { + "shortname": "Ural FU: Raketa & 3 Deda" + }, + "667682": { + "shortname": "Ural FU: Cucumber Juice 73" + }, + "667683": { + "shortname": "Perm SU: corgi_never_sleep" + }, + "667684": { + "shortname": "Ufa SATU: God's Choice" + }, + "667685": { + "shortname": "Izhevsk STU: CyTheFu" + }, + "667686": { + "shortname": "Perm SU: Plusbl" + }, + "667687": { + "shortname": "Izhevsk STU: ZEDbl" + }, + "667688": { + "shortname": "Tyumen SU: import.math" + }, + "667689": { + "shortname": "Surgut SU: DieHard" + }, + "667690": { + "shortname": "Tyumen SU: Permutation Of Lenovo" + }, + "667691": { + "shortname": "Perm HSE: pitonishe" + }, + "667692": { + "shortname": "Orenburg SU: feel_good" + }, + "667693": { + "shortname": "Izhevsk STU: People++" + }, + "667694": { + "shortname": "Orenburg SU: How much I love BTS" + }, + "667695": { + "shortname": "South Ural SU: Masters of Crosses" + }, + "667696": { + "shortname": "South Ural SU: UZI" + }, + "667697": { + "shortname": "South Ural SU: 0 div 0" + }, + "667698": { + "shortname": "Innopolis: U Q" + }, + "667699": { + "shortname": "Penza SU: I" + }, + "667700": { + "shortname": "UNN: Lera Retired" + }, + "667701": { + "shortname": "UNN: Presskachat" + }, + "667702": { + "shortname": "Innopolis: U I" + }, + "667703": { + "shortname": "Kazan FU: A" + }, + "667704": { + "shortname": "SFedU: E" + }, + "667705": { + "shortname": "Saratov SU: Innopolis U 0" + }, + "667706": { + "shortname": "Volgograd STU" + }, + "667707": { + "shortname": "Kazan FU: V" + }, + "667708": { + "shortname": "Saratov SU: H" + }, + "667709": { + "shortname": "NRU HSE: NN 1" + }, + "667710": { + "shortname": "NRU HSE: NN Brawl Stars" + }, + "667711": { + "shortname": "MordSU: D" + }, + "667712": { + "shortname": "VoronezhSU: H" + }, + "667713": { + "shortname": "SFedU: C" + }, + "667714": { + "shortname": "USTU: J" + }, + "667715": { + "shortname": "VoronezhSU: B" + }, + "667716": { + "shortname": "Saratov SU: P" + }, + "667717": { + "shortname": "MordSU: E" + }, + "667718": { + "shortname": "Kazan FU: G" + }, + "667719": { + "shortname": "Saratov SU: J" + }, + "667720": { + "shortname": "ASU: B" + }, + "667769": { + "shortname": "MSU Tashkent: 1 Awesome Team" + }, + "667770": { + "shortname": "TUIT: pfff" + }, + "667771": { + "shortname": "RusTjkSlav: Head_Shot" + }, + "667772": { + "shortname": "MGUD: 7" + }, + "667773": { + "shortname": "MGUD: 2" + }, + "667774": { + "shortname": "MGUD: 1" + }, + "667775": { + "shortname": "MSU Tashkent: 2" + }, + "667776": { + "shortname": "SamTUIT: SLD Group" + }, + "667777": { + "shortname": "TUIT: Lorem Ipsum" + }, + "667778": { + "shortname": "RusTjkSlav: NERU" + }, + "667779": { + "shortname": "SamTUIT: oVerfitting" + }, + "667780": { + "shortname": "TUIT: Falcon" + }, + "667781": { + "shortname": "SamTUIT: RUNTIME tERROR" + }, + "667782": { + "shortname": "MSU Tashkent: 4 Silent Birds" + }, + "667783": { + "shortname": "TUIT: Algo_experts" + }, + "667784": { + "shortname": "TUIT Urgench Branch: 1" + }, + "667785": { + "shortname": "RusTjkSlav: Silk Way" + }, + "667786": { + "shortname": "NUUz: geeksforgeeks" + }, + "667787": { + "shortname": "RusTjkSlav: Shakarob" + }, + "667788": { + "shortname": "TUIT Urgench Branch: 2" + }, + "667789": { + "shortname": "JBNUU: M" + }, + "667790": { + "shortname": "NUUz: NUU_10" + }, + "667791": { + "shortname": "Namangan SU: 1" + }, + "667792": { + "shortname": "SamSU: LifePC Group" + }, + "667793": { + "shortname": "MIICTS: _1" + }, + "667794": { + "shortname": "SamTUIT: thephaza" + }, + "667795": { + "shortname": "JBNUU: Progress" + }, + "667796": { + "shortname": "MGUD: 9" + }, + "667797": { + "shortname": "SamSU: Dream Team" + }, + "667798": { + "shortname": "IIAU: Revengers" + }, + "667799": { + "shortname": "AndMII: Heaven" + }, + "667800": { + "shortname": "IITU: SuperNoVa" + }, + "667801": { + "shortname": "NU: 1" + }, + "667802": { + "shortname": "KBTU: Don't panic" + }, + "667803": { + "shortname": "AITU: 1" + }, + "667804": { + "shortname": "IITU: set" + }, + "667805": { + "shortname": "AITU: 2" + }, + "667806": { + "shortname": "AITU: 4" + }, + "667807": { + "shortname": "KBTU: Sᴬᵁ Bᴼᴸᵂᴵ" + }, + "667808": { + "shortname": "NU: 5" + }, + "667809": { + "shortname": "NU: 2" + }, + "667810": { + "shortname": "IITU: ur mamaso" + }, + "667811": { + "shortname": "SDU: 1" + }, + "667812": { + "shortname": "KazNU: 1" + }, + "667813": { + "shortname": "SDU: 2 Abudyn' DastanKhany" + }, + "667814": { + "shortname": "NU: 3" + }, + "667815": { + "shortname": "IITU: AbDiAl" + }, + "667816": { + "shortname": "KBTU: Kazakh Mafia" + }, + "667817": { + "shortname": "KBTU: N^3" + }, + "667818": { + "shortname": "AITU: 5" + }, + "667819": { + "shortname": "KazNTU: SU1" + }, + "667820": { + "shortname": "KazNU: 2" + }, + "667821": { + "shortname": "KazNU: 3" + }, + "667822": { + "shortname": "KazNTU: SU2" + }, + "667823": { + "shortname": "SDU: balmuzdaqtar" + }, + "667824": { + "shortname": "KazNU: 4" + }, + "667825": { + "shortname": "AIPET: _1" + }, + "667826": { + "shortname": "KTU: 1" + }, + "667827": { + "shortname": "Far Eastern FU: CODE work" + }, + "667828": { + "shortname": "Far Eastern FU: Time Limit" + }, + "667829": { + "shortname": "Far Eastern FU: Garbies" + }, + "667830": { + "shortname": "Far Eastern FU: FlexBoiz" + }, + "667831": { + "shortname": "Far Eastern STU: DevOchka" + }, + "667832": { + "shortname": "Far Eastern STU: myTEAmmm" + }, + "667833": { + "shortname": "Far Eastern STU: kekadev" + }, + "667834": { + "shortname": "VSUES: Videokrolik" + }, + "667835": { + "shortname": "VSUES: 8" + }, + "667836": { + "shortname": "Irkutsk U: 4 whoami" + }, + "667837": { + "shortname": "INRTU: 3 PolyTech" + }, + "667838": { + "shortname": "Irkutsk U: 5 take it easy" + }, + "667839": { + "shortname": "Irkutsk U: 2 322" + }, + "667840": { + "shortname": "esstu: 5 Wolf Auf" + }, + "667841": { + "shortname": "BSU: 4 nonremmitalSpiders" + }, + "667842": { + "shortname": "IMCS SFU: 1 KlopiTarakani" + }, + "667843": { + "shortname": "Khakas TI of SFU: 4 ZXCoders" + }, + "667844": { + "shortname": "BSU: 3 soldaP" + }, + "667845": { + "shortname": "ISRU: 2 molodie lisyata" + }, + "667846": { + "shortname": "Zabaikal SU: 1" + }, + "667847": { + "shortname": "BSU: 1 TNT" + }, + "667848": { + "shortname": "ISRU: 1 Brainstorm" + }, + "667849": { + "shortname": "INRTU: 2Team" + }, + "667850": { + "shortname": "Tuvan SU: 1 Achiles Turtles" + }, + "667851": { + "shortname": "ESSUTM: 1 ElderlyCoders" + }, + "667852": { + "shortname": "ISIT SFU: 2 Systema auto pobedi" + }, + "667853": { + "shortname": "Tuvan SU: 2 Akatsuki" + }, + "667854": { + "shortname": "ISIT SFU: 4 Super Cookies" + }, + "667855": { + "shortname": "Zabaikal SU: 2" + }, + "667856": { + "shortname": "BSU: 2 SYAS" + }, + "667857": { + "shortname": "Khakas TI of SFU: 1 Real Tigers" + }, + "667872": { + "shortname": "SamSU: _ITEG_1" + }, + "667898": { + "shortname": "BelarusianSU: 5" + }, + "667899": { + "shortname": "BSUIR: 2 Brute Force - Best Force" + }, + "667938": { + "shortname": "NU: 4" + }, + "668532": { + "shortname": "YarSU: 12 HuRMa" + }, + "668533": { + "shortname": "VyatkaGU: 9" + }, + "668534": { + "shortname": "OrelSU: 1" + }, + "668536": { + "shortname": "MSU Tashkent: 3 Froggg" + }, + "668594": { + "shortname": "VoronezhSU: F" + }, + "668693": { + "shortname": "BelarusianSU: 3 Mogilev Eagles" + }, + "668694": { + "shortname": "HSE: Sovetskiy Soyuz" + }, + "669271": { + "shortname": "Yerevan SU: 2813" + }, + "669272": { + "shortname": "Yerevan SU: 1" + }, + "669273": { + "shortname": "Yerevan SU: bit.ly/2YlU2Si" + }, + "669274": { + "shortname": "Yerevan SU: SSD" + }, + "669275": { + "shortname": "RAU: 2" + }, + "669276": { + "shortname": "RAU: 1" + }, + "669277": { + "shortname": "NPUA: polytex" + }, + "669278": { + "shortname": "RAU: 3" + }, + "669279": { + "shortname": "AUA: 1" + }, + "669280": { + "shortname": "Goris SU: We and Our Mountains" + }, + "669281": { + "shortname": "EUA: Mercury1" + }, + "669282": { + "shortname": "APSU: ASPU" + }, + "669283": { + "shortname": "NUACA" + }, + "670017": { + "shortname": "KBTU: Permission denied" + }, + "670045": { + "shortname": "YarSU: 18 Dead_Inside_Team" + }, + "670108": { + "shortname": "NEFU" + } + } +} \ No newline at end of file diff --git a/config/icpc-nef/2021-2022/main/events.properties b/config/__tests/pcms_icpc_overrides/icpc-nef-2021-2022/events.properties similarity index 62% rename from config/icpc-nef/2021-2022/main/events.properties rename to config/__tests/pcms_icpc_overrides/icpc-nef-2021-2022/events.properties index 70e1a3438..18daf3a1d 100644 --- a/config/icpc-nef/2021-2022/main/events.properties +++ b/config/__tests/pcms_icpc_overrides/icpc-nef-2021-2022/events.properties @@ -1,5 +1,2 @@ url=https://nerc.itmo.ru/archive/2021/standings.xml standings.type=PCMS - -emulation.speed=5 -emulation.startTime=now diff --git a/config/__tests/pcms_ioi/innopolis-open-2022-2023-final/advanced.json b/config/__tests/pcms_ioi/innopolis-open-2022-2023-final/advanced.json new file mode 100644 index 000000000..04795ce74 --- /dev/null +++ b/config/__tests/pcms_ioi/innopolis-open-2022-2023-final/advanced.json @@ -0,0 +1,9 @@ +{ + "problemOverrides": { + "A":{"color":"#06d50d"}, + "B":{"color":"#1b2cff"}, + "C":{"color":"#9d2fff"}, + "D":{"color":"#fd920e"}, + "E":{"color":"#ff3821"} + } +} \ No newline at end of file diff --git a/config/innopolis-open/2022-2023/final/events.properties b/config/__tests/pcms_ioi/innopolis-open-2022-2023-final/events.properties similarity index 100% rename from config/innopolis-open/2022-2023/final/events.properties rename to config/__tests/pcms_ioi/innopolis-open-2022-2023-final/events.properties diff --git a/config/__tests/testsys_icpc/spbsu-2023-may/advanced.json b/config/__tests/testsys_icpc/spbsu-2023-may/advanced.json new file mode 100644 index 000000000..8a2b44960 --- /dev/null +++ b/config/__tests/testsys_icpc/spbsu-2023-may/advanced.json @@ -0,0 +1,31 @@ +{ + "scoreboardOverrides": { + "medals": [ + {"name": "gold", "count": 4}, + {"name": "silver", "count": 4}, + {"name": "bronze", "count": 4} + ], + "showTeamsWithoutSubmissions": true + }, + "problemOverrides": { + "A":{"color":"#e6194B"}, + "B":{"color":"#3cb44b"}, + "C":{"color":"#ffe119"}, + "D":{"color":"#4363d8"}, + "E":{"color":"#f58231"}, + "F":{"color":"#42d4f4"}, + "G":{"color":"#f032e6"}, + "H":{"color":"#fabed4"}, + "I":{"color":"#469990"}, + "J":{"color":"#dcbeff"}, + "K":{"color":"#9A6324"}, + "L":{"color":"#fffac8"}, + "M":{"color":"#800000"}, + "N":{"color":"#aaffc3"}, + "O":{"color":"#000075"}, + "P":{"color":"#a9a9a9"}, + "Q":{"color":"#e6194B"}, + "R":{"color":"#3cb44b"}, + "S":{"color":"#ffe119"} + } +} \ No newline at end of file diff --git a/config/spbsu/2023-may/main/events.properties b/config/__tests/testsys_icpc/spbsu-2023-may/events.properties similarity index 60% rename from config/spbsu/2023-may/main/events.properties rename to config/__tests/testsys_icpc/spbsu-2023-may/events.properties index 7842b5b05..54dfead73 100644 --- a/config/spbsu/2023-may/main/events.properties +++ b/config/__tests/testsys_icpc/spbsu-2023-may/events.properties @@ -1,3 +1,2 @@ standings.type=TESTSYS -#url=https://nerc.itmo.ru/jm230514.dat for resolver url=http://acm.math.spbu.ru/cgi-bin/view.pl/m230514.dat \ No newline at end of file diff --git a/config/_examples/_CF/events.properties b/config/_examples/_CF/events.properties deleted file mode 100644 index 81604ab7b..000000000 --- a/config/_examples/_CF/events.properties +++ /dev/null @@ -1,4 +0,0 @@ -cf.api.key=af7612378661287361278368dd -cf.api.secret=afde128478473784adfffedfff -contest_id=1600 -standings.type=CF diff --git a/config/_examples/_CF/settings.json b/config/_examples/_CF/settings.json new file mode 100644 index 000000000..6d679e42e --- /dev/null +++ b/config/_examples/_CF/settings.json @@ -0,0 +1,6 @@ +{ + "type": "cf", + "apiKey": "$creds.codeforces_key", + "apiSecret": "$creds.codeforces_secret", + "contestId": 1600 +} diff --git a/config/_examples/_achievements_simple/advanced.json b/config/_examples/_achievements_simple/advanced.json index 03af9efb2..ea8dc0648 100644 --- a/config/_examples/_achievements_simple/advanced.json +++ b/config/_examples/_achievements_simple/advanced.json @@ -6,7 +6,7 @@ } }, "teamOverrides": { -"486860": {"shortname": "SPb HSE 1: Lemon Tree", "groups": ["SPb HSE", "SPb"], "additionalInfo": "Safonov | Gorokhovskii | Fedoseev"}, +"486860": {"shortname": "SPb HSE 1: Lemon Tree", "groups": ["SPb HSE", "SPb"], "customFields": {"svgInfo": "Safonov | Gorokhovskii | Fedoseev"}}, "486908": {"shortname": "Ufa SATU: Electric Funeral", "groups": ["Ufa SATU", "Other"]}, "486910": {"shortname": "Budenny Mil Telecom A: 1", "groups": ["Budenny Mil Telecom A", "SPb"]} } diff --git a/config/_examples/_achievements_simple/events.properties b/config/_examples/_achievements_simple/events.properties deleted file mode 100644 index 24eafd65c..000000000 --- a/config/_examples/_achievements_simple/events.properties +++ /dev/null @@ -1,5 +0,0 @@ -url=http://nerc.itmo.ru/archive/2020/standings.xml -standings.type=PCMS - -emulation.speed=1 -emulation.startTime=now diff --git a/config/_examples/_achievements_simple/settings.json b/config/_examples/_achievements_simple/settings.json new file mode 100644 index 000000000..18e7d0881 --- /dev/null +++ b/config/_examples/_achievements_simple/settings.json @@ -0,0 +1,6 @@ +{ + "url":"http://nerc.itmo.ru/archive/2020/standings.xml", + "type":"pcms", + + "emulation":{"speed":1, "startTime":"now"} +} \ No newline at end of file diff --git a/config/_examples/_cats_icpc/events.properties b/config/_examples/_cats_icpc/events.properties deleted file mode 100644 index 6587d5931..000000000 --- a/config/_examples/_cats_icpc/events.properties +++ /dev/null @@ -1,7 +0,0 @@ -url=https://imcs.dvfu.ru/cats -cid=5481581 -standings.type=CATS -timezone=UTC+10 -standings.resultType=ICPC -login=$creds.cats.login -password=$creds.cats.password \ No newline at end of file diff --git a/config/_examples/_cats_icpc/settings.json b/config/_examples/_cats_icpc/settings.json new file mode 100644 index 000000000..16a137dcb --- /dev/null +++ b/config/_examples/_cats_icpc/settings.json @@ -0,0 +1,9 @@ +{ + "type":"cats", + "url":"https://imcs.dvfu.ru/cats", + "cid":"5481581", + "timeZone":"UTC+10", + "resultType":"ICPC", + "login":"$creds.cats_login", + "password":"$creds.cats_password" +} \ No newline at end of file diff --git a/config/_examples/_cats_ioi/events.properties b/config/_examples/_cats_ioi/events.properties deleted file mode 100644 index 328a5826c..000000000 --- a/config/_examples/_cats_ioi/events.properties +++ /dev/null @@ -1,7 +0,0 @@ -url=https://imcs.dvfu.ru/cats -cid=5974394 -standings.type=CATS -timezone=UTC+10 -standings.resultType=IOI -login=$creds.cats.login -password=$creds.cats.password diff --git a/config/_examples/_cats_ioi/settings.json b/config/_examples/_cats_ioi/settings.json new file mode 100644 index 000000000..c9a7a7c4e --- /dev/null +++ b/config/_examples/_cats_ioi/settings.json @@ -0,0 +1,9 @@ +{ + "url":"https://imcs.dvfu.ru/cats", + "cid":"5974394", + "type":"cats", + "timeZone":"UTC+10", + "resultType":"IOI", + "login":"$creds.cats_login", + "password":"$creds.cats_password" +} \ No newline at end of file diff --git a/config/_examples/_cms/advanced.json b/config/_examples/_cms/advanced.json new file mode 100644 index 000000000..778c08f8f --- /dev/null +++ b/config/_examples/_cms/advanced.json @@ -0,0 +1,22 @@ +{ + "problemOverrides": { + "SC2022CEOI13prize": { + "displayName": "A1" + }, + "SC2022CEOI11abracadabra": { + "displayName": "B1" + }, + "SC2022CEOI12homework": { + "displayName": "C1" + }, + "SC2022CEOI22measures": { + "displayName": "A2" + }, + "SC2022CEOI21drawing": { + "displayName": "B2" + }, + "SC2022CEOI23parking": { + "displayName": "C2" + } + } +} \ No newline at end of file diff --git a/config/_examples/_cms/settings.json b/config/_examples/_cms/settings.json new file mode 100644 index 000000000..2973ef405 --- /dev/null +++ b/config/_examples/_cms/settings.json @@ -0,0 +1,6 @@ +{ + "type": "cms", + "activeContest": "ceoi22_5f2", + "otherContests": ["ceoi22_5f1"], + "url": "https://ceoi.hsin.hr/ranking/" +} \ No newline at end of file diff --git a/config/_examples/_codedrills/settings.json b/config/_examples/_codedrills/settings.json new file mode 100644 index 000000000..72bb48562 --- /dev/null +++ b/config/_examples/_codedrills/settings.json @@ -0,0 +1,7 @@ +{ + "type": "codedrills", + "url": "site.api.prod.codedrills.io", + "port": 6565, + "authKey": "$creds.codedrills_key", + "contestId": "icpc-asia-west-continent-final-contest-2022" +} \ No newline at end of file diff --git a/config/_examples/_domjudge_test1/events.properties b/config/_examples/_domjudge_test1/events.properties deleted file mode 100644 index 2c3c02504..000000000 --- a/config/_examples/_domjudge_test1/events.properties +++ /dev/null @@ -1,4 +0,0 @@ -login=live -password=$creds.cds_password_pretest_dhaka -url=https://cds.storm.vu/api/contests/pretest_dhaka -standings.type=CLICS \ No newline at end of file diff --git a/config/_examples/_domjudge_test1/settings.json b/config/_examples/_domjudge_test1/settings.json new file mode 100644 index 000000000..2284fb75b --- /dev/null +++ b/config/_examples/_domjudge_test1/settings.json @@ -0,0 +1,6 @@ +{ + "login":"live", + "password":"$creds.cds_password_pretest_dhaka", + "url":"https://cds.storm.vu/api/contests/pretest_dhaka", + "type":"clics" +} \ No newline at end of file diff --git a/config/_examples/_krsu-test/events.properties b/config/_examples/_krsu-test/events.properties deleted file mode 100644 index 70725ad9c..000000000 --- a/config/_examples/_krsu-test/events.properties +++ /dev/null @@ -1,11 +0,0 @@ -standings.type=KRSU - -submissions-url = https://olymp.krsu.edu.kg/web/api/contestsubmissions/submissions?apiKey=a1f4d25se3&size=1000000&lowerBound=-1&upperBound=2000000000&contest=772&probe=0&isAdmin=1 -contest-url = https://olymp.krsu.edu.kg/web/api/contestsubmissions/contestinfo?apiKey=a1f4d25se3&id=772 - -emulation.speed=5 -emulation.startTime=now - - - - diff --git a/config/_examples/_krsu-test/settings.json b/config/_examples/_krsu-test/settings.json new file mode 100644 index 000000000..5d6d957f5 --- /dev/null +++ b/config/_examples/_krsu-test/settings.json @@ -0,0 +1,12 @@ +{ + "type":"krsu", + + "submissionsUrl":"https://olymp.krsu.edu.kg/web/api/contestsubmissions/submissions?apiKey=a1f4d25se3&size=1000000&lowerBound=-1&upperBound=2000000000&contest=772&probe=0&isAdmin=1", + "contestUrl":"https://olymp.krsu.edu.kg/web/api/contestsubmissions/contestinfo?apiKey=a1f4d25se3&id=772", + + "emulation":{"speed":5,"startTime":"now"} +} + + + + diff --git a/config/_examples/_pc2/events.properties b/config/_examples/_pc2/events.properties deleted file mode 100644 index 774888be8..000000000 --- a/config/_examples/_pc2/events.properties +++ /dev/null @@ -1,5 +0,0 @@ -url=_examples/_pc2 -feed_version=2020_03 -standings.type=CLICS -emulation.startTime=now -emulation.speed=5 diff --git a/config/_examples/_pc2/settings.json b/config/_examples/_pc2/settings.json new file mode 100644 index 000000000..f912fab59 --- /dev/null +++ b/config/_examples/_pc2/settings.json @@ -0,0 +1,8 @@ +{ + "type":"clics", + + "url":"_examples/_pc2", + "feedVersion":"2020_03", + + "emulation":{"speed":5,"startTime":"now"} +} diff --git a/config/_examples/_pcms-ioi-test/events-new.xml b/config/_examples/_pcms-ioi-test/events-new.xml deleted file mode 100644 index 436691123..000000000 --- a/config/_examples/_pcms-ioi-test/events-new.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/config/_examples/_pcms-ioi-test/events.xml b/config/_examples/_pcms-ioi-test/events.xml deleted file mode 100644 index 6991bafa3..000000000 --- a/config/_examples/_pcms-ioi-test/events.xml +++ /dev/null @@ -1,163 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/config/_examples/_pcms-ioi-test/participants.xml b/config/_examples/_pcms-ioi-test/participants.xml deleted file mode 100644 index 654ffcea0..000000000 --- a/config/_examples/_pcms-ioi-test/participants.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - diff --git a/config/_examples/_pcms-ioi-test/pcms.events.properties b/config/_examples/_pcms-ioi-test/pcms.events.properties deleted file mode 100644 index 316d99d21..000000000 --- a/config/_examples/_pcms-ioi-test/pcms.events.properties +++ /dev/null @@ -1,10 +0,0 @@ -login=admin -password=adm1n -url=events.xml -teams.url=participants.xml -problems.url=problems.xml -problems.number=6 -standings.type=IOIPCMS - -running.time=18000000 -freeze.time=18000000 \ No newline at end of file diff --git a/config/_examples/_pcms-ioi-test/pcms.mainscreen.properties b/config/_examples/_pcms-ioi-test/pcms.mainscreen.properties deleted file mode 100644 index 9c6750b50..000000000 --- a/config/_examples/_pcms-ioi-test/pcms.mainscreen.properties +++ /dev/null @@ -1,40 +0,0 @@ -update.wait=500 -backup.persons=persons.txt -backup.advertisements=advertisements.txt -breakingnews.time=20000 -breakingnews.runs.number=10 -breakingnews.patterns.filename=patterns.txt -standings.blinking.time=10000 -advertisement.time=5000 -person.time=5000 -latency.time=2000 -data.update=1000 -data.host=localhost -data.port=25675 -info.types=photo;screen -main.type=photo -info.photo=pics/team.jpg -info.screen=pics/screen.jpg -sleep.time=3000 -automated.show.time=20000 -automated.info=screen -team.double.video=true - -queue.show.verdict=false - -ticker.rotate.time=1000 -ticker.logo=NEERC 2016;#NEERC2016 -ticker.logo.time=10000 -ticker.logo.change.time=2000 - -overlayed.delay=3000 - -width=1280 -height=720 - -rate=10 - -top.teams.file=pcms-test/topteams.txt -onsite.teams=S.* - -stylesheet=stylesheets/wf.jss diff --git a/config/_examples/_pcms-ioi-test/problems.xml b/config/_examples/_pcms-ioi-test/problems.xml deleted file mode 100644 index 8c1dca878..000000000 --- a/config/_examples/_pcms-ioi-test/problems.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/config/_examples/_pcms-ioi-test/topteams.txt b/config/_examples/_pcms-ioi-test/topteams.txt deleted file mode 100644 index b4224e06a..000000000 --- a/config/_examples/_pcms-ioi-test/topteams.txt +++ /dev/null @@ -1,2 +0,0 @@ -S101 -S105 \ No newline at end of file diff --git a/config/_examples/_pcms-test/events-new.xml b/config/_examples/_pcms-test/events-new.xml deleted file mode 100644 index 086a06fc2..000000000 --- a/config/_examples/_pcms-test/events-new.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/config/_examples/_pcms-test/events.xml b/config/_examples/_pcms-test/events.xml deleted file mode 100644 index 12dca96a7..000000000 --- a/config/_examples/_pcms-test/events.xml +++ /dev/null @@ -1,163 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/config/_examples/_pcms-test/participants.xml b/config/_examples/_pcms-test/participants.xml deleted file mode 100644 index 5978e6680..000000000 --- a/config/_examples/_pcms-test/participants.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - diff --git a/config/_examples/_pcms-test/pcms.events.properties b/config/_examples/_pcms-test/pcms.events.properties deleted file mode 100644 index eeb09be7e..000000000 --- a/config/_examples/_pcms-test/pcms.events.properties +++ /dev/null @@ -1,10 +0,0 @@ -login=admin -password=adm1n -url=events.xml -participants=participants.xml -problems.url=problems.xml -problemsNumber=6 -standings.type=PCMS - -running.time=18000000 -freeze.time=14400000 \ No newline at end of file diff --git a/config/_examples/_pcms-test/pcms.mainscreen.properties b/config/_examples/_pcms-test/pcms.mainscreen.properties deleted file mode 100644 index 9c6750b50..000000000 --- a/config/_examples/_pcms-test/pcms.mainscreen.properties +++ /dev/null @@ -1,40 +0,0 @@ -update.wait=500 -backup.persons=persons.txt -backup.advertisements=advertisements.txt -breakingnews.time=20000 -breakingnews.runs.number=10 -breakingnews.patterns.filename=patterns.txt -standings.blinking.time=10000 -advertisement.time=5000 -person.time=5000 -latency.time=2000 -data.update=1000 -data.host=localhost -data.port=25675 -info.types=photo;screen -main.type=photo -info.photo=pics/team.jpg -info.screen=pics/screen.jpg -sleep.time=3000 -automated.show.time=20000 -automated.info=screen -team.double.video=true - -queue.show.verdict=false - -ticker.rotate.time=1000 -ticker.logo=NEERC 2016;#NEERC2016 -ticker.logo.time=10000 -ticker.logo.change.time=2000 - -overlayed.delay=3000 - -width=1280 -height=720 - -rate=10 - -top.teams.file=pcms-test/topteams.txt -onsite.teams=S.* - -stylesheet=stylesheets/wf.jss diff --git a/config/_examples/_pcms-test/problems.xml b/config/_examples/_pcms-test/problems.xml deleted file mode 100644 index 8c1dca878..000000000 --- a/config/_examples/_pcms-test/problems.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/config/_examples/_pcms-test/topteams.txt b/config/_examples/_pcms-test/topteams.txt deleted file mode 100644 index b4224e06a..000000000 --- a/config/_examples/_pcms-test/topteams.txt +++ /dev/null @@ -1,2 +0,0 @@ -S101 -S105 \ No newline at end of file diff --git a/config/_examples/_testsys/advanced.json b/config/_examples/_testsys/advanced.json new file mode 100644 index 000000000..6d53d5974 --- /dev/null +++ b/config/_examples/_testsys/advanced.json @@ -0,0 +1,23 @@ +{ + "teamRegexes": { + "groupRegex": { + "outOfContest": "^\\(вк\\).*", + "firstGrade": "^\\(1к\\).*", + "school": "^\\(шк\\).*" + }, + "customFields": { + "funnyName": "^(?:\\(..\\) )?(.*) \\([^)]*\\)" + } + }, + "groupOverrides": { + "outOfContest": { + "isOutOfContest": true + } + }, + "teamOverrideTemplate": { + "displayName": "{funnyName}" + }, + "problemOverrides": { + "A": { "ordinal": 100 } + } +} \ No newline at end of file diff --git a/config/_examples/_testsys/events.properties b/config/_examples/_testsys/events.properties deleted file mode 100644 index 69ec7be9f..000000000 --- a/config/_examples/_testsys/events.properties +++ /dev/null @@ -1,2 +0,0 @@ -standings.type=TESTSYS -url=http://acm.math.spbu.ru/cgi-bin/view.pl/n201206.dat \ No newline at end of file diff --git a/config/_examples/_testsys/settings.json5 b/config/_examples/_testsys/settings.json5 new file mode 100644 index 000000000..f17d58f03 --- /dev/null +++ b/config/_examples/_testsys/settings.json5 @@ -0,0 +1,5 @@ +{ + // comment": "This line is ignored" + type: "testsys", + url: "http://acm.math.spbu.ru/cgi-bin/view.pl/n201206.dat", +} \ No newline at end of file diff --git a/config/_examples/_yandex/events.properties b/config/_examples/_yandex/events.properties deleted file mode 100644 index 49589ef18..000000000 --- a/config/_examples/_yandex/events.properties +++ /dev/null @@ -1,9 +0,0 @@ -# 1. Register an application here: https://oauth.yandex.ru/client/new -# - Choose «Web services» -# - Tap «Set URL for development» -# - Add permission «Manage contests and participants (contest:manage)» -# 2. Get «debug» token: https://yandex.ru/dev/id/doc/dg/oauth/tasks/get-oauth-token.html -yandex.token=$creds.yandex -yandex.contest_id=37430 -yandex.login_prefix=(^rucode5\-team\-0.*|^mw\-prefinals\-.*|^mrc2021\-.*) -standings.type=YANDEX diff --git a/config/_examples/_yandex/settings.json5 b/config/_examples/_yandex/settings.json5 new file mode 100644 index 000000000..12f7a2506 --- /dev/null +++ b/config/_examples/_yandex/settings.json5 @@ -0,0 +1,13 @@ +{ + /* + 1. Register an application here: https://oauth.yandex.ru/client/new + - Choose «Web services» + - Tap «Set URL for development» + - Add permission «Manage contests and participants (contest:manage)» + 2. Get «debug» token: https://yandex.ru/dev/id/doc/dg/oauth/tasks/get-oauth-token.html +*/ + type: "yandex", + apiKey: "$creds.yandex", + contestId: 37430, + loginRegex: "(^rucode5-team-0.*|^mw-prefinals-.*|^mrc2021-.*)", +} \ No newline at end of file diff --git a/config/atcoder/abc317/advanced.json b/config/atcoder/abc317/advanced.json new file mode 100644 index 000000000..5b07cfa3e --- /dev/null +++ b/config/atcoder/abc317/advanced.json @@ -0,0 +1,11 @@ +{ "problemOverrides": { + "A": {"color": "#FF00FE"}, + "B": {"color": "#FFFFFF"}, + "C": {"color": "#9B01FF"}, + "D": {"color": "#FE0000"}, + "E": {"color": "#FFFF00"}, + "F": {"color": "#0000FE"}, + "G": {"color": "#761946"}, + "Ex": {"color": "#04FF00"} + } +} \ No newline at end of file diff --git a/config/atcoder/abc317/settings.json b/config/atcoder/abc317/settings.json new file mode 100644 index 000000000..63e50bc23 --- /dev/null +++ b/config/atcoder/abc317/settings.json @@ -0,0 +1,7 @@ +{ + "contestId": "abc317", + "type": "atcoder", + "startTime": "2023-08-26 08:00", + "contestLengthSeconds": 6000, + "sessionCookie": "$creds.atcoder_cookie" +} \ No newline at end of file diff --git a/config/atcoder/wtf22-day1/advanced.json b/config/atcoder/wtf22-day1/advanced.json new file mode 100644 index 000000000..1dfaf425f --- /dev/null +++ b/config/atcoder/wtf22-day1/advanced.json @@ -0,0 +1,33 @@ +{ + "problemOverrides": { + "wtf22_day1_a": {"color": "#FF00FE"}, + "wtf22_day1_b": {"color": "#FFFFFF"}, + "wtf22_day1_c": {"color": "#9B01FF"}, + "wtf22_day1_d": {"color": "#FE0000"}, + "wtf22_day1_e": {"color": "#FFFF00"} + }, + "scoreboardOverrides": { + "medals": [ + {"name": "gold", "count": 1}, + {"name": "silver", "count": 1}, + {"name": "bronze", "count": 1} + ] + }, + "teamMediaTemplate": { + "achievement": { + "type": "Photo", + "url": "/media/achievement/{teamId}.svg" + } + }, + "teamOverrides": { + "tourist": {"medias": {"camera": { "type": "WebRTCGrabberConnection", "url": "https://grabber.kbats.ru", "peerName": "001", "streamType": "webcam", "credential": "" }}}, + "ecnerwala": {"medias": {"camera": { "type": "WebRTCGrabberConnection", "url": "https://grabber.kbats.ru", "peerName": "002", "streamType": "webcam", "credential": "" }}}, + "ksun48": {"medias": {"camera": { "type": "WebRTCGrabberConnection", "url": "https://grabber.kbats.ru", "peerName": "004", "streamType": "webcam", "credential": "" }}}, + "LHiC": {"medias": {"camera": { "type": "WebRTCGrabberConnection", "url": "https://grabber.kbats.ru", "peerName": "007", "streamType": "webcam", "credential": "" }}}, + "mnbvmar": {"medias": {"camera": { "type": "WebRTCGrabberConnection", "url": "https://grabber.kbats.ru", "peerName": "008", "streamType": "webcam", "credential": "" }}}, + "heno239": {"medias": {"camera": { "type": "WebRTCGrabberConnection", "url": "https://grabber.kbats.ru", "peerName": "014", "streamType": "webcam", "credential": "" }}}, + "mulgokizary": {"medias": {"camera": { "type": "WebRTCGrabberConnection", "url": "https://grabber.kbats.ru", "peerName": "015", "streamType": "webcam", "credential": "" }}}, + "Mr_Eight": {"medias": {"camera": { "type": "WebRTCGrabberConnection", "url": "https://grabber.kbats.ru", "peerName": "016", "streamType": "webcam", "credential": "" }}}, + "zhoukangyang": {"medias": {"camera": { "type": "WebRTCGrabberConnection", "url": "https://grabber.kbats.ru", "peerName": "017", "streamType": "webcam", "credential": "" }}} + } +} \ No newline at end of file diff --git a/config/atcoder/wtf22-day1/media/achievement/Benq.svg b/config/atcoder/wtf22-day1/media/achievement/Benq.svg new file mode 100644 index 000000000..0d84580c2 --- /dev/null +++ b/config/atcoder/wtf22-day1/media/achievement/Benq.svg @@ -0,0 +1,45 @@ + + + + + + + + + + + + +Match participations: 48, Wins: 0, Win percentage: 0% +Benq (Benjamin Qi), 2 offset points +Birth year: 2001, Current rating: 3658, Highest rating: 3683 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/config/atcoder/wtf22-day1/media/achievement/LHiC.svg b/config/atcoder/wtf22-day1/media/achievement/LHiC.svg new file mode 100644 index 000000000..d3bf1765d --- /dev/null +++ b/config/atcoder/wtf22-day1/media/achievement/LHiC.svg @@ -0,0 +1,45 @@ + + + + + + + + + + + + +Match participations: 52, Wins: 2, Win percentage: 4% +LHiC (Mikhail Ipatov), 1 offset point +Birth year: , Current rating: 3429, Highest rating: 3812 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/config/atcoder/wtf22-day1/media/achievement/Mr_Eight.svg b/config/atcoder/wtf22-day1/media/achievement/Mr_Eight.svg new file mode 100644 index 000000000..91afb0463 --- /dev/null +++ b/config/atcoder/wtf22-day1/media/achievement/Mr_Eight.svg @@ -0,0 +1,45 @@ + + + + + + + + + + + + +Match participations: 30, Wins: 0, Win percentage: 0% +Mr_Eight (Langrui Qi), 1 offset point +Birth year: 2005, Current rating: 3140, Highest rating: 3145 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/config/atcoder/wtf22-day1/media/achievement/Petr.svg b/config/atcoder/wtf22-day1/media/achievement/Petr.svg new file mode 100644 index 000000000..5193d2419 --- /dev/null +++ b/config/atcoder/wtf22-day1/media/achievement/Petr.svg @@ -0,0 +1,45 @@ + + + + + + + + + + + + +Match participations: 58, Wins: 2, Win percentage: 3% +Petr (Petr Mitrichev), 3 offset points +Birth year: 1985, Current rating: 3392, Highest rating: 3882 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/config/atcoder/wtf22-day1/media/achievement/Stonefeang.svg b/config/atcoder/wtf22-day1/media/achievement/Stonefeang.svg new file mode 100644 index 000000000..2039d4b5a --- /dev/null +++ b/config/atcoder/wtf22-day1/media/achievement/Stonefeang.svg @@ -0,0 +1,45 @@ + + + + + + + + + + + + +Match participations: 36, Wins: 2, Win percentage: 6% +Stonefeang (Mateusz Radecki), 1 offset point +Birth year: 1997, Current rating: 3630, Highest rating: 3658 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/config/atcoder/wtf22-day1/media/achievement/Um_nik.svg b/config/atcoder/wtf22-day1/media/achievement/Um_nik.svg new file mode 100644 index 000000000..cfad5ac35 --- /dev/null +++ b/config/atcoder/wtf22-day1/media/achievement/Um_nik.svg @@ -0,0 +1,45 @@ + + + + + + + + + + + + +Match participations: 59, Wins: 7, Win percentage: 12% +Um_nik (Alexey Danilyuk), 2 offset points +Birth year: 1996, Current rating: 3648, Highest rating: 3948 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/config/atcoder/wtf22-day1/media/achievement/apiad.svg b/config/atcoder/wtf22-day1/media/achievement/apiad.svg new file mode 100644 index 000000000..e62e9528d --- /dev/null +++ b/config/atcoder/wtf22-day1/media/achievement/apiad.svg @@ -0,0 +1,45 @@ + + + + + + + + + + + + +Match participations: 50, Wins: 6, Win percentage: 12% +apiad (Yuhao Du), 3 offset points +Birth year: 1997, Current rating: 3638, Highest rating: 3852 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/config/atcoder/wtf22-day1/media/achievement/ecnerwala.svg b/config/atcoder/wtf22-day1/media/achievement/ecnerwala.svg new file mode 100644 index 000000000..f48dcce7f --- /dev/null +++ b/config/atcoder/wtf22-day1/media/achievement/ecnerwala.svg @@ -0,0 +1,45 @@ + + + + + + + + + + + + +Match participations: 35, Wins: 2, Win percentage: 6% +ecnerwala (Andrew He), 3 offset points +Birth year: 1997, Current rating: 3613, Highest rating: 3814 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/config/atcoder/wtf22-day1/media/achievement/endagorion.svg b/config/atcoder/wtf22-day1/media/achievement/endagorion.svg new file mode 100644 index 000000000..5615f9648 --- /dev/null +++ b/config/atcoder/wtf22-day1/media/achievement/endagorion.svg @@ -0,0 +1,45 @@ + + + + + + + + + + + + +Match participations: 35, Wins: 0, Win percentage: 0% +endagorion (Mikhail Tikhomirov), 1 offset point +Birth year: 1991, Current rating: 3415, Highest rating: 3431 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/config/atcoder/wtf22-day1/media/achievement/heno239.svg b/config/atcoder/wtf22-day1/media/achievement/heno239.svg new file mode 100644 index 000000000..80a88f34d --- /dev/null +++ b/config/atcoder/wtf22-day1/media/achievement/heno239.svg @@ -0,0 +1,45 @@ + + + + + + + + + + + + +Match participations: 75, Wins: 0, Win percentage: 0% +heno239 (Yuya Kadono), 1 offset point +Birth year: 1999, Current rating: 3432, Highest rating: 3456 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/config/atcoder/wtf22-day1/media/achievement/jiangly.svg b/config/atcoder/wtf22-day1/media/achievement/jiangly.svg new file mode 100644 index 000000000..cd0ce94ad --- /dev/null +++ b/config/atcoder/wtf22-day1/media/achievement/jiangly.svg @@ -0,0 +1,45 @@ + + + + + + + + + + + + +Match participations: 26, Wins: 1, Win percentage: 4% +jiangly (Jiang Lingyu), 1 offset point +Birth year: 2003, Current rating: 3446, Highest rating: 3488 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/config/atcoder/wtf22-day1/media/achievement/ksun48.svg b/config/atcoder/wtf22-day1/media/achievement/ksun48.svg new file mode 100644 index 000000000..d560f3b14 --- /dev/null +++ b/config/atcoder/wtf22-day1/media/achievement/ksun48.svg @@ -0,0 +1,45 @@ + + + + + + + + + + + + +Match participations: 57, Wins: 5, Win percentage: 9% +ksun48 (Kevin Sun), 3 offset points +Birth year: 1998, Current rating: 3679, Highest rating: 3802 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/config/atcoder/wtf22-day1/media/achievement/mnbvmar.svg b/config/atcoder/wtf22-day1/media/achievement/mnbvmar.svg new file mode 100644 index 000000000..a08a4cc17 --- /dev/null +++ b/config/atcoder/wtf22-day1/media/achievement/mnbvmar.svg @@ -0,0 +1,45 @@ + + + + + + + + + + + + +Match participations: 22, Wins: 1, Win percentage: 5% +mnbvmar (Marek Sokolowski), 2 offset points +Birth year: 1996, Current rating: 3555, Highest rating: 3736 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/config/atcoder/wtf22-day1/media/achievement/mulgokizary.svg b/config/atcoder/wtf22-day1/media/achievement/mulgokizary.svg new file mode 100644 index 000000000..f0b97c035 --- /dev/null +++ b/config/atcoder/wtf22-day1/media/achievement/mulgokizary.svg @@ -0,0 +1,45 @@ + + + + + + + + + + + + +Match participations: 28, Wins: 0, Win percentage: 0% +mulgokizary (Harris Leung), 1 offset point +Birth year: 1991, Current rating: 3340, Highest rating: 3535 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/config/atcoder/wtf22-day1/media/achievement/newbiedmy.svg b/config/atcoder/wtf22-day1/media/achievement/newbiedmy.svg new file mode 100644 index 000000000..e1acae268 --- /dev/null +++ b/config/atcoder/wtf22-day1/media/achievement/newbiedmy.svg @@ -0,0 +1,45 @@ + + + + + + + + + + + + +Match participations: 25, Wins: 1, Win percentage: 4% +newbiedmy (Mingyang Deng), 1 offset point +Birth year: 2002, Current rating: 3516, Highest rating: 3714 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/config/atcoder/wtf22-day1/media/achievement/peti1234.svg b/config/atcoder/wtf22-day1/media/achievement/peti1234.svg new file mode 100644 index 000000000..d61344a12 --- /dev/null +++ b/config/atcoder/wtf22-day1/media/achievement/peti1234.svg @@ -0,0 +1,45 @@ + + + + + + + + + + + + +Match participations: 21, Wins: 1, Win percentage: 5% +peti1234 (Péter Gyimesi), 1 offset point +Birth year: 2001, Current rating: 3123, Highest rating: 3123 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/config/atcoder/wtf22-day1/media/achievement/tourist.svg b/config/atcoder/wtf22-day1/media/achievement/tourist.svg new file mode 100644 index 000000000..7c9207876 --- /dev/null +++ b/config/atcoder/wtf22-day1/media/achievement/tourist.svg @@ -0,0 +1,45 @@ + + + + + + + + + + + + +Match participations: 58, Wins: 22, Win percentage: 38% +tourist (Gennady Korotkevich), 4 offset points +Birth year: 1994, Current rating: 3858, Highest rating: 4229 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/config/atcoder/wtf22-day1/media/achievement/zhoukangyang.svg b/config/atcoder/wtf22-day1/media/achievement/zhoukangyang.svg new file mode 100644 index 000000000..e4d278a51 --- /dev/null +++ b/config/atcoder/wtf22-day1/media/achievement/zhoukangyang.svg @@ -0,0 +1,45 @@ + + + + + + + + + + + + +Match participations: 36, Wins: 2, Win percentage: 6% +zhoukangyang (Zhou Kangyang), 1 offset point +Birth year: 2007, Current rating: 3404, Highest rating: 3430 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/config/atcoder/wtf22-day1/settings.json b/config/atcoder/wtf22-day1/settings.json new file mode 100644 index 000000000..7a3062545 --- /dev/null +++ b/config/atcoder/wtf22-day1/settings.json @@ -0,0 +1,7 @@ +{ + "contestId": "wtf22-day1", + "type": "atcoder", + "startTime": "2023-09-08 13:00", + "contestLengthSeconds": 18000, + "sessionCookie": "$creds.atcoder_cookie" +} \ No newline at end of file diff --git a/config/atcoder/wtf22-day2/advanced.json b/config/atcoder/wtf22-day2/advanced.json new file mode 100644 index 000000000..cbe4503b9 --- /dev/null +++ b/config/atcoder/wtf22-day2/advanced.json @@ -0,0 +1,33 @@ +{ + "problemOverrides": { + "wtf22_day2_a": {"color": "#FF00FE"}, + "wtf22_day2_b": {"color": "#FFFFFF"}, + "wtf22_day2_c": {"color": "#9B01FF"}, + "wtf22_day2_d": {"color": "#FE0000"}, + "wtf22_day2_e": {"color": "#FFFF00"} + }, + "scoreboardOverrides": { + "medals": [ + {"name": "gold", "count": 1}, + {"name": "silver", "count": 1}, + {"name": "bronze", "count": 1} + ] + }, + "teamMediaTemplate": { + "achievement": { + "type": "Photo", + "url": "/media/achievement/{teamId}.svg" + } + }, + "teamOverrides": { + "tourist": {"medias": {"camera": { "type": "WebRTCGrabberConnection", "url": "https://grabber.kbats.ru", "peerName": "001", "streamType": "webcam", "credential": "" }}}, + "ecnerwala": {"medias": {"camera": { "type": "WebRTCGrabberConnection", "url": "https://grabber.kbats.ru", "peerName": "002", "streamType": "webcam", "credential": "" }}}, + "ksun48": {"medias": {"camera": { "type": "WebRTCGrabberConnection", "url": "https://grabber.kbats.ru", "peerName": "004", "streamType": "webcam", "credential": "" }}}, + "LHiC": {"medias": {"camera": { "type": "WebRTCGrabberConnection", "url": "https://grabber.kbats.ru", "peerName": "007", "streamType": "webcam", "credential": "" }}}, + "mnbvmar": {"medias": {"camera": { "type": "WebRTCGrabberConnection", "url": "https://grabber.kbats.ru", "peerName": "008", "streamType": "webcam", "credential": "" }}}, + "heno239": {"medias": {"camera": { "type": "WebRTCGrabberConnection", "url": "https://grabber.kbats.ru", "peerName": "014", "streamType": "webcam", "credential": "" }}}, + "mulgokizary": {"medias": {"camera": { "type": "WebRTCGrabberConnection", "url": "https://grabber.kbats.ru", "peerName": "015", "streamType": "webcam", "credential": "" }}}, + "Mr_Eight": {"medias": {"camera": { "type": "WebRTCGrabberConnection", "url": "https://grabber.kbats.ru", "peerName": "016", "streamType": "webcam", "credential": "" }}}, + "zhoukangyang": {"medias": {"camera": { "type": "WebRTCGrabberConnection", "url": "https://grabber.kbats.ru", "peerName": "017", "streamType": "webcam", "credential": "" }}} + } +} \ No newline at end of file diff --git a/config/atcoder/wtf22-day2/media/achievement/Benq.svg b/config/atcoder/wtf22-day2/media/achievement/Benq.svg new file mode 100644 index 000000000..0d84580c2 --- /dev/null +++ b/config/atcoder/wtf22-day2/media/achievement/Benq.svg @@ -0,0 +1,45 @@ + + + + + + + + + + + + +Match participations: 48, Wins: 0, Win percentage: 0% +Benq (Benjamin Qi), 2 offset points +Birth year: 2001, Current rating: 3658, Highest rating: 3683 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/config/atcoder/wtf22-day2/media/achievement/LHiC.svg b/config/atcoder/wtf22-day2/media/achievement/LHiC.svg new file mode 100644 index 000000000..d3bf1765d --- /dev/null +++ b/config/atcoder/wtf22-day2/media/achievement/LHiC.svg @@ -0,0 +1,45 @@ + + + + + + + + + + + + +Match participations: 52, Wins: 2, Win percentage: 4% +LHiC (Mikhail Ipatov), 1 offset point +Birth year: , Current rating: 3429, Highest rating: 3812 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/config/atcoder/wtf22-day2/media/achievement/Mr_Eight.svg b/config/atcoder/wtf22-day2/media/achievement/Mr_Eight.svg new file mode 100644 index 000000000..91afb0463 --- /dev/null +++ b/config/atcoder/wtf22-day2/media/achievement/Mr_Eight.svg @@ -0,0 +1,45 @@ + + + + + + + + + + + + +Match participations: 30, Wins: 0, Win percentage: 0% +Mr_Eight (Langrui Qi), 1 offset point +Birth year: 2005, Current rating: 3140, Highest rating: 3145 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/config/atcoder/wtf22-day2/media/achievement/Petr.svg b/config/atcoder/wtf22-day2/media/achievement/Petr.svg new file mode 100644 index 000000000..5193d2419 --- /dev/null +++ b/config/atcoder/wtf22-day2/media/achievement/Petr.svg @@ -0,0 +1,45 @@ + + + + + + + + + + + + +Match participations: 58, Wins: 2, Win percentage: 3% +Petr (Petr Mitrichev), 3 offset points +Birth year: 1985, Current rating: 3392, Highest rating: 3882 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/config/atcoder/wtf22-day2/media/achievement/Stonefeang.svg b/config/atcoder/wtf22-day2/media/achievement/Stonefeang.svg new file mode 100644 index 000000000..2039d4b5a --- /dev/null +++ b/config/atcoder/wtf22-day2/media/achievement/Stonefeang.svg @@ -0,0 +1,45 @@ + + + + + + + + + + + + +Match participations: 36, Wins: 2, Win percentage: 6% +Stonefeang (Mateusz Radecki), 1 offset point +Birth year: 1997, Current rating: 3630, Highest rating: 3658 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/config/atcoder/wtf22-day2/media/achievement/Um_nik.svg b/config/atcoder/wtf22-day2/media/achievement/Um_nik.svg new file mode 100644 index 000000000..cfad5ac35 --- /dev/null +++ b/config/atcoder/wtf22-day2/media/achievement/Um_nik.svg @@ -0,0 +1,45 @@ + + + + + + + + + + + + +Match participations: 59, Wins: 7, Win percentage: 12% +Um_nik (Alexey Danilyuk), 2 offset points +Birth year: 1996, Current rating: 3648, Highest rating: 3948 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/config/atcoder/wtf22-day2/media/achievement/apiad.svg b/config/atcoder/wtf22-day2/media/achievement/apiad.svg new file mode 100644 index 000000000..e62e9528d --- /dev/null +++ b/config/atcoder/wtf22-day2/media/achievement/apiad.svg @@ -0,0 +1,45 @@ + + + + + + + + + + + + +Match participations: 50, Wins: 6, Win percentage: 12% +apiad (Yuhao Du), 3 offset points +Birth year: 1997, Current rating: 3638, Highest rating: 3852 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/config/atcoder/wtf22-day2/media/achievement/ecnerwala.svg b/config/atcoder/wtf22-day2/media/achievement/ecnerwala.svg new file mode 100644 index 000000000..f48dcce7f --- /dev/null +++ b/config/atcoder/wtf22-day2/media/achievement/ecnerwala.svg @@ -0,0 +1,45 @@ + + + + + + + + + + + + +Match participations: 35, Wins: 2, Win percentage: 6% +ecnerwala (Andrew He), 3 offset points +Birth year: 1997, Current rating: 3613, Highest rating: 3814 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/config/atcoder/wtf22-day2/media/achievement/endagorion.svg b/config/atcoder/wtf22-day2/media/achievement/endagorion.svg new file mode 100644 index 000000000..5615f9648 --- /dev/null +++ b/config/atcoder/wtf22-day2/media/achievement/endagorion.svg @@ -0,0 +1,45 @@ + + + + + + + + + + + + +Match participations: 35, Wins: 0, Win percentage: 0% +endagorion (Mikhail Tikhomirov), 1 offset point +Birth year: 1991, Current rating: 3415, Highest rating: 3431 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/config/atcoder/wtf22-day2/media/achievement/heno239.svg b/config/atcoder/wtf22-day2/media/achievement/heno239.svg new file mode 100644 index 000000000..80a88f34d --- /dev/null +++ b/config/atcoder/wtf22-day2/media/achievement/heno239.svg @@ -0,0 +1,45 @@ + + + + + + + + + + + + +Match participations: 75, Wins: 0, Win percentage: 0% +heno239 (Yuya Kadono), 1 offset point +Birth year: 1999, Current rating: 3432, Highest rating: 3456 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/config/atcoder/wtf22-day2/media/achievement/jiangly.svg b/config/atcoder/wtf22-day2/media/achievement/jiangly.svg new file mode 100644 index 000000000..cd0ce94ad --- /dev/null +++ b/config/atcoder/wtf22-day2/media/achievement/jiangly.svg @@ -0,0 +1,45 @@ + + + + + + + + + + + + +Match participations: 26, Wins: 1, Win percentage: 4% +jiangly (Jiang Lingyu), 1 offset point +Birth year: 2003, Current rating: 3446, Highest rating: 3488 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/config/atcoder/wtf22-day2/media/achievement/ksun48.svg b/config/atcoder/wtf22-day2/media/achievement/ksun48.svg new file mode 100644 index 000000000..d560f3b14 --- /dev/null +++ b/config/atcoder/wtf22-day2/media/achievement/ksun48.svg @@ -0,0 +1,45 @@ + + + + + + + + + + + + +Match participations: 57, Wins: 5, Win percentage: 9% +ksun48 (Kevin Sun), 3 offset points +Birth year: 1998, Current rating: 3679, Highest rating: 3802 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/config/atcoder/wtf22-day2/media/achievement/mnbvmar.svg b/config/atcoder/wtf22-day2/media/achievement/mnbvmar.svg new file mode 100644 index 000000000..a08a4cc17 --- /dev/null +++ b/config/atcoder/wtf22-day2/media/achievement/mnbvmar.svg @@ -0,0 +1,45 @@ + + + + + + + + + + + + +Match participations: 22, Wins: 1, Win percentage: 5% +mnbvmar (Marek Sokolowski), 2 offset points +Birth year: 1996, Current rating: 3555, Highest rating: 3736 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/config/atcoder/wtf22-day2/media/achievement/mulgokizary.svg b/config/atcoder/wtf22-day2/media/achievement/mulgokizary.svg new file mode 100644 index 000000000..f0b97c035 --- /dev/null +++ b/config/atcoder/wtf22-day2/media/achievement/mulgokizary.svg @@ -0,0 +1,45 @@ + + + + + + + + + + + + +Match participations: 28, Wins: 0, Win percentage: 0% +mulgokizary (Harris Leung), 1 offset point +Birth year: 1991, Current rating: 3340, Highest rating: 3535 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/config/atcoder/wtf22-day2/media/achievement/newbiedmy.svg b/config/atcoder/wtf22-day2/media/achievement/newbiedmy.svg new file mode 100644 index 000000000..e1acae268 --- /dev/null +++ b/config/atcoder/wtf22-day2/media/achievement/newbiedmy.svg @@ -0,0 +1,45 @@ + + + + + + + + + + + + +Match participations: 25, Wins: 1, Win percentage: 4% +newbiedmy (Mingyang Deng), 1 offset point +Birth year: 2002, Current rating: 3516, Highest rating: 3714 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/config/atcoder/wtf22-day2/media/achievement/peti1234.svg b/config/atcoder/wtf22-day2/media/achievement/peti1234.svg new file mode 100644 index 000000000..d61344a12 --- /dev/null +++ b/config/atcoder/wtf22-day2/media/achievement/peti1234.svg @@ -0,0 +1,45 @@ + + + + + + + + + + + + +Match participations: 21, Wins: 1, Win percentage: 5% +peti1234 (Péter Gyimesi), 1 offset point +Birth year: 2001, Current rating: 3123, Highest rating: 3123 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/config/atcoder/wtf22-day2/media/achievement/tourist.svg b/config/atcoder/wtf22-day2/media/achievement/tourist.svg new file mode 100644 index 000000000..7c9207876 --- /dev/null +++ b/config/atcoder/wtf22-day2/media/achievement/tourist.svg @@ -0,0 +1,45 @@ + + + + + + + + + + + + +Match participations: 58, Wins: 22, Win percentage: 38% +tourist (Gennady Korotkevich), 4 offset points +Birth year: 1994, Current rating: 3858, Highest rating: 4229 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/config/atcoder/wtf22-day2/media/achievement/zhoukangyang.svg b/config/atcoder/wtf22-day2/media/achievement/zhoukangyang.svg new file mode 100644 index 000000000..e4d278a51 --- /dev/null +++ b/config/atcoder/wtf22-day2/media/achievement/zhoukangyang.svg @@ -0,0 +1,45 @@ + + + + + + + + + + + + +Match participations: 36, Wins: 2, Win percentage: 6% +zhoukangyang (Zhou Kangyang), 1 offset point +Birth year: 2007, Current rating: 3404, Highest rating: 3430 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/config/atcoder/wtf22-day2/settings.json b/config/atcoder/wtf22-day2/settings.json new file mode 100644 index 000000000..3617df76d --- /dev/null +++ b/config/atcoder/wtf22-day2/settings.json @@ -0,0 +1,7 @@ +{ + "contestId": "wtf22-day2", + "type": "atcoder", + "startTime": "2023-09-09 13:00", + "contestLengthSeconds": 18000, + "sessionCookie": "$creds.atcoder_cookie" +} \ No newline at end of file diff --git a/config/bsuir/2022/events.properties b/config/bsuir/2022/events.properties deleted file mode 100644 index ba56e3dce..000000000 --- a/config/bsuir/2022/events.properties +++ /dev/null @@ -1,10 +0,0 @@ -# 1. Register an application here: https://oauth.yandex.ru -# - Choose Web services -# - Tap Set URL for development -# - Add permission Yandex Contest -> Send and evaluate submissions in contests (contest:submit) -# 2. Get debug token: https://yandex.ru/dev/id/doc/dg/oauth/tasks/get-oauth-token.html - -yandex.token=$creds.yandex -yandex.contest_id=37013 -yandex.login_prefix=(^open-x-reload-.*) -standings.type=YANDEX \ No newline at end of file diff --git a/config/bsuir/2022/settings.json b/config/bsuir/2022/settings.json new file mode 100644 index 000000000..0d6eae968 --- /dev/null +++ b/config/bsuir/2022/settings.json @@ -0,0 +1,8 @@ +{ + "type": "yandex", + "apiKey": "$creds.yandex", + "contestId": 37013, + "loginRegex": "^open-x-reload-.*" +} + + diff --git a/config/ceoi/2022/advanced.json b/config/ceoi/2022/advanced.json new file mode 100644 index 000000000..93b934890 --- /dev/null +++ b/config/ceoi/2022/advanced.json @@ -0,0 +1,44 @@ +{ + "problemOverrides": { + "SC2022CEOI13prize": { + "displayName": "A1" + }, + "SC2022CEOI11abracadabra": { + "displayName": "B1" + }, + "SC2022CEOI12homework": { + "displayName": "C1" + }, + "SC2022CEOI22measures": { + "displayName": "A2" + }, + "SC2022CEOI21drawing": { + "displayName": "B2" + }, + "SC2022CEOI23parking": { + "displayName": "C2" + } + }, + "scoreboardOverrides": { + "medals": [ + { + "name": "gold", + "count": 5, + "tiebreakMode": "ALL" + }, + { + "name": "silver", + "count": 8, + "tiebreakMode": "ALL" + }, + { + "name": "bronze", + "count": 12, + "tiebreakMode": "NONE" + } + ] + }, + "teamOverrideTemplate": { + "displayName": "[{country}] {first_name} {last_name}" + } +} \ No newline at end of file diff --git a/config/ceoi/2022/settings.json b/config/ceoi/2022/settings.json new file mode 100644 index 000000000..1bedcc8a4 --- /dev/null +++ b/config/ceoi/2022/settings.json @@ -0,0 +1,10 @@ +{ + "type": "cms", + "activeContest": "ceoi22_5f2", + "otherContests": ["ceoi22_5f1"], + "url": "https://ceoi.hsin.hr/ranking/", + "emulation": { + "speed": 3, + "startTime": "now" + } + } \ No newline at end of file diff --git a/config/cf/1778/events.properties b/config/cf/1778/events.properties deleted file mode 100644 index 6975ee29a..000000000 --- a/config/cf/1778/events.properties +++ /dev/null @@ -1,4 +0,0 @@ -cf.api.key=$creds.codeforces_key -cf.api.secret=$creds.codeforces_secret -contest_id=1778 -standings.type=CF diff --git a/config/cf/1778/settings.json b/config/cf/1778/settings.json new file mode 100644 index 000000000..9863a3d9d --- /dev/null +++ b/config/cf/1778/settings.json @@ -0,0 +1,6 @@ +{ + "type": "cf", + "apiKey": "$creds.codeforces_key", + "apiSecret": "$creds.codeforces_secret", + "contestId": 1778 +} \ No newline at end of file diff --git a/config/chu/2023/d1/events.properties b/config/chu/2023/d1/events.properties deleted file mode 100644 index a80fb42fe..000000000 --- a/config/chu/2023/d1/events.properties +++ /dev/null @@ -1,3 +0,0 @@ -standings.type=EJUDGE -url=https://timus.online/admin/spacelog.aspx/log-2.xml?space=1499&action=getejudgelog -timusSessionId=123 \ No newline at end of file diff --git a/config/chu/2023/d1/settings.json b/config/chu/2023/d1/settings.json new file mode 100644 index 000000000..4de6886be --- /dev/null +++ b/config/chu/2023/d1/settings.json @@ -0,0 +1,5 @@ +{ + "type":"ejudge", + "url":"https://timus.online/admin/spacelog.aspx/log-2.xml?space=1499&action=getejudgelog", + "#timusSessionId":"123" +} \ No newline at end of file diff --git a/config/chu/2023/d2/events.properties b/config/chu/2023/d2/events.properties deleted file mode 100644 index 22cbfe2b8..000000000 --- a/config/chu/2023/d2/events.properties +++ /dev/null @@ -1,3 +0,0 @@ -standings.type=EJUDGE -url=https://timus.online/admin/spacelog.aspx/log-2.xml?space=1500&action=getejudgelog -timusSessionId=123 \ No newline at end of file diff --git a/config/chu/2023/d2/settings.json b/config/chu/2023/d2/settings.json new file mode 100644 index 000000000..5eb882881 --- /dev/null +++ b/config/chu/2023/d2/settings.json @@ -0,0 +1,5 @@ +{ + "type":"ejudge", + "url":"https://timus.online/admin/spacelog.aspx/log-2.xml?space=1500&action=getejudgelog", + "#timusSessionId":"123" +} \ No newline at end of file diff --git a/config/chu/2023/dress/events.properties b/config/chu/2023/dress/events.properties deleted file mode 100644 index 7955cc2b0..000000000 --- a/config/chu/2023/dress/events.properties +++ /dev/null @@ -1,3 +0,0 @@ -standings.type=EJUDGE -url=https://timus.online/admin/spacelog.aspx/log-2.xml?space=1498&action=getejudgelog -timusSessionId=123 \ No newline at end of file diff --git a/config/chu/2023/dress/settings.json b/config/chu/2023/dress/settings.json new file mode 100644 index 000000000..383e5b155 --- /dev/null +++ b/config/chu/2023/dress/settings.json @@ -0,0 +1,5 @@ +{ + "type":"ejudge", + "url":"https://timus.online/admin/spacelog.aspx/log-2.xml?space=1498&action=getejudgelog", + "#timusSessionId":"123" +} \ No newline at end of file diff --git a/config/code-work/2023/main-tour/advanced.json b/config/code-work/2023/main-tour/advanced.json index 6e2ac11e7..dbea2f3bf 100644 --- a/config/code-work/2023/main-tour/advanced.json +++ b/config/code-work/2023/main-tour/advanced.json @@ -41,4 +41,4 @@ "color": "#45BEC6" } } -}, \ No newline at end of file +} \ No newline at end of file diff --git a/config/code-work/2023/main-tour/events.properties b/config/code-work/2023/main-tour/events.properties deleted file mode 100644 index 574afc1af..000000000 --- a/config/code-work/2023/main-tour/events.properties +++ /dev/null @@ -1,7 +0,0 @@ -url=https://imcs.dvfu.ru/cats -cid=6715954 -standings.type=CATS -timezone=UTC+10 -standings.resultType=ICPC -login=$creds.cats.login -password=$creds.cats.password diff --git a/config/code-work/2023/main-tour/settings.json b/config/code-work/2023/main-tour/settings.json new file mode 100644 index 000000000..52db22cde --- /dev/null +++ b/config/code-work/2023/main-tour/settings.json @@ -0,0 +1,9 @@ +{ + "type":"cats", + "url":"https://imcs.dvfu.ru/cats", + "cid":"6715954", + "timeZone":"UTC+10", + "resultType":"ICPC", + "login":"$creds.cats_login", + "password":"$creds.cats_password" +} \ No newline at end of file diff --git a/config/code-work/2023/test/events.properties b/config/code-work/2023/test/events.properties deleted file mode 100644 index 31f040ef0..000000000 --- a/config/code-work/2023/test/events.properties +++ /dev/null @@ -1,10 +0,0 @@ -url=https://imcs.dvfu.ru/cats -cid=6715945 -standings.type=CATS -timezone=UTC+9 -standings.resultType=ICPC -login=$creds.cats.login -password=$creds.cats.password - -emulation.speed=10 -emulation.startTime=now diff --git a/config/code-work/2023/test/settings.json b/config/code-work/2023/test/settings.json new file mode 100644 index 000000000..806988230 --- /dev/null +++ b/config/code-work/2023/test/settings.json @@ -0,0 +1,10 @@ +{ + "type":"cats", + "url":"https://imcs.dvfu.ru/cats", + "cid":"6715945", + "timeZone":"UTC+10", + "resultType":"ICPC", + "login":"$creds.cats_login", + "password":"$creds.cats_password" +} + diff --git a/config/code-work/2023/testTour/events.properties b/config/code-work/2023/testTour/events.properties deleted file mode 100644 index 5460aac27..000000000 --- a/config/code-work/2023/testTour/events.properties +++ /dev/null @@ -1,7 +0,0 @@ -url=https://imcs.dvfu.ru/cats -cid=6747059 -standings.type=CATS -timezone=UTC+9 -standings.resultType=ICPC -login=$creds.cats.login -password=$creds.cats.password diff --git a/config/code-work/2023/testTour/settings.json b/config/code-work/2023/testTour/settings.json new file mode 100644 index 000000000..df4910e91 --- /dev/null +++ b/config/code-work/2023/testTour/settings.json @@ -0,0 +1,10 @@ +{ + "type":"cats", + "url":"https://imcs.dvfu.ru/cats", + "cid":"6747059", + "timeZone":"UTC+10", + "resultType":"ICPC", + "login":"$creds.cats_login", + "password":"$creds.cats_password" +} + \ No newline at end of file diff --git a/config/cpfed-kz/2023-singles/advanced.json b/config/cpfed-kz/2023-singles/advanced.json new file mode 100644 index 000000000..dc43aaa4f --- /dev/null +++ b/config/cpfed-kz/2023-singles/advanced.json @@ -0,0 +1,63 @@ +{ + + "problemOverrides": { + "A":{"color":"#e6194B"}, + "B":{"color":"#3cb44b"}, + "C":{"color":"#ffe119"}, + "D":{"color":"#4363d8"}, + "E":{"color":"#f58231"}, + "F":{"color":"#42d4f4"}, + "G":{"color":"#f032e6"}, + "H":{"color":"#fabed4"}, + "I":{"color":"#469990"} + }, + "scoreboardOverrides": { + "medals": [ + {"name": "gold", "count": 1}, + {"name": "silver", "count": 3}, + {"name": "bronze", "count": 11} + ] + }, + "teamOverrides": { + "g20812=user01": {"groups": ["Алматы"]}, + "g20812=user02": {"groups": ["Астана"]}, + "g20812=user03": {"groups": ["Алматы"]}, + "g20812=user04": {"groups": ["не в Казахстане"]}, + "g20812=user05": {"groups": ["Астана"]}, + "g20812=user06": {"groups": ["Астана"]}, + "g20812=user07": {"groups": ["Алматы"]}, + "g20812=user08": {"groups": ["Астана"]}, + "g20812=user09": {"groups": ["Абайская область"]}, + "g20812=user10": {"groups": ["Карагандинская область"]}, + "g20812=user11": {"groups": ["Алматы"]}, + "g20812=user12": {"groups": ["Алматы"]}, + "g20812=user13": {"groups": ["Алматы"]}, + "g20812=user14": {"groups": ["Астана"]}, + "g20812=user15": {"groups": ["Астана"]}, + "g20812=user16": {"groups": ["Алматы"]}, + "g20812=user17": {"groups": ["не в Казахстане"]}, + "g20812=user18": {"groups": ["Алматы"]}, + "g20812=user19": {"groups": ["Алматы"]}, + "g20812=user20": {"groups": ["Алматы"]}, + "g20812=user21": {"groups": ["Алматы"]}, + "g20812=user22": {"groups": ["Алматы"]}, + "g20812=user23": {"groups": ["Алматы"]}, + "g20812=user24": {"groups": ["Алматы"]}, + "g20812=user25": {"groups": ["Алматы"]}, + "g20812=user26": {"groups": ["не в Казахстане"]}, + "g20812=user27": {"groups": ["Алматы"]}, + "g20812=user28": {"groups": ["Астана"]}, + "g20812=user29": {"groups": ["Алматы"]}, + "g20812=user30": {"groups": ["Атырауская область"]}, + "g20812=user31": {"groups": ["Мангистауская область"]}, + "g20812=user32": {"groups": ["Алматинская область"]}, + "g20812=user33": {"groups": ["Кызылординская область"]}, + "g20812=user34": {"groups": ["Павлодарская область"]}, + "g20812=user35": {"groups": ["Павлодарская область"]}, + "g20812=user36": {"groups": ["Карагандинская область"]}, + "g20812=user37": {"groups": ["Карагандинская область"]}, + "g20812=user38": {"groups": ["Астана"]}, + "g20812=user39": {"groups": ["Астана"]}, + "g20812=user40": {"groups": ["Алматы"]} + } +} \ No newline at end of file diff --git a/config/cpfed-kz/2023-singles/settings.json b/config/cpfed-kz/2023-singles/settings.json new file mode 100644 index 000000000..e76bdba33 --- /dev/null +++ b/config/cpfed-kz/2023-singles/settings.json @@ -0,0 +1,7 @@ +{ + "type": "cf", + "#comment":"Insert api key and secret from https://codeforces.com/settings/api below", + "apiKey": "$creds.codeforces_key", + "apiSecret": "$creds.codeforces_secret", + "contestId": 466369 +} diff --git a/config/fed/2023-voronezh/advanced.json b/config/fed/2023-voronezh/advanced.json index 83e3eeb22..58bd6ee65 100644 --- a/config/fed/2023-voronezh/advanced.json +++ b/config/fed/2023-voronezh/advanced.json @@ -1,218 +1,218 @@ { - "startTime": "Thu Apr 27 10:50:00 MSK 2023", + "startTime": "2023-04-27 10:50:00", "freezeTimeSeconds": 14400, "teamOverrides": { "7001": { - "name": "ВолгГТУ 1 (Чупинин, Сафошкин, Олейников))", - "shortname": "ВолгГТУ 1", + "fullName": "ВолгГТУ 1 (Чупинин, Сафошкин, Олейников))", + "displayName": "ВолгГТУ 1", "groups": [ ], "medias": { } }, "7002": { - "name": "ВолгГТУ 2 (Железняков, Ковальчук, Никонов)", - "shortname": "ВолгГТУ 2", + "fullName": "ВолгГТУ 2 (Железняков, Ковальчук, Никонов)", + "displayName": "ВолгГТУ 2", "groups": [ ], "medias": { } }, "7003": { - "name": "УУНиТ (Парфенов, Татьянин, Зайцев)", - "shortname": "УУНиТ", + "fullName": "УУНиТ (Парфенов, Татьянин, Зайцев)", + "displayName": "УУНиТ", "groups": [ ], "medias": { } }, "7004": { - "name": "ЮФУ (Жуйков, Лавшонок)", - "shortname": "ЮФУ", + "fullName": "ЮФУ (Жуйков, Лавшонок)", + "displayName": "ЮФУ", "groups": [ ], "medias": { } }, "7005": { - "name": "СмолГУ (Гращенков, Солдатов, Моторин)", - "shortname": "СмолГУ", + "fullName": "СмолГУ (Гращенков, Солдатов, Моторин)", + "displayName": "СмолГУ", "groups": [ ], "medias": { } }, "7006": { - "name": "ОрёлГУ (Каширин, Никулин, Яковлев)", - "shortname": "ОрёлГУ", + "fullName": "ОрёлГУ (Каширин, Никулин, Яковлев)", + "displayName": "ОрёлГУ", "groups": [ ], "medias": { } }, "7007": { - "name": "СурГУ (Бородин, Куанчилеев, Бельтюков)", - "shortname": "СурГУ", + "fullName": "СурГУ (Бородин, Куанчилеев, Бельтюков)", + "displayName": "СурГУ", "groups": [ ], "medias": { } }, "7008": { - "name": "ИТМО (Кутасин, Сенькин, Хритоненко)", - "shortname": "ИТМО", + "fullName": "ИТМО (Кутасин, Сенькин, Хритоненко)", + "displayName": "ИТМО", "groups": [ ], "medias": { } }, "7009": { - "name": "ПенГУ 1 (Калугин, Свинарев, Кареев)", - "shortname": "ПенГУ 1", + "fullName": "ПенГУ 1 (Калугин, Свинарев, Кареев)", + "displayName": "ПенГУ 1", "groups": [ ], "medias": { } }, "7010": { - "name": "ПенГУ 2 (Гришин, Дорофеев, Абузяров)", - "shortname": "ПенГУ 2", + "fullName": "ПенГУ 2 (Гришин, Дорофеев, Абузяров)", + "displayName": "ПенГУ 2", "groups": [ ], "medias": { } }, "7011": { - "name": "ВУНЦ ВВА 1 (Ижан, Золотов, Орочко)", - "shortname": "ВУНЦ ВВА 1", + "fullName": "ВУНЦ ВВА 1 (Ижан, Золотов, Орочко)", + "displayName": "ВУНЦ ВВА 1", "groups": [ ], "medias": { } }, "7012": { - "name": "ВУНЦ ВВА 2 (Порядин, Шемко, Шерстяных)", - "shortname": "ВУНЦ ВВА 2", + "fullName": "ВУНЦ ВВА 2 (Порядин, Шемко, Шерстяных)", + "displayName": "ВУНЦ ВВА 2", "groups": [ ], "medias": { } }, "7013": { - "name": "ВГТУ 1 (Дедов, Цурихин, Чередников)", - "shortname": "ВГТУ 1", + "fullName": "ВГТУ 1 (Дедов, Цурихин, Чередников)", + "displayName": "ВГТУ 1", "groups": [ ], "medias": { } }, "7014": { - "name": "ВГУ 1 (Бережнов, Новоточинов, Шишко)", - "shortname": "ВГУ 1", + "fullName": "ВГУ 1 (Бережнов, Новоточинов, Шишко)", + "displayName": "ВГУ 1", "groups": [ ], "medias": { } }, "7015": { - "name": "ВГУ 2 (Скарга, Рогачёв, Улезько)", - "shortname": "ВГУ 2", + "fullName": "ВГУ 2 (Скарга, Рогачёв, Улезько)", + "displayName": "ВГУ 2", "groups": [ ], "medias": { } }, "7016": { - "name": "МелГУ (Тимиров, Чепурной)", - "shortname": "МелГУ", + "fullName": "МелГУ (Тимиров, Чепурной)", + "displayName": "МелГУ", "groups": [ ], "medias": { } }, "7017": { - "name": "Иннополис ИУ (Печерский, Хайруллин, Дюдин)", - "shortname": "Иннополис ИУ", + "fullName": "Иннополис ИУ (Печерский, Хайруллин, Дюдин)", + "displayName": "Иннополис ИУ", "groups": [ ], "medias": { } }, "7018": { - "name": "ТверГУ (Герасимов, Дёмин, Новиков)", - "shortname": "ТверГУ", + "fullName": "ТверГУ (Герасимов, Дёмин, Новиков)", + "displayName": "ТверГУ", "groups": [ ], "medias": { } }, "7019": { - "name": "МФТИ (Агох, Бобров, Дивильковский)", - "shortname": "МФТИ", + "fullName": "МФТИ (Агох, Бобров, Дивильковский)", + "displayName": "МФТИ", "groups": [ ], "medias": { } }, "7020": { - "name": "СГУ (Родин, Москвитин, Сухова)", - "shortname": "СГУ", + "fullName": "СГУ (Родин, Москвитин, Сухова)", + "displayName": "СГУ", "groups": [ ], "medias": { } }, "7021": { - "name": "РГРГУ (Харитонов, Воробьёв, Двойнин)", - "shortname": "РГРГУ", + "fullName": "РГРГУ (Харитонов, Воробьёв, Двойнин)", + "displayName": "РГРГУ", "groups": [ ], "medias": { } }, "7022": { - "name": "ОГУ (Курынов, Белый, Сукманюк)", - "shortname": "ОГУ", + "fullName": "ОГУ (Курынов, Белый, Сукманюк)", + "displayName": "ОГУ", "groups": [ ], "medias": { } }, "7023": { - "name": "НовГУ (Антонов, Тенькаев, Михайлов)", - "shortname": "НовГУ", + "fullName": "НовГУ (Антонов, Тенькаев, Михайлов)", + "displayName": "НовГУ", "groups": [ ], "medias": { } }, "7024": { - "name": "МИСиС 1 (Лёвшин, Фёдоров, Шалимов)", - "shortname": "МИСиС 1", + "fullName": "МИСиС 1 (Лёвшин, Фёдоров, Шалимов)", + "displayName": "МИСиС 1", "groups": [ ], "medias": { } }, "7025": { - "name": "МИСиС 2 (Акманов, Волков, Стрючков)", - "shortname": "МИСиС 2", + "fullName": "МИСиС 2 (Акманов, Волков, Стрючков)", + "displayName": "МИСиС 2", "groups": [ ], "medias": { } }, "7026": { - "name": "МИФИ (Боголюбов, Гуков, Захаров)", - "shortname": "МИФИ", + "fullName": "МИФИ (Боголюбов, Гуков, Захаров)", + "displayName": "МИФИ", "groups": [ ], "medias": { } }, "7027": { - "name": "ЧГУ (Уматкереев, Гишлакаев, Асабаев)", - "shortname": "ЧГУ", + "fullName": "ЧГУ (Уматкереев, Гишлакаев, Асабаев)", + "displayName": "ЧГУ", "groups": [ ], "medias": { @@ -221,28 +221,28 @@ }, "problemOverrides": { "A": { - "name": "Аналитические выкладки" + "fullName": "Аналитические выкладки" }, "B": { - "name": "Бросаем на заказ" + "fullName": "Бросаем на заказ" }, "C": { - "name": "Выбор нумерации" + "fullName": "Выбор нумерации" }, "D": { - "name": "Гольф" + "fullName": "Гольф" }, "E": { - "name": "Двигайся оптимально" + "fullName": "Двигайся оптимально" }, "F": { - "name": "Есть ли простое продолжение?" + "fullName": "Есть ли простое продолжение?" }, "G": { - "name": "Ёлки... Забыл пароль..." + "fullName": "Ёлки... Забыл пароль..." }, "H": { - "name": "Журналистское расследование" + "fullName": "Журналистское расследование" } }, "scoreboardOverrides": { diff --git a/config/fed/2023-voronezh/settings.json b/config/fed/2023-voronezh/settings.json new file mode 100644 index 000000000..07c7c3f45 --- /dev/null +++ b/config/fed/2023-voronezh/settings.json @@ -0,0 +1,4 @@ +{ + "type":"ejudge", + "url":"http://ioi-russia.vdi.mipt.ru/~ejudge/voronezh2023day1.xml" +} diff --git a/config/icpc-bapc/2022/events.properties b/config/icpc-bapc/2022/events.properties deleted file mode 100644 index 29ae339d9..000000000 --- a/config/icpc-bapc/2022/events.properties +++ /dev/null @@ -1,4 +0,0 @@ -login=$creds.login -password=$creds.password -url=https://cds.gehack.nl/api/contests/bapc2022 -standings.type=CLICS diff --git a/config/icpc-bapc/2022/settings.json b/config/icpc-bapc/2022/settings.json new file mode 100644 index 000000000..1d2821a86 --- /dev/null +++ b/config/icpc-bapc/2022/settings.json @@ -0,0 +1,6 @@ +{ + "type":"clics", + "login":"$creds.login", + "password":"$creds.password", + "url":"https://cds.gehack.nl/api/contests/bapc2022" +} diff --git a/config/icpc-challenge/2022/events.properties b/config/icpc-challenge/2022/events.properties deleted file mode 100644 index dbf48ee98..000000000 --- a/config/icpc-challenge/2022/events.properties +++ /dev/null @@ -1,4 +0,0 @@ -cf.api.key=$creds.codeforces_key -cf.api.secret=$creds.codeforces_secret -contest_id=1757 -standings.type=CF diff --git a/config/icpc-challenge/2022/settings.json b/config/icpc-challenge/2022/settings.json new file mode 100644 index 000000000..d4206aa9a --- /dev/null +++ b/config/icpc-challenge/2022/settings.json @@ -0,0 +1,6 @@ +{ + "type": "cf", + "apiKey": "$creds.codeforces_key", + "apiSecret": "$creds.codeforces_secret", + "contestId": 1757 +} diff --git a/config/icpc-challenge/2023-spring/events.properties b/config/icpc-challenge/2023-spring/events.properties deleted file mode 100644 index 8d9c1cb44..000000000 --- a/config/icpc-challenge/2023-spring/events.properties +++ /dev/null @@ -1,4 +0,0 @@ -cf.api.key=$creds.codeforces_key -cf.api.secret=$creds.codeforces_secret -contest_id=1813 -standings.type=CF diff --git a/config/icpc-challenge/2023-spring/settings.json b/config/icpc-challenge/2023-spring/settings.json new file mode 100644 index 000000000..ff45ad4f1 --- /dev/null +++ b/config/icpc-challenge/2023-spring/settings.json @@ -0,0 +1,6 @@ +{ + "type": "cf", + "apiKey": "$creds.codeforces_key", + "apiSecret": "$creds.codeforces_secret", + "contestId": 1813 +} \ No newline at end of file diff --git a/config/icpc-mrc/2021/events.properties b/config/icpc-mrc/2021/events.properties deleted file mode 100644 index b0600b1b0..000000000 --- a/config/icpc-mrc/2021/events.properties +++ /dev/null @@ -1,9 +0,0 @@ -# 1. Register an application here: https://oauth.yandex.ru -# - Choose Web services -# - Tap Set URL for development -# - Add permission Yandex Contest -> Send and evaluate submissions in contests (contest:submit) -# 2. Get debug token: https://yandex.ru/dev/id/doc/dg/oauth/tasks/get-oauth-token.html -yandex.token=$creds.yandex -yandex.contest_id=37430 -yandex.login_prefix=(^mrc2021-team.*) -standings.type=YANDEX \ No newline at end of file diff --git a/config/icpc-mrc/2021/settings.json b/config/icpc-mrc/2021/settings.json new file mode 100644 index 000000000..d168d926c --- /dev/null +++ b/config/icpc-mrc/2021/settings.json @@ -0,0 +1,6 @@ +{ + "type": "yandex", + "apiKey": "$creds.yandex", + "contestId": 37430, + "loginRegex": "(^mrc2021-team.*)" +} diff --git a/config/icpc-mrc/2022/events.properties b/config/icpc-mrc/2022/events.properties deleted file mode 100644 index 18125236d..000000000 --- a/config/icpc-mrc/2022/events.properties +++ /dev/null @@ -1,9 +0,0 @@ -# 1. Register an application here: https://oauth.yandex.ru -# - Choose Web services -# - Tap Set URL for development -# - Add permission Yandex Contest -> Send and evaluate submissions in contests (contest:submit) -# 2. Get debug token: https://yandex.ru/dev/id/doc/dg/oauth/tasks/get-oauth-token.html -yandex.token=$creds.yandex -yandex.contest_id=42753 -yandex.login_prefix=(^mrc2022finals-.*) -standings.type=YANDEX \ No newline at end of file diff --git a/config/icpc-mrc/2022/settings.json b/config/icpc-mrc/2022/settings.json new file mode 100644 index 000000000..412530c95 --- /dev/null +++ b/config/icpc-mrc/2022/settings.json @@ -0,0 +1,6 @@ +{ + "type": "yandex", + "apiKey": "$creds.yandex", + "contestId": 42753, + "loginRegex": "(^mrc2022finals-.*)" +} diff --git a/config/icpc-nac/2022/practice4/events.properties b/config/icpc-nac/2022/practice4/events.properties deleted file mode 100644 index 131b57458..000000000 --- a/config/icpc-nac/2022/practice4/events.properties +++ /dev/null @@ -1,8 +0,0 @@ -login=$creds.kattis_login -password=$creds.kattis_token -url=https://open.kattis.com/clics-api/contests/nac22practice4 -standings.type=CLICS -feed_version=2020_03 - -#emulation.speed=10 -#emulation.startTime=now \ No newline at end of file diff --git a/config/icpc-nac/2022/practice4/settings.json b/config/icpc-nac/2022/practice4/settings.json new file mode 100644 index 000000000..b3a1a59f5 --- /dev/null +++ b/config/icpc-nac/2022/practice4/settings.json @@ -0,0 +1,8 @@ +{ + "login":"$creds.kattis_login", + "password":"$creds.kattis_token", + "url":"https://open.kattis.com/clics-api/contests/nac22practice4", + "type":"clics", + "feedVersion":"2020_03", + "emulation": { "speed": 10, "startTime": "now"} +} \ No newline at end of file diff --git a/config/icpc-nac/2023/contest/events.properties b/config/icpc-nac/2023/contest/events.properties deleted file mode 100644 index 1954f52e9..000000000 --- a/config/icpc-nac/2023/contest/events.properties +++ /dev/null @@ -1,7 +0,0 @@ -login=$creds.cds_login -password=$creds.cds_password -url=https://10.3.3.207/api/contests/NAC-2023-real -standings.type=CLICS -use_team_names=false - -#media_base_url=http://10.3.3.207/api \ No newline at end of file diff --git a/config/icpc-nac/2023/contest/settings.json b/config/icpc-nac/2023/contest/settings.json new file mode 100644 index 000000000..0a67829d5 --- /dev/null +++ b/config/icpc-nac/2023/contest/settings.json @@ -0,0 +1,9 @@ +{ + "type":"clics", + "login":"$creds.cds_login", + "password":"$creds.cds_password", + "url":"https://10.3.3.207/api/contests/NAC-2023-real", + "useTeamNames":false, + + "#media_base_url":"http://10.3.3.207/api" +} \ No newline at end of file diff --git a/config/icpc-nac/2023/dr/events.properties b/config/icpc-nac/2023/dr/events.properties deleted file mode 100644 index d69a087ff..000000000 --- a/config/icpc-nac/2023/dr/events.properties +++ /dev/null @@ -1,7 +0,0 @@ -login=$creds.cds_login -password=$creds.cds_password -url=https://10.3.3.207/api/contests/NAC-2023-dress -standings.type=CLICS -use_team_names=false - -#media_base_url=http://10.3.3.207/api \ No newline at end of file diff --git a/config/icpc-nac/2023/dr/settings.json b/config/icpc-nac/2023/dr/settings.json new file mode 100644 index 000000000..8d9c8ca8b --- /dev/null +++ b/config/icpc-nac/2023/dr/settings.json @@ -0,0 +1,10 @@ +{ + "type":"clics", + "login":"$creds.cds_login", + "password":"$creds.cds_password", + "url":"https://10.3.3.207/api/contests/NAC-2023-dress", + "useTeamNames": false, + + "#media_base_url":"http://10.3.3.207/api" +} + diff --git a/config/icpc-nac/2023/test1/events.properties b/config/icpc-nac/2023/test1/events.properties deleted file mode 100644 index bf4007989..000000000 --- a/config/icpc-nac/2023/test1/events.properties +++ /dev/null @@ -1,7 +0,0 @@ -login=$creds.cds_login -password=$creds.cds_password -url=https://10.3.3.207/api/contests/NAC-2023-test1 -standings.type=CLICS - -#emulation.speed=10 -#emulation.startTime=now \ No newline at end of file diff --git a/config/icpc-nac/2023/test1/settings.json b/config/icpc-nac/2023/test1/settings.json new file mode 100644 index 000000000..b477b0a1f --- /dev/null +++ b/config/icpc-nac/2023/test1/settings.json @@ -0,0 +1,8 @@ +{ + "type": "clics", + "login": "$creds.cds_login", + "password": "$creds.cds_password", + "url": "https://10.3.3.207/api/contests/NAC-2023-test1", + "useTeamNames": false, + "#media_base_url": "http://10.3.3.207/api" +} diff --git a/config/icpc-nac/2023/test2/events.properties b/config/icpc-nac/2023/test2/events.properties deleted file mode 100644 index d4d96005d..000000000 --- a/config/icpc-nac/2023/test2/events.properties +++ /dev/null @@ -1,8 +0,0 @@ -login=$creds.cds_login -password=$creds.cds_password -url=https://10.3.3.207/api/contests/NAC-2023-test2 -standings.type=CLICS -media_base_url=http://10.3.3.207/api - -#emulation.speed=10 -#emulation.startTime=now \ No newline at end of file diff --git a/config/icpc-nac/2023/test2/settings.json b/config/icpc-nac/2023/test2/settings.json new file mode 100644 index 000000000..20f8d8d74 --- /dev/null +++ b/config/icpc-nac/2023/test2/settings.json @@ -0,0 +1,10 @@ +{ + "type":"clics", + "login":"$creds.cds_login", + "password":"$creds.cds_password", + "url":"https://10.3.3.207/api/contests/NAC-2023-test2", + "useTeamNames":false, + + "#media_base_url":"http://10.3.3.207/api" +} + diff --git a/config/icpc-nef/2016-2017/events.properties b/config/icpc-nef/2016-2017/events.properties deleted file mode 100644 index cadf4903e..000000000 --- a/config/icpc-nef/2016-2017/events.properties +++ /dev/null @@ -1,11 +0,0 @@ -login=test -password=test -url=http://neerc.ifmo.ru/information/standings.xml -participants=parties.xml -problems.url=problems.xml -problemsNumber=3 -standings.type=PCMS - -contest.length=5400000 -#18000000 -freeze.time=14400000 \ No newline at end of file diff --git a/config/icpc-nef/2016-2017/mainscreen.properties b/config/icpc-nef/2016-2017/mainscreen.properties deleted file mode 100644 index 3a15ba66c..000000000 --- a/config/icpc-nef/2016-2017/mainscreen.properties +++ /dev/null @@ -1,40 +0,0 @@ -update.wait=1000 -backup.persons=persons.txt -backup.advertisements=advertisements.txt -breakingnews.time=20000 -breakingnews.runs.number=10 -breakingnews.patterns.filename=patterns.txt -standings.blinking.time=10000 -advertisement.time=5000 -person.time=5000 -latency.time=2000 -data.update=1000 -data.host=192.168.1.181 -data.port=25675 -info.types=photo;screen -main.type=photo -info.photo=pics/team.jpg -info.screen=http://192.168.0.8/%d/%d -sleep.time=10000 -automated.show.time=20000 -automated.info=screen -team.double.video=false - -queue.show.verdict=true - -ticker.rotate.time=10000 -ticker.logo=NEERC 2016;#NEERC -ticker.logo.time=10000 -ticker.logo.change.time=10000 - -overlayed.delay=3000 - -width=1280 -height=720 - -rate=25 - -top.teams.file=neerc-2016/topteams.txt -onsite.teams=S.* - -stylesheet=stylesheets/wf.jss diff --git a/config/icpc-nef/2016-2017/problems.xml b/config/icpc-nef/2016-2017/problems.xml deleted file mode 100644 index cf3136ad9..000000000 --- a/config/icpc-nef/2016-2017/problems.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/config/icpc-nef/2016-2017/settings.json b/config/icpc-nef/2016-2017/settings.json new file mode 100644 index 000000000..5325c3837 --- /dev/null +++ b/config/icpc-nef/2016-2017/settings.json @@ -0,0 +1,5 @@ +{ + "type":"pcms", + "url":"https://nerc.itmo.ru/archive/2016/standings.xml" +} + diff --git a/config/icpc-nef/2016-2017/topteams.txt b/config/icpc-nef/2016-2017/topteams.txt deleted file mode 100644 index f9e1cc9c1..000000000 --- a/config/icpc-nef/2016-2017/topteams.txt +++ /dev/null @@ -1,2 +0,0 @@ -S520 -S502 \ No newline at end of file diff --git a/config/icpc-nef/2017-2018/events.properties b/config/icpc-nef/2017-2018/events.properties deleted file mode 100644 index eaf2ac6a8..000000000 --- a/config/icpc-nef/2017-2018/events.properties +++ /dev/null @@ -1,11 +0,0 @@ -login=test -password=test -url=http://neerc.ifmo.ru/information/standings.xml -teams.url=parties.xml -problems.url=problems.xml -problems.number=12 -standings.type=PCMS - -contest.length=18000000 -#18000000 -freeze.time=14400000 \ No newline at end of file diff --git a/config/icpc-nef/2017-2018/mainscreen.properties b/config/icpc-nef/2017-2018/mainscreen.properties deleted file mode 100644 index baa80ad43..000000000 --- a/config/icpc-nef/2017-2018/mainscreen.properties +++ /dev/null @@ -1,57 +0,0 @@ -update.wait=1000 -backup.persons=persons.txt -backup.advertisements=advertisements.txt -breakingnews.time=20000 -breakingnews.runs.number=10 -breakingnews.patterns.filename=patterns.txt -standings.blinking.time=10000 -advertisement.time=5000 -person.time=5000 -latency.time=2000 -data.update=1000 -data.host=192.168.1.188 -data.port=25675 -info.types=screen -main.type=screen -info.screen=http://192.168.0.8/%d/%d -sleep.time=10000 -automated.show.time=20000 -automated.info=screen -team.double.video=false - -queue.show.verdict=true - -ticker.rotate.time=10000 -ticker.logo=#Clock#,NEERC 2017;#NEERC -ticker.logo.time=5000 -ticker.clock.time=20000 -ticker.logo.change.time=1000 - -overlayed.delay=3000 - -width=1280 -height=720 - -rate=25 - -top.teams.file=neerc-2017/topteams.txt -onsite.teams=S.* - -stylesheet=stylesheets/wf.jss - -polls.backup.file=polls.txt -poll.show.time=20000 -poll.top.teams=5 - -twitch.chat.server=irc.chat.twitch.tv -twitch.chat.username=aksenov239 -twitch.chat.password=oauth:8yb7ygy3ey2wdwmlkvd7bs2o8guwf3 -twitch.chat.channel=#aksenov239;#icpclive1;#icpclive_ru - -twitter.hashtag=#NEERC2017 - -word.statistics.backup.file=words-statistics.txt -word.statistics.words=tweets -word.statistics.tweets.text=$tweets$ - -outputFile=d:/work/image.bin diff --git a/config/icpc-nef/2017-2018/problems.xml b/config/icpc-nef/2017-2018/problems.xml deleted file mode 100644 index 2056efdf0..000000000 --- a/config/icpc-nef/2017-2018/problems.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/config/icpc-nef/2017-2018/settings.json b/config/icpc-nef/2017-2018/settings.json new file mode 100644 index 000000000..950322d55 --- /dev/null +++ b/config/icpc-nef/2017-2018/settings.json @@ -0,0 +1,4 @@ +{ + "type":"pcms", + "url":"https://nerc.itmo.ru/archive/2017/standings.xml" +} diff --git a/config/icpc-nef/2017-2018/topteams.txt b/config/icpc-nef/2017-2018/topteams.txt deleted file mode 100644 index f9e1cc9c1..000000000 --- a/config/icpc-nef/2017-2018/topteams.txt +++ /dev/null @@ -1,2 +0,0 @@ -S520 -S502 \ No newline at end of file diff --git a/config/icpc-nef/2018-2019/problems-practice.xml b/config/icpc-nef/2018-2019/problems-practice.xml deleted file mode 100644 index 44dee15cf..000000000 --- a/config/icpc-nef/2018-2019/problems-practice.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/config/icpc-nef/2018-2019/problems.xml b/config/icpc-nef/2018-2019/problems.xml deleted file mode 100644 index 2ecffb2ef..000000000 --- a/config/icpc-nef/2018-2019/problems.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/config/icpc-nef/2018-2019/settings.json b/config/icpc-nef/2018-2019/settings.json new file mode 100644 index 000000000..4e34dd75f --- /dev/null +++ b/config/icpc-nef/2018-2019/settings.json @@ -0,0 +1,4 @@ +{ + "type":"pcms", + "url":"https://nerc.itmo.ru/archive/2018/standings.xml" +} diff --git a/config/icpc-nef/2020-2021/onsite/advanced.json b/config/icpc-nef/2020-2021/onsite/advanced.json index 98d9c8dda..4ccfcf8cc 100644 --- a/config/icpc-nef/2020-2021/onsite/advanced.json +++ b/config/icpc-nef/2020-2021/onsite/advanced.json @@ -1,5 +1,5 @@ { - "freezeTimeSeconds": 14400, + "freezeTimeSeconds": 18000, "teamMediaTemplate": { "screen": { "type": "Video", diff --git a/config/icpc-nef/2020-2021/onsite/events.properties b/config/icpc-nef/2020-2021/onsite/events.properties deleted file mode 100644 index fd0552a5f..000000000 --- a/config/icpc-nef/2020-2021/onsite/events.properties +++ /dev/null @@ -1,7 +0,0 @@ -url=http://nerc.itmo.ru/archive/2020/standings.xml -#url=/nerc-onsite-2020/standings.xml -standings.type=PCMS - -emulation.speed=10 -emulation.startTime=2023-05-28 13:50 -#emulation.startTime=now diff --git a/config/icpc-nef/2020-2021/onsite/settings.json b/config/icpc-nef/2020-2021/onsite/settings.json new file mode 100644 index 000000000..61c24ea9f --- /dev/null +++ b/config/icpc-nef/2020-2021/onsite/settings.json @@ -0,0 +1,5 @@ +{ + "type":"pcms", + "url":"https://nerc.itmo.ru/archive/2020/standings.xml" +} + diff --git a/config/icpc-nef/2020-2021/onsite/social.properties b/config/icpc-nef/2020-2021/onsite/social.properties deleted file mode 100644 index 8799c3e59..000000000 --- a/config/icpc-nef/2020-2021/onsite/social.properties +++ /dev/null @@ -1,3 +0,0 @@ -twitch.chat.username=$creds.twitch_api_username -twitch.chat.token=$creds.twitch_api_token -twitch.chat.channel=#icpclive1;#icpclive_ru \ No newline at end of file diff --git a/config/icpc-nef/2021-2022/main/mainscreen.properties b/config/icpc-nef/2021-2022/main/mainscreen.properties deleted file mode 100644 index 1cebdbf6c..000000000 --- a/config/icpc-nef/2021-2022/main/mainscreen.properties +++ /dev/null @@ -1,79 +0,0 @@ -#width=1280 -#height=720 -width=1920 -height=1080 -rate=25 -output.file=d:/work/image.bin -output.mode=file -#output.mode=window - -update.wait=500 -backup.persons=persons.txt -backup.advertisements=advertisements.txt -breakingnews.time=20000 -breakingnews.runs.number=10 -breakingnews.patterns.filename=patterns.txt -standings.blinking.time=10000 -advertisement.time=50000 -person.time=50000 -latency.time=2000 -data.update=1000 -data.host=localhost -data.port=25675 - -info.types=screen;camera -#info.screen=http://192.168.1.207:9080/video/screen/%d -#info.camera=http://192.168.1.207:9080/video/camera/%d -#info.record=http://192.168.1.207:9080/video/reaction/%d -info.screen=http://192.168.18.38:80%02d -info.camera=http://192.168.18.38:81%02d -#info.camera=https://live:evMUzdqM@192.168.1.207/video/webcam/%s -#info.video=teamVideos/%s.mp4 -#info.record=pics/team.jpg -#info.types=photo;screen -#info.video=teamVideos/%03d.mp4 -#pics/BigBuckBunny_320x180.mp4 -#pics/team.jpg -#info.screen=pics/BigBuckBunny_320x180.mp4 -#pics/screen.png - -sleep.time=20000 -automated.show.time=40000 -automated.info=screen -team.double.video=false - -ticker.rotate.time=10000 -ticker.logo=#Clock#;NERC 2020 -ticker.logo.time=5000 -ticker.clock.time=20000 -ticker.logo.change.time=1000 - -queue.show.verdict=true - -overlayed.delay=3000 - -top.teams=S077,S118,S113,S089,S128,S099,S012,S086,S007,S050,S121,S110,S062 -onsite.teams=.* - -stylesheet=stylesheets/wf.jss - -polls.backup.file=polls.txt -poll.show.time=20000 -poll.top.teams=5 - -twitch.chat.server=irc.chat.twitch.tv -twitch.chat.username=aksenov239 -twitch.chat.password=oauth:8yb7ygy3ey2wdwmlkvd7bs2o8guwf3 -twitch.chat.channel=#aksenov239;#icpclive1;#icpclive_ru - -twitter.hashtag=#NERC2020 - -word.statistics.backup.file=words-statistics.txt -word.statistics.words=tweets;goose;energy -word.statistics.tweets.text=$tweets$ -word.statistics.tweets.picture= -word.statistics.goose.text=(*)> -word.statistics.goose.picture=pics/goose.jpg -word.statistics.energy.text=ί-- ??φ Π?Ž_Π?Ž ί-ι??φ -word.statistics.energy.picture=pics/energy.jpg -word.statistics.word.show.time=10000 diff --git a/config/icpc-nef/2021-2022/main/problems-practice.xml b/config/icpc-nef/2021-2022/main/problems-practice.xml deleted file mode 100644 index 6b5adebef..000000000 --- a/config/icpc-nef/2021-2022/main/problems-practice.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/config/icpc-nef/2021-2022/main/problems.xml b/config/icpc-nef/2021-2022/main/problems.xml deleted file mode 100644 index dd1e672f0..000000000 --- a/config/icpc-nef/2021-2022/main/problems.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/config/icpc-nef/2021-2022/main/settings.json b/config/icpc-nef/2021-2022/main/settings.json new file mode 100644 index 000000000..deebe0508 --- /dev/null +++ b/config/icpc-nef/2021-2022/main/settings.json @@ -0,0 +1,4 @@ +{ + "type":"pcms", + "url":"https://nerc.itmo.ru/archive/2021/standings.xml" +} diff --git a/config/icpc-nef/2021-2022/test/events.properties b/config/icpc-nef/2021-2022/test/events.properties deleted file mode 100644 index d992d142d..000000000 --- a/config/icpc-nef/2021-2022/test/events.properties +++ /dev/null @@ -1,10 +0,0 @@ -url=https://nerc.itmo.ru/archive/2021/standings.xml -teams.url=participants.xml -problems.url=problems.xml -standings.type=PCMS - -running.time=18000000 -freeze.time=14400000 - -emulation.speed=5 -emulation.startTime=2022-05-28 10:10 diff --git a/config/icpc-nef/2021-2022/test/medals.properties b/config/icpc-nef/2021-2022/test/medals.properties deleted file mode 100644 index 84efc971d..000000000 --- a/config/icpc-nef/2021-2022/test/medals.properties +++ /dev/null @@ -1,4 +0,0 @@ -order=gold,silver,bronze -gold.count=4 -silver.count=4 -bronze.count=4 \ No newline at end of file diff --git a/config/icpc-nef/2021-2022/test/problems.xml b/config/icpc-nef/2021-2022/test/problems.xml deleted file mode 100644 index dd1e672f0..000000000 --- a/config/icpc-nef/2021-2022/test/problems.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/config/icpc-nef/2021-2022/test/settings.json b/config/icpc-nef/2021-2022/test/settings.json new file mode 100644 index 000000000..deebe0508 --- /dev/null +++ b/config/icpc-nef/2021-2022/test/settings.json @@ -0,0 +1,4 @@ +{ + "type":"pcms", + "url":"https://nerc.itmo.ru/archive/2021/standings.xml" +} diff --git a/config/icpc-nef/2022-2023/settings.json b/config/icpc-nef/2022-2023/settings.json new file mode 100644 index 000000000..4b0efb763 --- /dev/null +++ b/config/icpc-nef/2022-2023/settings.json @@ -0,0 +1,4 @@ +{ + "type":"pcms", + "url":"https://nerc.itmo.ru/archive/2022/standings.xml" +} \ No newline at end of file diff --git a/config/icpc-nwerc/2018/cds/events.properties b/config/icpc-nwerc/2018/cds/events.properties deleted file mode 100644 index ca5507332..000000000 --- a/config/icpc-nwerc/2018/cds/events.properties +++ /dev/null @@ -1,4 +0,0 @@ -login=$creds.nwerc18_login_cds -password=$creds.nwerc18_password_cds -url=https://cds.gehack.nl/api/contests/nwerc18 -standings.type=CLICS \ No newline at end of file diff --git a/config/icpc-nwerc/2018/cds/settings.json b/config/icpc-nwerc/2018/cds/settings.json new file mode 100644 index 000000000..b5d873c91 --- /dev/null +++ b/config/icpc-nwerc/2018/cds/settings.json @@ -0,0 +1,6 @@ +{ + "type":"clics", + "login":"$creds.nwerc18_login_cds", + "password":"$creds.nwerc18_password_cds", + "url":"https://cds.gehack.nl/api/contests/nwerc18" +} diff --git a/config/icpc-nwerc/2018/native/events.properties b/config/icpc-nwerc/2018/native/events.properties deleted file mode 100644 index d820eb1e3..000000000 --- a/config/icpc-nwerc/2018/native/events.properties +++ /dev/null @@ -1,4 +0,0 @@ -login=$creds.nwerc18_login -password=$creds.nwerc18_password -url=https://www.domjudge.org/demoweb/api/contests/nwerc18 -standings.type=CLICS \ No newline at end of file diff --git a/config/icpc-nwerc/2018/native/settings.json b/config/icpc-nwerc/2018/native/settings.json new file mode 100644 index 000000000..4f5eb2dbb --- /dev/null +++ b/config/icpc-nwerc/2018/native/settings.json @@ -0,0 +1,6 @@ +{ + "type":"clics", + "login":"$creds.nwerc18_login", + "password":"$creds.nwerc18_password", + "url":"https://www.domjudge.org/demoweb/api/contests/nwerc18" +} \ No newline at end of file diff --git a/config/icpc-nwerc/2019/events.properties b/config/icpc-nwerc/2019/events.properties deleted file mode 100644 index fedf7f087..000000000 --- a/config/icpc-nwerc/2019/events.properties +++ /dev/null @@ -1,4 +0,0 @@ -login=live -password=monger-lawless-hymn-inhaler -url=https://judge.gehack.nl:8443/api/contests/3 -standings.type=WFRegionals diff --git a/config/icpc-nwerc/2019/mainscreen.properties b/config/icpc-nwerc/2019/mainscreen.properties deleted file mode 100644 index f07d9bcab..000000000 --- a/config/icpc-nwerc/2019/mainscreen.properties +++ /dev/null @@ -1,81 +0,0 @@ -update.wait=500 -backup.persons=persons.txt -backup.advertisements=advertisements.txt -breakingnews.time=20000 -breakingnews.runs.number=10 -breakingnews.patterns.filename=patterns.txt -standings.blinking.time=10000 -advertisement.time=5000 -person.time=5000 -latency.time=2000 -data.update=1000 -data.host=localhost -data.port=25675 - -info.types=screen;camera;video -info.screen=http://live:cdspor41@192.168.1.207/video/desktop/%s -info.camera=http://live:cdspor41@192.168.1.207/video/webcam/%s -info.record=http://192.168.1.207:9080/video/reaction/%s -#info.screen=pics/screen.png -#info.camera=pics/team.jpg -#info.record=pics/team.jpg -#info.types=photo;screen -info.video=D:\\work\\icpclive-2018\\teamVideos\\%s.mp4 -#pics/BigBuckBunny_320x180.mp4 -#pics/team.jpg -#info.screen=pics/BigBuckBunny_320x180.mp4 -#pics/screen.png - -sleep.time=10000 -automated.show.time=20000 -automated.info=screen -team.double.video=true - -ticker.rotate.time=10000 -ticker.logo=NWERC 2019;#NWERC2019 -ticker.logo.time=10000 -ticker.logo.change.time=2000 - -queue.show.verdict=true - -overlayed.delay=3000 - -width=1920 -height=1080 -rate=25 - -top.teams= -onsite.teams=.* - -stylesheet=stylesheets/wf.jss - -polls.backup.file=polls.txt -poll.show.time=20000 -poll.top.teams=5 -poll.hashtag=#ICPC2019Vote - -twitch.chat.server=irc.chat.twitch.tv -twitch.chat.username=aksenov239 -twitch.chat.password=oauth:8yb7ygy3ey2wdwmlkvd7bs2o8guwf3 -twitch.chat.channel=#aksenov239;#icpclive1;#icpclive_ru - -twitter.hashtag=#ICPC2019 - -word.statistics.backup.file=words-statistics.txt -word.statistics.words=tweets;goose;energy -word.statistics.tweets.text=$tweets$ -word.statistics.tweets.picture= -word.statistics.goose.text=(*)> -word.statistics.goose.picture=pics/goose.jpg -word.statistics.energy.text=ί-- ρ?φ ЍŽ_ЍŽ ί-ιρ?φ -word.statistics.energy.picture=pics/energy.jpg -word.statistics.word.show.time=10000 - -backup.pictures=pictures.txt - -output.mode=file -outputFile=c:/work/image.bin - -locator.cameras=10.250.25.111,10.250.25.112,10.250.25.113 -locator.inputfile=input.txt -locator.coordinates=coordinates-1.txt,coordinates-2.txt,coordinates-3.txt diff --git a/config/icpc-nwerc/2019/settings.json b/config/icpc-nwerc/2019/settings.json new file mode 100644 index 000000000..e0628da69 --- /dev/null +++ b/config/icpc-nwerc/2019/settings.json @@ -0,0 +1,6 @@ +{ + "type":"clics", + "login":"live", + "password":"monger-lawless-hymn-inhaler", + "url":"https://judge.gehack.nl:8443/api/contests/3" +} diff --git a/config/icpc-nwerc/2022/events.properties b/config/icpc-nwerc/2022/events.properties deleted file mode 100644 index e3fe18ced..000000000 --- a/config/icpc-nwerc/2022/events.properties +++ /dev/null @@ -1,5 +0,0 @@ -login=$creds.login -password=$creds.password -url=https://cds.chipcie.ch.tudelft.nl/api/contests/nwerc2022 -standings.type=CLICS -media_base_url=https://cds.chipcie.ch.tudelft.nl/api \ No newline at end of file diff --git a/config/icpc-nwerc/2022/settings.json b/config/icpc-nwerc/2022/settings.json new file mode 100644 index 000000000..caff37e1e --- /dev/null +++ b/config/icpc-nwerc/2022/settings.json @@ -0,0 +1,7 @@ +{ + "type":"clics", + "login":"$creds.login", + "password":"$creds.password", + "url":"https://cds.chipcie.ch.tudelft.nl/api/contests/nwerc2022", + "mediaBaseUrl":"https://cds.chipcie.ch.tudelft.nl/api" +} \ No newline at end of file diff --git a/config/icpc-nwq/2021/events.properties b/config/icpc-nwq/2021/events.properties deleted file mode 100644 index 7176e20ab..000000000 --- a/config/icpc-nwq/2021/events.properties +++ /dev/null @@ -1,10 +0,0 @@ -login=admin -password=adm1n -url=http://nerc.itmo.ru/archive/2021/northern/nwq-2021.xml -teams.url=participants.xml -problems.url=problems.xml -problems.number=15 -standings.type=PCMS - -running.time=18000000 -freeze.time=14400000 diff --git a/config/icpc-nwq/2021/mainscreen.properties b/config/icpc-nwq/2021/mainscreen.properties deleted file mode 100644 index 3cd2a7b56..000000000 --- a/config/icpc-nwq/2021/mainscreen.properties +++ /dev/null @@ -1,78 +0,0 @@ -#width=1280 -#height=720 -width=1920 -height=1080 -rate=25 -output.file=c:/work/image.bin -output.mode=file -#output.mode=window - -update.wait=500 -backup.persons=persons.txt -backup.advertisements=advertisements.txt -breakingnews.time=20000 -breakingnews.runs.number=10 -breakingnews.patterns.filename=patterns.txt -standings.blinking.time=10000 -advertisement.time=50000 -person.time=50000 -latency.time=2000 -data.update=1000 -data.host=localhost -data.port=25675 - -info.types=screen; -#info.screen=http://192.168.1.207:9080/video/screen/%d -#info.camera=http://192.168.1.207:9080/video/camera/%d -#info.record=http://192.168.1.207:9080/video/reaction/%d -info.screen=http://192.168.0.8:8008/%d/%d -#info.camera=https://live:evMUzdqM@192.168.1.207/video/webcam/%s -#info.video=teamVideos/%s.mp4 -#info.record=pics/team.jpg -#info.types=photo;screen -#info.video=teamVideos/%03d.mp4 -#pics/BigBuckBunny_320x180.mp4 -#pics/team.jpg -#info.screen=pics/BigBuckBunny_320x180.mp4 -#pics/screen.png - -sleep.time=20000 -automated.show.time=40000 -automated.info=screen -team.double.video=false - -ticker.rotate.time=10000 -ticker.logo=#Clock#;NWQ2021 -ticker.logo.time=5000 -ticker.clock.time=20000 -ticker.logo.change.time=1000 - -queue.show.verdict=true - -overlayed.delay=3000 - -top.teams=101,111,306,105 -onsite.teams=.* - -stylesheet=stylesheets/wf.jss - -polls.backup.file=polls.txt -poll.show.time=20000 -poll.top.teams=5 - -twitch.chat.server=irc.chat.twitch.tv -twitch.chat.username=aksenov239 -twitch.chat.password=oauth:8yb7ygy3ey2wdwmlkvd7bs2o8guwf3 -twitch.chat.channel=#aksenov239;#icpclive1;#icpclive_ru - -twitter.hashtag=#NWQ2021 - -word.statistics.backup.file=words-statistics.txt -word.statistics.words=tweets;goose;energy -word.statistics.tweets.text=$tweets$ -word.statistics.tweets.picture= -word.statistics.goose.text=(*)> -word.statistics.goose.picture=pics/goose.jpg -word.statistics.energy.text=ί-- ??φ Π?Ž_Π?Ž ί-ι??φ -word.statistics.energy.picture=pics/energy.jpg -word.statistics.word.show.time=10000 diff --git a/config/icpc-nwq/2021/problems b/config/icpc-nwq/2021/problems deleted file mode 100644 index 8b1378917..000000000 --- a/config/icpc-nwq/2021/problems +++ /dev/null @@ -1 +0,0 @@ - diff --git a/config/icpc-nwq/2021/problems-practice.xml b/config/icpc-nwq/2021/problems-practice.xml deleted file mode 100644 index ba533848a..000000000 --- a/config/icpc-nwq/2021/problems-practice.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/config/icpc-nwq/2021/problems.xml b/config/icpc-nwq/2021/problems.xml deleted file mode 100644 index eecdfc3aa..000000000 --- a/config/icpc-nwq/2021/problems.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/config/icpc-nwq/2021/settings.json b/config/icpc-nwq/2021/settings.json new file mode 100644 index 000000000..bcf9e3383 --- /dev/null +++ b/config/icpc-nwq/2021/settings.json @@ -0,0 +1,4 @@ +{ + "type":"pcms", + "url":"http://nerc.itmo.ru/archive/2021/northern/nwq-2021.xml" +} diff --git a/config/icpc-nwq/2022/events.properties b/config/icpc-nwq/2022/events.properties deleted file mode 100644 index 151241f39..000000000 --- a/config/icpc-nwq/2022/events.properties +++ /dev/null @@ -1,3 +0,0 @@ -url=http://nerc.itmo.ru/archive/2022/northern/nwq-2022.xml -standings.type=PCMS - diff --git a/config/icpc-nwq/2022/settings.json b/config/icpc-nwq/2022/settings.json new file mode 100644 index 000000000..989ff9475 --- /dev/null +++ b/config/icpc-nwq/2022/settings.json @@ -0,0 +1,4 @@ +{ + "type":"pcms", + "url":"http://nerc.itmo.ru/archive/2022/northern/nwq-2022.xml" +} diff --git a/config/icpc-nwrrc/2018/events.properties b/config/icpc-nwrrc/2018/events.properties deleted file mode 100644 index 373fa4184..000000000 --- a/config/icpc-nwrrc/2018/events.properties +++ /dev/null @@ -1,10 +0,0 @@ -login=admin -password=adm1n -url=http://neerc.ifmo.ru/archive/2018/northern/standings.xml -teams.url=participants.xml -problems.url=problems.xml -problems.number=12 -standings.type=PCMS - -running.time=18000000 -freeze.time=14400000 diff --git a/config/icpc-nwrrc/2018/mainscreen.properties b/config/icpc-nwrrc/2018/mainscreen.properties deleted file mode 100644 index 083f305c3..000000000 --- a/config/icpc-nwrrc/2018/mainscreen.properties +++ /dev/null @@ -1,78 +0,0 @@ -#width=1280 -#height=720 -width=1920 -height=1080 -rate=25 -output.file=c:/work/image.bin -output.mode=file -#output.mode=window - -update.wait=500 -backup.persons=persons.txt -backup.advertisements=advertisements.txt -breakingnews.time=20000 -breakingnews.runs.number=10 -breakingnews.patterns.filename=patterns.txt -standings.blinking.time=10000 -advertisement.time=50000 -person.time=50000 -latency.time=2000 -data.update=1000 -data.host=localhost -data.port=25675 - -info.types=screen; -#info.screen=http://192.168.1.207:9080/video/screen/%d -#info.camera=http://192.168.1.207:9080/video/camera/%d -#info.record=http://192.168.1.207:9080/video/reaction/%d -info.screen=http://192.168.0.8:8008/%d/%d -#info.camera=https://live:evMUzdqM@192.168.1.207/video/webcam/%s -#info.video=teamVideos/%s.mp4 -#info.record=pics/team.jpg -#info.types=photo;screen -#info.video=teamVideos/%03d.mp4 -#pics/BigBuckBunny_320x180.mp4 -#pics/team.jpg -#info.screen=pics/BigBuckBunny_320x180.mp4 -#pics/screen.png - -sleep.time=20000 -automated.show.time=40000 -automated.info=screen -team.double.video=false - -ticker.rotate.time=10000 -ticker.logo=#Clock#;NSNEERC 2018 -ticker.logo.time=5000 -ticker.clock.time=20000 -ticker.logo.change.time=1000 - -queue.show.verdict=true - -overlayed.delay=3000 - -top.teams=101,111,306,105 -onsite.teams=.* - -stylesheet=stylesheets/wf.jss - -polls.backup.file=polls.txt -poll.show.time=20000 -poll.top.teams=5 - -twitch.chat.server=irc.chat.twitch.tv -twitch.chat.username=aksenov239 -twitch.chat.password=oauth:8yb7ygy3ey2wdwmlkvd7bs2o8guwf3 -twitch.chat.channel=#aksenov239;#icpclive1;#icpclive_ru - -twitter.hashtag=#NSNEERC2018 - -word.statistics.backup.file=words-statistics.txt -word.statistics.words=tweets;goose;energy -word.statistics.tweets.text=$tweets$ -word.statistics.tweets.picture= -word.statistics.goose.text=(*)> -word.statistics.goose.picture=pics/goose.jpg -word.statistics.energy.text=ί-- ??φ Π?Ž_Π?Ž ί-ι??φ -word.statistics.energy.picture=pics/energy.jpg -word.statistics.word.show.time=10000 diff --git a/config/icpc-nwrrc/2018/problems-practice.xml b/config/icpc-nwrrc/2018/problems-practice.xml deleted file mode 100644 index 44dee15cf..000000000 --- a/config/icpc-nwrrc/2018/problems-practice.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/config/icpc-nwrrc/2018/problems.xml b/config/icpc-nwrrc/2018/problems.xml deleted file mode 100644 index dfee9b0db..000000000 --- a/config/icpc-nwrrc/2018/problems.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/config/icpc-nwrrc/2018/settings.json b/config/icpc-nwrrc/2018/settings.json new file mode 100644 index 000000000..73390c759 --- /dev/null +++ b/config/icpc-nwrrc/2018/settings.json @@ -0,0 +1,4 @@ +{ + "type":"pcms", + "url":"http://neerc.ifmo.ru/archive/2018/northern/standings.xml" +} \ No newline at end of file diff --git a/config/icpc-nwrrc/2019/events.properties b/config/icpc-nwrrc/2019/events.properties deleted file mode 100644 index 3e710a248..000000000 --- a/config/icpc-nwrrc/2019/events.properties +++ /dev/null @@ -1,10 +0,0 @@ -login=admin -password=adm1n -url=http://neerc.ifmo.ru/archive/2019/northern/standings.xml -teams.url=participants.xml -problems.url=problems.xml -problems.number=13 -standings.type=PCMS - -running.time=18000000 -freeze.time=14400000 diff --git a/config/icpc-nwrrc/2019/mainscreen.properties b/config/icpc-nwrrc/2019/mainscreen.properties deleted file mode 100644 index 1b3a67815..000000000 --- a/config/icpc-nwrrc/2019/mainscreen.properties +++ /dev/null @@ -1,78 +0,0 @@ -#width=1280 -#height=720 -width=1920 -height=1080 -rate=25 -output.file=c:/work/image.bin -output.mode=file -#output.mode=window - -update.wait=500 -backup.persons=persons.txt -backup.advertisements=advertisements.txt -breakingnews.time=20000 -breakingnews.runs.number=10 -breakingnews.patterns.filename=patterns.txt -standings.blinking.time=10000 -advertisement.time=50000 -person.time=50000 -latency.time=2000 -data.update=1000 -data.host=localhost -data.port=25675 - -info.types=screen; -#info.screen=http://192.168.1.207:9080/video/screen/%d -#info.camera=http://192.168.1.207:9080/video/camera/%d -#info.record=http://192.168.1.207:9080/video/reaction/%d -info.screen=http://192.168.0.8:8008/%d/%d -#info.camera=https://live:evMUzdqM@192.168.1.207/video/webcam/%s -#info.video=teamVideos/%s.mp4 -#info.record=pics/team.jpg -#info.types=photo;screen -#info.video=teamVideos/%03d.mp4 -#pics/BigBuckBunny_320x180.mp4 -#pics/team.jpg -#info.screen=pics/BigBuckBunny_320x180.mp4 -#pics/screen.png - -sleep.time=20000 -automated.show.time=40000 -automated.info=screen -team.double.video=false - -ticker.rotate.time=10000 -ticker.logo=#Clock#;NSNEERC 2019 -ticker.logo.time=5000 -ticker.clock.time=20000 -ticker.logo.change.time=1000 - -queue.show.verdict=true - -overlayed.delay=3000 - -top.teams=101,111,306,105 -onsite.teams=.* - -stylesheet=stylesheets/wf.jss - -polls.backup.file=polls.txt -poll.show.time=20000 -poll.top.teams=5 - -twitch.chat.server=irc.chat.twitch.tv -twitch.chat.username=aksenov239 -twitch.chat.password=oauth:8yb7ygy3ey2wdwmlkvd7bs2o8guwf3 -twitch.chat.channel=#aksenov239;#icpclive1;#icpclive_ru - -twitter.hashtag=#NSNEERC2018 - -word.statistics.backup.file=words-statistics.txt -word.statistics.words=tweets;goose;energy -word.statistics.tweets.text=$tweets$ -word.statistics.tweets.picture= -word.statistics.goose.text=(*)> -word.statistics.goose.picture=pics/goose.jpg -word.statistics.energy.text=ί-- ??φ Π?Ž_Π?Ž ί-ι??φ -word.statistics.energy.picture=pics/energy.jpg -word.statistics.word.show.time=10000 diff --git a/config/icpc-nwrrc/2019/problems-practice.xml b/config/icpc-nwrrc/2019/problems-practice.xml deleted file mode 100644 index 427d48937..000000000 --- a/config/icpc-nwrrc/2019/problems-practice.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/config/icpc-nwrrc/2019/problems.xml b/config/icpc-nwrrc/2019/problems.xml deleted file mode 100644 index 2ecffb2ef..000000000 --- a/config/icpc-nwrrc/2019/problems.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/config/icpc-nwrrc/2019/settings.json b/config/icpc-nwrrc/2019/settings.json new file mode 100644 index 000000000..719c43c1d --- /dev/null +++ b/config/icpc-nwrrc/2019/settings.json @@ -0,0 +1,4 @@ +{ + "type":"pcms", + "url":"http://neerc.ifmo.ru/archive/2019/northern/standings.xml" +} diff --git a/config/icpc-nwrrc/2020/events.properties b/config/icpc-nwrrc/2020/events.properties deleted file mode 100644 index f4de4f8c5..000000000 --- a/config/icpc-nwrrc/2020/events.properties +++ /dev/null @@ -1,10 +0,0 @@ -login=admin -password=adm1n -url=http://nerc.itmo.ru/archive/2020/northern/standings.xml -teams.url=participants.xml -problems.url=problems-practice.xml -problems.number=3 -standings.type=PCMS - -running.time=18000000 -freeze.time=14400000 diff --git a/config/icpc-nwrrc/2020/mainscreen.properties b/config/icpc-nwrrc/2020/mainscreen.properties deleted file mode 100644 index 8466b4449..000000000 --- a/config/icpc-nwrrc/2020/mainscreen.properties +++ /dev/null @@ -1,78 +0,0 @@ -#width=1280 -#height=720 -width=1920 -height=1080 -rate=25 -output.file=d:/work/image.bin -output.mode=file -#output.mode=window - -update.wait=500 -backup.persons=persons.txt -backup.advertisements=advertisements.txt -breakingnews.time=20000 -breakingnews.runs.number=10 -breakingnews.patterns.filename=patterns.txt -standings.blinking.time=10000 -advertisement.time=50000 -person.time=50000 -latency.time=2000 -data.update=1000 -data.host=localhost -data.port=25675 - -info.types=screen; -#info.screen=http://192.168.1.207:9080/video/screen/%d -#info.camera=http://192.168.1.207:9080/video/camera/%d -#info.record=http://192.168.1.207:9080/video/reaction/%d -info.screen=http://192.168.0.8:8008/%d/%d -#info.camera=https://live:evMUzdqM@192.168.1.207/video/webcam/%s -#info.video=teamVideos/%s.mp4 -#info.record=pics/team.jpg -#info.types=photo;screen -#info.video=teamVideos/%03d.mp4 -#pics/BigBuckBunny_320x180.mp4 -#pics/team.jpg -#info.screen=pics/BigBuckBunny_320x180.mp4 -#pics/screen.png - -sleep.time=20000 -automated.show.time=40000 -automated.info=screen -team.double.video=false - -ticker.rotate.time=10000 -ticker.logo=#Clock#;NWRRC2020 -ticker.logo.time=5000 -ticker.clock.time=20000 -ticker.logo.change.time=1000 - -queue.show.verdict=true - -overlayed.delay=3000 - -top.teams=101,111,306,105 -onsite.teams=.* - -stylesheet=stylesheets/wf.jss - -polls.backup.file=polls.txt -poll.show.time=20000 -poll.top.teams=5 - -twitch.chat.server=irc.chat.twitch.tv -twitch.chat.username=aksenov239 -twitch.chat.password=oauth:8yb7ygy3ey2wdwmlkvd7bs2o8guwf3 -twitch.chat.channel=#aksenov239;#icpclive1;#icpclive_ru - -twitter.hashtag=#NWRRC2020 - -word.statistics.backup.file=words-statistics.txt -word.statistics.words=tweets;goose;energy -word.statistics.tweets.text=$tweets$ -word.statistics.tweets.picture= -word.statistics.goose.text=(*)> -word.statistics.goose.picture=pics/goose.jpg -word.statistics.energy.text=ί-- ??φ Π?Ž_Π?Ž ί-ι??φ -word.statistics.energy.picture=pics/energy.jpg -word.statistics.word.show.time=10000 diff --git a/config/icpc-nwrrc/2020/problems-practice.xml b/config/icpc-nwrrc/2020/problems-practice.xml deleted file mode 100644 index 3da9fd2c1..000000000 --- a/config/icpc-nwrrc/2020/problems-practice.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/config/icpc-nwrrc/2020/problems.xml b/config/icpc-nwrrc/2020/problems.xml deleted file mode 100644 index 6620b2032..000000000 --- a/config/icpc-nwrrc/2020/problems.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/config/icpc-nwrrc/2020/settings.json b/config/icpc-nwrrc/2020/settings.json new file mode 100644 index 000000000..52a6b2f47 --- /dev/null +++ b/config/icpc-nwrrc/2020/settings.json @@ -0,0 +1,4 @@ +{ + "type":"pcms", + "url":"http://nerc.itmo.ru/archive/2020/northern/standings.xml" +} \ No newline at end of file diff --git a/config/icpc-nwrrc/2022/events.properties b/config/icpc-nwrrc/2022/events.properties deleted file mode 100644 index 5d9cd6966..000000000 --- a/config/icpc-nwrrc/2022/events.properties +++ /dev/null @@ -1,2 +0,0 @@ -url=http://nerc.itmo.ru/archive/2022/northern/standings.xml -standings.type=PCMS diff --git a/config/icpc-nwrrc/2022/settings.json b/config/icpc-nwrrc/2022/settings.json new file mode 100644 index 000000000..c28468784 --- /dev/null +++ b/config/icpc-nwrrc/2022/settings.json @@ -0,0 +1,4 @@ +{ + "type":"pcms", + "url":"http://nerc.itmo.ru/archive/2022/northern/standings.xml" +} \ No newline at end of file diff --git a/config/icpc-rmc/2021/advanced.json b/config/icpc-rmc/2021/advanced.json index 119443ad7..67fbe03a2 100644 --- a/config/icpc-rmc/2021/advanced.json +++ b/config/icpc-rmc/2021/advanced.json @@ -65,9 +65,11 @@ "O":{"color":"#000075"}, "P":{"color":"#a9a9a9"} }, - "medals": [ - {"name": "gold", "count": 4}, - {"name": "silver", "count": 4}, - {"name": "bronze", "count": 4} - ] + "scoreboardOverrides": { + "medals": [ + {"name": "gold", "count": 4}, + {"name": "silver", "count": 4}, + {"name": "bronze", "count": 4} + ] + } } \ No newline at end of file diff --git a/config/icpc-rmc/2021/events.properties b/config/icpc-rmc/2021/events.properties deleted file mode 100644 index 17f9c02ee..000000000 --- a/config/icpc-rmc/2021/events.properties +++ /dev/null @@ -1,8 +0,0 @@ -login=$creds.kattis_login -password=$creds.kattis_token -url=https://open.kattis.com/clics-api/contests/rmc21 -standings.type=CLICS -feed_version=2020_03 - -emulation.startTime=2022-05-11 22:40 -emulation.speed=5 \ No newline at end of file diff --git a/config/icpc-rmc/2021/settings.json b/config/icpc-rmc/2021/settings.json new file mode 100644 index 000000000..973e0e6bf --- /dev/null +++ b/config/icpc-rmc/2021/settings.json @@ -0,0 +1,9 @@ +{ + "type":"clics", + "login":"$creds.kattis_login", + "password":"$creds.kattis_token", + "url":"https://open.kattis.com/clics-api/contests/rmc21", + "feedVersion":"2020_03", + + "emulation":{"speed":5,"startTime":"2022-05-11 22:40"} +} \ No newline at end of file diff --git a/config/icpc-southern-rc/events.properties b/config/icpc-southern-rc/events.properties deleted file mode 100644 index e521fe08d..000000000 --- a/config/icpc-southern-rc/events.properties +++ /dev/null @@ -1,2 +0,0 @@ -url=https://contest.sgu.ru/api/standings/1 -standings.type=PCMS diff --git a/config/icpc-southern-rc/settings.json b/config/icpc-southern-rc/settings.json new file mode 100644 index 000000000..571ede954 --- /dev/null +++ b/config/icpc-southern-rc/settings.json @@ -0,0 +1,4 @@ +{ + "type":"pcms", + "url":"https://contest.sgu.ru/api/standings/1" +} diff --git a/config/icpc-swerc/2021/dress/events.properties b/config/icpc-swerc/2021/dress/events.properties deleted file mode 100644 index bda8c2647..000000000 --- a/config/icpc-swerc/2021/dress/events.properties +++ /dev/null @@ -1,5 +0,0 @@ -login=live -password=SECRET -url=https://cds.swerc.eu/api/contests/demo -standings.type=CLICS -feed_version=2020_03 \ No newline at end of file diff --git a/config/icpc-swerc/2021/dress/settings.json b/config/icpc-swerc/2021/dress/settings.json new file mode 100644 index 000000000..ddad5f045 --- /dev/null +++ b/config/icpc-swerc/2021/dress/settings.json @@ -0,0 +1,7 @@ +{ + "type":"clics", + "login":"live", + "password":"SECRET", + "url":"https://cds.swerc.eu/api/contests/demo", + "feedVersion":"2020_03" +} \ No newline at end of file diff --git a/config/vkcup/2022/final/events.properties b/config/icpc-swerc/2022/mirror/events.properties similarity index 85% rename from config/vkcup/2022/final/events.properties rename to config/icpc-swerc/2022/mirror/events.properties index a87629ebb..5f8535e4c 100644 --- a/config/vkcup/2022/final/events.properties +++ b/config/icpc-swerc/2022/mirror/events.properties @@ -1,5 +1,5 @@ cf.api.key=$creds.codeforces_key cf.api.secret=$creds.codeforces_secret -contest_id=1784 +contest_id=1776 standings.type=CF diff --git a/config/icpc-wf/2020/advanced.json b/config/icpc-wf/2020/advanced.json index 0aaa5812f..cef254bda 100644 --- a/config/icpc-wf/2020/advanced.json +++ b/config/icpc-wf/2020/advanced.json @@ -3,6 +3,10 @@ "showTeamsWithoutSubmissions": true }, "teamMediaTemplate": { + "photo": { + "type": "Photo", + "url": "http://localhost:8080/media/photos/{teamId}.jpg" + }, "screen": { "type": "Photo", "url": "http://localhost:8080/media/screen/screen{teamId}.svg" diff --git a/config/icpc-wf/2020/events.properties b/config/icpc-wf/2020/events.properties deleted file mode 100644 index 35e56e0c6..000000000 --- a/config/icpc-wf/2020/events.properties +++ /dev/null @@ -1,6 +0,0 @@ -standings.type=CLICS -url=icpc-wf/2020 -emulation.speed=10 -emulation.startTime=now -feed_version=2020_03 -use_team_names=false diff --git a/config/icpc-wf/2020/settings.json b/config/icpc-wf/2020/settings.json new file mode 100644 index 000000000..b087b5290 --- /dev/null +++ b/config/icpc-wf/2020/settings.json @@ -0,0 +1,10 @@ +{ + "type": "clics", + "url": "icpc-wf/2020", + "useTeamNames": false, + "feedVersion": "2020_03", + "emulation": { + "speed": 10, + "startTime": "now" + } +} diff --git a/config/icpc-wf/2021/finals/media/animation-bouncing-icpclive-logo.svg b/config/icpc-wf/2021/finals/media/animation-bouncing-icpclive-logo.svg new file mode 100644 index 000000000..ccff58c2d --- /dev/null +++ b/config/icpc-wf/2021/finals/media/animation-bouncing-icpclive-logo.svg @@ -0,0 +1,19 @@ + + + +
+ + + + + +
+
+
\ No newline at end of file diff --git a/config/icpc-wf/2021/finals/presets/title.json b/config/icpc-wf/2021/finals/presets/title.json index ab1a26e26..32970e2e0 100644 --- a/config/icpc-wf/2021/finals/presets/title.json +++ b/config/icpc-wf/2021/finals/presets/title.json @@ -88,5 +88,18 @@ "data": { "t": "University of Warsaw" } + }, + { + "preset": "animation-dynamic-right.svg", + "data": { + "name": "Azat Ismagiov", + "role": "bebra aboba" + } + }, + { + "preset": "animation-bouncing-icpclive-logo.svg", + "data": { + "url": "https://avatars.githubusercontent.com/u/5224374?v=4" + } } ] \ No newline at end of file diff --git a/config/innopolis-open/2022-2023/final/settings.json b/config/innopolis-open/2022-2023/final/settings.json new file mode 100644 index 000000000..591a8b5a3 --- /dev/null +++ b/config/innopolis-open/2022-2023/final/settings.json @@ -0,0 +1,5 @@ +{ + "type":"pcms", + "url":"https://pcms.university.innopolis.ru/results/innopolis/2022-2023/final-main.xml", + "resultType":"IOI" +} \ No newline at end of file diff --git a/config/io-personal/2023/events.properties b/config/io-personal/2023/events.properties deleted file mode 100644 index 7c2cade04..000000000 --- a/config/io-personal/2023/events.properties +++ /dev/null @@ -1,6 +0,0 @@ -url=https://neerc.ifmo.ru/school/io/today/standings-personal.xml -standings.type=PCMS -standings.resultType=ioi - -standings.minScore = 0 -standings.maxScore = 100 diff --git a/config/io-personal/2023/settings.json b/config/io-personal/2023/settings.json new file mode 100644 index 000000000..56e0aba90 --- /dev/null +++ b/config/io-personal/2023/settings.json @@ -0,0 +1,5 @@ +{ + "type":"pcms", + "url":"https://neerc.ifmo.ru/school/io/today/standings-personal.xml", + "resultType":"IOI" +} diff --git a/config/ioi/2023/day1/advanced.json b/config/ioi/2023/day1/advanced.json new file mode 100644 index 000000000..4f6dedb29 --- /dev/null +++ b/config/ioi/2023/day1/advanced.json @@ -0,0 +1,38 @@ +{ + "teamOverrides": { + "HUN5" : {"isOutOfContest": true }, + "HUN6" : {"isOutOfContest": true }, + "HUN7" : {"isOutOfContest": true }, + "HUN8" : {"isOutOfContest": true } + }, + "scoreboardOverrides": { + "medals": [ + { + "name": "gold", + "count": 30, + "tiebreakMode": "ALL" + }, + { + "name": "silver", + "count": 59, + "tiebreakMode": "ALL" + }, + { + "name": "bronze", + "count": 89, + "tiebreakMode": "NONE" + } + ] + }, + "problemOverrides": { + "closing": { + "displayName": "A1" + }, + "longesttrip": { + "displayName": "B1" + }, + "soccer": { + "displayName": "C1" + } + } +} \ No newline at end of file diff --git a/config/ioi/2023/day1/settings.json b/config/ioi/2023/day1/settings.json new file mode 100644 index 000000000..19adb6ea2 --- /dev/null +++ b/config/ioi/2023/day1/settings.json @@ -0,0 +1,6 @@ +{ + "type": "cms", + "activeContest": "day1", + "otherContests": [], + "url": "https://ranking.cmsioi2023.hu/day1_v2" +} \ No newline at end of file diff --git a/config/ioi/2023/day2/advanced.json b/config/ioi/2023/day2/advanced.json new file mode 100644 index 000000000..7018d492e --- /dev/null +++ b/config/ioi/2023/day2/advanced.json @@ -0,0 +1,56 @@ +{ + "teamOverrides": { + "HUN5" : {"isOutOfContest": true }, + "HUN6" : {"isOutOfContest": true }, + "HUN7" : {"isOutOfContest": true }, + "HUN8" : {"isOutOfContest": true } + }, + "scoreboardOverrides": { + "medals": [ + { + "name": "gold", + "count": 30, + "tiebreakMode": "ALL" + }, + { + "name": "silver", + "count": 58, + "tiebreakMode": "ALL" + }, + { + "name": "bronze", + "count": 88, + "tiebreakMode": "NONE" + } + ] + }, + "problemOverrides": { + "closing": { + "displayName": "A1", + "ordinal": 0 + }, + "longesttrip": { + "displayName": "B1", + "ordinal": 1 + }, + "soccer": { + "displayName": "C1", + "ordinal": 2 + }, + "beechtree": { + "displayName": "A2", + "ordinal": 3 + }, + "robot": { + "displayName": "С2", + "ordinal": 5 + }, + "overtaking": { + "displayName": "B2", + "ordinal": 4 + } + }, + "teamOverrideTemplate": { + "displayName": "[{country}] {first_name} {last_name}" + } +} \ No newline at end of file diff --git a/config/ioi/2023/day2/settings.json b/config/ioi/2023/day2/settings.json new file mode 100644 index 000000000..e3caa0335 --- /dev/null +++ b/config/ioi/2023/day2/settings.json @@ -0,0 +1,6 @@ +{ + "type": "cms", + "activeContest": "day2", + "otherContests": ["day1"], + "url": "https://ranking.cmsioi2023.hu/live" +} \ No newline at end of file diff --git a/config/ioip/2022/events.properties b/config/ioip/2022/events.properties deleted file mode 100644 index 556b5e281..000000000 --- a/config/ioip/2022/events.properties +++ /dev/null @@ -1,9 +0,0 @@ -url=https://nerc.itmo.ru/school/ioip/ioip-2022.xml -standings.type=PCMS -standings.resultType=ioi - -emulation.startTime=2022-12-22 18:35 -emulation.speed=1 - -standings.minScore = 0 -standings.maxScore = 100 diff --git a/config/ioip/2022/settings.json b/config/ioip/2022/settings.json new file mode 100644 index 000000000..19e8028e9 --- /dev/null +++ b/config/ioip/2022/settings.json @@ -0,0 +1,5 @@ +{ + "type":"pcms", + "url":"https://nerc.itmo.ru/school/ioip/ioip-2022.xml", + "resultType":"IOI" +} \ No newline at end of file diff --git a/config/lscpc/2022/events.properties b/config/lscpc/2022/events.properties deleted file mode 100644 index 9412fdbe0..000000000 --- a/config/lscpc/2022/events.properties +++ /dev/null @@ -1,2 +0,0 @@ -standings.type=EJUDGE -url=https://ejudge.strategy48.ru/lscpc_external_inikoteni.xml diff --git a/config/lscpc/2022/settings.json b/config/lscpc/2022/settings.json new file mode 100644 index 000000000..f4824c86a --- /dev/null +++ b/config/lscpc/2022/settings.json @@ -0,0 +1,4 @@ +{ + "type":"ejudge", + "url":"https://ejudge.strategy48.ru/lscpc_external_inikoteni.xml" +} diff --git a/config/mkoshp/2022/events.properties b/config/mkoshp/2022/events.properties deleted file mode 100644 index 53b66a6ec..000000000 --- a/config/mkoshp/2022/events.properties +++ /dev/null @@ -1,2 +0,0 @@ -standings.type=EJUDGE -url=https://olympiads.ru/5wHVSnHiVb7kArvh.xml diff --git a/config/mkoshp/2022/settings.json b/config/mkoshp/2022/settings.json new file mode 100644 index 000000000..fad236469 --- /dev/null +++ b/config/mkoshp/2022/settings.json @@ -0,0 +1,4 @@ +{ + "type":"ejudge", + "url":"https://olympiads.ru/5wHVSnHiVb7kArvh.xml" +} diff --git a/config/mosh/2023/1-6/events.properties b/config/mosh/2023/1-6/events.properties deleted file mode 100644 index 93580c373..000000000 --- a/config/mosh/2023/1-6/events.properties +++ /dev/null @@ -1,4 +0,0 @@ -standings.type=EJUDGE -standings.resultType=IOI -url=https://olympiads.ru/eTkwBY9KRVgtLVzq/external.xml - diff --git a/config/mosh/2023/1-6/settings.json b/config/mosh/2023/1-6/settings.json new file mode 100644 index 000000000..fd4b36d5f --- /dev/null +++ b/config/mosh/2023/1-6/settings.json @@ -0,0 +1,6 @@ +{ + "type":"ejudge", + "resultType":"IOI", + "url":"https://olympiads.ru/eTkwBY9KRVgtLVzq/external.xml" +} + diff --git a/config/mosh/2023/7-8/events.properties b/config/mosh/2023/7-8/events.properties deleted file mode 100644 index d4e3ad48b..000000000 --- a/config/mosh/2023/7-8/events.properties +++ /dev/null @@ -1,4 +0,0 @@ -standings.type=EJUDGE -standings.resultType=IOI -url=https://olympiads.ru/aBXA2lMYmx3hNaZW/external.xml - diff --git a/config/mosh/2023/7-8/settings.json b/config/mosh/2023/7-8/settings.json new file mode 100644 index 000000000..fce81b710 --- /dev/null +++ b/config/mosh/2023/7-8/settings.json @@ -0,0 +1,6 @@ +{ + "type":"ejudge", + "resultType":"IOI", + "url":"https://olympiads.ru/aBXA2lMYmx3hNaZW/external.xml" +} + diff --git a/config/mosh/2023/9/events.properties b/config/mosh/2023/9/events.properties deleted file mode 100644 index a6a179ffa..000000000 --- a/config/mosh/2023/9/events.properties +++ /dev/null @@ -1,4 +0,0 @@ -standings.type=EJUDGE -standings.resultType=IOI -url=https://olympiads.ru/LW96bHqAIXmwH1cD/external.xml - diff --git a/config/mosh/2023/9/settings.json b/config/mosh/2023/9/settings.json new file mode 100644 index 000000000..8f2d22bf4 --- /dev/null +++ b/config/mosh/2023/9/settings.json @@ -0,0 +1,6 @@ +{ + "type":"ejudge", + "resultType":"IOI", + "url":"https://olympiads.ru/LW96bHqAIXmwH1cD/external.xml" +} + diff --git a/config/mosh/2023/keldysh/settings.json b/config/mosh/2023/keldysh/settings.json new file mode 100644 index 000000000..4d794469f --- /dev/null +++ b/config/mosh/2023/keldysh/settings.json @@ -0,0 +1,7 @@ +{ + "type":"ejudge", + "resultType":"IOI", + "#turl2":"https://olympiads.ru/aBXA2lMYmx3hNaZW/external.xml", + "#url3":"https://olympiads.ru/LW96bHqAIXmwH1cD/external.xml", + "url":"https://olympiads.ru/GDUvPbXKZ6lXalSG/external.xml" +} \ No newline at end of file diff --git a/config/ptz/2022-summer/events.properties b/config/ptz/2022-summer/events.properties deleted file mode 100644 index 9b87a38b1..000000000 --- a/config/ptz/2022-summer/events.properties +++ /dev/null @@ -1,9 +0,0 @@ -# 1. Register an application here: https://oauth.yandex.ru -# - Choose Web services -# - Tap Set URL for development -# - Add permission Yandex Contest -> Send and evaluate submissions in contests (contest:submit) -# 2. Get debug token: https://yandex.ru/dev/id/doc/dg/oauth/tasks/get-oauth-token.html -yandex.token=$creds.yandex -yandex.contest_id=39551 -yandex.login_prefix=(^karelia22s.*) -standings.type=YANDEX \ No newline at end of file diff --git a/config/ptz/2022-summer/settings.json b/config/ptz/2022-summer/settings.json new file mode 100644 index 000000000..ecd72008e --- /dev/null +++ b/config/ptz/2022-summer/settings.json @@ -0,0 +1,7 @@ +{ + "type": "yandex", + "apiKey": "$creds.yandex", + "contestId": 39551, + "loginRegex": "(^karelia22s.*)" +} + diff --git a/config/ptz/2023-winter/day2/events.properties b/config/ptz/2023-winter/day2/events.properties deleted file mode 100644 index cfe8c709f..000000000 --- a/config/ptz/2023-winter/day2/events.properties +++ /dev/null @@ -1,9 +0,0 @@ -# 1. Register an application here: https://oauth.yandex.ru -# - Choose Web services -# - Tap Set URL for development -# - Add permission Yandex Contest -> Send and evaluate submissions in contests (contest:submit) -# 2. Get debug token: https://yandex.ru/dev/id/doc/dg/oauth/tasks/get-oauth-token.html -yandex.token=$creds.yandex -yandex.contest_id=45822 -yandex.login_prefix=(^karelia23w.*) -standings.type=YANDEX \ No newline at end of file diff --git a/config/ptz/2023-winter/day2/settings.json b/config/ptz/2023-winter/day2/settings.json new file mode 100644 index 000000000..4c1d4648e --- /dev/null +++ b/config/ptz/2023-winter/day2/settings.json @@ -0,0 +1,7 @@ +{ + "type": "yandex", + "apiKey": "$creds.yandex", + "contestId": 45822, + "loginRegex": "(^karelia23w.*)" +} + diff --git a/config/ptz/2023-winter/day4/events.properties b/config/ptz/2023-winter/day4/events.properties deleted file mode 100644 index a31871dda..000000000 --- a/config/ptz/2023-winter/day4/events.properties +++ /dev/null @@ -1,9 +0,0 @@ -# 1. Register an application here: https://oauth.yandex.ru -# - Choose Web services -# - Tap Set URL for development -# - Add permission Yandex Contest -> Send and evaluate submissions in contests (contest:submit) -# 2. Get debug token: https://yandex.ru/dev/id/doc/dg/oauth/tasks/get-oauth-token.html -yandex.token=$creds.yandex -yandex.contest_id=45824 -yandex.login_prefix=(^karelia23w.*) -standings.type=YANDEX \ No newline at end of file diff --git a/config/ptz/2023-winter/day4/settings.json b/config/ptz/2023-winter/day4/settings.json new file mode 100644 index 000000000..ae69f63ee --- /dev/null +++ b/config/ptz/2023-winter/day4/settings.json @@ -0,0 +1,6 @@ +{ + "type": "yandex", + "apiKey": "$creds.yandex", + "contestId": 45824, + "loginRegex": "(^karelia23w.*)" +} diff --git a/config/ptz/2023-winter/day7/events.properties b/config/ptz/2023-winter/day7/events.properties deleted file mode 100644 index 68c87770f..000000000 --- a/config/ptz/2023-winter/day7/events.properties +++ /dev/null @@ -1,4 +0,0 @@ -standings.type=EJUDGE -url=http://ejudge.opencup.org/~ejudge/feed/icpccamp2023day2.xml - - diff --git a/config/ptz/2023-winter/day7/settings.json b/config/ptz/2023-winter/day7/settings.json new file mode 100644 index 000000000..8a21fd35d --- /dev/null +++ b/config/ptz/2023-winter/day7/settings.json @@ -0,0 +1,6 @@ +{ + "type":"ejudge", + "url":"http://ejudge.opencup.org/~ejudge/feed/icpccamp2023day2.xml" +} + + diff --git a/config/regionalroi/lpk-2021-d1/settings.json b/config/regionalroi/lpk-2021-d1/settings.json new file mode 100644 index 000000000..8e4f6e8b8 --- /dev/null +++ b/config/regionalroi/lpk-2021-d1/settings.json @@ -0,0 +1,5 @@ +{ + "type":"ejudge", + "resultType":"IOI", + "url":"https://ejudge.strategy48.ru/regional-2021-d1.xml" +} \ No newline at end of file diff --git a/config/regionalroi/saratov-2023-d1/events.properties b/config/regionalroi/saratov-2023-d1/events.properties deleted file mode 100644 index 1f61415ca..000000000 --- a/config/regionalroi/saratov-2023-d1/events.properties +++ /dev/null @@ -1,5 +0,0 @@ -cf.api.key=$creds.codeforces_key -cf.api.secret=$creds.codeforces_secret -contest_id=422359 -standings.type=CF - diff --git a/config/regionalroi/saratov-2023-d1/settings.json b/config/regionalroi/saratov-2023-d1/settings.json new file mode 100644 index 000000000..0329c4ac0 --- /dev/null +++ b/config/regionalroi/saratov-2023-d1/settings.json @@ -0,0 +1,7 @@ +{ + "type": "cf", + "apiKey": "$creds.codeforces_key", + "apiSecret": "$creds.codeforces_secret", + "contestId": 422359 +} + diff --git a/config/regionalroi/spb-2022-d1/events.properties b/config/regionalroi/spb-2022-d1/events.properties deleted file mode 100644 index d4c27199d..000000000 --- a/config/regionalroi/spb-2022-d1/events.properties +++ /dev/null @@ -1,6 +0,0 @@ -url=regionalroi/spb-2022-d1/ru-olymp-spb-2022-standings-day1-groups.xml -standings.type=PCMS -standings.resultType=ioi - -emulation.startTime=2022-12-29 09:00 -emulation.speed=3 \ No newline at end of file diff --git a/config/regionalroi/spb-2022-d1/settings.json b/config/regionalroi/spb-2022-d1/settings.json new file mode 100644 index 000000000..ab1f8bb3d --- /dev/null +++ b/config/regionalroi/spb-2022-d1/settings.json @@ -0,0 +1,5 @@ +{ + "type": "pcms", + "url": "regionalroi/spb-2022-d1/ru-olymp-spb-2022-standings-day1-groups.xml", + "resultType": "IOI" +} diff --git a/config/regionalroi/spb-2023-d1/events.properties b/config/regionalroi/spb-2023-d1/events.properties deleted file mode 100644 index 2d73dd9f5..000000000 --- a/config/regionalroi/spb-2023-d1/events.properties +++ /dev/null @@ -1,3 +0,0 @@ -url=http://nerc.itmo.ru/school/archive/2022-2023/ru-olymp-spb-2023-standings-day1.xml -standings.type=PCMS -standings.resultType=ioi diff --git a/config/regionalroi/spb-2023-d1/settings.json b/config/regionalroi/spb-2023-d1/settings.json new file mode 100644 index 000000000..d24504fa6 --- /dev/null +++ b/config/regionalroi/spb-2023-d1/settings.json @@ -0,0 +1,6 @@ +{ + "type":"pcms", + "url":"http://nerc.itmo.ru/school/archive/2022-2023/ru-olymp-spb-2023-standings-day1.xml", + "resultType":"IOI" +} + diff --git a/config/regionalroi/spb-2023-d2/events.properties b/config/regionalroi/spb-2023-d2/events.properties deleted file mode 100644 index a5e9fba5a..000000000 --- a/config/regionalroi/spb-2023-d2/events.properties +++ /dev/null @@ -1,3 +0,0 @@ -url=http://nerc.itmo.ru/school/archive/2022-2023/ru-olymp-spb-2023-standings-day2.xml -standings.type=PCMS -standings.resultType=ioi diff --git a/config/regionalroi/spb-2023-d2/settings.json b/config/regionalroi/spb-2023-d2/settings.json new file mode 100644 index 000000000..3fba5d9e5 --- /dev/null +++ b/config/regionalroi/spb-2023-d2/settings.json @@ -0,0 +1,6 @@ +{ + "type":"pcms", + "url":"http://nerc.itmo.ru/school/archive/2022-2023/ru-olymp-spb-2023-standings-day2.xml", + "resultType":"IOI" +} + diff --git a/config/regionalroi/tomsk-2016-d1/events.properties b/config/regionalroi/tomsk-2016-d1/events.properties deleted file mode 100644 index ca9d22fd5..000000000 --- a/config/regionalroi/tomsk-2016-d1/events.properties +++ /dev/null @@ -1,5 +0,0 @@ -yandex.token=$creds.yandex -yandex.contest_id=2121 -yandex.login_prefix=(^roi16-.*) -standings.type=YANDEX -standings.resultType=IOI \ No newline at end of file diff --git a/config/regionalroi/tomsk-2016-d1/settings.json b/config/regionalroi/tomsk-2016-d1/settings.json new file mode 100644 index 000000000..4c9d556e9 --- /dev/null +++ b/config/regionalroi/tomsk-2016-d1/settings.json @@ -0,0 +1,8 @@ +{ + "type": "yandex", + "apiKey": "$creds.yandex", + "contestId": 2121, + "resultType": "IOI", + "loginRegex": "(^roi16-.*)" +} + diff --git a/config/roi/2021/events.properties b/config/roi/2021/events.properties deleted file mode 100644 index 8dfe2c4ff..000000000 --- a/config/roi/2021/events.properties +++ /dev/null @@ -1,10 +0,0 @@ -login=admin -password=adm1n -url=http://10.10.0.3/standings/standings-live.xml -teams.url=participants.xml -problems.url=problems.xml -problems.number=8 -standings.type=IOIPCMS - -running.time=18000000 -freeze.time=18000000 \ No newline at end of file diff --git a/config/roi/2021/mainscreen.properties b/config/roi/2021/mainscreen.properties deleted file mode 100644 index 1cebdbf6c..000000000 --- a/config/roi/2021/mainscreen.properties +++ /dev/null @@ -1,79 +0,0 @@ -#width=1280 -#height=720 -width=1920 -height=1080 -rate=25 -output.file=d:/work/image.bin -output.mode=file -#output.mode=window - -update.wait=500 -backup.persons=persons.txt -backup.advertisements=advertisements.txt -breakingnews.time=20000 -breakingnews.runs.number=10 -breakingnews.patterns.filename=patterns.txt -standings.blinking.time=10000 -advertisement.time=50000 -person.time=50000 -latency.time=2000 -data.update=1000 -data.host=localhost -data.port=25675 - -info.types=screen;camera -#info.screen=http://192.168.1.207:9080/video/screen/%d -#info.camera=http://192.168.1.207:9080/video/camera/%d -#info.record=http://192.168.1.207:9080/video/reaction/%d -info.screen=http://192.168.18.38:80%02d -info.camera=http://192.168.18.38:81%02d -#info.camera=https://live:evMUzdqM@192.168.1.207/video/webcam/%s -#info.video=teamVideos/%s.mp4 -#info.record=pics/team.jpg -#info.types=photo;screen -#info.video=teamVideos/%03d.mp4 -#pics/BigBuckBunny_320x180.mp4 -#pics/team.jpg -#info.screen=pics/BigBuckBunny_320x180.mp4 -#pics/screen.png - -sleep.time=20000 -automated.show.time=40000 -automated.info=screen -team.double.video=false - -ticker.rotate.time=10000 -ticker.logo=#Clock#;NERC 2020 -ticker.logo.time=5000 -ticker.clock.time=20000 -ticker.logo.change.time=1000 - -queue.show.verdict=true - -overlayed.delay=3000 - -top.teams=S077,S118,S113,S089,S128,S099,S012,S086,S007,S050,S121,S110,S062 -onsite.teams=.* - -stylesheet=stylesheets/wf.jss - -polls.backup.file=polls.txt -poll.show.time=20000 -poll.top.teams=5 - -twitch.chat.server=irc.chat.twitch.tv -twitch.chat.username=aksenov239 -twitch.chat.password=oauth:8yb7ygy3ey2wdwmlkvd7bs2o8guwf3 -twitch.chat.channel=#aksenov239;#icpclive1;#icpclive_ru - -twitter.hashtag=#NERC2020 - -word.statistics.backup.file=words-statistics.txt -word.statistics.words=tweets;goose;energy -word.statistics.tweets.text=$tweets$ -word.statistics.tweets.picture= -word.statistics.goose.text=(*)> -word.statistics.goose.picture=pics/goose.jpg -word.statistics.energy.text=ί-- ??φ Π?Ž_Π?Ž ί-ι??φ -word.statistics.energy.picture=pics/energy.jpg -word.statistics.word.show.time=10000 diff --git a/config/roi/2021/problems.xml b/config/roi/2021/problems.xml deleted file mode 100644 index 0b850cc46..000000000 --- a/config/roi/2021/problems.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/config/roi/2021/settings.json b/config/roi/2021/settings.json new file mode 100644 index 000000000..45c3c4b94 --- /dev/null +++ b/config/roi/2021/settings.json @@ -0,0 +1,7 @@ +{ + "type":"pcms", + "login":"admin", + "password":"adm1n", + "url":"http://10.10.0.3/standings/standings-live.xml", + "resultType":"IOI" +} diff --git a/config/roi/2022/day1/events.properties b/config/roi/2022/day1/events.properties deleted file mode 100644 index 8ab85eab5..000000000 --- a/config/roi/2022/day1/events.properties +++ /dev/null @@ -1,15 +0,0 @@ -login=admin -password=adm1n -url=roi-2022-day1/standings-live-day1.xml -teams.url=roi-2022-day1/participants.xml -problems.url=roi-2022-day1/problems.xml -problems.number=4 -standings.type=PCMS -standings.resultType=ioi -standings.maxScore=100 - -running.time=18000000 -freeze.time=18000000 - -emulation.speed=15 -emulation.startTime=now diff --git a/config/roi/2022/day1/mainscreen.properties b/config/roi/2022/day1/mainscreen.properties deleted file mode 100644 index 433d8fa8b..000000000 --- a/config/roi/2022/day1/mainscreen.properties +++ /dev/null @@ -1,79 +0,0 @@ -#width=1280 -#height=720 -width=1920 -height=1080 -rate=25 -output.file=c:/work/image.bin -output.mode=file -#output.mode=window - -update.wait=500 -backup.persons=persons.txt -backup.advertisements=advertisements.txt -breakingnews.time=20000 -breakingnews.runs.number=10 -breakingnews.patterns.filename=patterns.txt -standings.blinking.time=10000 -advertisement.time=50000 -person.time=50000 -latency.time=2000 -data.update=1000 -data.host=localhost -data.port=25675 - -info.types=screen;camera -#info.screen=http://192.168.1.207:9080/video/screen/%d -#info.camera=http://192.168.1.207:9080/video/camera/%d -#info.record=http://192.168.1.207:9080/video/reaction/%d -info.screen=http://192.168.18.38:80%02d -info.camera=http://192.168.18.38:81%02d -#info.camera=https://live:evMUzdqM@192.168.1.207/video/webcam/%s -#info.video=teamVideos/%s.mp4 -#info.record=pics/team.jpg -#info.types=photo;screen -#info.video=teamVideos/%03d.mp4 -#pics/BigBuckBunny_320x180.mp4 -#pics/team.jpg -#info.screen=pics/BigBuckBunny_320x180.mp4 -#pics/screen.png - -sleep.time=20000 -automated.show.time=40000 -automated.info=screen -team.double.video=false - -ticker.rotate.time=10000 -ticker.logo=#Clock#;ВсОШ 2022 -ticker.logo.time=5000 -ticker.clock.time=20000 -ticker.logo.change.time=1000 - -queue.show.verdict=true - -overlayed.delay=3000 - -top.teams=S077,S118,S113,S089,S128,S099,S012,S086,S007,S050,S121,S110,S062 -onsite.teams=.* - -stylesheet=stylesheets/wf.jss - -polls.backup.file=polls.txt -poll.show.time=20000 -poll.top.teams=5 - -twitch.chat.server=irc.chat.twitch.tv -twitch.chat.username=aksenov239 -twitch.chat.password=oauth:8yb7ygy3ey2wdwmlkvd7bs2o8guwf3 -twitch.chat.channel=#aksenov239;#icpclive1;#icpclive_ru - -twitter.hashtag=#ВсОШ2022 - -word.statistics.backup.file=words-statistics.txt -word.statistics.words=tweets;goose;energy -word.statistics.tweets.text=$tweets$ -word.statistics.tweets.picture= -word.statistics.goose.text=(*)> -word.statistics.goose.picture=pics/goose.jpg -word.statistics.energy.text=ί-- ??φ Π?Ž_Π?Ž ί-ι??φ -word.statistics.energy.picture=pics/energy.jpg -word.statistics.word.show.time=10000 diff --git a/config/roi/2022/day1/problems.xml b/config/roi/2022/day1/problems.xml deleted file mode 100644 index 75e4e9316..000000000 --- a/config/roi/2022/day1/problems.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/config/roi/2022/day1/settings.json b/config/roi/2022/day1/settings.json new file mode 100644 index 000000000..2cfa630a3 --- /dev/null +++ b/config/roi/2022/day1/settings.json @@ -0,0 +1,7 @@ +{ + "type": "pcms", + "login": "admin", + "password": "adm1n", + "url": "roi-2022-day1/standings-live-day1.xml", + "resultType": "IOI" +} diff --git a/config/roi/2022/day2/events.properties b/config/roi/2022/day2/events.properties deleted file mode 100644 index f3a52b49e..000000000 --- a/config/roi/2022/day2/events.properties +++ /dev/null @@ -1,10 +0,0 @@ -login=admin -password=adm1n -url=http://10.10.0.3/standings/standings-live.xml -teams.url=archive/roi-2022-day2/participants.xml -problems.url=archive/roi-2022-day2/problems.xml -problems.number=8 -standings.type=IOIPCMS - -running.time=18000000 -freeze.time=18000000 \ No newline at end of file diff --git a/config/roi/2022/day2/mainscreen.properties b/config/roi/2022/day2/mainscreen.properties deleted file mode 100644 index ac3c1a3a1..000000000 --- a/config/roi/2022/day2/mainscreen.properties +++ /dev/null @@ -1,79 +0,0 @@ -#width=1280 -#height=720 -width=1920 -height=1080 -rate=25 -output.file=c:/work/image.bin -output.mode=file -#output.mode=window - -update.wait=500 -backup.persons=persons.txt -backup.advertisements=advertisements.txt -breakingnews.time=20000 -breakingnews.runs.number=10 -breakingnews.patterns.filename=patterns.txt -standings.blinking.time=10000 -advertisement.time=50000 -person.time=50000 -latency.time=2000 -data.update=1000 -data.host=localhost -data.port=25675 - -info.types=screen;camera -#info.screen=http://192.168.1.207:9080/video/screen/%d -#info.camera=http://192.168.1.207:9080/video/camera/%d -#info.record=http://192.168.1.207:9080/video/reaction/%d -info.screen=http://192.168.18.38:80%02d -info.camera=http://192.168.18.38:81%02d -#info.camera=https://live:evMUzdqM@192.168.1.207/video/webcam/%s -#info.video=teamVideos/%s.mp4 -#info.record=pics/team.jpg -#info.types=photo;screen -#info.video=teamVideos/%03d.mp4 -#pics/BigBuckBunny_320x180.mp4 -#pics/team.jpg -#info.screen=pics/BigBuckBunny_320x180.mp4 -#pics/screen.png - -sleep.time=20000 -automated.show.time=40000 -automated.info=screen -team.double.video=false - -ticker.rotate.time=10000 -ticker.logo=#Clock#;NERC 2020 -ticker.logo.time=5000 -ticker.clock.time=20000 -ticker.logo.change.time=1000 - -queue.show.verdict=true - -overlayed.delay=3000 - -top.teams=S077,S118,S113,S089,S128,S099,S012,S086,S007,S050,S121,S110,S062 -onsite.teams=.* - -stylesheet=stylesheets/wf.jss - -polls.backup.file=polls.txt -poll.show.time=20000 -poll.top.teams=5 - -twitch.chat.server=irc.chat.twitch.tv -twitch.chat.username=aksenov239 -twitch.chat.password=oauth:8yb7ygy3ey2wdwmlkvd7bs2o8guwf3 -twitch.chat.channel=#aksenov239;#icpclive1;#icpclive_ru - -twitter.hashtag=#NERC2020 - -word.statistics.backup.file=words-statistics.txt -word.statistics.words=tweets;goose;energy -word.statistics.tweets.text=$tweets$ -word.statistics.tweets.picture= -word.statistics.goose.text=(*)> -word.statistics.goose.picture=pics/goose.jpg -word.statistics.energy.text=ί-- ??φ Π?Ž_Π?Ž ί-ι??φ -word.statistics.energy.picture=pics/energy.jpg -word.statistics.word.show.time=10000 diff --git a/config/roi/2022/day2/problems.xml b/config/roi/2022/day2/problems.xml deleted file mode 100644 index 149dbe26c..000000000 --- a/config/roi/2022/day2/problems.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/config/roi/2022/day2/settings.json b/config/roi/2022/day2/settings.json new file mode 100644 index 000000000..dd2266b03 --- /dev/null +++ b/config/roi/2022/day2/settings.json @@ -0,0 +1,7 @@ +{ + "type":"pcms", + "login":"admin", + "password":"adm1n", + "url":"http://10.10.0.3/standings/standings-live.xml", + "resultType":"IOI" +} diff --git a/config/roi/2022/test/events.properties b/config/roi/2022/test/events.properties deleted file mode 100644 index 074750773..000000000 --- a/config/roi/2022/test/events.properties +++ /dev/null @@ -1,10 +0,0 @@ -login=admin -password=adm1n -url=http://172.18.1.253/standings/standings-live.xml -teams.url=archive/roi-2022-test/participants.xml -problems.url=archive/roi-2022-test/problems.xml -problems.number=6 -standings.type=IOIPCMS - -running.time=18000000 -freeze.time=18000000 \ No newline at end of file diff --git a/config/roi/2022/test/mainscreen.properties b/config/roi/2022/test/mainscreen.properties deleted file mode 100644 index 433d8fa8b..000000000 --- a/config/roi/2022/test/mainscreen.properties +++ /dev/null @@ -1,79 +0,0 @@ -#width=1280 -#height=720 -width=1920 -height=1080 -rate=25 -output.file=c:/work/image.bin -output.mode=file -#output.mode=window - -update.wait=500 -backup.persons=persons.txt -backup.advertisements=advertisements.txt -breakingnews.time=20000 -breakingnews.runs.number=10 -breakingnews.patterns.filename=patterns.txt -standings.blinking.time=10000 -advertisement.time=50000 -person.time=50000 -latency.time=2000 -data.update=1000 -data.host=localhost -data.port=25675 - -info.types=screen;camera -#info.screen=http://192.168.1.207:9080/video/screen/%d -#info.camera=http://192.168.1.207:9080/video/camera/%d -#info.record=http://192.168.1.207:9080/video/reaction/%d -info.screen=http://192.168.18.38:80%02d -info.camera=http://192.168.18.38:81%02d -#info.camera=https://live:evMUzdqM@192.168.1.207/video/webcam/%s -#info.video=teamVideos/%s.mp4 -#info.record=pics/team.jpg -#info.types=photo;screen -#info.video=teamVideos/%03d.mp4 -#pics/BigBuckBunny_320x180.mp4 -#pics/team.jpg -#info.screen=pics/BigBuckBunny_320x180.mp4 -#pics/screen.png - -sleep.time=20000 -automated.show.time=40000 -automated.info=screen -team.double.video=false - -ticker.rotate.time=10000 -ticker.logo=#Clock#;ВсОШ 2022 -ticker.logo.time=5000 -ticker.clock.time=20000 -ticker.logo.change.time=1000 - -queue.show.verdict=true - -overlayed.delay=3000 - -top.teams=S077,S118,S113,S089,S128,S099,S012,S086,S007,S050,S121,S110,S062 -onsite.teams=.* - -stylesheet=stylesheets/wf.jss - -polls.backup.file=polls.txt -poll.show.time=20000 -poll.top.teams=5 - -twitch.chat.server=irc.chat.twitch.tv -twitch.chat.username=aksenov239 -twitch.chat.password=oauth:8yb7ygy3ey2wdwmlkvd7bs2o8guwf3 -twitch.chat.channel=#aksenov239;#icpclive1;#icpclive_ru - -twitter.hashtag=#ВсОШ2022 - -word.statistics.backup.file=words-statistics.txt -word.statistics.words=tweets;goose;energy -word.statistics.tweets.text=$tweets$ -word.statistics.tweets.picture= -word.statistics.goose.text=(*)> -word.statistics.goose.picture=pics/goose.jpg -word.statistics.energy.text=ί-- ??φ Π?Ž_Π?Ž ί-ι??φ -word.statistics.energy.picture=pics/energy.jpg -word.statistics.word.show.time=10000 diff --git a/config/roi/2022/test/problems.xml b/config/roi/2022/test/problems.xml deleted file mode 100644 index dd06c7d1b..000000000 --- a/config/roi/2022/test/problems.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/config/roi/2022/test/settings.json b/config/roi/2022/test/settings.json new file mode 100644 index 000000000..1d7766e6e --- /dev/null +++ b/config/roi/2022/test/settings.json @@ -0,0 +1,7 @@ +{ + "type":"pcms", + "login":"admin", + "password":"adm1n", + "url":"http://172.18.1.253/standings/standings-live.xml", + "resultType":"IOI" +} diff --git a/config/roi/2023/day1/events.properties b/config/roi/2023/day1/events.properties deleted file mode 100644 index 4911c49eb..000000000 --- a/config/roi/2023/day1/events.properties +++ /dev/null @@ -1,4 +0,0 @@ -#url=http://192.168.90.248/standings/standings-live.xml -url=roi/2023/day1/day1.xml -standings.type=PCMS -standings.resultType=ioi diff --git a/config/roi/2023/day1/settings.json b/config/roi/2023/day1/settings.json new file mode 100644 index 000000000..91fabe8a6 --- /dev/null +++ b/config/roi/2023/day1/settings.json @@ -0,0 +1,6 @@ +{ + "type":"pcms", + "#url":"http://192.168.90.248/standings/standings-live.xml", + "url":"roi/2023/day1/day1.xml", + "resultType":"IOI" +} \ No newline at end of file diff --git a/config/roi/2023/day2/advanced.json b/config/roi/2023/day2/advanced.json index c6e928ff2..a38c3f4dc 100644 --- a/config/roi/2023/day2/advanced.json +++ b/config/roi/2023/day2/advanced.json @@ -1,5 +1,5 @@ { - "startTime": "2023-04-05 9:57:00", + "startTime": "2023-04-05 09:57:00", "problemOverrides": { "1":{"color":"#e6194B"}, "2":{"color":"#3cb44b"}, diff --git a/config/roi/2023/day2/events.properties b/config/roi/2023/day2/events.properties deleted file mode 100644 index 2b0b099f2..000000000 --- a/config/roi/2023/day2/events.properties +++ /dev/null @@ -1,4 +0,0 @@ -url=roi/2023/day2/day2.xml -#url=http://192.168.90.248/standings/standings-live.xml -standings.type=PCMS -standings.resultType=ioi diff --git a/config/roi/2023/day2/settings.json b/config/roi/2023/day2/settings.json new file mode 100644 index 000000000..31379391e --- /dev/null +++ b/config/roi/2023/day2/settings.json @@ -0,0 +1,6 @@ +{ + "type": "pcms", + "#url": "http://192.168.90.248/standings/standings-live.xml", + "url": "roi/2023/day2/day2.xml", + "resultType": "IOI" +} diff --git a/config/roi/2023/it-sequel/events.properties b/config/roi/2023/it-sequel/events.properties deleted file mode 100644 index a4c9a8926..000000000 --- a/config/roi/2023/it-sequel/events.properties +++ /dev/null @@ -1,4 +0,0 @@ -url=roi/2023/it-sequel/it-sequel.xml -#url=http://192.168.90.248/standings/standings-live.xml -standings.type=PCMS -standings.resultType=ioi diff --git a/config/roi/2023/it-sequel/settings.json b/config/roi/2023/it-sequel/settings.json new file mode 100644 index 000000000..f9c77a561 --- /dev/null +++ b/config/roi/2023/it-sequel/settings.json @@ -0,0 +1,7 @@ +{ + "type": "pcms", + "#url": "http://192.168.90.248/standings/standings-live.xml", + "url": "roi/2023/it-sequel/it-sequel.xml", + "resultType": "IOI" +} + diff --git a/config/roi/2023/test/events.properties b/config/roi/2023/test/events.properties deleted file mode 100644 index a23b6a8c6..000000000 --- a/config/roi/2023/test/events.properties +++ /dev/null @@ -1,6 +0,0 @@ -url=roi/2023/test/standings-live.xml -standings.type=PCMS -standings.resultType=ioi - -emulation.startTime=now -emulation.speed=1 diff --git a/config/roi/2023/test/settings.json b/config/roi/2023/test/settings.json new file mode 100644 index 000000000..9bb80f5d4 --- /dev/null +++ b/config/roi/2023/test/settings.json @@ -0,0 +1,5 @@ +{ + "type":"pcms", + "url":"roi/2023/test/standings-live.xml", + "resultType":"IOI" +} diff --git a/config/spbkoshp/2022/events.properties b/config/spbkoshp/2022/events.properties deleted file mode 100644 index c04a1f618..000000000 --- a/config/spbkoshp/2022/events.properties +++ /dev/null @@ -1,2 +0,0 @@ -url=https://nerc.itmo.ru/school/archive/2022-2023/ru-olymp-team-spb-2022-standings.xml -standings.type=PCMS diff --git a/config/spbkoshp/2022/settings.json b/config/spbkoshp/2022/settings.json new file mode 100644 index 000000000..71ddf3ef8 --- /dev/null +++ b/config/spbkoshp/2022/settings.json @@ -0,0 +1,4 @@ +{ + "type":"pcms", + "url":"https://nerc.itmo.ru/school/archive/2022-2023/ru-olymp-team-spb-2022-standings.xml" +} \ No newline at end of file diff --git a/config/spbsu/2023-may/main/settings.json b/config/spbsu/2023-may/main/settings.json new file mode 100644 index 000000000..c77d28369 --- /dev/null +++ b/config/spbsu/2023-may/main/settings.json @@ -0,0 +1,5 @@ +{ + "type":"testsys", + "#url":"https://nerc.itmo.ru/jm230514.dat for resolver", + "url":"http://acm.math.spbu.ru/cgi-bin/view.pl/m230514.dat" +} \ No newline at end of file diff --git a/config/spbsu/2023-may/trial/events.properties b/config/spbsu/2023-may/trial/events.properties deleted file mode 100644 index a20464e48..000000000 --- a/config/spbsu/2023-may/trial/events.properties +++ /dev/null @@ -1,2 +0,0 @@ -standings.type=TESTSYS -url=http://acm.math.spbu.ru/cgi-bin/view.pl/m230514p.dat \ No newline at end of file diff --git a/config/spbsu/2023-may/trial/settings.json b/config/spbsu/2023-may/trial/settings.json new file mode 100644 index 000000000..f8dbcde06 --- /dev/null +++ b/config/spbsu/2023-may/trial/settings.json @@ -0,0 +1,4 @@ +{ + "type":"testsys", + "url":"http://acm.math.spbu.ru/cgi-bin/view.pl/m230514p.dat" +} \ No newline at end of file diff --git a/config/technocup/2018/events.properties b/config/technocup/2018/events.properties deleted file mode 100644 index a4d9befa3..000000000 --- a/config/technocup/2018/events.properties +++ /dev/null @@ -1,8 +0,0 @@ -cf.api.key=$creds.codeforces_key -cf.api.secret=$creds.codeforces_secret -contest_id=944 -standings.type=CF - - -emulation.startTime=2022-12-29 16:35 -emulation.speed=1 \ No newline at end of file diff --git a/config/technocup/2018/settings.json b/config/technocup/2018/settings.json new file mode 100644 index 000000000..5c7c29458 --- /dev/null +++ b/config/technocup/2018/settings.json @@ -0,0 +1,6 @@ +{ + "type": "cf", + "apiKey": "$creds.codeforces_key", + "apiSecret": "$creds.codeforces_secret", + "contestId": 944 +} diff --git a/config/test/.gitkeep b/config/test/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/config/vkcup/2021/events.properties b/config/vkcup/2021/events.properties deleted file mode 100644 index 8de29e334..000000000 --- a/config/vkcup/2021/events.properties +++ /dev/null @@ -1,4 +0,0 @@ -cf.api.key=$creds.codeforces_key -cf.api.secret=$creds.codeforces_secret -contest_id=1563 -standings.type=CF diff --git a/config/vkcup/2021/settings.json b/config/vkcup/2021/settings.json new file mode 100644 index 000000000..a63b1b26b --- /dev/null +++ b/config/vkcup/2021/settings.json @@ -0,0 +1,6 @@ +{ + "type": "cf", + "apiKey": "$creds.codeforces_key", + "apiSecret": "$creds.codeforces_secret", + "contestId": 1563 +} \ No newline at end of file diff --git a/config/vkcup/2022/elim/events.properties b/config/vkcup/2022/elim/events.properties deleted file mode 100644 index 5c304f424..000000000 --- a/config/vkcup/2022/elim/events.properties +++ /dev/null @@ -1,7 +0,0 @@ -cf.api.key=$creds.codeforces_key -cf.api.secret=$creds.codeforces_secret -contest_id=1781 -standings.type=CF - -emulation.startTime=now -emulation.speed=3 diff --git a/config/vkcup/2022/elim/settings.json b/config/vkcup/2022/elim/settings.json new file mode 100644 index 000000000..3a48d5984 --- /dev/null +++ b/config/vkcup/2022/elim/settings.json @@ -0,0 +1,6 @@ +{ + "type": "cf", + "apiKey": "$creds.codeforces_key", + "apiSecret": "$creds.codeforces_secret", + "contestId": 1781 +} diff --git a/config/vkcup/2022/final/settings.json b/config/vkcup/2022/final/settings.json new file mode 100644 index 000000000..8b3d0640f --- /dev/null +++ b/config/vkcup/2022/final/settings.json @@ -0,0 +1,7 @@ +{ + "type": "cf", + "apiKey": "$creds.codeforces_key", + "apiSecret": "$creds.codeforces_secret", + "contestId": 1784 +} + diff --git a/config/vkoshp/2016/events.properties b/config/vkoshp/2016/events.properties deleted file mode 100644 index d67b47e73..000000000 --- a/config/vkoshp/2016/events.properties +++ /dev/null @@ -1,11 +0,0 @@ -login=test -password=test -url=http://neerc.ifmo.ru/school/russia-team/standings.xml -participants=parties.xml -problems.url=problems.xml -problemsNumber=11 -standings.type=PCMS - -contest.length=18000000 -#5400000 -freeze.time=14400000 \ No newline at end of file diff --git a/config/vkoshp/2016/mainscreen.properties b/config/vkoshp/2016/mainscreen.properties deleted file mode 100644 index c96ba96b5..000000000 --- a/config/vkoshp/2016/mainscreen.properties +++ /dev/null @@ -1,40 +0,0 @@ -update.wait=1000 -backup.persons=persons.txt -backup.advertisements=advertisements.txt -breakingnews.time=20000 -breakingnews.runs.number=10 -breakingnews.patterns.filename=patterns.txt -standings.blinking.time=10000 -advertisement.time=20000 -person.time=20000 -latency.time=2000 -data.update=1000 -data.host=192.168.1.122 -data.port=25675 -info.types=screen -main.type=photo -info.photo=pics/team.jpg -info.screen=http://192.168.0.8:8008/%d/%d -sleep.time=15000 -automated.show.time=20000 -automated.info=screen -team.double.video=false - -queue.show.verdict=true - -ticker.rotate.time=20000 -ticker.logo=NEERC 2016;#NEERC -ticker.logo.time=10000 -ticker.logo.change.time=10000 - -overlayed.delay=3000 - -width=1280 -height=720 - -rate=25 - -top.teams.file=vkoshp-2016/topteams.txt -onsite.teams=S.* - -stylesheet=stylesheets/wf.jss diff --git a/config/vkoshp/2016/problems.xml b/config/vkoshp/2016/problems.xml deleted file mode 100644 index 54d92c3cf..000000000 --- a/config/vkoshp/2016/problems.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/config/vkoshp/2016/settings.json b/config/vkoshp/2016/settings.json new file mode 100644 index 000000000..e44185569 --- /dev/null +++ b/config/vkoshp/2016/settings.json @@ -0,0 +1,4 @@ +{ + "type":"pcms", + "url":"http://nerc.itmo.ru/school/archive/2016-2017/ru-olymp-team-russia-2016-standings.xml" +} diff --git a/config/vkoshp/2016/topteams.txt b/config/vkoshp/2016/topteams.txt deleted file mode 100644 index f9e1cc9c1..000000000 --- a/config/vkoshp/2016/topteams.txt +++ /dev/null @@ -1,2 +0,0 @@ -S520 -S502 \ No newline at end of file diff --git a/config/vkoshp/2017/events.properties b/config/vkoshp/2017/events.properties deleted file mode 100644 index 19d1f64dc..000000000 --- a/config/vkoshp/2017/events.properties +++ /dev/null @@ -1,11 +0,0 @@ -login=test -password=test -url=http://neerc.ifmo.ru/school/russia-team/standings.xml -teams.url=parties.xml -problems.url=problems.xml -problems.number=13 -standings.type=PCMS - -contest.length=18000000 -#18000000 -freeze.time=14400000 \ No newline at end of file diff --git a/config/vkoshp/2017/mainscreen.properties b/config/vkoshp/2017/mainscreen.properties deleted file mode 100644 index 8145ce07f..000000000 --- a/config/vkoshp/2017/mainscreen.properties +++ /dev/null @@ -1,57 +0,0 @@ -update.wait=1000 -backup.persons=persons.txt -backup.advertisements=advertisements.txt -breakingnews.time=20000 -breakingnews.runs.number=10 -breakingnews.patterns.filename=patterns.txt -standings.blinking.time=10000 -advertisement.time=5000 -person.time=5000 -latency.time=2000 -data.update=1000 -data.host=192.168.1.144 -data.port=25675 -info.types=screen -main.type=screen -info.screen=http://192.168.0.8:8008/%d/%d -sleep.time=10000 -automated.show.time=20000 -automated.info=screen -team.double.video=false - -queue.show.verdict=true - -ticker.rotate.time=10000 -ticker.logo=#Clock#,ВКОШП 2017;#VKOSHP -ticker.logo.time=5000 -ticker.clock.time=20000 -ticker.logo.change.time=1000 - -overlayed.delay=3000 - -width=1280 -height=720 - -rate=25 - -top.teams.file=vkoshp-2017/topteams.txt -onsite.teams=S.* - -stylesheet=stylesheets/wf.jss - -polls.backup.file=polls.txt -poll.show.time=20000 -poll.top.teams=5 - -twitch.chat.server=irc.chat.twitch.tv -twitch.chat.username=aksenov239 -twitch.chat.password=oauth:8yb7ygy3ey2wdwmlkvd7bs2o8guwf3 -twitch.chat.channel=#aksenov239;#icpclive1;#icpclive_ru - -twitter.hashtag=#NEERC2017 - -word.statistics.backup.file=words-statistics.txt -word.statistics.words=tweets -word.statistics.tweets.text=$tweets$ - -outputFile=d:/work/image.bin diff --git a/config/vkoshp/2017/problems.xml b/config/vkoshp/2017/problems.xml deleted file mode 100644 index d751138b2..000000000 --- a/config/vkoshp/2017/problems.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/config/vkoshp/2017/settings.json b/config/vkoshp/2017/settings.json new file mode 100644 index 000000000..e5fb90229 --- /dev/null +++ b/config/vkoshp/2017/settings.json @@ -0,0 +1,4 @@ +{ + "type":"pcms", + "url":"http://nerc.itmo.ru/school/archive/2017-2018/ru-olymp-team-russia-2017-standings.xml" +} diff --git a/config/vkoshp/2017/topteams.txt b/config/vkoshp/2017/topteams.txt deleted file mode 100644 index 37c3d14e2..000000000 --- a/config/vkoshp/2017/topteams.txt +++ /dev/null @@ -1,6 +0,0 @@ -S102 -S308 -S504 -S303 -S110 -S211 diff --git a/config/vkoshp/2019/events.properties b/config/vkoshp/2019/events.properties deleted file mode 100644 index 1a8d9e7e4..000000000 --- a/config/vkoshp/2019/events.properties +++ /dev/null @@ -1,10 +0,0 @@ -login=admin -password=adm1n -url=http://nerc.itmo.ru/school/archive/2019-2020/ru-olymp-team-russia-2019-standings.xml -teams.url=participants.xml -problems.url=problems-practice.xml -problems.number=8 -standings.type=PCMS - -running.time=18000000 -freeze.time=14400000 diff --git a/config/vkoshp/2019/mainscreen.properties b/config/vkoshp/2019/mainscreen.properties deleted file mode 100644 index 6e6399ed7..000000000 --- a/config/vkoshp/2019/mainscreen.properties +++ /dev/null @@ -1,78 +0,0 @@ -#width=1280 -#height=720 -width=1920 -height=1080 -rate=25 -output.file=c:/work/image.bin -output.mode=file -#output.mode=window - -update.wait=500 -backup.persons=persons.txt -backup.advertisements=advertisements.txt -breakingnews.time=20000 -breakingnews.runs.number=10 -breakingnews.patterns.filename=patterns.txt -standings.blinking.time=10000 -advertisement.time=50000 -person.time=50000 -latency.time=2000 -data.update=1000 -data.host=localhost -data.port=25675 - -info.types=screen; -#info.screen=http://192.168.1.207:9080/video/screen/%d -#info.camera=http://192.168.1.207:9080/video/camera/%d -#info.record=http://192.168.1.207:9080/video/reaction/%d -info.screen=http://10.240.%d.2:8088 -#info.camera=https://live:evMUzdqM@192.168.1.207/video/webcam/%s -#info.video=teamVideos/%s.mp4 -#info.record=pics/team.jpg -#info.types=photo;screen -#info.video=teamVideos/%03d.mp4 -#pics/BigBuckBunny_320x180.mp4 -#pics/team.jpg -#info.screen=pics/BigBuckBunny_320x180.mp4 -#pics/screen.png - -sleep.time=20000 -automated.show.time=40000 -automated.info=screen -team.double.video=false - -ticker.rotate.time=10000 -ticker.logo=#Clock#;ВКОШП 2019 -ticker.logo.time=5000 -ticker.clock.time=20000 -ticker.logo.change.time=1000 - -queue.show.verdict=true - -overlayed.delay=3000 - -top.teams=S101,S111,S306,S105 -onsite.teams=S.* - -stylesheet=stylesheets/wf.jss - -polls.backup.file=polls.txt -poll.show.time=20000 -poll.top.teams=5 - -twitch.chat.server=irc.chat.twitch.tv -twitch.chat.username=aksenov239 -twitch.chat.password=oauth:8yb7ygy3ey2wdwmlkvd7bs2o8guwf3 -twitch.chat.channel=#aksenov239;#icpclive1;#icpclive_ru - -twitter.hashtag=#ВКОШП2019 - -word.statistics.backup.file=words-statistics.txt -word.statistics.words=tweets;goose;energy -word.statistics.tweets.text=$tweets$ -word.statistics.tweets.picture= -word.statistics.goose.text=(*)> -word.statistics.goose.picture=pics/goose.jpg -word.statistics.energy.text=ί-- ??φ Π?Ž_Π?Ž ί-ι??φ -word.statistics.energy.picture=pics/energy.jpg -word.statistics.word.show.time=10000 diff --git a/config/vkoshp/2019/problems-practice.xml b/config/vkoshp/2019/problems-practice.xml deleted file mode 100644 index 75334f65d..000000000 --- a/config/vkoshp/2019/problems-practice.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/config/vkoshp/2019/problems.xml b/config/vkoshp/2019/problems.xml deleted file mode 100644 index 2ecffb2ef..000000000 --- a/config/vkoshp/2019/problems.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/config/vkoshp/2019/settings.json b/config/vkoshp/2019/settings.json new file mode 100644 index 000000000..ff1843163 --- /dev/null +++ b/config/vkoshp/2019/settings.json @@ -0,0 +1,4 @@ +{ + "type":"pcms", + "url":"http://nerc.itmo.ru/school/archive/2019-2020/ru-olymp-team-russia-2019-standings.xml" +} diff --git a/config/vkoshp/2022-junior/events.properties b/config/vkoshp/2022-junior/events.properties deleted file mode 100644 index ef400816c..000000000 --- a/config/vkoshp/2022-junior/events.properties +++ /dev/null @@ -1,5 +0,0 @@ -# this is config file for codeforces contests. Don't remove this line, or BOM will eat you. Insert api key and secret from https://codeforces.com/settings/api below -cf.api.key=$creds.codeforces_key -cf.api.secret=$creds.codeforces_secret -contest_id=373376 -standings.type=CF diff --git a/config/vkoshp/2022-junior/settings.json b/config/vkoshp/2022-junior/settings.json new file mode 100644 index 000000000..8c7b2aeae --- /dev/null +++ b/config/vkoshp/2022-junior/settings.json @@ -0,0 +1,7 @@ +{ + "type": "cf", + "apiKey": "$creds.codeforces_key", + "apiSecret": "$creds.codeforces_secret", + "contestId": 373376 +} + diff --git a/config/vkoshp/2022/events.properties b/config/vkoshp/2022/events.properties deleted file mode 100644 index c100142b5..000000000 --- a/config/vkoshp/2022/events.properties +++ /dev/null @@ -1,2 +0,0 @@ -url=https://nerc.itmo.ru/school/archive/2022-2023/ru-olymp-team-russia-2022-standings.xml -standings.type=PCMS diff --git a/config/vkoshp/2022/settings.json b/config/vkoshp/2022/settings.json new file mode 100644 index 000000000..5e81f59ca --- /dev/null +++ b/config/vkoshp/2022/settings.json @@ -0,0 +1,4 @@ +{ + "type":"pcms", + "url":"https://nerc.itmo.ru/school/archive/2022-2023/ru-olymp-team-russia-2022-standings.xml" +} diff --git a/config/vkoshp/2023-junior/events.properties b/config/vkoshp/2023-junior/events.properties deleted file mode 100644 index 6b288eec6..000000000 --- a/config/vkoshp/2023-junior/events.properties +++ /dev/null @@ -1,5 +0,0 @@ -# this is config file for codeforces contests. Don't remove this line, or BOM will eat you. Insert api key and secret from https://codeforces.com/settings/api below -cf.api.key=$creds.codeforces_key -cf.api.secret=$creds.codeforces_secret -contest_id=432594 -standings.type=CF \ No newline at end of file diff --git a/config/vkoshp/2023-junior/settings.json b/config/vkoshp/2023-junior/settings.json new file mode 100644 index 000000000..2c2f73285 --- /dev/null +++ b/config/vkoshp/2023-junior/settings.json @@ -0,0 +1,6 @@ +{ + "type": "cf", + "apiKey": "$creds.codeforces_key", + "apiSecret": "$creds.codeforces_secret", + "contestId": 432594 +} diff --git a/advanced.json.md b/docs/advanced.json.md similarity index 91% rename from advanced.json.md rename to docs/advanced.json.md index 55ccaeb25..b11b8e67b 100644 --- a/advanced.json.md +++ b/docs/advanced.json.md @@ -1,3 +1,6 @@ +This doc is a bit outdated, although it is still a good source of examples. +Full description of all properties supported can be found [here](https://icpc.io/live-v3/cds/-i-c-p-c-live%20contest%20data%20parser/org.icpclive.api.tunning/-advanced-properties/index.html) + # How to setup advanced.json Apart from ```events.properties``` file, each contest can adjust imported from contest management system using ```advanced.json``` file. @@ -14,7 +17,7 @@ You can adjust received participant information for each separate participant us "hashTag": "#ItMo", "groups": ["SPb ITMO", "SPb"], "isHidden": false, - "isOutOfCompetition": false, + "isOutOfContest": false, "medias": { "screen": { "type": "Video", @@ -30,7 +33,7 @@ You can adjust received participant information for each separate participant us } ``` -`isHidden` and `isOutOfCompetition` can be be applied to groups: +`isHidden` and `isOutOfContest` can be be applied to groups: ``` "groupOverrides": { "test": {"isOutOfContest":true} @@ -38,7 +41,7 @@ You can adjust received participant information for each separate participant us ``` `isHidden`: allows to hide a team or a group of teams from everywhere -`isOutOfCompetition`: replaces team place with * sign, but still shows the team in testing queue, leaderboard and others. +`isOutOfContest`: replaces team place with * sign, but still shows the team in testing queue, leaderboard and others. Also, you can create a template rule for medias, and it would be applied to all teams. diff --git a/docs/development.md b/docs/development.md new file mode 100644 index 000000000..1ceed57e5 --- /dev/null +++ b/docs/development.md @@ -0,0 +1,126 @@ +# Run in development mode + +Requirements: + +* gradle +* jdk +* node:16 +* browser + +Before cloning on Windows configure correct crlf handling + +* `git config --global core.autocrlf false` +* `git config --global core.symlinks true` + +## Developing backend + +### To test your changes: + +1. `live-v3\gradlew :backend:run -Plive.dev.contest=nerc-onsite-2020` + * Or run one of configurations from IDEA stored in .run +2. open http://localhost:8080/admin to control overlay +3. open http://localhost:8080/overlay to view result + +### General backend architecture + +Backend is implemented in kotlin as [ktor](https://ktor.io/docs/) server. + +Admin api endpoints are `/api/admin`. They are using REST-like conventions for naming, +and mostly implemented in `org.icpclive.admin` package. All data is stored in json-files in +contest config directory for now. + +Overlay api endpoints are `/api/overlay`. They are websockets with updates, read by +overlay frontend part. Internally, they are implemented +as [flows](https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/-flow/) +from kotlinx.coroutines. + +Admin and overlay can be hosted over `/admin` and `/overlay` paths as SPA using ktor builtin +SPA hosting. + +Contest systems integrations are implemented in `org.icpclive.cds` package. Currently, +CLICS, PCMS, Codeforces and Yandex.Contest, Ejudge and KRSU are supported. Only ICPC mode +is supported at the moment. + +Basically, to add new contest data provider, you need to implement contest information updates +(start time, list of problems, list of teams, etc.) and runs updates (events like new run, run status changes, partial +and final testing). In simple cases, if you reload all data every time, it can be useful to inherit from FullReloadContestDataSource. + +Everything else should work automatically in the same manner for all CDS sources. + +### Emulation mode + +If `elmulation.startTime` property is defined, instead of regular updating, cds provider need to download all runs once, +and +they would be timely pushed further automatically. This is useful to check everything on already happened contest. + +``` +emulation.speed=10 +emulation.startTime=2022-04-03 22:50 +``` + +Emulation only works if contest is finished. + +## Developing frontend + +We have two front end packages: + +* overlay - webapp that is rendered in OBS (located in `overlay`) +* admin - admin app for controlling the overlay (located in `admin`) + +Install dependencies with `npm ci` in the root path of the project +(see package.json for more details) + +### Running frontend separate from backend + +If you are running locally replace `` with `localhost` + +#### overlay + +Overlay takes base url from environment variable `REACT_APP_WEBSOCKET_URL` +A path to backend's path for websocket connection. +Exposed on /api/overlay path + +Run this in `overlay` directory to start the development server: +Linux: + +``` +REACT_APP_WEBSOCKET_URL=ws://:8080/api/overlay npm run start +``` + +Windows: + +``` +set REACT_APP_WEBSOCKET_URL=ws://:8080/api/overlay +npm run start +``` + +#### admin + +Admin panel takes two urls: + +* `REACT_APP_BACKEND_URL` - for updating data and talking to the backend (exposed in /api/admin) +* `REACT_APP_WEBSOCKET_URL` - for real time updates of presets and settings (exposed in /api/admin) + +Run this in `admin` directory to start the development server: +Linux: + +``` +REACT_APP_BACKEND_URL=http://:8080/api/admin;REACT_APP_WEBSOCKET_URL=ws://:8080/api/admin npm run start +``` + +Windows: + +``` +set REACT_APP_BACKEND_URL=http://:8080/api/admin +set REACT_APP_WEBSOCKET_URL=ws://:8080/api/admin +npm run start +``` + +# Run tests + +Create release in artifacts, then run: +```bash +npm ci +npx playwright install --with-deps +npx playwright test +``` diff --git a/docs/emulation.md b/docs/emulation.md new file mode 100644 index 000000000..77f32265c --- /dev/null +++ b/docs/emulation.md @@ -0,0 +1,33 @@ +### Emulation mode + +Emulation mode is useful to check everything on already happened contest. + +If emulation is defined, instead of regular updating data, +cds provider would download everything once, and events would be timely pushed further automatically. + +Also, emulation can be speeded up several times for faster testing. + +To enable the emulation mode, add following in your `settings.json` file +``` +{ + "emulation": { + "speed": 10, + "startTime": "2022-04-03 22:50" + } +} +``` + +Or, if you are using legacy `events.properties` format: + +``` +emulation.speed=10 +emulation.startTime=2022-04-03 22:50 +``` + +This means that overlay would pretend that the contest was started at 22:50 +local time at the 4-th of March 2022. This is recommended format of time, although +some others would be parsed. Also, you can write `now` and it would be converted to time when +overlay was started. + + +Emulation only works if the contest is finished. diff --git a/docs/settings.md b/docs/settings.md new file mode 100644 index 000000000..57602e994 --- /dev/null +++ b/docs/settings.md @@ -0,0 +1,43 @@ +## TL;DR + +* Examples [contests](https://github.com/icpc/live-v3/tree/main/config/_examples) for all supported contest systems + * [CLICS](https://github.com/icpc/live-v3/tree/main/config/icpc-rmc/2021) + * [PCMS](https://github.com/icpc/live-v3/tree/main/config/icpc-nef/2021-2022/main) + * [Codeforces](https://github.com/icpc/live-v3/tree/main/config/vkoshp/2022-junior) +* See the [full archive](https://github.com/icpc/live-v3/tree/main/config) for more examples + +## Config file + +Main config should be stored within config directory in `settings.json` or `settings.json5` file. +In some outdated examples legacy `events.properties` format is used instead. + +Settings should specify the contest system used and parameters of the contest. +Also, it sometimes contains some abilities to modify received data. + +You can use [json schema file](https://github.com/icpc/live-v3/tree/main/schemas/settings.schema.json) in your text editor to get help with writing config. + +[Here](https://icpc.io/live-v3/cds/-i-c-p-c-live%20contest%20data%20parser/org.icpclive.cds.settings/-c-d-s-settings/index.html) +is the full list of supported properties for all systems. + +Typical config should look like that + +``` +// settings.json file in your config directory +{ + "type": "cf", + "apiKey": "$creds.cf_api_key", + "apiSecret": "$creds.cf_api_secret", + "contestId": 1600, + "emulation": { "speed": 10, "startTime": "2023-08-24 22:43"}, // remove this if you don't need emulation +} +// creds.json file somewhere else passed with --creds option +{ + "cf_api_key": "YOUR CODEFORCES API KEY", + "cf_api_secret": "YOUR CODEFORCES API SECRET", +} +``` + +Other contest systems have different arguments than apiKey/apiSecret/contestId but the main idea is the same. + +Separate creds file is needed to avoid accidential publishing of your keys. +If you don't plan to publish config file you can just put key into it instead of a separate file. \ No newline at end of file diff --git a/docs/troubleshooting.md b/docs/troubleshooting.md new file mode 100644 index 000000000..42f1dccbb --- /dev/null +++ b/docs/troubleshooting.md @@ -0,0 +1,20 @@ +# Typical problems + +## Overlay backend is not starting or sends no data + +* Check `icpclive.log` file, there are probably some useful exceptions + * If it has some SSL exceptions + * Add `"network": { "allowUnsecureConnections": true }` into your settings file, + if you are fine with ignoring certificate check + * If there are some FileNotFound exceptions + * Check your command line arguments, maybe some pathes are relative to unexpected source + * If there are some other crashes + * Sorry, report a bug to us +* Check frontend log by opening `http://localhost:8080/overlay` in browser and + scrolling down. + +## Overlay works, but no updates after some time + +* If you are using clics check your clics server has keep-alive enabled +* If you are using codeforces, check if you are not banned by their anti-ddos. + * Write to Mike if you are :( \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index 4b705a7a9..1cab3ddc2 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,5 +2,7 @@ kotlin.code.style=official build_version=dev #change this to `false` to use system installed npm -npm.download=false +npm.download=true org.gradle.parallel=true +org.gradle.caching=true +live.dev.embedFrontend=true \ No newline at end of file diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 8eea63745..0ccfa89d0 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,30 +1,35 @@ [versions] -ktor = "2.3.0" # https://ktor.io/ +ktor = "2.3.3" # https://ktor.io/ datetime = "0.4.0" # https://github.com/Kotlin/kotlinx-datetime -serialization = "1.5.1" # https://github.com/Kotlin/kotlinx.serialization -kotlin = "1.8.21" -logback = "1.4.7" # https://logback.qos.ch/download.html -node-plugin = "4.0.0" # https://github.com/node-gradle/gradle-node-plugin -coroutines = "1.7.0" # https://github.com/Kotlin/kotlinx.coroutines/ -exposed = "0.41.1" # https://github.com/JetBrains/Exposed -telegram-bot = "6.0.7" # https://github.com/kotlin-telegram-bot/kotlin-telegram-bot +serialization = "1.6.0" # https://github.com/Kotlin/kotlinx.serialization +kotlin = "1.9.10" +slf4j = "1.7.36" # https://www.slf4j.org/download.html +logback = "1.4.11" # https://logback.qos.ch/download.html +node-plugin = "7.0.0" # https://github.com/node-gradle/gradle-node-plugin +coroutines = "1.7.3" # https://github.com/Kotlin/kotlinx.coroutines/ +exposed = "0.42.1" # https://github.com/JetBrains/Exposed +telegram-bot = "6.1.0" # https://github.com/kotlin-telegram-bot/kotlin-telegram-bot shadow-plugin = "8.1.1" # https://github.com/johnrengelman/shadow -sqlite = "3.41.2.1" # https://github.com/xerial/sqlite-jdbc -clikt = "3.5.2" # https://ajalt.github.io/clikt/ +sqlite = "3.42.0.0" # https://github.com/xerial/sqlite-jdbc +clikt = "4.2.0" # https://ajalt.github.io/clikt/ immutable = "0.3.5" # https://github.com/Kotlin/kotlinx.collections.immutable +protobuf-plugin = "0.9.4" # https://github.com/google/protobuf-gradle-plugin +protobuf = "3.24.1" # https://mvnrepository.com/artifact/com.google.protobuf/protobuf-kotlin +grpc = "1.57.0" # https://github.com/grpc/grpc +grpc-kotlin = "1.3.1" # https://github.com/grpc/grpc-kotlin +dokka = "1.8.20" # https://github.com/Kotlin/dokka +retrofit = "2.9.0" # https://mvnrepository.com/artifact/com.squareup.retrofit2/retrofit/2.9.0 +json5 = "0.3.0" # https://github.com/xn32/json5k [libraries] ktor-client-cio = { version.ref = "ktor", group = "io.ktor", name = "ktor-client-cio" } ktor-client-auth = { version.ref = "ktor", group = "io.ktor", name = "ktor-client-auth" } -ktor-client-websockets = { version.ref = "ktor", group = "io.ktor", name = "ktor-client-websockets" } -ktor-client-logging = { version.ref = "ktor", group = "io.ktor", name = "ktor-client-logging" } ktor-serialization-kotlinx-json = { version.ref = "ktor", group = "io.ktor", name = "ktor-serialization-kotlinx-json" } -ktor-server-tests = { version.ref = "ktor", group = "io.ktor", name = "ktor-server-tests" } -ktor-server-autoHeadResponse = { version.ref = "ktor", group = "io.ktor", name = "ktor-server-auto-head-response" } ktor-server-auth = { version.ref = "ktor", group = "io.ktor", name = "ktor-server-auth" } +ktor-server-autoHeadResponse = { version.ref = "ktor", group = "io.ktor", name = "ktor-server-auto-head-response" } ktor-server-callLogging = { version.ref = "ktor", group = "io.ktor", name = "ktor-server-call-logging" } ktor-server-contentNegotiation = { version.ref = "ktor", group = "io.ktor", name = "ktor-server-content-negotiation" } ktor-server-core = { version.ref = "ktor", group = "io.ktor", name = "ktor-server-core" } @@ -32,36 +37,49 @@ ktor-server-cors = { version.ref = "ktor", group = "io.ktor", nam ktor-server-defaultHeaders = { version.ref = "ktor", group = "io.ktor", name = "ktor-server-default-headers" } ktor-server-netty = { version.ref = "ktor", group = "io.ktor", name = "ktor-server-netty" } ktor-server-statusPages = { version.ref = "ktor", group = "io.ktor", name = "ktor-server-status-pages" } +ktor-server-tests = { version.ref = "ktor", group = "io.ktor", name = "ktor-server-tests" } ktor-server-websockets = { version.ref = "ktor", group = "io.ktor", name = "ktor-server-websockets" } - -kotlinx-datetime = { version.ref = "datetime", group = "org.jetbrains.kotlinx", name = "kotlinx-datetime" } +kotlinx-datetime = { version.ref = "datetime", group = "org.jetbrains.kotlinx", name = "kotlinx-datetime" } kotlinx-serialization-json = { version.ref = "serialization", group = "org.jetbrains.kotlinx", name = "kotlinx-serialization-json" } -kotlinx-coroutines-core = { version.ref = "coroutines", group = "org.jetbrains.kotlinx", name = "kotlinx-coroutines-core" } +kotlinx-serialization-properties = { version.ref = "serialization", group = "org.jetbrains.kotlinx", name = "kotlinx-serialization-properties" } +kotlinx-coroutines-core = { version.ref = "coroutines", group = "org.jetbrains.kotlinx", name = "kotlinx-coroutines-core" } kotlinx-collections-immutable = { version.ref = "immutable", group = "org.jetbrains.kotlinx", name = "kotlinx-collections-immutable"} +kotlinx-serialization-json5 = { version.ref = "json5", group = "io.github.xn32", name = "json5k" } + -kotlin-serialization-plugin = { version.ref = "kotlin", group = "org.jetbrains.kotlin", name = "kotlin-serialization" } -kotlin-gradle-plugin = { version.ref = "kotlin", group = "org.jetbrains.kotlin", name = "kotlin-gradle-plugin" } -kotlin-junit = { version.ref = "kotlin", group = "org.jetbrains.kotlin", name = "kotlin-test-junit" } +kotlin-junit = { version.ref = "kotlin", group = "org.jetbrains.kotlin", name = "kotlin-test-junit5" } +kotlin-reflect = { version.ref = "kotlin", group = "org.jetbrains.kotlin", name = "kotlin-reflect" } exposed-core = { version.ref = "exposed", group = "org.jetbrains.exposed", name = "exposed-core"} -exposed-dao = { version.ref = "exposed", group = "org.jetbrains.exposed", name = "exposed-dao"} +exposed-dao = { version.ref = "exposed", group = "org.jetbrains.exposed", name = "exposed-dao"} exposed-jdbc = { version.ref = "exposed", group = "org.jetbrains.exposed", name = "exposed-jdbc"} +slf4j = { version.ref = "slf4j", group = "org.slf4j", name = "slf4j-api" } logback = { version.ref = "logback", group = "ch.qos.logback", name = "logback-classic" } telegram-bot = { version.ref = "telegram-bot", group = "io.github.kotlin-telegram-bot.kotlin-telegram-bot", name = "telegram" } - +retrofit = { version.ref = "retrofit", group = "com.squareup.retrofit2", name = "retrofit" } db-sqlite = { version.ref = "sqlite", group = "org.xerial", name = "sqlite-jdbc" } cli = { version.ref = "clikt", group = "com.github.ajalt.clikt", name = "clikt" } +grpc-netty = { version.ref = "grpc", group = "io.grpc", name = "grpc-netty" } +grpc-protobuf = { version.ref = "grpc", group = "io.grpc", name = "grpc-protobuf" } +grpc-stub = { version.ref = "grpc-kotlin", group = "io.grpc", name = "grpc-kotlin-stub" } +grpc-gen-java = { version.ref = "grpc", group = "io.grpc", name = "protoc-gen-grpc-java" } +grpc-gen-kotlin = { version.ref = "grpc-kotlin", group = "io.grpc", name = "protoc-gen-grpc-kotlin" } + +protobuf = { version.ref = "protobuf", group = "com.google.protobuf", name = "protobuf-kotlin" } +protoc = { version.ref = "protobuf", group = "com.google.protobuf", name = "protoc" } + [plugins] -ktor = { id = "io.ktor.plugin", version.ref = "ktor" } node = { id = "com.github.node-gradle.node", version.ref = "node-plugin" } shadow = { id = "com.github.johnrengelman.shadow", version.ref = "shadow-plugin" } kotlin-jvm = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin" } -kotlin-serialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" } \ No newline at end of file +kotlin-serialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" } +protobuf = { id = "com.google.protobuf", version.ref = "protobuf-plugin" } +dokka = { id = "org.jetbrains.dokka", version.ref = "dokka" } diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index c1962a79e..033e24c4c 100644 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 37aef8d3f..9f4197d5f 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,7 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.1.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.2.1-bin.zip networkTimeout=10000 +validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index aeb74cbb4..fcb6fca14 100755 --- a/gradlew +++ b/gradlew @@ -130,10 +130,13 @@ location of your Java installation." fi else JAVACMD=java - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. Please set the JAVA_HOME variable in your environment to match the location of your Java installation." + fi fi # Increase the maximum file descriptors if we can. diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 000000000..4cefbcf4b --- /dev/null +++ b/package-lock.json @@ -0,0 +1,96 @@ +{ + "name": "live-v3", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "live-v3", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "fsevents": "^2.3.2", + "playwright-core": "^1.32.3", + "ws": "^8.13.0" + }, + "devDependencies": { + "@playwright/test": "^1.32.3", + "@types/ws": "^8.5.5" + } + }, + "node_modules/@playwright/test": { + "version": "1.32.3", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.32.3.tgz", + "integrity": "sha512-BvWNvK0RfBriindxhLVabi8BRe3X0J9EVjKlcmhxjg4giWBD/xleLcg2dz7Tx0agu28rczjNIPQWznwzDwVsZQ==", + "dev": true, + "dependencies": { + "@types/node": "*", + "playwright-core": "1.32.3" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=14" + }, + "optionalDependencies": { + "fsevents": "2.3.2" + } + }, + "node_modules/@types/node": { + "version": "18.16.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.16.0.tgz", + "integrity": "sha512-BsAaKhB+7X+H4GnSjGhJG9Qi8Tw+inU9nJDwmD5CgOmBLEI6ArdhikpLX7DjbjDRDTbqZzU2LSQNZg8WGPiSZQ==", + "dev": true + }, + "node_modules/@types/ws": { + "version": "8.5.5", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.5.tgz", + "integrity": "sha512-lwhs8hktwxSjf9UaZ9tG5M03PGogvFaH8gUgLNbN9HKIg0dvv6q+gkSuJ8HN4/VbyxkuLzCjlN7GquQ0gUJfIg==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "hasInstallScript": true, + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/playwright-core": { + "version": "1.32.3", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.32.3.tgz", + "integrity": "sha512-SB+cdrnu74ZIn5Ogh/8278ngEh9NEEV0vR4sJFmK04h2iZpybfbqBY0bX6+BLYWVdV12JLLI+JEFtSnYgR+mWg==", + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/ws": { + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", + "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 000000000..b27a682db --- /dev/null +++ b/package.json @@ -0,0 +1,19 @@ +{ + "name": "live-v3", + "version": "1.0.0", + "description": "Welcome to the ICPC Live Source Code Repository.", + "main": "index.js", + "dependencies": { + "fsevents": "^2.3.2", + "playwright-core": "^1.32.3", + "ws": "^8.13.0" + }, + "devDependencies": { + "@playwright/test": "^1.32.3", + "@types/ws": "^8.5.5" + }, + "scripts": {}, + "keywords": [], + "author": "", + "license": "ISC" +} diff --git a/playwright.config.js b/playwright.config.js new file mode 100644 index 000000000..e2c58bf0c --- /dev/null +++ b/playwright.config.js @@ -0,0 +1,44 @@ +// @ts-check +import { defineConfig, devices } from "@playwright/test"; + +/** + * Read environment variables from file. + * https://github.com/motdotla/dotenv + */ +// require('dotenv').config(); + +/** + * @see https://playwright.dev/docs/test-configuration + */ +module.exports = defineConfig({ + testDir: "./tests", + /* Run tests in files in parallel */ + fullyParallel: true, + /* Fail the build on CI if you accidentally left test.only in the source code. */ + forbidOnly: !!process.env.CI, + /* No retries */ + retries: 0, + /* Reporter to use. See https://playwright.dev/docs/test-reporters */ + reporter: "html", + /* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */ + use: { + /* Base URL to use in actions like `await page.goto('/')`. */ + baseURL: "http://127.0.0.1:8080", + + /* Collect trace for failing tests. See https://playwright.dev/docs/trace-viewer */ + trace: "retain-on-failure", + }, + /* Set timeout for each test to 2 minute */ + timeout: 2 * 60 * 1000, + /* Configure projects for major browsers */ + projects: [ + { + name: "chromium", + use: { + ...devices["Desktop Chrome"], + viewport: { width: 1920, height: 1080 }, + }, + }, + ], +}); + diff --git a/run.bat b/run.bat index cf3a3a36f..8912155b6 100644 --- a/run.bat +++ b/run.bat @@ -1 +1 @@ -java -jar artifacts/live-v3-dev.jar -port=8080 -P:live.configDirectory=config/sgu/ -P:live.credsFile=artifacts/creds.json +java -jar artifacts/live-v3-dev.jar --port=8080 --config-directory=config/atcoder/wtf22-day2/ --creds=artifacts/creds.json diff --git a/runtests.bat b/runtests.bat new file mode 100644 index 000000000..b5dc00443 --- /dev/null +++ b/runtests.bat @@ -0,0 +1,3 @@ +call npm ci +call npx playwright install --with-deps +call npx playwright test \ No newline at end of file diff --git a/schemas/advanced.schema.json b/schemas/advanced.schema.json new file mode 100644 index 000000000..183265bb6 --- /dev/null +++ b/schemas/advanced.schema.json @@ -0,0 +1,2644 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://github.com/icpc/live-v3/blob/main/schemas/advanced.schema.json", + "title": "ICPC live advanced settings", + "type": "object", + "properties": { + "startTime": { + "type": "string" + }, + "freezeTimeSeconds": { + "type": "integer" + }, + "holdTimeSeconds": { + "type": "integer" + }, + "teamMediaTemplate": { + "type": "object", + "properties": { + "camera": { + "oneOf": [ + { + "type": "object", + "properties": { + "type": { + "const": "Object" + }, + "url": { + "type": "string" + }, + "isMedia": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + "type", + "url" + ] + }, + { + "type": "object", + "properties": { + "type": { + "const": "Photo" + }, + "url": { + "type": "string" + }, + "isMedia": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + "type", + "url" + ] + }, + { + "type": "object", + "properties": { + "type": { + "const": "TaskStatus" + }, + "teamId": { + "type": "integer" + }, + "isMedia": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + "type", + "teamId" + ] + }, + { + "type": "object", + "properties": { + "type": { + "const": "Video" + }, + "url": { + "type": "string" + }, + "isMedia": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + "type", + "url" + ] + }, + { + "type": "object", + "properties": { + "type": { + "const": "WebRTCGrabberConnection" + }, + "url": { + "type": "string" + }, + "peerName": { + "type": "string" + }, + "streamType": { + "type": "string" + }, + "credential": { + "type": "string" + }, + "isMedia": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + "type", + "url", + "peerName", + "streamType", + "credential" + ] + }, + { + "type": "object", + "properties": { + "type": { + "const": "WebRTCProxyConnection" + }, + "url": { + "type": "string" + }, + "audioUrl": { + "type": "string" + }, + "isMedia": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + "type", + "url" + ] + } + ] + }, + "screen": { + "oneOf": [ + { + "type": "object", + "properties": { + "type": { + "const": "Object" + }, + "url": { + "type": "string" + }, + "isMedia": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + "type", + "url" + ] + }, + { + "type": "object", + "properties": { + "type": { + "const": "Photo" + }, + "url": { + "type": "string" + }, + "isMedia": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + "type", + "url" + ] + }, + { + "type": "object", + "properties": { + "type": { + "const": "TaskStatus" + }, + "teamId": { + "type": "integer" + }, + "isMedia": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + "type", + "teamId" + ] + }, + { + "type": "object", + "properties": { + "type": { + "const": "Video" + }, + "url": { + "type": "string" + }, + "isMedia": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + "type", + "url" + ] + }, + { + "type": "object", + "properties": { + "type": { + "const": "WebRTCGrabberConnection" + }, + "url": { + "type": "string" + }, + "peerName": { + "type": "string" + }, + "streamType": { + "type": "string" + }, + "credential": { + "type": "string" + }, + "isMedia": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + "type", + "url", + "peerName", + "streamType", + "credential" + ] + }, + { + "type": "object", + "properties": { + "type": { + "const": "WebRTCProxyConnection" + }, + "url": { + "type": "string" + }, + "audioUrl": { + "type": "string" + }, + "isMedia": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + "type", + "url" + ] + } + ] + }, + "record": { + "oneOf": [ + { + "type": "object", + "properties": { + "type": { + "const": "Object" + }, + "url": { + "type": "string" + }, + "isMedia": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + "type", + "url" + ] + }, + { + "type": "object", + "properties": { + "type": { + "const": "Photo" + }, + "url": { + "type": "string" + }, + "isMedia": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + "type", + "url" + ] + }, + { + "type": "object", + "properties": { + "type": { + "const": "TaskStatus" + }, + "teamId": { + "type": "integer" + }, + "isMedia": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + "type", + "teamId" + ] + }, + { + "type": "object", + "properties": { + "type": { + "const": "Video" + }, + "url": { + "type": "string" + }, + "isMedia": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + "type", + "url" + ] + }, + { + "type": "object", + "properties": { + "type": { + "const": "WebRTCGrabberConnection" + }, + "url": { + "type": "string" + }, + "peerName": { + "type": "string" + }, + "streamType": { + "type": "string" + }, + "credential": { + "type": "string" + }, + "isMedia": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + "type", + "url", + "peerName", + "streamType", + "credential" + ] + }, + { + "type": "object", + "properties": { + "type": { + "const": "WebRTCProxyConnection" + }, + "url": { + "type": "string" + }, + "audioUrl": { + "type": "string" + }, + "isMedia": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + "type", + "url" + ] + } + ] + }, + "photo": { + "oneOf": [ + { + "type": "object", + "properties": { + "type": { + "const": "Object" + }, + "url": { + "type": "string" + }, + "isMedia": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + "type", + "url" + ] + }, + { + "type": "object", + "properties": { + "type": { + "const": "Photo" + }, + "url": { + "type": "string" + }, + "isMedia": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + "type", + "url" + ] + }, + { + "type": "object", + "properties": { + "type": { + "const": "TaskStatus" + }, + "teamId": { + "type": "integer" + }, + "isMedia": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + "type", + "teamId" + ] + }, + { + "type": "object", + "properties": { + "type": { + "const": "Video" + }, + "url": { + "type": "string" + }, + "isMedia": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + "type", + "url" + ] + }, + { + "type": "object", + "properties": { + "type": { + "const": "WebRTCGrabberConnection" + }, + "url": { + "type": "string" + }, + "peerName": { + "type": "string" + }, + "streamType": { + "type": "string" + }, + "credential": { + "type": "string" + }, + "isMedia": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + "type", + "url", + "peerName", + "streamType", + "credential" + ] + }, + { + "type": "object", + "properties": { + "type": { + "const": "WebRTCProxyConnection" + }, + "url": { + "type": "string" + }, + "audioUrl": { + "type": "string" + }, + "isMedia": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + "type", + "url" + ] + } + ] + }, + "reactionVideo": { + "oneOf": [ + { + "type": "object", + "properties": { + "type": { + "const": "Object" + }, + "url": { + "type": "string" + }, + "isMedia": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + "type", + "url" + ] + }, + { + "type": "object", + "properties": { + "type": { + "const": "Photo" + }, + "url": { + "type": "string" + }, + "isMedia": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + "type", + "url" + ] + }, + { + "type": "object", + "properties": { + "type": { + "const": "TaskStatus" + }, + "teamId": { + "type": "integer" + }, + "isMedia": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + "type", + "teamId" + ] + }, + { + "type": "object", + "properties": { + "type": { + "const": "Video" + }, + "url": { + "type": "string" + }, + "isMedia": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + "type", + "url" + ] + }, + { + "type": "object", + "properties": { + "type": { + "const": "WebRTCGrabberConnection" + }, + "url": { + "type": "string" + }, + "peerName": { + "type": "string" + }, + "streamType": { + "type": "string" + }, + "credential": { + "type": "string" + }, + "isMedia": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + "type", + "url", + "peerName", + "streamType", + "credential" + ] + }, + { + "type": "object", + "properties": { + "type": { + "const": "WebRTCProxyConnection" + }, + "url": { + "type": "string" + }, + "audioUrl": { + "type": "string" + }, + "isMedia": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + "type", + "url" + ] + } + ] + }, + "achievement": { + "oneOf": [ + { + "type": "object", + "properties": { + "type": { + "const": "Object" + }, + "url": { + "type": "string" + }, + "isMedia": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + "type", + "url" + ] + }, + { + "type": "object", + "properties": { + "type": { + "const": "Photo" + }, + "url": { + "type": "string" + }, + "isMedia": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + "type", + "url" + ] + }, + { + "type": "object", + "properties": { + "type": { + "const": "TaskStatus" + }, + "teamId": { + "type": "integer" + }, + "isMedia": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + "type", + "teamId" + ] + }, + { + "type": "object", + "properties": { + "type": { + "const": "Video" + }, + "url": { + "type": "string" + }, + "isMedia": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + "type", + "url" + ] + }, + { + "type": "object", + "properties": { + "type": { + "const": "WebRTCGrabberConnection" + }, + "url": { + "type": "string" + }, + "peerName": { + "type": "string" + }, + "streamType": { + "type": "string" + }, + "credential": { + "type": "string" + }, + "isMedia": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + "type", + "url", + "peerName", + "streamType", + "credential" + ] + }, + { + "type": "object", + "properties": { + "type": { + "const": "WebRTCProxyConnection" + }, + "url": { + "type": "string" + }, + "audioUrl": { + "type": "string" + }, + "isMedia": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + "type", + "url" + ] + } + ] + } + } + }, + "teamOverrideTemplate": { + "type": "object", + "properties": { + "displayName": { + "type": "string" + }, + "fullName": { + "type": "string" + }, + "medias": { + "type": "object", + "properties": { + "camera": { + "oneOf": [ + { + "type": "object", + "properties": { + "type": { + "const": "Object" + }, + "url": { + "type": "string" + }, + "isMedia": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + "type", + "url" + ] + }, + { + "type": "object", + "properties": { + "type": { + "const": "Photo" + }, + "url": { + "type": "string" + }, + "isMedia": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + "type", + "url" + ] + }, + { + "type": "object", + "properties": { + "type": { + "const": "TaskStatus" + }, + "teamId": { + "type": "integer" + }, + "isMedia": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + "type", + "teamId" + ] + }, + { + "type": "object", + "properties": { + "type": { + "const": "Video" + }, + "url": { + "type": "string" + }, + "isMedia": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + "type", + "url" + ] + }, + { + "type": "object", + "properties": { + "type": { + "const": "WebRTCGrabberConnection" + }, + "url": { + "type": "string" + }, + "peerName": { + "type": "string" + }, + "streamType": { + "type": "string" + }, + "credential": { + "type": "string" + }, + "isMedia": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + "type", + "url", + "peerName", + "streamType", + "credential" + ] + }, + { + "type": "object", + "properties": { + "type": { + "const": "WebRTCProxyConnection" + }, + "url": { + "type": "string" + }, + "audioUrl": { + "type": "string" + }, + "isMedia": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + "type", + "url" + ] + } + ] + }, + "screen": { + "oneOf": [ + { + "type": "object", + "properties": { + "type": { + "const": "Object" + }, + "url": { + "type": "string" + }, + "isMedia": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + "type", + "url" + ] + }, + { + "type": "object", + "properties": { + "type": { + "const": "Photo" + }, + "url": { + "type": "string" + }, + "isMedia": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + "type", + "url" + ] + }, + { + "type": "object", + "properties": { + "type": { + "const": "TaskStatus" + }, + "teamId": { + "type": "integer" + }, + "isMedia": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + "type", + "teamId" + ] + }, + { + "type": "object", + "properties": { + "type": { + "const": "Video" + }, + "url": { + "type": "string" + }, + "isMedia": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + "type", + "url" + ] + }, + { + "type": "object", + "properties": { + "type": { + "const": "WebRTCGrabberConnection" + }, + "url": { + "type": "string" + }, + "peerName": { + "type": "string" + }, + "streamType": { + "type": "string" + }, + "credential": { + "type": "string" + }, + "isMedia": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + "type", + "url", + "peerName", + "streamType", + "credential" + ] + }, + { + "type": "object", + "properties": { + "type": { + "const": "WebRTCProxyConnection" + }, + "url": { + "type": "string" + }, + "audioUrl": { + "type": "string" + }, + "isMedia": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + "type", + "url" + ] + } + ] + }, + "record": { + "oneOf": [ + { + "type": "object", + "properties": { + "type": { + "const": "Object" + }, + "url": { + "type": "string" + }, + "isMedia": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + "type", + "url" + ] + }, + { + "type": "object", + "properties": { + "type": { + "const": "Photo" + }, + "url": { + "type": "string" + }, + "isMedia": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + "type", + "url" + ] + }, + { + "type": "object", + "properties": { + "type": { + "const": "TaskStatus" + }, + "teamId": { + "type": "integer" + }, + "isMedia": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + "type", + "teamId" + ] + }, + { + "type": "object", + "properties": { + "type": { + "const": "Video" + }, + "url": { + "type": "string" + }, + "isMedia": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + "type", + "url" + ] + }, + { + "type": "object", + "properties": { + "type": { + "const": "WebRTCGrabberConnection" + }, + "url": { + "type": "string" + }, + "peerName": { + "type": "string" + }, + "streamType": { + "type": "string" + }, + "credential": { + "type": "string" + }, + "isMedia": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + "type", + "url", + "peerName", + "streamType", + "credential" + ] + }, + { + "type": "object", + "properties": { + "type": { + "const": "WebRTCProxyConnection" + }, + "url": { + "type": "string" + }, + "audioUrl": { + "type": "string" + }, + "isMedia": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + "type", + "url" + ] + } + ] + }, + "photo": { + "oneOf": [ + { + "type": "object", + "properties": { + "type": { + "const": "Object" + }, + "url": { + "type": "string" + }, + "isMedia": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + "type", + "url" + ] + }, + { + "type": "object", + "properties": { + "type": { + "const": "Photo" + }, + "url": { + "type": "string" + }, + "isMedia": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + "type", + "url" + ] + }, + { + "type": "object", + "properties": { + "type": { + "const": "TaskStatus" + }, + "teamId": { + "type": "integer" + }, + "isMedia": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + "type", + "teamId" + ] + }, + { + "type": "object", + "properties": { + "type": { + "const": "Video" + }, + "url": { + "type": "string" + }, + "isMedia": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + "type", + "url" + ] + }, + { + "type": "object", + "properties": { + "type": { + "const": "WebRTCGrabberConnection" + }, + "url": { + "type": "string" + }, + "peerName": { + "type": "string" + }, + "streamType": { + "type": "string" + }, + "credential": { + "type": "string" + }, + "isMedia": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + "type", + "url", + "peerName", + "streamType", + "credential" + ] + }, + { + "type": "object", + "properties": { + "type": { + "const": "WebRTCProxyConnection" + }, + "url": { + "type": "string" + }, + "audioUrl": { + "type": "string" + }, + "isMedia": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + "type", + "url" + ] + } + ] + }, + "reactionVideo": { + "oneOf": [ + { + "type": "object", + "properties": { + "type": { + "const": "Object" + }, + "url": { + "type": "string" + }, + "isMedia": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + "type", + "url" + ] + }, + { + "type": "object", + "properties": { + "type": { + "const": "Photo" + }, + "url": { + "type": "string" + }, + "isMedia": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + "type", + "url" + ] + }, + { + "type": "object", + "properties": { + "type": { + "const": "TaskStatus" + }, + "teamId": { + "type": "integer" + }, + "isMedia": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + "type", + "teamId" + ] + }, + { + "type": "object", + "properties": { + "type": { + "const": "Video" + }, + "url": { + "type": "string" + }, + "isMedia": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + "type", + "url" + ] + }, + { + "type": "object", + "properties": { + "type": { + "const": "WebRTCGrabberConnection" + }, + "url": { + "type": "string" + }, + "peerName": { + "type": "string" + }, + "streamType": { + "type": "string" + }, + "credential": { + "type": "string" + }, + "isMedia": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + "type", + "url", + "peerName", + "streamType", + "credential" + ] + }, + { + "type": "object", + "properties": { + "type": { + "const": "WebRTCProxyConnection" + }, + "url": { + "type": "string" + }, + "audioUrl": { + "type": "string" + }, + "isMedia": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + "type", + "url" + ] + } + ] + }, + "achievement": { + "oneOf": [ + { + "type": "object", + "properties": { + "type": { + "const": "Object" + }, + "url": { + "type": "string" + }, + "isMedia": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + "type", + "url" + ] + }, + { + "type": "object", + "properties": { + "type": { + "const": "Photo" + }, + "url": { + "type": "string" + }, + "isMedia": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + "type", + "url" + ] + }, + { + "type": "object", + "properties": { + "type": { + "const": "TaskStatus" + }, + "teamId": { + "type": "integer" + }, + "isMedia": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + "type", + "teamId" + ] + }, + { + "type": "object", + "properties": { + "type": { + "const": "Video" + }, + "url": { + "type": "string" + }, + "isMedia": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + "type", + "url" + ] + }, + { + "type": "object", + "properties": { + "type": { + "const": "WebRTCGrabberConnection" + }, + "url": { + "type": "string" + }, + "peerName": { + "type": "string" + }, + "streamType": { + "type": "string" + }, + "credential": { + "type": "string" + }, + "isMedia": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + "type", + "url", + "peerName", + "streamType", + "credential" + ] + }, + { + "type": "object", + "properties": { + "type": { + "const": "WebRTCProxyConnection" + }, + "url": { + "type": "string" + }, + "audioUrl": { + "type": "string" + }, + "isMedia": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + "type", + "url" + ] + } + ] + } + } + } + }, + "additionalProperties": false, + "required": [ + ] + }, + "teamRegexes": { + "type": "object", + "properties": { + "organizationRegex": { + "type": "string" + }, + "customFields": { + "type": "object", + "patternProperties": { + ".*": { + "type": "string" + } + } + }, + "groupRegex": { + "type": "object", + "patternProperties": { + ".*": { + "type": "string" + } + } + } + }, + "additionalProperties": false, + "required": [ + ] + }, + "teamOverrides": { + "type": "object", + "patternProperties": { + ".*": { + "type": "object", + "properties": { + "fullName": { + "type": "string" + }, + "displayName": { + "type": "string" + }, + "groups": { + "type": "array", + "items": { + "type": "string" + } + }, + "organizationId": { + "type": "string" + }, + "hashTag": { + "type": "string" + }, + "medias": { + "type": "object", + "properties": { + "camera": { + "oneOf": [ + { + "type": "object", + "properties": { + "type": { + "const": "Object" + }, + "url": { + "type": "string" + }, + "isMedia": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + "type", + "url" + ] + }, + { + "type": "object", + "properties": { + "type": { + "const": "Photo" + }, + "url": { + "type": "string" + }, + "isMedia": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + "type", + "url" + ] + }, + { + "type": "object", + "properties": { + "type": { + "const": "TaskStatus" + }, + "teamId": { + "type": "integer" + }, + "isMedia": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + "type", + "teamId" + ] + }, + { + "type": "object", + "properties": { + "type": { + "const": "Video" + }, + "url": { + "type": "string" + }, + "isMedia": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + "type", + "url" + ] + }, + { + "type": "object", + "properties": { + "type": { + "const": "WebRTCGrabberConnection" + }, + "url": { + "type": "string" + }, + "peerName": { + "type": "string" + }, + "streamType": { + "type": "string" + }, + "credential": { + "type": "string" + }, + "isMedia": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + "type", + "url", + "peerName", + "streamType", + "credential" + ] + }, + { + "type": "object", + "properties": { + "type": { + "const": "WebRTCProxyConnection" + }, + "url": { + "type": "string" + }, + "audioUrl": { + "type": "string" + }, + "isMedia": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + "type", + "url" + ] + } + ] + }, + "screen": { + "oneOf": [ + { + "type": "object", + "properties": { + "type": { + "const": "Object" + }, + "url": { + "type": "string" + }, + "isMedia": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + "type", + "url" + ] + }, + { + "type": "object", + "properties": { + "type": { + "const": "Photo" + }, + "url": { + "type": "string" + }, + "isMedia": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + "type", + "url" + ] + }, + { + "type": "object", + "properties": { + "type": { + "const": "TaskStatus" + }, + "teamId": { + "type": "integer" + }, + "isMedia": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + "type", + "teamId" + ] + }, + { + "type": "object", + "properties": { + "type": { + "const": "Video" + }, + "url": { + "type": "string" + }, + "isMedia": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + "type", + "url" + ] + }, + { + "type": "object", + "properties": { + "type": { + "const": "WebRTCGrabberConnection" + }, + "url": { + "type": "string" + }, + "peerName": { + "type": "string" + }, + "streamType": { + "type": "string" + }, + "credential": { + "type": "string" + }, + "isMedia": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + "type", + "url", + "peerName", + "streamType", + "credential" + ] + }, + { + "type": "object", + "properties": { + "type": { + "const": "WebRTCProxyConnection" + }, + "url": { + "type": "string" + }, + "audioUrl": { + "type": "string" + }, + "isMedia": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + "type", + "url" + ] + } + ] + }, + "record": { + "oneOf": [ + { + "type": "object", + "properties": { + "type": { + "const": "Object" + }, + "url": { + "type": "string" + }, + "isMedia": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + "type", + "url" + ] + }, + { + "type": "object", + "properties": { + "type": { + "const": "Photo" + }, + "url": { + "type": "string" + }, + "isMedia": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + "type", + "url" + ] + }, + { + "type": "object", + "properties": { + "type": { + "const": "TaskStatus" + }, + "teamId": { + "type": "integer" + }, + "isMedia": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + "type", + "teamId" + ] + }, + { + "type": "object", + "properties": { + "type": { + "const": "Video" + }, + "url": { + "type": "string" + }, + "isMedia": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + "type", + "url" + ] + }, + { + "type": "object", + "properties": { + "type": { + "const": "WebRTCGrabberConnection" + }, + "url": { + "type": "string" + }, + "peerName": { + "type": "string" + }, + "streamType": { + "type": "string" + }, + "credential": { + "type": "string" + }, + "isMedia": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + "type", + "url", + "peerName", + "streamType", + "credential" + ] + }, + { + "type": "object", + "properties": { + "type": { + "const": "WebRTCProxyConnection" + }, + "url": { + "type": "string" + }, + "audioUrl": { + "type": "string" + }, + "isMedia": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + "type", + "url" + ] + } + ] + }, + "photo": { + "oneOf": [ + { + "type": "object", + "properties": { + "type": { + "const": "Object" + }, + "url": { + "type": "string" + }, + "isMedia": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + "type", + "url" + ] + }, + { + "type": "object", + "properties": { + "type": { + "const": "Photo" + }, + "url": { + "type": "string" + }, + "isMedia": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + "type", + "url" + ] + }, + { + "type": "object", + "properties": { + "type": { + "const": "TaskStatus" + }, + "teamId": { + "type": "integer" + }, + "isMedia": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + "type", + "teamId" + ] + }, + { + "type": "object", + "properties": { + "type": { + "const": "Video" + }, + "url": { + "type": "string" + }, + "isMedia": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + "type", + "url" + ] + }, + { + "type": "object", + "properties": { + "type": { + "const": "WebRTCGrabberConnection" + }, + "url": { + "type": "string" + }, + "peerName": { + "type": "string" + }, + "streamType": { + "type": "string" + }, + "credential": { + "type": "string" + }, + "isMedia": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + "type", + "url", + "peerName", + "streamType", + "credential" + ] + }, + { + "type": "object", + "properties": { + "type": { + "const": "WebRTCProxyConnection" + }, + "url": { + "type": "string" + }, + "audioUrl": { + "type": "string" + }, + "isMedia": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + "type", + "url" + ] + } + ] + }, + "reactionVideo": { + "oneOf": [ + { + "type": "object", + "properties": { + "type": { + "const": "Object" + }, + "url": { + "type": "string" + }, + "isMedia": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + "type", + "url" + ] + }, + { + "type": "object", + "properties": { + "type": { + "const": "Photo" + }, + "url": { + "type": "string" + }, + "isMedia": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + "type", + "url" + ] + }, + { + "type": "object", + "properties": { + "type": { + "const": "TaskStatus" + }, + "teamId": { + "type": "integer" + }, + "isMedia": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + "type", + "teamId" + ] + }, + { + "type": "object", + "properties": { + "type": { + "const": "Video" + }, + "url": { + "type": "string" + }, + "isMedia": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + "type", + "url" + ] + }, + { + "type": "object", + "properties": { + "type": { + "const": "WebRTCGrabberConnection" + }, + "url": { + "type": "string" + }, + "peerName": { + "type": "string" + }, + "streamType": { + "type": "string" + }, + "credential": { + "type": "string" + }, + "isMedia": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + "type", + "url", + "peerName", + "streamType", + "credential" + ] + }, + { + "type": "object", + "properties": { + "type": { + "const": "WebRTCProxyConnection" + }, + "url": { + "type": "string" + }, + "audioUrl": { + "type": "string" + }, + "isMedia": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + "type", + "url" + ] + } + ] + }, + "achievement": { + "oneOf": [ + { + "type": "object", + "properties": { + "type": { + "const": "Object" + }, + "url": { + "type": "string" + }, + "isMedia": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + "type", + "url" + ] + }, + { + "type": "object", + "properties": { + "type": { + "const": "Photo" + }, + "url": { + "type": "string" + }, + "isMedia": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + "type", + "url" + ] + }, + { + "type": "object", + "properties": { + "type": { + "const": "TaskStatus" + }, + "teamId": { + "type": "integer" + }, + "isMedia": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + "type", + "teamId" + ] + }, + { + "type": "object", + "properties": { + "type": { + "const": "Video" + }, + "url": { + "type": "string" + }, + "isMedia": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + "type", + "url" + ] + }, + { + "type": "object", + "properties": { + "type": { + "const": "WebRTCGrabberConnection" + }, + "url": { + "type": "string" + }, + "peerName": { + "type": "string" + }, + "streamType": { + "type": "string" + }, + "credential": { + "type": "string" + }, + "isMedia": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + "type", + "url", + "peerName", + "streamType", + "credential" + ] + }, + { + "type": "object", + "properties": { + "type": { + "const": "WebRTCProxyConnection" + }, + "url": { + "type": "string" + }, + "audioUrl": { + "type": "string" + }, + "isMedia": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + "type", + "url" + ] + } + ] + } + } + }, + "customFields": { + "type": "object", + "patternProperties": { + ".*": { + "type": "string" + } + } + }, + "isHidden": { + "type": "boolean" + }, + "isOutOfContest": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + ] + } + } + }, + "groupOverrides": { + "type": "object", + "patternProperties": { + ".*": { + "type": "object", + "properties": { + "isHidden": { + "type": "boolean" + }, + "isOutOfContest": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + ] + } + } + }, + "organizationOverrides": { + "type": "object", + "patternProperties": { + ".*": { + "type": "object", + "properties": { + "displayName": { + "type": "string" + }, + "fullName": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + ] + } + } + }, + "problemOverrides": { + "type": "object", + "patternProperties": { + ".*": { + "type": "object", + "properties": { + "displayName": { + "type": "string" + }, + "fullName": { + "type": "string" + }, + "color": { + "type": "string" + }, + "ordinal": { + "type": "integer" + }, + "minScore": { + "type": "number" + }, + "maxScore": { + "type": "number" + }, + "scoreMergeMode": { + "enum": [ + "MAX_PER_GROUP", + "MAX_TOTAL", + "LAST", + "LAST_OK", + "SUM" + ] + } + }, + "additionalProperties": false, + "required": [ + ] + } + } + }, + "scoreboardOverrides": { + "type": "object", + "properties": { + "medals": { + "type": "array", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "count": { + "type": "integer" + }, + "minScore": { + "type": "number" + }, + "tiebreakMode": { + "enum": [ + "NONE", + "ALL" + ] + } + }, + "additionalProperties": false, + "required": [ + "name", + "count" + ] + } + }, + "penaltyPerWrongAttempt": { + "type": "integer" + }, + "showTeamsWithoutSubmissions": { + "type": "boolean" + }, + "penaltyRoundingMode": { + "enum": [ + "each_submission_down_to_minute", + "sum_down_to_minute", + "sum_in_seconds", + "last", + "zero" + ] + } + }, + "additionalProperties": false, + "required": [ + ] + } + }, + "additionalProperties": false, + "required": [ + ] +} diff --git a/schemas/settings.schema.json b/schemas/settings.schema.json new file mode 100644 index 000000000..2568492d7 --- /dev/null +++ b/schemas/settings.schema.json @@ -0,0 +1,682 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://github.com/icpc/live-v3/blob/main/schemas/settings.schema.json", + "title": "ICPC live settings", + "oneOf": [ + { + "type": "object", + "properties": { + "type": { + "const": "atcoder" + }, + "contestId": { + "type": "string" + }, + "sessionCookie": { + "type": "string" + }, + "startTime": { + "type": "string" + }, + "contestLengthSeconds": { + "type": "integer" + }, + "emulation": { + "type": "object", + "properties": { + "speed": { + "type": "number" + }, + "startTime": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "speed", + "startTime" + ] + }, + "network": { + "type": "object", + "properties": { + "allowUnsecureConnections": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + ] + } + }, + "additionalProperties": false, + "required": [ + "type", + "contestId", + "sessionCookie", + "startTime", + "contestLengthSeconds" + ] + }, + { + "type": "object", + "properties": { + "type": { + "const": "cf" + }, + "contestId": { + "type": "integer" + }, + "apiKey": { + "type": "string" + }, + "apiSecret": { + "type": "string" + }, + "asManager": { + "type": "boolean" + }, + "emulation": { + "type": "object", + "properties": { + "speed": { + "type": "number" + }, + "startTime": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "speed", + "startTime" + ] + }, + "network": { + "type": "object", + "properties": { + "allowUnsecureConnections": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + ] + } + }, + "additionalProperties": false, + "required": [ + "type", + "contestId", + "apiKey", + "apiSecret" + ] + }, + { + "type": "object", + "properties": { + "type": { + "const": "cats" + }, + "login": { + "type": "string" + }, + "password": { + "type": "string" + }, + "url": { + "type": "string" + }, + "timeZone": { + "type": "string" + }, + "resultType": { + "enum": [ + "ICPC", + "IOI" + ] + }, + "cid": { + "type": "string" + }, + "emulation": { + "type": "object", + "properties": { + "speed": { + "type": "number" + }, + "startTime": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "speed", + "startTime" + ] + }, + "network": { + "type": "object", + "properties": { + "allowUnsecureConnections": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + ] + } + }, + "additionalProperties": false, + "required": [ + "type", + "login", + "password", + "url", + "cid" + ] + }, + { + "type": "object", + "properties": { + "type": { + "const": "clics" + }, + "url": { + "type": "string" + }, + "login": { + "type": "string" + }, + "password": { + "type": "string" + }, + "eventFeedName": { + "type": "string" + }, + "feedVersion": { + "enum": [ + "2020_03", + "2022_07" + ] + }, + "additionalFeed": { + "type": "object", + "properties": { + "url": { + "type": "string" + }, + "login": { + "type": "string" + }, + "password": { + "type": "string" + }, + "eventFeedName": { + "type": "string" + }, + "feedVersion": { + "enum": [ + "2020_03", + "2022_07" + ] + } + }, + "additionalProperties": false, + "required": [ + "url" + ] + }, + "useTeamNames": { + "type": "boolean" + }, + "mediaBaseUrl": { + "type": "string" + }, + "emulation": { + "type": "object", + "properties": { + "speed": { + "type": "number" + }, + "startTime": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "speed", + "startTime" + ] + }, + "network": { + "type": "object", + "properties": { + "allowUnsecureConnections": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + ] + } + }, + "additionalProperties": false, + "required": [ + "type", + "url" + ] + }, + { + "type": "object", + "properties": { + "type": { + "const": "cms" + }, + "url": { + "type": "string" + }, + "activeContest": { + "type": "string" + }, + "otherContests": { + "type": "array", + "items": { + "type": "string" + } + }, + "network": { + "type": "object", + "properties": { + "allowUnsecureConnections": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + ] + }, + "emulation": { + "type": "object", + "properties": { + "speed": { + "type": "number" + }, + "startTime": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "speed", + "startTime" + ] + } + }, + "additionalProperties": false, + "required": [ + "type", + "url", + "activeContest", + "otherContests" + ] + }, + { + "type": "object", + "properties": { + "type": { + "const": "codedrills" + }, + "url": { + "type": "string" + }, + "port": { + "type": "integer" + }, + "contestId": { + "type": "string" + }, + "authKey": { + "type": "string" + }, + "emulation": { + "type": "object", + "properties": { + "speed": { + "type": "number" + }, + "startTime": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "speed", + "startTime" + ] + }, + "network": { + "type": "object", + "properties": { + "allowUnsecureConnections": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + ] + } + }, + "additionalProperties": false, + "required": [ + "type", + "url", + "port", + "contestId", + "authKey" + ] + }, + { + "type": "object", + "properties": { + "type": { + "const": "ejudge" + }, + "url": { + "type": "string" + }, + "resultType": { + "enum": [ + "ICPC", + "IOI" + ] + }, + "timeZone": { + "type": "string" + }, + "emulation": { + "type": "object", + "properties": { + "speed": { + "type": "number" + }, + "startTime": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "speed", + "startTime" + ] + }, + "network": { + "type": "object", + "properties": { + "allowUnsecureConnections": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + ] + } + }, + "additionalProperties": false, + "required": [ + "type", + "url" + ] + }, + { + "type": "object", + "properties": { + "type": { + "const": "krsu" + }, + "submissionsUrl": { + "type": "string" + }, + "contestUrl": { + "type": "string" + }, + "timeZone": { + "type": "string" + }, + "emulation": { + "type": "object", + "properties": { + "speed": { + "type": "number" + }, + "startTime": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "speed", + "startTime" + ] + }, + "network": { + "type": "object", + "properties": { + "allowUnsecureConnections": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + ] + } + }, + "additionalProperties": false, + "required": [ + "type", + "submissionsUrl", + "contestUrl" + ] + }, + { + "type": "object", + "properties": { + "type": { + "const": "noop" + }, + "emulation": { + "type": "object", + "properties": { + "speed": { + "type": "number" + }, + "startTime": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "speed", + "startTime" + ] + }, + "network": { + "type": "object", + "properties": { + "allowUnsecureConnections": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + ] + } + }, + "additionalProperties": false, + "required": [ + "type" + ] + }, + { + "type": "object", + "properties": { + "type": { + "const": "pcms" + }, + "url": { + "type": "string" + }, + "login": { + "type": "string" + }, + "password": { + "type": "string" + }, + "problemsUrl": { + "type": "string" + }, + "resultType": { + "enum": [ + "ICPC", + "IOI" + ] + }, + "emulation": { + "type": "object", + "properties": { + "speed": { + "type": "number" + }, + "startTime": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "speed", + "startTime" + ] + }, + "network": { + "type": "object", + "properties": { + "allowUnsecureConnections": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + ] + } + }, + "additionalProperties": false, + "required": [ + "type", + "url" + ] + }, + { + "type": "object", + "properties": { + "type": { + "const": "testsys" + }, + "url": { + "type": "string" + }, + "timeZone": { + "type": "string" + }, + "emulation": { + "type": "object", + "properties": { + "speed": { + "type": "number" + }, + "startTime": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "speed", + "startTime" + ] + }, + "network": { + "type": "object", + "properties": { + "allowUnsecureConnections": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + ] + } + }, + "additionalProperties": false, + "required": [ + "type", + "url" + ] + }, + { + "type": "object", + "properties": { + "type": { + "const": "yandex" + }, + "apiKey": { + "type": "string" + }, + "loginRegex": { + "type": "string" + }, + "contestId": { + "type": "integer" + }, + "resultType": { + "enum": [ + "ICPC", + "IOI" + ] + }, + "emulation": { + "type": "object", + "properties": { + "speed": { + "type": "number" + }, + "startTime": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "speed", + "startTime" + ] + }, + "network": { + "type": "object", + "properties": { + "allowUnsecureConnections": { + "type": "boolean" + } + }, + "additionalProperties": false, + "required": [ + ] + } + }, + "additionalProperties": false, + "required": [ + "type", + "apiKey", + "loginRegex", + "contestId" + ] + } + ] +} diff --git a/settings.gradle.kts b/settings.gradle.kts index 43d85c628..79f6c4458 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1,3 +1,8 @@ +plugins { + `gradle-enterprise` + id("org.gradle.toolchains.foojay-resolver-convention") version("0.4.0") +} + rootProject.name = "live-v3" dependencyResolutionManagement { @@ -11,12 +16,30 @@ dependencyResolutionManagement { enableFeaturePreview("TYPESAFE_PROJECT_ACCESSORS") -include(":sniper-tools", ":reactions-bot", ":common", ":cds", ":frontend", ":backend", ":cds-converter", ":faker") -project(":sniper-tools").projectDir = file("src/sniper-tools") -project(":common").projectDir = file("src/common") -project(":reactions-bot").projectDir = file("src/reactions-bot") -project(":cds").projectDir = file("src/cds") -project(":frontend").projectDir = file("src/frontend") +include( + ":backend", + ":cds", + ":cds-converter", + ":clics-api", + ":common", + ":frontend", + ":reactions-bot", + ":schema-generator", + ":sniper-tools", + ":faker" +) project(":backend").projectDir = file("src/backend") +project(":cds").projectDir = file("src/cds") project(":cds-converter").projectDir = file("src/cds-converter") +project(":clics-api").projectDir = file("src/clics-api") +project(":common").projectDir = file("src/common") +project(":frontend").projectDir = file("src/frontend") +project(":reactions-bot").projectDir = file("src/reactions-bot") +project(":schema-generator").projectDir = file("src/schema-generator") +project(":sniper-tools").projectDir = file("src/sniper-tools") project(":faker").projectDir = file("src/faker") + +gradleEnterprise.buildScan { + termsOfServiceUrl = "https://gradle.com/terms-of-service" + termsOfServiceAgree = "yes" +} \ No newline at end of file diff --git a/src/backend/build.gradle.kts b/src/backend/build.gradle.kts index 0f1e6051f..c69e96dc7 100644 --- a/src/backend/build.gradle.kts +++ b/src/backend/build.gradle.kts @@ -1,19 +1,18 @@ +import org.gradle.kotlin.dsl.run as runTask + plugins { + application alias(libs.plugins.kotlin.jvm) alias(libs.plugins.kotlin.serialization) - alias(libs.plugins.ktor) + alias(libs.plugins.shadow) } -group = "org.icpclive" -version = rootProject.findProperty("build_version")!! -application { - mainClass.set("org.icpclive.ApplicationKt") +base { + archivesName = rootProject.name } -ktor { - fatJar { - archiveFileName.set("${rootProject.name}-${project.version}.jar") - } +application { + mainClass = "org.icpclive.ApplicationKt" } kotlin { @@ -25,55 +24,40 @@ kotlin { } tasks { - named("run") { + runTask { this.args = listOfNotNull( - "-P:auth.disabled=true", - project.properties["live.dev.credsFile"]?.let { "-P:live.credsFile=$it"}, - project.properties["live.dev.widgetPositionsFile"]?.let { "-P:live.widgetPositionsFile=$it"}, - project.properties["live.dev.contest"]?.let { "-P:live.configDirectory=$it" }, - project.properties["live.dev.allowUnsecureConnections"]?.let { "-P:live.allowUnsecureConnections=$it" }, - project.properties["live.dev.analyticsTemplatesFile"]?.let { "-P:live.analyticsTemplatesFile=$it" }, + "--no-auth", + project.properties["live.dev.credsFile"]?.let { "--creds=$it" }, + project.properties["live.dev.widgetPositionsFile"]?.let { "--widget-positions=$it" }, + project.properties["live.dev.contest"]?.let { "--config-directory=$it" }, + project.properties["live.dev.analyticsTemplatesFile"]?.let { "--analytics-template=$it" }, ) - this.workingDir(rootDir.resolve("config")) - } - task("release") { - from(shadowJar) - destinationDir = rootProject.rootDir.resolve("artifacts") - } - val jsBuildPath = project.buildDir.resolve("js") - val copyJsAdmin = register("copyJsAdmin") { - from(project(":frontend").tasks["npm_run_buildAdmin"]) - destinationDir = jsBuildPath.resolve("admin") + this.workingDir = rootDir.resolve("config") } - val copyJsOverlay = register("copyJsOverlay") { - from(project(":frontend").tasks["npm_run_buildOverlay"]) - destinationDir = jsBuildPath.resolve("overlay") - } - register("buildJs") { - dependsOn(copyJsAdmin, copyJsOverlay) - outputs.dir(jsBuildPath) - } -} - - -sourceSets { - main { - resources { - srcDirs(tasks["buildJs"].outputs) + // Not the best way of doing this, but should work out. + processResources { + into("schemas") { + from(project(":schema-generator").tasks.named("generateAllSchemas")) + } + if (project.properties["live.dev.embedFrontend"] == "true") { + into("admin") { + from(project(":frontend").tasks.named("npm_run_buildAdmin")) + } + into("overlay") { + from(project(":frontend").tasks.named("npm_run_buildOverlay")) + } } } } -repositories { - mavenCentral() -} - dependencies { - implementation(libs.logback) + implementation(projects.cds) + implementation(projects.common) + implementation(libs.cli) implementation(libs.ktor.serialization.kotlinx.json) - implementation(libs.ktor.server.autoHeadResponse) implementation(libs.ktor.server.auth) + implementation(libs.ktor.server.autoHeadResponse) implementation(libs.ktor.server.callLogging) implementation(libs.ktor.server.contentNegotiation) implementation(libs.ktor.server.core) @@ -82,10 +66,8 @@ dependencies { implementation(libs.ktor.server.netty) implementation(libs.ktor.server.statusPages) implementation(libs.ktor.server.websockets) - implementation(libs.kotlinx.datetime) - implementation(libs.kotlinx.serialization.json) - implementation(projects.cds) - implementation(projects.common) + implementation(libs.logback) + testImplementation(libs.kotlin.junit) testImplementation(libs.ktor.server.tests) -} +} \ No newline at end of file diff --git a/src/backend/src/main/kotlin/org/icpclive/Application.kt b/src/backend/src/main/kotlin/org/icpclive/Application.kt index e2c9b4184..01f9be8b2 100644 --- a/src/backend/src/main/kotlin/org/icpclive/Application.kt +++ b/src/backend/src/main/kotlin/org/icpclive/Application.kt @@ -15,31 +15,25 @@ import io.ktor.server.request.* import io.ktor.server.routing.* import io.ktor.server.util.* import io.ktor.server.websocket.* -import kotlinx.coroutines.* -import kotlinx.coroutines.flow.SharingStarted -import kotlinx.coroutines.flow.onEach +import kotlinx.coroutines.CoroutineExceptionHandler import kotlinx.coroutines.flow.stateIn +import kotlinx.coroutines.launch import org.icpclive.admin.configureAdminApiRouting -import org.icpclive.api.AdvancedProperties -import org.icpclive.cds.InfoUpdate +import org.icpclive.api.tunning.AdvancedProperties import org.icpclive.cds.adapters.* +import org.icpclive.cds.settings.parseFileToCdsSettings import org.icpclive.data.Controllers -import org.icpclive.overlay.configureOverlayRouting -import org.icpclive.util.* -import org.icpclive.cds.getContestDataSourceAsFlow import org.icpclive.data.DataBus -import org.icpclive.service.AdvancedPropertiesService +import org.icpclive.overlay.configureOverlayRouting import org.icpclive.service.launchServices +import org.icpclive.util.* import org.slf4j.event.Level -import java.io.FileInputStream -import java.io.FileNotFoundException -import java.nio.file.Files +import java.nio.file.Paths import java.time.Duration -import java.util.* +import kotlin.io.path.exists import kotlin.system.exitProcess -fun main(args: Array): Unit = - io.ktor.server.netty.EngineMain.main(args) +fun main(args: Array): Unit = Config.main(args) private fun Application.setupKtorPlugins() { install(DefaultHeaders) @@ -63,7 +57,7 @@ private fun Application.setupKtorPlugins() { masking = false } install(Authentication) { - if (config.authDisabled) { + if (Config.authDisabled) { val config = object : AuthenticationProvider.Config("admin-api-auth") {} register(object : AuthenticationProvider(config) { override suspend fun onAuthenticate(context: AuthenticationContext) { @@ -94,11 +88,13 @@ private fun Application.setupKtorPlugins() { @Suppress("unused") // application.yaml references the main function. This annotation prevents the IDE from marking it as unused. fun Application.module() { - config = Config(environment) + environment.log.info("Using config directory ${Config.configDirectory.toAbsolutePath()}") + environment.log.info("Current working directory is ${Paths.get("").toAbsolutePath()}") setupKtorPlugins() routing { - staticFiles("/media", config.mediaDirectory.toFile()) + staticFiles("/media", Config.mediaDirectory.toFile()) + staticResources("/schemas", "schemas") singlePageApplication { useResources = true applicationRoute = "admin" @@ -124,22 +120,23 @@ fun Application.module() { // TODO: understand why normal exception propagation doesn't work exitProcess(1) } - val path = config.configDirectory.resolve("events.properties") - if (!Files.exists(path)) throw FileNotFoundException("events.properties not found in ${config.configDirectory}") - val properties = Properties() - FileInputStream(path.toString()).use { properties.load(it) } + val path = + Config.configDirectory.resolve("events.properties") + .takeIf { it.exists() } + ?.also { environment.log.warn("Using events.properties is deprecated, use settings.json instead.") } + ?: Config.configDirectory.resolve("settings.json5").takeIf { it.exists() } + ?: Config.configDirectory.resolve("settings.json") launch(handler) { - val advancedJsonPath = config.configDirectory.resolve("advanced.json") - val advancedPropertiesFlow = fileJsonContentFlow(advancedJsonPath, AdvancedPropertiesService.logger) - .stateIn(this, SharingStarted.Eagerly, AdvancedProperties()) + val advancedPropertiesFlow = + fileJsonContentFlow(Config.advancedJsonPath, environment.log, AdvancedProperties()) + .stateIn(this) DataBus.advancedPropertiesFlow.completeOrThrow(advancedPropertiesFlow) - val loader = getContestDataSourceAsFlow( - properties, - config.creds, - ).applyAdvancedProperties(advancedPropertiesFlow) - .withRunsBefore() + val loader = parseFileToCdsSettings(path) + .toFlow(config.creds) + .applyAdvancedProperties(advancedPropertiesFlow) + .contestState() .filterUseless() .removeFrozenSubmissions() .processHiddenTeamsAndGroups() diff --git a/src/backend/src/main/kotlin/org/icpclive/Config.kt b/src/backend/src/main/kotlin/org/icpclive/Config.kt index 8e3b35743..ca97ba76c 100644 --- a/src/backend/src/main/kotlin/org/icpclive/Config.kt +++ b/src/backend/src/main/kotlin/org/icpclive/Config.kt @@ -1,50 +1,72 @@ package org.icpclive -import io.ktor.server.application.* -import io.ktor.server.config.* +import com.github.ajalt.clikt.core.CliktCommand +import com.github.ajalt.clikt.core.context +import com.github.ajalt.clikt.output.MordantHelpFormatter +import com.github.ajalt.clikt.parameters.options.* +import com.github.ajalt.clikt.parameters.types.* import kotlinx.serialization.json.Json import kotlinx.serialization.json.decodeFromStream import org.icpclive.api.LocationRectangle -import org.icpclive.cds.common.setAllowUnsecureConnections -import org.icpclive.util.getCredentials -import java.io.File -import java.nio.file.Path -import java.nio.file.Paths -import java.util.* -import kotlin.io.path.exists - -class Config(environment: ApplicationEnvironment) { - private fun ApplicationConfig.stringOrNull(name: String) = propertyOrNull(name)?.getString() - private fun ApplicationConfig.string(name: String) = property(name).getString() - private fun ApplicationConfig.bool(name: String) = stringOrNull(name) == "true" - - val configDirectory: Path = environment.config.stringOrNull("live.configDirectory") - ?.let { Paths.get(it).toAbsolutePath() } - ?.also { - if (!it.exists()) throw IllegalStateException("Config directory $it does not exist") - environment.log.info("Using config directory $it") - environment.log.info("Current working directory is ${Paths.get("").toAbsolutePath()}") - } ?: throw IllegalStateException("Config directory should be set") - - private fun ApplicationConfig.directory(name: String) = - configDirectory.resolve(string(name)).also { it.toFile().mkdirs() } - - val presetsDirectory: Path = environment.config.directory("live.presetsDirectory") - val mediaDirectory: Path = environment.config.directory("live.mediaDirectory") - val creds: Map = environment.config.stringOrNull("live.credsFile")?.let { - Json.decodeFromStream(File(it).inputStream()) - } ?: emptyMap() - val widgetPositions: Map = - environment.config.stringOrNull("live.widgetPositionsFile")?.let { - Json.decodeFromStream(File(it).inputStream()) - } ?: emptyMap() - val allowUnsecureConnections = environment.config.bool("live.allowUnsecureConnections").also { - setAllowUnsecureConnections(it) + +object Config : CliktCommand(name = "java -jar live-v3.jar", printHelpOnEmptyArgs = true) { + val configDirectory by option( + "-c", "--config-directory", + help = "Path to config directory" + ).path(mustExist = true, canBeFile = false, canBeDir = true).required() + + val port: Int by option("-p", "--port", help = "Port to listen").int().default(8080) + val authDisabled by option( + "--no-auth", + help = "Disable http basic auth in admin" + ).flag() + + + val creds by option( + "--creds", + help = "Path to file with credentials" + ).path(mustExist = true, canBeFile = true, canBeDir = false) + .convert { path -> + path.toFile().inputStream().use { Json.decodeFromStream>(it) } + }.default(emptyMap(), "none") + + val ktorArgs by option("--ktor-arg", help = "Arguments to forward to ktor server").multiple() + + val advancedJsonPath by option("--advanced-json", help = "Path to advanced.json") + .path(mustExist = true, canBeFile = true, canBeDir = false) + .defaultLazy("configDirectory/advanced.json") { configDirectory.resolve("advanced.json") } + + val presetsDirectory by option("--presets-dir", help = "Directory to store presets") + .path(canBeFile = false, canBeDir = true) + .defaultLazy("configDirectory/presets") { configDirectory.resolve("presets") } + val mediaDirectory by option("--media-dir", help = "Directory to store media") + .path(canBeFile = false, canBeDir = true) + .defaultLazy("configDirectory/media") { configDirectory.resolve("media") } + + val widgetPositions by option( + "--widget-positions", + help = "File with custom widget positions" + ).path(canBeDir = false, mustExist = true, canBeFile = true).convert { path-> + path.toFile().inputStream().use { Json.decodeFromStream>(it) } + }.default(emptyMap(), "none") + + val analyticsTemplatesFile by option( + "--analytics-template", + help = "File with localization of analytics messages" + ).path(canBeFile = true, canBeDir = false, mustExist = true) + + override fun run() { + presetsDirectory.toFile().mkdirs() + mediaDirectory.toFile().mkdirs() + io.ktor.server.netty.EngineMain.main((listOf("-port=$port") + ktorArgs).toTypedArray()) } - val authDisabled = environment.config.bool("auth.disabled") - val analyticsTemplatesFile = environment.config.stringOrNull("live.analyticsTemplatesFile")?.let { Path.of(it) } -} -lateinit var config: Config + init { + context { + helpFormatter = { MordantHelpFormatter(it, showRequiredTag = true, showDefaultValues = true) } + } + } + +} -fun Properties.getCredentials(key: String) = getCredentials(key, config.creds) +val config: Config get() = Config \ No newline at end of file diff --git a/src/backend/src/main/kotlin/org/icpclive/admin/Info.kt b/src/backend/src/main/kotlin/org/icpclive/admin/Info.kt index eeb86aef3..6191d8c64 100644 --- a/src/backend/src/main/kotlin/org/icpclive/admin/Info.kt +++ b/src/backend/src/main/kotlin/org/icpclive/admin/Info.kt @@ -1,9 +1,11 @@ package org.icpclive.admin import kotlinx.coroutines.flow.first +import org.icpclive.api.InefficientContestInfoApi import org.icpclive.data.DataBus -suspend fun getTeams() = DataBus.contestInfoFlow.await().first().teams.filterNot { it.isHidden } +@OptIn(InefficientContestInfoApi::class) +suspend fun getTeams() = DataBus.contestInfoFlow.await().first().teamList.filterNot { it.isHidden } suspend fun getRegions() = getTeams().flatMap { it.groups }.distinct().sorted() diff --git a/src/backend/src/main/kotlin/org/icpclive/admin/Routing.kt b/src/backend/src/main/kotlin/org/icpclive/admin/Routing.kt index 03db19d6a..ead440d4d 100644 --- a/src/backend/src/main/kotlin/org/icpclive/admin/Routing.kt +++ b/src/backend/src/main/kotlin/org/icpclive/admin/Routing.kt @@ -9,9 +9,9 @@ import io.ktor.server.websocket.* import kotlinx.coroutines.flow.first import kotlinx.serialization.encodeToString import kotlinx.serialization.json.Json +import org.icpclive.Config import org.icpclive.api.TeamViewPosition -import org.icpclive.api.toAdvancedProperties -import org.icpclive.config +import org.icpclive.api.tunning.toAdvancedProperties import org.icpclive.data.Controllers import org.icpclive.data.DataBus import org.icpclive.util.sendFlow @@ -35,7 +35,7 @@ fun Route.configureAdminApiRouting() { } } fun Route.setupTeamViews(positions: List) { - setupControllerGroup(positions.map { Controllers.teamView(it) }) + setupControllerGroup(positions.associate { it.name to Controllers.teamView(it) }) positions.forEach { position -> route("/${position.name}") { setupController(Controllers.teamView(position)) } } @@ -64,7 +64,7 @@ fun Route.configureAdminApiRouting() { setupController(Controllers.title) get("/templates") { run { - val mediaDirectoryFile = config.mediaDirectory.toFile() + val mediaDirectoryFile = Config.mediaDirectory.toFile() call.respond(mediaDirectoryFile.walkTopDown() .filter { it.isFile && it.name.endsWith(".svg") } .map { it.relativeTo(mediaDirectoryFile).path }.toList() diff --git a/src/backend/src/main/kotlin/org/icpclive/admin/SpotlightTeam.kt b/src/backend/src/main/kotlin/org/icpclive/admin/SpotlightTeam.kt index 7f464372e..ae67cdd39 100644 --- a/src/backend/src/main/kotlin/org/icpclive/admin/SpotlightTeam.kt +++ b/src/backend/src/main/kotlin/org/icpclive/admin/SpotlightTeam.kt @@ -4,8 +4,7 @@ import io.ktor.server.application.* import io.ktor.server.routing.* import io.ktor.server.websocket.* import kotlinx.coroutines.flow.combine -import org.icpclive.api.AddTeamScoreRequest -import org.icpclive.api.InterestingTeam +import org.icpclive.api.* import org.icpclive.data.DataBus import org.icpclive.util.completeOrThrow import org.icpclive.util.reliableSharedFlow @@ -25,7 +24,7 @@ fun Route.setupSpotlight() { webSocket { sendJsonFlow(DataBus.teamInterestingFlow.await().combine(DataBus.contestInfoFlow.await()) { teams, info -> val teamsScore = teams.associate { it.teamId to it.score } - info.teams.map { InterestingTeam(it.id, it.name, teamsScore[it.id] ?: 0.0) } + @OptIn(InefficientContestInfoApi::class) info.teamList.map { InterestingTeam(it.id, it.fullName, teamsScore[it.id] ?: 0.0) } }) } } diff --git a/src/backend/src/main/kotlin/org/icpclive/admin/Widgets.kt b/src/backend/src/main/kotlin/org/icpclive/admin/Widgets.kt index 8163c14df..ec0b1d1ad 100644 --- a/src/backend/src/main/kotlin/org/icpclive/admin/Widgets.kt +++ b/src/backend/src/main/kotlin/org/icpclive/admin/Widgets.kt @@ -4,9 +4,7 @@ import io.ktor.server.application.* import io.ktor.server.response.* import io.ktor.server.routing.* import org.icpclive.api.ObjectSettings -import org.icpclive.api.ObjectStatus import org.icpclive.api.TypeWithId -import org.icpclive.api.UnitSettings import org.icpclive.controllers.PresetsController import org.icpclive.controllers.SingleWidgetController import kotlin.time.Duration.Companion.milliseconds @@ -49,22 +47,22 @@ inline fun Route.setupControllerGroup( - controllers: List> + controllers: Map> ) { get { // run is workaround for https://youtrack.jetbrains.com/issue/KT-34051 run { - call.respond(ObjectStatus(controllers.any { it.getStatus().shown }, UnitSettings, null)) + call.respond(controllers.mapValues { it.value.getStatus() }) } } post("/show") { call.adminApiAction { - controllers.forEach { it.show() } + controllers.forEach { it.value.show() } } } post("/hide") { call.adminApiAction { - controllers.forEach { it.hide() } + controllers.forEach { it.value.hide() } } } } diff --git a/src/backend/src/main/kotlin/org/icpclive/api/Widgets.kt b/src/backend/src/main/kotlin/org/icpclive/api/Widgets.kt index 259edd484..5b8b4a725 100644 --- a/src/backend/src/main/kotlin/org/icpclive/api/Widgets.kt +++ b/src/backend/src/main/kotlin/org/icpclive/api/Widgets.kt @@ -4,7 +4,7 @@ package org.icpclive.api import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable -import org.icpclive.config +import org.icpclive.Config import kotlin.random.Random import kotlin.random.nextUInt @@ -19,7 +19,7 @@ class LocationRectangle( ) fun getLocationOrDefault(widgetPrefix: String, defaultLocationRectangle: LocationRectangle) = - config.widgetPositions.getOrDefault(widgetPrefix, defaultLocationRectangle) + Config.widgetPositions.getOrDefault(widgetPrefix, defaultLocationRectangle) @Serializable sealed class Widget( diff --git a/src/backend/src/main/kotlin/org/icpclive/controllers/LocatorWidgetController.kt b/src/backend/src/main/kotlin/org/icpclive/controllers/LocatorWidgetController.kt index 999261468..36c8631ae 100644 --- a/src/backend/src/main/kotlin/org/icpclive/controllers/LocatorWidgetController.kt +++ b/src/backend/src/main/kotlin/org/icpclive/controllers/LocatorWidgetController.kt @@ -10,19 +10,19 @@ class LocatorWidgetController(manager: Manager) : SingleWidgetController(ExternalTeamLocatorSettings(), manager) { override suspend fun onDelete(id: Int) {} - fun TeamLocatorExternalCircleSettings.getTeam(teams: List) = - teams.singleOrNull { it.id == teamId } ?: teams.singleOrNull { it.contestSystemId == cdsTeamId } + fun TeamLocatorExternalCircleSettings.getTeam(info: ContestInfo) = + info.teams[teamId] ?: info.cdsTeams[cdsTeamId] override suspend fun checkSettings(settings: ExternalTeamLocatorSettings) { - val teams = DataBus.contestInfoFlow.await().first().teams - settings.circles.forEach { it.getTeam(teams) ?: throw ApiActionException("No team for circle $it") } + val info = DataBus.contestInfoFlow.await().first() + settings.circles.forEach { it.getTeam(info) ?: throw ApiActionException("No team for circle $it") } } override suspend fun constructWidget(settings: ExternalTeamLocatorSettings): TeamLocatorWidget { checkSettings(settings) - val teams = DataBus.contestInfoFlow.await().first().teams + val info = DataBus.contestInfoFlow.await().first() fun TeamLocatorExternalCircleSettings.toCircle() = TeamLocatorCircleSettings( - x, y, radius, getTeam(teams)?.id ?: throw ApiActionException("No team for circle $this") + x, y, radius, getTeam(info)?.id ?: throw ApiActionException("No team for circle $this") ) return TeamLocatorWidget(TeamLocatorSettings(settings.circles.map { it.toCircle() }, settings.scene)) } diff --git a/src/backend/src/main/kotlin/org/icpclive/controllers/TeamViewController.kt b/src/backend/src/main/kotlin/org/icpclive/controllers/TeamViewController.kt index 4bea55108..4653e7966 100644 --- a/src/backend/src/main/kotlin/org/icpclive/controllers/TeamViewController.kt +++ b/src/backend/src/main/kotlin/org/icpclive/controllers/TeamViewController.kt @@ -12,7 +12,7 @@ class TeamViewController(manager: Manager, val position: TeamVie override suspend fun onDelete(id: Int) {} override suspend fun constructWidget(settings: ExternalTeamViewSettings): TeamViewWidget { - val teamInfo = DataBus.contestInfoFlow.await().first().teams.find { it.id == settings.teamId } + val teamInfo = DataBus.contestInfoFlow.await().first().teams[settings.teamId] val content = settings.mediaTypes.mapNotNull { teamInfo?.medias?.get(it) }.toMutableList() if (settings.showTaskStatus) { settings.teamId?.let { teamId -> content.add(MediaType.TaskStatus(teamId)) } diff --git a/src/backend/src/main/kotlin/org/icpclive/data/Controllers.kt b/src/backend/src/main/kotlin/org/icpclive/data/Controllers.kt index 726a35ffe..27dffed28 100644 --- a/src/backend/src/main/kotlin/org/icpclive/data/Controllers.kt +++ b/src/backend/src/main/kotlin/org/icpclive/data/Controllers.kt @@ -1,8 +1,8 @@ package org.icpclive.data +import org.icpclive.Config import org.icpclive.admin.createUsersController import org.icpclive.api.* -import org.icpclive.config import org.icpclive.controllers.* import org.icpclive.util.Svg import org.icpclive.util.toBase64SVG @@ -20,15 +20,15 @@ object Controllers { val locator = LocatorWidgetController(WidgetManager) - private fun presetsPath(name: String) = config.presetsDirectory.resolve("$name.json") + private fun presetsPath(name: String) = Config.presetsDirectory.resolve("$name.json") val advertisement = PresetsController(presetsPath("advertisements"), WidgetManager, ::AdvertisementWidget) val picture = PresetsController(presetsPath("pictures"), WidgetManager, ::PictureWidget) val title = PresetsController(presetsPath("title"), WidgetManager) { titleSettings: TitleSettings -> SvgWidget( - Svg.loadAndSubstitute(config.mediaDirectory.resolve(titleSettings.preset), titleSettings.data).toBase64SVG() + Svg.loadAndSubstitute(Config.mediaDirectory.resolve(titleSettings.preset), titleSettings.data).toBase64SVG() ) } val tickerMessage = PresetsController(presetsPath("ticker"), TickerManager, TickerMessageSettings::toMessage) - val userController = config.createUsersController() + val userController = Config.createUsersController() } diff --git a/src/backend/src/main/kotlin/org/icpclive/data/DataBus.kt b/src/backend/src/main/kotlin/org/icpclive/data/DataBus.kt index ac6a880c1..d7244bc13 100644 --- a/src/backend/src/main/kotlin/org/icpclive/data/DataBus.kt +++ b/src/backend/src/main/kotlin/org/icpclive/data/DataBus.kt @@ -7,6 +7,7 @@ import kotlinx.coroutines.flow.FlowCollector import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.StateFlow import org.icpclive.api.* +import org.icpclive.api.tunning.AdvancedProperties import org.icpclive.util.completeOrThrow import org.icpclive.service.AnalyticsAction import org.icpclive.service.FeaturedRunAction diff --git a/src/backend/src/main/kotlin/org/icpclive/overlay/Routing.kt b/src/backend/src/main/kotlin/org/icpclive/overlay/Routing.kt index 6afde2071..188d5f2f6 100644 --- a/src/backend/src/main/kotlin/org/icpclive/overlay/Routing.kt +++ b/src/backend/src/main/kotlin/org/icpclive/overlay/Routing.kt @@ -2,8 +2,8 @@ package org.icpclive.overlay import io.ktor.server.routing.* import io.ktor.server.websocket.* +import org.icpclive.Config import org.icpclive.api.OptimismLevel -import org.icpclive.config import org.icpclive.data.DataBus import org.icpclive.util.sendJsonFlow @@ -19,6 +19,6 @@ fun Route.configureOverlayRouting() { webSocket("/pessimistic") { sendJsonFlow(DataBus.getScoreboardEvents(OptimismLevel.PESSIMISTIC)) } } route("/svgAchievement"){ - configureSvgAtchievementRouting(config.mediaDirectory) + configureSvgAtchievementRouting(Config.mediaDirectory) } } diff --git a/src/backend/src/main/kotlin/org/icpclive/overlay/SmartSvg.kt b/src/backend/src/main/kotlin/org/icpclive/overlay/SmartSvg.kt index 786f4358c..8ccdfc465 100644 --- a/src/backend/src/main/kotlin/org/icpclive/overlay/SmartSvg.kt +++ b/src/backend/src/main/kotlin/org/icpclive/overlay/SmartSvg.kt @@ -18,10 +18,10 @@ fun Route.configureSvgAtchievementRouting(mediaDirectory: Path) { val substitute = call.request.queryParameters.toMap().mapValues { it.value.first() }.toMutableMap() substitute["teamId"]?.let { teamId -> getTeams().firstOrNull { it.contestSystemId == teamId }?.let { - substitute["team.name"] = it.name - substitute["team.shortName"] = it.shortName + substitute["team.name"] = it.fullName + substitute["team.shortName"] = it.displayName substitute["team.hashTag"] = it.hashTag ?: "" - substitute["team.info"] = it.additionalInfo ?: "" + substitute["team.info"] = it.customFields["svgInfo"] ?: "" } } call.respondBytes(ContentType.Image.SVG) { Svg.loadAndSubstitute(paths, substitute).toByteArray() } diff --git a/src/backend/src/main/kotlin/org/icpclive/service/AdvancedPropertiesService.kt b/src/backend/src/main/kotlin/org/icpclive/service/AdvancedPropertiesService.kt deleted file mode 100644 index ddf5612c2..000000000 --- a/src/backend/src/main/kotlin/org/icpclive/service/AdvancedPropertiesService.kt +++ /dev/null @@ -1,25 +0,0 @@ -package org.icpclive.service - -import kotlinx.coroutines.CompletableDeferred -import kotlinx.coroutines.coroutineScope -import kotlinx.coroutines.flow.* -import org.icpclive.config -import org.icpclive.api.AdvancedProperties -import org.icpclive.util.fileJsonContentFlow -import org.icpclive.util.getLogger - -class AdvancedPropertiesService { - suspend fun run(advancedPropertiesFlowDeferred: CompletableDeferred>) { - coroutineScope { - val advancedJsonPath = config.configDirectory.resolve("advanced.json") - advancedPropertiesFlowDeferred.complete( - fileJsonContentFlow(advancedJsonPath, logger) - .stateIn(this, SharingStarted.Eagerly, AdvancedProperties()) - ) - } - } - - companion object { - val logger = getLogger(AdvancedPropertiesService::class) - } -} diff --git a/src/backend/src/main/kotlin/org/icpclive/service/AnalyticsService.kt b/src/backend/src/main/kotlin/org/icpclive/service/AnalyticsService.kt index c30f1c555..816c6a1f6 100644 --- a/src/backend/src/main/kotlin/org/icpclive/service/AnalyticsService.kt +++ b/src/backend/src/main/kotlin/org/icpclive/service/AnalyticsService.kt @@ -110,7 +110,7 @@ class AnalyticsService { logger.warn("Can't make run featured caused by message ${message.id}") return } - val team = DataBus.contestInfoFlow.await().value.teams.find { it.id == message.teamIds[0] } ?: return + val team = DataBus.contestInfoFlow.await().value.teams[message.teamIds[0]] ?: return val media = team.medias[action.mediaType] ?: return val request = FeaturedRunAction.MakeFeatured(message.runIds[0], media) featuredRunsFlow.emit(request) diff --git a/src/backend/src/main/kotlin/org/icpclive/service/ScoreboardService.kt b/src/backend/src/main/kotlin/org/icpclive/service/ScoreboardService.kt index e74a0bffa..3d285dec3 100644 --- a/src/backend/src/main/kotlin/org/icpclive/service/ScoreboardService.kt +++ b/src/backend/src/main/kotlin/org/icpclive/service/ScoreboardService.kt @@ -8,6 +8,7 @@ import org.icpclive.cds.adapters.stateGroupedByTeam import org.icpclive.data.DataBus import org.icpclive.scoreboard.calculateScoreboard import org.icpclive.util.getLogger +import kotlin.time.Duration class ScoreboardService(val optimismLevel: OptimismLevel) { @@ -19,7 +20,7 @@ class ScoreboardService(val optimismLevel: OptimismLevel) { coroutineScope { updates.stateGroupedByTeam() .calculateScoreboard(optimismLevel) - .stateIn(this, SharingStarted.Eagerly, Scoreboard(emptyList())) + .stateIn(this, SharingStarted.Eagerly, Scoreboard(Duration.ZERO, emptyList())) .let { DataBus.setScoreboardEvents(optimismLevel, it) } } } diff --git a/src/backend/src/main/kotlin/org/icpclive/service/ServiceRoot.kt b/src/backend/src/main/kotlin/org/icpclive/service/ServiceRoot.kt index ed9d56abe..c87bc072a 100644 --- a/src/backend/src/main/kotlin/org/icpclive/service/ServiceRoot.kt +++ b/src/backend/src/main/kotlin/org/icpclive/service/ServiceRoot.kt @@ -3,9 +3,9 @@ package org.icpclive.service import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.* import kotlinx.coroutines.launch +import org.icpclive.Config import org.icpclive.api.* import org.icpclive.cds.* -import org.icpclive.config import org.icpclive.util.completeOrThrow import org.icpclive.data.DataBus import org.icpclive.service.analytics.AnalyticsGenerator @@ -14,7 +14,7 @@ import org.icpclive.service.analytics.AnalyticsGenerator fun CoroutineScope.launchServices(loader: Flow) { val loaded = loader.shareIn(this, SharingStarted.Eagerly, replay = Int.MAX_VALUE) val runsFlow = loaded.filterIsInstance().map { it.newInfo } - val analyticsFlow = loaded.filterIsInstance().map { it.message } + val analyticsFlow = loaded.filterIsInstance().map { it.message } launch { DataBus.contestInfoFlow.completeOrThrow(loaded.filterIsInstance().map { it.newInfo }.stateIn(this)) } @@ -51,7 +51,7 @@ fun CoroutineScope.launchServices(loader: Flow) { } } - val generatedAnalyticsMessages = config.analyticsTemplatesFile?.let { + val generatedAnalyticsMessages = Config.analyticsTemplatesFile?.let { AnalyticsGenerator(it).getFlow( DataBus.contestInfoFlow.await(), runsFlow, diff --git a/src/backend/src/main/kotlin/org/icpclive/service/analytics/AnalyticsGenerator.kt b/src/backend/src/main/kotlin/org/icpclive/service/analytics/AnalyticsGenerator.kt index d4d8a1a73..20ce8955d 100644 --- a/src/backend/src/main/kotlin/org/icpclive/service/analytics/AnalyticsGenerator.kt +++ b/src/backend/src/main/kotlin/org/icpclive/service/analytics/AnalyticsGenerator.kt @@ -28,8 +28,8 @@ class AnalyticsGenerator(jsonTemplatePath: Path) { } val analysis = runs.processRun(run, scoreboard) ?: return@collect - val team = contestInfo.teams.firstOrNull { it.id == run.teamId } ?: return@collect - val problem = contestInfo.problems.firstOrNull { it.id == run.problemId } ?: return@collect + val team = contestInfo.teams[run.teamId] ?: return@collect + val problem = contestInfo.problems[run.problemId] ?: return@collect emit( AnalyticsCommentaryEvent( "_analytics_by_run_${run.id}", @@ -46,9 +46,9 @@ class AnalyticsGenerator(jsonTemplatePath: Path) { private fun getMessage(analyse: RunAnalyse, team: TeamInfo, problem: ProblemInfo): String { val substitute = mapOf( - "{team.shortName}" to team.shortName, - "{problem.letter}" to problem.letter, - "{problem.name}" to problem.name, + "{team.shortName}" to team.displayName, + "{problem.letter}" to problem.displayName, + "{problem.name}" to problem.fullName, "{run.result}" to (analyse.run.result as? ICPCRunResult)?.verdict?.shortName.orEmpty(), "{result.rank}" to analyse.result.rank.toString(), "{result.solvedProblems}" to analyse.solvedProblems?.takeIf { it > 0 }?.toString().orEmpty(), diff --git a/src/cds-converter/build.gradle.kts b/src/cds-converter/build.gradle.kts index 43c245917..9d81a9d28 100644 --- a/src/cds-converter/build.gradle.kts +++ b/src/cds-converter/build.gradle.kts @@ -1,19 +1,14 @@ +import org.gradle.kotlin.dsl.run as runTask + plugins { + application alias(libs.plugins.kotlin.jvm) alias(libs.plugins.kotlin.serialization) - alias(libs.plugins.ktor) + alias(libs.plugins.shadow) } -group = "org.icpclive" -version = rootProject.findProperty("build_version")!! application { - mainClass.set("org.icpclive.ApplicationKt") -} - -ktor { - fatJar { - archiveFileName.set("${project.name}-${project.version}.jar") - } + mainClass = "org.icpclive.ApplicationKt" } kotlin { @@ -24,30 +19,20 @@ kotlin { } } -tasks { - jar { - archiveFileName.set("${project.name}-${project.version}-part.jar") - } - named("run") { - this.args = listOfNotNull( - project.properties["live.dev.credsFile"]?.let { "-P:live.credsFile=$it"}, - project.properties["live.dev.contest"]?.let { "-P:live.configDirectory=$it" }, - project.properties["live.dev.allowUnsecureConnections"]?.let { "-P:live.allowUnsecureConnections=$it" }, - ) - this.workingDir(rootDir.resolve("config")) - } - task("release") { - from(shadowJar) - destinationDir = rootProject.rootDir.resolve("artifacts") +tasks.runTask { + this.args = buildList { + add("server") + project.properties["live.dev.credsFile"]?.let { add("--creds=${it}") } + project.properties["live.dev.contest"]?.let { add("--config-directory=${it}") } } -} - -repositories { - mavenCentral() + this.workingDir(rootDir.resolve("config")) } dependencies { - implementation(libs.logback) + implementation(projects.cds) + implementation(projects.common) + implementation(projects.clicsApi) + implementation(libs.cli) implementation(libs.ktor.serialization.kotlinx.json) implementation(libs.ktor.server.autoHeadResponse) implementation(libs.ktor.server.callLogging) @@ -58,11 +43,7 @@ dependencies { implementation(libs.ktor.server.netty) implementation(libs.ktor.server.statusPages) implementation(libs.ktor.server.websockets) - implementation(libs.kotlinx.datetime) - implementation(libs.kotlinx.serialization.json) - implementation(libs.kotlinx.collections.immutable) - implementation(projects.cds) - implementation(projects.common) + testImplementation(libs.kotlin.junit) testImplementation(libs.ktor.server.tests) } diff --git a/src/cds-converter/src/main/kotlin/Application.kt b/src/cds-converter/src/main/kotlin/Application.kt index 850060135..4e0ce68d1 100644 --- a/src/cds-converter/src/main/kotlin/Application.kt +++ b/src/cds-converter/src/main/kotlin/Application.kt @@ -1,6 +1,11 @@ package org.icpclive import ClicsExporter +import com.github.ajalt.clikt.core.* +import com.github.ajalt.clikt.output.MordantHelpFormatter +import com.github.ajalt.clikt.parameters.groups.* +import com.github.ajalt.clikt.parameters.options.* +import com.github.ajalt.clikt.parameters.types.* import io.ktor.http.* import io.ktor.serialization.kotlinx.json.* import io.ktor.server.application.* @@ -14,30 +19,94 @@ import io.ktor.server.request.* import io.ktor.server.routing.* import io.ktor.server.util.* import io.ktor.server.websocket.* -import kotlinx.collections.immutable.persistentMapOf import kotlinx.coroutines.* import kotlinx.coroutines.flow.* import kotlinx.serialization.json.Json import kotlinx.serialization.json.decodeFromStream -import org.icpclive.api.AdvancedProperties -import org.icpclive.cds.InfoUpdate -import org.icpclive.cds.RunUpdate +import org.icpclive.api.ContestStatus +import org.icpclive.api.tunning.AdvancedProperties +import org.icpclive.cds.ContestUpdate import org.icpclive.cds.adapters.* +import org.icpclive.cds.settings.parseFileToCdsSettings import org.icpclive.util.* -import org.icpclive.cds.getContestDataSourceAsFlow import org.icpclive.org.icpclive.export.pcms.PCMSExporter +import org.slf4j.Logger import org.slf4j.event.Level -import java.io.File -import java.io.FileInputStream -import java.io.FileNotFoundException -import java.nio.file.Files import java.nio.file.Paths import java.time.Duration -import java.util.* +import kotlin.io.path.* import kotlin.system.exitProcess -fun main(args: Array): Unit = - io.ktor.server.netty.EngineMain.main(args) +object CommonOptions : OptionGroup("Common options") { + val configDirectory by option( + "-c", "--config-directory", + help = "Path to config directory" + ).path(mustExist = true, canBeFile = false, canBeDir = true).required() + val credsFile by option( + "--creds", + help = "Path to file with credentials" + ).path(mustExist = true, canBeFile = true, canBeDir = false) + val advancedJsonPath by option("--advanced-json", help = "Path to advanced.json") + .path(mustExist = true, canBeFile = true, canBeDir = false) + .defaultLazy("configDirectory/advanced.json") { configDirectory.resolve("advanced.json") } +} + +object PCMSDumpCommand : CliktCommand(name = "pcms", help = "Dump pcms xml", printHelpOnEmptyArgs = true) { + val commonOptions by CommonOptions + val output by option("-o", "--output", help = "Path to new xml file").path().convert { + if (it.isDirectory()) { + it.resolve("standings.xml") + } else { + it + } + }.required() + .check({ "Directory ${it.parent} doesn't exist"}) { it.parent.isDirectory() } + + override fun run() { + val logger = getLogger(PCMSDumpCommand::class) + logger.info("Would save result to $output") + val flow = getFlow( + fileJsonContentFlow(CommonOptions.advancedJsonPath, logger, AdvancedProperties()), + logger + ) + val data = runBlocking { + logger.info("Waiting till contest become finalized...") + val result = flow.finalContestState() + logger.info("Loaded contest data") + result + } + val dump = PCMSExporter.format( + data.infoAfterEvent!!, + data.runs.values.groupBy { it.teamId }, + ) + output.toFile().printWriter().use { + it.println(dump) + } + } +} + +object ServerCommand : CliktCommand(name = "server", help = "Start as http server", printHelpOnEmptyArgs = true) { + val commonOptions by CommonOptions + val port: Int by option("-p", "--port", help = "Port to listen").int().default(8080) + val ktorArgs by option("--ktor-arg", help = "Arguments to forward to ktor server").multiple() + + override fun run() { + io.ktor.server.netty.EngineMain.main((listOf("-port=$port") + ktorArgs).toTypedArray()) + } +} + +object MainCommand : CliktCommand(name = "java -jar cds-converter.jar") { + init { + context { + helpFormatter = { MordantHelpFormatter(it, showRequiredTag = true, showDefaultValues = true)} + } + } + override fun run() { + } +} + +fun main(args: Array): Unit = MainCommand.subcommands(PCMSDumpCommand, ServerCommand).main(args) + private fun Application.setupKtorPlugins() { install(DefaultHeaders) @@ -78,53 +147,44 @@ fun Application.module() { environment.log.error("Uncaught exception in coroutine context $coroutineContext", throwable) exitProcess(1) } - val configDirectory = environment.config.property("live.configDirectory").getString().let { - Paths.get(it).toAbsolutePath() - } - environment.log.info("Using config directory $configDirectory") - environment.log.info("Current working directory is ${Paths.get("").toAbsolutePath()}") - val path = configDirectory.resolve("events.properties") - if (!Files.exists(path)) throw FileNotFoundException("events.properties not found in $configDirectory") - val properties = Properties() - FileInputStream(path.toString()).use { properties.load(it) } - - val advancedProperties = fileJsonContentFlow(configDirectory.resolve("advanced.json"), environment.log) - .stateIn(this + handler, SharingStarted.Eagerly, AdvancedProperties()) - - - val loaded = getContestDataSourceAsFlow( - properties, - environment.config.propertyOrNull("live.credsFile")?.getString()?.let { - Json.decodeFromStream(File(it).inputStream()) - } ?: emptyMap(), - ) - .applyAdvancedProperties(advancedProperties) - .filterUseless() - .processHiddenTeamsAndGroups() - .shareIn(this + handler, SharingStarted.Eagerly, Int.MAX_VALUE) - - val runs = loaded.filterIsInstance().map { it.newInfo } - val contestState = loaded - .stateWithGroupedRuns { it.teamId } - .stateIn(this + handler, SharingStarted.Eagerly, ContestStateWithGroupedRuns(null, persistentMapOf())) - val contestInfo = loaded - .filterIsInstance() - .map { it.newInfo } - .distinctUntilChanged() - .shareIn(this + handler, SharingStarted.Eagerly, 1) + + val loaded = getFlow( + fileJsonContentFlow(CommonOptions.advancedJsonPath, environment.log, AdvancedProperties()), + environment.log + ).shareIn(this + handler, SharingStarted.Eagerly, Int.MAX_VALUE) routing { with (ClicsExporter) { route("/clics") { - setUp(application + handler, contestInfo, runs) + setUp(application + handler, loaded) } } with (PCMSExporter) { route("/pcms") { - setUp(contestState) + setUp(application + handler, loaded) } } } log.info("Configuration is done") } + +private fun getFlow(advancedProperties: Flow, log: Logger) : Flow { + log.info("Using config directory ${CommonOptions.configDirectory}") + log.info("Current working directory is ${Paths.get("").toAbsolutePath()}") + val path = CommonOptions.configDirectory.resolve("events.properties") + .takeIf { it.exists() } + ?.also { log.warn("Using events.properties is deprecated, use settings.json instead.") } + ?: CommonOptions.configDirectory.resolve("settings.json5").takeIf { it.exists() } + ?: CommonOptions.configDirectory.resolve("settings.json") + val creds: Map = CommonOptions.credsFile?.let { + Json.decodeFromStream(it.toFile().inputStream()) + } ?: emptyMap() + return parseFileToCdsSettings(path) + .toFlow(creds) + .applyAdvancedProperties(advancedProperties) + .contestState() + .filterUseless() + .map { it.event } + .processHiddenTeamsAndGroups() +} \ No newline at end of file diff --git a/src/cds-converter/src/main/kotlin/org/icpclive/export/clics/ClicsExporter.kt b/src/cds-converter/src/main/kotlin/org/icpclive/export/clics/ClicsExporter.kt index ba96d714b..5168af1e9 100644 --- a/src/cds-converter/src/main/kotlin/org/icpclive/export/clics/ClicsExporter.kt +++ b/src/cds-converter/src/main/kotlin/org/icpclive/export/clics/ClicsExporter.kt @@ -1,12 +1,21 @@ import io.ktor.server.application.* import io.ktor.server.response.* import io.ktor.server.routing.* -import kotlinx.coroutines.* +import kotlinx.collections.immutable.persistentMapOf +import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.* -import kotlinx.serialization.encodeToString +import kotlinx.datetime.Instant +import kotlinx.serialization.* +import kotlinx.serialization.descriptors.SerialDescriptor +import kotlinx.serialization.descriptors.elementNames import org.icpclive.api.* - -import org.icpclive.cds.clics.api.* +import org.icpclive.cds.* +import org.icpclive.cds.adapters.stateGroupedByTeam +import org.icpclive.cds.adapters.withContestInfoBefore +import org.icpclive.clics.* +import org.icpclive.clics.Scoreboard +import org.icpclive.clics.ScoreboardRow +import org.icpclive.scoreboard.calculateScoreboardWithInfo import org.icpclive.util.defaultJsonSettings import org.icpclive.util.intervalFlow import java.nio.ByteBuffer @@ -14,6 +23,35 @@ import kotlin.time.Duration.Companion.minutes typealias EventProducer = (String) -> Event +private fun ProblemInfo.toClicsProblem() = Problem( + id = contestSystemId, + ordinal = ordinal, + label = displayName, + name = fullName, + rgb = color, + test_data_count = 1, +) + +private fun GroupInfo.toClicsGroup() = Group( + id = name, + name = name, +) + +private fun OrganizationInfo.toClicsOrg() = Organization( + id = cdsId, + name = displayName, + formal_name = fullName, +) + +private fun TeamInfo.toClicsTeam() = Team( + id = contestSystemId, + name = fullName, + hidden = isHidden, + group_ids = groups, + organization_id = organizationId +) + + object ClicsExporter { private fun Verdict.toJudgmentType() = when (this) { @@ -37,7 +75,7 @@ object ClicsExporter { Verdict.WrongAnswer -> JudgementType("WA", "wrong answer", solved = false, penalty = true) } - private val judgments = Verdict.all.associateWith { + private val judgmentTypes = Verdict.all.associateWith { it.toJudgmentType() } @@ -47,191 +85,359 @@ object ClicsExporter { false, emptyList() ) - private fun updateEvent(id: String, data: T, block : (String, String, T?) -> Event) : EventProducer = { block(id, it, data) } - private fun updateEvent(data: T, block : (String, T?) -> Event) : EventProducer = { block(it, data) } + private val languages = listOf(unknownLanguage) + + private suspend fun FlowCollector.updateEvent(id: String, data: T, block : (String, String, T?) -> Event) = emit { + block(id, it, data) + } - private suspend fun awaitContest() { } + private suspend fun FlowCollector.updateEvent(data: T, block : (String, T?) -> Event) = emit { block(it, data) } - private fun contestFlow(info: Flow) = info.map { - Contest( + private fun getContest(info: ContestInfo) = Contest( id = "contest", - start_time = it.startTime.takeIf { it != kotlinx.datetime.Instant.fromEpochSeconds(0) }, - name = it.name, - formal_name = it.name, - duration = it.contestLength, - scoreboard_freeze_duration = it.freezeTime, - countdown_pause_time = it.holdBeforeStartTime, - penalty_time = it.penaltyPerWrongAttempt, + start_time = info.startTime.takeIf { it != Instant.fromEpochSeconds(0) }, + name = info.name, + formal_name = info.name, + duration = info.contestLength, + scoreboard_freeze_duration = info.freezeTime, + countdown_pause_time = info.holdBeforeStartTime, + penalty_time = info.penaltyPerWrongAttempt, scoreboard_type = "pass-fail" ) - }.distinctUntilChanged().map { updateEvent(it, Event::ContestEventNamedNonWithSpec) } - - private fun judgementTypesFlow() = flow { - awaitContest() - for (type in judgments.values) { - emit(type) - } - }.map { updateEvent(it.id, it, Event::JudgementTypeEvent) } - - private fun languagesFlow() = flow { - awaitContest() - for (type in listOf(unknownLanguage)) { - emit(type) - } - }.map { updateEvent(it.id, it, Event::LanguageEvent) } - - private suspend fun FlowCollector.diff( - old: MutableMap, + private suspend fun FlowCollector.diffChange( + old: MutableMap, new: List, - id: T.() -> K, - onChange: suspend FlowCollector.(T) -> Unit, - onRemove: suspend FlowCollector.(K) -> Unit, + id: T.() -> String, + convert: (T) -> CT, + toFinalEvent: (String, String, CT?) -> Event ) { for (n in new) { if (old[n.id()] != n) { - onChange(n) + updateEvent(n.id(), convert(n), toFinalEvent) old[n.id()] = n } } + } + + private suspend fun FlowCollector.diffRemove( + old: MutableMap, + new: List, + id: T.() -> String, + toFinalEvent: (String, String, CT?) -> Event + ) { val values = new.map { it.id() }.toSet() for (k in old.keys) { if (k !in values) { - onRemove(k) + updateEvent(k, null, toFinalEvent) } } } - private fun problemsFlow(info: Flow) = flow { - awaitContest() - val current = mutableMapOf() - info.collect { - diff( - current, - it.problems, - ProblemInfo::contestSystemId, - { - emit( - updateEvent(it.contestSystemId, Problem( - id = it.contestSystemId, - ordinal = it.ordinal, - label = it.letter, - name = it.name, - rgb = it.color, - test_data_count = 1, - ), Event::ProblemEvent)) - }, - { emit(updateEvent(it, null, Event::ProblemEvent)) } - ) - } + private suspend fun FlowCollector.diff( + old: MutableMap, + new: List, + id: T.() -> String, + convert: (T) -> CT, + toFinalEvent: (String, String, CT?) -> Event + ) { + diffChange(old, new, id, convert, toFinalEvent) + diffRemove(old, new, id, toFinalEvent) } - private fun teamsFlow(info: Flow) = flow { - awaitContest() - val current = mutableMapOf() - val groups = mutableSetOf() - info.collect { - diff( - current, - it.teams, - TeamInfo::contestSystemId, - { - it.groups.forEach { group -> - if (group !in groups) { - groups.add(group) - emit(updateEvent(group, Group(id = group, name = group), Event::GroupsEvent)) - } - } - emit( - updateEvent( - it.contestSystemId, - Team( - id = it.contestSystemId, - name = it.name, - hidden = it.isHidden, - group_ids = it.groups - ), - Event::TeamEvent - ) - ) - }, - { emit(updateEvent(it, null, Event::TeamEvent)) } + private fun getState(info: ContestInfo) = when (info.status) { + ContestStatus.BEFORE -> State( + ended = null, + frozen = null, + started = null, + unfrozen = null, + finalized = null, + thawed = null, + end_of_updates = null + ) + + ContestStatus.RUNNING -> State( + ended = null, + frozen = if (info.currentContestTime >= info.freezeTime) info.startTime + info.freezeTime else null, + started = info.startTime, + unfrozen = null, + finalized = null, + thawed = null, + end_of_updates = null + ) + + ContestStatus.OVER -> State( + ended = info.startTime + info.contestLength, + frozen = info.startTime + info.freezeTime, + started = info.startTime, + unfrozen = null, + finalized = null, + thawed = null, + end_of_updates = null + ) + ContestStatus.FINALIZED -> State( + ended = info.startTime + info.contestLength, + frozen = null, + started = info.startTime, + unfrozen = null, + finalized = info.startTime + info.contestLength, + thawed = null, + end_of_updates = info.startTime + info.contestLength + ) + } + + private val submissionsCreated = mutableSetOf() + private var teamIdToCdsId = mapOf() + private var problemIdToCdsId = mapOf() + + private suspend fun FlowCollector.processRun(info: ContestInfo, run: RunInfo) { + if (run.id !in submissionsCreated) { + submissionsCreated.add(run.id) + updateEvent( + run.id.toString(), + Submission( + id = run.id.toString(), + language_id = unknownLanguage.id, + problem_id = problemIdToCdsId[run.problemId]!!, + team_id = teamIdToCdsId[run.teamId]!!, + time = info.startTime + run.time, + contest_time = run.time, + ), + Event::SubmissionEvent + ) + } + val result = run.result + if (result is ICPCRunResult) { + updateEvent( + run.id.toString(), + Judgement( + id = run.id.toString(), + submission_id = run.id.toString(), + judgement_type_id = judgmentTypes[result.verdict]?.id, + start_time = info.startTime + run.time, + start_contest_time = run.time, + end_time = info.startTime + run.time, + end_contest_time = run.time + ), + Event::JudgementEvent ) } } - private fun stateFlow(info: Flow) = info.map { - when (it.status) { - ContestStatus.BEFORE -> State(ended = null, frozen = null, started = null, unfrozen = null, finalized = null, end_of_updates = null) - ContestStatus.RUNNING -> State(ended = null, frozen = if (it.currentContestTime >= it.freezeTime) it.startTime + it.freezeTime else null, started = it.startTime, unfrozen = null, finalized = null, end_of_updates = null) - ContestStatus.OVER -> State(ended = it.startTime + it.contestLength, frozen = it.startTime + it.freezeTime, started = it.startTime, unfrozen = null, finalized = null, end_of_updates = null) + private suspend fun FlowCollector.diff(oldInfo: ContestInfo?, newInfo: ContestInfo, getter: ContestInfo.() -> T, event : (String, T?) -> Event) { + val old = oldInfo?.getter() + val new = newInfo.getter() + if (old != new) { + updateEvent(new, event) } - }.distinctUntilChanged().map { updateEvent(it, Event::StateEvent) } - - private fun runsFlow(info: Flow, runs: Flow) = flow { - val submissionsCreated = mutableSetOf() - runs.collect { run -> - if (run.id !in submissionsCreated) { - submissionsCreated.add(run.id) - emit(updateEvent( - run.id.toString(), - Submission( - id = run.id.toString(), - language_id = unknownLanguage.id, - problem_id = info.mapNotNull { it.problems.getOrNull(run.problemId) }.first().contestSystemId, - team_id = info.mapNotNull { it.teams.getOrNull(run.teamId) }.first().contestSystemId, - time = info.first().startTime + run.time, - contest_time = run.time, - ), - Event::SubmissionEvent - )) + } + + private val groupsMap = mutableMapOf() + private val orgsMap = mutableMapOf() + private val problemsMap = mutableMapOf() + private val teamsMap = mutableMapOf() + + @OptIn(InefficientContestInfoApi::class) + private suspend fun FlowCollector.calculateDiff(oldInfo: ContestInfo?, newInfo: ContestInfo) { + problemIdToCdsId = newInfo.problemList.associate { it.id to it.contestSystemId } + teamIdToCdsId = newInfo.teamList.associate { it.id to it.contestSystemId } + + diff(oldInfo, newInfo, ::getContest, Event::ContestEventNamedWithSpec) + diff(oldInfo, newInfo, ::getState, Event::StateEvent) + if (oldInfo == null) { + for (type in judgmentTypes.values) { + updateEvent(type.id, type, Event::JudgementTypeEvent) } - val result = run.result - if (result is ICPCRunResult) { - emit(updateEvent( - run.id.toString(), - Judgement( - id = run.id.toString(), - submission_id = run.id.toString(), - judgement_type_id = judgments[result.verdict]?.id, - start_time = info.first().startTime + run.time, - start_contest_time = run.time, - end_time = info.first().startTime + run.time, - end_contest_time = run.time - ), - Event::JudgementEvent - )) + for (language in languages) { + updateEvent(language.id, language, Event::LanguageEvent) } } + diff(problemsMap, newInfo.problemList, ProblemInfo::contestSystemId, ProblemInfo::toClicsProblem, Event::ProblemEvent) + diffChange(groupsMap, newInfo.groupList, GroupInfo::name, GroupInfo::toClicsGroup, Event::GroupsEvent) + diffChange(orgsMap, newInfo.organizationList, OrganizationInfo::cdsId, OrganizationInfo::toClicsOrg, Event::OrganizationEvent) + + diff(teamsMap, newInfo.teamList, TeamInfo::contestSystemId, TeamInfo::toClicsTeam, Event::TeamEvent) + + diffRemove(groupsMap, newInfo.groupList, GroupInfo::name, Event::GroupsEvent) + diffRemove(orgsMap, newInfo.organizationList, OrganizationInfo::cdsId, Event::OrganizationEvent) + } + + private suspend fun FlowCollector.processAnalytics(message: AnalyticsMessage) { + val event = message as? AnalyticsCommentaryEvent ?: return + updateEvent( + event.id, + Commentary( + event.id, + event.time, + event.relativeTime, + event.message, + event.teamIds.map { teamIdToCdsId[it]!! }, + emptyList(), + event.runIds.map { it.toString() } + ), + Event::CommentaryEvent + ) } - private suspend fun FlowCollector.generateEventFeed(info: Flow, runs: Flow) { + private suspend fun FlowCollector.generateEventFeed(updates: Flow) { var eventCounter = 1 - merge( - contestFlow(info), - judgementTypesFlow(), - languagesFlow(), - problemsFlow(info), - teamsFlow(info), - stateFlow(info), - runsFlow(info, runs) - ).collect { + updates.withContestInfoBefore().transform { (update, infoBefore) -> + when (update) { + is InfoUpdate -> calculateDiff(infoBefore, update.newInfo) + is RunUpdate -> processRun(infoBefore!!, update.newInfo) + is AnalyticsUpdate -> processAnalytics(update.message) + } + }.collect { emit(it("live-cds-${eventCounter++}")) } } - fun Route.setUp(scope: CoroutineScope, contestInfo: Flow, runs: Flow) { + private inline fun > Flow.filterGlobalEvent(scope: CoroutineScope) = filterIsInstance().map { + it.data + }.stateIn(scope, SharingStarted.Eagerly, null) + .filterNotNull() + private inline fun > Flow.filterIdEvent(scope: CoroutineScope) = filterIsInstance() + .runningFold(persistentMapOf()) { accumulator, value -> + if (value.data == null) { + accumulator.remove(value.id) + } else { + accumulator.put(value.id, value.data!!) + } + }.stateIn(scope, SharingStarted.Eagerly, persistentMapOf()) + + @Serializable + data class Error(val code: Int, val message: String) + + private val endpoint = mutableMapOf() + + private inline fun Route.getId(prefix: String, flow: Flow>) { + endpoint[prefix] = serializer().descriptor + route("/$prefix") { + get { call.respond(flow.first().entries.sortedBy { it.key }.map { it.value }) } + get("/{id}") { + val id = call.parameters["id"] + val f = flow.first() + if (id in f) { + call.respond(f[id]!!) + } else { + call.respond( + Error(404,"Object with ID '$id' not found") + ) + } + } + } + } + + private inline fun Route.getGlobal(prefix: String, flow: Flow) { + endpoint[prefix] = serializer().descriptor + route("/$prefix") { + get { call.respond(flow.first()) } + } + } + + + fun Route.setUp(scope: CoroutineScope, updates: Flow) { val eventFeed = flow { - generateEventFeed(contestInfo, runs) + generateEventFeed(updates) }.shareIn(scope, SharingStarted.Eagerly, replay = Int.MAX_VALUE) - get("/event-feed") { - val json = defaultJsonSettings() - call.respondBytesWriter { - merge(eventFeed.map { json.encodeToString(it) }, intervalFlow(2.minutes).map { "" }).collect { - writeFully(ByteBuffer.wrap("$it\n".toByteArray())) - flush() + val contestFlow = eventFeed.filterGlobalEvent(scope) + val stateFlow = eventFeed.filterGlobalEvent(scope) + + val judgementTypesFlow = eventFeed.filterIdEvent(scope) + val languagesFlow = eventFeed.filterIdEvent(scope) + val problemsFlow = eventFeed.filterIdEvent(scope) + val groupsFlow = eventFeed.filterIdEvent(scope) + val organizationsFlow = eventFeed.filterIdEvent(scope) + val teamsFlow = eventFeed.filterIdEvent(scope) + val submissionsFlow = eventFeed.filterIdEvent(scope) + val judgementsFlow = eventFeed.filterIdEvent(scope) + //val runsFlow = eventFeed.filterIdEvent(scope) + val commentaryFlow = eventFeed.filterIdEvent(scope) + //val personsFlow = eventFeed.filterIdEvent(scope) + //val accountsFlow = eventFeed.filterIdEvent(scope) + //val clarificationsFlow = eventFeed.filterIdEvent(scope) + //val awardsFlow = eventFeed.filterIdEvent(scope) + val scoreboardFlow = updates.stateGroupedByTeam() + .calculateScoreboardWithInfo(OptimismLevel.NORMAL).map {(info, scorboard) -> + Scoreboard( + time = info.startTime + scorboard.lastSubmitTime, + contest_time = scorboard.lastSubmitTime, + state = getState(info), + rows = scorboard.rows.map { + ScoreboardRow( + it.rank, + info.teams[it.teamId]!!.contestSystemId, + ScoreboardRowScore(it.totalScore.toInt(), it.penalty.inWholeMinutes), + it.problemResults.mapIndexed { index, v -> + val iv = v as ICPCProblemResult + ScoreboardRowProblem( + info.scoreboardProblems[index].contestSystemId, + iv.wrongAttempts + (if (iv.isSolved) 1 else 0), + iv.pendingAttempts, + iv.isSolved, + iv.lastSubmitTime?.inWholeMinutes.takeIf { iv.isSolved } + ) + } + ) + } + ) + }.stateIn(scope, SharingStarted.Eagerly, null) + .filterNotNull() + + val json = defaultJsonSettings() + route("/api") { + get { + call.respond( + ApiInfo( + "2022_07", + "https://ccs-specs.icpc.io/2022-07/contest_api", + ApiProvider("icpc live") + ) + ) + } + route("/contests") { + get { call.respond(listOf(contestFlow.first())) } + getGlobal("contest", contestFlow) + route("contest") { + getGlobal("state", stateFlow) + getId("judgement-types", judgementTypesFlow) + getId("languages", languagesFlow) + getId("problems", problemsFlow) + getId("groups", groupsFlow) + getId("organizations", organizationsFlow) + getId("teams", teamsFlow) + getId("submissions", submissionsFlow) + getId("judgements", judgementsFlow) + //getId("runs", runsFlow) + getId("commentary", commentaryFlow) + //getId("persons", personsFlow) + //getId("accounts", accountsFlow) + //getId("clarifications", clarificationsFlow) + //getId("awards", awardsFlow) + get("/scoreboard") { call.respond(scoreboardFlow.first()) } + get("/event-feed") { + call.respondBytesWriter { + merge(eventFeed.map { json.encodeToString(it) }, intervalFlow(2.minutes).map { "" }).collect { + writeFully(ByteBuffer.wrap("$it\n".toByteArray())) + flush() + } + } + } + get("/access") { + call.respond( + Access( + emptyList(), + endpoint.entries.map { (k, v) -> + Endpoint( + k, + v.elementNames.toList() + ) + } + ) + ) + } } } } diff --git a/src/cds-converter/src/main/kotlin/org/icpclive/export/pcms/PCMSExporter.kt b/src/cds-converter/src/main/kotlin/org/icpclive/export/pcms/PCMSExporter.kt index 77f082f70..f41b62a37 100644 --- a/src/cds-converter/src/main/kotlin/org/icpclive/export/pcms/PCMSExporter.kt +++ b/src/cds-converter/src/main/kotlin/org/icpclive/export/pcms/PCMSExporter.kt @@ -4,10 +4,11 @@ import io.ktor.http.* import io.ktor.server.application.* import io.ktor.server.response.* import io.ktor.server.routing.* -import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.first +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.flow.* import org.icpclive.api.* -import org.icpclive.cds.adapters.ContestStateWithGroupedRuns +import org.icpclive.cds.ContestUpdate +import org.icpclive.cds.adapters.* import org.icpclive.scoreboard.getScoreboardCalculator import org.icpclive.util.createChild import org.w3c.dom.Element @@ -41,6 +42,12 @@ object PCMSExporter { Verdict.Rejected -> "wrong-answer" } + fun ContestStatus.toPcmsStatus() = when (this) { + ContestStatus.FINALIZED, ContestStatus.OVER -> "over" + ContestStatus.RUNNING -> "running" + ContestStatus.BEFORE -> "before" + } + private fun Element.buildContestNode(info: ContestInfo) { setAttribute("name", info.name) @@ -48,16 +55,16 @@ object PCMSExporter { setAttribute("start-time", info.startTime.toString()) setAttribute("start-time-millis", info.startTime.toEpochMilliseconds().toString()) setAttribute("length", info.contestLength.inWholeSeconds.toString()) - setAttribute("status", info.status.name.lowercase()) + setAttribute("status", info.status.toPcmsStatus()) setAttribute("frozen", "no") setAttribute("freeze-time", info.freezeTime.toIsoString()) setAttribute("freeze-time-millis", info.freezeTime.inWholeMilliseconds.toString()) } private fun Element.buildChallengeNode(info: ContestInfo) { - info.problems.forEach { problem -> + info.scoreboardProblems.forEach { problem -> createChild("problem").also { - it.setAttribute("alias", problem.letter) - it.setAttribute("name", problem.name) + it.setAttribute("alias", problem.displayName) + it.setAttribute("name", problem.fullName) } } } @@ -71,11 +78,11 @@ object PCMSExporter { } private fun Element.buildSessionNode(info: ContestInfo, teamInfo: TeamInfo, row: ScoreboardRow, runs: List) { - setAttribute("party", teamInfo.name) + setAttribute("party", teamInfo.fullName) setAttribute("id", teamInfo.contestSystemId) // setAttribute("time", "") setAttribute("alias", teamInfo.contestSystemId) - setAttribute("penalty", row.penalty.toString()) + setAttribute("penalty", row.penalty.inWholeMinutes.toString()) setAttribute("solved", row.totalScore.toInt().toString()) val runsByProblem = runs.groupBy { it.problemId } row.problemResults.forEachIndexed { index, probResult -> @@ -84,11 +91,11 @@ object PCMSExporter { val isAcceptedInt = if ((probResult as ICPCProblemResult).isSolved) 1 else 0 probNode.setAttribute("accepted", isAcceptedInt.toString()) probNode.setAttribute("attempts", (probResult.wrongAttempts + isAcceptedInt).toString()) - probNode.setAttribute("id", info.problems[index].contestSystemId) - probNode.setAttribute("alias", info.problems[index].letter) + probNode.setAttribute("id", info.scoreboardProblems[index].contestSystemId) + probNode.setAttribute("alias", info.scoreboardProblems[index].displayName) probNode.setAttribute("time", (probResult.lastSubmitTime ?: Duration.ZERO).inWholeMilliseconds.toString()) probNode.setAttribute("penalty", (if (probResult.isSolved) { - probResult.lastSubmitTime!!.inWholeMinutes + probResult.wrongAttempts * info.penaltyPerWrongAttempt + (probResult.lastSubmitTime!! + info.penaltyPerWrongAttempt * probResult.wrongAttempts).inWholeMinutes } else 0).toString()) problemRuns.forEach { probNode.createChild("run").apply { @@ -112,10 +119,9 @@ object PCMSExporter { val challenge = contest.createChild("challenge") challenge.buildChallengeNode(info) val scoreboard = getScoreboardCalculator(info, OptimismLevel.NORMAL).getScoreboard(info, runsByTeam) - val teamById = info.teams.associateBy { it.id } scoreboard.rows.forEach { contest.createChild("session").also { session -> - session.buildSessionNode(info, teamById[it.teamId]!!, it, runsByTeam[it.teamId] ?: emptyList()) + session.buildSessionNode(info, info.teams[it.teamId]!!, it, runsByTeam[it.teamId] ?: emptyList()) } } @@ -131,15 +137,20 @@ object PCMSExporter { return output.toString() } - fun Route.setUp(contestInfo: Flow>) { + fun Route.setUp(scope: CoroutineScope, contestUpdates: Flow) { + val stateFlow = contestUpdates + .stateGroupedByTeam() + .stateIn(scope, SharingStarted.Eagerly, null) + .filterNotNull() + .filter { it.infoAfterEvent != null } get { call.respondRedirect("/pcms/standings.xml", permanent = true) } get("standings.xml") { call.respondText(contentType = ContentType.Text.Xml) { - val state = contestInfo.first { it.info != null } + val state = stateFlow.first() format( - state.info!!, + state.infoAfterEvent!!, state.runs ) } diff --git a/src/cds-converter/src/main/resources/application.conf b/src/cds-converter/src/main/resources/application.conf index 28e803600..41fb3f09a 100644 --- a/src/cds-converter/src/main/resources/application.conf +++ b/src/cds-converter/src/main/resources/application.conf @@ -1,16 +1,7 @@ ktor { deployment { - port = 8080 - port = ${?PORT} } application { modules = [ org.icpclive.ApplicationKt.module ] } -} - -live { -# relative from backend directory - configDirectory = ${?CONFIG_DIR} - credsFile = ${?CREDS_FILE} - allowUnsecureConnections = false -} +} \ No newline at end of file diff --git a/src/cds/build.gradle.kts b/src/cds/build.gradle.kts index 14d35ff23..8c79e4d7f 100644 --- a/src/cds/build.gradle.kts +++ b/src/cds/build.gradle.kts @@ -1,22 +1,77 @@ +import com.google.protobuf.gradle.* +import java.net.URI + plugins { + `java-library` alias(libs.plugins.kotlin.jvm) alias(libs.plugins.kotlin.serialization) - base + alias(libs.plugins.dokka) + alias(libs.plugins.protobuf) +} + +protobuf { + protoc { + artifact = libs.protoc.get().toString() + } + plugins { + id("grpc") { + artifact = libs.grpc.gen.java.get().toString() + } + id("grpckt") { + artifact = libs.grpc.gen.kotlin.get().toString() + ":jdk8@jar" + } + } + generateProtoTasks { + ofSourceSet("main").configureEach { + plugins { + id("grpc") + id("grpckt") + } + builtins { + id("kotlin") + } + } + } } +tasks { + dokkaHtml { + moduleName.set("ICPC-live contest data parser") + dokkaSourceSets.configureEach { + perPackageOption { + matchingRegex.set(".*") + reportUndocumented.set(true) + sourceLink { + localDirectory.set(projectDir) + remoteUrl.set(URI("https://github.com/icpc/live-v3/tree/main/src/cds").toURL()) + remoteLineSuffix.set("#L") + } + } + } + } + + test { + inputs.dir("testData/") + } +} + +kotlin { + explicitApi() +} dependencies { - implementation(libs.logback) - implementation(libs.ktor.client.cio) - implementation(libs.ktor.client.auth) - implementation(libs.ktor.client.websockets) - implementation(libs.ktor.client.logging) - implementation(libs.kotlinx.serialization.json) - implementation(libs.kotlinx.datetime) + api(libs.kotlinx.collections.immutable) implementation(projects.common) - implementation(libs.kotlinx.collections.immutable) - implementation(kotlin("reflect")) + implementation(projects.clicsApi) + implementation(libs.grpc.protobuf) + implementation(libs.grpc.stub) + implementation(libs.kotlin.reflect) + implementation(libs.kotlinx.serialization.json5) + implementation(libs.kotlinx.serialization.properties) + implementation(libs.ktor.client.auth) + implementation(libs.ktor.client.cio) + implementation(libs.protobuf) + runtimeOnly(libs.grpc.netty) testImplementation(libs.kotlin.junit) - testImplementation("com.approvaltests:approvaltests:18.6.0") } \ No newline at end of file diff --git a/src/cds/src/main/kotlin/org/icpclive/api/Advanced.kt b/src/cds/src/main/kotlin/org/icpclive/api/Advanced.kt deleted file mode 100644 index 471546fa3..000000000 --- a/src/cds/src/main/kotlin/org/icpclive/api/Advanced.kt +++ /dev/null @@ -1,101 +0,0 @@ -package org.icpclive.api - -import kotlinx.serialization.SerialName -import kotlinx.serialization.Serializable -import org.icpclive.util.ColorSerializer -import org.icpclive.util.DurationInSecondsSerializer -import org.icpclive.util.humanReadable -import java.awt.Color -import kotlin.time.Duration - -@Serializable -data class TeamInfoOverride( - val name: String? = null, - val shortname: String? = null, - val groups: List? = null, - val hashTag: String? = null, - val medias: Map? = null, - val additionalInfo: String? = null, - val isHidden: Boolean? = null, - val isOutOfContest: Boolean? = null -) - -@Serializable -data class ProblemInfoOverride( - val name: String? = null, - @Serializable(ColorSerializer::class) - val color: Color? = null, - val minScore: Double? = null, - val maxScore: Double? = null, - val scoreMergeMode: ScoreMergeMode? = null -) - -@Serializable -data class GroupInfoOverride( - val isHidden: Boolean? = null, - val isOutOfContest: Boolean? = null -) - -@Serializable -class RankingSettings( - val medals: List? = null, - val penaltyPerWrongAttempt: Int? = null, - val showTeamsWithoutSubmissions: Boolean? = null, - val penaltyRoundingMode: PenaltyRoundingMode? = null -) - -@Serializable -data class AdvancedProperties( - val startTime: String? = null, - @Serializable(with = DurationInSecondsSerializer::class) - @SerialName("freezeTimeSeconds") - val freezeTime: Duration? = null, - @Serializable(with = DurationInSecondsSerializer::class) - @SerialName("holdTimeSeconds") - val holdTime: Duration? = null, - val teamMediaTemplate: Map? = null, - val teamOverrides: Map? = null, - val groupOverrides: Map? = null, - val problemOverrides: Map? = null, - val scoreboardOverrides: RankingSettings? = null -) - -fun ContestInfo.toAdvancedProperties(fields: Set) : AdvancedProperties { - fun T.takeIfAsked(name: String) = takeIf { name in fields || "all" in fields } - return AdvancedProperties( - startTime = startTime.humanReadable.takeIfAsked("startTime"), - freezeTime = freezeTime.takeIfAsked("freezeTime"), - holdTime = holdBeforeStartTime?.takeIfAsked("holdBeforeStartTime"), - teamOverrides = teams.associate { - it.contestSystemId to TeamInfoOverride( - name = it.name.takeIfAsked("name"), - shortname = it.shortName.takeIfAsked("shortname"), - groups = it.groups.takeIfAsked("groups"), - hashTag = it.hashTag.takeIfAsked("hashTag"), - medias = it.medias.takeIfAsked("medias"), - isHidden = it.isHidden.takeIfAsked("isHidden"), - isOutOfContest = it.isOutOfContest.takeIfAsked("isOutOfContest") - ) - }, - problemOverrides = problems.associate { - it.letter to ProblemInfoOverride( - name = it.name.takeIfAsked("problemName"), - color = it.color.takeIfAsked("color"), - minScore = it.minScore.takeIfAsked("minScore"), - maxScore = it.maxScore.takeIfAsked("maxScore"), - scoreMergeMode = it.scoreMergeMode.takeIfAsked("scoreMergeMode") - ) - }, - groupOverrides = groups.associate { - it.name to GroupInfoOverride( - isHidden = it.isHidden.takeIfAsked("isHidden"), - isOutOfContest = it.isOutOfContest.takeIfAsked("isOutOfContest") - ) - }, - scoreboardOverrides = RankingSettings( - medals = medals.takeIfAsked("medals"), - penaltyPerWrongAttempt = penaltyPerWrongAttempt.takeIfAsked("penaltyPerWrongAttempt"), - penaltyRoundingMode = penaltyRoundingMode.takeIfAsked("penaltyRoundingMode") - ) - ) -} \ No newline at end of file diff --git a/src/cds/src/main/kotlin/org/icpclive/api/Analytics.kt b/src/cds/src/main/kotlin/org/icpclive/api/Analytics.kt index 0123048f8..c99219617 100644 --- a/src/cds/src/main/kotlin/org/icpclive/api/Analytics.kt +++ b/src/cds/src/main/kotlin/org/icpclive/api/Analytics.kt @@ -8,7 +8,7 @@ import org.icpclive.util.UnixMillisecondsSerializer import kotlin.time.Duration @Serializable -data class AnalyticsCompanionPreset( +public data class AnalyticsCompanionPreset( val presetId: Int, @SerialName("expirationTimeUnixMs") @Serializable(with = UnixMillisecondsSerializer::class) @@ -16,7 +16,7 @@ data class AnalyticsCompanionPreset( ) @Serializable -data class AnalyticsCompanionRun( +public data class AnalyticsCompanionRun( @SerialName("expirationTimeUnixMs") @Serializable(with = UnixMillisecondsSerializer::class) val expirationTime: Instant?, @@ -24,15 +24,15 @@ data class AnalyticsCompanionRun( ) @Serializable -sealed class AnalyticsMessage { - abstract val id: String - abstract val time: Instant - abstract val relativeTime: Duration +public sealed class AnalyticsMessage { + public abstract val id: String + public abstract val time: Instant + public abstract val relativeTime: Duration } @Serializable @SerialName("commentary") -data class AnalyticsCommentaryEvent( +public data class AnalyticsCommentaryEvent( override val id: String, val message: String, @SerialName("timeUnixMs") diff --git a/src/cds/src/main/kotlin/org/icpclive/api/ContestInfo.kt b/src/cds/src/main/kotlin/org/icpclive/api/ContestInfo.kt index af1ef4339..87b45bd7a 100644 --- a/src/cds/src/main/kotlin/org/icpclive/api/ContestInfo.kt +++ b/src/cds/src/main/kotlin/org/icpclive/api/ContestInfo.kt @@ -2,22 +2,19 @@ package org.icpclive.api import kotlinx.datetime.Clock import kotlinx.datetime.Instant -import kotlinx.serialization.SerialName -import kotlinx.serialization.Serializable -import org.icpclive.util.ColorSerializer -import org.icpclive.util.DurationInMillisecondsSerializer -import org.icpclive.util.UnixMillisecondsSerializer -import org.icpclive.util.getLogger +import kotlinx.serialization.* +import org.icpclive.util.* import java.awt.Color import kotlin.time.Duration +import kotlin.time.Duration.Companion.minutes -enum class MedalTiebreakMode { +public enum class MedalTiebreakMode { NONE, ALL } @Serializable -data class MedalType( +public data class MedalType( val name: String, val count: Int, val minScore: Double = Double.MIN_VALUE, @@ -25,22 +22,41 @@ data class MedalType( ) @Serializable -enum class ContestResultType { +public enum class ContestResultType { ICPC, IOI } -enum class ScoreMergeMode { +public enum class ScoreMergeMode { + /** + * For each tests group in the problem, get maximum score over all submissions. + */ MAX_PER_GROUP, + + /** + * Get maximum total score over all submissions + */ MAX_TOTAL, + + /** + * Get score from last submission + */ LAST, + + /** + * Get score from last submissions, ignoring submissions, which didn't pass preliminary testing (e.g. on sample tests) + */ LAST_OK, + + /** + * Get the sum of scores over all submissions + */ SUM } @Serializable -data class ProblemInfo( - val letter: String, - val name: String, +public data class ProblemInfo( + @SerialName("letter") val displayName: String, + @SerialName("name") val fullName: String, val id: Int, val ordinal: Int, val contestSystemId: String, @@ -49,32 +65,43 @@ data class ProblemInfo( @Serializable(ColorSerializer::class) val color: Color? = null, val scoreMergeMode: ScoreMergeMode? = null, ) { - companion object { + internal companion object { val logger = getLogger(ProblemInfo::class) } } @Serializable -enum class ContestStatus { - BEFORE, RUNNING, OVER +public enum class ContestStatus { + BEFORE, RUNNING, OVER, FINALIZED; + + internal companion object { + fun byCurrentTime(startTime: Instant, contestLength: Duration): ContestStatus { + val offset = Clock.System.now() - startTime + return when { + offset < Duration.ZERO -> BEFORE + offset < contestLength -> RUNNING + else -> OVER + } + } + } } @Serializable -sealed class MediaType { - abstract val isMedia: Boolean +public sealed class MediaType { + public abstract val isMedia: Boolean @Serializable @SerialName("Photo") - data class Photo(val url: String, override val isMedia: Boolean = true) : MediaType() + public data class Photo(val url: String, override val isMedia: Boolean = true) : MediaType() @Serializable @SerialName("Object") - data class Object(val url: String, override val isMedia: Boolean = true) : MediaType() + public data class Object(val url: String, override val isMedia: Boolean = true) : MediaType() @Serializable @SerialName("Video") - data class Video(val url: String, override val isMedia: Boolean = true) : MediaType() + public data class Video(val url: String, override val isMedia: Boolean = true) : MediaType() /** * WebRTC proxy connection @@ -82,7 +109,7 @@ sealed class MediaType { */ @Serializable @SerialName("WebRTCProxyConnection") - data class WebRTCProxyConnection(val url: String, val audioUrl: String? = null, override val isMedia: Boolean = true) : MediaType() + public data class WebRTCProxyConnection(val url: String, val audioUrl: String? = null, override val isMedia: Boolean = true) : MediaType() /** * WebRTC grabber connection @@ -90,7 +117,7 @@ sealed class MediaType { */ @Serializable @SerialName("WebRTCGrabberConnection") - data class WebRTCGrabberConnection( + public data class WebRTCGrabberConnection( val url: String, val peerName: String, val streamType: String, @@ -101,25 +128,11 @@ sealed class MediaType { @Serializable @SerialName("TaskStatus") - data class TaskStatus(val teamId: Int) : MediaType() { - override val isMedia = false - } - - fun applyTemplate(teamId: String) = when (this) { - is Photo -> copy(url = url.replace("{teamId}", teamId)) - is Video -> copy(url = url.replace("{teamId}", teamId)) - is Object -> copy(url = url.replace("{teamId}", teamId)) - is WebRTCProxyConnection -> copy(url = url.replace("{teamId}", teamId)) - is WebRTCGrabberConnection -> copy( - url = url.replace("{teamId}", teamId), - peerName = peerName.replace("{teamId}", teamId), - credential = credential?.replace("{teamId}", teamId) - ) - - else -> this + public data class TaskStatus(val teamId: Int) : MediaType() { + override val isMedia: Boolean = false } - fun noMedia(): MediaType = when (this) { + public fun noMedia(): MediaType = when (this) { is Photo -> copy(isMedia = false) is Video -> copy(isMedia = false) is Object -> copy(isMedia = false) @@ -130,7 +143,7 @@ sealed class MediaType { } @Serializable -enum class TeamMediaType { +public enum class TeamMediaType { @SerialName("camera") CAMERA, @@ -151,38 +164,75 @@ enum class TeamMediaType { } @Serializable -data class TeamInfo( +public data class TeamInfo( val id: Int, - val name: String, - val shortName: String, + @SerialName("name") val fullName: String, + @SerialName("shortName") val displayName: String, val contestSystemId: String, val groups: List, val hashTag: String?, val medias: Map, - val additionalInfo: String? = null, - val isHidden: Boolean = false, - val isOutOfContest: Boolean = false, + val isHidden: Boolean, + val isOutOfContest: Boolean, + val organizationId: String?, + val customFields: Map = emptyMap(), ) @Serializable -data class GroupInfo( +public data class GroupInfo( val name: String, - val isHidden: Boolean = false, - val isOutOfContest: Boolean = false + val isHidden: Boolean, + val isOutOfContest: Boolean, +) + +@Serializable +public data class OrganizationInfo( + val cdsId: String, + val displayName: String, + val fullName: String, ) @Serializable -enum class PenaltyRoundingMode { +public enum class PenaltyRoundingMode { @SerialName("each_submission_down_to_minute") + /** + * Round time of all submissions from the beginning of the contest down to whole minute, and then sum them + */ EACH_SUBMISSION_DOWN_TO_MINUTE, + /** + * Sum time of all submissions from the beginning of the contest and then round it down to whole minute + */ @SerialName("sum_down_to_minute") SUM_DOWN_TO_MINUTE, + + /** + * Sum time of all submissions without rounding + */ + @SerialName("sum_in_seconds") + SUM_IN_SECONDS, + + /** + * Get time of last submission as penalty + */ + @SerialName("last") + LAST, + + /** + * Don't have any penalty as a tie-breaker + */ + @SerialName("zero") + ZERO, } +@Target(AnnotationTarget.PROPERTY) +@RequiresOptIn(level = RequiresOptIn.Level.ERROR, message = "This api is not efficient in most cases, consider using corresponding map instead") +public annotation class InefficientContestInfoApi + @Serializable -data class ContestInfo( +@OptIn(InefficientContestInfoApi::class) +public data class ContestInfo( val name: String, val status: ContestStatus, val resultType: ContestResultType, @@ -195,24 +245,30 @@ data class ContestInfo( @SerialName("freezeTimeMs") @Serializable(with = DurationInMillisecondsSerializer::class) val freezeTime: Duration, - val problems: List, - val teams: List, - val groups: List, + @InefficientContestInfoApi @SerialName("problems") val problemList: List, + @InefficientContestInfoApi @SerialName("teams") val teamList: List, + @InefficientContestInfoApi @SerialName("groups") val groupList: List, + @InefficientContestInfoApi @SerialName("organizations") val organizationList: List, + val penaltyRoundingMode: PenaltyRoundingMode, @SerialName("holdBeforeStartTimeMs") @Serializable(with = DurationInMillisecondsSerializer::class) val holdBeforeStartTime: Duration? = null, val emulationSpeed: Double = 1.0, val medals: List = emptyList(), - val penaltyPerWrongAttempt: Int = 20, - val penaltyRoundingMode: PenaltyRoundingMode = PenaltyRoundingMode.EACH_SUBMISSION_DOWN_TO_MINUTE, + val penaltyPerWrongAttempt: Duration = 20.minutes, + @Transient + val cdsSupportsFinalization: Boolean = false, ) { - val currentContestTime + public val currentContestTime: Duration get() = when (status) { ContestStatus.BEFORE -> Duration.ZERO ContestStatus.RUNNING -> (Clock.System.now() - startTime) * emulationSpeed - ContestStatus.OVER -> contestLength + ContestStatus.OVER, ContestStatus.FINALIZED -> contestLength } - fun groupById(id: String) = groups.find { it.name == id } -} - -fun List.toGroupInfos() = flatMap { it.groups }.distinct().map { GroupInfo(it) } \ No newline at end of file + val groups: Map by lazy { groupList.associateBy { it.name } } + val teams: Map by lazy { teamList.associateBy { it.id } } + val cdsTeams: Map by lazy { teamList.associateBy { it.contestSystemId } } + val organizations: Map by lazy { organizationList.associateBy { it.cdsId } } + val problems: Map by lazy { problemList.associateBy { it.id } } + val scoreboardProblems: List by lazy { problemList.sortedBy { it.ordinal } } +} \ No newline at end of file diff --git a/src/cds/src/main/kotlin/org/icpclive/api/RunInfo.kt b/src/cds/src/main/kotlin/org/icpclive/api/RunInfo.kt index ae4fb4c4f..ff2398e58 100644 --- a/src/cds/src/main/kotlin/org/icpclive/api/RunInfo.kt +++ b/src/cds/src/main/kotlin/org/icpclive/api/RunInfo.kt @@ -1,15 +1,13 @@ package org.icpclive.api -import kotlinx.serialization.KSerializer -import kotlinx.serialization.SerialName -import kotlinx.serialization.Serializable +import kotlinx.serialization.* import kotlinx.serialization.encoding.Decoder import kotlinx.serialization.encoding.Encoder import org.icpclive.util.DurationInMillisecondsSerializer import kotlin.time.Duration @Serializable -data class RunInfo( +public data class RunInfo( val id: Int, val result: RunResult?, val percentage: Double, @@ -23,39 +21,37 @@ data class RunInfo( ) @Serializable -sealed class RunResult +public sealed class RunResult @Serializable(with = VerdictSerializer::class) -sealed class Verdict(val shortName: String, val isAddingPenalty: Boolean, val isAccepted: Boolean) { - object Accepted: Verdict("AC", false, true) - object Rejected: Verdict("RJ", true, false) - object Fail: Verdict("FL", false, true) - object CompilationError: Verdict("CE", false, false) - object CompilationErrorWithPenalty: Verdict("CE", true, false) - object PresentationError: Verdict("PE", true, false) - object RuntimeError: Verdict("RE", true, false) - object TimeLimitExceeded: Verdict("TL", true, false) - object MemoryLimitExceeded: Verdict("ML", true, false) - object OutputLimitExceeded: Verdict("OL", true, false) - object IdlenessLimitExceeded: Verdict("IL", true, false) - object SecurityViolation: Verdict("SV", true, false) - object Ignored: Verdict("IG", false, false) - object Challenged: Verdict("CH", true, false) - object WrongAnswer: Verdict("WA", true, false) - - // We have a separate object here to delay initialization until the function call. - // This allows first fully initialize Verdict subclasses, which is required by LookupHolder constructor - companion object { - val all get() = LookupHolder.all - fun lookup(shortName: String, isAddingPenalty: Boolean, isAccepted: Boolean) = +public sealed class Verdict(public val shortName: String, public val isAddingPenalty: Boolean, public val isAccepted: Boolean) { + public data object Accepted: Verdict("AC", false, true) + public data object Rejected: Verdict("RJ", true, false) + public data object Fail: Verdict("FL", false, true) + public data object CompilationError: Verdict("CE", false, false) + public data object CompilationErrorWithPenalty: Verdict("CE", true, false) + public data object PresentationError: Verdict("PE", true, false) + public data object RuntimeError: Verdict("RE", true, false) + public data object TimeLimitExceeded: Verdict("TL", true, false) + public data object MemoryLimitExceeded: Verdict("ML", true, false) + public data object OutputLimitExceeded: Verdict("OL", true, false) + public data object IdlenessLimitExceeded: Verdict("IL", true, false) + public data object SecurityViolation: Verdict("SV", true, false) + public data object Ignored: Verdict("IG", false, false) + public data object Challenged: Verdict("CH", true, false) + public data object WrongAnswer: Verdict("WA", true, false) + + public companion object { + public val all: List get() = LookupHolder.all + public fun lookup(shortName: String, isAddingPenalty: Boolean, isAccepted: Boolean): Verdict = LookupHolder.lookup(shortName, isAddingPenalty, isAccepted) } - fun toRunResult() = ICPCRunResult(this, false) + internal fun toRunResult() = ICPCRunResult(this, false) } -class VerdictSerializer : KSerializer { +internal class VerdictSerializer : KSerializer { @Serializable @SerialName("Verdict") private class VerdictSurrogate(val shortName: String, val isAddingPenalty: Boolean, val isAccepted: Boolean) @@ -72,6 +68,8 @@ class VerdictSerializer : KSerializer { } } +// We have a separate object here to delay initialization until the function call. +// This allows first fully initializing Verdict subclasses, which is required by LookupHolder constructor private object LookupHolder { val all = Verdict::class.sealedSubclasses.map { it.objectInstance!! } @@ -108,14 +106,14 @@ private object LookupHolder { @Serializable @SerialName("ICPC") -data class ICPCRunResult( +public data class ICPCRunResult( val verdict: Verdict, val isFirstToSolveRun: Boolean, ) : RunResult() @Serializable @SerialName("IOI") -data class IOIRunResult( +public data class IOIRunResult( val score: List, val wrongVerdict: Verdict? = null, val difference: Double = 0.0, diff --git a/src/cds/src/main/kotlin/org/icpclive/api/Scoreboard.kt b/src/cds/src/main/kotlin/org/icpclive/api/Scoreboard.kt index 8f8cf2fc3..a791526f2 100644 --- a/src/cds/src/main/kotlin/org/icpclive/api/Scoreboard.kt +++ b/src/cds/src/main/kotlin/org/icpclive/api/Scoreboard.kt @@ -2,11 +2,11 @@ package org.icpclive.api import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable -import org.icpclive.util.DurationInMillisecondsSerializer +import org.icpclive.util.* import kotlin.time.Duration @Serializable -enum class OptimismLevel { +public enum class OptimismLevel { @SerialName("normal") NORMAL, @@ -18,14 +18,15 @@ enum class OptimismLevel { } @Serializable -sealed class ProblemResult +public sealed class ProblemResult @Serializable -data class ScoreboardRow( +public data class ScoreboardRow( val teamId: Int, val rank: Int, val totalScore: Double, - val penalty: Long, + @Serializable(with = DurationInSecondsSerializer::class) + val penalty: Duration, val lastAccepted: Long, val medalType: String?, val problemResults: List, @@ -36,7 +37,7 @@ data class ScoreboardRow( //TODO: custom string, maybe something else @Serializable @SerialName("ICPC") -data class ICPCProblemResult( +public data class ICPCProblemResult( val wrongAttempts: Int, val pendingAttempts: Int, val isSolved: Boolean, @@ -48,7 +49,7 @@ data class ICPCProblemResult( @Serializable @SerialName("IOI") -data class IOIProblemResult( +public data class IOIProblemResult( val score: Double?, @SerialName("lastSubmitTimeMs") @Serializable(with = DurationInMillisecondsSerializer::class) @@ -57,4 +58,8 @@ data class IOIProblemResult( ) : ProblemResult() @Serializable -data class Scoreboard(val rows: List) +public data class Scoreboard( + @Serializable(with = DurationInMillisecondsSerializer::class) + val lastSubmitTime: Duration, + val rows: List +) diff --git a/src/cds/src/main/kotlin/org/icpclive/api/tunning/Advanced.kt b/src/cds/src/main/kotlin/org/icpclive/api/tunning/Advanced.kt new file mode 100644 index 000000000..36f2003f0 --- /dev/null +++ b/src/cds/src/main/kotlin/org/icpclive/api/tunning/Advanced.kt @@ -0,0 +1,241 @@ +package org.icpclive.api.tunning + +import kotlinx.datetime.Instant +import kotlinx.serialization.* +import kotlinx.serialization.json.JsonNames +import org.icpclive.api.* +import org.icpclive.util.* +import java.awt.Color +import kotlin.time.Duration + +/** + * @param fullName Full name of the team. Will be mostly shown on admin pages. + * @param displayName Name of the team shown in most places. + * @param groups The list of the groups team belongs too. + * @param organizationId The id of organization team comes from + * @param hashTag Team hashtag. Can be shown on some team related pages + * @param medias Map of urls to team related medias. E.g., team photo or some kind of video from workstation. + * If media is explicitly set to null, it would be removed if received from a contest system. + * @param customFields Map of custom values. They can be used in substitutions in templates. + * @param isHidden If set to true, the team would be totally hidden. + * @param isOutOfContest If set to true, the team would not receive rank in scoreboard, but it's submission would still be shown. + */ +@OptIn(ExperimentalSerializationApi::class) +@Serializable +public data class TeamInfoOverride( + @JsonNames("name") val fullName: String? = null, + @JsonNames("shortname") val displayName: String? = null, + val groups: List? = null, + val organizationId: String? = null, + val hashTag: String? = null, + val medias: Map? = null, + val customFields: Map? = null, + val isHidden: Boolean? = null, + val isOutOfContest: Boolean? = null, +) + +/** + * @param displayName Name to show in scoreboard and queue. + * @param fullName Problem name. + * @param color Color of a problem balloon. It would be shown in queue and scoreboard in places related to the problem + * @param ordinal Number to sort problems in the scoreboard + * @param minScore In ioi mode minimal possible value of points in this problem + * @param maxScore In ioi mode maximal possible value of points in this problem + * @param scoreMergeMode In ioi mode, select the ruleset to calculate the final score based on the scores for each submission. + */ +@Serializable +public data class ProblemInfoOverride( + val displayName: String? = null, + val fullName: String? = null, + @Serializable(ColorSerializer::class) val color: Color? = null, + val ordinal: Int? = null, + val minScore: Double? = null, + val maxScore: Double? = null, + val scoreMergeMode: ScoreMergeMode? = null +) + +/** + * @param isHidden Totally hide all teams from this group + * @param isOutOfContest Teams from this group will be visible everywhere, but will not have any rank assigned to them in the leaderboard + */ +@Serializable +public data class GroupInfoOverride( + val isHidden: Boolean? = null, + val isOutOfContest: Boolean? = null +) + +/** + * @param medals List of awarded medals. They would be allocated in given order, according to rules specified in [MedalType] + * @param penaltyPerWrongAttempt How many penalty minutes should be added to a team for a wrong attempt + * @param showTeamsWithoutSubmissions If true, teams without submissions would be automatically hidden + * @param penaltyRoundingMode Specify rules of how total penalty is calculated based on many submissions + */ +@Serializable +public data class RankingSettings( + public val medals: List? = null, + @Serializable(with = DurationInMinutesSerializer::class) + public val penaltyPerWrongAttempt: Duration? = null, + public val showTeamsWithoutSubmissions: Boolean? = null, + public val penaltyRoundingMode: PenaltyRoundingMode? = null +) + +@Serializable +public data class OrganizationInfoOverride( + val displayName: String? = null, + val fullName: String? = null +) + +/** + * This class represents possible contest configuration overrides. + * + * Ideally, all this information should be received from the contest system. + * Unfortunately, in the real world, it's not always possible, or information + * can be not fully correct or convenient to display. + * + * This class contains the data to be fixed in what is received from a contest system. + * + * The order in which overrides applied: + * * Time and scoreboard related (they don't interact with others) + * * Filtering out non-submitted teams if requested + * * Regexp overrides (so values provided by them can be used in templated) + * * Creating new groups mentioned in teams or overrides and group overrides + * * Creating new organizations mentioned in teams or overrides and organization overrides + * * (Deprecated) Team media template + * * Team override template + * * Normal team overrides + * + * In all templates in all strings inside `{variableName}` pattern is substituted. + * The following variable names are supported: + * * teamId - team id from the contest system + * * orgFullName - fullName of team organization + * * orgDisplayName - displayName of team organization + * * all values from customFields + * + * @param startTime Override for contest start time. + * The preferred format is `yyyy-mm-dd hh:mm:ss`, but some others would be accepted too. + * startTime override also can affect contest state. + * @param freezeTime Time from the start of the contest before scoreboard freezing. + * @param holdTime Fixed time to show as time before the contest start + * @param teamMediaTemplate Template medias for all teams. + * @param teamOverrideTemplate Template for team overrides + * @param teamRegexes Bunch of regexes to extract information cds doesn't provide from team name. + * @param teamOverrides Overrides for a specific team. Team id from the contest system is key. + * @param groupOverrides Overrides for specific groups. Group name is key. + * @param problemOverrides Overrides for specific problems. Problem id from the contest system is key. + * @param scoreboardOverrides Overrides of scoreboard calculation settings + */ +@Serializable +public data class AdvancedProperties( + @Serializable(with = HumanTimeSerializer::class) + val startTime: Instant? = null, + @Serializable(with = DurationInSecondsSerializer::class) + @SerialName("freezeTimeSeconds") + val freezeTime: Duration? = null, + @Serializable(with = DurationInSecondsSerializer::class) + @SerialName("holdTimeSeconds") + val holdTime: Duration? = null, + @Deprecated(level = DeprecationLevel.WARNING, message = "Use teamOverrideTemplate instead") + val teamMediaTemplate: Map? = null, + val teamOverrideTemplate: TeamOverrideTemplate? = null, + val teamRegexes: TeamRegexOverrides? = null, + val teamOverrides: Map? = null, + val groupOverrides: Map? = null, + val organizationOverrides: Map? = null, + val problemOverrides: Map? = null, + val scoreboardOverrides: RankingSettings? = null +) + +internal typealias Regex = @Serializable(with = RegexSerializer::class) kotlin.text.Regex + +/** + * In some cases, the contest system provides some useful information as part of team name. + * This can be used to extract this information to something more structured. + * + * All regexes are java regex. + * + * Regexes are matched against team full name from cds. + * + * @property organizationRegex The only matched group would be equal to new organization id for the team. + * @property customFields The only group would be set as custom field value for the corresponding key + * @property groupRegex The group is added if the name matches regex. + */ +@Serializable +public data class TeamRegexOverrides( + val organizationRegex: Regex? = null, + val customFields: Map? = null, + val groupRegex: Map? = null, +) + +/** + * Template for the team override. + * + * It has smaller priority than override in the team itself. + * + * Check [AdvancedProperties] doc about patterns inside template. + * + * @property displayName Template string for team display name. Check [TeamInfoOverride.displayName] for details. + * @property fullName Template string for team full name. Check [TeamInfoOverride.fullName] for details. + * @property medias Templates for team medias. Check [TeamInfoOverride.medias] for details. + */ +@Serializable +public data class TeamOverrideTemplate( + val displayName: String? = null, + val fullName: String? = null, + val medias: Map? = null, +) + +/** + * Converts values in [ContestInfo] to overrides in [AdvancedProperties + * + * @param fields set of fields to include in returned value. Other would be set to null + */ +@OptIn(InefficientContestInfoApi::class) +public fun ContestInfo.toAdvancedProperties(fields: Set) : AdvancedProperties { + fun T.takeIfAsked(name: String) = takeIf { name in fields || "all" in fields } + return AdvancedProperties( + startTime = startTime.takeIfAsked("startTime"), + freezeTime = freezeTime.takeIfAsked("freezeTime"), + holdTime = holdBeforeStartTime?.takeIfAsked("holdBeforeStartTime"), + teamOverrides = teamList.associate { + it.contestSystemId to TeamInfoOverride( + fullName = it.fullName.takeIfAsked("fullName"), + displayName = it.displayName.takeIfAsked("displayName"), + groups = it.groups.takeIfAsked("groups"), + organizationId = it.organizationId.takeIfAsked("organizationId"), + hashTag = it.hashTag.takeIfAsked("hashTag"), + medias = it.medias.takeIfAsked("medias"), + customFields = it.customFields.takeIfAsked("customFields"), + isHidden = it.isHidden.takeIfAsked("isHidden"), + isOutOfContest = it.isOutOfContest.takeIfAsked("isOutOfContest") + ) + }, + problemOverrides = problemList.associate { + it.contestSystemId to ProblemInfoOverride( + displayName = it.displayName.takeIfAsked("problemDisplayName"), + fullName = it.fullName.takeIfAsked("problemFullName"), + color = it.color.takeIfAsked("color"), + ordinal = it.ordinal.takeIfAsked("ordinal"), + minScore = it.minScore.takeIfAsked("minScore"), + maxScore = it.maxScore.takeIfAsked("maxScore"), + scoreMergeMode = it.scoreMergeMode.takeIfAsked("scoreMergeMode") + ) + }, + groupOverrides = groupList.associate { + it.name to GroupInfoOverride( + isHidden = it.isHidden.takeIfAsked("isHidden"), + isOutOfContest = it.isOutOfContest.takeIfAsked("isOutOfContest") + ) + }, + organizationOverrides = organizationList.associate { + it.cdsId to OrganizationInfoOverride( + displayName = it.displayName.takeIfAsked("orgDisplayName"), + fullName = it.fullName.takeIfAsked("orgFullName") + ) + }, + scoreboardOverrides = RankingSettings( + medals = medals.takeIfAsked("medals"), + penaltyPerWrongAttempt = penaltyPerWrongAttempt.takeIfAsked("penaltyPerWrongAttempt"), + penaltyRoundingMode = penaltyRoundingMode.takeIfAsked("penaltyRoundingMode") + ) + ) +} diff --git a/src/cds/src/main/kotlin/org/icpclive/cds/ContestDataSource.kt b/src/cds/src/main/kotlin/org/icpclive/cds/ContestDataSource.kt deleted file mode 100644 index e54eb874f..000000000 --- a/src/cds/src/main/kotlin/org/icpclive/cds/ContestDataSource.kt +++ /dev/null @@ -1,91 +0,0 @@ -package org.icpclive.cds - -import org.icpclive.cds.noop.NoopDataSource -import kotlinx.coroutines.* -import kotlinx.coroutines.flow.* -import kotlinx.serialization.Serializable -import org.icpclive.api.AnalyticsMessage -import org.icpclive.api.ContestInfo -import org.icpclive.api.RunInfo -import org.icpclive.cds.adapters.* -import org.icpclive.cds.cats.CATSDataSource -import org.icpclive.cds.clics.ClicsDataSource -import org.icpclive.cds.codeforces.CFDataSource -import org.icpclive.cds.ejudge.EjudgeDataSource -import org.icpclive.cds.krsu.KRSUDataSource -import org.icpclive.cds.pcms.PCMSDataSource -import org.icpclive.cds.testsys.TestSysDataSource -import org.icpclive.cds.yandex.YandexDataSource -import org.icpclive.util.getLogger -import org.icpclive.util.guessDatetimeFormat -import org.icpclive.util.loopFlow -import java.util.* -import kotlin.time.Duration - -sealed interface ContestUpdate -data class InfoUpdate(val newInfo: ContestInfo) : ContestUpdate -data class RunUpdate(val newInfo: RunInfo) : ContestUpdate -data class Analytics(val message: AnalyticsMessage) : ContestUpdate - -@Serializable -data class ContestParseResult( - val contestInfo: ContestInfo, - val runs: List, - val analyticsMessages: List -) - -interface ContestDataSource { - fun getFlow(): Flow -} - -internal interface RawContestDataSource : ContestDataSource { - suspend fun loadOnce(): ContestParseResult -} - -abstract class FullReloadContestDataSource(val interval: Duration) : RawContestDataSource { - override fun getFlow() = flow { - loopFlow( - interval, - { getLogger(ContestDataSource::class).error("Failed to reload data, retrying", it) } - ) { - loadOnce() - }.flowOn(Dispatchers.IO) - .collect { - emit(InfoUpdate(it.contestInfo)) - it.runs.forEach { emit(RunUpdate(it)) } - it.analyticsMessages.forEach { emit(Analytics(it)) } - } - } -} - -internal fun getRawLoader(properties: Properties, creds: Map) = when (val standingsType = properties.getProperty("standings.type")) { - "CLICS" -> ClicsDataSource(properties, creds) - "PCMS" -> PCMSDataSource(properties, creds) - "CF" -> CFDataSource(properties, creds) - "YANDEX" -> YandexDataSource(properties, creds) - "EJUDGE" -> EjudgeDataSource(properties) - "KRSU" -> KRSUDataSource(properties) - "CATS" -> CATSDataSource(properties, creds) - "TESTSYS" -> TestSysDataSource(properties) - "NOOP" -> NoopDataSource() - else -> throw IllegalArgumentException("Unknown standings.type $standingsType") -} - - -fun getContestDataSourceAsFlow( - properties: Properties, - creds: Map = emptyMap(), -) : Flow { - val rawLoader = getRawLoader(properties, creds) - - val emulationSpeed = properties.getProperty("emulation.speed")?.toDouble() - val loader = if (emulationSpeed == null) { - rawLoader - } else { - val emulationStartTime = guessDatetimeFormat(properties.getProperty("emulation.startTime")) - EmulationAdapter(emulationStartTime, emulationSpeed, rawLoader) - } - - - return loader.getFlow() -} \ No newline at end of file diff --git a/src/cds/src/main/kotlin/org/icpclive/cds/ContestUpdate.kt b/src/cds/src/main/kotlin/org/icpclive/cds/ContestUpdate.kt new file mode 100644 index 000000000..d79334751 --- /dev/null +++ b/src/cds/src/main/kotlin/org/icpclive/cds/ContestUpdate.kt @@ -0,0 +1,9 @@ +package org.icpclive.cds + +import org.icpclive.api.* + +public sealed interface ContestUpdate +public data class InfoUpdate(val newInfo: ContestInfo) : ContestUpdate +public data class RunUpdate(val newInfo: RunInfo) : ContestUpdate +public data class AnalyticsUpdate(val message: AnalyticsMessage) : ContestUpdate + diff --git a/src/cds/src/main/kotlin/org/icpclive/cds/adapters/AdvancedPropertiesAdapter.kt b/src/cds/src/main/kotlin/org/icpclive/cds/adapters/AdvancedPropertiesAdapter.kt index e0fb39941..47f83fef5 100644 --- a/src/cds/src/main/kotlin/org/icpclive/cds/adapters/AdvancedPropertiesAdapter.kt +++ b/src/cds/src/main/kotlin/org/icpclive/cds/adapters/AdvancedPropertiesAdapter.kt @@ -6,70 +6,85 @@ import kotlinx.coroutines.flow.* import kotlinx.datetime.Clock import kotlinx.datetime.Instant import org.icpclive.api.* -import org.icpclive.cds.ContestUpdate -import org.icpclive.cds.InfoUpdate -import org.icpclive.cds.RunUpdate -import org.icpclive.util.* -import kotlin.time.Duration +import org.icpclive.api.tunning.* +import org.icpclive.cds.* +import org.icpclive.util.getLogger +import org.icpclive.util.humanReadable private sealed interface AdvancedAdapterEvent -private class Update(val update: ContestUpdate) : AdvancedAdapterEvent -private class Advanced(val update: AdvancedProperties) : AdvancedAdapterEvent -private object TimeTrigger : AdvancedAdapterEvent +private data class Update(val update: ContestUpdate) : AdvancedAdapterEvent +private data object Trigger : AdvancedAdapterEvent -object AdvancedPropertiesAdapter +internal object AdvancedPropertiesAdapter -fun Flow.applyAdvancedProperties(advancedPropsFlow: Flow) = flow { - val triggerFlow = Channel() - var contestInfo: ContestInfo? = null - var advancedProperties: AdvancedProperties? = null +private val templateRegex = kotlin.text.Regex("\\{([a-z0-9A-Z_-]*)}") + +private fun String.applyTemplate(valueProvider: (String) -> String?) = + replace(templateRegex) { valueProvider(it.groups[1]!!.value) ?: it.value } + +private fun MediaType.applyTemplate(valueProvider: (String) -> String?) = when (this) { + is MediaType.Photo -> copy(url = url.applyTemplate(valueProvider)) + is MediaType.Video -> copy(url = url.applyTemplate(valueProvider)) + is MediaType.Object -> copy(url = url.applyTemplate(valueProvider)) + is MediaType.WebRTCProxyConnection -> copy(url = url.applyTemplate(valueProvider)) + is MediaType.WebRTCGrabberConnection -> copy( + url = url.applyTemplate(valueProvider), + peerName = peerName.applyTemplate(valueProvider), + credential = credential?.applyTemplate(valueProvider) + ) + + else -> this +} + + +public fun Flow.applyAdvancedProperties(advancedPropsFlow: Flow): Flow = flow { + val triggerFlow = Channel() val submittedTeams = mutableSetOf() val triggers = mutableSetOf() coroutineScope { + val advancedPropsStateFlow = advancedPropsFlow.stateIn(this) + var contestInfo: ContestInfo? = null suspend fun triggerAt(time: Instant) { if (time < Clock.System.now()) return if (triggers.add(time)) { launch { delay(time - Clock.System.now()) - triggerFlow.send(TimeTrigger) + triggerFlow.send(Trigger) } } } suspend fun apply() { val ci = contestInfo ?: return - val ap = advancedProperties ?: return - emit(InfoUpdate(applyOverrides(ci, ap, submittedTeams))) - val startOverride = ap.startTime?.let { catchToNull { guessDatetimeFormat(it) } } ?: return + val ap = advancedPropsStateFlow.value + emit(InfoUpdate(applyAdvancedProperties(ci, ap, submittedTeams))) + val startOverride = ap.startTime ?: return triggerAt(startOverride) triggerAt(startOverride + ci.contestLength) } merge( this@applyAdvancedProperties.map { Update(it) }, - triggerFlow.receiveAsFlow(), - advancedPropsFlow.map { Advanced(it) }, + triggerFlow.receiveAsFlow().conflate(), + advancedPropsStateFlow.map { Trigger }, ).collect { when (it) { - is TimeTrigger -> { - apply() - } - is Advanced -> { - advancedProperties = it.update + is Trigger -> { apply() } is Update -> { when (it.update) { is InfoUpdate -> { - contestInfo = it.update.newInfo - apply() + if (contestInfo != it.update.newInfo) { + contestInfo = it.update.newInfo + apply() + } } is RunUpdate -> { - emit(it.update) - if (submittedTeams.add(it.update.newInfo.teamId)) { + if (submittedTeams.add(it.update.newInfo.teamId) && advancedPropsStateFlow.value.scoreboardOverrides?.showTeamsWithoutSubmissions == false) { apply() } + emit(it.update) } - else -> { emit(it.update) } @@ -80,134 +95,248 @@ fun Flow.applyAdvancedProperties(advancedPropsFlow: Flow ContestStatus.BEFORE - offset < contestLength -> ContestStatus.RUNNING - else -> ContestStatus.OVER - } -} - -private fun mergeOverride( +private fun mergeOverrides( infos: List, overrides: Map?, id: T.() -> String, - getTemplate: ((String) -> O?) = { null }, + unusedMessage: (Set) -> String? = { null }, merge: (T, O) -> T -): Pair, List> { +): List { return if (overrides == null) { - infos to emptyList() + infos } else { val idsSet = infos.map { it.id() }.toSet() fun mergeIfNotNull(a: T, b: O?) = if (b == null) a else merge(a, b) + (overrides.keys - idsSet) + .takeIf { it.isNotEmpty() } + ?.let(unusedMessage) + ?.let { logger.warn(it) } infos.map { - mergeIfNotNull( - mergeIfNotNull(it, getTemplate(it.id())), - overrides[it.id()] - ) - } to overrides.keys.filter { it !in idsSet } + mergeIfNotNull(it, overrides[it.id()]) + } + } +} + +private fun mergeMaps(original: Map, override: Map) = buildMap { + putAll(original) + for ((k, v) in override.entries) { + if (v == null) { + remove(k) + } else { + put(k, v) + } } } +private fun Map.instantiateTemplate(teams: List, valueProvider: TeamInfo.(String) -> String?) = teams.associate { + it.contestSystemId to TeamInfoOverride( + medias = mapValues { (_,v) -> v?.applyTemplate { name -> it.valueProvider(name) } } + ) +} + +private fun TeamOverrideTemplate.instantiateTemplate(teams: List, valueProvider: TeamInfo.(String) -> String?) = teams.associate { + it.contestSystemId to TeamInfoOverride( + fullName = fullName?.applyTemplate { name -> it.valueProvider(name) }, + displayName = displayName?.applyTemplate { name -> it.valueProvider(name) }, + medias = medias?.mapValues { (_,v) -> v?.applyTemplate { name -> it.valueProvider(name) } } + ) +} -private fun applyOverrides( +private fun List.filterNotSubmitted(show: Boolean?, submittedTeams: Set) = if (show != false) { + this +} else { + filter { it.id in submittedTeams }.also { + logger.info("Filtered out ${size - it.size} of $size teams as they don't have submissions") + } +} + +private fun String.matchSingleGroupRegex(regex: Regex?, name: String) : String? { + if (regex == null) return null + val match = regex.matchAt(this, 0) + return if (match != null) { + if (match.groups.size != 2) { + logger.warn("${name.replaceFirstChar { it.uppercase() }} should match single group for ${this}, but ${match.groups.size} matched") + null + } else { + this.substring(match.groups[1]!!.range) + } + } else { + logger.warn("$this didn't match $name") + null + } +} + +private fun applyRegex(teams: List, regexOverrides: TeamRegexOverrides?) : List { + if (regexOverrides == null) return teams + return teams.map { team -> + val newOrg = team.fullName.matchSingleGroupRegex(regexOverrides.organizationRegex, "organization regex") + val newGroups = regexOverrides.groupRegex?.entries?.filter { (_, regex) -> + regex.matches(team.fullName) + }?.map { it.key }.orEmpty() + val newCustomFields = regexOverrides.customFields?.mapValues { (name, regex) -> + team.fullName.matchSingleGroupRegex(regex, "$name regex") + }?.filterValues { it != null }?.mapValues { it.value!! }.orEmpty() + + team.copy( + organizationId = newOrg ?: team.organizationId, + groups = team.groups + newGroups, + customFields = newCustomFields + team.customFields + ) + } +} + +@OptIn(InefficientContestInfoApi::class) +internal fun applyAdvancedProperties( info: ContestInfo, overrides: AdvancedProperties, submittedTeams: Set ): ContestInfo { - val (teamInfos, unusedTeamOverrides) = mergeOverride( - info.teams, - overrides.teamOverrides, - TeamInfo::contestSystemId, - { id -> - TeamInfoOverride( - medias = overrides.teamMediaTemplate?.mapValues { - it.value?.applyTemplate(id) - } - ) + val teamInfosPrelim = applyRegex( + info.teamList.filterNotSubmitted(overrides.scoreboardOverrides?.showTeamsWithoutSubmissions, submittedTeams), + overrides.teamRegexes + ) + val newGroups = buildSet { + for (team in teamInfosPrelim) { + addAll(team.groups) + } + overrides.teamOverrides?.values?.forEach { override -> + override.groups?.let { addAll(it) } + } + for (group in info.groupList) { + remove(group.name) } - ) { team, override -> - TeamInfo( - id = team.id, - name = override.name ?: team.name, - shortName = override.shortname ?: team.shortName, - contestSystemId = team.contestSystemId, - groups = override.groups ?: team.groups, - hashTag = override.hashTag ?: team.hashTag, - medias = if (override.medias != null) - (team.medias + override.medias).filterValues { it != null }.mapValues { it.value!! } - else - team.medias, - additionalInfo = override.additionalInfo, - isHidden = override.isHidden ?: team.isHidden, - isOutOfContest = override.isOutOfContest ?: team.isOutOfContest - ) } - val (problemInfos, unusedProblemOverrides) = mergeOverride( - info.problems, - overrides.problemOverrides, - ProblemInfo::letter - ) { problem, override -> - ProblemInfo( - problem.letter, - override.name ?: problem.name, - problem.id, - problem.ordinal, - problem.contestSystemId, - override.minScore ?: problem.minScore, - override.maxScore ?: problem.maxScore, - override.color ?: problem.color, - override.scoreMergeMode ?: problem.scoreMergeMode - ) + val groups = mergeGroups( + info.groupList + newGroups.map { GroupInfo(it, isHidden = false, isOutOfContest = false) }, + overrides.groupOverrides + ) + val newOrganizations = buildSet { + for (team in teamInfosPrelim) { + team.organizationId?.let { add(it) } + } + overrides.teamOverrides?.values?.forEach { override -> + override.organizationId?.let { add(it) } + } + for (group in info.organizationList) { + remove(group.cdsId) + } } + val organizations = mergeOrganizations( + info.organizationList + newOrganizations.map { OrganizationInfo(it, it, it) }, + overrides.organizationOverrides + ) + + val orgsById = organizations.associateBy { it.cdsId } + + fun TeamInfo.templateValueGetter(name: String) : String? { + return when (name) { + "teamId" -> contestSystemId + "orgFullName" -> organizationId?.let { orgsById[it]?.fullName } + "orgDisplayName" -> organizationId?.let { orgsById[it]?.displayName } + else -> customFields[name] + } + } + + + @Suppress("DEPRECATION") val teamInfos = teamInfosPrelim + .mergeTeams(overrides.teamMediaTemplate?.instantiateTemplate(teamInfosPrelim, TeamInfo::templateValueGetter)) + .mergeTeams(overrides.teamOverrideTemplate?.instantiateTemplate(teamInfosPrelim, TeamInfo::templateValueGetter)) + .mergeTeams(overrides.teamOverrides) + val problemInfos = mergeProblems(info.problemList, overrides.problemOverrides) + val (startTime, status) = overrides.startTime - ?.let { catchToNull { guessDatetimeFormat(it) } } ?.also { logger.info("Contest start time overridden to ${it.humanReadable}") } - ?.let { it to getStateBasedOnStartTime(it, info.contestLength) } + ?.let { it to ContestStatus.byCurrentTime(it, info.contestLength) } ?: (info.startTime to info.status) - val freezeTime = overrides.freezeTime ?: info.freezeTime - val holdTimeSeconds = overrides.holdTime ?: info.holdBeforeStartTime - val medals = overrides.scoreboardOverrides?.medals ?: info.medals - val penaltyPerWrongAttempt = - overrides.scoreboardOverrides?.penaltyPerWrongAttempt ?: info.penaltyPerWrongAttempt - val penaltyRoundingMode = overrides.scoreboardOverrides?.penaltyRoundingMode ?: info.penaltyRoundingMode - if (unusedTeamOverrides.isNotEmpty()) logger.warn("No team for override: $unusedTeamOverrides") - if (unusedProblemOverrides.isNotEmpty()) logger.warn("No problem for override: $unusedProblemOverrides") - - val teamInfosFiltered = if (overrides.scoreboardOverrides?.showTeamsWithoutSubmissions != false) { - teamInfos - } else { - teamInfos.filter { it.id in submittedTeams }.also { - logger.info("Filtered out ${teamInfos.size - it.size} of ${teamInfos.size} teams as they don't have submissions") - } - } - val newGroups = teamInfosFiltered.flatMap { it.groups }.toSet() - info.groups.map { it.name }.toSet() - val (groups, unusedGroupsOverrides) = mergeOverride( - info.groups + newGroups.map { GroupInfo(it, false, false) }, - overrides.groupOverrides, - GroupInfo::name - ) { group, override -> - GroupInfo( - name = group.name, - isHidden = override.isHidden ?: group.isHidden, - isOutOfContest = override.isOutOfContest ?: group.isOutOfContest - ) - } - if (unusedGroupsOverrides.isNotEmpty()) logger.warn("No group for override: $unusedGroupsOverrides") logger.info("Team and problem overrides are reloaded") return info.copy( startTime = startTime, - freezeTime = freezeTime, + freezeTime = overrides.freezeTime ?: info.freezeTime, status = status, - holdBeforeStartTime = holdTimeSeconds, - teams = teamInfosFiltered, - groups = groups, - problems = problemInfos.sortedBy { it.ordinal }, - medals = medals, - penaltyPerWrongAttempt = penaltyPerWrongAttempt, - penaltyRoundingMode = penaltyRoundingMode, + holdBeforeStartTime = overrides.holdTime ?: info.holdBeforeStartTime, + teamList = teamInfos, + groupList = groups, + organizationList = organizations, + problemList = problemInfos, + medals = overrides.scoreboardOverrides?.medals ?: info.medals, + penaltyPerWrongAttempt = overrides.scoreboardOverrides?.penaltyPerWrongAttempt ?: info.penaltyPerWrongAttempt, + penaltyRoundingMode = overrides.scoreboardOverrides?.penaltyRoundingMode ?: info.penaltyRoundingMode, + ) +} + +private fun mergeOrganizations( + organizationInfos: List, + overrides1: Map? +) = mergeOverrides( + organizationInfos, + overrides1, + OrganizationInfo::cdsId, + unusedMessage = { "No organization for override: $it" } +) { org, override -> + OrganizationInfo( + cdsId = org.cdsId, + displayName = override.displayName ?: org.displayName, + fullName = override.fullName ?: org.fullName, + ) +} + +private fun mergeGroups( + groups: List, + overrides: Map? +) = mergeOverrides( + groups, + overrides, + GroupInfo::name, + unusedMessage = { "No group for override: $it" } +) { group, override -> + GroupInfo( + name = group.name, + isHidden = override.isHidden ?: group.isHidden, + isOutOfContest = override.isOutOfContest ?: group.isOutOfContest + ) +} + +private fun mergeProblems( + problems: List, + overrides: Map? +) = mergeOverrides( + problems, + overrides, + ProblemInfo::contestSystemId, + unusedMessage = { "No problem for override: $it" } +) { problem, override -> + ProblemInfo( + displayName = override.displayName ?: problem.displayName, + fullName = override.fullName ?: problem.fullName, + id = problem.id, + ordinal = override.ordinal ?: problem.ordinal, + contestSystemId = problem.contestSystemId, + minScore = override.minScore ?: problem.minScore, + maxScore = override.maxScore ?: problem.maxScore, + color = override.color ?: problem.color, + scoreMergeMode = override.scoreMergeMode ?: problem.scoreMergeMode + ) +} + +private fun List.mergeTeams(overrides: Map?) = mergeOverrides( + this, + overrides, + TeamInfo::contestSystemId, + unusedMessage = { "No team for override: $it" }, +) { team, override -> + TeamInfo( + id = team.id, + fullName = override.fullName ?: team.fullName, + displayName = override.displayName ?: team.displayName, + contestSystemId = team.contestSystemId, + groups = override.groups ?: team.groups, + hashTag = override.hashTag ?: team.hashTag, + medias = mergeMaps(team.medias, override.medias ?: emptyMap()), + customFields = mergeMaps(team.customFields, override.customFields ?: emptyMap()), + isHidden = override.isHidden ?: team.isHidden, + isOutOfContest = override.isOutOfContest ?: team.isOutOfContest, + organizationId = override.organizationId ?: team.organizationId ) } diff --git a/src/cds/src/main/kotlin/org/icpclive/cds/adapters/AutoFinalize.kt b/src/cds/src/main/kotlin/org/icpclive/cds/adapters/AutoFinalize.kt new file mode 100644 index 000000000..c2b1027eb --- /dev/null +++ b/src/cds/src/main/kotlin/org/icpclive/cds/adapters/AutoFinalize.kt @@ -0,0 +1,26 @@ +package org.icpclive.cds.adapters + +import kotlinx.coroutines.flow.* +import org.icpclive.api.ContestStatus +import org.icpclive.cds.ContestUpdate +import org.icpclive.cds.InfoUpdate +import org.icpclive.util.getLogger + +internal object AutoFinalize + +public fun Flow.autoFinalize(): Flow = withGroupedRuns({ it.result != null }) + .transformWhile { + emit(it.event) + val info = it.infoAfterEvent + if (info?.status == ContestStatus.OVER && !info.cdsSupportsFinalization && it.runs[false].isNullOrEmpty()) { + emit(InfoUpdate(it.infoAfterEvent!!.copy(status = ContestStatus.FINALIZED))) + getLogger(AutoFinalize::class).info("Contest finished. Finalizing.") + false + } else { + true + } + } + +public suspend fun Flow.finalContestState(): ContestState = autoFinalize() + .contestState() + .first { it.infoAfterEvent?.status == ContestStatus.FINALIZED } \ No newline at end of file diff --git a/src/cds/src/main/kotlin/org/icpclive/cds/adapters/DifferenceAdapter.kt b/src/cds/src/main/kotlin/org/icpclive/cds/adapters/DifferenceAdapter.kt index d193d6e61..10e8c4c8b 100644 --- a/src/cds/src/main/kotlin/org/icpclive/cds/adapters/DifferenceAdapter.kt +++ b/src/cds/src/main/kotlin/org/icpclive/cds/adapters/DifferenceAdapter.kt @@ -1,6 +1,7 @@ package org.icpclive.cds.adapters -import kotlinx.coroutines.flow.* +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.map import org.icpclive.api.* import org.icpclive.cds.ContestUpdate @@ -48,14 +49,14 @@ private class SumScoreAccumulator : ScoreAccumulator { override fun add(score: IOIRunResult) { total += score.score.sum() } } -fun Flow.calculateScoreDifferences() = withGroupedRuns( +public fun Flow.calculateScoreDifferences(): Flow = withGroupedRuns( selector = { it.problemId to it.teamId }, needUpdateGroup = { new, old, key -> - new.problems.getOrNull(key.first)?.scoreMergeMode != old?.problems?.getOrNull(key.first)?.scoreMergeMode + new.problems[key.first]?.scoreMergeMode != old?.problems?.get(key.first)?.scoreMergeMode }, transformGroup = transform@{ key, runs, _, contestInfo -> if (contestInfo?.resultType != ContestResultType.IOI) return@transform runs - val accumulator = when (contestInfo.problems.getOrNull(key.first)?.scoreMergeMode ?: ScoreMergeMode.LAST) { + val accumulator = when (contestInfo.problems[key.first]?.scoreMergeMode ?: ScoreMergeMode.LAST) { ScoreMergeMode.MAX_PER_GROUP -> MaxByGroupScoreAccumulator() ScoreMergeMode.MAX_TOTAL -> MaxTotalScoreAccumulator() ScoreMergeMode.LAST -> LastScoreAccumulator() diff --git a/src/cds/src/main/kotlin/org/icpclive/cds/adapters/EmulationAdapter.kt b/src/cds/src/main/kotlin/org/icpclive/cds/adapters/EmulationAdapter.kt index 819621b31..b83ad7bb9 100644 --- a/src/cds/src/main/kotlin/org/icpclive/cds/adapters/EmulationAdapter.kt +++ b/src/cds/src/main/kotlin/org/icpclive/cds/adapters/EmulationAdapter.kt @@ -1,74 +1,59 @@ package org.icpclive.cds.adapters -import kotlinx.coroutines.delay -import kotlinx.coroutines.flow.flow -import kotlinx.datetime.Clock +import kotlinx.coroutines.* +import kotlinx.coroutines.flow.* import kotlinx.datetime.Instant import org.icpclive.api.ContestStatus import org.icpclive.cds.* -import org.icpclive.util.getLogger -import org.icpclive.util.humanReadable +import org.icpclive.util.* import kotlin.random.Random import kotlin.time.Duration import kotlin.time.Duration.Companion.milliseconds import kotlin.time.Duration.Companion.seconds -internal class EmulationAdapter( - private val startTime: Instant, - private val emulationSpeed: Double, - private val source: RawContestDataSource, -) : ContestDataSource { - private class Event(val time: Duration, val process: suspend () -> Unit) +internal class EmulationAdapter +private val logger = getLogger(EmulationAdapter::class) - override fun getFlow() = flow { - val (finalContestInfo, runs, analyticsMessages) = source.loadOnce() - require(finalContestInfo.status == ContestStatus.OVER) { "Emulation require contest to be finished" } - logger.info("Running in emulation mode with speed x${emulationSpeed} and startTime = ${startTime.humanReadable}") - val contestInfo = finalContestInfo.copy( - startTime = startTime, - emulationSpeed = emulationSpeed - ) - - emit(InfoUpdate(contestInfo.copy(status = ContestStatus.BEFORE))) - var lastLoggedTime = 0.seconds - val events = buildList { - add(Event(Duration.ZERO) { - emit(InfoUpdate(contestInfo.copy(status = ContestStatus.RUNNING))) - }) - add(Event(contestInfo.contestLength) { - emit(InfoUpdate(contestInfo.copy(status = ContestStatus.OVER))) - }) - for (run in runs) { - var percentage = Random.nextDouble(0.1) - var timeShift = 0 - if (run.result != null) { - do { - val submittedRun = run.copy( - percentage = percentage, - result = null - ) - add(Event(run.time + timeShift.milliseconds) { emit(RunUpdate(submittedRun)) }) - percentage += Random.nextDouble(1.0) - timeShift += Random.nextInt(20000) - } while (percentage < 1.0) - } - add(Event(run.time + timeShift.milliseconds) { emit(RunUpdate(run)) }) - } - addAll(analyticsMessages.map { Event(it.relativeTime) { emit(Analytics(it)) } }) - }.sortedBy { it.time } - for (event in events) { - val nextEventTime = (startTime + event.time / emulationSpeed) - logger.debug("Next event time = ${nextEventTime}, will sleep for ${nextEventTime - Clock.System.now()}") - delay(nextEventTime - Clock.System.now()) - event.process() - if (event.time - lastLoggedTime > 10.seconds) { - logger.info("Processed events upto ${event.time}") - lastLoggedTime = event.time - } +internal fun Flow.toEmulationFlow(startTime: Instant, emulationSpeed: Double) = flow { + val scope = CoroutineScope(currentCoroutineContext()) + val logJob = scope.launch { + while (true) { + delay(1.seconds) + logger.info("Waiting for contest to become Finalized to start emulation...") } } + val state = finalContestState() + logJob.cancel() + val finalContestInfo = state.infoAfterEvent!! + val runs = state.runs.values.toList() + val analyticsMessages = state.analyticsMessages.values.toList() + logger.info("Running in emulation mode with speed x${emulationSpeed} and startTime = ${startTime.humanReadable}") + val contestInfo = finalContestInfo.copy( + startTime = startTime, + emulationSpeed = emulationSpeed + ) - companion object { - internal val logger = getLogger(EmulationAdapter::class) - } -} \ No newline at end of file + emit(-Duration.INFINITE to InfoUpdate(contestInfo.copy(status = ContestStatus.BEFORE))) + buildList { + add(Duration.ZERO to InfoUpdate(contestInfo.copy(status = ContestStatus.RUNNING))) + add(contestInfo.contestLength to InfoUpdate(contestInfo.copy(status = ContestStatus.OVER))) + for (run in runs) { + var percentage = Random.nextDouble(0.1) + var timeShift = 0 + if (run.result != null) { + do { + val submittedRun = run.copy( + percentage = percentage, + result = null + ) + add((run.time + timeShift.milliseconds) to RunUpdate(submittedRun)) + percentage += Random.nextDouble(1.0) + timeShift += Random.nextInt(20000) + } while (percentage < 1.0) + } + add((run.time + timeShift.milliseconds) to RunUpdate(run)) + } + addAll(analyticsMessages.map { it.relativeTime to AnalyticsUpdate(it) }) + }.sortedBy { it.first }.forEach { emit(it) } +}.map { (startTime + it.first / emulationSpeed) to it.second } + .toTimedFlow { logger.info("Processed events upto ${(it - startTime) * emulationSpeed}") } diff --git a/src/cds/src/main/kotlin/org/icpclive/cds/adapters/FirstToSolveAdapter.kt b/src/cds/src/main/kotlin/org/icpclive/cds/adapters/FirstToSolveAdapter.kt index e1c5ecdd3..113716ca6 100644 --- a/src/cds/src/main/kotlin/org/icpclive/cds/adapters/FirstToSolveAdapter.kt +++ b/src/cds/src/main/kotlin/org/icpclive/cds/adapters/FirstToSolveAdapter.kt @@ -1,14 +1,14 @@ package org.icpclive.cds.adapters -import kotlinx.coroutines.flow.* +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.map import org.icpclive.api.* -import org.icpclive.cds.* -import kotlin.time.Duration.Companion.minutes +import org.icpclive.cds.ContestUpdate private fun RunInfo.setICPC(value: Boolean) = copy(result = (result as? ICPCRunResult)?.copy(isFirstToSolveRun = value)) private fun RunInfo.setIOI(value: Boolean) = copy(result = (result as? IOIRunResult)?.copy(isFirstBestRun = value)) -fun Flow.addFirstToSolves() = withGroupedRuns( +public fun Flow.addFirstToSolves(): Flow = withGroupedRuns( selector = { when (it.result) { diff --git a/src/cds/src/main/kotlin/org/icpclive/cds/adapters/HiddenTeamsAdapter.kt b/src/cds/src/main/kotlin/org/icpclive/cds/adapters/HiddenTeamsAdapter.kt index c2fcc0d00..246c4180a 100644 --- a/src/cds/src/main/kotlin/org/icpclive/cds/adapters/HiddenTeamsAdapter.kt +++ b/src/cds/src/main/kotlin/org/icpclive/cds/adapters/HiddenTeamsAdapter.kt @@ -2,8 +2,7 @@ package org.icpclive.cds.adapters import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.map -import org.icpclive.api.ContestInfo -import org.icpclive.api.TeamInfo +import org.icpclive.api.* import org.icpclive.cds.ContestUpdate import org.icpclive.cds.InfoUpdate @@ -16,15 +15,16 @@ private fun TeamInfo.updateHidden(isHidden: Boolean, isOutOfContest: Boolean) = this } -fun Flow.processHiddenTeamsAndGroups() = + +public fun Flow.processHiddenTeamsAndGroups(): Flow = map { if (it is InfoUpdate) { InfoUpdate( it.newInfo.copy( - teams = it.newInfo.teams.map { team -> + teamList = @OptIn(InefficientContestInfoApi::class) it.newInfo.teamList.map { team -> team.updateHidden( - isHidden = team.isHidden || team.groups.any { group -> it.newInfo.groupById(group)?.isHidden == true }, - isOutOfContest = team.isOutOfContest || team.groups.any { group -> it.newInfo.groupById(group)?.isOutOfContest == true }, + isHidden = team.isHidden || team.groups.any { group -> it.newInfo.groups[group]?.isHidden == true }, + isOutOfContest = team.isOutOfContest || team.groups.any { group -> it.newInfo.groups[group]?.isOutOfContest == true }, ) } ) @@ -35,13 +35,13 @@ fun Flow.processHiddenTeamsAndGroups() = }.withGroupedRuns( { it.teamId }, { key, _, original, info -> - val team = info?.teams?.firstOrNull { it.id == key } + val team = info?.teams?.get(key) if (team?.isHidden == true) original.map { it.copy(isHidden = true) } else original }, { new: ContestInfo, old: ContestInfo?, key: Int -> - new.teams.firstOrNull { it.id == key }?.isHidden != old?.teams?.firstOrNull { it.id == key }?.isHidden + new.teams[key]?.isHidden != old?.teams?.get(key)?.isHidden } ).map { it.event } \ No newline at end of file diff --git a/src/cds/src/main/kotlin/org/icpclive/cds/adapters/RemoveFrozenSubmissionsAdapter.kt b/src/cds/src/main/kotlin/org/icpclive/cds/adapters/RemoveFrozenSubmissionsAdapter.kt index fd91b84be..509f6f0ef 100644 --- a/src/cds/src/main/kotlin/org/icpclive/cds/adapters/RemoveFrozenSubmissionsAdapter.kt +++ b/src/cds/src/main/kotlin/org/icpclive/cds/adapters/RemoveFrozenSubmissionsAdapter.kt @@ -1,14 +1,12 @@ package org.icpclive.cds.adapters -import kotlinx.coroutines.flow.* -import org.icpclive.cds.Analytics -import org.icpclive.cds.ContestUpdate -import org.icpclive.cds.InfoUpdate -import org.icpclive.cds.RunUpdate +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.transform +import org.icpclive.cds.* import kotlin.time.Duration -fun Flow.removeFrozenSubmissions() = transform { +public fun Flow.removeFrozenSubmissions(): Flow = transform { when (it.event) { is RunUpdate -> { if (it.infoBeforeEvent != null && it.event.newInfo.time >= it.infoBeforeEvent.freezeTime) { @@ -33,9 +31,6 @@ fun Flow.removeFrozenSubmissions() = transform { } } } - is Analytics -> emit(it.event) + is AnalyticsUpdate -> emit(it.event) } -} - -@JvmName("RemoveFrozenSubmissions2") -fun Flow.removeFrozenSubmissions() = withRunsBefore().removeFrozenSubmissions() \ No newline at end of file +} \ No newline at end of file diff --git a/src/cds/src/main/kotlin/org/icpclive/cds/adapters/Utils.kt b/src/cds/src/main/kotlin/org/icpclive/cds/adapters/Utils.kt index df7ee3acd..bbe277cee 100644 --- a/src/cds/src/main/kotlin/org/icpclive/cds/adapters/Utils.kt +++ b/src/cds/src/main/kotlin/org/icpclive/cds/adapters/Utils.kt @@ -1,78 +1,69 @@ package org.icpclive.cds.adapters -import kotlinx.collections.immutable.PersistentList -import kotlinx.collections.immutable.PersistentMap -import kotlinx.collections.immutable.persistentListOf -import kotlinx.collections.immutable.persistentMapOf +import kotlinx.collections.immutable.* import kotlinx.coroutines.flow.* -import org.icpclive.api.ContestInfo -import org.icpclive.api.RunInfo -import org.icpclive.cds.Analytics -import org.icpclive.cds.ContestUpdate -import org.icpclive.cds.InfoUpdate -import org.icpclive.cds.RunUpdate - -class ContestEventWithRunsBefore( - val event: ContestUpdate, - val infoBeforeEvent: ContestInfo?, - val runs: PersistentMap +import org.icpclive.api.* +import org.icpclive.cds.* + +public class ContestState( + public val event: ContestUpdate, + public val infoBeforeEvent: ContestInfo?, + public val runs: PersistentMap, + public val analyticsMessages: PersistentMap ) { - val infoAfterEvent: ContestInfo? + public val infoAfterEvent: ContestInfo? get() = if (event is InfoUpdate) event.newInfo else infoBeforeEvent } -class ContestEventWithGroupedRuns( - val event: ContestUpdate, - val infoBeforeEvent: ContestInfo?, - val runs: PersistentMap> +public open class ContestStateWithGroupedRuns( + public val event: ContestUpdate, + public val infoBeforeEvent: ContestInfo?, + public val runs: PersistentMap>, + public val analyticsMessages: PersistentMap ) { - val infoAfterEvent: ContestInfo? + public val infoAfterEvent: ContestInfo? get() = if (event is InfoUpdate) event.newInfo else infoBeforeEvent } -open class ContestStateWithGroupedRuns( - val info: ContestInfo?, - val runs: PersistentMap> -) - -class ContestStateWithRunsByTeam(val info: ContestInfo?, val runs: PersistentMap>) +public class ContestStateWithRunsByTeam( + event: ContestUpdate, + infoBeforeEvent: ContestInfo?, + runs: PersistentMap>, + analyticsMessages: PersistentMap +) : ContestStateWithGroupedRuns(event, infoBeforeEvent, runs, analyticsMessages) -fun Flow.withContestInfo() = flow { +public fun Flow.withContestInfoBefore(): Flow> = flow { var lastInfo : ContestInfo? = null collect { + emit(it to lastInfo) if (it is InfoUpdate) { lastInfo = it.newInfo } - emit(it to lastInfo) } } -fun Flow.withRunsBefore() = flow { +public fun Flow.contestState(): Flow = flow { var curInfo: ContestInfo? = null var curRuns = persistentMapOf() + var curMessages = persistentMapOf() collect { - emit(ContestEventWithRunsBefore(it, curInfo, curRuns)) + emit(ContestState(it, curInfo, curRuns, curMessages)) when (it) { is RunUpdate -> curRuns = curRuns.put(it.newInfo.id, it.newInfo) is InfoUpdate -> curInfo = it.newInfo - is Analytics -> {} + is AnalyticsUpdate -> curMessages = curMessages.put(it.message.id, it.message) } } } -fun Flow.filterUseless() = filter { +public fun Flow.filterUseless(): Flow = filter { when (it.event) { is RunUpdate -> it.runs[it.event.newInfo.id] != it.event.newInfo is InfoUpdate -> it.infoBeforeEvent != it.event.newInfo - is Analytics -> true + is AnalyticsUpdate -> it.analyticsMessages[it.event.message.id] != it.event.message } } -@JvmName("filterUseless2") -fun Flow.filterUseless() = withRunsBefore().filterUseless().map { it.event } - - - private fun PersistentList.resort(index_: Int) = builder().apply { var index = index_ val comparator = compareBy(RunInfo::time, RunInfo::id) @@ -92,7 +83,7 @@ private fun PersistentList.resort(index_: Int) = builder().apply { private fun PersistentList.addAndResort(info: RunInfo) = add(info).resort(size) private fun PersistentList.setAndResort(index: Int, info: RunInfo) = set(index, info).resort(index) -inline fun PersistentMap.update(k: K, block: (V?) -> V) = put(k, block(get(k))) +internal inline fun PersistentMap.update(k: K, block: (V?) -> V) = put(k, block(get(k))) private fun PersistentMap>.addAndResort(k: K, info: RunInfo) = update(k) { (it ?: persistentListOf()).addAndResort(info) @@ -106,18 +97,25 @@ private fun PersistentMap>.removeRun(k: K, info: it.removeAt(index) } +public fun Flow.withGroupedRuns( + selector: (RunInfo) -> K, + transformGroup: ((key: K, cur: PersistentList, original: PersistentList, info: ContestInfo?) -> List)? = null, + needUpdateGroup: ((new: ContestInfo, old: ContestInfo?, key: K) -> Boolean)? = null, +): Flow> = withGroupedRuns(selector, ::ContestStateWithGroupedRuns, transformGroup, needUpdateGroup) -fun Flow.withGroupedRuns( +public fun > Flow.withGroupedRuns( selector: (RunInfo) -> K, - transformGroup : ((key: K, cur: PersistentList, original: PersistentList, info: ContestInfo?) -> List)? = null, - needUpdateGroup : ((new: ContestInfo, old: ContestInfo?, key: K) -> Boolean)? = null, -) = flow { + provider: (ContestUpdate, ContestInfo?, PersistentMap>, PersistentMap) -> S, + transformGroup: ((key: K, cur: PersistentList, original: PersistentList, info: ContestInfo?) -> List)? = null, + needUpdateGroup: ((new: ContestInfo, old: ContestInfo?, key: K) -> Boolean)? = null +): Flow = flow { var curInfo: ContestInfo? = null var curRuns = persistentMapOf>() + var curMessages = persistentMapOf() var originalRuns = persistentMapOf>() val oldKey = mutableMapOf() collect { update -> - suspend fun emit(update: ContestUpdate) = emit(ContestEventWithGroupedRuns(update, curInfo, curRuns)) + suspend fun emit(update: ContestUpdate) = emit(provider(update, curInfo, curRuns, curMessages)) suspend fun updateGroup(key: K, newRun: RunInfo? = null) { var plist = curRuns[key] ?: persistentListOf() if (transformGroup == null) { @@ -169,17 +167,13 @@ fun Flow.withGroupedRuns( } } } - is Analytics -> { + is AnalyticsUpdate -> { + curMessages = curMessages.put(update.message.id, update.message) emit(update) } } } } -fun Flow.stateWithGroupedRuns(selector: (RunInfo) -> K) = withGroupedRuns(selector).map { - ContestStateWithGroupedRuns(it.infoAfterEvent, it.runs) -}.conflate() - -fun Flow.stateGroupedByTeam() = stateWithGroupedRuns { it.teamId }.map { - ContestStateWithRunsByTeam(it.info, it.runs) -} \ No newline at end of file +public fun Flow.stateGroupedByTeam(): Flow = + withGroupedRuns({ it.teamId }, ::ContestStateWithRunsByTeam).conflate() diff --git a/src/cds/src/main/kotlin/org/icpclive/cds/atcoder/AtcoderDataSource.kt b/src/cds/src/main/kotlin/org/icpclive/cds/atcoder/AtcoderDataSource.kt new file mode 100644 index 000000000..4fbf741c6 --- /dev/null +++ b/src/cds/src/main/kotlin/org/icpclive/cds/atcoder/AtcoderDataSource.kt @@ -0,0 +1,139 @@ +package org.icpclive.cds.atcoder + +import kotlinx.datetime.* +import kotlinx.serialization.Serializable +import org.icpclive.api.* +import org.icpclive.cds.common.* +import org.icpclive.cds.common.ContestParseResult +import org.icpclive.cds.common.FullReloadContestDataSource +import org.icpclive.cds.common.jsonLoader +import org.icpclive.cds.settings.AtcoderSettings +import org.icpclive.util.* +import kotlin.time.Duration.Companion.ZERO +import kotlin.time.Duration.Companion.minutes +import kotlin.time.Duration.Companion.nanoseconds +import kotlin.time.Duration.Companion.seconds + +@Serializable +internal class AtcoderTask( + val Assignment: String, + val TaskName: String, + val TaskScreenName: String, +) + +@Serializable +internal class AtcoderTaskResult( + val Count: Int, + val Failure: Int, + val Penalty: Int, + val Score: Int, + val Elapsed: Long, + val Pending: Boolean, +) + +@Serializable +internal class AtcoderTeam( + val UserScreenName: String, + val TaskResults: Map +) + +@Serializable +internal class ContestData( + val TaskInfo: List, + val StandingsData: List +) + +internal class AtcoderDataSource(val settings: AtcoderSettings, creds: Map) : FullReloadContestDataSource(5.seconds) { + val teamIds = Enumerator() + val problemIds = Enumerator() + private val loader = jsonLoader(settings.network, ClientAuth.CookieAuth("REVEL_SESSION", settings.sessionCookie.get(creds))) { "https://atcoder.jp/contests/${settings.contestId}/standings/json" } + + var submissionId: Int = 1 + val runs = mutableMapOf, List>() + + fun addNewRuns(teamId: Int, problemId: Int, result: AtcoderTaskResult) : List { + val oldRuns = (runs[teamId to problemId] ?: emptyList()).toMutableList() + repeat(result.Count - oldRuns.size) { + oldRuns.add( + RunInfo( + id = submissionId++, + result = null, + percentage = 0.0, + problemId = problemId, + teamId = teamId, + time = minOf(settings.contestLength, Clock.System.now() - settings.startTime) + ) + ) + } + while (oldRuns.count { (it.result as? IOIRunResult)?.wrongVerdict != null } < result.Penalty) { + val fst = oldRuns.indexOfFirst { it.result == null } + oldRuns[fst] = oldRuns[fst].copy(result = IOIRunResult(score = listOf(0.0), wrongVerdict = Verdict.Rejected)) + if (result.Elapsed.nanoseconds != ZERO && oldRuns[fst].time > result.Elapsed.nanoseconds) { + oldRuns[fst] = oldRuns[fst].copy(time = result.Elapsed.nanoseconds) + } + } + if (result.Score > 0) { + if (oldRuns.mapNotNull { it.result as? IOIRunResult }.maxOfOrNull { it.score[0] }?.toInt() != result.Score / 100 && !result.Pending) { + val fst = oldRuns.indexOfFirst { it.result == null } + oldRuns[fst] = oldRuns[fst].copy(result = IOIRunResult(score = listOf(result.Score / 100.0)), time = result.Elapsed.nanoseconds) + } + } + return oldRuns + } + + override suspend fun loadOnce(): ContestParseResult { + val data = loader.load() + val problems = data.TaskInfo.mapIndexed { index, task -> + ProblemInfo( + displayName = task.Assignment, + fullName = task.TaskName, + id = problemIds[task.TaskScreenName], + ordinal = index, + contestSystemId = task.TaskScreenName, + minScore = 0.0, + maxScore = (data.StandingsData.maxOfOrNull { it.TaskResults[task.TaskScreenName]?.Score ?: 0 } ?: 0) / 100.0, + scoreMergeMode = ScoreMergeMode.LAST_OK + ) + } + val teams = data.StandingsData.map { + TeamInfo( + id = teamIds[it.UserScreenName], + fullName = it.UserScreenName, + displayName = it.UserScreenName, + contestSystemId = it.UserScreenName, + groups = emptyList(), + hashTag = null, + medias = emptyMap(), + isHidden = false, + isOutOfContest = false, + organizationId = null, + ) + } + val info = ContestInfo( + name = "", + status = ContestStatus.byCurrentTime(settings.startTime, settings.contestLength), + resultType = ContestResultType.IOI, + startTime = settings.startTime, + contestLength = settings.contestLength, + freezeTime = settings.contestLength, + problemList = problems, + teamList = teams, + groupList = emptyList(), + organizationList = emptyList(), + penaltyRoundingMode = PenaltyRoundingMode.LAST, + penaltyPerWrongAttempt = 5.minutes, + ) + val newRuns = buildList { + for (teamResult in data.StandingsData) { + val teamId = teamIds[teamResult.UserScreenName] + for ((problemCdsId, problemResult) in teamResult.TaskResults) { + val problemId = problemIds[problemCdsId] + runs[teamId to problemId] = addNewRuns(teamId, problemId, problemResult).also { + addAll(it) + } + } + } + } + return ContestParseResult(info, newRuns, emptyList()) + } +} \ No newline at end of file diff --git a/src/cds/src/main/kotlin/org/icpclive/cds/cats/CATSDataSource.kt b/src/cds/src/main/kotlin/org/icpclive/cds/cats/CATSDataSource.kt index b615579d1..fbad739c1 100644 --- a/src/cds/src/main/kotlin/org/icpclive/cds/cats/CATSDataSource.kt +++ b/src/cds/src/main/kotlin/org/icpclive/cds/cats/CATSDataSource.kt @@ -1,23 +1,15 @@ package org.icpclive.cds.cats import kotlinx.datetime.* -import kotlinx.datetime.TimeZone -import kotlinx.serialization.KSerializer -import kotlinx.serialization.SerialName -import kotlinx.serialization.Serializable -import kotlinx.serialization.descriptors.PrimitiveKind -import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor -import kotlinx.serialization.descriptors.SerialDescriptor +import kotlinx.serialization.* +import kotlinx.serialization.descriptors.* import kotlinx.serialization.encoding.Decoder import kotlinx.serialization.encoding.Encoder import org.icpclive.api.* -import org.icpclive.cds.ContestParseResult -import org.icpclive.cds.FullReloadContestDataSource -import org.icpclive.cds.common.jsonLoader -import org.icpclive.util.getCredentials +import org.icpclive.cds.common.* +import org.icpclive.cds.settings.CatsSettings import java.time.ZonedDateTime import java.time.format.DateTimeFormatter -import java.util.* import kotlin.time.Duration.Companion.seconds private object ContestTimeSerializer : KSerializer { @@ -46,13 +38,9 @@ private object SubmissionTimeSerializer : KSerializer { } } -class CATSDataSource(val properties: Properties, creds: Map) : FullReloadContestDataSource(5.seconds) { - private val login = properties.getCredentials("login", creds) - private val password = properties.getCredentials("password", creds) - private val url = properties.getProperty("url") - private val timezone = TimeZone.of(properties.getProperty("timezone") ?: throw IllegalStateException("Cats requires timezone property to be set")) - val resultType = ContestResultType.valueOf(properties.getProperty("standings.resultType", "ICPC").uppercase()) - private val cid = properties.getProperty("cid") +internal class CATSDataSource(val settings: CatsSettings, creds: Map) : FullReloadContestDataSource(5.seconds) { + private val login = settings.login.get(creds) + private val password = settings.password.get(creds) private var sid: String? = null @@ -60,7 +48,7 @@ class CATSDataSource(val properties: Properties, creds: Map) : F data class Auth(val status: String, val sid: String, val cid: Long) @Serializable - data class Problem(val id: Int, val name: String, val code: String, val max_points: String = "0.0") + data class Problem(val id: Int, val name: String, val code: String, val max_points: Double = 0.0) @Serializable data class Problems(val problems: List) @@ -120,11 +108,11 @@ class CATSDataSource(val properties: Properties, creds: Map) : F val contest_start: Int ) : Run() - private val authLoader = jsonLoader { "$url/?f=login&login=$login&passwd=$password&json=1" } - private val problemsLoader = jsonLoader { "$url/problems?cid=$cid&sid=${sid!!}&rows=1000&json=1" } - private val usersLoader = jsonLoader { "$url/users?cid=$cid&sid=${sid!!}&rows=1000&json=1" } - private val contestLoader = jsonLoader { "$url/contest_params?cid=$cid&sid=${sid!!}&json=1" } - private val runsLoader = jsonLoader> { "$url/console?cid=$cid&sid=${sid!!}&rows=1000&json=1&search=is_ooc%3D0&show_messages=0&show_contests=0&show_results=1" } + private val authLoader = jsonLoader(networkSettings = settings.network) { "${settings.url}/?f=login&login=$login&passwd=$password&json=1" } + private val problemsLoader = jsonLoader(networkSettings = settings.network) { "${settings.url}/problems?cid=${settings.cid}&sid=${sid!!}&rows=1000&json=1" } + private val usersLoader = jsonLoader(networkSettings = settings.network) { "${settings.url}/users?cid=${settings.cid}&sid=${sid!!}&rows=1000&json=1" } + private val contestLoader = jsonLoader(networkSettings = settings.network) { "${settings.url}/contest_params?cid=${settings.cid}&sid=${sid!!}&json=1" } + private val runsLoader = jsonLoader>(networkSettings = settings.network) { "${settings.url}/console?cid=${settings.cid}&sid=${sid!!}&rows=1000&json=1&search=is_ooc%3D0&show_messages=0&show_contests=0&show_results=1" } override suspend fun loadOnce(): ContestParseResult { sid = authLoader.load().sid @@ -146,15 +134,15 @@ class CATSDataSource(val properties: Properties, creds: Map) : F .asSequence() .mapIndexed { index, problem -> ProblemInfo( - letter = problem.code, - name = problem.name, + displayName = problem.code, + fullName = problem.name, color = null, id = problem.id, ordinal = index, contestSystemId = problem.id.toString(), - minScore = if (resultType == ContestResultType.IOI) 0.0 else null, - maxScore = if (resultType == ContestResultType.IOI) problem.max_points.toDoubleOrNull() else null, - scoreMergeMode = if (resultType == ContestResultType.IOI) ScoreMergeMode.MAX_TOTAL else null + minScore = if (settings.resultType == ContestResultType.IOI) 0.0 else null, + maxScore = if (settings.resultType == ContestResultType.IOI) problem.max_points else null, + scoreMergeMode = if (settings.resultType == ContestResultType.IOI) ScoreMergeMode.MAX_TOTAL else null ) } .toList() @@ -165,29 +153,37 @@ class CATSDataSource(val properties: Properties, creds: Map) : F .map { team -> TeamInfo( id = team.account_id, - name = team.name, - shortName = team.name, + fullName = team.name, + displayName = team.name, contestSystemId = team.account_id.toString(), groups = listOf(), hashTag = null, - medias = mapOf() + medias = mapOf(), + isHidden = false, + isOutOfContest = false, + organizationId = null ) }.toList() - val startTime = contest.start_date.toInstant(timezone) - val contestLength = contest.finish_date.toInstant(timezone) - startTime - val freezeTime = contest.freeze_date.toInstant(timezone) - startTime + val startTime = contest.start_date.toInstant(settings.timeZone) + val contestLength = contest.finish_date.toInstant(settings.timeZone) - startTime + val freezeTime = contest.freeze_date.toInstant(settings.timeZone) - startTime val contestInfo = ContestInfo( name = contest.title, - status = ContestStatus.OVER, - resultType = resultType, + status = ContestStatus.byCurrentTime(startTime, contestLength), + resultType = settings.resultType, startTime = startTime, contestLength = contestLength, freezeTime = freezeTime, - problems = problemsList, - teams = teamList, - groups = emptyList() + problemList = problemsList, + teamList = teamList, + groupList = emptyList(), + organizationList = emptyList(), + penaltyRoundingMode = when (settings.resultType) { + ContestResultType.IOI -> PenaltyRoundingMode.ZERO + ContestResultType.ICPC -> PenaltyRoundingMode.EACH_SUBMISSION_DOWN_TO_MINUTE + } ) val resultRuns = runs diff --git a/src/cds/src/main/kotlin/org/icpclive/cds/clics/ClicsDataSource.kt b/src/cds/src/main/kotlin/org/icpclive/cds/clics/ClicsDataSource.kt index 10fdb4c9d..840a43a90 100644 --- a/src/cds/src/main/kotlin/org/icpclive/cds/clics/ClicsDataSource.kt +++ b/src/cds/src/main/kotlin/org/icpclive/cds/clics/ClicsDataSource.kt @@ -5,48 +5,37 @@ import kotlinx.coroutines.flow.* import kotlinx.serialization.ExperimentalSerializationApi import kotlinx.serialization.SerializationException import kotlinx.serialization.json.Json -import org.icpclive.api.AnalyticsCommentaryEvent -import org.icpclive.api.AnalyticsMessage -import org.icpclive.api.ContestInfo -import org.icpclive.api.RunInfo +import org.icpclive.api.* import org.icpclive.cds.* -import org.icpclive.cds.clics.api.Event -import org.icpclive.cds.clics.api.Event.* -import org.icpclive.cds.common.ClientAuth -import org.icpclive.cds.common.getLineStreamLoaderFlow -import org.icpclive.cds.common.isHttpUrl -import org.icpclive.util.* -import java.util.* +import org.icpclive.clics.Event +import org.icpclive.clics.Event.* +import org.icpclive.cds.common.* +import org.icpclive.cds.settings.* +import org.icpclive.util.getLogger +import org.icpclive.util.logAndRetryWithDelay import kotlin.time.Duration.Companion.seconds -enum class FeedVersion { - V2020_03, - V2022_07 -} - -private class ClicsLoaderSettings(properties: Properties, prefix: String, creds: Map) { - private val url = properties.getProperty("${prefix}url") +private class ParsedClicsLoaderSettings(settings: ClicsLoaderSettings, creds: Map) { + private val url = settings.url val auth = ClientAuth.BasicOrNull( - properties.getCredentials("${prefix}login", creds), - properties.getCredentials("${prefix}password", creds) + settings.login?.get(creds), + settings.password?.get(creds) ) - val eventFeedUrl = apiRequestUrl(properties.getProperty("${prefix}event_feed_name", "event-feed")) + val eventFeedUrl = apiRequestUrl(settings.eventFeedName) private fun apiRequestUrl(method: String) = "$url/$method" - val feedVersion = FeedVersion.valueOf("V" + properties.getProperty("${prefix}feed_version", "2022_07")) + val feedVersion = settings.feedVersion } -class ClicsDataSource(properties: Properties, creds: Map) : RawContestDataSource { - private val mainLoaderSettings = ClicsLoaderSettings(properties, "", creds) - private val additionalLoaderSettings = properties.getProperty("additional_feed.url", null)?.let { - ClicsLoaderSettings(properties, "additional_feed.", creds) - } +internal class ClicsDataSource(val settings: ClicsSettings, creds: Map) : ContestDataSource { + private val mainLoaderSettings = ParsedClicsLoaderSettings(settings.mainFeed, creds) + private val additionalLoaderSettings = settings.additionalFeed?.let { ParsedClicsLoaderSettings(it, creds) } private val model = ClicsModel( - properties.getProperty("use_team_names", "true") == "true", - properties.getProperty("media_base_url", "") + settings.useTeamNames, + settings.mediaBaseUrl ) val Event.isFinalEvent get() = this is StateEvent && data?.end_of_updates != null @@ -56,8 +45,8 @@ class ClicsDataSource(properties: Properties, creds: Map) : RawC onContestInfo: suspend (ContestInfo) -> Unit, onComment: suspend (AnalyticsCommentaryEvent) -> Unit ) { - val eventsLoader = getEventFeedLoader(mainLoaderSettings) - val additionalEventsLoader = additionalLoaderSettings?.let { getEventFeedLoader(it) } + val eventsLoader = getEventFeedLoader(mainLoaderSettings, settings.network) + val additionalEventsLoader = additionalLoaderSettings?.let { getEventFeedLoader(it, settings.network) } fun priority(event: UpdateContestEvent) = when (event) { is ContestEvent -> 0 @@ -78,7 +67,6 @@ class ClicsDataSource(properties: Properties, creds: Map) : RawC fun Flow.sortedPrefix() = flow { coroutineScope { - @OptIn(FlowPreview::class) val channel = produceIn(this) val prefix = mutableListOf() prefix.add(channel.receive()) @@ -144,9 +132,9 @@ class ClicsDataSource(properties: Properties, creds: Map) : RawC } is CommentaryEvent -> { - if (it.data != null) { + it.data?.let { comment -> onComment( - model.processCommentary(it.data) + model.processCommentary(comment) ) } } @@ -177,46 +165,38 @@ class ClicsDataSource(properties: Properties, creds: Map) : RawC runLoader( onRun = { emit(RunUpdate(it)) }, onContestInfo = { emit(InfoUpdate(it)) }, - onComment = { emit(Analytics(it)) } - ) - } - - override suspend fun loadOnce(): ContestParseResult { - val analyticsMessages = mutableListOf() - runLoader( - onRun = {}, - onContestInfo = {}, - onComment = { analyticsMessages.add(it) } + onComment = { emit(AnalyticsUpdate(it)) } ) - logger.info("Loaded data from CLICS") - val runs = model.getAllRuns() - return ContestParseResult(model.contestInfo, runs, analyticsMessages) + if (model.contestInfo.status != ContestStatus.FINALIZED) { + logger.info("Events are finished, while contest is not finalized. Enforce finalization.") + emit(InfoUpdate(model.contestInfo.copy(status = ContestStatus.FINALIZED))) + } } companion object { val logger = getLogger(ClicsDataSource::class) @OptIn(ExperimentalSerializationApi::class) - private fun getEventFeedLoader(settings: ClicsLoaderSettings) = flow { + private fun getEventFeedLoader(settings: ParsedClicsLoaderSettings, networkSettings: NetworkSettings?) = flow { val jsonDecoder = Json { ignoreUnknownKeys = true explicitNulls = false } while (true) { - emitAll(getLineStreamLoaderFlow(settings.eventFeedUrl, settings.auth) + emitAll(getLineStreamLoaderFlow(networkSettings, settings.auth, settings.eventFeedUrl) .filter { it.isNotEmpty() } .mapNotNull { data -> try { when (settings.feedVersion) { - FeedVersion.V2020_03 -> Event.fromV1(jsonDecoder.decodeFromString(data)) - FeedVersion.V2022_07 -> jsonDecoder.decodeFromString(data) + ClicsSettings.FeedVersion.`2020_03` -> Event.fromV1(jsonDecoder.decodeFromString(data)) + ClicsSettings.FeedVersion.`2022_07` -> jsonDecoder.decodeFromString(data) } } catch (e: SerializationException) { logger.error("Failed to deserialize: $data", e) null } }) - if (!isHttpUrl(settings.eventFeedUrl)) break + if (!isHttpUrl(settings.eventFeedUrl)) { break } delay(5.seconds) logger.info("Connection ${settings.eventFeedUrl} is closed, retrying") } diff --git a/src/cds/src/main/kotlin/org/icpclive/cds/clics/ClicsModel.kt b/src/cds/src/main/kotlin/org/icpclive/cds/clics/ClicsModel.kt index 3cfe6f2b8..9483ad67d 100644 --- a/src/cds/src/main/kotlin/org/icpclive/cds/clics/ClicsModel.kt +++ b/src/cds/src/main/kotlin/org/icpclive/cds/clics/ClicsModel.kt @@ -2,17 +2,16 @@ package org.icpclive.cds.clics import kotlinx.datetime.Instant import org.icpclive.api.* -import org.icpclive.cds.clics.api.* -import org.icpclive.cds.clics.model.ClicsJudgementTypeInfo -import org.icpclive.cds.clics.model.ClicsOrganisationInfo -import org.icpclive.cds.clics.model.ClicsRunInfo +import org.icpclive.clics.* +import org.icpclive.cds.clics.model.* import org.icpclive.util.Enumerator import org.icpclive.util.getLogger import java.awt.Color import kotlin.time.Duration import kotlin.time.Duration.Companion.hours +import kotlin.time.Duration.Companion.minutes -class ClicsModel( +internal class ClicsModel( private val addTeamNames: Boolean, private val mediaBaseUrl: String ) { @@ -31,7 +30,7 @@ class ClicsModel( var contestLength = 5.hours var freezeTime = 4.hours var status = ContestStatus.BEFORE - var penaltyPerWrongAttempt = 20 + var penaltyPerWrongAttempt = 20.minutes var holdBeforeStartTime: Duration? = null var name: String = "" @@ -59,14 +58,14 @@ class ClicsModel( return null } - fun Group.toApi() : GroupInfo = GroupInfo(name) + private fun Group.toApi() : GroupInfo = GroupInfo(name, isHidden = false, isOutOfContest = false) - fun Team.toApi(): TeamInfo { + private fun Team.toApi(): TeamInfo { val teamOrganization = organization_id?.let { organisations[it] } return TeamInfo( id = teamId[id], - name = teamName(teamOrganization?.formalName, name), - shortName = teamName(teamOrganization?.name, name), + fullName = teamName(teamOrganization?.formalName, name), + displayName = teamName(teamOrganization?.name, name), contestSystemId = id, isHidden = hidden, groups = group_ids.mapNotNull { groups[it]?.name }, @@ -76,19 +75,30 @@ class ClicsModel( video.firstOrNull()?.mediaType()?.let { put(TeamMediaType.RECORD, it) } webcam.firstOrNull()?.mediaType()?.let { put(TeamMediaType.CAMERA, it) } desktop.firstOrNull()?.mediaType()?.let { put(TeamMediaType.SCREEN, it) } - } + }, + organizationId = organization_id, + isOutOfContest = false, + customFields = mapOf( + "name" to name, + ) ) } - fun Problem.toApi() = ProblemInfo( - letter = label, - name = name, + private fun Problem.toApi() = ProblemInfo( + displayName = label, + fullName = name, id = problemToId[id], ordinal = ordinal, contestSystemId = id, color = rgb ?: Color.BLACK ) + private fun ClicsOrganisationInfo.toApi() = OrganizationInfo( + cdsId = id, + displayName = name, + fullName = formalName, + ) + val contestInfo: ContestInfo get() = ContestInfo( name = name, @@ -97,11 +107,14 @@ class ClicsModel( startTime = startTime ?: Instant.fromEpochSeconds(0), contestLength = contestLength, freezeTime = freezeTime, - problems = problems.values.map { it.toApi() }, - teams = teams.values.map { it.toApi() }, - groups = groups.values.map { it.toApi() }, + problemList = problems.values.map { it.toApi() }, + teamList = teams.values.map { it.toApi() }, + groupList = groups.values.map { it.toApi() }, penaltyPerWrongAttempt = penaltyPerWrongAttempt, - holdBeforeStartTime = holdBeforeStartTime + holdBeforeStartTime = holdBeforeStartTime, + penaltyRoundingMode = PenaltyRoundingMode.EACH_SUBMISSION_DOWN_TO_MINUTE, + organizationList = organisations.values.map { it.toApi() }, + cdsSupportsFinalization = true ) fun processContest(contest: Contest): List { @@ -110,7 +123,7 @@ class ClicsModel( contestLength = contest.duration freezeTime = contestLength - (contest.scoreboard_freeze_duration ?: Duration.ZERO) holdBeforeStartTime = contest.countdown_pause_time - penaltyPerWrongAttempt = contest.penalty_time ?: 20 + penaltyPerWrongAttempt = contest.penalty_time ?: 20.minutes return emptyList() } @@ -227,6 +240,7 @@ class ClicsModel( fun processState(state: State): List { status = when { + state.finalized != null && (state.frozen == null || state.thawed != null) -> ContestStatus.FINALIZED state.ended != null -> ContestStatus.OVER state.started != null -> ContestStatus.RUNNING else -> ContestStatus.BEFORE diff --git a/src/cds/src/main/kotlin/org/icpclive/cds/clics/model/ClicsJudgementTypeInfo.kt b/src/cds/src/main/kotlin/org/icpclive/cds/clics/model/ClicsJudgementTypeInfo.kt index c730b9b23..396153f77 100644 --- a/src/cds/src/main/kotlin/org/icpclive/cds/clics/model/ClicsJudgementTypeInfo.kt +++ b/src/cds/src/main/kotlin/org/icpclive/cds/clics/model/ClicsJudgementTypeInfo.kt @@ -1,6 +1,6 @@ package org.icpclive.cds.clics.model -data class ClicsJudgementTypeInfo( +internal data class ClicsJudgementTypeInfo( val id: String, val isAccepted: Boolean, val isAddingPenalty: Boolean, diff --git a/src/cds/src/main/kotlin/org/icpclive/cds/clics/model/ClicsLanguageInfo.kt b/src/cds/src/main/kotlin/org/icpclive/cds/clics/model/ClicsLanguageInfo.kt index d44a085a8..e7e8fefc0 100644 --- a/src/cds/src/main/kotlin/org/icpclive/cds/clics/model/ClicsLanguageInfo.kt +++ b/src/cds/src/main/kotlin/org/icpclive/cds/clics/model/ClicsLanguageInfo.kt @@ -1,6 +1,6 @@ package org.icpclive.cds.clics.model -data class ClicsLanguageInfo( +internal data class ClicsLanguageInfo( val id: Int, val name: String ) diff --git a/src/cds/src/main/kotlin/org/icpclive/cds/clics/model/ClicsOrganisationInfo.kt b/src/cds/src/main/kotlin/org/icpclive/cds/clics/model/ClicsOrganisationInfo.kt index 9ec459568..34e619aef 100644 --- a/src/cds/src/main/kotlin/org/icpclive/cds/clics/model/ClicsOrganisationInfo.kt +++ b/src/cds/src/main/kotlin/org/icpclive/cds/clics/model/ClicsOrganisationInfo.kt @@ -1,6 +1,6 @@ package org.icpclive.cds.clics.model -data class ClicsOrganisationInfo( +internal data class ClicsOrganisationInfo( val id: String, val name: String, val formalName: String, diff --git a/src/cds/src/main/kotlin/org/icpclive/cds/clics/model/ClicsRunInfo.kt b/src/cds/src/main/kotlin/org/icpclive/cds/clics/model/ClicsRunInfo.kt index 35a147254..26bc4e5d9 100644 --- a/src/cds/src/main/kotlin/org/icpclive/cds/clics/model/ClicsRunInfo.kt +++ b/src/cds/src/main/kotlin/org/icpclive/cds/clics/model/ClicsRunInfo.kt @@ -1,12 +1,11 @@ package org.icpclive.cds.clics.model -import org.icpclive.api.ICPCRunResult import org.icpclive.api.MediaType import org.icpclive.api.Verdict -import org.icpclive.cds.clics.api.Problem +import org.icpclive.clics.Problem import kotlin.time.Duration -class ClicsRunInfo( +internal class ClicsRunInfo( val id: Int, val problem: Problem, val liveProblemId: Int, @@ -28,9 +27,9 @@ class ClicsRunInfo( }, problemId = liveProblemId, teamId = teamId, - percentage = when (problem.test_data_count) { + percentage = when (val count = problem.test_data_count) { null, 0 -> if (judgementType != null) 1.0 else 0.0 - else -> minOf(passedCaseRun.size.toDouble() / problem.test_data_count, 1.0) + else -> minOf(passedCaseRun.size.toDouble() / count, 1.0) }, time = submissionTime, reactionVideos = reactionVideos, diff --git a/src/cds/src/main/kotlin/org/icpclive/cds/cms/CmsDataSoruce.kt b/src/cds/src/main/kotlin/org/icpclive/cds/cms/CmsDataSoruce.kt new file mode 100644 index 000000000..b75c146ff --- /dev/null +++ b/src/cds/src/main/kotlin/org/icpclive/cds/cms/CmsDataSoruce.kt @@ -0,0 +1,118 @@ +package org.icpclive.cds.cms + +import org.icpclive.api.* +import org.icpclive.cds.cms.model.* +import org.icpclive.cds.common.ContestParseResult +import org.icpclive.cds.common.FullReloadContestDataSource +import org.icpclive.cds.common.jsonLoader +import org.icpclive.cds.settings.CmsSettings +import org.icpclive.util.Enumerator +import kotlin.time.Duration +import kotlin.time.Duration.Companion.seconds + +internal class CmsDataSource(val settings: CmsSettings) : FullReloadContestDataSource(5.seconds) { + private val contestsLoader = jsonLoader>(settings.network, null) { "${settings.url}/contests/" } + private val tasksLoader = jsonLoader>(settings.network, null) { "${settings.url}/tasks/"} + private val teamsLoader = jsonLoader>(settings.network, null) { "${settings.url}/teams/"} + private val usersLoader = jsonLoader>(settings.network, null) { "${settings.url}/users/"} + private val submissionsLoader = jsonLoader>(settings.network, null) { "${settings.url}/submissions/"} + private val subchangesLoader = jsonLoader>(settings.network, null) { "${settings.url}/subchanges/"} + private val problemId = Enumerator() + private val teamId = Enumerator() + private val submissionId = Enumerator() + + override suspend fun loadOnce(): ContestParseResult { + val contests = contestsLoader.load() + val mainContest = contests[settings.activeContest] ?: error("No data for contest ${settings.activeContest}") + val finishedContestsProblems = mutableSetOf() + val runningContestProblems = mutableSetOf() + val problems = buildList { + val problems = tasksLoader.load().entries.groupBy { it.value.contest }.mapValues { + it.value.map { (k, v) -> + ProblemInfo( + displayName = v.short_name, + fullName = v.name, + id = problemId[k], + contestSystemId = k, + ordinal = 0, + scoreMergeMode = when (v.score_mode) { + ScoreMode.max -> ScoreMergeMode.MAX_TOTAL + ScoreMode.max_subtask -> ScoreMergeMode.MAX_PER_GROUP + }, + minScore = 0.0, + maxScore = v.max_score + ) + } + } + for (other in settings.otherContests) { + for (p in problems[other] ?: emptyList()) { + add(p.copy(ordinal = size)) + finishedContestsProblems.add(p.contestSystemId) + } + } + for (p in problems[settings.activeContest] ?: emptyList()) { + add(p.copy(ordinal = size)) + runningContestProblems.add(p.contestSystemId) + } + } + val organizations = teamsLoader.load().map { (k, v) -> + OrganizationInfo( + cdsId = k, + displayName = v.name, + fullName = v.name + ) + } + val teams = usersLoader.load().map {(k, v) -> + TeamInfo( + id = teamId[k], + fullName = "[${v.team}] ${v.f_name} ${v.l_name}", + displayName = "${v.f_name} ${v.l_name}", + contestSystemId = k, + groups = emptyList(), + hashTag = null, + medias = mapOf( + TeamMediaType.PHOTO to MediaType.Photo("${settings.url}/faces/$k", true) + ), + isHidden = false, + isOutOfContest = false, + organizationId = v.team, + customFields = mapOf( + "country" to v.team, + "first_name" to v.f_name, + "last_name" to v.l_name + ), + ) + } + val info = ContestInfo( + name = mainContest.name, + status = ContestStatus.byCurrentTime(mainContest.begin, mainContest.end - mainContest.begin), + resultType = ContestResultType.IOI, + startTime = mainContest.begin, + contestLength = mainContest.end - mainContest.begin, + freezeTime = mainContest.end - mainContest.begin, + problemList = problems, + teamList = teams, + groupList = emptyList(), + organizationList = organizations, + penaltyRoundingMode = PenaltyRoundingMode.ZERO, + ) + val submissions = submissionsLoader.load().mapNotNull { (k, v) -> + if (v.task !in runningContestProblems && v.task !in finishedContestsProblems) { + return@mapNotNull null + } + RunInfo( + id = submissionId[k], + result = null, + percentage = 0.0, + problemId = problemId[v.task], + teamId = teamId[v.user], + time = if (v.task in runningContestProblems) v.time - mainContest.begin else Duration.ZERO + ) + }.associateBy { it.id }.toMutableMap() + subchangesLoader.load().entries.sortedBy { it.value.time }.forEach {(_, it) -> + val r = submissions[submissionId[it.submission]] ?: return@forEach + submissions[r.id] = r.copy(result = IOIRunResult(it.extra.map { it.toDouble() })) + } + return ContestParseResult(info, submissions.values.sortedBy { it.id }, emptyList()) + } +} \ No newline at end of file diff --git a/src/cds/src/main/kotlin/org/icpclive/cds/cms/model/Contest.kt b/src/cds/src/main/kotlin/org/icpclive/cds/cms/model/Contest.kt new file mode 100644 index 000000000..dd88aed5c --- /dev/null +++ b/src/cds/src/main/kotlin/org/icpclive/cds/cms/model/Contest.kt @@ -0,0 +1,14 @@ +package org.icpclive.cds.cms.model + +import kotlinx.datetime.Instant +import kotlinx.serialization.Serializable +import org.icpclive.util.UnixSecondsSerializer + +@Serializable +internal data class Contest( + val name: String, + @Serializable(with = UnixSecondsSerializer::class) + val begin: Instant, + @Serializable(with = UnixSecondsSerializer::class) + val end: Instant, +) \ No newline at end of file diff --git a/src/cds/src/main/kotlin/org/icpclive/cds/cms/model/Subchange.kt b/src/cds/src/main/kotlin/org/icpclive/cds/cms/model/Subchange.kt new file mode 100644 index 000000000..dde3140f6 --- /dev/null +++ b/src/cds/src/main/kotlin/org/icpclive/cds/cms/model/Subchange.kt @@ -0,0 +1,11 @@ +package org.icpclive.cds.cms.model + +import kotlinx.serialization.Serializable + +@Serializable +internal class Subchange( + val score: Double, + val submission: String, + val extra: List, + val time: Int +) \ No newline at end of file diff --git a/src/cds/src/main/kotlin/org/icpclive/cds/cms/model/Submission.kt b/src/cds/src/main/kotlin/org/icpclive/cds/cms/model/Submission.kt new file mode 100644 index 000000000..45d1e4f9a --- /dev/null +++ b/src/cds/src/main/kotlin/org/icpclive/cds/cms/model/Submission.kt @@ -0,0 +1,13 @@ +package org.icpclive.cds.cms.model + +import kotlinx.datetime.Instant +import kotlinx.serialization.Serializable +import org.icpclive.util.UnixSecondsSerializer + +@Serializable +internal class Submission( + val user: String, + val task: String, + @Serializable(with = UnixSecondsSerializer::class) + val time: Instant +) \ No newline at end of file diff --git a/src/cds/src/main/kotlin/org/icpclive/cds/cms/model/Task.kt b/src/cds/src/main/kotlin/org/icpclive/cds/cms/model/Task.kt new file mode 100644 index 000000000..4f25d9a84 --- /dev/null +++ b/src/cds/src/main/kotlin/org/icpclive/cds/cms/model/Task.kt @@ -0,0 +1,20 @@ +package org.icpclive.cds.cms.model + +import kotlinx.serialization.Serializable + +internal enum class ScoreMode { + max, + max_subtask, +} + +@Serializable +internal data class Task( + val name: String, + val short_name: String, + val contest: String, + val max_score: Double, + val score_precision: Int, + val extra_headers: List, + val order:Int, + val score_mode: ScoreMode +) \ No newline at end of file diff --git a/src/cds/src/main/kotlin/org/icpclive/cds/cms/model/Team.kt b/src/cds/src/main/kotlin/org/icpclive/cds/cms/model/Team.kt new file mode 100644 index 000000000..d3756385b --- /dev/null +++ b/src/cds/src/main/kotlin/org/icpclive/cds/cms/model/Team.kt @@ -0,0 +1,6 @@ +package org.icpclive.cds.cms.model + +import kotlinx.serialization.Serializable + +@Serializable +internal data class Team(val name: String) \ No newline at end of file diff --git a/src/cds/src/main/kotlin/org/icpclive/cds/cms/model/User.kt b/src/cds/src/main/kotlin/org/icpclive/cds/cms/model/User.kt new file mode 100644 index 000000000..4ae9569e7 --- /dev/null +++ b/src/cds/src/main/kotlin/org/icpclive/cds/cms/model/User.kt @@ -0,0 +1,10 @@ +package org.icpclive.cds.cms.model + +import kotlinx.serialization.Serializable + +@Serializable +internal class User( + val f_name: String, + val l_name: String, + val team: String +) \ No newline at end of file diff --git a/src/cds/src/main/kotlin/org/icpclive/cds/codedrills/CodeDrillsDataSoruce.kt b/src/cds/src/main/kotlin/org/icpclive/cds/codedrills/CodeDrillsDataSoruce.kt new file mode 100644 index 000000000..6808b4dc4 --- /dev/null +++ b/src/cds/src/main/kotlin/org/icpclive/cds/codedrills/CodeDrillsDataSoruce.kt @@ -0,0 +1,173 @@ +package org.icpclive.cds.codedrills + +import io.codedrills.proto.external.* +import io.grpc.ManagedChannelBuilder +import io.grpc.Metadata +import io.grpc.stub.MetadataUtils +import kotlinx.datetime.Instant +import org.icpclive.api.* +import org.icpclive.cds.common.ContestParseResult +import org.icpclive.cds.common.FullReloadContestDataSource +import org.icpclive.cds.settings.CodeDrillsSettings +import org.icpclive.util.getLogger +import java.util.concurrent.* +import kotlin.time.Duration.Companion.seconds + +internal class CodeDrillsClient(url: String, port: Int, authKey: String) : AutoCloseable { + private val channel = ManagedChannelBuilder.forAddress(url, port).usePlaintext().build() + private val stub = ContestServiceGrpcKt.ContestServiceCoroutineStub(channel).let { + val metadata = Metadata() + metadata.put(Metadata.Key.of("x-auth-key", Metadata.ASCII_STRING_MARSHALLER), authKey) + it.withInterceptors(MetadataUtils.newAttachHeadersInterceptor(metadata)) + } + + suspend fun getScoreboard(id: String) : GetScoreboardResponse { + val request = getScoreboardRequest { + val idInt = id.toIntOrNull() + if (idInt != null) { + contestId = idInt + } else { + contestUrl = id + } + } + return stub.getScoreboard(request) + } + + suspend fun getSubmissions(id: String, page: Int, itemsPerPage: Int) : ListContestSubmissionsResponse { + val request = listContestSubmissionsRequest { + contestId = contestId { + val idInt = id.toIntOrNull() + if (idInt != null) { + this.id = idInt + } else { + this.url = id + } + } + paginationParams = paginationRequestParams { + this.pageIndex = page + this.itemsPerPage = itemsPerPage + } + } + return stub.listContestSubmissions(request) + } + + override fun close() { + channel.shutdown().awaitTermination(5, TimeUnit.SECONDS) + } +} + + +internal class CodeDrillsDataSource(val settings: CodeDrillsSettings, creds: Map) : FullReloadContestDataSource(5.seconds) { + val client = CodeDrillsClient( + settings.url, + settings.port, + settings.authKey.get(creds) + ) + + private fun SubmissionVerdict.toInfoVerdict() = when (this) { + SubmissionVerdict.WAITING -> null + SubmissionVerdict.COMPILING -> null + SubmissionVerdict.COMPILED -> null + SubmissionVerdict.RUNNING -> null + SubmissionVerdict.COMPILE_ERROR -> Verdict.CompilationError + SubmissionVerdict.RUNTIME_ERROR -> Verdict.RuntimeError + SubmissionVerdict.TIME_LIMIT_EXCEEDED -> Verdict.TimeLimitExceeded + SubmissionVerdict.CORRECT_ANSWER -> Verdict.Accepted + SubmissionVerdict.WRONG_ANSWER -> Verdict.WrongAnswer + SubmissionVerdict.SOURCE_LIMIT_EXCEEDED -> Verdict.CompilationError + SubmissionVerdict.MEMORY_LIMIT_EXCEEDED -> Verdict.MemoryLimitExceeded + SubmissionVerdict.SKIPPED -> Verdict.Ignored + SubmissionVerdict.OUTPUT_LIMIT_EXCEEDED -> Verdict.OutputLimitExceeded + SubmissionVerdict.JUDGE_ERROR -> Verdict.Fail + SubmissionVerdict.UNRECOGNIZED -> Verdict.Rejected + } + + override suspend fun loadOnce(): ContestParseResult { + val scoreboard = client.getScoreboard(settings.contestId) + val contest = scoreboard.scoreboard.contest + val problems = scoreboard.scoreboard.problemList.mapIndexed { index, problem -> + ProblemInfo( + displayName = problem.index, + fullName = problem.title, + id = problem.id, + contestSystemId = problem.id.toString(), + ordinal = index + ) + } + val teams = scoreboard.scoreboard.rowList.map { + val team = it.team + TeamInfo( + id = team.id, + contestSystemId = team.id.toString(), + fullName = team.name, + displayName = team.name, + groups = emptyList(), + hashTag = null, + medias = emptyMap(), + organizationId = null, + isOutOfContest = false, + isHidden = false + ) + } + + val memberIdToTeam = scoreboard.scoreboard.rowList + .map { it.team } + .flatMap { it.memberList.map { member -> member.id to it.id } } + .toMap() + + val startTime = Instant.fromEpochMilliseconds(contest.startTimeMilliSeconds) + val contestLength = contest.durationSeconds.seconds + + val itemsPerPage = 100 + val submissionsRaw = buildList { + val page0 = client.getSubmissions(settings.contestId, 0, itemsPerPage) + addAll(page0.submissionList) + for (i in itemsPerPage .. page0.paginationParams.total step itemsPerPage) { + val page = client.getSubmissions(settings.contestId, i / itemsPerPage, itemsPerPage) + addAll(page.submissionList) + } + } + val submissions = submissionsRaw.mapNotNull { + val verdict = it.verdict.toInfoVerdict()?.toRunResult() + val time = Instant.fromEpochMilliseconds(it.submittedOn) - startTime + if (time >= contestLength) return@mapNotNull null + if (it.submittedBy !in memberIdToTeam) { + log.info("Submission by unknown contestant ${it.submittedBy} at ${Instant.fromEpochMilliseconds(it.submittedOn) - startTime} is ignored") + return@mapNotNull null + } + RunInfo( + id = it.id, + result = verdict, + percentage = if (verdict == null) 0.0 else 1.0, + problemId = it.problemId, + teamId = memberIdToTeam[it.submittedBy]!!, + time = time, + ) + } + + + val contestInfo = ContestInfo( + name = contest.title, + status = ContestStatus.byCurrentTime(startTime, contestLength), + resultType = ContestResultType.ICPC, + startTime = startTime, + contestLength = contestLength, + freezeTime = contestLength - contest.scoreboardSettings.freezeSettings.freezeOffsetTimeInS.seconds, + problemList = problems, + teamList = teams, + penaltyPerWrongAttempt = contest.scoreboardSettings.penaltyPerAttemptInS.seconds, + groupList = emptyList(), + penaltyRoundingMode = when (contest.scoreboardSettings.scoreboardType) { + ScoreboardType.UNKNOWN_SCOREBOARD_TYPE, ScoreboardType.ONE_POINT_WITH_PENALTY -> PenaltyRoundingMode.SUM_DOWN_TO_MINUTE + ScoreboardType.ONE_POINT_WITH_MAX_PENALTY -> PenaltyRoundingMode.LAST + ScoreboardType.UNRECOGNIZED, null -> TODO("Unsupported scoreboard type") + }, + organizationList = emptyList() + ) + return ContestParseResult(contestInfo, submissions, emptyList()) + } + + companion object { + val log = getLogger(CodeDrillsDataSource::class) + } +} diff --git a/src/cds/src/main/kotlin/org/icpclive/cds/codeforces/CFContestInfo.kt b/src/cds/src/main/kotlin/org/icpclive/cds/codeforces/CFContestInfo.kt index f137555aa..00bfef0e6 100644 --- a/src/cds/src/main/kotlin/org/icpclive/cds/codeforces/CFContestInfo.kt +++ b/src/cds/src/main/kotlin/org/icpclive/cds/codeforces/CFContestInfo.kt @@ -9,7 +9,7 @@ import kotlin.time.Duration import kotlin.time.Duration.Companion.hours -class CFContestInfo { +internal class CFContestInfo { private var contestLength: Duration = 5.hours private var startTime: Instant = Instant.fromEpochMilliseconds(0) var status = ContestStatus.BEFORE @@ -17,8 +17,7 @@ class CFContestInfo { private val problems = mutableListOf() private var cfStandings: CFStandings? = null private val problemsMap = mutableMapOf() - private val participantsByName = mutableMapOf() - private val participantsById = mutableMapOf() + private val participantsByCdsId = mutableMapOf() private var nextParticipantId = 1 private var contestType: CFContestType = CFContestType.ICPC private var name: String = "" @@ -26,12 +25,10 @@ class CFContestInfo { private fun updateContestInfo(contest: CFContest) { name = contest.name contestType = contest.type - contestLength = contest.durationSeconds!! - val phase = contest.phase - startTime = contest.startTimeSeconds - ?.let { Instant.fromEpochSeconds(it) } + contestLength = contest.duration!! + startTime = contest.startTime ?: Instant.DISTANT_FUTURE - status = when (phase) { + status = when (contest.phase) { CFContestPhase.BEFORE -> ContestStatus.BEFORE CFContestPhase.CODING -> ContestStatus.RUNNING else -> ContestStatus.OVER @@ -44,8 +41,8 @@ class CFContestInfo { if (problemsMap.isEmpty() && standings.problems.isNotEmpty()) { for ((id, problem) in standings.problems.withIndex()) { val problemInfo = ProblemInfo( - letter = problem.index, - name = problem.name!!, + displayName = problem.index, + fullName = problem.name!!, id = id, ordinal = id, contestSystemId = id.toString(), @@ -62,8 +59,8 @@ class CFContestInfo { } if (contestType == CFContestType.CF) { val hacksInfo = ProblemInfo( - letter = "*", - name = "Hacks", + displayName = "*", + fullName = "Hacks", id = -1, ordinal = -1, contestSystemId = "hacks", @@ -71,19 +68,26 @@ class CFContestInfo { maxScore = null, scoreMergeMode = ScoreMergeMode.SUM, ) - problemsMap[hacksInfo.letter] = hacksInfo + problemsMap[hacksInfo.displayName] = hacksInfo problems.add(hacksInfo) } } for (row in standings.rows) { - val teamInfo = CFTeamInfo(row) - if (participantsByName.containsKey(getName(row.party))) { - teamInfo.id = participantsByName[getName(row.party)]!!.id - } else { - teamInfo.id = nextParticipantId++ - } - participantsByName[getName(row.party)] = teamInfo - participantsById[teamInfo.id] = teamInfo + val cdsId = getTeamCdsId(row.party) + val id = participantsByCdsId[cdsId]?.id ?: nextParticipantId++ + val party = row.party + participantsByCdsId[cdsId] = TeamInfo( + id = id, + fullName = party.teamName ?: party.members[0].let { it.name ?: it.handle }, + displayName = party.teamName ?: party.members[0].let { it.name ?: it.handle }, + contestSystemId = cdsId, + groups = emptyList(), + hashTag = null, + medias = emptyMap(), + organizationId = null, + isHidden = false, + isOutOfContest = false + ) } } @@ -107,7 +111,7 @@ class CFContestInfo { CFSubmissionVerdict.REJECTED -> Verdict.Rejected null -> null }?.let { - if (passedTestCount == 0 && it.isAddingPenalty && !it.isAccepted) { + if (contestType == CFContestType.CF && passedTestCount == 0 && it.isAddingPenalty && !it.isAccepted) { Verdict.lookup(it.shortName, isAddingPenalty = false, isAccepted = false) } else { it @@ -162,7 +166,7 @@ class CFContestInfo { } return submissions.reversed().asSequence() .filter { it.author.participantType == CFPartyParticipantType.CONTESTANT } - .filter { participantsByName.containsKey(getName(it.author)) } + .filter { getTeamCdsId(it.author) in participantsByCdsId } .groupBy { it.author to it.problem } .mapValues {(_, submissions) -> var wrongs = 0 @@ -174,7 +178,7 @@ class CFContestInfo { id = it.id.toInt(), result = result, problemId = problemId, - teamId = participantsByName[getName(it.author)]!!.id, + teamId = participantsByCdsId[getTeamCdsId(it.author)]!!.id, percentage = if (result != null) 1.0 else (it.passedTestCount.toDouble() / problemTests), time = it.relativeTimeSeconds, ) @@ -209,7 +213,7 @@ class CFContestInfo { }, percentage = 0.0, problemId = -1, - teamId = participantsByName[getName(hack.hacker)]!!.id, + teamId = participantsByCdsId[getTeamCdsId(hack.hacker)]!!.id, time = hack.creationTimeSeconds - startTime ) ) @@ -225,7 +229,7 @@ class CFContestInfo { isHidden = hack.verdict != CFHackVerdict.HACK_SUCCESSFUL, percentage = 0.0, problemId = problemsMap[hack.problem.index]!!.id, - teamId = participantsByName[getName(hack.defender)]!!.id, + teamId = participantsByCdsId[getTeamCdsId(hack.defender)]!!.id, time = hack.creationTimeSeconds - startTime ) ) @@ -235,24 +239,30 @@ class CFContestInfo { } fun toApi() = ContestInfo( - name, - status, - when (contestType) { + name = name, + status = status, + resultType = when (contestType) { CFContestType.CF -> ContestResultType.IOI CFContestType.IOI -> ContestResultType.IOI CFContestType.ICPC -> ContestResultType.ICPC }, - startTime, - contestLength, - contestLength, - problems, - participantsById.values.map { it.toApi() }.sortedBy { it.id }, - groups = emptyList() + startTime = startTime, + contestLength = contestLength, + freezeTime = contestLength, + problemList = problems, + teamList = participantsByCdsId.values.sortedBy { it.id }, + groupList = emptyList(), + penaltyRoundingMode = when (contestType) { + CFContestType.CF -> PenaltyRoundingMode.ZERO + CFContestType.IOI -> PenaltyRoundingMode.ZERO + CFContestType.ICPC -> PenaltyRoundingMode.EACH_SUBMISSION_DOWN_TO_MINUTE + }, + organizationList = emptyList() ) companion object { - fun getName(party: CFParty): String { - return party.teamName ?: party.members[0].handle + fun getTeamCdsId(party: CFParty): String { + return party.teamId?.let { "team:${it}" } ?: party.members[0].handle } } } diff --git a/src/cds/src/main/kotlin/org/icpclive/cds/codeforces/CFDataSource.kt b/src/cds/src/main/kotlin/org/icpclive/cds/codeforces/CFDataSource.kt index b23898bc0..197451714 100644 --- a/src/cds/src/main/kotlin/org/icpclive/cds/codeforces/CFDataSource.kt +++ b/src/cds/src/main/kotlin/org/icpclive/cds/codeforces/CFDataSource.kt @@ -1,39 +1,68 @@ package org.icpclive.cds.codeforces +import kotlinx.datetime.Clock import org.icpclive.api.ContestStatus -import org.icpclive.cds.ContestParseResult -import org.icpclive.cds.FullReloadContestDataSource -import org.icpclive.cds.codeforces.api.CFApiCentral -import org.icpclive.cds.codeforces.api.data.* +import org.icpclive.cds.codeforces.api.data.CFHack +import org.icpclive.cds.codeforces.api.data.CFSubmission import org.icpclive.cds.codeforces.api.results.CFStandings import org.icpclive.cds.codeforces.api.results.CFStatusWrapper -import org.icpclive.cds.codeforces.api.results.CFSubmissionList -import org.icpclive.cds.common.jsonLoader -import org.icpclive.cds.common.map -import org.icpclive.util.getCredentials -import java.lang.IllegalStateException +import org.icpclive.cds.common.* +import org.icpclive.cds.settings.CFSettings +import java.security.MessageDigest import java.util.* +import kotlin.random.Random import kotlin.time.Duration.Companion.seconds -class CFDataSource(properties: Properties, creds: Map) : FullReloadContestDataSource(5.seconds) { +internal class CFDataSource(val settings: CFSettings, creds: Map) : FullReloadContestDataSource(5.seconds) { private val contestInfo = CFContestInfo() - private val contestId = properties.getProperty("contest_id").toInt() - private val central = CFApiCentral( - contestId, - properties.getCredentials(CF_API_KEY_PROPERTY_NAME, creds) ?: throw IllegalStateException("No Codeforces api key defined"), - properties.getCredentials(CF_API_SECRET_PROPERTY_NAME, creds) ?: throw IllegalStateException("No Codeforces api secret defined") - ) + private val apiKey = settings.apiKey.get(creds) + private val apiSecret = settings.apiSecret.get(creds) + private fun apiRequestUrl( + method: String, + params: Map + ): String { + val sortedParams = params.toSortedMap() + sortedParams["time"] = Clock.System.now().epochSeconds.toString() + sortedParams["apiKey"] = apiKey + val rand = (Random.nextInt(900000) + 100000).toString() + sortedParams["apiSig"] = rand + hash(sortedParams.toQuery("$rand/$method?", "#$apiSecret")) + return sortedParams.toQuery("https://codeforces.com/api/$method?") + } - private val standingsLoader = jsonLoader> { central.standingsUrl }.map { + private val standingsLoader = jsonLoader>(networkSettings = settings.network) { + apiRequestUrl( + "contest.standings", + mapOf( + "contestId" to settings.contestId.toString(), + "asManager" to settings.asManager.toString() + ) + ) + }.map { it.unwrap() } - private val statusLoader = jsonLoader> { central.statusUrl }.map { + private val statusLoader = jsonLoader>>(networkSettings = settings.network) { + apiRequestUrl( + "contest.status", + mapOf( + "contestId" to settings.contestId.toString(), + "asManager" to settings.asManager.toString() + ) + ) + }.map { it.unwrap() } - private val hacksLoader = jsonLoader>> { central.hacksUrl }.map { + private val hacksLoader = jsonLoader>>(networkSettings = settings.network) { + apiRequestUrl( + "contest.hacks", + mapOf( + "contestId" to settings.contestId.toString(), + "asManager" to settings.asManager.toString() + ) + ) + }.map { it.unwrap() } @@ -41,13 +70,20 @@ class CFDataSource(properties: Properties, creds: Map) : FullRel override suspend fun loadOnce(): ContestParseResult { // can change inside previous if, so we do recheck, not else. contestInfo.updateStandings(standingsLoader.load()) - val runs = if (contestInfo.status == ContestStatus.BEFORE) emptyList() else contestInfo.parseSubmissions(statusLoader.load().list) + val runs = if (contestInfo.status == ContestStatus.BEFORE) emptyList() else contestInfo.parseSubmissions(statusLoader.load()) val hacks = if (contestInfo.status == ContestStatus.BEFORE) emptyList() else contestInfo.parseHacks(hacksLoader.load()) return ContestParseResult(contestInfo.toApi(), runs + hacks, emptyList()) } companion object { - private const val CF_API_KEY_PROPERTY_NAME = "cf.api.key" - private const val CF_API_SECRET_PROPERTY_NAME = "cf.api.secret" + @OptIn(ExperimentalStdlibApi::class) + private fun hash(s: String): String = + MessageDigest.getInstance("SHA-512") + .digest(s.toByteArray()) + .toHexString() + private fun SortedMap.toQuery(prefix: String, postfix: String="") = + entries.joinToString(prefix = prefix, postfix = postfix, separator = "&") { + "${it.key}=${it.value}" + } } } diff --git a/src/cds/src/main/kotlin/org/icpclive/cds/codeforces/CFTeamInfo.kt b/src/cds/src/main/kotlin/org/icpclive/cds/codeforces/CFTeamInfo.kt deleted file mode 100644 index e6bf9b947..000000000 --- a/src/cds/src/main/kotlin/org/icpclive/cds/codeforces/CFTeamInfo.kt +++ /dev/null @@ -1,18 +0,0 @@ -package org.icpclive.cds.codeforces - -import org.icpclive.cds.codeforces.api.data.CFRankListRow - -class CFTeamInfo(private val row: CFRankListRow) { - var id = 0 - - fun toApi() = org.icpclive.api.TeamInfo( - id = id, - name = row.party.teamName ?: row.party.members[0].let { it.name ?: it.handle }, - shortName = row.party.teamName ?: row.party.members[0].let { it.name ?: it.handle }, - contestSystemId = row.party.teamName ?: row.party.members[0].handle, - groups = emptyList(), - hashTag = null, - medias = emptyMap() - ) - -} \ No newline at end of file diff --git a/src/cds/src/main/kotlin/org/icpclive/cds/codeforces/api/CFApiCentral.kt b/src/cds/src/main/kotlin/org/icpclive/cds/codeforces/api/CFApiCentral.kt deleted file mode 100644 index 4ec9196ac..000000000 --- a/src/cds/src/main/kotlin/org/icpclive/cds/codeforces/api/CFApiCentral.kt +++ /dev/null @@ -1,63 +0,0 @@ -package org.icpclive.cds.codeforces.api - -import java.nio.charset.StandardCharsets -import java.security.MessageDigest -import java.util.* -import kotlin.random.Random - -/** - * @author egor@egork.net - */ -class CFApiCentral( - private val contestId: Int, - private val apiKey: String, - private val apiSecret: String,) { - - val standingsUrl: String - get() = apiRequestUrl("contest.standings", mapOf("contestId" to contestId.toString())) - val statusUrl: String - get() = apiRequestUrl("contest.status", mapOf("contestId" to contestId.toString())) - val hacksUrl: String - get() = apiRequestUrl("contest.hacks", mapOf("contestId" to contestId.toString())) - val contestListUrl: String - get() = apiRequestUrl("contest.list", emptyMap()) - - - private fun apiRequestUrl( - method: String, - params: Map - ): String { - val sortedParams: SortedMap = TreeMap(params) - val time = System.currentTimeMillis() / 1000 - sortedParams["time"] = time.toString() - sortedParams["apiKey"] = apiKey - val rand = (Random.nextInt(900000) + 100000).toString() - val toHash = StringBuilder(rand).append("/").append(method).append("?") - for ((key, value) in sortedParams) { - toHash.append(key).append("=").append(value).append("&") - } - toHash.deleteCharAt(toHash.length - 1).append("#").append(apiSecret) - sortedParams["apiSig"] = rand + hash(toHash.toString()) - return buildString { - append("https://codeforces.com/api/") - append(method) - append("?") - for ((key, value) in sortedParams) { - append(key) - append("=") - append(value) - append("&") - } - deleteCharAt(length - 1) - } - } - - companion object { - private fun hash(s: String): String { - val messageDigest = MessageDigest.getInstance("SHA-512") - return messageDigest.digest(s.toByteArray(StandardCharsets.UTF_8)).joinToString("") { - Integer.toHexString(it.toInt() and 0xff or 0x100).substring(1) - } - } - } -} \ No newline at end of file diff --git a/src/cds/src/main/kotlin/org/icpclive/cds/codeforces/api/data/CFContest.kt b/src/cds/src/main/kotlin/org/icpclive/cds/codeforces/api/data/CFContest.kt index 94425b5f1..4f1e96585 100644 --- a/src/cds/src/main/kotlin/org/icpclive/cds/codeforces/api/data/CFContest.kt +++ b/src/cds/src/main/kotlin/org/icpclive/cds/codeforces/api/data/CFContest.kt @@ -2,30 +2,37 @@ package org.icpclive.cds.codeforces.api.data +import kotlinx.datetime.Instant +import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable import org.icpclive.util.DurationInSecondsSerializer +import org.icpclive.util.UnixSecondsSerializer import kotlin.time.Duration -enum class CFContestType { +internal enum class CFContestType { CF, IOI, ICPC } -enum class CFContestPhase { +internal enum class CFContestPhase { BEFORE, CODING, PENDING_SYSTEM_TEST, SYSTEM_TEST, FINISHED } @Serializable -data class CFContest( +internal data class CFContest( val id: Int, val name: String, val type: CFContestType, val phase: CFContestPhase, val frozen: Boolean, @Serializable(DurationInSecondsSerializer::class) - val durationSeconds: Duration? = null, - val startTimeSeconds: Long? = null, + @SerialName("durationSeconds") + val duration: Duration? = null, + @Serializable(UnixSecondsSerializer::class) + @SerialName("startTimeSeconds") + val startTime: Instant? = null, @Serializable(DurationInSecondsSerializer::class) - val relativeTimeSeconds: Duration? = null, + @SerialName("relativeTimeSeconds") + val relativeTime: Duration? = null, val preparedBy: String? = null, val websiteUrl: String? = null, val description: String? = null, diff --git a/src/cds/src/main/kotlin/org/icpclive/cds/codeforces/api/data/CFHack.kt b/src/cds/src/main/kotlin/org/icpclive/cds/codeforces/api/data/CFHack.kt index 6b760af19..0587d564a 100644 --- a/src/cds/src/main/kotlin/org/icpclive/cds/codeforces/api/data/CFHack.kt +++ b/src/cds/src/main/kotlin/org/icpclive/cds/codeforces/api/data/CFHack.kt @@ -4,12 +4,12 @@ import kotlinx.datetime.Instant import kotlinx.serialization.Serializable import org.icpclive.util.UnixSecondsSerializer -enum class CFHackVerdict { +internal enum class CFHackVerdict { HACK_SUCCESSFUL, HACK_UNSUCCESSFUL, INVALID_INPUT, GENERATOR_INCOMPILABLE, GENERATOR_CRASHED, IGNORED, TESTING, OTHER } @Serializable -data class CFHack( +internal data class CFHack( val id:Int, @Serializable(UnixSecondsSerializer::class) val creationTimeSeconds: Instant, diff --git a/src/cds/src/main/kotlin/org/icpclive/cds/codeforces/api/data/CFMember.kt b/src/cds/src/main/kotlin/org/icpclive/cds/codeforces/api/data/CFMember.kt index 5ac732978..6620a0a60 100644 --- a/src/cds/src/main/kotlin/org/icpclive/cds/codeforces/api/data/CFMember.kt +++ b/src/cds/src/main/kotlin/org/icpclive/cds/codeforces/api/data/CFMember.kt @@ -3,7 +3,7 @@ package org.icpclive.cds.codeforces.api.data import kotlinx.serialization.Serializable @Serializable -data class CFMember( +internal data class CFMember( val handle: String, val name: String? = null, ) \ No newline at end of file diff --git a/src/cds/src/main/kotlin/org/icpclive/cds/codeforces/api/data/CFParty.kt b/src/cds/src/main/kotlin/org/icpclive/cds/codeforces/api/data/CFParty.kt index a651c26e7..845996191 100644 --- a/src/cds/src/main/kotlin/org/icpclive/cds/codeforces/api/data/CFParty.kt +++ b/src/cds/src/main/kotlin/org/icpclive/cds/codeforces/api/data/CFParty.kt @@ -4,12 +4,12 @@ package org.icpclive.cds.codeforces.api.data import kotlinx.serialization.Serializable -enum class CFPartyParticipantType { +internal enum class CFPartyParticipantType { CONTESTANT, PRACTICE, VIRTUAL, MANAGER, OUT_OF_COMPETITION } @Serializable -data class CFParty( +internal data class CFParty( val contestId: Int? = null, val members: List, val participantType: CFPartyParticipantType, diff --git a/src/cds/src/main/kotlin/org/icpclive/cds/codeforces/api/data/CFProblem.kt b/src/cds/src/main/kotlin/org/icpclive/cds/codeforces/api/data/CFProblem.kt index de8c28e8f..bf4ca15b9 100644 --- a/src/cds/src/main/kotlin/org/icpclive/cds/codeforces/api/data/CFProblem.kt +++ b/src/cds/src/main/kotlin/org/icpclive/cds/codeforces/api/data/CFProblem.kt @@ -4,13 +4,13 @@ package org.icpclive.cds.codeforces.api.data import kotlinx.serialization.Serializable -enum class CFProblemType { +internal enum class CFProblemType { PROGRAMMING, QUESTION } @Serializable -data class CFProblem( +internal data class CFProblem( val contestId: Int, val problemsetName: String? = null, val index: String, diff --git a/src/cds/src/main/kotlin/org/icpclive/cds/codeforces/api/data/CFProblemResult.kt b/src/cds/src/main/kotlin/org/icpclive/cds/codeforces/api/data/CFProblemResult.kt index 307867cb9..ae1815527 100644 --- a/src/cds/src/main/kotlin/org/icpclive/cds/codeforces/api/data/CFProblemResult.kt +++ b/src/cds/src/main/kotlin/org/icpclive/cds/codeforces/api/data/CFProblemResult.kt @@ -4,12 +4,12 @@ package org.icpclive.cds.codeforces.api.data import kotlinx.serialization.Serializable -enum class CFProblemResultType { +internal enum class CFProblemResultType { PRELIMINARY, FINAL } @Serializable -data class CFProblemResult( +internal data class CFProblemResult( val points: Double, val penalty: Int? = null, val rejectedAttemptCount: Int, diff --git a/src/cds/src/main/kotlin/org/icpclive/cds/codeforces/api/data/CFRankListRow.kt b/src/cds/src/main/kotlin/org/icpclive/cds/codeforces/api/data/CFRankListRow.kt index 1c5730c02..63278899c 100644 --- a/src/cds/src/main/kotlin/org/icpclive/cds/codeforces/api/data/CFRankListRow.kt +++ b/src/cds/src/main/kotlin/org/icpclive/cds/codeforces/api/data/CFRankListRow.kt @@ -3,7 +3,7 @@ package org.icpclive.cds.codeforces.api.data import kotlinx.serialization.Serializable @Serializable -data class CFRankListRow( +internal data class CFRankListRow( val party: CFParty, val rank: Int, val points: Double, diff --git a/src/cds/src/main/kotlin/org/icpclive/cds/codeforces/api/data/CFSubmission.kt b/src/cds/src/main/kotlin/org/icpclive/cds/codeforces/api/data/CFSubmission.kt index 50aa6210a..ea4b4a7a2 100644 --- a/src/cds/src/main/kotlin/org/icpclive/cds/codeforces/api/data/CFSubmission.kt +++ b/src/cds/src/main/kotlin/org/icpclive/cds/codeforces/api/data/CFSubmission.kt @@ -6,16 +6,16 @@ import kotlinx.serialization.Serializable import org.icpclive.util.DurationInSecondsSerializer import kotlin.time.Duration -enum class CFSubmissionVerdict { +internal enum class CFSubmissionVerdict { FAILED, OK, PARTIAL, COMPILATION_ERROR, RUNTIME_ERROR, WRONG_ANSWER, PRESENTATION_ERROR, TIME_LIMIT_EXCEEDED, MEMORY_LIMIT_EXCEEDED, IDLENESS_LIMIT_EXCEEDED, SECURITY_VIOLATED, CRASHED, INPUT_PREPARATION_CRASHED, CHALLENGED, SKIPPED, TESTING, REJECTED } -enum class CFSubmissionTestSet { +internal enum class CFSubmissionTestSet { SAMPLES, PRETESTS, TESTS, CHALLENGES, TESTS1, TESTS2, TESTS3, TESTS4, TESTS5, TESTS6, TESTS7, TESTS8, TESTS9, TESTS10 } @Serializable -data class CFSubmission( +internal data class CFSubmission( val id: Long, val contestId: Int? = null, val creationTimeSeconds: Long, diff --git a/src/cds/src/main/kotlin/org/icpclive/cds/codeforces/api/results/CFStandings.kt b/src/cds/src/main/kotlin/org/icpclive/cds/codeforces/api/results/CFStandings.kt index c16f02004..f823c8980 100644 --- a/src/cds/src/main/kotlin/org/icpclive/cds/codeforces/api/results/CFStandings.kt +++ b/src/cds/src/main/kotlin/org/icpclive/cds/codeforces/api/results/CFStandings.kt @@ -1,12 +1,10 @@ package org.icpclive.cds.codeforces.api.results import kotlinx.serialization.Serializable -import org.icpclive.cds.codeforces.api.data.CFContest -import org.icpclive.cds.codeforces.api.data.CFProblem -import org.icpclive.cds.codeforces.api.data.CFRankListRow +import org.icpclive.cds.codeforces.api.data.* @Serializable -data class CFStandings( +internal data class CFStandings( val contest: CFContest, val problems: List, val rows: List, diff --git a/src/cds/src/main/kotlin/org/icpclive/cds/codeforces/api/results/CFStatusWrapper.kt b/src/cds/src/main/kotlin/org/icpclive/cds/codeforces/api/results/CFStatusWrapper.kt index c3adde72b..0195f31c3 100644 --- a/src/cds/src/main/kotlin/org/icpclive/cds/codeforces/api/results/CFStatusWrapper.kt +++ b/src/cds/src/main/kotlin/org/icpclive/cds/codeforces/api/results/CFStatusWrapper.kt @@ -4,7 +4,7 @@ import kotlinx.serialization.Serializable import java.io.IOException @Serializable -class CFStatusWrapper(val status: String, val comment: String? = null, val result: T? = null) { +internal class CFStatusWrapper(val status: String, val comment: String? = null, val result: T? = null) { fun unwrap() : T { if (status != "OK") throw IOException("Error from codeforces: $comment") return result!! diff --git a/src/cds/src/main/kotlin/org/icpclive/cds/codeforces/api/results/CFSubmissionList.kt b/src/cds/src/main/kotlin/org/icpclive/cds/codeforces/api/results/CFSubmissionList.kt deleted file mode 100644 index 282440e7c..000000000 --- a/src/cds/src/main/kotlin/org/icpclive/cds/codeforces/api/results/CFSubmissionList.kt +++ /dev/null @@ -1,9 +0,0 @@ -package org.icpclive.cds.codeforces.api.results - -import kotlinx.serialization.Serializable -import org.icpclive.cds.codeforces.api.data.CFSubmission - - -@JvmInline -@Serializable -value class CFSubmissionList(val list: List) diff --git a/src/cds/src/main/kotlin/org/icpclive/cds/common/ContestDataSource.kt b/src/cds/src/main/kotlin/org/icpclive/cds/common/ContestDataSource.kt new file mode 100644 index 000000000..2fa1ccb7f --- /dev/null +++ b/src/cds/src/main/kotlin/org/icpclive/cds/common/ContestDataSource.kt @@ -0,0 +1,8 @@ +package org.icpclive.cds.common + +import kotlinx.coroutines.flow.Flow +import org.icpclive.cds.ContestUpdate + +internal interface ContestDataSource { + fun getFlow(): Flow +} \ No newline at end of file diff --git a/src/cds/src/main/kotlin/org/icpclive/cds/common/ContestParseResult.kt b/src/cds/src/main/kotlin/org/icpclive/cds/common/ContestParseResult.kt new file mode 100644 index 000000000..63890457c --- /dev/null +++ b/src/cds/src/main/kotlin/org/icpclive/cds/common/ContestParseResult.kt @@ -0,0 +1,11 @@ +package org.icpclive.cds.common + +import kotlinx.serialization.Serializable +import org.icpclive.api.* + +@Serializable +internal data class ContestParseResult( + val contestInfo: ContestInfo, + val runs: List, + val analyticsMessages: List +) \ No newline at end of file diff --git a/src/cds/src/main/kotlin/org/icpclive/cds/common/DataLoader.kt b/src/cds/src/main/kotlin/org/icpclive/cds/common/DataLoader.kt index d76bcc72b..3e02afab8 100644 --- a/src/cds/src/main/kotlin/org/icpclive/cds/common/DataLoader.kt +++ b/src/cds/src/main/kotlin/org/icpclive/cds/common/DataLoader.kt @@ -3,22 +3,23 @@ package org.icpclive.cds.common import io.ktor.client.call.* import io.ktor.client.request.* import io.ktor.client.statement.* -import kotlinx.serialization.decodeFromString import kotlinx.serialization.json.Json +import org.icpclive.cds.settings.NetworkSettings import org.w3c.dom.Document import java.nio.file.Paths import javax.xml.parsers.DocumentBuilder import javax.xml.parsers.DocumentBuilderFactory -interface DataLoader { +internal interface DataLoader { suspend fun load(): T } -class StringLoader( +internal class StringLoader( + networkSettings: NetworkSettings?, auth: ClientAuth?, val computeURL: () -> String ) : DataLoader { - private val httpClient = defaultHttpClient(auth) + private val httpClient = defaultHttpClient(auth, networkSettings) override suspend fun load(): String { val url = computeURL() @@ -31,11 +32,12 @@ class StringLoader( } } -class ByteArrayLoader( +internal class ByteArrayLoader( + networkSettings: NetworkSettings?, auth: ClientAuth?, val computeURL: () -> String ) : DataLoader { - private val httpClient = defaultHttpClient(auth) + private val httpClient = defaultHttpClient(auth, networkSettings) override suspend fun load(): ByteArray { val url = computeURL() @@ -49,19 +51,23 @@ class ByteArrayLoader( } -fun xmlLoader(auth: ClientAuth? = null, url: () -> String): DataLoader { +internal fun xmlLoader(networkSettings: NetworkSettings?, auth: ClientAuth? = null, url: () -> String): DataLoader { val builder: DocumentBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder() - return StringLoader(auth, url) + return StringLoader(networkSettings, auth, url) .map { builder.parse(it.byteInputStream()) } } -inline fun jsonLoader(auth: ClientAuth? = null, noinline url: () -> String) : DataLoader { +internal inline fun jsonLoader( + networkSettings: NetworkSettings?, + auth: ClientAuth? = null, + noinline url: () -> String +) : DataLoader { val json = Json { ignoreUnknownKeys = true } - return StringLoader(auth, url) + return StringLoader(networkSettings, auth, url) .map { json.decodeFromString(it) } } -fun DataLoader.map(f: suspend (T) -> R) = object : DataLoader { +internal fun DataLoader.map(f: suspend (T) -> R) = object : DataLoader { override suspend fun load() = f(this@map.load()) } \ No newline at end of file diff --git a/src/cds/src/main/kotlin/org/icpclive/cds/common/FullReloadContestDataSource.kt b/src/cds/src/main/kotlin/org/icpclive/cds/common/FullReloadContestDataSource.kt new file mode 100644 index 000000000..520cb1e8c --- /dev/null +++ b/src/cds/src/main/kotlin/org/icpclive/cds/common/FullReloadContestDataSource.kt @@ -0,0 +1,36 @@ +package org.icpclive.cds.common + +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.flow.* +import org.icpclive.api.ContestStatus +import org.icpclive.cds.* +import org.icpclive.util.getLogger +import org.icpclive.util.loopFlow +import kotlin.time.Duration + +internal abstract class FullReloadContestDataSource(val interval: Duration) : ContestDataSource { + abstract suspend fun loadOnce(): ContestParseResult + + var isOver = false + + override fun getFlow() = loopFlow( + interval, + { getLogger(FullReloadContestDataSource::class).error("Failed to reload data, retrying", it) } + ) { + loadOnce() + }.flowOn(Dispatchers.IO) + .conflate() + .transform { + if (!isOver && it.contestInfo.status == ContestStatus.OVER) { + emit(InfoUpdate(it.contestInfo.copy(status = ContestStatus.RUNNING))) + } else { + emit(InfoUpdate(it.contestInfo)) + } + it.runs.forEach { run -> emit(RunUpdate(run)) } + it.analyticsMessages.forEach { msg -> emit(AnalyticsUpdate(msg)) } + if (!isOver && it.contestInfo.status == ContestStatus.OVER) { + isOver = true + emit(InfoUpdate(it.contestInfo)) + } + } +} \ No newline at end of file diff --git a/src/cds/src/main/kotlin/org/icpclive/cds/common/LineStreamLoaderService.kt b/src/cds/src/main/kotlin/org/icpclive/cds/common/LineStreamLoaderService.kt index dadf4bdb9..444bcbaff 100644 --- a/src/cds/src/main/kotlin/org/icpclive/cds/common/LineStreamLoaderService.kt +++ b/src/cds/src/main/kotlin/org/icpclive/cds/common/LineStreamLoaderService.kt @@ -5,13 +5,15 @@ import io.ktor.client.request.* import io.ktor.client.statement.* import io.ktor.http.* import io.ktor.utils.io.* -import kotlinx.coroutines.flow.* -import kotlinx.coroutines.* +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.flow.flow +import kotlinx.coroutines.flow.flowOn +import org.icpclive.cds.settings.NetworkSettings import org.icpclive.util.getLogger import java.nio.file.Paths -fun getLineStreamLoaderFlow(url: String, auth: ClientAuth?) = flow { - val httpClient = defaultHttpClient(auth) +internal fun getLineStreamLoaderFlow(networkSettings: NetworkSettings?, auth: ClientAuth?, url: String) = flow { + val httpClient = defaultHttpClient(auth, networkSettings) if (!isHttpUrl(url)) { Paths.get(url).toFile().useLines { lines -> lines.forEach { emit(it) } @@ -39,5 +41,5 @@ fun getLineStreamLoaderFlow(url: String, auth: ClientAuth?) = flow { } }.flowOn(Dispatchers.IO) -object LineStreamLoaderService -val logger = getLogger(LineStreamLoaderService::class) \ No newline at end of file +private object LineStreamLoaderService +private val logger = getLogger(LineStreamLoaderService::class) \ No newline at end of file diff --git a/src/cds/src/main/kotlin/org/icpclive/cds/common/NetworkUtils.kt b/src/cds/src/main/kotlin/org/icpclive/cds/common/NetworkUtils.kt index f630f65f2..e2941371d 100644 --- a/src/cds/src/main/kotlin/org/icpclive/cds/common/NetworkUtils.kt +++ b/src/cds/src/main/kotlin/org/icpclive/cds/common/NetworkUtils.kt @@ -6,15 +6,19 @@ import io.ktor.client.plugins.* import io.ktor.client.plugins.auth.* import io.ktor.client.plugins.auth.providers.* import io.ktor.client.request.* +import org.icpclive.cds.settings.NetworkSettings +import io.ktor.http.* import java.security.cert.X509Certificate import javax.net.ssl.X509TrustManager -sealed class ClientAuth { +internal sealed class ClientAuth { class Basic(val login: String, val password: String) : ClientAuth() class OAuth(val token: String) : ClientAuth() + class CookieAuth(val name: String, val value: String): ClientAuth() + companion object { fun BasicOrNull(login: String?, password: String?) = if (login != null && password != null) { Basic(login, password) @@ -24,7 +28,7 @@ sealed class ClientAuth { } } -fun HttpClientConfig<*>.setupAuth(auth: ClientAuth) { +internal fun HttpClientConfig<*>.setupAuth(auth: ClientAuth) { when (auth) { is ClientAuth.Basic -> { install(Auth) { @@ -37,20 +41,21 @@ fun HttpClientConfig<*>.setupAuth(auth: ClientAuth) { is ClientAuth.OAuth -> { defaultRequest { - header("Authorization", "OAuth ${auth.token}") + header(HttpHeaders.Authorization, "OAuth ${auth.token}") } } - } -} - -private var allowUnsecure = false -fun setAllowUnsecureConnections(value: Boolean) { - allowUnsecure = value + is ClientAuth.CookieAuth -> { + defaultRequest { + header(HttpHeaders.Cookie, "${auth.name}=${auth.value}") + } + } + } } -fun defaultHttpClient( +internal fun defaultHttpClient( auth: ClientAuth?, + networkSettings: NetworkSettings?, block: HttpClientConfig.() -> Unit = {} ) = HttpClient(CIO) { install(HttpTimeout) @@ -60,7 +65,7 @@ fun defaultHttpClient( engine { threadsCount = 2 https { - if (allowUnsecure) { + if (networkSettings?.allowUnsecureConnections == true) { trustManager = object : X509TrustManager { override fun getAcceptedIssuers() = null override fun checkClientTrusted(certs: Array, authType: String?) {} @@ -73,4 +78,4 @@ fun defaultHttpClient( } -fun isHttpUrl(text: String) = text.startsWith("http://") || text.startsWith("https://") +internal fun isHttpUrl(text: String) = text.startsWith("http://") || text.startsWith("https://") diff --git a/src/cds/src/main/kotlin/org/icpclive/cds/ejudge/EjudgeDataSource.kt b/src/cds/src/main/kotlin/org/icpclive/cds/ejudge/EjudgeDataSource.kt index 9e866cd61..a499a7e9b 100644 --- a/src/cds/src/main/kotlin/org/icpclive/cds/ejudge/EjudgeDataSource.kt +++ b/src/cds/src/main/kotlin/org/icpclive/cds/ejudge/EjudgeDataSource.kt @@ -1,24 +1,18 @@ package org.icpclive.cds.ejudge -import kotlinx.datetime.Instant +import kotlinx.datetime.* import org.icpclive.api.* -import org.icpclive.cds.ContestParseResult -import org.icpclive.cds.FullReloadContestDataSource -import org.icpclive.cds.common.xmlLoader -import org.icpclive.util.child -import org.icpclive.util.children -import org.icpclive.util.guessDatetimeFormat +import org.icpclive.cds.common.* +import org.icpclive.cds.settings.EjudgeSettings +import org.icpclive.util.* import org.w3c.dom.Element -import java.util.* +import java.time.format.DateTimeFormatter import kotlin.time.Duration import kotlin.time.Duration.Companion.hours import kotlin.time.Duration.Companion.nanoseconds import kotlin.time.Duration.Companion.seconds -class EjudgeDataSource(val properties: Properties) : FullReloadContestDataSource(5.seconds) { - val resultType = - ContestResultType.valueOf(properties.getProperty("standings.resultType", "ICPC").uppercase()) - +internal class EjudgeDataSource(val settings: EjudgeSettings) : FullReloadContestDataSource(5.seconds) { override suspend fun loadOnce(): ContestParseResult { val element = xmlLoader.load() return parseContestInfo(element.documentElement) @@ -28,14 +22,14 @@ class EjudgeDataSource(val properties: Properties) : FullReloadContestDataSource .child("problems") .children().mapIndexed { index, element -> ProblemInfo( - letter = element.getAttribute("short_name"), - name = element.getAttribute("long_name"), + displayName = element.getAttribute("short_name"), + fullName = element.getAttribute("long_name"), id = element.getAttribute("id").toInt(), ordinal = index, contestSystemId = element.getAttribute("id"), - minScore = if (resultType == ContestResultType.IOI) 0.0 else null, - maxScore = if (resultType == ContestResultType.IOI) 100.0 else null, - scoreMergeMode = if (resultType == ContestResultType.IOI) ScoreMergeMode.MAX_TOTAL else null + minScore = if (settings.resultType == ContestResultType.IOI) 0.0 else null, + maxScore = if (settings.resultType == ContestResultType.IOI) 100.0 else null, + scoreMergeMode = if (settings.resultType == ContestResultType.IOI) ScoreMergeMode.MAX_TOTAL else null ) }.toList() @@ -45,20 +39,25 @@ class EjudgeDataSource(val properties: Properties) : FullReloadContestDataSource val participantName = participant.getAttribute("name") TeamInfo( id = index, - name = participantName, - shortName = participantName, + fullName = participantName, + displayName = participantName, contestSystemId = participant.getAttribute("id"), groups = listOf(), hashTag = null, - medias = emptyMap() + medias = emptyMap(), + isOutOfContest = false, + isHidden = false, + organizationId = null ) }.toList() + val timePattern = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss") private fun parseEjudgeTime(time: String): Instant { - val formattedTime = time - .replace("/", "-") - .replace(" ", "T") - return guessDatetimeFormat(formattedTime) + return java.time.LocalDateTime.parse( + time.replace("/", "-"), // snark's ejudge uses '/' instead of '-' + timePattern + ).toKotlinLocalDateTime() + .toInstant(settings.timeZone) } private fun parseContestInfo(element: Element): ContestParseResult { @@ -69,13 +68,9 @@ class EjudgeDataSource(val properties: Properties) : FullReloadContestDataSource val currentTime = parseEjudgeTime(element.getAttribute("current_time")) val name = element.child("name").textContent - val status = when { - currentTime >= startTime + contestLength -> ContestStatus.OVER - currentTime < startTime -> ContestStatus.BEFORE - else -> ContestStatus.RUNNING - } + val status = ContestStatus.byCurrentTime(startTime, contestLength) - var freezeTime = if (resultType == ContestResultType.ICPC) 4.hours else contestLength + var freezeTime = if (settings.resultType == ContestResultType.ICPC) 4.hours else contestLength if (element.hasAttribute("fog_time")) { freezeTime = contestLength - element.getAttribute("fog_time").toLong().seconds } @@ -87,18 +82,23 @@ class EjudgeDataSource(val properties: Properties) : FullReloadContestDataSource contestInfo = ContestInfo( name = name, status = status, - resultType = resultType, + resultType = settings.resultType, startTime = startTime, contestLength = contestLength, freezeTime = freezeTime, - problems = parseProblemsInfo(element), - teams = teams, - groups = emptyList() + problemList = parseProblemsInfo(element), + teamList = teams, + groupList = emptyList(), + organizationList = emptyList(), + penaltyRoundingMode = when (settings.resultType) { + ContestResultType.IOI -> PenaltyRoundingMode.ZERO + ContestResultType.ICPC -> PenaltyRoundingMode.EACH_SUBMISSION_DOWN_TO_MINUTE + } ), runs = element.child("runs").children().mapNotNull { run -> parseRunInfo(run, currentTime - startTime, teamIdMapping) }.toList(), - emptyList() + emptyList(), ) } @@ -137,7 +137,7 @@ class EjudgeDataSource(val properties: Properties) : FullReloadContestDataSource return RunInfo( id = runId, - when (resultType) { + when (settings.resultType) { ContestResultType.ICPC -> result?.toRunResult() ContestResultType.IOI -> { @@ -154,5 +154,5 @@ class EjudgeDataSource(val properties: Properties) : FullReloadContestDataSource ) } - private val xmlLoader = xmlLoader { properties.getProperty("url") } + private val xmlLoader = xmlLoader(networkSettings = settings.network) { settings.url } } diff --git a/src/cds/src/main/kotlin/org/icpclive/cds/krsu/KRSUDataSource.kt b/src/cds/src/main/kotlin/org/icpclive/cds/krsu/KRSUDataSource.kt index c8611f3ce..209eef59a 100644 --- a/src/cds/src/main/kotlin/org/icpclive/cds/krsu/KRSUDataSource.kt +++ b/src/cds/src/main/kotlin/org/icpclive/cds/krsu/KRSUDataSource.kt @@ -1,26 +1,15 @@ package org.icpclive.cds.krsu -import kotlinx.datetime.Clock -import kotlinx.datetime.Instant -import kotlinx.serialization.KSerializer +import kotlinx.datetime.LocalDateTime +import kotlinx.datetime.toInstant import kotlinx.serialization.Serializable -import kotlinx.serialization.descriptors.PrimitiveKind -import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor -import kotlinx.serialization.descriptors.SerialDescriptor -import kotlinx.serialization.encoding.Decoder -import kotlinx.serialization.encoding.Encoder import org.icpclive.api.* -import org.icpclive.cds.ContestParseResult -import org.icpclive.cds.FullReloadContestDataSource -import org.icpclive.cds.common.jsonLoader -import org.icpclive.util.getLogger -import java.util.* -import kotlin.time.Duration +import org.icpclive.cds.common.* +import org.icpclive.cds.settings.KRSUSettings import kotlin.time.Duration.Companion.hours import kotlin.time.Duration.Companion.seconds -class KRSUDataSource(val properties: Properties) : FullReloadContestDataSource(5.seconds) { - +internal class KRSUDataSource(val settings: KRSUSettings) : FullReloadContestDataSource(5.seconds) { override suspend fun loadOnce() = parseAndUpdateStandings( contestInfoLoader.load(), submissionsLoader.load() ) @@ -29,14 +18,12 @@ class KRSUDataSource(val properties: Properties) : FullReloadContestDataSource(5 var lastTeamId: Int = 0 private fun parseAndUpdateStandings(contest: Contest, submissions: List): ContestParseResult { - val timezoneShift = Duration.parse(properties.getProperty("timezone-shift")) - - val startTime = contest.StartTime - timezoneShift + val startTime = contest.StartTime.toInstant(settings.timeZone) val problemsList = contest.ProblemSet.mapIndexed { index, it -> ProblemInfo( - letter = "" + ('A' + index), - name = "" + ('A' + index), + displayName = "" + ('A' + index), + fullName = "" + ('A' + index), id = it.Problem, ordinal = index, contestSystemId = index.toString(), @@ -49,12 +36,15 @@ class KRSUDataSource(val properties: Properties) : FullReloadContestDataSource(5 teams[submission.Login] = TeamInfo( id = lastTeamId++, - name = submission.AuthorName, - shortName = submission.AuthorName, + fullName = submission.AuthorName, + displayName = submission.AuthorName, contestSystemId = submission.Login, groups = emptyList(), hashTag = null, - medias = emptyMap() + medias = emptyMap(), + isOutOfContest = false, + isHidden = false, + organizationId = null ) } } @@ -62,44 +52,39 @@ class KRSUDataSource(val properties: Properties) : FullReloadContestDataSource(5 val freezeTime = contestLength - 1.hours val runs = submissions.map { val result = outcomeMap[it.StatusName] - logger.info("" + (it.ReceivedTime - startTime)) RunInfo( id = it.Id, result?.toRunResult(), problemId = it.Problem, teamId = teams[it.Login]?.id ?: -1, percentage = if (result == null) 0.0 else 1.0, - time = (it.ReceivedTime - timezoneShift) - startTime, + time = (it.ReceivedTime.toInstant(settings.timeZone)) - startTime, ) }.toList() - val time = Clock.System.now() - startTime return ContestParseResult( ContestInfo( name = "", - status = when { - time < Duration.ZERO -> ContestStatus.BEFORE - time < contestLength -> ContestStatus.RUNNING - else -> ContestStatus.OVER - }, + status = ContestStatus.byCurrentTime(startTime, contestLength), resultType = ContestResultType.ICPC, startTime = startTime, contestLength = contestLength, freezeTime = freezeTime, - problems = problemsList, - teams = teams.values.toList(), - groups = emptyList() + problemList = problemsList, + teamList = teams.values.toList(), + groupList = emptyList(), + organizationList = emptyList(), + penaltyRoundingMode = PenaltyRoundingMode.EACH_SUBMISSION_DOWN_TO_MINUTE ), runs, emptyList() ) } - private val submissionsLoader = jsonLoader> { properties.getProperty("submissions-url") } - private val contestInfoLoader = jsonLoader { properties.getProperty("contest-url") } + private val submissionsLoader = jsonLoader>(networkSettings = settings.network) { settings.submissionsUrl } + private val contestInfoLoader = jsonLoader(networkSettings = settings.network) { settings.contestUrl } companion object { - private val logger = getLogger(KRSUDataSource::class) private val outcomeMap = mapOf( "InternalError" to Verdict.Fail, "Compile Error" to Verdict.CompilationError, @@ -125,8 +110,7 @@ class KRSUDataSource(val properties: Properties) : FullReloadContestDataSource(5 val Status: Int, val StatusName: String, val TestPassed: Int, - @Serializable(with = TimeSerializer::class) - val ReceivedTime: Instant, + val ReceivedTime: LocalDateTime, val AuthorName: String, ) @@ -135,8 +119,7 @@ class KRSUDataSource(val properties: Properties) : FullReloadContestDataSource(5 class Contest( val Id: Int, val ProblemSet: List, - @Serializable(with = TimeSerializer::class) - val StartTime: Instant, + val StartTime: LocalDateTime, val Length: Int ) @@ -146,18 +129,5 @@ class KRSUDataSource(val properties: Properties) : FullReloadContestDataSource(5 val Letter: Int, val Problem: Int ) - - class TimeSerializer : KSerializer { - override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor("krsu time", PrimitiveKind.STRING) - - override fun deserialize(decoder: Decoder): Instant { - return Instant.parse(decoder.decodeString() + "Z") - } - - override fun serialize(encoder: Encoder, value: Instant) { - TODO("Not yet implemented") - } - - } } diff --git a/src/cds/src/main/kotlin/org/icpclive/cds/noop/NoopDataSource.kt b/src/cds/src/main/kotlin/org/icpclive/cds/noop/NoopDataSource.kt index 0de30b58c..429b55816 100644 --- a/src/cds/src/main/kotlin/org/icpclive/cds/noop/NoopDataSource.kt +++ b/src/cds/src/main/kotlin/org/icpclive/cds/noop/NoopDataSource.kt @@ -1,12 +1,15 @@ package org.icpclive.cds.noop -import kotlinx.coroutines.flow.* +import kotlinx.coroutines.flow.first +import kotlinx.coroutines.flow.flowOf import kotlinx.datetime.Instant import org.icpclive.api.* -import org.icpclive.cds.* +import org.icpclive.cds.InfoUpdate +import org.icpclive.cds.common.* +import org.icpclive.cds.common.ContestDataSource import kotlin.time.Duration -class NoopDataSource : RawContestDataSource { +internal class NoopDataSource : ContestDataSource { override fun getFlow() = flowOf( InfoUpdate(ContestInfo( @@ -15,16 +18,12 @@ class NoopDataSource : RawContestDataSource { startTime = Instant.DISTANT_FUTURE, contestLength = Duration.ZERO, freezeTime = Duration.ZERO, - problems = emptyList(), - teams = emptyList(), + problemList = emptyList(), + teamList = emptyList(), resultType = ContestResultType.ICPC, - groups = emptyList() + groupList = emptyList(), + organizationList = emptyList(), + penaltyRoundingMode = PenaltyRoundingMode.EACH_SUBMISSION_DOWN_TO_MINUTE )) ) - - override suspend fun loadOnce() = ContestParseResult( - getFlow().first().newInfo, - emptyList(), - emptyList() - ) } \ No newline at end of file diff --git a/src/cds/src/main/kotlin/org/icpclive/cds/pcms/PCMSDataSource.kt b/src/cds/src/main/kotlin/org/icpclive/cds/pcms/PCMSDataSource.kt index 2e594472c..1a5cc87c1 100644 --- a/src/cds/src/main/kotlin/org/icpclive/cds/pcms/PCMSDataSource.kt +++ b/src/cds/src/main/kotlin/org/icpclive/cds/pcms/PCMSDataSource.kt @@ -3,10 +3,8 @@ package org.icpclive.cds.pcms import kotlinx.datetime.Clock import kotlinx.datetime.Instant import org.icpclive.api.* -import org.icpclive.cds.ContestParseResult -import org.icpclive.cds.FullReloadContestDataSource -import org.icpclive.cds.common.ClientAuth -import org.icpclive.cds.common.xmlLoader +import org.icpclive.cds.common.* +import org.icpclive.cds.settings.PCMSSettings import org.icpclive.util.* import org.w3c.dom.Element import java.util.* @@ -15,34 +13,30 @@ import kotlin.time.Duration.Companion.hours import kotlin.time.Duration.Companion.milliseconds import kotlin.time.Duration.Companion.seconds -class PCMSDataSource(val properties: Properties, creds: Map) : FullReloadContestDataSource(5.seconds) { - private val login = properties.getCredentials("login", creds) - private val password = properties.getCredentials("password", creds) - private val dataLoader = xmlLoader(login?.let { ClientAuth.Basic(login, password!!) }) { - properties.getProperty("url") +internal class PCMSDataSource(val settings: PCMSSettings, creds: Map) : FullReloadContestDataSource(5.seconds) { + private val login = settings.login?.get(creds) + private val password = settings.password?.get(creds) + private val dataLoader = xmlLoader( + networkSettings = settings.network, + login?.let { ClientAuth.Basic(login, password!!) }) { + settings.url } - val resultType = ContestResultType.valueOf(properties.getProperty("standings.resultType", "ICPC").uppercase()) + val resultType = settings.resultType val runIds = Enumerator() val teamIds = Enumerator() val problemIds = Enumerator() var startTime = Instant.fromEpochMilliseconds(0) override suspend fun loadOnce() : ContestParseResult { - val problemsOverride = if(properties.containsKey("problems.url")) { - loadCustomProblems() - } else { - null - } + val problemsOverride = settings.problemsUrl?.let { loadCustomProblems(it) } return parseAndUpdateStandings(dataLoader.load().documentElement, problemsOverride) } private fun parseAndUpdateStandings(element: Element, problemsOverride: Element?) = parseContestInfo(element.child("contest"), problemsOverride) - private suspend fun loadCustomProblems() : Element { - val problemsUrl = properties.getProperty("problems.url") - val problemsLoader = xmlLoader { problemsUrl } - + private suspend fun loadCustomProblems(problemsUrl: String) : Element { + val problemsLoader = xmlLoader(networkSettings = settings.network) { problemsUrl } return problemsLoader.load().documentElement } @@ -61,8 +55,8 @@ class PCMSDataSource(val properties: Properties, creds: Map) : F .children("problem") .mapIndexed { index, it -> ProblemInfo( - letter = it.getAttribute("alias"), - name = it.getAttribute("name"), + displayName = it.getAttribute("alias"), + fullName = it.getAttribute("name"), id = problemIds[it.getAttribute("alias")], ordinal = index, contestSystemId = it.getAttribute("id").takeIf { it.isNotEmpty() } ?: it.getAttribute("alias"), @@ -82,15 +76,20 @@ class PCMSDataSource(val properties: Properties, creds: Map) : F val teams = teamsAndRuns.map { it.first }.sortedBy { it.id } return ContestParseResult( ContestInfo( - element.getAttribute("name"), - status, - resultType, - startTime, - contestLength, - freezeTime, - problems, - teams, - teams.toGroupInfos() + name = element.getAttribute("name"), + status = status, + resultType = resultType, + startTime = startTime, + contestLength = contestLength, + freezeTime = freezeTime, + problemList = problems, + teamList = teams, + groupList = teams.flatMap { it.groups }.distinct().map { GroupInfo(it, isHidden = false, isOutOfContest = false) }, + organizationList = emptyList(), + penaltyRoundingMode = when (resultType) { + ContestResultType.IOI -> PenaltyRoundingMode.ZERO + ContestResultType.ICPC -> PenaltyRoundingMode.EACH_SUBMISSION_DOWN_TO_MINUTE + } ), teamsAndRuns.flatMap { it.second }, emptyList() @@ -102,8 +101,8 @@ class PCMSDataSource(val properties: Properties, creds: Map) : F val alias = attr("alias")!! val team = TeamInfo( id = teamIds[alias], - name = attr("party")!!, - shortName = attr("shortname") ?: attr("party")!!, + fullName = attr("party")!!, + displayName = attr("shortname") ?: attr("party")!!, hashTag = attr("hashtag"), groups = attr("region")?.split(",") ?: emptyList(), medias = listOfNotNull( @@ -112,6 +111,9 @@ class PCMSDataSource(val properties: Properties, creds: Map) : F attr("record")?.let { TeamMediaType.RECORD to MediaType.Video(it) }, ).associate { it }, contestSystemId = alias, + isOutOfContest = false, + isHidden = false, + organizationId = null ) val runs = element.children("problem").flatMap { problem -> diff --git a/src/cds/src/main/kotlin/org/icpclive/cds/settings/CDSSettings.kt b/src/cds/src/main/kotlin/org/icpclive/cds/settings/CDSSettings.kt new file mode 100644 index 000000000..22167d852 --- /dev/null +++ b/src/cds/src/main/kotlin/org/icpclive/cds/settings/CDSSettings.kt @@ -0,0 +1,317 @@ +@file:Suppress("UNUSED") +package org.icpclive.cds.settings + + +import io.github.xn32.json5k.Json5 +import kotlinx.coroutines.flow.* +import kotlinx.datetime.Instant +import kotlinx.datetime.TimeZone +import kotlinx.serialization.* +import kotlinx.serialization.json.* +import kotlinx.serialization.properties.Properties +import kotlinx.serialization.properties.decodeFromStringMap +import org.icpclive.api.ContestResultType +import org.icpclive.cds.ContestUpdate +import org.icpclive.cds.adapters.toEmulationFlow +import org.icpclive.cds.atcoder.AtcoderDataSource +import org.icpclive.cds.cats.CATSDataSource +import org.icpclive.cds.clics.ClicsDataSource +import org.icpclive.cds.cms.CmsDataSource +import org.icpclive.cds.codedrills.CodeDrillsDataSource +import org.icpclive.cds.codeforces.CFDataSource +import org.icpclive.cds.common.ContestDataSource +import org.icpclive.cds.ejudge.EjudgeDataSource +import org.icpclive.cds.krsu.KRSUDataSource +import org.icpclive.cds.noop.NoopDataSource +import org.icpclive.cds.pcms.PCMSDataSource +import org.icpclive.cds.testsys.TestSysDataSource +import org.icpclive.cds.yandex.YandexDataSource +import org.icpclive.util.* +import java.nio.file.Path +import kotlin.time.Duration + +// I'd like to have them in cds files, but then serializing would be much harder + +@JvmInline +@Serializable +public value class Credential(private val raw: String) { + public fun get(creds: Map) : String { + val prefix = "\$creds." + return if (raw.startsWith(prefix)) { + val name = raw.substring(prefix.length) + creds[name] ?: throw IllegalStateException("Credential $name not found") + } else { + raw + } + } +} + +@Serializable +public class EmulationSettings( + public val speed: Double, + @Serializable(with = HumanTimeSerializer::class) + public val startTime: Instant +) + +@Serializable +public class NetworkSettings( + public val allowUnsecureConnections: Boolean = true +) + +@Serializable +public sealed class CDSSettings { + public abstract val emulation: EmulationSettings? + public abstract val network: NetworkSettings? + + override fun toString(): String { + return json.encodeToString(this) + } + + public fun toFlow(creds: Map) : Flow { + val raw = toDataSource(creds) + return when (val emulationSettings = emulation) { + null -> raw.getFlow() + else -> raw.getFlow().toEmulationFlow(emulationSettings.startTime, emulationSettings.speed) + } + } + internal abstract fun toDataSource(creds: Map): ContestDataSource + + internal companion object { + private val json = Json { prettyPrint = true } + } +} + +@Serializable +@SerialName("noop") +public class NoopSettings( + override val emulation: EmulationSettings? = null, + override val network: NetworkSettings? = null +) : CDSSettings() { + override fun toDataSource(creds: Map) = NoopDataSource() +} + +@Serializable +@SerialName("testsys") +public class TestSysSettings( + public val url: String, + @Serializable(with = TimeZoneSerializer::class) + public val timeZone: TimeZone = TimeZone.of("Europe/Moscow"), + override val emulation: EmulationSettings? = null, + override val network: NetworkSettings? = null +) : CDSSettings() { + override fun toDataSource(creds: Map) = TestSysDataSource(this) +} + +@Serializable +@SerialName("cats") +public class CatsSettings( + public val login: Credential, + public val password: Credential, + public val url: String, + @Serializable(with = TimeZoneSerializer::class) + public val timeZone: TimeZone = TimeZone.of("Asia/Vladivostok"), + public val resultType: ContestResultType = ContestResultType.ICPC, + public val cid: String, + override val emulation: EmulationSettings? = null, + override val network: NetworkSettings? = null +) : CDSSettings() { + override fun toDataSource(creds: Map) = CATSDataSource(this, creds) +} + +@Serializable +@SerialName("krsu") +public class KRSUSettings( + public val submissionsUrl: String, + public val contestUrl: String, + @Serializable(with = TimeZoneSerializer::class) + public val timeZone: TimeZone = TimeZone.of("Asia/Bishkek"), + override val emulation: EmulationSettings? = null, + override val network: NetworkSettings? = null +) : CDSSettings() { + override fun toDataSource(creds: Map) = KRSUDataSource(this) +} + +@Serializable +@SerialName("ejudge") +public class EjudgeSettings( + public val url: String, + public val resultType: ContestResultType = ContestResultType.ICPC, + public val timeZone: TimeZone = TimeZone.of("Europe/Moscow"), + override val emulation: EmulationSettings? = null, + override val network: NetworkSettings? = null +) : CDSSettings() { + override fun toDataSource(creds: Map) = EjudgeDataSource(this) +} + + +@Serializable +@SerialName("yandex") +public class YandexSettings( + public val apiKey: Credential, + @Serializable(with = RegexSerializer::class) public val loginRegex: Regex, + public val contestId: Int, + public val resultType: ContestResultType = ContestResultType.ICPC, + override val emulation: EmulationSettings? = null, + override val network: NetworkSettings? = null +) : CDSSettings() { + override fun toDataSource(creds: Map) = YandexDataSource(this, creds) +} + +@Serializable +@SerialName("cf") +public class CFSettings( + public val contestId: Int, + public val apiKey: Credential, + public val apiSecret: Credential, + public val asManager: Boolean = true, + override val emulation: EmulationSettings? = null, + override val network: NetworkSettings? = null, +) : CDSSettings() { + override fun toDataSource(creds: Map) = CFDataSource(this, creds) +} + +@Serializable +@SerialName("pcms") +public class PCMSSettings( + public val url: String, + public val login: Credential? = null, + public val password: Credential? = null, + public val problemsUrl: String? = null, + public val resultType: ContestResultType = ContestResultType.ICPC, + override val emulation: EmulationSettings? = null, + override val network: NetworkSettings? = null, +) : CDSSettings() { + override fun toDataSource(creds: Map) = PCMSDataSource(this, creds) +} + +@Serializable +public class ClicsLoaderSettings( + public val url: String, + public val login: Credential? = null, + public val password: Credential? = null, + public val eventFeedName: String = "event-feed", + public val feedVersion: ClicsSettings.FeedVersion = ClicsSettings.FeedVersion.`2022_07` +) + +@SerialName("clics") +@Serializable +public class ClicsSettings( + private val url: String, + private val login: Credential? = null, + private val password: Credential? = null, + private val eventFeedName: String = "event-feed", + private val feedVersion: FeedVersion = FeedVersion.`2022_07`, + public val additionalFeed: ClicsLoaderSettings? = null, + public val useTeamNames: Boolean = true, + public val mediaBaseUrl: String = "", + override val emulation: EmulationSettings? = null, + override val network: NetworkSettings? = null, +) : CDSSettings() { + public enum class FeedVersion { + `2020_03`, + `2022_07` + } + + public val mainFeed: ClicsLoaderSettings get() = ClicsLoaderSettings(url,login, password, eventFeedName, feedVersion) + + override fun toDataSource(creds: Map) = ClicsDataSource(this, creds) +} + +@SerialName("codedrills") +@Serializable +public class CodeDrillsSettings( + public val url: String, + public val port: Int, + public val contestId: String, + public val authKey: Credential, + override val emulation: EmulationSettings? = null, + override val network: NetworkSettings? = null, +) : CDSSettings() { + override fun toDataSource(creds: Map) = CodeDrillsDataSource(this, creds) +} + +@SerialName("atcoder") +@Serializable +public class AtcoderSettings( + public val contestId: String, + public val sessionCookie: Credential, + @Serializable(with = HumanTimeSerializer::class) + public val startTime: Instant, + @Serializable(with = DurationInSecondsSerializer::class) + @SerialName("contestLengthSeconds") public val contestLength: Duration, + override val emulation: EmulationSettings? = null, + override val network: NetworkSettings? = null +) : CDSSettings() { + override fun toDataSource(creds: Map) = AtcoderDataSource(this, creds) +} + +@SerialName("cms") +@Serializable +public class CmsSettings( + public val url: String, + public val activeContest: String, + public val otherContests: List, + override val network: NetworkSettings? = null, + override val emulation: EmulationSettings? = null +) : CDSSettings() { + override fun toDataSource(creds: Map) = CmsDataSource(this) +} + + +@OptIn(ExperimentalSerializationApi::class) +public fun parseFileToCdsSettings(path: Path) : CDSSettings { + val file = path.toFile() + return if (!file.exists()) { + throw java.lang.IllegalArgumentException("File ${file.absolutePath} does not exist") + } else if (file.name.endsWith(".properties")) { + val properties = java.util.Properties() + file.inputStream().use { properties.load(it) } + val legacyMap = mapOf( + "standings.type" to "type", + "standings.resultType" to "resultType", + "yandex.token" to "apiKey", + "yandex.login_prefix" to "loginRegex", + "yandex.contest_id" to "contestId", + "cf.api.key" to "apiKey", + "cf.api.secret" to "apiSecret", + "problems.url" to "problemsUrl", + "submissions-url" to "submissionsUrl", + "contest_id" to "contestId", + "contest-url" to "contestUrl", + "timezone" to "timeZone", + "event_feed_name" to "eventFeedName", + "feed_version" to "feedVersion", + "use_team_names" to "useTeamNames", + "media_base_url" to "mediaBaseUrl", + "additional_feed.url" to "additionalFeed.url", + "additional_feed.login" to "additionalFeed.login", + "additional_feed.password" to "additionalFeed.password", + "additional_feed.event_feed_name" to "additionalFeed.eventFeedName", + "additional_feed.feed_version" to "additionalFeed.feedVersion", + ) + for ((k, v) in legacyMap) { + properties.getProperty(k)?.let { + getLogger(CDSSettings::class).info( + "Deprecated event.properties key $k is used. Use $v instead." + ) + properties.setProperty(v, it) + properties.remove(k) + } + } + properties.getProperty("type")?.let { properties.setProperty("type", it.lowercase()) } + properties.getProperty("resultType")?.let { properties.setProperty("resultType", it.uppercase()) } + @Suppress("UNCHECKED_CAST") + Properties.decodeFromStringMap(properties as Map) + } else if (file.name.endsWith(".json")) { + file.inputStream().use { + Json.decodeFromStreamIgnoringComments(it) + } + } else if (file.name.endsWith(".json5")) { + file.inputStream().use { + Json5.decodeFromString(String(it.readAllBytes())) + } + } else { + throw IllegalArgumentException("Unknown settings file extension: ${file.path}") + } +} + diff --git a/src/cds/src/main/kotlin/org/icpclive/cds/testsys/TestSysDataSource.kt b/src/cds/src/main/kotlin/org/icpclive/cds/testsys/TestSysDataSource.kt index d5553b04b..3c46f6649 100644 --- a/src/cds/src/main/kotlin/org/icpclive/cds/testsys/TestSysDataSource.kt +++ b/src/cds/src/main/kotlin/org/icpclive/cds/testsys/TestSysDataSource.kt @@ -1,23 +1,18 @@ package org.icpclive.cds.testsys -import kotlinx.datetime.TimeZone import kotlinx.datetime.toInstant import kotlinx.datetime.toKotlinLocalDateTime import org.icpclive.api.* -import org.icpclive.cds.ContestParseResult -import org.icpclive.cds.FullReloadContestDataSource -import org.icpclive.cds.common.ByteArrayLoader -import org.icpclive.cds.common.map +import org.icpclive.cds.common.* +import org.icpclive.cds.settings.TestSysSettings import java.nio.charset.Charset import java.time.format.DateTimeFormatter -import java.util.Properties import kotlin.time.Duration.Companion.minutes import kotlin.time.Duration.Companion.seconds -class TestSysDataSource(val properties: Properties) : FullReloadContestDataSource(5.seconds) { - val url = properties.getProperty("url") - val loader = ByteArrayLoader(null) { url } +internal class TestSysDataSource(val settings: TestSysSettings) : FullReloadContestDataSource(5.seconds) { + val loader = ByteArrayLoader(settings.network, null) { settings.url } .map { val eofPosition = it.indexOf(EOF) String( @@ -26,11 +21,9 @@ class TestSysDataSource(val properties: Properties) : FullReloadContestDataSourc Charset.forName("windows-1251") ) }.map { - it.split("\r\n").filter(String::isNotEmpty) + it.split("\r\n", "\n").filter(String::isNotEmpty) } - val timeZone = properties.getProperty("timezone") ?: "Europe/Moscow" - override suspend fun loadOnce(): ContestParseResult { val data = loader.load().groupBy( keySelector = { it.split(" ", limit = 2)[0] }, @@ -39,8 +32,8 @@ class TestSysDataSource(val properties: Properties) : FullReloadContestDataSourc val problemsWithPenalty = (data["@p"] ?: emptyList()).mapIndexed { index, prob -> val (letter, name, penalty) = prob.splitCommas() ProblemInfo( - letter = letter, - name = name, + displayName = letter, + fullName = name, id = index, ordinal = index, contestSystemId = letter, @@ -52,12 +45,15 @@ class TestSysDataSource(val properties: Properties) : FullReloadContestDataSourc val (id, _, _, name) = team.splitCommas() TeamInfo( id = index, - name = name, - shortName = name, + fullName = name, + displayName = name, contestSystemId = id, groups = listOf(), hashTag = null, - medias = emptyMap() + medias = emptyMap(), + isOutOfContest = false, + isHidden = false, + organizationId = null ) } val isCEPenalty = data["@comment"]?.contains("@pragma IgnoreCE") != true @@ -71,11 +67,12 @@ class TestSysDataSource(val properties: Properties) : FullReloadContestDataSourc startTime = data["@startat"]!!.single().toDate(), contestLength = data["@contlen"]!!.single().toInt().minutes, freezeTime = data["@freeze"]!!.single().toInt().minutes, - teams = teams, - problems = problems, - penaltyPerWrongAttempt = (penalty.getOrNull(0) ?: 20), + teamList = teams, + problemList = problems, + penaltyPerWrongAttempt = (penalty.getOrNull(0) ?: 20).minutes, penaltyRoundingMode = PenaltyRoundingMode.SUM_DOWN_TO_MINUTE, - groups = emptyList(), + groupList = emptyList(), + organizationList = emptyList(), ) val runs = (data["@s"] ?: emptyList()).mapIndexed { index, subm -> val (teamId, problemId, _, time, verdict) = subm.splitCommas() @@ -122,7 +119,7 @@ class TestSysDataSource(val properties: Properties) : FullReloadContestDataSourc private fun String.toDate() = java.time.LocalDateTime.parse(this, DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm:ss")) .toKotlinLocalDateTime() - .toInstant(TimeZone.of(timeZone)) + .toInstant(settings.timeZone) private fun String.toStatus() = when (this) { "RESULTS" -> ContestStatus.OVER diff --git a/src/cds/src/main/kotlin/org/icpclive/cds/yandex/YandexConstants.kt b/src/cds/src/main/kotlin/org/icpclive/cds/yandex/YandexConstants.kt deleted file mode 100644 index 9eec0c59f..000000000 --- a/src/cds/src/main/kotlin/org/icpclive/cds/yandex/YandexConstants.kt +++ /dev/null @@ -1,8 +0,0 @@ -package org.icpclive.cds.yandex - -object YandexConstants { - const val TOKEN_PROPERTY_NAME = "yandex.token" - const val CONTEST_ID_PROPERTY_NAME = "yandex.contest_id" - const val LOGIN_PREFIX_PROPERTY_NAME = "yandex.login_prefix" - const val API_BASE = "https://api.contest.yandex.net/api/public/v2" -} \ No newline at end of file diff --git a/src/cds/src/main/kotlin/org/icpclive/cds/yandex/YandexContestInfo.kt b/src/cds/src/main/kotlin/org/icpclive/cds/yandex/YandexContestInfo.kt index ecbd6a53b..980bcb79c 100644 --- a/src/cds/src/main/kotlin/org/icpclive/cds/yandex/YandexContestInfo.kt +++ b/src/cds/src/main/kotlin/org/icpclive/cds/yandex/YandexContestInfo.kt @@ -1,6 +1,5 @@ package org.icpclive.cds.yandex -import kotlinx.datetime.Clock import kotlinx.datetime.Instant import org.icpclive.api.* import org.icpclive.cds.yandex.api.* @@ -8,8 +7,8 @@ import kotlin.time.Duration import kotlin.time.Duration.Companion.seconds private fun Problem.toApi(index:Int, resultType: ContestResultType) = ProblemInfo( - letter = alias, - name = name, + displayName = alias, + fullName = name, id = index, ordinal = index, contestSystemId = id, @@ -18,7 +17,7 @@ private fun Problem.toApi(index:Int, resultType: ContestResultType) = ProblemInf scoreMergeMode = if (resultType == ContestResultType.IOI) ScoreMergeMode.MAX_TOTAL else null ) -class YandexContestInfo private constructor( +internal class YandexContestInfo private constructor( private val name: String, private val startTime: Instant, private val duration: Duration, @@ -47,7 +46,7 @@ class YandexContestInfo private constructor( ) fun submissionToRun(submission: Submission): RunInfo { - val problemId = problems.indexOfFirst { it.letter == submission.problemAlias } + val problemId = problems.indexOfFirst { it.displayName == submission.problemAlias } if (problemId == -1) { throw IllegalStateException("Problem not found: ${submission.problemAlias}") } @@ -81,28 +80,16 @@ class YandexContestInfo private constructor( fun toApi() = ContestInfo( name = name, - status = deduceStatus(startTime, duration), + status = ContestStatus.byCurrentTime(startTime, duration), resultType = resultType, startTime = startTime, contestLength = duration, freezeTime = freezeTime, - problems = problems, - teams = teams, - penaltyRoundingMode = PenaltyRoundingMode.SUM_DOWN_TO_MINUTE, - groups = emptyList() + problemList = problems, + teamList = teams, + groupList = emptyList(), + organizationList = emptyList(), + penaltyRoundingMode = PenaltyRoundingMode.SUM_DOWN_TO_MINUTE ) - - companion object { - // There is no way to fetch YC server time, so here we go - fun deduceStatus(startTime: Instant, duration: Duration): ContestStatus { - val now = Clock.System.now() - - return when { - now < startTime -> ContestStatus.BEFORE - now < startTime + duration -> ContestStatus.RUNNING - else -> ContestStatus.OVER - } - } - } } diff --git a/src/cds/src/main/kotlin/org/icpclive/cds/yandex/YandexDataSource.kt b/src/cds/src/main/kotlin/org/icpclive/cds/yandex/YandexDataSource.kt index 73a7ed22c..da2bc93ad 100644 --- a/src/cds/src/main/kotlin/org/icpclive/cds/yandex/YandexDataSource.kt +++ b/src/cds/src/main/kotlin/org/icpclive/cds/yandex/YandexDataSource.kt @@ -6,26 +6,19 @@ import io.ktor.client.plugins.* import io.ktor.client.request.* import kotlinx.coroutines.* import kotlinx.coroutines.flow.* -import kotlinx.serialization.decodeFromString import kotlinx.serialization.json.Json -import org.icpclive.api.ContestResultType +import org.icpclive.api.ContestStatus import org.icpclive.cds.* -import org.icpclive.cds.RawContestDataSource +import org.icpclive.cds.adapters.withGroupedRuns import org.icpclive.cds.common.* -import org.icpclive.cds.yandex.YandexConstants.API_BASE -import org.icpclive.cds.yandex.YandexConstants.CONTEST_ID_PROPERTY_NAME -import org.icpclive.cds.yandex.YandexConstants.LOGIN_PREFIX_PROPERTY_NAME -import org.icpclive.cds.yandex.YandexConstants.TOKEN_PROPERTY_NAME +import org.icpclive.cds.settings.YandexSettings import org.icpclive.cds.yandex.api.* import org.icpclive.util.* -import java.util.* import kotlin.time.Duration import kotlin.time.Duration.Companion.seconds -class YandexDataSource(props: Properties, creds: Map) : RawContestDataSource { - private val apiKey: String - private val loginPrefix: String - private val contestId: Long +internal class YandexDataSource(settings: YandexSettings, creds: Map) : ContestDataSource { + private val apiKey = settings.apiKey.get(creds) private val httpClient: HttpClient private val contestDescriptionLoader: DataLoader @@ -33,18 +26,14 @@ class YandexDataSource(props: Properties, creds: Map) : RawConte private val participantLoader: DataLoader> private val allSubmissionsLoader: DataLoader> - val resultType = ContestResultType.valueOf(props.getProperty("standings.resultType", "ICPC").uppercase()) + val resultType = settings.resultType init { - apiKey = props.getCredentials(TOKEN_PROPERTY_NAME, creds) ?: throw IllegalStateException("YC api key is not defined") - contestId = props.getProperty(CONTEST_ID_PROPERTY_NAME).toLong() - loginPrefix = props.getProperty(LOGIN_PREFIX_PROPERTY_NAME) - val auth = ClientAuth.OAuth(apiKey) - httpClient = defaultHttpClient(auth) { + httpClient = defaultHttpClient(auth, settings.network) { defaultRequest { - url("$API_BASE/contests/$contestId/") + url("$API_BASE/contests/${settings.contestId}/") } engine { requestTimeout = 40000 @@ -52,22 +41,22 @@ class YandexDataSource(props: Properties, creds: Map) : RawConte } - contestDescriptionLoader = jsonLoader(auth) { "$API_BASE/contests/$contestId" } - problemLoader = jsonLoader(auth) { "$API_BASE/contests/$contestId/problems" }.map { + contestDescriptionLoader = jsonLoader(settings.network, auth) { "$API_BASE/contests/${settings.contestId}" } + problemLoader = jsonLoader(settings.network, auth) { "$API_BASE/contests/${settings.contestId}/problems" }.map { it.problems.sortedBy { it.alias } } participantLoader = run { - val participantRegex = Regex(loginPrefix) - jsonLoader>(auth) { "$API_BASE/contests/$contestId/participants" }.map { + val participantRegex = settings.loginRegex + jsonLoader>(settings.network, auth) { "$API_BASE/contests/${settings.contestId}/participants" }.map { it.filter { participant -> participant.login.matches(participantRegex) } } } - allSubmissionsLoader = jsonLoader(auth) { - "$API_BASE/contests/$contestId/submissions?locale=ru&page=1&pageSize=100000" + allSubmissionsLoader = jsonLoader(settings.network, auth) { + "$API_BASE/contests/${settings.contestId}/submissions?locale=ru&page=1&pageSize=100000" }.map { it.submissions.reversed() } } - @OptIn(FlowPreview::class) + @OptIn(ExperimentalCoroutinesApi::class) override fun getFlow() = flow { coroutineScope { val rawContestInfoFlow = loopFlow( @@ -82,12 +71,29 @@ class YandexDataSource(props: Properties, creds: Map) : RawConte ) }.flowOn(Dispatchers.IO) .stateIn(this) - emit(InfoUpdate(rawContestInfoFlow.value.toApi())) + val info = rawContestInfoFlow.value.toApi() + if (info.status == ContestStatus.OVER) { + emit(InfoUpdate(info.copy(status = ContestStatus.RUNNING))) + } else { + emit(InfoUpdate(info)) + } + val allSubmissions = allSubmissionsLoader.load() + with (rawContestInfoFlow.value) { + emitAll( + allSubmissions.sortedWith(compareBy({ it.time }, { it.id })).filter(this::isTeamSubmission) + .map { RunUpdate(submissionToRun(it)) } + .asFlow() + ) + } + if (info.status == ContestStatus.OVER) { + emit(InfoUpdate(info)) + } val newSubmissionsFlow = newSubmissionsFlow(1.seconds) val allSubmissionsFlow = loopFlow( 120.seconds, onError = { getLogger(YandexDataSource::class).error("Failed to reload data, retrying", it) } ) { allSubmissionsLoader.load() } + .onStart { delay(120.seconds) } .flowOn(Dispatchers.IO) val allRunsFlow = merge(allSubmissionsFlow, newSubmissionsFlow).map { with(rawContestInfoFlow.value) { @@ -97,31 +103,16 @@ class YandexDataSource(props: Properties, creds: Map) : RawConte emitAll(merge(allRunsFlow, rawContestInfoFlow.map { InfoUpdate(it.toApi()) })) } } - override suspend fun loadOnce(): ContestParseResult { - val rawContestInfo = YandexContestInfo( - contestDescriptionLoader.load(), - problemLoader.load(), - participantLoader.load(), - resultType - ) - val contestInfo = rawContestInfo.toApi() - - log.info("Loading all contest submissions") - val submissions = allSubmissionsLoader.load() - .filter(rawContestInfo::isTeamSubmission) - .map(rawContestInfo::submissionToRun) - log.info("Loaded all submissions for emulation") - return ContestParseResult(contestInfo, submissions, emptyList()) - } - companion object { private val log = getLogger(YandexDataSource::class) + const val API_BASE = "https://api.contest.yandex.net/api/public/v2" } - private suspend fun newSubmissionsFlow( + private fun newSubmissionsFlow( period: Duration ) : Flow> { + log.info("HERE!!!") val formatter = Json { ignoreUnknownKeys = true } var pendingRunId = 0L @@ -132,8 +123,11 @@ class YandexDataSource(props: Properties, creds: Map) : RawConte buildList { var page = 1 while (true) { + log.info("Plan to load: submissions?locale=ru&page=$page&pageSize=100") val response = httpClient.request("submissions?locale=ru&page=$page&pageSize=100") {} + log.info("Loaded") val pageSubmissions = formatter.decodeFromString(response.body()).submissions + log.info(pageSubmissions.toString()) addAll(pageSubmissions) if (pageSubmissions.isEmpty() || pageSubmissions.last().id <= pendingRunId) { break diff --git a/src/cds/src/main/kotlin/org/icpclive/cds/yandex/api/ContestDescription.kt b/src/cds/src/main/kotlin/org/icpclive/cds/yandex/api/ContestDescription.kt index 7e2ed0ca8..b9502e6d1 100644 --- a/src/cds/src/main/kotlin/org/icpclive/cds/yandex/api/ContestDescription.kt +++ b/src/cds/src/main/kotlin/org/icpclive/cds/yandex/api/ContestDescription.kt @@ -3,7 +3,7 @@ package org.icpclive.cds.yandex.api import kotlinx.serialization.Serializable @Serializable -data class ContestDescription( +internal data class ContestDescription( val duration: Long, val freezeTime: Long?, val name: String, diff --git a/src/cds/src/main/kotlin/org/icpclive/cds/yandex/api/Participant.kt b/src/cds/src/main/kotlin/org/icpclive/cds/yandex/api/Participant.kt index 1751552b2..8a93439d9 100644 --- a/src/cds/src/main/kotlin/org/icpclive/cds/yandex/api/Participant.kt +++ b/src/cds/src/main/kotlin/org/icpclive/cds/yandex/api/Participant.kt @@ -4,7 +4,7 @@ import kotlinx.serialization.Serializable import org.icpclive.api.TeamInfo @Serializable -data class Participant( +internal data class Participant( val id: Int, val name: String, val login: String, @@ -12,11 +12,14 @@ data class Participant( ) { fun toTeamInfo() = TeamInfo( id = id, - name = name, - shortName = name, + fullName = name, + displayName = name, contestSystemId = login, groups = emptyList(), hashTag = null, - medias = emptyMap() + medias = emptyMap(), + isOutOfContest = false, + isHidden = false, + organizationId = null ) } diff --git a/src/cds/src/main/kotlin/org/icpclive/cds/yandex/api/Problem.kt b/src/cds/src/main/kotlin/org/icpclive/cds/yandex/api/Problem.kt index c72f39386..a6800342e 100644 --- a/src/cds/src/main/kotlin/org/icpclive/cds/yandex/api/Problem.kt +++ b/src/cds/src/main/kotlin/org/icpclive/cds/yandex/api/Problem.kt @@ -1,15 +1,14 @@ package org.icpclive.cds.yandex.api import kotlinx.serialization.Serializable -import org.icpclive.api.ProblemInfo @Serializable -data class Problems( +internal data class Problems( val problems: List ) @Serializable -data class Problem( +internal data class Problem( val id: String, val alias: String, val compilers: List, @@ -20,7 +19,7 @@ data class Problem( ) @Serializable -data class CompilerLimit( +internal data class CompilerLimit( val compilerName: String?, val idlenessLimit: Long?, val memoryLimit: Long?, @@ -29,7 +28,7 @@ data class CompilerLimit( ) @Serializable -data class Statement( +internal data class Statement( val path: String?, val type: String? ) \ No newline at end of file diff --git a/src/cds/src/main/kotlin/org/icpclive/cds/yandex/api/Result.kt b/src/cds/src/main/kotlin/org/icpclive/cds/yandex/api/Result.kt index 5b89412d2..7fd2ea1c0 100644 --- a/src/cds/src/main/kotlin/org/icpclive/cds/yandex/api/Result.kt +++ b/src/cds/src/main/kotlin/org/icpclive/cds/yandex/api/Result.kt @@ -2,7 +2,7 @@ package org.icpclive.cds.yandex.api import org.icpclive.api.Verdict -fun getResult(verdict: String) = when (verdict) { +internal fun getResult(verdict: String) = when (verdict) { "OK" -> Verdict.Accepted "WrongAnswer" -> Verdict.WrongAnswer "TimeLimitExceeded" -> Verdict.TimeLimitExceeded diff --git a/src/cds/src/main/kotlin/org/icpclive/cds/yandex/api/Submission.kt b/src/cds/src/main/kotlin/org/icpclive/cds/yandex/api/Submission.kt index 1a08d0626..905936ec2 100644 --- a/src/cds/src/main/kotlin/org/icpclive/cds/yandex/api/Submission.kt +++ b/src/cds/src/main/kotlin/org/icpclive/cds/yandex/api/Submission.kt @@ -5,13 +5,13 @@ import org.icpclive.util.DurationInMillisecondsSerializer import kotlin.time.Duration @Serializable -data class Submissions( +internal data class Submissions( val count: Long, val submissions: List ) @Serializable -data class Submission( +internal data class Submission( val id: Long, val authorId: Long, val author: String, diff --git a/src/cds/src/main/kotlin/org/icpclive/scoreboard/ScoreboardCalculator.kt b/src/cds/src/main/kotlin/org/icpclive/scoreboard/AbstractScoreboardCalculator.kt similarity index 68% rename from src/cds/src/main/kotlin/org/icpclive/scoreboard/ScoreboardCalculator.kt rename to src/cds/src/main/kotlin/org/icpclive/scoreboard/AbstractScoreboardCalculator.kt index e1b0b5ab0..9a2fff870 100644 --- a/src/cds/src/main/kotlin/org/icpclive/scoreboard/ScoreboardCalculator.kt +++ b/src/cds/src/main/kotlin/org/icpclive/scoreboard/AbstractScoreboardCalculator.kt @@ -1,14 +1,16 @@ package org.icpclive.scoreboard -import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.conflate -import kotlinx.coroutines.flow.filter -import kotlinx.coroutines.flow.map +import kotlinx.coroutines.flow.* import org.icpclive.api.* import org.icpclive.cds.adapters.ContestStateWithRunsByTeam import org.icpclive.util.getLogger +import kotlin.time.Duration -abstract class ScoreboardCalculator { +public interface ScoreboardCalculator { + public fun getScoreboard(info: ContestInfo, runs: Map>) : Scoreboard +} + +internal abstract class AbstractScoreboardCalculator : ScoreboardCalculator { abstract fun ContestInfo.getScoreboardRow( teamId: Int, @@ -19,16 +21,16 @@ abstract class ScoreboardCalculator { abstract val comparator : Comparator - fun getScoreboard(info: ContestInfo, runs: Map>): Scoreboard { + override fun getScoreboard(info: ContestInfo, runs: Map>): Scoreboard { logger.info("Calculating scoreboard: runs count = ${runs.values.sumOf { it.size }}") - val teamsInfo = info.teams.filterNot { it.isHidden }.associateBy { it.id } + val teamsInfo = info.teams.filterValues { !it.isHidden } fun ScoreboardRow.team() = teamsInfo[teamId]!! val hasChampion = mutableSetOf() val rows = teamsInfo.values - .map { info.getScoreboardRow(it.id, runs[it.id] ?: emptyList(), it.groups, info.problems) } - .sortedWith(comparator.thenComparing { it -> it.team().name }) + .map { info.getScoreboardRow(it.id, runs[it.id] ?: emptyList(), it.groups, info.scoreboardProblems) } + .sortedWith(comparator.thenComparing { it -> it.team().fullName }) .toMutableList() var right = 0 var outOfContestTeams = 0 @@ -69,15 +71,15 @@ abstract class ScoreboardCalculator { hasChampion.addAll(teamsInfo[rows[i].teamId]!!.groups) } } - return Scoreboard(rows) + return Scoreboard(runs.values.maxOfOrNull { it.maxOfOrNull { it.time } ?: Duration.ZERO } ?: Duration.ZERO , rows) } companion object { - val logger = getLogger(ScoreboardCalculator::class) + val logger = getLogger(AbstractScoreboardCalculator::class) } } -fun getScoreboardCalculator(info: ContestInfo, optimismLevel: OptimismLevel) = when (info.resultType) { +public fun getScoreboardCalculator(info: ContestInfo, optimismLevel: OptimismLevel) : ScoreboardCalculator = when (info.resultType) { ContestResultType.ICPC -> when (optimismLevel) { OptimismLevel.NORMAL -> ICPCNormalScoreboardCalculator() OptimismLevel.OPTIMISTIC -> ICPCOptimisticScoreboardCalculator() @@ -86,10 +88,13 @@ fun getScoreboardCalculator(info: ContestInfo, optimismLevel: OptimismLevel) = w ContestResultType.IOI -> IOIScoreboardCalculator() } -fun Flow.calculateScoreboard(optimismLevel: OptimismLevel) = - filter { it.info != null } +public fun Flow.calculateScoreboardWithInfo(optimismLevel: OptimismLevel): Flow> = + filter { it.infoAfterEvent != null } .conflate() .map { - getScoreboardCalculator(it.info!!, optimismLevel).getScoreboard(it.info, it.runs) + it.infoAfterEvent!! to getScoreboardCalculator(it.infoAfterEvent!!, optimismLevel).getScoreboard(it.infoAfterEvent!!, it.runs) } + +public fun Flow.calculateScoreboard(optimismLevel: OptimismLevel): Flow = + calculateScoreboardWithInfo(optimismLevel).map { it.second } diff --git a/src/cds/src/main/kotlin/org/icpclive/scoreboard/ICPCScoreboardCalculator.kt b/src/cds/src/main/kotlin/org/icpclive/scoreboard/ICPCScoreboardCalculator.kt index c6c8c8f9c..ba0bd9602 100644 --- a/src/cds/src/main/kotlin/org/icpclive/scoreboard/ICPCScoreboardCalculator.kt +++ b/src/cds/src/main/kotlin/org/icpclive/scoreboard/ICPCScoreboardCalculator.kt @@ -2,34 +2,9 @@ package org.icpclive.scoreboard import org.icpclive.api.* import kotlin.math.max -import kotlin.time.Duration -interface PenaltyCalculator { - fun addSolvedProblem(time: Duration, wrongAttempts: Int) - val penalty: Long -} - -class EachSubmissionDownToMinutePenaltyCalculator(val penaltyPerWrongAttempt: Int) : PenaltyCalculator { - override fun addSolvedProblem(time: Duration, wrongAttempts: Int) { - penalty += time.inWholeMinutes + wrongAttempts * penaltyPerWrongAttempt - } - - override var penalty = 0L - private set - -} -class SumDownToMinutePenaltyCalculator(val penaltyPerWrongAttempt: Int) : PenaltyCalculator { - var penaltySeconds = 0L - override fun addSolvedProblem(time: Duration, wrongAttempts: Int) { - penaltySeconds += time.inWholeSeconds + wrongAttempts * penaltyPerWrongAttempt * 60L - } - - override val penalty: Long - get() = penaltySeconds / 60 -} - -abstract class ICPCScoreboardCalculator : ScoreboardCalculator() { +internal abstract class ICPCScoreboardCalculator : AbstractScoreboardCalculator() { abstract fun isAccepted(runInfo: RunInfo, index: Int, count: Int): Boolean abstract fun isPending(runInfo: RunInfo, index: Int, count: Int): Boolean abstract fun isAddingPenalty(runInfo: RunInfo, index: Int, count: Int): Boolean @@ -47,10 +22,7 @@ abstract class ICPCScoreboardCalculator : ScoreboardCalculator() { problems: List ): ScoreboardRow { require(resultType == ContestResultType.ICPC) - val penaltyCalculator = when (penaltyRoundingMode) { - PenaltyRoundingMode.EACH_SUBMISSION_DOWN_TO_MINUTE -> EachSubmissionDownToMinutePenaltyCalculator(penaltyPerWrongAttempt) - PenaltyRoundingMode.SUM_DOWN_TO_MINUTE -> SumDownToMinutePenaltyCalculator(penaltyPerWrongAttempt) - } + val penaltyCalculator = PenaltyCalculator.get(penaltyRoundingMode, penaltyPerWrongAttempt) var solved = 0 var lastAccepted = 0L val runsByProblem = runs.groupBy { it.problemId } @@ -100,19 +72,19 @@ private val RunInfo.isAddingPenalty get() = (result as? ICPCRunResult)?.verdict? private val RunInfo.isJudged get() = result != null -class ICPCNormalScoreboardCalculator : ICPCScoreboardCalculator() { +internal class ICPCNormalScoreboardCalculator : ICPCScoreboardCalculator() { override fun isAccepted(runInfo: RunInfo, index: Int, count: Int) = runInfo.isAccepted override fun isPending(runInfo: RunInfo, index: Int, count: Int) = !runInfo.isJudged override fun isAddingPenalty(runInfo: RunInfo, index: Int, count: Int) = runInfo.isJudged && runInfo.isAddingPenalty } -class ICPCPessimisticScoreboardCalculator : ICPCScoreboardCalculator() { +internal class ICPCPessimisticScoreboardCalculator : ICPCScoreboardCalculator() { override fun isAccepted(runInfo: RunInfo, index: Int, count: Int) = runInfo.isAccepted override fun isPending(runInfo: RunInfo, index: Int, count: Int) = false override fun isAddingPenalty(runInfo: RunInfo, index: Int, count: Int) = !runInfo.isJudged || runInfo.isAddingPenalty } -class ICPCOptimisticScoreboardCalculator : ICPCScoreboardCalculator() { +internal class ICPCOptimisticScoreboardCalculator : ICPCScoreboardCalculator() { override fun isAccepted(runInfo: RunInfo, index: Int, count: Int) = runInfo.isAccepted || (!runInfo.isJudged && index == count - 1) diff --git a/src/cds/src/main/kotlin/org/icpclive/scoreboard/IOIScoreboardCalculator.kt b/src/cds/src/main/kotlin/org/icpclive/scoreboard/IOIScoreboardCalculator.kt index 900e97f52..ea9b4cbfd 100644 --- a/src/cds/src/main/kotlin/org/icpclive/scoreboard/IOIScoreboardCalculator.kt +++ b/src/cds/src/main/kotlin/org/icpclive/scoreboard/IOIScoreboardCalculator.kt @@ -2,9 +2,10 @@ package org.icpclive.scoreboard import org.icpclive.api.* -class IOIScoreboardCalculator : ScoreboardCalculator() { +internal class IOIScoreboardCalculator : AbstractScoreboardCalculator() { override val comparator: Comparator = compareBy( { -it.totalScore }, + { it.penalty } ) override fun ContestInfo.getScoreboardRow( @@ -14,21 +15,26 @@ class IOIScoreboardCalculator : ScoreboardCalculator() { problems: List ): ScoreboardRow { require(resultType == ContestResultType.IOI) + val penaltyCalculator = PenaltyCalculator.get(penaltyRoundingMode, penaltyPerWrongAttempt) val runsByProblem = runs.groupBy { it.problemId } val problemResults = problems.map { problem -> val problemRuns = runsByProblem.getOrElse(problem.id) { emptyList() } - val changingRuns = problemRuns.filter { it.result != null && (it.result as IOIRunResult).difference != 0.0 } + val finalRunIndex = problemRuns.indexOfLast { it.result != null && (it.result as IOIRunResult).difference != 0.0 } + val finalRun = if (finalRunIndex == -1) null else problemRuns[finalRunIndex] + if (finalRun != null) { + penaltyCalculator.addSolvedProblem(finalRun.time, problemRuns.subList(0, finalRunIndex).count { (it.result as? IOIRunResult)?.wrongVerdict?.isAddingPenalty == true }) + } IOIProblemResult( - if (problemRuns.all { it.result == null } ) null else changingRuns.sumOf { (it.result as IOIRunResult).difference }, - changingRuns.lastOrNull()?.time, - changingRuns.find { (it.result as IOIRunResult).isFirstBestRun } != null + (finalRun?.result as? IOIRunResult?)?.scoreAfter, + finalRun?.time, + (finalRun?.result as? IOIRunResult?)?.isFirstBestRun == true ) } return ScoreboardRow( teamId, 0, problemResults.sumOf { it.score ?: 0.0 }, - 0, + penaltyCalculator.penalty, problemResults.maxOfOrNull { it.lastSubmitTime?.inWholeMilliseconds ?: 0 } ?: 0, null, problemResults, diff --git a/src/cds/src/main/kotlin/org/icpclive/scoreboard/PenaltyCalculator.kt b/src/cds/src/main/kotlin/org/icpclive/scoreboard/PenaltyCalculator.kt new file mode 100644 index 000000000..adecbade0 --- /dev/null +++ b/src/cds/src/main/kotlin/org/icpclive/scoreboard/PenaltyCalculator.kt @@ -0,0 +1,64 @@ +package org.icpclive.scoreboard + +import org.icpclive.api.PenaltyRoundingMode +import kotlin.time.Duration +import kotlin.time.Duration.Companion.minutes +import kotlin.time.times + +internal sealed interface PenaltyCalculator { + fun addSolvedProblem(time: Duration, wrongAttempts: Int) + val penalty: Duration + + companion object { + fun get(penaltyRoundingMode: PenaltyRoundingMode, penaltyPerWrongAttempt: Duration) = when (penaltyRoundingMode) { + PenaltyRoundingMode.EACH_SUBMISSION_DOWN_TO_MINUTE -> EachSubmissionDownToMinutePenaltyCalculator(penaltyPerWrongAttempt) + PenaltyRoundingMode.SUM_DOWN_TO_MINUTE -> SumDownToMinutePenaltyCalculator(penaltyPerWrongAttempt) + PenaltyRoundingMode.SUM_IN_SECONDS -> SumInSecondsPenaltyCalculator(penaltyPerWrongAttempt) + PenaltyRoundingMode.LAST -> LastPenaltyCalculator(penaltyPerWrongAttempt) + PenaltyRoundingMode.ZERO -> ZeroPenaltyCalculator() + } + } +} + +private class ZeroPenaltyCalculator : PenaltyCalculator { + override fun addSolvedProblem(time: Duration, wrongAttempts: Int) {} + override val penalty = Duration.ZERO +} + +private class EachSubmissionDownToMinutePenaltyCalculator(private val penaltyPerWrongAttempt: Duration) : PenaltyCalculator { + override fun addSolvedProblem(time: Duration, wrongAttempts: Int) { + penalty += time.inWholeMinutes.minutes + penaltyPerWrongAttempt * wrongAttempts + } + + override var penalty = Duration.ZERO +} + +private class SumDownToMinutePenaltyCalculator(private val penaltyPerWrongAttempt: Duration) : PenaltyCalculator { + override fun addSolvedProblem(time: Duration, wrongAttempts: Int) { + penalty_ += time + wrongAttempts * penaltyPerWrongAttempt + } + + private var penalty_ = Duration.ZERO + override val penalty: Duration + get() = penalty_.inWholeMinutes.minutes +} + +private class SumInSecondsPenaltyCalculator(private val penaltyPerWrongAttempt: Duration) : PenaltyCalculator { + override fun addSolvedProblem(time: Duration, wrongAttempts: Int) { + penalty += time + wrongAttempts * penaltyPerWrongAttempt + } + + override var penalty = Duration.ZERO +} + +private class LastPenaltyCalculator(private val penaltyPerWrongAttempt: Duration) : PenaltyCalculator { + private var wrongs = 0 + private var penalty_ = Duration.ZERO + override fun addSolvedProblem(time: Duration, wrongAttempts: Int) { + wrongs += wrongAttempts + penalty_ = maxOf(penalty_, time) + } + + override val penalty + get() = penalty_ + wrongs * penaltyPerWrongAttempt +} \ No newline at end of file diff --git a/src/cds/src/main/proto/io/codedrills/proto/external/common.proto b/src/cds/src/main/proto/io/codedrills/proto/external/common.proto new file mode 100644 index 000000000..4986d8173 --- /dev/null +++ b/src/cds/src/main/proto/io/codedrills/proto/external/common.proto @@ -0,0 +1,45 @@ +syntax = "proto3"; +package io.codedrills.proto.external; + +option java_multiple_files = true; + +enum ProgrammingLanguage { + PROGRAMMING_LANGUAGE_UNKNOWN = 0; + JAVA = 1; + CPP = 2; + PYTHON = 3; + KOTLIN = 4; +} + +enum ScoringStatus { + NOT_ATTEMPTED = 0; + SOLVED = 1; + PARTIALLY_SOLVED = 2; + PROCESSING = 3; +} + +message LanguageRestriction { + repeated ProgrammingLanguage allowed_language = 1; + repeated ProgrammingLanguage disallowed_language = 2; +} + +message ContestId { + oneof uid { + int32 id = 1; + string url = 2; + } +} + +message PaginationRequestParams { + int32 page_index = 1; + int32 items_per_page = 2; +} + +message PaginationResponseParams { + PaginationRequestParams request_params = 1; + int32 total = 2; +} + +message FilterParams { + int32 after_submission = 1; +} \ No newline at end of file diff --git a/src/cds/src/main/proto/io/codedrills/proto/external/contest.proto b/src/cds/src/main/proto/io/codedrills/proto/external/contest.proto new file mode 100644 index 000000000..8d9134da7 --- /dev/null +++ b/src/cds/src/main/proto/io/codedrills/proto/external/contest.proto @@ -0,0 +1,42 @@ +syntax = "proto3"; +package io.codedrills.proto.external; + +option java_multiple_files = true; + +import "io/codedrills/proto/external/common.proto"; + +message Contest { + int32 id = 1; + string title = 2; + string url = 3; + ContestType type = 4; + bool frozen = 5; + int64 duration_seconds = 6; + int64 start_time_milli_seconds = 7; + string description = 8; + string avatar_url = 9; + string banner_url = 10; + LanguageRestriction language_restriction = 11; + ScoreboardSettings scoreboard_settings = 12; +} + +message ScoreboardSettings { + ScoreboardType scoreboard_type = 1; + int64 penalty_per_attempt_in_s = 2; + FreezeSettings freeze_settings = 3; +} + +message FreezeSettings { + int64 freeze_offset_time_in_s = 1; +} + +enum ScoreboardType { + UNKNOWN_SCOREBOARD_TYPE = 0; + ONE_POINT_WITH_PENALTY = 1; + ONE_POINT_WITH_MAX_PENALTY = 2; +} + +enum ContestType { + CONTEST_TYPE_INDIVIDUAL = 0; + CONTEST_TYPE_TEAM = 1; +} \ No newline at end of file diff --git a/src/cds/src/main/proto/io/codedrills/proto/external/contest_service.proto b/src/cds/src/main/proto/io/codedrills/proto/external/contest_service.proto new file mode 100644 index 000000000..39a7f2fbf --- /dev/null +++ b/src/cds/src/main/proto/io/codedrills/proto/external/contest_service.proto @@ -0,0 +1,37 @@ +syntax = "proto3"; +package io.codedrills.proto.external; + +option java_multiple_files = true; + +import "io/codedrills/proto/external/common.proto"; +import "io/codedrills/proto/external/scoreboard.proto"; +import "io/codedrills/proto/external/submission.proto"; + +message GetScoreboardRequest { + oneof id { + int32 contest_id = 1; + string contest_url = 2; + } +} +message GetScoreboardResponse { + Scoreboard scoreboard = 1; +} + +message ListContestSubmissionsRequest { + ContestId contest_id = 1; + PaginationRequestParams pagination_params = 2; + FilterParams filter_params = 3; +} + +message ListContestSubmissionsResponse { + repeated Submission submission = 1; + PaginationResponseParams pagination_params = 2; +} + +service ContestService { + // Get contest scoreboard. + rpc GetScoreboard (GetScoreboardRequest) returns (GetScoreboardResponse); + + // List contest submissions with pagination and filters. + rpc ListContestSubmissions (ListContestSubmissionsRequest) returns (ListContestSubmissionsResponse); +} diff --git a/src/cds/src/main/proto/io/codedrills/proto/external/problem.proto b/src/cds/src/main/proto/io/codedrills/proto/external/problem.proto new file mode 100644 index 000000000..7a753698d --- /dev/null +++ b/src/cds/src/main/proto/io/codedrills/proto/external/problem.proto @@ -0,0 +1,12 @@ +syntax = "proto3"; +package io.codedrills.proto.external; + +option java_multiple_files = true; + +message Problem { + int32 id = 1; + string title = 2; + string url = 3; + string index = 4; + repeated string tag = 5; +} diff --git a/src/cds/src/main/proto/io/codedrills/proto/external/scoreboard.proto b/src/cds/src/main/proto/io/codedrills/proto/external/scoreboard.proto new file mode 100644 index 000000000..8d33ba3c4 --- /dev/null +++ b/src/cds/src/main/proto/io/codedrills/proto/external/scoreboard.proto @@ -0,0 +1,49 @@ +syntax = "proto3"; +package io.codedrills.proto.external; + +option java_multiple_files = true; + +import "io/codedrills/proto/external/common.proto"; +import "io/codedrills/proto/external/contest.proto"; +import "io/codedrills/proto/external/problem.proto"; +import "io/codedrills/proto/external/submission.proto"; +import "io/codedrills/proto/external/team.proto"; + +message Scoreboard { + Contest contest = 1; + repeated Problem problem = 2; + repeated RanklistRow row = 3; + ScoreboardStats scoreboard_stats = 4; +} + +message RanklistRow { + Team team = 1; + int32 rank = 2; + double score = 3; + double penalty = 4; + repeated ProblemResult result = 5; +} + +message ProblemResult { + int32 problem_id = 1; + double score = 2; + double penalty = 3; + int32 total_submissions = 4; + int64 solved_at = 5; + ScoringStatus status = 6; + Submission successful_submission = 7; +} + +message ScoreboardStats { + repeated ProblemScore problem_score = 1; + int32 total_participants = 2; + int32 total_submissions = 3; +} + +message ProblemScore { + int32 problem_id = 1; + int32 total_submissions = 2; + int32 solved_user_count = 3; + double score = 4; + Problem problem = 5; +} diff --git a/src/cds/src/main/proto/io/codedrills/proto/external/submission.proto b/src/cds/src/main/proto/io/codedrills/proto/external/submission.proto new file mode 100644 index 000000000..880d346af --- /dev/null +++ b/src/cds/src/main/proto/io/codedrills/proto/external/submission.proto @@ -0,0 +1,38 @@ +syntax = "proto3"; +package io.codedrills.proto.external; + +option java_multiple_files = true; + +import "io/codedrills/proto/external/common.proto"; + +message Submission { + int32 id = 1; + int32 time_taken_in_ms = 2; + int32 memory_taken_in_kb = 3; + ProgrammingLanguage programming_language = 4; + SubmissionVerdict verdict = 5; + int64 submitted_on = 6; + double score = 7; + string submitted_by = 8; + int32 problem_id = 9; +} + +enum SubmissionVerdict { + WAITING = 0; + COMPILING = 1; + COMPILED = 2; + RUNNING = 3; + + // Keep incomplete statuses < 10 + COMPILE_ERROR = 10; + RUNTIME_ERROR = 11; + TIME_LIMIT_EXCEEDED = 12; + CORRECT_ANSWER = 13; + WRONG_ANSWER = 14; + SOURCE_LIMIT_EXCEEDED = 15; + MEMORY_LIMIT_EXCEEDED = 16; + SKIPPED = 17; + OUTPUT_LIMIT_EXCEEDED = 18; + + JUDGE_ERROR = 30; +} diff --git a/src/cds/src/main/proto/io/codedrills/proto/external/team.proto b/src/cds/src/main/proto/io/codedrills/proto/external/team.proto new file mode 100644 index 000000000..04c611182 --- /dev/null +++ b/src/cds/src/main/proto/io/codedrills/proto/external/team.proto @@ -0,0 +1,18 @@ +syntax = "proto3"; +package io.codedrills.proto.external; + +option java_multiple_files = true; + +message Team { + int32 id = 1; + string name = 2; + string institute = 3; + repeated Member member = 4; +} + +message Member { + string handle = 1; + string name = 2; + string id = 3; + +} diff --git a/src/cds/src/test/kotlin/org/icpclive/cds/AllConfigsAreParsable.kt b/src/cds/src/test/kotlin/org/icpclive/cds/AllConfigsAreParsable.kt new file mode 100644 index 000000000..3c5aad09d --- /dev/null +++ b/src/cds/src/test/kotlin/org/icpclive/cds/AllConfigsAreParsable.kt @@ -0,0 +1,40 @@ +package org.icpclive.cds + +import kotlinx.serialization.ExperimentalSerializationApi +import kotlinx.serialization.json.Json +import kotlinx.serialization.json.decodeFromStream +import org.icpclive.api.tunning.AdvancedProperties +import org.icpclive.cds.settings.parseFileToCdsSettings +import org.junit.jupiter.api.* +import kotlin.io.path.* + +class AllConfigsAreParsable { + @OptIn(ExperimentalPathApi::class) + @TestFactory + fun testSettings() : List { + val configDir = Path("").absolute().parent.parent.resolve("config") + return configDir.walk().filter { + it.name == "settings.json" || it.name == "settings.json5" + }.map { + DynamicTest.dynamicTest(it.relativeTo(configDir).toString()) { + parseFileToCdsSettings(it) + } + }.toList() + } + + @OptIn(ExperimentalPathApi::class, ExperimentalSerializationApi::class) + @TestFactory + fun testAdvancedJson() : List { + val configDir = Path("").absolute().parent.parent.resolve("config") + return configDir.walk().filter { + it.name == "advanced.json" + }.map { path -> + DynamicTest.dynamicTest(path.relativeTo(configDir).toString()) { + path.toFile().inputStream().use { + Json.decodeFromStream(it) + } + } + }.toList() + } + +} \ No newline at end of file diff --git a/src/cds/src/test/kotlin/org/icpclive/cds/CdsLoadersTest.kt b/src/cds/src/test/kotlin/org/icpclive/cds/CdsLoadersTest.kt new file mode 100644 index 000000000..b32a87966 --- /dev/null +++ b/src/cds/src/test/kotlin/org/icpclive/cds/CdsLoadersTest.kt @@ -0,0 +1,161 @@ +package org.icpclive.cds + +import kotlinx.coroutines.runBlocking +import kotlinx.coroutines.withTimeout +import kotlinx.serialization.encodeToString +import kotlinx.serialization.json.Json +import org.icpclive.api.ContestResultType +import org.icpclive.api.tunning.* +import org.icpclive.cds.adapters.applyAdvancedProperties +import org.icpclive.cds.adapters.finalContestState +import org.icpclive.cds.common.ContestParseResult +import org.icpclive.cds.settings.* +import org.opentest4j.AssertionFailedError +import java.nio.file.Path +import kotlin.test.Test +import kotlin.text.Regex +import kotlin.time.Duration.Companion.minutes + +object CdsLoadersTest { + private val goldenDataDir = Path.of("").toAbsolutePath().resolve("testData").resolve("loaders").resolve("goldenData") + private val updateTestData = false + + @Test + fun pcms() { + loaderTest( + goldenDataDir.resolve("pcms.txt"), + PCMSSettings( + url = "testData/loaders/pcms.xml" + ) + ) + } + + @Test + fun pcmsIOI() { + loaderTest( + goldenDataDir.resolve("pcmsIOI.txt"), + PCMSSettings( + resultType = ContestResultType.IOI, + url = "testData/loaders/pcms-ioi.xml" + ) + ) + } + + @Test + fun ejudge() { + loaderTest( + goldenDataDir.resolve("ejudge.txt"), + EjudgeSettings( + url = "testData/loaders/ejudge.xml" + ) + ) + } + + + @Test + fun clics202003() { + loaderTest( + goldenDataDir.resolve("clics202003.txt"), + ClicsSettings( + url = "testData/loaders/clics-2020-03", + feedVersion = ClicsSettings.FeedVersion.`2020_03` + ) + ) + } + + @Test + fun clics202207() { + loaderTest( + goldenDataDir.resolve("clics202207.txt"), + ClicsSettings( + url = "testData/loaders/clics-2022-07", + feedVersion = ClicsSettings.FeedVersion.`2022_07` + ) + ) + } + + @Test + fun testSys() { + loaderTest( + goldenDataDir.resolve("testSys.txt"), + TestSysSettings( + url = "testData/loaders/testsys.dat" + ) + ) + } + + @Test + fun testSysWithAdvancedOverride() { + loaderTest( + goldenDataDir.resolve("testSysWithAdvancedOverride.txt"), + TestSysSettings( + url = "testData/loaders/testsys.dat" + ), + AdvancedProperties( + teamRegexes = TeamRegexOverrides( + groupRegex = mapOf( + "outOfContest" to Regex("^\\(вк\\).*"), + "firstGrade" to Regex("^\\(1к\\).*"), + "school" to Regex("^\\(шк\\).*") + ), + customFields = mapOf( + "funnyName" to Regex("^(?:\\(..\\) )?(.*) \\([^)]*\\)") + ), + ), + groupOverrides = mapOf( + "outOfContest" to GroupInfoOverride(isOutOfContest = true) + ), + teamOverrideTemplate = TeamOverrideTemplate( + displayName = "{funnyName}" + ) + ) + ) + } + + + + private val json = Json { + prettyPrint = true + } + + private fun loaderTest(expectedFile: Path, args: CDSSettings, advanced: AdvancedProperties? = null) { + val loader = args.toFlow(emptyMap()) + val result = runBlocking { + val result = withTimeout(1.minutes) { + loader.finalContestState().let { + ContestParseResult( + it.infoAfterEvent!!, + it.runs.values.toList(), + it.analyticsMessages.values.toList() + ) + } + } + if (advanced != null) { + result.copy( + contestInfo = applyAdvancedProperties( + result.contestInfo, + advanced, + result.runs.map { it.teamId }.toSet() + ) + ) + } else { + result + } + } + fun sanitize(s: String) = s.trim().replace(" +$", "").replace(System.lineSeparator(), "\n") + val actual = sanitize(json.encodeToString(result)) + val expected = sanitize(expectedFile.toFile().takeIf { it.exists() }?.readText() ?: "") + if (actual != expected) { + if (updateTestData) { + expectedFile.toFile().printWriter().use { + it.print(actual.replace("\n", System.lineSeparator())) + } + } + throw AssertionFailedError( + "Actual result doesn't match expected in file ${expectedFile}\n", + expected, + actual, + ) + } + } +} \ No newline at end of file diff --git a/src/cds/src/test/kotlin/org/icpclive/cds/ICPCScoreboardTest.kt b/src/cds/src/test/kotlin/org/icpclive/cds/ICPCScoreboardTest.kt new file mode 100644 index 000000000..4a5a54421 --- /dev/null +++ b/src/cds/src/test/kotlin/org/icpclive/cds/ICPCScoreboardTest.kt @@ -0,0 +1,47 @@ +package org.icpclive.cds + +import kotlinx.datetime.Instant +import org.icpclive.api.* +import org.icpclive.scoreboard.getScoreboardCalculator +import kotlin.test.Test +import kotlin.test.assertEquals +import kotlin.time.Duration.Companion.hours +import kotlin.time.Duration.Companion.minutes + +class ICPCScoreboardTest { + val info = ContestInfo( + name = "", + status = ContestStatus.OVER, + resultType = ContestResultType.ICPC, + startTime = Instant.fromEpochMilliseconds(1687460000), + contestLength = 5.hours, + freezeTime = 4.hours, + problemList = listOf( + ProblemInfo("A", "A", 1, 0, "A"), + ProblemInfo("B", "B", 2, 1, "B"), + ), + teamList = listOf( + TeamInfo(1, "T1", "T1", "T1", emptyList(), null, emptyMap(), false, false, null), + TeamInfo(2, "T2", "T2", "T2", emptyList(), null, emptyMap(), false, false, null), + TeamInfo(3, "T3", "T3", "T3", emptyList(), null, emptyMap(), false, false, null), + TeamInfo(4, "T4", "T4", "T4", emptyList(), null, emptyMap(), false, false, null), + ), + groupList = emptyList(), + organizationList = emptyList(), + penaltyRoundingMode = PenaltyRoundingMode.EACH_SUBMISSION_DOWN_TO_MINUTE, + ) + + @Test + fun testRanks() { + val runs = listOf( + RunInfo(1, ICPCRunResult(Verdict.Accepted, false), 1.0, 1, 4, 10.minutes), + RunInfo(3, ICPCRunResult(Verdict.Accepted, false), 1.0, 1, 1, 30.minutes), + RunInfo(4, ICPCRunResult(Verdict.Accepted, false), 1.0, 1, 3, 30.minutes), + RunInfo(5, ICPCRunResult(Verdict.Accepted, false), 1.0, 1, 2, 40.minutes), + ) + val scoreboard = getScoreboardCalculator(info, OptimismLevel.NORMAL).getScoreboard(info, runs.groupBy { it.teamId }) + assertEquals(scoreboard.rows.map { it.rank }, listOf(1, 2, 2, 4)) + assertEquals(scoreboard.rows.map { it.teamId }, listOf(4, 1, 3, 2)) + } + +} \ No newline at end of file diff --git a/src/cds/src/test/kotlin/org/icpclive/cds/clics/CdsLoadersTest.kt b/src/cds/src/test/kotlin/org/icpclive/cds/clics/CdsLoadersTest.kt deleted file mode 100644 index 0b08ae86e..000000000 --- a/src/cds/src/test/kotlin/org/icpclive/cds/clics/CdsLoadersTest.kt +++ /dev/null @@ -1,70 +0,0 @@ -import kotlinx.coroutines.runBlocking -import kotlinx.serialization.encodeToString -import kotlinx.serialization.json.Json -import org.approvaltests.Approvals -import org.approvaltests.core.Options -import org.icpclive.cds.getRawLoader -import org.junit.* -import java.util.Properties - -class CdsLoadersTest { - @Test - fun pcmsTest() { - loaderTest( - mapOf( - "standings.type" to "PCMS", - "url" to "testData/loaders/pcms.xml" - ) - ) - } - - @Test - fun pcmsIOITest() { - loaderTest( - mapOf( - "standings.type" to "PCMS", - "standings.resultType" to "IOI", - "url" to "testData/loaders/pcms-ioi.xml" - ) - ) - } - - - @Test - fun clics202003Test() { - loaderTest( - mapOf( - "standings.type" to "CLICS", - "feed_version" to "2020_03", - "url" to "testData/loaders/clics-2020-03" - ) - ) - } - - @Test - fun clics202207Test() { - loaderTest( - mapOf( - "standings.type" to "CLICS", - "feed_version" to "2022_07", - "url" to "testData/loaders/clics-2022-07" - ) - ) - } - - - private val json = Json { - prettyPrint = true - } - - private fun loaderTest(args: Map) { - val properties = Properties() - for ((k, v) in args) { - properties.setProperty(k, v) - } - val loader = getRawLoader(properties, emptyMap()) - val result = runBlocking { loader.loadOnce() } - val options = Options() - Approvals.verify(json.encodeToString(result), options) - } -} \ No newline at end of file diff --git a/src/cds/testData/loaders/ejudge.xml b/src/cds/testData/loaders/ejudge.xml new file mode 100644 index 000000000..1defeb1c1 --- /dev/null +++ b/src/cds/testData/loaders/ejudge.xml @@ -0,0 +1,1260 @@ + + + МКОШП 2022 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/cds/src/test/kotlin/org/icpclive/cds/clics/CdsLoadersTest.clics202003Test.approved.txt b/src/cds/testData/loaders/goldenData/clics202003.txt similarity index 97% rename from src/cds/src/test/kotlin/org/icpclive/cds/clics/CdsLoadersTest.clics202003Test.approved.txt rename to src/cds/testData/loaders/goldenData/clics202003.txt index 729a9e8cc..a55dcd8ae 100644 --- a/src/cds/src/test/kotlin/org/icpclive/cds/clics/CdsLoadersTest.clics202003Test.approved.txt +++ b/src/cds/testData/loaders/goldenData/clics202003.txt @@ -1,7 +1,7 @@ { "contestInfo": { "name": "ICPC World Finals Moscow", - "status": "OVER", + "status": "FINALIZED", "resultType": "ICPC", "startTimeUnixMs": 1633414869000, "contestLengthMs": 18000000, @@ -143,6 +143,12 @@ "type": "Photo", "url": "/contests/finals/teams/1/photo.jpg" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "3664", + "customFields": { + "name": "Ain Shams University - Faculty of Computer and Information Sciences" } }, { @@ -159,6 +165,12 @@ "type": "Photo", "url": "/contests/finals/teams/10/photo.jpg" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "0144", + "customFields": { + "name": "Belarusian State University" } }, { @@ -171,6 +183,12 @@ ], "hashTag": null, "medias": { + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "1962", + "customFields": { + "name": "University of Aizu" } }, { @@ -187,6 +205,12 @@ "type": "Photo", "url": "/contests/finals/teams/101/photo.jpg" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "2324", + "customFields": { + "name": "University of British Columbia" } }, { @@ -203,6 +227,12 @@ "type": "Photo", "url": "/contests/finals/teams/102/photo.jpg" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "0196", + "customFields": { + "name": "University of Bucharest" } }, { @@ -219,6 +249,12 @@ "type": "Photo", "url": "/contests/finals/teams/103/photo.jpg" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "2343", + "customFields": { + "name": "University of Cambridge" } }, { @@ -235,6 +271,12 @@ "type": "Photo", "url": "/contests/finals/teams/104/photo.jpg" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "2349", + "customFields": { + "name": "University of Central Florida" } }, { @@ -251,6 +293,12 @@ "type": "Photo", "url": "/contests/finals/teams/105/photo.jpg" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "2366", + "customFields": { + "name": "University of Dhaka" } }, { @@ -267,6 +315,12 @@ "type": "Photo", "url": "/contests/finals/teams/106/photo.jpg" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "2387", + "customFields": { + "name": "University of Illinois at Urbana-Champaign" } }, { @@ -283,6 +337,12 @@ "type": "Photo", "url": "/contests/finals/teams/107/photo.jpg" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "2400", + "customFields": { + "name": "University of Latvia" } }, { @@ -299,6 +359,12 @@ "type": "Photo", "url": "/contests/finals/teams/108/photo.jpg" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "2493", + "customFields": { + "name": "University of Rochester" } }, { @@ -315,6 +381,12 @@ "type": "Photo", "url": "/contests/finals/teams/109/photo.jpg" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "2519", + "customFields": { + "name": "University of Southern California" } }, { @@ -331,6 +403,12 @@ "type": "Photo", "url": "/contests/finals/teams/11/photo.jpg" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "0140", + "customFields": { + "name": "Belarusian State University of Informatics and Radioelectronics" } }, { @@ -343,6 +421,12 @@ ], "hashTag": null, "medias": { + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "2528", + "customFields": { + "name": "University of Tehran" } }, { @@ -359,6 +443,12 @@ "type": "Photo", "url": "/contests/finals/teams/111/photo.jpg" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "2562", + "customFields": { + "name": "University of Utah" } }, { @@ -375,6 +465,12 @@ "type": "Photo", "url": "/contests/finals/teams/112/photo.jpg" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "2673", + "customFields": { + "name": "University of Warsaw" } }, { @@ -391,6 +487,12 @@ "type": "Photo", "url": "/contests/finals/teams/113/photo.jpg" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "2574", + "customFields": { + "name": "University of Wisconsin - Madison" } }, { @@ -407,6 +509,12 @@ "type": "Photo", "url": "/contests/finals/teams/114/photo.jpg" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "2589", + "customFields": { + "name": "University of Wroclaw" } }, { @@ -423,6 +531,12 @@ "type": "Photo", "url": "/contests/finals/teams/115/photo.jpg" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "12694", + "customFields": { + "name": "Utrecht - Leiden University" } }, { @@ -439,6 +553,12 @@ "type": "Photo", "url": "/contests/finals/teams/116/photo.jpg" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "2648", + "customFields": { + "name": "Virginia Tech" } }, { @@ -455,6 +575,12 @@ "type": "Photo", "url": "/contests/finals/teams/117/photo.jpg" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "2659", + "customFields": { + "name": "Volgograd State Technical University" } }, { @@ -471,6 +597,12 @@ "type": "Photo", "url": "/contests/finals/teams/118/photo.jpg" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "2742", + "customFields": { + "name": "Yerevan State University" } }, { @@ -487,6 +619,12 @@ "type": "Photo", "url": "/contests/finals/teams/119/photo.jpg" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "2745", + "customFields": { + "name": "Yonsei University" } }, { @@ -503,6 +641,12 @@ "type": "Photo", "url": "/contests/finals/teams/12/photo.jpg" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "0160", + "customFields": { + "name": "Bilkent University" } }, { @@ -519,6 +663,12 @@ "type": "Photo", "url": "/contests/finals/teams/13/photo.jpg" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "5628", + "customFields": { + "name": "BITS-Pilani, Hyderabad Campus" } }, { @@ -535,6 +685,12 @@ "type": "Photo", "url": "/contests/finals/teams/14/photo.jpg" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "3348", + "customFields": { + "name": "Cairo University - Faculty of Computers and Artificial Intelligence" } }, { @@ -551,6 +707,12 @@ "type": "Photo", "url": "/contests/finals/teams/16/photo.jpg" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "0358", + "customFields": { + "name": "Damascus University" } }, { @@ -567,6 +729,12 @@ "type": "Photo", "url": "/contests/finals/teams/17/photo.jpg" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "3944", + "customFields": { + "name": "Dhirubhai Ambani Institute of Information and Communication Technology, Gandhinagar" } }, { @@ -583,6 +751,12 @@ "type": "Photo", "url": "/contests/finals/teams/18/photo.jpg" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "0413", + "customFields": { + "name": "Duke University" } }, { @@ -599,6 +773,12 @@ "type": "Photo", "url": "/contests/finals/teams/19/photo.jpg" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "3436", + "customFields": { + "name": "École Normale Supérieure de Paris" } }, { @@ -615,6 +795,12 @@ "type": "Photo", "url": "/contests/finals/teams/2/photo.jpg" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "7113", + "customFields": { + "name": "Al-Baath University" } }, { @@ -631,6 +817,12 @@ "type": "Photo", "url": "/contests/finals/teams/20/photo.jpg" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "0443", + "customFields": { + "name": "Ecole Polytechnique" } }, { @@ -647,6 +839,12 @@ "type": "Photo", "url": "/contests/finals/teams/21/photo.jpg" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "0451", + "customFields": { + "name": "ETH Zürich" } }, { @@ -663,6 +861,12 @@ "type": "Photo", "url": "/contests/finals/teams/22/photo.jpg" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "3360", + "customFields": { + "name": "Faculty of Computer Science, Belgrade " } }, { @@ -679,6 +883,12 @@ "type": "Photo", "url": "/contests/finals/teams/23/photo.jpg" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "5724", + "customFields": { + "name": "Free University of Tbilisi" } }, { @@ -695,6 +905,12 @@ "type": "Photo", "url": "/contests/finals/teams/24/photo.jpg" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "3519", + "customFields": { + "name": "German University in Cairo" } }, { @@ -711,6 +927,12 @@ "type": "Photo", "url": "/contests/finals/teams/25/photo.jpg" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "0642", + "customFields": { + "name": "Harvard University" } }, { @@ -727,6 +949,12 @@ "type": "Photo", "url": "/contests/finals/teams/26/photo.jpg" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "6581", + "customFields": { + "name": "Higher Institute for Applied Sciences and Technology" } }, { @@ -739,6 +967,12 @@ ], "hashTag": null, "medias": { + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "0724", + "customFields": { + "name": "Indian Institute of Technology - Bombay" } }, { @@ -755,6 +989,12 @@ "type": "Photo", "url": "/contests/finals/teams/28/photo.jpg" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "0725", + "customFields": { + "name": "Indian Institute of Technology - Delhi" } }, { @@ -771,6 +1011,12 @@ "type": "Photo", "url": "/contests/finals/teams/29/photo.jpg" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "0718", + "customFields": { + "name": "Indian Institute of Technology - Guwahati" } }, { @@ -787,6 +1033,12 @@ "type": "Photo", "url": "/contests/finals/teams/3/photo.jpg" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "0502", + "customFields": { + "name": "Alexandria University - Faculty of Engineering" } }, { @@ -803,6 +1055,12 @@ "type": "Photo", "url": "/contests/finals/teams/30/photo.jpg" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "5640", + "customFields": { + "name": "Indian Institute of Technology - Indore" } }, { @@ -819,6 +1077,12 @@ "type": "Photo", "url": "/contests/finals/teams/31/photo.jpg" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "0727", + "customFields": { + "name": "Indian Institute of Technology - Kanpur" } }, { @@ -835,6 +1099,12 @@ "type": "Photo", "url": "/contests/finals/teams/32/photo.jpg" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "0728", + "customFields": { + "name": "Indian Institute of Technology - Kharagpur" } }, { @@ -851,6 +1121,12 @@ "type": "Photo", "url": "/contests/finals/teams/33/photo.jpg" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "6908", + "customFields": { + "name": "Indian Institute of Technology - Patna" } }, { @@ -867,6 +1143,12 @@ "type": "Photo", "url": "/contests/finals/teams/34/photo.jpg" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "0722", + "customFields": { + "name": "Indian Institute of Technology - Roorkee" } }, { @@ -883,6 +1165,12 @@ "type": "Photo", "url": "/contests/finals/teams/35/photo.jpg" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "9406", + "customFields": { + "name": "Indian Institute of Technology - Varanasi" } }, { @@ -899,6 +1187,12 @@ "type": "Photo", "url": "/contests/finals/teams/36/photo.jpg" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "3919", + "customFields": { + "name": "Indian Institute of Technology (ISM), Dhanbad" } }, { @@ -915,6 +1209,12 @@ "type": "Photo", "url": "/contests/finals/teams/37/photo.jpg" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "9574", + "customFields": { + "name": "Indraprastha Institute of Information Technology" } }, { @@ -931,6 +1231,12 @@ "type": "Photo", "url": "/contests/finals/teams/38/photo.jpg" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "7857", + "customFields": { + "name": "Innopolis University" } }, { @@ -947,6 +1253,12 @@ "type": "Photo", "url": "/contests/finals/teams/39/photo.jpg" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "6960", + "customFields": { + "name": "Institut National des Sciences Appliquées et de Technologie" } }, { @@ -963,6 +1275,12 @@ "type": "Photo", "url": "/contests/finals/teams/4/photo.jpg" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "0061", + "customFields": { + "name": "American University - Central Asia" } }, { @@ -979,6 +1297,12 @@ "type": "Photo", "url": "/contests/finals/teams/40/photo.jpg" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "7325", + "customFields": { + "name": "Institute of Computing - Federal University of Amazonas" } }, { @@ -995,6 +1319,12 @@ "type": "Photo", "url": "/contests/finals/teams/41/photo.jpg" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "3071", + "customFields": { + "name": "Instituto de Informática - UFG" } }, { @@ -1011,6 +1341,12 @@ "type": "Photo", "url": "/contests/finals/teams/42/photo.jpg" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "0846", + "customFields": { + "name": "International Institute of Information Technology - Hyderabad" } }, { @@ -1027,6 +1363,12 @@ "type": "Photo", "url": "/contests/finals/teams/43/photo.jpg" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "4330", + "customFields": { + "name": "International IT University" } }, { @@ -1043,6 +1385,12 @@ "type": "Photo", "url": "/contests/finals/teams/44/photo.jpg" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "0923", + "customFields": { + "name": "Izhevsk State Technical University" } }, { @@ -1059,6 +1407,12 @@ "type": "Photo", "url": "/contests/finals/teams/45/photo.jpg" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "0931", + "customFields": { + "name": "Jagiellonian University in Krakow" } }, { @@ -1075,6 +1429,12 @@ "type": "Photo", "url": "/contests/finals/teams/46/photo.jpg" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "0993", + "customFields": { + "name": "Kazan (Volga Region) Federal University" } }, { @@ -1091,6 +1451,12 @@ "type": "Photo", "url": "/contests/finals/teams/47/photo.jpg" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "1008", + "customFields": { + "name": "Kharkiv National University of Radio Electronics" } }, { @@ -1107,6 +1473,12 @@ "type": "Photo", "url": "/contests/finals/teams/48/photo.jpg" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "1026", + "customFields": { + "name": "Korea University" } }, { @@ -1123,6 +1495,12 @@ "type": "Photo", "url": "/contests/finals/teams/49/photo.jpg" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "7423", + "customFields": { + "name": "Kyungpook National University" } }, { @@ -1139,6 +1517,12 @@ "type": "Photo", "url": "/contests/finals/teams/5/photo.jpg" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "0065", + "customFields": { + "name": "American University of Beirut" } }, { @@ -1155,6 +1539,12 @@ "type": "Photo", "url": "/contests/finals/teams/50/photo.jpg" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "1145", + "customFields": { + "name": "Massachusetts Institute of Technology" } }, { @@ -1171,6 +1561,12 @@ "type": "Photo", "url": "/contests/finals/teams/51/photo.jpg" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "1214", + "customFields": { + "name": "Moscow Aviation Institute" } }, { @@ -1187,6 +1583,12 @@ "type": "Photo", "url": "/contests/finals/teams/52/photo.jpg" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "1220", + "customFields": { + "name": "Moscow Institute of Physics and Technology" } }, { @@ -1203,6 +1605,12 @@ "type": "Photo", "url": "/contests/finals/teams/53/photo.jpg" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "1237", + "customFields": { + "name": "Moscow State University" } }, { @@ -1219,6 +1627,12 @@ "type": "Photo", "url": "/contests/finals/teams/54/photo.jpg" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "1215", + "customFields": { + "name": "National Research Nuclear University MEPhI (Moscow Engineering Physics Institute)" } }, { @@ -1235,6 +1649,12 @@ "type": "Photo", "url": "/contests/finals/teams/55/photo.jpg" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "3534", + "customFields": { + "name": "National Research University Higher School of Economics" } }, { @@ -1251,6 +1671,12 @@ "type": "Photo", "url": "/contests/finals/teams/56/photo.jpg" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "1303", + "customFields": { + "name": "National Taiwan University" } }, { @@ -1267,6 +1693,12 @@ "type": "Photo", "url": "/contests/finals/teams/58/photo.jpg" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "9780", + "customFields": { + "name": "Netaji Subhash University Of Technology" } }, { @@ -1283,6 +1715,12 @@ "type": "Photo", "url": "/contests/finals/teams/59/photo.jpg" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "1338", + "customFields": { + "name": "Nizhny Novgorod State University" } }, { @@ -1299,6 +1737,12 @@ "type": "Photo", "url": "/contests/finals/teams/6/photo.jpg" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "0068", + "customFields": { + "name": "Amirkabir University of Technology" } }, { @@ -1311,6 +1755,12 @@ ], "hashTag": null, "medias": { + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "7898", + "customFields": { + "name": "NU-FAST Karachi" } }, { @@ -1327,6 +1777,12 @@ "type": "Photo", "url": "/contests/finals/teams/61/photo.jpg" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "1452", + "customFields": { + "name": "Perm State University" } }, { @@ -1343,6 +1799,12 @@ "type": "Photo", "url": "/contests/finals/teams/62/photo.jpg" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "4376", + "customFields": { + "name": "Princess Sumaya University for Technology" } }, { @@ -1359,6 +1821,12 @@ "type": "Photo", "url": "/contests/finals/teams/63/photo.jpg" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "3328", + "customFields": { + "name": "Purdue University" } }, { @@ -1375,6 +1843,12 @@ "type": "Photo", "url": "/contests/finals/teams/64/photo.jpg" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "1623", + "customFields": { + "name": "Saratov State University" } }, { @@ -1391,6 +1865,12 @@ "type": "Photo", "url": "/contests/finals/teams/65/photo.jpg" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "1636", + "customFields": { + "name": "Seoul National University" } }, { @@ -1407,6 +1887,12 @@ "type": "Photo", "url": "/contests/finals/teams/66/photo.jpg" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "1677", + "customFields": { + "name": "Sharif University of Technology" } }, { @@ -1423,6 +1909,12 @@ "type": "Photo", "url": "/contests/finals/teams/67/photo.jpg" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "1730", + "customFields": { + "name": "Sogang University" } }, { @@ -1439,6 +1931,12 @@ "type": "Photo", "url": "/contests/finals/teams/68/photo.jpg" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "9606", + "customFields": { + "name": "St. Petersburg Campus of Higher School of Economics" } }, { @@ -1455,6 +1953,12 @@ "type": "Photo", "url": "/contests/finals/teams/69/photo.jpg" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "3295", + "customFields": { + "name": "St. Petersburg ITMO University" } }, { @@ -1471,6 +1975,12 @@ "type": "Photo", "url": "/contests/finals/teams/7/photo.jpg" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "0081", + "customFields": { + "name": "Arab Academy for Science and Technology - Alexandria" } }, { @@ -1487,6 +1997,12 @@ "type": "Photo", "url": "/contests/finals/teams/70/photo.jpg" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "1802", + "customFields": { + "name": "St. Petersburg State University" } }, { @@ -1503,6 +2019,12 @@ "type": "Photo", "url": "/contests/finals/teams/71/photo.jpg" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "1822", + "customFields": { + "name": "Stanford University" } }, { @@ -1519,6 +2041,12 @@ "type": "Photo", "url": "/contests/finals/teams/72/photo.jpg" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "8162", + "customFields": { + "name": "Syrian Virtual University" } }, { @@ -1535,6 +2063,12 @@ "type": "Photo", "url": "/contests/finals/teams/73/photo.jpg" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "1917", + "customFields": { + "name": "Technische Universität München" } }, { @@ -1551,6 +2085,12 @@ "type": "Photo", "url": "/contests/finals/teams/74/photo.jpg" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "1966", + "customFields": { + "name": "The University of Asia Pacific" } }, { @@ -1567,6 +2107,12 @@ "type": "Photo", "url": "/contests/finals/teams/75/photo.jpg" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "1977", + "customFields": { + "name": "The University of Jordan" } }, { @@ -1583,6 +2129,12 @@ "type": "Photo", "url": "/contests/finals/teams/76/photo.jpg" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "2538", + "customFields": { + "name": "The University of Texas at Dallas" } }, { @@ -1599,6 +2151,12 @@ "type": "Photo", "url": "/contests/finals/teams/77/photo.jpg" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "3775", + "customFields": { + "name": "Tishreen University" } }, { @@ -1615,6 +2173,12 @@ "type": "Photo", "url": "/contests/finals/teams/78/photo.jpg" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "4846", + "customFields": { + "name": "Ulsan National Institute of Science and Technology" } }, { @@ -1631,6 +2195,12 @@ "type": "Photo", "url": "/contests/finals/teams/79/photo.jpg" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "3683", + "customFields": { + "name": "Universidad de Buenos Aires - FCEN" } }, { @@ -1647,6 +2217,12 @@ "type": "Photo", "url": "/contests/finals/teams/8/photo.jpg" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "8628", + "customFields": { + "name": "Avicenna University" } }, { @@ -1659,6 +2235,12 @@ ], "hashTag": null, "medias": { + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "2107", + "customFields": { + "name": "Universidad de Chile" } }, { @@ -1671,6 +2253,12 @@ ], "hashTag": null, "medias": { + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "5716", + "customFields": { + "name": "Universidad de Costa Rica" } }, { @@ -1687,6 +2275,12 @@ "type": "Photo", "url": "/contests/finals/teams/82/photo.jpg" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "8140", + "customFields": { + "name": "Universidad de Guanajuato - DCNE" } }, { @@ -1703,6 +2297,12 @@ "type": "Photo", "url": "/contests/finals/teams/83/photo.jpg" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "2112", + "customFields": { + "name": "Universidad de La Habana" } }, { @@ -1719,6 +2319,12 @@ "type": "Photo", "url": "/contests/finals/teams/84/photo.jpg" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "4193", + "customFields": { + "name": "Universidad de Oriente - Sede Antonio Maceo" } }, { @@ -1735,6 +2341,12 @@ "type": "Photo", "url": "/contests/finals/teams/85/photo.jpg" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "3098", + "customFields": { + "name": "Universidad Icesi" } }, { @@ -1751,6 +2363,12 @@ "type": "Photo", "url": "/contests/finals/teams/86/photo.jpg" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "3272", + "customFields": { + "name": "Universidad Nacional de Colombia - Bogotá" } }, { @@ -1767,6 +2385,12 @@ "type": "Photo", "url": "/contests/finals/teams/87/photo.jpg" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "0492", + "customFields": { + "name": "Universidad Nacional de Córdoba - FaMAF" } }, { @@ -1783,6 +2407,12 @@ "type": "Photo", "url": "/contests/finals/teams/88/photo.jpg" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "3487", + "customFields": { + "name": "Universidad Nacional del Sur" } }, { @@ -1799,6 +2429,12 @@ "type": "Photo", "url": "/contests/finals/teams/89/photo.jpg" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "3372", + "customFields": { + "name": "Universidad Panamericana Campus Bonaterra" } }, { @@ -1811,6 +2447,12 @@ ], "hashTag": null, "medias": { + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "0114", + "customFields": { + "name": "Bangladesh University of Engineering and Technology" } }, { @@ -1823,6 +2465,12 @@ ], "hashTag": null, "medias": { + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "2172", + "customFields": { + "name": "Universidad Simón Bolívar" } }, { @@ -1839,6 +2487,12 @@ "type": "Photo", "url": "/contests/finals/teams/91/photo.jpg" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "2195", + "customFields": { + "name": "Universidade de Brasília" } }, { @@ -1855,6 +2509,12 @@ "type": "Photo", "url": "/contests/finals/teams/92/photo.jpg" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "2204", + "customFields": { + "name": "Universidade de São Paulo" } }, { @@ -1871,6 +2531,12 @@ "type": "Photo", "url": "/contests/finals/teams/93/photo.jpg" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "0695", + "customFields": { + "name": "Universidade de São Paulo - Campus de São Carlos" } }, { @@ -1887,6 +2553,12 @@ "type": "Photo", "url": "/contests/finals/teams/94/photo.jpg" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "2216", + "customFields": { + "name": "Universidade Estadual de Campinas" } }, { @@ -1903,6 +2575,12 @@ "type": "Photo", "url": "/contests/finals/teams/95/photo.jpg" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "2230", + "customFields": { + "name": "Universidade Federal de Minas Gerais" } }, { @@ -1919,6 +2597,12 @@ "type": "Photo", "url": "/contests/finals/teams/96/photo.jpg" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "2232", + "customFields": { + "name": "Universidade Federal de Pernambuco" } }, { @@ -1935,6 +2619,12 @@ "type": "Photo", "url": "/contests/finals/teams/97/photo.jpg" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "4166", + "customFields": { + "name": "Universidade Federal do Ceará - Campus Quixadá" } }, { @@ -1951,6 +2641,12 @@ "type": "Photo", "url": "/contests/finals/teams/98/photo.jpg" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "7990", + "customFields": { + "name": "Università Degli Studi di Milano" } }, { @@ -1967,38 +2663,655 @@ "type": "Photo", "url": "/contests/finals/teams/99/photo.jpg" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "2390", + "customFields": { + "name": "Universitas Indonesia" } } ], "groups": [ { - "name": "System" + "name": "System", + "isHidden": false, + "isOutOfContest": false }, { - "name": "North America" + "name": "North America", + "isHidden": false, + "isOutOfContest": false }, { - "name": "Northern Eurasia" + "name": "Northern Eurasia", + "isHidden": false, + "isOutOfContest": false }, { - "name": "Asia West" + "name": "Asia West", + "isHidden": false, + "isOutOfContest": false }, { - "name": "Europe" + "name": "Europe", + "isHidden": false, + "isOutOfContest": false }, { - "name": "Latin America" + "name": "Latin America", + "isHidden": false, + "isOutOfContest": false }, { - "name": "Africa and the Middle East" + "name": "Africa and the Middle East", + "isHidden": false, + "isOutOfContest": false }, { - "name": "Asia Pacific" + "name": "Asia Pacific", + "isHidden": false, + "isOutOfContest": false }, { - "name": "Jury" + "name": "Jury", + "isHidden": false, + "isOutOfContest": false } - ] + ], + "organizations": [ + { + "cdsId": "0061", + "displayName": "AUCA", + "fullName": "American University - Central Asia" + }, + { + "cdsId": "0065", + "displayName": "AU Beirut", + "fullName": "American University of Beirut" + }, + { + "cdsId": "0068", + "displayName": "Amirkabir UT", + "fullName": "Amirkabir University of Technology" + }, + { + "cdsId": "0081", + "displayName": "AAST-Alex", + "fullName": "Arab Academy for Science and Technology - Alexandria" + }, + { + "cdsId": "0114", + "displayName": "BUET", + "fullName": "Bangladesh University of Engineering and Technology" + }, + { + "cdsId": "0140", + "displayName": "BSUIR", + "fullName": "Belarusian State University of Informatics and Radioelectronics" + }, + { + "cdsId": "0144", + "displayName": "Belarusian SU", + "fullName": "Belarusian State University" + }, + { + "cdsId": "0160", + "displayName": "Bilkent U.", + "fullName": "Bilkent University" + }, + { + "cdsId": "0196", + "displayName": "UniBuc", + "fullName": "University of Bucharest" + }, + { + "cdsId": "0232", + "displayName": "Carnegie Mellon", + "fullName": "Carnegie Mellon University" + }, + { + "cdsId": "0358", + "displayName": "Damascus U", + "fullName": "Damascus University" + }, + { + "cdsId": "0413", + "displayName": "Duke", + "fullName": "Duke University" + }, + { + "cdsId": "0443", + "displayName": "EP", + "fullName": "Ecole Polytechnique" + }, + { + "cdsId": "0451", + "displayName": "ETH Zürich", + "fullName": "ETH Zürich" + }, + { + "cdsId": "0492", + "displayName": "FAMAF - UNC", + "fullName": "Universidad Nacional de Córdoba - FaMAF" + }, + { + "cdsId": "0502", + "displayName": "Alex-FE", + "fullName": "Alexandria University - Faculty of Engineering" + }, + { + "cdsId": "0642", + "displayName": "Harvard", + "fullName": "Harvard University" + }, + { + "cdsId": "0695", + "displayName": "USP - São Carlos", + "fullName": "Universidade de São Paulo - Campus de São Carlos" + }, + { + "cdsId": "0718", + "displayName": "IIT Guwahati", + "fullName": "Indian Institute of Technology - Guwahati" + }, + { + "cdsId": "0722", + "displayName": "IIT Roorkee", + "fullName": "Indian Institute of Technology - Roorkee" + }, + { + "cdsId": "0724", + "displayName": "IIT Bombay", + "fullName": "Indian Institute of Technology - Bombay" + }, + { + "cdsId": "0725", + "displayName": "IIT Delhi", + "fullName": "Indian Institute of Technology - Delhi" + }, + { + "cdsId": "0727", + "displayName": "IIT Kanpur", + "fullName": "Indian Institute of Technology - Kanpur" + }, + { + "cdsId": "0728", + "displayName": "IIT Kharagpur", + "fullName": "Indian Institute of Technology - Kharagpur" + }, + { + "cdsId": "0846", + "displayName": "IIIT Hyderabad", + "fullName": "International Institute of Information Technology - Hyderabad" + }, + { + "cdsId": "0923", + "displayName": "Izhevsk STU", + "fullName": "Izhevsk State Technical University" + }, + { + "cdsId": "0931", + "displayName": "Jagiellonian", + "fullName": "Jagiellonian University in Krakow" + }, + { + "cdsId": "0993", + "displayName": "Kazan FU", + "fullName": "Kazan (Volga Region) Federal University" + }, + { + "cdsId": "1008", + "displayName": "KhNURE", + "fullName": "Kharkiv National University of Radio Electronics" + }, + { + "cdsId": "1026", + "displayName": "Korea U", + "fullName": "Korea University" + }, + { + "cdsId": "1145", + "displayName": "MIT", + "fullName": "Massachusetts Institute of Technology" + }, + { + "cdsId": "1214", + "displayName": "MAI", + "fullName": "Moscow Aviation Institute" + }, + { + "cdsId": "1215", + "displayName": "MEPhI", + "fullName": "National Research Nuclear University MEPhI (Moscow Engineering Physics Institute)" + }, + { + "cdsId": "1220", + "displayName": "MIPT", + "fullName": "Moscow Institute of Physics and Technology" + }, + { + "cdsId": "1237", + "displayName": "Moscow SU", + "fullName": "Moscow State University" + }, + { + "cdsId": "12694", + "displayName": "Utrecht - Leiden", + "fullName": "Utrecht - Leiden University" + }, + { + "cdsId": "1303", + "displayName": "National Taiwan U", + "fullName": "National Taiwan University" + }, + { + "cdsId": "1338", + "displayName": "UNN", + "fullName": "Nizhny Novgorod State University" + }, + { + "cdsId": "1452", + "displayName": "Perm SU", + "fullName": "Perm State University" + }, + { + "cdsId": "1623", + "displayName": "Saratov State U", + "fullName": "Saratov State University" + }, + { + "cdsId": "1636", + "displayName": "Seoul National U", + "fullName": "Seoul National University" + }, + { + "cdsId": "1677", + "displayName": "Sharif UT", + "fullName": "Sharif University of Technology" + }, + { + "cdsId": "1730", + "displayName": "Sogang U", + "fullName": "Sogang University" + }, + { + "cdsId": "1802", + "displayName": "St. Petersburg SU", + "fullName": "St. Petersburg State University" + }, + { + "cdsId": "1822", + "displayName": "Stanford", + "fullName": "Stanford University" + }, + { + "cdsId": "1917", + "displayName": "TUM", + "fullName": "Technische Universität München" + }, + { + "cdsId": "1962", + "displayName": "U Aizu", + "fullName": "University of Aizu" + }, + { + "cdsId": "1966", + "displayName": "UAP", + "fullName": "The University of Asia Pacific" + }, + { + "cdsId": "1977", + "displayName": "UJ", + "fullName": "The University of Jordan" + }, + { + "cdsId": "2107", + "displayName": "UChile", + "fullName": "Universidad de Chile" + }, + { + "cdsId": "2112", + "displayName": "UH", + "fullName": "Universidad de La Habana" + }, + { + "cdsId": "2172", + "displayName": "USB", + "fullName": "Universidad Simón Bolívar" + }, + { + "cdsId": "2195", + "displayName": "UnB", + "fullName": "Universidade de Brasília" + }, + { + "cdsId": "2204", + "displayName": "USP", + "fullName": "Universidade de São Paulo" + }, + { + "cdsId": "2216", + "displayName": "UNICAMP", + "fullName": "Universidade Estadual de Campinas" + }, + { + "cdsId": "2230", + "displayName": "UFMG", + "fullName": "Universidade Federal de Minas Gerais" + }, + { + "cdsId": "2232", + "displayName": "UFPE", + "fullName": "Universidade Federal de Pernambuco" + }, + { + "cdsId": "2324", + "displayName": "U British Columbia", + "fullName": "University of British Columbia" + }, + { + "cdsId": "2343", + "displayName": "Cambridge", + "fullName": "University of Cambridge" + }, + { + "cdsId": "2349", + "displayName": "U Central Florida", + "fullName": "University of Central Florida" + }, + { + "cdsId": "2366", + "displayName": "U Dhaka", + "fullName": "University of Dhaka" + }, + { + "cdsId": "2387", + "displayName": "U Illinois at U-C", + "fullName": "University of Illinois at Urbana-Champaign" + }, + { + "cdsId": "2390", + "displayName": "UI", + "fullName": "Universitas Indonesia" + }, + { + "cdsId": "2400", + "displayName": "Latvia", + "fullName": "University of Latvia" + }, + { + "cdsId": "2493", + "displayName": "U Rochester", + "fullName": "University of Rochester" + }, + { + "cdsId": "2519", + "displayName": "USC", + "fullName": "University of Southern California" + }, + { + "cdsId": "2528", + "displayName": "UT", + "fullName": "University of Tehran" + }, + { + "cdsId": "2538", + "displayName": "UT Dallas", + "fullName": "The University of Texas at Dallas" + }, + { + "cdsId": "2562", + "displayName": "Utah", + "fullName": "University of Utah" + }, + { + "cdsId": "2574", + "displayName": "U Wisconsin - Madison", + "fullName": "University of Wisconsin - Madison" + }, + { + "cdsId": "2589", + "displayName": "U Wroclaw", + "fullName": "University of Wroclaw" + }, + { + "cdsId": "2648", + "displayName": "Virginia Tech", + "fullName": "Virginia Tech" + }, + { + "cdsId": "2659", + "displayName": "Volgograd STU", + "fullName": "Volgograd State Technical University" + }, + { + "cdsId": "2673", + "displayName": "U Warsaw", + "fullName": "University of Warsaw" + }, + { + "cdsId": "2742", + "displayName": "YSU", + "fullName": "Yerevan State University" + }, + { + "cdsId": "2745", + "displayName": "Yonsei U", + "fullName": "Yonsei University" + }, + { + "cdsId": "3071", + "displayName": "UFG", + "fullName": "Instituto de Informática - UFG" + }, + { + "cdsId": "3098", + "displayName": "ICESI", + "fullName": "Universidad Icesi" + }, + { + "cdsId": "3272", + "displayName": "UNAL Bogotá", + "fullName": "Universidad Nacional de Colombia - Bogotá" + }, + { + "cdsId": "3295", + "displayName": "SPb ITMO", + "fullName": "St. Petersburg ITMO University" + }, + { + "cdsId": "3328", + "displayName": "Purdue", + "fullName": "Purdue University" + }, + { + "cdsId": "3348", + "displayName": "CU-FCAI", + "fullName": "Cairo University - Faculty of Computers and Artificial Intelligence" + }, + { + "cdsId": "3360", + "displayName": "RAF", + "fullName": "Faculty of Computer Science, Belgrade " + }, + { + "cdsId": "3372", + "displayName": "UP Bonaterra", + "fullName": "Universidad Panamericana Campus Bonaterra" + }, + { + "cdsId": "3436", + "displayName": "ENS Paris", + "fullName": "École Normale Supérieure de Paris" + }, + { + "cdsId": "3487", + "displayName": "UN del Sur", + "fullName": "Universidad Nacional del Sur" + }, + { + "cdsId": "3519", + "displayName": "GUC", + "fullName": "German University in Cairo" + }, + { + "cdsId": "3534", + "displayName": "HSE", + "fullName": "National Research University Higher School of Economics" + }, + { + "cdsId": "3664", + "displayName": "ASU-FCIS", + "fullName": "Ain Shams University - Faculty of Computer and Information Sciences" + }, + { + "cdsId": "3683", + "displayName": "UBA - FCEN", + "fullName": "Universidad de Buenos Aires - FCEN" + }, + { + "cdsId": "3775", + "displayName": "Tishreen", + "fullName": "Tishreen University" + }, + { + "cdsId": "3919", + "displayName": "IIT(ISM) Dhanbad", + "fullName": "Indian Institute of Technology (ISM), Dhanbad" + }, + { + "cdsId": "3944", + "displayName": "DA-IICT", + "fullName": "Dhirubhai Ambani Institute of Information and Communication Technology, Gandhinagar" + }, + { + "cdsId": "4166", + "displayName": "UFC-Quixadá", + "fullName": "Universidade Federal do Ceará - Campus Quixadá" + }, + { + "cdsId": "4193", + "displayName": "UO-SAM", + "fullName": "Universidad de Oriente - Sede Antonio Maceo" + }, + { + "cdsId": "4330", + "displayName": "IITU", + "fullName": "International IT University" + }, + { + "cdsId": "4376", + "displayName": "PSUT", + "fullName": "Princess Sumaya University for Technology" + }, + { + "cdsId": "4846", + "displayName": "UNIST", + "fullName": "Ulsan National Institute of Science and Technology" + }, + { + "cdsId": "5628", + "displayName": "BPHC", + "fullName": "BITS-Pilani, Hyderabad Campus" + }, + { + "cdsId": "5640", + "displayName": "IIT Indore", + "fullName": "Indian Institute of Technology - Indore" + }, + { + "cdsId": "5716", + "displayName": "UCR", + "fullName": "Universidad de Costa Rica" + }, + { + "cdsId": "5724", + "displayName": "Free U of Tbilisi", + "fullName": "Free University of Tbilisi" + }, + { + "cdsId": "6581", + "displayName": "HIAST", + "fullName": "Higher Institute for Applied Sciences and Technology" + }, + { + "cdsId": "6908", + "displayName": "IIT Patna", + "fullName": "Indian Institute of Technology - Patna" + }, + { + "cdsId": "6960", + "displayName": "INSAT", + "fullName": "Institut National des Sciences Appliquées et de Technologie" + }, + { + "cdsId": "7113", + "displayName": "Al-Baath", + "fullName": "Al-Baath University" + }, + { + "cdsId": "7325", + "displayName": "IComp/UFAM", + "fullName": "Institute of Computing - Federal University of Amazonas" + }, + { + "cdsId": "7423", + "displayName": "Kyungpook National U", + "fullName": "Kyungpook National University" + }, + { + "cdsId": "7857", + "displayName": "Innopolis", + "fullName": "Innopolis University" + }, + { + "cdsId": "7898", + "displayName": "NU-FAST-KHI", + "fullName": "NU-FAST Karachi" + }, + { + "cdsId": "7990", + "displayName": "UNIMI", + "fullName": "Università Degli Studi di Milano" + }, + { + "cdsId": "8140", + "displayName": "UG-CIMAT", + "fullName": "Universidad de Guanajuato - DCNE" + }, + { + "cdsId": "8162", + "displayName": "SVU", + "fullName": "Syrian Virtual University" + }, + { + "cdsId": "8628", + "displayName": "AU", + "fullName": "Avicenna University" + }, + { + "cdsId": "9406", + "displayName": "IITBHU", + "fullName": "Indian Institute of Technology - Varanasi" + }, + { + "cdsId": "9574", + "displayName": "IIIT DELHI", + "fullName": "Indraprastha Institute of Information Technology" + }, + { + "cdsId": "9606", + "displayName": "SPb HSE", + "fullName": "St. Petersburg Campus of Higher School of Economics" + }, + { + "cdsId": "9780", + "displayName": "NSUT", + "fullName": "Netaji Subhash University Of Technology" + } + ], + "penaltyRoundingMode": "each_submission_down_to_minute" }, "runs": [ { diff --git a/src/cds/src/test/kotlin/org/icpclive/cds/clics/CdsLoadersTest.clics202207Test.approved.txt b/src/cds/testData/loaders/goldenData/clics202207.txt similarity index 94% rename from src/cds/src/test/kotlin/org/icpclive/cds/clics/CdsLoadersTest.clics202207Test.approved.txt rename to src/cds/testData/loaders/goldenData/clics202207.txt index d465875cc..00eca95fc 100644 --- a/src/cds/src/test/kotlin/org/icpclive/cds/clics/CdsLoadersTest.clics202207Test.approved.txt +++ b/src/cds/testData/loaders/goldenData/clics202207.txt @@ -1,7 +1,7 @@ { "contestInfo": { "name": "SWERC 2022", - "status": "OVER", + "status": "FINALIZED", "resultType": "ICPC", "startTimeUnixMs": 1676794500000, "contestLengthMs": 18000000, @@ -119,6 +119,12 @@ "type": "Photo", "url": "/contests/swerc2022/teams/1/photo" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "451", + "customFields": { + "name": "gETHyped" } }, { @@ -135,6 +141,12 @@ "type": "Photo", "url": "/contests/swerc2022/teams/2/photo" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "2079", + "customFields": { + "name": "The Fan Team" } }, { @@ -151,6 +163,12 @@ "type": "Photo", "url": "/contests/swerc2022/teams/3/photo" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "7083", + "customFields": { + "name": "Fallback Solutions" } }, { @@ -167,6 +185,12 @@ "type": "Photo", "url": "/contests/swerc2022/teams/4/photo" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "8483", + "customFields": { + "name": "Top Of The Mountain" } }, { @@ -183,6 +207,12 @@ "type": "Photo", "url": "/contests/swerc2022/teams/5/photo" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "8886", + "customFields": { + "name": "J'en perds deux" } }, { @@ -199,6 +229,12 @@ "type": "Photo", "url": "/contests/swerc2022/teams/6/photo" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "8450", + "customFields": { + "name": "WalkLike3Egyptians" } }, { @@ -215,6 +251,12 @@ "type": "Photo", "url": "/contests/swerc2022/teams/7/photo" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "10678", + "customFields": { + "name": "dQw4w9WgXcQ" } }, { @@ -231,6 +273,12 @@ "type": "Photo", "url": "/contests/swerc2022/teams/8/photo" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "2122", + "customFields": { + "name": "Greedy2SAES" } }, { @@ -247,6 +295,12 @@ "type": "Photo", "url": "/contests/swerc2022/teams/9/photo" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "5282", + "customFields": { + "name": "UBIdé" } }, { @@ -263,6 +317,12 @@ "type": "Photo", "url": "/contests/swerc2022/teams/10/photo" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "3409", + "customFields": { + "name": "ENSLip" } }, { @@ -279,6 +339,12 @@ "type": "Photo", "url": "/contests/swerc2022/teams/11/photo" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "11111", + "customFields": { + "name": "Jokers" } }, { @@ -295,6 +361,12 @@ "type": "Photo", "url": "/contests/swerc2022/teams/13/photo" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "16191", + "customFields": { + "name": "CPU" } }, { @@ -311,6 +383,12 @@ "type": "Photo", "url": "/contests/swerc2022/teams/14/photo" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "443", + "customFields": { + "name": "X Gonna Code It to Ya" } }, { @@ -327,6 +405,12 @@ "type": "Photo", "url": "/contests/swerc2022/teams/15/photo" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "20085", + "customFields": { + "name": "CUNEF-1" } }, { @@ -343,6 +427,12 @@ "type": "Photo", "url": "/contests/swerc2022/teams/16/photo" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "2257", + "customFields": { + "name": "Genova 1" } }, { @@ -359,6 +449,12 @@ "type": "Photo", "url": "/contests/swerc2022/teams/17/photo" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "11205", + "customFields": { + "name": "JIS" } }, { @@ -375,6 +471,12 @@ "type": "Photo", "url": "/contests/swerc2022/teams/18/photo" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "5282", + "customFields": { + "name": "UBIk" } }, { @@ -391,6 +493,12 @@ "type": "Photo", "url": "/contests/swerc2022/teams/19/photo" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "3236", + "customFields": { + "name": "SIGKILL" } }, { @@ -407,6 +515,12 @@ "type": "Photo", "url": "/contests/swerc2022/teams/20/photo" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "5687", + "customFields": { + "name": "ECL 1" } }, { @@ -423,6 +537,12 @@ "type": "Photo", "url": "/contests/swerc2022/teams/21/photo" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "8869", + "customFields": { + "name": "flag[11]" } }, { @@ -439,6 +559,12 @@ "type": "Photo", "url": "/contests/swerc2022/teams/22/photo" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "478", + "customFields": { + "name": "Rated C++" } }, { @@ -455,6 +581,12 @@ "type": "Photo", "url": "/contests/swerc2022/teams/23/photo" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "742", + "customFields": { + "name": "INSA 1" } }, { @@ -471,6 +603,12 @@ "type": "Photo", "url": "/contests/swerc2022/teams/24/photo" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "2273", + "customFields": { + "name": "UPC-3" } }, { @@ -487,6 +625,12 @@ "type": "Photo", "url": "/contests/swerc2022/teams/25/photo" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "8869", + "customFields": { + "name": "flag[10]" } }, { @@ -503,6 +647,12 @@ "type": "Photo", "url": "/contests/swerc2022/teams/26/photo" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "10640", + "customFields": { + "name": "DROP TABLE" } }, { @@ -519,6 +669,12 @@ "type": "Photo", "url": "/contests/swerc2022/teams/27/photo" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "11538", + "customFields": { + "name": "Polychotomy" } }, { @@ -535,6 +691,12 @@ "type": "Photo", "url": "/contests/swerc2022/teams/28/photo" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "11111", + "customFields": { + "name": "Bestagons" } }, { @@ -551,6 +713,12 @@ "type": "Photo", "url": "/contests/swerc2022/teams/29/photo" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "10678", + "customFields": { + "name": "CoffeLimitExceeded" } }, { @@ -567,6 +735,12 @@ "type": "Photo", "url": "/contests/swerc2022/teams/30/photo" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "6379", + "customFields": { + "name": "Un CE más" } }, { @@ -583,6 +757,12 @@ "type": "Photo", "url": "/contests/swerc2022/teams/31/photo" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "10689", + "customFields": { + "name": "Sorbonne Rouge" } }, { @@ -599,6 +779,12 @@ "type": "Photo", "url": "/contests/swerc2022/teams/32/photo" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "742", + "customFields": { + "name": "INSA 3" } }, { @@ -615,6 +801,12 @@ "type": "Photo", "url": "/contests/swerc2022/teams/33/photo" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "8246", + "customFields": { + "name": "team name goes here" } }, { @@ -631,6 +823,12 @@ "type": "Photo", "url": "/contests/swerc2022/teams/34/photo" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "20085", + "customFields": { + "name": "CUNEF-A" } }, { @@ -647,6 +845,12 @@ "type": "Photo", "url": "/contests/swerc2022/teams/35/photo" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "3236", + "customFields": { + "name": "Pr3s3nTati0n_3Rr0r" } }, { @@ -663,6 +867,12 @@ "type": "Photo", "url": "/contests/swerc2022/teams/36/photo" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "7083", + "customFields": { + "name": "Toroidal Polihedrons" } }, { @@ -679,6 +889,12 @@ "type": "Photo", "url": "/contests/swerc2022/teams/37/photo" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "10689", + "customFields": { + "name": "Sorbonne Blanc" } }, { @@ -695,6 +911,12 @@ "type": "Photo", "url": "/contests/swerc2022/teams/38/photo" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "443", + "customFields": { + "name": "In eXtremis" } }, { @@ -711,6 +933,12 @@ "type": "Photo", "url": "/contests/swerc2022/teams/39/photo" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "9745", + "customFields": { + "name": "x^3" } }, { @@ -727,6 +955,12 @@ "type": "Photo", "url": "/contests/swerc2022/teams/40/photo" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "2261", + "customFields": { + "name": "UniTN MindsHub" } }, { @@ -743,6 +977,12 @@ "type": "Photo", "url": "/contests/swerc2022/teams/41/photo" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "2170", + "customFields": { + "name": "Hackbulla" } }, { @@ -759,6 +999,12 @@ "type": "Photo", "url": "/contests/swerc2022/teams/42/photo" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "8460", + "customFields": { + "name": "Slippin' Jimmies" } }, { @@ -775,6 +1021,12 @@ "type": "Photo", "url": "/contests/swerc2022/teams/43/photo" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "9635", + "customFields": { + "name": "7uring_net7" } }, { @@ -791,6 +1043,12 @@ "type": "Photo", "url": "/contests/swerc2022/teams/44/photo" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "8246", + "customFields": { + "name": "AFL" } }, { @@ -807,6 +1065,12 @@ "type": "Photo", "url": "/contests/swerc2022/teams/45/photo" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "2079", + "customFields": { + "name": "de Morgan" } }, { @@ -823,6 +1087,12 @@ "type": "Photo", "url": "/contests/swerc2022/teams/46/photo" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "11111", + "customFields": { + "name": "TempName" } }, { @@ -839,6 +1109,12 @@ "type": "Photo", "url": "/contests/swerc2022/teams/47/photo" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "10685", + "customFields": { + "name": "Télégendaire" } }, { @@ -855,6 +1131,12 @@ "type": "Photo", "url": "/contests/swerc2022/teams/48/photo" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "2263", + "customFields": { + "name": "Gli informagici" } }, { @@ -871,6 +1153,12 @@ "type": "Photo", "url": "/contests/swerc2022/teams/49/photo" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "2273", + "customFields": { + "name": "UPC-1" } }, { @@ -887,6 +1175,12 @@ "type": "Photo", "url": "/contests/swerc2022/teams/50/photo" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "444", + "customFields": { + "name": "EPFL 1" } }, { @@ -903,6 +1197,12 @@ "type": "Photo", "url": "/contests/swerc2022/teams/51/photo" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "7990", + "customFields": { + "name": "LaStatale Blue" } }, { @@ -919,6 +1219,12 @@ "type": "Photo", "url": "/contests/swerc2022/teams/52/photo" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "789", + "customFields": { + "name": "The Outlaws" } }, { @@ -935,6 +1241,12 @@ "type": "Photo", "url": "/contests/swerc2022/teams/53/photo" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "10689", + "customFields": { + "name": "Sorbonne Bleu" } }, { @@ -951,6 +1263,12 @@ "type": "Photo", "url": "/contests/swerc2022/teams/54/photo" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "11205", + "customFields": { + "name": "Overflow" } }, { @@ -967,6 +1285,12 @@ "type": "Photo", "url": "/contests/swerc2022/teams/55/photo" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "19561", + "customFields": { + "name": "Javaman" } }, { @@ -983,6 +1307,12 @@ "type": "Photo", "url": "/contests/swerc2022/teams/56/photo" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "2166", + "customFields": { + "name": "ETSINF-1" } }, { @@ -999,6 +1329,12 @@ "type": "Photo", "url": "/contests/swerc2022/teams/57/photo" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "2261", + "customFields": { + "name": "UniTN Fenwick Treento" } }, { @@ -1015,6 +1351,12 @@ "type": "Photo", "url": "/contests/swerc2022/teams/58/photo" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "2263", + "customFields": { + "name": "MastersOfBreaks" } }, { @@ -1031,6 +1373,12 @@ "type": "Photo", "url": "/contests/swerc2022/teams/59/photo" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "6369", + "customFields": { + "name": "UPV-EHU-2" } }, { @@ -1047,6 +1395,12 @@ "type": "Photo", "url": "/contests/swerc2022/teams/60/photo" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "3409", + "customFields": { + "name": "ENSheep" } }, { @@ -1063,6 +1417,12 @@ "type": "Photo", "url": "/contests/swerc2022/teams/61/photo" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "444", + "customFields": { + "name": "EPFL 2" } }, { @@ -1079,6 +1439,12 @@ "type": "Photo", "url": "/contests/swerc2022/teams/62/photo" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "2170", + "customFields": { + "name": "pik2s" } }, { @@ -1095,6 +1461,12 @@ "type": "Photo", "url": "/contests/swerc2022/teams/63/photo" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "10706", + "customFields": { + "name": "Risi&&Bisi" } }, { @@ -1111,6 +1483,12 @@ "type": "Photo", "url": "/contests/swerc2022/teams/64/photo" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "8886", + "customFields": { + "name": "Serge" } }, { @@ -1127,6 +1505,12 @@ "type": "Photo", "url": "/contests/swerc2022/teams/65/photo" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "5687", + "customFields": { + "name": "ECL 2" } }, { @@ -1143,6 +1527,12 @@ "type": "Photo", "url": "/contests/swerc2022/teams/66/photo" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "2257", + "customFields": { + "name": "Genova 2" } }, { @@ -1159,6 +1549,12 @@ "type": "Photo", "url": "/contests/swerc2022/teams/67/photo" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "2273", + "customFields": { + "name": "UPC-2" } }, { @@ -1175,6 +1571,12 @@ "type": "Photo", "url": "/contests/swerc2022/teams/68/photo" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "11205", + "customFields": { + "name": "SaintGermainDesPres1" } }, { @@ -1191,6 +1593,12 @@ "type": "Photo", "url": "/contests/swerc2022/teams/69/photo" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "451", + "customFields": { + "name": "Save water - shower togETHer" } }, { @@ -1207,6 +1615,12 @@ "type": "Photo", "url": "/contests/swerc2022/teams/70/photo" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "478", + "customFields": { + "name": "Heroes of the C" } }, { @@ -1223,6 +1637,12 @@ "type": "Photo", "url": "/contests/swerc2022/teams/71/photo" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "8488", + "customFields": { + "name": "Code Force One" } }, { @@ -1239,6 +1659,12 @@ "type": "Photo", "url": "/contests/swerc2022/teams/72/photo" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "10678", + "customFields": { + "name": "bogosolving" } }, { @@ -1255,6 +1681,12 @@ "type": "Photo", "url": "/contests/swerc2022/teams/73/photo" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "11538", + "customFields": { + "name": "error 2F4U" } }, { @@ -1271,6 +1703,12 @@ "type": "Photo", "url": "/contests/swerc2022/teams/74/photo" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "460", + "customFields": { + "name": "ensipc" } }, { @@ -1287,6 +1725,12 @@ "type": "Photo", "url": "/contests/swerc2022/teams/75/photo" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "5282", + "customFields": { + "name": "jUBIleu" } }, { @@ -1303,6 +1747,12 @@ "type": "Photo", "url": "/contests/swerc2022/teams/76/photo" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "6369", + "customFields": { + "name": "UPV-EHU-1" } }, { @@ -1319,6 +1769,12 @@ "type": "Photo", "url": "/contests/swerc2022/teams/77/photo" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "2263", + "customFields": { + "name": "Quickbits" } }, { @@ -1335,6 +1791,12 @@ "type": "Photo", "url": "/contests/swerc2022/teams/78/photo" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "3436", + "customFields": { + "name": "ENS Ulm 3" } }, { @@ -1351,6 +1813,12 @@ "type": "Photo", "url": "/contests/swerc2022/teams/79/photo" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "3409", + "customFields": { + "name": "E N S p a c e" } }, { @@ -1367,6 +1835,12 @@ "type": "Photo", "url": "/contests/swerc2022/teams/80/photo" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "7083", + "customFields": { + "name": "Overkill" } }, { @@ -1383,6 +1857,12 @@ "type": "Photo", "url": "/contests/swerc2022/teams/81/photo" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "15696", + "customFields": { + "name": "Brogrammers" } }, { @@ -1399,6 +1879,12 @@ "type": "Photo", "url": "/contests/swerc2022/teams/82/photo" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "2122", + "customFields": { + "name": "Don't you C?" } }, { @@ -1415,6 +1901,12 @@ "type": "Photo", "url": "/contests/swerc2022/teams/83/photo" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "789", + "customFields": { + "name": "FantasticoDebug" } }, { @@ -1431,6 +1923,12 @@ "type": "Photo", "url": "/contests/swerc2022/teams/84/photo" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "7435", + "customFields": { + "name": "UNIBOis" } }, { @@ -1447,6 +1945,12 @@ "type": "Photo", "url": "/contests/swerc2022/teams/85/photo" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "2260", + "customFields": { + "name": "SapienzaWhite" } }, { @@ -1463,6 +1967,12 @@ "type": "Photo", "url": "/contests/swerc2022/teams/86/photo" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "10685", + "customFields": { + "name": "Telecoders" } }, { @@ -1479,6 +1989,12 @@ "type": "Photo", "url": "/contests/swerc2022/teams/87/photo" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "8450", + "customFields": { + "name": "USInchronous" } }, { @@ -1495,6 +2011,12 @@ "type": "Photo", "url": "/contests/swerc2022/teams/88/photo" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "20090", + "customFields": { + "name": "C--" } }, { @@ -1511,6 +2033,12 @@ "type": "Photo", "url": "/contests/swerc2022/teams/89/photo" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "742", + "customFields": { + "name": "INSA 2" } }, { @@ -1527,6 +2055,12 @@ "type": "Photo", "url": "/contests/swerc2022/teams/90/photo" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "7990", + "customFields": { + "name": "LaStatale Green" } }, { @@ -1543,6 +2077,12 @@ "type": "Photo", "url": "/contests/swerc2022/teams/91/photo" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "9745", + "customFields": { + "name": "I eat PHP for breakfast" } }, { @@ -1559,6 +2099,12 @@ "type": "Photo", "url": "/contests/swerc2022/teams/92/photo" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "6379", + "customFields": { + "name": "Unidad Computacional de Macacos" } }, { @@ -1575,6 +2121,12 @@ "type": "Photo", "url": "/contests/swerc2022/teams/93/photo" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "8246", + "customFields": { + "name": "C_aramba" } }, { @@ -1591,6 +2143,12 @@ "type": "Photo", "url": "/contests/swerc2022/teams/94/photo" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "7032", + "customFields": { + "name": "Late submission" } }, { @@ -1607,6 +2165,12 @@ "type": "Photo", "url": "/contests/swerc2022/teams/95/photo" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "9009", + "customFields": { + "name": "FDS-UM" } }, { @@ -1623,6 +2187,12 @@ "type": "Photo", "url": "/contests/swerc2022/teams/96/photo" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "2261", + "customFields": { + "name": "UniTN Send Nodes" } }, { @@ -1639,6 +2209,12 @@ "type": "Photo", "url": "/contests/swerc2022/teams/97/photo" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "366", + "customFields": { + "name": "0xC0FFEE++" } }, { @@ -1655,6 +2231,12 @@ "type": "Photo", "url": "/contests/swerc2022/teams/98/photo" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "10685", + "customFields": { + "name": "Télécode of Duty" } }, { @@ -1671,6 +2253,12 @@ "type": "Photo", "url": "/contests/swerc2022/teams/99/photo" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "2260", + "customFields": { + "name": "SapienzaBlack" } }, { @@ -1687,6 +2275,12 @@ "type": "Photo", "url": "/contests/swerc2022/teams/100/photo" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "2170", + "customFields": { + "name": "Teamto de Verano" } }, { @@ -1703,6 +2297,12 @@ "type": "Photo", "url": "/contests/swerc2022/teams/101/photo" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "460", + "customFields": { + "name": "ensipc2" } }, { @@ -1719,6 +2319,12 @@ "type": "Photo", "url": "/contests/swerc2022/teams/102/photo" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "7435", + "customFields": { + "name": "UNIBOiis" } }, { @@ -1735,6 +2341,12 @@ "type": "Photo", "url": "/contests/swerc2022/teams/103/photo" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "2122", + "customFields": { + "name": "SWERC Chaos" } }, { @@ -1751,6 +2363,12 @@ "type": "Photo", "url": "/contests/swerc2022/teams/104/photo" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "5687", + "customFields": { + "name": "ECL 3" } }, { @@ -1767,6 +2385,12 @@ "type": "Photo", "url": "/contests/swerc2022/teams/105/photo" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "7990", + "customFields": { + "name": "LaStatale Red" } }, { @@ -1783,6 +2407,12 @@ "type": "Photo", "url": "/contests/swerc2022/teams/106/photo" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "10640", + "customFields": { + "name": "PBI" } }, { @@ -1799,6 +2429,12 @@ "type": "Photo", "url": "/contests/swerc2022/teams/107/photo" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "2166", + "customFields": { + "name": "ETSINF-2" } }, { @@ -1815,6 +2451,12 @@ "type": "Photo", "url": "/contests/swerc2022/teams/108/photo" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "451", + "customFields": { + "name": "dETHerminant" } }, { @@ -1831,6 +2473,12 @@ "type": "Photo", "url": "/contests/swerc2022/teams/109/photo" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "8488", + "customFields": { + "name": "SigSegv Squad" } }, { @@ -1847,6 +2495,12 @@ "type": "Photo", "url": "/contests/swerc2022/teams/110/photo" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "3545", + "customFields": { + "name": "Boystdcouts" } }, { @@ -1863,6 +2517,12 @@ "type": "Photo", "url": "/contests/swerc2022/teams/111/photo" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "3436", + "customFields": { + "name": "ENS Ulm 1" } }, { @@ -1879,6 +2539,12 @@ "type": "Photo", "url": "/contests/swerc2022/teams/112/photo" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "7435", + "customFields": { + "name": "UNIBOiiis" } }, { @@ -1895,6 +2561,12 @@ "type": "Photo", "url": "/contests/swerc2022/teams/113/photo" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "3545", + "customFields": { + "name": "Venta de pantalones" } }, { @@ -1911,6 +2583,12 @@ "type": "Photo", "url": "/contests/swerc2022/teams/114/photo" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "11538", + "customFields": { + "name": "Polydata" } }, { @@ -1927,6 +2605,12 @@ "type": "Photo", "url": "/contests/swerc2022/teams/115/photo" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "8450", + "customFields": { + "name": "fUSIlli" } }, { @@ -1943,6 +2627,12 @@ "type": "Photo", "url": "/contests/swerc2022/teams/116/photo" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "9745", + "customFields": { + "name": "P+P+P" } }, { @@ -1959,6 +2649,12 @@ "type": "Photo", "url": "/contests/swerc2022/teams/117/photo" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "2260", + "customFields": { + "name": "SapienzaRed" } }, { @@ -1975,6 +2671,12 @@ "type": "Photo", "url": "/contests/swerc2022/teams/118/photo" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "8818", + "customFields": { + "name": "Carovana Fighters" } }, { @@ -1991,6 +2693,12 @@ "type": "Photo", "url": "/contests/swerc2022/teams/119/photo" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "3545", + "customFields": { + "name": "GetName" } }, { @@ -2007,6 +2715,12 @@ "type": "Photo", "url": "/contests/swerc2022/teams/120/photo" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "3436", + "customFields": { + "name": "ENS Ulm 2" } }, { @@ -2023,17 +2737,300 @@ "type": "Photo", "url": "/contests/swerc2022/teams/121/photo" } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": "8886", + "customFields": { + "name": "Jean Perrin" } } ], "groups": [ { - "name": "SWERC 2022-2023" + "name": "SWERC 2022-2023", + "isHidden": false, + "isOutOfContest": false }, { - "name": "Self-Registered" + "name": "Self-Registered", + "isHidden": false, + "isOutOfContest": false } - ] + ], + "organizations": [ + { + "cdsId": "366", + "displayName": "UC", + "fullName": "University of Coimbra" + }, + { + "cdsId": "443", + "displayName": "EP", + "fullName": "Ecole Polytechnique" + }, + { + "cdsId": "444", + "displayName": "EPFL", + "fullName": "Ecole Polytechnique Fédérale de Lausanne" + }, + { + "cdsId": "451", + "displayName": "ETH Zürich", + "fullName": "ETH Zürich" + }, + { + "cdsId": "460", + "displayName": "ENSIMAG", + "fullName": "ENS d'Informatique et de Mathematiques Appliquees - Grenoble" + }, + { + "cdsId": "478", + "displayName": "U Porto", + "fullName": "Universidade do Porto" + }, + { + "cdsId": "742", + "displayName": "INSA", + "fullName": "INSA de Lyon" + }, + { + "cdsId": "789", + "displayName": "IS Técnico", + "fullName": "Instituto Superior Técnico" + }, + { + "cdsId": "2079", + "displayName": "UAM", + "fullName": "Universidad Autónoma de Madrid" + }, + { + "cdsId": "2122", + "displayName": "UM", + "fullName": "Universidad de Murcia" + }, + { + "cdsId": "2166", + "displayName": "UPV", + "fullName": "Universitat Politècnica de València" + }, + { + "cdsId": "2170", + "displayName": "U. Rey Juan Carlos", + "fullName": "Universidad Rey Juan Carlos" + }, + { + "cdsId": "2257", + "displayName": "Genova", + "fullName": "Università degli Studi di Genova" + }, + { + "cdsId": "2260", + "displayName": "Università di Roma 1", + "fullName": "Università di Roma - La Sapienza" + }, + { + "cdsId": "2261", + "displayName": "TN", + "fullName": "Università di Trento" + }, + { + "cdsId": "2263", + "displayName": "Universita' di Udine", + "fullName": "Università Degli Studi di Udine" + }, + { + "cdsId": "2273", + "displayName": "UP Catalunya", + "fullName": "Universitat Politècnica de Catalunya" + }, + { + "cdsId": "3236", + "displayName": "TECHNION", + "fullName": "Technion - Israel Institute of Technology" + }, + { + "cdsId": "3409", + "displayName": "ENS - Lyon", + "fullName": "École Normale Supérieure de Lyon" + }, + { + "cdsId": "3436", + "displayName": "ENS Paris", + "fullName": "École Normale Supérieure de Paris" + }, + { + "cdsId": "3545", + "displayName": "UPF", + "fullName": "Universitat Pompeu Fabra" + }, + { + "cdsId": "5282", + "displayName": "UBI", + "fullName": "Universidade da Beira Interior" + }, + { + "cdsId": "5687", + "displayName": "EC-Lyon", + "fullName": "Ecole Centrale de Lyon" + }, + { + "cdsId": "6369", + "displayName": "EHU", + "fullName": "University of the Basque Country" + }, + { + "cdsId": "6379", + "displayName": "UCM", + "fullName": "Universidad Complutense de Madrid" + }, + { + "cdsId": "7032", + "displayName": "ENS de Paris-Saclay", + "fullName": "École Normale Supérieure de Paris-Saclay" + }, + { + "cdsId": "7083", + "displayName": "Polito", + "fullName": "Politecnico di Torino" + }, + { + "cdsId": "7435", + "displayName": "UNIBO", + "fullName": "University of Bologna" + }, + { + "cdsId": "7990", + "displayName": "UNIMI", + "fullName": "Università Degli Studi di Milano" + }, + { + "cdsId": "8246", + "displayName": "Polimi", + "fullName": "Politecnico di Milano" + }, + { + "cdsId": "8450", + "displayName": "USI", + "fullName": "Università della Svizzera italiana" + }, + { + "cdsId": "8460", + "displayName": "CentraleSupélec", + "fullName": "CentraleSupélec" + }, + { + "cdsId": "8483", + "displayName": "U of Haifa", + "fullName": "University of Haifa" + }, + { + "cdsId": "8488", + "displayName": "UniVerona", + "fullName": "University of Verona" + }, + { + "cdsId": "8818", + "displayName": "SNS", + "fullName": "Scuola Normale Superiore" + }, + { + "cdsId": "8869", + "displayName": "UNIPI", + "fullName": "Università di Pisa" + }, + { + "cdsId": "8886", + "displayName": "U-ARTOIS", + "fullName": "Artois University" + }, + { + "cdsId": "9009", + "displayName": "U Montpellier", + "fullName": "Université de Montpellier" + }, + { + "cdsId": "9635", + "displayName": "ENSEEIHT", + "fullName": "École Nationale Supérieure d'électrotechnique, d'électronique, d'informatique, d'hydraulique et des Télécommunications" + }, + { + "cdsId": "9745", + "displayName": "HS", + "fullName": "Harbour.Space University" + }, + { + "cdsId": "10640", + "displayName": "UR1", + "fullName": "University of Rennes 1" + }, + { + "cdsId": "10678", + "displayName": "UniPD", + "fullName": "University of Padova" + }, + { + "cdsId": "10685", + "displayName": "TP", + "fullName": "Télécom Paris" + }, + { + "cdsId": "10689", + "displayName": "Sorbonne", + "fullName": "Sorbonne Université" + }, + { + "cdsId": "10706", + "displayName": "Unive", + "fullName": "Ca' Foscari University of Venice" + }, + { + "cdsId": "11111", + "displayName": "TAU", + "fullName": "Tel Aviv University" + }, + { + "cdsId": "11205", + "displayName": "UdP", + "fullName": "Université de Paris" + }, + { + "cdsId": "11538", + "displayName": "PPS", + "fullName": "Polytech Paris Saclay" + }, + { + "cdsId": "15696", + "displayName": "EILCO", + "fullName": "Ecole d'Ingénieurs Littoral Côte d'Opale" + }, + { + "cdsId": "16191", + "displayName": "UnivAQ", + "fullName": "University of L'Aquila" + }, + { + "cdsId": "19561", + "displayName": "Université Paris-Saclay", + "fullName": "Université Paris-Saclay" + }, + { + "cdsId": "20085", + "displayName": "CUNEF", + "fullName": "CUNEF Universidad" + }, + { + "cdsId": "20090", + "displayName": "TNCY", + "fullName": "TELECOM Nancy" + }, + { + "cdsId": "42424242", + "displayName": "Jane Street", + "fullName": "Jane Street" + } + ], + "penaltyRoundingMode": "each_submission_down_to_minute" }, "runs": [ { diff --git a/src/cds/testData/loaders/goldenData/ejudge.txt b/src/cds/testData/loaders/goldenData/ejudge.txt new file mode 100644 index 000000000..399bbbc5c --- /dev/null +++ b/src/cds/testData/loaders/goldenData/ejudge.txt @@ -0,0 +1,18571 @@ +{ + "contestInfo": { + "name": "МКОШП 2022", + "status": "FINALIZED", + "resultType": "ICPC", + "startTimeUnixMs": 1666512000000, + "contestLengthMs": 18000000, + "freezeTimeMs": 14400000, + "problems": [ + { + "letter": "A", + "name": "Фальшивая стопка", + "id": 1, + "ordinal": 0, + "contestSystemId": "1" + }, + { + "letter": "B", + "name": "Лёша и чтение условий", + "id": 2, + "ordinal": 1, + "contestSystemId": "2" + }, + { + "letter": "C", + "name": "Пляж", + "id": 3, + "ordinal": 2, + "contestSystemId": "3" + }, + { + "letter": "D", + "name": "Факториальная делимость", + "id": 4, + "ordinal": 3, + "contestSystemId": "4" + }, + { + "letter": "E", + "name": "Самостоятельные деревья", + "id": 5, + "ordinal": 4, + "contestSystemId": "5" + }, + { + "letter": "F", + "name": "Сериал по Майнкрафту", + "id": 6, + "ordinal": 5, + "contestSystemId": "6" + }, + { + "letter": "G", + "name": "Split sort", + "id": 7, + "ordinal": 6, + "contestSystemId": "7" + }, + { + "letter": "H", + "name": "Башенки", + "id": 8, + "ordinal": 7, + "contestSystemId": "8" + }, + { + "letter": "I", + "name": "Нулевая сумма", + "id": 9, + "ordinal": 8, + "contestSystemId": "9" + }, + { + "letter": "J", + "name": "Прямоугольное дерево", + "id": 10, + "ordinal": 9, + "contestSystemId": "10" + }, + { + "letter": "K", + "name": "Не сортируй", + "id": 11, + "ordinal": 10, + "contestSystemId": "11" + }, + { + "letter": "L", + "name": "N станков", + "id": 12, + "ordinal": 11, + "contestSystemId": "12" + } + ], + "teams": [ + { + "id": 0, + "name": "1580-1 \"Трое Архонтов\" (Заварин 11, Смирнов 11, Ван 11)", + "shortName": "1580-1 \"Трое Архонтов\" (Заварин 11, Смирнов 11, Ван 11)", + "contestSystemId": "135350", + "groups": [ + ], + "hashTag": null, + "medias": { + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null + }, + { + "id": 1, + "name": "179 Random People (Авдеев 10, Дубко 10, Некрасов 9)", + "shortName": "179 Random People (Авдеев 10, Дубко 10, Некрасов 9)", + "contestSystemId": "135351", + "groups": [ + ], + "hashTag": null, + "medias": { + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null + }, + { + "id": 2, + "name": "57 \"Конские хомуты\" (Лосев 9, Алексеев 10, Семенюк 9)", + "shortName": "57 \"Конские хомуты\" (Лосев 9, Алексеев 10, Семенюк 9)", + "contestSystemId": "135352", + "groups": [ + ], + "hashTag": null, + "medias": { + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null + }, + { + "id": 3, + "name": "Котики МШП (Шумов 11, Вовк 11, Авдеева 11)", + "shortName": "Котики МШП (Шумов 11, Вовк 11, Авдеева 11)", + "contestSystemId": "135353", + "groups": [ + ], + "hashTag": null, + "medias": { + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null + }, + { + "id": 4, + "name": "МШП-3 Ромашка (Саляхов 8, Фешин 11, Чистяков 11)", + "shortName": "МШП-3 Ромашка (Саляхов 8, Фешин 11, Чистяков 11)", + "contestSystemId": "135354", + "groups": [ + ], + "hashTag": null, + "medias": { + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null + }, + { + "id": 5, + "name": "ФТЛ \"и что в итоге?\" (Черепанов 9, Загоровский 9, Архипов 8)", + "shortName": "ФТЛ \"и что в итоге?\" (Черепанов 9, Загоровский 9, Архипов 8)", + "contestSystemId": "135355", + "groups": [ + ], + "hashTag": null, + "medias": { + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null + }, + { + "id": 6, + "name": "179 \"По приказу генерала Емакса\" (Марусев 8, Мусатов 9, Самойлов 9)", + "shortName": "179 \"По приказу генерала Емакса\" (Марусев 8, Мусатов 9, Самойлов 9)", + "contestSystemId": "135356", + "groups": [ + ], + "hashTag": null, + "medias": { + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null + }, + { + "id": 7, + "name": "179-Л2Ш-Летово MBI (Артюхов 8, Бернадский 8, Мусихин 8)", + "shortName": "179-Л2Ш-Летово MBI (Артюхов 8, Бернадский 8, Мусихин 8)", + "contestSystemId": "135357", + "groups": [ + ], + "hashTag": null, + "medias": { + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null + }, + { + "id": 8, + "name": "57 \"Леоны\" (Салыгин 10, Шкулёва 10, Беляев 10)", + "shortName": "57 \"Леоны\" (Салыгин 10, Шкулёва 10, Беляев 10)", + "contestSystemId": "135358", + "groups": [ + ], + "hashTag": null, + "medias": { + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null + }, + { + "id": 9, + "name": "Л2Ш \"Индюк, Койот и Пингвин\" (Ларичев 11, Важенин 11, Волков 10)", + "shortName": "Л2Ш \"Индюк, Койот и Пингвин\" (Ларичев 11, Важенин 11, Волков 10)", + "contestSystemId": "135359", + "groups": [ + ], + "hashTag": null, + "medias": { + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null + }, + { + "id": 10, + "name": "СУНЦ \"Булат Ибрагимович\" (Лузгов 10, Галявиев 10, Прыгунов 10)", + "shortName": "СУНЦ \"Булат Ибрагимович\" (Лузгов 10, Галявиев 10, Прыгунов 10)", + "contestSystemId": "135360", + "groups": [ + ], + "hashTag": null, + "medias": { + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null + }, + { + "id": 11, + "name": "ФТЛ + СП ФМЛ \"Бородинςкий хλеб\" (Белецкий 11, Сушин 11, Воронин 11)", + "shortName": "ФТЛ + СП ФМЛ \"Бородинςкий хλеб\" (Белецкий 11, Сушин 11, Воронин 11)", + "contestSystemId": "135361", + "groups": [ + ], + "hashTag": null, + "medias": { + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null + }, + { + "id": 12, + "name": "179 + 2007 \"Rio de Janeiro\" (Солунов 11, Татаркин 11, Поляков 11)", + "shortName": "179 + 2007 \"Rio de Janeiro\" (Солунов 11, Татаркин 11, Поляков 11)", + "contestSystemId": "135362", + "groups": [ + ], + "hashTag": null, + "medias": { + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null + }, + { + "id": 13, + "name": "179+57+518 Блин, сложно (Пахомов 11, Козлов 11, Чернов 11)", + "shortName": "179+57+518 Блин, сложно (Пахомов 11, Козлов 11, Чернов 11)", + "contestSystemId": "135363", + "groups": [ + ], + "hashTag": null, + "medias": { + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null + }, + { + "id": 14, + "name": "57 + 2086 + Летово «Голубые береты» (Краснов 10, Пискарев 10, Егоров 10)", + "shortName": "57 + 2086 + Летово «Голубые береты» (Краснов 10, Пискарев 10, Егоров 10)", + "contestSystemId": "135364", + "groups": [ + ], + "hashTag": null, + "medias": { + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null + }, + { + "id": 15, + "name": "Л2Ш \"Фарфоровые джентельмены\" (Битюков 11, Синицын 11, Волков 11)", + "shortName": "Л2Ш \"Фарфоровые джентельмены\" (Битюков 11, Синицын 11, Волков 11)", + "contestSystemId": "135365", + "groups": [ + ], + "hashTag": null, + "medias": { + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null + }, + { + "id": 16, + "name": "СУНЦ \"Герои N\" (Ковырзин 11, Горбатенков 11, Рахметов 11)", + "shortName": "СУНЦ \"Герои N\" (Ковырзин 11, Горбатенков 11, Рахметов 11)", + "contestSystemId": "135366", + "groups": [ + ], + "hashTag": null, + "medias": { + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null + }, + { + "id": 17, + "name": "ФТЛ-1 \"Ладно да\" (Мансурова 11, Чашников 11, Останин 11)", + "shortName": "ФТЛ-1 \"Ладно да\" (Мансурова 11, Чашников 11, Останин 11)", + "contestSystemId": "135367", + "groups": [ + ], + "hashTag": null, + "medias": { + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null + }, + { + "id": 18, + "name": "179 абобры (Волошко 8, Бельских 7, Сацкий 9)", + "shortName": "179 абобры (Волошко 8, Бельских 7, Сацкий 9)", + "contestSystemId": "135368", + "groups": [ + ], + "hashTag": null, + "medias": { + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null + }, + { + "id": 19, + "name": "179+Воробьевы горы \"Редиска 4\" (Клейменов 10, Ильин 10, Мордакин 10)", + "shortName": "179+Воробьевы горы \"Редиска 4\" (Клейменов 10, Ильин 10, Мордакин 10)", + "contestSystemId": "135369", + "groups": [ + ], + "hashTag": null, + "medias": { + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null + }, + { + "id": 20, + "name": "57-√-1 Врата Штерна (Кузнецов 11, Евстигнеев 11, Калугин 11)", + "shortName": "57-√-1 Врата Штерна (Кузнецов 11, Евстигнеев 11, Калугин 11)", + "contestSystemId": "135370", + "groups": [ + ], + "hashTag": null, + "medias": { + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null + }, + { + "id": 21, + "name": "Л2Ш-444-17 \"Ледокол\" (Коробейников 9, Осипов 9, Лазарев 9)", + "shortName": "Л2Ш-444-17 \"Ледокол\" (Коробейников 9, Осипов 9, Лазарев 9)", + "contestSystemId": "135371", + "groups": [ + ], + "hashTag": null, + "medias": { + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null + }, + { + "id": 22, + "name": "СУНЦ \"Зачем?\" (Волков 10, Осокин 10, Белоусько 10)", + "shortName": "СУНЦ \"Зачем?\" (Волков 10, Осокин 10, Белоусько 10)", + "contestSystemId": "135372", + "groups": [ + ], + "hashTag": null, + "medias": { + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null + }, + { + "id": 23, + "name": "ФТЛ-3 “Sintec” (Доронин 10, Кобзев 10, Антонова 10)", + "shortName": "ФТЛ-3 “Sintec” (Доронин 10, Кобзев 10, Антонова 10)", + "contestSystemId": "135373", + "groups": [ + ], + "hashTag": null, + "medias": { + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null + }, + { + "id": 24, + "name": "179 бестиков дергея (Маляровский 11, Лупилцев 11, Орехов 11)", + "shortName": "179 бестиков дергея (Маляровский 11, Лупилцев 11, Орехов 11)", + "contestSystemId": "135374", + "groups": [ + ], + "hashTag": null, + "medias": { + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null + }, + { + "id": 25, + "name": "179+Летово+Силаэдр Процион (Устименко 8, Застрожная 8, Мухлисуллин 8)", + "shortName": "179+Летово+Силаэдр Процион (Устименко 8, Застрожная 8, Мухлисуллин 8)", + "contestSystemId": "135375", + "groups": [ + ], + "hashTag": null, + "medias": { + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null + }, + { + "id": 26, + "name": "57-19 “MK-37” (Сыздыков 10, Журавлев 10, Новгородцев 10)", + "shortName": "57-19 “MK-37” (Сыздыков 10, Журавлев 10, Новгородцев 10)", + "contestSystemId": "135376", + "groups": [ + ], + "hashTag": null, + "medias": { + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null + }, + { + "id": 27, + "name": "Л2Ш+1558+СУНЦ \"Три товарища без фантазии\" (Сергеев 10, Копылов 11, Кухаренко 10)", + "shortName": "Л2Ш+1558+СУНЦ \"Три товарища без фантазии\" (Сергеев 10, Копылов 11, Кухаренко 10)", + "contestSystemId": "135377", + "groups": [ + ], + "hashTag": null, + "medias": { + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null + }, + { + "id": 28, + "name": "СУНЦ \"Квадрат зайдет?\" (Боровлев 11, Сомкин 11, Баданов 11)", + "shortName": "СУНЦ \"Квадрат зайдет?\" (Боровлев 11, Сомкин 11, Баданов 11)", + "contestSystemId": "135378", + "groups": [ + ], + "hashTag": null, + "medias": { + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null + }, + { + "id": 29, + "name": "ФТЛ-8 Путешественники (Лещинский 10, Лязер 10, Фомин 10)", + "shortName": "ФТЛ-8 Путешественники (Лещинский 10, Лязер 10, Фомин 10)", + "contestSystemId": "135379", + "groups": [ + ], + "hashTag": null, + "medias": { + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null + }, + { + "id": 30, + "name": "179 Жёлтый кактус (Бурмистров 10, Шумилов 10, Шамсутдинов 10)", + "shortName": "179 Жёлтый кактус (Бурмистров 10, Шумилов 10, Шамсутдинов 10)", + "contestSystemId": "135380", + "groups": [ + ], + "hashTag": null, + "medias": { + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null + }, + { + "id": 31, + "name": "179+ЦПМ+СУНЦ \"К У П И Т Ь | ЫМ ИЛАБЛОД АРБУЗ\" (Возмилов 10, Терентьева 11, Матюпатенко 10)", + "shortName": "179+ЦПМ+СУНЦ \"К У П И Т Ь | ЫМ ИЛАБЛОД АРБУЗ\" (Возмилов 10, Терентьева 11, Матюпатенко 10)", + "contestSystemId": "135381", + "groups": [ + ], + "hashTag": null, + "medias": { + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null + }, + { + "id": 32, + "name": "57, Воробьевы горы \"10 негритят без права переписки\" (Кравченко 7, Балакин 8, Бурлаков 8)", + "shortName": "57, Воробьевы горы \"10 негритят без права переписки\" (Кравченко 7, Балакин 8, Бурлаков 8)", + "contestSystemId": "135382", + "groups": [ + ], + "hashTag": null, + "medias": { + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null + }, + { + "id": 33, + "name": "Л2Ш+57 Мейби бейби такая зайка (Степанов 11, Климчук 11, Васильев 11)", + "shortName": "Л2Ш+57 Мейби бейби такая зайка (Степанов 11, Климчук 11, Васильев 11)", + "contestSystemId": "135383", + "groups": [ + ], + "hashTag": null, + "medias": { + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null + }, + { + "id": 34, + "name": "СУНЦ \"Фан-клуб Анны Щербаковой\" (Горохов 11, Канухин 11, Первутинский 11)", + "shortName": "СУНЦ \"Фан-клуб Анны Щербаковой\" (Горохов 11, Канухин 11, Первутинский 11)", + "contestSystemId": "135384", + "groups": [ + ], + "hashTag": null, + "medias": { + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null + }, + { + "id": 35, + "name": "ЦПМ+ВШЭ \"Пылающие манулы\" (Вигалок 10, Калугин 10, Ефимов 10)", + "shortName": "ЦПМ+ВШЭ \"Пылающие манулы\" (Вигалок 10, Калугин 10, Ефимов 10)", + "contestSystemId": "135385", + "groups": [ + ], + "hashTag": null, + "medias": { + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null + }, + { + "id": 36, + "name": "179 Здравствуй, небо в облаках! (Черный 11, Громак 11, Устименко 10)", + "shortName": "179 Здравствуй, небо в облаках! (Черный 11, Громак 11, Устименко 10)", + "contestSystemId": "135386", + "groups": [ + ], + "hashTag": null, + "medias": { + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null + }, + { + "id": 37, + "name": "2007 \"Random name\" (Елисеев 11, Маланьин 11, Лишманова 10)", + "shortName": "2007 \"Random name\" (Елисеев 11, Маланьин 11, Лишманова 10)", + "contestSystemId": "135387", + "groups": [ + ], + "hashTag": null, + "medias": { + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null + }, + { + "id": 38, + "name": "57, ШЦПМ, Летово \"Клуб ценителей фонка\" (Валиуллин 9, Шейкис 9, Адаменко 9)", + "shortName": "57, ШЦПМ, Летово \"Клуб ценителей фонка\" (Валиуллин 9, Шейкис 9, Адаменко 9)", + "contestSystemId": "135388", + "groups": [ + ], + "hashTag": null, + "medias": { + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null + }, + { + "id": 39, + "name": "Летово \"123\" (Грицаев 10, Курлаев 10, Яременко 10)", + "shortName": "Летово \"123\" (Грицаев 10, Курлаев 10, Яременко 10)", + "contestSystemId": "135389", + "groups": [ + ], + "hashTag": null, + "medias": { + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null + }, + { + "id": 40, + "name": "СУНЦ \"Meow\" (Алексеев 11, Рагулин 11, Зотова 11)", + "shortName": "СУНЦ \"Meow\" (Алексеев 11, Рагулин 11, Зотова 11)", + "contestSystemId": "135390", + "groups": [ + ], + "hashTag": null, + "medias": { + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null + }, + { + "id": 41, + "name": "179 сладкие (Сергиенко 11, Губарев 11, Бурков 11)", + "shortName": "179 сладкие (Сергиенко 11, Губарев 11, Бурков 11)", + "contestSystemId": "135391", + "groups": [ + ], + "hashTag": null, + "medias": { + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null + }, + { + "id": 42, + "name": "2007+57 дружки-пирожки (Душенков 10, Дрожецкий 10, Скрипник 10)", + "shortName": "2007+57 дружки-пирожки (Душенков 10, Дрожецкий 10, Скрипник 10)", + "contestSystemId": "135392", + "groups": [ + ], + "hashTag": null, + "medias": { + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null + }, + { + "id": 43, + "name": "57+Л2Ш \"No chances, they are asians\" (Насретдинов 10, Крылыков 10, Хо 10)", + "shortName": "57+Л2Ш \"No chances, they are asians\" (Насретдинов 10, Крылыков 10, Хо 10)", + "contestSystemId": "135393", + "groups": [ + ], + "hashTag": null, + "medias": { + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null + }, + { + "id": 44, + "name": "Летово \"кислые мармеладки\" (Макнил 9, Равнушкин 9, Громыко 9)", + "shortName": "Летово \"кислые мармеладки\" (Макнил 9, Равнушкин 9, Громыко 9)", + "contestSystemId": "135394", + "groups": [ + ], + "hashTag": null, + "medias": { + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null + }, + { + "id": 45, + "name": "СУНЦ %team_name% (Михайлов 11, Ларин 11, Вараксин 11)", + "shortName": "СУНЦ %team_name% (Михайлов 11, Ларин 11, Вараксин 11)", + "contestSystemId": "135395", + "groups": [ + ], + "hashTag": null, + "medias": { + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null + }, + { + "id": 46, + "name": "179 Ущемлённые уточки (Черников 9, Маевский 9, Малышев 9)", + "shortName": "179 Ущемлённые уточки (Черников 9, Маевский 9, Малышев 9)", + "contestSystemId": "135396", + "groups": [ + ], + "hashTag": null, + "medias": { + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null + }, + { + "id": 47, + "name": "2086-1 \"Хеши в толстовке\" (Редько 10, Илаев 10, Иванов 10)", + "shortName": "2086-1 \"Хеши в толстовке\" (Редько 10, Илаев 10, Иванов 10)", + "contestSystemId": "135397", + "groups": [ + ], + "hashTag": null, + "medias": { + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null + }, + { + "id": 48, + "name": "57+ЦПМ Джаханпахлаван (Янбухтин 10, Жиляев 10, Медведев 10)", + "shortName": "57+ЦПМ Джаханпахлаван (Янбухтин 10, Жиляев 10, Медведев 10)", + "contestSystemId": "135398", + "groups": [ + ], + "hashTag": null, + "medias": { + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null + }, + { + "id": 49, + "name": "Летово \"Стардасты\" (Акулов 9, Личманов 9, Хазеев 9)", + "shortName": "Летово \"Стардасты\" (Акулов 9, Личманов 9, Хазеев 9)", + "contestSystemId": "135399", + "groups": [ + ], + "hashTag": null, + "medias": { + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null + }, + { + "id": 50, + "name": "СУНЦ Бум зука искряка (Никифоров 10, Газизов 10, Жуланов 10)", + "shortName": "СУНЦ Бум зука искряка (Никифоров 10, Газизов 10, Жуланов 10)", + "contestSystemId": "135400", + "groups": [ + ], + "hashTag": null, + "medias": { + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null + }, + { + "id": 51, + "name": "179 IQ (Шиловский 9, Чуркина 9, Турундаев 9)", + "shortName": "179 IQ (Шиловский 9, Чуркина 9, Турундаев 9)", + "contestSystemId": "135401", + "groups": [ + ], + "hashTag": null, + "medias": { + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null + }, + { + "id": 52, + "name": "57 \"2^82589933 - 1\" (Чистяков 10, Хесин 10, Яковлев 10)", + "shortName": "57 \"2^82589933 - 1\" (Чистяков 10, Хесин 10, Яковлев 10)", + "contestSystemId": "135402", + "groups": [ + ], + "hashTag": null, + "medias": { + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null + }, + { + "id": 53, + "name": "Акулы МШП (Широковских 11, Паркина 11, Сильвестров 11)", + "shortName": "Акулы МШП (Широковских 11, Паркина 11, Сильвестров 11)", + "contestSystemId": "135403", + "groups": [ + ], + "hashTag": null, + "medias": { + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null + }, + { + "id": 54, + "name": "Летово-1 \"Их было трое\" (Маглыш 10, Лобанов 9, Колобаев 11)", + "shortName": "Летово-1 \"Их было трое\" (Маглыш 10, Лобанов 9, Колобаев 11)", + "contestSystemId": "135404", + "groups": [ + ], + "hashTag": null, + "medias": { + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null + }, + { + "id": 55, + "name": "Три лицея, \"Попытка - не пытка\" (Гомзин 8, Шарапов 8, Алтынов 9)", + "shortName": "Три лицея, \"Попытка - не пытка\" (Гомзин 8, Шарапов 8, Алтынов 9)", + "contestSystemId": "135405", + "groups": [ + ], + "hashTag": null, + "medias": { + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null + } + ], + "groups": [ + ], + "organizations": [ + ], + "penaltyRoundingMode": "each_submission_down_to_minute" + }, + "runs": [ + { + "id": 216, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 4, + "time": 161087 + }, + { + "id": 217, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 9, + "time": 290473 + }, + { + "id": 218, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 39, + "time": 327417 + }, + { + "id": 219, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "CE", + "isAddingPenalty": false, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 44, + "time": 369304 + }, + { + "id": 220, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 44, + "time": 400306 + }, + { + "id": 221, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "RE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 34, + "time": 406143 + }, + { + "id": 222, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 29, + "time": 416242 + }, + { + "id": 223, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 54, + "time": 416884 + }, + { + "id": 224, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 36, + "time": 425828 + }, + { + "id": 225, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 32, + "time": 523597 + }, + { + "id": 226, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 14, + "time": 564439 + }, + { + "id": 227, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 54, + "time": 574801 + }, + { + "id": 228, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 41, + "time": 601151 + }, + { + "id": 229, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "CE", + "isAddingPenalty": false, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 33, + "time": 606632 + }, + { + "id": 230, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 19, + "time": 619145 + }, + { + "id": 231, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 33, + "time": 624968 + }, + { + "id": 232, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 31, + "time": 641523 + }, + { + "id": 233, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 9, + "time": 666179 + }, + { + "id": 234, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 36, + "time": 667799 + }, + { + "id": 235, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 13, + "time": 679291 + }, + { + "id": 236, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 11, + "time": 703112 + }, + { + "id": 237, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 5, + "teamId": 35, + "time": 717451 + }, + { + "id": 238, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 19, + "time": 717756 + }, + { + "id": 239, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 30, + "time": 718268 + }, + { + "id": 240, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 49, + "time": 738448 + }, + { + "id": 241, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 33, + "time": 739426 + }, + { + "id": 242, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 5, + "teamId": 43, + "time": 742383 + }, + { + "id": 243, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 44, + "time": 749633 + }, + { + "id": 244, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 5, + "teamId": 10, + "time": 806428 + }, + { + "id": 245, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 41, + "time": 826040 + }, + { + "id": 246, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 8, + "time": 850326 + }, + { + "id": 247, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 3, + "time": 872246 + }, + { + "id": 248, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 5, + "teamId": 49, + "time": 905814 + }, + { + "id": 249, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 5, + "teamId": 36, + "time": 910882 + }, + { + "id": 250, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 20, + "time": 932188 + }, + { + "id": 251, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 42, + "time": 947771 + }, + { + "id": 252, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 33, + "time": 948114 + }, + { + "id": 253, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 5, + "teamId": 32, + "time": 959484 + }, + { + "id": 254, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 5, + "teamId": 9, + "time": 973214 + }, + { + "id": 255, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 50, + "time": 1007755 + }, + { + "id": 256, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 14, + "time": 1016018 + }, + { + "id": 257, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "PE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 18, + "time": 1028817 + }, + { + "id": 258, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 30, + "time": 1038933 + }, + { + "id": 259, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 12, + "time": 1049174 + }, + { + "id": 260, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "PE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 18, + "time": 1061576 + }, + { + "id": 261, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "RE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 51, + "time": 1061952 + }, + { + "id": 262, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 30, + "time": 1078621 + }, + { + "id": 263, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 11, + "teamId": 45, + "time": 1092267 + }, + { + "id": 264, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "PE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 18, + "time": 1105666 + }, + { + "id": 265, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 52, + "time": 1110823 + }, + { + "id": 266, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 40, + "time": 1135882 + }, + { + "id": 267, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 53, + "time": 1159470 + }, + { + "id": 268, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 18, + "time": 1191396 + }, + { + "id": 269, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "RE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 0, + "time": 1208254 + }, + { + "id": 270, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 5, + "teamId": 33, + "time": 1212926 + }, + { + "id": 271, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 5, + "teamId": 31, + "time": 1225061 + }, + { + "id": 272, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 2, + "time": 1227119 + }, + { + "id": 273, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 5, + "teamId": 44, + "time": 1227805 + }, + { + "id": 274, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 51, + "time": 1236963 + }, + { + "id": 275, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 49, + "time": 1243417 + }, + { + "id": 276, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 5, + "teamId": 3, + "time": 1252844 + }, + { + "id": 277, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "RE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 52, + "time": 1269622 + }, + { + "id": 278, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 8, + "time": 1305154 + }, + { + "id": 279, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 38, + "time": 1313755 + }, + { + "id": 280, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 51, + "time": 1317812 + }, + { + "id": 281, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 5, + "teamId": 34, + "time": 1332493 + }, + { + "id": 282, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 25, + "time": 1340975 + }, + { + "id": 283, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 54, + "time": 1353962 + }, + { + "id": 284, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 30, + "time": 1383714 + }, + { + "id": 285, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 36, + "time": 1384298 + }, + { + "id": 286, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 41, + "time": 1401863 + }, + { + "id": 287, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 25, + "time": 1403931 + }, + { + "id": 288, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 5, + "teamId": 14, + "time": 1447557 + }, + { + "id": 289, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 21, + "time": 1472519 + }, + { + "id": 290, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 5, + "teamId": 37, + "time": 1479326 + }, + { + "id": 291, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 9, + "time": 1486628 + }, + { + "id": 292, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 5, + "teamId": 50, + "time": 1495588 + }, + { + "id": 293, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 13, + "time": 1515785 + }, + { + "id": 294, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 45, + "time": 1535922 + }, + { + "id": 295, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 51, + "time": 1542546 + }, + { + "id": 296, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 36, + "time": 1600629 + }, + { + "id": 297, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 5, + "teamId": 30, + "time": 1635586 + }, + { + "id": 298, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 17, + "time": 1643798 + }, + { + "id": 299, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 5, + "teamId": 8, + "time": 1646439 + }, + { + "id": 300, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 24, + "time": 1654329 + }, + { + "id": 301, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 4, + "time": 1677411 + }, + { + "id": 302, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 38, + "time": 1704506 + }, + { + "id": 303, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 44, + "time": 1722649 + }, + { + "id": 304, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 42, + "time": 1767775 + }, + { + "id": 305, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 10, + "time": 1803214 + }, + { + "id": 306, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 29, + "time": 1803704 + }, + { + "id": 307, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 38, + "time": 1822705 + }, + { + "id": 308, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 54, + "time": 1828352 + }, + { + "id": 309, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 54, + "time": 1856313 + }, + { + "id": 310, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 49, + "time": 1865641 + }, + { + "id": 311, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 6, + "time": 1883859 + }, + { + "id": 312, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 24, + "time": 1903031 + }, + { + "id": 313, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 16, + "time": 1909361 + }, + { + "id": 314, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 28, + "time": 1910869 + }, + { + "id": 315, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 5, + "teamId": 46, + "time": 1922488 + }, + { + "id": 316, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 45, + "time": 1923166 + }, + { + "id": 317, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 5, + "teamId": 25, + "time": 1928005 + }, + { + "id": 318, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 11, + "time": 1929679 + }, + { + "id": 319, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 13, + "time": 1935976 + }, + { + "id": 320, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 43, + "time": 1941021 + }, + { + "id": 321, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 44, + "time": 1943411 + }, + { + "id": 322, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 5, + "teamId": 34, + "time": 1945107 + }, + { + "id": 323, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 44, + "time": 1947464 + }, + { + "id": 324, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 41, + "time": 1951059 + }, + { + "id": 325, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 5, + "teamId": 39, + "time": 1964322 + }, + { + "id": 326, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 44, + "time": 1970112 + }, + { + "id": 327, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 5, + "teamId": 7, + "time": 1972785 + }, + { + "id": 328, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 12, + "time": 1979947 + }, + { + "id": 329, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 37, + "time": 1994479 + }, + { + "id": 330, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 36, + "time": 2000284 + }, + { + "id": 331, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "PE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 4, + "time": 2022207 + }, + { + "id": 332, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 35, + "time": 2077268 + }, + { + "id": 333, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 11, + "time": 2079226 + }, + { + "id": 334, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 5, + "teamId": 20, + "time": 2089491 + }, + { + "id": 335, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 5, + "teamId": 5, + "time": 2098690 + }, + { + "id": 336, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 15, + "time": 2099271 + }, + { + "id": 337, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 4, + "time": 2105118 + }, + { + "id": 338, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 19, + "time": 2108932 + }, + { + "id": 339, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 5, + "teamId": 53, + "time": 2110920 + }, + { + "id": 340, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 50, + "time": 2111529 + }, + { + "id": 341, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 54, + "time": 2196848 + }, + { + "id": 342, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 5, + "teamId": 1, + "time": 2218374 + }, + { + "id": 343, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 54, + "time": 2233302 + }, + { + "id": 344, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 5, + "teamId": 41, + "time": 2258990 + }, + { + "id": 345, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 31, + "time": 2261099 + }, + { + "id": 346, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 44, + "time": 2262289 + }, + { + "id": 347, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 34, + "time": 2275468 + }, + { + "id": 348, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 5, + "teamId": 17, + "time": 2279551 + }, + { + "id": 349, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 2, + "time": 2295277 + }, + { + "id": 350, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 4, + "time": 2308073 + }, + { + "id": 351, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 47, + "time": 2308658 + }, + { + "id": 352, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 38, + "time": 2312149 + }, + { + "id": 353, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 35, + "time": 2324966 + }, + { + "id": 354, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 5, + "teamId": 24, + "time": 2405784 + }, + { + "id": 355, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 48, + "time": 2417738 + }, + { + "id": 356, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 50, + "time": 2417845 + }, + { + "id": 357, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 11, + "teamId": 33, + "time": 2429511 + }, + { + "id": 358, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 48, + "time": 2435174 + }, + { + "id": 359, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 11, + "teamId": 36, + "time": 2441776 + }, + { + "id": 360, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 9, + "time": 2468689 + }, + { + "id": 361, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 5, + "teamId": 11, + "time": 2477539 + }, + { + "id": 362, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 32, + "time": 2491868 + }, + { + "id": 363, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 1, + "time": 2507679 + }, + { + "id": 364, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 2, + "time": 2508840 + }, + { + "id": 365, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 5, + "teamId": 18, + "time": 2527407 + }, + { + "id": 366, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 5, + "teamId": 12, + "time": 2532512 + }, + { + "id": 367, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 9, + "time": 2544960 + }, + { + "id": 368, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 15, + "time": 2562811 + }, + { + "id": 369, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 5, + "teamId": 21, + "time": 2565477 + }, + { + "id": 370, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 40, + "time": 2591049 + }, + { + "id": 371, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 5, + "teamId": 4, + "time": 2618678 + }, + { + "id": 372, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 23, + "time": 2619278 + }, + { + "id": 373, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 5, + "teamId": 54, + "time": 2656995 + }, + { + "id": 374, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 5, + "teamId": 54, + "time": 2676068 + }, + { + "id": 375, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 27, + "time": 2689209 + }, + { + "id": 376, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 9, + "time": 2696051 + }, + { + "id": 377, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 5, + "teamId": 54, + "time": 2709605 + }, + { + "id": 378, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 15, + "time": 2711168 + }, + { + "id": 379, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 40, + "time": 2717660 + }, + { + "id": 380, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 5, + "teamId": 13, + "time": 2720185 + }, + { + "id": 381, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 5, + "teamId": 13, + "time": 2732343 + }, + { + "id": 382, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 42, + "time": 2760377 + }, + { + "id": 383, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "CE", + "isAddingPenalty": false, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 44, + "time": 2775116 + }, + { + "id": 384, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 34, + "time": 2817890 + }, + { + "id": 385, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 50, + "time": 2823975 + }, + { + "id": 386, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 5, + "teamId": 38, + "time": 2845852 + }, + { + "id": 387, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 5, + "teamId": 54, + "time": 2847164 + }, + { + "id": 388, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 9, + "time": 2849732 + }, + { + "id": 389, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 5, + "teamId": 28, + "time": 2870166 + }, + { + "id": 390, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 5, + "teamId": 45, + "time": 2871708 + }, + { + "id": 391, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 48, + "time": 2934887 + }, + { + "id": 392, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 36, + "time": 2945885 + }, + { + "id": 393, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 4, + "time": 2986932 + }, + { + "id": 394, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 5, + "teamId": 54, + "time": 3004229 + }, + { + "id": 395, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 46, + "time": 3079451 + }, + { + "id": 396, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 48, + "time": 3087961 + }, + { + "id": 397, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 44, + "time": 3093109 + }, + { + "id": 398, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 14, + "time": 3096419 + }, + { + "id": 399, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 39, + "time": 3117792 + }, + { + "id": 400, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 5, + "teamId": 51, + "time": 3118652 + }, + { + "id": 401, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 20, + "time": 3144114 + }, + { + "id": 402, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 7, + "time": 3149013 + }, + { + "id": 403, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 38, + "time": 3164613 + }, + { + "id": 404, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 26, + "time": 3185356 + }, + { + "id": 405, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 5, + "teamId": 2, + "time": 3216842 + }, + { + "id": 406, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 37, + "time": 3220385 + }, + { + "id": 407, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 52, + "time": 3308898 + }, + { + "id": 408, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 14, + "time": 3317256 + }, + { + "id": 409, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 5, + "teamId": 55, + "time": 3331601 + }, + { + "id": 410, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 5, + "teamId": 40, + "time": 3336461 + }, + { + "id": 411, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 33, + "time": 3337757 + }, + { + "id": 412, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 21, + "time": 3377714 + }, + { + "id": 413, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 0, + "time": 3403694 + }, + { + "id": 414, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 15, + "time": 3414040 + }, + { + "id": 415, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 38, + "time": 3440137 + }, + { + "id": 416, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 13, + "time": 3440362 + }, + { + "id": 417, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 36, + "time": 3460052 + }, + { + "id": 418, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "CE", + "isAddingPenalty": false, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 47, + "time": 3460471 + }, + { + "id": 419, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 10, + "time": 3461784 + }, + { + "id": 420, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 11, + "teamId": 41, + "time": 3501931 + }, + { + "id": 421, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 47, + "time": 3507445 + }, + { + "id": 422, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "PE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 27, + "time": 3519547 + }, + { + "id": 423, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 5, + "teamId": 42, + "time": 3520298 + }, + { + "id": 424, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 11, + "teamId": 41, + "time": 3529855 + }, + { + "id": 425, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 5, + "teamId": 27, + "time": 3548314 + }, + { + "id": 426, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 47, + "time": 3567445 + }, + { + "id": 427, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 31, + "time": 3574523 + }, + { + "id": 428, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 25, + "time": 3583980 + }, + { + "id": 429, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 20, + "time": 3596005 + }, + { + "id": 430, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 32, + "time": 3636142 + }, + { + "id": 431, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 7, + "time": 3636762 + }, + { + "id": 432, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 13, + "time": 3654552 + }, + { + "id": 433, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 15, + "time": 3655287 + }, + { + "id": 434, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 31, + "time": 3656844 + }, + { + "id": 435, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 11, + "teamId": 13, + "time": 3662081 + }, + { + "id": 436, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 2, + "time": 3673669 + }, + { + "id": 437, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 51, + "time": 3689549 + }, + { + "id": 438, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 5, + "teamId": 6, + "time": 3690488 + }, + { + "id": 439, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 32, + "time": 3693194 + }, + { + "id": 440, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 5, + "time": 3708108 + }, + { + "id": 441, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 11, + "teamId": 13, + "time": 3717198 + }, + { + "id": 442, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 15, + "time": 3786212 + }, + { + "id": 443, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 50, + "time": 3860972 + }, + { + "id": 444, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 23, + "time": 3869323 + }, + { + "id": 445, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 54, + "time": 3897085 + }, + { + "id": 446, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 36, + "time": 3904056 + }, + { + "id": 447, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 24, + "time": 3911907 + }, + { + "id": 448, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 46, + "time": 3954199 + }, + { + "id": 449, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 2, + "time": 3960277 + }, + { + "id": 450, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 54, + "time": 3964188 + }, + { + "id": 451, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 5, + "teamId": 19, + "time": 3979663 + }, + { + "id": 452, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 15, + "time": 4000010 + }, + { + "id": 453, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 8, + "time": 4029917 + }, + { + "id": 454, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 11, + "teamId": 20, + "time": 4046011 + }, + { + "id": 455, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "RE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 52, + "time": 4077268 + }, + { + "id": 456, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "PE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 0, + "time": 4098908 + }, + { + "id": 457, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 5, + "teamId": 0, + "time": 4107226 + }, + { + "id": 458, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 38, + "time": 4108647 + }, + { + "id": 459, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 1, + "time": 4115776 + }, + { + "id": 460, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 21, + "time": 4142228 + }, + { + "id": 461, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 6, + "time": 4173000 + }, + { + "id": 462, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "RE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 52, + "time": 4195017 + }, + { + "id": 463, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 5, + "teamId": 23, + "time": 4227684 + }, + { + "id": 464, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 37, + "time": 4229649 + }, + { + "id": 465, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 21, + "time": 4239287 + }, + { + "id": 466, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 11, + "teamId": 24, + "time": 4256268 + }, + { + "id": 467, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 5, + "teamId": 48, + "time": 4273260 + }, + { + "id": 468, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 5, + "teamId": 23, + "time": 4282637 + }, + { + "id": 469, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 52, + "time": 4283569 + }, + { + "id": 470, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 5, + "teamId": 15, + "time": 4288337 + }, + { + "id": 471, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 17, + "time": 4336421 + }, + { + "id": 472, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 44, + "time": 4344049 + }, + { + "id": 473, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 46, + "time": 4344784 + }, + { + "id": 474, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 5, + "teamId": 47, + "time": 4353341 + }, + { + "id": 475, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 25, + "time": 4385481 + }, + { + "id": 476, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 42, + "time": 4399958 + }, + { + "id": 477, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 44, + "time": 4411308 + }, + { + "id": 478, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 21, + "time": 4490936 + }, + { + "id": 479, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 13, + "time": 4502213 + }, + { + "id": 480, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 1, + "time": 4553825 + }, + { + "id": 481, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 5, + "teamId": 23, + "time": 4565647 + }, + { + "id": 482, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 26, + "time": 4566433 + }, + { + "id": 483, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 45, + "time": 4585327 + }, + { + "id": 484, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "RE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 40, + "time": 4611690 + }, + { + "id": 485, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 37, + "time": 4620716 + }, + { + "id": 486, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 3, + "time": 4623566 + }, + { + "id": 487, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 3, + "time": 4653877 + }, + { + "id": 488, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 40, + "time": 4666261 + }, + { + "id": 489, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 5, + "teamId": 48, + "time": 4681682 + }, + { + "id": 490, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 11, + "teamId": 8, + "time": 4716052 + }, + { + "id": 491, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 5, + "teamId": 23, + "time": 4748656 + }, + { + "id": 492, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 0, + "time": 4771927 + }, + { + "id": 493, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 41, + "time": 4782480 + }, + { + "id": 494, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 42, + "time": 4794135 + }, + { + "id": 495, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 15, + "time": 4836857 + }, + { + "id": 496, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 34, + "time": 4879118 + }, + { + "id": 497, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 40, + "time": 4957283 + }, + { + "id": 498, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 5, + "time": 4996737 + }, + { + "id": 499, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 11, + "teamId": 9, + "time": 5017623 + }, + { + "id": 500, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 25, + "time": 5032072 + }, + { + "id": 501, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 41, + "time": 5039059 + }, + { + "id": 502, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 53, + "time": 5058084 + }, + { + "id": 503, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 43, + "time": 5132306 + }, + { + "id": 504, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 5, + "teamId": 29, + "time": 5200862 + }, + { + "id": 505, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 5, + "teamId": 26, + "time": 5213319 + }, + { + "id": 506, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 5, + "teamId": 52, + "time": 5215829 + }, + { + "id": 507, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "PE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 43, + "time": 5233042 + }, + { + "id": 508, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 32, + "time": 5261081 + }, + { + "id": 509, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 32, + "time": 5280694 + }, + { + "id": 510, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 32, + "time": 5290629 + }, + { + "id": 511, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 49, + "time": 5298440 + }, + { + "id": 512, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 5, + "teamId": 48, + "time": 5313243 + }, + { + "id": 513, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 2, + "time": 5318372 + }, + { + "id": 514, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 33, + "time": 5336574 + }, + { + "id": 515, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 11, + "teamId": 31, + "time": 5403494 + }, + { + "id": 516, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 42, + "time": 5437699 + }, + { + "id": 517, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "PE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 27, + "time": 5510446 + }, + { + "id": 518, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 34, + "time": 5514331 + }, + { + "id": 519, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 27, + "time": 5545271 + }, + { + "id": 520, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 11, + "teamId": 30, + "time": 5560018 + }, + { + "id": 521, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 45, + "time": 5582262 + }, + { + "id": 522, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 34, + "time": 5606364 + }, + { + "id": 523, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 35, + "time": 5643340 + }, + { + "id": 524, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 20, + "time": 5668673 + }, + { + "id": 525, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 11, + "teamId": 30, + "time": 5681659 + }, + { + "id": 526, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 43, + "time": 5837028 + }, + { + "id": 527, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 40, + "time": 5848310 + }, + { + "id": 528, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 41, + "time": 5863292 + }, + { + "id": 529, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 29, + "time": 5877032 + }, + { + "id": 530, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 21, + "time": 5879756 + }, + { + "id": 531, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 53, + "time": 5900505 + }, + { + "id": 532, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 5, + "teamId": 22, + "time": 5905924 + }, + { + "id": 533, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 11, + "teamId": 2, + "time": 5962249 + }, + { + "id": 534, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 45, + "time": 5963974 + }, + { + "id": 535, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "CE", + "isAddingPenalty": false, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 49, + "time": 5978984 + }, + { + "id": 536, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 11, + "teamId": 14, + "time": 5995072 + }, + { + "id": 537, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "CE", + "isAddingPenalty": false, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 49, + "time": 6011056 + }, + { + "id": 538, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "CE", + "isAddingPenalty": false, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 49, + "time": 6044277 + }, + { + "id": 539, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 47, + "time": 6059045 + }, + { + "id": 540, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 18, + "time": 6079674 + }, + { + "id": 541, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 11, + "teamId": 14, + "time": 6085197 + }, + { + "id": 542, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 49, + "time": 6089343 + }, + { + "id": 543, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 44, + "time": 6130596 + }, + { + "id": 544, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "RE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 28, + "time": 6137586 + }, + { + "id": 545, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 53, + "time": 6161349 + }, + { + "id": 546, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 13, + "time": 6163840 + }, + { + "id": 547, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 1, + "time": 6186536 + }, + { + "id": 548, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 44, + "time": 6231760 + }, + { + "id": 549, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 1, + "time": 6281995 + }, + { + "id": 550, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 11, + "teamId": 40, + "time": 6283718 + }, + { + "id": 551, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 28, + "time": 6310516 + }, + { + "id": 552, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 9, + "time": 6326470 + }, + { + "id": 553, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 15, + "time": 6349084 + }, + { + "id": 554, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 48, + "time": 6353664 + }, + { + "id": 555, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 0, + "time": 6372407 + }, + { + "id": 556, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 33, + "time": 6403020 + }, + { + "id": 557, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 22, + "time": 6428699 + }, + { + "id": 558, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 38, + "time": 6436523 + }, + { + "id": 559, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 32, + "time": 6467105 + }, + { + "id": 560, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "CE", + "isAddingPenalty": false, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 9, + "time": 6478060 + }, + { + "id": 561, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 26, + "time": 6489287 + }, + { + "id": 562, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 43, + "time": 6504580 + }, + { + "id": 563, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 9, + "time": 6505633 + }, + { + "id": 564, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 8, + "time": 6529732 + }, + { + "id": 565, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 52, + "time": 6545560 + }, + { + "id": 566, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 51, + "time": 6555006 + }, + { + "id": 567, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 55, + "time": 6555047 + }, + { + "id": 568, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 55, + "time": 6639504 + }, + { + "id": 569, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 9, + "time": 6651914 + }, + { + "id": 570, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 45, + "time": 6669041 + }, + { + "id": 571, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 45, + "time": 6688026 + }, + { + "id": 572, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 15, + "time": 6703414 + }, + { + "id": 573, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 11, + "time": 6709560 + }, + { + "id": 574, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 33, + "time": 6715840 + }, + { + "id": 575, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 24, + "time": 6740112 + }, + { + "id": 576, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 11, + "teamId": 40, + "time": 6766760 + }, + { + "id": 577, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 51, + "time": 6791335 + }, + { + "id": 578, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 12, + "time": 6812643 + }, + { + "id": 579, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 15, + "time": 6818735 + }, + { + "id": 580, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 45, + "time": 6819984 + }, + { + "id": 581, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 6, + "time": 6855291 + }, + { + "id": 582, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "PE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 43, + "time": 6860107 + }, + { + "id": 583, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 11, + "teamId": 46, + "time": 6894508 + }, + { + "id": 584, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 7, + "time": 6898282 + }, + { + "id": 585, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 11, + "teamId": 47, + "time": 6921187 + }, + { + "id": 586, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 13, + "time": 6962804 + }, + { + "id": 587, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 26, + "time": 6972390 + }, + { + "id": 588, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 11, + "teamId": 46, + "time": 6976906 + }, + { + "id": 589, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 3, + "time": 7042899 + }, + { + "id": 590, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 5, + "time": 7059724 + }, + { + "id": 591, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "PE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 43, + "time": 7066577 + }, + { + "id": 592, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 7, + "time": 7110031 + }, + { + "id": 593, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 5, + "time": 7148885 + }, + { + "id": 594, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 7, + "time": 7150007 + }, + { + "id": 595, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 45, + "time": 7151373 + }, + { + "id": 596, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "PE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 43, + "time": 7253712 + }, + { + "id": 597, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 20, + "time": 7268494 + }, + { + "id": 598, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 36, + "time": 7342941 + }, + { + "id": 599, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 31, + "time": 7372106 + }, + { + "id": 600, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "PE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 43, + "time": 7395943 + }, + { + "id": 601, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 11, + "teamId": 38, + "time": 7413659 + }, + { + "id": 602, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 33, + "time": 7438182 + }, + { + "id": 603, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 33, + "time": 7475693 + }, + { + "id": 604, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 36, + "time": 7479852 + }, + { + "id": 605, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 50, + "time": 7496799 + }, + { + "id": 606, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 40, + "time": 7498636 + }, + { + "id": 607, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 14, + "time": 7550098 + }, + { + "id": 608, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 26, + "time": 7559195 + }, + { + "id": 609, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 31, + "time": 7587832 + }, + { + "id": 610, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 10, + "time": 7597418 + }, + { + "id": 611, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 27, + "time": 7606999 + }, + { + "id": 612, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 54, + "time": 7627747 + }, + { + "id": 613, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 11, + "teamId": 49, + "time": 7628796 + }, + { + "id": 614, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 30, + "time": 7665387 + }, + { + "id": 615, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 30, + "time": 7698306 + }, + { + "id": 616, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 27, + "time": 7715412 + }, + { + "id": 617, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 54, + "time": 7741138 + }, + { + "id": 618, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "RE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 19, + "time": 7745022 + }, + { + "id": 619, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 44, + "time": 7763394 + }, + { + "id": 620, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 27, + "time": 7819677 + }, + { + "id": 621, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 52, + "time": 7895448 + }, + { + "id": 622, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "RE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 30, + "time": 7900740 + }, + { + "id": 623, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 11, + "teamId": 43, + "time": 7913284 + }, + { + "id": 624, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 52, + "time": 7926568 + }, + { + "id": 625, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 11, + "teamId": 43, + "time": 7944924 + }, + { + "id": 626, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 31, + "time": 7956668 + }, + { + "id": 627, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 52, + "time": 7958655 + }, + { + "id": 628, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 7, + "time": 7963954 + }, + { + "id": 629, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "RE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 9, + "time": 7970749 + }, + { + "id": 630, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 44, + "time": 7974441 + }, + { + "id": 631, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 11, + "teamId": 29, + "time": 7979078 + }, + { + "id": 632, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 11, + "teamId": 15, + "time": 7983172 + }, + { + "id": 633, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 52, + "time": 7996177 + }, + { + "id": 634, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 52, + "time": 8010052 + }, + { + "id": 635, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 30, + "time": 8018083 + }, + { + "id": 636, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 52, + "time": 8027675 + }, + { + "id": 637, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 1, + "time": 8031060 + }, + { + "id": 638, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 52, + "time": 8043224 + }, + { + "id": 639, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "RE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 19, + "time": 8049124 + }, + { + "id": 640, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 11, + "teamId": 15, + "time": 8056838 + }, + { + "id": 641, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 52, + "time": 8070188 + }, + { + "id": 642, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 22, + "time": 8072994 + }, + { + "id": 643, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 52, + "time": 8086696 + }, + { + "id": 644, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "CE", + "isAddingPenalty": false, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 11, + "teamId": 29, + "time": 8102187 + }, + { + "id": 645, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 17, + "time": 8117178 + }, + { + "id": 646, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 9, + "time": 8118201 + }, + { + "id": 647, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 11, + "teamId": 15, + "time": 8120297 + }, + { + "id": 648, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 35, + "time": 8122776 + }, + { + "id": 649, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 41, + "time": 8127675 + }, + { + "id": 650, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 52, + "time": 8138804 + }, + { + "id": 651, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 49, + "time": 8164672 + }, + { + "id": 652, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 11, + "teamId": 29, + "time": 8170703 + }, + { + "id": 653, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 52, + "time": 8172352 + }, + { + "id": 654, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 35, + "time": 8174705 + }, + { + "id": 655, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 44, + "time": 8180239 + }, + { + "id": 656, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 11, + "teamId": 32, + "time": 8181555 + }, + { + "id": 657, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 5, + "teamId": 16, + "time": 8189820 + }, + { + "id": 658, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 52, + "time": 8198639 + }, + { + "id": 659, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 43, + "time": 8234236 + }, + { + "id": 660, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 41, + "time": 8243773 + }, + { + "id": 661, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 11, + "teamId": 32, + "time": 8244170 + }, + { + "id": 662, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 22, + "time": 8248478 + }, + { + "id": 663, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 35, + "time": 8273965 + }, + { + "id": 664, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "RE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 19, + "time": 8321210 + }, + { + "id": 665, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 44, + "time": 8328787 + }, + { + "id": 666, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 50, + "time": 8343897 + }, + { + "id": 667, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 11, + "teamId": 10, + "time": 8361749 + }, + { + "id": 668, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 43, + "time": 8378524 + }, + { + "id": 669, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 43, + "time": 8442073 + }, + { + "id": 670, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 49, + "time": 8451939 + }, + { + "id": 671, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 17, + "time": 8477558 + }, + { + "id": 672, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 31, + "time": 8484492 + }, + { + "id": 673, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 5, + "teamId": 16, + "time": 8492735 + }, + { + "id": 674, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 11, + "teamId": 10, + "time": 8536670 + }, + { + "id": 675, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "RE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 32, + "time": 8555699 + }, + { + "id": 676, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 35, + "time": 8557152 + }, + { + "id": 677, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 44, + "time": 8566684 + }, + { + "id": 678, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 11, + "teamId": 17, + "time": 8599787 + }, + { + "id": 679, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 2, + "time": 8613624 + }, + { + "id": 680, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "RE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 32, + "time": 8619438 + }, + { + "id": 681, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 44, + "time": 8675244 + }, + { + "id": 682, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 55, + "time": 8687451 + }, + { + "id": 683, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 3, + "teamId": 36, + "time": 8699182 + }, + { + "id": 684, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 44, + "time": 8730466 + }, + { + "id": 685, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 49, + "time": 8760992 + }, + { + "id": 686, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 11, + "teamId": 18, + "time": 8761018 + }, + { + "id": 687, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "RE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 32, + "time": 8768617 + }, + { + "id": 688, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "RE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 21, + "time": 8777274 + }, + { + "id": 689, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "CE", + "isAddingPenalty": false, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 44, + "time": 8794164 + }, + { + "id": 690, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "RE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 21, + "time": 8821070 + }, + { + "id": 691, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 11, + "teamId": 17, + "time": 8839652 + }, + { + "id": 692, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 28, + "time": 8839712 + }, + { + "id": 693, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 44, + "time": 8842501 + }, + { + "id": 694, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "RE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 45, + "time": 8858967 + }, + { + "id": 695, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 11, + "teamId": 18, + "time": 8868438 + }, + { + "id": 696, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 13, + "time": 8877978 + }, + { + "id": 697, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "RE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 21, + "time": 8879667 + }, + { + "id": 698, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "RE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 45, + "time": 8891671 + }, + { + "id": 699, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 3, + "time": 8894293 + }, + { + "id": 700, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 11, + "teamId": 18, + "time": 8907273 + }, + { + "id": 701, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 22, + "time": 8911374 + }, + { + "id": 702, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "RE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 32, + "time": 8921721 + }, + { + "id": 703, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 44, + "time": 8930760 + }, + { + "id": 704, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 11, + "teamId": 18, + "time": 8932044 + }, + { + "id": 705, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 39, + "time": 8973515 + }, + { + "id": 706, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 41, + "time": 8980938 + }, + { + "id": 707, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 52, + "time": 9026950 + }, + { + "id": 708, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 32, + "time": 9034107 + }, + { + "id": 709, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 52, + "time": 9043391 + }, + { + "id": 710, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 45, + "time": 9046002 + }, + { + "id": 711, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 44, + "time": 9063997 + }, + { + "id": 712, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 52, + "time": 9072436 + }, + { + "id": 713, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 47, + "time": 9073336 + }, + { + "id": 714, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 14, + "time": 9101257 + }, + { + "id": 715, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 28, + "time": 9115483 + }, + { + "id": 716, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "RE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 3, + "time": 9118060 + }, + { + "id": 717, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 14, + "time": 9121790 + }, + { + "id": 718, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 17, + "time": 9130739 + }, + { + "id": 719, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 3, + "time": 9145649 + }, + { + "id": 720, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 13, + "time": 9162692 + }, + { + "id": 721, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 44, + "time": 9174313 + }, + { + "id": 722, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "RE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 11, + "teamId": 18, + "time": 9191405 + }, + { + "id": 723, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 11, + "teamId": 27, + "time": 9211901 + }, + { + "id": 724, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 3, + "time": 9246197 + }, + { + "id": 725, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 28, + "time": 9247385 + }, + { + "id": 726, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 33, + "time": 9250257 + }, + { + "id": 727, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "RE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 11, + "teamId": 18, + "time": 9250726 + }, + { + "id": 728, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 23, + "time": 9261409 + }, + { + "id": 729, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 9, + "time": 9270270 + }, + { + "id": 730, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "RE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 41, + "time": 9285317 + }, + { + "id": 731, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 11, + "teamId": 18, + "time": 9300673 + }, + { + "id": 732, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 53, + "time": 9312309 + }, + { + "id": 733, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 31, + "time": 9313946 + }, + { + "id": 734, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 54, + "time": 9337281 + }, + { + "id": 735, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 9, + "time": 9355154 + }, + { + "id": 736, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 3, + "time": 9384365 + }, + { + "id": 737, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "RE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 3, + "time": 9398436 + }, + { + "id": 738, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 11, + "teamId": 25, + "time": 9414161 + }, + { + "id": 739, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 31, + "time": 9438734 + }, + { + "id": 740, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 17, + "time": 9453964 + }, + { + "id": 741, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 3, + "time": 9474603 + }, + { + "id": 742, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 14, + "time": 9494195 + }, + { + "id": 743, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 11, + "teamId": 25, + "time": 9499683 + }, + { + "id": 744, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 22, + "time": 9509104 + }, + { + "id": 745, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 14, + "time": 9529582 + }, + { + "id": 746, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "RE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 41, + "time": 9556790 + }, + { + "id": 747, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 32, + "time": 9577808 + }, + { + "id": 748, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 50, + "time": 9588425 + }, + { + "id": 749, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 37, + "time": 9622669 + }, + { + "id": 750, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 31, + "time": 9626365 + }, + { + "id": 751, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 14, + "time": 9644744 + }, + { + "id": 752, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 11, + "teamId": 49, + "time": 9668454 + }, + { + "id": 753, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "RE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 41, + "time": 9720920 + }, + { + "id": 754, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 41, + "time": 9767261 + }, + { + "id": 755, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 32, + "time": 9768258 + }, + { + "id": 756, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 19, + "time": 9775222 + }, + { + "id": 757, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 11, + "teamId": 4, + "time": 9781559 + }, + { + "id": 758, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 11, + "teamId": 27, + "time": 9805201 + }, + { + "id": 759, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 11, + "teamId": 4, + "time": 9827581 + }, + { + "id": 760, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 19, + "time": 9830281 + }, + { + "id": 761, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 11, + "teamId": 25, + "time": 9830438 + }, + { + "id": 762, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 8, + "time": 9843342 + }, + { + "id": 763, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 54, + "time": 9853842 + }, + { + "id": 764, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 22, + "time": 9859659 + }, + { + "id": 765, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 33, + "time": 9882436 + }, + { + "id": 766, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 9, + "time": 9905090 + }, + { + "id": 767, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 11, + "teamId": 4, + "time": 9947589 + }, + { + "id": 768, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 36, + "time": 9977681 + }, + { + "id": 769, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 54, + "time": 9997171 + }, + { + "id": 770, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 34, + "time": 10011084 + }, + { + "id": 771, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 41, + "time": 10086821 + }, + { + "id": 772, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 54, + "time": 10111908 + }, + { + "id": 773, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 14, + "time": 10187865 + }, + { + "id": 774, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 14, + "time": 10223151 + }, + { + "id": 775, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "RE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 21, + "time": 10281546 + }, + { + "id": 776, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 1, + "time": 10315433 + }, + { + "id": 777, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 11, + "teamId": 49, + "time": 10390740 + }, + { + "id": 778, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 18, + "time": 10398106 + }, + { + "id": 779, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 1, + "time": 10406796 + }, + { + "id": 780, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "RE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 11, + "time": 10419762 + }, + { + "id": 781, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 31, + "time": 10435346 + }, + { + "id": 782, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 7, + "time": 10447756 + }, + { + "id": 783, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 11, + "teamId": 53, + "time": 10483070 + }, + { + "id": 784, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 14, + "time": 10508834 + }, + { + "id": 785, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 7, + "time": 10513178 + }, + { + "id": 786, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 11, + "teamId": 29, + "time": 10513704 + }, + { + "id": 787, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 18, + "time": 10521020 + }, + { + "id": 788, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 42, + "time": 10540888 + }, + { + "id": 789, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 20, + "time": 10574908 + }, + { + "id": 790, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 10, + "time": 10583224 + }, + { + "id": 791, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "RE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 14, + "time": 10586615 + }, + { + "id": 792, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "RE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 21, + "time": 10591569 + }, + { + "id": 793, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 35, + "time": 10615338 + }, + { + "id": 794, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "PE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 17, + "time": 10622796 + }, + { + "id": 795, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 32, + "time": 10633827 + }, + { + "id": 796, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 23, + "time": 10679765 + }, + { + "id": 797, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 14, + "time": 10702002 + }, + { + "id": 798, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 33, + "time": 10707226 + }, + { + "id": 799, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 23, + "time": 10786930 + }, + { + "id": 800, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 11, + "teamId": 29, + "time": 10805653 + }, + { + "id": 801, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 14, + "time": 10813103 + }, + { + "id": 802, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 14, + "time": 10825477 + }, + { + "id": 803, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 53, + "time": 10843786 + }, + { + "id": 804, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 43, + "time": 10844721 + }, + { + "id": 805, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 54, + "time": 10869577 + }, + { + "id": 806, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "CE", + "isAddingPenalty": false, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 29, + "time": 10911685 + }, + { + "id": 807, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 54, + "time": 10922247 + }, + { + "id": 808, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 42, + "time": 10922626 + }, + { + "id": 809, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 7, + "time": 10951956 + }, + { + "id": 810, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 7, + "time": 10974042 + }, + { + "id": 811, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 41, + "time": 11004850 + }, + { + "id": 812, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 14, + "time": 11005425 + }, + { + "id": 813, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 54, + "time": 11011100 + }, + { + "id": 814, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 23, + "time": 11025468 + }, + { + "id": 815, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 14, + "time": 11025825 + }, + { + "id": 816, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 8, + "time": 11038787 + }, + { + "id": 817, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 52, + "time": 11046105 + }, + { + "id": 818, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 45, + "time": 11086805 + }, + { + "id": 819, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 50, + "time": 11151281 + }, + { + "id": 820, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 20, + "time": 11160411 + }, + { + "id": 821, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 11, + "time": 11184054 + }, + { + "id": 822, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 17, + "time": 11184908 + }, + { + "id": 823, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 14, + "time": 11185655 + }, + { + "id": 824, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "PE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 11, + "teamId": 26, + "time": 11204050 + }, + { + "id": 825, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 23, + "time": 11223817 + }, + { + "id": 826, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 11, + "teamId": 26, + "time": 11237966 + }, + { + "id": 827, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 43, + "time": 11263099 + }, + { + "id": 828, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 5, + "time": 11291034 + }, + { + "id": 829, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 30, + "time": 11301567 + }, + { + "id": 830, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 11, + "time": 11355790 + }, + { + "id": 831, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 17, + "time": 11364058 + }, + { + "id": 832, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 16, + "time": 11366677 + }, + { + "id": 833, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 5, + "time": 11430541 + }, + { + "id": 834, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 39, + "time": 11431204 + }, + { + "id": 835, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 16, + "time": 11470515 + }, + { + "id": 836, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 38, + "time": 11486600 + }, + { + "id": 837, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 38, + "time": 11513980 + }, + { + "id": 838, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 13, + "time": 11562025 + }, + { + "id": 839, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 36, + "time": 11562274 + }, + { + "id": 840, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 43, + "time": 11594098 + }, + { + "id": 841, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 13, + "time": 11599527 + }, + { + "id": 842, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 13, + "time": 11688631 + }, + { + "id": 843, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 5, + "time": 11693296 + }, + { + "id": 844, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 13, + "time": 11706009 + }, + { + "id": 845, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 36, + "time": 11711947 + }, + { + "id": 846, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 13, + "time": 11719524 + }, + { + "id": 847, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "RE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 30, + "time": 11728766 + }, + { + "id": 848, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 15, + "time": 11729700 + }, + { + "id": 849, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 2, + "time": 11733615 + }, + { + "id": 850, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 3, + "teamId": 33, + "time": 11747971 + }, + { + "id": 851, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 11, + "teamId": 0, + "time": 11756339 + }, + { + "id": 852, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 30, + "time": 11761644 + }, + { + "id": 853, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 7, + "time": 11799914 + }, + { + "id": 854, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 0, + "time": 11800053 + }, + { + "id": 855, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "PE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 24, + "time": 11848197 + }, + { + "id": 856, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 38, + "time": 11901239 + }, + { + "id": 857, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 25, + "time": 11934550 + }, + { + "id": 858, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 5, + "time": 11952916 + }, + { + "id": 859, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "CE", + "isAddingPenalty": false, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 38, + "time": 12038785 + }, + { + "id": 860, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 11, + "teamId": 28, + "time": 12050921 + }, + { + "id": 861, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 13, + "time": 12066105 + }, + { + "id": 862, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 19, + "time": 12078422 + }, + { + "id": 863, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 45, + "time": 12088548 + }, + { + "id": 864, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 13, + "time": 12099355 + }, + { + "id": 865, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 52, + "time": 12149461 + }, + { + "id": 866, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 22, + "time": 12159046 + }, + { + "id": 867, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 33, + "time": 12169819 + }, + { + "id": 868, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 25, + "time": 12194765 + }, + { + "id": 869, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 48, + "time": 12222138 + }, + { + "id": 870, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 13, + "time": 12244650 + }, + { + "id": 871, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 22, + "time": 12244715 + }, + { + "id": 872, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 30, + "time": 12256528 + }, + { + "id": 873, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 45, + "time": 12261377 + }, + { + "id": 874, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 19, + "time": 12278682 + }, + { + "id": 875, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 13, + "time": 12394008 + }, + { + "id": 876, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 11, + "time": 12403468 + }, + { + "id": 877, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 25, + "time": 12450885 + }, + { + "id": 878, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 52, + "time": 12475563 + }, + { + "id": 879, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 18, + "time": 12491209 + }, + { + "id": 880, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 10, + "time": 12500328 + }, + { + "id": 881, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 31, + "time": 12505384 + }, + { + "id": 882, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 11, + "teamId": 49, + "time": 12524325 + }, + { + "id": 883, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 46, + "time": 12525777 + }, + { + "id": 884, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 21, + "time": 12536797 + }, + { + "id": 885, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 7, + "time": 12537484 + }, + { + "id": 886, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 11, + "teamId": 0, + "time": 12565381 + }, + { + "id": 887, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 10, + "time": 12565971 + }, + { + "id": 888, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 18, + "time": 12589229 + }, + { + "id": 889, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 46, + "time": 12618641 + }, + { + "id": 890, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 32, + "time": 12635729 + }, + { + "id": 891, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 25, + "time": 12647160 + }, + { + "id": 892, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 32, + "time": 12715506 + }, + { + "id": 893, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "RE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 42, + "time": 12719193 + }, + { + "id": 894, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 11, + "time": 12748044 + }, + { + "id": 895, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 42, + "time": 12766708 + }, + { + "id": 896, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 11, + "teamId": 34, + "time": 12773481 + }, + { + "id": 897, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 32, + "time": 12779482 + }, + { + "id": 898, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 40, + "time": 12912588 + }, + { + "id": 899, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 31, + "time": 12917352 + }, + { + "id": 900, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 21, + "time": 12968187 + }, + { + "id": 901, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 11, + "time": 12970163 + }, + { + "id": 902, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 24, + "time": 13012735 + }, + { + "id": 903, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 7, + "time": 13020749 + }, + { + "id": 904, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 12, + "teamId": 20, + "time": 13020917 + }, + { + "id": 905, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 12, + "teamId": 20, + "time": 13059780 + }, + { + "id": 906, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 44, + "time": 13067593 + }, + { + "id": 907, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "CE", + "isAddingPenalty": false, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 27, + "time": 13073773 + }, + { + "id": 908, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 9, + "time": 13079331 + }, + { + "id": 909, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 9, + "time": 13093931 + }, + { + "id": 910, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 24, + "time": 13103991 + }, + { + "id": 911, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 7, + "time": 13106884 + }, + { + "id": 912, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 11, + "teamId": 11, + "time": 13107350 + }, + { + "id": 913, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 44, + "time": 13112466 + }, + { + "id": 914, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 52, + "time": 13123488 + }, + { + "id": 915, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "PE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 27, + "time": 13136327 + }, + { + "id": 916, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 14, + "time": 13154746 + }, + { + "id": 917, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 42, + "time": 13178399 + }, + { + "id": 918, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 52, + "time": 13233582 + }, + { + "id": 919, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 10, + "time": 13252898 + }, + { + "id": 920, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 42, + "time": 13269303 + }, + { + "id": 921, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 40, + "time": 13332364 + }, + { + "id": 922, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 14, + "time": 13341949 + }, + { + "id": 923, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 46, + "time": 13384977 + }, + { + "id": 924, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 11, + "teamId": 3, + "time": 13408491 + }, + { + "id": 925, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 42, + "time": 13415688 + }, + { + "id": 926, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 14, + "time": 13430547 + }, + { + "id": 927, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 11, + "teamId": 3, + "time": 13465224 + }, + { + "id": 928, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 21, + "time": 13499651 + }, + { + "id": 929, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 39, + "time": 13501623 + }, + { + "id": 930, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 43, + "time": 13529925 + }, + { + "id": 931, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 39, + "time": 13530941 + }, + { + "id": 932, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 14, + "time": 13576386 + }, + { + "id": 933, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 55, + "time": 13640057 + }, + { + "id": 934, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 10, + "time": 13648474 + }, + { + "id": 935, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 15, + "time": 13667543 + }, + { + "id": 936, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 14, + "time": 13676575 + }, + { + "id": 937, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 28, + "time": 13691540 + }, + { + "id": 938, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 7, + "time": 13696718 + }, + { + "id": 939, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 42, + "time": 13706198 + }, + { + "id": 940, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 7, + "time": 13722746 + }, + { + "id": 941, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 30, + "time": 13725708 + }, + { + "id": 942, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 24, + "time": 13735598 + }, + { + "id": 943, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 7, + "time": 13754799 + }, + { + "id": 944, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 43, + "time": 13775226 + }, + { + "id": 945, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 7, + "time": 13782709 + }, + { + "id": 946, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "PE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 11, + "teamId": 3, + "time": 13787889 + }, + { + "id": 947, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 7, + "time": 13805871 + }, + { + "id": 948, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 11, + "teamId": 3, + "time": 13819023 + }, + { + "id": 949, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 14, + "time": 13856954 + }, + { + "id": 950, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 11, + "teamId": 3, + "time": 13973672 + }, + { + "id": 951, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 17, + "time": 14039213 + }, + { + "id": 952, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 7, + "time": 14052941 + }, + { + "id": 953, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 2, + "time": 14066816 + }, + { + "id": 954, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 9, + "time": 14066958 + }, + { + "id": 955, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 11, + "teamId": 3, + "time": 14152056 + }, + { + "id": 956, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 27, + "time": 14156644 + }, + { + "id": 957, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "RE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 26, + "time": 14163125 + }, + { + "id": 958, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 11, + "teamId": 3, + "time": 14163375 + }, + { + "id": 959, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "PE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 42, + "time": 14176861 + }, + { + "id": 960, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 11, + "teamId": 35, + "time": 14178579 + }, + { + "id": 961, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 42, + "time": 14189310 + }, + { + "id": 962, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 23, + "time": 14195565 + }, + { + "id": 963, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 46, + "time": 14198072 + }, + { + "id": 964, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 26, + "time": 14217047 + }, + { + "id": 965, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 53, + "time": 14231112 + }, + { + "id": 966, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 12, + "teamId": 33, + "time": 14234459 + }, + { + "id": 967, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 14, + "time": 14248272 + }, + { + "id": 968, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 11, + "teamId": 35, + "time": 14259462 + }, + { + "id": 969, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 13, + "time": 14270354 + }, + { + "id": 970, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 32, + "time": 14338191 + }, + { + "id": 971, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 23, + "time": 14340999 + }, + { + "id": 972, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 15, + "time": 14367436 + }, + { + "id": 973, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 43, + "time": 14368013 + }, + { + "id": 974, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 11, + "teamId": 3, + "time": 14390852 + }, + { + "id": 975, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 11, + "teamId": 3, + "time": 14406578 + }, + { + "id": 976, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 0, + "time": 14427218 + }, + { + "id": 977, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 14, + "time": 14431364 + }, + { + "id": 978, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 7, + "time": 14434477 + }, + { + "id": 979, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 23, + "time": 14451491 + }, + { + "id": 980, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 43, + "time": 14452836 + }, + { + "id": 981, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 0, + "time": 14477341 + }, + { + "id": 982, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 0, + "time": 14499328 + }, + { + "id": 983, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 15, + "time": 14531372 + }, + { + "id": 984, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 11, + "teamId": 35, + "time": 14538970 + }, + { + "id": 985, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "RE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 7, + "time": 14623531 + }, + { + "id": 986, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 33, + "time": 14639807 + }, + { + "id": 987, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 32, + "time": 14642936 + }, + { + "id": 988, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 7, + "time": 14651262 + }, + { + "id": 989, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "RE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 47, + "time": 14652717 + }, + { + "id": 990, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 48, + "time": 14682862 + }, + { + "id": 991, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 36, + "time": 14711279 + }, + { + "id": 992, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 14, + "time": 14716148 + }, + { + "id": 993, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 11, + "time": 14716190 + }, + { + "id": 994, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 43, + "time": 14719028 + }, + { + "id": 995, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 13, + "time": 14747626 + }, + { + "id": 996, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 27, + "time": 14765256 + }, + { + "id": 997, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "RE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 49, + "time": 14780916 + }, + { + "id": 998, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 33, + "time": 14802987 + }, + { + "id": 999, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 11, + "teamId": 3, + "time": 14804482 + }, + { + "id": 1000, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 34, + "time": 14817776 + }, + { + "id": 1001, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 27, + "time": 14822826 + }, + { + "id": 1002, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 14, + "time": 14887121 + }, + { + "id": 1003, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 31, + "time": 14903880 + }, + { + "id": 1004, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 7, + "time": 14922418 + }, + { + "id": 1005, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 11, + "time": 14928099 + }, + { + "id": 1006, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 20, + "time": 14937351 + }, + { + "id": 1007, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 7, + "time": 14941192 + }, + { + "id": 1008, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 34, + "time": 14959883 + }, + { + "id": 1009, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "PE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 47, + "time": 14975939 + }, + { + "id": 1010, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 33, + "time": 14985516 + }, + { + "id": 1011, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 7, + "time": 15003078 + }, + { + "id": 1012, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 33, + "time": 15039267 + }, + { + "id": 1013, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 33, + "time": 15046918 + }, + { + "id": 1014, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 7, + "time": 15050043 + }, + { + "id": 1015, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 21, + "time": 15056509 + }, + { + "id": 1016, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 33, + "time": 15086555 + }, + { + "id": 1017, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 12, + "teamId": 20, + "time": 15090604 + }, + { + "id": 1018, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 5, + "time": 15113375 + }, + { + "id": 1019, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 45, + "time": 15149023 + }, + { + "id": 1020, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 21, + "time": 15179857 + }, + { + "id": 1021, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "CE", + "isAddingPenalty": false, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 3, + "teamId": 8, + "time": 15221307 + }, + { + "id": 1022, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 2, + "time": 15232657 + }, + { + "id": 1023, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 29, + "time": 15242153 + }, + { + "id": 1024, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 43, + "time": 15246227 + }, + { + "id": 1025, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "CE", + "isAddingPenalty": false, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 3, + "teamId": 33, + "time": 15255475 + }, + { + "id": 1026, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "RE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 11, + "teamId": 19, + "time": 15260450 + }, + { + "id": 1027, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 3, + "teamId": 33, + "time": 15267700 + }, + { + "id": 1028, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 33, + "time": 15273221 + }, + { + "id": 1029, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 7, + "time": 15282590 + }, + { + "id": 1030, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 7, + "time": 15300905 + }, + { + "id": 1031, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 14, + "time": 15308488 + }, + { + "id": 1032, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 47, + "time": 15313350 + }, + { + "id": 1033, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 2, + "time": 15321229 + }, + { + "id": 1034, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 14, + "time": 15323846 + }, + { + "id": 1035, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 44, + "time": 15348380 + }, + { + "id": 1036, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "PE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 1, + "time": 15354288 + }, + { + "id": 1037, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 46, + "time": 15358772 + }, + { + "id": 1038, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 14, + "time": 15413008 + }, + { + "id": 1039, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 25, + "time": 15466251 + }, + { + "id": 1040, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 47, + "time": 15474293 + }, + { + "id": 1041, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 44, + "time": 15474951 + }, + { + "id": 1042, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 54, + "time": 15475257 + }, + { + "id": 1043, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 34, + "time": 15488257 + }, + { + "id": 1044, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 42, + "time": 15491788 + }, + { + "id": 1045, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 54, + "time": 15499080 + }, + { + "id": 1046, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 1, + "time": 15559910 + }, + { + "id": 1047, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 47, + "time": 15775985 + }, + { + "id": 1048, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 11, + "teamId": 19, + "time": 15784343 + }, + { + "id": 1049, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 27, + "time": 15786940 + }, + { + "id": 1050, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 2, + "time": 15792148 + }, + { + "id": 1051, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 23, + "time": 15801524 + }, + { + "id": 1052, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 43, + "time": 15803088 + }, + { + "id": 1053, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 9, + "time": 15809504 + }, + { + "id": 1054, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 33, + "time": 15814008 + }, + { + "id": 1055, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "RE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 47, + "time": 15835292 + }, + { + "id": 1056, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 33, + "time": 15847498 + }, + { + "id": 1057, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 47, + "time": 15856741 + }, + { + "id": 1058, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 34, + "time": 15860066 + }, + { + "id": 1059, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 7, + "time": 15861824 + }, + { + "id": 1060, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 11, + "teamId": 19, + "time": 15930165 + }, + { + "id": 1061, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 53, + "time": 15957576 + }, + { + "id": 1062, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 3, + "teamId": 13, + "time": 15967753 + }, + { + "id": 1063, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 11, + "teamId": 19, + "time": 15976531 + }, + { + "id": 1064, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 9, + "time": 16030919 + }, + { + "id": 1065, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 47, + "time": 16051856 + }, + { + "id": 1066, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 47, + "time": 16089143 + }, + { + "id": 1067, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 9, + "time": 16130713 + }, + { + "id": 1068, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "CE", + "isAddingPenalty": false, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 18, + "time": 16130968 + }, + { + "id": 1069, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 18, + "time": 16137838 + }, + { + "id": 1070, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 9, + "time": 16161557 + }, + { + "id": 1071, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 9, + "time": 16181595 + }, + { + "id": 1072, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 32, + "time": 16181924 + }, + { + "id": 1073, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "RE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 11, + "teamId": 50, + "time": 16191087 + }, + { + "id": 1074, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 9, + "time": 16205133 + }, + { + "id": 1075, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 11, + "teamId": 50, + "time": 16220773 + }, + { + "id": 1076, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 9, + "time": 16224528 + }, + { + "id": 1077, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 32, + "time": 16242078 + }, + { + "id": 1078, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 9, + "time": 16246774 + }, + { + "id": 1079, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 32, + "time": 16273472 + }, + { + "id": 1080, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 53, + "time": 16285901 + }, + { + "id": 1081, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 35, + "time": 16286362 + }, + { + "id": 1082, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 3, + "time": 16289964 + }, + { + "id": 1083, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 13, + "time": 16292810 + }, + { + "id": 1084, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 26, + "time": 16294807 + }, + { + "id": 1085, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 3, + "teamId": 8, + "time": 16297308 + }, + { + "id": 1086, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 24, + "time": 16320942 + }, + { + "id": 1087, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 31, + "time": 16329907 + }, + { + "id": 1088, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 0, + "time": 16349771 + }, + { + "id": 1089, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 28, + "time": 16352213 + }, + { + "id": 1090, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 22, + "time": 16379604 + }, + { + "id": 1091, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "RE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 32, + "time": 16392873 + }, + { + "id": 1092, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "RE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 18, + "time": 16409354 + }, + { + "id": 1093, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 42, + "time": 16426393 + }, + { + "id": 1094, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 32, + "time": 16469801 + }, + { + "id": 1095, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 36, + "time": 16500094 + }, + { + "id": 1096, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 55, + "time": 16509762 + }, + { + "id": 1097, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 22, + "time": 16512734 + }, + { + "id": 1098, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 44, + "time": 16532843 + }, + { + "id": 1099, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 20, + "time": 16534200 + }, + { + "id": 1100, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 3, + "time": 16536850 + }, + { + "id": 1101, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 32, + "time": 16550791 + }, + { + "id": 1102, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "RE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 18, + "time": 16551887 + }, + { + "id": 1103, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 3, + "time": 16578815 + }, + { + "id": 1104, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 29, + "time": 16592516 + }, + { + "id": 1105, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "RE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 32, + "time": 16594450 + }, + { + "id": 1106, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 46, + "time": 16601997 + }, + { + "id": 1107, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 44, + "time": 16615942 + }, + { + "id": 1108, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 42, + "time": 16634187 + }, + { + "id": 1109, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 34, + "time": 16634992 + }, + { + "id": 1110, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 3, + "time": 16641891 + }, + { + "id": 1111, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 13, + "time": 16652944 + }, + { + "id": 1112, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 20, + "time": 16662160 + }, + { + "id": 1113, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 3, + "time": 16680691 + }, + { + "id": 1114, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 33, + "time": 16694820 + }, + { + "id": 1115, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 12, + "time": 16705006 + }, + { + "id": 1116, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "CE", + "isAddingPenalty": false, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 18, + "time": 16708003 + }, + { + "id": 1117, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 13, + "time": 16718220 + }, + { + "id": 1118, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 3, + "teamId": 8, + "time": 16748164 + }, + { + "id": 1119, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 9, + "time": 16758498 + }, + { + "id": 1120, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "RE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 18, + "time": 16766726 + }, + { + "id": 1121, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 24, + "time": 16774157 + }, + { + "id": 1122, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 12, + "teamId": 20, + "time": 16775994 + }, + { + "id": 1123, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 3, + "teamId": 8, + "time": 16794490 + }, + { + "id": 1124, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 43, + "time": 16806436 + }, + { + "id": 1125, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 28, + "time": 16814495 + }, + { + "id": 1126, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 33, + "time": 16838327 + }, + { + "id": 1127, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 32, + "time": 16839656 + }, + { + "id": 1128, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 49, + "time": 16855524 + }, + { + "id": 1129, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 33, + "time": 16861828 + }, + { + "id": 1130, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 33, + "time": 16880900 + }, + { + "id": 1131, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 10, + "time": 16885333 + }, + { + "id": 1132, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 3, + "teamId": 34, + "time": 16888153 + }, + { + "id": 1133, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 44, + "time": 16888909 + }, + { + "id": 1134, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "RE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 32, + "time": 16891256 + }, + { + "id": 1135, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 9, + "time": 16899166 + }, + { + "id": 1136, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "RE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 18, + "time": 16908683 + }, + { + "id": 1137, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 32, + "time": 16923875 + }, + { + "id": 1138, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 26, + "time": 16946775 + }, + { + "id": 1139, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 36, + "time": 16950665 + }, + { + "id": 1140, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 3, + "teamId": 45, + "time": 16961312 + }, + { + "id": 1141, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 32, + "time": 16989216 + }, + { + "id": 1142, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 3, + "time": 17005989 + }, + { + "id": 1143, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 33, + "time": 17010564 + }, + { + "id": 1144, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 33, + "time": 17013934 + }, + { + "id": 1145, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 3, + "time": 17034114 + }, + { + "id": 1146, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 36, + "time": 17034316 + }, + { + "id": 1147, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 44, + "time": 17054157 + }, + { + "id": 1148, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 29, + "time": 17070201 + }, + { + "id": 1149, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 52, + "time": 17083802 + }, + { + "id": 1150, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "RE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 32, + "time": 17095604 + }, + { + "id": 1151, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "CE", + "isAddingPenalty": false, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 10, + "time": 17117066 + }, + { + "id": 1152, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 12, + "time": 17126403 + }, + { + "id": 1153, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 42, + "time": 17136325 + }, + { + "id": 1154, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 10, + "time": 17143030 + }, + { + "id": 1155, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 44, + "time": 17170311 + }, + { + "id": 1156, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 40, + "time": 17185155 + }, + { + "id": 1157, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 13, + "time": 17186269 + }, + { + "id": 1158, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 20, + "time": 17191013 + }, + { + "id": 1159, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 40, + "time": 17202839 + }, + { + "id": 1160, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 12, + "time": 17227653 + }, + { + "id": 1161, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 33, + "time": 17229948 + }, + { + "id": 1162, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 3, + "teamId": 14, + "time": 17236956 + }, + { + "id": 1163, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 23, + "time": 17245244 + }, + { + "id": 1164, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 3, + "teamId": 14, + "time": 17252133 + }, + { + "id": 1165, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 33, + "time": 17253315 + }, + { + "id": 1166, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 33, + "time": 17256681 + }, + { + "id": 1167, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 33, + "time": 17259954 + }, + { + "id": 1168, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 13, + "time": 17263301 + }, + { + "id": 1169, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 23, + "time": 17269178 + }, + { + "id": 1170, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 0, + "time": 17289806 + }, + { + "id": 1171, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 26, + "time": 17303382 + }, + { + "id": 1172, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 13, + "time": 17318595 + }, + { + "id": 1173, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 3, + "teamId": 14, + "time": 17336970 + }, + { + "id": 1174, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 29, + "time": 17348146 + }, + { + "id": 1175, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 55, + "time": 17370818 + }, + { + "id": 1176, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 43, + "time": 17375297 + }, + { + "id": 1177, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 9, + "time": 17376189 + }, + { + "id": 1178, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 23, + "time": 17386546 + }, + { + "id": 1179, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 9, + "time": 17391355 + }, + { + "id": 1180, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 23, + "time": 17401159 + }, + { + "id": 1181, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 33, + "time": 17402521 + }, + { + "id": 1182, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 32, + "time": 17413133 + }, + { + "id": 1183, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 33, + "time": 17413492 + }, + { + "id": 1184, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 3, + "teamId": 14, + "time": 17417166 + }, + { + "id": 1185, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "CE", + "isAddingPenalty": false, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 44, + "time": 17439065 + }, + { + "id": 1186, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 9, + "time": 17443357 + }, + { + "id": 1187, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 33, + "time": 17451075 + }, + { + "id": 1188, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 29, + "time": 17451534 + }, + { + "id": 1189, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 3, + "teamId": 14, + "time": 17458527 + }, + { + "id": 1190, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 44, + "time": 17471721 + }, + { + "id": 1191, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 3, + "teamId": 14, + "time": 17482653 + }, + { + "id": 1192, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 22, + "time": 17485291 + }, + { + "id": 1193, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 3, + "teamId": 14, + "time": 17501624 + }, + { + "id": 1194, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 9, + "time": 17504391 + }, + { + "id": 1195, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 46, + "time": 17512487 + }, + { + "id": 1196, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 44, + "time": 17513123 + }, + { + "id": 1197, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 33, + "time": 17514753 + }, + { + "id": 1198, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 11, + "teamId": 49, + "time": 17519731 + }, + { + "id": 1199, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 12, + "time": 17532861 + }, + { + "id": 1200, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 23, + "time": 17535977 + }, + { + "id": 1201, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 46, + "time": 17540068 + }, + { + "id": 1202, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 37, + "time": 17553439 + }, + { + "id": 1203, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 46, + "time": 17561069 + }, + { + "id": 1204, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 34, + "time": 17562419 + }, + { + "id": 1205, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 44, + "time": 17564214 + }, + { + "id": 1206, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "RE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 18, + "time": 17578580 + }, + { + "id": 1207, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 44, + "time": 17581246 + }, + { + "id": 1208, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 52, + "time": 17584021 + }, + { + "id": 1209, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 33, + "time": 17595782 + }, + { + "id": 1210, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 44, + "time": 17595818 + }, + { + "id": 1211, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 3, + "teamId": 14, + "time": 17606501 + }, + { + "id": 1212, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 3, + "teamId": 14, + "time": 17616727 + }, + { + "id": 1213, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 46, + "time": 17617275 + }, + { + "id": 1214, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 13, + "time": 17623715 + }, + { + "id": 1215, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 52, + "time": 17626586 + }, + { + "id": 1216, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 44, + "time": 17626910 + }, + { + "id": 1217, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "RE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 33, + "time": 17635914 + }, + { + "id": 1218, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "RE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 33, + "time": 17653185 + }, + { + "id": 1219, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 46, + "time": 17665954 + }, + { + "id": 1220, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "RE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 33, + "time": 17672458 + }, + { + "id": 1221, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 3, + "teamId": 14, + "time": 17672934 + }, + { + "id": 1222, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 46, + "time": 17688835 + }, + { + "id": 1223, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 52, + "time": 17691004 + }, + { + "id": 1224, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 46, + "time": 17713009 + }, + { + "id": 1225, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "RE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 52, + "time": 17716710 + }, + { + "id": 1226, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 41, + "time": 17723549 + }, + { + "id": 1227, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "RE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 44, + "time": 17724706 + }, + { + "id": 1228, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 43, + "time": 17726366 + }, + { + "id": 1229, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 35, + "time": 17730689 + }, + { + "id": 1230, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 27, + "time": 17731321 + }, + { + "id": 1231, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 46, + "time": 17735983 + }, + { + "id": 1232, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 41, + "time": 17742758 + }, + { + "id": 1233, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 46, + "time": 17746644 + }, + { + "id": 1234, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 9, + "time": 17750920 + }, + { + "id": 1235, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 13, + "time": 17753693 + }, + { + "id": 1236, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 41, + "time": 17754358 + }, + { + "id": 1237, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 29, + "time": 17763422 + }, + { + "id": 1238, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 33, + "time": 17766318 + }, + { + "id": 1239, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 36, + "time": 17770410 + }, + { + "id": 1240, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 33, + "time": 17778808 + }, + { + "id": 1241, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 2, + "time": 17787497 + }, + { + "id": 1242, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 22, + "time": 17788336 + }, + { + "id": 1243, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "RE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 52, + "time": 17788941 + }, + { + "id": 1244, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 36, + "time": 17792044 + }, + { + "id": 1245, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 46, + "time": 17802618 + }, + { + "id": 1246, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 1, + "time": 17807762 + }, + { + "id": 1247, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 11, + "teamId": 23, + "time": 17807982 + }, + { + "id": 1248, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 15, + "time": 17819194 + }, + { + "id": 1249, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 27, + "time": 17821276 + }, + { + "id": 1250, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 39, + "time": 17822042 + }, + { + "id": 1251, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 13, + "time": 17825549 + }, + { + "id": 1252, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 9, + "time": 17826924 + }, + { + "id": 1253, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "PE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 40, + "time": 17831788 + }, + { + "id": 1254, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 53, + "time": 17831957 + }, + { + "id": 1255, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 11, + "teamId": 23, + "time": 17832388 + }, + { + "id": 1256, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "PE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 3, + "teamId": 40, + "time": 17834901 + }, + { + "id": 1257, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 44, + "time": 17836686 + }, + { + "id": 1258, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "PE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 40, + "time": 17837634 + }, + { + "id": 1259, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 11, + "teamId": 23, + "time": 17838334 + }, + { + "id": 1260, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 46, + "time": 17838748 + }, + { + "id": 1261, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 11, + "teamId": 7, + "time": 17839633 + }, + { + "id": 1262, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "PE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 12, + "teamId": 40, + "time": 17840118 + }, + { + "id": 1263, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 22, + "time": 17843949 + }, + { + "id": 1264, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 37, + "time": 17847026 + }, + { + "id": 1265, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 15, + "time": 17847906 + }, + { + "id": 1266, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 11, + "teamId": 23, + "time": 17848386 + }, + { + "id": 1267, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 46, + "time": 17849609 + }, + { + "id": 1268, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "PE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 27, + "time": 17849698 + }, + { + "id": 1269, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 2, + "time": 17850546 + }, + { + "id": 1270, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 43, + "time": 17866255 + }, + { + "id": 1271, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "PE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 27, + "time": 17866406 + }, + { + "id": 1272, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 46, + "time": 17868079 + }, + { + "id": 1273, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 3, + "teamId": 14, + "time": 17869085 + }, + { + "id": 1274, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 47, + "time": 17878640 + }, + { + "id": 1275, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 43, + "time": 17890245 + }, + { + "id": 1276, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 46, + "time": 17898604 + }, + { + "id": 1277, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 2, + "time": 17905010 + }, + { + "id": 1278, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 3, + "teamId": 14, + "time": 17906125 + }, + { + "id": 1279, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 9, + "time": 17912611 + }, + { + "id": 1280, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 11, + "teamId": 7, + "time": 17913058 + }, + { + "id": 1281, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 43, + "time": 17914731 + }, + { + "id": 1282, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 15, + "time": 17917404 + }, + { + "id": 1283, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 53, + "time": 17920243 + }, + { + "id": 1284, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 11, + "teamId": 7, + "time": 17928556 + }, + { + "id": 1285, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 22, + "time": 17929247 + }, + { + "id": 1286, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 46, + "time": 17930671 + }, + { + "id": 1287, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 27, + "time": 17938143 + }, + { + "id": 1288, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 15, + "time": 17938790 + }, + { + "id": 1289, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 20, + "time": 17939872 + }, + { + "id": 1290, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 11, + "teamId": 7, + "time": 17940543 + }, + { + "id": 1291, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 12, + "time": 17944340 + }, + { + "id": 1292, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 55, + "time": 17947154 + }, + { + "id": 1293, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 12, + "time": 17952610 + }, + { + "id": 1294, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 20, + "time": 17953101 + }, + { + "id": 1295, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 3, + "teamId": 14, + "time": 17953911 + }, + { + "id": 1296, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 46, + "time": 17954078 + }, + { + "id": 1297, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 2, + "time": 17954817 + }, + { + "id": 1298, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 46, + "time": 17961141 + }, + { + "id": 1299, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 34, + "time": 17962228 + }, + { + "id": 1300, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "RE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 44, + "time": 17964287 + }, + { + "id": 1301, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 13, + "time": 17964486 + }, + { + "id": 1302, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 25, + "time": 17966261 + }, + { + "id": 1303, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 3, + "teamId": 14, + "time": 17966819 + }, + { + "id": 1304, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 43, + "time": 17967715 + }, + { + "id": 1305, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "CE", + "isAddingPenalty": false, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 26, + "time": 17968675 + }, + { + "id": 1306, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 2, + "time": 17969451 + }, + { + "id": 1307, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 27, + "time": 17970710 + }, + { + "id": 1308, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 39, + "time": 17979656 + }, + { + "id": 1309, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 46, + "time": 17980026 + }, + { + "id": 1310, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 36, + "time": 17980736 + }, + { + "id": 1311, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 12, + "time": 17982119 + }, + { + "id": 1312, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "CE", + "isAddingPenalty": false, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 26, + "time": 17982559 + }, + { + "id": 1313, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 53, + "time": 17987265 + }, + { + "id": 1314, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 43, + "time": 17988883 + }, + { + "id": 1315, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 27, + "time": 17989225 + }, + { + "id": 1316, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 2, + "time": 17991482 + }, + { + "id": 1317, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 41, + "time": 17993590 + }, + { + "id": 1318, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "RE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 12, + "time": 17994681 + }, + { + "id": 1319, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "CE", + "isAddingPenalty": false, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 28, + "time": 17995015 + }, + { + "id": 1320, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 46, + "time": 17997159 + } + ], + "analyticsMessages": [ + ] +} \ No newline at end of file diff --git a/src/cds/src/test/kotlin/org/icpclive/cds/clics/CdsLoadersTest.pcmsTest.approved.txt b/src/cds/testData/loaders/goldenData/pcms.txt similarity index 97% rename from src/cds/src/test/kotlin/org/icpclive/cds/clics/CdsLoadersTest.pcmsTest.approved.txt rename to src/cds/testData/loaders/goldenData/pcms.txt index a203d3549..61e85a313 100644 --- a/src/cds/src/test/kotlin/org/icpclive/cds/clics/CdsLoadersTest.pcmsTest.approved.txt +++ b/src/cds/testData/loaders/goldenData/pcms.txt @@ -1,7 +1,7 @@ { "contestInfo": { "name": "ICPC 2022—2023, NERC — Northern Eurasia Finals", - "status": "OVER", + "status": "FINALIZED", "resultType": "ICPC", "startTimeUnixMs": 0, "contestLengthMs": 18000000, @@ -102,7 +102,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 2, @@ -113,7 +116,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 3, @@ -124,7 +130,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 4, @@ -135,7 +144,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 5, @@ -146,7 +158,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 6, @@ -157,7 +172,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 7, @@ -168,7 +186,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 8, @@ -179,7 +200,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 9, @@ -190,7 +214,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 10, @@ -201,7 +228,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 11, @@ -212,7 +242,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 12, @@ -223,7 +256,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 13, @@ -234,7 +270,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 14, @@ -245,7 +284,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 15, @@ -256,7 +298,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 16, @@ -267,7 +312,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 17, @@ -278,7 +326,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 18, @@ -289,7 +340,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 19, @@ -300,7 +354,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 20, @@ -311,7 +368,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 21, @@ -322,7 +382,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 22, @@ -333,7 +396,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 23, @@ -344,7 +410,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 24, @@ -355,7 +424,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 25, @@ -366,7 +438,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 26, @@ -377,7 +452,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 27, @@ -388,7 +466,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 28, @@ -399,7 +480,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 29, @@ -410,7 +494,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 30, @@ -421,7 +508,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 31, @@ -432,7 +522,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 32, @@ -443,7 +536,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 33, @@ -454,7 +550,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 34, @@ -465,7 +564,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 35, @@ -476,7 +578,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 36, @@ -487,7 +592,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 37, @@ -498,7 +606,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 38, @@ -509,7 +620,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 39, @@ -520,7 +634,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 40, @@ -531,7 +648,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 41, @@ -542,7 +662,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 42, @@ -553,7 +676,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 43, @@ -564,7 +690,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 44, @@ -575,7 +704,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 45, @@ -586,7 +718,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 46, @@ -597,7 +732,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 47, @@ -608,7 +746,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 48, @@ -619,7 +760,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 49, @@ -630,7 +774,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 50, @@ -641,7 +788,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 51, @@ -652,7 +802,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 52, @@ -663,7 +816,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 53, @@ -674,7 +830,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 54, @@ -685,7 +844,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 55, @@ -696,7 +858,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 56, @@ -707,7 +872,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 57, @@ -718,7 +886,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 58, @@ -729,7 +900,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 59, @@ -740,7 +914,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 60, @@ -751,7 +928,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 61, @@ -762,7 +942,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 62, @@ -773,7 +956,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 63, @@ -784,7 +970,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 64, @@ -795,7 +984,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 65, @@ -806,7 +998,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 66, @@ -817,7 +1012,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 67, @@ -828,7 +1026,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 68, @@ -839,7 +1040,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 69, @@ -850,7 +1054,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 70, @@ -861,7 +1068,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 71, @@ -872,7 +1082,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 72, @@ -883,7 +1096,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 73, @@ -894,7 +1110,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 74, @@ -905,7 +1124,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 75, @@ -916,7 +1138,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 76, @@ -927,7 +1152,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 77, @@ -938,7 +1166,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 78, @@ -949,7 +1180,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 79, @@ -960,7 +1194,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 80, @@ -971,7 +1208,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 81, @@ -982,7 +1222,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 82, @@ -993,7 +1236,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 83, @@ -1004,7 +1250,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 84, @@ -1015,7 +1264,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 85, @@ -1026,7 +1278,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 86, @@ -1037,7 +1292,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 87, @@ -1048,7 +1306,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 88, @@ -1059,7 +1320,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 89, @@ -1070,7 +1334,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 90, @@ -1081,7 +1348,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 91, @@ -1092,7 +1362,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 92, @@ -1103,7 +1376,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 93, @@ -1114,7 +1390,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 94, @@ -1125,7 +1404,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 95, @@ -1136,7 +1418,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 96, @@ -1147,7 +1432,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 97, @@ -1158,7 +1446,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 98, @@ -1169,7 +1460,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 99, @@ -1180,7 +1474,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 100, @@ -1191,7 +1488,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 101, @@ -1202,7 +1502,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 102, @@ -1213,7 +1516,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 103, @@ -1224,7 +1530,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 104, @@ -1235,7 +1544,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 105, @@ -1246,7 +1558,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 106, @@ -1257,7 +1572,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 107, @@ -1268,7 +1586,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 108, @@ -1279,7 +1600,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 109, @@ -1290,7 +1614,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 110, @@ -1301,7 +1628,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 111, @@ -1312,7 +1642,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 112, @@ -1323,7 +1656,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 113, @@ -1334,7 +1670,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 114, @@ -1345,7 +1684,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 115, @@ -1356,7 +1698,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 116, @@ -1367,7 +1712,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 117, @@ -1378,7 +1726,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 118, @@ -1389,7 +1740,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 119, @@ -1400,7 +1754,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 120, @@ -1411,7 +1768,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 121, @@ -1422,7 +1782,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 122, @@ -1433,7 +1796,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 123, @@ -1444,7 +1810,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 124, @@ -1455,7 +1824,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 125, @@ -1466,7 +1838,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 126, @@ -1477,7 +1852,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 127, @@ -1488,7 +1866,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 128, @@ -1499,7 +1880,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 129, @@ -1510,7 +1894,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 130, @@ -1521,7 +1908,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 131, @@ -1532,7 +1922,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 132, @@ -1543,7 +1936,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 133, @@ -1554,7 +1950,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 134, @@ -1565,7 +1964,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 135, @@ -1576,7 +1978,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 136, @@ -1587,7 +1992,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 137, @@ -1598,7 +2006,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 138, @@ -1609,7 +2020,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 139, @@ -1620,7 +2034,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 140, @@ -1631,7 +2048,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 141, @@ -1642,7 +2062,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 142, @@ -1653,7 +2076,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 143, @@ -1664,7 +2090,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 144, @@ -1675,7 +2104,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 145, @@ -1686,7 +2118,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 146, @@ -1697,7 +2132,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 147, @@ -1708,7 +2146,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 148, @@ -1719,7 +2160,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 149, @@ -1730,7 +2174,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 150, @@ -1741,7 +2188,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 151, @@ -1752,7 +2202,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 152, @@ -1763,7 +2216,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 153, @@ -1774,7 +2230,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 154, @@ -1785,7 +2244,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 155, @@ -1796,7 +2258,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 156, @@ -1807,7 +2272,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 157, @@ -1818,7 +2286,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 158, @@ -1829,7 +2300,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 159, @@ -1840,7 +2314,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 160, @@ -1851,7 +2328,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 161, @@ -1862,7 +2342,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 162, @@ -1873,7 +2356,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 163, @@ -1884,7 +2370,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 164, @@ -1895,7 +2384,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 165, @@ -1906,7 +2398,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 166, @@ -1917,7 +2412,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 167, @@ -1928,7 +2426,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 168, @@ -1939,7 +2440,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 169, @@ -1950,7 +2454,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 170, @@ -1961,7 +2468,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 171, @@ -1972,7 +2482,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 172, @@ -1983,7 +2496,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 173, @@ -1994,7 +2510,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 174, @@ -2005,7 +2524,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 175, @@ -2016,7 +2538,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 176, @@ -2027,7 +2552,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 177, @@ -2038,7 +2566,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 178, @@ -2049,7 +2580,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 179, @@ -2060,7 +2594,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 180, @@ -2071,7 +2608,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 181, @@ -2082,7 +2622,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 182, @@ -2093,7 +2636,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 183, @@ -2104,7 +2650,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 184, @@ -2115,7 +2664,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 185, @@ -2126,7 +2678,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 186, @@ -2137,7 +2692,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 187, @@ -2148,7 +2706,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 188, @@ -2159,7 +2720,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 189, @@ -2170,7 +2734,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 190, @@ -2181,7 +2748,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 191, @@ -2192,7 +2762,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 192, @@ -2203,7 +2776,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 193, @@ -2214,7 +2790,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 194, @@ -2225,7 +2804,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 195, @@ -2236,7 +2818,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 196, @@ -2247,7 +2832,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 197, @@ -2258,7 +2846,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 198, @@ -2269,7 +2860,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 199, @@ -2280,7 +2874,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 200, @@ -2291,7 +2888,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 201, @@ -2302,7 +2902,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 202, @@ -2313,7 +2916,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 203, @@ -2324,7 +2930,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 204, @@ -2335,7 +2944,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 205, @@ -2346,7 +2958,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 206, @@ -2357,7 +2972,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 207, @@ -2368,7 +2986,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 208, @@ -2379,7 +3000,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 209, @@ -2390,7 +3014,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 210, @@ -2401,7 +3028,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 211, @@ -2412,7 +3042,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 212, @@ -2423,7 +3056,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 213, @@ -2434,7 +3070,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 214, @@ -2445,7 +3084,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 215, @@ -2456,7 +3098,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 216, @@ -2467,7 +3112,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 217, @@ -2478,7 +3126,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 218, @@ -2489,7 +3140,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 219, @@ -2500,7 +3154,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 220, @@ -2511,7 +3168,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 221, @@ -2522,7 +3182,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 222, @@ -2533,7 +3196,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 223, @@ -2544,7 +3210,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 224, @@ -2555,7 +3224,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 225, @@ -2566,7 +3238,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 226, @@ -2577,7 +3252,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 227, @@ -2588,7 +3266,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 228, @@ -2599,7 +3280,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 229, @@ -2610,7 +3294,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 230, @@ -2621,7 +3308,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 231, @@ -2632,7 +3322,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 232, @@ -2643,7 +3336,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 233, @@ -2654,7 +3350,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 234, @@ -2665,7 +3364,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 235, @@ -2676,7 +3378,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 236, @@ -2687,7 +3392,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 237, @@ -2698,7 +3406,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 238, @@ -2709,7 +3420,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 239, @@ -2720,7 +3434,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 240, @@ -2731,7 +3448,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 241, @@ -2742,7 +3462,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 242, @@ -2753,7 +3476,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 243, @@ -2764,7 +3490,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 244, @@ -2775,7 +3504,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 245, @@ -2786,7 +3518,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 246, @@ -2797,7 +3532,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 247, @@ -2808,7 +3546,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 248, @@ -2819,7 +3560,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 249, @@ -2830,7 +3574,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 250, @@ -2841,7 +3588,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 251, @@ -2852,7 +3602,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 252, @@ -2863,7 +3616,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 253, @@ -2874,7 +3630,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 254, @@ -2885,7 +3644,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 255, @@ -2896,7 +3658,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 256, @@ -2907,7 +3672,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 257, @@ -2918,7 +3686,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 258, @@ -2929,7 +3700,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 259, @@ -2940,7 +3714,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 260, @@ -2951,7 +3728,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 261, @@ -2962,7 +3742,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 262, @@ -2973,7 +3756,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 263, @@ -2984,7 +3770,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 264, @@ -2995,7 +3784,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 265, @@ -3006,7 +3798,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 266, @@ -3017,7 +3812,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 267, @@ -3028,7 +3826,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 268, @@ -3039,7 +3840,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 269, @@ -3050,7 +3854,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 270, @@ -3061,7 +3868,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 271, @@ -3072,7 +3882,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 272, @@ -3083,7 +3896,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 273, @@ -3094,7 +3910,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 274, @@ -3105,7 +3924,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 275, @@ -3116,7 +3938,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 276, @@ -3127,7 +3952,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 277, @@ -3138,7 +3966,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 278, @@ -3149,7 +3980,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 279, @@ -3160,7 +3994,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 280, @@ -3171,7 +4008,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 281, @@ -3182,11 +4022,17 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null } ], "groups": [ - ] + ], + "organizations": [ + ], + "penaltyRoundingMode": "each_submission_down_to_minute" }, "runs": [ { diff --git a/src/cds/src/test/kotlin/org/icpclive/cds/clics/CdsLoadersTest.pcmsIOITest.approved.txt b/src/cds/testData/loaders/goldenData/pcmsIOI.txt similarity index 99% rename from src/cds/src/test/kotlin/org/icpclive/cds/clics/CdsLoadersTest.pcmsIOITest.approved.txt rename to src/cds/testData/loaders/goldenData/pcmsIOI.txt index 0c1865e12..0f4b645e8 100644 --- a/src/cds/src/test/kotlin/org/icpclive/cds/clics/CdsLoadersTest.pcmsIOITest.approved.txt +++ b/src/cds/testData/loaders/goldenData/pcmsIOI.txt @@ -1,7 +1,7 @@ { "contestInfo": { "name": "XXXV Всероссийская олимпиада школьников по информатике, Второй тур", - "status": "OVER", + "status": "FINALIZED", "resultType": "IOI", "startTimeUnixMs": 0, "contestLengthMs": 18000000, @@ -98,7 +98,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 2, @@ -109,7 +112,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 3, @@ -120,7 +126,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 4, @@ -131,7 +140,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 5, @@ -142,7 +154,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 6, @@ -153,7 +168,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 7, @@ -164,7 +182,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 8, @@ -175,7 +196,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 9, @@ -186,7 +210,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 10, @@ -197,7 +224,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 11, @@ -208,7 +238,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 12, @@ -219,7 +252,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 13, @@ -230,7 +266,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 14, @@ -241,7 +280,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 15, @@ -252,7 +294,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 16, @@ -263,7 +308,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 17, @@ -274,7 +322,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 18, @@ -285,7 +336,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 19, @@ -296,7 +350,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 20, @@ -307,7 +364,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 21, @@ -318,7 +378,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 22, @@ -329,7 +392,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 23, @@ -340,7 +406,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 24, @@ -351,7 +420,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 25, @@ -362,7 +434,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 26, @@ -373,7 +448,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 27, @@ -384,7 +462,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 28, @@ -395,7 +476,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 29, @@ -406,7 +490,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 30, @@ -417,7 +504,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 31, @@ -428,7 +518,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 32, @@ -439,7 +532,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 33, @@ -450,7 +546,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 34, @@ -461,7 +560,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 35, @@ -472,7 +574,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 36, @@ -483,7 +588,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 37, @@ -494,7 +602,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 38, @@ -505,7 +616,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 39, @@ -516,7 +630,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 40, @@ -527,7 +644,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 41, @@ -538,7 +658,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 42, @@ -549,7 +672,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 43, @@ -560,7 +686,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 44, @@ -571,7 +700,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 45, @@ -582,7 +714,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 46, @@ -593,7 +728,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 47, @@ -604,7 +742,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 48, @@ -615,7 +756,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 49, @@ -626,7 +770,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 50, @@ -637,7 +784,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 51, @@ -648,7 +798,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 52, @@ -659,7 +812,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 53, @@ -670,7 +826,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 54, @@ -681,7 +840,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 55, @@ -692,7 +854,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 56, @@ -703,7 +868,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 57, @@ -714,7 +882,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 58, @@ -725,7 +896,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 59, @@ -736,7 +910,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 60, @@ -747,7 +924,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 61, @@ -758,7 +938,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 62, @@ -769,7 +952,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 63, @@ -780,7 +966,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 64, @@ -791,7 +980,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 65, @@ -802,7 +994,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 66, @@ -813,7 +1008,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 67, @@ -824,7 +1022,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 68, @@ -835,7 +1036,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 69, @@ -846,7 +1050,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 70, @@ -857,7 +1064,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 71, @@ -868,7 +1078,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 72, @@ -879,7 +1092,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 73, @@ -890,7 +1106,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 74, @@ -901,7 +1120,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 75, @@ -912,7 +1134,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 76, @@ -923,7 +1148,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 77, @@ -934,7 +1162,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 78, @@ -945,7 +1176,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 79, @@ -956,7 +1190,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 80, @@ -967,7 +1204,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 81, @@ -978,7 +1218,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 82, @@ -989,7 +1232,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 83, @@ -1000,7 +1246,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 84, @@ -1011,7 +1260,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 85, @@ -1022,7 +1274,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 86, @@ -1033,7 +1288,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 87, @@ -1044,7 +1302,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 88, @@ -1055,7 +1316,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 89, @@ -1066,7 +1330,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 90, @@ -1077,7 +1344,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 91, @@ -1088,7 +1358,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 92, @@ -1099,7 +1372,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 93, @@ -1110,7 +1386,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 94, @@ -1121,7 +1400,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 95, @@ -1132,7 +1414,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 96, @@ -1143,7 +1428,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 97, @@ -1154,7 +1442,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 98, @@ -1165,7 +1456,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 99, @@ -1176,7 +1470,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 100, @@ -1187,7 +1484,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 101, @@ -1198,7 +1498,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 102, @@ -1209,7 +1512,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 103, @@ -1220,7 +1526,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 104, @@ -1231,7 +1540,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 105, @@ -1242,7 +1554,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 106, @@ -1253,7 +1568,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 107, @@ -1264,7 +1582,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 108, @@ -1275,7 +1596,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 109, @@ -1286,7 +1610,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 110, @@ -1297,7 +1624,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 111, @@ -1308,7 +1638,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 112, @@ -1319,7 +1652,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 113, @@ -1330,7 +1666,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 114, @@ -1341,7 +1680,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 115, @@ -1352,7 +1694,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 116, @@ -1363,7 +1708,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 117, @@ -1374,7 +1722,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 118, @@ -1385,7 +1736,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 119, @@ -1396,7 +1750,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 120, @@ -1407,7 +1764,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 121, @@ -1418,7 +1778,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 122, @@ -1429,7 +1792,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 123, @@ -1440,7 +1806,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 124, @@ -1451,7 +1820,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 125, @@ -1462,7 +1834,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 126, @@ -1473,7 +1848,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 127, @@ -1484,7 +1862,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 128, @@ -1495,7 +1876,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 129, @@ -1506,7 +1890,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 130, @@ -1517,7 +1904,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 131, @@ -1528,7 +1918,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 132, @@ -1539,7 +1932,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 133, @@ -1550,7 +1946,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 134, @@ -1561,7 +1960,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 135, @@ -1572,7 +1974,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 136, @@ -1583,7 +1988,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 137, @@ -1594,7 +2002,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 138, @@ -1605,7 +2016,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 139, @@ -1616,7 +2030,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 140, @@ -1627,7 +2044,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 141, @@ -1638,7 +2058,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 142, @@ -1649,7 +2072,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 143, @@ -1660,7 +2086,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 144, @@ -1671,7 +2100,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 145, @@ -1682,7 +2114,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 146, @@ -1693,7 +2128,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 147, @@ -1704,7 +2142,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 148, @@ -1715,7 +2156,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 149, @@ -1726,7 +2170,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 150, @@ -1737,7 +2184,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 151, @@ -1748,7 +2198,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 152, @@ -1759,7 +2212,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 153, @@ -1770,7 +2226,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 154, @@ -1781,7 +2240,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 155, @@ -1792,7 +2254,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 156, @@ -1803,7 +2268,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 157, @@ -1814,7 +2282,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 158, @@ -1825,7 +2296,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 159, @@ -1836,7 +2310,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 160, @@ -1847,7 +2324,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 161, @@ -1858,7 +2338,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 162, @@ -1869,7 +2352,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 163, @@ -1880,7 +2366,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 164, @@ -1891,7 +2380,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 165, @@ -1902,7 +2394,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 166, @@ -1913,7 +2408,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 167, @@ -1924,7 +2422,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 168, @@ -1935,7 +2436,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 169, @@ -1946,7 +2450,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 170, @@ -1957,7 +2464,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 171, @@ -1968,7 +2478,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 172, @@ -1979,7 +2492,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 173, @@ -1990,7 +2506,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 174, @@ -2001,7 +2520,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 175, @@ -2012,7 +2534,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 176, @@ -2023,7 +2548,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 177, @@ -2034,7 +2562,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 178, @@ -2045,7 +2576,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 179, @@ -2056,7 +2590,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 180, @@ -2067,7 +2604,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 181, @@ -2078,7 +2618,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 182, @@ -2089,7 +2632,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 183, @@ -2100,7 +2646,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 184, @@ -2111,7 +2660,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 185, @@ -2122,7 +2674,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 186, @@ -2133,7 +2688,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 187, @@ -2144,7 +2702,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 188, @@ -2155,7 +2716,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 189, @@ -2166,7 +2730,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 190, @@ -2177,7 +2744,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 191, @@ -2188,7 +2758,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 192, @@ -2199,7 +2772,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 193, @@ -2210,7 +2786,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 194, @@ -2221,7 +2800,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 195, @@ -2232,7 +2814,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 196, @@ -2243,7 +2828,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 197, @@ -2254,7 +2842,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 198, @@ -2265,7 +2856,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 199, @@ -2276,7 +2870,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 200, @@ -2287,7 +2884,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 201, @@ -2298,7 +2898,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 202, @@ -2309,7 +2912,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 203, @@ -2320,7 +2926,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 204, @@ -2331,7 +2940,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 205, @@ -2342,7 +2954,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 206, @@ -2353,7 +2968,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 207, @@ -2364,7 +2982,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 208, @@ -2375,7 +2996,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 209, @@ -2386,7 +3010,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 210, @@ -2397,7 +3024,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 211, @@ -2408,7 +3038,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 212, @@ -2419,7 +3052,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 213, @@ -2430,7 +3066,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 214, @@ -2441,7 +3080,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 215, @@ -2452,7 +3094,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 216, @@ -2463,7 +3108,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 217, @@ -2474,7 +3122,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 218, @@ -2485,7 +3136,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 219, @@ -2496,7 +3150,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 220, @@ -2507,7 +3164,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 221, @@ -2518,7 +3178,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 222, @@ -2529,7 +3192,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 223, @@ -2540,7 +3206,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 224, @@ -2551,7 +3220,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 225, @@ -2562,7 +3234,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 226, @@ -2573,7 +3248,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 227, @@ -2584,7 +3262,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 228, @@ -2595,7 +3276,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 229, @@ -2606,7 +3290,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 230, @@ -2617,7 +3304,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 231, @@ -2628,7 +3318,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 232, @@ -2639,7 +3332,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 233, @@ -2650,7 +3346,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 234, @@ -2661,7 +3360,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 235, @@ -2672,7 +3374,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 236, @@ -2683,7 +3388,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 237, @@ -2694,7 +3402,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 238, @@ -2705,7 +3416,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 239, @@ -2716,7 +3430,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 240, @@ -2727,7 +3444,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 241, @@ -2738,7 +3458,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 242, @@ -2749,7 +3472,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 243, @@ -2760,7 +3486,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 244, @@ -2771,7 +3500,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 245, @@ -2782,7 +3514,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 246, @@ -2793,7 +3528,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 247, @@ -2804,7 +3542,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 248, @@ -2815,7 +3556,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 249, @@ -2826,7 +3570,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 250, @@ -2837,7 +3584,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 251, @@ -2848,7 +3598,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 252, @@ -2859,7 +3612,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 253, @@ -2870,7 +3626,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 254, @@ -2881,7 +3640,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 255, @@ -2892,7 +3654,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 256, @@ -2903,7 +3668,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 257, @@ -2914,7 +3682,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 258, @@ -2925,7 +3696,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 259, @@ -2936,7 +3710,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 260, @@ -2947,7 +3724,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 261, @@ -2958,7 +3738,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 262, @@ -2969,7 +3752,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 263, @@ -2980,7 +3766,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 264, @@ -2991,7 +3780,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 265, @@ -3002,7 +3794,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 266, @@ -3013,7 +3808,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 267, @@ -3024,7 +3822,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 268, @@ -3035,7 +3836,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 269, @@ -3046,7 +3850,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 270, @@ -3057,7 +3864,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 271, @@ -3068,7 +3878,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 272, @@ -3079,7 +3892,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 273, @@ -3090,7 +3906,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 274, @@ -3101,7 +3920,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 275, @@ -3112,7 +3934,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 276, @@ -3123,7 +3948,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 277, @@ -3134,7 +3962,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 278, @@ -3145,7 +3976,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 279, @@ -3156,7 +3990,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 280, @@ -3167,7 +4004,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 281, @@ -3178,7 +4018,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 282, @@ -3189,7 +4032,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 283, @@ -3200,7 +4046,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 284, @@ -3211,7 +4060,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 285, @@ -3222,7 +4074,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 286, @@ -3233,7 +4088,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 287, @@ -3244,7 +4102,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 288, @@ -3255,7 +4116,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 289, @@ -3266,7 +4130,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 290, @@ -3277,7 +4144,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 291, @@ -3288,7 +4158,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 292, @@ -3299,7 +4172,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 293, @@ -3310,7 +4186,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 294, @@ -3321,7 +4200,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 295, @@ -3332,7 +4214,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 296, @@ -3343,7 +4228,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 297, @@ -3354,7 +4242,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 298, @@ -3365,7 +4256,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 299, @@ -3376,7 +4270,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 300, @@ -3387,7 +4284,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 301, @@ -3398,7 +4298,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 302, @@ -3409,7 +4312,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 303, @@ -3420,7 +4326,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 304, @@ -3431,7 +4340,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 305, @@ -3442,7 +4354,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 306, @@ -3453,7 +4368,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 307, @@ -3464,7 +4382,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 308, @@ -3475,7 +4396,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 309, @@ -3486,7 +4410,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 310, @@ -3497,7 +4424,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 311, @@ -3508,7 +4438,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 312, @@ -3519,7 +4452,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 313, @@ -3530,7 +4466,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 314, @@ -3541,7 +4480,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 315, @@ -3552,7 +4494,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 316, @@ -3563,7 +4508,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 317, @@ -3574,7 +4522,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 318, @@ -3585,7 +4536,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 319, @@ -3596,7 +4550,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 320, @@ -3607,7 +4564,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 321, @@ -3618,7 +4578,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 322, @@ -3629,7 +4592,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 323, @@ -3640,7 +4606,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 324, @@ -3651,7 +4620,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 325, @@ -3662,7 +4634,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 326, @@ -3673,7 +4648,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 327, @@ -3684,7 +4662,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 328, @@ -3695,7 +4676,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 329, @@ -3706,7 +4690,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 330, @@ -3717,7 +4704,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 331, @@ -3728,7 +4718,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 332, @@ -3739,7 +4732,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 333, @@ -3750,7 +4746,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 334, @@ -3761,7 +4760,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 335, @@ -3772,7 +4774,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 336, @@ -3783,7 +4788,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 337, @@ -3794,7 +4802,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 338, @@ -3805,7 +4816,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 339, @@ -3816,7 +4830,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 340, @@ -3827,7 +4844,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 341, @@ -3838,7 +4858,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 342, @@ -3849,7 +4872,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 343, @@ -3860,7 +4886,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 344, @@ -3871,7 +4900,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 345, @@ -3882,7 +4914,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 346, @@ -3893,7 +4928,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 347, @@ -3904,7 +4942,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 348, @@ -3915,7 +4956,10 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null }, { "id": 349, @@ -3926,11 +4970,17 @@ ], "hashTag": null, "medias": { - } + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null } ], "groups": [ - ] + ], + "organizations": [ + ], + "penaltyRoundingMode": "zero" }, "runs": [ { diff --git a/src/cds/testData/loaders/goldenData/testSys.txt b/src/cds/testData/loaders/goldenData/testSys.txt new file mode 100644 index 000000000..e879d5c5e --- /dev/null +++ b/src/cds/testData/loaders/goldenData/testSys.txt @@ -0,0 +1,7635 @@ +{ + "contestInfo": { + "name": "\"LVI St. Petersburg State University Championship, Sunday, December 06, 2020\"", + "status": "FINALIZED", + "resultType": "ICPC", + "startTimeUnixMs": 1607241600000, + "contestLengthMs": 18000000, + "freezeTimeMs": 18000000, + "problems": [ + { + "letter": "A", + "name": "Permutations and Linear Combinations", + "id": 0, + "ordinal": 0, + "contestSystemId": "A" + }, + { + "letter": "B", + "name": "Brick Power", + "id": 1, + "ordinal": 1, + "contestSystemId": "B" + }, + { + "letter": "C", + "name": "Broken Matrix", + "id": 2, + "ordinal": 2, + "contestSystemId": "C" + }, + { + "letter": "D", + "name": "Encoded Messages", + "id": 3, + "ordinal": 3, + "contestSystemId": "D" + }, + { + "letter": "E", + "name": "Dogs and Coins", + "id": 4, + "ordinal": 4, + "contestSystemId": "E" + }, + { + "letter": "F", + "name": "Infection Score", + "id": 5, + "ordinal": 5, + "contestSystemId": "F" + }, + { + "letter": "G", + "name": "King and Roads", + "id": 6, + "ordinal": 6, + "contestSystemId": "G" + }, + { + "letter": "H", + "name": "Classic Literature", + "id": 7, + "ordinal": 7, + "contestSystemId": "H" + }, + { + "letter": "I", + "name": "Multiply without Carry", + "id": 8, + "ordinal": 8, + "contestSystemId": "I" + }, + { + "letter": "J", + "name": "Game with Permutations", + "id": 9, + "ordinal": 9, + "contestSystemId": "J" + }, + { + "letter": "K", + "name": "Schedule", + "id": 10, + "ordinal": 10, + "contestSystemId": "K" + }, + { + "letter": "L", + "name": "T-Shirt Distribution", + "id": 11, + "ordinal": 11, + "contestSystemId": "L" + } + ], + "teams": [ + { + "id": 0, + "name": "Monad.Reader (Садыков, Ибатов, Гаврилов)", + "shortName": "Monad.Reader (Садыков, Ибатов, Гаврилов)", + "contestSystemId": "01", + "groups": [ + ], + "hashTag": null, + "medias": { + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null + }, + { + "id": 1, + "name": "LOUD Enough (Гаевой, Бочков, Макаров)", + "shortName": "LOUD Enough (Гаевой, Бочков, Макаров)", + "contestSystemId": "02", + "groups": [ + ], + "hashTag": null, + "medias": { + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null + }, + { + "id": 2, + "name": "(1к) Stardust Crusaders (Михайлов, Ковалев, Ельцов)", + "shortName": "(1к) Stardust Crusaders (Михайлов, Ковалев, Ельцов)", + "contestSystemId": "03", + "groups": [ + ], + "hashTag": null, + "medias": { + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null + }, + { + "id": 3, + "name": "Cheba Kings (Григорьев, Ефремов, Иванов)", + "shortName": "Cheba Kings (Григорьев, Ефремов, Иванов)", + "contestSystemId": "04", + "groups": [ + ], + "hashTag": null, + "medias": { + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null + }, + { + "id": 4, + "name": "(1к) Square ball (Волочай, Нечаев, Еремеев)", + "shortName": "(1к) Square ball (Волочай, Нечаев, Еремеев)", + "contestSystemId": "05", + "groups": [ + ], + "hashTag": null, + "medias": { + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null + }, + { + "id": 5, + "name": "loozha (Строганов, Куликов, Мандельштам)", + "shortName": "loozha (Строганов, Куликов, Мандельштам)", + "contestSystemId": "06", + "groups": [ + ], + "hashTag": null, + "medias": { + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null + }, + { + "id": 6, + "name": "admarkov team (Марков)", + "shortName": "admarkov team (Марков)", + "contestSystemId": "07", + "groups": [ + ], + "hashTag": null, + "medias": { + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null + }, + { + "id": 7, + "name": "How to turn off computer? (Гребенников, Заварин, Фадеева)", + "shortName": "How to turn off computer? (Гребенников, Заварин, Фадеева)", + "contestSystemId": "08", + "groups": [ + ], + "hashTag": null, + "medias": { + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null + }, + { + "id": 8, + "name": "В компании друзей (Горячев)", + "shortName": "В компании друзей (Горячев)", + "contestSystemId": "09", + "groups": [ + ], + "hashTag": null, + "medias": { + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null + }, + { + "id": 9, + "name": "Botwa Jigurda (Саакян, Мишура, Кравченко)", + "shortName": "Botwa Jigurda (Саакян, Мишура, Кравченко)", + "contestSystemId": "10", + "groups": [ + ], + "hashTag": null, + "medias": { + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null + }, + { + "id": 10, + "name": "(шк) Работать там (Ковригин, Иванов, Цветков)", + "shortName": "(шк) Работать там (Ковригин, Иванов, Цветков)", + "contestSystemId": "11", + "groups": [ + ], + "hashTag": null, + "medias": { + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null + }, + { + "id": 11, + "name": "(1к) фан-клуб ивана короткого (Атмажитова, Рудович, Касьянов)", + "shortName": "(1к) фан-клуб ивана короткого (Атмажитова, Рудович, Касьянов)", + "contestSystemId": "12", + "groups": [ + ], + "hashTag": null, + "medias": { + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null + }, + { + "id": 12, + "name": "(1к) bravit_team (Мартынов, Новожилов, Климов)", + "shortName": "(1к) bravit_team (Мартынов, Новожилов, Климов)", + "contestSystemId": "13", + "groups": [ + ], + "hashTag": null, + "medias": { + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null + }, + { + "id": 13, + "name": "(вк) gerind (Вихляев)", + "shortName": "(вк) gerind (Вихляев)", + "contestSystemId": "14", + "groups": [ + ], + "hashTag": null, + "medias": { + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null + }, + { + "id": 14, + "name": "(вк) Как же хочется Реечьку.. (Быков, Мекумянов)", + "shortName": "(вк) Как же хочется Реечьку.. (Быков, Мекумянов)", + "contestSystemId": "15", + "groups": [ + ], + "hashTag": null, + "medias": { + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null + }, + { + "id": 15, + "name": "(вк) Persik (Цаболов, Чакалов, Маргиев)", + "shortName": "(вк) Persik (Цаболов, Чакалов, Маргиев)", + "contestSystemId": "16", + "groups": [ + ], + "hashTag": null, + "medias": { + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null + }, + { + "id": 16, + "name": "(вк) Антибыкшмут (Гамосов, Тамаев)", + "shortName": "(вк) Антибыкшмут (Гамосов, Тамаев)", + "contestSystemId": "17", + "groups": [ + ], + "hashTag": null, + "medias": { + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null + }, + { + "id": 17, + "name": "(вк) Инферны (Дзуцева, Корчагин, Джибилов)", + "shortName": "(вк) Инферны (Дзуцева, Корчагин, Джибилов)", + "contestSystemId": "18", + "groups": [ + ], + "hashTag": null, + "medias": { + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null + }, + { + "id": 18, + "name": "(вк) ученики Койбаева (Галустьян, Габисов, Кудзаев)", + "shortName": "(вк) ученики Койбаева (Галустьян, Габисов, Кудзаев)", + "contestSystemId": "19", + "groups": [ + ], + "hashTag": null, + "medias": { + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null + }, + { + "id": 19, + "name": "(вк) Заказной Nat & Ural (Сарнацкий, Хугаев, Тебиев)", + "shortName": "(вк) Заказной Nat & Ural (Сарнацкий, Хугаев, Тебиев)", + "contestSystemId": "20", + "groups": [ + ], + "hashTag": null, + "medias": { + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null + } + ], + "groups": [ + ], + "organizations": [ + ], + "penaltyRoundingMode": "sum_down_to_minute" + }, + "runs": [ + { + "id": 0, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 3, + "time": 607000 + }, + { + "id": 1, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 7, + "time": 682000 + }, + { + "id": 2, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 6, + "time": 699000 + }, + { + "id": 3, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 1, + "time": 737000 + }, + { + "id": 4, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "RE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 0, + "time": 774000 + }, + { + "id": 5, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 1, + "time": 788000 + }, + { + "id": 6, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 0, + "time": 809000 + }, + { + "id": 7, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 3, + "time": 872000 + }, + { + "id": 8, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 9, + "time": 902000 + }, + { + "id": 9, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 1, + "time": 938000 + }, + { + "id": 10, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 6, + "time": 967000 + }, + { + "id": 11, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 0, + "time": 986000 + }, + { + "id": 12, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 3, + "time": 1144000 + }, + { + "id": 13, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 8, + "time": 1156000 + }, + { + "id": 14, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 12, + "time": 1161000 + }, + { + "id": 15, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 3, + "time": 1240000 + }, + { + "id": 16, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 14, + "time": 1265000 + }, + { + "id": 17, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 8, + "time": 1294000 + }, + { + "id": 18, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 12, + "time": 1353000 + }, + { + "id": 19, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 13, + "time": 1359000 + }, + { + "id": 20, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 6, + "time": 1387000 + }, + { + "id": 21, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 3, + "time": 1394000 + }, + { + "id": 22, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 4, + "time": 1436000 + }, + { + "id": 23, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 9, + "time": 1465000 + }, + { + "id": 24, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 9, + "time": 1517000 + }, + { + "id": 25, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 13, + "time": 1518000 + }, + { + "id": 26, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 6, + "time": 1522000 + }, + { + "id": 27, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 19, + "time": 1541000 + }, + { + "id": 28, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 11, + "time": 1605000 + }, + { + "id": 29, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 11, + "time": 1613000 + }, + { + "id": 30, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 7, + "time": 1679000 + }, + { + "id": 31, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 6, + "time": 1696000 + }, + { + "id": 32, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 7, + "time": 1707000 + }, + { + "id": 33, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 11, + "time": 1710000 + }, + { + "id": 34, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 11, + "time": 1734000 + }, + { + "id": 35, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 5, + "time": 1823000 + }, + { + "id": 36, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 3, + "time": 1883000 + }, + { + "id": 37, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 6, + "time": 1892000 + }, + { + "id": 38, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 8, + "time": 1922000 + }, + { + "id": 39, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 0, + "time": 1974000 + }, + { + "id": 40, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 4, + "time": 1977000 + }, + { + "id": 41, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 0, + "time": 2022000 + }, + { + "id": 42, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 0, + "time": 2158000 + }, + { + "id": 43, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 3, + "time": 2163000 + }, + { + "id": 44, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 3, + "time": 2217000 + }, + { + "id": 45, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 14, + "time": 2241000 + }, + { + "id": 46, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 7, + "time": 2246000 + }, + { + "id": 47, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 8, + "time": 2307000 + }, + { + "id": 48, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 14, + "time": 2310000 + }, + { + "id": 49, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 11, + "teamId": 1, + "time": 2343000 + }, + { + "id": 50, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 5, + "time": 2368000 + }, + { + "id": 51, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 18, + "time": 2424000 + }, + { + "id": 52, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 4, + "time": 2524000 + }, + { + "id": 53, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 8, + "time": 2548000 + }, + { + "id": 54, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 1, + "time": 2600000 + }, + { + "id": 55, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 14, + "time": 2635000 + }, + { + "id": 56, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 16, + "time": 2636000 + }, + { + "id": 57, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 12, + "time": 2679000 + }, + { + "id": 58, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 2, + "time": 2695000 + }, + { + "id": 59, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 8, + "time": 2706000 + }, + { + "id": 60, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 7, + "time": 2790000 + }, + { + "id": 61, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 6, + "time": 2809000 + }, + { + "id": 62, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 16, + "time": 2816000 + }, + { + "id": 63, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 13, + "time": 2820000 + }, + { + "id": 64, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 7, + "time": 2843000 + }, + { + "id": 65, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 1, + "time": 2861000 + }, + { + "id": 66, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 16, + "time": 2862000 + }, + { + "id": 67, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 6, + "time": 2915000 + }, + { + "id": 68, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 0, + "time": 2977000 + }, + { + "id": 69, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 16, + "time": 3011000 + }, + { + "id": 70, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 18, + "time": 3038000 + }, + { + "id": 71, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 9, + "time": 3131000 + }, + { + "id": 72, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 11, + "time": 3189000 + }, + { + "id": 73, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 13, + "time": 3191000 + }, + { + "id": 74, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 8, + "time": 3215000 + }, + { + "id": 75, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 13, + "time": 3229000 + }, + { + "id": 76, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 8, + "time": 3275000 + }, + { + "id": 77, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 0, + "time": 3332000 + }, + { + "id": 78, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 18, + "time": 3360000 + }, + { + "id": 79, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 4, + "time": 3406000 + }, + { + "id": 80, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 18, + "time": 3407000 + }, + { + "id": 81, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 1, + "time": 3476000 + }, + { + "id": 82, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 5, + "time": 3571000 + }, + { + "id": 83, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 12, + "time": 3606000 + }, + { + "id": 84, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "RE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 17, + "time": 3627000 + }, + { + "id": 85, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 4, + "time": 3851000 + }, + { + "id": 86, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 6, + "time": 3908000 + }, + { + "id": 87, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 1, + "time": 3926000 + }, + { + "id": 88, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "CE", + "isAddingPenalty": false, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 13, + "time": 3932000 + }, + { + "id": 89, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 7, + "time": 3942000 + }, + { + "id": 90, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "CE", + "isAddingPenalty": false, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 13, + "time": 3949000 + }, + { + "id": 91, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 13, + "time": 3977000 + }, + { + "id": 92, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 14, + "time": 4077000 + }, + { + "id": 93, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 0, + "time": 4156000 + }, + { + "id": 94, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 18, + "time": 4182000 + }, + { + "id": 95, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 15, + "time": 4217000 + }, + { + "id": 96, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 2, + "time": 4288000 + }, + { + "id": 97, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 4, + "time": 4366000 + }, + { + "id": 98, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 1, + "time": 4373000 + }, + { + "id": 99, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 9, + "time": 4450000 + }, + { + "id": 100, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 0, + "time": 4452000 + }, + { + "id": 101, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 2, + "time": 4477000 + }, + { + "id": 102, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "RE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 5, + "teamId": 3, + "time": 4635000 + }, + { + "id": 103, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 18, + "time": 4802000 + }, + { + "id": 104, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 5, + "time": 4835000 + }, + { + "id": 105, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 4, + "time": 4867000 + }, + { + "id": 106, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "CE", + "isAddingPenalty": false, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 13, + "time": 4938000 + }, + { + "id": 107, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 4, + "time": 4998000 + }, + { + "id": 108, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 18, + "time": 5003000 + }, + { + "id": 109, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 13, + "time": 5007000 + }, + { + "id": 110, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 14, + "time": 5128000 + }, + { + "id": 111, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 14, + "time": 5137000 + }, + { + "id": 112, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 5, + "time": 5140000 + }, + { + "id": 113, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 2, + "time": 5175000 + }, + { + "id": 114, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 6, + "time": 5179000 + }, + { + "id": 115, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 14, + "time": 5180000 + }, + { + "id": 116, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "CE", + "isAddingPenalty": false, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 17, + "time": 5242000 + }, + { + "id": 117, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 14, + "time": 5299000 + }, + { + "id": 118, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "RE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 17, + "time": 5301000 + }, + { + "id": 119, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 8, + "time": 5314000 + }, + { + "id": 120, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "RE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 5, + "teamId": 3, + "time": 5409000 + }, + { + "id": 121, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 3, + "time": 5515000 + }, + { + "id": 122, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 2, + "time": 5562000 + }, + { + "id": 123, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 11, + "time": 5596000 + }, + { + "id": 124, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "IL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 2, + "time": 5651000 + }, + { + "id": 125, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 16, + "time": 5732000 + }, + { + "id": 126, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "IL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 2, + "time": 5742000 + }, + { + "id": 127, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 9, + "time": 5804000 + }, + { + "id": 128, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 2, + "time": 5851000 + }, + { + "id": 129, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 13, + "time": 5875000 + }, + { + "id": 130, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 18, + "time": 5910000 + }, + { + "id": 131, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 17, + "time": 6084000 + }, + { + "id": 132, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 14, + "time": 6100000 + }, + { + "id": 133, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 11, + "time": 6163000 + }, + { + "id": 134, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 5, + "time": 6177000 + }, + { + "id": 135, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 11, + "time": 6273000 + }, + { + "id": 136, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 17, + "time": 6275000 + }, + { + "id": 137, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 5, + "teamId": 3, + "time": 6324000 + }, + { + "id": 138, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "RE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 14, + "time": 6347000 + }, + { + "id": 139, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 15, + "time": 6462000 + }, + { + "id": 140, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 0, + "teamId": 1, + "time": 6484000 + }, + { + "id": 141, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 3, + "time": 6487000 + }, + { + "id": 142, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 18, + "time": 6495000 + }, + { + "id": 143, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 0, + "teamId": 1, + "time": 6518000 + }, + { + "id": 144, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 14, + "time": 6581000 + }, + { + "id": 145, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 17, + "time": 6587000 + }, + { + "id": 146, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 9, + "time": 6595000 + }, + { + "id": 147, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 5, + "teamId": 0, + "time": 6651000 + }, + { + "id": 148, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 17, + "time": 6750000 + }, + { + "id": 149, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 9, + "time": 6799000 + }, + { + "id": 150, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "CE", + "isAddingPenalty": false, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 5, + "teamId": 0, + "time": 6827000 + }, + { + "id": 151, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 9, + "time": 6958000 + }, + { + "id": 152, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 3, + "time": 6985000 + }, + { + "id": 153, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 5, + "teamId": 0, + "time": 7021000 + }, + { + "id": 154, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 18, + "time": 7051000 + }, + { + "id": 155, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 16, + "time": 7065000 + }, + { + "id": 156, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 8, + "time": 7186000 + }, + { + "id": 157, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 16, + "time": 7204000 + }, + { + "id": 158, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 3, + "time": 7224000 + }, + { + "id": 159, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 5, + "teamId": 0, + "time": 7299000 + }, + { + "id": 160, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 3, + "time": 7338000 + }, + { + "id": 161, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 5, + "teamId": 3, + "time": 7382000 + }, + { + "id": 162, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 5, + "teamId": 0, + "time": 7430000 + }, + { + "id": 163, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 3, + "time": 7433000 + }, + { + "id": 164, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 3, + "time": 7438000 + }, + { + "id": 165, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 18, + "time": 7549000 + }, + { + "id": 166, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 0, + "time": 7604000 + }, + { + "id": 167, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 1, + "time": 7606000 + }, + { + "id": 168, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "PE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 14, + "time": 7646000 + }, + { + "id": 169, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 14, + "time": 7692000 + }, + { + "id": 170, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 18, + "time": 7767000 + }, + { + "id": 171, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 13, + "time": 7793000 + }, + { + "id": 172, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 5, + "teamId": 3, + "time": 7862000 + }, + { + "id": 173, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 0, + "time": 7867000 + }, + { + "id": 174, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 0, + "time": 7963000 + }, + { + "id": 175, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "RE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 6, + "time": 8156000 + }, + { + "id": 176, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 11, + "teamId": 7, + "time": 8176000 + }, + { + "id": 177, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 5, + "teamId": 1, + "time": 8180000 + }, + { + "id": 178, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 6, + "time": 8309000 + }, + { + "id": 179, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 17, + "time": 8314000 + }, + { + "id": 180, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 3, + "time": 8414000 + }, + { + "id": 181, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 4, + "time": 8419000 + }, + { + "id": 182, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 3, + "time": 8457000 + }, + { + "id": 183, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 14, + "time": 8507000 + }, + { + "id": 184, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 16, + "time": 8529000 + }, + { + "id": 185, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 14, + "time": 8579000 + }, + { + "id": 186, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 14, + "time": 8645000 + }, + { + "id": 187, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 1, + "time": 8674000 + }, + { + "id": 188, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 0, + "time": 8711000 + }, + { + "id": 189, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 14, + "time": 8731000 + }, + { + "id": 190, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 0, + "time": 8780000 + }, + { + "id": 191, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 1, + "time": 8786000 + }, + { + "id": 192, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 13, + "time": 8860000 + }, + { + "id": 193, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 13, + "time": 8901000 + }, + { + "id": 194, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 1, + "time": 8930000 + }, + { + "id": 195, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 11, + "teamId": 7, + "time": 8932000 + }, + { + "id": 196, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 5, + "time": 8988000 + }, + { + "id": 197, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 0, + "time": 8990000 + }, + { + "id": 198, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 1, + "time": 9002000 + }, + { + "id": 199, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 11, + "teamId": 7, + "time": 9004000 + }, + { + "id": 200, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 13, + "time": 9021000 + }, + { + "id": 201, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 14, + "time": 9029000 + }, + { + "id": 202, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 11, + "teamId": 3, + "time": 9076000 + }, + { + "id": 203, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 13, + "time": 9169000 + }, + { + "id": 204, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 5, + "time": 9251000 + }, + { + "id": 205, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 18, + "time": 9266000 + }, + { + "id": 206, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 19, + "time": 9445000 + }, + { + "id": 207, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 14, + "time": 9631000 + }, + { + "id": 208, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 11, + "teamId": 7, + "time": 9640000 + }, + { + "id": 209, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 14, + "time": 9726000 + }, + { + "id": 210, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 3, + "time": 9762000 + }, + { + "id": 211, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 14, + "time": 9814000 + }, + { + "id": 212, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 11, + "teamId": 7, + "time": 9848000 + }, + { + "id": 213, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 17, + "time": 9917000 + }, + { + "id": 214, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "PE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 4, + "time": 9988000 + }, + { + "id": 215, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 3, + "time": 10009000 + }, + { + "id": 216, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 11, + "teamId": 7, + "time": 10015000 + }, + { + "id": 217, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 14, + "time": 10048000 + }, + { + "id": 218, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 4, + "time": 10078000 + }, + { + "id": 219, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "PE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 9, + "time": 10102000 + }, + { + "id": 220, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 3, + "time": 10104000 + }, + { + "id": 221, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 5, + "teamId": 1, + "time": 10129000 + }, + { + "id": 222, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 1, + "time": 10257000 + }, + { + "id": 223, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "PE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 3, + "time": 10278000 + }, + { + "id": 224, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 2, + "time": 10334000 + }, + { + "id": 225, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "CE", + "isAddingPenalty": false, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 14, + "time": 10362000 + }, + { + "id": 226, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 5, + "teamId": 14, + "time": 10366000 + }, + { + "id": 227, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 14, + "time": 10381000 + }, + { + "id": 228, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 9, + "time": 10394000 + }, + { + "id": 229, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 19, + "time": 10437000 + }, + { + "id": 230, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 11, + "teamId": 7, + "time": 10475000 + }, + { + "id": 231, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 3, + "time": 10600000 + }, + { + "id": 232, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 14, + "time": 10600000 + }, + { + "id": 233, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 9, + "time": 10673000 + }, + { + "id": 234, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "RE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 4, + "time": 10816000 + }, + { + "id": 235, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 15, + "time": 10846000 + }, + { + "id": 236, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 14, + "time": 10891000 + }, + { + "id": 237, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 3, + "teamId": 8, + "time": 10893000 + }, + { + "id": 238, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 5, + "teamId": 3, + "time": 10901000 + }, + { + "id": 239, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 5, + "teamId": 0, + "time": 10924000 + }, + { + "id": 240, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 2, + "time": 10957000 + }, + { + "id": 241, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 1, + "time": 11023000 + }, + { + "id": 242, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 14, + "time": 11114000 + }, + { + "id": 243, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 14, + "time": 11200000 + }, + { + "id": 244, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 18, + "time": 11232000 + }, + { + "id": 245, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 1, + "time": 11367000 + }, + { + "id": 246, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 1, + "time": 11468000 + }, + { + "id": 247, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 1, + "time": 11487000 + }, + { + "id": 248, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 1, + "time": 11522000 + }, + { + "id": 249, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 19, + "time": 11529000 + }, + { + "id": 250, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "RE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 14, + "time": 11685000 + }, + { + "id": 251, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 14, + "time": 11751000 + }, + { + "id": 252, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 18, + "time": 11771000 + }, + { + "id": 253, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 14, + "time": 11876000 + }, + { + "id": 254, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 1, + "time": 11884000 + }, + { + "id": 255, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 5, + "teamId": 1, + "time": 11909000 + }, + { + "id": 256, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 1, + "time": 11912000 + }, + { + "id": 257, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 4, + "time": 11999000 + }, + { + "id": 258, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 3, + "teamId": 11, + "time": 12015000 + }, + { + "id": 259, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 14, + "time": 12022000 + }, + { + "id": 260, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 0, + "time": 12031000 + }, + { + "id": 261, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 15, + "time": 12055000 + }, + { + "id": 262, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 0, + "time": 12057000 + }, + { + "id": 263, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 14, + "time": 12093000 + }, + { + "id": 264, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "PE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 3, + "teamId": 12, + "time": 12130000 + }, + { + "id": 265, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 18, + "time": 12131000 + }, + { + "id": 266, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 3, + "teamId": 12, + "time": 12215000 + }, + { + "id": 267, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "RE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 3, + "teamId": 3, + "time": 12260000 + }, + { + "id": 268, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 14, + "time": 12265000 + }, + { + "id": 269, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 18, + "time": 12300000 + }, + { + "id": 270, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 8, + "time": 12321000 + }, + { + "id": 271, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 3, + "teamId": 3, + "time": 12392000 + }, + { + "id": 272, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 4, + "time": 12470000 + }, + { + "id": 273, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 4, + "time": 12619000 + }, + { + "id": 274, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 17, + "time": 12623000 + }, + { + "id": 275, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 14, + "time": 12667000 + }, + { + "id": 276, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "CE", + "isAddingPenalty": false, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 6, + "time": 12685000 + }, + { + "id": 277, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 6, + "time": 12731000 + }, + { + "id": 278, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 14, + "time": 12741000 + }, + { + "id": 279, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "PE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 3, + "teamId": 6, + "time": 12936000 + }, + { + "id": 280, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 3, + "teamId": 9, + "time": 12936000 + }, + { + "id": 281, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 8, + "time": 13011000 + }, + { + "id": 282, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 9, + "time": 13149000 + }, + { + "id": 283, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 14, + "time": 13318000 + }, + { + "id": 284, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 8, + "time": 13400000 + }, + { + "id": 285, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 5, + "teamId": 14, + "time": 13510000 + }, + { + "id": 286, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 18, + "time": 13625000 + }, + { + "id": 287, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 14, + "time": 13652000 + }, + { + "id": 288, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 11, + "time": 13684000 + }, + { + "id": 289, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "CE", + "isAddingPenalty": false, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 15, + "time": 13824000 + }, + { + "id": 290, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 15, + "time": 13870000 + }, + { + "id": 291, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 6, + "time": 13889000 + }, + { + "id": 292, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 3, + "teamId": 1, + "time": 14065000 + }, + { + "id": 293, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 5, + "teamId": 14, + "time": 14253000 + }, + { + "id": 294, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 18, + "time": 14270000 + }, + { + "id": 295, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 4, + "time": 14291000 + }, + { + "id": 296, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 1, + "time": 14433000 + }, + { + "id": 297, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 5, + "teamId": 14, + "time": 14446000 + }, + { + "id": 298, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 18, + "time": 14491000 + }, + { + "id": 299, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 1, + "time": 14497000 + }, + { + "id": 300, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 18, + "time": 14534000 + }, + { + "id": 301, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "CE", + "isAddingPenalty": false, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 0, + "teamId": 7, + "time": 14558000 + }, + { + "id": 302, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 1, + "time": 14580000 + }, + { + "id": 303, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 15, + "time": 14582000 + }, + { + "id": 304, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 1, + "time": 14695000 + }, + { + "id": 305, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 6, + "time": 14696000 + }, + { + "id": 306, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 15, + "time": 14794000 + }, + { + "id": 307, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 1, + "time": 14822000 + }, + { + "id": 308, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 8, + "time": 14842000 + }, + { + "id": 309, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "RE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 15, + "time": 14855000 + }, + { + "id": 310, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 18, + "time": 14901000 + }, + { + "id": 311, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "PE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 3, + "teamId": 2, + "time": 14909000 + }, + { + "id": 312, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 17, + "time": 14996000 + }, + { + "id": 313, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "RE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 5, + "teamId": 14, + "time": 15013000 + }, + { + "id": 314, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 5, + "teamId": 14, + "time": 15052000 + }, + { + "id": 315, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 3, + "teamId": 14, + "time": 15059000 + }, + { + "id": 316, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 18, + "time": 15068000 + }, + { + "id": 317, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 1, + "time": 15086000 + }, + { + "id": 318, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "RE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 5, + "teamId": 14, + "time": 15087000 + }, + { + "id": 319, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "CE", + "isAddingPenalty": false, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 6, + "time": 15151000 + }, + { + "id": 320, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 6, + "time": 15211000 + }, + { + "id": 321, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "PE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 1, + "time": 15271000 + }, + { + "id": 322, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "RE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 15, + "time": 15287000 + }, + { + "id": 323, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 9, + "time": 15367000 + }, + { + "id": 324, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "RE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 5, + "teamId": 14, + "time": 15373000 + }, + { + "id": 325, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 1, + "time": 15373000 + }, + { + "id": 326, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 18, + "time": 15388000 + }, + { + "id": 327, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "RE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 5, + "teamId": 14, + "time": 15412000 + }, + { + "id": 328, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 9, + "time": 15428000 + }, + { + "id": 329, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 18, + "time": 15457000 + }, + { + "id": 330, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 1, + "time": 15528000 + }, + { + "id": 331, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "CE", + "isAddingPenalty": false, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 1, + "time": 15566000 + }, + { + "id": 332, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 1, + "time": 15567000 + }, + { + "id": 333, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "CE", + "isAddingPenalty": false, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 1, + "time": 15690000 + }, + { + "id": 334, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 5, + "teamId": 14, + "time": 15714000 + }, + { + "id": 335, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 6, + "time": 15728000 + }, + { + "id": 336, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 1, + "time": 15730000 + }, + { + "id": 337, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 1, + "time": 15735000 + }, + { + "id": 338, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 1, + "time": 15803000 + }, + { + "id": 339, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "CE", + "isAddingPenalty": false, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 15, + "time": 15808000 + }, + { + "id": 340, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 1, + "time": 15809000 + }, + { + "id": 341, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 5, + "teamId": 14, + "time": 15832000 + }, + { + "id": 342, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 1, + "time": 15883000 + }, + { + "id": 343, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "RE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 5, + "teamId": 14, + "time": 15887000 + }, + { + "id": 344, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "CE", + "isAddingPenalty": false, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 15, + "time": 15913000 + }, + { + "id": 345, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "CE", + "isAddingPenalty": false, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 1, + "time": 15917000 + }, + { + "id": 346, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 7, + "time": 15934000 + }, + { + "id": 347, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 1, + "time": 15958000 + }, + { + "id": 348, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 9, + "time": 15964000 + }, + { + "id": 349, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 1, + "time": 15969000 + }, + { + "id": 350, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 5, + "teamId": 14, + "time": 15974000 + }, + { + "id": 351, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 15, + "time": 16004000 + }, + { + "id": 352, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 7, + "time": 16073000 + }, + { + "id": 353, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 11, + "teamId": 14, + "time": 16094000 + }, + { + "id": 354, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 3, + "teamId": 4, + "time": 16110000 + }, + { + "id": 355, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 0, + "teamId": 3, + "time": 16165000 + }, + { + "id": 356, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 1, + "time": 16183000 + }, + { + "id": 357, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 9, + "time": 16365000 + }, + { + "id": 358, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 1, + "time": 16444000 + }, + { + "id": 359, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 1, + "time": 16506000 + }, + { + "id": 360, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 5, + "time": 16519000 + }, + { + "id": 361, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 0, + "time": 16631000 + }, + { + "id": 362, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 6, + "time": 16650000 + }, + { + "id": 363, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 5, + "time": 16671000 + }, + { + "id": 364, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 18, + "time": 16698000 + }, + { + "id": 365, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 6, + "time": 16762000 + }, + { + "id": 366, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 18, + "time": 16778000 + }, + { + "id": 367, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "PE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 8, + "time": 16852000 + }, + { + "id": 368, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 6, + "time": 16893000 + }, + { + "id": 369, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 9, + "time": 16941000 + }, + { + "id": 370, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "PE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 8, + "time": 16955000 + }, + { + "id": 371, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 1, + "time": 16988000 + }, + { + "id": 372, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 9, + "time": 17004000 + }, + { + "id": 373, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "PE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 8, + "time": 17053000 + }, + { + "id": 374, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 11, + "teamId": 12, + "time": 17079000 + }, + { + "id": 375, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 11, + "teamId": 12, + "time": 17131000 + }, + { + "id": 376, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 0, + "time": 17137000 + }, + { + "id": 377, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 2, + "time": 17146000 + }, + { + "id": 378, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "RE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 11, + "teamId": 5, + "time": 17152000 + }, + { + "id": 379, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 4, + "time": 17156000 + }, + { + "id": 380, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 8, + "time": 17174000 + }, + { + "id": 381, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 6, + "time": 17185000 + }, + { + "id": 382, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 9, + "time": 17187000 + }, + { + "id": 383, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 11, + "teamId": 12, + "time": 17219000 + }, + { + "id": 384, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 6, + "time": 17246000 + }, + { + "id": 385, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 0, + "time": 17252000 + }, + { + "id": 386, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 5, + "time": 17273000 + }, + { + "id": 387, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 17, + "time": 17314000 + }, + { + "id": 388, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "RE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 11, + "time": 17393000 + }, + { + "id": 389, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 3, + "teamId": 6, + "time": 17403000 + }, + { + "id": 390, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "CE", + "isAddingPenalty": false, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 1, + "time": 17428000 + }, + { + "id": 391, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 0, + "time": 17439000 + }, + { + "id": 392, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 1, + "time": 17454000 + }, + { + "id": 393, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "RE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 5, + "time": 17495000 + }, + { + "id": 394, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 0, + "time": 17496000 + }, + { + "id": 395, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 3, + "time": 17518000 + }, + { + "id": 396, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "RE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 5, + "time": 17524000 + }, + { + "id": 397, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 1, + "time": 17536000 + }, + { + "id": 398, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "RE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 11, + "time": 17537000 + }, + { + "id": 399, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "RE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 9, + "time": 17568000 + }, + { + "id": 400, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 3, + "time": 17578000 + }, + { + "id": 401, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 3, + "time": 17587000 + }, + { + "id": 402, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 1, + "time": 17609000 + }, + { + "id": 403, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 9, + "time": 17611000 + }, + { + "id": 404, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 1, + "time": 17621000 + }, + { + "id": 405, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 11, + "time": 17637000 + }, + { + "id": 406, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 1, + "time": 17643000 + }, + { + "id": 407, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "CE", + "isAddingPenalty": false, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 2, + "time": 17649000 + }, + { + "id": 408, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 1, + "time": 17661000 + }, + { + "id": 409, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 3, + "time": 17682000 + }, + { + "id": 410, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 9, + "time": 17687000 + }, + { + "id": 411, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 11, + "time": 17698000 + }, + { + "id": 412, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 9, + "time": 17713000 + }, + { + "id": 413, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "RE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 5, + "time": 17713000 + }, + { + "id": 414, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 1, + "time": 17714000 + }, + { + "id": 415, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "CE", + "isAddingPenalty": false, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 0, + "time": 17720000 + }, + { + "id": 416, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "RE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 9, + "time": 17736000 + }, + { + "id": 417, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 9, + "time": 17755000 + }, + { + "id": 418, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 1, + "time": 17763000 + }, + { + "id": 419, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 3, + "teamId": 0, + "time": 17777000 + }, + { + "id": 420, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 0, + "time": 17783000 + }, + { + "id": 421, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 1, + "time": 17784000 + }, + { + "id": 422, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 2, + "time": 17824000 + }, + { + "id": 423, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 1, + "time": 17825000 + }, + { + "id": 424, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 5, + "time": 17827000 + }, + { + "id": 425, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 5, + "time": 17829000 + }, + { + "id": 426, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 9, + "time": 17837000 + }, + { + "id": 427, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 1, + "time": 17841000 + }, + { + "id": 428, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 1, + "time": 17855000 + }, + { + "id": 429, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 3, + "time": 17857000 + }, + { + "id": 430, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 5, + "time": 17859000 + }, + { + "id": 431, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 9, + "time": 17871000 + }, + { + "id": 432, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 2, + "time": 17899000 + }, + { + "id": 433, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 1, + "time": 17903000 + }, + { + "id": 434, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 3, + "time": 17907000 + }, + { + "id": 435, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 1, + "time": 17909000 + }, + { + "id": 436, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 1, + "time": 17918000 + }, + { + "id": 437, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "PE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 6, + "time": 17927000 + }, + { + "id": 438, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "RE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 5, + "time": 17931000 + }, + { + "id": 439, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 6, + "time": 17943000 + }, + { + "id": 440, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 1, + "time": 17948000 + }, + { + "id": 441, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 1, + "time": 17956000 + }, + { + "id": 442, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 1, + "time": 17963000 + }, + { + "id": 443, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 4, + "time": 17967000 + }, + { + "id": 444, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 1, + "time": 17969000 + }, + { + "id": 445, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 1, + "time": 17971000 + }, + { + "id": 446, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 1, + "time": 17974000 + }, + { + "id": 447, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 1, + "time": 17978000 + }, + { + "id": 448, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 5, + "time": 17982000 + }, + { + "id": 449, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 1, + "time": 17984000 + }, + { + "id": 450, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 9, + "time": 17992000 + }, + { + "id": 451, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 1, + "time": 17993000 + }, + { + "id": 452, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 1, + "time": 17993000 + } + ], + "analyticsMessages": [ + ] +} \ No newline at end of file diff --git a/src/cds/testData/loaders/goldenData/testSysWithAdvancedOverride.txt b/src/cds/testData/loaders/goldenData/testSysWithAdvancedOverride.txt new file mode 100644 index 000000000..20a514fd0 --- /dev/null +++ b/src/cds/testData/loaders/goldenData/testSysWithAdvancedOverride.txt @@ -0,0 +1,7722 @@ +{ + "contestInfo": { + "name": "\"LVI St. Petersburg State University Championship, Sunday, December 06, 2020\"", + "status": "FINALIZED", + "resultType": "ICPC", + "startTimeUnixMs": 1607241600000, + "contestLengthMs": 18000000, + "freezeTimeMs": 18000000, + "problems": [ + { + "letter": "A", + "name": "Permutations and Linear Combinations", + "id": 0, + "ordinal": 0, + "contestSystemId": "A" + }, + { + "letter": "B", + "name": "Brick Power", + "id": 1, + "ordinal": 1, + "contestSystemId": "B" + }, + { + "letter": "C", + "name": "Broken Matrix", + "id": 2, + "ordinal": 2, + "contestSystemId": "C" + }, + { + "letter": "D", + "name": "Encoded Messages", + "id": 3, + "ordinal": 3, + "contestSystemId": "D" + }, + { + "letter": "E", + "name": "Dogs and Coins", + "id": 4, + "ordinal": 4, + "contestSystemId": "E" + }, + { + "letter": "F", + "name": "Infection Score", + "id": 5, + "ordinal": 5, + "contestSystemId": "F" + }, + { + "letter": "G", + "name": "King and Roads", + "id": 6, + "ordinal": 6, + "contestSystemId": "G" + }, + { + "letter": "H", + "name": "Classic Literature", + "id": 7, + "ordinal": 7, + "contestSystemId": "H" + }, + { + "letter": "I", + "name": "Multiply without Carry", + "id": 8, + "ordinal": 8, + "contestSystemId": "I" + }, + { + "letter": "J", + "name": "Game with Permutations", + "id": 9, + "ordinal": 9, + "contestSystemId": "J" + }, + { + "letter": "K", + "name": "Schedule", + "id": 10, + "ordinal": 10, + "contestSystemId": "K" + }, + { + "letter": "L", + "name": "T-Shirt Distribution", + "id": 11, + "ordinal": 11, + "contestSystemId": "L" + } + ], + "teams": [ + { + "id": 0, + "name": "Monad.Reader (Садыков, Ибатов, Гаврилов)", + "shortName": "Monad.Reader", + "contestSystemId": "01", + "groups": [ + ], + "hashTag": null, + "medias": { + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null, + "customFields": { + "funnyName": "Monad.Reader" + } + }, + { + "id": 1, + "name": "LOUD Enough (Гаевой, Бочков, Макаров)", + "shortName": "LOUD Enough", + "contestSystemId": "02", + "groups": [ + ], + "hashTag": null, + "medias": { + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null, + "customFields": { + "funnyName": "LOUD Enough" + } + }, + { + "id": 2, + "name": "(1к) Stardust Crusaders (Михайлов, Ковалев, Ельцов)", + "shortName": "Stardust Crusaders", + "contestSystemId": "03", + "groups": [ + "firstGrade" + ], + "hashTag": null, + "medias": { + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null, + "customFields": { + "funnyName": "Stardust Crusaders" + } + }, + { + "id": 3, + "name": "Cheba Kings (Григорьев, Ефремов, Иванов)", + "shortName": "Cheba Kings", + "contestSystemId": "04", + "groups": [ + ], + "hashTag": null, + "medias": { + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null, + "customFields": { + "funnyName": "Cheba Kings" + } + }, + { + "id": 4, + "name": "(1к) Square ball (Волочай, Нечаев, Еремеев)", + "shortName": "Square ball", + "contestSystemId": "05", + "groups": [ + "firstGrade" + ], + "hashTag": null, + "medias": { + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null, + "customFields": { + "funnyName": "Square ball" + } + }, + { + "id": 5, + "name": "loozha (Строганов, Куликов, Мандельштам)", + "shortName": "loozha", + "contestSystemId": "06", + "groups": [ + ], + "hashTag": null, + "medias": { + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null, + "customFields": { + "funnyName": "loozha" + } + }, + { + "id": 6, + "name": "admarkov team (Марков)", + "shortName": "admarkov team", + "contestSystemId": "07", + "groups": [ + ], + "hashTag": null, + "medias": { + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null, + "customFields": { + "funnyName": "admarkov team" + } + }, + { + "id": 7, + "name": "How to turn off computer? (Гребенников, Заварин, Фадеева)", + "shortName": "How to turn off computer?", + "contestSystemId": "08", + "groups": [ + ], + "hashTag": null, + "medias": { + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null, + "customFields": { + "funnyName": "How to turn off computer?" + } + }, + { + "id": 8, + "name": "В компании друзей (Горячев)", + "shortName": "В компании друзей", + "contestSystemId": "09", + "groups": [ + ], + "hashTag": null, + "medias": { + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null, + "customFields": { + "funnyName": "В компании друзей" + } + }, + { + "id": 9, + "name": "Botwa Jigurda (Саакян, Мишура, Кравченко)", + "shortName": "Botwa Jigurda", + "contestSystemId": "10", + "groups": [ + ], + "hashTag": null, + "medias": { + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null, + "customFields": { + "funnyName": "Botwa Jigurda" + } + }, + { + "id": 10, + "name": "(шк) Работать там (Ковригин, Иванов, Цветков)", + "shortName": "Работать там", + "contestSystemId": "11", + "groups": [ + "school" + ], + "hashTag": null, + "medias": { + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null, + "customFields": { + "funnyName": "Работать там" + } + }, + { + "id": 11, + "name": "(1к) фан-клуб ивана короткого (Атмажитова, Рудович, Касьянов)", + "shortName": "фан-клуб ивана короткого", + "contestSystemId": "12", + "groups": [ + "firstGrade" + ], + "hashTag": null, + "medias": { + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null, + "customFields": { + "funnyName": "фан-клуб ивана короткого" + } + }, + { + "id": 12, + "name": "(1к) bravit_team (Мартынов, Новожилов, Климов)", + "shortName": "bravit_team", + "contestSystemId": "13", + "groups": [ + "firstGrade" + ], + "hashTag": null, + "medias": { + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null, + "customFields": { + "funnyName": "bravit_team" + } + }, + { + "id": 13, + "name": "(вк) gerind (Вихляев)", + "shortName": "gerind", + "contestSystemId": "14", + "groups": [ + "outOfContest" + ], + "hashTag": null, + "medias": { + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null, + "customFields": { + "funnyName": "gerind" + } + }, + { + "id": 14, + "name": "(вк) Как же хочется Реечьку.. (Быков, Мекумянов)", + "shortName": "Как же хочется Реечьку..", + "contestSystemId": "15", + "groups": [ + "outOfContest" + ], + "hashTag": null, + "medias": { + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null, + "customFields": { + "funnyName": "Как же хочется Реечьку.." + } + }, + { + "id": 15, + "name": "(вк) Persik (Цаболов, Чакалов, Маргиев)", + "shortName": "Persik", + "contestSystemId": "16", + "groups": [ + "outOfContest" + ], + "hashTag": null, + "medias": { + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null, + "customFields": { + "funnyName": "Persik" + } + }, + { + "id": 16, + "name": "(вк) Антибыкшмут (Гамосов, Тамаев)", + "shortName": "Антибыкшмут", + "contestSystemId": "17", + "groups": [ + "outOfContest" + ], + "hashTag": null, + "medias": { + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null, + "customFields": { + "funnyName": "Антибыкшмут" + } + }, + { + "id": 17, + "name": "(вк) Инферны (Дзуцева, Корчагин, Джибилов)", + "shortName": "Инферны", + "contestSystemId": "18", + "groups": [ + "outOfContest" + ], + "hashTag": null, + "medias": { + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null, + "customFields": { + "funnyName": "Инферны" + } + }, + { + "id": 18, + "name": "(вк) ученики Койбаева (Галустьян, Габисов, Кудзаев)", + "shortName": "ученики Койбаева", + "contestSystemId": "19", + "groups": [ + "outOfContest" + ], + "hashTag": null, + "medias": { + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null, + "customFields": { + "funnyName": "ученики Койбаева" + } + }, + { + "id": 19, + "name": "(вк) Заказной Nat & Ural (Сарнацкий, Хугаев, Тебиев)", + "shortName": "Заказной Nat & Ural", + "contestSystemId": "20", + "groups": [ + "outOfContest" + ], + "hashTag": null, + "medias": { + }, + "isHidden": false, + "isOutOfContest": false, + "organizationId": null, + "customFields": { + "funnyName": "Заказной Nat & Ural" + } + } + ], + "groups": [ + { + "name": "firstGrade", + "isHidden": false, + "isOutOfContest": false + }, + { + "name": "school", + "isHidden": false, + "isOutOfContest": false + }, + { + "name": "outOfContest", + "isHidden": false, + "isOutOfContest": true + } + ], + "organizations": [ + ], + "penaltyRoundingMode": "sum_down_to_minute" + }, + "runs": [ + { + "id": 0, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 3, + "time": 607000 + }, + { + "id": 1, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 7, + "time": 682000 + }, + { + "id": 2, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 6, + "time": 699000 + }, + { + "id": 3, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 1, + "time": 737000 + }, + { + "id": 4, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "RE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 0, + "time": 774000 + }, + { + "id": 5, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 1, + "time": 788000 + }, + { + "id": 6, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 0, + "time": 809000 + }, + { + "id": 7, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 3, + "time": 872000 + }, + { + "id": 8, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 9, + "time": 902000 + }, + { + "id": 9, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 1, + "time": 938000 + }, + { + "id": 10, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 6, + "time": 967000 + }, + { + "id": 11, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 0, + "time": 986000 + }, + { + "id": 12, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 3, + "time": 1144000 + }, + { + "id": 13, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 8, + "time": 1156000 + }, + { + "id": 14, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 12, + "time": 1161000 + }, + { + "id": 15, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 3, + "time": 1240000 + }, + { + "id": 16, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 14, + "time": 1265000 + }, + { + "id": 17, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 8, + "time": 1294000 + }, + { + "id": 18, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 12, + "time": 1353000 + }, + { + "id": 19, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 13, + "time": 1359000 + }, + { + "id": 20, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 6, + "time": 1387000 + }, + { + "id": 21, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 3, + "time": 1394000 + }, + { + "id": 22, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 4, + "time": 1436000 + }, + { + "id": 23, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 9, + "time": 1465000 + }, + { + "id": 24, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 9, + "time": 1517000 + }, + { + "id": 25, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 13, + "time": 1518000 + }, + { + "id": 26, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 6, + "time": 1522000 + }, + { + "id": 27, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 19, + "time": 1541000 + }, + { + "id": 28, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 11, + "time": 1605000 + }, + { + "id": 29, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 11, + "time": 1613000 + }, + { + "id": 30, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 7, + "time": 1679000 + }, + { + "id": 31, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 6, + "time": 1696000 + }, + { + "id": 32, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 7, + "time": 1707000 + }, + { + "id": 33, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 11, + "time": 1710000 + }, + { + "id": 34, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 11, + "time": 1734000 + }, + { + "id": 35, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 5, + "time": 1823000 + }, + { + "id": 36, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 3, + "time": 1883000 + }, + { + "id": 37, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 6, + "time": 1892000 + }, + { + "id": 38, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 8, + "time": 1922000 + }, + { + "id": 39, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 0, + "time": 1974000 + }, + { + "id": 40, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 4, + "time": 1977000 + }, + { + "id": 41, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 0, + "time": 2022000 + }, + { + "id": 42, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 0, + "time": 2158000 + }, + { + "id": 43, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 3, + "time": 2163000 + }, + { + "id": 44, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 3, + "time": 2217000 + }, + { + "id": 45, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 14, + "time": 2241000 + }, + { + "id": 46, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 7, + "time": 2246000 + }, + { + "id": 47, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 8, + "time": 2307000 + }, + { + "id": 48, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 14, + "time": 2310000 + }, + { + "id": 49, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 11, + "teamId": 1, + "time": 2343000 + }, + { + "id": 50, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 5, + "time": 2368000 + }, + { + "id": 51, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 18, + "time": 2424000 + }, + { + "id": 52, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 4, + "time": 2524000 + }, + { + "id": 53, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 8, + "time": 2548000 + }, + { + "id": 54, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 1, + "time": 2600000 + }, + { + "id": 55, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 14, + "time": 2635000 + }, + { + "id": 56, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 16, + "time": 2636000 + }, + { + "id": 57, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 12, + "time": 2679000 + }, + { + "id": 58, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 2, + "time": 2695000 + }, + { + "id": 59, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 8, + "time": 2706000 + }, + { + "id": 60, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 7, + "time": 2790000 + }, + { + "id": 61, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 6, + "time": 2809000 + }, + { + "id": 62, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 16, + "time": 2816000 + }, + { + "id": 63, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 13, + "time": 2820000 + }, + { + "id": 64, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 7, + "time": 2843000 + }, + { + "id": 65, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 1, + "time": 2861000 + }, + { + "id": 66, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 16, + "time": 2862000 + }, + { + "id": 67, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 6, + "time": 2915000 + }, + { + "id": 68, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 0, + "time": 2977000 + }, + { + "id": 69, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 16, + "time": 3011000 + }, + { + "id": 70, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 18, + "time": 3038000 + }, + { + "id": 71, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 9, + "time": 3131000 + }, + { + "id": 72, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 11, + "time": 3189000 + }, + { + "id": 73, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 13, + "time": 3191000 + }, + { + "id": 74, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 8, + "time": 3215000 + }, + { + "id": 75, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 13, + "time": 3229000 + }, + { + "id": 76, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 8, + "time": 3275000 + }, + { + "id": 77, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 0, + "time": 3332000 + }, + { + "id": 78, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 18, + "time": 3360000 + }, + { + "id": 79, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 4, + "time": 3406000 + }, + { + "id": 80, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 18, + "time": 3407000 + }, + { + "id": 81, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 1, + "time": 3476000 + }, + { + "id": 82, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 5, + "time": 3571000 + }, + { + "id": 83, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 12, + "time": 3606000 + }, + { + "id": 84, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "RE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 17, + "time": 3627000 + }, + { + "id": 85, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 4, + "time": 3851000 + }, + { + "id": 86, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 6, + "time": 3908000 + }, + { + "id": 87, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 1, + "time": 3926000 + }, + { + "id": 88, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "CE", + "isAddingPenalty": false, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 13, + "time": 3932000 + }, + { + "id": 89, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 7, + "time": 3942000 + }, + { + "id": 90, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "CE", + "isAddingPenalty": false, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 13, + "time": 3949000 + }, + { + "id": 91, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 13, + "time": 3977000 + }, + { + "id": 92, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 14, + "time": 4077000 + }, + { + "id": 93, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 0, + "time": 4156000 + }, + { + "id": 94, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 18, + "time": 4182000 + }, + { + "id": 95, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 15, + "time": 4217000 + }, + { + "id": 96, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 2, + "time": 4288000 + }, + { + "id": 97, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 4, + "time": 4366000 + }, + { + "id": 98, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 1, + "time": 4373000 + }, + { + "id": 99, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 9, + "time": 4450000 + }, + { + "id": 100, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 0, + "time": 4452000 + }, + { + "id": 101, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 2, + "time": 4477000 + }, + { + "id": 102, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "RE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 5, + "teamId": 3, + "time": 4635000 + }, + { + "id": 103, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 18, + "time": 4802000 + }, + { + "id": 104, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 5, + "time": 4835000 + }, + { + "id": 105, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 4, + "time": 4867000 + }, + { + "id": 106, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "CE", + "isAddingPenalty": false, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 13, + "time": 4938000 + }, + { + "id": 107, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 4, + "time": 4998000 + }, + { + "id": 108, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 18, + "time": 5003000 + }, + { + "id": 109, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 13, + "time": 5007000 + }, + { + "id": 110, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 14, + "time": 5128000 + }, + { + "id": 111, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 14, + "time": 5137000 + }, + { + "id": 112, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 5, + "time": 5140000 + }, + { + "id": 113, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 2, + "time": 5175000 + }, + { + "id": 114, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 6, + "time": 5179000 + }, + { + "id": 115, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 14, + "time": 5180000 + }, + { + "id": 116, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "CE", + "isAddingPenalty": false, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 17, + "time": 5242000 + }, + { + "id": 117, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 14, + "time": 5299000 + }, + { + "id": 118, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "RE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 17, + "time": 5301000 + }, + { + "id": 119, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 8, + "time": 5314000 + }, + { + "id": 120, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "RE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 5, + "teamId": 3, + "time": 5409000 + }, + { + "id": 121, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 3, + "time": 5515000 + }, + { + "id": 122, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 2, + "time": 5562000 + }, + { + "id": 123, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 11, + "time": 5596000 + }, + { + "id": 124, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "IL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 2, + "time": 5651000 + }, + { + "id": 125, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 16, + "time": 5732000 + }, + { + "id": 126, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "IL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 2, + "time": 5742000 + }, + { + "id": 127, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 9, + "time": 5804000 + }, + { + "id": 128, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 2, + "time": 5851000 + }, + { + "id": 129, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 13, + "time": 5875000 + }, + { + "id": 130, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 18, + "time": 5910000 + }, + { + "id": 131, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 17, + "time": 6084000 + }, + { + "id": 132, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 14, + "time": 6100000 + }, + { + "id": 133, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 11, + "time": 6163000 + }, + { + "id": 134, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 5, + "time": 6177000 + }, + { + "id": 135, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 11, + "time": 6273000 + }, + { + "id": 136, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 17, + "time": 6275000 + }, + { + "id": 137, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 5, + "teamId": 3, + "time": 6324000 + }, + { + "id": 138, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "RE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 14, + "time": 6347000 + }, + { + "id": 139, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 15, + "time": 6462000 + }, + { + "id": 140, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 0, + "teamId": 1, + "time": 6484000 + }, + { + "id": 141, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 3, + "time": 6487000 + }, + { + "id": 142, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 18, + "time": 6495000 + }, + { + "id": 143, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 0, + "teamId": 1, + "time": 6518000 + }, + { + "id": 144, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 14, + "time": 6581000 + }, + { + "id": 145, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 17, + "time": 6587000 + }, + { + "id": 146, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 9, + "time": 6595000 + }, + { + "id": 147, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 5, + "teamId": 0, + "time": 6651000 + }, + { + "id": 148, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 17, + "time": 6750000 + }, + { + "id": 149, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 9, + "time": 6799000 + }, + { + "id": 150, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "CE", + "isAddingPenalty": false, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 5, + "teamId": 0, + "time": 6827000 + }, + { + "id": 151, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 9, + "time": 6958000 + }, + { + "id": 152, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 3, + "time": 6985000 + }, + { + "id": 153, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 5, + "teamId": 0, + "time": 7021000 + }, + { + "id": 154, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 18, + "time": 7051000 + }, + { + "id": 155, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 16, + "time": 7065000 + }, + { + "id": 156, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 9, + "teamId": 8, + "time": 7186000 + }, + { + "id": 157, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 16, + "time": 7204000 + }, + { + "id": 158, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 3, + "time": 7224000 + }, + { + "id": 159, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 5, + "teamId": 0, + "time": 7299000 + }, + { + "id": 160, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 3, + "time": 7338000 + }, + { + "id": 161, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 5, + "teamId": 3, + "time": 7382000 + }, + { + "id": 162, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 5, + "teamId": 0, + "time": 7430000 + }, + { + "id": 163, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 3, + "time": 7433000 + }, + { + "id": 164, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 3, + "time": 7438000 + }, + { + "id": 165, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 18, + "time": 7549000 + }, + { + "id": 166, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 0, + "time": 7604000 + }, + { + "id": 167, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 1, + "time": 7606000 + }, + { + "id": 168, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "PE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 14, + "time": 7646000 + }, + { + "id": 169, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 14, + "time": 7692000 + }, + { + "id": 170, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 18, + "time": 7767000 + }, + { + "id": 171, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 13, + "time": 7793000 + }, + { + "id": 172, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 5, + "teamId": 3, + "time": 7862000 + }, + { + "id": 173, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 0, + "time": 7867000 + }, + { + "id": 174, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 0, + "time": 7963000 + }, + { + "id": 175, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "RE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 6, + "time": 8156000 + }, + { + "id": 176, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 11, + "teamId": 7, + "time": 8176000 + }, + { + "id": 177, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 5, + "teamId": 1, + "time": 8180000 + }, + { + "id": 178, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 6, + "time": 8309000 + }, + { + "id": 179, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 17, + "time": 8314000 + }, + { + "id": 180, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 3, + "time": 8414000 + }, + { + "id": 181, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 4, + "time": 8419000 + }, + { + "id": 182, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 3, + "time": 8457000 + }, + { + "id": 183, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 14, + "time": 8507000 + }, + { + "id": 184, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 16, + "time": 8529000 + }, + { + "id": 185, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 14, + "time": 8579000 + }, + { + "id": 186, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 14, + "time": 8645000 + }, + { + "id": 187, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 1, + "time": 8674000 + }, + { + "id": 188, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 0, + "time": 8711000 + }, + { + "id": 189, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 14, + "time": 8731000 + }, + { + "id": 190, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 0, + "time": 8780000 + }, + { + "id": 191, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 1, + "time": 8786000 + }, + { + "id": 192, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 13, + "time": 8860000 + }, + { + "id": 193, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 13, + "time": 8901000 + }, + { + "id": 194, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 1, + "time": 8930000 + }, + { + "id": 195, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 11, + "teamId": 7, + "time": 8932000 + }, + { + "id": 196, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 5, + "time": 8988000 + }, + { + "id": 197, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 0, + "time": 8990000 + }, + { + "id": 198, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 1, + "time": 9002000 + }, + { + "id": 199, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 11, + "teamId": 7, + "time": 9004000 + }, + { + "id": 200, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 13, + "time": 9021000 + }, + { + "id": 201, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 14, + "time": 9029000 + }, + { + "id": 202, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 11, + "teamId": 3, + "time": 9076000 + }, + { + "id": 203, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 13, + "time": 9169000 + }, + { + "id": 204, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 5, + "time": 9251000 + }, + { + "id": 205, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 18, + "time": 9266000 + }, + { + "id": 206, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 19, + "time": 9445000 + }, + { + "id": 207, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 14, + "time": 9631000 + }, + { + "id": 208, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 11, + "teamId": 7, + "time": 9640000 + }, + { + "id": 209, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 14, + "time": 9726000 + }, + { + "id": 210, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 3, + "time": 9762000 + }, + { + "id": 211, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 14, + "time": 9814000 + }, + { + "id": 212, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 11, + "teamId": 7, + "time": 9848000 + }, + { + "id": 213, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 17, + "time": 9917000 + }, + { + "id": 214, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "PE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 4, + "time": 9988000 + }, + { + "id": 215, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 3, + "time": 10009000 + }, + { + "id": 216, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 11, + "teamId": 7, + "time": 10015000 + }, + { + "id": 217, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 14, + "time": 10048000 + }, + { + "id": 218, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 4, + "time": 10078000 + }, + { + "id": 219, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "PE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 9, + "time": 10102000 + }, + { + "id": 220, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 3, + "time": 10104000 + }, + { + "id": 221, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 5, + "teamId": 1, + "time": 10129000 + }, + { + "id": 222, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 1, + "time": 10257000 + }, + { + "id": 223, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "PE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 3, + "time": 10278000 + }, + { + "id": 224, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 2, + "time": 10334000 + }, + { + "id": 225, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "CE", + "isAddingPenalty": false, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 14, + "time": 10362000 + }, + { + "id": 226, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 5, + "teamId": 14, + "time": 10366000 + }, + { + "id": 227, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 14, + "time": 10381000 + }, + { + "id": 228, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 9, + "time": 10394000 + }, + { + "id": 229, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 19, + "time": 10437000 + }, + { + "id": 230, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 11, + "teamId": 7, + "time": 10475000 + }, + { + "id": 231, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 3, + "time": 10600000 + }, + { + "id": 232, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 14, + "time": 10600000 + }, + { + "id": 233, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 9, + "time": 10673000 + }, + { + "id": 234, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "RE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 4, + "time": 10816000 + }, + { + "id": 235, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 15, + "time": 10846000 + }, + { + "id": 236, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 14, + "time": 10891000 + }, + { + "id": 237, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 3, + "teamId": 8, + "time": 10893000 + }, + { + "id": 238, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 5, + "teamId": 3, + "time": 10901000 + }, + { + "id": 239, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 5, + "teamId": 0, + "time": 10924000 + }, + { + "id": 240, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 2, + "time": 10957000 + }, + { + "id": 241, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 1, + "time": 11023000 + }, + { + "id": 242, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 14, + "time": 11114000 + }, + { + "id": 243, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 14, + "time": 11200000 + }, + { + "id": 244, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 18, + "time": 11232000 + }, + { + "id": 245, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 1, + "time": 11367000 + }, + { + "id": 246, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 1, + "time": 11468000 + }, + { + "id": 247, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 1, + "time": 11487000 + }, + { + "id": 248, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 1, + "time": 11522000 + }, + { + "id": 249, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 10, + "teamId": 19, + "time": 11529000 + }, + { + "id": 250, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "RE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 14, + "time": 11685000 + }, + { + "id": 251, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 14, + "time": 11751000 + }, + { + "id": 252, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 18, + "time": 11771000 + }, + { + "id": 253, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 14, + "time": 11876000 + }, + { + "id": 254, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 1, + "time": 11884000 + }, + { + "id": 255, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 5, + "teamId": 1, + "time": 11909000 + }, + { + "id": 256, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 1, + "time": 11912000 + }, + { + "id": 257, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 4, + "time": 11999000 + }, + { + "id": 258, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 3, + "teamId": 11, + "time": 12015000 + }, + { + "id": 259, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 14, + "time": 12022000 + }, + { + "id": 260, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 0, + "time": 12031000 + }, + { + "id": 261, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 15, + "time": 12055000 + }, + { + "id": 262, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 0, + "time": 12057000 + }, + { + "id": 263, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 14, + "time": 12093000 + }, + { + "id": 264, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "PE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 3, + "teamId": 12, + "time": 12130000 + }, + { + "id": 265, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 18, + "time": 12131000 + }, + { + "id": 266, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 3, + "teamId": 12, + "time": 12215000 + }, + { + "id": 267, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "RE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 3, + "teamId": 3, + "time": 12260000 + }, + { + "id": 268, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 14, + "time": 12265000 + }, + { + "id": 269, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 18, + "time": 12300000 + }, + { + "id": 270, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 8, + "time": 12321000 + }, + { + "id": 271, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 3, + "teamId": 3, + "time": 12392000 + }, + { + "id": 272, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 4, + "time": 12470000 + }, + { + "id": 273, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 4, + "time": 12619000 + }, + { + "id": 274, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 17, + "time": 12623000 + }, + { + "id": 275, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 14, + "time": 12667000 + }, + { + "id": 276, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "CE", + "isAddingPenalty": false, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 6, + "time": 12685000 + }, + { + "id": 277, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 6, + "time": 12731000 + }, + { + "id": 278, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 14, + "time": 12741000 + }, + { + "id": 279, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "PE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 3, + "teamId": 6, + "time": 12936000 + }, + { + "id": 280, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 3, + "teamId": 9, + "time": 12936000 + }, + { + "id": 281, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 8, + "time": 13011000 + }, + { + "id": 282, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 9, + "time": 13149000 + }, + { + "id": 283, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 14, + "time": 13318000 + }, + { + "id": 284, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 8, + "time": 13400000 + }, + { + "id": 285, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 5, + "teamId": 14, + "time": 13510000 + }, + { + "id": 286, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 18, + "time": 13625000 + }, + { + "id": 287, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 14, + "time": 13652000 + }, + { + "id": 288, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 11, + "time": 13684000 + }, + { + "id": 289, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "CE", + "isAddingPenalty": false, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 15, + "time": 13824000 + }, + { + "id": 290, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 15, + "time": 13870000 + }, + { + "id": 291, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 6, + "time": 13889000 + }, + { + "id": 292, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 3, + "teamId": 1, + "time": 14065000 + }, + { + "id": 293, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 5, + "teamId": 14, + "time": 14253000 + }, + { + "id": 294, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 18, + "time": 14270000 + }, + { + "id": 295, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 4, + "time": 14291000 + }, + { + "id": 296, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 1, + "time": 14433000 + }, + { + "id": 297, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 5, + "teamId": 14, + "time": 14446000 + }, + { + "id": 298, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 18, + "time": 14491000 + }, + { + "id": 299, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 1, + "time": 14497000 + }, + { + "id": 300, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 18, + "time": 14534000 + }, + { + "id": 301, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "CE", + "isAddingPenalty": false, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 0, + "teamId": 7, + "time": 14558000 + }, + { + "id": 302, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 1, + "time": 14580000 + }, + { + "id": 303, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 15, + "time": 14582000 + }, + { + "id": 304, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 1, + "time": 14695000 + }, + { + "id": 305, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 6, + "time": 14696000 + }, + { + "id": 306, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 15, + "time": 14794000 + }, + { + "id": 307, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 1, + "time": 14822000 + }, + { + "id": 308, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 8, + "time": 14842000 + }, + { + "id": 309, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "RE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 15, + "time": 14855000 + }, + { + "id": 310, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 18, + "time": 14901000 + }, + { + "id": 311, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "PE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 3, + "teamId": 2, + "time": 14909000 + }, + { + "id": 312, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 17, + "time": 14996000 + }, + { + "id": 313, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "RE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 5, + "teamId": 14, + "time": 15013000 + }, + { + "id": 314, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 5, + "teamId": 14, + "time": 15052000 + }, + { + "id": 315, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 3, + "teamId": 14, + "time": 15059000 + }, + { + "id": 316, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 18, + "time": 15068000 + }, + { + "id": 317, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 1, + "time": 15086000 + }, + { + "id": 318, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "RE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 5, + "teamId": 14, + "time": 15087000 + }, + { + "id": 319, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "CE", + "isAddingPenalty": false, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 6, + "time": 15151000 + }, + { + "id": 320, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 6, + "time": 15211000 + }, + { + "id": 321, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "PE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 1, + "time": 15271000 + }, + { + "id": 322, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "RE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 15, + "time": 15287000 + }, + { + "id": 323, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 9, + "time": 15367000 + }, + { + "id": 324, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "RE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 5, + "teamId": 14, + "time": 15373000 + }, + { + "id": 325, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 1, + "time": 15373000 + }, + { + "id": 326, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 18, + "time": 15388000 + }, + { + "id": 327, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "RE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 5, + "teamId": 14, + "time": 15412000 + }, + { + "id": 328, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 9, + "time": 15428000 + }, + { + "id": 329, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 18, + "time": 15457000 + }, + { + "id": 330, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 1, + "time": 15528000 + }, + { + "id": 331, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "CE", + "isAddingPenalty": false, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 1, + "time": 15566000 + }, + { + "id": 332, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 1, + "time": 15567000 + }, + { + "id": 333, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "CE", + "isAddingPenalty": false, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 1, + "time": 15690000 + }, + { + "id": 334, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 5, + "teamId": 14, + "time": 15714000 + }, + { + "id": 335, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 6, + "time": 15728000 + }, + { + "id": 336, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 1, + "time": 15730000 + }, + { + "id": 337, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 1, + "time": 15735000 + }, + { + "id": 338, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 1, + "time": 15803000 + }, + { + "id": 339, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "CE", + "isAddingPenalty": false, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 15, + "time": 15808000 + }, + { + "id": 340, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 1, + "time": 15809000 + }, + { + "id": 341, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 5, + "teamId": 14, + "time": 15832000 + }, + { + "id": 342, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 1, + "time": 15883000 + }, + { + "id": 343, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "RE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 5, + "teamId": 14, + "time": 15887000 + }, + { + "id": 344, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "CE", + "isAddingPenalty": false, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 15, + "time": 15913000 + }, + { + "id": 345, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "CE", + "isAddingPenalty": false, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 1, + "time": 15917000 + }, + { + "id": 346, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 7, + "time": 15934000 + }, + { + "id": 347, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 1, + "time": 15958000 + }, + { + "id": 348, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 9, + "time": 15964000 + }, + { + "id": 349, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 1, + "time": 15969000 + }, + { + "id": 350, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 5, + "teamId": 14, + "time": 15974000 + }, + { + "id": 351, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 1, + "teamId": 15, + "time": 16004000 + }, + { + "id": 352, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 7, + "time": 16073000 + }, + { + "id": 353, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 11, + "teamId": 14, + "time": 16094000 + }, + { + "id": 354, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 3, + "teamId": 4, + "time": 16110000 + }, + { + "id": 355, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 0, + "teamId": 3, + "time": 16165000 + }, + { + "id": 356, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 1, + "time": 16183000 + }, + { + "id": 357, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 9, + "time": 16365000 + }, + { + "id": 358, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 1, + "time": 16444000 + }, + { + "id": 359, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 1, + "time": 16506000 + }, + { + "id": 360, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 5, + "time": 16519000 + }, + { + "id": 361, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 0, + "time": 16631000 + }, + { + "id": 362, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 6, + "time": 16650000 + }, + { + "id": 363, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 5, + "time": 16671000 + }, + { + "id": 364, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 18, + "time": 16698000 + }, + { + "id": 365, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 6, + "time": 16762000 + }, + { + "id": 366, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 18, + "time": 16778000 + }, + { + "id": 367, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "PE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 8, + "time": 16852000 + }, + { + "id": 368, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 6, + "time": 16893000 + }, + { + "id": 369, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 9, + "time": 16941000 + }, + { + "id": 370, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "PE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 8, + "time": 16955000 + }, + { + "id": 371, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 1, + "time": 16988000 + }, + { + "id": 372, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 9, + "time": 17004000 + }, + { + "id": 373, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "PE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 8, + "time": 17053000 + }, + { + "id": 374, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 11, + "teamId": 12, + "time": 17079000 + }, + { + "id": 375, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 11, + "teamId": 12, + "time": 17131000 + }, + { + "id": 376, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 0, + "time": 17137000 + }, + { + "id": 377, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 2, + "time": 17146000 + }, + { + "id": 378, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "RE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 11, + "teamId": 5, + "time": 17152000 + }, + { + "id": 379, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 4, + "time": 17156000 + }, + { + "id": 380, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 8, + "time": 17174000 + }, + { + "id": 381, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 6, + "time": 17185000 + }, + { + "id": 382, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 9, + "time": 17187000 + }, + { + "id": 383, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 11, + "teamId": 12, + "time": 17219000 + }, + { + "id": 384, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 6, + "time": 17246000 + }, + { + "id": 385, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 0, + "time": 17252000 + }, + { + "id": 386, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 5, + "time": 17273000 + }, + { + "id": 387, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 17, + "time": 17314000 + }, + { + "id": 388, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "RE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 11, + "time": 17393000 + }, + { + "id": 389, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 3, + "teamId": 6, + "time": 17403000 + }, + { + "id": 390, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "CE", + "isAddingPenalty": false, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 1, + "time": 17428000 + }, + { + "id": 391, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 0, + "time": 17439000 + }, + { + "id": 392, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 1, + "time": 17454000 + }, + { + "id": 393, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "RE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 5, + "time": 17495000 + }, + { + "id": 394, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 0, + "time": 17496000 + }, + { + "id": 395, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 3, + "time": 17518000 + }, + { + "id": 396, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "RE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 5, + "time": 17524000 + }, + { + "id": 397, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 1, + "time": 17536000 + }, + { + "id": 398, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "RE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 11, + "time": 17537000 + }, + { + "id": 399, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "RE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 9, + "time": 17568000 + }, + { + "id": 400, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 3, + "time": 17578000 + }, + { + "id": 401, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 3, + "time": 17587000 + }, + { + "id": 402, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 1, + "time": 17609000 + }, + { + "id": 403, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 9, + "time": 17611000 + }, + { + "id": 404, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 1, + "time": 17621000 + }, + { + "id": 405, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 11, + "time": 17637000 + }, + { + "id": 406, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 1, + "time": 17643000 + }, + { + "id": 407, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "CE", + "isAddingPenalty": false, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 2, + "time": 17649000 + }, + { + "id": 408, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 1, + "time": 17661000 + }, + { + "id": 409, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 8, + "teamId": 3, + "time": 17682000 + }, + { + "id": 410, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 9, + "time": 17687000 + }, + { + "id": 411, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 11, + "time": 17698000 + }, + { + "id": 412, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 9, + "time": 17713000 + }, + { + "id": 413, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "RE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 5, + "time": 17713000 + }, + { + "id": 414, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 1, + "time": 17714000 + }, + { + "id": 415, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "CE", + "isAddingPenalty": false, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 0, + "time": 17720000 + }, + { + "id": 416, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "RE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 9, + "time": 17736000 + }, + { + "id": 417, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 9, + "time": 17755000 + }, + { + "id": 418, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 1, + "time": 17763000 + }, + { + "id": 419, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 3, + "teamId": 0, + "time": 17777000 + }, + { + "id": 420, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 0, + "time": 17783000 + }, + { + "id": 421, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 1, + "time": 17784000 + }, + { + "id": 422, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 2, + "time": 17824000 + }, + { + "id": 423, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 1, + "time": 17825000 + }, + { + "id": 424, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 5, + "time": 17827000 + }, + { + "id": 425, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 5, + "time": 17829000 + }, + { + "id": 426, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 9, + "time": 17837000 + }, + { + "id": 427, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 1, + "time": 17841000 + }, + { + "id": 428, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 1, + "time": 17855000 + }, + { + "id": 429, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 3, + "time": 17857000 + }, + { + "id": 430, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 5, + "time": 17859000 + }, + { + "id": 431, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 9, + "time": 17871000 + }, + { + "id": 432, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 2, + "time": 17899000 + }, + { + "id": 433, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "TL", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 1, + "time": 17903000 + }, + { + "id": 434, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "AC", + "isAddingPenalty": false, + "isAccepted": true + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 3, + "time": 17907000 + }, + { + "id": 435, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 1, + "time": 17909000 + }, + { + "id": 436, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 1, + "time": 17918000 + }, + { + "id": 437, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "PE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 6, + "time": 17927000 + }, + { + "id": 438, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "RE", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 5, + "time": 17931000 + }, + { + "id": 439, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 6, + "time": 17943000 + }, + { + "id": 440, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 1, + "time": 17948000 + }, + { + "id": 441, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 1, + "time": 17956000 + }, + { + "id": 442, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 1, + "time": 17963000 + }, + { + "id": 443, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 4, + "teamId": 4, + "time": 17967000 + }, + { + "id": 444, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 1, + "time": 17969000 + }, + { + "id": 445, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 1, + "time": 17971000 + }, + { + "id": 446, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 1, + "time": 17974000 + }, + { + "id": 447, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 1, + "time": 17978000 + }, + { + "id": 448, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 5, + "time": 17982000 + }, + { + "id": 449, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 1, + "time": 17984000 + }, + { + "id": 450, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 2, + "teamId": 9, + "time": 17992000 + }, + { + "id": 451, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 7, + "teamId": 1, + "time": 17993000 + }, + { + "id": 452, + "result": { + "type": "ICPC", + "verdict": { + "shortName": "WA", + "isAddingPenalty": true, + "isAccepted": false + }, + "isFirstToSolveRun": false + }, + "percentage": 1.0, + "problemId": 6, + "teamId": 1, + "time": 17993000 + } + ], + "analyticsMessages": [ + ] +} \ No newline at end of file diff --git a/src/cds/testData/loaders/testsys.dat b/src/cds/testData/loaders/testsys.dat new file mode 100644 index 000000000..1e62f6219 --- /dev/null +++ b/src/cds/testData/loaders/testsys.dat @@ -0,0 +1,521 @@ +--- testsys monitor file n201206.dat --- +LVI St. Petersburg State University Championship, Sunday, December 06, 2 OVER + ID Team A B C D E F G H I J K L = Time R +------------------------------------------------------------------------------- + 02 LOUD Enough (, ... +1 + + + +1 +2 +17-38. + +1 + 10 1479 1 + 04 Cheba Kings (ਣ쥢, ... + +2 +5 +1 +1 +5 +4 -2 -3 + +1 + 10 1591 2 + 15 () ... . + +29+ +3 +12. . . + +1 + 8 2118 3 + 13 (1) bravit_team (... . + . +1 + . . . . + + +2 6 697 4 + 08 How to turn off computer... . + +1 . + . . . . +1 +2 +6 6 804 5 + 05 (1) Square ball (... . +5 . + + . +3 -2 . + +2 . 6 1227 6 + 01 Monad.Reader (몮, ... . +1 -6 -1 +1 -5 +5 . . + + . 5 369 7 + 10 Botwa Jigurda (, ... . +1 -13+ + . -7 -3 . +1 + . 5 464 8 + 12 (1) 䠭- ... . +1 . + +2 . -1 -4 . + +1 . 5 495 9 + 09 㧥 (祢) . +1 . + +2 . . -8 . + +3 . 5 576 10 + 07 admarkov team (મ) . +3 . +1 +2 . -7 -7 . + +1 . 5 610 11 + 06 loozha (ண, 㫨... . +2 . . +1 . . -11. + +1 -1 4 462 12 + 03 (1) Stardust Crusaders ... . + . -1 +1 . -3 . . +4 +1 . 4 519 13 + 14 () gerind (異) . +1 . . +4 . . . . +1 +3 . 4 522 14 + 17 () ⨡ (... . +1 . . . . . . . . +4 . 2 289 15 + 19 () 祭 (... . +3 . . -19. . . . . +3 . 2 298 16 + 18 () (楢, ... . +5 . . -3 . . . . . +1 . 2 397 17 + 16 () Persik (, ... . +8 . . . . . . . . + . 2 607 18 + 11 () ⠬ (... . . . . . . . . . . . . 0 0 19 + 20 () Nat & Ural... . . . . . . . . . . -4 . 0 0 19 + +@contest "LVI St. Petersburg State University Championship, Sunday, December 06, 2020" +@startat 06.12.2020 11:00:00 +@contlen 300 +@now 1056517 +@state RESULTS +@freeze 300 +@problems 12 +@teams 20 +@submissions 453 +@comment @pragma IgnoreCE +@comment @pragma HideUnfrozenCount +@p A,Permutations and Linear Combinations,20,0 +@p B,Brick Power,20,0 +@p C,Broken Matrix,20,0 +@p D,Encoded Messages,20,0 +@p E,Dogs and Coins,20,0 +@p F,Infection Score,20,0 +@p G,King and Roads,20,0 +@p H,Classic Literature,20,0 +@p I,Multiply without Carry,20,0 +@p J,Game with Permutations,20,0 +@p K,Schedule,20,0 +@p L,T-Shirt Distribution,20,0 +@t 01,0,1,"Monad.Reader (, , )" +@t 02,0,1,"LOUD Enough (, , )" +@t 03,0,1,"(1) Stardust Crusaders (, , )" +@t 04,0,1,"Cheba Kings (, , )" +@t 05,0,1,"(1) Square ball (, , )" +@t 06,0,1,"loozha (, , )" +@t 07,0,1,admarkov team () +@t 08,0,1,"How to turn off computer? (, , )" +@t 09,0,1, () +@t 10,0,1,"Botwa Jigurda (, , )" +@t 11,0,1,"() (, , )" +@t 12,0,1,"(1) - (, , )" +@t 13,0,1,"(1) bravit_team (, , )" +@t 14,0,2,() gerind () +@t 15,0,2,"() .. (, )" +@t 16,0,2,"() Persik (, , )" +@t 17,0,2,"() (, )" +@t 18,0,2,"() (, , )" +@t 19,0,2,"() (, , )" +@t 20,0,2,"() Nat & Ural (, , )" +@s 04,B,1,607,TL,14 +@s 08,B,1,682,OK +@s 07,K,1,699,WA,2 +@s 02,K,1,737,WA,2 +@s 01,B,1,774,RT,1 +@s 02,B,1,788,OK +@s 01,B,2,809,OK +@s 04,B,2,872,TL,14 +@s 10,K,1,902,OK +@s 02,K,2,938,OK +@s 07,K,2,967,OK +@s 01,K,1,986,OK +@s 04,K,1,1144,WA,2 +@s 09,B,1,1156,WA,4 +@s 13,B,1,1161,OK +@s 04,B,3,1240,OK +@s 15,B,1,1265,OK +@s 09,B,2,1294,OK +@s 13,K,1,1353,OK +@s 14,B,1,1359,TL,11 +@s 07,B,1,1387,TL,11 +@s 04,K,2,1394,OK +@s 05,K,1,1436,WA,2 +@s 10,B,1,1465,TL,11 +@s 10,B,2,1517,OK +@s 14,B,2,1518,OK +@s 07,B,2,1522,TL,11 +@s 20,K,1,1541,WA,2 +@s 12,B,1,1605,TL,11 +@s 12,K,1,1613,WA,2 +@s 08,K,1,1679,WA,2 +@s 07,B,3,1696,TL,11 +@s 08,K,2,1707,WA,2 +@s 12,B,2,1710,OK +@s 12,K,2,1734,OK +@s 06,K,1,1823,WA,2 +@s 04,J,1,1883,OK +@s 07,B,4,1892,OK +@s 09,K,1,1922,WA,2 +@s 01,J,1,1974,OK +@s 05,K,2,1977,WA,2 +@s 01,E,1,2022,WA,11 +@s 01,E,2,2158,OK +@s 04,E,1,2163,WA,12 +@s 04,E,2,2217,OK +@s 15,K,1,2241,WA,2 +@s 08,K,3,2246,OK +@s 09,K,2,2307,WA,2 +@s 15,K,2,2310,OK +@s 02,L,1,2343,OK +@s 06,K,2,2368,OK +@s 19,K,1,2424,WA,2 +@s 05,K,3,2524,OK +@s 09,K,3,2548,WA,2 +@s 02,C,1,2600,OK +@s 15,J,1,2635,OK +@s 17,B,1,2636,TL,11 +@s 13,E,1,2679,OK +@s 03,B,1,2695,OK +@s 09,K,4,2706,OK +@s 08,J,1,2790,WA,1 +@s 07,J,1,2809,OK +@s 17,B,2,2816,OK +@s 14,K,1,2820,WA,2 +@s 08,J,2,2843,OK +@s 02,J,1,2861,OK +@s 17,B,3,2862,TL,11 +@s 07,E,1,2915,WA,3 +@s 01,G,1,2977,WA,12 +@s 17,K,1,3011,WA,2 +@s 19,K,2,3038,WA,2 +@s 10,E,1,3131,OK +@s 12,J,1,3189,OK +@s 14,K,2,3191,WA,1 +@s 09,E,1,3215,WA,3 +@s 14,K,3,3229,WA,2 +@s 09,E,2,3275,WA,3 +@s 01,G,2,3332,WA,12 +@s 19,B,1,3360,WA,1 +@s 05,B,1,3406,TL,10 +@s 19,B,2,3407,WA,4 +@s 02,E,1,3476,WA,3 +@s 06,B,1,3571,WA,4 +@s 13,J,1,3606,OK +@s 18,B,1,3627,RT,2 +@s 05,B,2,3851,TL,19 +@s 07,E,2,3908,WA,12 +@s 02,G,1,3926,WA,3 +@s 14,K,4,3932,CE +@s 08,E,1,3942,OK +@s 14,K,5,3949,CE +@s 14,K,6,3977,OK +@s 15,E,1,4077,TL,10 +@s 01,G,3,4156,WA,12 +@s 19,K,3,4182,WA,2 +@s 16,B,1,4217,WA,1 +@s 03,K,1,4288,TL,2 +@s 05,B,3,4366,TL,32 +@s 02,E,2,4373,OK +@s 10,G,1,4450,WA,3 +@s 01,G,4,4452,WA,12 +@s 03,K,2,4477,OK +@s 04,F,1,4635,RT,21 +@s 19,K,4,4802,OK +@s 06,B,2,4835,TL,10 +@s 05,B,4,4867,TL,12 +@s 14,J,1,4938,CE +@s 05,J,1,4998,OK +@s 19,B,3,5003,TL,10 +@s 14,J,2,5007,WA,3 +@s 15,C,1,5128,WA,3 +@s 15,E,2,5137,WA,3 +@s 06,B,3,5140,OK +@s 03,J,1,5175,WA,3 +@s 07,E,3,5179,OK +@s 15,C,2,5180,WA,19 +@s 18,B,2,5242,CE +@s 15,E,3,5299,TL,11 +@s 18,B,3,5301,RT,3 +@s 09,E,3,5314,OK +@s 04,F,2,5409,RT,21 +@s 04,C,1,5515,WA,18 +@s 03,J,2,5562,WA,5 +@s 12,E,1,5596,WA,10 +@s 03,J,3,5651,IL,1 +@s 17,K,2,5732,WA,2 +@s 03,J,4,5742,IL,1 +@s 10,G,2,5804,WA,27 +@s 03,J,5,5851,OK +@s 14,J,3,5875,OK +@s 19,B,4,5910,OK +@s 18,B,4,6084,TL,11 +@s 15,E,4,6100,OK +@s 12,E,2,6163,WA,10 +@s 06,J,1,6177,OK +@s 12,E,3,6273,OK +@s 18,B,5,6275,TL,11 +@s 04,F,3,6324,WA,21 +@s 15,C,3,6347,RT,3 +@s 16,B,2,6462,WA,6 +@s 02,A,1,6484,WA,1 +@s 04,C,2,6487,WA,18 +@s 19,E,1,6495,WA,3 +@s 02,A,2,6518,OK +@s 15,C,4,6581,WA,19 +@s 18,B,6,6587,TL,11 +@s 10,J,1,6595,WA,3 +@s 01,F,1,6651,WA,18 +@s 18,B,7,6750,OK +@s 10,G,3,6799,WA,27 +@s 01,F,2,6827,CE +@s 10,J,2,6958,OK +@s 04,C,3,6985,TL,48 +@s 01,F,3,7021,WA,18 +@s 19,E,2,7051,TL,11 +@s 17,K,3,7065,WA,2 +@s 09,J,1,7186,OK +@s 17,K,4,7204,WA,2 +@s 04,C,4,7224,WA,19 +@s 01,F,4,7299,WA,18 +@s 04,C,5,7338,TL,48 +@s 04,F,4,7382,WA,21 +@s 01,F,5,7430,WA,18 +@s 04,G,1,7433,WA,25 +@s 04,C,6,7438,OK +@s 19,E,3,7549,WA,3 +@s 01,G,5,7604,WA,57 +@s 02,G,2,7606,WA,3 +@s 15,C,5,7646,PE,3 +@s 15,C,6,7692,WA,20 +@s 19,E,4,7767,WA,3 +@s 14,E,1,7793,WA,3 +@s 04,F,5,7862,WA,21 +@s 01,G,6,7867,OK +@s 01,G,7,7963,OK +@s 07,H,1,8156,RT,1 +@s 08,L,1,8176,TL,1 +@s 02,F,1,8180,WA,18 +@s 07,H,2,8309,WA,1 +@s 18,K,1,8314,WA,2 +@s 04,G,2,8414,WA,1 +@s 05,E,1,8419,OK +@s 04,G,3,8457,WA,25 +@s 15,C,7,8507,WA,4 +@s 17,K,5,8529,OK +@s 15,C,8,8579,WA,18 +@s 15,C,9,8645,WA,18 +@s 02,G,3,8674,WA,3 +@s 01,G,8,8711,OK +@s 15,C,10,8731,WA,18 +@s 01,G,9,8780,OK +@s 02,G,4,8786,WA,3 +@s 14,E,2,8860,WA,12 +@s 14,E,3,8901,WA,12 +@s 02,G,5,8930,WA,3 +@s 08,L,2,8932,TL,1 +@s 06,E,1,8988,WA,10 +@s 01,G,10,8990,OK +@s 02,G,6,9002,WA,3 +@s 08,L,3,9004,TL,1 +@s 14,E,4,9021,WA,10 +@s 15,C,11,9029,TL,39 +@s 04,L,1,9076,OK +@s 14,E,5,9169,OK +@s 06,E,2,9251,OK +@s 19,E,5,9266,WA,11 +@s 20,K,2,9445,TL,2 +@s 15,C,12,9631,WA,25 +@s 08,L,4,9640,TL,3 +@s 15,C,13,9726,TL,39 +@s 04,G,4,9762,WA,12 +@s 15,C,14,9814,TL,39 +@s 08,L,5,9848,TL,3 +@s 18,K,2,9917,OK +@s 05,H,1,9988,PE,1 +@s 04,G,5,10009,OK +@s 08,L,6,10015,WA,6 +@s 15,C,15,10048,TL,39 +@s 05,H,2,10078,WA,1 +@s 10,H,1,10102,PE,1 +@s 04,G,6,10104,OK +@s 02,F,2,10129,WA,18 +@s 02,H,1,10257,WA,1 +@s 04,H,1,10278,PE,1 +@s 03,E,1,10334,WA,10 +@s 15,C,16,10362,CE +@s 15,F,1,10366,WA,18 +@s 15,C,17,10381,WA,6 +@s 10,H,2,10394,WA,1 +@s 20,K,3,10437,TL,2 +@s 08,L,7,10475,OK +@s 04,H,2,10600,WA,1 +@s 15,C,18,10600,WA,6 +@s 10,H,3,10673,WA,1 +@s 05,B,5,10816,RT,3 +@s 16,K,1,10846,OK +@s 15,C,19,10891,WA,6 +@s 09,D,1,10893,OK +@s 04,F,6,10901,OK +@s 01,F,6,10924,WA,18 +@s 03,E,2,10957,OK +@s 02,H,2,11023,WA,2 +@s 15,C,20,11114,WA,20 +@s 15,C,21,11200,TL,39 +@s 19,E,6,11232,WA,11 +@s 02,H,3,11367,TL,1 +@s 02,H,4,11468,WA,2 +@s 02,H,5,11487,TL,2 +@s 02,H,6,11522,WA,2 +@s 20,K,4,11529,TL,2 +@s 15,C,22,11685,RT,30 +@s 15,C,23,11751,TL,39 +@s 19,E,7,11771,WA,12 +@s 15,C,24,11876,WA,18 +@s 02,H,7,11884,WA,1 +@s 02,F,3,11909,OK +@s 02,H,8,11912,WA,2 +@s 05,G,1,11999,WA,3 +@s 12,D,1,12015,OK +@s 15,C,25,12022,WA,19 +@s 01,G,11,12031,WA,3 +@s 16,B,3,12055,WA,6 +@s 01,G,12,12057,OK +@s 15,C,26,12093,WA,28 +@s 13,D,1,12130,PE,1 +@s 19,E,8,12131,WA,12 +@s 13,D,2,12215,OK +@s 04,D,1,12260,RT,1 +@s 15,C,27,12265,WA,20 +@s 19,E,9,12300,WA,12 +@s 09,H,1,12321,WA,1 +@s 04,D,2,12392,OK +@s 05,B,6,12470,OK +@s 05,G,2,12619,WA,3 +@s 18,E,1,12623,WA,3 +@s 15,C,28,12667,WA,20 +@s 07,H,3,12685,CE +@s 07,H,4,12731,WA,2 +@s 15,C,29,12741,WA,20 +@s 07,D,1,12936,PE,3 +@s 10,D,1,12936,OK +@s 09,H,2,13011,WA,1 +@s 10,C,1,13149,WA,6 +@s 15,C,30,13318,WA,20 +@s 09,H,3,13400,WA,1 +@s 15,F,2,13510,WA,16 +@s 19,E,10,13625,WA,3 +@s 15,C,31,13652,OK +@s 12,G,1,13684,WA,12 +@s 16,B,4,13824,CE +@s 16,B,5,13870,WA,6 +@s 07,H,5,13889,WA,2 +@s 02,D,1,14065,OK +@s 15,F,3,14253,WA,16 +@s 19,E,11,14270,WA,11 +@s 05,G,3,14291,WA,3 +@s 02,G,7,14433,WA,3 +@s 15,F,4,14446,WA,18 +@s 19,E,12,14491,WA,11 +@s 02,G,8,14497,WA,3 +@s 19,E,13,14534,WA,1 +@s 08,A,1,14558,CE +@s 02,G,9,14580,WA,3 +@s 16,B,6,14582,TL,11 +@s 02,G,10,14695,WA,3 +@s 07,H,6,14696,WA,2 +@s 16,B,7,14794,WA,1 +@s 02,H,9,14822,WA,1 +@s 09,H,4,14842,WA,1 +@s 16,B,8,14855,RT,3 +@s 19,E,14,14901,WA,11 +@s 03,D,1,14909,PE,3 +@s 18,E,2,14996,WA,3 +@s 15,F,5,15013,RT,18 +@s 15,F,6,15052,WA,18 +@s 15,D,1,15059,OK +@s 19,E,15,15068,WA,11 +@s 02,G,11,15086,WA,3 +@s 15,F,7,15087,RT,18 +@s 07,G,1,15151,CE +@s 07,G,2,15211,WA,12 +@s 02,H,10,15271,PE,1 +@s 16,B,9,15287,RT,3 +@s 10,G,4,15367,WA,3 +@s 15,F,8,15373,RT,18 +@s 02,H,11,15373,WA,1 +@s 19,E,16,15388,WA,11 +@s 15,F,9,15412,RT,18 +@s 10,G,5,15428,WA,3 +@s 19,E,17,15457,WA,11 +@s 02,G,12,15528,WA,3 +@s 02,H,12,15566,CE +@s 02,G,13,15567,WA,3 +@s 02,G,14,15690,CE +@s 15,F,10,15714,WA,5 +@s 07,G,3,15728,WA,12 +@s 02,G,15,15730,WA,3 +@s 02,G,16,15735,WA,3 +@s 02,G,17,15803,WA,3 +@s 16,B,10,15808,CE +@s 02,G,18,15809,WA,3 +@s 15,F,11,15832,WA,18 +@s 02,H,13,15883,WA,1 +@s 15,F,12,15887,RT,18 +@s 16,B,11,15913,CE +@s 02,G,19,15917,CE +@s 08,C,1,15934,WA,20 +@s 02,G,20,15958,OK +@s 10,C,2,15964,WA,6 +@s 02,G,21,15969,WA,3 +@s 15,F,13,15974,OK +@s 16,B,12,16004,OK +@s 08,C,2,16073,OK +@s 15,L,1,16094,OK +@s 05,D,1,16110,OK +@s 04,A,1,16165,OK +@s 02,H,14,16183,WA,1 +@s 10,C,3,16365,WA,6 +@s 02,G,22,16444,WA,3 +@s 02,H,15,16506,WA,1 +@s 06,H,1,16519,WA,1 +@s 01,C,1,16631,WA,3 +@s 07,G,4,16650,WA,3 +@s 06,H,2,16671,WA,1 +@s 19,E,18,16698,WA,11 +@s 07,G,5,16762,WA,3 +@s 19,E,19,16778,WA,11 +@s 09,H,5,16852,PE,1 +@s 07,G,6,16893,WA,12 +@s 10,C,4,16941,WA,4 +@s 09,H,6,16955,PE,1 +@s 02,H,16,16988,WA,1 +@s 10,C,5,17004,WA,9 +@s 09,H,7,17053,PE,1 +@s 13,L,1,17079,TL,1 +@s 13,L,2,17131,WA,2 +@s 01,C,2,17137,WA,25 +@s 03,G,1,17146,WA,3 +@s 06,L,1,17152,RT,1 +@s 05,G,4,17156,OK +@s 09,H,8,17174,WA,1 +@s 07,G,7,17185,WA,2 +@s 10,C,6,17187,WA,9 +@s 13,L,3,17219,OK +@s 07,G,8,17246,WA,3 +@s 01,C,3,17252,WA,25 +@s 06,H,3,17273,WA,1 +@s 18,E,3,17314,WA,10 +@s 12,H,1,17393,RT,1 +@s 07,D,2,17403,OK +@s 02,H,17,17428,CE +@s 01,C,4,17439,WA,25 +@s 02,H,18,17454,WA,1 +@s 06,H,4,17495,RT,1 +@s 01,C,5,17496,WA,25 +@s 04,I,1,17518,TL,17 +@s 06,H,5,17524,RT,1 +@s 02,H,19,17536,WA,1 +@s 12,H,2,17537,RT,1 +@s 10,C,7,17568,RT,9 +@s 04,G,7,17578,OK +@s 04,I,2,17587,TL,17 +@s 02,H,20,17609,WA,2 +@s 10,C,8,17611,WA,9 +@s 02,H,21,17621,TL,2 +@s 12,H,3,17637,WA,1 +@s 02,H,22,17643,TL,2 +@s 03,G,2,17649,CE +@s 02,H,23,17661,WA,5 +@s 04,I,3,17682,TL,30 +@s 10,C,9,17687,WA,9 +@s 12,H,4,17698,WA,1 +@s 10,C,10,17713,WA,9 +@s 06,H,6,17713,RT,1 +@s 02,H,24,17714,WA,5 +@s 01,C,6,17720,CE +@s 10,C,11,17736,RT,9 +@s 10,G,6,17755,TL,3 +@s 02,H,25,17763,WA,5 +@s 01,D,1,17777,WA,1 +@s 01,C,7,17783,WA,25 +@s 02,H,26,17784,TL,2 +@s 03,G,3,17824,WA,3 +@s 02,H,27,17825,WA,2 +@s 06,H,7,17827,WA,1 +@s 06,H,8,17829,WA,1 +@s 10,G,7,17837,TL,11 +@s 02,H,28,17841,WA,2 +@s 02,H,29,17855,WA,5 +@s 04,G,8,17857,WA,2 +@s 06,H,9,17859,WA,1 +@s 10,C,12,17871,WA,1 +@s 03,G,4,17899,WA,3 +@s 02,H,30,17903,TL,20 +@s 04,G,9,17907,OK +@s 02,H,31,17909,WA,2 +@s 02,H,32,17918,WA,2 +@s 07,H,7,17927,PE,1 +@s 06,H,10,17931,RT,1 +@s 07,H,8,17943,WA,2 +@s 02,H,33,17948,WA,2 +@s 02,H,34,17956,WA,2 +@s 02,H,35,17963,WA,2 +@s 05,E,2,17967,WA,2 +@s 02,H,36,17969,WA,1 +@s 02,H,37,17971,WA,2 +@s 02,H,38,17974,WA,1 +@s 02,H,39,17978,WA,1 +@s 06,H,11,17982,WA,1 +@s 02,G,23,17984,WA,1 +@s 10,C,13,17992,WA,9 +@s 02,H,40,17993,WA,1 +@s 02,G,24,17993,WA,1 diff --git a/src/clics-api/build.gradle.kts b/src/clics-api/build.gradle.kts new file mode 100644 index 000000000..66f391129 --- /dev/null +++ b/src/clics-api/build.gradle.kts @@ -0,0 +1,12 @@ +plugins { + `java-library` + alias(libs.plugins.kotlin.jvm) + alias(libs.plugins.kotlin.serialization) +} + +dependencies { + api(libs.kotlinx.serialization.json) + api(libs.kotlinx.datetime) + api(projects.common) + testImplementation(libs.kotlin.junit) +} \ No newline at end of file diff --git a/src/cds/src/main/kotlin/org/icpclive/cds/clics/ClicsTime.kt b/src/clics-api/src/main/kotlin/org/icpclive/clics/ClicsTime.kt similarity index 94% rename from src/cds/src/main/kotlin/org/icpclive/cds/clics/ClicsTime.kt rename to src/clics-api/src/main/kotlin/org/icpclive/clics/ClicsTime.kt index 72b5108ce..a72a46428 100644 --- a/src/cds/src/main/kotlin/org/icpclive/cds/clics/ClicsTime.kt +++ b/src/clics-api/src/main/kotlin/org/icpclive/clics/ClicsTime.kt @@ -1,23 +1,21 @@ -package org.icpclive.cds.clics +package org.icpclive.clics import kotlinx.datetime.* import kotlinx.serialization.KSerializer -import kotlinx.serialization.descriptors.PrimitiveKind -import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor -import kotlinx.serialization.descriptors.SerialDescriptor +import kotlinx.serialization.descriptors.* import kotlinx.serialization.encoding.Decoder import kotlinx.serialization.encoding.Encoder import java.time.ZoneId import java.time.ZonedDateTime import java.time.format.DateTimeFormatter -import java.util.regex.Pattern +import java.util.regex.* import kotlin.math.round import kotlin.time.Duration import kotlin.time.Duration.Companion.hours import kotlin.time.Duration.Companion.minutes import kotlin.time.Duration.Companion.seconds -object ClicsTime { +internal object ClicsTime { // https://ccs-specs.icpc.io/2021-11/contest_api#json-attribute-types private const val DATE_STR = "([0-9]{1,4})-([0-9]{1,2})-([0-9]{1,2})" private const val TIME_STR = "([0-9]{1,2}):([0-9]{1,2}):([0-9]{1,2}([.][0-9]{1,})?)" @@ -95,7 +93,9 @@ object ClicsTime { } val formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSX") - fun formatIso(instant: Instant) = Instant.fromEpochMilliseconds(instant.toEpochMilliseconds()).toJavaInstant().atZone(ZoneId.systemDefault()).format(formatter) + fun formatIso(instant: Instant) = Instant.fromEpochMilliseconds(instant.toEpochMilliseconds()).toJavaInstant().atZone(ZoneId.systemDefault()).format( + formatter + ) object DurationSerializer : KSerializer { override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor("ClicsDuration", PrimitiveKind.STRING) diff --git a/src/cds/src/main/kotlin/org/icpclive/cds/clics/api/Events.kt b/src/clics-api/src/main/kotlin/org/icpclive/clics/Events.kt similarity index 59% rename from src/cds/src/main/kotlin/org/icpclive/cds/clics/api/Events.kt rename to src/clics-api/src/main/kotlin/org/icpclive/clics/Events.kt index 9a79aaee3..b80e9a777 100644 --- a/src/cds/src/main/kotlin/org/icpclive/cds/clics/api/Events.kt +++ b/src/clics-api/src/main/kotlin/org/icpclive/clics/Events.kt @@ -1,9 +1,18 @@ -package org.icpclive.cds.clics.api - -import org.icpclive.cds.clics.api.v1.Event as EventV1 +package org.icpclive.clics import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable +import org.icpclive.clics.v1.Event as EventV1 + +interface IdEvent { + val id: String + val data: T? +} + +interface GlobalEvent { + val data: T? +} + @Serializable sealed class Event { @@ -18,9 +27,7 @@ sealed class Event { @Serializable sealed class IgnoredEvent : Event() - sealed class ContestEvent : UpdateContestEvent() { - abstract val data: Contest? - } + sealed class ContestEvent : UpdateContestEvent(), GlobalEvent @Serializable @SerialName("contest") @@ -31,68 +38,78 @@ sealed class Event { @Serializable @SerialName("problems") - data class ProblemEvent(val id: String, override val token: String, val data: Problem?) : - UpdateContestEvent() + data class ProblemEvent(override val id: String, override val token: String, override val data: Problem?) : + UpdateContestEvent(), IdEvent @Serializable @SerialName("teams") - data class TeamEvent(val id: String, override val token: String, val data: Team?) : UpdateContestEvent() + data class TeamEvent(override val id: String, override val token: String, override val data: Team?) : + UpdateContestEvent(), IdEvent @Serializable @SerialName("organizations") - data class OrganizationEvent(val id: String, override val token: String, val data: Organization?) : - UpdateContestEvent() + data class OrganizationEvent(override val id: String, override val token: String, override val data: Organization?) : + UpdateContestEvent(), IdEvent @Serializable @SerialName("state") - data class StateEvent(override val token: String, val data: State?) : UpdateContestEvent() + data class StateEvent(override val token: String, override val data: State?) : UpdateContestEvent(), + GlobalEvent @Serializable @SerialName("judgement-types") - data class JudgementTypeEvent(val id: String, override val token: String, val data: JudgementType?) : - UpdateContestEvent() + data class JudgementTypeEvent(override val id: String, override val token: String, override val data: JudgementType?) : + UpdateContestEvent(), IdEvent @Serializable @SerialName("groups") - data class GroupsEvent(val id: String, override val token: String, val data: Group?) : UpdateContestEvent() + data class GroupsEvent(override val id: String, override val token: String, override val data: Group?) : + UpdateContestEvent(), IdEvent @Serializable @SerialName("submissions") - data class SubmissionEvent(val id: String, override val token: String, val data: Submission?) : - UpdateRunEvent() + data class SubmissionEvent(override val id: String, override val token: String, override val data: Submission?) : + UpdateRunEvent(), IdEvent @Serializable @SerialName("judgements") - data class JudgementEvent(val id: String, override val token: String, val data: Judgement?) : - UpdateRunEvent() + data class JudgementEvent(override val id: String, override val token: String, override val data: Judgement?) : + UpdateRunEvent(), IdEvent @Serializable @SerialName("runs") - data class RunsEvent(val id: String, override val token: String, val data: Run?) : UpdateRunEvent() + data class RunsEvent(override val id: String, override val token: String, override val data: Run?) : + UpdateRunEvent(), IdEvent @Serializable @SerialName("commentary") - data class CommentaryEvent(val id: String, override val token: String, val data: Commentary?) : Event() + data class CommentaryEvent(override val id: String, override val token: String, override val data: Commentary?) : + Event(), IdEvent @Serializable @SerialName("awards") - data class AwardsEvent(val id: String, override val token: String, val data: Award?) : IgnoredEvent() + data class AwardsEvent(override val id: String, override val token: String, override val data: Award?) : + IgnoredEvent(), IdEvent @Serializable @SerialName("languages") - data class LanguageEvent(val id: String, override val token: String, val data: Language?) : IgnoredEvent() + data class LanguageEvent(override val id: String, override val token: String, override val data: Language?) : + IgnoredEvent(), IdEvent @Serializable @SerialName("clarifications") - data class ClarificationEvent(val id: String, override val token: String, val data: Clarification?) : IgnoredEvent() + data class ClarificationEvent(override val id: String, override val token: String, override val data: Clarification?) : + IgnoredEvent(), IdEvent @Serializable @SerialName("accounts") - data class AccountEvent(val id: String, override val token: String, val data: Account?) : IgnoredEvent() + data class AccountEvent(override val id: String, override val token: String, override val data: Account?) + : IgnoredEvent(), IdEvent @Serializable @SerialName("persons") - data class PersonEvent(val id: String, override val token: String) : IgnoredEvent() + data class PersonEvent(override val id: String, override val token: String, override val data: Person) : IgnoredEvent(), + IdEvent @Serializable @SerialName("map-info") diff --git a/src/cds/src/main/kotlin/org/icpclive/cds/clics/api/Objects.kt b/src/clics-api/src/main/kotlin/org/icpclive/clics/Objects.kt similarity index 76% rename from src/cds/src/main/kotlin/org/icpclive/cds/clics/api/Objects.kt rename to src/clics-api/src/main/kotlin/org/icpclive/clics/Objects.kt index 4afb30216..e4d97c3df 100644 --- a/src/cds/src/main/kotlin/org/icpclive/cds/clics/api/Objects.kt +++ b/src/clics-api/src/main/kotlin/org/icpclive/clics/Objects.kt @@ -1,15 +1,74 @@ @file:Suppress("UNUSED") -package org.icpclive.cds.clics.api +package org.icpclive.clics import kotlinx.datetime.Instant import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable -import org.icpclive.cds.clics.ClicsTime import org.icpclive.util.ColorSerializer +import org.icpclive.util.DurationInMinutesSerializer import java.awt.Color import kotlin.time.Duration +@Serializable +data class ApiProvider( + val name: String, + val version: String? = null, + val logo: List = emptyList(), +) + +@Serializable +data class ApiInfo( + val version: String, + val versionUrl: String, + val provider: ApiProvider +) + +@Serializable +data class Endpoint( + val type: String, + val properties: List +) + +@Serializable +data class Access( + val capabilities: List, + val endpoints: List +) + +@Serializable +data class Scoreboard( + @Serializable(with = ClicsTime.InstantSerializer::class) + val time: Instant, + @Serializable(with = ClicsTime.DurationSerializer::class) + val contest_time: Duration, + val state: State, + val rows: List +) + +@Serializable +data class ScoreboardRow( + val rank: Int, + val team_id: String, + val score: ScoreboardRowScore, + val problems: List +) + +@Serializable +data class ScoreboardRowScore( + val num_solved: Int, + val total_time: Long +) + +@Serializable +data class ScoreboardRowProblem( + val problem_id: String, + val num_judged: Int, + val num_pending: Int, + val solved: Boolean, + val time: Long? = null, +) + @Serializable enum class Operation { @SerialName("create") @@ -35,7 +94,8 @@ data class Contest( val scoreboard_freeze_duration: Duration?, @Serializable(with = ClicsTime.DurationSerializer::class) val countdown_pause_time: Duration? = null, - val penalty_time: Int? = null, + @Serializable(with = DurationInMinutesSerializer::class) + val penalty_time: Duration? = null, val scoreboard_type: String? = null ) @@ -139,6 +199,8 @@ data class State( @Serializable(with = ClicsTime.InstantSerializer::class) val frozen: Instant?, @Serializable(with = ClicsTime.InstantSerializer::class) + val thawed: Instant?, + @Serializable(with = ClicsTime.InstantSerializer::class) val started: Instant?, @Serializable(with = ClicsTime.InstantSerializer::class) val unfrozen: Instant?, @@ -175,6 +237,13 @@ data class Language( @Serializable data class Award(val id: String) +@Serializable +data class Person( + val id: String, + val name: String, + val role: String +) + @Serializable data class Account( val id: String, diff --git a/src/cds/src/main/kotlin/org/icpclive/cds/clics/api/v1/Events.kt b/src/clics-api/src/main/kotlin/org/icpclive/clics/v1/Events.kt similarity index 97% rename from src/cds/src/main/kotlin/org/icpclive/cds/clics/api/v1/Events.kt rename to src/clics-api/src/main/kotlin/org/icpclive/clics/v1/Events.kt index 3445d46d9..d78def228 100644 --- a/src/cds/src/main/kotlin/org/icpclive/cds/clics/api/v1/Events.kt +++ b/src/clics-api/src/main/kotlin/org/icpclive/clics/v1/Events.kt @@ -1,8 +1,8 @@ -package org.icpclive.cds.clics.api.v1 +package org.icpclive.clics.v1 import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable -import org.icpclive.cds.clics.api.* +import org.icpclive.clics.* @Serializable sealed class Event { diff --git a/src/cds/src/test/kotlin/org/icpclive/cds/clics/ClicksTimeTest.kt b/src/clics-api/src/test/kotlin/org/icpclive/clics/ClicksTimeTest.kt similarity index 90% rename from src/cds/src/test/kotlin/org/icpclive/cds/clics/ClicksTimeTest.kt rename to src/clics-api/src/test/kotlin/org/icpclive/clics/ClicksTimeTest.kt index a6cb8e319..f4db20056 100644 --- a/src/cds/src/test/kotlin/org/icpclive/cds/clics/ClicksTimeTest.kt +++ b/src/clics-api/src/test/kotlin/org/icpclive/clics/ClicksTimeTest.kt @@ -1,22 +1,19 @@ -package org.icpclive.cds.clics +package org.icpclive.clics import kotlinx.serialization.Serializable -import kotlinx.serialization.decodeFromString import kotlinx.serialization.encodeToString import kotlinx.serialization.json.Json -import org.icpclive.cds.clics.ClicsTime -import org.junit.Assert -import org.junit.Test import java.time.ZonedDateTime import java.time.format.DateTimeFormatter import kotlin.math.roundToLong +import kotlin.test.* import kotlin.time.Duration import kotlin.time.Duration.Companion.hours import kotlin.time.Duration.Companion.minutes import kotlin.time.Duration.Companion.seconds import kotlin.time.DurationUnit -class ClicksTimeTest { +object ClicksTimeTest { var years = arrayOf(arrayOf("2001", 2001), arrayOf("2345", 2345)) var months = arrayOf( arrayOf("1", 1), @@ -81,7 +78,7 @@ class ClicksTimeTest { val zdt = ZonedDateTime.parse(isoDateTime, DateTimeFormatter.ISO_DATE_TIME) val expect = zdt.toInstant().toEpochMilli() val result: Long = ClicsTime.parseTime(testTime).toEpochMilliseconds() - Assert.assertEquals("$testTime vs $isoDateTime", expect, result) + assertEquals(expect, result) } } @@ -136,7 +133,7 @@ class ClicksTimeTest { if (pp.second == 1) "+" else "-", hh.second, mm.second, `is`, ns ) val result: Long = ClicsTime.parseRelativeTime(testRelTime).toDouble(DurationUnit.MILLISECONDS).roundToLong() - Assert.assertEquals("$testRelTime vs $isoInstant", expect, result) + assertEquals(expect, result, "$testRelTime vs $isoInstant") } } @@ -156,8 +153,8 @@ class ClicksTimeTest { ClicsTime.parseRelativeTime(durationString) val obj = ObjectWithDuration(duration) val encodedString = Json.encodeToString(obj) - Assert.assertEquals("{\"dur\":\"$durationString\"}", encodedString) - Assert.assertEquals(obj, Json.decodeFromString(encodedString)) + assertEquals("{\"dur\":\"$durationString\"}", encodedString) + assertEquals(obj, Json.decodeFromString(encodedString)) } } } \ No newline at end of file diff --git a/src/common/build.gradle.kts b/src/common/build.gradle.kts index c54377c58..9cc0b0ce5 100644 --- a/src/common/build.gradle.kts +++ b/src/common/build.gradle.kts @@ -1,12 +1,15 @@ plugins { + `java-library` alias(libs.plugins.kotlin.jvm) alias(libs.plugins.kotlin.serialization) } dependencies { - implementation(libs.ktor.client.cio) - implementation(libs.kotlinx.datetime) - implementation(libs.kotlinx.serialization.json) + api(libs.kotlinx.coroutines.core) + api(libs.kotlinx.datetime) + api(libs.kotlinx.serialization.json) + api(libs.slf4j) + runtimeOnly(libs.logback) testImplementation(libs.kotlin.junit) -} +} \ No newline at end of file diff --git a/src/common/src/main/kotlin/org/icpclive/util/FileChangesWatcher.kt b/src/common/src/main/kotlin/org/icpclive/util/FileChangesWatcher.kt index 2a53729c6..17156d156 100644 --- a/src/common/src/main/kotlin/org/icpclive/util/FileChangesWatcher.kt +++ b/src/common/src/main/kotlin/org/icpclive/util/FileChangesWatcher.kt @@ -11,8 +11,7 @@ import java.nio.file.StandardWatchEventKinds import java.nio.file.WatchEvent import java.util.concurrent.TimeUnit import org.slf4j.Logger -import kotlin.io.path.inputStream -import kotlin.io.path.listDirectoryEntries +import kotlin.io.path.* import kotlin.time.Duration.Companion.seconds @@ -46,7 +45,7 @@ fun directoryChangesFlow(path: Path) = }.map { path.resolve(it).toAbsolutePath() } .flowOn(Dispatchers.IO) -fun fileChangesFlow(path: Path) = directoryChangesFlow(path.parent.toAbsolutePath()) +fun fileChangesFlow(path: Path) = directoryChangesFlow(path.toAbsolutePath().parent) .filter { it.endsWith(path.fileName) } @OptIn(ExperimentalSerializationApi::class) @@ -58,4 +57,8 @@ inline fun fileJsonContentFlow(path: Path, logger: Logger) = fileCha }.flowOn(Dispatchers.IO) .logAndRetryWithDelay(5.seconds) { logger.error("Failed to reload ${path.fileName}", it) - } \ No newline at end of file + } + +inline fun fileJsonContentFlow(path: Path, logger: Logger, noData: T) = + fileJsonContentFlow(path, logger) + .onStart { if (!path.exists()) emit(noData) } diff --git a/src/common/src/main/kotlin/org/icpclive/util/FlowUtils.kt b/src/common/src/main/kotlin/org/icpclive/util/FlowUtils.kt index 4a207a82e..16ebd289e 100644 --- a/src/common/src/main/kotlin/org/icpclive/util/FlowUtils.kt +++ b/src/common/src/main/kotlin/org/icpclive/util/FlowUtils.kt @@ -4,7 +4,10 @@ import kotlinx.coroutines.CompletableDeferred import kotlinx.coroutines.channels.BufferOverflow import kotlinx.coroutines.delay import kotlinx.coroutines.flow.* +import kotlinx.datetime.Clock +import kotlinx.datetime.Instant import kotlin.time.Duration +import kotlin.time.Duration.Companion.seconds fun intervalFlow(interval: Duration) = flow { while (true) { @@ -34,4 +37,16 @@ fun CompletableDeferred.completeOrThrow(value: T) { inline fun loopFlow(interval: Duration, crossinline onError: (Throwable) -> Unit, crossinline block: suspend () -> T) = intervalFlow(interval) .map { block() } - .logAndRetryWithDelay(interval) { onError(it) } \ No newline at end of file + .logAndRetryWithDelay(interval) { onError(it) } + +fun Flow>.toTimedFlow(log: (Instant) -> Unit = {}) : Flow { + var lastLoggedTime: Instant = Instant.DISTANT_PAST + return map { (nextEventTime, item) -> + delay(nextEventTime - Clock.System.now()) + if (nextEventTime - lastLoggedTime > 10.seconds) { + log(nextEventTime) + lastLoggedTime = nextEventTime + } + item + } +} diff --git a/src/common/src/main/kotlin/org/icpclive/util/SerializationUtils.kt b/src/common/src/main/kotlin/org/icpclive/util/SerializationUtils.kt index d36f7fc97..853f2c342 100644 --- a/src/common/src/main/kotlin/org/icpclive/util/SerializationUtils.kt +++ b/src/common/src/main/kotlin/org/icpclive/util/SerializationUtils.kt @@ -1,17 +1,22 @@ package org.icpclive.util import kotlinx.datetime.Instant +import kotlinx.datetime.TimeZone import kotlinx.serialization.ExperimentalSerializationApi import kotlinx.serialization.KSerializer +import kotlinx.serialization.SerializationException import kotlinx.serialization.descriptors.PrimitiveKind import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor import kotlinx.serialization.descriptors.SerialDescriptor import kotlinx.serialization.encoding.Decoder import kotlinx.serialization.encoding.Encoder -import kotlinx.serialization.json.Json +import kotlinx.serialization.json.* import java.awt.Color +import java.io.InputStream +import java.lang.Exception import kotlin.time.Duration import kotlin.time.Duration.Companion.milliseconds +import kotlin.time.Duration.Companion.minutes import kotlin.time.Duration.Companion.seconds object DurationInMillisecondsSerializer : KSerializer { @@ -38,6 +43,19 @@ object DurationInSecondsSerializer : KSerializer { } } +object DurationInMinutesSerializer : KSerializer { + override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor("DurationM", PrimitiveKind.LONG) + + override fun serialize(encoder: Encoder, value: Duration) { + encoder.encodeLong(value.inWholeMinutes) + } + + override fun deserialize(decoder: Decoder): Duration { + return decoder.decodeLong().minutes + } +} + + object UnixMillisecondsSerializer : KSerializer { override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor("InstantMs", PrimitiveKind.LONG) @@ -62,6 +80,39 @@ object UnixSecondsSerializer : KSerializer { } } +object HumanTimeSerializer : KSerializer { + override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor("InstantH", PrimitiveKind.STRING) + + override fun serialize(encoder: Encoder, value: Instant) { + encoder.encodeString(value.humanReadable) + } + + override fun deserialize(decoder: Decoder): Instant { + val strValue = decoder.decodeString() + return try { + guessDatetimeFormat(strValue) + } catch (e: IllegalArgumentException) { + throw SerializationException(e.message) + } + } +} + +object TimeZoneSerializer : KSerializer { + override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor("TimeZone", PrimitiveKind.STRING) + + override fun serialize(encoder: Encoder, value: TimeZone) { + encoder.encodeString(value.id) + } + + override fun deserialize(decoder: Decoder): TimeZone { + return try { + TimeZone.of(decoder.decodeString()) + } catch (e: IllegalArgumentException) { + throw SerializationException(e.message) + } + } +} + object ColorSerializer : KSerializer { override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor("Color", PrimitiveKind.STRING) @@ -108,6 +159,22 @@ object ColorSerializer : KSerializer { } } +object RegexSerializer : KSerializer { + override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor("Regex", PrimitiveKind.STRING) + override fun deserialize(decoder: Decoder) : Regex { + val s = decoder.decodeString() + return try { + Regex(s) + } catch (e: Exception) { + throw SerializationException("Failed to compile regexp: $s", e); + } + } + + override fun serialize(encoder: Encoder, value: Regex) { + encoder.encodeString(value.pattern) + } +} + @OptIn(ExperimentalSerializationApi::class) fun defaultJsonSettings() = Json { encodeDefaults = true @@ -117,4 +184,16 @@ fun defaultJsonSettings() = Json { prettyPrint = false useArrayPolymorphism = false explicitNulls = false +} + +@OptIn(ExperimentalSerializationApi::class) +inline fun Json.decodeFromStreamIgnoringComments(stream: InputStream) : T = decodeFromJsonElement(decodeFromStream(stream).cleanFromComments()) +inline fun Json.decodeFromStringIgnoringComments(data: String) : T = decodeFromJsonElement(decodeFromString(data).cleanFromComments()) + +@PublishedApi internal fun JsonElement.cleanFromComments() : JsonElement { + return when (this) { + is JsonArray -> JsonArray(map { it.cleanFromComments() }) + is JsonObject -> JsonObject(filter { !it.key.startsWith("#") }.mapValues { it.value.cleanFromComments() }) + is JsonPrimitive, JsonNull -> this + } } \ No newline at end of file diff --git a/src/frontend/admin/src/App.js b/src/frontend/admin/src/App.js index 636816c2b..29fa836ce 100644 --- a/src/frontend/admin/src/App.js +++ b/src/frontend/admin/src/App.js @@ -9,8 +9,6 @@ import Advertisement from "./components/Advertisement"; import Title from "./components/Title"; import Picture from "./components/Picture"; import TeamView from "./components/TeamView"; -import TeamPVP from "./components/TeamPVP"; -import SplitScreen from "./components/SplitScreen"; import { SnackbarProvider } from "notistack"; import ScoreboardManager from "./components/ScoreboardManager"; import BackendLog from "./components/BackendLog"; @@ -52,8 +50,8 @@ function App() { }/> {/* }/> */} }/> - }/> - }/> + {/*}/>*/} + {/*}/>*/} }/> }/> }/> diff --git a/src/frontend/admin/src/AppNav.js b/src/frontend/admin/src/AppNav.js index a273fc892..3b2b2b98d 100644 --- a/src/frontend/admin/src/AppNav.js +++ b/src/frontend/admin/src/AppNav.js @@ -18,8 +18,8 @@ const pages = { // "Title": "title", // "Picture": "picture", "TeamView": "teamview", - "TeamPVP": "teampvp", - "SplitScreen": "splitscreen", + // "TeamPVP": "teampvp", + // "SplitScreen": "splitscreen", "Scoreboard": "scoreboard", "Ticker": "ticker", "Dashboard": "dashboard", diff --git a/src/frontend/admin/src/components/SplitScreen.js b/src/frontend/admin/src/components/SplitScreen.js deleted file mode 100644 index c6cf4d5f8..000000000 --- a/src/frontend/admin/src/components/SplitScreen.js +++ /dev/null @@ -1,19 +0,0 @@ -import React from "react"; -import { useSnackbar } from "notistack"; -import Container from "@mui/material/Container"; -import { errorHandlerWithSnackbar } from "../errors"; -import { useTeamViewService } from "../services/teamViewWidget"; -import { TeamViewManager } from "./TeamViewManager"; - - -function SplitScreen() { - const { enqueueSnackbar, } = useSnackbar(); - const service = useTeamViewService("splitScreen", errorHandlerWithSnackbar(enqueueSnackbar)); - return ( - - - - ); -} - -export default SplitScreen; diff --git a/src/frontend/admin/src/components/Team.js b/src/frontend/admin/src/components/Team.js deleted file mode 100644 index d874dc3b2..000000000 --- a/src/frontend/admin/src/components/Team.js +++ /dev/null @@ -1,65 +0,0 @@ -import React from "react"; -import PropTypes from "prop-types"; -import { Grid } from "@mui/material"; -import Box from "@mui/material/Box"; -import { grey } from "@mui/material/colors"; - -export const TEAM_FIELD_STRUCTURE = PropTypes.shape({ - id: PropTypes.oneOfType([PropTypes.number, PropTypes.string]).isRequired, - contestSystemId: PropTypes.string.isRequired, - shown: PropTypes.bool.isRequired, - selected: PropTypes.bool.isRequired, - name: PropTypes.string.isRequired, - medias: PropTypes.shape({ - screen: PropTypes.string, - }).isRequired, -}); - -export class Team extends React.Component { - constructor(props) { - super(props); - } - - render() { - return ( - this.props.onClick(this.props.rowData.id)}> - - {this.props.rowData.contestSystemId} - {" : "} - {this.props.rowData.name}{" "} - {/*{this.props.rowData.medias.screen}*/} - - - ); - } -} - -Team.propTypes = { - tStyle: PropTypes.shape({ - activeColor: PropTypes.string, - inactiveColor: PropTypes.string, - selectedColor: PropTypes.string, - }).isRequired, - rowData: TEAM_FIELD_STRUCTURE, - createErrorHandler: PropTypes.func, - isImmutable: PropTypes.bool, - onClick: PropTypes.func.isRequired -}; diff --git a/src/frontend/admin/src/components/TeamPVP.js b/src/frontend/admin/src/components/TeamPVP.js deleted file mode 100644 index bae63141d..000000000 --- a/src/frontend/admin/src/components/TeamPVP.js +++ /dev/null @@ -1,19 +0,0 @@ -import React from "react"; -import Container from "@mui/material/Container"; -import { useSnackbar } from "notistack"; -import { errorHandlerWithSnackbar } from "../errors"; -import { useTeamViewService } from "../services/teamViewWidget"; -import { TeamViewManager } from "./TeamViewManager"; - - -function TeamPVP() { - const { enqueueSnackbar, } = useSnackbar(); - const service = useTeamViewService("pvp", errorHandlerWithSnackbar(enqueueSnackbar)); - return ( - - - - ); -} - -export default TeamPVP; diff --git a/src/frontend/admin/src/components/TeamTable.js b/src/frontend/admin/src/components/TeamTable.js index 2a8f8a104..311af6095 100644 --- a/src/frontend/admin/src/components/TeamTable.js +++ b/src/frontend/admin/src/components/TeamTable.js @@ -1,18 +1,70 @@ import React, { useState } from "react"; import PropTypes from "prop-types"; -import { Box, Button, Tooltip, ButtonGroup } from "@mui/material"; +import { Box, Button, Tooltip, ButtonGroup, Grid } from "@mui/material"; import { lightBlue, grey } from "@mui/material/colors"; -import { Team, TEAM_FIELD_STRUCTURE } from "./Team"; import CollectionsIcon from "@mui/icons-material/Collections"; import TaskStatusIcon from "@mui/icons-material/Segment"; import TeamAchievementIcon from "@mui/icons-material/StarHalf"; import VisibilityOffIcon from "@mui/icons-material/VisibilityOff"; import VisibilityIcon from "@mui/icons-material/Visibility"; +import AutoModeIcon from "@mui/icons-material/AutoMode"; const gridButton = { mx: "2px", }; +export const TEAM_FIELD_STRUCTURE = PropTypes.shape({ + id: PropTypes.oneOfType([PropTypes.number, PropTypes.string]), + contestSystemId: PropTypes.string, + shown: PropTypes.bool.isRequired, + selected: PropTypes.bool.isRequired, + name: PropTypes.string.isRequired, + medias: PropTypes.shape({ + screen: PropTypes.object, + camera: PropTypes.object, + }).isRequired, +}); + +const TeamTableRow = ({ rowData, onClick, tStyle }) => { + return ( + onClick(rowData.id)} + > + {rowData.contestSystemId && `${rowData.contestSystemId} :`} + {rowData.contestSystemId === null && } + {" " + rowData.name} + + ); +}; + +TeamTableRow.propTypes = { + tStyle: PropTypes.shape({ + activeColor: PropTypes.string, + inactiveColor: PropTypes.string, + selectedColor: PropTypes.string, + }).isRequired, + rowData: TEAM_FIELD_STRUCTURE, + createErrorHandler: PropTypes.func, + isImmutable: PropTypes.bool, + onClick: PropTypes.func.isRequired +}; + const CompactSwitchIconButton = ({ propertyName, disabled, isShown, onClick, children, sx, noVisibilityIcon }) => ( @@ -71,23 +144,30 @@ export function TeamViewSettingsPanel({ mediaTypes, selectedMediaType, canShow, {isAchievementShown !== undefined && setIsAchievementShown(s => !s)}>} - + {showHideButton && ( + + )} ); -} +}; + TeamViewSettingsPanel.propTypes = { mediaTypes: PropTypes.arrayOf(PropTypes.shape({ "text":PropTypes.string.isRequired, "mediaType":PropTypes.any })), - selectedMediaType: PropTypes.any, + selectedMediaTypes: PropTypes.arrayOf(PropTypes.string), isSomethingSelected: PropTypes.bool, canShow: PropTypes.bool, // todo: make req isPossibleToHide: PropTypes.bool, + showHideButton: PropTypes.bool, canHide: PropTypes.bool, // todo: make req onShowTeam: PropTypes.func.isRequired, - onHideTeam: PropTypes.func.isRequired, + onHideTeam: PropTypes.func, isStatusShown: PropTypes.bool, setIsStatusShown: PropTypes.func, isAchievementShown: PropTypes.bool, @@ -133,5 +213,5 @@ SelectTeamTable.defaultProps = { activeColor: lightBlue[100], inactiveColor: "white", }, - RowComponent: Team, + RowComponent: TeamTableRow, }; diff --git a/src/frontend/admin/src/components/TeamView.js b/src/frontend/admin/src/components/TeamView.js index e934346b3..0820eab54 100644 --- a/src/frontend/admin/src/components/TeamView.js +++ b/src/frontend/admin/src/components/TeamView.js @@ -1,18 +1,487 @@ -import React from "react"; -import Container from "@mui/material/Container"; - -import "../App.css"; +import React, { useCallback, useEffect, useMemo, useState } from "react"; +import { + Container, + Box, + ToggleButtonGroup, + ToggleButton, + Grid, + Paper, + Stack, + Button, + ButtonGroup, + Tooltip, + Switch, + TextField, + InputAdornment, + FormLabel, + FormControl, + FormControlLabel, + ThemeProvider, + createTheme, +} from "@mui/material"; import { useSnackbar } from "notistack"; import { errorHandlerWithSnackbar } from "../errors"; -import { TeamViewManager } from "./TeamViewManager"; -import { useTeamViewService } from "../services/teamViewWidget"; +import { TeamViewService, useTeamViewService } from "../services/teamViewWidget"; +import SingleTeamViewIcon from "@mui/icons-material/WebAsset"; +import PVPTeamViewIcon from "@mui/icons-material/Splitscreen"; +import SplitTeamViewIcon from "@mui/icons-material/GridView"; +import TopIcon from "@mui/icons-material/VerticalAlignTop"; +import BottomIcon from "@mui/icons-material/VerticalAlignBottom"; +import TopLeftIcon from "@mui/icons-material/NorthWest"; +import TopRightIcon from "@mui/icons-material/NorthEast"; +import BottomLeftIcon from "@mui/icons-material/SouthWest"; +import BottomRightIcon from "@mui/icons-material/SouthEast"; +import VisibilityIcon from "@mui/icons-material/Visibility"; +import VisibilityOffIcon from "@mui/icons-material/VisibilityOff"; +import ArrowDropDown from "@mui/icons-material/ArrowDropDown"; +import { SelectTeamTable, TEAM_FIELD_STRUCTURE, TeamViewSettingsPanel } from "./TeamTable"; +import PropTypes from "prop-types"; + +const AUTOMODE_TEAM = { + "id": null, + "name": "Automode", + "shortName": "Automode", + "contestSystemId": null, + "groups": [], + "medias": {}, + "shown": false, +}; + +const useTeamviewService = (service, setStatus) => { + const loadStatus = useMemo(() => { + return () => service.loadElements().then(s => setStatus(st => ({ ...st, ...s }))); + }, [service, setStatus]); + useEffect(() => loadStatus(), []); + useEffect(() => { + service.addReloadDataHandler(loadStatus); + return () => service.deleteReloadDataHandler(loadStatus); + }, [service, loadStatus]); +}; + +const isTeamSatisfiesSearch = (team, searchValue) => { + if (searchValue === "" || team.id === null) { + return true; + } + return (team.contestSystemId + " : " + team.shortName + " : " + team.name).toLowerCase().includes(searchValue); +}; + +const useTeamsList = (rawTeams, status) => { + const [selectedTeamId, setSelectedTeamId] = useState(undefined); + const teamsWithStatus = useMemo( + () => rawTeams.map(t => ({ + ...t, + shown: Object.values(status).some(s => s.shown && s.settings.teamId === t.id), + selected: t.id === selectedTeamId, + })), + [rawTeams, status, selectedTeamId]); + + const [searchValue, setSearchValue] = useState(""); + + const filteredTeams = useMemo(() => { + return teamsWithStatus.filter(t => isTeamSatisfiesSearch(t, searchValue)); + }, [teamsWithStatus, searchValue]); + return { teams: filteredTeams, selectedTeamId, setSelectedTeamId, searchValue, setSearchValue }; +}; + +const teamViewTheme = createTheme({ + components: { + MuiPaper: { + styleOverrides: { + root: ({ theme }) => ({ + padding: theme.spacing(2), + marginBottom: theme.spacing(1), + }), + }, + }, + MuiButton: { + defaultProps: { + size: "small", + }, + }, + MuiButtonGroup: { + defaultProps: { + size: "small", + }, + }, + MuiButtonBase: { + styleOverrides: { + root: { + margin: "0 !important", + }, + }, + }, + }, +}); + +const VariantSelect = ({ variant, setVariant }) => { + return ( + v && setVariant(v)} + > + Single + PVP + SplitScreen + + ); +}; + +VariantSelect.propTypes = { + variant: PropTypes.oneOf(["single", "pvp", "splitScreen"]).isRequired, + setVariant: PropTypes.func.isRequired, +}; + +const InstanceStatus = ({ instanceId, Icon, status, teams, selectedInstance, onShow, onHide }) => { + const iStatus = status[instanceId]; + const shownTeam = useMemo( + () => teams.find(t => t.id === iStatus?.settings?.teamId), + [teams, status]); + const isShowButtonDisabled = !(selectedInstance === instanceId || selectedInstance === undefined); + return ( + + + {Icon && } + + + + + + Team: {shownTeam?.name ?? "Auto"} + Media: {iStatus?.settings?.mediaTypes?.join(", ")} + + ); +}; + +InstanceStatus.propTypes = { + instanceId: PropTypes.string, + Icon: PropTypes.elementType.isRequired, + status: PropTypes.object.isRequired, + teams: PropTypes.arrayOf(TEAM_FIELD_STRUCTURE).isRequired, + selectedInstance: PropTypes.string, + onShow: PropTypes.func.isRequired, + onHide: PropTypes.func.isRequired, +}; + +const InstancesManager = ({ variant, ...props }) => { + return ( + <> + {variant === "single" && ( + + )} + {variant === "pvp" && ( + <> + + + + )} + {variant === "splitScreen" && ( + <> + + + + + + + + + + + + + + + + + + )} + + ); +}; + +InstancesManager.propTypes = { + variant: PropTypes.string, + instanceId: PropTypes.string, + Icon: PropTypes.node, + status: PropTypes.object.isRequired, + teams: PropTypes.arrayOf(TEAM_FIELD_STRUCTURE).isRequired, + selectedInstance: PropTypes.string, + onShow: PropTypes.func.isRequired, + onHide: PropTypes.func.isRequired, +}; + +const TeamViewInstanceStatus = ({ instanceName, status, teams }) => { + const shownTeam = useMemo( + () => teams.find(t => t.id === status.settings.teamId), + [teams, status]); + return ( + + Instance {instanceName ?? "SINGLE"} {status.shown && "shown"} + Team: {shownTeam?.name ?? "Auto"} + Media: {status.settings.mediaTypes?.join(", ")} + + ); +}; + +TeamViewInstanceStatus.propTypes = { + instanceName: PropTypes.any, + status: PropTypes.shape({ + shown: PropTypes.bool.isRequired, + settings: PropTypes.shape({ + teamId: PropTypes.number, + mediaTypes: PropTypes.arrayOf(PropTypes.string.isRequired), + }).isRequired, + }).isRequired, + teams: PropTypes.arrayOf(TEAM_FIELD_STRUCTURE).isRequired, +}; + +const MultipleModeSwitch = ({ currentService, setIsMultipleMode }) => { + return ( + + + + Mulitple mode + + setIsMultipleMode(newV)} /> + + + + + + + ); +}; + +MultipleModeSwitch.propTypes = { + currentService: PropTypes.instanceOf(TeamViewService).isRequired, + setIsMultipleMode: PropTypes.func.isRequired, +}; + +const TeamViewManager = ({ singleService, pvpService, splitService }) => { + const [status, setStatus] = useState({}); + useTeamviewService(singleService, setStatus); + useTeamviewService(pvpService, setStatus); + useTeamviewService(splitService, setStatus); + + const [variant, setVariant] = useState("single"); + useEffect(() => { + if (Object.values(status).length === 7 && variant === undefined) { + const shownInstance = Object.entries(status).find(([, i]) => i.shown); + if (!shownInstance || shownInstance[0] === null) { + setVariant("single"); + } else if (shownInstance[0].startsWith("PVP")) { + setVariant("pvp"); + } else { + setVariant("splitScreen"); + } + } + }, [status]); + + const currentService = useMemo(() => { + if (variant === "splitScreen") { + return splitService; + } else if (variant === "pvp") { + return pvpService; + } + return singleService; + }, [variant, singleService, pvpService, splitService]); + + const [rawTeams, setRawTeams] = useState([]); + const { teams, selectedTeamId, setSelectedTeamId, searchValue, setSearchValue } = useTeamsList(rawTeams, status); + useEffect(() => { + singleService.teams().then((ts) => setRawTeams([AUTOMODE_TEAM, ...ts])); + }, [singleService]); + + const [isMultipleMode, setIsMultipleMode] = useState(false); + + const [selectedInstance, setSelectedInstance] = useState(undefined); + const [mediaTypes1, setMediaTypes1] = useState(undefined); + const [mediaTypes2, setMediaTypes2] = useState(undefined); + const [statusShown, setStatusShown] = useState(true); + const [achievementShown, setAchievementShown] = useState(false); + + const onShow = useCallback(() => { + const settings = { + mediaTypes: [mediaTypes1 && mediaTypes1[0], mediaTypes2 && mediaTypes2[0]].filter(i => i), + teamId: selectedTeamId, + showTaskStatus: statusShown, + showAchievement: achievementShown, + }; + if (isMultipleMode) { + currentService.editPreset(selectedInstance, settings); + } else { + currentService.showPresetWithSettings(selectedInstance, settings); + } + setSelectedInstance(undefined); + setSelectedTeamId(undefined); + }, [selectedInstance, currentService, isMultipleMode, mediaTypes1, + mediaTypes2, selectedTeamId, statusShown, achievementShown]); + + const onInstanceSelect = useCallback((instance) => () => { + if (instance === selectedInstance) { + setSelectedInstance(undefined); + } else { + setSelectedInstance(instance); + } + }, [selectedInstance]); + + const onInstanceHide = useCallback((instance) => () => { + currentService.hidePreset(instance); + }, [currentService]); + + const selectedTeamName = useMemo(() => { + if (selectedTeamId === undefined) { + return ""; + } + return teams.find(team => team.id === selectedTeamId).name; + }, [teams, selectedTeamId]); + + return ( + + + + + + + + {selectedInstance !== undefined && + + {selectedTeamId === undefined && ( + + setSearchValue(e.target.value.toLowerCase())} + defaultValue={searchValue} + size="small" + margin="none" + label="Search" + variant="outlined" + fullWidth + /> + + + )} + {selectedTeamId !== undefined && ( + + Team name + + + + ), + onClick: () => setSelectedTeamId(undefined), + }} + /> + + )} + + {selectedTeamId !== undefined && ( + <> + + Main content + setMediaTypes1(ts)} + showHideButton={false} + selectedMediaTypes={mediaTypes1} + /> + + + Additional content + setMediaTypes2(ts)} + showHideButton={false} + selectedMediaTypes={mediaTypes2} + /> + + + Show status + setStatusShown(v)}/>} + label={"Display the name of the team, their current ranking, and details about their tasks"} + /> + + + Show achievements + setAchievementShown(v)} + /> + )} + label={"Enable this switch to show contestant achievements"} + /> + + + + + + + + )} + + } + + ); +}; + +TeamViewManager.propTypes = { + singleService: PropTypes.instanceOf(TeamViewService).isRequired, + pvpService: PropTypes.instanceOf(TeamViewService).isRequired, + splitService: PropTypes.instanceOf(TeamViewService).isRequired, +}; + function TeamView() { - const { enqueueSnackbar, } = useSnackbar(); - const service = useTeamViewService("singe", errorHandlerWithSnackbar(enqueueSnackbar)); + const { enqueueSnackbar, } = useSnackbar(); + const service = useTeamViewService("single", errorHandlerWithSnackbar(enqueueSnackbar)); + const pvpService = useTeamViewService("pvp", errorHandlerWithSnackbar(enqueueSnackbar)); + const splitService = useTeamViewService("splitScreen", errorHandlerWithSnackbar(enqueueSnackbar)); + return ( - + + + ); } diff --git a/src/frontend/admin/src/components/TeamViewManager.js b/src/frontend/admin/src/components/TeamViewManager.js deleted file mode 100644 index 1bffa691d..000000000 --- a/src/frontend/admin/src/components/TeamViewManager.js +++ /dev/null @@ -1,163 +0,0 @@ -import { Box, Button, ButtonGroup, Grid, Switch, TextField, Tooltip } from "@mui/material"; -import React, { useEffect, useMemo, useState } from "react"; -import { SelectTeamTable, TeamViewSettingsPanel } from "./TeamTable"; -import PropTypes from "prop-types"; -import { TeamViewService } from "../services/teamViewWidget"; - - -export const TeamViewInstanceManager = ({ - instanceId, - status, - teams, - selectedTeamId, - onShow, - onHide, - mediaTypes, -}) => -{ - const [isAutoMode, setIsAutoMode] = useState(status.settings.teamId === undefined); - const shownTeam = useMemo( - () => teams.find(t => t.id === status.settings.teamId), - [teams, status]); - const [isStatusShown, setIsStatusShown] = useState(instanceId === null ? true : undefined); - const [isAchievementShown, setIsAchievementShown] = useState(instanceId === null ? false : undefined); - return ( - {instanceId && Instance {instanceId}} - Automatically: - setIsAutoMode(newValue)} checked={isAutoMode}/> - - Shown team: {shownTeam?.name ?? "Auto"} - Media type: {status.settings.mediaTypes?.join(", ")} - - onShow({ - mediaTypes: mediaTypes, - teamId: isAutoMode ? undefined : selectedTeamId, - showTaskStatus: isStatusShown, - showAchievement: isAchievementShown })} - onHideTeam={onHide} offerMultiple={true} - isStatusShown={isStatusShown} setIsStatusShown={setIsStatusShown} - isAchievementShown={isAchievementShown} setIsAchievementShown={setIsAchievementShown} - /> - - ); -}; -TeamViewInstanceManager.propTypes = { - instanceId: PropTypes.any, - status: PropTypes.shape({ - shown: PropTypes.bool.isRequired, - settings: PropTypes.shape({ - teamId: PropTypes.number, - mediaTypes: PropTypes.arrayOf(PropTypes.string.isRequired), - }).isRequired, - }).isRequired, - teams: PropTypes.arrayOf(PropTypes.shape({ - id: PropTypes.number.isRequired, - name: PropTypes.string.isRequired, - })), - selectedTeamId: PropTypes.number, - onShow: PropTypes.func, - onHide: PropTypes.func, - mediaTypes: TeamViewSettingsPanel.propTypes.mediaTypes, -}; - -export const TeamViewManager = ({ service, mediaTypes }) => { - const [teams, setTeams] = useState([]); - useEffect(() => service.teams().then(setTeams), - [service]); - - const [selectedTeamId, setSelectedTeamId] = useState(undefined); - - const [status, setStatus] = useState({}); - const loadStatus = useMemo(() => - () => service.loadElements().then(setStatus), - [service, setStatus]); - useEffect(() => loadStatus(), []); - useEffect(() => { - service.addReloadDataHandler(loadStatus); - return () => service.deleteReloadDataHandler(loadStatus); - }, [service, loadStatus]); - - const teamsWithStatus = useMemo( - () => teams.map(t => ({ ...t, - shown: Object.values(status).some(s => s.shown && s.settings.teamId === t.id), - selected: t.id === selectedTeamId, - })), - [teams, status, selectedTeamId]); - - const [searchValue, setSearchValue] = useState(""); - const filteredTeams = useMemo(() => - teamsWithStatus.filter(t => (searchValue === "" || (t.contestSystemId + " : " + t.name).toLowerCase().includes(searchValue))), - [teamsWithStatus, searchValue]); - - const [isMultipleMode, setIsMultipleMode] = useState(false); - const selectTeam = (teamId) => setSelectedTeamId(teamId); - - const onShowInstance = (instanceId) => (settings) => { - if (isMultipleMode) { - service.editPreset(instanceId, settings); - } else { - service.showPresetWithSettings(instanceId, settings); - } - }; - - const onHideInstance = (instanceId) => () => { - service.hidePreset(instanceId); - }; - - return ( - - {service.instances.filter(id => status[id] !== undefined).map(id => - - - - )} - - - - - Multiple mode setIsMultipleMode(newV)}/> - - - - - - - setSearchValue(e.target.value.toLowerCase())} - defaultValue={""} - id="Search field" - size="small" - fullWidth - margin="none" - label="Search" - variant="outlined" - InputProps={{}} - /> - - - ); -}; -TeamViewManager.propTypes = { - service: PropTypes.instanceOf(TeamViewService).isRequired, - mediaTypes: PropTypes.arrayOf(PropTypes.string.isRequired), -}; diff --git a/src/frontend/admin/src/components/Title.js b/src/frontend/admin/src/components/Title.js index 2e5725acd..79611817f 100644 --- a/src/frontend/admin/src/components/Title.js +++ b/src/frontend/admin/src/components/Title.js @@ -76,9 +76,17 @@ ParamsLine.propTypes = { pKey: PropTypes.string.isRequired, pValue: PropTypes.an const paramsDataToString = (value) => Object.entries(value).map(([k, v]) => k + ": " + v).join("\n"); +const splitKeyValue = (string) => { + const splitIndex = string.indexOf(":"); + const k = string.substring(0, splitIndex); + const rest = string.substring(splitIndex + 1); + const v = rest.startsWith(" ") ? rest.substring(1) : rest; + return [k, v]; +}; + const parseParamsData = input => input.split("\n") - .map(line => line.split(/:\W?/, 2)) + .map(line => splitKeyValue(line)) .filter(r => r.length >= 2) .reduce((ac, [ k, v ]) => ({ ...ac, [k]: v }), {}); diff --git a/src/frontend/admin/src/services/teamViewWidget.js b/src/frontend/admin/src/services/teamViewWidget.js index 6977196f1..4fc82a79c 100644 --- a/src/frontend/admin/src/services/teamViewWidget.js +++ b/src/frontend/admin/src/services/teamViewWidget.js @@ -16,6 +16,7 @@ export class TeamViewService extends AbstractWidgetService { constructor(variant, errorHandler, listenWS = true) { const [instances, apiPath] = getTeamViewVariantParams(variant); super("/" + apiPath, errorHandler, listenWS); + this.variant = variant; this.instances = instances; } @@ -27,15 +28,11 @@ export class TeamViewService extends AbstractWidgetService { return presetId == null ? "" : "/" + presetId; } - loadOne(element) { - return this.apiGet(this.presetSubPath(element)).catch(this.errorHandler("Failed to load " + element + " info")); - } - loadElements() { - return Promise.all( - this.instances.map(id => - this.loadOne(id).then(r => [id, r]))) - .then(els => els.reduce((s, el) => ({ ...s, [el[0]]: el[1] }), {})); + if (this.variant === "single") { + return this.apiGet("").then(r => ({ [null]: r })).catch(this.errorHandler("Failed to load status")); + } + return this.apiGet("").catch(this.errorHandler("Failed to load status")); } editPreset(element, settings) { diff --git a/src/frontend/build.gradle.kts b/src/frontend/build.gradle.kts index 400058b94..702a89206 100644 --- a/src/frontend/build.gradle.kts +++ b/src/frontend/build.gradle.kts @@ -17,16 +17,22 @@ tasks { inputs.file("overlay/package.json") } named("npm_run_buildOverlay") { + outputs.cacheIf { true } environment.set(mapOf("PUBLIC_URL" to "/overlay", "BUILD_PATH" to "build")) inputs.dir("overlay/src") inputs.file("overlay/index.html") + inputs.file("package.json") + inputs.file("package-lock.json") inputs.file("overlay/package.json") outputs.dir("overlay/build") } named("npm_run_buildAdmin") { + outputs.cacheIf { true } environment.set(mapOf("PUBLIC_URL" to "/admin")) inputs.dir("admin/src") inputs.dir("admin/public") + inputs.file("package.json") + inputs.file("package-lock.json") inputs.file("admin/package.json") outputs.dir("admin/build") } diff --git a/src/frontend/overlay/src/components/atoms/ContestCells.jsx b/src/frontend/overlay/src/components/atoms/ContestCells.jsx index 3cfb8d4b9..0cb31fd33 100644 --- a/src/frontend/overlay/src/components/atoms/ContestCells.jsx +++ b/src/frontend/overlay/src/components/atoms/ContestCells.jsx @@ -24,6 +24,21 @@ export const formatScore = (score, digits = 2) => { return score?.toFixed((score - Math.floor(score)) > 0 ? digits : 0); }; +export const formatPenalty = (contestInfo, penalty) => { + if (penalty === undefined || penalty === null) { + return ""; + } + let mode = contestInfo.penaltyRoundingMode; + if (mode === "sum_in_seconds" || mode === "last") { + return Math.floor(penalty / 60) + ":" + (penalty % 60 < 10 ? "0" : "") + (penalty % 60); + } else { + return Math.floor(penalty / 60); + } +}; + +export const needPenalty = (contestInfo) => contestInfo?.penaltyRoundingMode !== "zero"; + + export const ProblemCellWrap = styled(Cell)` border-bottom: ${props => props.probColor} ${CELL_PROBLEM_LINE_WIDTH} solid; `; diff --git a/src/frontend/overlay/src/components/organisms/widgets/PVP.jsx b/src/frontend/overlay/src/components/organisms/widgets/PVP.jsx index 58de3917e..d7790d92c 100644 --- a/src/frontend/overlay/src/components/organisms/widgets/PVP.jsx +++ b/src/frontend/overlay/src/components/organisms/widgets/PVP.jsx @@ -11,7 +11,7 @@ import { } from "../../../config"; import { SCOREBOARD_TYPES } from "../../../consts"; import { Cell } from "../../atoms/Cell"; -import { formatScore, RankCell, TextShrinkingCell } from "../../atoms/ContestCells"; +import { formatPenalty, formatScore, needPenalty, RankCell, TextShrinkingCell } from "../../atoms/ContestCells"; import { StarIcon } from "../../atoms/Star"; import { TeamWebRTCGrabberVideoWrapper, TeamWebRTCProxyVideoWrapper } from "../holder/TeamViewHolder"; // import { ScoreboardIOITaskCell } from "./Scoreboard"; @@ -232,9 +232,9 @@ const TeamInfo = ({ teamId }) => { {scoreboardData === null ? null : formatScore(scoreboardData?.totalScore, 1)} - {contestData.resultType !== "IOI" && + {needPenalty(contestData) && - {scoreboardData?.penalty} + {scoreboardData === null ? null : formatPenalty(contestData, scoreboardData.penalty)} } ; diff --git a/src/frontend/overlay/src/redux/contest/contestInfo.jsx b/src/frontend/overlay/src/redux/contest/contestInfo.jsx index 7964dec44..442333941 100644 --- a/src/frontend/overlay/src/redux/contest/contestInfo.jsx +++ b/src/frontend/overlay/src/redux/contest/contestInfo.jsx @@ -25,12 +25,14 @@ export function contestInfoReducer(state = initialState, action) { switch (action.type) { case ActionTypes.CONTEST_INFO_SET: _.forEach(action.payload.info.teams, (team) => getTextWidth(team.shortName, GLOBAL_DEFAULT_FONT)); + let sortedProblems = action.payload.info.problems.sort((a, b) => a.ordinal - b.ordinal); return { ...state, info: { ...action.payload.info, + problems: sortedProblems, teamsId: _.keyBy(action.payload.info.teams, "id"), - problemsId: _.keyBy(action.payload.info.problems, "id") + problemsId: _.keyBy(sortedProblems, "id") } }; default: diff --git a/src/reactions-bot/build.gradle.kts b/src/reactions-bot/build.gradle.kts index b393342af..9bffd97cf 100644 --- a/src/reactions-bot/build.gradle.kts +++ b/src/reactions-bot/build.gradle.kts @@ -1,3 +1,5 @@ +import org.gradle.kotlin.dsl.run as runTask + plugins { application alias(libs.plugins.kotlin.jvm) @@ -5,46 +7,39 @@ plugins { alias(libs.plugins.shadow) } -version = rootProject.findProperty("build_version")!! - application { - mainClass.set("org.icpclive.reacbot.BotKt") + mainClass = "org.icpclive.reacbot.BotKt" } -tasks { - jar { - archiveFileName.set("reactions-bot-${project.version}-part.jar") - } - shadowJar { - archiveFileName.set("reactions-bot-${project.version}.jar") - } - named("run") { - val args = mutableListOf() - project.properties["live.dev.token"]?.let { args += listOf("-token", it.toString()) } - project.properties["live.dev.video"]?.let { args += listOf("-video", it.toString()) } - this.args = args - this.workingDir(rootDir.resolve("reactions-bot")) - } - task("release") { - from(shadowJar) - destinationDir = rootProject.rootDir.resolve("artifacts") - } +tasks.runTask { + val args = mutableListOf() + project.properties["live.dev.token"]?.let { args += listOf("-token", it.toString()) } + project.properties["live.dev.video"]?.let { args += listOf("-video", it.toString()) } + this.args = args + this.workingDir(rootDir.resolve("reactions-bot")) } repositories { + // Since we're declaring this, we are overriding repositories in the settings.gradle.kts mavenCentral() - maven { setUrl("https://jitpack.io") } + maven { + name = "jitpack" + url = uri("https://jitpack.io") + content { + // This limits this repo to this group + includeGroup("io.github.kotlin-telegram-bot.kotlin-telegram-bot") + } + } } dependencies { implementation(projects.cds) implementation(projects.common) - implementation(libs.kotlinx.serialization.json) - implementation(libs.kotlinx.coroutines.core) implementation(libs.cli) - implementation(libs.db.sqlite) implementation(libs.exposed.core) implementation(libs.exposed.dao) implementation(libs.exposed.jdbc) + implementation(libs.retrofit) implementation(libs.telegram.bot) -} + runtimeOnly(libs.db.sqlite) +} \ No newline at end of file diff --git a/src/reactions-bot/src/main/kotlin/org/icpclive/reacbot/Bot.kt b/src/reactions-bot/src/main/kotlin/org/icpclive/reacbot/Bot.kt index de3feecf5..88d79ae81 100644 --- a/src/reactions-bot/src/main/kotlin/org/icpclive/reacbot/Bot.kt +++ b/src/reactions-bot/src/main/kotlin/org/icpclive/reacbot/Bot.kt @@ -8,7 +8,6 @@ import com.github.ajalt.clikt.parameters.options.required import com.github.ajalt.clikt.parameters.types.int import kotlinx.coroutines.* import kotlinx.coroutines.flow.* -import java.io.FileInputStream import java.util.* import com.github.kotlintelegrambot.bot import com.github.kotlintelegrambot.Bot @@ -24,21 +23,18 @@ import com.github.kotlintelegrambot.logging.LogLevel import org.icpclive.api.* import org.icpclive.cds.InfoUpdate import org.icpclive.cds.RunUpdate -import org.icpclive.cds.adapters.filterUseless -import org.icpclive.cds.adapters.processHiddenTeamsAndGroups -import org.icpclive.cds.adapters.removeFrozenSubmissions -import org.icpclive.cds.adapters.withRunsBefore -import org.icpclive.cds.common.setAllowUnsecureConnections -import org.icpclive.cds.getContestDataSourceAsFlow +import org.icpclive.cds.adapters.* +import org.icpclive.cds.settings.parseFileToCdsSettings import java.nio.file.Path import kotlin.io.path.createDirectories class Bot(private val config: Config) { @OptIn(DelicateCoroutinesApi::class) private val reactionsProcessingPool = newFixedThreadPoolContext(config.loaderThreads, "ReactionsProcessing") - private val cds = getContestDataSourceAsFlow( - getProperties(config.eventPropertiesFile), - ).withRunsBefore() + private val cds = parseFileToCdsSettings( + Path.of(config.settingsFile), + ).toFlow(emptyMap()) + .contestState() .filterUseless() .removeFrozenSubmissions() .processHiddenTeamsAndGroups() @@ -69,9 +65,9 @@ class Bot(private val config: Config) { var caption: String? = null if (sendAdditionalInfo) { val ci = runBlocking { contestInfo.await().value } - ci.teams.find { it.id == reaction.teamId }?.let { team -> - ci.problems.find { it.id == reaction.problemId }?.let { problem -> - caption = team.name + ", problem " + problem.letter + ci.teams[reaction.teamId]?.let { team -> + ci.problems[reaction.problemId]?.let { problem -> + caption = "${team.fullName}, problem ${problem.displayName}" } } } @@ -132,7 +128,6 @@ class Bot(private val config: Config) { } fun run(scope: CoroutineScope) { - setAllowUnsecureConnections(true) val loaded = if (config.disableCdsLoader) emptyFlow() else cds.shareIn(scope, SharingStarted.Eagerly, Int.MAX_VALUE) val runs = loaded.filterIsInstance().map { it.newInfo } scope.launch { @@ -153,14 +148,8 @@ class Bot(private val config: Config) { } } -private fun getProperties(fileName: String): Properties { - val properties = Properties() - FileInputStream(fileName).use { properties.load(it) } - return properties -} - class BotCommand : CliktCommand() { - private val events by option(help = "Event.properties file path").default("./events.properties") + private val settings by option(help = "settings file path").default("./settings.json") private val disableCds by option(help = "Enable loading events from cds").flag() private val token by option(help = "Telegram bot token").required() private val threads by option("--threads", "-t", help = "Count of video converter and loader threads").int().default(8) @@ -171,7 +160,7 @@ class BotCommand : CliktCommand() { runBlocking { Bot( Config( - eventPropertiesFile = events, + settingsFile = settings, disableCdsLoader = disableCds, telegramToken = token, loaderThreads = threads, diff --git a/src/reactions-bot/src/main/kotlin/org/icpclive/reacbot/Config.kt b/src/reactions-bot/src/main/kotlin/org/icpclive/reacbot/Config.kt index 0ae25792b..a835b541a 100644 --- a/src/reactions-bot/src/main/kotlin/org/icpclive/reacbot/Config.kt +++ b/src/reactions-bot/src/main/kotlin/org/icpclive/reacbot/Config.kt @@ -2,7 +2,7 @@ package org.icpclive.reacbot class Config( - val eventPropertiesFile: String, + val settingsFile: String, val disableCdsLoader: Boolean, val telegramToken: String, val loaderThreads: Int, diff --git a/src/schema-generator/build.gradle.kts b/src/schema-generator/build.gradle.kts new file mode 100644 index 000000000..c5e190d8a --- /dev/null +++ b/src/schema-generator/build.gradle.kts @@ -0,0 +1,89 @@ +plugins { + alias(libs.plugins.kotlin.jvm) + alias(libs.plugins.kotlin.serialization) +} + +val schemasExportLocation = rootProject.rootDir.resolve("schemas/") +val tmpLocation = buildDir.resolve("tmp/") +val schemasGenerationLocation = tmpLocation.resolve("schemas/") +val schemasGatherLocation = buildDir.resolve("schemas/") + +fun String.capitalize(): String = replaceFirstChar { it.uppercaseChar() } + +fun TaskContainerScope.genTask( + classPackage: String, + className: String, + fileName: String, + title: String +): Pair, TaskProvider> { + val fullFileName = "$fileName.schema.json" + val generatedSchemaFile = schemasGenerationLocation.resolve(fullFileName) + val repositorySchemaFile = schemasExportLocation.resolve(fullFileName) + + val genTask = register("generateSchema${className.capitalize()}") { + dependsOn(assemble) + classpath = sourceSets.main.get().runtimeClasspath + mainClass = "org.icpclive.generator.schema.GenKt" + workingDir = tmpLocation + outputs.file(generatedSchemaFile) + args = listOf( + "$classPackage.$className", + "--output", generatedSchemaFile.relativeTo(workingDir).path, + "--title", title + ) + } + val checkTask = register("testSchema${className.capitalize()}") { + group = "verification" + dependsOn(genTask) + inputs.files(generatedSchemaFile, repositorySchemaFile) + doLast { + val newContent = generatedSchemaFile.readText() + val oldContent = repositorySchemaFile.readText() + if (newContent != oldContent) { + throw IllegalStateException("Json schema for $className is outdated. Run `./gradlew :${project.name}:gen` to fix it.") + } + } + } + return genTask to checkTask +} + + +tasks { + val genAndCheckTasks = listOf( + genTask("org.icpclive.api.tunning", "AdvancedProperties", "advanced", "ICPC live advanced settings"), + genTask("org.icpclive.cds.settings", "CDSSettings", "settings", "ICPC live settings"), + ) + val genTasks = genAndCheckTasks.map { it.first } + val checkTasks = genAndCheckTasks.map { it.second } + + // Gradle for inter-project dependencies uses outgoing variants. Those are a bit hard to properly set up, so this + // project just uses cross-project tasks dependencies (that from the looks of configuration cache aren't welcome, + // but they do work and IMHO they aren't going to be deprecated anytime soon). However, I've not found a way to + // create a pseudo-task that just combines the output of two other tasks, so let's just copy those two files one + // more time. + val generateSchemas = register("generateAllSchemas") { + group = "build" + destinationDir = schemasGatherLocation + + from(genTasks) + } + + register("gen") { + destinationDir = schemasExportLocation + + from(generateSchemas) + } + + check { + dependsOn(checkTasks) + } +} + + +dependencies { + implementation(projects.common) + implementation(libs.cli) + runtimeOnly(projects.cds) + + testImplementation(libs.kotlin.junit) +} \ No newline at end of file diff --git a/src/schema-generator/src/main/kotlin/gen.kt b/src/schema-generator/src/main/kotlin/gen.kt new file mode 100644 index 000000000..bc18b2bbd --- /dev/null +++ b/src/schema-generator/src/main/kotlin/gen.kt @@ -0,0 +1,147 @@ +@file:OptIn(ExperimentalSerializationApi::class) + +package org.icpclive.generator.schema + + +import com.github.ajalt.clikt.core.CliktCommand +import com.github.ajalt.clikt.parameters.arguments.argument +import com.github.ajalt.clikt.parameters.options.option +import com.github.ajalt.clikt.parameters.options.required +import kotlinx.serialization.* +import kotlinx.serialization.descriptors.* +import kotlinx.serialization.json.* +import java.io.File + +fun PrimitiveKind.toJsonTypeName(): String = when (this) { + PrimitiveKind.BOOLEAN -> "boolean" + PrimitiveKind.BYTE -> "integer" + PrimitiveKind.CHAR -> "integer" + PrimitiveKind.DOUBLE -> "number" + PrimitiveKind.FLOAT -> "number" + PrimitiveKind.INT -> "integer" + PrimitiveKind.LONG -> "integer" + PrimitiveKind.SHORT -> "integer" + PrimitiveKind.STRING -> "string" +} + +fun SerialDescriptor.toJsonSchemaType(extras: Map = emptyMap(), extraTypeProperty: String? = null) : JsonElement { + val kind = kind + val data = when (kind) { + PolymorphicKind.OPEN -> TODO("Open polymorphic types are not supported") + SerialKind.CONTEXTUAL -> TODO("Contextual types are not supported") + PolymorphicKind.SEALED -> { + require(extraTypeProperty == null) + val typeFieldName = getElementName(0) + val contextualDescriptor = getElementDescriptor(1) + mapOf( + "oneOf" to JsonArray( + contextualDescriptor.elementDescriptors.map { + it.toJsonSchemaType(extraTypeProperty = typeFieldName) + } + ) + ) + } + is PrimitiveKind -> { + require(extraTypeProperty == null) + mapOf("type" to JsonPrimitive(kind.toJsonTypeName())) + } + SerialKind.ENUM -> { + require(extraTypeProperty == null) + mapOf("enum" to JsonArray(elementNames.map { JsonPrimitive(it) })) + } + StructureKind.CLASS -> { + if (isInline) { + return getElementDescriptor(0).toJsonSchemaType(extras, extraTypeProperty) + } + JsonObject( + mapOf( + "type" to JsonPrimitive("object"), + "properties" to JsonObject( + listOfNotNull(extraTypeProperty).associateWith { + JsonObject( + mapOf( + "const" to JsonPrimitive( + serialName + ) + ) + ) + } + + (0 until elementsCount).associate { getElementName(it) to getElementDescriptor(it).toJsonSchemaType() } + ), + "additionalProperties" to JsonPrimitive(false), + "required" to JsonArray( + (listOfNotNull(extraTypeProperty) + + (0 until elementsCount).filterNot { isElementOptional(it) } + .map { getElementName(it) }).map { JsonPrimitive(it) } + ) + ) + ) + } + StructureKind.LIST -> { + mapOf( + "type" to JsonPrimitive("array"), + "items" to getElementDescriptor(0).toJsonSchemaType() + ) + } + StructureKind.MAP -> { + val keysSerializer = getElementDescriptor(0) + val valuesSerializaer = getElementDescriptor(1) + when (keysSerializer.kind) { + PrimitiveKind.STRING -> { + JsonObject(mapOf( + "type" to JsonPrimitive("object"), + "patternProperties" to JsonObject( + mapOf(".*" to valuesSerializaer.toJsonSchemaType()) + ) + )) + } + SerialKind.ENUM -> { + JsonObject(mapOf( + "type" to JsonPrimitive("object"), + "properties" to JsonObject( + (0 until keysSerializer.elementsCount).map { + keysSerializer.getElementName(it) to valuesSerializaer.toJsonSchemaType() + }.toMap() + ) + )) + } + else -> error("Unsupported map key: $keysSerializer") + } + } + StructureKind.OBJECT -> TODO("Object types are not supported") + } + return JsonObject(extras + data) +} + +fun SerialDescriptor.toJsonSchema(title: String, path: String) : JsonElement { + return toJsonSchemaType( + extras = mapOf( + "\$schema" to JsonPrimitive("https://json-schema.org/draft/2020-12/schema"), + "\$id" to JsonPrimitive("https://github.com/icpc/live-v3/blob/main/$path"), + "title" to JsonPrimitive(title) + ) + ) +} + + +private val json = Json { + prettyPrint = true +} + +class GenCommand: CliktCommand() { + private val className by argument(help = "Class name for which schema should be generated") + private val output by option("--output", "-o", help = "File to print output").required() + private val title by option("--title", "-t", help = "Title inside schema file").required() + + override fun run() { + val serializer = serializer(Class.forName(className)).descriptor + val schema = json.encodeToString(serializer.toJsonSchema(title, output)) + File(output).printWriter().use { + it.println(schema) + } + } +} + +fun main(args: Array) { + GenCommand().main(args) +} \ No newline at end of file diff --git a/src/sniper-tools/build.gradle.kts b/src/sniper-tools/build.gradle.kts index e923d45f7..d0c560a0b 100644 --- a/src/sniper-tools/build.gradle.kts +++ b/src/sniper-tools/build.gradle.kts @@ -1,15 +1,14 @@ +import org.gradle.kotlin.dsl.run as runTask + plugins { application alias(libs.plugins.kotlin.jvm) alias(libs.plugins.kotlin.serialization) alias(libs.plugins.shadow) - alias(libs.plugins.ktor) } -group = "org.icpclive" -version = rootProject.findProperty("build_version")!! application { - mainClass.set("org.icpclive.sniper.ApplicationKt") + mainClass = "org.icpclive.sniper.ApplicationKt" } kotlin { @@ -21,49 +20,23 @@ kotlin { } tasks { - jar { - archiveFileName.set("sniper-tools-${project.version}-part.jar") - } - shadowJar { - archiveFileName.set("sniper-tools-${project.version}.jar") - } - named("run") { + runTask { this.workingDir(rootDir.resolve(".")) this.args = listOfNotNull(project.properties["live.overlayUrl"].let { "-P:live.overlayUrl=$it" }) - - } - task("release") { - from(shadowJar) - destinationDir = rootProject.rootDir.resolve("artifacts") } - val jsBuildPath = project.buildDir.resolve("js") - val copyJsAdmin = register("copyJsAdmin") { - from(project(":frontend").tasks["npm_run_buildAdmin"]) - destinationDir = jsBuildPath.resolve("admin") - } - register("buildJs") { - dependsOn(copyJsAdmin) - outputs.dir(jsBuildPath) - } -} - -sourceSets { - main { - resources { - srcDirs(tasks["buildJs"].outputs) + processResources { + into("admin") { + from(project(":frontend").tasks.named("npm_run_buildAdmin")) } } } -repositories { - mavenCentral() -} - dependencies { - implementation(libs.logback) + implementation(projects.cds) + implementation(projects.common) implementation(libs.ktor.serialization.kotlinx.json) - implementation(libs.ktor.server.autoHeadResponse) implementation(libs.ktor.server.auth) + implementation(libs.ktor.server.autoHeadResponse) implementation(libs.ktor.server.callLogging) implementation(libs.ktor.server.contentNegotiation) implementation(libs.ktor.server.core) @@ -72,10 +45,7 @@ dependencies { implementation(libs.ktor.server.netty) implementation(libs.ktor.server.statusPages) implementation(libs.ktor.server.websockets) - implementation(libs.kotlinx.datetime) - implementation(libs.kotlinx.serialization.json) - implementation(projects.cds) - implementation(projects.common) + testImplementation(libs.kotlin.junit) testImplementation(libs.ktor.server.tests) } diff --git a/tests/capture.spec.tsx b/tests/capture.spec.tsx new file mode 100644 index 000000000..552fa49dd --- /dev/null +++ b/tests/capture.spec.tsx @@ -0,0 +1,95 @@ +import { test, expect, request } from "@playwright/test"; +import { spawn } from "child_process"; +import WebSocket from "ws"; + +const simpleWidgets = ["queue", "scoreboard", "statistics"]; +const contestConfigs = [ + "config/__tests/ejudge_icpc_unfreeze/2023-voronezh", + "config/__tests/ejudge_ioi/regionalroi-lpk-2021-d1", + "config/__tests/ejudge_ioi_virtual/mosh-2023-keldysh", + "config/__tests/pcms_icpc_freeze/icpc-nef-2022-2023", + "config/__tests/pcms_icpc_overrides/icpc-nef-2021-2022", + "config/__tests/pcms_ioi/innopolis-open-2022-2023-final", + "config/__tests/testsys_icpc/spbsu-2023-may" +]; + +const backendStartCooldown = 3000; +const backendFinishCooldown = 1000; +const overlayDisplayDelay = 1000; +const address = "127.0.0.1"; +const startingPort = 8090; + +for (const [index, contestConfig] of contestConfigs.entries()) { + test(`config ${contestConfig}`, async ({ page }) => { + console.log(`Starting contest ${contestConfig}`) + const port = startingPort + index; + const baseURL = `http://${address}:${port}`; + const wsURL = `ws://${address}:${port}`; + + const childProcess = spawn("java", [ + "-jar", + "artifacts/live-v3-dev.jar", + "-p",`${port}`, + "--no-auth", + "-c", `${contestConfig}` + ]); + + childProcess.stdout.on("data", (data) => { + console.log(`${data}`); + }); + + childProcess.stderr.on("data", (data) => { + console.error(`${data}`); + }); + + childProcess.on("close", (code) => { + console.log(`Child process exited with code ${code}`); + }); + + process.on('exit', function () { + childProcess.kill(); + }); + + process.on('SIGINT', function () { + childProcess.kill(); + process.exit(); + }); + + const adminApiContext = await request.newContext({ + baseURL: `${baseURL}/api/admin/` + }); + + await page.waitForTimeout(backendStartCooldown); + + let contestInfo = new WebSocket(`${wsURL}/api/overlay/contestInfo`); + + const contestOver = new Promise((resolve) => { + contestInfo.onmessage = (event) => { + const message = JSON.parse(event.data.toString()); + if (message.status === "OVER" || message.status == "FINALIZED") { + resolve(null); + } + }; + }); + await contestOver; + contestInfo.close(); + + await page.goto(baseURL + "/overlay"); + + for (const widgetName of simpleWidgets) { + const showWidget = await adminApiContext.post(`./${widgetName}/show`); + expect.soft(showWidget.ok()).toBeTruthy(); + } + + await page.waitForTimeout(overlayDisplayDelay); + + const contestName = contestConfig.replace(/\//g, "_"); + await page.screenshot({ path: `tests/screenshots/${contestName}.png` }); + + for (const widgetName of simpleWidgets) { + const hideWidget = await adminApiContext.post(`./${widgetName}/hide`); + expect.soft(hideWidget.ok()).toBeTruthy(); + } + await page.waitForTimeout(backendFinishCooldown); + }); +}