├── .dockerignore
├── .editorconfig
├── .fdignore
├── .github
├── CODEOWNERS
├── FUNDING.yml
├── ISSUE_TEMPLATE
│ ├── bug_report.yml
│ ├── config.yml
│ └── feature_request.yml
└── workflows
│ ├── package_wheels.yml
│ ├── publish_action.yml
│ ├── release.yml
│ └── test_embedded.yml
├── .gitignore
├── .gitmodules
├── .nvim.lua
├── .pre-commit-config.yaml
├── .prettierrc
├── .release_ignore
├── CHANGELOG.md
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── INSTALL.md
├── LICENSE
├── README.md
├── __init__.py
├── biome.json
├── cliff.toml
├── data
└── font.ttf
├── endpoint.py
├── env.nu
├── errors.py
├── examples
├── 01-faceswap.json
├── 02-film_interpolation.json
├── 03-animation_builder-condition-lerp.json
├── 04-animation_builder-deforum.json
├── 05-seamless_texture.json
├── 06-seamless_equilateral.json
├── 08-note-plus.json
└── README.md
├── html
├── js
│ ├── foldable.js
│ ├── saveTableData.js
│ ├── splitPane.js
│ └── tabSwitch.js
└── style.css
├── install.py
├── log.py
├── node_list.json
├── nodes
├── __init__.py
├── animation.py
├── audio.py
├── batch.py
├── conditions.py
├── constant.py
├── crop.py
├── curve.py
├── debug.py
├── deep_bump.py
├── faceenhance.py
├── faceswap.py
├── filter.py
├── generate.py
├── graph_utils.py
├── image_interpolation.py
├── image_processing.py
├── image_utils.py
├── io.py
├── latent_processing.py
├── ltx.py
├── mask.py
├── model.py
├── number.py
├── postshot.py
├── prune.py
├── qrcode.py
├── transform.py
├── video.py
└── vitmatte.py
├── pyproject.toml
├── pyrightconfig.json
├── requirements.txt
├── scripts
├── a111_extract.py
├── comfy_meta.py
├── download_models.py
├── get_deps.py
├── interpolate_frames.py
└── update_changelog.nu
├── styles.csv
├── types
├── shared.d.ts
└── typedefs.js
├── utils.py
├── web
├── README.md
├── comfy_shared.js
├── constant.js
├── curve_widget.js
├── debug.js
├── extern
│ ├── dom-purify.js
│ └── parse-css.js
├── imageFeed.js
├── mtb_input_output_sidebar.js
├── mtb_sidebar.js
├── mtb_ui.js
├── mtb_widgets.js
├── note_plus.constants.js
├── note_plus.js
├── notify.js
└── numberInput.js
└── web_async
├── ace
├── ace.js
├── ext-beautify.js
├── ext-code_lens.js
├── ext-command_bar.js
├── ext-elastic_tabstops_lite.js
├── ext-emmet.js
├── ext-error_marker.js
├── ext-hardwrap.js
├── ext-inline_autocomplete.js
├── ext-keybinding_menu.js
├── ext-language_tools.js
├── ext-linking.js
├── ext-modelist.js
├── ext-options.js
├── ext-prompt.js
├── ext-rtl.js
├── ext-searchbox.js
├── ext-settings_menu.js
├── ext-simple_tokenizer.js
├── ext-spellcheck.js
├── ext-split.js
├── ext-static_highlight.js
├── ext-statusbar.js
├── ext-textarea.js
├── ext-themelist.js
├── ext-whitespace.js
├── keybinding-emacs.js
├── keybinding-sublime.js
├── keybinding-vim.js
├── keybinding-vscode.js
├── mode-css.js
├── mode-html.js
├── mode-javascript.js
├── mode-json.js
├── mode-json5.js
├── mode-markdown.js
├── mode-python.js
├── mode-svg.js
├── mode-typescript.js
├── snippets
│ ├── css.js
│ ├── html.js
│ ├── json.js
│ ├── json5.js
│ ├── markdown.js
│ ├── python.js
│ └── typescript.js
├── theme-ambiance.js
├── theme-chaos.js
├── theme-chrome.js
├── theme-cloud9_day.js
├── theme-cloud9_night.js
├── theme-cloud9_night_low_color.js
├── theme-cloud_editor.js
├── theme-cloud_editor_dark.js
├── theme-clouds.js
├── theme-clouds_midnight.js
├── theme-cobalt.js
├── theme-crimson_editor.js
├── theme-dawn.js
├── theme-dracula.js
├── theme-dreamweaver.js
├── theme-eclipse.js
├── theme-github.js
├── theme-github_dark.js
├── theme-gob.js
├── theme-gruvbox.js
├── theme-gruvbox_dark_hard.js
├── theme-gruvbox_light_hard.js
├── theme-idle_fingers.js
├── theme-iplastic.js
├── theme-katzenmilch.js
├── theme-kr_theme.js
├── theme-kuroir.js
├── theme-merbivore.js
├── theme-merbivore_soft.js
├── theme-mono_industrial.js
├── theme-monokai.js
├── theme-nord_dark.js
├── theme-one_dark.js
├── theme-pastel_on_dark.js
├── theme-solarized_dark.js
├── theme-solarized_light.js
├── theme-sqlserver.js
├── theme-terminal.js
├── theme-textmate.js
├── theme-tomorrow.js
├── theme-tomorrow_night.js
├── theme-tomorrow_night_blue.js
├── theme-tomorrow_night_bright.js
├── theme-tomorrow_night_eighties.js
├── theme-twilight.js
├── theme-vibrant_ink.js
├── theme-xcode.js
├── worker-base.js
├── worker-css.js
├── worker-html.js
├── worker-javascript.js
└── worker-json.js
├── mtb_markdown.umd.js
└── mtb_markdown_plus.umd.js
/.dockerignore:
--------------------------------------------------------------------------------
1 | # Include any files or directories that you don't want to be copied to your
2 | # container here (e.g., local build artifacts, temporary files, etc.).
3 | #
4 | # For more help, visit the .dockerignore file reference guide at
5 | # https://docs.docker.com/engine/reference/builder/#dockerignore-file
6 |
7 | **/.DS_Store
8 | **/__pycache__
9 | **/.venv
10 | **/.classpath
11 | **/.dockerignore
12 | **/.env
13 | **/.git
14 | **/.gitignore
15 | **/.project
16 | **/.settings
17 | **/.toolstarget
18 | **/.vs
19 | **/.vscode
20 | **/*.*proj.user
21 | **/*.dbmdl
22 | **/*.jfm
23 | **/bin
24 | **/charts
25 | **/docker-compose*
26 | **/compose*
27 | **/Dockerfile*
28 | **/node_modules
29 | **/npm-debug.log
30 | **/obj
31 | **/secrets.dev.yaml
32 | **/values.dev.yaml
33 | LICENSE
34 | README.md
35 |
--------------------------------------------------------------------------------
/.editorconfig:
--------------------------------------------------------------------------------
1 | [*]
2 | end_of_line = lf
3 |
--------------------------------------------------------------------------------
/.fdignore:
--------------------------------------------------------------------------------
1 | **/GFPGAN/inputs/**
2 | **/GFPGAN/tests/**
3 | **/frame_interpolation/photos/*
4 | moment.gif
5 | node.zip
6 | .DS_Store
7 |
8 |
--------------------------------------------------------------------------------
/.github/CODEOWNERS:
--------------------------------------------------------------------------------
1 | * @melMass
2 | extern/GFPGAN/* @TencentARC
3 | extern/SadTalker/* @OpenTalker
4 | nodes/deep_bump.py @HugoTini
5 | web/imageFeed.js @pythongosssss @melMass
--------------------------------------------------------------------------------
/.github/FUNDING.yml:
--------------------------------------------------------------------------------
1 | # These are supported funding model platforms
2 |
3 | github: [melMass]
4 | custom: ["https://www.buymeacoffee.com/melmass"]
5 | patreon: # Replace with a single Patreon username
6 | open_collective: # Replace with a single Open Collective username
7 | ko_fi: # Replace with a single Ko-fi username
8 | tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
9 | community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
10 | liberapay: # Replace with a single Liberapay username
11 | issuehunt: # Replace with a single IssueHunt username
12 | otechie: # Replace with a single Otechie username
13 | lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry
14 |
15 |
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/bug_report.yml:
--------------------------------------------------------------------------------
1 | name: 🐞 Bug Report
2 | title: '[bug] '
3 | description: Report a bug
4 | labels: ['type: 🐛 bug', 'status: 🧹 needs triage']
5 | assignees:
6 | - melMass
7 |
8 | body:
9 | - type: markdown
10 | attributes:
11 | value: |
12 | ## Before submiting an issue
13 | - Make sure to read the README & INSTALL instructions.
14 | - Please search for [existing issues](https://github.com/melMass/comfy_mtb/issues?q=is%3Aissue) around your problem before filing a report.
15 | - Optionally check the `#mtb-nodes` channel on the Banodoco discord:
16 | [](https://discord.gg/IAXhsabmDhn)
17 |
18 | ### Try using the debug mode to get more info
19 |
20 | If you use the env variable `MTB_DEBUG=true`, debug message from the extension will appear in the terminal.
21 |
22 | - type: textarea
23 | id: description
24 | attributes:
25 | label: Describe the bug
26 | description: A clear description of what the bug is. Include screenshots if applicable.
27 | placeholder: Bug description
28 | validations:
29 | required: true
30 |
31 | - type: textarea
32 | id: reproduction
33 | attributes:
34 | label: Reproduction
35 | description: Steps to reproduce the behavior.
36 | placeholder: |
37 | 1. Add node xxx ...
38 | 2. Connect to xxx ...
39 | 3. See error
40 |
41 | - type: textarea
42 | id: expected-behavior
43 | attributes:
44 | label: Expected behavior
45 | description: A clear description of what you expected to happen.
46 |
47 | - type: dropdown
48 | id: os
49 | attributes:
50 | label: Operating System
51 | description: What OS are you using?
52 | options:
53 | - Windows (Default)
54 | - Linux
55 | - Mac
56 | default: 0
57 | validations:
58 | required: true
59 |
60 | - type: dropdown
61 | id: comfy_mode
62 | attributes:
63 | label: Comfy Mode
64 | description: What flavor of Comfy do you use?
65 | options:
66 | - Comfy Portable (embed) (Default)
67 | - In a custom virtual env (venv, virtualenv, conda...)
68 | - Google Colab
69 | - Other (online services, containers etc..)
70 | default: 0
71 | validations:
72 | required: true
73 |
74 | - type: textarea
75 | id: logs
76 | attributes:
77 | label: Console output
78 | description: Paste the console output without backticks
79 | render: sh
80 |
81 | - type: textarea
82 | id: context
83 | attributes:
84 | label: Additional context
85 | description: Add any other context about the problem here.
86 |
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/config.yml:
--------------------------------------------------------------------------------
1 | blank_issues_enabled: false
2 |
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/feature_request.yml:
--------------------------------------------------------------------------------
1 | name: 💡 Feature Request
2 | title: "[feat] "
3 | description: Suggest an idea
4 | labels: ["type: 🤚 feature request"]
5 |
6 | body:
7 | - type: textarea
8 | id: problem
9 | attributes:
10 | label: Describe the problem
11 | description: A clear description of the problem this feature would solve
12 | placeholder: "I'm always frustrated when..."
13 | validations:
14 | required: true
15 |
16 | - type: textarea
17 | id: solution
18 | attributes:
19 | label: "Describe the solution you'd like"
20 | description: A clear description of what change you would like
21 | placeholder: "I would like to..."
22 | validations:
23 | required: true
24 |
25 | - type: textarea
26 | id: alternatives
27 | attributes:
28 | label: Alternatives considered
29 | description: "Any alternative solutions you've considered"
30 |
31 | - type: textarea
32 | id: context
33 | attributes:
34 | label: Additional context
35 | description: Add any other context about the problem here.
36 |
--------------------------------------------------------------------------------
/.github/workflows/package_wheels.yml:
--------------------------------------------------------------------------------
1 | name: 📦 Building wheels
2 |
3 | on:
4 | workflow_dispatch:
5 | # push:
6 | # tags:
7 | # - "v*"
8 |
9 | jobs:
10 | build:
11 | strategy:
12 | fail-fast: false
13 | matrix:
14 | include:
15 | - os: windows-latest
16 | platform: win32
17 | arch: x64
18 | # - os: macos-latest
19 | # platform: darwin
20 | # arch: arm64
21 | - os: ubuntu-latest
22 | platform: linux
23 | arch: x64
24 | runs-on: ${{ matrix.os }}
25 | env:
26 | archive_name: deps-wheels_${{ matrix.os }}-${{ matrix.platform }}-${{ matrix.arch }}
27 | steps:
28 | - name: ♻️ Checking out the repository
29 | uses: actions/checkout@v3
30 | - name: '🐍 Setting up Python'
31 | uses: actions/setup-python@v4
32 | with:
33 | python-version: '3.10.9'
34 |
35 | - name: 📦 Building and Bundling wheels
36 | shell: bash
37 | run: |
38 | python -m pip wheel --no-cache-dir -r reqs.txt -w ./wheels 2>&1 | tee build.log
39 |
40 | # find source wheels
41 | packages=$(cat build.log | awk -F 'Building wheels for collected packages: ' '{print $2}')
42 | packages=$(echo "$packages" | tr -d '[:space:]')
43 |
44 | IFS=', ' read -r -a package_array <<< "$packages"
45 |
46 | # Save reversed package_array to wheel_order.txt
47 | reversed_array=()
48 | for ((idx=${#package_array[@]}-1; idx>=0; idx--)); do
49 | reversed_array+=("${package_array[idx]}")
50 | done
51 | printf '%s\n' "${reversed_array[@]}" > ./wheels/wheel_order.txt
52 |
53 | printf "Autodetect this source package: \e[32m%s\e[0m\n" "${package_array[@]}"
54 |
55 | # Iterate through the wheel files and remove those that are not source built
56 | for wheel_file in ./wheels/*.whl; do
57 | # Extract the package name from the wheel filename
58 | package_name=$(basename "$wheel_file" .whl | awk -F '-' '{print $1}')
59 |
60 | printf "Checking package: %s\n" "$package_name"
61 |
62 | # Check if the package is not in the array of source built packages
63 | if [[ ! " ${package_array[@]} " =~ " ${package_name} " ]]; then
64 | echo "Removing $wheel_file"
65 | rm "$wheel_file"
66 | fi
67 | done
68 |
69 |
70 | if [ "$RUNNER_OS" == "Windows" ]; then
71 | "C:/Program Files/7-Zip/7z.exe" a -mfb=258 -tzip ${{ env.archive_name }}.zip wheels
72 | else
73 | zip -r -9 -y -m ${{ env.archive_name }}.zip wheels
74 | fi
75 | - name: 💾 Store cache
76 | uses: actions/cache/save@v3
77 | with:
78 | path: ${{ env.archive_name }}.zip
79 | key: ${{ env.archive_name }}-${{ hashFiles('reqs.txt') }}
80 |
--------------------------------------------------------------------------------
/.github/workflows/publish_action.yml:
--------------------------------------------------------------------------------
1 | name: 📦 Publish to Comfy registry
2 | on:
3 | workflow_dispatch:
4 |
5 | permissions:
6 | issues: write
7 |
8 | jobs:
9 | publish-node:
10 | name: Publish Custom Node to registry
11 | runs-on: ubuntu-latest
12 | if: ${{ github.repository_owner == 'melMass' }}
13 | steps:
14 | - name: ♻️ Check out code
15 | uses: actions/checkout@v4
16 | with:
17 | submodules: true
18 | - name: 📦 Publish Custom Node
19 | uses: Comfy-Org/publish-node-action@v1
20 | with:
21 | skip_checkout: 'true'
22 | personal_access_token: ${{ secrets.COMFY_REGISTRY_TOKEN }}
23 |
--------------------------------------------------------------------------------
/.github/workflows/release.yml:
--------------------------------------------------------------------------------
1 | name: 📦 Release
2 |
3 | on:
4 | workflow_dispatch:
5 | inputs:
6 | name:
7 | description: Release tag / name ?
8 | required: true
9 | default: 'latest'
10 | type: string
11 | environment:
12 | description: Environment to run tests against
13 | type: environment
14 | required: false
15 | # push:
16 | # tags:
17 | # - "v*"
18 |
19 | jobs:
20 | release:
21 | permissions:
22 | contents: write
23 | runs-on: ubuntu-latest
24 | env:
25 | repo_name: ${{ github.event.repository.name }}
26 | steps:
27 | - name: ♻️ Checking out the repository
28 | uses: actions/checkout@v3
29 | with:
30 | submodules: 'recursive'
31 | path: ${{ env.repo_name }}
32 |
33 | # - name: 📝 Prepare file with paths to remove
34 | # run: |
35 | # find ${{ env.repo_name }} -type f -size +10M > .release_ignore
36 | # find ${{ env.repo_name }} -type d -empty >> .release_ignore
37 | # shell: bash
38 |
39 | - name: 🗑️ Remove files and directories listed in .release_ignore
40 | shell: bash
41 | run: |
42 | release_ignore="${{ env.repo_name }}/.release_ignore"
43 | if [ -f "$release_ignore" ]; then
44 | while IFS= read -r entry || [ -n "$entry" ]; do
45 | target="${{ env.repo_name }}/$entry"
46 | if [ -e "$target" ]; then
47 | if [ -f "$target" ]; then
48 | rm "$target"
49 | elif [ -d "$target" ]; then
50 | rm -r "$target"
51 | fi
52 | else
53 | echo "Warning: $entry does not exist in the repository. Skipping removal."
54 | fi
55 | done < "$release_ignore"
56 | else
57 | echo "No .release_ignore file found. Skipping removal of files and directories."
58 | fi
59 |
60 | - name: 📦 Building custom comfy nodes
61 | shell: bash
62 | run: |
63 | if [ "$RUNNER_OS" == "Windows" ]; then
64 | "C:/Program Files/7-Zip/7z.exe" a -mfb=258 -tzip ${{ env.repo_name }}-${{ inputs.name }}.zip ${{ env.repo_name }}
65 | else
66 | zip -r -9 -y -m ${{ env.repo_name }}-${{ inputs.name }}.zip ${{ env.repo_name }}
67 | fi
68 |
69 | - name: ✅ Create release
70 | uses: softprops/action-gh-release@v1
71 | with:
72 | tag_name: ${{ inputs.name }}
73 | files: |
74 | ${{ env.repo_name }}-${{ inputs.name }}.zip
75 |
76 | release-wheels:
77 | permissions:
78 | contents: write
79 | strategy:
80 | fail-fast: true
81 | matrix:
82 | include:
83 | - os: windows-latest
84 | platform: win32
85 | arch: x64
86 | # - os: macos-latest
87 | # platform: darwin
88 | # arch: arm64
89 | - os: ubuntu-latest
90 | platform: linux
91 | arch: x64
92 | runs-on: ${{ matrix.os }}
93 | env:
94 | archive_name: deps-wheels_${{ matrix.os }}-${{ matrix.platform }}-${{ matrix.arch }}
95 | steps:
96 | - name: 💾 Restore cache
97 | uses: actions/cache/restore@v3
98 | id: cache
99 | with:
100 | path: ${{ env.archive_name }}.zip
101 | key: ${{ env.archive_name }}-${{ hashFiles('reqs.txt') }}
102 | - name: 📦 Unzip wheels
103 | shell: bash
104 | run: |
105 | mkdir -p wheels
106 | unzip -j ${{ env.archive_name }}.zip "**/*.whl" -d wheels
107 | unzip -j ${{ env.archive_name }}.zip "**/*.txt" -d wheels
108 | if: success()
109 | - name: ✅ Add wheels to release
110 | uses: softprops/action-gh-release@v1
111 | with:
112 | tag_name: ${{ inputs.name }}
113 | files: |
114 | wheels/*.whl
115 | wheels/wheel_order.txt
116 |
--------------------------------------------------------------------------------
/.github/workflows/test_embedded.yml:
--------------------------------------------------------------------------------
1 | name: 🧪 Test Comfy Portable
2 |
3 | on: workflow_dispatch
4 | jobs:
5 | install-comfy:
6 | runs-on: windows-latest
7 | env:
8 | repo_name: ${{ github.event.repository.name }}
9 | steps:
10 | - name: ⚡️ Restore Cache if Available
11 | id: cache-comfy
12 | uses: actions/cache/restore@v3
13 | with:
14 | path: ComfyUI_windows_portable
15 | key: ${{ runner.os }}-comfy-env
16 |
17 | - name: 🚡 Download and Extract Comfy
18 | id: download-extract-comfy
19 | if: steps.cache-comfy.outputs.cache-hit != 'true'
20 | shell: bash
21 | run: |
22 | mkdir comfy_temp
23 | curl -L -o comfy_temp/comfyui.7z https://github.com/comfyanonymous/ComfyUI/releases/download/latest/ComfyUI_windows_portable_nvidia_cu118_or_cpu.7z
24 |
25 | 7z x comfy_temp/comfyui.7z -o./comfy_temp
26 |
27 |
28 | # mv comfy_temp/ComfyUI_windows_portable/python_embeded .
29 | # mv comfy_temp/ComfyUI_windows_portable/ComfyUI .
30 | # mv comfy_temp/ComfyUI_windows_portable/update .
31 | ls
32 | mv comfy_temp/ComfyUI_windows_portable .
33 |
34 | - name: 💾 Store cache
35 | uses: actions/cache/save@v3
36 | if: steps.cache-comfy.outputs.cache-hit != 'true'
37 | with:
38 | path: ComfyUI_windows_portable
39 | key: ${{ runner.os }}-comfy-env
40 | - name: ⏬ Install other extensions
41 | shell: bash
42 | run: |
43 | export COMFY_PYTHON="${GITHUB_WORKSPACE}/ComfyUI_windows_portable/python_embeded/python.exe"
44 | cd "${GITHUB_WORKSPACE}/ComfyUI_windows_portable/ComfyUI/custom_nodes"
45 |
46 | git clone https://github.com/Fannovel16/comfy_controlnet_preprocessors
47 | cd comfy_controlnet_preprocessors
48 | $COMFY_PYTHON -m pip install -r requirements.txt
49 |
50 | - name: ♻️ Checking out comfy_mtb to custom_nodes
51 | uses: actions/checkout@v3
52 | with:
53 | submodules: 'recursive'
54 | path: ComfyUI_windows_portable/ComfyUI/custom_nodes/${{ env.repo_name }}
55 |
56 | - name: 📦 Install mtb nodes
57 | shell: bash
58 | run: |
59 | # run install
60 | export COMFY_PYTHON="${GITHUB_WORKSPACE}/ComfyUI_windows_portable/python_embeded/python.exe"
61 | cd "${GITHUB_WORKSPACE}/ComfyUI_windows_portable/ComfyUI/custom_nodes"
62 | $COMFY_PYTHON ${{ env.repo_name }}/install.py -w
63 |
64 | - name: ⏬ Import mtb_nodes
65 | shell: bash
66 | run: |
67 | export COMFY_PYTHON="${GITHUB_WORKSPACE}/ComfyUI_windows_portable/python_embeded/python.exe"
68 | cd "${GITHUB_WORKSPACE}/ComfyUI_windows_portable/ComfyUI"
69 | $COMFY_PYTHON -s main.py --quick-test-for-ci --cpu
70 |
71 | $COMFY_PYTHON -m pip freeze
72 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | __pycache__
2 | *.py[cod]
3 | *.onnx
4 |
5 | wheels/
6 | node_modules/
7 | compose.yaml
8 | comfy_mtb.wsb
9 | Dockerfile
10 |
11 | .DS_Store
12 | node.zip
13 |
14 | # I store the gh-pages worktrees (src & build) there
15 | .worktrees
16 |
--------------------------------------------------------------------------------
/.gitmodules:
--------------------------------------------------------------------------------
1 | [submodule "extern/google-FILM"]
2 | path = extern/frame_interpolation
3 | url = https://github.com/google-research/frame-interpolation
4 | [submodule "extern/GFPGAN"]
5 | path = extern/GFPGAN
6 | url = https://github.com/TencentARC/GFPGAN.git
7 | [submodule "extern/frame_interpolation"]
8 | path = extern/frame_interpolation
9 | url = https://github.com/google-research/frame-interpolation
10 | [submodule "wiki"]
11 | path = wiki
12 | url = https://github.com/melMass/comfy_mtb.wiki.git
13 |
--------------------------------------------------------------------------------
/.nvim.lua:
--------------------------------------------------------------------------------
1 | -- HACK: this should theorically not be needed since the lsp should read from the pyproject
2 | -- tried: ruff-lsp or basedpyright
3 |
4 | local comfyRoot = vim.fn.expand("%:p:h:h:h")
5 |
6 | if not vim.env.PYTHONPATH or vim.env.PYTHONPATH == "" then
7 | vim.env.PYTHONPATH = comfyRoot
8 | else
9 | vim.env.PYTHONPATH = vim.env.PYTHONPATH .. ";" .. comfyRoot
10 | end
11 |
--------------------------------------------------------------------------------
/.pre-commit-config.yaml:
--------------------------------------------------------------------------------
1 | default_language_version:
2 | python: python3.10
3 | repos:
4 | - repo: https://github.com/melmass/hooks
5 | rev: e8c6c18175ed4f6e30f23991de7989411e09c73b
6 | hooks:
7 | - id: fix-trailing-whitespace
8 | - id: bump-version
9 |
--------------------------------------------------------------------------------
/.prettierrc:
--------------------------------------------------------------------------------
1 | {
2 | "semi": false,
3 | "singleQuote": true,
4 | "tabWidth": 2,
5 | "useTabs": false
6 | }
--------------------------------------------------------------------------------
/.release_ignore:
--------------------------------------------------------------------------------
1 | extern/frame_interpolation/moment.gif
2 | extern/frame_interpolation/photos
3 | extern/GFPGAN/inputs
4 | .git
--------------------------------------------------------------------------------
/CODE_OF_CONDUCT.md:
--------------------------------------------------------------------------------
1 | # Code of Conduct
2 |
3 | ## Our Commitment
4 |
5 | We are committed to creating a welcoming and inclusive community for everyone. We believe that a diverse and respectful community is essential for fostering creativity and innovation. We expect all members of our community to adhere to this Code of Conduct.
6 |
7 | ## Our Expectations
8 |
9 | This Code of Conduct applies to all interactions within the mtb community, including:
10 |
11 | * Public communication channels (e.g., GitHub issues, pull requests, discussions, social media)
12 | * Private communication channels (e.g., direct messages, email)
13 | * In-person events (if any)
14 |
15 | We expect all members to:
16 |
17 | * **Be respectful and considerate:** Treat others with kindness and empathy.
18 | * **Be inclusive:** Welcome and respect people of all backgrounds, identities, and experiences.
19 | * **Be constructive:** Focus on providing helpful and positive feedback.
20 | * **Be mindful of your language:** Avoid using offensive, discriminatory, or harassing language.
21 | * **Respect privacy:** Do not share personal information without consent.
22 |
23 | ## Unacceptable Behavior
24 |
25 | The following behaviors are not tolerated:
26 |
27 | * Offensive, discriminatory, or harassing language or conduct
28 | * Personal attacks or insults
29 | * Spamming or trolling
30 | * Sharing of malicious or inappropriate content
31 | * Disrupting the community or hindering collaboration
32 | * Violating the privacy of others
33 |
34 | ## Reporting Violations
35 |
36 | If you experience or witness a violation of this Code of Conduct, please report it to @melmass. All reports will be treated confidentially and investigated promptly.
37 |
38 | ## Enforcement
39 |
40 | Violations of this Code of Conduct may result in the following actions:
41 |
42 | * Warning
43 | * Removal from the community
44 | * Ban from the community
45 |
46 | ## License
47 | [](code_of_conduct.md)
48 |
49 | ## Contact
50 |
51 | If you have any questions or concerns about this Code of Conduct, please contact @melmass.
52 |
53 |
--------------------------------------------------------------------------------
/CONTRIBUTING.md:
--------------------------------------------------------------------------------
1 | # Contributing to mtb
2 |
3 | Thank you for your interest in contributing to mtb! We appreciate your help in making this project better. This document outlines how you can contribute to the project.
4 |
5 | ## Project Overview
6 |
7 | This project is a collection of custom nodes for ComfyUI, tailored specifically for animation workflows. It aims to provide a streamlined and user-friendly experience for creating animations within the ComfyUI environment.
8 |
9 | ## Ways to Contribute
10 |
11 | We welcome all kinds of contributions! Here's how you can get involved:
12 |
13 | * **Bug Reports:** If you encounter any issues, please create a new issue on GitHub. Please include clear steps to reproduce the bug, along with any relevant error messages, workflows or screenshots.
14 | * **Feature Requests:** Have an idea for a new node or feature? Create a new issue to discuss it! Please describe the feature in detail, and explain how it would benefit the project.
15 | * **Documentation Improvements:** Help us improve the documentation by fixing errors, adding examples, or clarifying explanations.
16 | * **Code Contributions:** We welcome contributions to the codebase! Please see the "Development Setup" and "File Structure" sections below for more information.
17 | * **Testing:** Help us ensure the stability and reliability of the project by testing new features and bug fixes.
18 | * **Refactoring:** Help us improve the codebase by refactoring existing code to improve readability, maintainability, and performance.
19 |
20 | ## Development Setup
21 |
22 | ```sh
23 | git clone --recursive https://github.com/melmass/comfy_mtb
24 | ```
25 |
26 | ## File Structure
27 |
28 | Understanding the project structure is crucial for making effective contributions.
29 |
30 | * **`./nodes/*.py`:** This directory contains the definitions for all custom nodes. Nodes are automatically registered when a file defines an array named `__nodes__` containing the node classes. Make sure your node follows the ComfyUI node definition structure.
31 | * **`./web/*.js`:** This directory contains all the frontend JavaScript code for the extension's user interface.
32 | * **`./wiki`:** This directory is a Git submodule that contains the project's Wiki documentation, written in Markdown. Node documentation should be created or updated in the corresponding Markdown files within this submodule. This is then referenced by the UI for in-GUI help
33 |
34 | ## Coding Style
35 |
36 | We use **Ruff** for code formatting to ensure consistency. Please run Ruff on your code before submitting a pull request. No specific configuration is required, so the default Ruff settings will be used.
37 |
38 | ## Contribution Workflow
39 |
40 | 1. **Create a Branch:** Create a new branch for your feature or fix. Use a descriptive branch name (e.g., `feature/new-node`, `fix/bug-in-ui`). **Do not fork the main branch directly.**
41 | 2. **Make Changes:** Implement your changes in your branch.
42 | 3. **Run Tests:** (Add instructions on how to run tests if available.)
43 | 4. **Format Code:** Run Ruff on your code to ensure it is properly formatted.
44 | 5. **Create a Pull Request:** Submit a pull request to the `main` branch. Please provide a clear and concise description of your changes.
45 |
46 | ## Code of Conduct
47 |
48 | We are committed to creating a welcoming and inclusive community. We expect all contributors to adhere to a respectful and professional code of conduct. (Consider adding a link to a CODE_OF_CONDUCT.md file or a standard code of conduct.)
49 |
50 | ## Tools and Libraries
51 |
52 | * **Python:** The primary programming language for this project.
53 | * **ComfyUI:** The underlying framework for the custom nodes.
54 |
55 | ## Current Focus
56 |
57 | We are currently focused on a major refactor to clean up the project's codebase. Contributions related to this effort are particularly welcome!
58 |
59 | ## Thank You!
60 |
61 | Thank you for considering contributing to mtb! Your contributions are greatly appreciated. We look forward to reviewing your pull requests!
62 |
63 |
--------------------------------------------------------------------------------
/INSTALL.md:
--------------------------------------------------------------------------------
1 | # Installation
2 | - [Installation](#installation)
3 | - [Automatic Install (Recommended)](#automatic-install-recommended)
4 | - [ComfyUI Manager](#comfyui-manager)
5 | - [Virtual Env](#virtual-env)
6 | - [Models Download](#models-download)
7 | - [Old installation method (MANUAL)](#old-installation-method-manual)
8 | - [Dependencies](#dependencies)
9 |
10 | ## Automatic Install (Recommended)
11 |
12 | ### ComfyUI Manager
13 |
14 | As of version 0.1.0, this extension is meant to be installed with the [ComfyUI-Manager](https://github.com/ltdrdata/ComfyUI-Manager), which helps a lot with handling the various install issues faced by various environments.
15 |
16 | ### Virtual Env
17 | There is also an experimental one liner install using the following command from ComfyUI's root. It will download the code, install the dependencies and run the install script:
18 |
19 | ```bash
20 | curl -sSL "https://raw.githubusercontent.com/username/repo/main/install.py" | python3 -
21 | ```
22 |
23 | ## Models Download
24 | Some nodes require extra models to be downloaded, you can interactively do it using the same python environment as above:
25 | ```bash
26 | python scripts/download_models.py
27 | ```
28 |
29 | then follow the prompt or just press enter to download every models.
30 |
31 | > **Note**
32 | > You can use the following to download all models without prompt:
33 | ```bash
34 | python scripts/download_models.py -y
35 | ```
36 |
37 |
38 | ## Old installation method (MANUAL)
39 | ### Dependencies
40 | Custom Virtualenv (I use this mainly)
41 |
42 | 1. Make sure you are in the Python environment you use for ComfyUI.
43 | 2. Install the required dependencies by running the following command:
44 | ```bash
45 | pip install -r comfy_mtb/requirements.txt
46 | ```
47 |
48 |
49 |
50 | Comfy-portable / standalone (from ComfyUI releases)
51 |
52 | If you use the `python-embeded` from ComfyUI standalone then you are not able to pip install dependencies with binaries when they don't have wheels, in this case check the last [release](https://github.com/melMass/comfy_mtb/releases) there is a bundle for linux and windows with prebuilt wheels (only the ones that require building from source), check [this issue (#1)](https://github.com/melMass/comfy_mtb/issues/1) for more info.
53 | 
54 |
55 |
56 |
57 |
58 |
59 | Google Colab
60 |
61 | Add a new code cell just after the **Run ComfyUI with localtunnel (Recommended Way)** header (before the code cell)
62 | 
63 |
64 |
65 | ```python
66 | # download the nodes
67 | !git clone --recursive https://github.com/melMass/comfy_mtb.git custom_nodes/comfy_mtb
68 |
69 | # download all models
70 | !python custom_nodes/comfy_mtb/scripts/download_models.py -y
71 |
72 | # install the dependencies
73 | !pip install -r custom_nodes/comfy_mtb/reqs.txt -f https://download.openmmlab.com/mmcv/dist/cu118/torch2.0/index.html
74 | ```
75 | If after running this, colab complains about needing to restart runtime, do it, and then do not rerun earlier cells, just the one to run the localtunnel. (you might have to add a cell with `%cd ComfyUI` first...)
76 |
77 |
78 | > **Note**:
79 | > If you don't need all models, remove the `-y` as collab actually supports user input: 
80 |
81 | > **Preview**
82 | > 
83 |
84 |
85 |
86 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2023 Mel Massadian
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # MTB Nodes
2 | [](https://github.com/melMass/comfy_mtb/actions/workflows/test_embedded.yml)
3 |
4 | 
5 |
6 |
7 |
8 |
9 | [**Wiki**](https://github.com/melMass/comfy_mtb/wiki) | [**Install Guide**](./INSTALL.md) | [**Examples**](https://github.com/melMass/comfy_mtb/wiki/Examples)
10 |
11 |
12 |
--------------------------------------------------------------------------------
/biome.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://biomejs.dev/schemas/1.6.1/schema.json",
3 | "organizeImports": {
4 | "enabled": true
5 | },
6 | "linter": {
7 | "enabled": true,
8 | "rules": {
9 | "recommended": true,
10 | "suspicious": {
11 | "noConsoleLog": "warn"
12 | },
13 | "style": {
14 | "noParameterAssign": "off",
15 | "noShoutyConstants": "warn",
16 | "useNamingConvention": "off"
17 | }
18 | }
19 | },
20 | "formatter": {
21 | "indentStyle": "space",
22 | "indentWidth": 2,
23 | "lineEnding": "lf"
24 | },
25 | "javascript": {
26 | "formatter": {
27 | "quoteStyle": "single",
28 | "semicolons": "asNeeded"
29 | }
30 | }
31 | }
32 |
--------------------------------------------------------------------------------
/cliff.toml:
--------------------------------------------------------------------------------
1 | [changelog]
2 | header = """
3 | # Changelog\n
4 | This is an automated changelog based on the commits in this repository.
5 |
6 | Check the notes in the [releases](https://github.com/melMass/comfy_mtb/releases) for more information.
7 | """
8 | # https://keats.github.io/tera/docs/#introduction
9 | body = """
10 | {% if version -%}\
11 | ## [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%Y-%m-%d") }}
12 | {% else %}\
13 | ## [Unreleased]
14 | {% endif -%}\
15 |
16 | {% for group, commits in commits | group_by(attribute="group") %}
17 | ### {{ group | upper_first }}
18 | {% for commit in commits %}
19 | - {% if commit.breaking %}[**breaking**] {% endif %}{{ commit.message | upper_first | trim }} ([{{ commit.id | truncate(length=7, end="") }}](/commit/{{ commit.id }}))\
20 | {% if commit.github.username and commit.github.username != remote.github.owner %} by [@{{ commit.github.username }}](https://github.com/{{ commit.github.username }}){%- endif -%}
21 | {% if commit.github.pr_number %} in [#{{ commit.github.pr_number }}](/pull/{{ commit.github.pr_number }}){%- endif -%}
22 | {% endfor %}
23 | {% endfor %}
24 |
25 | {%- if github.contributors | filter(attribute="is_first_time", value=true) | length != 0 %}
26 | ## New Contributors
27 | {%- endif -%}
28 |
29 | {% for contributor in github.contributors | filter(attribute="is_first_time", value=true) %}
30 | * [@{{ contributor.username }}](https://github.com/{{ contributor.username }}) made their first contribution in [#{{ contributor.pr_number }}](/pull/{{ contributor.pr_number }})\
31 | {%- endfor %}\n
32 | """
33 | footer = """
34 | {% for release in releases -%}
35 | {% if release.version -%}
36 | {% if release.previous.version -%}
37 | [{{ release.version | trim_start_matches(pat="v") }}]: \
38 | /compare/{{ release.previous.version }}..{{ release.version }}
39 | {% endif -%}
40 | {% else -%}
41 | [unreleased]: /compare/{{ release.previous.version }}..HEAD
42 | {% endif -%}
43 | {% endfor %}
44 | """
45 | trim = true
46 | postprocessors = [
47 | { pattern = '', replace = "https://github.com/melMass/comfy_mtb" }, # replace repository URL
48 | ]
49 |
50 | [git]
51 | # https://www.conventionalcommits.org
52 | conventional_commits = true
53 | filter_unconventional = true
54 | split_commits = false
55 | commit_preprocessors = [
56 | # { pattern = '\((\w+\s)?#([0-9]+)\)', replace = "([#${2}](/issues/${2}))" }, # replace issue numbers
57 | { pattern = '\((\w+\s)?#([0-9]+)\)', replace = "" },
58 | ]
59 | commit_parsers = [
60 | { message = "^feat", group = "Features" },
61 | { message = "^fix", group = "Bug Fixes" },
62 | { message = "^doc", group = "Documentation" },
63 | { message = "^perf", group = "Performance" },
64 | { message = "^refactor", group = "Refactor" },
65 | { message = "^style", group = "Styling" },
66 | { message = "^test", group = "Testing" },
67 | { message = "^chore\\(release\\): prepare for", skip = true },
68 | { message = "^chore\\(deps\\)", skip = true },
69 | { message = "^chore\\(pr\\)", skip = true },
70 | { message = "^chore\\(pull\\)", skip = true },
71 | { message = "^chore|ci", group = "Miscellaneous Tasks" },
72 | { body = ".*security", group = "Security" },
73 | { message = "^revert", group = "Revert" },
74 | ]
75 | protect_breaking_commits = false
76 | filter_commits = false
77 | tag_pattern = "v[0-9].*"
78 | topo_order = false
79 | sort_commits = "newest"
80 |
81 | [remote.github]
82 | owner = "melMass"
83 | repo = "comfy_mtb"
84 |
--------------------------------------------------------------------------------
/data/font.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/melMass/comfy_mtb/4574c6451c1d7c256cdd062a01eff95099caf99f/data/font.ttf
--------------------------------------------------------------------------------
/errors.py:
--------------------------------------------------------------------------------
1 | class ModelNotFound(Exception):
2 | def __init__(self, model_name, *args, **kwargs):
3 | super().__init__(
4 | f"The model {model_name} could not be found, make sure to download it using ComfyManager first.\nrepository: https://github.com/ltdrdata/ComfyUI-Manager",
5 | *args,
6 | **kwargs,
7 | )
8 |
--------------------------------------------------------------------------------
/examples/08-note-plus.json:
--------------------------------------------------------------------------------
1 | {"last_node_id":9,"last_link_id":0,"nodes":[{"id":9,"type":"Note Plus (mtb)","pos":[332, 139, 0, 0, 0, 0, 0, 0, 0, 0],"size":[573.4446126650389, 1292.5298919072263],"flags":{},"order":0,"mode":0,"inputs":[],"outputs":[],"title":"Note+ (mtb)","properties":{},"widgets_values":["# Note+ Demo\n\n# Images \nyou can resize them (see showdown syntax)\n\n\n\n# iFrame (embeds)\nVIDEO \n\n# Headings\n\n# h1 Heading:smile:\n\n## h2 Heading\n\n### h3 Heading\n\n#### h4 Heading\n\n##### h5 Heading\n\n###### h6 Heading\n\n# Tables\n\nColons can be used to align columns.\n\n| Tables|Are|Cool |\n| ------------- |:-----------:| ----:|\n| col 3 is| right-aligned | $1600 |\n| col 2 is| centered| $12 |\n| zebra stripes | are neat|$1 |\n\nEmphasis, aka italics, with _asterisks_ or _underscores_.\n\nStrong emphasis, aka bold, with **asterisks** or **underscores**.\n\nCombined emphasis with **asterisks and _underscores_**.\n\nStrikethrough uses two tildes. ~~Scratch this.~~\n\n**This is bold text**\n\n**This is bold text**\n\n_This is italic text_\n\n_This is italic text_\n\n~~Strikethrough~~\n\n1. First ordered list item\n2. Another item\n\n- Unordered sub-list.\n\n1. Actual numbers don't matter, just that it's a number\n1. Ordered sub-list\n1. And another item.\n1.\n\n- [x] Finish my changes\n- [] Push my commits to GitHub\n- [] Open a pull request\n- [x] mentions:@melmass, #refs, [links](), **formatting**, and tags supported\n- [x] list syntax required (any unordered or ordered list supported)\n- [x] this is a complete item\n- [] this is an incomplete item\n","markdown","*{\ncolor:whitesmoke;\n}\n\nh1{\ncolor:cyan;\n}\nh2{\ncolor:yellow;\n}\nh3{\ncolor:pink;\n}\n\nstrong{\ncolor:red;\n}"],"color":"#223","bgcolor":"#335","shape":1}],"links":[],"groups":[],"config":{},"extra":{},"version":0.4}
2 |
--------------------------------------------------------------------------------
/examples/README.md:
--------------------------------------------------------------------------------
1 | # Examples
2 | All the examples use the [RevAnimated model 1.22](https://civitai.com/models/7371?modelVersionId=46846)
3 | ## 01 Faceswap
4 |
5 | This example showcase the `Face Swap` & `Restore Face` nodes to replace the character with Georges Lucas's face.
6 | The face reference image is using the `Load Image From Url` node to avoid bundling input images.
7 |
8 |
9 |
10 | ## 02 FILM interpolation
11 | This example showcase the FILM interpolation implementation. Here we do text replacement on the condition of two distinct images sharing the same model, input latent & seed to get relatively close images.
12 |
13 |
--------------------------------------------------------------------------------
/html/js/foldable.js:
--------------------------------------------------------------------------------
1 | /**
2 | * File: foldable.js
3 | * Project: comfy_mtb
4 | * Author: Mel Massadian
5 | *
6 | * Copyright (c) 2023 Mel Massadian
7 | *
8 | */
9 |
10 | function toggleFoldable(elementId, symbolId) {
11 | const content = document.getElementById(elementId)
12 | const symbol = document.getElementById(symbolId)
13 | if (content.style.display === 'none' || content.style.display === '') {
14 | content.style.display = 'flex'
15 | symbol.innerHTML = '▽' // Down arrow
16 | } else {
17 | content.style.display = 'none'
18 | symbol.innerHTML = '▷' // Right arrow
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/html/js/saveTableData.js:
--------------------------------------------------------------------------------
1 | /**
2 | * File: saveTableData.js
3 | * Project: comfy_mtb
4 | * Author: Mel Massadian
5 | *
6 | * Copyright (c) 2023 Mel Massadian
7 | *
8 | */
9 |
10 | function saveTableData(identifier) {
11 | const table = document.querySelector(
12 | `#style-editor table[data-id='${identifier}']`
13 | )
14 |
15 | let currentData = []
16 | const rows = table.querySelectorAll('tr')
17 | const filename = table.getAttribute('data-id')
18 |
19 | rows.forEach((row, rowIndex) => {
20 | const rowData = []
21 | const cells =
22 | rowIndex === 0
23 | ? row.querySelectorAll('th')
24 | : row.querySelectorAll('td input, td textarea')
25 |
26 | cells.forEach((cell) => {
27 | rowData.push(rowIndex === 0 ? cell.textContent : cell.value)
28 | })
29 |
30 | currentData.push(rowData)
31 | })
32 |
33 | let tablesData = {}
34 | tablesData[filename] = currentData
35 |
36 | console.debug('Sending styles to manage endpoint:', tablesData)
37 | fetch('/mtb/actions', {
38 | method: 'POST',
39 | headers: {
40 | 'Content-Type': 'application/json',
41 | },
42 | body: JSON.stringify({
43 | name: 'saveStyle',
44 | args: tablesData,
45 | }),
46 | })
47 | .then((response) => response.json())
48 | .then((data) => {
49 | console.debug('Success:', data)
50 | })
51 | .catch((error) => {
52 | console.error('Error:', error)
53 | })
54 | }
55 |
--------------------------------------------------------------------------------
/html/js/splitPane.js:
--------------------------------------------------------------------------------
1 | /**
2 | * File: splitPane.js
3 | * Project: comfy_mtb
4 | * Author: Mel Massadian
5 | *
6 | * Copyright (c) 2023 Mel Massadian
7 | *
8 | */
9 |
10 | function initSplitPane(vertical) {
11 | let resizer = document.getElementById('resizer')
12 | let left = document.getElementById('leftPane')
13 | let right = document.getElementById('rightPane')
14 | resizer.addEventListener('mousedown', function (e) {
15 | document.addEventListener('mousemove', onMouseMove)
16 | document.addEventListener('mouseup', function () {
17 | document.removeEventListener('mousemove', onMouseMove)
18 | })
19 | })
20 |
21 | const onMouseMove = (e) => {
22 | if (vertical) {
23 | let leftWidth = e.clientX
24 | let rightWidth = window.innerWidth - e.clientX
25 | left.style.width = leftWidth + 'px'
26 | right.style.width = rightWidth + 'px'
27 | } else {
28 | let topHeight = e.clientY
29 | let bottomHeight = window.innerHeight - e.clientY
30 | left.style.height = topHeight + 'px'
31 | right.style.height = bottomHeight + 'px'
32 | }
33 | }
34 | }
35 |
--------------------------------------------------------------------------------
/html/js/tabSwitch.js:
--------------------------------------------------------------------------------
1 | /**
2 | * File: tabSwitch.js
3 | * Project: comfy_mtb
4 | * Author: Mel Massadian
5 | *
6 | * Copyright (c) 2023 Mel Massadian
7 | *
8 | */
9 |
10 | function openTab(evt, tabName) {
11 | var i, tabcontent, tablinks
12 | tabcontent = document.getElementsByClassName('tabcontent')
13 | for (i = 0; i < tabcontent.length; i++) {
14 | tabcontent[i].style.display = 'none'
15 | }
16 | tablinks = document.getElementsByClassName('tablinks')
17 | for (i = 0; i < tablinks.length; i++) {
18 | tablinks[i].className = tablinks[i].className.replace(' active', '')
19 | }
20 | document.getElementById(tabName).style.display = 'block'
21 | evt.currentTarget.className += ' active'
22 | }
23 |
--------------------------------------------------------------------------------
/log.py:
--------------------------------------------------------------------------------
1 | import logging
2 | import os
3 | import re
4 |
5 | base_log_level = logging.DEBUG if os.environ.get("MTB_DEBUG") else logging.INFO
6 |
7 |
8 | # Custom object that discards the output
9 | class NullWriter:
10 | def write(self, text):
11 | pass
12 |
13 |
14 | class Formatter(logging.Formatter):
15 | grey = "\x1b[38;20m"
16 | cyan = "\x1b[36;20m"
17 | purple = "\x1b[35;20m"
18 | yellow = "\x1b[33;20m"
19 | red = "\x1b[31;20m"
20 | bold_red = "\x1b[31;1m"
21 | reset = "\x1b[0m"
22 | # format = "%(asctime)s - [%(name)s] - %(levelname)s - %(message)s (%(filename)s:%(lineno)d)"
23 | format = "[%(name)s] | %(levelname)s -> %(message)s"
24 |
25 | FORMATS = {
26 | logging.DEBUG: purple + format + reset,
27 | logging.INFO: cyan + format + reset,
28 | logging.WARNING: yellow + format + reset,
29 | logging.ERROR: red + format + reset,
30 | logging.CRITICAL: bold_red + format + reset,
31 | }
32 |
33 | def format(self, record):
34 | log_fmt = self.FORMATS.get(record.levelno)
35 | formatter = logging.Formatter(log_fmt)
36 | return formatter.format(record)
37 |
38 |
39 | def mklog(name: str, level: int = base_log_level):
40 | logger = logging.getLogger(name)
41 | logger.setLevel(level)
42 |
43 | for handler in logger.handlers:
44 | logger.removeHandler(handler)
45 |
46 | ch = logging.StreamHandler()
47 | ch.setLevel(level)
48 | ch.setFormatter(Formatter())
49 | logger.addHandler(ch)
50 |
51 | # Disable log propagation
52 | logger.propagate = False
53 |
54 | return logger
55 |
56 |
57 | # - The main app logger
58 | log = mklog(__package__, base_log_level)
59 |
60 |
61 | def log_user(arg: str):
62 | print(f"\033[34mComfy MTB Utils:\033[0m {arg}")
63 |
64 |
65 | def get_summary(docstring: str):
66 | return docstring.strip().split("\n\n", 1)[0]
67 |
68 |
69 | def blue_text(text: str):
70 | return f"\033[94m{text}\033[0m"
71 |
72 |
73 | def cyan_text(text: str):
74 | return f"\033[96m{text}\033[0m"
75 |
76 |
77 | def get_label(label: str):
78 | if label.startswith("MTB_"):
79 | label = label[4:]
80 |
81 | words = re.findall(
82 | r"(?:(?<=[a-z])(?=[A-Z])|(?<=[A-Z])(?=[A-Z][a-z])|(?<=[A-Za-z])(?=[0-9])|(?<=[0-9])(?=[A-Za-z]))",
83 | label,
84 | )
85 | reformatted_label = re.sub(r"([A-Z]+)", r" \1", label).strip()
86 | words = reformatted_label.split()
87 | return " ".join(words).strip()
88 |
--------------------------------------------------------------------------------
/nodes/__init__.py:
--------------------------------------------------------------------------------
1 | """MTB Nodes module."""
2 |
--------------------------------------------------------------------------------
/nodes/animation.py:
--------------------------------------------------------------------------------
1 | from ..log import log
2 |
3 |
4 | class MTB_AnimationBuilder:
5 | """Simple maths for animation."""
6 |
7 | @classmethod
8 | def INPUT_TYPES(cls):
9 | return {
10 | "required": {
11 | "total_frames": ("INT", {"default": 100, "min": 0}),
12 | # "fps": ("INT", {"default": 12, "min": 0}),
13 | "scale_float": ("FLOAT", {"default": 1.0, "min": 0.0}),
14 | "loop_count": ("INT", {"default": 1, "min": 0}),
15 | "raw_iteration": ("INT", {"default": 0, "min": 0}),
16 | "raw_loop": ("INT", {"default": 0, "min": 0}),
17 | },
18 | }
19 |
20 | RETURN_TYPES = ("INT", "FLOAT", "INT", "BOOLEAN")
21 | RETURN_NAMES = ("frame", "0-1 (scaled)", "count", "loop_ended")
22 | CATEGORY = "mtb/animation"
23 | FUNCTION = "build_animation"
24 | DESCRIPTION = """
25 | # Animation Builder
26 |
27 | Check the
28 | [wiki page](https://github.com/melMass/comfy_mtb/wiki/nodes-animation-builder)
29 | for more info.
30 |
31 |
32 | - This basic example should help to understand the meaning of
33 | its inputs and outputs thanks to the [debug](nodes-debug) node.
34 |
35 | 
36 |
37 | - In this other example Animation Builder is used in combination with
38 | [Batch From History](https://github.com/melMass/comfy_mtb/wiki/nodes-batch-from-history)
39 | to create a zoom-in animation on a static image
40 |
41 | 
42 |
43 | ## Inputs
44 |
45 | | name | description |
46 | | ---- | :----------:|
47 | | total_frames | The number of frame to queue (this is multiplied by the `loop_count`)|
48 | | scale_float | Convenience input to scale the normalized `current value` (a float between 0 and 1 lerp over the current queue length) |
49 | | loop_count | The number of loops to queue |
50 | | **Reset Button** | resets the internal counters, although the node is though around using its queue button it should still work fine when using the regular queue button of comfy |
51 | | **Queue Button** | Convenience button to run the queues (`total_frames` * `loop_count`) |
52 |
53 | """
54 |
55 | def build_animation(
56 | self,
57 | total_frames=100,
58 | # fps=12,
59 | scale_float=1.0,
60 | loop_count=1, # set in js
61 | raw_iteration=0, # set in js
62 | raw_loop=0, # set in js
63 | ):
64 | frame = raw_iteration % (total_frames)
65 | scaled = (frame / (total_frames - 1)) * scale_float
66 | # if frame == 0:
67 | # log.debug("Reseting history")
68 | # PromptServer.instance.prompt_queue.wipe_history()
69 | log.debug(f"frame: {frame}/{total_frames} scaled: {scaled}")
70 |
71 | return (frame, scaled, raw_loop, (frame == (total_frames - 1)))
72 |
73 |
74 | __nodes__ = [MTB_AnimationBuilder]
75 |
--------------------------------------------------------------------------------
/nodes/constant.py:
--------------------------------------------------------------------------------
1 | import json
2 |
3 | from ..log import log
4 |
5 |
6 | class MTB_Constant:
7 | @classmethod
8 | def INPUT_TYPES(cls):
9 | return {
10 | "required": {"Value": ("*",)},
11 | }
12 |
13 | RETURN_TYPES = ("*",)
14 | RETURN_NAMES = ("output",)
15 | CATEGORY = "mtb/utils"
16 | FUNCTION = "execute"
17 |
18 | def execute(
19 | self,
20 | **kwargs,
21 | ):
22 | log.debug("Received kwargs")
23 | log.debug(json.dumps(kwargs, check_circular=True))
24 | return (kwargs.get("Value"),)
25 |
26 |
27 | # __nodes__ = [MTB_Constant]
28 |
--------------------------------------------------------------------------------
/nodes/curve.py:
--------------------------------------------------------------------------------
1 | import json
2 |
3 | from ..log import log
4 |
5 |
6 | def deserialize_curve(curve):
7 | if isinstance(curve, str):
8 | curve = json.loads(curve)
9 | return curve
10 |
11 |
12 | def serialize_curve(curve):
13 | if not isinstance(curve, str):
14 | curve = json.dumps(curve)
15 | return curve
16 |
17 |
18 | class MTB_Curve:
19 | """A basic FLOAT_CURVE input node."""
20 |
21 | @classmethod
22 | def INPUT_TYPES(cls):
23 | return {
24 | "required": {
25 | "curve": ("FLOAT_CURVE",),
26 | },
27 | }
28 |
29 | RETURN_TYPES = ("FLOAT_CURVE",)
30 | FUNCTION = "do_curve"
31 |
32 | CATEGORY = "mtb/curve"
33 |
34 | def do_curve(self, curve):
35 | log.debug(f"Curve: {curve}")
36 | return (curve,)
37 |
38 |
39 | class MTB_CurveToFloat:
40 | """Convert a FLOAT_CURVE to a FLOAT or FLOATS"""
41 |
42 | @classmethod
43 | def INPUT_TYPES(cls):
44 | return {
45 | "required": {
46 | "curve": ("FLOAT_CURVE", {"forceInput": True}),
47 | "steps": ("INT", {"default": 10, "min": 2}),
48 | },
49 | }
50 |
51 | RETURN_TYPES = ("FLOATS", "FLOAT")
52 | FUNCTION = "do_curve"
53 |
54 | CATEGORY = "mtb/curve"
55 |
56 | def do_curve(self, curve, steps):
57 | log.debug(f"Curve: {curve}")
58 |
59 | # sort by x (should be handled by the widget)
60 | sorted_points = sorted(curve.items(), key=lambda item: item[1]["x"])
61 | # Extract X and Y values
62 | x_values = [point[1]["x"] for point in sorted_points]
63 | y_values = [point[1]["y"] for point in sorted_points]
64 | # Calculate step size
65 | step_size = (max(x_values) - min(x_values)) / (steps - 1)
66 |
67 | # Interpolate Y values for each step
68 | interpolated_y_values = []
69 | for step in range(steps):
70 | current_x = min(x_values) + step_size * step
71 |
72 | # Find the indices of the two points between which the current_x falls
73 | idx1 = max(idx for idx, x in enumerate(x_values) if x <= current_x)
74 | idx2 = min(idx for idx, x in enumerate(x_values) if x >= current_x)
75 |
76 | # If the current_x matches one of the points, no interpolation is needed
77 | if current_x == x_values[idx1]:
78 | interpolated_y_values.append(y_values[idx1])
79 | elif current_x == x_values[idx2]:
80 | interpolated_y_values.append(y_values[idx2])
81 | else:
82 | # Interpolate Y value using linear interpolation
83 | y1 = y_values[idx1]
84 | y2 = y_values[idx2]
85 | x1 = x_values[idx1]
86 | x2 = x_values[idx2]
87 | interpolated_y = y1 + (y2 - y1) * (current_x - x1) / (x2 - x1)
88 | interpolated_y_values.append(interpolated_y)
89 |
90 | return (interpolated_y_values, interpolated_y_values)
91 |
92 |
93 | __nodes__ = [MTB_Curve, MTB_CurveToFloat]
94 |
--------------------------------------------------------------------------------
/nodes/filter.py:
--------------------------------------------------------------------------------
1 | import torch
2 |
3 |
4 | class MTB_FilterZ:
5 | """Filters an image based on a depth map"""
6 |
7 | @classmethod
8 | def INPUT_TYPES(cls):
9 | return {
10 | "required": {
11 | "image": ("IMAGE",),
12 | "depth": ("IMAGE",),
13 | "to_black": ("BOOLEAN", {"default": True}),
14 | "threshold": (
15 | "FLOAT",
16 | {"default": 0.5, "step": 0.01, "min": 0.0, "max": 1.0},
17 | ),
18 | "invert": ("BOOLEAN", {"default": True}),
19 | },
20 | }
21 |
22 | RETURN_TYPES = ("IMAGE",)
23 | FUNCTION = "filter"
24 | CATEGORY = "mtb/filters"
25 |
26 | def filter(
27 | self,
28 | image: torch.Tensor,
29 | depth: torch.Tensor,
30 | to_black,
31 | threshold: float,
32 | invert,
33 | ):
34 | # Normalize depth map to be in range [0, 1]
35 | depth_normalized = (depth - depth.min()) / (depth.max() - depth.min())
36 |
37 | # Calculate the difference from the threshold
38 | diff_from_threshold = torch.abs(depth_normalized - threshold)
39 |
40 | out_img = None
41 |
42 | if to_black:
43 | if invert:
44 | soft_mask = diff_from_threshold >= threshold
45 | else:
46 | soft_mask = diff_from_threshold <= threshold
47 |
48 | out_img = image.clone()
49 | out_img[soft_mask] = 0
50 | return (out_img,)
51 | else:
52 | alpha_channel = 1 - diff_from_threshold / threshold
53 | alpha_channel = torch.clamp(alpha_channel, 0, 1)
54 |
55 | if invert:
56 | # Invert the alpha channel
57 | alpha_channel = 1 - alpha_channel
58 |
59 | # Ensure alpha_channel has the correct shape
60 | # It should have the shape [batch_size, height, width, 1]
61 | alpha_channel = alpha_channel.unsqueeze(-1)
62 |
63 | # Combine RGB channels with alpha channel
64 | out_img = torch.cat((image, alpha_channel), dim=-1)
65 |
66 | return (out_img,)
67 |
68 |
69 | __nodes__ = [MTB_FilterZ]
70 |
--------------------------------------------------------------------------------
/nodes/latent_processing.py:
--------------------------------------------------------------------------------
1 | import torch
2 |
3 |
4 | class MTB_LatentLerp:
5 | """Linear interpolation (blend) between two latent vectors"""
6 |
7 | @classmethod
8 | def INPUT_TYPES(cls):
9 | return {
10 | "required": {
11 | "A": ("LATENT",),
12 | "B": ("LATENT",),
13 | "t": (
14 | "FLOAT",
15 | {"default": 0.5, "min": 0.0, "max": 1.0, "step": 0.01},
16 | ),
17 | }
18 | }
19 |
20 | RETURN_TYPES = ("LATENT",)
21 | FUNCTION = "lerp_latent"
22 |
23 | CATEGORY = "mtb/latent"
24 |
25 | def lerp_latent(self, A, B, t):
26 | a = A.copy()
27 | b = B.copy()
28 |
29 | torch.lerp(a["samples"], b["samples"], t, out=a["samples"])
30 |
31 | return (a,)
32 |
33 |
34 | __nodes__ = [
35 | MTB_LatentLerp,
36 | ]
37 |
--------------------------------------------------------------------------------
/nodes/mask.py:
--------------------------------------------------------------------------------
1 | import comfy.utils
2 | from PIL import Image
3 |
4 | from ..utils import pil2tensor, tensor2pil
5 |
6 |
7 | class MTB_ImageRemoveBackgroundRembg:
8 | """Removes the background from the input using Rembg."""
9 |
10 | @classmethod
11 | def INPUT_TYPES(cls):
12 | return {
13 | "required": {
14 | "image": ("IMAGE",),
15 | "alpha_matting": (
16 | "BOOLEAN",
17 | {"default": False},
18 | ),
19 | "alpha_matting_foreground_threshold": (
20 | "INT",
21 | {"default": 240, "min": 0, "max": 255},
22 | ),
23 | "alpha_matting_background_threshold": (
24 | "INT",
25 | {"default": 10, "min": 0, "max": 255},
26 | ),
27 | "alpha_matting_erode_size": (
28 | "INT",
29 | {"default": 10, "min": 0, "max": 255},
30 | ),
31 | "post_process_mask": (
32 | "BOOLEAN",
33 | {"default": False},
34 | ),
35 | "bgcolor": (
36 | "COLOR",
37 | {"default": "#000000"},
38 | ),
39 | },
40 | }
41 |
42 | RETURN_TYPES = (
43 | "IMAGE",
44 | "MASK",
45 | "IMAGE",
46 | )
47 | RETURN_NAMES = (
48 | "Image (rgba)",
49 | "Mask",
50 | "Image",
51 | )
52 | FUNCTION = "remove_background"
53 | CATEGORY = "mtb/image"
54 |
55 | # bgcolor: Optional[Tuple[int, int, int, int]]
56 | def remove_background(
57 | self,
58 | image,
59 | alpha_matting,
60 | alpha_matting_foreground_threshold,
61 | alpha_matting_background_threshold,
62 | alpha_matting_erode_size,
63 | post_process_mask,
64 | bgcolor,
65 | ):
66 | from rembg import remove
67 |
68 | pbar = comfy.utils.ProgressBar(image.size(0))
69 | images = tensor2pil(image)
70 |
71 | out_img = []
72 | out_mask = []
73 | out_img_on_bg = []
74 |
75 | for img in images:
76 | img_rm = remove(
77 | data=img,
78 | alpha_matting=alpha_matting,
79 | alpha_matting_foreground_threshold=alpha_matting_foreground_threshold,
80 | alpha_matting_background_threshold=alpha_matting_background_threshold,
81 | alpha_matting_erode_size=alpha_matting_erode_size,
82 | session=None,
83 | only_mask=False,
84 | post_process_mask=post_process_mask,
85 | bgcolor=None,
86 | )
87 |
88 | # extract the alpha to a new image
89 | mask = img_rm.getchannel(3)
90 |
91 | # add our bgcolor behind the image
92 | image_on_bg = Image.new("RGBA", img_rm.size, bgcolor)
93 |
94 | image_on_bg.paste(img_rm, mask=mask)
95 |
96 | image_on_bg = image_on_bg.convert("RGB")
97 |
98 | out_img.append(img_rm)
99 | out_mask.append(mask)
100 | out_img_on_bg.append(image_on_bg)
101 |
102 | pbar.update(1)
103 |
104 | return (
105 | pil2tensor(out_img),
106 | pil2tensor(out_mask),
107 | pil2tensor(out_img_on_bg),
108 | )
109 |
110 |
111 | __nodes__ = [
112 | MTB_ImageRemoveBackgroundRembg,
113 | ]
114 |
--------------------------------------------------------------------------------
/nodes/number.py:
--------------------------------------------------------------------------------
1 | class MTB_IntToBool:
2 | """Basic int to bool conversion"""
3 |
4 | @classmethod
5 | def INPUT_TYPES(cls):
6 | return {
7 | "required": {
8 | "int": (
9 | "INT",
10 | {
11 | "default": 0,
12 | },
13 | ),
14 | }
15 | }
16 |
17 | RETURN_TYPES = ("BOOLEAN",)
18 | FUNCTION = "int_to_bool"
19 | CATEGORY = "mtb/number"
20 |
21 | def int_to_bool(self, int):
22 | return (bool(int),)
23 |
24 |
25 | class MTB_IntToNumber:
26 | """Node addon for the WAS Suite. Converts a "comfy" INT to a NUMBER."""
27 |
28 | @classmethod
29 | def INPUT_TYPES(cls):
30 | return {
31 | "required": {
32 | "int": (
33 | "INT",
34 | {
35 | "default": 0,
36 | "min": -1e9,
37 | "max": 1e9,
38 | "step": 1,
39 | "forceInput": True,
40 | },
41 | ),
42 | }
43 | }
44 |
45 | RETURN_TYPES = ("NUMBER",)
46 | FUNCTION = "int_to_number"
47 | CATEGORY = "mtb/number"
48 |
49 | def int_to_number(self, int):
50 | return (int,)
51 |
52 |
53 | class MTB_FloatToNumber:
54 | """Node addon for the WAS Suite. Converts a "comfy" FLOAT to a NUMBER."""
55 |
56 | @classmethod
57 | def INPUT_TYPES(cls):
58 | return {
59 | "required": {
60 | "float": (
61 | "FLOAT",
62 | {
63 | "default": 0,
64 | "min": -1e9,
65 | "max": 1e9,
66 | "step": 1,
67 | "forceInput": True,
68 | },
69 | ),
70 | }
71 | }
72 |
73 | RETURN_TYPES = ("NUMBER",)
74 | FUNCTION = "float_to_number"
75 | CATEGORY = "mtb/number"
76 |
77 | def float_to_number(self, float):
78 | return (float,)
79 |
80 |
81 | __nodes__ = [
82 | MTB_FloatToNumber,
83 | MTB_IntToBool,
84 | MTB_IntToNumber,
85 | ]
86 |
--------------------------------------------------------------------------------
/nodes/qrcode.py:
--------------------------------------------------------------------------------
1 | import qrcode
2 | import torch
3 | from PIL import Image
4 |
5 | from ..log import log
6 | from ..utils import pil2tensor
7 |
8 |
9 | class MTB_QrCode:
10 | """Basic QR Code generator."""
11 |
12 | @classmethod
13 | def INPUT_TYPES(cls):
14 | return {
15 | "required": {
16 | "url": ("STRING", {"default": "https://www.github.com"}),
17 | "width": (
18 | "INT",
19 | {"default": 256, "max": 8096, "min": 0, "step": 1},
20 | ),
21 | "height": (
22 | "INT",
23 | {"default": 256, "max": 8096, "min": 0, "step": 1},
24 | ),
25 | "error_correct": (("L", "M", "Q", "H"), {"default": "L"}),
26 | "box_size": (
27 | "INT",
28 | {"default": 10, "max": 8096, "min": 0, "step": 1},
29 | ),
30 | "border": (
31 | "INT",
32 | {"default": 4, "max": 8096, "min": 0, "step": 1},
33 | ),
34 | "invert": (("BOOLEAN",), {"default": False}),
35 | }
36 | }
37 |
38 | RETURN_TYPES = ("IMAGE",)
39 | FUNCTION = "do_qr"
40 | CATEGORY = "mtb/generate"
41 |
42 | def do_qr(
43 | self,
44 | *,
45 | url: str,
46 | width: int,
47 | height: int,
48 | error_correct: str,
49 | box_size: int,
50 | border: int,
51 | invert: bool,
52 | ) -> tuple[torch.Tensor]:
53 | log.warning(
54 | "This node will soon be deprecated, there are much better alternatives like https://github.com/coreyryanhanson/comfy-qr"
55 | )
56 | if error_correct == "L" or error_correct not in ["M", "Q", "H"]:
57 | error_correct = qrcode.constants.ERROR_CORRECT_L
58 | elif error_correct == "M":
59 | error_correct = qrcode.constants.ERROR_CORRECT_M
60 | elif error_correct == "Q":
61 | error_correct = qrcode.constants.ERROR_CORRECT_Q
62 | else:
63 | error_correct = qrcode.constants.ERROR_CORRECT_H
64 |
65 | qr = qrcode.QRCode(
66 | version=1,
67 | error_correction=error_correct,
68 | box_size=box_size,
69 | border=border,
70 | )
71 | qr.add_data(url)
72 | qr.make(fit=True)
73 |
74 | back_color = (255, 255, 255) if invert else (0, 0, 0)
75 | fill_color = (0, 0, 0) if invert else (255, 255, 255)
76 |
77 | code = qr.make_image(back_color=back_color, fill_color=fill_color)
78 |
79 | # that we now resize without filtering
80 | code = code.resize((width, height), Image.NEAREST)
81 |
82 | return (pil2tensor(code),)
83 |
84 |
85 | __nodes__ = [MTB_QrCode]
86 |
--------------------------------------------------------------------------------
/pyrightconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "exclude": [
3 | "**/node_modules",
4 | "**/__pycache__",
5 | ],
6 | "ignore": [
7 | "extern"
8 | ],
9 | "defineConstant": {
10 | "DEBUG": true
11 | },
12 | "venvPath": "../../../.venv/",
13 | "reportMissingImports": true,
14 | "reportMissingTypeStubs": false,
15 | "pythonVersion": "3.10",
16 | "pythonPlatform": "All",
17 | "reportOptionalMemberAccess": "none"
18 | }
--------------------------------------------------------------------------------
/requirements.txt:
--------------------------------------------------------------------------------
1 | qrcode[pil]
2 | onnxruntime-gpu
3 | requirements-parser
4 | # opencv-contrib
5 | rembg
6 | imageio_ffmpeg
7 | rich
8 | rich_argparse
9 | matplotlib
10 | pillow
11 | cachetools
12 | transformers
13 |
--------------------------------------------------------------------------------
/scripts/get_deps.py:
--------------------------------------------------------------------------------
1 | import os
2 | import ast
3 | import json
4 | import sys
5 | from rich.console import Console
6 | from rich.table import Table
7 | from rich.progress import Progress
8 |
9 | console = Console(stderr=True)
10 |
11 |
12 | def get_imported_modules(filename):
13 | with open(filename, "r") as file:
14 | tree = ast.parse(file.read())
15 |
16 | imported_modules = []
17 | for node in ast.walk(tree):
18 | if isinstance(node, ast.Import):
19 | imported_modules.extend(
20 | (alias.name, alias.name in sys.builtin_module_names)
21 | for alias in node.names
22 | )
23 | elif isinstance(node, ast.ImportFrom):
24 | if node.module:
25 | imported_modules.append(
26 | (node.module, node.module in sys.builtin_module_names)
27 | )
28 |
29 | return imported_modules
30 |
31 |
32 | def list_imported_modules(folder):
33 | modules = []
34 |
35 | file_count = sum(len(files) for _, _, files in os.walk(folder))
36 | progress = Progress()
37 |
38 | task = progress.add_task("[cyan]Scanning files...", total=file_count)
39 |
40 | for root, _, files in os.walk(folder):
41 | for file in files:
42 | if file.endswith(".py"):
43 | file_path = os.path.join(root, file)
44 | imported_modules = get_imported_modules(file_path)
45 | modules.extend(imported_modules)
46 | progress.update(task, advance=1)
47 |
48 | progress.stop()
49 |
50 | return modules
51 |
52 |
53 | if __name__ == "__main__":
54 | if len(sys.argv) < 2:
55 | console.print(
56 | "[bold red]Please provide the folder path as a command-line argument.[/bold red]"
57 | )
58 | sys.exit(1)
59 |
60 | # folder_path = input("Enter the folder path: ")
61 | # while not os.path.isdir(folder_path):
62 | # console.print("[bold red]Invalid folder path![/bold red]")
63 | # folder_path = input("Enter the folder path: ")
64 | folder_path = sys.argv[1]
65 | if not os.path.isdir(folder_path):
66 | console.print("[bold red]Invalid folder path![/bold red]")
67 | sys.exit(1)
68 |
69 | console.print("[bold green]=== Python Imported Modules ===[/bold green]\n")
70 | console.print(f"Scanning folder: [bold]{folder_path}[/bold]\n")
71 |
72 | imported_modules = list_imported_modules(folder_path)
73 |
74 | console.print(f"\n[bold green]Imported Modules:[/bold green]\n")
75 |
76 | table = Table(show_header=True, header_style="bold cyan")
77 | table.add_column("Module")
78 | table.add_column("Type")
79 |
80 | for module, is_builtin in imported_modules:
81 | module_type = "Built-in" if is_builtin else "External"
82 | table.add_row(module, module_type)
83 |
84 | console.print(table)
85 |
86 | json_data = json.dumps(
87 | [
88 | {"module": module, "type": "Built-in" if is_builtin else "External"}
89 | for module, is_builtin in imported_modules
90 | ],
91 | indent=4,
92 | )
93 | print(json_data)
94 |
--------------------------------------------------------------------------------
/scripts/update_changelog.nu:
--------------------------------------------------------------------------------
1 | $env.GITHUB_TOKEN = (gh auth token)
2 | git cliff --tag main | save -f CHANGELOG.md
--------------------------------------------------------------------------------
/styles.csv:
--------------------------------------------------------------------------------
1 | name,prompt,negative_prompt
2 | ❌Low Token,,"embedding:EasyNegative, NSFW, Cleavage, Pubic Hair, Nudity, Naked, censored"
3 | ✅Line Art / Manga,"(Anime Scene, Toonshading, Satoshi Kon, Ken Sugimori, Hiromu Arakawa:1.2), (Anime Style, Manga Style:1.3), Low detail, sketch, concept art, line art, webtoon, manhua, hand drawn, defined lines, simple shades, minimalistic, High contrast, Linear compositions, Scalable artwork, Digital art, High Contrast Shadows, glow effects, humorous illustration, big depth of field, Masterpiece, colors, concept art, trending on artstation, Vivid colors, dramatic",
4 |
--------------------------------------------------------------------------------
/types/shared.d.ts:
--------------------------------------------------------------------------------
1 | // Some manual types I use to facilitate developing on top of
2 | // Comfy's Litegraph implementation.
3 |
4 | import type {
5 | ContextMenuItem,
6 | LGraphNode,
7 | IWidget,
8 | LGraph,
9 | } from '../../../web/types/litegraph'
10 |
11 | export type {
12 | ComfyExtension,
13 | ComfyObjectInfo,
14 | ComfyObjectInfoConfig,
15 | } from '../../../web/types/comfy'
16 |
17 | export type {
18 | ContextMenuItem,
19 | IWidget,
20 | LLink,
21 | INodeInputSlot,
22 | INodeOutputSlot,
23 | } from '../../../web/types/litegraph'
24 |
25 | export type VectorWidget = IWidget
26 | export interface NodeData {
27 | category: str
28 | description: str
29 | display_name: str
30 | input: NodeInput
31 | name: str
32 | output: [str]
33 | output_is_list: [boolean]
34 | output_name: [str]
35 | output_node: boolean
36 | }
37 |
38 | export interface ComfyDialog {
39 | element: Element
40 | close: () => void
41 | show: (html: str) => void
42 | }
43 |
44 | export interface ComfySettingsDialog {
45 | app: ComfyApp
46 | element: Element
47 | settingsValues: Record
48 | settingsLookup: Record
49 | load: () => Promise
50 | setSettingValueAsync: (id: string, value: unknown) => Promise
51 | }
52 |
53 | export interface ComfyUI {
54 | app: ComfyApp
55 | dialog: ComfyDialog
56 | settings: ComfySettingsDialog
57 | autoQueueMode: 'instant' | 'change'
58 | batchCount: number
59 | lastQueueSize: number
60 | graphHasChanged: boolean
61 | queue: ComfyList
62 | history: ComfyList
63 | }
64 |
65 | /**Very incomplete Comfy App definition*/
66 | interface ComfyApp {
67 | graph: LGraph
68 | queueItems: { number: number; batchCount: number }[]
69 | processingQueue: boolean
70 | ui: ComfyUI
71 | extensions: ComfyExtension[]
72 | nodeOutputs: Record
73 | nodePreviewImages: Record
74 | shiftDown: boolean
75 | isImageNode: (node: LGraphNodeExtended) => boolean
76 | queuePrompt: (number: number, batchCount: number) => Promise
77 | /** Loads workflow data from the specified file*/
78 | handleFile: (file: File) => Promise
79 | }
80 |
81 | export type { ComfyApp as App }
82 |
83 | export interface LGraphNodeExtension {
84 | addDOMWidget: (
85 | name: string,
86 | type: string,
87 | element: Element,
88 | options: Record,
89 | ) => IWidget
90 | onNodeCreated: () => void
91 | getExtraMenuOptions: () => ContextMenuItem[]
92 | prototype: LGraphNodeExtended
93 | }
94 |
95 | export type LGraphNodeExtended = LGraphNode & LGraphNodeExtension
96 |
97 | export interface NodeType /*extends LGraphNode*/ {
98 | category: str
99 | comfyClass: str
100 | length: 0
101 | name: str
102 | nodeData: NodeData
103 | prototype: LGraphNodeExtended
104 | title: str
105 | type: str
106 | }
107 |
108 | export interface NodeInput {
109 | required: object
110 | }
111 |
112 | // NOTE: for prototype overriding
113 | export type OnDrawWidgetParams = Parameters
114 | export type OnDrawForegroundParams = Parameters
115 | export type OnMouseDownParams = Parameters
116 | export type OnConnectionsChangeParams = Parameters<
117 | LGraphNode['onConnectionsChange']
118 | >
119 | export type OnNodeCreatedParams = Parameters<
120 | LGraphNodeExtension['onNodeCreated']
121 | >
122 |
123 | export interface DocumentationOptions {
124 | icon_size?: number
125 | icon_margin?: number
126 | }
127 |
--------------------------------------------------------------------------------
/types/typedefs.js:
--------------------------------------------------------------------------------
1 | /**
2 | * @typedef {import("./shared.d.ts").NodeData} NodeData
3 | * @typedef {import("./shared.d.ts").NodeType} NodeType
4 | * @typedef {import("./shared.d.ts").DocumentationOptions} DocumentationOptions
5 | * @typedef {import("./shared.d.ts").OnDrawForegroundParams} OnDrawForegroundParams
6 | * @typedef {import("./shared.d.ts").OnMouseDownParams} OnMouseDownParams
7 | * @typedef {import("./shared.d.ts").OnConnectionsChangeParams} OnConnectionsChangeParams
8 | * @typedef {import("./shared.d.ts").ContextMenuItem} ContextMenuItem
9 | * @typedef {import("./shared.d.ts").IWidget} IWidget
10 | * @typedef {import("./shared.d.ts").VectorWidget} VectorWidget
11 | * @typedef {import("./shared.d.ts").LGraphNodeExtended} LGraphNode
12 | * @typedef {import("./shared.d.ts").LLink} LLink
13 | * @typedef {import("./shared.d.ts").App} App
14 | * @typedef {import("./shared.d.ts").OnDrawWidgetParams} OnDrawWidgetParams
15 | * @typedef {import("./shared.d.ts").INodeInputSlot} INodeInputSlot
16 | * @typedef {import("./shared.d.ts").INodeOutputSlot} INodeOutputSlot
17 | */
18 |
19 | /**
20 | * @typedef {Object} ResultItem
21 | * @property {string} [filename] - The filename of the item.
22 | * @property {string} [subfolder] - The subfolder of the item.
23 | * @property {string} [type] - The type of the item.
24 | */
25 |
26 | /**
27 | * @typedef {Object} Outputs
28 | * @property {ResultItem[]} [audio] - Audio result items.
29 | * @property {ResultItem[]} [images] - Image result items.
30 | * @property {ResultItem[]} [animated] - Animated result items.
31 | */
32 |
33 | /**
34 | * @typedef {Record} TaskOutput
35 | * - A record mapping Node IDs to their Outputs.
36 | */
37 |
38 | /**
39 | * @typedef {Array} TaskPrompt
40 | * @property {QueueIndex} [0] - The queue index.
41 | * @property {PromptId} [1] - The unique prompt ID.
42 | * @property {PromptInputs} [2] - The prompt inputs.
43 | * @property {ExtraData} [3] - Extra data.
44 | * @property {OutputsToExecute} [4] - The outputs to execute.
45 | */
46 |
47 | /**
48 | * @typedef {Object} HistoryTaskItem
49 | * @property {'History'} taskType - The type of task.
50 | * @property {TaskPrompt} prompt - The task prompt.
51 | * @property {Status} [status] - The status of the task.
52 | * @property {TaskOutput} outputs - The task outputs.
53 | * @property {TaskMeta} [meta] - Optional task metadata.
54 | */
55 |
56 | /**
57 | * @typedef {Object} ExecInfo
58 | * @property {number} queue_remaining - The number of items remaining in the queue.
59 | */
60 |
61 | /**
62 | * @typedef {Object} StatusWsMessageStatus
63 | * @property {ExecInfo} exec_info - Execution information.
64 | */
65 |
66 |
--------------------------------------------------------------------------------
/web/README.md:
--------------------------------------------------------------------------------
1 | ## Core
2 | These 3 scripts cannot be used independently and must all be present to work, they are mostly enhancing the frontend of python nodes
3 | - `comfy_shared`: library of methods used in `mtb_widgets` and `debug`
4 |
5 | **mtb_widgets** define ui callbacks, and various widgets like the `COLOR` type:
6 |
7 |
8 | or the `BOOL` type:
9 |
10 |
11 | There is also `Debug` which is a node that should be able to display any data input, it handle a few cases and fallback to the string representation of the
12 | data otherwise:
13 | 
14 |
15 |
16 | **note +**
17 | A basic HTML note mainly to add better looking notes/instructions for workflow makers:
18 | 
19 |
20 |
21 | ## Standalone
22 | These scripts can be taken and placed independently of `comfy_mtb` or any other files, mimicking what pythongosss did for their
23 |
24 | - **imageFeed**: a fork of @pythongosssss ' s [image feed](https://github.com/pythongosssss/ComfyUI-Custom-Scripts/tree/main/js), it adds support for: a lightbox to see images bigger, a way to load the current session history (in case of a web page reload), and different icons, most of the work come from the original script.
25 |
26 |
27 | > **NOTE**
28 | >
29 | > The original imagefeed got updated since and offer more options, ideally I would clean my lightbox thing and PR it to pythongoss later but in the meantime the script will detect if you already use the original one and not load this fork
30 |
31 |
32 | - 
33 |
34 |
35 | - **notify**: a basic toast notification system that I use in some places accross mtb, it can be used by simply calling `window.MTB.notify("Hello world!")`
36 | 
37 |
--------------------------------------------------------------------------------
/web/mtb_sidebar.js:
--------------------------------------------------------------------------------
1 | // NOTE: this will be the LT part of mtb API system
2 | // I need to properly publish the source and fix a few things before
3 |
4 | // import { app } from '../../scripts/app.js'
5 | // // import { api } from '../../scripts/api.js'
6 | //
7 | // import * as shared from './comfy_shared.js'
8 | // import { createOutliner } from './dist/mtb_inspector.js'
9 | //
10 | // if (window?.__COMFYUI_FRONTEND_VERSION__) {
11 | // const version = window?.__COMFYUI_FRONTEND_VERSION__
12 | // console.log(`%c ${version}`, 'background: orange; color: white;')
13 | //
14 | // const panel = app.extensionManager.registerSidebarTab({
15 | // id: 'mtb-nodes',
16 | // icon: 'pi pi-bolt',
17 | // title: 'MTB',
18 | // tooltip: 'MTB: API outliner',
19 | // type: 'custom',
20 | // // this is run everytime the tab's diplay is toggled on.
21 | // render: (el) => {
22 | // const outliner = createOutliner(el)
23 | // const inputs = shared.getAPIInputs()
24 | // console.log('INPUTS', inputs)
25 | // outliner.$$set({ inputs })
26 | // },
27 | // })
28 | // }
29 |
--------------------------------------------------------------------------------
/web/notify.js:
--------------------------------------------------------------------------------
1 | /**
2 | * File: notify.js
3 | * Project: comfy_mtb
4 | * Author: Mel Massadian
5 | *
6 | * Copyright (c) 2023 Mel Massadian
7 | *
8 | */
9 |
10 | import { app } from '../../scripts/app.js'
11 |
12 | const log = (...args) => {
13 | if (window.MTB?.TRACE) {
14 | console.debug(...args)
15 | }
16 | }
17 |
18 | let transition_time = 300
19 |
20 | const containerStyle = `
21 | position: fixed;
22 | top: 20px;
23 | left: 20px;
24 | font-family: monospace;
25 | z-index: 99999;
26 | height: 0;
27 | overflow: hidden;
28 | transition: height ${transition_time}ms ease-in-out;
29 |
30 | `
31 |
32 | const toastStyle = `
33 | background-color: #333;
34 | color: #fff;
35 | padding: 10px;
36 | border-radius: 5px;
37 | opacity: 0;
38 | overflow:hidden;
39 | height:20px;
40 | transition-property: opacity, height, padding;
41 | transition-duration: ${transition_time}ms;
42 | `
43 |
44 | function notify(message, timeout = 3000) {
45 | log('Creating toast')
46 | const container = document.getElementById('mtb-notify-container')
47 | const toast = document.createElement('div')
48 | toast.style.cssText = toastStyle
49 | toast.innerText = message
50 | container.appendChild(toast)
51 |
52 | toast.addEventListener('transitionend', (e) => {
53 | // Only on out
54 | if (
55 | e.target === toast &&
56 | e.propertyName === 'height' &&
57 | e.elapsedTime > transition_time / 1000 - Number.EPSILON
58 | ) {
59 | log('Transition out')
60 | const totalHeight = Array.from(container.children).reduce(
61 | (acc, child) => acc + child.offsetHeight + 10, // Add spacing of 10px between toasts
62 | 0
63 | )
64 | container.style.height = `${totalHeight}px`
65 |
66 | // If there are no toasts left, set the container's height to 0
67 | if (container.children.length === 0) {
68 | container.style.height = '0'
69 | }
70 |
71 | setTimeout(() => {
72 | container.removeChild(toast)
73 | log('Removed toast from DOM')
74 | }, transition_time)
75 | } else {
76 | log('Transition')
77 | }
78 | })
79 |
80 | // Fading in the toast
81 | toast.style.opacity = '1'
82 |
83 | // Update container's height to fit new toast
84 | const totalHeight = Array.from(container.children).reduce(
85 | (acc, child) => acc + child.offsetHeight + 10, // Add spacing of 10px between toasts
86 | 0
87 | )
88 | container.style.height = `${totalHeight}px`
89 |
90 | // remove the toast after the specified timeout
91 | setTimeout(() => {
92 | // trigger the transitions
93 | toast.style.opacity = '0'
94 | toast.style.height = '0'
95 | toast.style.paddingTop = '0'
96 | toast.style.paddingBottom = '0'
97 | }, timeout - transition_time)
98 | }
99 |
100 | app.registerExtension({
101 | name: 'mtb.Notify',
102 | setup() {
103 | if (!window.MTB) {
104 | window.MTB = {}
105 | }
106 |
107 | const container = document.createElement('div')
108 | container.id = 'mtb-notify-container'
109 | container.style.cssText = containerStyle
110 |
111 | document.body.appendChild(container)
112 | window.MTB.notify = notify
113 | // window.MTB.notify('Hello world!')
114 | },
115 | })
116 |
--------------------------------------------------------------------------------
/web_async/ace/ext-elastic_tabstops_lite.js:
--------------------------------------------------------------------------------
1 | ace.define("ace/ext/elastic_tabstops_lite",["require","exports","module","ace/editor","ace/config"],function(e,t,n){"use strict";var r=function(){function e(e){this.$editor=e;var t=this,n=[],r=!1;this.onAfterExec=function(){r=!1,t.processRows(n),n=[]},this.onExec=function(){r=!0},this.onChange=function(e){r&&(n.indexOf(e.start.row)==-1&&n.push(e.start.row),e.end.row!=e.start.row&&n.push(e.end.row))}}return e.prototype.processRows=function(e){this.$inChange=!0;var t=[];for(var n=0,r=e.length;n-1)continue;var s=this.$findCellWidthsForBlock(i),o=this.$setBlockCellWidthsToMax(s.cellWidths),u=s.firstRow;for(var a=0,f=o.length;a=0){n=this.$cellWidthsForRow(r);if(n.length==0)break;t.unshift(n),r--}var i=r+1;r=e;var s=this.$editor.session.getLength();while(r0&&(this.$editor.session.getDocument().insertInLine({row:e,column:f+1},Array(l+1).join(" ")+" "),this.$editor.session.getDocument().removeInLine(e,f,f+1),r+=l),l<0&&p>=-l&&(this.$editor.session.getDocument().removeInLine(e,f+l,f),r+=l)}},e.prototype.$izip_longest=function(e){if(!e[0])return[];var t=e[0].length,n=e.length;for(var r=1;rt&&(t=i)}var s=[];for(var o=0;o=t.length?t.length:e.length,r=[];for(var i=0;in)return{start:o.index,end:o.index+o[2].length};if(s&&s[2])return u=t+s[2].length,{start:u,end:u+s[3].length}}var n=t.column||e.getOption("printMarginColumn"),i=t.allowMerge!=0,s=Math.min(t.startRow,t.endRow),o=Math.max(t.startRow,t.endRow),u=e.session;while(s<=o){var a=u.getLine(s);if(a.length>n){var f=m(a,n,5);if(f){var l=/^\s*/.exec(a)[0];u.replace(new r(s,f.start,s,f.end),"\n"+l)}o++}else if(i&&/\S/.test(a)&&s!=o){var c=u.getLine(s+1);if(c&&/\S/.test(c)){var h=a.replace(/\s+$/,""),p=c.replace(/^\s+/,""),d=h+" "+p,f=m(d,n,5);if(f&&f.start>h.length||d.length0?t.getSelection().moveCursorTo(n.row-1,t.session.getLine(n.row-1).length):t.getSelection().isEmpty()?n.column+=1:n.setPosition(n.row,n.column+1))}function o(e){e.editor.session.$bidiHandler.isMoveLeftOperation=/gotoleft|selectleft|backspace|removewordleft/.test(e.command.name)}function u(e,t){var n=t.session;n.$bidiHandler.currentRow=null;if(n.$bidiHandler.isRtlLine(e.start.row)&&e.action==="insert"&&e.lines.length>1)for(var r=e.start.row;r 0!";if(e==this.$splits)return;if(e>this.$splits){while(this.$splitse)t=this.$editors[this.$splits-1],this.$container.removeChild(t.container),this.$splits--;this.resize()},this.getSplits=function(){return this.$splits},this.getEditor=function(e){return this.$editors[e]},this.getCurrentEditor=function(){return this.$cEditor},this.focus=function(){this.$cEditor.focus()},this.blur=function(){this.$cEditor.blur()},this.setTheme=function(e){this.$editors.forEach(function(t){t.setTheme(e)})},this.setKeyboardHandler=function(e){this.$editors.forEach(function(t){t.setKeyboardHandler(e)})},this.forEach=function(e,t){this.$editors.forEach(e,t)},this.$fontSize="",this.setFontSize=function(e){this.$fontSize=e,this.forEach(function(t){t.setFontSize(e)})},this.$cloneSession=function(e){var t=new a(e.getDocument(),e.getMode()),n=e.getUndoManager();return t.setUndoManager(n),t.setTabSize(e.getTabSize()),t.setUseSoftTabs(e.getUseSoftTabs()),t.setOverwrite(e.getOverwrite()),t.setBreakpoints(e.getBreakpoints()),t.setUseWrapMode(e.getUseWrapMode()),t.setUseWorker(e.getUseWorker()),t.setWrapLimitRange(e.$wrapLimitRange.min,e.$wrapLimitRange.max),t.$foldData=e.$cloneFoldData(),t},this.setSession=function(e,t){var n;t==null?n=this.$cEditor:n=this.$editors[t];var r=this.$editors.some(function(t){return t.session===e});return r&&(e=this.$cloneSession(e)),n.setSession(e),e},this.getOrientation=function(){return this.$orientation},this.setOrientation=function(e){if(this.$orientation==e)return;this.$orientation=e,this.resize()},this.resize=function(){var e=this.$container.clientWidth,t=this.$container.clientHeight,n;if(this.$orientation==this.BESIDE){var r=e/this.$splits;for(var i=0;i0&&!(s%l)&&!(f%l)&&(r[l]=(r[l]||0)+1),n[f]=(n[f]||0)+1}s=f}while(up.score&&(p={score:v,length:u})}if(p.score&&p.score>1.4)var m=p.length;if(i>d+1){if(m==1||di+1)return{ch:" ",length:m}},t.detectIndentation=function(e){var n=e.getLines(0,1e3),r=t.$detectIndentation(n)||{};return r.ch&&e.setUseSoftTabs(r.ch==" "),r.length&&e.setTabSize(r.length),r},t.trimTrailingSpace=function(e,t){var n=e.getDocument(),r=n.getAllLines(),i=t&&t.trimEmpty?-1:0,s=[],o=-1;t&&t.keepCursorPosition&&(e.selection.rangeCount?e.selection.rangeList.ranges.forEach(function(e,t,n){var r=n[t+1];if(r&&r.cursor.row==e.cursor.row)return;s.push(e.cursor)}):s.push(e.selection.getCursor()),o=0);var u=s[o]&&s[o].row;for(var a=0,f=r.length;ai&&(c=s[o].column),o++,u=s[o]?s[o].row:-1),c>i&&n.removeInLine(a,c,l.length)}},t.convertIndentation=function(e,t,n){var i=e.getTabString()[0],s=e.getTabSize();n||(n=s),t||(t=i);var o=t==" "?t:r.stringRepeat(t,n),u=e.doc,a=u.getAllLines(),f={},l={};for(var c=0,h=a.length;c span {\n font-weight: normal !important;\n}\n\n.ace-github .ace_marker-layer .ace_step {\n background: rgb(252, 255, 0);\n}\n\n.ace-github .ace_marker-layer .ace_stack {\n background: rgb(164, 229, 101);\n}\n\n.ace-github .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid rgb(192, 192, 192);\n}\n\n.ace-github .ace_gutter-active-line {\n background-color : rgba(0, 0, 0, 0.07);\n}\n\n.ace-github .ace_marker-layer .ace_selected-word {\n background: rgb(250, 250, 255);\n border: 1px solid rgb(200, 200, 250);\n}\n\n.ace-github .ace_invisible {\n color: #BFBFBF\n}\n\n.ace-github .ace_print-margin {\n width: 1px;\n background: #e8e8e8;\n}\n\n.ace-github .ace_indent-guide {\n background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==") right repeat-y;\n}\n\n.ace-github .ace_indent-guide-active {\n background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAAZSURBVHjaYvj///9/hivKyv8BAAAA//8DACLqBhbvk+/eAAAAAElFTkSuQmCC") right repeat-y;\n}\n'}),ace.define("ace/theme/github",["require","exports","module","ace/theme/github-css","ace/lib/dom"],function(e,t,n){t.isDark=!1,t.cssClass="ace-github",t.cssText=e("./github-css");var r=e("../lib/dom");r.importCssString(t.cssText,t.cssClass,!1)}); (function() {
2 | ace.require(["ace/theme/github"], function(m) {
3 | if (typeof module == "object" && typeof exports == "object" && module) {
4 | module.exports = m;
5 | }
6 | });
7 | })();
8 |
--------------------------------------------------------------------------------
/web_async/ace/theme-github_dark.js:
--------------------------------------------------------------------------------
1 | ace.define("ace/theme/github_dark-css",["require","exports","module"],function(e,t,n){n.exports=".ace-github-dark .ace_gutter {\n background: #24292e;\n color: #7388b5\n}\n\n.ace-github-dark .ace_print-margin {\n width: 1px;\n background: #00204b\n}\n\n.ace-github-dark {\n background-color: #24292e;\n color: #FFFFFF\n}\n\n.ace-github-dark .ace_constant.ace_other,\n.ace-github-dark .ace_cursor {\n color: #FFFFFF\n}\n\n.ace-github-dark .ace_marker-layer .ace_selection {\n background: #003F8E\n}\n\n.ace-github-dark.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px #24292e;\n}\n\n.ace-github-dark .ace_marker-layer .ace_step {\n background: rgb(127, 111, 19)\n}\n\n.ace-github-dark .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid #404F7D\n}\n\n.ace-github-dark .ace_marker-layer .ace_active-line {\n background: #00346E\n}\n\n.ace-github-dark .ace_gutter-active-line {\n background-color: #24292e\n}\n\n.ace-github-dark .ace_marker-layer .ace_selected-word {\n border: 1px solid #003F8E\n}\n\n.ace-github-dark .ace_invisible {\n color: #404F7D\n}\n\n.ace-github-dark .ace_keyword,\n.ace-github-dark .ace_meta,\n.ace-github-dark .ace_storage,\n.ace-github-dark .ace_storage.ace_type,\n.ace-github-dark .ace_support.ace_type {\n color: #ff7b72\n}\n\n.ace-github-dark .ace_keyword.ace_operator {\n color: #79c0ff\n}\n\n.ace-github-dark .ace_constant.ace_character,\n.ace-github-dark .ace_constant.ace_language,\n.ace-github-dark .ace_constant.ace_numeric,\n.ace-github-dark .ace_keyword.ace_other.ace_unit,\n.ace-github-dark .ace_support.ace_constant,\n.ace-github-dark .ace_variable.ace_parameter {\n color: #FFC58F\n}\n\n.ace-github-dark .ace_invalid {\n color: #FFFFFF;\n background-color: #F99DA5\n}\n\n.ace-github-dark .ace_invalid.ace_deprecated {\n color: #FFFFFF;\n background-color: #ff7b72\n}\n\n.ace-github-dark .ace_fold {\n background-color: #BBDAFF;\n border-color: #FFFFFF\n}\n\n.ace-github-dark .ace_entity.ace_name.ace_function,\n.ace-github-dark .ace_support.ace_function,\n.ace-github-dark .ace_variable {\n color: #BBDAFF\n}\n\n.ace-github-dark .ace_support.ace_class,\n.ace-github-dark .ace_support.ace_type {\n color: #FFEEAD\n}\n\n.ace-github-dark .ace_heading,\n.ace-github-dark .ace_markup.ace_heading,\n.ace-github-dark .ace_string {\n color: #9fcef6\n}\n\n.ace-github-dark .ace_entity.ace_name.ace_tag,\n.ace-github-dark .ace_entity.ace_other.ace_attribute-name,\n.ace-github-dark .ace_meta.ace_tag,\n.ace-github-dark .ace_string.ace_regexp,\n.ace-github-dark .ace_variable {\n color: #FF9DA4\n}\n\n.ace-github-dark .ace_comment {\n color: #7285B7\n}\n\n.ace-github-dark .ace_indent-guide {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYJDzqfwPAANXAeNsiA+ZAAAAAElFTkSuQmCC) right repeat-y\n}\n\n.ace-github-dark .ace_indent-guide-active {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQIW2PQ1dX9zzBz5sz/ABCcBFFentLlAAAAAElFTkSuQmCC) right repeat-y;\n}\n\n.ace-github-dark .ace_constant.ace_buildin {\n color: #0086B3;\n}\n\n.ace-github-dark .ace_variable.ace_language {\n color: #ffffff;\n}\n "}),ace.define("ace/theme/github_dark",["require","exports","module","ace/theme/github_dark-css","ace/lib/dom"],function(e,t,n){t.isDark=!0,t.cssClass="ace-github-dark",t.cssText=e("./github_dark-css");var r=e("../lib/dom");r.importCssString(t.cssText,t.cssClass,!1)}); (function() {
2 | ace.require(["ace/theme/github_dark"], function(m) {
3 | if (typeof module == "object" && typeof exports == "object" && module) {
4 | module.exports = m;
5 | }
6 | });
7 | })();
8 |
--------------------------------------------------------------------------------
/web_async/ace/theme-gob.js:
--------------------------------------------------------------------------------
1 | ace.define("ace/theme/gob-css",["require","exports","module"],function(e,t,n){n.exports=".ace-gob .ace_gutter {\n background: #0B1818;\n color: #03EE03\n}\n\n.ace-gob .ace_print-margin {\n width: 1px;\n background: #131313\n}\n\n.ace-gob {\n background-color: #0B0B0B;\n color: #00FF00\n}\n\n.ace-gob .ace_cursor {\n border-color: rgba(16, 248, 255, 0.90);\n background-color: rgba(16, 240, 248, 0.70);\n opacity: 0.4;\n}\n\n.ace-gob .ace_marker-layer .ace_selection {\n background: rgba(221, 240, 255, 0.20)\n}\n\n.ace-gob.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px #141414;\n}\n\n.ace-gob .ace_marker-layer .ace_step {\n background: rgb(16, 128, 0)\n}\n\n.ace-gob .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid rgba(64, 255, 255, 0.25)\n}\n\n.ace-gob .ace_marker-layer .ace_active-line {\n background: rgba(255, 255, 255, 0.04)\n}\n\n.ace-gob .ace_gutter-active-line {\n background-color: rgba(255, 255, 255, 0.04)\n}\n\n.ace-gob .ace_marker-layer .ace_selected-word {\n border: 1px solid rgba(192, 240, 255, 0.20)\n}\n\n.ace-gob .ace_invisible {\n color: rgba(255, 255, 255, 0.25)\n}\n\n.ace-gob .ace_keyword,\n.ace-gob .ace_meta {\n color: #10D8E8\n}\n\n.ace-gob .ace_constant,\n.ace-gob .ace_constant.ace_character,\n.ace-gob .ace_constant.ace_character.ace_escape,\n.ace-gob .ace_constant.ace_other,\n.ace-gob .ace_heading,\n.ace-gob .ace_markup.ace_heading,\n.ace-gob .ace_support.ace_constant {\n color: #10F0A0\n}\n\n.ace-gob .ace_invalid.ace_illegal {\n color: #F8F8F8;\n background-color: rgba(86, 45, 86, 0.75)\n}\n\n.ace-gob .ace_invalid.ace_deprecated {\n text-decoration: underline;\n font-style: italic;\n color: #20F8C0\n}\n\n.ace-gob .ace_support {\n color: #20E8B0\n}\n\n.ace-gob .ace_fold {\n background-color: #50B8B8;\n border-color: #70F8F8\n}\n\n.ace-gob .ace_support.ace_function {\n color: #00F800\n}\n\n.ace-gob .ace_list,\n.ace-gob .ace_markup.ace_list,\n.ace-gob .ace_storage {\n color: #10FF98\n}\n\n.ace-gob .ace_entity.ace_name.ace_function,\n.ace-gob .ace_meta.ace_tag,\n.ace-gob .ace_variable {\n color: #00F868\n}\n\n.ace-gob .ace_string {\n color: #10F060\n}\n\n.ace-gob .ace_string.ace_regexp {\n color: #20F090;\n}\n\n.ace-gob .ace_comment {\n font-style: italic;\n color: #00E060;\n}\n\n.ace-gob .ace_variable {\n color: #00F888;\n}\n\n.ace-gob .ace_xml-pe {\n color: #488858;\n}\n\n.ace-gob .ace_indent-guide {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWMQERFpYLC1tf0PAAgOAnPnhxyiAAAAAElFTkSuQmCC) right repeat-y\n}\n\n.ace-gob .ace_indent-guide-active {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQIW2PQ1dX9zzBz5sz/ABCcBFFentLlAAAAAElFTkSuQmCC) right repeat-y;\n}\n"}),ace.define("ace/theme/gob",["require","exports","module","ace/theme/gob-css","ace/lib/dom"],function(e,t,n){t.isDark=!0,t.cssClass="ace-gob",t.cssText=e("./gob-css");var r=e("../lib/dom");r.importCssString(t.cssText,t.cssClass,!1)}); (function() {
2 | ace.require(["ace/theme/gob"], function(m) {
3 | if (typeof module == "object" && typeof exports == "object" && module) {
4 | module.exports = m;
5 | }
6 | });
7 | })();
8 |
--------------------------------------------------------------------------------
/web_async/ace/theme-gruvbox.js:
--------------------------------------------------------------------------------
1 | ace.define("ace/theme/gruvbox-css",["require","exports","module"],function(e,t,n){n.exports='.ace-gruvbox .ace_gutter-active-line {\n background-color: #3C3836;\n}\n\n.ace-gruvbox {\n color: #EBDAB4;\n background-color: #1D2021;\n}\n\n.ace-gruvbox .ace_invisible {\n color: #504945;\n}\n\n.ace-gruvbox .ace_marker-layer .ace_selection {\n background: rgba(179, 101, 57, 0.75)\n}\n\n.ace-gruvbox.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px #002240;\n}\n\n.ace-gruvbox .ace_keyword {\n color: #8ec07c;\n}\n\n.ace-gruvbox .ace_comment {\n font-style: italic;\n color: #928375;\n}\n\n.ace-gruvbox .ace-statement {\n color: red;\n}\n\n.ace-gruvbox .ace_variable {\n color: #84A598;\n}\n\n.ace-gruvbox .ace_variable.ace_language {\n color: #D2879B;\n}\n\n.ace-gruvbox .ace_constant {\n color: #C2859A;\n}\n\n.ace-gruvbox .ace_constant.ace_language {\n color: #C2859A;\n}\n\n.ace-gruvbox .ace_constant.ace_numeric {\n color: #C2859A;\n}\n\n.ace-gruvbox .ace_string {\n color: #B8BA37;\n}\n\n.ace-gruvbox .ace_support {\n color: #F9BC41;\n}\n\n.ace-gruvbox .ace_support.ace_function {\n color: #F84B3C;\n}\n\n.ace-gruvbox .ace_storage {\n color: #8FBF7F;\n}\n\n.ace-gruvbox .ace_keyword.ace_operator {\n color: #EBDAB4;\n}\n\n.ace-gruvbox .ace_punctuation.ace_operator {\n color: yellow;\n}\n\n.ace-gruvbox .ace_marker-layer .ace_active-line {\n background: #3C3836;\n}\n\n.ace-gruvbox .ace_marker-layer .ace_selected-word {\n border-radius: 4px;\n border: 8px solid #3f475d;\n}\n\n.ace-gruvbox .ace_print-margin {\n width: 5px;\n background: #3C3836;\n}\n\n.ace-gruvbox .ace_indent-guide {\n background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNQUFD4z6Crq/sfAAuYAuYl+7lfAAAAAElFTkSuQmCC") right repeat-y;\n}\n\n.ace-gruvbox .ace_indent-guide-active {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQIW2PQ1dX9zzBz5sz/ABCcBFFentLlAAAAAElFTkSuQmCC) right repeat-y;\n}\n'}),ace.define("ace/theme/gruvbox",["require","exports","module","ace/theme/gruvbox-css","ace/lib/dom"],function(e,t,n){t.isDark=!0,t.cssClass="ace-gruvbox",t.cssText=e("./gruvbox-css");var r=e("../lib/dom");r.importCssString(t.cssText,t.cssClass,!1)}); (function() {
2 | ace.require(["ace/theme/gruvbox"], function(m) {
3 | if (typeof module == "object" && typeof exports == "object" && module) {
4 | module.exports = m;
5 | }
6 | });
7 | })();
8 |
--------------------------------------------------------------------------------
/web_async/ace/theme-gruvbox_dark_hard.js:
--------------------------------------------------------------------------------
1 | ace.define("ace/theme/gruvbox_dark_hard-css",["require","exports","module"],function(e,t,n){n.exports=".ace-gruvbox-dark-hard .ace_gutter {\n background: #1d2021;\n color: rgb(132,126,106)\n}\n\n.ace-gruvbox-dark-hard .ace_print-margin {\n width: 1px;\n background: #e8e8e8\n}\n\n.ace-gruvbox-dark-hard {\n background-color: #1d2021;\n color: rgba(235, 219, 178, 0.50)\n}\n\n.ace-gruvbox-dark-hard .ace_cursor {\n color: #a89984\n}\n\n.ace-gruvbox-dark-hard .ace_marker-layer .ace_selection {\n background: #3c3836\n}\n\n.ace-gruvbox-dark-hard.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px #1d2021;\n border-radius: 2px\n}\n\n.ace-gruvbox-dark-hard .ace_marker-layer .ace_step {\n background: rgb(198, 219, 174)\n}\n\n.ace-gruvbox-dark-hard .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid rgba(235, 219, 178, 0.15)\n}\n\n.ace-gruvbox-dark-hard .ace_marker-layer .ace_active-line {\n background: #3c3836\n}\n\n.ace-gruvbox-dark-hard .ace_gutter-active-line {\n background-color: #3c3836\n}\n\n.ace-gruvbox-dark-hard .ace_marker-layer .ace_selected-word {\n border: 1px solid #3c3836\n}\n\n.ace-gruvbox-dark-hard .ace_fold {\n background-color: #b8bb26;\n border-color: rgba(235, 219, 178, 0.50)\n}\n\n.ace-gruvbox-dark-hard .ace_keyword {\n color: #fb4934\n}\n\n.ace-gruvbox-dark-hard .ace_keyword.ace_operator {\n color: #8ec07c\n}\n\n.ace-gruvbox-dark-hard .ace_keyword.ace_other.ace_unit {\n color: #b16286\n}\n\n.ace-gruvbox-dark-hard .ace_constant {\n color: #d3869b\n}\n\n.ace-gruvbox-dark-hard .ace_constant.ace_numeric {\n color: #d3869b\n}\n\n.ace-gruvbox-dark-hard .ace_constant.ace_character.ace_escape {\n color: #fb4934\n}\n\n.ace-gruvbox-dark-hard .ace_constant.ace_other {\n color: #d3869b\n}\n\n.ace-gruvbox-dark-hard .ace_support.ace_function {\n color: #8ec07c\n}\n\n.ace-gruvbox-dark-hard .ace_support.ace_constant {\n color: #d3869b\n}\n\n.ace-gruvbox-dark-hard .ace_support.ace_constant.ace_property-value {\n color: #f9f5d7\n}\n\n.ace-gruvbox-dark-hard .ace_support.ace_class {\n color: #fabd2f\n}\n\n.ace-gruvbox-dark-hard .ace_support.ace_type {\n color: #fabd2f\n}\n\n.ace-gruvbox-dark-hard .ace_storage {\n color: #fb4934\n}\n\n.ace-gruvbox-dark-hard .ace_invalid {\n color: #f9f5d7;\n background-color: #fb4934\n}\n\n.ace-gruvbox-dark-hard .ace_string {\n color: #b8bb26\n}\n\n.ace-gruvbox-dark-hard .ace_string.ace_regexp {\n color: #b8bb26\n}\n\n.ace-gruvbox-dark-hard .ace_comment {\n font-style: italic;\n color: #928374\n}\n\n.ace-gruvbox-dark-hard .ace_variable {\n color: #83a598\n}\n\n.ace-gruvbox-dark-hard .ace_variable.ace_language {\n color: #d3869b\n}\n\n.ace-gruvbox-dark-hard .ace_variable.ace_parameter {\n color: #f9f5d7\n}\n\n.ace-gruvbox-dark-hard .ace_meta.ace_tag {\n color: #f9f5d7\n}\n\n.ace-gruvbox-dark-hard .ace_entity.ace_other.ace_attribute-name {\n color: #fabd2f\n}\n\n.ace-gruvbox-dark-hard .ace_entity.ace_name.ace_function {\n color: #b8bb26\n}\n\n.ace-gruvbox-dark-hard .ace_entity.ace_name.ace_tag {\n color: #83a598\n}\n\n.ace-gruvbox-dark-hard .ace_markup.ace_heading {\n color: #b8bb26\n}\n\n.ace-gruvbox-dark-hard .ace_markup.ace_list {\n color: #83a598\n}\n\n.ace-gruvbox-dark-hard .ace_indent-guide-active {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQIW2PQ1dX9zzBz5sz/ABCcBFFentLlAAAAAElFTkSuQmCC) right repeat-y;\n}\n"}),ace.define("ace/theme/gruvbox_dark_hard",["require","exports","module","ace/theme/gruvbox_dark_hard-css","ace/lib/dom"],function(e,t,n){t.isDark=!0,t.cssClass="ace-gruvbox-dark-hard",t.cssText=e("./gruvbox_dark_hard-css");var r=e("../lib/dom");r.importCssString(t.cssText,t.cssClass)}); (function() {
2 | ace.require(["ace/theme/gruvbox_dark_hard"], function(m) {
3 | if (typeof module == "object" && typeof exports == "object" && module) {
4 | module.exports = m;
5 | }
6 | });
7 | })();
8 |
--------------------------------------------------------------------------------
/web_async/ace/theme-idle_fingers.js:
--------------------------------------------------------------------------------
1 | ace.define("ace/theme/idle_fingers-css",["require","exports","module"],function(e,t,n){n.exports=".ace-idle-fingers .ace_gutter {\n background: #3b3b3b;\n color: rgb(153,153,153)\n}\n\n.ace-idle-fingers .ace_print-margin {\n width: 1px;\n background: #3b3b3b\n}\n\n.ace-idle-fingers {\n background-color: #323232;\n color: #FFFFFF\n}\n\n.ace-idle-fingers .ace_cursor {\n color: #91FF00\n}\n\n.ace-idle-fingers .ace_marker-layer .ace_selection {\n background: rgba(90, 100, 126, 0.88)\n}\n\n.ace-idle-fingers.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px #323232;\n}\n\n.ace-idle-fingers .ace_marker-layer .ace_step {\n background: rgb(102, 82, 0)\n}\n\n.ace-idle-fingers .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid #404040\n}\n\n.ace-idle-fingers .ace_marker-layer .ace_active-line {\n background: #353637\n}\n\n.ace-idle-fingers .ace_gutter-active-line {\n background-color: #353637\n}\n\n.ace-idle-fingers .ace_marker-layer .ace_selected-word {\n border: 1px solid rgba(90, 100, 126, 0.88)\n}\n\n.ace-idle-fingers .ace_invisible {\n color: #404040\n}\n\n.ace-idle-fingers .ace_keyword,\n.ace-idle-fingers .ace_meta {\n color: #CC7833\n}\n\n.ace-idle-fingers .ace_constant,\n.ace-idle-fingers .ace_constant.ace_character,\n.ace-idle-fingers .ace_constant.ace_character.ace_escape,\n.ace-idle-fingers .ace_constant.ace_other,\n.ace-idle-fingers .ace_support.ace_constant {\n color: #6C99BB\n}\n\n.ace-idle-fingers .ace_invalid {\n color: #FFFFFF;\n background-color: #FF0000\n}\n\n.ace-idle-fingers .ace_fold {\n background-color: #CC7833;\n border-color: #FFFFFF\n}\n\n.ace-idle-fingers .ace_support.ace_function {\n color: #B83426\n}\n\n.ace-idle-fingers .ace_variable.ace_parameter {\n font-style: italic\n}\n\n.ace-idle-fingers .ace_string {\n color: #A5C261\n}\n\n.ace-idle-fingers .ace_string.ace_regexp {\n color: #CCCC33\n}\n\n.ace-idle-fingers .ace_comment {\n font-style: italic;\n color: #BC9458\n}\n\n.ace-idle-fingers .ace_meta.ace_tag {\n color: #FFE5BB\n}\n\n.ace-idle-fingers .ace_entity.ace_name {\n color: #FFC66D\n}\n\n.ace-idle-fingers .ace_collab.ace_user1 {\n color: #323232;\n background-color: #FFF980\n}\n\n.ace-idle-fingers .ace_indent-guide {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWMwMjLyZYiPj/8PAAreAwAI1+g0AAAAAElFTkSuQmCC) right repeat-y\n}\n\n.ace-idle-fingers .ace_indent-guide-active {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQIW2PQ1dX9zzBz5sz/ABCcBFFentLlAAAAAElFTkSuQmCC) right repeat-y;\n}\n"}),ace.define("ace/theme/idle_fingers",["require","exports","module","ace/theme/idle_fingers-css","ace/lib/dom"],function(e,t,n){t.isDark=!0,t.cssClass="ace-idle-fingers",t.cssText=e("./idle_fingers-css");var r=e("../lib/dom");r.importCssString(t.cssText,t.cssClass,!1)}); (function() {
2 | ace.require(["ace/theme/idle_fingers"], function(m) {
3 | if (typeof module == "object" && typeof exports == "object" && module) {
4 | module.exports = m;
5 | }
6 | });
7 | })();
8 |
--------------------------------------------------------------------------------
/web_async/ace/theme-kr_theme.js:
--------------------------------------------------------------------------------
1 | ace.define("ace/theme/kr_theme-css",["require","exports","module"],function(e,t,n){n.exports=".ace-kr-theme .ace_gutter {\n background: #1c1917;\n color: #FCFFE0\n}\n\n.ace-kr-theme .ace_print-margin {\n width: 1px;\n background: #1c1917\n}\n\n.ace-kr-theme {\n background-color: #0B0A09;\n color: #FCFFE0\n}\n\n.ace-kr-theme .ace_cursor {\n color: #FF9900\n}\n\n.ace-kr-theme .ace_marker-layer .ace_selection {\n background: rgba(170, 0, 255, 0.45)\n}\n\n.ace-kr-theme.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px #0B0A09;\n}\n\n.ace-kr-theme .ace_marker-layer .ace_step {\n background: rgb(102, 82, 0)\n}\n\n.ace-kr-theme .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid rgba(255, 177, 111, 0.32)\n}\n\n.ace-kr-theme .ace_marker-layer .ace_active-line {\n background: #38403D\n}\n\n.ace-kr-theme .ace_gutter-active-line {\n background-color : #38403D\n}\n\n.ace-kr-theme .ace_marker-layer .ace_selected-word {\n border: 1px solid rgba(170, 0, 255, 0.45)\n}\n\n.ace-kr-theme .ace_invisible {\n color: rgba(255, 177, 111, 0.32)\n}\n\n.ace-kr-theme .ace_keyword,\n.ace-kr-theme .ace_meta {\n color: #949C8B\n}\n\n.ace-kr-theme .ace_constant,\n.ace-kr-theme .ace_constant.ace_character,\n.ace-kr-theme .ace_constant.ace_character.ace_escape,\n.ace-kr-theme .ace_constant.ace_other {\n color: rgba(210, 117, 24, 0.76)\n}\n\n.ace-kr-theme .ace_invalid {\n color: #F8F8F8;\n background-color: #A41300\n}\n\n.ace-kr-theme .ace_support {\n color: #9FC28A\n}\n\n.ace-kr-theme .ace_support.ace_constant {\n color: #C27E66\n}\n\n.ace-kr-theme .ace_fold {\n background-color: #949C8B;\n border-color: #FCFFE0\n}\n\n.ace-kr-theme .ace_support.ace_function {\n color: #85873A\n}\n\n.ace-kr-theme .ace_storage {\n color: #FFEE80\n}\n\n.ace-kr-theme .ace_string {\n color: rgba(164, 161, 181, 0.8)\n}\n\n.ace-kr-theme .ace_string.ace_regexp {\n color: rgba(125, 255, 192, 0.65)\n}\n\n.ace-kr-theme .ace_comment {\n font-style: italic;\n color: #706D5B\n}\n\n.ace-kr-theme .ace_variable {\n color: #D1A796\n}\n\n.ace-kr-theme .ace_list,\n.ace-kr-theme .ace_markup.ace_list {\n background-color: #0F0040\n}\n\n.ace-kr-theme .ace_variable.ace_language {\n color: #FF80E1\n}\n\n.ace-kr-theme .ace_meta.ace_tag {\n color: #BABD9C\n}\n\n.ace-kr-theme .ace_indent-guide {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYFBXV/8PAAJoAXX4kT2EAAAAAElFTkSuQmCC) right repeat-y\n}\n\n.ace-kr-theme .ace_indent-guide-active {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQIW2PQ1dX9zzBz5sz/ABCcBFFentLlAAAAAElFTkSuQmCC) right repeat-y;\n}\n"}),ace.define("ace/theme/kr_theme",["require","exports","module","ace/theme/kr_theme-css","ace/lib/dom"],function(e,t,n){t.isDark=!0,t.cssClass="ace-kr-theme",t.cssText=e("./kr_theme-css");var r=e("../lib/dom");r.importCssString(t.cssText,t.cssClass,!1)}); (function() {
2 | ace.require(["ace/theme/kr_theme"], function(m) {
3 | if (typeof module == "object" && typeof exports == "object" && module) {
4 | module.exports = m;
5 | }
6 | });
7 | })();
8 |
--------------------------------------------------------------------------------
/web_async/ace/theme-kuroir.js:
--------------------------------------------------------------------------------
1 | ace.define("ace/theme/kuroir-css",["require","exports","module"],function(e,t,n){n.exports='/* THIS THEME WAS AUTOGENERATED BY Theme.tmpl.css (UUID: 467560D0-6ACE-4409-82FD-4791420837AC) */\n\n.ace-kuroir .ace_gutter {\n background: #e8e8e8;\n color: #333;\n}\n\n.ace-kuroir .ace_print-margin {\n width: 1px;\n background: #e8e8e8;\n}\n\n.ace-kuroir {\n background-color: #E8E9E8;\n color: #363636;\n}\n\n.ace-kuroir .ace_cursor {\n color: #202020;\n}\n\n.ace-kuroir .ace_marker-layer .ace_selection {\n background: rgba(245, 170, 0, 0.57);\n}\n\n.ace-kuroir.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px #E8E9E8;\n}\n\n.ace-kuroir .ace_marker-layer .ace_step {\n background: rgb(198, 219, 174);\n}\n\n.ace-kuroir .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid rgba(0, 0, 0, 0.29);\n}\n\n.ace-kuroir .ace_marker-layer .ace_active-line {\n background: rgba(203, 220, 47, 0.22);\n}\n\n.ace-kuroir .ace_gutter-active-line {\n background-color: rgba(203, 220, 47, 0.22);\n}\n\n.ace-kuroir .ace_marker-layer .ace_selected-word {\n border: 1px solid rgba(245, 170, 0, 0.57);\n}\n\n.ace-kuroir .ace_invisible {\n color: #BFBFBF\n}\n\n.ace-kuroir .ace_fold {\n border-color: #363636;\n}\n\n\n\n\n\n.ace-kuroir .ace_constant{color:#CD6839;}.ace-kuroir .ace_constant.ace_numeric{color:#9A5925;}.ace-kuroir .ace_support{color:#104E8B;}.ace-kuroir .ace_support.ace_function{color:#005273;}.ace-kuroir .ace_support.ace_constant{color:#CF6A4C;}.ace-kuroir .ace_storage{color:#A52A2A;}.ace-kuroir .ace_invalid.ace_illegal{color:#FD1224;\nbackground-color:rgba(255, 6, 0, 0.15);}.ace-kuroir .ace_invalid.ace_deprecated{text-decoration:underline;\nfont-style:italic;\ncolor:#FD1732;\nbackground-color:#E8E9E8;}.ace-kuroir .ace_string{color:#639300;}.ace-kuroir .ace_string.ace_regexp{color:#417E00;\nbackground-color:#C9D4BE;}.ace-kuroir .ace_comment{color:rgba(148, 148, 148, 0.91);\nbackground-color:rgba(220, 220, 220, 0.56);}.ace-kuroir .ace_variable{color:#009ACD;}.ace-kuroir .ace_meta.ace_tag{color:#005273;}.ace-kuroir .ace_markup.ace_heading{color:#B8012D;\nbackground-color:rgba(191, 97, 51, 0.051);}.ace-kuroir .ace_markup.ace_list{color:#8F5B26;}\n\n.ace-kuroir .ace_indent-guide {\n background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==") right repeat-y;\n}\n\n.ace-kuroir .ace_indent-guide-active {\n background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAAZSURBVHjaYvj///9/hivKyv8BAAAA//8DACLqBhbvk+/eAAAAAElFTkSuQmCC") right repeat-y;\n} \n'}),ace.define("ace/theme/kuroir",["require","exports","module","ace/theme/kuroir-css","ace/lib/dom"],function(e,t,n){t.isDark=!1,t.cssClass="ace-kuroir",t.cssText=e("./kuroir-css");var r=e("../lib/dom");r.importCssString(t.cssText,t.cssClass,!1)}); (function() {
2 | ace.require(["ace/theme/kuroir"], function(m) {
3 | if (typeof module == "object" && typeof exports == "object" && module) {
4 | module.exports = m;
5 | }
6 | });
7 | })();
8 |
--------------------------------------------------------------------------------
/web_async/ace/theme-merbivore.js:
--------------------------------------------------------------------------------
1 | ace.define("ace/theme/merbivore-css",["require","exports","module"],function(e,t,n){n.exports=".ace-merbivore .ace_gutter {\n background: #202020;\n color: #E6E1DC\n}\n\n.ace-merbivore .ace_print-margin {\n width: 1px;\n background: #555651\n}\n\n.ace-merbivore {\n background-color: #161616;\n color: #E6E1DC\n}\n\n.ace-merbivore .ace_cursor {\n color: #FFFFFF\n}\n\n.ace-merbivore .ace_marker-layer .ace_selection {\n background: #454545\n}\n\n.ace-merbivore.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px #161616;\n}\n\n.ace-merbivore .ace_marker-layer .ace_step {\n background: rgb(102, 82, 0)\n}\n\n.ace-merbivore .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid #404040\n}\n\n.ace-merbivore .ace_marker-layer .ace_active-line {\n background: #333435\n}\n\n.ace-merbivore .ace_gutter-active-line {\n background-color: #333435\n}\n\n.ace-merbivore .ace_marker-layer .ace_selected-word {\n border: 1px solid #454545\n}\n\n.ace-merbivore .ace_invisible {\n color: #404040\n}\n\n.ace-merbivore .ace_entity.ace_name.ace_tag,\n.ace-merbivore .ace_keyword,\n.ace-merbivore .ace_meta,\n.ace-merbivore .ace_meta.ace_tag,\n.ace-merbivore .ace_storage,\n.ace-merbivore .ace_support.ace_function {\n color: #FC6F09\n}\n\n.ace-merbivore .ace_constant,\n.ace-merbivore .ace_constant.ace_character,\n.ace-merbivore .ace_constant.ace_character.ace_escape,\n.ace-merbivore .ace_constant.ace_other,\n.ace-merbivore .ace_support.ace_type {\n color: #1EDAFB\n}\n\n.ace-merbivore .ace_constant.ace_character.ace_escape {\n color: #519F50\n}\n\n.ace-merbivore .ace_constant.ace_language {\n color: #FDC251\n}\n\n.ace-merbivore .ace_constant.ace_library,\n.ace-merbivore .ace_string,\n.ace-merbivore .ace_support.ace_constant {\n color: #8DFF0A\n}\n\n.ace-merbivore .ace_constant.ace_numeric {\n color: #58C554\n}\n\n.ace-merbivore .ace_invalid {\n color: #FFFFFF;\n background-color: #990000\n}\n\n.ace-merbivore .ace_fold {\n background-color: #FC6F09;\n border-color: #E6E1DC\n}\n\n.ace-merbivore .ace_comment {\n font-style: italic;\n color: #AD2EA4\n}\n\n.ace-merbivore .ace_entity.ace_other.ace_attribute-name {\n color: #FFFF89\n}\n\n.ace-merbivore .ace_indent-guide {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWMQFxf3ZXB1df0PAAdsAmERTkEHAAAAAElFTkSuQmCC) right repeat-y\n}\n\n.ace-merbivore .ace_indent-guide-active {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQIW2PQ1dX9zzBz5sz/ABCcBFFentLlAAAAAElFTkSuQmCC) right repeat-y;\n}\n"}),ace.define("ace/theme/merbivore",["require","exports","module","ace/theme/merbivore-css","ace/lib/dom"],function(e,t,n){t.isDark=!0,t.cssClass="ace-merbivore",t.cssText=e("./merbivore-css");var r=e("../lib/dom");r.importCssString(t.cssText,t.cssClass,!1)}); (function() {
2 | ace.require(["ace/theme/merbivore"], function(m) {
3 | if (typeof module == "object" && typeof exports == "object" && module) {
4 | module.exports = m;
5 | }
6 | });
7 | })();
8 |
--------------------------------------------------------------------------------
/web_async/ace/theme-merbivore_soft.js:
--------------------------------------------------------------------------------
1 | ace.define("ace/theme/merbivore_soft-css",["require","exports","module"],function(e,t,n){n.exports=".ace-merbivore-soft .ace_gutter {\n background: #262424;\n color: #E6E1DC\n}\n\n.ace-merbivore-soft .ace_print-margin {\n width: 1px;\n background: #262424\n}\n\n.ace-merbivore-soft {\n background-color: #1C1C1C;\n color: #E6E1DC\n}\n\n.ace-merbivore-soft .ace_cursor {\n color: #FFFFFF\n}\n\n.ace-merbivore-soft .ace_marker-layer .ace_selection {\n background: #494949\n}\n\n.ace-merbivore-soft.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px #1C1C1C;\n}\n\n.ace-merbivore-soft .ace_marker-layer .ace_step {\n background: rgb(102, 82, 0)\n}\n\n.ace-merbivore-soft .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid #404040\n}\n\n.ace-merbivore-soft .ace_marker-layer .ace_active-line {\n background: #333435\n}\n\n.ace-merbivore-soft .ace_gutter-active-line {\n background-color: #333435\n}\n\n.ace-merbivore-soft .ace_marker-layer .ace_selected-word {\n border: 1px solid #494949\n}\n\n.ace-merbivore-soft .ace_invisible {\n color: #404040\n}\n\n.ace-merbivore-soft .ace_entity.ace_name.ace_tag,\n.ace-merbivore-soft .ace_keyword,\n.ace-merbivore-soft .ace_meta,\n.ace-merbivore-soft .ace_meta.ace_tag,\n.ace-merbivore-soft .ace_storage {\n color: #FC803A\n}\n\n.ace-merbivore-soft .ace_constant,\n.ace-merbivore-soft .ace_constant.ace_character,\n.ace-merbivore-soft .ace_constant.ace_character.ace_escape,\n.ace-merbivore-soft .ace_constant.ace_other,\n.ace-merbivore-soft .ace_support.ace_type {\n color: #68C1D8\n}\n\n.ace-merbivore-soft .ace_constant.ace_character.ace_escape {\n color: #B3E5B4\n}\n\n.ace-merbivore-soft .ace_constant.ace_language {\n color: #E1C582\n}\n\n.ace-merbivore-soft .ace_constant.ace_library,\n.ace-merbivore-soft .ace_string,\n.ace-merbivore-soft .ace_support.ace_constant {\n color: #8EC65F\n}\n\n.ace-merbivore-soft .ace_constant.ace_numeric {\n color: #7FC578\n}\n\n.ace-merbivore-soft .ace_invalid,\n.ace-merbivore-soft .ace_invalid.ace_deprecated {\n color: #FFFFFF;\n background-color: #FE3838\n}\n\n.ace-merbivore-soft .ace_fold {\n background-color: #FC803A;\n border-color: #E6E1DC\n}\n\n.ace-merbivore-soft .ace_comment,\n.ace-merbivore-soft .ace_meta {\n font-style: italic;\n color: #AC4BB8\n}\n\n.ace-merbivore-soft .ace_entity.ace_other.ace_attribute-name {\n color: #EAF1A3\n}\n\n.ace-merbivore-soft .ace_indent-guide {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWOQkpLyZfD09PwPAAfYAnaStpHRAAAAAElFTkSuQmCC) right repeat-y\n}\n\n.ace-merbivore-soft .ace_indent-guide-active {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQIW2PQ1dX9zzBz5sz/ABCcBFFentLlAAAAAElFTkSuQmCC) right repeat-y;\n}\n"}),ace.define("ace/theme/merbivore_soft",["require","exports","module","ace/theme/merbivore_soft-css","ace/lib/dom"],function(e,t,n){t.isDark=!0,t.cssClass="ace-merbivore-soft",t.cssText=e("./merbivore_soft-css");var r=e("../lib/dom");r.importCssString(t.cssText,t.cssClass,!1)}); (function() {
2 | ace.require(["ace/theme/merbivore_soft"], function(m) {
3 | if (typeof module == "object" && typeof exports == "object" && module) {
4 | module.exports = m;
5 | }
6 | });
7 | })();
8 |
--------------------------------------------------------------------------------
/web_async/ace/theme-mono_industrial.js:
--------------------------------------------------------------------------------
1 | ace.define("ace/theme/mono_industrial-css",["require","exports","module"],function(e,t,n){n.exports=".ace-mono-industrial .ace_gutter {\n background: #1d2521;\n color: #C5C9C9\n}\n\n.ace-mono-industrial .ace_print-margin {\n width: 1px;\n background: #555651\n}\n\n.ace-mono-industrial {\n background-color: #222C28;\n color: #FFFFFF\n}\n\n.ace-mono-industrial .ace_cursor {\n color: #FFFFFF\n}\n\n.ace-mono-industrial .ace_marker-layer .ace_selection {\n background: rgba(145, 153, 148, 0.40)\n}\n\n.ace-mono-industrial.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px #222C28;\n}\n\n.ace-mono-industrial .ace_marker-layer .ace_step {\n background: rgb(102, 82, 0)\n}\n\n.ace-mono-industrial .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid rgba(102, 108, 104, 0.50)\n}\n\n.ace-mono-industrial .ace_marker-layer .ace_active-line {\n background: rgba(12, 13, 12, 0.25)\n}\n\n.ace-mono-industrial .ace_gutter-active-line {\n background-color: rgba(12, 13, 12, 0.25)\n}\n\n.ace-mono-industrial .ace_marker-layer .ace_selected-word {\n border: 1px solid rgba(145, 153, 148, 0.40)\n}\n\n.ace-mono-industrial .ace_invisible {\n color: rgba(102, 108, 104, 0.50)\n}\n\n.ace-mono-industrial .ace_string {\n background-color: #151C19;\n color: #FFFFFF\n}\n\n.ace-mono-industrial .ace_keyword,\n.ace-mono-industrial .ace_meta {\n color: #A39E64\n}\n\n.ace-mono-industrial .ace_constant,\n.ace-mono-industrial .ace_constant.ace_character,\n.ace-mono-industrial .ace_constant.ace_character.ace_escape,\n.ace-mono-industrial .ace_constant.ace_numeric,\n.ace-mono-industrial .ace_constant.ace_other {\n color: #E98800\n}\n\n.ace-mono-industrial .ace_entity.ace_name.ace_function,\n.ace-mono-industrial .ace_keyword.ace_operator,\n.ace-mono-industrial .ace_variable {\n color: #A8B3AB\n}\n\n.ace-mono-industrial .ace_invalid {\n color: #FFFFFF;\n background-color: rgba(153, 0, 0, 0.68)\n}\n\n.ace-mono-industrial .ace_support.ace_constant {\n color: #C87500\n}\n\n.ace-mono-industrial .ace_fold {\n background-color: #A8B3AB;\n border-color: #FFFFFF\n}\n\n.ace-mono-industrial .ace_support.ace_function {\n color: #588E60\n}\n\n.ace-mono-industrial .ace_entity.ace_name,\n.ace-mono-industrial .ace_support.ace_class,\n.ace-mono-industrial .ace_support.ace_type {\n color: #5778B6\n}\n\n.ace-mono-industrial .ace_storage {\n color: #C23B00\n}\n\n.ace-mono-industrial .ace_variable.ace_language,\n.ace-mono-industrial .ace_variable.ace_parameter {\n color: #648BD2\n}\n\n.ace-mono-industrial .ace_comment {\n color: #666C68;\n background-color: #151C19\n}\n\n.ace-mono-industrial .ace_entity.ace_other.ace_attribute-name {\n color: #909993\n}\n\n.ace-mono-industrial .ace_entity.ace_name.ace_tag {\n color: #A65EFF\n}\n\n.ace-mono-industrial .ace_indent-guide {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNQ1NbwZfALD/4PAAlTArlEC4r/AAAAAElFTkSuQmCC) right repeat-y\n}\n\n.ace-mono-industrial .ace_indent-guide-active {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQIW2PQ1dX9zzBz5sz/ABCcBFFentLlAAAAAElFTkSuQmCC) right repeat-y;\n}\n"}),ace.define("ace/theme/mono_industrial",["require","exports","module","ace/theme/mono_industrial-css","ace/lib/dom"],function(e,t,n){t.isDark=!0,t.cssClass="ace-mono-industrial",t.cssText=e("./mono_industrial-css");var r=e("../lib/dom");r.importCssString(t.cssText,t.cssClass,!1)}); (function() {
2 | ace.require(["ace/theme/mono_industrial"], function(m) {
3 | if (typeof module == "object" && typeof exports == "object" && module) {
4 | module.exports = m;
5 | }
6 | });
7 | })();
8 |
--------------------------------------------------------------------------------
/web_async/ace/theme-monokai.js:
--------------------------------------------------------------------------------
1 | ace.define("ace/theme/monokai-css",["require","exports","module"],function(e,t,n){n.exports=".ace-monokai .ace_gutter {\n background: #2F3129;\n color: #8F908A\n}\n\n.ace-monokai .ace_print-margin {\n width: 1px;\n background: #555651\n}\n\n.ace-monokai {\n background-color: #272822;\n color: #F8F8F2\n}\n\n.ace-monokai .ace_cursor {\n color: #F8F8F0\n}\n\n.ace-monokai .ace_marker-layer .ace_selection {\n background: #49483E\n}\n\n.ace-monokai.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px #272822;\n}\n\n.ace-monokai .ace_marker-layer .ace_step {\n background: rgb(102, 82, 0)\n}\n\n.ace-monokai .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid #49483E\n}\n\n.ace-monokai .ace_marker-layer .ace_active-line {\n background: #202020\n}\n\n.ace-monokai .ace_gutter-active-line {\n background-color: #272727\n}\n\n.ace-monokai .ace_marker-layer .ace_selected-word {\n border: 1px solid #49483E\n}\n\n.ace-monokai .ace_invisible {\n color: #52524d\n}\n\n.ace-monokai .ace_entity.ace_name.ace_tag,\n.ace-monokai .ace_keyword,\n.ace-monokai .ace_meta.ace_tag,\n.ace-monokai .ace_storage {\n color: #F92672\n}\n\n.ace-monokai .ace_punctuation,\n.ace-monokai .ace_punctuation.ace_tag {\n color: #fff\n}\n\n.ace-monokai .ace_constant.ace_character,\n.ace-monokai .ace_constant.ace_language,\n.ace-monokai .ace_constant.ace_numeric,\n.ace-monokai .ace_constant.ace_other {\n color: #AE81FF\n}\n\n.ace-monokai .ace_invalid {\n color: #F8F8F0;\n background-color: #F92672\n}\n\n.ace-monokai .ace_invalid.ace_deprecated {\n color: #F8F8F0;\n background-color: #AE81FF\n}\n\n.ace-monokai .ace_support.ace_constant,\n.ace-monokai .ace_support.ace_function {\n color: #66D9EF\n}\n\n.ace-monokai .ace_fold {\n background-color: #A6E22E;\n border-color: #F8F8F2\n}\n\n.ace-monokai .ace_storage.ace_type,\n.ace-monokai .ace_support.ace_class,\n.ace-monokai .ace_support.ace_type {\n font-style: italic;\n color: #66D9EF\n}\n\n.ace-monokai .ace_entity.ace_name.ace_function,\n.ace-monokai .ace_entity.ace_other,\n.ace-monokai .ace_entity.ace_other.ace_attribute-name,\n.ace-monokai .ace_variable {\n color: #A6E22E\n}\n\n.ace-monokai .ace_variable.ace_parameter {\n font-style: italic;\n color: #FD971F\n}\n\n.ace-monokai .ace_string {\n color: #E6DB74\n}\n\n.ace-monokai .ace_comment {\n color: #75715E\n}\n\n.ace-monokai .ace_indent-guide {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWPQ0FD0ZXBzd/wPAAjVAoxeSgNeAAAAAElFTkSuQmCC) right repeat-y\n}\n\n.ace-monokai .ace_indent-guide-active {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQIW2PQ1dX9zzBz5sz/ABCcBFFentLlAAAAAElFTkSuQmCC) right repeat-y;\n}\n"}),ace.define("ace/theme/monokai",["require","exports","module","ace/theme/monokai-css","ace/lib/dom"],function(e,t,n){t.isDark=!0,t.cssClass="ace-monokai",t.cssText=e("./monokai-css");var r=e("../lib/dom");r.importCssString(t.cssText,t.cssClass,!1)}); (function() {
2 | ace.require(["ace/theme/monokai"], function(m) {
3 | if (typeof module == "object" && typeof exports == "object" && module) {
4 | module.exports = m;
5 | }
6 | });
7 | })();
8 |
--------------------------------------------------------------------------------
/web_async/ace/theme-nord_dark.js:
--------------------------------------------------------------------------------
1 | ace.define("ace/theme/nord_dark-css",["require","exports","module"],function(e,t,n){n.exports=".ace-nord-dark .ace_gutter {\n color: #616e88;\n}\n\n.ace-nord-dark .ace_print-margin {\n width: 1px;\n background: #4c566a;\n}\n\n.ace-nord-dark {\n background-color: #2e3440;\n color: #d8dee9;\n}\n\n.ace-nord-dark .ace_entity.ace_other.ace_attribute-name,\n.ace-nord-dark .ace_storage {\n color: #d8dee9;\n}\n\n.ace-nord-dark .ace_cursor {\n color: #d8dee9;\n}\n\n.ace-nord-dark .ace_string.ace_regexp {\n color: #bf616a;\n}\n\n.ace-nord-dark .ace_marker-layer .ace_active-line {\n background: #434c5ecc;\n}\n.ace-nord-dark .ace_marker-layer .ace_selection {\n background: #434c5ecc;\n}\n\n.ace-nord-dark.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px #2e3440;\n}\n\n.ace-nord-dark .ace_marker-layer .ace_step {\n background: #ebcb8b;\n}\n\n.ace-nord-dark .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid #88c0d066;\n}\n\n.ace-nord-dark .ace_gutter-active-line {\n background-color: #434c5ecc;\n}\n\n.ace-nord-dark .ace_marker-layer .ace_selected-word {\n border: 1px solid #88c0d066;\n}\n\n.ace-nord-dark .ace_invisible {\n color: #4c566a;\n}\n\n.ace-nord-dark .ace_keyword,\n.ace-nord-dark .ace_meta,\n.ace-nord-dark .ace_support.ace_class,\n.ace-nord-dark .ace_support.ace_type {\n color: #81a1c1;\n}\n\n.ace-nord-dark .ace_constant.ace_character,\n.ace-nord-dark .ace_constant.ace_other {\n color: #d8dee9;\n}\n\n.ace-nord-dark .ace_constant.ace_language {\n color: #5e81ac;\n}\n\n.ace-nord-dark .ace_constant.ace_escape {\n color: #ebcB8b;\n}\n\n.ace-nord-dark .ace_constant.ace_numeric {\n color: #b48ead;\n}\n\n.ace-nord-dark .ace_fold {\n background-color: #4c566a;\n border-color: #d8dee9;\n}\n\n.ace-nord-dark .ace_entity.ace_name.ace_function,\n.ace-nord-dark .ace_entity.ace_name.ace_tag,\n.ace-nord-dark .ace_support.ace_function,\n.ace-nord-dark .ace_variable,\n.ace-nord-dark .ace_variable.ace_language {\n color: #8fbcbb;\n}\n\n.ace-nord-dark .ace_string {\n color: #a3be8c;\n}\n\n.ace-nord-dark .ace_comment {\n color: #616e88;\n}\n\n.ace-nord-dark .ace_indent-guide {\n box-shadow: inset -1px 0 0 0 #434c5eb3;\n}\n\n.ace-nord-dark .ace_indent-guide-active {\n box-shadow: inset -1px 0 0 0 #8395b8b3;\n}\n"}),ace.define("ace/theme/nord_dark",["require","exports","module","ace/theme/nord_dark-css","ace/lib/dom"],function(e,t,n){t.isDark=!0,t.cssClass="ace-nord-dark",t.cssText=e("./nord_dark-css"),t.$selectionColorConflict=!0;var r=e("../lib/dom");r.importCssString(t.cssText,t.cssClass,!1)}); (function() {
2 | ace.require(["ace/theme/nord_dark"], function(m) {
3 | if (typeof module == "object" && typeof exports == "object" && module) {
4 | module.exports = m;
5 | }
6 | });
7 | })();
8 |
--------------------------------------------------------------------------------
/web_async/ace/theme-one_dark.js:
--------------------------------------------------------------------------------
1 | ace.define("ace/theme/one_dark-css",["require","exports","module"],function(e,t,n){n.exports=".ace-one-dark .ace_gutter {\n background: #282c34;\n color: #6a6f7a\n}\n\n.ace-one-dark .ace_print-margin {\n width: 1px;\n background: #e8e8e8\n}\n\n.ace-one-dark {\n background-color: #282c34;\n color: #abb2bf\n}\n\n.ace-one-dark .ace_cursor {\n color: #528bff\n}\n\n.ace-one-dark .ace_marker-layer .ace_selection {\n background: #3d4350\n}\n\n.ace-one-dark.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0 #282c34;\n border-radius: 2px\n}\n\n.ace-one-dark .ace_marker-layer .ace_step {\n background: #c6dbae\n}\n\n.ace-one-dark .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid #747369\n}\n\n.ace-one-dark .ace_marker-layer .ace_active-line {\n background: rgba(76, 87, 103, .19)\n}\n\n.ace-one-dark .ace_gutter-active-line {\n background-color: rgba(76, 87, 103, .19)\n}\n\n.ace-one-dark .ace_marker-layer .ace_selected-word {\n border: 1px solid #3d4350\n}\n\n.ace-one-dark .ace_fold {\n background-color: #61afef;\n border-color: #abb2bf\n}\n\n.ace-one-dark .ace_keyword {\n color: #c678dd\n}\n\n.ace-one-dark .ace_keyword.ace_operator {\n color: #c678dd\n}\n\n.ace-one-dark .ace_keyword.ace_other.ace_unit {\n color: #d19a66\n}\n\n.ace-one-dark .ace_constant.ace_language {\n color: #d19a66\n}\n\n.ace-one-dark .ace_constant.ace_numeric {\n color: #d19a66\n}\n\n.ace-one-dark .ace_constant.ace_character {\n color: #56b6c2\n}\n\n.ace-one-dark .ace_constant.ace_other {\n color: #56b6c2\n}\n\n.ace-one-dark .ace_support.ace_function {\n color: #61afef\n}\n\n.ace-one-dark .ace_support.ace_constant {\n color: #d19a66\n}\n\n.ace-one-dark .ace_support.ace_class {\n color: #e5c07b\n}\n\n.ace-one-dark .ace_support.ace_type {\n color: #e5c07b\n}\n\n.ace-one-dark .ace_storage {\n color: #c678dd\n}\n\n.ace-one-dark .ace_storage.ace_type {\n color: #c678dd\n}\n\n.ace-one-dark .ace_invalid {\n color: #fff;\n background-color: #f2777a\n}\n\n.ace-one-dark .ace_invalid.ace_deprecated {\n color: #272b33;\n background-color: #d27b53\n}\n\n.ace-one-dark .ace_string {\n color: #98c379\n}\n\n.ace-one-dark .ace_string.ace_regexp {\n color: #e06c75\n}\n\n.ace-one-dark .ace_comment {\n font-style: italic;\n color: #5c6370\n}\n\n.ace-one-dark .ace_variable {\n color: #e06c75\n}\n\n.ace-one-dark .ace_variable.ace_parameter {\n color: #d19a66\n}\n\n.ace-one-dark .ace_meta.ace_tag {\n color: #e06c75\n}\n\n.ace-one-dark .ace_entity.ace_other.ace_attribute-name {\n color: #e06c75\n}\n\n.ace-one-dark .ace_entity.ace_name.ace_function {\n color: #61afef\n}\n\n.ace-one-dark .ace_entity.ace_name.ace_tag {\n color: #e06c75\n}\n\n.ace-one-dark .ace_markup.ace_heading {\n color: #98c379\n}\n\n.ace-one-dark .ace_indent-guide {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWPQ09NrYAgMjP4PAAtGAwchHMyAAAAAAElFTkSuQmCC) right repeat-y\n}\n\n.ace-one-dark .ace_indent-guide-active {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQIW2PQ1dX9zzBz5sz/ABCcBFFentLlAAAAAElFTkSuQmCC) right repeat-y;\n}\n"}),ace.define("ace/theme/one_dark",["require","exports","module","ace/theme/one_dark-css","ace/lib/dom"],function(e,t,n){t.isDark=!0,t.cssClass="ace-one-dark",t.cssText=e("./one_dark-css");var r=e("../lib/dom");r.importCssString(t.cssText,t.cssClass,!1)}); (function() {
2 | ace.require(["ace/theme/one_dark"], function(m) {
3 | if (typeof module == "object" && typeof exports == "object" && module) {
4 | module.exports = m;
5 | }
6 | });
7 | })();
8 |
--------------------------------------------------------------------------------
/web_async/ace/theme-pastel_on_dark.js:
--------------------------------------------------------------------------------
1 | ace.define("ace/theme/pastel_on_dark-css",["require","exports","module"],function(e,t,n){n.exports=".ace-pastel-on-dark .ace_gutter {\n background: #353030;\n color: #8F938F\n}\n\n.ace-pastel-on-dark .ace_print-margin {\n width: 1px;\n background: #353030\n}\n\n.ace-pastel-on-dark {\n background-color: #2C2828;\n color: #8F938F\n}\n\n.ace-pastel-on-dark .ace_cursor {\n color: #A7A7A7\n}\n\n.ace-pastel-on-dark .ace_marker-layer .ace_selection {\n background: rgba(221, 240, 255, 0.20)\n}\n\n.ace-pastel-on-dark.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px #2C2828;\n}\n\n.ace-pastel-on-dark .ace_marker-layer .ace_step {\n background: rgb(102, 82, 0)\n}\n\n.ace-pastel-on-dark .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid rgba(255, 255, 255, 0.25)\n}\n\n.ace-pastel-on-dark .ace_marker-layer .ace_active-line {\n background: rgba(255, 255, 255, 0.031)\n}\n\n.ace-pastel-on-dark .ace_gutter-active-line {\n background-color: rgba(255, 255, 255, 0.031)\n}\n\n.ace-pastel-on-dark .ace_marker-layer .ace_selected-word {\n border: 1px solid rgba(221, 240, 255, 0.20)\n}\n\n.ace-pastel-on-dark .ace_invisible {\n color: rgba(255, 255, 255, 0.25)\n}\n\n.ace-pastel-on-dark .ace_keyword,\n.ace-pastel-on-dark .ace_meta {\n color: #757aD8\n}\n\n.ace-pastel-on-dark .ace_constant,\n.ace-pastel-on-dark .ace_constant.ace_character,\n.ace-pastel-on-dark .ace_constant.ace_character.ace_escape,\n.ace-pastel-on-dark .ace_constant.ace_other {\n color: #4FB7C5\n}\n\n.ace-pastel-on-dark .ace_keyword.ace_operator {\n color: #797878\n}\n\n.ace-pastel-on-dark .ace_constant.ace_character {\n color: #AFA472\n}\n\n.ace-pastel-on-dark .ace_constant.ace_language {\n color: #DE8E30\n}\n\n.ace-pastel-on-dark .ace_constant.ace_numeric {\n color: #CCCCCC\n}\n\n.ace-pastel-on-dark .ace_invalid,\n.ace-pastel-on-dark .ace_invalid.ace_illegal {\n color: #F8F8F8;\n background-color: rgba(86, 45, 86, 0.75)\n}\n\n.ace-pastel-on-dark .ace_invalid.ace_deprecated {\n text-decoration: underline;\n font-style: italic;\n color: #D2A8A1\n}\n\n.ace-pastel-on-dark .ace_fold {\n background-color: #757aD8;\n border-color: #8F938F\n}\n\n.ace-pastel-on-dark .ace_support.ace_function {\n color: #AEB2F8\n}\n\n.ace-pastel-on-dark .ace_string {\n color: #66A968\n}\n\n.ace-pastel-on-dark .ace_string.ace_regexp {\n color: #E9C062\n}\n\n.ace-pastel-on-dark .ace_comment {\n color: #A6C6FF\n}\n\n.ace-pastel-on-dark .ace_variable {\n color: #BEBF55\n}\n\n.ace-pastel-on-dark .ace_variable.ace_language {\n color: #C1C144\n}\n\n.ace-pastel-on-dark .ace_xml-pe {\n color: #494949\n}\n\n.ace-pastel-on-dark .ace_indent-guide {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYIiPj/8PAARgAh2NTMh8AAAAAElFTkSuQmCC) right repeat-y\n}\n\n.ace-pastel-on-dark .ace_indent-guide-active {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQIW2PQ1dX9zzBz5sz/ABCcBFFentLlAAAAAElFTkSuQmCC) right repeat-y;\n}\n"}),ace.define("ace/theme/pastel_on_dark",["require","exports","module","ace/theme/pastel_on_dark-css","ace/lib/dom"],function(e,t,n){t.isDark=!0,t.cssClass="ace-pastel-on-dark",t.cssText=e("./pastel_on_dark-css");var r=e("../lib/dom");r.importCssString(t.cssText,t.cssClass,!1)}); (function() {
2 | ace.require(["ace/theme/pastel_on_dark"], function(m) {
3 | if (typeof module == "object" && typeof exports == "object" && module) {
4 | module.exports = m;
5 | }
6 | });
7 | })();
8 |
--------------------------------------------------------------------------------
/web_async/ace/theme-solarized_dark.js:
--------------------------------------------------------------------------------
1 | ace.define("ace/theme/solarized_dark-css",["require","exports","module"],function(e,t,n){n.exports=".ace-solarized-dark .ace_gutter {\n background: #01313f;\n color: #d0edf7\n}\n\n.ace-solarized-dark .ace_print-margin {\n width: 1px;\n background: #33555E\n}\n\n.ace-solarized-dark {\n background-color: #002B36;\n color: #839496\n}\n\n.ace-solarized-dark .ace_entity.ace_other.ace_attribute-name,\n.ace-solarized-dark .ace_storage {\n color: #839496\n}\n\n.ace-solarized-dark .ace_cursor,\n.ace-solarized-dark .ace_string.ace_regexp {\n color: #D30102\n}\n\n.ace-solarized-dark .ace_marker-layer .ace_active-line,\n.ace-solarized-dark .ace_marker-layer .ace_selection {\n background: rgba(255, 255, 255, 0.1)\n}\n\n.ace-solarized-dark.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px #002B36;\n}\n\n.ace-solarized-dark .ace_marker-layer .ace_step {\n background: rgb(102, 82, 0)\n}\n\n.ace-solarized-dark .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid rgba(147, 161, 161, 0.50)\n}\n\n.ace-solarized-dark .ace_gutter-active-line {\n background-color: #0d3440\n}\n\n.ace-solarized-dark .ace_marker-layer .ace_selected-word {\n border: 1px solid #073642\n}\n\n.ace-solarized-dark .ace_invisible {\n color: rgba(147, 161, 161, 0.50)\n}\n\n.ace-solarized-dark .ace_keyword,\n.ace-solarized-dark .ace_meta,\n.ace-solarized-dark .ace_support.ace_class,\n.ace-solarized-dark .ace_support.ace_type {\n color: #859900\n}\n\n.ace-solarized-dark .ace_constant.ace_character,\n.ace-solarized-dark .ace_constant.ace_other {\n color: #CB4B16\n}\n\n.ace-solarized-dark .ace_constant.ace_language {\n color: #B58900\n}\n\n.ace-solarized-dark .ace_constant.ace_numeric {\n color: #D33682\n}\n\n.ace-solarized-dark .ace_fold {\n background-color: #268BD2;\n border-color: #93A1A1\n}\n\n.ace-solarized-dark .ace_entity.ace_name.ace_function,\n.ace-solarized-dark .ace_entity.ace_name.ace_tag,\n.ace-solarized-dark .ace_support.ace_function,\n.ace-solarized-dark .ace_variable,\n.ace-solarized-dark .ace_variable.ace_language {\n color: #268BD2\n}\n\n.ace-solarized-dark .ace_string {\n color: #2AA198\n}\n\n.ace-solarized-dark .ace_comment {\n font-style: italic;\n color: #657B83\n}\n\n.ace-solarized-dark .ace_indent-guide {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNg0Db1ZVCxc/sPAAd4AlUHlLenAAAAAElFTkSuQmCC) right repeat-y\n}\n\n.ace-solarized-dark .ace_indent-guide-active {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQIW2PQ1dX9zzBz5sz/ABCcBFFentLlAAAAAElFTkSuQmCC) right repeat-y;\n}\n"}),ace.define("ace/theme/solarized_dark",["require","exports","module","ace/theme/solarized_dark-css","ace/lib/dom"],function(e,t,n){t.isDark=!0,t.cssClass="ace-solarized-dark",t.cssText=e("./solarized_dark-css");var r=e("../lib/dom");r.importCssString(t.cssText,t.cssClass,!1)}); (function() {
2 | ace.require(["ace/theme/solarized_dark"], function(m) {
3 | if (typeof module == "object" && typeof exports == "object" && module) {
4 | module.exports = m;
5 | }
6 | });
7 | })();
8 |
--------------------------------------------------------------------------------
/web_async/ace/theme-solarized_light.js:
--------------------------------------------------------------------------------
1 | ace.define("ace/theme/solarized_light-css",["require","exports","module"],function(e,t,n){n.exports='.ace-solarized-light .ace_gutter {\n background: #fbf1d3;\n color: #333\n}\n\n.ace-solarized-light .ace_print-margin {\n width: 1px;\n background: #e8e8e8\n}\n\n.ace-solarized-light {\n background-color: #FDF6E3;\n color: #586E75\n}\n\n.ace-solarized-light .ace_cursor {\n color: #000000\n}\n\n.ace-solarized-light .ace_marker-layer .ace_selection {\n background: rgba(7, 54, 67, 0.09)\n}\n\n.ace-solarized-light.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px #FDF6E3;\n}\n\n.ace-solarized-light .ace_marker-layer .ace_step {\n background: rgb(255, 255, 0)\n}\n\n.ace-solarized-light .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid rgba(147, 161, 161, 0.50)\n}\n\n.ace-solarized-light .ace_marker-layer .ace_active-line {\n background: #EEE8D5\n}\n\n.ace-solarized-light .ace_gutter-active-line {\n background-color : #EDE5C1\n}\n\n.ace-solarized-light .ace_marker-layer .ace_selected-word {\n border: 1px solid #7f9390\n}\n\n.ace-solarized-light .ace_invisible {\n color: rgba(147, 161, 161, 0.50)\n}\n\n.ace-solarized-light .ace_keyword,\n.ace-solarized-light .ace_meta,\n.ace-solarized-light .ace_support.ace_class,\n.ace-solarized-light .ace_support.ace_type {\n color: #859900\n}\n\n.ace-solarized-light .ace_constant.ace_character,\n.ace-solarized-light .ace_constant.ace_other {\n color: #CB4B16\n}\n\n.ace-solarized-light .ace_constant.ace_language {\n color: #B58900\n}\n\n.ace-solarized-light .ace_constant.ace_numeric {\n color: #D33682\n}\n\n.ace-solarized-light .ace_fold {\n background-color: #268BD2;\n border-color: #586E75\n}\n\n.ace-solarized-light .ace_entity.ace_name.ace_function,\n.ace-solarized-light .ace_entity.ace_name.ace_tag,\n.ace-solarized-light .ace_support.ace_function,\n.ace-solarized-light .ace_variable,\n.ace-solarized-light .ace_variable.ace_language {\n color: #268BD2\n}\n\n.ace-solarized-light .ace_storage {\n color: #073642\n}\n\n.ace-solarized-light .ace_string {\n color: #2AA198\n}\n\n.ace-solarized-light .ace_string.ace_regexp {\n color: #D30102\n}\n\n.ace-solarized-light .ace_comment,\n.ace-solarized-light .ace_entity.ace_other.ace_attribute-name {\n color: #93A1A1\n}\n\n.ace-solarized-light .ace_indent-guide {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYHjy8NJ/AAjgA5fzQUmBAAAAAElFTkSuQmCC) right repeat-y\n}\n\n.ace-solarized-light .ace_indent-guide-active {\n background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAAZSURBVHjaYvj///9/hivKyv8BAAAA//8DACLqBhbvk+/eAAAAAElFTkSuQmCC") right repeat-y;\n} \n'}),ace.define("ace/theme/solarized_light",["require","exports","module","ace/theme/solarized_light-css","ace/lib/dom"],function(e,t,n){t.isDark=!1,t.cssClass="ace-solarized-light",t.cssText=e("./solarized_light-css");var r=e("../lib/dom");r.importCssString(t.cssText,t.cssClass,!1)}); (function() {
2 | ace.require(["ace/theme/solarized_light"], function(m) {
3 | if (typeof module == "object" && typeof exports == "object" && module) {
4 | module.exports = m;
5 | }
6 | });
7 | })();
8 |
--------------------------------------------------------------------------------
/web_async/ace/theme-terminal.js:
--------------------------------------------------------------------------------
1 | ace.define("ace/theme/terminal-css",["require","exports","module"],function(e,t,n){n.exports=".ace-terminal-theme .ace_gutter {\n background: #1a0005;\n color: steelblue\n}\n\n.ace-terminal-theme .ace_print-margin {\n width: 1px;\n background: #1a1a1a\n}\n\n.ace-terminal-theme {\n background-color: black;\n color: #DEDEDE\n}\n\n.ace-terminal-theme .ace_cursor {\n color: #9F9F9F\n}\n\n.ace-terminal-theme .ace_marker-layer .ace_selection {\n background: #424242\n}\n\n.ace-terminal-theme.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px black;\n}\n\n.ace-terminal-theme .ace_marker-layer .ace_step {\n background: rgb(0, 0, 0)\n}\n\n.ace-terminal-theme .ace_marker-layer .ace_bracket {\n background: #090;\n}\n\n.ace-terminal-theme .ace_marker-layer .ace_bracket-start {\n background: #090;\n}\n\n.ace-terminal-theme .ace_marker-layer .ace_bracket-unmatched {\n margin: -1px 0 0 -1px;\n border: 1px solid #900\n}\n\n.ace-terminal-theme .ace_marker-layer .ace_active-line {\n background: #2A2A2A\n}\n\n.ace-terminal-theme .ace_gutter-active-line {\n background-color: #2A112A\n}\n\n.ace-terminal-theme .ace_marker-layer .ace_selected-word {\n border: 1px solid #424242\n}\n\n.ace-terminal-theme .ace_invisible {\n color: #343434\n}\n\n.ace-terminal-theme .ace_keyword,\n.ace-terminal-theme .ace_meta,\n.ace-terminal-theme .ace_storage,\n.ace-terminal-theme .ace_storage.ace_type,\n.ace-terminal-theme .ace_support.ace_type {\n color: tomato\n}\n\n.ace-terminal-theme .ace_keyword.ace_operator {\n color: deeppink\n}\n\n.ace-terminal-theme .ace_constant.ace_character,\n.ace-terminal-theme .ace_constant.ace_language,\n.ace-terminal-theme .ace_constant.ace_numeric,\n.ace-terminal-theme .ace_keyword.ace_other.ace_unit,\n.ace-terminal-theme .ace_support.ace_constant,\n.ace-terminal-theme .ace_variable.ace_parameter {\n color: #E78C45\n}\n\n.ace-terminal-theme .ace_constant.ace_other {\n color: gold\n}\n\n.ace-terminal-theme .ace_invalid {\n color: yellow;\n background-color: red\n}\n\n.ace-terminal-theme .ace_invalid.ace_deprecated {\n color: #CED2CF;\n background-color: #B798BF\n}\n\n.ace-terminal-theme .ace_fold {\n background-color: #7AA6DA;\n border-color: #DEDEDE\n}\n\n.ace-terminal-theme .ace_entity.ace_name.ace_function,\n.ace-terminal-theme .ace_support.ace_function,\n.ace-terminal-theme .ace_variable {\n color: #7AA6DA\n}\n\n.ace-terminal-theme .ace_support.ace_class,\n.ace-terminal-theme .ace_support.ace_type {\n color: #E7C547\n}\n\n.ace-terminal-theme .ace_heading,\n.ace-terminal-theme .ace_string {\n color: #B9CA4A\n}\n\n.ace-terminal-theme .ace_entity.ace_name.ace_tag,\n.ace-terminal-theme .ace_entity.ace_other.ace_attribute-name,\n.ace-terminal-theme .ace_meta.ace_tag,\n.ace-terminal-theme .ace_string.ace_regexp,\n.ace-terminal-theme .ace_variable {\n color: #D54E53\n}\n\n.ace-terminal-theme .ace_comment {\n color: orangered\n}\n\n.ace-terminal-theme .ace_indent-guide {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYLBWV/8PAAK4AYnhiq+xAAAAAElFTkSuQmCC) right repeat-y;\n}\n\n.ace-terminal-theme .ace_indent-guide-active {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQIW2PQ1dX9zzBz5sz/ABCcBFFentLlAAAAAElFTkSuQmCC) right repeat-y;\n}\n"}),ace.define("ace/theme/terminal",["require","exports","module","ace/theme/terminal-css","ace/lib/dom"],function(e,t,n){t.isDark=!0,t.cssClass="ace-terminal-theme",t.cssText=e("./terminal-css");var r=e("../lib/dom");r.importCssString(t.cssText,t.cssClass,!1)}); (function() {
2 | ace.require(["ace/theme/terminal"], function(m) {
3 | if (typeof module == "object" && typeof exports == "object" && module) {
4 | module.exports = m;
5 | }
6 | });
7 | })();
8 |
--------------------------------------------------------------------------------
/web_async/ace/theme-textmate.js:
--------------------------------------------------------------------------------
1 | ace.define("ace/theme/textmate",["require","exports","module","ace/theme/textmate-css","ace/lib/dom"],function(e,t,n){"use strict";t.isDark=!1,t.cssClass="ace-tm",t.cssText=e("./textmate-css"),t.$id="ace/theme/textmate";var r=e("../lib/dom");r.importCssString(t.cssText,t.cssClass,!1)}); (function() {
2 | ace.require(["ace/theme/textmate"], function(m) {
3 | if (typeof module == "object" && typeof exports == "object" && module) {
4 | module.exports = m;
5 | }
6 | });
7 | })();
8 |
--------------------------------------------------------------------------------
/web_async/ace/theme-tomorrow.js:
--------------------------------------------------------------------------------
1 | ace.define("ace/theme/tomorrow-css",["require","exports","module"],function(e,t,n){n.exports='.ace-tomorrow .ace_gutter {\n background: #f6f6f6;\n color: #4D4D4C\n}\n\n.ace-tomorrow .ace_print-margin {\n width: 1px;\n background: #f6f6f6\n}\n\n.ace-tomorrow {\n background-color: #FFFFFF;\n color: #4D4D4C\n}\n\n.ace-tomorrow .ace_cursor {\n color: #AEAFAD\n}\n\n.ace-tomorrow .ace_marker-layer .ace_selection {\n background: #D6D6D6\n}\n\n.ace-tomorrow.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px #FFFFFF;\n}\n\n.ace-tomorrow .ace_marker-layer .ace_step {\n background: rgb(255, 255, 0)\n}\n\n.ace-tomorrow .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid #D1D1D1\n}\n\n.ace-tomorrow .ace_marker-layer .ace_active-line {\n background: #EFEFEF\n}\n\n.ace-tomorrow .ace_gutter-active-line {\n background-color : #dcdcdc\n}\n\n.ace-tomorrow .ace_marker-layer .ace_selected-word {\n border: 1px solid #D6D6D6\n}\n\n.ace-tomorrow .ace_invisible {\n color: #D1D1D1\n}\n\n.ace-tomorrow .ace_keyword,\n.ace-tomorrow .ace_meta,\n.ace-tomorrow .ace_storage,\n.ace-tomorrow .ace_storage.ace_type,\n.ace-tomorrow .ace_support.ace_type {\n color: #8959A8\n}\n\n.ace-tomorrow .ace_keyword.ace_operator {\n color: #3E999F\n}\n\n.ace-tomorrow .ace_constant.ace_character,\n.ace-tomorrow .ace_constant.ace_language,\n.ace-tomorrow .ace_constant.ace_numeric,\n.ace-tomorrow .ace_keyword.ace_other.ace_unit,\n.ace-tomorrow .ace_support.ace_constant,\n.ace-tomorrow .ace_variable.ace_parameter {\n color: #F5871F\n}\n\n.ace-tomorrow .ace_constant.ace_other {\n color: #666969\n}\n\n.ace-tomorrow .ace_invalid {\n color: #FFFFFF;\n background-color: #C82829\n}\n\n.ace-tomorrow .ace_invalid.ace_deprecated {\n color: #FFFFFF;\n background-color: #8959A8\n}\n\n.ace-tomorrow .ace_fold {\n background-color: #4271AE;\n border-color: #4D4D4C\n}\n\n.ace-tomorrow .ace_entity.ace_name.ace_function,\n.ace-tomorrow .ace_support.ace_function,\n.ace-tomorrow .ace_variable {\n color: #4271AE\n}\n\n.ace-tomorrow .ace_support.ace_class,\n.ace-tomorrow .ace_support.ace_type {\n color: #C99E00\n}\n\n.ace-tomorrow .ace_heading,\n.ace-tomorrow .ace_markup.ace_heading,\n.ace-tomorrow .ace_string {\n color: #718C00\n}\n\n.ace-tomorrow .ace_entity.ace_name.ace_tag,\n.ace-tomorrow .ace_entity.ace_other.ace_attribute-name,\n.ace-tomorrow .ace_meta.ace_tag,\n.ace-tomorrow .ace_string.ace_regexp,\n.ace-tomorrow .ace_variable {\n color: #C82829\n}\n\n.ace-tomorrow .ace_comment {\n color: #8E908C\n}\n\n.ace-tomorrow .ace_indent-guide {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bdu3f/BwAlfgctduB85QAAAABJRU5ErkJggg==) right repeat-y\n}\n\n.ace-tomorrow .ace_indent-guide-active {\n background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAAZSURBVHjaYvj///9/hivKyv8BAAAA//8DACLqBhbvk+/eAAAAAElFTkSuQmCC") right repeat-y;\n} \n'}),ace.define("ace/theme/tomorrow",["require","exports","module","ace/theme/tomorrow-css","ace/lib/dom"],function(e,t,n){t.isDark=!1,t.cssClass="ace-tomorrow",t.cssText=e("./tomorrow-css");var r=e("../lib/dom");r.importCssString(t.cssText,t.cssClass,!1)}); (function() {
2 | ace.require(["ace/theme/tomorrow"], function(m) {
3 | if (typeof module == "object" && typeof exports == "object" && module) {
4 | module.exports = m;
5 | }
6 | });
7 | })();
8 |
--------------------------------------------------------------------------------
/web_async/ace/theme-tomorrow_night.js:
--------------------------------------------------------------------------------
1 | ace.define("ace/theme/tomorrow_night-css",["require","exports","module"],function(e,t,n){n.exports=".ace-tomorrow-night .ace_gutter {\n background: #25282c;\n color: #C5C8C6\n}\n\n.ace-tomorrow-night .ace_print-margin {\n width: 1px;\n background: #25282c\n}\n\n.ace-tomorrow-night {\n background-color: #1D1F21;\n color: #C5C8C6\n}\n\n.ace-tomorrow-night .ace_cursor {\n color: #AEAFAD\n}\n\n.ace-tomorrow-night .ace_marker-layer .ace_selection {\n background: #373B41\n}\n\n.ace-tomorrow-night.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px #1D1F21;\n}\n\n.ace-tomorrow-night .ace_marker-layer .ace_step {\n background: rgb(102, 82, 0)\n}\n\n.ace-tomorrow-night .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid #4B4E55\n}\n\n.ace-tomorrow-night .ace_marker-layer .ace_active-line {\n background: #282A2E\n}\n\n.ace-tomorrow-night .ace_gutter-active-line {\n background-color: #282A2E\n}\n\n.ace-tomorrow-night .ace_marker-layer .ace_selected-word {\n border: 1px solid #373B41\n}\n\n.ace-tomorrow-night .ace_invisible {\n color: #4B4E55\n}\n\n.ace-tomorrow-night .ace_keyword,\n.ace-tomorrow-night .ace_meta,\n.ace-tomorrow-night .ace_storage,\n.ace-tomorrow-night .ace_storage.ace_type,\n.ace-tomorrow-night .ace_support.ace_type {\n color: #B294BB\n}\n\n.ace-tomorrow-night .ace_keyword.ace_operator {\n color: #8ABEB7\n}\n\n.ace-tomorrow-night .ace_constant.ace_character,\n.ace-tomorrow-night .ace_constant.ace_language,\n.ace-tomorrow-night .ace_constant.ace_numeric,\n.ace-tomorrow-night .ace_keyword.ace_other.ace_unit,\n.ace-tomorrow-night .ace_support.ace_constant,\n.ace-tomorrow-night .ace_variable.ace_parameter {\n color: #DE935F\n}\n\n.ace-tomorrow-night .ace_constant.ace_other {\n color: #CED1CF\n}\n\n.ace-tomorrow-night .ace_invalid {\n color: #CED2CF;\n background-color: #DF5F5F\n}\n\n.ace-tomorrow-night .ace_invalid.ace_deprecated {\n color: #CED2CF;\n background-color: #B798BF\n}\n\n.ace-tomorrow-night .ace_fold {\n background-color: #81A2BE;\n border-color: #C5C8C6\n}\n\n.ace-tomorrow-night .ace_entity.ace_name.ace_function,\n.ace-tomorrow-night .ace_support.ace_function,\n.ace-tomorrow-night .ace_variable {\n color: #81A2BE\n}\n\n.ace-tomorrow-night .ace_support.ace_class,\n.ace-tomorrow-night .ace_support.ace_type {\n color: #F0C674\n}\n\n.ace-tomorrow-night .ace_heading,\n.ace-tomorrow-night .ace_markup.ace_heading,\n.ace-tomorrow-night .ace_string {\n color: #B5BD68\n}\n\n.ace-tomorrow-night .ace_entity.ace_name.ace_tag,\n.ace-tomorrow-night .ace_entity.ace_other.ace_attribute-name,\n.ace-tomorrow-night .ace_meta.ace_tag,\n.ace-tomorrow-night .ace_string.ace_regexp,\n.ace-tomorrow-night .ace_variable {\n color: #CC6666\n}\n\n.ace-tomorrow-night .ace_comment {\n color: #969896\n}\n\n.ace-tomorrow-night .ace_indent-guide {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYHB3d/8PAAOIAdULw8qMAAAAAElFTkSuQmCC) right repeat-y\n}\n\n.ace-tomorrow-night .ace_indent-guide-active {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQIW2PQ1dX9zzBz5sz/ABCcBFFentLlAAAAAElFTkSuQmCC) right repeat-y;\n}\n"}),ace.define("ace/theme/tomorrow_night",["require","exports","module","ace/theme/tomorrow_night-css","ace/lib/dom"],function(e,t,n){t.isDark=!0,t.cssClass="ace-tomorrow-night",t.cssText=e("./tomorrow_night-css");var r=e("../lib/dom");r.importCssString(t.cssText,t.cssClass,!1)}); (function() {
2 | ace.require(["ace/theme/tomorrow_night"], function(m) {
3 | if (typeof module == "object" && typeof exports == "object" && module) {
4 | module.exports = m;
5 | }
6 | });
7 | })();
8 |
--------------------------------------------------------------------------------
/web_async/ace/theme-tomorrow_night_blue.js:
--------------------------------------------------------------------------------
1 | ace.define("ace/theme/tomorrow_night_blue-css",["require","exports","module"],function(e,t,n){n.exports=".ace-tomorrow-night-blue .ace_gutter {\n background: #00204b;\n color: #7388b5\n}\n\n.ace-tomorrow-night-blue .ace_print-margin {\n width: 1px;\n background: #00204b\n}\n\n.ace-tomorrow-night-blue {\n background-color: #002451;\n color: #FFFFFF\n}\n\n.ace-tomorrow-night-blue .ace_constant.ace_other,\n.ace-tomorrow-night-blue .ace_cursor {\n color: #FFFFFF\n}\n\n.ace-tomorrow-night-blue .ace_marker-layer .ace_selection {\n background: #003F8E\n}\n\n.ace-tomorrow-night-blue.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px #002451;\n}\n\n.ace-tomorrow-night-blue .ace_marker-layer .ace_step {\n background: rgb(127, 111, 19)\n}\n\n.ace-tomorrow-night-blue .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid #404F7D\n}\n\n.ace-tomorrow-night-blue .ace_marker-layer .ace_active-line {\n background: #00346E\n}\n\n.ace-tomorrow-night-blue .ace_gutter-active-line {\n background-color: #022040\n}\n\n.ace-tomorrow-night-blue .ace_marker-layer .ace_selected-word {\n border: 1px solid #003F8E\n}\n\n.ace-tomorrow-night-blue .ace_invisible {\n color: #404F7D\n}\n\n.ace-tomorrow-night-blue .ace_keyword,\n.ace-tomorrow-night-blue .ace_meta,\n.ace-tomorrow-night-blue .ace_storage,\n.ace-tomorrow-night-blue .ace_storage.ace_type,\n.ace-tomorrow-night-blue .ace_support.ace_type {\n color: #EBBBFF\n}\n\n.ace-tomorrow-night-blue .ace_keyword.ace_operator {\n color: #99FFFF\n}\n\n.ace-tomorrow-night-blue .ace_constant.ace_character,\n.ace-tomorrow-night-blue .ace_constant.ace_language,\n.ace-tomorrow-night-blue .ace_constant.ace_numeric,\n.ace-tomorrow-night-blue .ace_keyword.ace_other.ace_unit,\n.ace-tomorrow-night-blue .ace_support.ace_constant,\n.ace-tomorrow-night-blue .ace_variable.ace_parameter {\n color: #FFC58F\n}\n\n.ace-tomorrow-night-blue .ace_invalid {\n color: #FFFFFF;\n background-color: #F99DA5\n}\n\n.ace-tomorrow-night-blue .ace_invalid.ace_deprecated {\n color: #FFFFFF;\n background-color: #EBBBFF\n}\n\n.ace-tomorrow-night-blue .ace_fold {\n background-color: #BBDAFF;\n border-color: #FFFFFF\n}\n\n.ace-tomorrow-night-blue .ace_entity.ace_name.ace_function,\n.ace-tomorrow-night-blue .ace_support.ace_function,\n.ace-tomorrow-night-blue .ace_variable {\n color: #BBDAFF\n}\n\n.ace-tomorrow-night-blue .ace_support.ace_class,\n.ace-tomorrow-night-blue .ace_support.ace_type {\n color: #FFEEAD\n}\n\n.ace-tomorrow-night-blue .ace_heading,\n.ace-tomorrow-night-blue .ace_markup.ace_heading,\n.ace-tomorrow-night-blue .ace_string {\n color: #D1F1A9\n}\n\n.ace-tomorrow-night-blue .ace_entity.ace_name.ace_tag,\n.ace-tomorrow-night-blue .ace_entity.ace_other.ace_attribute-name,\n.ace-tomorrow-night-blue .ace_meta.ace_tag,\n.ace-tomorrow-night-blue .ace_string.ace_regexp,\n.ace-tomorrow-night-blue .ace_variable {\n color: #FF9DA4\n}\n\n.ace-tomorrow-night-blue .ace_comment {\n color: #7285B7\n}\n\n.ace-tomorrow-night-blue .ace_indent-guide {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYJDzqfwPAANXAeNsiA+ZAAAAAElFTkSuQmCC) right repeat-y\n}\n\n.ace-tomorrow-night-blue .ace_indent-guide-active {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQIW2PQ1dX9zzBz5sz/ABCcBFFentLlAAAAAElFTkSuQmCC) right repeat-y;\n}\n"}),ace.define("ace/theme/tomorrow_night_blue",["require","exports","module","ace/theme/tomorrow_night_blue-css","ace/lib/dom"],function(e,t,n){t.isDark=!0,t.cssClass="ace-tomorrow-night-blue",t.cssText=e("./tomorrow_night_blue-css");var r=e("../lib/dom");r.importCssString(t.cssText,t.cssClass,!1)}); (function() {
2 | ace.require(["ace/theme/tomorrow_night_blue"], function(m) {
3 | if (typeof module == "object" && typeof exports == "object" && module) {
4 | module.exports = m;
5 | }
6 | });
7 | })();
8 |
--------------------------------------------------------------------------------
/web_async/ace/theme-twilight.js:
--------------------------------------------------------------------------------
1 | ace.define("ace/theme/twilight-css",["require","exports","module"],function(e,t,n){n.exports=".ace-twilight .ace_gutter {\n background: #232323;\n color: #E2E2E2\n}\n\n.ace-twilight .ace_print-margin {\n width: 1px;\n background: #232323\n}\n\n.ace-twilight {\n background-color: #141414;\n color: #F8F8F8\n}\n\n.ace-twilight .ace_cursor {\n color: #A7A7A7\n}\n\n.ace-twilight .ace_marker-layer .ace_selection {\n background: rgba(221, 240, 255, 0.20)\n}\n\n.ace-twilight.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px #141414;\n}\n\n.ace-twilight .ace_marker-layer .ace_step {\n background: rgb(102, 82, 0)\n}\n\n.ace-twilight .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid rgba(255, 255, 255, 0.25)\n}\n\n.ace-twilight .ace_marker-layer .ace_active-line {\n background: rgba(255, 255, 255, 0.031)\n}\n\n.ace-twilight .ace_gutter-active-line {\n background-color: rgba(255, 255, 255, 0.031)\n}\n\n.ace-twilight .ace_marker-layer .ace_selected-word {\n border: 1px solid rgba(221, 240, 255, 0.20)\n}\n\n.ace-twilight .ace_invisible {\n color: rgba(255, 255, 255, 0.25)\n}\n\n.ace-twilight .ace_keyword,\n.ace-twilight .ace_meta {\n color: #CDA869\n}\n\n.ace-twilight .ace_constant,\n.ace-twilight .ace_constant.ace_character,\n.ace-twilight .ace_constant.ace_character.ace_escape,\n.ace-twilight .ace_constant.ace_other,\n.ace-twilight .ace_heading,\n.ace-twilight .ace_markup.ace_heading,\n.ace-twilight .ace_support.ace_constant {\n color: #CF6A4C\n}\n\n.ace-twilight .ace_invalid.ace_illegal {\n color: #F8F8F8;\n background-color: rgba(86, 45, 86, 0.75)\n}\n\n.ace-twilight .ace_invalid.ace_deprecated {\n text-decoration: underline;\n font-style: italic;\n color: #D2A8A1\n}\n\n.ace-twilight .ace_support {\n color: #9B859D\n}\n\n.ace-twilight .ace_fold {\n background-color: #AC885B;\n border-color: #F8F8F8\n}\n\n.ace-twilight .ace_support.ace_function {\n color: #DAD085\n}\n\n.ace-twilight .ace_list,\n.ace-twilight .ace_markup.ace_list,\n.ace-twilight .ace_storage {\n color: #F9EE98\n}\n\n.ace-twilight .ace_entity.ace_name.ace_function,\n.ace-twilight .ace_meta.ace_tag {\n color: #AC885B\n}\n\n.ace-twilight .ace_string {\n color: #8F9D6A\n}\n\n.ace-twilight .ace_string.ace_regexp {\n color: #E9C062\n}\n\n.ace-twilight .ace_comment {\n font-style: italic;\n color: #5F5A60\n}\n\n.ace-twilight .ace_variable {\n color: #7587A6\n}\n\n.ace-twilight .ace_xml-pe {\n color: #494949\n}\n\n.ace-twilight .ace_indent-guide {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWMQERFpYLC1tf0PAAgOAnPnhxyiAAAAAElFTkSuQmCC) right repeat-y\n}\n\n.ace-twilight .ace_indent-guide-active {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQIW2PQ1dX9zzBz5sz/ABCcBFFentLlAAAAAElFTkSuQmCC) right repeat-y;\n}\n"}),ace.define("ace/theme/twilight",["require","exports","module","ace/theme/twilight-css","ace/lib/dom"],function(e,t,n){t.isDark=!0,t.cssClass="ace-twilight",t.cssText=e("./twilight-css");var r=e("../lib/dom");r.importCssString(t.cssText,t.cssClass,!1)}); (function() {
2 | ace.require(["ace/theme/twilight"], function(m) {
3 | if (typeof module == "object" && typeof exports == "object" && module) {
4 | module.exports = m;
5 | }
6 | });
7 | })();
8 |
--------------------------------------------------------------------------------
/web_async/ace/theme-vibrant_ink.js:
--------------------------------------------------------------------------------
1 | ace.define("ace/theme/vibrant_ink-css",["require","exports","module"],function(e,t,n){n.exports=".ace-vibrant-ink .ace_gutter {\n background: #1a1a1a;\n color: #BEBEBE\n}\n\n.ace-vibrant-ink .ace_print-margin {\n width: 1px;\n background: #1a1a1a\n}\n\n.ace-vibrant-ink {\n background-color: #0F0F0F;\n color: #FFFFFF\n}\n\n.ace-vibrant-ink .ace_cursor {\n color: #FFFFFF\n}\n\n.ace-vibrant-ink .ace_marker-layer .ace_selection {\n background: #6699CC\n}\n\n.ace-vibrant-ink.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px #0F0F0F;\n}\n\n.ace-vibrant-ink .ace_marker-layer .ace_step {\n background: rgb(102, 82, 0)\n}\n\n.ace-vibrant-ink .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid #404040\n}\n\n.ace-vibrant-ink .ace_marker-layer .ace_active-line {\n background: #333333\n}\n\n.ace-vibrant-ink .ace_gutter-active-line {\n background-color: #333333\n}\n\n.ace-vibrant-ink .ace_marker-layer .ace_selected-word {\n border: 1px solid #6699CC\n}\n\n.ace-vibrant-ink .ace_invisible {\n color: #404040\n}\n\n.ace-vibrant-ink .ace_keyword,\n.ace-vibrant-ink .ace_meta {\n color: #FF6600\n}\n\n.ace-vibrant-ink .ace_constant,\n.ace-vibrant-ink .ace_constant.ace_character,\n.ace-vibrant-ink .ace_constant.ace_character.ace_escape,\n.ace-vibrant-ink .ace_constant.ace_other {\n color: #339999\n}\n\n.ace-vibrant-ink .ace_constant.ace_numeric {\n color: #99CC99\n}\n\n.ace-vibrant-ink .ace_invalid,\n.ace-vibrant-ink .ace_invalid.ace_deprecated {\n color: #CCFF33;\n background-color: #000000\n}\n\n.ace-vibrant-ink .ace_fold {\n background-color: #FFCC00;\n border-color: #FFFFFF\n}\n\n.ace-vibrant-ink .ace_entity.ace_name.ace_function,\n.ace-vibrant-ink .ace_support.ace_function,\n.ace-vibrant-ink .ace_variable {\n color: #FFCC00\n}\n\n.ace-vibrant-ink .ace_variable.ace_parameter {\n font-style: italic\n}\n\n.ace-vibrant-ink .ace_string {\n color: #66FF00\n}\n\n.ace-vibrant-ink .ace_string.ace_regexp {\n color: #44B4CC\n}\n\n.ace-vibrant-ink .ace_comment {\n color: #9933CC\n}\n\n.ace-vibrant-ink .ace_entity.ace_other.ace_attribute-name {\n font-style: italic;\n color: #99CC99\n}\n\n.ace-vibrant-ink .ace_indent-guide {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYNDTc/oPAALPAZ7hxlbYAAAAAElFTkSuQmCC) right repeat-y\n}\n\n.ace-vibrant-ink .ace_indent-guide-active {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQIW2PQ1dX9zzBz5sz/ABCcBFFentLlAAAAAElFTkSuQmCC) right repeat-y;\n}\n"}),ace.define("ace/theme/vibrant_ink",["require","exports","module","ace/theme/vibrant_ink-css","ace/lib/dom"],function(e,t,n){t.isDark=!0,t.cssClass="ace-vibrant-ink",t.cssText=e("./vibrant_ink-css");var r=e("../lib/dom");r.importCssString(t.cssText,t.cssClass,!1)}); (function() {
2 | ace.require(["ace/theme/vibrant_ink"], function(m) {
3 | if (typeof module == "object" && typeof exports == "object" && module) {
4 | module.exports = m;
5 | }
6 | });
7 | })();
8 |
--------------------------------------------------------------------------------
/web_async/ace/theme-xcode.js:
--------------------------------------------------------------------------------
1 | ace.define("ace/theme/xcode-css",["require","exports","module"],function(e,t,n){n.exports='/* THIS THEME WAS AUTOGENERATED BY Theme.tmpl.css (UUID: EE3AD170-2B7F-4DE1-B724-C75F13FE0085) */\n\n.ace-xcode .ace_gutter {\n background: #e8e8e8;\n color: #333\n}\n\n.ace-xcode .ace_print-margin {\n width: 1px;\n background: #e8e8e8\n}\n\n.ace-xcode {\n background-color: #FFFFFF;\n color: #000000\n}\n\n.ace-xcode .ace_cursor {\n color: #000000\n}\n\n.ace-xcode .ace_marker-layer .ace_selection {\n background: #B5D5FF\n}\n\n.ace-xcode.ace_multiselect .ace_selection.ace_start {\n box-shadow: 0 0 3px 0px #FFFFFF;\n}\n\n.ace-xcode .ace_marker-layer .ace_step {\n background: rgb(198, 219, 174)\n}\n\n.ace-xcode .ace_marker-layer .ace_bracket {\n margin: -1px 0 0 -1px;\n border: 1px solid #BFBFBF\n}\n\n.ace-xcode .ace_marker-layer .ace_active-line {\n background: rgba(0, 0, 0, 0.071)\n}\n\n.ace-xcode .ace_gutter-active-line {\n background-color: rgba(0, 0, 0, 0.071)\n}\n\n.ace-xcode .ace_marker-layer .ace_selected-word {\n border: 1px solid #B5D5FF\n}\n\n.ace-xcode .ace_constant.ace_language,\n.ace-xcode .ace_keyword,\n.ace-xcode .ace_meta,\n.ace-xcode .ace_variable.ace_language {\n color: #C800A4\n}\n\n.ace-xcode .ace_invisible {\n color: #BFBFBF\n}\n\n.ace-xcode .ace_constant.ace_character,\n.ace-xcode .ace_constant.ace_other {\n color: #275A5E\n}\n\n.ace-xcode .ace_constant.ace_numeric {\n color: #3A00DC\n}\n\n.ace-xcode .ace_entity.ace_other.ace_attribute-name,\n.ace-xcode .ace_support.ace_constant,\n.ace-xcode .ace_support.ace_function {\n color: #450084\n}\n\n.ace-xcode .ace_fold {\n background-color: #C800A4;\n border-color: #000000\n}\n\n.ace-xcode .ace_entity.ace_name.ace_tag,\n.ace-xcode .ace_support.ace_class,\n.ace-xcode .ace_support.ace_type {\n color: #790EAD\n}\n\n.ace-xcode .ace_storage {\n color: #C900A4\n}\n\n.ace-xcode .ace_string {\n color: #DF0002\n}\n\n.ace-xcode .ace_comment {\n color: #008E00\n}\n\n.ace-xcode .ace_indent-guide {\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==) right repeat-y\n}\n\n.ace-xcode .ace_indent-guide-active {\n background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAAZSURBVHjaYvj///9/hivKyv8BAAAA//8DACLqBhbvk+/eAAAAAElFTkSuQmCC") right repeat-y;\n} \n'}),ace.define("ace/theme/xcode",["require","exports","module","ace/theme/xcode-css","ace/lib/dom"],function(e,t,n){t.isDark=!1,t.cssClass="ace-xcode",t.cssText=e("./xcode-css");var r=e("../lib/dom");r.importCssString(t.cssText,t.cssClass,!1)}); (function() {
2 | ace.require(["ace/theme/xcode"], function(m) {
3 | if (typeof module == "object" && typeof exports == "object" && module) {
4 | module.exports = m;
5 | }
6 | });
7 | })();
8 |
--------------------------------------------------------------------------------