Full Code of garris/BackstopJS for AI

master 930b3c863d39 cached
253 files
2.0 MB
536.1k tokens
1627 symbols
1 requests
Download .txt
Showing preview only (2,140K chars total). Download the full file or copy to clipboard to get everything.
Repository: garris/BackstopJS
Branch: master
Commit: 930b3c863d39
Files: 253
Total size: 2.0 MB

Directory structure:
gitextract__kzhch8i/

├── .babelrc
├── .editorconfig
├── .eslintignore
├── .eslintrc
├── .github/
│   └── workflows/
│       ├── _backstop-ci-runner.yml
│       ├── backstop-publish.yml
│       ├── backstop-reference-test.yml
│       ├── backstop-sanity-docker.yml
│       ├── docker-sanity-test.yml
│       ├── dockerhub-build-push.yml
│       ├── npm-push.yml
│       └── test-build-pub-npm-dockerhub.yml
├── .gitignore
├── .gitlab-ci.yml
├── .travis.yml
├── CONTRIBUTING.md
├── LICENSE
├── README.md
├── assets/
│   └── styles.css
├── capture/
│   ├── backstopTools.js
│   ├── config.default.json
│   └── engine_scripts/
│       ├── cookies.json
│       ├── playwright/
│       │   ├── clickAndHoverHelper.js
│       │   ├── interceptImages.js
│       │   ├── loadCookies.js
│       │   ├── onBefore.js
│       │   ├── onReady.js
│       │   └── overrideCSS.js
│       └── puppet/
│           ├── clickAndHoverHelper.js
│           ├── ignoreCSP.js
│           ├── interceptImages.js
│           ├── loadCookies.js
│           ├── onBefore.js
│           ├── onReady.js
│           └── overrideCSS.js
├── changelog.md
├── cli/
│   ├── index.js
│   └── usage.js
├── compare/
│   ├── README.md
│   ├── output/
│   │   ├── diff.js
│   │   ├── diverged.js
│   │   ├── divergedWorker.js
│   │   ├── index.html
│   │   ├── index_bundle.js
│   │   └── index_bundle.js.LICENSE.txt
│   ├── src/
│   │   ├── .eslintrc
│   │   ├── actions/
│   │   │   └── index.js
│   │   ├── components/
│   │   │   ├── App.js
│   │   │   ├── atoms/
│   │   │   │   ├── ButtonFilter.js
│   │   │   │   ├── ButtonSettings.js
│   │   │   │   ├── DiffDetails.js
│   │   │   │   ├── ErrorMessages.js
│   │   │   │   ├── IdContainer.js
│   │   │   │   ├── ImagePreview.js
│   │   │   │   ├── ImageScrubber.js
│   │   │   │   ├── InputTextSearch.js
│   │   │   │   ├── LogDetails.js
│   │   │   │   ├── Logo.js
│   │   │   │   ├── NavButtons.js
│   │   │   │   ├── SettingOption.js
│   │   │   │   ├── SuiteName.js
│   │   │   │   ├── TextDetails.js
│   │   │   │   └── UrlDetails.js
│   │   │   ├── ecosystems/
│   │   │   │   ├── Header.js
│   │   │   │   ├── List.js
│   │   │   │   ├── LogModal.js
│   │   │   │   └── ScrubberModal.js
│   │   │   ├── molecules/
│   │   │   │   ├── ApproveButton.js
│   │   │   │   ├── FiltersSwitch.js
│   │   │   │   ├── ScrubberButton.js
│   │   │   │   ├── SettingsContainer.js
│   │   │   │   ├── SettingsPopup.js
│   │   │   │   ├── TestImages.js
│   │   │   │   └── TextSearch.js
│   │   │   └── organisms/
│   │   │       ├── TestCard.js
│   │   │       ├── Toolbar.js
│   │   │       └── Topbar.js
│   │   ├── index.js
│   │   ├── reducers/
│   │   │   ├── index.js
│   │   │   ├── layoutSettings.js
│   │   │   ├── logs.js
│   │   │   ├── scrubber.js
│   │   │   ├── suiteInfo.js
│   │   │   └── tests.js
│   │   ├── store.js
│   │   └── styles/
│   │       └── index.js
│   └── webpack.config.js
├── core/
│   ├── command/
│   │   ├── approve.js
│   │   ├── index.js
│   │   ├── init.js
│   │   ├── openReport.js
│   │   ├── reference.js
│   │   ├── remote.js
│   │   ├── report.js
│   │   ├── stop.js
│   │   ├── test.js
│   │   └── version.js
│   ├── runner.js
│   └── util/
│       ├── BackstopException.js
│       ├── Reporter.js
│       ├── allSettled.js
│       ├── compare/
│       │   ├── compare-hash.js
│       │   ├── compare-resemble.js
│       │   ├── compare.js
│       │   ├── index.js
│       │   ├── store-failed-diff-stub.js
│       │   └── store-failed-diff.js
│       ├── createBitmaps.js
│       ├── engineErrors.js
│       ├── engineTools.js
│       ├── ensureDirectoryPath.js
│       ├── extendConfig.js
│       ├── findExecutable.js
│       ├── fs.js
│       ├── getFreePorts.js
│       ├── getRemotePort.js
│       ├── isWin.js
│       ├── logger.js
│       ├── makeConfig.js
│       ├── makeSpaces.js
│       ├── promisify.js
│       ├── remote.js
│       ├── runDocker.js
│       ├── runPlaywright.js
│       ├── runPuppet.js
│       └── streamToPromise.js
├── docker/
│   ├── Dockerfile
│   ├── README.md
│   ├── burn-docker-builder.sh
│   ├── hooks/
│   │   ├── build
│   │   └── post_push
│   └── xvfb-run
├── examples/
│   ├── Jenkins/
│   │   ├── README.md
│   │   └── Sample/
│   │       ├── backstop.json
│   │       └── backstop_data/
│   │           └── engine_scripts/
│   │               └── puppet/
│   │                   ├── clickAndHoverHelper.js
│   │                   ├── ignoreCSP.js
│   │                   ├── interceptImages.js
│   │                   ├── loadCookies.js
│   │                   ├── onBefore.js
│   │                   └── onReady.js
│   ├── angularAppWithCssTransitions/
│   │   ├── backstopConfig_1.json
│   │   ├── backstopConfig_2.json
│   │   └── index.html
│   ├── featureTests/
│   │   ├── dist/
│   │   │   ├── css/
│   │   │   │   ├── bootstrap-theme.css
│   │   │   │   └── bootstrap.css
│   │   │   └── js/
│   │   │       ├── bootstrap.js
│   │   │       └── npm.js
│   │   ├── index.html
│   │   └── readme.md
│   ├── jsBasedConfig/
│   │   ├── backstopConfig.js
│   │   └── readme.md
│   ├── myCoolProject/
│   │   ├── dist/
│   │   │   ├── css/
│   │   │   │   ├── bootstrap-theme.css
│   │   │   │   └── bootstrap.css
│   │   │   └── js/
│   │   │       ├── bootstrap.js
│   │   │       └── npm.js
│   │   ├── index.html
│   │   └── readme.md
│   ├── nodeIntegration/
│   │   ├── backstop.config.js
│   │   ├── backstop.js
│   │   ├── package.json
│   │   ├── public/
│   │   │   ├── first-project/
│   │   │   │   ├── about-us.html
│   │   │   │   ├── homepage.html
│   │   │   │   └── ignore-me.html
│   │   │   ├── second-project/
│   │   │   │   ├── contact-us.html
│   │   │   │   ├── dummy.json
│   │   │   │   ├── ignore-me.html
│   │   │   │   └── index.html
│   │   │   └── third-project/
│   │   │       ├── ignore-me.html
│   │   │       └── terms-of-use.html
│   │   ├── readme.md
│   │   └── server.js
│   ├── responsiveDemo/
│   │   ├── backstop.json
│   │   ├── backstop_data/
│   │   │   └── engine_scripts/
│   │   │       ├── cookies.json
│   │   │       └── puppet/
│   │   │           ├── clickAndHoverHelper.js
│   │   │           ├── ignoreCSP.js
│   │   │           ├── interceptImages.js
│   │   │           ├── loadCookies.js
│   │   │           ├── onBefore.js
│   │   │           └── onReady.js
│   │   ├── index.html
│   │   ├── package.json
│   │   ├── readme.md
│   │   └── responsiveDemo.css
│   └── simpleReactApp/
│       ├── assets/
│       │   └── css/
│       │       └── styles.css
│       ├── backstop.json
│       ├── compiled.js
│       ├── components/
│       │   ├── App.js
│       │   ├── CurrentLocation.js
│       │   ├── LocationItem.js
│       │   ├── LocationList.js
│       │   ├── Map.js
│       │   └── Search.js
│       ├── index.html
│       ├── main.js
│       ├── package.json
│       └── readme.md
├── index.html
├── old_splash_page_v2.0/
│   ├── css/
│   │   ├── bootstrap-theme.css
│   │   ├── bootstrap.css
│   │   └── main.css
│   ├── img/
│   │   └── backgrounds/
│   │       ├── cream_dust/
│   │       │   └── readme.txt
│   │       └── subtlenet2/
│   │           └── readme.txt
│   ├── index.html
│   └── js/
│       ├── main.js
│       └── vendor/
│           └── bootstrap.js
├── package.json
├── remote/
│   └── index.js
└── test/
    ├── .eslintrc
    ├── cli/
    │   ├── index_spec.js
    │   └── usage_spec.js
    ├── configs/
    │   ├── backstop.json
    │   ├── backstop_alt.js
    │   ├── backstop_data/
    │   │   ├── cookies.json
    │   │   └── engine_scripts/
    │   │       ├── cookies.json
    │   │       ├── onBefore.js
    │   │       ├── onReady.js
    │   │       ├── playwright/
    │   │       │   ├── clickAndHoverHelper.js
    │   │       │   ├── interceptImages.js
    │   │       │   ├── loadCookies.js
    │   │       │   ├── onBefore.js
    │   │       │   ├── onReady.js
    │   │       │   └── overrideCSS.js
    │   │       └── puppet/
    │   │           ├── clickAndHoverHelper.js
    │   │           ├── loadCookies.js
    │   │           ├── onBefore.js
    │   │           ├── onReady.js
    │   │           └── overrideCSS.js
    │   ├── backstop_fail_cases.js
    │   ├── backstop_features.js
    │   ├── backstop_features_pw.js
    │   ├── dynamic_node_app.js
    │   ├── multi_step node_example.js
    │   ├── playwright.json
    │   ├── remote.js
    │   ├── responsiveDemo.json
    │   ├── responsiveTest.json
    │   ├── runFromNode.js
    │   └── special_cases/
    │       ├── scrollToSelector.html
    │       └── scrollToSelector_puppet.js
    └── core/
        ├── command/
        │   └── report_spec.js
        ├── runner_spec.js
        └── util/
            ├── backstop.json
            ├── compare/
            │   ├── compare-hash_spec.js
            │   ├── compare-resemble_spec.js
            │   └── compare_spec.js
            ├── engineErrors_spec.js
            ├── extendConfig_spec.js
            ├── fixtures/
            │   ├── engineErrorsFail.json
            │   └── engineErrorsSuccess.json
            ├── makeConfig_it_spec.js
            ├── makeConfig_spec.js
            ├── remote_spec.js
            └── runDocker_spec.js

================================================
FILE CONTENTS
================================================

================================================
FILE: .babelrc
================================================
{
  "presets": [
    "@babel/preset-env",
    "@babel/preset-react"
  ]
}

================================================
FILE: .editorconfig
================================================
# editorconfig.org
root = true

[*]
indent_style = space
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
indent_size = 2

[*.json]
indent_size = 2


================================================
FILE: .eslintignore
================================================
index_bundle.js
config.js
diff.js
diverged.js
divergedWorker.js
**/examples/**
**/old_splash_page_v2.0/**
**/dist/**
**/angular.min.js
**/js/vendor/**


================================================
FILE: .eslintrc
================================================
{
  "extends": "eslint-config-semistandard",
  "rules": {
    "no-multi-str": 0
  }
}


================================================
FILE: .github/workflows/_backstop-ci-runner.yml
================================================
name: 👀 Backstop CI Runner
run-name: "CI running on ${{ github.event_name == 'pull_request' && format('PR #{0}: {1}', github.event.pull_request.number, github.event.pull_request.title) || format('latest {0}', github.ref_name) }}"

on:
  workflow_dispatch:
  pull_request:
    branches: [master, develop]
  push:
    branches: [master, develop]

permissions:
  actions: write
  checks: write
  contents: write
  pull-requests: write
  packages: write

env:
  BRANCH_NAME: ${{ github.event.pull_request.head.sha || github.head_ref || github.ref_name }}

jobs:    
  backstop-reference-test:
    name: Backstop reference test
    uses: ./.github/workflows/backstop-reference-test.yml



================================================
FILE: .github/workflows/backstop-publish.yml
================================================
name: Backstop Publish
#doesnt work :(

on:
  workflow_dispatch:
  workflow_call:


permissions:
  actions: write
  checks: write
  contents: write
  pull-requests: write
  packages: write

env:
  BRANCH_NAME: ${{ github.event.pull_request.head.sha || github.head_ref || github.ref_name }}
  NODE_VERSION: 20

jobs:
  backstop-publish-flow:
    name: publish-flow
    runs-on: ubuntu-latest
    steps:
      - name: publish to npm
        uses: ./.github/workflows/npm-push.yml

      - name: publish to dockerhub
        uses: ./.github/workflows/dockerhub-build-push.yml


================================================
FILE: .github/workflows/backstop-reference-test.yml
================================================
name: 🛞 Backstop Reference Test

on:
  workflow_dispatch:
  workflow_call:

permissions:
  actions: write
  contents: write
  pull-requests: write

env:
  NODE_VERSION: 20

jobs:
  reference-test:
    name: reference-test
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v4
        with:
          fetch-depth: 1
          ref: ${{ github.event.pull_request.head.sha || github.ref }}

      - name: Setup Node & Cache
        uses: actions/setup-node@v4
        with:
          cache: "npm"
          cache-dependency-path: package-lock.json

      - name: Install
        run: npm ci

      - name: "execute test"
        run: npm run reference-test




================================================
FILE: .github/workflows/backstop-sanity-docker.yml
================================================
name: Backstop Sanity Docker

on:
  workflow_dispatch:
  workflow_call:

permissions:
  actions: write
  checks: write
  contents: write
  pull-requests: write
  packages: write

env:
  NODE_VERSION: 20
  # BRANCH_NAME: ${{ github.event.pull_request.head_ref || github.event.pull_request.head.ref_name || github.head_ref || github.ref_name }}
  # REGISTRY: ghcr.io
  # IMAGE_NAME: ${{ github.repository }}

jobs:
  sanity-puppeteer-docker:
    name: 🤪 Puppeteer-On-Docker
    runs-on: ubuntu-latest

    permissions:
      contents: read
      packages: write

    steps:
      - name: Checkout
        uses: actions/checkout@v4
        with:
          fetch-depth: 1
          ref: ${{ github.event.pull_request.head.sha || github.ref }}

      - name: Login to Docker Hub
        uses: docker/login-action@v3
        with:
          username: ${{ secrets.DOCKERHUB_USERNAME }}
          password: ${{ secrets.DOCKERHUB_TOKEN }}
        run:
          echo "USERNAME=${secrets.DOCKERHUB_USERNAME}" >>${GITHUB_ENV}
          echo "USERNAME=${secrets.DOCKERHUB_TOKEN}" >>${GITHUB_ENV}
          
      - name: Set Name and Tag Vars
        env:
          name: "${{ env.BRANCH_NAME }}"
        run: |
          echo "IMAGE_NAME_LC=${IMAGE_NAME,,}" >>${GITHUB_ENV}
          echo "TAG=${name/\//-}" >> $GITHUB_ENV
          echo "PV=$(cat package.json | jq -r '.version')" >> $GITHUB_ENV
          echo "PLAYWRIGHT_VERSION=$(cat package.json | jq -r '.dependencies.playwright')"  >> $GITHUB_ENV

      - name: ⬢ Setup Node & Cache
        uses: actions/setup-node@v4
        with:
          cache: "npm"
          cache-dependency-path: package-lock.json

      - name: ↧ Install
        run: npm ci

      - name: "𓋏 Run `npm run sanity-test-docker`"
        run: |
          npm run sanity-test-docker






================================================
FILE: .github/workflows/docker-sanity-test.yml
================================================
name: Docker Sanity Tests

on:
  workflow_dispatch:
  workflow_call:

permissions:
  actions: write
  checks: write
  contents: write
  pull-requests: write
  packages: write

env:
  BRANCH_NAME: ${{ github.event.pull_request.head_ref || github.event.pull_request.head.ref_name || github.head_ref || github.ref_name }}
  NODE_VERSION: 20
  REGISTRY: ghcr.io
  IMAGE_NAME: ${{ github.repository }}

jobs:
  sanity-test-puppeteer:
    name: 🤪 Puppeteer
    runs-on: ubuntu-latest

    permissions:
      contents: read
      packages: write

    steps:
      - name: Checkout
        uses: actions/checkout@v4
        with:
          fetch-depth: 1
          ref: ${{ github.event.pull_request.head.sha || github.ref }}

      - name: Set Name and Tag Vars
        env:
          name: "${{ env.BRANCH_NAME }}"
        run: |
          echo "IMAGE_NAME_LC=${IMAGE_NAME,,}" >>${GITHUB_ENV}
          echo "TAG=${name/\//-}" >> $GITHUB_ENV
          echo "PV=$(cat package.json | jq -r '.version')" >> $GITHUB_ENV
          echo "PLAYWRIGHT_VERSION=$(cat package.json | jq -r '.dependencies.playwright')"  >> $GITHUB_ENV

      - name: Log in to the Container registry
        uses: docker/login-action@65b78e6e13532edd9afa3aa52ac7964289d1a9c1
        with:
          registry: ${{ env.REGISTRY }}
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}

      - name: ⬢ Setup Node & Cache
        uses: actions/setup-node@v4
        with:
          cache: "npm"
          cache-dependency-path: package-lock.json

      - name: ↧ Install
        run: npm ci

      - name: Pull Image
        run: |
          docker pull $REGISTRY/$IMAGE_NAME_LC:$TAG

      - name: "𓋏 Run `backstop test` in Docker"
        run: |
          cd test/configs/ && docker run --rm -t --mount type=bind,source="$(pwd)",target=/src $REGISTRY/$IMAGE_NAME_LC:$TAG test

  sanity-test-playwright:
    name: 🤪 Playwright
    runs-on: ubuntu-latest

    permissions:
      contents: read
      packages: write

    steps:
      - name: Checkout
        uses: actions/checkout@v4
        with:
          fetch-depth: 1
          ref: ${{ github.event.pull_request.head.sha || github.ref }}

      - name: Set Name and Tag Vars
        env:
          name: "${{ env.BRANCH_NAME }}"
        run: |
          echo "IMAGE_NAME_LC=${IMAGE_NAME,,}" >>${GITHUB_ENV}
          echo "TAG=${name/\//-}" >> $GITHUB_ENV
          echo "PV=$(cat package.json | jq -r '.version')" >> $GITHUB_ENV
          echo "PLAYWRIGHT_VERSION=$(cat package.json | jq -r '.dependencies.playwright')"  >> $GITHUB_ENV

      - name: Log in to the Container registry
        uses: docker/login-action@65b78e6e13532edd9afa3aa52ac7964289d1a9c1
        with:
          registry: ${{ env.REGISTRY }}
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}

      - name: ⬢ Setup Node & Cache
        uses: actions/setup-node@v4
        with:
          cache: "npm"
          cache-dependency-path: package-lock.json

      - name: ↧ Install
        run: npm ci --verbose --foreground-scripts

      - name: Pull Image
        run: |
          docker pull $REGISTRY/$IMAGE_NAME_LC:$TAG

      - name: "🎭 Run `backstop test --confg=playwright` in Docker"
        run: |
          cd test/configs/ && docker run --rm -t --entrypoint='' --mount type=bind,source="$(pwd)",target=/src $REGISTRY/$IMAGE_NAME_LC:$TAG sh -c "chmod -R 777 /root && chmod -R 777 /opt/pw-browsers && npm --verbose --foreground-scripts i -D playwright && npx --verbose --foreground-scripts --yes playwright@$PLAYWRIGHT_VERSION install && backstop test --config=playwright"


================================================
FILE: .github/workflows/dockerhub-build-push.yml
================================================
name: 🐳 Docker Hub Build & Push

on:
  workflow_dispatch:
  workflow_call:

permissions:
  actions: write
  checks: write
  contents: write
  pull-requests: write
  packages: write

env:
  NODE_VERSION: 20

jobs:
  build-and-push-image:
    runs-on: ubuntu-latest

    steps:
      - name: ⇣ Checkout
        uses: actions/checkout@v4
        with:
          fetch-depth: 1
          ref: ${{ github.event.pull_request.head.sha || github.ref }}

      - name: 🏷️ Set Docker Image Tag
        run: |
          echo "PV=$(cat package.json | jq -r '.version')" >> $GITHUB_ENV

      - name: Log in to the Container registry
        uses: docker/login-action@v3
        with:
          username: ${{ secrets.DOCKERHUB_USERNAME }}
          password: ${{ secrets.DOCKERHUB_TOKEN }}

      - name: ⬢ Setup Node & Cache
        uses: actions/setup-node@v4
        with:
          cache: "npm"
          cache-dependency-path: package-lock.json

      - name: ↧ Install
        run: npm ci --verbose --foreground-scripts

      - name: 🚢 Build Docker Builder
        run: |
          npm run --verbose --foreground-scripts init-docker-builder

      - name: 🐳 Build & Push to Docker Hub
        run: |
          docker buildx build --push --platform linux/amd64,linux/arm64 -t backstopjs/backstopjs:$PV -t backstopjs/backstopjs:latest --build-arg BACKSTOPJS_VERSION=$PV docker


================================================
FILE: .github/workflows/npm-push.yml
================================================
name: 📦 NPM Push

on:
  workflow_dispatch:
  workflow_call:

permissions:
  actions: write
  checks: write
  contents: write
  pull-requests: write
  packages: write
  
env:
  BRANCH_NAME: ${{ github.event.pull_request.head.sha || github.head_ref || github.ref_name }}
  NODE_VERSION: 20

jobs:
  publish:
    runs-on: ubuntu-latest
    steps: 
      - name: Checkout
        uses: actions/checkout@v4
        with:
          fetch-depth: 1
          ref: ${{ github.event.pull_request.head.sha || github.ref }}
          
      - name: Setup Node & Cache
        uses: actions/setup-node@v4
        with:
          cache: "npm"
          cache-dependency-path: package-lock.json
      
      - run: npm ci
      
      - uses: JS-DevTools/npm-publish@v3
        with:
          token: ${{ secrets.NPM_I2_TOKEN }}


================================================
FILE: .github/workflows/test-build-pub-npm-dockerhub.yml
================================================
name: Test build & publish npm + docker

on:
  workflow_dispatch:
        
permissions:
  actions: write
  checks: write
  contents: write
  pull-requests: write
  packages: write

env:
  NODE_VERSION: 20

jobs:
  test-push-npm-dockerhub:
    runs-on: ubuntu-latest
    
    steps:
      - run: echo "start workflow"
      
      - name: Checkout
        uses: actions/checkout@v2
      
      - name: reference test
        uses: ./.github/actions/backstop-reference-test.yml

    


================================================
FILE: .gitignore
================================================
.DS_Store

# Logs
logs
*.log

# Runtime data
pids
*.pid
*.seed
*.cache

# Dependency directory
# Commenting this out is preferred by some people, see
# https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git-
node_modules
yarn.lock

# Users Environment Variables
.lock-wscript

*.sublime*
.idea

compare/bower_components/**/.*
examples/**/html_report/

**/backstop_data/bitmaps_test/
**/backstop_data/html_report/
**/backstop_data/json_report/
**/backstop_data/reports/
compare/config.js
capture/config.json

compare/output/bitmaps_reference/

compare/output/bitmaps_test/

compare/output/config\.js

\.vscode/

# Tests
*integrationTestDir


================================================
FILE: .gitlab-ci.yml
================================================
image: node:$NODEJS

# Select what we should cache
cache:
  key: ${CI_COMMIT_REF_SLUG}
  paths:
    - node_modules/

before_script:
  - node -v
  - npm -v
  - npm install

tests:
  script:
    - npm run lint
    - npm run unit-test
  parallel:
    matrix:
      - NODEJS:
          - 14
          - 16
          - 18


================================================
FILE: .travis.yml
================================================
addons: # get google-chrome [stable|beta]
  chrome: beta
language: node_js
node_js:
  - 14
  - 16
install:
  - npm install
script:
  - npm run lint && npm run unit-test


================================================
FILE: CONTRIBUTING.md
================================================
# Contributing to this project

Thank you for contributing to developer happiness all over the world!

For notes on contributing to BackstopJS please see [Developing, bug fixing, contributing...](./README.md#developing-bug-fixing-contributing)

☮️


================================================
FILE: LICENSE
================================================
The MIT License (MIT)

Copyright (c) 2014 Garris Shipon

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.



================================================
FILE: README.md
================================================
![npm@latest](https://img.shields.io/npm/v/backstopjs/latest.svg) ![GitHub Repo stars](https://img.shields.io/github/stars/garris/backstopjs) ![GitHub contributors](https://img.shields.io/github/contributors/garris/backstopjs) ![downloads](https://img.shields.io/npm/dy/backstopjs) [![Backstop CI](https://github.com/garris/BackstopJS/actions/workflows/backstop-reference-test.yml/badge.svg)](https://github.com/garris/BackstopJS/actions/workflows/backstop-reference-test.yml)



# BackstopJS

![I'm in your webapps -- checkin your screens](http://garris.github.io/BackstopJS/assets/memes/im-in-ur-webapps-checking-ur-screens.jpg)

**BackstopJS automates visual regression testing of your webapp – comparing screenshots over time.**

## News

**Backstop 6.3.2 -- now with support for Node 20** Many thanks to @dgrebb for this doozy of a maintainance release!

**EmberJS users** -- check out our ember-backstop test helper! https://github.com/garris/ember-backstop

**Want to learn how to Backstop from a pro?** Check out [visual regression testing with BackstopJS on udemy.com]([https://www.udemy.com/course/visual-regression-testing-with-backstopjs/](https://www.udemy.com/course/testes-de-regressao-visual-com-backstopjs/?referralCode=3751623DD59D061311E1)) by [Walmyr Filho](https://www.udemy.com/user/walmyr/)

## Backstop Features

- In-browser reporting UI with...
  * layout settings for print and screen
  * scenario display filtering
  * reference, test, visual diff inspector
  * cool scrubber thingy
  * approving a test

![BackstopJS browser report](http://garris.github.io/BackstopJS/assets/backstopjs_new_ui_.png)

- Integrated Docker rendering -- to eliminate cross-platform rendering shenanigans
- CLI reports
- Render tests with **Chrome Headless**
- Simulate user interactions with **Playwright** or **Puppeteer** scripts
- JUnit reports
- Plays nice with CI and source control
- Run globally or locally as a standalone package app or `require('backstopjs')` right into your node app
- Incredibly easy to use: just 3 commands go a long long way!

![BackstopJS cli report](http://garris.github.io/BackstopJS/assets/cli-report.png)

## Install BackstopJS Now

```sh
npm install -g backstopjs
```

----

## Contents

- [Install BackstopJS Now](#install-backstopjs-now)
- [The BackstopJS Workflow](#the-backstopjs-workflow)
- [Getting Started](#getting-started)
  - [Installation](#installation)
  - [Initializing Your Project](#initializing-your-project)
  - [Working with Your Config File](#working-with-your-config-file)
  - [Generating Test Bitmaps](#generating-test-bitmaps)
  - [Approving Changes](#approving-changes)
- [Using BackstopJS](#using-backstopjs)
  - [Scenario Properties](#scenario-properties)
  - [Global Scenario Properties](#global-scenario-properties)
  - [Advanced Scenarios](#advanced-scenarios)
- [Developing, Bug Fixing, Contributing...](#developing-bug-fixing-contributing)
- [Troubleshooting](#troubleshooting)
- [Tutorials, Extensions and More](#tutorials-extensions-and-more)
- [Credits](#credits)

----

## The BackstopJS Workflow

- **`backstop init`:** Set up a new BackstopJS instance -- specify URLs, cookies, screen sizes, DOM selectors, interactions etc. (see examples directory)
- **`backstop test`:** BackstopJS creates a set of *test* screenshots and compares them with your *reference* screenshots. Any changes show up in a visual report. (Run this after making CSS changes as many times as needed.)
- **`backstop approve`:** If the test you ran looks good, then go ahead and approve it. Approving changes will update your reference files with the results from your last test.  Future tests are compared against your most recent approved test screenshots.

## Getting Started

### Installation

#### Global Installation (Recommended)

```sh
npm install -g backstopjs
```

#### Local Installation

BackstopJS will run as a totally stand alone app -- but installing locally allows you to do this...

```js
const backstop = require('backstopjs');
```

See [Integration Options](#integration-options-local-install) to learn about cool BackstopJS integration options!

### Initializing Your Project

**If you don't already have BackstopJS set up...**
BackstopJS can create a default configuration file and project scaffolding in your current working directory. Please note: this will overwrite any existing files!

`cd` to your project's directory and run...

```sh
backstop init
```

### Working with Your Config File

By default, BackstopJS places `backstop.json` in the root of your project. And also by default, BackstopJS looks for this file when invoked.

Pass a `--config=<configFilePathStr>` argument to test using a different config file.

**JS based config file**

You may use a javascript based config file to allow comments in your config. Be sure to _export your config object as a node module_.

Example: Create a backstop.js

```
module.exports = { Same object as backstop.json }
```

and then `backstop test --config="backstop.js"`

#### Required Config Properties

As a new user setting up tests for your project, you will be primarily concerned with these properties...

- **`id`** – Used for screenshot naming. Set this property when sharing reference files with teammates -- otherwise omit and BackstopJS will auto-generate one for you to avoid naming collisions with BackstopJS resources.
- **`viewports`** – An array of screen size objects your DOM will be tested against.  Add as many as you like -- but add at least one.
- **`scenarios`** – This is where you set up your actual tests. The important sub properties are...
  - **`scenarios[n].label`** – Required. Also used for screenshot naming.
  - **`scenarios[n].url`** – Required. Tells BackstopJS what endpoint/document you want to test.  This can be an absolute URL or local to your current working directory.

> [!TIP]
> No other SCENARIO properties are required. Other properties can just be added as necessary.

### Generating Test Bitmaps

```sh
backstop test
```

This will create a new set of bitmaps in `bitmaps_test/<timestamp>/`

Once the test bitmaps are generated, a report comparing the most recent test bitmaps against the current reference bitmaps will display.

Pass a `--filter=<scenarioLabelRegex>` argument to just run scenarios matching your scenario label.

> [!TIP]
> The `--filter` argument offers a useful shortcut for re-running a single test or failed tests.

Pass a `--docker` flag to render your test in a Docker container -- this will help with consistency if you are attempting to compare references across multiple environments.

### Approving Changes

```sh
backstop approve
```

When running this command, all images (with changes) from your most recent test batch will be promoted to your reference collection. Subsequent tests will be compared against your updated reference files.

Pass a `--filter=<image_filename_regex>` argument to promote only the test captures matching your scenario filename. The filenames (which by default include scenario and viewport names) are displayed in the visual and cli reports.

> [!TIP]
> Remember to pass a `--config=<configFilePathStr>` argument if you passed that when you ran your last test.

## Using BackstopJS

### Scenario Properties

Scenario properties, [which may be global](#global-scenario-properties), are described throughout this document and **processed sequentially in the following order...**

| Property                 | Description                                                                                                                    |
|--------------------------|--------------------------------------------------------------------------------------------------------------------------------|
| `label`                  | [required] Tag saved with your reference images                                                                                 |
| `onBeforeScript`         | Used to set up browser state e.g. cookies.                                                                                     |
| `cookiePath`             | Import cookies in JSON format (available with default onBeforeScript, see setting cookies below)                               |
| `url`                    | [required] The URL of your app state                                                                                           |
| `referenceUrl`           | Specify a different state or environment when creating reference.                                                             |
| `readyEvent`             | Wait until this string has been logged to the console.                                                                         |
| `readySelector`          | Wait until this selector exists before continuing.                                                                            |
| `readyTimeout`           | Timeout for readyEvent and readySelector (default: 30000ms)                                                                    |
| `delay`                  | Wait for x milliseconds                                                                                                        |
| `hideSelectors`          | Array of selectors set to visibility: hidden                                                                                  |
| `removeSelectors`        | Array of selectors set to display: none                                                                                        |
| `onReadyScript`          | After the above conditions are met -- use this script to modify UI state prior to screenshots, e.g., hovers, clicks, etc.     |
| `keyPressSelectors`      | Takes an array of selectors and string values -- simulates multiple sequential keypress interactions.                         |
| `hoverSelector`          | Move the pointer over the specified DOM element prior to the screenshot.                                                       |
| `hoverSelectors`         | *Playwright and Puppeteer only* takes an array of selectors -- simulates multiple sequential hover interactions.             |
| `clickSelector`          | Click the specified DOM element prior to the screenshot.                                                                      |
| `clickSelectors`         | *Playwright and Puppeteer only* takes an array of selectors -- simulates multiple sequential click interactions.               |
| `postInteractionWait`    | Wait for a selector after interacting with hoverSelector or clickSelector (optionally accepts wait time in ms). Ideal for use with a click or hover element transition. Available with default onReadyScript. |
| `scrollToSelector`       | Scrolls the specified DOM element into view prior to the screenshot (available with default onReadyScript).                  |
| `selectors`              | Array of selectors to capture. Defaults to document if omitted. Use "viewport" to capture the viewport size. See Targeting elements in the next section for more info... |
| `selectorExpansion`      | See Targeting elements in the next section for more info...                                                                   |
| `misMatchThreshold`      | Percentage of different pixels allowed to pass the test                                                                      |
| `requireSameDimensions`  | If set to true -- any change in selector size will trigger a test failure.                                                    |
| `viewports`              | An array of screen size objects your DOM will be tested against. This configuration will override the viewports property assigned at the config root. |
| `gotoParameters`         | An array of settings passed to page.goto(url, parameters) function.                                                           |

### Global Scenario Properties

One may opt to include any of the above properties at the "global" level, in the `scenarioDefaults` configuration object.

<details>
  <summary>Expand Example</summary>

  ```json
  {
    "id": "backstop_playwright",
    "viewports": [
      {
        "label": "phone",
        "width": 320,
        "height": 480
      },
      {
        "label": "tablet",
        "width": 1024,
        "height": 768
      }
    ],
    "onBeforeScript": "playwright/onBefore.js",
    "onReadyScript": "playwright/onReady.js",
    "scenarioDefaults": {
      "cookiePath": "backstop_data/engine_scripts/cookies.json",
      "url": "https://garris.github.io/BackstopJS/",
      "readySelector": "",
      "delay": 0,
      "hideSelectors": [".getItBlock"],
      "removeSelectors": [".logoBlock"],
      "hoverSelector": "",
      "clickSelector": "",
      "postInteractionWait": 1000,
      "selectors": [],
      "selectorExpansion": true,
      "misMatchThreshold" : 0.1,
      "requireSameDimensions": true
    },
    "scenarios": [
      {
        "label": "BackstopJS Homepage",
        "cookiePath": "backstop_data/engine_scripts/cookies.json",
        "url": "https://garris.github.io/BackstopJS/",
        "referenceUrl": "",
        "readyEvent": "",
        "readySelector": "",
        "delay": 0,
        "hoverSelector": "",
        "clickSelector": "",
        "selectors": [],
        "selectorExpansion": true,
        "misMatchThreshold" : 0.1,
        "requireSameDimensions": true
      }
    ],
    "paths": {
      "bitmaps_reference": "backstop_data/bitmaps_reference",
      "bitmaps_test": "backstop_data/bitmaps_test",
      "engine_scripts": "backstop_data/engine_scripts",
      "html_report": "backstop_data/html_report",
      "ci_report": "backstop_data/ci_report"
    },
    "report": ["browser"],
    "engine": "playwright",
    "engineOptions": {
      "args": ["--no-sandbox"]
    },
    "asyncCaptureLimit": 5,
    "asyncCompareLimit": 50,
    "debug": false,
    "debugWindow": false,
    "archiveReport": true,
    "scenarioLogsInReports": true
  }
  ```

</details>

> [!IMPORTANT]
> Global configuration is overridden at the `scenario` level. A scenario with `selectors: []` set as an empty array will yield zero selectors. E.g. `scenarioDefaults.selectors: [".fancy", ".global", ".classes"]` will be set to `[]`, as `scenario.selectors` takes precedence.

### Advanced Scenarios

#### Testing Click and Hover Interactions

BackstopJS ships with an `onReady` script that enables the following interaction selectors...

```js
clickSelector: ".my-hamburger-menu",
hoverSelector: ".my-hamburger-menu .some-menu-item",
```

The above would tell BackstopJS to wait for your app to generate an element with a `.my-hamburger-menu` class, then click that selector.   Then it would wait again for a `.my-hamburger-menu .some-menu-item` class, then move the cursor over that element (causing a hover state).  Then BackstopJS would take a screenshot.

You can use these properties independent of each other to easily test various click and or hover states in your app.  These are obviously simple scenarios -- if you have more complex needs then this example should serve as a pretty good starting point create your own `onReady` scripts.

> [!NOTE]
> Playwright and Puppeteer versions optionally take `clickSelectors` & `hoverSelectors` as arrays of selectors...

```js
clickSelectors: [".my-hamburger-menu",".my-hamburger-item"],
hoverSelectors: [".my-nav-menu-item",".my-nav-menu-dropdown-item"],
```

#### Key Press Interactions

BackstopJS ships with an `onReady` script that allows user to key press on selectors...

> [!NOTE]
> Supports both Playwright and Puppeteer and takes arrays of selectors and key press values.

```json
scenarios: [
  {
    "keyPressSelectors": [
      {
        "selector": "#email",
        "keyPress": "marcdacz@backstopjs.com"
      },
      {
        "selector": "#password",
        "keyPress": "1234"
      }
    ]
  }
]
```

#### Setting Cookies

BackstopJS ships with an onBefore script that makes it easy to import cookie files…

```json
cookiePath: "backstop_data/engine_scripts/cookies.json",
```

> [!NOTE]
> Path is relative to your current working directory.

> [!TIP]
> If you want an easy way to manually export cookies from your browser then download [this browser extension](https://github.com/ktty1220/export-cookie-for-puppeteer). You can directly use the output cookie files with BackstopJS.

#### Targeting Elements

BackstopJS makes it super easy to capture screenshots of your entire layout or just parts of your layout. This is defined in your `scenario.selectors` array. Elements are defined with standard CSS notation. By default BackstopJS takes a screenshot of the first occurrence of any selector found in your DOM. e.g. If you have three `li` tags in your layout only the first will used.

##### `selectorExpansion`

If you want BackstopJS to find and take screenshots of _all_ matching selector instances then there is a handy switch for that. Set `selectorExpansion` to `true` like so...

```json
scenarios: [
  {
    "selectors": [
      ".aListOfStuff li"
    ],
    "selectorExpansion": true
  }
]
// captures all <li> tags inside .aListOfStuff
```

(Default behavior) If you want very explicit control of what you capture then you can disable `selectorExpansion` and explicitly select what you want...

```json
scenarios: [
  {
    "selectors": [
      ".aListOfStuff li"
    ],
    "selectorExpansion": false
  }
]
// Just captures the first <li> tag inside .aListOfStuff
```

##### `expect`

When working with selector expansion(set selectors in `selectors` properties and set `selectorExpansion` to `true`), you might want to explicitly set the number of results that you expect to find by the selectors. Set `expect` in the scenario to a number which is greater than 0, then the test will fail for the scenario if the number of selected result does not match the expect number.

```json
scenarios: [
  {
    "selectors": [
      ".aListOfStuff li"
    ],
    "selectorExpansion": true,
    "expect": 5
  }
]
// captures all <li> tags inside .aListOfStuff, and make sure the number of <li> tags is 5
```

(Default behavior) If you don't care the number of the selected elements, just set `expect` to 0 or not set the property.

```json
scenarios: [
  {
    "selectors": [
      ".aListOfStuff li"
    ],
    "selectorExpansion": false,
    "expect": 0
  }
]
// Captures all <li> tags inside .aListOfStuff, and not check the number of <li> tags
```

#### Testing Progressive Apps, SPAs, and Ajax Content

It is very common for client-side web apps is to initially download a small chunk of bootstrapping code/content/state and render it to the screen as soon as it arrives at the browser. Once this has completed, various JS components often take over to progressively load more content/state.

The problem testing these scenarios is knowing _when_ to take the screenshot.  BackstopJS solves this problem with two config properties: `readySelector`, `readyEvent` and `delay`.

##### Trigger Screen Capture Via Selector

The `readySelector` property tells BackstopJS to wait until a selector exists before taking a screenshot. For example, the following line will delay screen capture until a selector with the id '#catOfTheDayResult' is present somewhere in the DOM.

```json
"readySelector": "#catOfTheDayResult"
```

Another approach might look like this...

```json
"readySelector": "body.ember-has-rendered"
```

##### Trigger Screen Capture Via `console.log()`

The `readyEvent` property enables you to trigger the screen capture by logging a predefined string to the console. For example, the following line will delay screen capture until your web app calls `console.log("backstopjs_ready")`...

```json
"readyEvent": "backstopjs_ready"
```

In the above case it would be up to you to wait for all dependencies to complete before calling logging `"backstopjs_ready"` string to the console.

##### Delay Screen Capture

The `delay` property enables you to pause screen capturing for a specified duration of time. This delay is applied after `readyEvent` (if also applied).

```js
"delay": 1000 //delay in ms
```

In the above case, BackstopJS would wait for one second before taking a screenshot.

In the following case, BackstopJS would wait for one second after the string `backstopjs_ready` is logged to the console.

```js
{
  // ...
  "readyEvent": "backstopjs_ready",
  "delay": 1000 //delay in ms
  // ...
}
```

#### Dealing With Dynamic Content

For obvious reasons, this screenshot approach is not optimal for testing live dynamic content. The best way to test a dynamic app would be to use a known static content data stub – or ideally many content stubs of varying lengths which, regardless of input length, should produce certain specific bitmap output.

##### Hiding Selectors

That said, for a use case where you are testing a DOM with say an ad banner or a block of dynamic content which retains static dimensions, we have the `hideSelectors` property in `capture/config.json` which will set the corresponding DOM to `visibility:hidden`, thus hiding the content from our Resemble.js analysis but retaining the original layout flow.

```json
"hideSelectors": [
  "#someFixedSizeDomSelector"
]
```

##### Removing Selectors

There may also be elements which need to be completely removed during testing. For that we have `removeSelectors` which removes them from the DOM before screenshots.

```json
"removeSelectors": [
  "#someUnpredictableSizedDomSelector"
]
```

#### Capturing Browser Console Logs

Sometimes you need a little more information to debug misbehavior. If that information is in the browser console logs, it won't appear in a screenshot. To capture the browser console logs along with the screenshots, set `scenarioLogsInReports`. ( _Note: In order to view the logs, you will have to serve the reports from an HTTP server. See [Interactive Web Reporting](#interactive-web-reporting) below._)

```json
"scenarioLogsInReports": true
```

#### Changing Test Sensitivity

`"misMatchThreshold"` (percentage 0.00%-100.00%) will change the amount of difference BackstopJS will tolerate before marking a test screenshot as "failed".  The default setting is `0.1`, this may need to be adjusted based on the kinds of testing you're doing.

More info on how misMatchThreshold is derived can be found here... https://github.com/Huddle/Resemble.js/blob/af57cb2f4edfbe718d24b350b2be1d956b764298/resemble.js#L495

`"requireSameDimensions"` (true || false) will change whether BackstopJS will accept any change in dimensions. The default setting is `true`. If set to true then the test must be the same dimensions as the reference. If set to false the test does not have to be the same dimensions as the reference.

This setting can be used in conjunction with `"misMatchThreshold"`, for example, when setting a `"misMatchThreshold"` of more than 0.00% and the mismatch causing a change in dimensions, setting `"requireSameDimensions"` to false will allow the test to still pass, setting it to true would still make it fail.

#### Capturing the entire document or just the viewport, or just an element, or a combination.

BackstopJS recognizes two magic selectors: `document` and `viewport` -- these capture the entire document and just the current specified viewport respectively.  e.g.

```js
"scenarios": [
  {
    "selectors": [
      "document",
      "viewport",
      "#myFeature",
      // ...
    ],
     // ...
  }
]
```

#### Comparing Different Endpoints (e.g. comparing staging and production)

Pointing to different endpoints is easy. (e.g. to compare a production environment against a staging environment).

You can create reference files (without previewing) by using the command `backstop reference`.  By default this command calls the `url` property specified in your config.  Optionally, you can add a `referenceUrl` property to your scenario configuration. If found, BackstopJS will use `referenceUrl` for screen grabs when running `backstop reference`.

```js
"scenarios": [
  {
    "label": "cat meme feed sanity check",
    "url": "http://www.moreCatMemes.com",
    "referenceUrl": "http://staging.moreCatMemes.com:81",
    // ...
  }
]
```

#### Running Custom Scripts

Simulate user actions (click, scroll, hover, wait, etc.) or states (cookie values) by running your own script on ready. For each scenario, the custom .js file you specify is imported and run when the BackstopJS ready events are fulfilled.

From your project root, place your scripts in...

```sh
./backstop_data/engine_scripts
```

at the root of your config or in your scenario...

```js
"onReadyScript": "filename.js"   // Runs after onReady event on all scenarios -- use for simulating interactions (.js suffix is optional)
"onBeforeScript": "filename.js"  // Runs before each scenario -- use for setting cookies or other env state (.js suffix is optional)
"scenarios": [
  {
    "label": "cat meme feed sanity check",
    "onReadyScript": "filename.js"   //  If found will run instead of onReadyScript set at the root (.js suffix is optional)
    "onBeforeScript": "filename.js" // If found will run instead of onBeforeScript at the root (.js suffix is optional)
     // ...
  }
]
```

Inside `filename.js`, structure it like this:

```js
// onBefore example (puppeteer engine)
module.exports = async (page, scenario, vp, isReference) => {
  await require('./loadCookies')(page, scenario);

  // Example: set user agent
  await page.setUserAgent('some user agent string here');

};

// onReady example (puppeteer engine)
module.exports = async (page, scenario, vp) => {
  console.log('SCENARIO > ' + scenario.label);
  await require('./clickAndHoverHelper')(page, scenario);

  // Example: changing behavior based on config values
  if (vp.label === 'phone') {
    console.log( 'doing stuff for just phone viewport here' );
  }

  // add more stuff here...
};
```

##### Setting the base path for custom `onBefore` and `onReady` scripts

By default, the base path is a folder called `engine_scripts` inside your BackstopJS installation directory. You can override this by setting the `paths.scripts` property in your `backstop.json` file to point to somewhere in your project directory (recommended).

```json
"paths": {
  "engine_scripts": "backstop_data/engine_scripts"
}
```

##### `onBeforeScript`/`onReadyScript` available variables

`onBefore(page, scenario, viewport, isReference, Engine, config)``

| Variable      | Description                                                                          |
|---------------|--------------------------------------------------------------------------------------|
| `page`          | Browser page object                                                                  |
| `scenario`      | Currently running scenario config                                                    |
| `viewport`      | Viewport info                                                                        |
| `isReference`   | Whether the scenario contains a reference URL property                                |
| `Engine`        | Static class reference (Puppeteer/Playwright)                                        |
| `config`        | The whole config object                                                              |

<!-- omit from toc -->
### Reporting Workflow Tips

One testing approach to consider is incorporating BackstopJS into your build process and just let the CLI report run on each build or before each deploy.

It's natural for your layout to break while you're in feature development -- in that case you might just run a `backstop test` when you feel things should be shaping up.

Use the `report` property in your config to enable or disable the respective properties. E.g. the following settings will open a browser and write a junit report.

```json
"report": ["browser", "CI"]
```

You can also specify a json report:
```json
"report": ["json"]
```

If you choose the CI-only reporting or even no reporting (CLI is always on) you can always enter the following command to see the latest test run report in the browser.

```sh
backstop openReport
```

#### Test report integration with a build system like Jenkins/Travis

The following config would enable the CI - report (*default: junit format*)

```json
"report" : [ "CI" ],
```

The regression test report will be generated in the JUnit format and the report will be placed in the given directory (*default: [backstopjs dir]/test/ci_report/xunit.xml*).

You may customize the testsuite name and/or a report file (xunit.xml) path to your build report directory by using the below configuration overrides,

```js
"paths": {
  "ci_report" :  "backstop_data/ci_report"
},
"ci": {
  "format" :  "junit" ,
  "testReportFileName": "myproject-xunit", // in case if you want to override the default filename (xunit.xml)
  "testSuiteName" :  "backstopJS"
},
```

<!-- omit from toc -->
### Interactive Web Reporting

![Approve Scenarios Web Report](http://garris.github.io/BackstopJS/assets/approve_feature_hilite_sm.png)

Backstop web reports support *approving scenarios* and *viewing browser logs* generated by each scenario. To enable these features you will need to run the backstop remote HTTP service in another terminal window...

```bash
BACKSTOP_REMOTE_HTTP_PORT=3000 backstop remote --config=<your config>
```

> [!TIP]
> The command above needs to be running before you open the report, so that Backstop detects it automatically. By default Backstop will open a report after running `backstop test`. Additionally reports can always be opened by running `backstop openReport`. Also have a look at [Reporting workflow tips](#reporting-workflow-tips).

> [!TIP]
> To stop the remote server, you can either hit `Ctrl-C` or `GET` the `http://<backstopHost>/stop/` endpoint.

<!-- omit from toc -->
### BackstopJS and CLI Return Values

> [!TIP]
> When run on the command line, the BackstopJS process will return a 0 if tests were successful and a 1 if anything failed. So you always have the flexibility of branching way up high in your CLI if needed -- e.g....

```
node ./backstopjs/cli/ test  && echo 'passed' || echo 'failed'
```

#### CLI Error Handling

When a layout error is found in CLI mode, BackstopJS will let you know in a general report displayed in the console. In addition, BackstopJS will return a 1 (error) to the calling CLI process.

<!-- omit from toc -->
### Setting The Bitmap And Script Directory Paths

By default, BackstopJS saves generated resources into the `backstop_data` directory in parallel with your `backstop.json` config file. The location of the various resource types are configurable so they can easily be moved inside or outside your source control or file sharing environment. See below for options...

> [!TIP]
> These file paths are relative to your current working directory.

```json
  ...
  "paths": {
    "bitmaps_reference": "backstop_data/bitmaps_reference",
    "bitmaps_test": "backstop_data/bitmaps_test",
    "engine_scripts": "backstop_data/engine_scripts",
    "html_report": "backstop_data/html_report",
    "json_report": "backstop_data/json_report",
    "ci_report": "backstop_data/ci_report",
  }
  ...
```

<!-- omit from toc -->
### Changing The Rendering Engine

Both Puppeteer and Playwright are installed by default, though the default configuration is set to Puppeteer.

#### Chrome-Headless (The latest webkit library)

To use chrome headless you can currently use _puppeteer_ (https://github.com/GoogleChrome/puppeteer).

```json
"engine": "puppeteer"
```

#### Playwright

To use firefox or webkit, you can currently use _playwright_ (https://github.com/microsoft/playwright).

Be sure to also switch the onBefore and `onReady` scripts to the Playwright defaults.  Playwright supports setting `engineOptions.browser` to `chromium`, `firefox`, or `webkit`.

The [storageState](https://playwright.dev/docs/api/class-browsercontext#browser-context-storage-state) config property is supported via the `engineOptions` object in backstop config. This sets cookies _and_ localStorage variables in the Playwright engine before tests are run. Very useful taking screenshots of pages that require authentication.

```json
  ...
  "onBeforeScript": "playwright/onBefore.js",
  "onReadyScript": "playwright/onReady.js",
  ...
  "engine": "playwright"
  ...
  "engineOptions": {
    "browser": "chromium",
    "storageState": "/path/to/cookies-and-local-storage-file.json"
  }
  ...
```

<!-- omit from toc -->
### Setting Puppeteer And Playwright Option Flags

Backstop sets two defaults for both Puppeteer and Playwright:

```json
ignoreHTTPSErrors: true,
headless: <!!!config.debugWindow>
```

You can add more settings (or override the defaults) with the `engineOptions` property. (properties are merged). This is where headless mode can also be set to 'new', until "new headless mode" is less hacky and more supported by Playwright.

> [!INFORMATION]
> Puppeteer now runs in `new` headless mode by default, but can be set to `old` headless by passing `"headless": true` in the configuration file.

```json
"engineOptions": {
  "ignoreHTTPSErrors": false,
  "args": ["--no-sandbox", "--disable-setuid-sandbox"],
  "headless": "new",
  "gotoParameters": { "waitUntil": "networkidle0" },
}
```

More info here:
  * [Puppeteer on github](https://github.com/GoogleChrome/puppeteer).
  * [Playwright on github](https://github.com/microsoft/playwright).

<!-- omit from toc -->
### Using Docker For Testing Across Different Environments

We've found that different environments can render the same webpage in slightly different ways -- in particular with text. E.G. see the text in this example rendering slightly differently between Linux and Mac...

![BakcstopJS OS rendering differences](http://garris.github.io/BackstopJS/assets/osRenderDifference.png)

You can make this issue go away by rendering in a BackstopJS Docker container.  Lucky for you we've made it incredibly easy to do.

First, go ahead and install docker on your machine from the [Docker Downloads Page](https://store.docker.com/search?type=edition&offering=community&architecture=amd64).

Make sure Docker is running on your machine.  On MacOS there is a menu item that looks like this... ![MacOS Docker Menu Item](https://user-images.githubusercontent.com/447033/42773728-fef034f4-88e2-11e8-9956-d58a7d432402.png)

Then, simply add a `--docker` flag onto your commands. E.G...

```sh
backstop test --docker
```

or for a local install

```js
const backstop = require('backstopjs');
backstop('test', {docker: true});
```

The above flag will cause BackstopJS to hit your Docker local client, spin up a BackstopJS container from https://hub.docker.com/r/backstopjs/backstopjs/ and execute your test. By default, Backstop will attemt to use a Docker image with the same version number specified in your `package.js`.

#### Changing The Default Docker Command

If the default docker command or image does not work for you, you can customize the command to run BackstopJS with Docker by changing the `dockerCommandTemplate` config option. The default is:

```sh
"dockerCommandTemplate": "docker run --rm -it --mount type=bind,source=\"{cwd}\",target=/src backstopjs/backstopjs:{version} {backstopCommand} {args}"
```

To improve security and prevent ownership problems of the generated files it is recommended to configure the used dockerCommandTemplate to use a user which does match your environment, for example to run it on linux with your current user and group id you could use that template:

```sh
"dockerCommandTemplate": "docker run --rm -it --user $(id -u):$(id -g) --mount type=bind,source=\"{cwd}\",target=/src backstopjs/backstopjs:{version} {backstopCommand} {args}"
```

> [!TIP]
> To run BackstopJS in Docker in an environment where the output is piped (e.g. CI server or an IDE's output window), remove the -t parameter (change the default to "docker run --rm -i --mount...)

#### Requirements for when you're using docker...

1. **If you are using a config generated prior to version 3.5 and you get an error like this...**

    ```
      COMMAND | Command "test" ended with an error after [0.312s]
      COMMAND | Error: Failed to launch chrome!
                ... Running as root without --no-sandbox is not supported. See https://crbug.com/638180.
                TROUBLESHOOTING: https://github.com/GoogleChrome/puppeteer/blob/master/docs/troubleshooting.md
    ```

    then you need to add this to the root of your config...

    ```js
    "engineOptions": {
        "args": ["--no-sandbox"]
    },
    ```

2. **`localhost` won't work in your scenarios -- instead, mac and win users can use `host.docker.internal` e.g.**

    ```json
    "url": "https://host.docker.internal/?someCoolAppParameter=true"
    ```

<!-- omit from toc -->
### Integration Options (Local Install)

Installing BackstopJS locally to your project makes a few integration options available.

Using Backstop as a locally installed standalone app looks like this....

```sh
# Install from your project root
npm install backstopjs

# Then, run commands by directly calling the cli
./node_modules/.bin/backstop test --config=<myConfigPath>
```

The more interesting case is calling backstop from another node app...

```js
const backstop = require('backstopjs');
```

#### Invoke default behavior in the current working directory context

```js
backstop('test')
  .then(() => {
    // test successful
  }).catch(() => {
    // test failed
  });
```

#### Pass options to the command

```js
backstop('test', {config:'custom/backstop/config.json'});
```

#### Pass a config object to the command

```js
// you can also pass a literal object
backstop('test', {
  config: {
    id: "foo",
    scenarios: [
      //some scenarios here
    ]
  }
});
```

#### The `--filter` argument still works too -- just pass a `filter` prop instead.

```js
// you can also pass a literal object
backstop('test', {
  filter: 'someScenarioLabelAsRegExString',
  config: {
    id: "foo",
    scenarios: [
      //some scenarios here
    ]
  }
});
```

#### Parse a config file explicitly

```js
backstop('test', {
  config: require("./backstop.js")({
    "foo": "bar"
  })
});


// Inside of `backstop.js` we export a function that returns the configuration object
module.exports = options => {
  return {
    //you can access options.foo here
  }
}
```

#### Since the backstop returns promises so it can run natively as a task in build systems like gulp

```js
const gulp = require('gulp');
const backstop = require('backstopjs');

gulp.task('backstop_reference', () => backstop('reference'));
gulp.task('backstop_test', () => backstop('test'));
```

#### Using `npm run` Scripts

When BackstopJS is installed locally, NPM will recognize the `backstop <command>` pattern originating from your own npm `package.json` scripts. The following would enable you to run the respective `npm <command>` commands locally in your project.

```json
"scripts": {
  "approve": "backstop approve",
  "test": "backstop test",
  "init": "backstop init"
}
```

The above is a basic example -- check out the NPM documentation for more info.

<!-- omit from toc -->
### Tuning BackstopJS Performance

During a test, BackstopJS processes image capture and image comparisons in parallel. You can adjust how much BackstopJS does at one time by changing

#### Capturing Screens In Parallel

By default, this value is limited to 10.  This value can be adjusted as needed to increase/decrease the amount of RAM required during a test.

The example below would capture 5 screens at a time...
```json
asyncCaptureLimit: 5
```

#### Comparing Screens In Parallel

By default, this value is limited to 50. This value can be adjusted as needed to increase/decrease the amount of RAM required during a test.

As a (very approximate) rule of thumb, BackstopJS will use 100MB RAM plus approximately 5 MB for each concurrent image comparison.

To adjust this value add the following to the root of your config...

```json
"asyncCompareLimit": 100
// Would require 600MB to run tests. Your mileage most likely will vary ;)
```

<!-- omit from toc -->
### Creating Reference Files

This Utility command will by default delete all existing screen references and create new ones based on the `referenceUrl` or `url` config config. It will not run any file comparisons.

Use this when you...
- create references from another environment (e.g. staging vs prod)
- or clean out your reference files and start fresh with all new reference
- or just create references without previewing

From your project directory...

```sh
backstop reference
```

optional parameters
`--config=<configFilePath>`   point to a specific config file
`--filter=<scenario.name>`    filter on scenario.name via regex string
`--i`                         incremental flag -- use if you don't want BackstopJS to first delete all files in your reference directory

<!-- omit from toc -->
### Modifying Output Settings Of Image-Diffs

By specifying `resembleOutputOptions` in your backstop.json file you can modify the image-diffs transparency, errorcolor, etc. (See [Resemble.js outputSettings](https://github.com/Huddle/Resemble.js) for the full list.)

Instead of calling resemble`s ignoreAntialiasing(), you may set it as a property in the config. (See [example](examples/simpleReactApp/backstop.json))

Per default, Backstop uses Resemble's misMatchPercentage value. However, this value only detects mismatches above 0.01%. If you need more precision and want to use a `misMatchThreshold` below `0.01` (e.g. for large screenshots or small changes), you can set `usePreciseMatching` in the `resembleOutputOptions`. (See [example](examples/simpleReactApp/backstop.json))

```json
"resembleOutputOptions": {
  "errorColor": {
    "red": 255,
    "green": 0,
    "blue": 255
  },
  "errorType": "movement",
  "transparency": 0.3,
  "ignoreAntialiasing": true
}
```

<!-- omit from toc -->
### Git Integration

For most users, it can be helpful to keep a record of reference files over the long haul -- but saving multiple _test_ screenshots is probably overkill. So, just like checking-in your unit tests with your production code you can similarly check in your Backstop reference files with your production code.

For many users, adding these lines to your `.gitignore` or `.git/info/exclude` files will pare down your backstop files in a sensible way.

```
backstop_data/html_report/
bitmaps_test/
```

_Of course you can alternatively change your default config to save these files somewhere else out of the source control scope -- thats cool too._

<!-- omit from toc -->
### Changing Screenshot Filename Formats

One of the things Backstop does for you is manage all your screenshot files.  Backstop uses a specific file-naming scheme to make this work.  Changing this scheme is of course NOT RECOMMENDED.  That said -- if you have an overwhelming need, then you can modify this behavior using the `fileNameTemplate` property. The default pattern is shown below where the labels in braces are replaced with internal values during runtime.

```js
{
  // ...
  fileNameTemplate: '{scenarioIndex}_{scenarioLabel}_{selectorIndex}_{selectorLabel}_{viewportIndex}_{viewportLabel}',
  // ...
}
```

## Developing, Bug Fixing, Contributing...

First off, You are awesome! Thanks for your interest, time and hard work!  Here are some tips...

<!-- omit from toc -->
### We use `eslint-config-semistandard`.

Please run the linter before each submit, as follows. Thank you. 🙇🏽

```sh
npm run lint -- --fix
```

<!-- omit from toc -->
### HTML Report Development

> [!WARNING]
> Here be dragons. Webpack, React, and other dependency updates are in progress.

Here's some suggestions if you want to work on the HTML report locally...

- The HTML front end is a React app.  It lives in `/compare/src/`

- The workflow is as follows from the backstopjs root
  - Start a remote server if you need to work with the approving tests flow

    ```
    cd test/configs/ && node ../../cli/index.js remote
    ```
  - Open another shell and run a test with this...

    ```
    npm run sanity-test
    ```
  - Your test report should display as designed.
  - Then, make your UI changes and build with this...

    ```
    npm run build-and-copy-report-bundle
    ```
    - No need to rerun a test, just refresh the browser window to view your UI changes.
    - Repeat the process until you're done.
    - When you are done, check it in and include the bundle as part of the checkin.

> [!NOTE]
> 👆 As a convenience, `npm run build-and-copy-report-bundle` copies your newly built React bundle into `test/configs/backstop_data/html_report/` so you can then test your changes by simply refreshing your report in chrome.

<!-- omit from toc -->
### Docker Development

Want to make sure your changes work with the `--docker` option? You can rebuild your local docker image from your current BackstopJS source.  From your BackstopJS root...

#### Building and Testing Locally

tl;dr

- `npm run init-docker-builder`
- customize `./docker/Dockerfile`
- `npm run build-docker`
- `npm run build-and-load-docker`

<details>
  <summary>Details</summary>
  <p>The Docker image is created via `npm run build-docker`, which uses a custom docker builder, created via `npm run init-docker-builder`. This ensures the Docker image can run on multiple platform architectures (M1 vs. Inteal Macs for example). [Read more](https://docs.docker.com/build/building/multi-platform/ "Docker Documentation)) about this.</p>

  <p>Because BackstopJS's Docker image is created with a custom `docker buildx` builder, one must "load" the image into their local registry. This is where `npm run build-and-load-docker` comes in handy.</p>
</details>

#### Publishing to Container Registries

If you have access to Docker Hub @backstop/backstop, then this command will push a new public BackstopJS docker image with the current version tag...

```sh
npm run push-docker
```

There are various other ways one can publish to ghcr.io, *.ecr.*.amazonaws.com etc. but those are beyond the scope of this README.

<!-- omit from toc -->
### SMOKE & FEATURE TESTS

See the next section for running the SMOKE TEST -- Please make sure this is working before submitting any PR's.  Thanks!

  ```
  # From root directory
  # ---------------
  # simple test
    npm run sanity-test-docker

  # longer test covering many features
    npm run smoke-test-docker

  # Or another way to test...

  # From test/configs/ directory
  # ---------------
  # simple test
    ../../cli/index.js test --config=backstop --docker
  # longer test covering many features
    ../../cli/index.js test --config=backstop_features --docker
  ```

## Troubleshooting

<!-- omit from toc -->
### SANITY TEST: Does Backstop work in my environment?

Run the following command from your Desktop, home or project directory to check that Backstop will install and run in your environment. _Please make sure you have node version 8 or above. Windows users: Powershell is recommended._

```
mkdir backstopSanityTest; cd backstopSanityTest; mkdir node_modules; npm install backstopjs; ./node_modules/.bin/backstop init; ./node_modules/.bin/backstop reference; ./node_modules/.bin/backstop test

```

Here is a sanity test which also uses docker...

```
mkdir backstopSanityTest; cd backstopSanityTest; mkdir node_modules; npm install backstopjs; ./node_modules/.bin/backstop init; ./node_modules/.bin/backstop reference --docker; ./node_modules/.bin/backstop test --docker
```

<!-- omit from toc -->
### SMOKE TEST: Are backstop features working ok?

Run this command if you have made changes to the BackstopJS codebase and you want to make sure that you haven't broken anything.

```
    # from the backstopjs directory
    npm run smoke-test
```

<!-- omit from toc -->
### Debugging

You have the option of displaying the Chrome window as tests are running.  This will allow you to visually see your app state at the time of your test.  To enable use...

```json
"debugWindow": true
```

When `debugWindow` is enabled on macOS, the system may show many firewall popups. This is because Puppeteer's Chromium application is not code-signed. As the exact steps to work around this may change with different macOS versions, see [[problem] Mac OS Firewall popup on every launch of puppeteer #4752](https://github.com/puppeteer/puppeteer/issues/4752) until this is fixed upstream. As of macOS Monterey 12.4, [these steps](https://github.com/puppeteer/puppeteer/issues/4752#issuecomment-1099647133) are the most current to run.

For all engines there is also the `debug` setting.  This enables verbose console output.This will also output your source payload to the terminal so you can make sure to check that the server is sending what you expect. 😉

```json
"debug": true
```

<!-- omit from toc -->
### Issues with Chrome-Headless in Docker

Please keep in mind, Chrome-Headless will need a lot of memory. Take a look at these if you are seeing weird timeout errors with Docker...

https://github.com/garris/BackstopJS/issues/603#issuecomment-346478523

https://github.com/garris/BackstopJS/issues/537#issuecomment-339710797

<!-- omit from toc -->
### Interaction: Clicking A Link That Loads A New Page

This is a grey area for BackstopJS.  When you click a link to a new page inside of Chrome headless then you are unloading all your current app state and starting fresh with a new app state.  If this is your case, the best practice is to simply create a new BackstopJS scenario with the required URL state etc.  If you have some kind of situation which really requires this kind of behavior then it's doable -- take a look at this issue for inspiration... https://github.com/garris/BackstopJS/issues/657

<!-- omit from toc -->
### Chrome Zombies!

Sometimes when developing scripts -- browser errors can actually cause Chrome-Headless to lose their special connection to each other.  If you find that Chrome zombies are accumulating in your ENV spacetime continuum then please follow these steps:

   1) DON’T PANIC!

   2) Remain calm.

   3) do the following...

      MacOS and Linux users can run...
      ```
      pkill -f "(chrome)?(--headless)"
      ```

      Windows users can run... (in PowerShell)
      ```
      Get-CimInstance Win32_Process -Filter "Name = 'chrome.exe' AND CommandLine LIKE '%--headless%'" | %{Stop-Process $_.ProcessId}
      ```

<!-- omit from toc -->
### The dreaded: _command-not-found_ error...

Did you install BackstopJS with the global option?  If installing globally remember to add that `-g` when installing with npm *i.e.* `npm install -g backstopjs`. If you installed *locally*, remember that the `backstop <command>` pattern will only be available to your npm scripts -- see the [local installation section](#local-installation) above for more info.

<!-- omit from toc -->
### Issues When Installing

Sometimes bad permissions happen to good people. It's ok, this is a safe space. Hopefully this will help... https://github.com/garris/BackstopJS/issues/545

<!-- omit from toc -->
### Projects don't work when I share with other users or run in different environments.

Be sure to use a config `id` in your config file. See https://github.com/garris/BackstopJS/issues/291

---

## Tutorials, Extensions and More

- A cool overview article by [Adrien Lemaire](https://www.linkedin.com/in/adrienlemaire) -- [Overview of BackstopJS, a tool to test a web application’s UI](https://medium.com/@Fandekasp/overview-of-backstopjs-a-tool-to-test-a-web-applications-ui-99234dc6c4f2)
- Another by [Adrien Lemaire](https://www.linkedin.com/in/adrienlemaire) Check this if you are interested in Continuous Integration (CI)! [A journey in Continuous Integration Testing](https://medium.com/@Fandekasp/a-journey-in-continuous-integration-testing-e33ca79078f4)
- [Angela Riggs](https://www.linkedin.com/in/angelariggs/detail/recent-activity/posts/) is a pioneer in the Visual Testing space and leader in cultivating a culture of quality for software teams.  Read about it [here](https://www.linkedin.com/pulse/visual-regression-testing-backstopjs-angela-riggs/) and [here](https://www.pnsqc.org/automated-visual-regression-testing-with-backstopjs/) and listen to her talk [here](https://www.linkedin.com/pulse/creating-culture-quality-angela-riggs/)
- Check out [Marc Dacanay's](https://www.linkedin.com/in/marcdacanay/detail/recent-activity/posts/) BackstopJS articles -- he has a great intro as well as some great in-depth tips.
- Here is a [cool project template for static sites](https://github.com/wlsf82/backstop-config) by Walmyr Filho [@wlsf82](https://github.com/wlsf82) https://twitter.com/walmyrlimaesilv
- Here is [an online course about visual regression testing with BackstopJS]([https://www.udemy.com/course/visual-regression-testing-with-backstopjs/](https://www.udemy.com/course/testes-de-regressao-visual-com-backstopjs/?referralCode=3751623DD59D061311E1)) by [Walmyr Filho](https://www.udemy.com/user/walmyr/)
- [A really good one on refactoring CSS with BackstopJS](https://hannes.kaeufler.net/posts/refactoring-css) by Hannes Käufler
- [A Simple grunt-backstopjs plugin](http://www.obqo.de/blog/2016/12/30/grunt-backstopjs/) - For the Grunt enthusiasts

## Credits

BackstopJS was created and is maintained by [Garris Shipon](https://www.linkedin.com/in/garrisshipon/) with help from [these amazing engieers](https://github.com/garris/BackstopJS/graphs/contributors).


🙇 Special thanks to these contributors...
- [Lewis Nyman](https://github.com/lewisnyman)
- [Stoutie](https://github.com/jehoshua02)
- [Klaus Bayrhammer](https://github.com/klausbayrhammer)
- [Evan Lovely](https://github.com/EvanLovely)
- [Benedikt Rötsch](https://github.com/axe312ger)
- [Suresh Kumar. M](https://github.com/nobso)
- [Shinji Yamada](https://github.com/dotneet)
- [@onigoetz](https://github.com/onigoetz)
- [uğur mirza zeyrek](mirzazeyrek)
- [anton-kulagin](https://github.com/anton-kulagin)
- [Leonid Makarov](https://github.com/lmakarov)
- [Gabriele Mantovani](https://github.com/mantovanig)
- [Walmyr Filho](https://github.com/wlsf82)
- [Torsten Krah](https://github.com/tkrah)
- [Joel Brown](https://github.com/FrostyShosty)
- [Dan Grebb](https://github.com/dgrebb)





================================================
FILE: assets/styles.css
================================================
html {
  background:#faebd7 url('./duskBg1.png') no-repeat center center fixed;
  background-size: cover;
}
body {
  font-family: 'Encode Sans', sans-serif;
  color: #444;
  background-color: transparent;
}
a:hover {
  background-color: rgba(150, 200, 255, .5);
  text-decoration: none;
  color: #faebd7;
}
.github-link {
  display: inline-block;
  border-radius: 25px;
}
.lemur-link:hover, .logo-link:hover {
  background-color: transparent;
}
.page-root {
  max-width: 1000px;
}
.moneyshot {
  padding: 3rem 0;
  text-align: center;
}
.mascotBlock {
  perspective: 1000px;
  margin-bottom: -0.4rem;
}
.logoBlock {
  perspective: 1000px;
  margin-bottom: .5rem;
}
.lemurInYourFace:hover {
  transform: translateZ(100px);
}
.hideLemur .lemurInYourFace {
  opacity: 0;
  visibility: hidden;
  transform: translateZ(200px);
}
.hideLemur .lemurInYourFace {
  opacity: 0;
  visibility: hidden;
  transform: translateZ(200px);
}
.hideOctocat .github-icon {
  visibility: hidden;
}
.lemurInYourFace {
  transition: transform 750ms ease, opacity 750ms ease, visibility 800ms ease;
  width: 50%;
  /*min-width: 270px;*/
  z-index: 1;
  position: relative;
}
.hideLemur #lemurButt {
  opacity: 1;
}
#lemurButt {
  position: absolute;
  left: calc(50% - 40px);
  bottom: 10px;
  opacity: 0;
  width: 20%;
  max-width: 100px;
}
.github-icon {
  width: 50px;
}
.cta {
  display: block;
}
.BackstopJS3:hover {
  transform: translateZ(50px);
}
.BackstopJS3 {
  transition: transform 750ms ease;
  width: 60%;
  /*min-width: 270px;*/
}
.getItBlock, .supportsBlock {
  padding: 3rem 0;
  text-align: center;
  font-weight: 200;
}
.casper {
  color: #BD10E0;
}
.chrome {
  color: #9013FE;
}

h1, p { font-size: 1em; color: #666; font-weight: 300}

/*Small devices (landscape phones, 576px and up)*/
@media screen and (min-width: 576px) {
  h1, p { font-size: 1.3rem; }
}

/*Medium devices (tablets, 768px and up)*/
@media screen and (min-width: 768px) {
  h1, p { font-size: 1.5rem; }
}

/*Large devices (desktops, 992px and up)*/
@media (min-width: 992px) {
  h1, p { font-size: 1.8rem; }
}

/*Extra large devices (large desktops, 1200px and up)*/
@media (min-width: 1200px) {
  h1, p { font-size: 2.1rem; }
}


================================================
FILE: capture/backstopTools.js
================================================
'use strict';
module.exports = (target) => {
  return target.evaluate(() => {
    if (window._backstopTools) {
      return false;
    }

    window._backstopTools = {
      hasLogged: function (str) {
        return new RegExp(str).test(window._backstopTools._consoleLogger);
      },
      startConsoleLogger: function () {
        if (typeof window._backstopTools._consoleLogger !== 'string') {
          window._backstopTools._consoleLogger = '';
        }
        const log = window.console.log.bind(console);
        window.console.log = function () {
          window._backstopTools._consoleLogger += Array.from(arguments).join('\n');
          log.apply(this, arguments);
        };
      },
      /**
       * Take an array of selector names and return and array of *all* matching selectors.
       * For each selector name, If more than 1 selector is matched, proceeding matches are
       * tagged with an additional `__n` class.
       *
       * @return {[string]} [array of expanded selectors]
       * @param selectors
       */
      expandSelectors: function (selectors) {
        if (!Array.isArray(selectors)) {
          selectors = selectors.split(',');
        }
        return selectors.reduce(function (acc, selector) {
          if (selector === 'body' || selector === 'viewport') {
            return acc.concat([selector]);
          }
          if (selector === 'document') {
            return acc.concat(['document']);
          }
          const qResult = document.querySelectorAll(selector);

          // pass-through any selectors that don't match any DOM elements
          if (!qResult.length) {
            return acc.concat(selector);
          }

          const expandedSelector = [].slice.call(qResult)
            .map(function (element, expandedIndex) {
              if (element.classList.contains('__86d')) {
                return '';
              }
              if (!expandedIndex) {
                // only first element is used for screenshots -- even if multiple instances exist.
                // therefore index 0 does not need extended qualification.
                return selector;
              }
              // create index partial
              const indexPartial = '__n' + expandedIndex;
              // update all matching selectors with additional indexPartial class
              element.classList.add(indexPartial);
              // return array of fully-qualified classnames
              return selector + '.' + indexPartial;
            });
          // concat arrays of fully-qualified classnames
          return acc.concat(expandedSelector);
        }, []).filter(function (selector) {
          return selector !== '';
        });
      },
      /**
       * is the selector element visible?
       * @param  {[type]}  selector [a css selector str]
       * @return {Boolean}          [is it visible? true or false]
       */
      isVisible: function (selector) {
        if (selector === 'body' || selector === 'document' || selector === 'viewport') {
          return true;
        } else if (window._backstopTools.exists(selector)) {
          const element = document.querySelector(selector);
          const style = window.getComputedStyle(element);
          return (style.display !== 'none' && style.visibility !== 'hidden' && style.opacity !== '0');
        }
        return false;
      },
      /**
       * does the selector element exist?
       * @param  {[type]} selector [a css selector str]
       * @return {[type]}          [returns count of found matches -- 0 for no matches]
       */
      exists: function (selector) {
        if (selector === 'body' || selector === 'document' || selector === 'viewport') {
          return 1;
        }
        return document.querySelectorAll(selector).length;
      }
    };

    window._backstopTools.startConsoleLogger();
    console.info('BackstopTools have been installed.');
    return true;
  });
};


================================================
FILE: capture/config.default.json
================================================
{
  "id": "backstop_default",
  "viewports": [
    {
      "label": "phone",
      "width": 320,
      "height": 480
    },
    {
      "label": "tablet",
      "width": 1024,
      "height": 768
    }
  ],
  "onBeforeScript": "puppet/onBefore.js",
  "onReadyScript": "puppet/onReady.js",
  "scenarios": [
    {
      "label": "BackstopJS Homepage",
      "cookiePath": "backstop_data/engine_scripts/cookies.json",
      "url": "https://garris.github.io/BackstopJS/",
      "referenceUrl": "",
      "readyEvent": "",
      "readySelector": "",
      "delay": 0,
      "hideSelectors": [],
      "removeSelectors": [],
      "hoverSelector": "",
      "clickSelector": "",
      "postInteractionWait": 0,
      "selectors": [],
      "selectorExpansion": true,
      "expect": 0,
      "misMatchThreshold" : 0.1,
      "requireSameDimensions": true
    }
  ],
  "paths": {
    "bitmaps_reference": "backstop_data/bitmaps_reference",
    "bitmaps_test": "backstop_data/bitmaps_test",
    "engine_scripts": "backstop_data/engine_scripts",
    "html_report": "backstop_data/html_report",
    "ci_report": "backstop_data/ci_report"
  },
  "report": ["browser"],
  "engine": "puppeteer",
  "engineOptions": {
    "args": ["--no-sandbox"]
  },
  "asyncCaptureLimit": 5,
  "asyncCompareLimit": 50,
  "debug": false,
  "debugWindow": false
}


================================================
FILE: capture/engine_scripts/cookies.json
================================================
[
  {
    "domain": ".www.yourdomain.com",
    "path": "/",
    "name": "yourCookieName",
    "value": "yourCookieValue",
    "expirationDate": 1798790400,
    "hostOnly": false,
    "httpOnly": false,
    "secure": false,
    "session": false,
    "sameSite": "Lax"
  }
]


================================================
FILE: capture/engine_scripts/playwright/clickAndHoverHelper.js
================================================
module.exports = async (page, scenario) => {
  const hoverSelector = scenario.hoverSelectors || scenario.hoverSelector;
  const clickSelector = scenario.clickSelectors || scenario.clickSelector;
  const keyPressSelector = scenario.keyPressSelectors || scenario.keyPressSelector;
  const scrollToSelector = scenario.scrollToSelector;
  const postInteractionWait = scenario.postInteractionWait; // selector [str] | ms [int]

  if (keyPressSelector) {
    for (const keyPressSelectorItem of [].concat(keyPressSelector)) {
      await page.waitForSelector(keyPressSelectorItem.selector);
      await page.type(keyPressSelectorItem.selector, keyPressSelectorItem.keyPress);
    }
  }

  if (hoverSelector) {
    for (const hoverSelectorIndex of [].concat(hoverSelector)) {
      await page.waitForSelector(hoverSelectorIndex);
      await page.hover(hoverSelectorIndex);
    }
  }

  if (clickSelector) {
    for (const clickSelectorIndex of [].concat(clickSelector)) {
      await page.waitForSelector(clickSelectorIndex);
      await page.click(clickSelectorIndex);
    }
  }

  if (postInteractionWait) {
    if (parseInt(postInteractionWait) > 0) {
      await page.waitForTimeout(postInteractionWait);
    } else {
      await page.waitForSelector(postInteractionWait);
    }
  }

  if (scrollToSelector) {
    await page.waitForSelector(scrollToSelector);
    await page.evaluate(scrollToSelector => {
      document.querySelector(scrollToSelector).scrollIntoView();
    }, scrollToSelector);
  }
};


================================================
FILE: capture/engine_scripts/playwright/interceptImages.js
================================================
/**
 * INTERCEPT IMAGES
 * Listen to all requests. If a request matches IMAGE_URL_RE
 * then stub the image with data from IMAGE_STUB_URL
 *
 * Use this in an onBefore script E.G.
  ```
  module.exports = async function(page, scenario) {
    require('./interceptImages')(page, scenario);
  }
  ```
 *
 */

const fs = require('fs');
const path = require('path');

const IMAGE_URL_RE = /\.gif|\.jpg|\.png/i;
const IMAGE_STUB_URL = path.resolve(__dirname, '../../imageStub.jpg');
const IMAGE_DATA_BUFFER = fs.readFileSync(IMAGE_STUB_URL);
const HEADERS_STUB = {};

module.exports = async function (page, scenario) {
  page.route(IMAGE_URL_RE, route => {
    route.fulfill({
      body: IMAGE_DATA_BUFFER,
      headers: HEADERS_STUB,
      status: 200
    });
  });
};


================================================
FILE: capture/engine_scripts/playwright/loadCookies.js
================================================
const fs = require('fs');

module.exports = async (browserContext, scenario) => {
  let cookies = [];
  const cookiePath = scenario.cookiePath;

  // Read Cookies from File, if exists
  if (fs.existsSync(cookiePath)) {
    cookies = JSON.parse(fs.readFileSync(cookiePath));
  }

  // Add cookies to browser
  browserContext.addCookies(cookies);

  console.log('Cookie state restored with:', JSON.stringify(cookies, null, 2));
};


================================================
FILE: capture/engine_scripts/playwright/onBefore.js
================================================
module.exports = async (page, scenario, viewport, isReference, browserContext) => {
  await require('./loadCookies')(browserContext, scenario);
};


================================================
FILE: capture/engine_scripts/playwright/onReady.js
================================================
module.exports = async (page, scenario, viewport, isReference, browserContext) => {
  console.log('SCENARIO > ' + scenario.label);
  await require('./clickAndHoverHelper')(page, scenario);

  // add more ready handlers here...
};


================================================
FILE: capture/engine_scripts/playwright/overrideCSS.js
================================================
/**
 * OVERRIDE CSS
 * Apply this CSS to the loaded page, as a way to override styles.
 *
 * Use this in an onReady script E.G.
  ```
  module.exports = async function(page, scenario) {
    await require('./overrideCSS')(page, scenario);
  }
  ```
 *
 */

const BACKSTOP_TEST_CSS_OVERRIDE = `
  html {
    background-image: none;
  }
`;

module.exports = async (page, scenario) => {
  // inject arbitrary css to override styles
  await page.addStyleTag({
    content: BACKSTOP_TEST_CSS_OVERRIDE
  });

  console.log('BACKSTOP_TEST_CSS_OVERRIDE injected for: ' + scenario.label);
};


================================================
FILE: capture/engine_scripts/puppet/clickAndHoverHelper.js
================================================
module.exports = async (page, scenario) => {
  const hoverSelector = scenario.hoverSelectors || scenario.hoverSelector;
  const clickSelector = scenario.clickSelectors || scenario.clickSelector;
  const keyPressSelector = scenario.keyPressSelectors || scenario.keyPressSelector;
  const scrollToSelector = scenario.scrollToSelector;
  const postInteractionWait = scenario.postInteractionWait; // selector [str] | ms [int]

  if (keyPressSelector) {
    for (const keyPressSelectorItem of [].concat(keyPressSelector)) {
      await page.waitForSelector(keyPressSelectorItem.selector);
      await page.type(keyPressSelectorItem.selector, keyPressSelectorItem.keyPress);
    }
  }

  if (hoverSelector) {
    for (const hoverSelectorIndex of [].concat(hoverSelector)) {
      await page.waitForSelector(hoverSelectorIndex);
      await page.hover(hoverSelectorIndex);
    }
  }

  if (clickSelector) {
    for (const clickSelectorIndex of [].concat(clickSelector)) {
      await page.waitForSelector(clickSelectorIndex);
      await page.click(clickSelectorIndex);
    }
  }

  if (postInteractionWait) {
    await new Promise(resolve => {
      setTimeout(resolve, postInteractionWait);
    });
  }

  if (scrollToSelector) {
    await page.waitForSelector(scrollToSelector);
    await page.evaluate(scrollToSelector => {
      document.querySelector(scrollToSelector).scrollIntoView();
    }, scrollToSelector);
  }
};


================================================
FILE: capture/engine_scripts/puppet/ignoreCSP.js
================================================
/**
 * IGNORE CSP HEADERS
 * Listen to all requests. If a request matches scenario.url
 * then fetch the request again manually, strip out CSP headers
 * and respond to the original request without CSP headers.
 * Allows `ignoreHTTPSErrors: true` BUT... requires `debugWindow: true`
 *
 * see https://github.com/GoogleChrome/puppeteer/issues/1229#issuecomment-380133332
 * this is the workaround until Page.setBypassCSP lands... https://github.com/GoogleChrome/puppeteer/pull/2324
 *
 * @param      {REQUEST}  request
 * @return     {VOID}
 *
 * Use this in an onBefore script E.G.
  ```
  module.exports = async function(page, scenario) {
    require('./removeCSP')(page, scenario);
  }
  ```
 *
 */

const fetch = require('node-fetch');
const https = require('https');
const agent = new https.Agent({
  rejectUnauthorized: false
});

module.exports = async function (page, scenario) {
  const intercept = async (request, targetUrl) => {
    const requestUrl = request.url();

    // FIND TARGET URL REQUEST
    if (requestUrl === targetUrl) {
      const cookiesList = await page.cookies(requestUrl);
      const cookies = cookiesList.map(cookie => `${cookie.name}=${cookie.value}`).join('; ');
      const headers = Object.assign(request.headers(), { cookie: cookies });
      const options = {
        headers,
        body: request.postData(),
        method: request.method(),
        follow: 20,
        agent
      };

      const result = await fetch(requestUrl, options);

      const buffer = await result.buffer();
      const cleanedHeaders = result.headers._headers || {};
      cleanedHeaders['content-security-policy'] = '';
      await request.respond({
        body: buffer,
        headers: cleanedHeaders,
        status: result.status
      });
    } else {
      request.continue();
    }
  };

  await page.setRequestInterception(true);
  page.on('request', req => {
    intercept(req, scenario.url);
  });
};


================================================
FILE: capture/engine_scripts/puppet/interceptImages.js
================================================
/**
 * INTERCEPT IMAGES
 * Listen to all requests. If a request matches IMAGE_URL_RE
 * then stub the image with data from IMAGE_STUB_URL
 *
 * Use this in an onBefore script E.G.
  ```
  module.exports = async function(page, scenario) {
    require('./interceptImages')(page, scenario);
  }
  ```
 *
 */

const fs = require('fs');
const path = require('path');

const IMAGE_URL_RE = /\.gif|\.jpg|\.png/i;
const IMAGE_STUB_URL = path.resolve(__dirname, '../imageStub.jpg');
const IMAGE_DATA_BUFFER = fs.readFileSync(IMAGE_STUB_URL);
const HEADERS_STUB = {};

module.exports = async function (page, scenario) {
  const intercept = async (request, targetUrl) => {
    if (IMAGE_URL_RE.test(request.url())) {
      await request.respond({
        body: IMAGE_DATA_BUFFER,
        headers: HEADERS_STUB,
        status: 200
      });
    } else {
      request.continue();
    }
  };
  await page.setRequestInterception(true);
  page.on('request', intercept);
};


================================================
FILE: capture/engine_scripts/puppet/loadCookies.js
================================================
const fs = require('fs');

module.exports = async (page, scenario) => {
  let cookies = [];
  const cookiePath = scenario.cookiePath;

  // READ COOKIES FROM FILE IF EXISTS
  if (fs.existsSync(cookiePath)) {
    cookies = JSON.parse(fs.readFileSync(cookiePath));
  }

  // MUNGE COOKIE DOMAIN
  cookies = cookies.map(cookie => {
    if (cookie.domain.startsWith('http://') || cookie.domain.startsWith('https://')) {
      cookie.url = cookie.domain;
    } else {
      cookie.url = 'https://' + cookie.domain;
    }
    delete cookie.domain;
    return cookie;
  });

  // SET COOKIES
  const setCookies = async () => {
    return Promise.all(
      cookies.map(async (cookie) => {
        await page.setCookie(cookie);
      })
    );
  };
  await setCookies();
  console.log('Cookie state restored with:', JSON.stringify(cookies, null, 2));
};


================================================
FILE: capture/engine_scripts/puppet/onBefore.js
================================================
module.exports = async (page, scenario, vp) => {
  await require('./loadCookies')(page, scenario);
};


================================================
FILE: capture/engine_scripts/puppet/onReady.js
================================================
module.exports = async (page, scenario, vp) => {
  console.log('SCENARIO > ' + scenario.label);
  await require('./clickAndHoverHelper')(page, scenario);

  // add more ready handlers here...
};


================================================
FILE: capture/engine_scripts/puppet/overrideCSS.js
================================================
const BACKSTOP_TEST_CSS_OVERRIDE = 'html {background-image: none;}';

module.exports = async (page, scenario) => {
  // inject arbitrary css to override styles
  await page.evaluate(`window._styleData = '${BACKSTOP_TEST_CSS_OVERRIDE}'`);
  await page.evaluate(() => {
    const style = document.createElement('style');
    style.type = 'text/css';
    const styleNode = document.createTextNode(window._styleData);
    style.appendChild(styleNode);
    document.head.appendChild(style);
  });

  console.log('BACKSTOP_TEST_CSS_OVERRIDE injected for: ' + scenario.label);
};


================================================
FILE: changelog.md
================================================

# Change Log

 
## [6.0.4] - 2021-12-10
### Added

### Changed
- Bump puppeteer to v12 (#1381)
- Travis remove node 10, 12 test runs

### Fixed 



 
## [6.0.1] - 2021-11-17
### Added
- PLAYRIGHT ENGINE OPTION  thank you JB

### Changed
- support for viewport variants with dynamic scenario mode to browser and json report (#1376)  thank you TW

### Fixed 
- Fixed Puppeteer ENOENT Error When Image Stubbing (#1377)



 
## [5.4.3] - 2021-08-24
### Added
- added archive report feature (#1353)
  - requested a housekeeping followup PR
  - documentaiton will be commented until 2nd PR is submitted.


### Changed
- More code formatting and some test cleanups
- updated readme

### Fixed 



 
## [5.4.1] - 2021-08-24
### Added
- Feature: archive report (#1353)  @klodoma



### Changed
- Added no-cache tags to client markup (#1357)
- code formatting, addressed lint warnings

### Fixed 




## [5.3.6] - 2021-07-29

### Added


### Changed


### Fixed
- https://github.com/garris/BackstopJS/issues/1344
  Fixed rendering issue found in Backstop (docker) versions > 4.4.2.
 

## [5.3.7] - 2021-07-29
### Added
- Changelog

### Changed


### Fixed 


## [5.3.6] - 2021-07-29

### Added


### Changed


### Fixed
- https://github.com/garris/BackstopJS/issues/1344
  Fixed rendering issue found in Backstop (docker) versions > 4.4.2.
 

 
## [5.3.5] - 2021-07-20

### Added
- New Config feature `readyEventTimeout`
- New Config feature `usePreciseMatching`


### Changed
- Bumped Node version in docker config


### Fixed



================================================
FILE: cli/index.js
================================================
#!/usr/bin/env node

const parseArgs = require('minimist');
const usage = require('./usage');
const version = require('../package.json').version;
const runner = require('../core/runner');

main();

function main () {
  const argsOptions = parseArgs(process.argv.slice(2), {
    boolean: ['h', 'help', 'v', 'version', 'i', 'docker'],
    string: ['config'],
    default: {
      config: 'backstop.json'
    }
  });

  // Catch errors from failing promises
  process.on('unhandledRejection', function (error) {
    console.error(error && error.stack);
  });

  if (argsOptions.h || argsOptions.help) {
    console.log(usage);
    return;
  }

  if (argsOptions.v || argsOptions.version) {
    console.log('BackstopJS v' + version);
    return;
  }

  const commandName = argsOptions._[0];

  if (!commandName) {
    console.log(usage);
  } else {
    console.log('BackstopJS v' + version);
    runner(commandName, argsOptions).catch(function () {
      process.exitCode = 1;
    });

    process.on('uncaughtException', function (err) {
      console.log('Uncaught exception:', err.message, err.stack);
      throw err;
    });
  }
}


================================================
FILE: cli/usage.js
================================================
const version = require('../package.json').version;
const makeSpaces = require('../core/util/makeSpaces');

const commandsDescription = {
  test: 'Create test screenshots and compare against the set you previously approved/referenced.',
  approve: 'Promotes all test bitmaps from last test run to reference bitmaps.',
  reference: 'Creates new reference screenshots. Deletes all existing reference files.',
  init: 'Generate BackstopJS boilerplate files in your CWD. NOTE: Overwrites existing config files!',
  remote: 'Launch BackstopJS remote service.',
  openReport: 'View the last test report in your browser.'
};

const optionsDescription = {
  '--config': 'Path to config file name',
  '--filter': 'A RegEx string used to filter by scenario labels when running "test", "reference", or "approve" commands',
  '-h, --help': 'Display usage',
  '-v, --version': 'Display version',
  '-i': 'Prevent deletion of non-matching reference files when running "reference" command (newer matching reference files are still overwritten)'
};

function makeDescription (descriptions) {
  return Object.keys(descriptions)
    .map(function (commandName) {
      return makeSpaces(4) + commandName + spacesBetweenCommandAndDescription(commandName) + descriptions[commandName];
    })
    .join('\n');
}

// Number of spaces to echo before writing description
const leftPaddingOfDescription = Object.keys(commandsDescription)
  .concat(Object.keys(optionsDescription))
  .map(function (string) {
    return string.length;
  })
  .reduce(function maxReducer (max, length) {
    return Math.max(max, length);
  }, 0);

function spacesBetweenCommandAndDescription (commandName) {
  return makeSpaces(2 + leftPaddingOfDescription - commandName.length);
}

const usage = '\
Welcome to BackstopJS ' + version + ' CLI\n\
\n\
Commands:\n\
' + makeDescription(commandsDescription) + '\n\
\n\
Options:\n\
' + makeDescription(optionsDescription) + '\n\
\n';

module.exports = usage;


================================================
FILE: compare/README.md
================================================
HTML report resource bundle
====

This directory contains the source files for the BackstopJS report UI.

To build the React project run...

```
npm run build-compare
``` 

This will generate `/compare/output/index_bundle.js`.

`/compare/output/index_bundle.js` contains all styles and js for the HTML report.  In normal BackstopJS operation this file bundle will be copied into the correct HTML report directory during a test flow (e.g. when running `backstop test`) after bitmap generation has completed.  See: `/core/command/report.js` writeBrowserReport() method for details on this mechanism.

Note: The files `diverged.js` & `diff.js` are copied from `node_modules` to `/compare/output/` during build.


================================================
FILE: compare/output/diff.js
================================================
/*!

 diff v3.5.0

Software License Agreement (BSD License)

Copyright (c) 2009-2015, Kevin Decker <kpdecker@gmail.com>

All rights reserved.

Redistribution and use of this software in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:

* Redistributions of source code must retain the above
  copyright notice, this list of conditions and the
  following disclaimer.

* Redistributions in binary form must reproduce the above
  copyright notice, this list of conditions and the
  following disclaimer in the documentation and/or other
  materials provided with the distribution.

* Neither the name of Kevin Decker nor the names of its
  contributors may be used to endorse or promote products
  derived from this software without specific prior
  written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
@license
*/
(function webpackUniversalModuleDefinition(root, factory) {
	if(typeof exports === 'object' && typeof module === 'object')
		module.exports = factory();
	else if(typeof define === 'function' && define.amd)
		define([], factory);
	else if(typeof exports === 'object')
		exports["JsDiff"] = factory();
	else
		root["JsDiff"] = factory();
})(this, function() {
return /******/ (function(modules) { // webpackBootstrap
/******/ 	// The module cache
/******/ 	var installedModules = {};

/******/ 	// The require function
/******/ 	function __webpack_require__(moduleId) {

/******/ 		// Check if module is in cache
/******/ 		if(installedModules[moduleId])
/******/ 			return installedModules[moduleId].exports;

/******/ 		// Create a new module (and put it into the cache)
/******/ 		var module = installedModules[moduleId] = {
/******/ 			exports: {},
/******/ 			id: moduleId,
/******/ 			loaded: false
/******/ 		};

/******/ 		// Execute the module function
/******/ 		modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);

/******/ 		// Flag the module as loaded
/******/ 		module.loaded = true;

/******/ 		// Return the exports of the module
/******/ 		return module.exports;
/******/ 	}


/******/ 	// expose the modules object (__webpack_modules__)
/******/ 	__webpack_require__.m = modules;

/******/ 	// expose the module cache
/******/ 	__webpack_require__.c = installedModules;

/******/ 	// __webpack_public_path__
/******/ 	__webpack_require__.p = "";

/******/ 	// Load entry module and return exports
/******/ 	return __webpack_require__(0);
/******/ })
/************************************************************************/
/******/ ([
/* 0 */
/***/ (function(module, exports, __webpack_require__) {

	/*istanbul ignore start*/'use strict';

	exports.__esModule = true;
	exports.canonicalize = exports.convertChangesToXML = exports.convertChangesToDMP = exports.merge = exports.parsePatch = exports.applyPatches = exports.applyPatch = exports.createPatch = exports.createTwoFilesPatch = exports.structuredPatch = exports.diffArrays = exports.diffJson = exports.diffCss = exports.diffSentences = exports.diffTrimmedLines = exports.diffLines = exports.diffWordsWithSpace = exports.diffWords = exports.diffChars = exports.Diff = undefined;

	/*istanbul ignore end*/var /*istanbul ignore start*/_base = __webpack_require__(1) /*istanbul ignore end*/;

	/*istanbul ignore start*/var _base2 = _interopRequireDefault(_base);

	/*istanbul ignore end*/var /*istanbul ignore start*/_character = __webpack_require__(2) /*istanbul ignore end*/;

	var /*istanbul ignore start*/_word = __webpack_require__(3) /*istanbul ignore end*/;

	var /*istanbul ignore start*/_line = __webpack_require__(5) /*istanbul ignore end*/;

	var /*istanbul ignore start*/_sentence = __webpack_require__(6) /*istanbul ignore end*/;

	var /*istanbul ignore start*/_css = __webpack_require__(7) /*istanbul ignore end*/;

	var /*istanbul ignore start*/_json = __webpack_require__(8) /*istanbul ignore end*/;

	var /*istanbul ignore start*/_array = __webpack_require__(9) /*istanbul ignore end*/;

	var /*istanbul ignore start*/_apply = __webpack_require__(10) /*istanbul ignore end*/;

	var /*istanbul ignore start*/_parse = __webpack_require__(11) /*istanbul ignore end*/;

	var /*istanbul ignore start*/_merge = __webpack_require__(13) /*istanbul ignore end*/;

	var /*istanbul ignore start*/_create = __webpack_require__(14) /*istanbul ignore end*/;

	var /*istanbul ignore start*/_dmp = __webpack_require__(16) /*istanbul ignore end*/;

	var /*istanbul ignore start*/_xml = __webpack_require__(17) /*istanbul ignore end*/;

	/*istanbul ignore start*/function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }

	/* See LICENSE file for terms of use */

	/*
	 * Text diff implementation.
	 *
	 * This library supports the following APIS:
	 * JsDiff.diffChars: Character by character diff
	 * JsDiff.diffWords: Word (as defined by \b regex) diff which ignores whitespace
	 * JsDiff.diffLines: Line based diff
	 *
	 * JsDiff.diffCss: Diff targeted at CSS content
	 *
	 * These methods are based on the implementation proposed in
	 * "An O(ND) Difference Algorithm and its Variations" (Myers, 1986).
	 * http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.4.6927
	 */
	exports. /*istanbul ignore end*/Diff = _base2['default'];
	/*istanbul ignore start*/exports. /*istanbul ignore end*/diffChars = _character.diffChars;
	/*istanbul ignore start*/exports. /*istanbul ignore end*/diffWords = _word.diffWords;
	/*istanbul ignore start*/exports. /*istanbul ignore end*/diffWordsWithSpace = _word.diffWordsWithSpace;
	/*istanbul ignore start*/exports. /*istanbul ignore end*/diffLines = _line.diffLines;
	/*istanbul ignore start*/exports. /*istanbul ignore end*/diffTrimmedLines = _line.diffTrimmedLines;
	/*istanbul ignore start*/exports. /*istanbul ignore end*/diffSentences = _sentence.diffSentences;
	/*istanbul ignore start*/exports. /*istanbul ignore end*/diffCss = _css.diffCss;
	/*istanbul ignore start*/exports. /*istanbul ignore end*/diffJson = _json.diffJson;
	/*istanbul ignore start*/exports. /*istanbul ignore end*/diffArrays = _array.diffArrays;
	/*istanbul ignore start*/exports. /*istanbul ignore end*/structuredPatch = _create.structuredPatch;
	/*istanbul ignore start*/exports. /*istanbul ignore end*/createTwoFilesPatch = _create.createTwoFilesPatch;
	/*istanbul ignore start*/exports. /*istanbul ignore end*/createPatch = _create.createPatch;
	/*istanbul ignore start*/exports. /*istanbul ignore end*/applyPatch = _apply.applyPatch;
	/*istanbul ignore start*/exports. /*istanbul ignore end*/applyPatches = _apply.applyPatches;
	/*istanbul ignore start*/exports. /*istanbul ignore end*/parsePatch = _parse.parsePatch;
	/*istanbul ignore start*/exports. /*istanbul ignore end*/merge = _merge.merge;
	/*istanbul ignore start*/exports. /*istanbul ignore end*/convertChangesToDMP = _dmp.convertChangesToDMP;
	/*istanbul ignore start*/exports. /*istanbul ignore end*/convertChangesToXML = _xml.convertChangesToXML;
	/*istanbul ignore start*/exports. /*istanbul ignore end*/canonicalize = _json.canonicalize;
	//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9pbmRleC5qcyJdLCJuYW1lcyI6WyJEaWZmIiwiZGlmZkNoYXJzIiwiZGlmZldvcmRzIiwiZGlmZldvcmRzV2l0aFNwYWNlIiwiZGlmZkxpbmVzIiwiZGlmZlRyaW1tZWRMaW5lcyIsImRpZmZTZW50ZW5jZXMiLCJkaWZmQ3NzIiwiZGlmZkpzb24iLCJkaWZmQXJyYXlzIiwic3RydWN0dXJlZFBhdGNoIiwiY3JlYXRlVHdvRmlsZXNQYXRjaCIsImNyZWF0ZVBhdGNoIiwiYXBwbHlQYXRjaCIsImFwcGx5UGF0Y2hlcyIsInBhcnNlUGF0Y2giLCJtZXJnZSIsImNvbnZlcnRDaGFuZ2VzVG9ETVAiLCJjb252ZXJ0Q2hhbmdlc1RvWE1MIiwiY2Fub25pY2FsaXplIl0sIm1hcHBpbmdzIjoiOzs7Ozt1QkFnQkE7Ozs7dUJBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUE7O0FBQ0E7O0FBRUE7O0FBRUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUE7O0FBQ0E7Ozs7QUFqQ0E7O0FBRUE7Ozs7Ozs7Ozs7Ozs7O2dDQWtDRUEsSTt5REFFQUMsUzt5REFDQUMsUzt5REFDQUMsa0I7eURBQ0FDLFM7eURBQ0FDLGdCO3lEQUNBQyxhO3lEQUVBQyxPO3lEQUNBQyxRO3lEQUVBQyxVO3lEQUVBQyxlO3lEQUNBQyxtQjt5REFDQUMsVzt5REFDQUMsVTt5REFDQUMsWTt5REFDQUMsVTt5REFDQUMsSzt5REFDQUMsbUI7eURBQ0FDLG1CO3lEQUNBQyxZIiwiZmlsZSI6ImluZGV4LmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyogU2VlIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMgb2YgdXNlICovXG5cbi8qXG4gKiBUZXh0IGRpZmYgaW1wbGVtZW50YXRpb24uXG4gKlxuICogVGhpcyBsaWJyYXJ5IHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgQVBJUzpcbiAqIEpzRGlmZi5kaWZmQ2hhcnM6IENoYXJhY3RlciBieSBjaGFyYWN0ZXIgZGlmZlxuICogSnNEaWZmLmRpZmZXb3JkczogV29yZCAoYXMgZGVmaW5lZCBieSBcXGIgcmVnZXgpIGRpZmYgd2hpY2ggaWdub3JlcyB3aGl0ZXNwYWNlXG4gKiBKc0RpZmYuZGlmZkxpbmVzOiBMaW5lIGJhc2VkIGRpZmZcbiAqXG4gKiBKc0RpZmYuZGlmZkNzczogRGlmZiB0YXJnZXRlZCBhdCBDU1MgY29udGVudFxuICpcbiAqIFRoZXNlIG1ldGhvZHMgYXJlIGJhc2VkIG9uIHRoZSBpbXBsZW1lbnRhdGlvbiBwcm9wb3NlZCBpblxuICogXCJBbiBPKE5EKSBEaWZmZXJlbmNlIEFsZ29yaXRobSBhbmQgaXRzIFZhcmlhdGlvbnNcIiAoTXllcnMsIDE5ODYpLlxuICogaHR0cDovL2NpdGVzZWVyeC5pc3QucHN1LmVkdS92aWV3ZG9jL3N1bW1hcnk/ZG9pPTEwLjEuMS40LjY5MjdcbiAqL1xuaW1wb3J0IERpZmYgZnJvbSAnLi9kaWZmL2Jhc2UnO1xuaW1wb3J0IHtkaWZmQ2hhcnN9IGZyb20gJy4vZGlmZi9jaGFyYWN0ZXInO1xuaW1wb3J0IHtkaWZmV29yZHMsIGRpZmZXb3Jkc1dpdGhTcGFjZX0gZnJvbSAnLi9kaWZmL3dvcmQnO1xuaW1wb3J0IHtkaWZmTGluZXMsIGRpZmZUcmltbWVkTGluZXN9IGZyb20gJy4vZGlmZi9saW5lJztcbmltcG9ydCB7ZGlmZlNlbnRlbmNlc30gZnJvbSAnLi9kaWZmL3NlbnRlbmNlJztcblxuaW1wb3J0IHtkaWZmQ3NzfSBmcm9tICcuL2RpZmYvY3NzJztcbmltcG9ydCB7ZGlmZkpzb24sIGNhbm9uaWNhbGl6ZX0gZnJvbSAnLi9kaWZmL2pzb24nO1xuXG5pbXBvcnQge2RpZmZBcnJheXN9IGZyb20gJy4vZGlmZi9hcnJheSc7XG5cbmltcG9ydCB7YXBwbHlQYXRjaCwgYXBwbHlQYXRjaGVzfSBmcm9tICcuL3BhdGNoL2FwcGx5JztcbmltcG9ydCB7cGFyc2VQYXRjaH0gZnJvbSAnLi9wYXRjaC9wYXJzZSc7XG5pbXBvcnQge21lcmdlfSBmcm9tICcuL3BhdGNoL21lcmdlJztcbmltcG9ydCB7c3RydWN0dXJlZFBhdGNoLCBjcmVhdGVUd29GaWxlc1BhdGNoLCBjcmVhdGVQYXRjaH0gZnJvbSAnLi9wYXRjaC9jcmVhdGUnO1xuXG5pbXBvcnQge2NvbnZlcnRDaGFuZ2VzVG9ETVB9IGZyb20gJy4vY29udmVydC9kbXAnO1xuaW1wb3J0IHtjb252ZXJ0Q2hhbmdlc1RvWE1MfSBmcm9tICcuL2NvbnZlcnQveG1sJztcblxuZXhwb3J0IHtcbiAgRGlmZixcblxuICBkaWZmQ2hhcnMsXG4gIGRpZmZXb3JkcyxcbiAgZGlmZldvcmRzV2l0aFNwYWNlLFxuICBkaWZmTGluZXMsXG4gIGRpZmZUcmltbWVkTGluZXMsXG4gIGRpZmZTZW50ZW5jZXMsXG5cbiAgZGlmZkNzcyxcbiAgZGlmZkpzb24sXG5cbiAgZGlmZkFycmF5cyxcblxuICBzdHJ1Y3R1cmVkUGF0Y2gsXG4gIGNyZWF0ZVR3b0ZpbGVzUGF0Y2gsXG4gIGNyZWF0ZVBhdGNoLFxuICBhcHBseVBhdGNoLFxuICBhcHBseVBhdGNoZXMsXG4gIHBhcnNlUGF0Y2gsXG4gIG1lcmdlLFxuICBjb252ZXJ0Q2hhbmdlc1RvRE1QLFxuICBjb252ZXJ0Q2hhbmdlc1RvWE1MLFxuICBjYW5vbmljYWxpemVcbn07XG4iXX0=


/***/ }),
/* 1 */
/***/ (function(module, exports) {

	/*istanbul ignore start*/'use strict';

	exports.__esModule = true;
	exports['default'] = /*istanbul ignore end*/Diff;
	function Diff() {}

	Diff.prototype = {
	  /*istanbul ignore start*/ /*istanbul ignore end*/diff: function diff(oldString, newString) {
	    /*istanbul ignore start*/var /*istanbul ignore end*/options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};

	    var callback = options.callback;
	    if (typeof options === 'function') {
	      callback = options;
	      options = {};
	    }
	    this.options = options;

	    var self = this;

	    function done(value) {
	      if (callback) {
	        setTimeout(function () {
	          callback(undefined, value);
	        }, 0);
	        return true;
	      } else {
	        return value;
	      }
	    }

	    // Allow subclasses to massage the input prior to running
	    oldString = this.castInput(oldString);
	    newString = this.castInput(newString);

	    oldString = this.removeEmpty(this.tokenize(oldString));
	    newString = this.removeEmpty(this.tokenize(newString));

	    var newLen = newString.length,
	        oldLen = oldString.length;
	    var editLength = 1;
	    var maxEditLength = newLen + oldLen;
	    var bestPath = [{ newPos: -1, components: [] }];

	    // Seed editLength = 0, i.e. the content starts with the same values
	    var oldPos = this.extractCommon(bestPath[0], newString, oldString, 0);
	    if (bestPath[0].newPos + 1 >= newLen && oldPos + 1 >= oldLen) {
	      // Identity per the equality and tokenizer
	      return done([{ value: this.join(newString), count: newString.length }]);
	    }

	    // Main worker method. checks all permutations of a given edit length for acceptance.
	    function execEditLength() {
	      for (var diagonalPath = -1 * editLength; diagonalPath <= editLength; diagonalPath += 2) {
	        var basePath = /*istanbul ignore start*/void 0 /*istanbul ignore end*/;
	        var addPath = bestPath[diagonalPath - 1],
	            removePath = bestPath[diagonalPath + 1],
	            _oldPos = (removePath ? removePath.newPos : 0) - diagonalPath;
	        if (addPath) {
	          // No one else is going to attempt to use this value, clear it
	          bestPath[diagonalPath - 1] = undefined;
	        }

	        var canAdd = addPath && addPath.newPos + 1 < newLen,
	            canRemove = removePath && 0 <= _oldPos && _oldPos < oldLen;
	        if (!canAdd && !canRemove) {
	          // If this path is a terminal then prune
	          bestPath[diagonalPath] = undefined;
	          continue;
	        }

	        // Select the diagonal that we want to branch from. We select the prior
	        // path whose position in the new string is the farthest from the origin
	        // and does not pass the bounds of the diff graph
	        if (!canAdd || canRemove && addPath.newPos < removePath.newPos) {
	          basePath = clonePath(removePath);
	          self.pushComponent(basePath.components, undefined, true);
	        } else {
	          basePath = addPath; // No need to clone, we've pulled it from the list
	          basePath.newPos++;
	          self.pushComponent(basePath.components, true, undefined);
	        }

	        _oldPos = self.extractCommon(basePath, newString, oldString, diagonalPath);

	        // If we have hit the end of both strings, then we are done
	        if (basePath.newPos + 1 >= newLen && _oldPos + 1 >= oldLen) {
	          return done(buildValues(self, basePath.components, newString, oldString, self.useLongestToken));
	        } else {
	          // Otherwise track this path as a potential candidate and continue.
	          bestPath[diagonalPath] = basePath;
	        }
	      }

	      editLength++;
	    }

	    // Performs the length of edit iteration. Is a bit fugly as this has to support the
	    // sync and async mode which is never fun. Loops over execEditLength until a value
	    // is produced.
	    if (callback) {
	      (function exec() {
	        setTimeout(function () {
	          // This should not happen, but we want to be safe.
	          /* istanbul ignore next */
	          if (editLength > maxEditLength) {
	            return callback();
	          }

	          if (!execEditLength()) {
	            exec();
	          }
	        }, 0);
	      })();
	    } else {
	      while (editLength <= maxEditLength) {
	        var ret = execEditLength();
	        if (ret) {
	          return ret;
	        }
	      }
	    }
	  },
	  /*istanbul ignore start*/ /*istanbul ignore end*/pushComponent: function pushComponent(components, added, removed) {
	    var last = components[components.length - 1];
	    if (last && last.added === added && last.removed === removed) {
	      // We need to clone here as the component clone operation is just
	      // as shallow array clone
	      components[components.length - 1] = { count: last.count + 1, added: added, removed: removed };
	    } else {
	      components.push({ count: 1, added: added, removed: removed });
	    }
	  },
	  /*istanbul ignore start*/ /*istanbul ignore end*/extractCommon: function extractCommon(basePath, newString, oldString, diagonalPath) {
	    var newLen = newString.length,
	        oldLen = oldString.length,
	        newPos = basePath.newPos,
	        oldPos = newPos - diagonalPath,
	        commonCount = 0;
	    while (newPos + 1 < newLen && oldPos + 1 < oldLen && this.equals(newString[newPos + 1], oldString[oldPos + 1])) {
	      newPos++;
	      oldPos++;
	      commonCount++;
	    }

	    if (commonCount) {
	      basePath.components.push({ count: commonCount });
	    }

	    basePath.newPos = newPos;
	    return oldPos;
	  },
	  /*istanbul ignore start*/ /*istanbul ignore end*/equals: function equals(left, right) {
	    if (this.options.comparator) {
	      return this.options.comparator(left, right);
	    } else {
	      return left === right || this.options.ignoreCase && left.toLowerCase() === right.toLowerCase();
	    }
	  },
	  /*istanbul ignore start*/ /*istanbul ignore end*/removeEmpty: function removeEmpty(array) {
	    var ret = [];
	    for (var i = 0; i < array.length; i++) {
	      if (array[i]) {
	        ret.push(array[i]);
	      }
	    }
	    return ret;
	  },
	  /*istanbul ignore start*/ /*istanbul ignore end*/castInput: function castInput(value) {
	    return value;
	  },
	  /*istanbul ignore start*/ /*istanbul ignore end*/tokenize: function tokenize(value) {
	    return value.split('');
	  },
	  /*istanbul ignore start*/ /*istanbul ignore end*/join: function join(chars) {
	    return chars.join('');
	  }
	};

	function buildValues(diff, components, newString, oldString, useLongestToken) {
	  var componentPos = 0,
	      componentLen = components.length,
	      newPos = 0,
	      oldPos = 0;

	  for (; componentPos < componentLen; componentPos++) {
	    var component = components[componentPos];
	    if (!component.removed) {
	      if (!component.added && useLongestToken) {
	        var value = newString.slice(newPos, newPos + component.count);
	        value = value.map(function (value, i) {
	          var oldValue = oldString[oldPos + i];
	          return oldValue.length > value.length ? oldValue : value;
	        });

	        component.value = diff.join(value);
	      } else {
	        component.value = diff.join(newString.slice(newPos, newPos + component.count));
	      }
	      newPos += component.count;

	      // Common case
	      if (!component.added) {
	        oldPos += component.count;
	      }
	    } else {
	      component.value = diff.join(oldString.slice(oldPos, oldPos + component.count));
	      oldPos += component.count;

	      // Reverse add and remove so removes are output first to match common convention
	      // The diffing algorithm is tied to add then remove output and this is the simplest
	      // route to get the desired output with minimal overhead.
	      if (componentPos && components[componentPos - 1].added) {
	        var tmp = components[componentPos - 1];
	        components[componentPos - 1] = components[componentPos];
	        components[componentPos] = tmp;
	      }
	    }
	  }

	  // Special case handle for when one terminal is ignored (i.e. whitespace).
	  // For this case we merge the terminal into the prior string and drop the change.
	  // This is only available for string mode.
	  var lastComponent = components[componentLen - 1];
	  if (componentLen > 1 && typeof lastComponent.value === 'string' && (lastComponent.added || lastComponent.removed) && diff.equals('', lastComponent.value)) {
	    components[componentLen - 2].value += lastComponent.value;
	    components.pop();
	  }

	  return components;
	}

	function clonePath(path) {
	  return { newPos: path.newPos, components: path.components.slice(0) };
	}
	//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kaWZmL2Jhc2UuanMiXSwibmFtZXMiOlsiRGlmZiIsInByb3RvdHlwZSIsImRpZmYiLCJvbGRTdHJpbmciLCJuZXdTdHJpbmciLCJvcHRpb25zIiwiY2FsbGJhY2siLCJzZWxmIiwiZG9uZSIsInZhbHVlIiwic2V0VGltZW91dCIsInVuZGVmaW5lZCIsImNhc3RJbnB1dCIsInJlbW92ZUVtcHR5IiwidG9rZW5pemUiLCJuZXdMZW4iLCJsZW5ndGgiLCJvbGRMZW4iLCJlZGl0TGVuZ3RoIiwibWF4RWRpdExlbmd0aCIsImJlc3RQYXRoIiwibmV3UG9zIiwiY29tcG9uZW50cyIsIm9sZFBvcyIsImV4dHJhY3RDb21tb24iLCJqb2luIiwiY291bnQiLCJleGVjRWRpdExlbmd0aCIsImRpYWdvbmFsUGF0aCIsImJhc2VQYXRoIiwiYWRkUGF0aCIsInJlbW92ZVBhdGgiLCJjYW5BZGQiLCJjYW5SZW1vdmUiLCJjbG9uZVBhdGgiLCJwdXNoQ29tcG9uZW50IiwiYnVpbGRWYWx1ZXMiLCJ1c2VMb25nZXN0VG9rZW4iLCJleGVjIiwicmV0IiwiYWRkZWQiLCJyZW1vdmVkIiwibGFzdCIsInB1c2giLCJjb21tb25Db3VudCIsImVxdWFscyIsImxlZnQiLCJyaWdodCIsImNvbXBhcmF0b3IiLCJpZ25vcmVDYXNlIiwidG9Mb3dlckNhc2UiLCJhcnJheSIsImkiLCJzcGxpdCIsImNoYXJzIiwiY29tcG9uZW50UG9zIiwiY29tcG9uZW50TGVuIiwiY29tcG9uZW50Iiwic2xpY2UiLCJtYXAiLCJvbGRWYWx1ZSIsInRtcCIsImxhc3RDb21wb25lbnQiLCJwb3AiLCJwYXRoIl0sIm1hcHBpbmdzIjoiOzs7NENBQXdCQSxJO0FBQVQsU0FBU0EsSUFBVCxHQUFnQixDQUFFOztBQUVqQ0EsS0FBS0MsU0FBTCxHQUFpQjtBQUFBLG1EQUNmQyxJQURlLGdCQUNWQyxTQURVLEVBQ0NDLFNBREQsRUFDMEI7QUFBQSx3REFBZEMsT0FBYyx1RUFBSixFQUFJOztBQUN2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RUFBd0JBLFNBQVNrQyxVQUFVL0IsS0FBM0MsQ0FBVixDQUFsQjtBQUNBSCxnQkFBVWtDLFVBQVUvQixLQUFwQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxVQUFJNkIsZ0JBQWdCakMsV0FBV2lDLGVBQWUsQ0FBMUIsRUFBNkJmLEtBQWpELEVBQXdEO0FBQ3RELFlBQUlxQixNQUFNdkMsV0FBV2lDLGVBQWUsQ0FBMUIsQ0FBVjtBQUNBakMsbUJBQVdpQyxlQUFlLENBQTFCLElBQStCakMsV0FBV2lDLFlBQVgsQ0FBL0I7QUFDQWpDLG1CQUFXaUMsWUFBWCxJQUEyQk0sR0FBM0I7QUFDRDtBQUNGO0FBQ0Y7O0FBRUQ7QUFDQTtBQUNBO0FBQ0EsTUFBSUMsZ0JBQWdCeEMsV0FBV2tDLGVBQWUsQ0FBMUIsQ0FBcEI7QUFDQSxNQUFJQSxlQUFlLENBQWYsSUFDRyxPQUFPTSxjQUFjckQsS0FBckIsS0FBK0IsUUFEbEMsS0FFSXFELGNBQWN0QixLQUFkLElBQXVCc0IsY0FBY3JCLE9BRnpDLEtBR0d2QyxLQUFLMkMsTUFBTCxDQUFZLEVBQVosRUFBZ0JpQixjQUFjckQsS0FBOUIsQ0FIUCxFQUc2QztBQUMzQ2EsZUFBV2tDLGVBQWUsQ0FBMUIsRUFBNkIvQyxLQUE3QixJQUFzQ3FELGNBQWNyRCxLQUFwRDtBQUNBYSxlQUFXeUMsR0FBWDtBQUNEOztBQUVELFNBQU96QyxVQUFQO0FBQ0Q7O0FBRUQsU0FBU1ksU0FBVCxDQUFtQjhCLElBQW5CLEVBQXlCO0FBQ3ZCLFNBQU8sRUFBRTNDLFFBQVEyQyxLQUFLM0MsTUFBZixFQUF1QkMsWUFBWTBDLEtBQUsxQyxVQUFMLENBQWdCb0MsS0FBaEIsQ0FBc0IsQ0FBdEIsQ0FBbkMsRUFBUDtBQUNEIiwiZmlsZSI6ImJhc2UuanMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBEaWZmKCkge31cblxuRGlmZi5wcm90b3R5cGUgPSB7XG4gIGRpZmYob2xkU3RyaW5nLCBuZXdTdHJpbmcsIG9wdGlvbnMgPSB7fSkge1xuICAgIGxldCBjYWxsYmFjayA9IG9wdGlvbnMuY2FsbGJhY2s7XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjYWxsYmFjayA9IG9wdGlvbnM7XG4gICAgICBvcHRpb25zID0ge307XG4gICAgfVxuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG5cbiAgICBsZXQgc2VsZiA9IHRoaXM7XG5cbiAgICBmdW5jdGlvbiBkb25lKHZhbHVlKSB7XG4gICAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsgY2FsbGJhY2sodW5kZWZpbmVkLCB2YWx1ZSk7IH0sIDApO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBBbGxvdyBzdWJjbGFzc2VzIHRvIG1hc3NhZ2UgdGhlIGlucHV0IHByaW9yIHRvIHJ1bm5pbmdcbiAgICBvbGRTdHJpbmcgPSB0aGlzLmNhc3RJbnB1dChvbGRTdHJpbmcpO1xuICAgIG5ld1N0cmluZyA9IHRoaXMuY2FzdElucHV0KG5ld1N0cmluZyk7XG5cbiAgICBvbGRTdHJpbmcgPSB0aGlzLnJlbW92ZUVtcHR5KHRoaXMudG9rZW5pemUob2xkU3RyaW5nKSk7XG4gICAgbmV3U3RyaW5nID0gdGhpcy5yZW1vdmVFbXB0eSh0aGlzLnRva2VuaXplKG5ld1N0cmluZykpO1xuXG4gICAgbGV0IG5ld0xlbiA9IG5ld1N0cmluZy5sZW5ndGgsIG9sZExlbiA9IG9sZFN0cmluZy5sZW5ndGg7XG4gICAgbGV0IGVkaXRMZW5ndGggPSAxO1xuICAgIGxldCBtYXhFZGl0TGVuZ3RoID0gbmV3TGVuICsgb2xkTGVuO1xuICAgIGxldCBiZXN0UGF0aCA9IFt7IG5ld1BvczogLTEsIGNvbXBvbmVudHM6IFtdIH1dO1xuXG4gICAgLy8gU2VlZCBlZGl0TGVuZ3RoID0gMCwgaS5lLiB0aGUgY29udGVudCBzdGFydHMgd2l0aCB0aGUgc2FtZSB2YWx1ZXNcbiAgICBsZXQgb2xkUG9zID0gdGhpcy5leHRyYWN0Q29tbW9uKGJlc3RQYXRoWzBdLCBuZXdTdHJpbmcsIG9sZFN0cmluZywgMCk7XG4gICAgaWYgKGJlc3RQYXRoWzBdLm5ld1BvcyArIDEgPj0gbmV3TGVuICYmIG9sZFBvcyArIDEgPj0gb2xkTGVuKSB7XG4gICAgICAvLyBJZGVudGl0eSBwZXIgdGhlIGVxdWFsaXR5IGFuZCB0b2tlbml6ZXJcbiAgICAgIHJldHVybiBkb25lKFt7dmFsdWU6IHRoaXMuam9pbihuZXdTdHJpbmcpLCBjb3VudDogbmV3U3RyaW5nLmxlbmd0aH1dKTtcbiAgICB9XG5cbiAgICAvLyBNYWluIHdvcmtlciBtZXRob2QuIGNoZWNrcyBhbGwgcGVybXV0YXRpb25zIG9mIGEgZ2l2ZW4gZWRpdCBsZW5ndGggZm9yIGFjY2VwdGFuY2UuXG4gICAgZnVuY3Rpb24gZXhlY0VkaXRMZW5ndGgoKSB7XG4gICAgICBmb3IgKGxldCBkaWFnb25hbFBhdGggPSAtMSAqIGVkaXRMZW5ndGg7IGRpYWdvbmFsUGF0aCA8PSBlZGl0TGVuZ3RoOyBkaWFnb25hbFBhdGggKz0gMikge1xuICAgICAgICBsZXQgYmFzZVBhdGg7XG4gICAgICAgIGxldCBhZGRQYXRoID0gYmVzdFBhdGhbZGlhZ29uYWxQYXRoIC0gMV0sXG4gICAgICAgICAgICByZW1vdmVQYXRoID0gYmVzdFBhdGhbZGlhZ29uYWxQYXRoICsgMV0sXG4gICAgICAgICAgICBvbGRQb3MgPSAocmVtb3ZlUGF0aCA/IHJlbW92ZVBhdGgubmV3UG9zIDogMCkgLSBkaWFnb25hbFBhdGg7XG4gICAgICAgIGlmIChhZGRQYXRoKSB7XG4gICAgICAgICAgLy8gTm8gb25lIGVsc2UgaXMgZ29pbmcgdG8gYXR0ZW1wdCB0byB1c2UgdGhpcyB2YWx1ZSwgY2xlYXIgaXRcbiAgICAgICAgICBiZXN0UGF0aFtkaWFnb25hbFBhdGggLSAxXSA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBjYW5BZGQgPSBhZGRQYXRoICYmIGFkZFBhdGgubmV3UG9zICsgMSA8IG5ld0xlbixcbiAgICAgICAgICAgIGNhblJlbW92ZSA9IHJlbW92ZVBhdGggJiYgMCA8PSBvbGRQb3MgJiYgb2xkUG9zIDwgb2xkTGVuO1xuICAgICAgICBpZiAoIWNhbkFkZCAmJiAhY2FuUmVtb3ZlKSB7XG4gICAgICAgICAgLy8gSWYgdGhpcyBwYXRoIGlzIGEgdGVybWluYWwgdGhlbiBwcnVuZVxuICAgICAgICAgIGJlc3RQYXRoW2RpYWdvbmFsUGF0aF0gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTZWxlY3QgdGhlIGRpYWdvbmFsIHRoYXQgd2Ugd2FudCB0byBicmFuY2ggZnJvbS4gV2Ugc2VsZWN0IHRoZSBwcmlvclxuICAgICAgICAvLyBwYXRoIHdob3NlIHBvc2l0aW9uIGluIHRoZSBuZXcgc3RyaW5nIGlzIHRoZSBmYXJ0aGVzdCBmcm9tIHRoZSBvcmlnaW5cbiAgICAgICAgLy8gYW5kIGRvZXMgbm90IHBhc3MgdGhlIGJvdW5kcyBvZiB0aGUgZGlmZiBncmFwaFxuICAgICAgICBpZiAoIWNhbkFkZCB8fCAoY2FuUmVtb3ZlICYmIGFkZFBhdGgubmV3UG9zIDwgcmVtb3ZlUGF0aC5uZXdQb3MpKSB7XG4gICAgICAgICAgYmFzZVBhdGggPSBjbG9uZVBhdGgocmVtb3ZlUGF0aCk7XG4gICAgICAgICAgc2VsZi5wdXNoQ29tcG9uZW50KGJhc2VQYXRoLmNvbXBvbmVudHMsIHVuZGVmaW5lZCwgdHJ1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYmFzZVBhdGggPSBhZGRQYXRoOyAgIC8vIE5vIG5lZWQgdG8gY2xvbmUsIHdlJ3ZlIHB1bGxlZCBpdCBmcm9tIHRoZSBsaXN0XG4gICAgICAgICAgYmFzZVBhdGgubmV3UG9zKys7XG4gICAgICAgICAgc2VsZi5wdXNoQ29tcG9uZW50KGJhc2VQYXRoLmNvbXBvbmVudHMsIHRydWUsIHVuZGVmaW5lZCk7XG4gICAgICAgIH1cblxuICAgICAgICBvbGRQb3MgPSBzZWxmLmV4dHJhY3RDb21tb24oYmFzZVBhdGgsIG5ld1N0cmluZywgb2xkU3RyaW5nLCBkaWFnb25hbFBhdGgpO1xuXG4gICAgICAgIC8vIElmIHdlIGhhdmUgaGl0IHRoZSBlbmQgb2YgYm90aCBzdHJpbmdzLCB0aGVuIHdlIGFyZSBkb25lXG4gICAgICAgIGlmIChiYXNlUGF0aC5uZXdQb3MgKyAxID49IG5ld0xlbiAmJiBvbGRQb3MgKyAxID49IG9sZExlbikge1xuICAgICAgICAgIHJldHVybiBkb25lKGJ1aWxkVmFsdWVzKHNlbGYsIGJhc2VQYXRoLmNvbXBvbmVudHMsIG5ld1N0cmluZywgb2xkU3RyaW5nLCBzZWxmLnVzZUxvbmdlc3RUb2tlbikpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIE90aGVyd2lzZSB0cmFjayB0aGlzIHBhdGggYXMgYSBwb3RlbnRpYWwgY2FuZGlkYXRlIGFuZCBjb250aW51ZS5cbiAgICAgICAgICBiZXN0UGF0aFtkaWFnb25hbFBhdGhdID0gYmFzZVBhdGg7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZWRpdExlbmd0aCsrO1xuICAgIH1cblxuICAgIC8vIFBlcmZvcm1zIHRoZSBsZW5ndGggb2YgZWRpdCBpdGVyYXRpb24uIElzIGEgYml0IGZ1Z2x5IGFzIHRoaXMgaGFzIHRvIHN1cHBvcnQgdGhlXG4gICAgLy8gc3luYyBhbmQgYXN5bmMgbW9kZSB3aGljaCBpcyBuZXZlciBmdW4uIExvb3BzIG92ZXIgZXhlY0VkaXRMZW5ndGggdW50aWwgYSB2YWx1ZVxuICAgIC8vIGlzIHByb2R1Y2VkLlxuICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgKGZ1bmN0aW9uIGV4ZWMoKSB7XG4gICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgLy8gVGhpcyBzaG91bGQgbm90IGhhcHBlbiwgYnV0IHdlIHdhbnQgdG8gYmUgc2FmZS5cbiAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgICAgIGlmIChlZGl0TGVuZ3RoID4gbWF4RWRpdExlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKCFleGVjRWRpdExlbmd0aCgpKSB7XG4gICAgICAgICAgICBleGVjKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LCAwKTtcbiAgICAgIH0oKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHdoaWxlIChlZGl0TGVuZ3RoIDw9IG1heEVkaXRMZW5ndGgpIHtcbiAgICAgICAgbGV0IHJldCA9IGV4ZWNFZGl0TGVuZ3RoKCk7XG4gICAgICAgIGlmIChyZXQpIHtcbiAgICAgICAgICByZXR1cm4gcmV0O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIHB1c2hDb21wb25lbnQoY29tcG9uZW50cywgYWRkZWQsIHJlbW92ZWQpIHtcbiAgICBsZXQgbGFzdCA9IGNvbXBvbmVudHNbY29tcG9uZW50cy5sZW5ndGggLSAxXTtcbiAgICBpZiAobGFzdCAmJiBsYXN0LmFkZGVkID09PSBhZGRlZCAmJiBsYXN0LnJlbW92ZWQgPT09IHJlbW92ZWQpIHtcbiAgICAgIC8vIFdlIG5lZWQgdG8gY2xvbmUgaGVyZSBhcyB0aGUgY29tcG9uZW50IGNsb25lIG9wZXJhdGlvbiBpcyBqdXN0XG4gICAgICAvLyBhcyBzaGFsbG93IGFycmF5IGNsb25lXG4gICAgICBjb21wb25lbnRzW2NvbXBvbmVudHMubGVuZ3RoIC0gMV0gPSB7Y291bnQ6IGxhc3QuY291bnQgKyAxLCBhZGRlZDogYWRkZWQsIHJlbW92ZWQ6IHJlbW92ZWQgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29tcG9uZW50cy5wdXNoKHtjb3VudDogMSwgYWRkZWQ6IGFkZGVkLCByZW1vdmVkOiByZW1vdmVkIH0pO1xuICAgIH1cbiAgfSxcbiAgZXh0cmFjdENvbW1vbihiYXNlUGF0aCwgbmV3U3RyaW5nLCBvbGRTdHJpbmcsIGRpYWdvbmFsUGF0aCkge1xuICAgIGxldCBuZXdMZW4gPSBuZXdTdHJpbmcubGVuZ3RoLFxuICAgICAgICBvbGRMZW4gPSBvbGRTdHJpbmcubGVuZ3RoLFxuICAgICAgICBuZXdQb3MgPSBiYXNlUGF0aC5uZXdQb3MsXG4gICAgICAgIG9sZFBvcyA9IG5ld1BvcyAtIGRpYWdvbmFsUGF0aCxcblxuICAgICAgICBjb21tb25Db3VudCA9IDA7XG4gICAgd2hpbGUgKG5ld1BvcyArIDEgPCBuZXdMZW4gJiYgb2xkUG9zICsgMSA8IG9sZExlbiAmJiB0aGlzLmVxdWFscyhuZXdTdHJpbmdbbmV3UG9zICsgMV0sIG9sZFN0cmluZ1tvbGRQb3MgKyAxXSkpIHtcbiAgICAgIG5ld1BvcysrO1xuICAgICAgb2xkUG9zKys7XG4gICAgICBjb21tb25Db3VudCsrO1xuICAgIH1cblxuICAgIGlmIChjb21tb25Db3VudCkge1xuICAgICAgYmFzZVBhdGguY29tcG9uZW50cy5wdXNoKHtjb3VudDogY29tbW9uQ291bnR9KTtcbiAgICB9XG5cbiAgICBiYXNlUGF0aC5uZXdQb3MgPSBuZXdQb3M7XG4gICAgcmV0dXJuIG9sZFBvcztcbiAgfSxcblxuICBlcXVhbHMobGVmdCwgcmlnaHQpIHtcbiAgICBpZiAodGhpcy5vcHRpb25zLmNvbXBhcmF0b3IpIHtcbiAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMuY29tcGFyYXRvcihsZWZ0LCByaWdodCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBsZWZ0ID09PSByaWdodFxuICAgICAgICB8fCAodGhpcy5vcHRpb25zLmlnbm9yZUNhc2UgJiYgbGVmdC50b0xvd2VyQ2FzZSgpID09PSByaWdodC50b0xvd2VyQ2FzZSgpKTtcbiAgICB9XG4gIH0sXG4gIHJlbW92ZUVtcHR5KGFycmF5KSB7XG4gICAgbGV0IHJldCA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChhcnJheVtpXSkge1xuICAgICAgICByZXQucHVzaChhcnJheVtpXSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXQ7XG4gIH0sXG4gIGNhc3RJbnB1dCh2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfSxcbiAgdG9rZW5pemUodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUuc3BsaXQoJycpO1xuICB9LFxuICBqb2luKGNoYXJzKSB7XG4gICAgcmV0dXJuIGNoYXJzLmpvaW4oJycpO1xuICB9XG59O1xuXG5mdW5jdGlvbiBidWlsZFZhbHVlcyhkaWZmLCBjb21wb25lbnRzLCBuZXdTdHJpbmcsIG9sZFN0cmluZywgdXNlTG9uZ2VzdFRva2VuKSB7XG4gIGxldCBjb21wb25lbnRQb3MgPSAwLFxuICAgICAgY29tcG9uZW50TGVuID0gY29tcG9uZW50cy5sZW5ndGgsXG4gICAgICBuZXdQb3MgPSAwLFxuICAgICAgb2xkUG9zID0gMDtcblxuICBmb3IgKDsgY29tcG9uZW50UG9zIDwgY29tcG9uZW50TGVuOyBjb21wb25lbnRQb3MrKykge1xuICAgIGxldCBjb21wb25lbnQgPSBjb21wb25lbnRzW2NvbXBvbmVudFBvc107XG4gICAgaWYgKCFjb21wb25lbnQucmVtb3ZlZCkge1xuICAgICAgaWYgKCFjb21wb25lbnQuYWRkZWQgJiYgdXNlTG9uZ2VzdFRva2VuKSB7XG4gICAgICAgIGxldCB2YWx1ZSA9IG5ld1N0cmluZy5zbGljZShuZXdQb3MsIG5ld1BvcyArIGNvbXBvbmVudC5jb3VudCk7XG4gICAgICAgIHZhbHVlID0gdmFsdWUubWFwKGZ1bmN0aW9uKHZhbHVlLCBpKSB7XG4gICAgICAgICAgbGV0IG9sZFZhbHVlID0gb2xkU3RyaW5nW29sZFBvcyArIGldO1xuICAgICAgICAgIHJldHVybiBvbGRWYWx1ZS5sZW5ndGggPiB2YWx1ZS5sZW5ndGggPyBvbGRWYWx1ZSA6IHZhbHVlO1xuICAgICAgICB9KTtcblxuICAgICAgICBjb21wb25lbnQudmFsdWUgPSBkaWZmLmpvaW4odmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29tcG9uZW50LnZhbHVlID0gZGlmZi5qb2luKG5ld1N0cmluZy5zbGljZShuZXdQb3MsIG5ld1BvcyArIGNvbXBvbmVudC5jb3VudCkpO1xuICAgICAgfVxuICAgICAgbmV3UG9zICs9IGNvbXBvbmVudC5jb3VudDtcblxuICAgICAgLy8gQ29tbW9uIGNhc2VcbiAgICAgIGlmICghY29tcG9uZW50LmFkZGVkKSB7XG4gICAgICAgIG9sZFBvcyArPSBjb21wb25lbnQuY291bnQ7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbXBvbmVudC52YWx1ZSA9IGRpZmYuam9pbihvbGRTdHJpbmcuc2xpY2Uob2xkUG9zLCBvbGRQb3MgKyBjb21wb25lbnQuY291bnQpKTtcbiAgICAgIG9sZFBvcyArPSBjb21wb25lbnQuY291bnQ7XG5cbiAgICAgIC8vIFJldmVyc2UgYWRkIGFuZCByZW1vdmUgc28gcmVtb3ZlcyBhcmUgb3V0cHV0IGZpcnN0IHRvIG1hdGNoIGNvbW1vbiBjb252ZW50aW9uXG4gICAgICAvLyBUaGUgZGlmZmluZyBhbGdvcml0aG0gaXMgdGllZCB0byBhZGQgdGhlbiByZW1vdmUgb3V0cHV0IGFuZCB0aGlzIGlzIHRoZSBzaW1wbGVzdFxuICAgICAgLy8gcm91dGUgdG8gZ2V0IHRoZSBkZXNpcmVkIG91dHB1dCB3aXRoIG1pbmltYWwgb3ZlcmhlYWQuXG4gICAgICBpZiAoY29tcG9uZW50UG9zICYmIGNvbXBvbmVudHNbY29tcG9uZW50UG9zIC0gMV0uYWRkZWQpIHtcbiAgICAgICAgbGV0IHRtcCA9IGNvbXBvbmVudHNbY29tcG9uZW50UG9zIC0gMV07XG4gICAgICAgIGNvbXBvbmVudHNbY29tcG9uZW50UG9zIC0gMV0gPSBjb21wb25lbnRzW2NvbXBvbmVudFBvc107XG4gICAgICAgIGNvbXBvbmVudHNbY29tcG9uZW50UG9zXSA9IHRtcDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBTcGVjaWFsIGNhc2UgaGFuZGxlIGZvciB3aGVuIG9uZSB0ZXJtaW5hbCBpcyBpZ25vcmVkIChpLmUuIHdoaXRlc3BhY2UpLlxuICAvLyBGb3IgdGhpcyBjYXNlIHdlIG1lcmdlIHRoZSB0ZXJtaW5hbCBpbnRvIHRoZSBwcmlvciBzdHJpbmcgYW5kIGRyb3AgdGhlIGNoYW5nZS5cbiAgLy8gVGhpcyBpcyBvbmx5IGF2YWlsYWJsZSBmb3Igc3RyaW5nIG1vZGUuXG4gIGxldCBsYXN0Q29tcG9uZW50ID0gY29tcG9uZW50c1tjb21wb25lbnRMZW4gLSAxXTtcbiAgaWYgKGNvbXBvbmVudExlbiA+IDFcbiAgICAgICYmIHR5cGVvZiBsYXN0Q29tcG9uZW50LnZhbHVlID09PSAnc3RyaW5nJ1xuICAgICAgJiYgKGxhc3RDb21wb25lbnQuYWRkZWQgfHwgbGFzdENvbXBvbmVudC5yZW1vdmVkKVxuICAgICAgJiYgZGlmZi5lcXVhbHMoJycsIGxhc3RDb21wb25lbnQudmFsdWUpKSB7XG4gICAgY29tcG9uZW50c1tjb21wb25lbnRMZW4gLSAyXS52YWx1ZSArPSBsYXN0Q29tcG9uZW50LnZhbHVlO1xuICAgIGNvbXBvbmVudHMucG9wKCk7XG4gIH1cblxuICByZXR1cm4gY29tcG9uZW50cztcbn1cblxuZnVuY3Rpb24gY2xvbmVQYXRoKHBhdGgpIHtcbiAgcmV0dXJuIHsgbmV3UG9zOiBwYXRoLm5ld1BvcywgY29tcG9uZW50czogcGF0aC5jb21wb25lbnRzLnNsaWNlKDApIH07XG59XG4iXX0=


/***/ }),
/* 2 */
/***/ (function(module, exports, __webpack_require__) {

	/*istanbul ignore start*/'use strict';

	exports.__esModule = true;
	exports.characterDiff = undefined;
	exports. /*istanbul ignore end*/diffChars = diffChars;

	var /*istanbul ignore start*/_base = __webpack_require__(1) /*istanbul ignore end*/;

	/*istanbul ignore start*/var _base2 = _interopRequireDefault(_base);

	function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }

	/*istanbul ignore end*/var characterDiff = /*istanbul ignore start*/exports. /*istanbul ignore end*/characterDiff = new /*istanbul ignore start*/_base2['default'] /*istanbul ignore end*/();
	function diffChars(oldStr, newStr, options) {
	  return characterDiff.diff(oldStr, newStr, options);
	}
	//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kaWZmL2NoYXJhY3Rlci5qcyJdLCJuYW1lcyI6WyJkaWZmQ2hhcnMiLCJjaGFyYWN0ZXJEaWZmIiwib2xkU3RyIiwibmV3U3RyIiwib3B0aW9ucyIsImRpZmYiXSwibWFwcGluZ3MiOiI7Ozs7Z0NBR2dCQSxTLEdBQUFBLFM7O0FBSGhCOzs7Ozs7dUJBRU8sSUFBTUMseUZBQWdCLHdFQUF0QjtBQUNBLFNBQVNELFNBQVQsQ0FBbUJFLE1BQW5CLEVBQTJCQyxNQUEzQixFQUFtQ0MsT0FBbkMsRUFBNEM7QUFBRSxTQUFPSCxjQUFjSSxJQUFkLENBQW1CSCxNQUFuQixFQUEyQkMsTUFBM0IsRUFBbUNDLE9BQW5DLENBQVA7QUFBcUQiLCJmaWxlIjoiY2hhcmFjdGVyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IERpZmYgZnJvbSAnLi9iYXNlJztcblxuZXhwb3J0IGNvbnN0IGNoYXJhY3RlckRpZmYgPSBuZXcgRGlmZigpO1xuZXhwb3J0IGZ1bmN0aW9uIGRpZmZDaGFycyhvbGRTdHIsIG5ld1N0ciwgb3B0aW9ucykgeyByZXR1cm4gY2hhcmFjdGVyRGlmZi5kaWZmKG9sZFN0ciwgbmV3U3RyLCBvcHRpb25zKTsgfVxuIl19


/***/ }),
/* 3 */
/***/ (function(module, exports, __webpack_require__) {

	/*istanbul ignore start*/'use strict';

	exports.__esModule = true;
	exports.wordDiff = undefined;
	exports. /*istanbul ignore end*/diffWords = diffWords;
	/*istanbul ignore start*/exports. /*istanbul ignore end*/diffWordsWithSpace = diffWordsWithSpace;

	var /*istanbul ignore start*/_base = __webpack_require__(1) /*istanbul ignore end*/;

	/*istanbul ignore start*/var _base2 = _interopRequireDefault(_base);

	/*istanbul ignore end*/var /*istanbul ignore start*/_params = __webpack_require__(4) /*istanbul ignore end*/;

	/*istanbul ignore start*/function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }

	/*istanbul ignore end*/ // Based on https://en.wikipedia.org/wiki/Latin_script_in_Unicode
	//
	// Ranges and exceptions:
	// Latin-1 Supplement, 0080–00FF
	//  - U+00D7  × Multiplication sign
	//  - U+00F7  ÷ Division sign
	// Latin Extended-A, 0100–017F
	// Latin Extended-B, 0180–024F
	// IPA Extensions, 0250–02AF
	// Spacing Modifier Letters, 02B0–02FF
	//  - U+02C7  ˇ &#711;  Caron
	//  - U+02D8  ˘ &#728;  Breve
	//  - U+02D9  ˙ &#729;  Dot Above
	//  - U+02DA  ˚ &#730;  Ring Above
	//  - U+02DB  ˛ &#731;  Ogonek
	//  - U+02DC  ˜ &#732;  Small Tilde
	//  - U+02DD  ˝ &#733;  Double Acute Accent
	// Latin Extended Additional, 1E00–1EFF
	var extendedWordChars = /^[A-Za-z\xC0-\u02C6\u02C8-\u02D7\u02DE-\u02FF\u1E00-\u1EFF]+$/;

	var reWhitespace = /\S/;

	var wordDiff = /*istanbul ignore start*/exports. /*istanbul ignore end*/wordDiff = new /*istanbul ignore start*/_base2['default'] /*istanbul ignore end*/();
	wordDiff.equals = function (left, right) {
	  if (this.options.ignoreCase) {
	    left = left.toLowerCase();
	    right = right.toLowerCase();
	  }
	  return left === right || this.options.ignoreWhitespace && !reWhitespace.test(left) && !reWhitespace.test(right);
	};
	wordDiff.tokenize = function (value) {
	  var tokens = value.split(/(\s+|\b)/);

	  // Join the boundary splits that we do not consider to be boundaries. This is primarily the extended Latin character set.
	  for (var i = 0; i < tokens.length - 1; i++) {
	    // If we have an empty string in the next field and we have only word chars before and after, merge
	    if (!tokens[i + 1] && tokens[i + 2] && extendedWordChars.test(tokens[i]) && extendedWordChars.test(tokens[i + 2])) {
	      tokens[i] += tokens[i + 2];
	      tokens.splice(i + 1, 2);
	      i--;
	    }
	  }

	  return tokens;
	};

	function diffWords(oldStr, newStr, options) {
	  options = /*istanbul ignore start*/(0, _params.generateOptions) /*istanbul ignore end*/(options, { ignoreWhitespace: true });
	  return wordDiff.diff(oldStr, newStr, options);
	}

	function diffWordsWithSpace(oldStr, newStr, options) {
	  return wordDiff.diff(oldStr, newStr, options);
	}
	//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kaWZmL3dvcmQuanMiXSwibmFtZXMiOlsiZGlmZldvcmRzIiwiZGlmZldvcmRzV2l0aFNwYWNlIiwiZXh0ZW5kZWRXb3JkQ2hhcnMiLCJyZVdoaXRlc3BhY2UiLCJ3b3JkRGlmZiIsImVxdWFscyIsImxlZnQiLCJyaWdodCIsIm9wdGlvbnMiLCJpZ25vcmVDYXNlIiwidG9Mb3dlckNhc2UiLCJpZ25vcmVXaGl0ZXNwYWNlIiwidGVzdCIsInRva2VuaXplIiwidmFsdWUiLCJ0b2tlbnMiLCJzcGxpdCIsImkiLCJsZW5ndGgiLCJzcGxpY2UiLCJvbGRTdHIiLCJuZXdTdHIiLCJkaWZmIl0sIm1hcHBpbmdzIjoiOzs7O2dDQW1EZ0JBLFMsR0FBQUEsUzt5REFLQUMsa0IsR0FBQUEsa0I7O0FBeERoQjs7Ozt1QkFDQTs7Ozt3QkFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFNQyxvQkFBb0IsK0RBQTFCOztBQUVBLElBQU1DLGVBQWUsSUFBckI7O0FBRU8sSUFBTUMsK0VBQVcsd0VBQWpCO0FBQ1BBLFNBQVNDLE1BQVQsR0FBa0IsVUFBU0MsSUFBVCxFQUFlQyxLQUFmLEVBQXNCO0FBQ3RDLE1BQUksS0FBS0MsT0FBTCxDQUFhQyxVQUFqQixFQUE2QjtBQUMzQkgsV0FBT0EsS0FBS0ksV0FBTCxFQUFQO0FBQ0FILFlBQVFBLE1BQU1HLFdBQU4sRUFBUjtBQUNEO0FBQ0QsU0FBT0osU0FBU0MsS0FBVCxJQUFtQixLQUFLQyxPQUFMLENBQWFHLGdCQUFiLElBQWlDLENBQUNSLGFBQWFTLElBQWIsQ0FBa0JOLElBQWxCLENBQWxDLElBQTZELENBQUNILGFBQWFTLElBQWIsQ0FBa0JMLEtBQWxCLENBQXhGO0FBQ0QsQ0FORDtBQU9BSCxTQUFTUyxRQUFULEdBQW9CLFVBQVNDLEtBQVQsRUFBZ0I7QUFDbEMsTUFBSUMsU0FBU0QsTUFBTUUsS0FBTixDQUFZLFVBQVosQ0FBYjs7QUFFQTtBQUNBLE9BQUssSUFBSUMsSUFBSSxDQUFiLEVBQWdCQSxJQUFJRixPQUFPRyxNQUFQLEdBQWdCLENBQXBDLEVBQXVDRCxHQUF2QyxFQUE0QztBQUMxQztBQUNBLFFBQUksQ0FBQ0YsT0FBT0UsSUFBSSxDQUFYLENBQUQsSUFBa0JGLE9BQU9FLElBQUksQ0FBWCxDQUFsQixJQUNLZixrQkFBa0JVLElBQWxCLENBQXVCRyxPQUFPRSxDQUFQLENBQXZCLENBREwsSUFFS2Ysa0JBQWtCVSxJQUFsQixDQUF1QkcsT0FBT0UsSUFBSSxDQUFYLENBQXZCLENBRlQsRUFFZ0Q7QUFDOUNGLGFBQU9FLENBQVAsS0FBYUYsT0FBT0UsSUFBSSxDQUFYLENBQWI7QUFDQUYsYUFBT0ksTUFBUCxDQUFjRixJQUFJLENBQWxCLEVBQXFCLENBQXJCO0FBQ0FBO0FBQ0Q7QUFDRjs7QUFFRCxTQUFPRixNQUFQO0FBQ0QsQ0FoQkQ7O0FBa0JPLFNBQVNmLFNBQVQsQ0FBbUJvQixNQUFuQixFQUEyQkMsTUFBM0IsRUFBbUNiLE9BQW5DLEVBQTRDO0FBQ2pEQSxZQUFVLDhFQUFnQkEsT0FBaEIsRUFBeUIsRUFBQ0csa0JBQWtCLElBQW5CLEVBQXpCLENBQVY7QUFDQSxTQUFPUCxTQUFTa0IsSUFBVCxDQUFjRixNQUFkLEVBQXNCQyxNQUF0QixFQUE4QmIsT0FBOUIsQ0FBUDtBQUNEOztBQUVNLFNBQVNQLGtCQUFULENBQTRCbUIsTUFBNUIsRUFBb0NDLE1BQXBDLEVBQTRDYixPQUE1QyxFQUFxRDtBQUMxRCxTQUFPSixTQUFTa0IsSUFBVCxDQUFjRixNQUFkLEVBQXNCQyxNQUF0QixFQUE4QmIsT0FBOUIsQ0FBUDtBQUNEIiwiZmlsZSI6IndvcmQuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgRGlmZiBmcm9tICcuL2Jhc2UnO1xuaW1wb3J0IHtnZW5lcmF0ZU9wdGlvbnN9IGZyb20gJy4uL3V0aWwvcGFyYW1zJztcblxuLy8gQmFzZWQgb24gaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTGF0aW5fc2NyaXB0X2luX1VuaWNvZGVcbi8vXG4vLyBSYW5nZXMgYW5kIGV4Y2VwdGlvbnM6XG4vLyBMYXRpbi0xIFN1cHBsZW1lbnQsIDAwODDigJMwMEZGXG4vLyAgLSBVKzAwRDcgIMOXIE11bHRpcGxpY2F0aW9uIHNpZ25cbi8vICAtIFUrMDBGNyAgw7cgRGl2aXNpb24gc2lnblxuLy8gTGF0aW4gRXh0ZW5kZWQtQSwgMDEwMOKAkzAxN0Zcbi8vIExhdGluIEV4dGVuZGVkLUIsIDAxODDigJMwMjRGXG4vLyBJUEEgRXh0ZW5zaW9ucywgMDI1MOKAkzAyQUZcbi8vIFNwYWNpbmcgTW9kaWZpZXIgTGV0dGVycywgMDJCMOKAkzAyRkZcbi8vICAtIFUrMDJDNyAgy4cgJiM3MTE7ICBDYXJvblxuLy8gIC0gVSswMkQ4ICDLmCAmIzcyODsgIEJyZXZlXG4vLyAgLSBVKzAyRDkgIMuZICYjNzI5OyAgRG90IEFib3ZlXG4vLyAgLSBVKzAyREEgIMuaICYjNzMwOyAgUmluZyBBYm92ZVxuLy8gIC0gVSswMkRCICDLmyAmIzczMTsgIE9nb25la1xuLy8gIC0gVSswMkRDICDLnCAmIzczMjsgIFNtYWxsIFRpbGRlXG4vLyAgLSBVKzAyREQgIMudICYjNzMzOyAgRG91YmxlIEFjdXRlIEFjY2VudFxuLy8gTGF0aW4gRXh0ZW5kZWQgQWRkaXRpb25hbCwgMUUwMOKAkzFFRkZcbmNvbnN0IGV4dGVuZGVkV29yZENoYXJzID0gL15bYS16QS1aXFx1e0MwfS1cXHV7RkZ9XFx1e0Q4fS1cXHV7RjZ9XFx1e0Y4fS1cXHV7MkM2fVxcdXsyQzh9LVxcdXsyRDd9XFx1ezJERX0tXFx1ezJGRn1cXHV7MUUwMH0tXFx1ezFFRkZ9XSskL3U7XG5cbmNvbnN0IHJlV2hpdGVzcGFjZSA9IC9cXFMvO1xuXG5leHBvcnQgY29uc3Qgd29yZERpZmYgPSBuZXcgRGlmZigpO1xud29yZERpZmYuZXF1YWxzID0gZnVuY3Rpb24obGVmdCwgcmlnaHQpIHtcbiAgaWYgKHRoaXMub3B0aW9ucy5pZ25vcmVDYXNlKSB7XG4gICAgbGVmdCA9IGxlZnQudG9Mb3dlckNhc2UoKTtcbiAgICByaWdodCA9IHJpZ2h0LnRvTG93ZXJDYXNlKCk7XG4gIH1cbiAgcmV0dXJuIGxlZnQgPT09IHJpZ2h0IHx8ICh0aGlzLm9wdGlvbnMuaWdub3JlV2hpdGVzcGFjZSAmJiAhcmVXaGl0ZXNwYWNlLnRlc3QobGVmdCkgJiYgIXJlV2hpdGVzcGFjZS50ZXN0KHJpZ2h0KSk7XG59O1xud29yZERpZmYudG9rZW5pemUgPSBmdW5jdGlvbih2YWx1ZSkge1xuICBsZXQgdG9rZW5zID0gdmFsdWUuc3BsaXQoLyhcXHMrfFxcYikvKTtcblxuICAvLyBKb2luIHRoZSBib3VuZGFyeSBzcGxpdHMgdGhhdCB3ZSBkbyBub3QgY29uc2lkZXIgdG8gYmUgYm91bmRhcmllcy4gVGhpcyBpcyBwcmltYXJpbHkgdGhlIGV4dGVuZGVkIExhdGluIGNoYXJhY3RlciBzZXQuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aCAtIDE7IGkrKykge1xuICAgIC8vIElmIHdlIGhhdmUgYW4gZW1wdHkgc3RyaW5nIGluIHRoZSBuZXh0IGZpZWxkIGFuZCB3ZSBoYXZlIG9ubHkgd29yZCBjaGFycyBiZWZvcmUgYW5kIGFmdGVyLCBtZXJnZVxuICAgIGlmICghdG9rZW5zW2kgKyAxXSAmJiB0b2tlbnNbaSArIDJdXG4gICAgICAgICAgJiYgZXh0ZW5kZWRXb3JkQ2hhcnMudGVzdCh0b2tlbnNbaV0pXG4gICAgICAgICAgJiYgZXh0ZW5kZWRXb3JkQ2hhcnMudGVzdCh0b2tlbnNbaSArIDJdKSkge1xuICAgICAgdG9rZW5zW2ldICs9IHRva2Vuc1tpICsgMl07XG4gICAgICB0b2tlbnMuc3BsaWNlKGkgKyAxLCAyKTtcbiAgICAgIGktLTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdG9rZW5zO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGRpZmZXb3JkcyhvbGRTdHIsIG5ld1N0ciwgb3B0aW9ucykge1xuICBvcHRpb25zID0gZ2VuZXJhdGVPcHRpb25zKG9wdGlvbnMsIHtpZ25vcmVXaGl0ZXNwYWNlOiB0cnVlfSk7XG4gIHJldHVybiB3b3JkRGlmZi5kaWZmKG9sZFN0ciwgbmV3U3RyLCBvcHRpb25zKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRpZmZXb3Jkc1dpdGhTcGFjZShvbGRTdHIsIG5ld1N0ciwgb3B0aW9ucykge1xuICByZXR1cm4gd29yZERpZmYuZGlmZihvbGRTdHIsIG5ld1N0ciwgb3B0aW9ucyk7XG59XG4iXX0=


/***/ }),
/* 4 */
/***/ (function(module, exports) {

	/*istanbul ignore start*/'use strict';

	exports.__esModule = true;
	exports. /*istanbul ignore end*/generateOptions = generateOptions;
	function generateOptions(options, defaults) {
	  if (typeof options === 'function') {
	    defaults.callback = options;
	  } else if (options) {
	    for (var name in options) {
	      /* istanbul ignore else */
	      if (options.hasOwnProperty(name)) {
	        defaults[name] = options[name];
	      }
	    }
	  }
	  return defaults;
	}
	//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlsL3BhcmFtcy5qcyJdLCJuYW1lcyI6WyJnZW5lcmF0ZU9wdGlvbnMiLCJvcHRpb25zIiwiZGVmYXVsdHMiLCJjYWxsYmFjayIsIm5hbWUiLCJoYXNPd25Qcm9wZXJ0eSJdLCJtYXBwaW5ncyI6Ijs7O2dDQUFnQkEsZSxHQUFBQSxlO0FBQVQsU0FBU0EsZUFBVCxDQUF5QkMsT0FBekIsRUFBa0NDLFFBQWxDLEVBQTRDO0FBQ2pELE1BQUksT0FBT0QsT0FBUCxLQUFtQixVQUF2QixFQUFtQztBQUNqQ0MsYUFBU0MsUUFBVCxHQUFvQkYsT0FBcEI7QUFDRCxHQUZELE1BRU8sSUFBSUEsT0FBSixFQUFhO0FBQ2xCLFNBQUssSUFBSUcsSUFBVCxJQUFpQkgsT0FBakIsRUFBMEI7QUFDeEI7QUFDQSxVQUFJQSxRQUFRSSxjQUFSLENBQXVCRCxJQUF2QixDQUFKLEVBQWtDO0FBQ2hDRixpQkFBU0UsSUFBVCxJQUFpQkgsUUFBUUcsSUFBUixDQUFqQjtBQUNEO0FBQ0Y7QUFDRjtBQUNELFNBQU9GLFFBQVA7QUFDRCIsImZpbGUiOiJwYXJhbXMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVPcHRpb25zKG9wdGlvbnMsIGRlZmF1bHRzKSB7XG4gIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGRlZmF1bHRzLmNhbGxiYWNrID0gb3B0aW9ucztcbiAgfSBlbHNlIGlmIChvcHRpb25zKSB7XG4gICAgZm9yIChsZXQgbmFtZSBpbiBvcHRpb25zKSB7XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgICAgaWYgKG9wdGlvbnMuaGFzT3duUHJvcGVydHkobmFtZSkpIHtcbiAgICAgICAgZGVmYXVsdHNbbmFtZV0gPSBvcHRpb25zW25hbWVdO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gZGVmYXVsdHM7XG59XG4iXX0=


/***/ }),
/* 5 */
/***/ (function(module, exports, __webpack_require__) {

	/*istanbul ignore start*/'use strict';

	exports.__esModule = true;
	exports.lineDiff = undefined;
	exports. /*istanbul ignore end*/diffLines = diffLines;
	/*istanbul ignore start*/exports. /*istanbul ignore end*/diffTrimmedLines = diffTrimmedLines;

	var /*istanbul ignore start*/_base = __webpack_require__(1) /*istanbul ignore end*/;

	/*istanbul ignore start*/var _base2 = _interopRequireDefault(_base);

	/*istanbul ignore end*/var /*istanbul ignore start*/_params = __webpack_require__(4) /*istanbul ignore end*/;

	/*istanbul ignore start*/function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }

	/*istanbul ignore end*/var lineDiff = /*istanbul ignore start*/exports. /*istanbul ignore end*/lineDiff = new /*istanbul ignore start*/_base2['default'] /*istanbul ignore end*/();
	lineDiff.tokenize = function (value) {
	  var retLines = [],
	      linesAndNewlines = value.split(/(\n|\r\n)/);

	  // Ignore the final empty token that occurs if the string ends with a new line
	  if (!linesAndNewlines[linesAndNewlines.length - 1]) {
	    linesAndNewlines.pop();
	  }

	  // Merge the content and line separators into single tokens
	  for (var i = 0; i < linesAndNewlines.length; i++) {
	    var line = linesAndNewlines[i];

	    if (i % 2 && !this.options.newlineIsToken) {
	      retLines[retLines.length - 1] += line;
	    } else {
	      if (this.options.ignoreWhitespace) {
	        line = line.trim();
	      }
	      retLines.push(line);
	    }
	  }

	  return retLines;
	};

	function diffLines(oldStr, newStr, callback) {
	  return lineDiff.diff(oldStr, newStr, callback);
	}
	function diffTrimmedLines(oldStr, newStr, callback) {
	  var options = /*istanbul ignore start*/(0, _params.generateOptions) /*istanbul ignore end*/(callback, { ignoreWhitespace: true });
	  return lineDiff.diff(oldStr, newStr, options);
	}
	//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kaWZmL2xpbmUuanMiXSwibmFtZXMiOlsiZGlmZkxpbmVzIiwiZGlmZlRyaW1tZWRMaW5lcyIsImxpbmVEaWZmIiwidG9rZW5pemUiLCJ2YWx1ZSIsInJldExpbmVzIiwibGluZXNBbmROZXdsaW5lcyIsInNwbGl0IiwibGVuZ3RoIiwicG9wIiwiaSIsImxpbmUiLCJvcHRpb25zIiwibmV3bGluZUlzVG9rZW4iLCJpZ25vcmVXaGl0ZXNwYWNlIiwidHJpbSIsInB1c2giLCJvbGRTdHIiLCJuZXdTdHIiLCJjYWxsYmFjayIsImRpZmYiXSwibWFwcGluZ3MiOiI7Ozs7Z0NBOEJnQkEsUyxHQUFBQSxTO3lEQUNBQyxnQixHQUFBQSxnQjs7QUEvQmhCOzs7O3VCQUNBOzs7O3VCQUVPLElBQU1DLCtFQUFXLHdFQUFqQjtBQUNQQSxTQUFTQyxRQUFULEdBQW9CLFVBQVNDLEtBQVQsRUFBZ0I7QUFDbEMsTUFBSUMsV0FBVyxFQUFmO0FBQUEsTUFDSUMsbUJBQW1CRixNQUFNRyxLQUFOLENBQVksV0FBWixDQUR2Qjs7QUFHQTtBQUNBLE1BQUksQ0FBQ0QsaUJBQWlCQSxpQkFBaUJFLE1BQWpCLEdBQTBCLENBQTNDLENBQUwsRUFBb0Q7QUFDbERGLHFCQUFpQkcsR0FBakI7QUFDRDs7QUFFRDtBQUNBLE9BQUssSUFBSUMsSUFBSSxDQUFiLEVBQWdCQSxJQUFJSixpQkFBaUJFLE1BQXJDLEVBQTZDRSxHQUE3QyxFQUFrRDtBQUNoRCxRQUFJQyxPQUFPTCxpQkFBaUJJLENBQWpCLENBQVg7O0FBRUEsUUFBSUEsSUFBSSxDQUFKLElBQVMsQ0FBQyxLQUFLRSxPQUFMLENBQWFDLGNBQTNCLEVBQTJDO0FBQ3pDUixlQUFTQSxTQUFTRyxNQUFULEdBQWtCLENBQTNCLEtBQWlDRyxJQUFqQztBQUNELEtBRkQsTUFFTztBQUNMLFVBQUksS0FBS0MsT0FBTCxDQUFhRSxnQkFBakIsRUFBbUM7QUFDakNILGVBQU9BLEtBQUtJLElBQUwsRUFBUDtBQUNEO0FBQ0RWLGVBQVNXLElBQVQsQ0FBY0wsSUFBZDtBQUNEO0FBQ0Y7O0FBRUQsU0FBT04sUUFBUDtBQUNELENBeEJEOztBQTBCTyxTQUFTTCxTQUFULENBQW1CaUIsTUFBbkIsRUFBMkJDLE1BQTNCLEVBQW1DQyxRQUFuQyxFQUE2QztBQUFFLFNBQU9qQixTQUFTa0IsSUFBVCxDQUFjSCxNQUFkLEVBQXNCQyxNQUF0QixFQUE4QkMsUUFBOUIsQ0FBUDtBQUFpRDtBQUNoRyxTQUFTbEIsZ0JBQVQsQ0FBMEJnQixNQUExQixFQUFrQ0MsTUFBbEMsRUFBMENDLFFBQTFDLEVBQW9EO0FBQ3pELE1BQUlQLFVBQVUsOEVBQWdCTyxRQUFoQixFQUEwQixFQUFDTCxrQkFBa0IsSUFBbkIsRUFBMUIsQ0FBZDtBQUNBLFNBQU9aLFNBQVNrQixJQUFULENBQWNILE1BQWQsRUFBc0JDLE1BQXRCLEVBQThCTixPQUE5QixDQUFQO0FBQ0QiLCJmaWxlIjoibGluZS5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBEaWZmIGZyb20gJy4vYmFzZSc7XG5pbXBvcnQge2dlbmVyYXRlT3B0aW9uc30gZnJvbSAnLi4vdXRpbC9wYXJhbXMnO1xuXG5leHBvcnQgY29uc3QgbGluZURpZmYgPSBuZXcgRGlmZigpO1xubGluZURpZmYudG9rZW5pemUgPSBmdW5jdGlvbih2YWx1ZSkge1xuICBsZXQgcmV0TGluZXMgPSBbXSxcbiAgICAgIGxpbmVzQW5kTmV3bGluZXMgPSB2YWx1ZS5zcGxpdCgvKFxcbnxcXHJcXG4pLyk7XG5cbiAgLy8gSWdub3JlIHRoZSBmaW5hbCBlbXB0eSB0b2tlbiB0aGF0IG9jY3VycyBpZiB0aGUgc3RyaW5nIGVuZHMgd2l0aCBhIG5ldyBsaW5lXG4gIGlmICghbGluZXNBbmROZXdsaW5lc1tsaW5lc0FuZE5ld2xpbmVzLmxlbmd0aCAtIDFdKSB7XG4gICAgbGluZXNBbmROZXdsaW5lcy5wb3AoKTtcbiAgfVxuXG4gIC8vIE1lcmdlIHRoZSBjb250ZW50IGFuZCBsaW5lIHNlcGFyYXRvcnMgaW50byBzaW5nbGUgdG9rZW5zXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZXNBbmROZXdsaW5lcy5sZW5ndGg7IGkrKykge1xuICAgIGxldCBsaW5lID0gbGluZXNBbmROZXdsaW5lc1tpXTtcblxuICAgIGlmIChpICUgMiAmJiAhdGhpcy5vcHRpb25zLm5ld2xpbmVJc1Rva2VuKSB7XG4gICAgICByZXRMaW5lc1tyZXRMaW5lcy5sZW5ndGggLSAxXSArPSBsaW5lO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5vcHRpb25zLmlnbm9yZVdoaXRlc3BhY2UpIHtcbiAgICAgICAgbGluZSA9IGxpbmUudHJpbSgpO1xuICAgICAgfVxuICAgICAgcmV0TGluZXMucHVzaChsaW5lKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmV0TGluZXM7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gZGlmZkxpbmVzKG9sZFN0ciwgbmV3U3RyLCBjYWxsYmFjaykgeyByZXR1cm4gbGluZURpZmYuZGlmZihvbGRTdHIsIG5ld1N0ciwgY2FsbGJhY2spOyB9XG5leHBvcnQgZnVuY3Rpb24gZGlmZlRyaW1tZWRMaW5lcyhvbGRTdHIsIG5ld1N0ciwgY2FsbGJhY2spIHtcbiAgbGV0IG9wdGlvbnMgPSBnZW5lcmF0ZU9wdGlvbnMoY2FsbGJhY2ssIHtpZ25vcmVXaGl0ZXNwYWNlOiB0cnVlfSk7XG4gIHJldHVybiBsaW5lRGlmZi5kaWZmKG9sZFN0ciwgbmV3U3RyLCBvcHRpb25zKTtcbn1cbiJdfQ==


/***/ }),
/* 6 */
/***/ (function(module, exports, __webpack_require__) {

	/*istanbul ignore start*/'use strict';

	exports.__esModule = true;
	exports.sentenceDiff = undefined;
	exports. /*istanbul ignore end*/diffSentences = diffSentences;

	var /*istanbul ignore start*/_base = __webpack_require__(1) /*istanbul ignore end*/;

	/*istanbul ignore start*/var _base2 = _interopRequireDefault(_base);

	function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }

	/*istanbul ignore end*/var sentenceDiff = /*istanbul ignore start*/exports. /*istanbul ignore end*/sentenceDiff = new /*istanbul ignore start*/_base2['default'] /*istanbul ignore end*/();
	sentenceDiff.tokenize = function (value) {
	  return value.split(/(\S.+?[.!?])(?=\s+|$)/);
	};

	function diffSentences(oldStr, newStr, callback) {
	  return sentenceDiff.diff(oldStr, newStr, callback);
	}
	//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kaWZmL3NlbnRlbmNlLmpzIl0sIm5hbWVzIjpbImRpZmZTZW50ZW5jZXMiLCJzZW50ZW5jZURpZmYiLCJ0b2tlbml6ZSIsInZhbHVlIiwic3BsaXQiLCJvbGRTdHIiLCJuZXdTdHIiLCJjYWxsYmFjayIsImRpZmYiXSwibWFwcGluZ3MiOiI7Ozs7Z0NBUWdCQSxhLEdBQUFBLGE7O0FBUmhCOzs7Ozs7dUJBR08sSUFBTUMsdUZBQWUsd0VBQXJCO0FBQ1BBLGFBQWFDLFFBQWIsR0FBd0IsVUFBU0MsS0FBVCxFQUFnQjtBQUN0QyxTQUFPQSxNQUFNQyxLQUFOLENBQVksdUJBQVosQ0FBUDtBQUNELENBRkQ7O0FBSU8sU0FBU0osYUFBVCxDQUF1QkssTUFBdkIsRUFBK0JDLE1BQS9CLEVBQXVDQyxRQUF2QyxFQUFpRDtBQUFFLFNBQU9OLGFBQWFPLElBQWIsQ0FBa0JILE1BQWxCLEVBQTBCQyxNQUExQixFQUFrQ0MsUUFBbEMsQ0FBUDtBQUFxRCIsImZpbGUiOiJzZW50ZW5jZS5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBEaWZmIGZyb20gJy4vYmFzZSc7XG5cblxuZXhwb3J0IGNvbnN0IHNlbnRlbmNlRGlmZiA9IG5ldyBEaWZmKCk7XG5zZW50ZW5jZURpZmYudG9rZW5pemUgPSBmdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUuc3BsaXQoLyhcXFMuKz9bLiE/XSkoPz1cXHMrfCQpLyk7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gZGlmZlNlbnRlbmNlcyhvbGRTdHIsIG5ld1N0ciwgY2FsbGJhY2spIHsgcmV0dXJuIHNlbnRlbmNlRGlmZi5kaWZmKG9sZFN0ciwgbmV3U3RyLCBjYWxsYmFjayk7IH1cbiJdfQ==


/***/ }),
/* 7 */
/***/ (function(module, exports, __webpack_require__) {

	/*istanbul ignore start*/'use strict';

	exports.__esModule = true;
	exports.cssDiff = undefined;
	exports. /*istanbul ignore end*/diffCss = diffCss;

	var /*istanbul ignore start*/_base = __webpack_require__(1) /*istanbul ignore end*/;

	/*istanbul ignore start*/var _base2 = _interopRequireDefault(_base);

	function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }

	/*istanbul ignore end*/var cssDiff = /*istanbul ignore start*/exports. /*istanbul ignore end*/cssDiff = new /*istanbul ignore start*/_base2['default'] /*istanbul ignore end*/();
	cssDiff.tokenize = function (value) {
	  return value.split(/([{}:;,]|\s+)/);
	};

	function diffCss(oldStr, newStr, callback) {
	  return cssDiff.diff(oldStr, newStr, callback);
	}
	//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kaWZmL2Nzcy5qcyJdLCJuYW1lcyI6WyJkaWZmQ3NzIiwiY3NzRGlmZiIsInRva2VuaXplIiwidmFsdWUiLCJzcGxpdCIsIm9sZFN0ciIsIm5ld1N0ciIsImNhbGxiYWNrIiwiZGlmZiJdLCJtYXBwaW5ncyI6Ijs7OztnQ0FPZ0JBLE8sR0FBQUEsTzs7QUFQaEI7Ozs7Ozt1QkFFTyxJQUFNQyw2RUFBVSx3RUFBaEI7QUFDUEEsUUFBUUMsUUFBUixHQUFtQixVQUFTQyxLQUFULEVBQWdCO0FBQ2pDLFNBQU9BLE1BQU1DLEtBQU4sQ0FBWSxlQUFaLENBQVA7QUFDRCxDQUZEOztBQUlPLFNBQVNKLE9BQVQsQ0FBaUJLLE1BQWpCLEVBQXlCQyxNQUF6QixFQUFpQ0MsUUFBakMsRUFBMkM7QUFBRSxTQUFPTixRQUFRTyxJQUFSLENBQWFILE1BQWIsRUFBcUJDLE1BQXJCLEVBQTZCQyxRQUE3QixDQUFQO0FBQWdEIiwiZmlsZSI6ImNzcy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBEaWZmIGZyb20gJy4vYmFzZSc7XG5cbmV4cG9ydCBjb25zdCBjc3NEaWZmID0gbmV3IERpZmYoKTtcbmNzc0RpZmYudG9rZW5pemUgPSBmdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUuc3BsaXQoLyhbe306OyxdfFxccyspLyk7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gZGlmZkNzcyhvbGRTdHIsIG5ld1N0ciwgY2FsbGJhY2spIHsgcmV0dXJuIGNzc0RpZmYuZGlmZihvbGRTdHIsIG5ld1N0ciwgY2FsbGJhY2spOyB9XG4iXX0=


/***/ }),
/* 8 */
/***/ (function(module, exports, __webpack_require__) {

	/*istanbul ignore start*/'use strict';

	exports.__esModule = true;
	exports.jsonDiff = undefined;

	var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };

	exports. /*istanbul ignore end*/diffJson = diffJson;
	/*istanbul ignore start*/exports. /*istanbul ignore end*/canonicalize = canonicalize;

	var /*istanbul ignore start*/_base = __webpack_require__(1) /*istanbul ignore end*/;

	/*istanbul ignore start*/var _base2 = _interopRequireDefault(_base);

	/*istanbul ignore end*/var /*istanbul ignore start*/_line = __webpack_require__(5) /*istanbul ignore end*/;

	/*istanbul ignore start*/function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }

	/*istanbul ignore end*/var objectPrototypeToString = Object.prototype.toString;

	var jsonDiff = /*istanbul ignore start*/exports. /*istanbul ignore end*/jsonDiff = new /*istanbul ignore start*/_base2['default'] /*istanbul ignore end*/();
	// Discriminate between two lines of pretty-printed, serialized JSON where one of them has a
	// dangling comma and the other doesn't. Turns out including the dangling comma yields the nicest output:
	jsonDiff.useLongestToken = true;

	jsonDiff.tokenize = /*istanbul ignore start*/_line.lineDiff /*istanbul ignore end*/.tokenize;
	jsonDiff.castInput = function (value) {
	  /*istanbul ignore start*/var _options = /*istanbul ignore end*/this.options,
	      undefinedReplacement = _options.undefinedReplacement,
	      _options$stringifyRep = _options.stringifyReplacer,
	      stringifyReplacer = _options$stringifyRep === undefined ? function (k, v) /*istanbul ignore start*/{
	    return (/*istanbul ignore end*/typeof v === 'undefined' ? undefinedReplacement : v
	    );
	  } : _options$stringifyRep;


	  return typeof value === 'string' ? value : JSON.stringify(canonicalize(value, null, null, stringifyReplacer), stringifyReplacer, '  ');
	};
	jsonDiff.equals = function (left, right) {
	  return (/*istanbul ignore start*/_base2['default'] /*istanbul ignore end*/.prototype.equals.call(jsonDiff, left.replace(/,([\r\n])/g, '$1'), right.replace(/,([\r\n])/g, '$1'))
	  );
	};

	function diffJson(oldObj, newObj, options) {
	  return jsonDiff.diff(oldObj, newObj, options);
	}

	// This function handles the presence of circular references by bailing out when encountering an
	// object that is already on the "stack" of items being processed. Accepts an optional replacer
	function canonicalize(obj, stack, replacementStack, replacer, key) {
	  stack = stack || [];
	  replacementStack = replacementStack || [];

	  if (replacer) {
	    obj = replacer(key, obj);
	  }

	  var i = /*istanbul ignore start*/void 0 /*istanbul ignore end*/;

	  for (i = 0; i < stack.length; i += 1) {
	    if (stack[i] === obj) {
	      return replacementStack[i];
	    }
	  }

	  var canonicalizedObj = /*istanbul ignore start*/void 0 /*istanbul ignore end*/;

	  if ('[object Array]' === objectPrototypeToString.call(obj)) {
	    stack.push(obj);
	    canonicalizedObj = new Array(obj.length);
	    replacementStack.push(canonicalizedObj);
	    for (i = 0; i < obj.length; i += 1) {
	      canonicalizedObj[i] = canonicalize(obj[i], stack, replacementStack, replacer, key);
	    }
	    stack.pop();
	    replacementStack.pop();
	    return canonicalizedObj;
	  }

	  if (obj && obj.toJSON) {
	    obj = obj.toJSON();
	  }

	  if ( /*istanbul ignore start*/(typeof /*istanbul ignore end*/obj === 'undefined' ? 'undefined' : _typeof(obj)) === 'object' && obj !== null) {
	    stack.push(obj);
	    canonicalizedObj = {};
	    replacementStack.push(canonicalizedObj);
	    var sortedKeys = [],
	        _key = /*istanbul ignore start*/void 0 /*istanbul ignore end*/;
	    for (_key in obj) {
	      /* istanbul ignore else */
	      if (obj.hasOwnProperty(_key)) {
	        sortedKeys.push(_key);
	      }
	    }
	    sortedKeys.sort();
	    for (i = 0; i < sortedKeys.length; i += 1) {
	      _key = sortedKeys[i];
	      canonicalizedObj[_key] = canonicalize(obj[_key], stack, replacementStack, replacer, _key);
	    }
	    stack.pop();
	    replacementStack.pop();
	  } else {
	    canonicalizedObj = obj;
	  }
	  return canonicalizedObj;
	}
	//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kaWZmL2pzb24uanMiXSwibmFtZXMiOlsiZGlmZkpzb24iLCJjYW5vbmljYWxpemUiLCJvYmplY3RQcm90b3R5cGVUb1N0cmluZyIsIk9iamVjdCIsInByb3RvdHlwZSIsInRvU3RyaW5nIiwianNvbkRpZmYiLCJ1c2VMb25nZXN0VG9rZW4iLCJ0b2tlbml6ZSIsImNhc3RJbnB1dCIsInZhbHVlIiwib3B0aW9ucyIsInVuZGVmaW5lZFJlcGxhY2VtZW50Iiwic3RyaW5naWZ5UmVwbGFjZXIiLCJrIiwidiIsIkpTT04iLCJzdHJpbmdpZnkiLCJlcXVhbHMiLCJsZWZ0IiwicmlnaHQiLCJjYWxsIiwicmVwbGFjZSIsIm9sZE9iaiIsIm5ld09iaiIsImRpZmYiLCJvYmoiLCJzdGFjayIsInJlcGxhY2VtZW50U3RhY2siLCJyZXBsYWNlciIsImtleSIsImkiLCJsZW5ndGgiLCJjYW5vbmljYWxpemVkT2JqIiwicHVzaCIsIkFycmF5IiwicG9wIiwidG9KU09OIiwic29ydGVkS2V5cyIsImhhc093blByb3BlcnR5Iiwic29ydCJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztnQ0FxQmdCQSxRLEdBQUFBLFE7eURBSUFDLFksR0FBQUEsWTs7QUF6QmhCOzs7O3VCQUNBOzs7O3VCQUVBLElBQU1DLDBCQUEwQkMsT0FBT0MsU0FBUCxDQUFpQkMsUUFBakQ7O0FBR08sSUFBTUMsK0VBQVcsd0VBQWpCO0FBQ1A7QUFDQTtBQUNBQSxTQUFTQyxlQUFULEdBQTJCLElBQTNCOztBQUVBRCxTQUFTRSxRQUFULEdBQW9CLGdFQUFTQSxRQUE3QjtBQUNBRixTQUFTRyxTQUFULEdBQXFCLFVBQVNDLEtBQVQsRUFBZ0I7QUFBQSxpRUFDK0UsS0FBS0MsT0FEcEY7QUFBQSxNQUM1QkMsb0JBRDRCLFlBQzVCQSxvQkFENEI7QUFBQSx1Q0FDTkMsaUJBRE07QUFBQSxNQUNOQSxpQkFETSx5Q0FDYyxVQUFDQyxDQUFELEVBQUlDLENBQUo7QUFBQSxtQ0FBVSxPQUFPQSxDQUFQ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QUFLVCxJQUFJLENBQVQsRUFBWUEsSUFBSU8sV0FBV04sTUFBM0IsRUFBbUNELEtBQUssQ0FBeEMsRUFBMkM7QUFDekNELGFBQU1RLFdBQVdQLENBQVgsQ0FBTjtBQUNBRSx1QkFBaUJILElBQWpCLElBQXdCN0IsYUFBYXlCLElBQUlJLElBQUosQ0FBYixFQUF1QkgsS0FBdkIsRUFBOEJDLGdCQUE5QixFQUFnREMsUUFBaEQsRUFBMERDLElBQTFELENBQXhCO0FBQ0Q7QUFDREgsVUFBTVMsR0FBTjtBQUNBUixxQkFBaUJRLEdBQWpCO0FBQ0QsR0FuQkQsTUFtQk87QUFDTEgsdUJBQW1CUCxHQUFuQjtBQUNEO0FBQ0QsU0FBT08sZ0JBQVA7QUFDRCIsImZpbGUiOiJqc29uLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IERpZmYgZnJvbSAnLi9iYXNlJztcbmltcG9ydCB7bGluZURpZmZ9IGZyb20gJy4vbGluZSc7XG5cbmNvbnN0IG9iamVjdFByb3RvdHlwZVRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcblxuXG5leHBvcnQgY29uc3QganNvbkRpZmYgPSBuZXcgRGlmZigpO1xuLy8gRGlzY3JpbWluYXRlIGJldHdlZW4gdHdvIGxpbmVzIG9mIHByZXR0eS1wcmludGVkLCBzZXJpYWxpemVkIEpTT04gd2hlcmUgb25lIG9mIHRoZW0gaGFzIGFcbi8vIGRhbmdsaW5nIGNvbW1hIGFuZCB0aGUgb3RoZXIgZG9lc24ndC4gVHVybnMgb3V0IGluY2x1ZGluZyB0aGUgZGFuZ2xpbmcgY29tbWEgeWllbGRzIHRoZSBuaWNlc3Qgb3V0cHV0OlxuanNvbkRpZmYudXNlTG9uZ2VzdFRva2VuID0gdHJ1ZTtcblxuanNvbkRpZmYudG9rZW5pemUgPSBsaW5lRGlmZi50b2tlbml6ZTtcbmpzb25EaWZmLmNhc3RJbnB1dCA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIGNvbnN0IHt1bmRlZmluZWRSZXBsYWNlbWVudCwgc3RyaW5naWZ5UmVwbGFjZXIgPSAoaywgdikgPT4gdHlwZW9mIHYgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkUmVwbGFjZW1lbnQgOiB2fSA9IHRoaXMub3B0aW9ucztcblxuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IHZhbHVlIDogSlNPTi5zdHJpbmdpZnkoY2Fub25pY2FsaXplKHZhbHVlLCBudWxsLCBudWxsLCBzdHJpbmdpZnlSZXBsYWNlciksIHN0cmluZ2lmeVJlcGxhY2VyLCAnICAnKTtcbn07XG5qc29uRGlmZi5lcXVhbHMgPSBmdW5jdGlvbihsZWZ0LCByaWdodCkge1xuICByZXR1cm4gRGlmZi5wcm90b3R5cGUuZXF1YWxzLmNhbGwoanNvbkRpZmYsIGxlZnQucmVwbGFjZSgvLChbXFxyXFxuXSkvZywgJyQxJyksIHJpZ2h0LnJlcGxhY2UoLywoW1xcclxcbl0pL2csICckMScpKTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBkaWZmSnNvbihvbGRPYmosIG5ld09iaiwgb3B0aW9ucykgeyByZXR1cm4ganNvbkRpZmYuZGlmZihvbGRPYmosIG5ld09iaiwgb3B0aW9ucyk7IH1cblxuLy8gVGhpcyBmdW5jdGlvbiBoYW5kbGVzIHRoZSBwcmVzZW5jZSBvZiBjaXJjdWxhciByZWZlcmVuY2VzIGJ5IGJhaWxpbmcgb3V0IHdoZW4gZW5jb3VudGVyaW5nIGFuXG4vLyBvYmplY3QgdGhhdCBpcyBhbHJlYWR5IG9uIHRoZSBcInN0YWNrXCIgb2YgaXRlbXMgYmVpbmcgcHJvY2Vzc2VkLiBBY2NlcHRzIGFuIG9wdGlvbmFsIHJlcGxhY2VyXG5leHBvcnQgZnVuY3Rpb24gY2Fub25pY2FsaXplKG9iaiwgc3RhY2ssIHJlcGxhY2VtZW50U3RhY2ssIHJlcGxhY2VyLCBrZXkpIHtcbiAgc3RhY2sgPSBzdGFjayB8fCBbXTtcbiAgcmVwbGFjZW1lbnRTdGFjayA9IHJlcGxhY2VtZW50U3RhY2sgfHwgW107XG5cbiAgaWYgKHJlcGxhY2VyKSB7XG4gICAgb2JqID0gcmVwbGFjZXIoa2V5LCBvYmopO1xuICB9XG5cbiAgbGV0IGk7XG5cbiAgZm9yIChpID0gMDsgaSA8IHN0YWNrLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgaWYgKHN0YWNrW2ldID09PSBvYmopIHtcbiAgICAgIHJldHVybiByZXBsYWNlbWVudFN0YWNrW2ldO1xuICAgIH1cbiAgfVxuXG4gIGxldCBjYW5vbmljYWxpemVkT2JqO1xuXG4gIGlmICgnW29iamVjdCBBcnJheV0nID09PSBvYmplY3RQcm90b3R5cGVUb1N0cmluZy5jYWxsKG9iaikpIHtcbiAgICBzdGFjay5wdXNoKG9iaik7XG4gICAgY2Fub25pY2FsaXplZE9iaiA9IG5ldyBBcnJheShvYmoubGVuZ3RoKTtcbiAgICByZXBsYWNlbWVudFN0YWNrLnB1c2goY2Fub25pY2FsaXplZE9iaik7XG4gICAgZm9yIChpID0gMDsgaSA8IG9iai5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgY2Fub25pY2FsaXplZE9ialtpXSA9IGNhbm9uaWNhbGl6ZShvYmpbaV0sIHN0YWNrLCByZXBsYWNlbWVudFN0YWNrLCByZXBsYWNlciwga2V5KTtcbiAgICB9XG4gICAgc3RhY2sucG9wKCk7XG4gICAgcmVwbGFjZW1lbnRTdGFjay5wb3AoKTtcbiAgICByZXR1cm4gY2Fub25pY2FsaXplZE9iajtcbiAgfVxuXG4gIGlmIChvYmogJiYgb2JqLnRvSlNPTikge1xuICAgIG9iaiA9IG9iai50b0pTT04oKTtcbiAgfVxuXG4gIGlmICh0eXBlb2Ygb2JqID09PSAnb2JqZWN0JyAmJiBvYmogIT09IG51bGwpIHtcbiAgICBzdGFjay5wdXNoKG9iaik7XG4gICAgY2Fub25pY2FsaXplZE9iaiA9IHt9O1xuICAgIHJlcGxhY2VtZW50U3RhY2sucHVzaChjYW5vbmljYWxpemVkT2JqKTtcbiAgICBsZXQgc29ydGVkS2V5cyA9IFtdLFxuICAgICAgICBrZXk7XG4gICAgZm9yIChrZXkgaW4gb2JqKSB7XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgIHNvcnRlZEtleXMucHVzaChrZXkpO1xuICAgICAgfVxuICAgIH1cbiAgICBzb3J0ZWRLZXlzLnNvcnQoKTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgc29ydGVkS2V5cy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAga2V5ID0gc29ydGVkS2V5c1tpXTtcbiAgICAgIGNhbm9uaWNhbGl6ZWRPYmpba2V5XSA9IGNhbm9uaWNhbGl6ZShvYmpba2V5XSwgc3RhY2ssIHJlcGxhY2VtZW50U3RhY2ssIHJlcGxhY2VyLCBrZXkpO1xuICAgIH1cbiAgICBzdGFjay5wb3AoKTtcbiAgICByZXBsYWNlbWVudFN0YWNrLnBvcCgpO1xuICB9IGVsc2Uge1xuICAgIGNhbm9uaWNhbGl6ZWRPYmogPSBvYmo7XG4gIH1cbiAgcmV0dXJuIGNhbm9uaWNhbGl6ZWRPYmo7XG59XG4iXX0=


/***/ }),
/* 9 */
/***/ (function(module, exports, __webpack_require__) {

	/*istanbul ignore start*/'use strict';

	exports.__esModule = true;
	exports.arrayDiff = undefined;
	exports. /*istanbul ignore end*/diffArrays = diffArrays;

	var /*istanbul ignore start*/_base = __webpack_require__(1) /*istanbul ignore end*/;

	/*istanbul ignore start*/var _base2 = _interopRequireDefault(_base);

	function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }

	/*istanbul ignore end*/var arrayDiff = /*istanbul ignore start*/exports. /*istanbul ignore end*/arrayDiff = new /*istanbul ignore start*/_base2['default'] /*istanbul ignore end*/();
	arrayDiff.tokenize = function (value) {
	  return value.slice();
	};
	arrayDiff.join = arrayDiff.removeEmpty = function (value) {
	  return value;
	};

	function diffArrays(oldArr, newArr, callback) {
	  return arrayDiff.diff(oldArr, newArr, callback);
	}
	//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kaWZmL2FycmF5LmpzIl0sIm5hbWVzIjpbImRpZmZBcnJheXMiLCJhcnJheURpZmYiLCJ0b2tlbml6ZSIsInZhbHVlIiwic2xpY2UiLCJqb2luIiwicmVtb3ZlRW1wdHkiLCJvbGRBcnIiLCJuZXdBcnIiLCJjYWxsYmFjayIsImRpZmYiXSwibWFwcGluZ3MiOiI7Ozs7Z0NBVWdCQSxVLEdBQUFBLFU7O0FBVmhCOzs7Ozs7dUJBRU8sSUFBTUMsaUZBQVksd0VBQWxCO0FBQ1BBLFVBQVVDLFFBQVYsR0FBcUIsVUFBU0MsS0FBVCxFQUFnQjtBQUNuQyxTQUFPQSxNQUFNQyxLQUFOLEVBQVA7QUFDRCxDQUZEO0FBR0FILFVBQVVJLElBQVYsR0FBaUJKLFVBQVVLLFdBQVYsR0FBd0IsVUFBU0gsS0FBVCxFQUFnQjtBQUN2RCxTQUFPQSxLQUFQO0FBQ0QsQ0FGRDs7QUFJTyxTQUFTSCxVQUFULENBQW9CTyxNQUFwQixFQUE0QkMsTUFBNUIsRUFBb0NDLFFBQXBDLEVBQThDO0FBQUUsU0FBT1IsVUFBVVMsSUFBVixDQUFlSCxNQUFmLEVBQXVCQyxNQUF2QixFQUErQkMsUUFBL0IsQ0FBUDtBQUFrRCIsImZpbGUiOiJhcnJheS5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBEaWZmIGZyb20gJy4vYmFzZSc7XG5cbmV4cG9ydCBjb25zdCBhcnJheURpZmYgPSBuZXcgRGlmZigpO1xuYXJyYXlEaWZmLnRva2VuaXplID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlLnNsaWNlKCk7XG59O1xuYXJyYXlEaWZmLmpvaW4gPSBhcnJheURpZmYucmVtb3ZlRW1wdHkgPSBmdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4gdmFsdWU7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gZGlmZkFycmF5cyhvbGRBcnIsIG5ld0FyciwgY2FsbGJhY2spIHsgcmV0dXJuIGFycmF5RGlmZi5kaWZmKG9sZEFyciwgbmV3QXJyLCBjYWxsYmFjayk7IH1cbiJdfQ==


/***/ }),
/* 10 */
/***/ (function(module, exports, __webpack_require__) {

	/*istanbul ignore start*/'use strict';

	exports.__esModule = true;
	exports. /*istanbul ignore end*/applyPatch = applyPatch;
	/*istanbul ignore start*/exports. /*istanbul ignore end*/applyPatches = applyPatches;

	var /*istanbul ignore start*/_parse = __webpack_require__(11) /*istanbul ignore end*/;

	var /*istanbul ignore start*/_distanceIterator = __webpack_require__(12) /*istanbul ignore end*/;

	/*istanbul ignore start*/var _distanceIterator2 = _interopRequireDefault(_distanceIterator);

	function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }

	/*istanbul ignore end*/function applyPatch(source, uniDiff) {
	  /*istanbul ignore start*/var /*istanbul ignore end*/options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};

	  if (typeof uniDiff === 'string') {
	    uniDiff = /*istanbul ignore start*/(0, _parse.parsePatch) /*istanbul ignore end*/(uniDiff);
	  }

	  if (Array.isArray(uniDiff)) {
	    if (uniDiff.length > 1) {
	      throw new Error('applyPatch only works with a single input.');
	    }

	    uniDiff = uniDiff[0];
	  }

	  // Apply the diff to the input
	  var lines = source.split(/\r\n|[\n\v\f\r\x85]/),
	      delimiters = source.match(/\r\n|[\n\v\f\r\x85]/g) || [],
	      hunks = uniDiff.hunks,
	      compareLine = options.compareLine || function (lineNumber, line, operation, patchContent) /*istanbul ignore start*/{
	    return (/*istanbul ignore end*/line === patchContent
	    );
	  },
	      errorCount = 0,
	      fuzzFactor = options.fuzzFactor || 0,
	      minLine = 0,
	      offset = 0,
	      removeEOFNL = /*istanbul ignore start*/void 0 /*istanbul ignore end*/,
	      addEOFNL = /*istanbul ignore start*/void 0 /*istanbul ignore end*/;

	  /**
	   * Checks if the hunk exactly fits on the provided location
	   */
	  function hunkFits(hunk, toPos) {
	    for (var j = 0; j < hunk.lines.length; j++) {
	      var line = hunk.lines[j],
	          operation = line.length > 0 ? line[0] : ' ',
	          content = line.length > 0 ? line.substr(1) : line;

	      if (operation === ' ' || operation === '-') {
	        // Context sanity check
	        if (!compareLine(toPos + 1, lines[toPos], operation, content)) {
	          errorCount++;

	          if (errorCount > fuzzFactor) {
	            return false;
	          }
	        }
	        toPos++;
	      }
	    }

	    return true;
	  }

	  // Search best fit offsets for each hunk based on the previous ones
	  for (var i = 0; i < hunks.length; i++) {
	    var hunk = hunks[i],
	        maxLine = lines.length - hunk.oldLines,
	        localOffset = 0,
	        toPos = offset + hunk.oldStart - 1;

	    var iterator = /*istanbul ignore start*/(0, _distanceIterator2['default']) /*istanbul ignore end*/(toPos, minLine, maxLine);

	    for (; localOffset !== undefined; localOffset = iterator()) {
	      if (hunkFits(hunk, toPos + localOffset)) {
	        hunk.offset = offset += localOffset;
	        break;
	      }
	    }

	    if (localOffset === undefined) {
	      return false;
	    }

	    // Set lower text limit to end of the current hunk, so next ones don't try
	    // to fit over already patched text
	    minLine = hunk.offset + hunk.oldStart + hunk.oldLines;
	  }

	  // Apply patch hunks
	  var diffOffset = 0;
	  for (var _i = 0; _i < hunks.length; _i++) {
	    var _hunk = hunks[_i],
	        _toPos = _hunk.oldStart + _hunk.offset + diffOffset - 1;
	    diffOffset += _hunk.newLines - _hunk.oldLines;

	    if (_toPos < 0) {
	      // Creating a new file
	      _toPos = 0;
	    }

	    for (var j = 0; j < _hunk.lines.length; j++) {
	      var line = _hunk.lines[j],
	          operation = line.length > 0 ? line[0] : ' ',
	          content = line.length > 0 ? line.substr(1) : line,
	          delimiter = _hunk.linedelimiters[j];

	      if (operation === ' ') {
	        _toPos++;
	      } else if (operation === '-') {
	        lines.splice(_toPos, 1);
	        delimiters.splice(_toPos, 1);
	        /* istanbul ignore else */
	      } else if (operation === '+') {
	        lines.splice(_toPos, 0, content);
	        delimiters.splice(_toPos, 0, delimiter);
	        _toPos++;
	      } else if (operation === '\\') {
	        var previousOperation = _hunk.lines[j - 1] ? _hunk.lines[j - 1][0] : null;
	        if (previousOperation === '+') {
	          removeEOFNL = true;
	        } else if (previousOperation === '-') {
	          addEOFNL = true;
	        }
	      }
	    }
	  }

	  // Handle EOFNL insertion/removal
	  if (removeEOFNL) {
	    while (!lines[lines.length - 1]) {
	      lines.pop();
	      delimiters.pop();
	    }
	  } else if (addEOFNL) {
	    lines.push('');
	    delimiters.push('\n');
	  }
	  for (var _k = 0; _k < lines.length - 1; _k++) {
	    lines[_k] = lines[_k] + delimiters[_k];
	  }
	  return lines.join('');
	}

	// Wrapper that supports multiple file patches via callbacks.
	function applyPatches(uniDiff, options) {
	  if (typeof uniDiff === 'string') {
	    uniDiff = /*istanbul ignore start*/(0, _parse.parsePatch) /*istanbul ignore end*/(uniDiff);
	  }

	  var currentIndex = 0;
	  function processIndex() {
	    var index = uniDiff[currentIndex++];
	    if (!index) {
	      return options.complete();
	    }

	    options.loadFile(index, function (err, data) {
	      if (err) {
	        return options.complete(err);
	      }

	      var updatedContent = applyPatch(data, index, options);
	      options.patched(index, updatedContent, function (err) {
	        if (err) {
	          return options.complete(err);
	        }

	        processIndex();
	      });
	    });
	  }
	  processIndex();
	}
	//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wYXRjaC9hcHBseS5qcyJdLCJuYW1lcyI6WyJhcHBseVBhdGNoIiwiYXBwbHlQYXRjaGVzIiwic291cmNlIiwidW5pRGlmZiIsIm9wdGlvbnMiLCJBcnJheSIsImlzQXJyYXkiLCJsZW5ndGgiLCJFcnJvciIsImxpbmVzIiwic3BsaXQiLCJkZWxpbWl0ZXJzIiwibWF0Y2giLCJodW5rcyIsImNvbXBhcmVMaW5lIiwibGluZU51bWJlciIsImxpbmUiLCJvcGVyYXRpb24iLCJwYXRjaENvbnRlbnQiLCJlcnJvckNvdW50IiwiZnV6ekZhY3RvciIsIm1pbkxpbmUiLCJvZmZzZXQiLCJyZW1vdmVFT0ZOTCIsImFkZEVPRk5MIiwiaHVua0ZpdHMiLCJodW5rIiwidG9Qb3MiLCJqIiwiY29udGVudCIsInN1YnN0ciIsImkiLCJtYXhMaW5lIiwib2xkTGluZXMiLCJsb2NhbE9mZnNldCIsIm9sZFN0YXJ0IiwiaXRlcmF0b3IiLCJ1bmRlZmluZWQiLCJkaWZmT2Zmc2V0IiwibmV3TGluZXMiLCJkZWxpbWl0ZXIiLCJsaW5lZGVsaW1pdGVycyIsInNwbGljZSIsInByZXZpb3VzT3BlcmF0aW9uIiwicG9wIiwicHVzaCIsIl9rIiwiam9pbiIsImN1cnJlbnRJbmRleCIsInByb2Nlc3NJbmRleCIsImluZGV4IiwiY29tcGxldGUiLCJsb2FkRmlsZSIsImVyciIsImRhdGEiLCJ1cGRhdGVkQ29udGVudCIsInBhdGNoZWQiXSwibWFwcGluZ3MiOiI7OztnQ0FHZ0JBLFUsR0FBQUEsVTt5REFvSUFDLFksR0FBQUEsWTs7QUF2SWhCOztBQUNBOzs7Ozs7dUJBRU8sU0FBU0QsVUFBVCxDQUFvQkUsTUFBcEIsRUFBNEJDLE9BQTVCLEVBQW1EO0FBQUEsc0RBQWRDLE9BQWMsdUVBQUosRUFBSTs7QUFDeEQsTUFBSSxPQUFPRCxPQUFQLEtBQW1CLFFBQXZCLEVBQWlDO0FBQy9CQSxjQUFVLHdFQUFXQSxPQUFYLENBQVY7QUFDRDs7QUFFRCxNQUFJRSxNQUFNQyxP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QUFZO0FBQ1YsYUFBTzlDLFFBQVErQyxRQUFSLEVBQVA7QUFDRDs7QUFFRC9DLFlBQVFnRCxRQUFSLENBQWlCRixLQUFqQixFQUF3QixVQUFTRyxHQUFULEVBQWNDLElBQWQsRUFBb0I7QUFDMUMsVUFBSUQsR0FBSixFQUFTO0FBQ1AsZUFBT2pELFFBQVErQyxRQUFSLENBQWlCRSxHQUFqQixDQUFQO0FBQ0Q7O0FBRUQsVUFBSUUsaUJBQWlCdkQsV0FBV3NELElBQVgsRUFBaUJKLEtBQWpCLEVBQXdCOUMsT0FBeEIsQ0FBckI7QUFDQUEsY0FBUW9ELE9BQVIsQ0FBZ0JOLEtBQWhCLEVBQXVCSyxjQUF2QixFQUF1QyxVQUFTRixHQUFULEVBQWM7QUFDbkQsWUFBSUEsR0FBSixFQUFTO0FBQ1AsaUJBQU9qRCxRQUFRK0MsUUFBUixDQUFpQkUsR0FBakIsQ0FBUDtBQUNEOztBQUVESjtBQUNELE9BTkQ7QUFPRCxLQWJEO0FBY0Q7QUFDREE7QUFDRCIsImZpbGUiOiJhcHBseS5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7cGFyc2VQYXRjaH0gZnJvbSAnLi9wYXJzZSc7XG5pbXBvcnQgZGlzdGFuY2VJdGVyYXRvciBmcm9tICcuLi91dGlsL2Rpc3RhbmNlLWl0ZXJhdG9yJztcblxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5UGF0Y2goc291cmNlLCB1bmlEaWZmLCBvcHRpb25zID0ge30pIHtcbiAgaWYgKHR5cGVvZiB1bmlEaWZmID09PSAnc3RyaW5nJykge1xuICAgIHVuaURpZmYgPSBwYXJzZVBhdGNoKHVuaURpZmYpO1xuICB9XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkodW5pRGlmZikpIHtcbiAgICBpZiAodW5pRGlmZi5sZW5ndGggPiAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2FwcGx5UGF0Y2ggb25seSB3b3JrcyB3aXRoIGEgc2luZ2xlIGlucHV0LicpO1xuICAgIH1cblxuICAgIHVuaURpZmYgPSB1bmlEaWZmWzBdO1xuICB9XG5cbiAgLy8gQXBwbHkgdGhlIGRpZmYgdG8gdGhlIGlucHV0XG4gIGxldCBsaW5lcyA9IHNvdXJjZS5zcGxpdCgvXFxyXFxufFtcXG5cXHZcXGZcXHJcXHg4NV0vKSxcbiAgICAgIGRlbGltaXRlcnMgPSBzb3VyY2UubWF0Y2goL1xcclxcbnxbXFxuXFx2XFxmXFxyXFx4ODVdL2cpIHx8IFtdLFxuICAgICAgaHVua3MgPSB1bmlEaWZmLmh1bmtzLFxuXG4gICAgICBjb21wYXJlTGluZSA9IG9wdGlvbnMuY29tcGFyZUxpbmUgfHwgKChsaW5lTnVtYmVyLCBsaW5lLCBvcGVyYXRpb24sIHBhdGNoQ29udGVudCkgPT4gbGluZSA9PT0gcGF0Y2hDb250ZW50KSxcbiAgICAgIGVycm9yQ291bnQgPSAwLFxuICAgICAgZnV6ekZhY3RvciA9IG9wdGlvbnMuZnV6ekZhY3RvciB8fCAwLFxuICAgICAgbWluTGluZSA9IDAsXG4gICAgICBvZmZzZXQgPSAwLFxuXG4gICAgICByZW1vdmVFT0ZOTCxcbiAgICAgIGFkZEVPRk5MO1xuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgdGhlIGh1bmsgZXhhY3RseSBmaXRzIG9uIHRoZSBwcm92aWRlZCBsb2NhdGlvblxuICAgKi9cbiAgZnVuY3Rpb24gaHVua0ZpdHMoaHVuaywgdG9Qb3MpIHtcbiAgICBmb3IgKGxldCBqID0gMDsgaiA8IGh1bmsubGluZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgIGxldCBsaW5lID0gaHVuay5saW5lc1tqXSxcbiAgICAgICAgICBvcGVyYXRpb24gPSAobGluZS5sZW5ndGggPiAwID8gbGluZVswXSA6ICcgJyksXG4gICAgICAgICAgY29udGVudCA9IChsaW5lLmxlbmd0aCA+IDAgPyBsaW5lLnN1YnN0cigxKSA6IGxpbmUpO1xuXG4gICAgICBpZiAob3BlcmF0aW9uID09PSAnICcgfHwgb3BlcmF0aW9uID09PSAnLScpIHtcbiAgICAgICAgLy8gQ29udGV4dCBzYW5pdHkgY2hlY2tcbiAgICAgICAgaWYgKCFjb21wYXJlTGluZSh0b1BvcyArIDEsIGxpbmVzW3RvUG9zXSwgb3BlcmF0aW9uLCBjb250ZW50KSkge1xuICAgICAgICAgIGVycm9yQ291bnQrKztcblxuICAgICAgICAgIGlmIChlcnJvckNvdW50ID4gZnV6ekZhY3Rvcikge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0b1BvcysrO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLy8gU2VhcmNoIGJlc3QgZml0IG9mZnNldHMgZm9yIGVhY2ggaHVuayBiYXNlZCBvbiB0aGUgcHJldmlvdXMgb25lc1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGh1bmtzLmxlbmd0aDsgaSsrKSB7XG4gICAgbGV0IGh1bmsgPSBodW5rc1tpXSxcbiAgICAgICAgbWF4TGluZSA9IGxpbmVzLmxlbmd0aCAtIGh1bmsub2xkTGluZXMsXG4gICAgICAgIGxvY2FsT2Zmc2V0ID0gMCxcbiAgICAgICAgdG9Qb3MgPSBvZmZzZXQgKyBodW5rLm9sZFN0YXJ0IC0gMTtcblxuICAgIGxldCBpdGVyYXRvciA9IGRpc3RhbmNlSXRlcmF0b3IodG9Qb3MsIG1pbkxpbmUsIG1heExpbmUpO1xuXG4gICAgZm9yICg7IGxvY2FsT2Zmc2V0ICE9PSB1bmRlZmluZWQ7IGxvY2FsT2Zmc2V0ID0gaXRlcmF0b3IoKSkge1xuICAgICAgaWYgKGh1bmtGaXRzKGh1bmssIHRvUG9zICsgbG9jYWxPZmZzZXQpKSB7XG4gICAgICAgIGh1bmsub2Zmc2V0ID0gb2Zmc2V0ICs9IGxvY2FsT2Zmc2V0O1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobG9jYWxPZmZzZXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIFNldCBsb3dlciB0ZXh0IGxpbWl0IHRvIGVuZCBvZiB0aGUgY3VycmVudCBodW5rLCBzbyBuZXh0IG9uZXMgZG9uJ3QgdHJ5XG4gICAgLy8gdG8gZml0IG92ZXIgYWxyZWFkeSBwYXRjaGVkIHRleHRcbiAgICBtaW5MaW5lID0gaHVuay5vZmZzZXQgKyBodW5rLm9sZFN0YXJ0ICsgaHVuay5vbGRMaW5lcztcbiAgfVxuXG4gIC8vIEFwcGx5IHBhdGNoIGh1bmtzXG4gIGxldCBkaWZmT2Zmc2V0ID0gMDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBodW5rcy5sZW5ndGg7IGkrKykge1xuICAgIGxldCBodW5rID0gaHVua3NbaV0sXG4gICAgICAgIHRvUG9zID0gaHVuay5vbGRTdGFydCArIGh1bmsub2Zmc2V0ICsgZGlmZk9mZnNldCAtIDE7XG4gICAgZGlmZk9mZnNldCArPSBodW5rLm5ld0xpbmVzIC0gaHVuay5vbGRMaW5lcztcblxuICAgIGlmICh0b1BvcyA8IDApIHsgLy8gQ3JlYXRpbmcgYSBuZXcgZmlsZVxuICAgICAgdG9Qb3MgPSAwO1xuICAgIH1cblxuICAgIGZvciAobGV0IGogPSAwOyBqIDwgaHVuay5saW5lcy5sZW5ndGg7IGorKykge1xuICAgICAgbGV0IGxpbmUgPSBodW5rLmxpbmVzW2pdLFxuICAgICAgICAgIG9wZXJhdGlvbiA9IChsaW5lLmxlbmd0aCA+IDAgPyBsaW5lWzBdIDogJyAnKSxcbiAgICAgICAgICBjb250ZW50ID0gKGxpbmUubGVuZ3RoID4gMCA/IGxpbmUuc3Vic3RyKDEpIDogbGluZSksXG4gICAgICAgICAgZGVsaW1pdGVyID0gaHVuay5saW5lZGVsaW1pdGVyc1tqXTtcblxuICAgICAgaWYgKG9wZXJhdGlvbiA9PT0gJyAnKSB7XG4gICAgICAgIHRvUG9zKys7XG4gICAgICB9IGVsc2UgaWYgKG9wZXJhdGlvbiA9PT0gJy0nKSB7XG4gICAgICAgIGxpbmVzLnNwbGljZSh0b1BvcywgMSk7XG4gICAgICAgIGRlbGltaXRlcnMuc3BsaWNlKHRvUG9zLCAxKTtcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgICB9IGVsc2UgaWYgKG9wZXJhdGlvbiA9PT0gJysnKSB7XG4gICAgICAgIGxpbmVzLnNwbGljZSh0b1BvcywgMCwgY29udGVudCk7XG4gICAgICAgIGRlbGltaXRlcnMuc3BsaWNlKHRvUG9zLCAwLCBkZWxpbWl0ZXIpO1xuICAgICAgICB0b1BvcysrO1xuICAgICAgfSBlbHNlIGlmIChvcGVyYXRpb24gPT09ICdcXFxcJykge1xuICAgICAgICBsZXQgcHJldmlvdXNPcGVyYXRpb24gPSBodW5rLmxpbmVzW2ogLSAxXSA/IGh1bmsubGluZXNbaiAtIDFdWzBdIDogbnVsbDtcbiAgICAgICAgaWYgKHByZXZpb3VzT3BlcmF0aW9uID09PSAnKycpIHtcbiAgICAgICAgICByZW1vdmVFT0ZOTCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAocHJldmlvdXNPcGVyYXRpb24gPT09ICctJykge1xuICAgICAgICAgIGFkZEVPRk5MID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIEhhbmRsZSBFT0ZOTCBpbnNlcnRpb24vcmVtb3ZhbFxuICBpZiAocmVtb3ZlRU9GTkwpIHtcbiAgICB3aGlsZSAoIWxpbmVzW2xpbmVzLmxlbmd0aCAtIDFdKSB7XG4gICAgICBsaW5lcy5wb3AoKTtcbiAgICAgIGRlbGltaXRlcnMucG9wKCk7XG4gICAgfVxuICB9IGVsc2UgaWYgKGFkZEVPRk5MKSB7XG4gICAgbGluZXMucHVzaCgnJyk7XG4gICAgZGVsaW1pdGVycy5wdXNoKCdcXG4nKTtcbiAgfVxuICBmb3IgKGxldCBfayA9IDA7IF9rIDwgbGluZXMubGVuZ3RoIC0gMTsgX2srKykge1xuICAgIGxpbmVzW19rXSA9IGxpbmVzW19rXSArIGRlbGltaXRlcnNbX2tdO1xuICB9XG4gIHJldHVybiBsaW5lcy5qb2luKCcnKTtcbn1cblxuLy8gV3JhcHBlciB0aGF0IHN1cHBvcnRzIG11bHRpcGxlIGZpbGUgcGF0Y2hlcyB2aWEgY2FsbGJhY2tzLlxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5UGF0Y2hlcyh1bmlEaWZmLCBvcHRpb25zKSB7XG4gIGlmICh0eXBlb2YgdW5pRGlmZiA9PT0gJ3N0cmluZycpIHtcbiAgICB1bmlEaWZmID0gcGFyc2VQYXRjaCh1bmlEaWZmKTtcbiAgfVxuXG4gIGxldCBjdXJyZW50SW5kZXggPSAwO1xuICBmdW5jdGlvbiBwcm9jZXNzSW5kZXgoKSB7XG4gICAgbGV0IGluZGV4ID0gdW5pRGlmZltjdXJyZW50SW5kZXgrK107XG4gICAgaWYgKCFpbmRleCkge1xuICAgICAgcmV0dXJuIG9wdGlvbnMuY29tcGxldGUoKTtcbiAgICB9XG5cbiAgICBvcHRpb25zLmxvYWRGaWxlKGluZGV4LCBmdW5jdGlvbihlcnIsIGRhdGEpIHtcbiAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgcmV0dXJuIG9wdGlvbnMuY29tcGxldGUoZXJyKTtcbiAgICAgIH1cblxuICAgICAgbGV0IHVwZGF0ZWRDb250ZW50ID0gYXBwbHlQYXRjaChkYXRhLCBpbmRleCwgb3B0aW9ucyk7XG4gICAgICBvcHRpb25zLnBhdGNoZWQoaW5kZXgsIHVwZGF0ZWRDb250ZW50LCBmdW5jdGlvbihlcnIpIHtcbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgIHJldHVybiBvcHRpb25zLmNvbXBsZXRlKGVycik7XG4gICAgICAgIH1cblxuICAgICAgICBwcm9jZXNzSW5kZXgoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG4gIHByb2Nlc3NJbmRleCgpO1xufVxuIl19


/***/ }),
/* 11 */
/***/ (function(module, exports) {

	/*istanbul ignore start*/'use strict';

	exports.__esModule = true;
	exports. /*istanbul ignore end*/parsePatch = parsePatch;
	function parsePatch(uniDiff) {
	  /*istanbul ignore start*/var /*istanbul ignore end*/options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};

	  var diffstr = uniDiff.split(/\r\n|[\n\v\f\r\x85]/),
	      delimiters = uniDiff.match(/\r\n|[\n\v\f\r\x85]/g) || [],
	      list = [],
	      i = 0;

	  function parseIndex() {
	    var index = {};
	    list.push(index);

	    // Parse diff metadata
	    while (i < diffstr.length) {
	      var line = diffstr[i];

	      // File header found, end parsing diff metadata
	      if (/^(\-\-\-|\+\+\+|@@)\s/.test(line)) {
	        break;
	      }

	      // Diff index
	      var header = /^(?:Index:|diff(?: -r \w+)+)\s+(.+?)\s*$/.exec(line);
	      if (header) {
	        index.index = header[1];
	      }

	      i++;
	    }

	    // Parse file headers if they are defined. Unified diff requires them, but
	    // there's no technical issues to have an isolated hunk without file header
	    parseFileHeader(index);
	    parseFileHeader(index);

	    // Parse hunks
	    index.hunks = [];

	    while (i < diffstr.length) {
	      var _line = diffstr[i];

	      if (/^(Index:|diff|\-\-\-|\+\+\+)\s/.test(_line)) {
	        break;
	      } else if (/^@@/.test(_line)) {
	        index.hunks.push(parseHunk());
	      } else if (_line && options.strict) {
	        // Ignore unexpected content unless in strict mode
	        throw new Error('Unknown line ' + (i + 1) + ' ' + JSON.stringify(_line));
	      } else {
	        i++;
	      }
	    }
	  }

	  // Parses the --- and +++ headers, if none are found, no lines
	  // are consumed.
	  function parseFileHeader(index) {
	    var fileHeader = /^(---|\+\+\+)\s+(.*)$/.exec(diffstr[i]);
	    if (fileHeader) {
	      var keyPrefix = fileHeader[1] === '---' ? 'old' : 'new';
	      var data = fileHeader[2].split('\t', 2);
	      var fileName = data[0].replace(/\\\\/g, '\\');
	      if (/^".*"$/.test(fileName)) {
	        fileName = fileName.substr(1, fileName.length - 2);
	      }
	      index[keyPrefix + 'FileName'] = fileName;
	      index[keyPrefix + 'Header'] = (data[1] || '').trim();

	      i++;
	    }
	  }

	  // Parses a hunk
	  // This assumes that we are at the start of a hunk.
	  function parseHunk() {
	    var chunkHeaderIndex = i,
	        chunkHeaderLine = diffstr[i++],
	        chunkHeader = chunkHeaderLine.split(/@@ -(\d+)(?:,(\d+))? \+(\d+)(?:,(\d+))? @@/);

	    var hunk = {
	      oldStart: +chunkHeader[1],
	      oldLines: +chunkHeader[2] || 1,
	      newStart: +chunkHeader[3],
	      newLines: +chunkHeader[4] || 1,
	      lines: [],
	      linedelimiters: []
	    };

	    var addCount = 0,
	        removeCount = 0;
	    for (; i < diffstr.length; i++) {
	      // Lines starting with '---' could be mistaken for the "remove line" operation
	      // But they could be the header for the next file. Therefore prune such cases out.
	      if (diffstr[i].indexOf('--- ') === 0 && i + 2 < diffstr.length && diffstr[i + 1].indexOf('+++ ') === 0 && diffstr[i + 2].indexOf('@@') === 0) {
	        break;
	      }
	      var operation = diffstr[i].length == 0 && i != diffstr.length - 1 ? ' ' : diffstr[i][0];

	      if (operation === '+' || operation === '-' || operation === ' ' || operation === '\\') {
	        hunk.lines.push(diffstr[i]);
	        hunk.linedelimiters.push(delimiters[i] || '\n');

	        if (operation === '+') {
	          addCount++;
	        } else if (operation === '-') {
	          removeCount++;
	        } else if (operation === ' ') {
	          addCount++;
	          removeCount++;
	        }
	      } else {
	        break;
	      }
	    }

	    // Handle the empty block count case
	    if (!addCount && hunk.newLines === 1) {
	      hunk.newLines = 0;
	    }
	    if (!removeCount && hunk.oldLines === 1) {
	      hunk.oldLines = 0;
	    }

	    // Perform optional sanity checking
	    if (options.strict) {
	      if (addCount !== hunk.newLines) {
	        throw new Error('Added line count did not match for hunk at line ' + (chunkHeaderIndex + 1));
	      }
	      if (removeCount !== hunk.oldLines) {
	        throw new Error('Removed line count did not match for hunk at line ' + (chunkHeaderIndex + 1));
	      }
	    }

	    return hunk;
	  }

	  while (i < diffstr.length) {
	    parseIndex();
	  }

	  return list;
	}
	//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wYXRjaC9wYXJzZS5qcyJdLCJuYW1lcyI6WyJwYXJzZVBhdGNoIiwidW5pRGlmZiIsIm9wdGlvbnMiLCJkaWZmc3RyIiwic3BsaXQiLCJkZWxpbWl0ZXJzIiwibWF0Y2giLCJsaXN0IiwiaSIsInBhcnNlSW5kZXgiLCJpbmRleCIsInB1c2giLCJsZW5ndGgiLCJsaW5lIiwidGVzdCIsImhlYWRlciIsImV4ZWMiLCJwYXJzZUZpbGVIZWFkZXIiLCJodW5rcyIsInBhcnNlSHVuayIsInN0cmljdCIsIkVycm9yIiwiSlNPTiIsInN0cmluZ2lmeSIsImZpbGVIZWFkZXIiLCJrZXlQcmVmaXgiLCJkYXRhIiwiZmlsZU5hbWUiLCJyZXBsYWNlIiwic3Vic3RyIiwidHJpbSIsImNodW5rSGVhZGVySW5kZXgiLCJjaHVua0hlYWRlckxpbmUiLCJjaHVua0hlYWRlciIsImh1bmsiLCJvbGRTdGFydCIsIm9sZExpbmVzIiwibmV3U3RhcnQiLCJuZXdMaW5lcyIsImxpbmVzIiwibGluZWRlbGltaXRlcnMiLCJhZGRDb3VudCIsInJlbW92ZUNvdW50IiwiaW5kZXhPZiIsIm9wZXJhdGlvbiJdLCJtYXBwaW5ncyI6Ijs7O2dDQUFnQkEsVSxHQUFBQSxVO0FBQVQsU0FBU0EsVUFBVCxDQUFvQkMsT0FBcEIsRUFBMkM7QUFBQSxzREFBZEMsT0FBYyx1RUFBSixFQUFJOztBQUNoRCxNQUFJQyxVQUFVRixRQUFRRyxLQUFSLENBQWMscUJBQWQsQ0FBZDtBQUFBLE1BQ0lDLGFBQWFKLFFBQVFLLEtBQVIsQ0FBYyxzQkFBZCxLQUF5QyxFQUQxRDtBQUFBLE1BRUlDLE9BQU8sRUFGWDtBQUFBLE1BR0lDLElBQUksQ0FIUjs7QUFLQSxXQUFTQyxVQUFULEdBQXNCO0FBQ3BCLFFBQUlDLFFBQVEsRUFBWjtBQUNBSCxTQUFLSSxJQUFMLENBQVVELEtBQVY7O0FBRUE7QUFDQSxXQUFPRixJQUFJTCxRQUFRUyxNQUFuQixFQUEyQjtBQUN6QixVQUFJQyxPQUFPVixRQUFRSyxDQUFSLENBQVg7O0FBRUE7QUFDQSxVQUFJLHdCQUF3Qk0sSUFBeEIsQ0FBNkJELElBQTdCLENBQUosRUFBd0M7QUFDdEM7QUFDRDs7QUFFRDtBQUNBLFVBQUlFLFNBQVUsMENBQUQsQ0FBNkNDLElBQTdDLENBQWtESCxJQUFsRCxDQUFiO0FBQ0EsVUFBSUUsTUFBSixFQUFZO0FBQ1ZMLGNBQU1BLEtBQU4sR0FBY0ssT0FBTyxDQUFQLENBQWQ7QUFDRDs7QUFFRFA7QUFDRDs7QUFFRDtBQUNBO0FBQ0FTLG9CQUFnQlAsS0FBaEI7QUFDQU8sb0JBQWdCUCxLQUFoQjs7QUFFQTtBQUNBQSxVQUFNUSxLQUFOLEdBQWMsRUFBZDs7QUFFQSxXQUFPVixJQUFJTCxRQUFRUyxNQUFuQixFQUEyQjtBQUN6QixVQUFJQyxRQUFPVixRQUFRSyxDQUFSLENBQVg7O0FBRUEsVUFBSSxpQ0FBaUNNLElBQWpDLENBQXNDRCxLQUF0QyxDQUFKLEVBQWlEO0FBQy9DO0FBQ0QsT0FGRCxNQUVPLElBQUksTUFBTUMsSUFBTixDQUFXRCxLQUFYLENBQUosRUFBc0I7QUFDM0JILGNBQU1RLEtBQU4sQ0FBWVAsSUFBWixDQUFpQlEsV0FBakI7QUFDRCxPQUZNLE1BRUEsSUFBSU4sU0FBUVgsUUFBUWtCLE1BQXBCLEVBQTRCO0FBQ2pDO0FBQ0EsY0FBTSxJQUFJQyxLQUFKLENBQVUsbUJBQW1CYixJQUFJLENBQXZCLElBQTRCLEdBQTVCLEdBQWtDYyxLQUFLQyxTQUFMLENBQWVWLEtBQWYsQ0FBNUMsQ0FBTjtBQUNELE9BSE0sTUFHQTtBQUNMTDtBQUNEO0FBQ0Y7QUFDRjs7QUFFRDtBQUNBO0FBQ0EsV0FBU1MsZUFBVCxDQUF5QlAsS0FBekIsRUFBZ0M7QUFDOUIsUUFBTWMsYUFBYyx1QkFBRCxDQUEwQlIsSUFBMUIsQ0FBK0JiLFFBQVFLLENBQVIsQ0FBL0IsQ0FBbkI7QUFDQSxRQUFJZ0IsVUFBSixFQUFnQjtBQUNkLFVBQUlDLFlBQVlELFdBQVcsQ0FBWCxNQUFrQixLQUFsQixHQUEwQixLQUExQixHQUFrQyxLQUFsRDtBQUNBLFVBQU1FLE9BQU9GLFdBQVcsQ0FBWCxFQUFjcEIsS0FBZCxDQUFvQixJQUFwQixFQUEwQixDQUExQixDQUFiO0FBQ0EsVUFBSXVCLFdBQVdELEtBQUssQ0FBTCxFQUFRRSxPQUFSLENBQWdCLE9BQWhCLEVBQXlCLElBQXpCLENBQWY7QUFDQSxVQUFJLFNBQVNkLElBQVQsQ0FBY2EsUUFBZCxDQUFKLEVBQTZCO0FBQzNCQSxtQkFBV0EsU0FBU0UsTUFBVCxDQUFnQixDQUFoQixFQUFtQkYsU0FBU2YsTUFBVCxHQUFrQixDQUFyQyxDQUFYO0FBQ0Q7QUFDREYsWUFBTWUsWUFBWSxVQUFsQixJQUFnQ0UsUUFBaEM7QUFDQWpCLFlBQU1lLFlBQVksUUFBbEIsSUFBOEIsQ0FBQ0MsS0FBSyxDQUFMLEtBQVcsRUFBWixFQUFnQkksSUFBaEIsRUFBOUI7O0FBRUF0QjtBQUNEO0FBQ0Y7O0FBRUQ7QUFDQTtBQUNBLFdBQVNXLFNBQVQsR0FBcUI7QUFDbkIsUUFBSVksbUJBQW1CdkIsQ0FBdkI7QUFBQSxRQUNJd0Isa0JBQWtCN0IsUUFBUUssR0FBUixDQUR0QjtBQUFBLFFBRUl5QixjQUFjRCxnQkFBZ0I1QixLQUFoQixDQUFzQiw0Q0FBdEIsQ0FGbEI7O0FBSUEsUUFBSThCLE9BQU87QUFDVEMsZ0JBQVUsQ0FBQ0YsWUFBWSxDQUFaLENBREY7QUFFVEcsZ0JBQVUsQ0FBQ0gsWUFBWSxDQUFaLENBQUQsSUFBbUIsQ0FGcEI7QUFHVEksZ0JBQVUsQ0FBQ0osWUFBWSxDQUFaLENBSEY7QUFJVEssZ0JBQVUsQ0FBQ0wsWUFBWSxDQUFaLENBQUQsSUFBbUIsQ0FKcEI7QUFLVE0sYUFBTyxFQUxFO0FBTVRDLHNCQUFnQjtBQU5QLEtBQVg7O0FBU0EsUUFBSUMsV0FBVyxDQUFmO0FBQUEsUUFDSUMsY0FBYyxDQURsQjtBQUVBLFdBQU9sQyxJQUFJTCxRQUFRUyxNQUFuQixFQUEyQkosR0FBM0IsRUFBZ0M7QUFDOUI7QUFDQTtBQUNBLFVBQUlMLFFBQVFLLENBQVIsRUFBV21DLE9BQVgsQ0FBbUIsTUFBbkIsTUFBK0IsQ0FBL0IsSUFDTW5DLElBQUksQ0FBSixHQUFRTCxRQUFRUyxNQUR0QixJQUVLVCxRQUFRSyxJQUFJLENBQVosRUFBZW1DLE9BQWYsQ0FBdUIsTUFBdkIsTUFBbUMsQ0FGeEMsSUFHS3hDLFFBQVFLLElBQUksQ0FBWixFQUFlbUMsT0FBZixDQUF1QixJQUF2QixNQUFpQyxDQUgxQyxFQUc2QztBQUN6QztBQUNIO0FBQ0QsVUFBSUMsWUFBYXpDLFFBQVFLLENBQVIsRUFBV0ksTUFBWCxJQUFxQixDQUFyQixJQUEwQkosS0FBTUwsUUFBUVMsTUFBUixHQUFpQixDQUFsRCxHQUF3RCxHQUF4RCxHQUE4RFQsUUFBUUssQ0FBUixFQUFXLENBQVgsQ0FBOUU7O0FBRUEsVUFBSW9DLGNBQWMsR0FBZCxJQUFxQkEsY0FBYyxHQUFuQyxJQUEwQ0EsY0FBYyxHQUF4RCxJQUErREEsY0FBYyxJQUFqRixFQUF1RjtBQUNyRlYsYUFBS0ssS0FBTCxDQUFXNUIsSUFBWCxDQUFnQlIsUUFBUUssQ0FBUixDQUFoQjtBQUNBMEIsYUFBS00sY0FBTCxDQUFvQjdCLElBQXBCLENBQXlCTixXQUFXRyxDQUFYLEtBQWlCLElBQTFDOztBQUVBLFlBQUlvQyxjQUFjLEdBQWxCLEVBQXVCO0FBQ3JCSDtBQUNELFNBRkQsTUFFTyxJQUFJRyxjQUFjLEdBQWxCLEVBQXVCO0FBQzVCRjtBQUNELFNBRk0sTUFFQSxJQUFJRSxjQUFjLEdBQWxCLEVBQXVCO0FBQzVCSDtBQUNBQztBQUNEO0FBQ0YsT0FaRCxNQVlPO0FBQ0w7QUFDRDtBQUNGOztBQUVEO0FBQ0EsUUFBSSxDQUFDRCxRQUFELElBQWFQLEtBQUtJLFFBQUwsS0FBa0IsQ0FBbkMsRUFBc0M7QUFDcENKLFdBQUtJLFFBQUwsR0FBZ0IsQ0FBaEI7QUFDRDtBQUNELFFBQUksQ0FBQ0ksV0FBRCxJQUFnQlIsS0FBS0UsUUFBTCxLQUFrQixDQUF0QyxFQUF5QztBQUN2Q0YsV0FBS0UsUUFBTCxHQUFnQixDQUFoQjtBQUNEOztBQUVEO0FBQ0EsUUFBSWxDLFFBQVFrQixNQUFaLEVBQW9CO0FBQ2xCLFVBQUlxQixhQUFhUCxLQUFLSSxRQUF0QixFQUFnQztBQUM5QixjQUFNLElBQUlqQixLQUFKLENBQVUsc0RBQXNEVSxtQkFBbUIsQ0FBekUsQ0FBVixDQUFOO0FBQ0Q7QUFDRCxVQUFJVyxnQkFBZ0JSLEtBQUtFLFFBQXpCLEVBQW1DO0FBQ2pDLGNBQU0sSUFBSWYsS0FBSixDQUFVLHdEQUF3RFUsbUJBQW1CLENBQTNFLENBQVYsQ0FBTjtBQUNEO0FBQ0Y7O0FBRUQsV0FBT0csSUFBUDtBQUNEOztBQUVELFNBQU8xQixJQUFJTCxRQUFRUyxNQUFuQixFQUEyQjtBQUN6Qkg7QUFDRDs7QUFFRCxTQUFPRixJQUFQO0FBQ0QiLCJmaWxlIjoicGFyc2UuanMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZnVuY3Rpb24gcGFyc2VQYXRjaCh1bmlEaWZmLCBvcHRpb25zID0ge30pIHtcbiAgbGV0IGRpZmZzdHIgPSB1bmlEaWZmLnNwbGl0KC9cXHJcXG58W1xcblxcdlxcZlxcclxceDg1XS8pLFxuICAgICAgZGVsaW1pdGVycyA9IHVuaURpZmYubWF0Y2goL1xcclxcbnxbXFxuXFx2XFxmXFxyXFx4ODVdL2cpIHx8IFtdLFxuICAgICAgbGlzdCA9IFtdLFxuICAgICAgaSA9IDA7XG5cbiAgZnVuY3Rpb24gcGFyc2VJbmRleCgpIHtcbiAgICBsZXQgaW5kZXggPSB7fTtcbiAgICBsaXN0LnB1c2goaW5kZXgpO1xuXG4gICAgLy8gUGFyc2UgZGlmZiBtZXRhZGF0YVxuICAgIHdoaWxlIChpIDwgZGlmZnN0ci5sZW5ndGgpIHtcbiAgICAgIGxldCBsaW5lID0gZGlmZnN0cltpXTtcblxuICAgICAgLy8gRmlsZSBoZWFkZXIgZm91bmQsIGVuZCBwYXJzaW5nIGRpZmYgbWV0YWRhdGFcbiAgICAgIGlmICgvXihcXC1cXC1cXC18XFwrXFwrXFwrfEBAKVxccy8udGVzdChsaW5lKSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgLy8gRGlmZiBpbmRleFxuICAgICAgbGV0IGhlYWRlciA9ICgvXig/OkluZGV4OnxkaWZmKD86IC1yIFxcdyspKylcXHMrKC4rPylcXHMqJC8pLmV4ZWMobGluZSk7XG4gICAgICBpZiAoaGVhZGVyKSB7XG4gICAgICAgIGluZGV4LmluZGV4ID0gaGVhZGVyWzFdO1xuICAgICAgfVxuXG4gICAgICBpKys7XG4gICAgfVxuXG4gICAgLy8gUGFyc2UgZmlsZSBoZWFkZXJzIGlmIHRoZXkgYXJlIGRlZmluZWQuIFVuaWZpZWQgZGlmZiByZXF1aXJlcyB0aGVtLCBidXRcbiAgICAvLyB0aGVyZSdzIG5vIHRlY2huaWNhbCBpc3N1ZXMgdG8gaGF2ZSBhbiBpc29sYXRlZCBodW5rIHdpdGhvdXQgZmlsZSBoZWFkZXJcbiAgICBwYXJzZUZpbGVIZWFkZXIoaW5kZXgpO1xuI
Download .txt
gitextract__kzhch8i/

├── .babelrc
├── .editorconfig
├── .eslintignore
├── .eslintrc
├── .github/
│   └── workflows/
│       ├── _backstop-ci-runner.yml
│       ├── backstop-publish.yml
│       ├── backstop-reference-test.yml
│       ├── backstop-sanity-docker.yml
│       ├── docker-sanity-test.yml
│       ├── dockerhub-build-push.yml
│       ├── npm-push.yml
│       └── test-build-pub-npm-dockerhub.yml
├── .gitignore
├── .gitlab-ci.yml
├── .travis.yml
├── CONTRIBUTING.md
├── LICENSE
├── README.md
├── assets/
│   └── styles.css
├── capture/
│   ├── backstopTools.js
│   ├── config.default.json
│   └── engine_scripts/
│       ├── cookies.json
│       ├── playwright/
│       │   ├── clickAndHoverHelper.js
│       │   ├── interceptImages.js
│       │   ├── loadCookies.js
│       │   ├── onBefore.js
│       │   ├── onReady.js
│       │   └── overrideCSS.js
│       └── puppet/
│           ├── clickAndHoverHelper.js
│           ├── ignoreCSP.js
│           ├── interceptImages.js
│           ├── loadCookies.js
│           ├── onBefore.js
│           ├── onReady.js
│           └── overrideCSS.js
├── changelog.md
├── cli/
│   ├── index.js
│   └── usage.js
├── compare/
│   ├── README.md
│   ├── output/
│   │   ├── diff.js
│   │   ├── diverged.js
│   │   ├── divergedWorker.js
│   │   ├── index.html
│   │   ├── index_bundle.js
│   │   └── index_bundle.js.LICENSE.txt
│   ├── src/
│   │   ├── .eslintrc
│   │   ├── actions/
│   │   │   └── index.js
│   │   ├── components/
│   │   │   ├── App.js
│   │   │   ├── atoms/
│   │   │   │   ├── ButtonFilter.js
│   │   │   │   ├── ButtonSettings.js
│   │   │   │   ├── DiffDetails.js
│   │   │   │   ├── ErrorMessages.js
│   │   │   │   ├── IdContainer.js
│   │   │   │   ├── ImagePreview.js
│   │   │   │   ├── ImageScrubber.js
│   │   │   │   ├── InputTextSearch.js
│   │   │   │   ├── LogDetails.js
│   │   │   │   ├── Logo.js
│   │   │   │   ├── NavButtons.js
│   │   │   │   ├── SettingOption.js
│   │   │   │   ├── SuiteName.js
│   │   │   │   ├── TextDetails.js
│   │   │   │   └── UrlDetails.js
│   │   │   ├── ecosystems/
│   │   │   │   ├── Header.js
│   │   │   │   ├── List.js
│   │   │   │   ├── LogModal.js
│   │   │   │   └── ScrubberModal.js
│   │   │   ├── molecules/
│   │   │   │   ├── ApproveButton.js
│   │   │   │   ├── FiltersSwitch.js
│   │   │   │   ├── ScrubberButton.js
│   │   │   │   ├── SettingsContainer.js
│   │   │   │   ├── SettingsPopup.js
│   │   │   │   ├── TestImages.js
│   │   │   │   └── TextSearch.js
│   │   │   └── organisms/
│   │   │       ├── TestCard.js
│   │   │       ├── Toolbar.js
│   │   │       └── Topbar.js
│   │   ├── index.js
│   │   ├── reducers/
│   │   │   ├── index.js
│   │   │   ├── layoutSettings.js
│   │   │   ├── logs.js
│   │   │   ├── scrubber.js
│   │   │   ├── suiteInfo.js
│   │   │   └── tests.js
│   │   ├── store.js
│   │   └── styles/
│   │       └── index.js
│   └── webpack.config.js
├── core/
│   ├── command/
│   │   ├── approve.js
│   │   ├── index.js
│   │   ├── init.js
│   │   ├── openReport.js
│   │   ├── reference.js
│   │   ├── remote.js
│   │   ├── report.js
│   │   ├── stop.js
│   │   ├── test.js
│   │   └── version.js
│   ├── runner.js
│   └── util/
│       ├── BackstopException.js
│       ├── Reporter.js
│       ├── allSettled.js
│       ├── compare/
│       │   ├── compare-hash.js
│       │   ├── compare-resemble.js
│       │   ├── compare.js
│       │   ├── index.js
│       │   ├── store-failed-diff-stub.js
│       │   └── store-failed-diff.js
│       ├── createBitmaps.js
│       ├── engineErrors.js
│       ├── engineTools.js
│       ├── ensureDirectoryPath.js
│       ├── extendConfig.js
│       ├── findExecutable.js
│       ├── fs.js
│       ├── getFreePorts.js
│       ├── getRemotePort.js
│       ├── isWin.js
│       ├── logger.js
│       ├── makeConfig.js
│       ├── makeSpaces.js
│       ├── promisify.js
│       ├── remote.js
│       ├── runDocker.js
│       ├── runPlaywright.js
│       ├── runPuppet.js
│       └── streamToPromise.js
├── docker/
│   ├── Dockerfile
│   ├── README.md
│   ├── burn-docker-builder.sh
│   ├── hooks/
│   │   ├── build
│   │   └── post_push
│   └── xvfb-run
├── examples/
│   ├── Jenkins/
│   │   ├── README.md
│   │   └── Sample/
│   │       ├── backstop.json
│   │       └── backstop_data/
│   │           └── engine_scripts/
│   │               └── puppet/
│   │                   ├── clickAndHoverHelper.js
│   │                   ├── ignoreCSP.js
│   │                   ├── interceptImages.js
│   │                   ├── loadCookies.js
│   │                   ├── onBefore.js
│   │                   └── onReady.js
│   ├── angularAppWithCssTransitions/
│   │   ├── backstopConfig_1.json
│   │   ├── backstopConfig_2.json
│   │   └── index.html
│   ├── featureTests/
│   │   ├── dist/
│   │   │   ├── css/
│   │   │   │   ├── bootstrap-theme.css
│   │   │   │   └── bootstrap.css
│   │   │   └── js/
│   │   │       ├── bootstrap.js
│   │   │       └── npm.js
│   │   ├── index.html
│   │   └── readme.md
│   ├── jsBasedConfig/
│   │   ├── backstopConfig.js
│   │   └── readme.md
│   ├── myCoolProject/
│   │   ├── dist/
│   │   │   ├── css/
│   │   │   │   ├── bootstrap-theme.css
│   │   │   │   └── bootstrap.css
│   │   │   └── js/
│   │   │       ├── bootstrap.js
│   │   │       └── npm.js
│   │   ├── index.html
│   │   └── readme.md
│   ├── nodeIntegration/
│   │   ├── backstop.config.js
│   │   ├── backstop.js
│   │   ├── package.json
│   │   ├── public/
│   │   │   ├── first-project/
│   │   │   │   ├── about-us.html
│   │   │   │   ├── homepage.html
│   │   │   │   └── ignore-me.html
│   │   │   ├── second-project/
│   │   │   │   ├── contact-us.html
│   │   │   │   ├── dummy.json
│   │   │   │   ├── ignore-me.html
│   │   │   │   └── index.html
│   │   │   └── third-project/
│   │   │       ├── ignore-me.html
│   │   │       └── terms-of-use.html
│   │   ├── readme.md
│   │   └── server.js
│   ├── responsiveDemo/
│   │   ├── backstop.json
│   │   ├── backstop_data/
│   │   │   └── engine_scripts/
│   │   │       ├── cookies.json
│   │   │       └── puppet/
│   │   │           ├── clickAndHoverHelper.js
│   │   │           ├── ignoreCSP.js
│   │   │           ├── interceptImages.js
│   │   │           ├── loadCookies.js
│   │   │           ├── onBefore.js
│   │   │           └── onReady.js
│   │   ├── index.html
│   │   ├── package.json
│   │   ├── readme.md
│   │   └── responsiveDemo.css
│   └── simpleReactApp/
│       ├── assets/
│       │   └── css/
│       │       └── styles.css
│       ├── backstop.json
│       ├── compiled.js
│       ├── components/
│       │   ├── App.js
│       │   ├── CurrentLocation.js
│       │   ├── LocationItem.js
│       │   ├── LocationList.js
│       │   ├── Map.js
│       │   └── Search.js
│       ├── index.html
│       ├── main.js
│       ├── package.json
│       └── readme.md
├── index.html
├── old_splash_page_v2.0/
│   ├── css/
│   │   ├── bootstrap-theme.css
│   │   ├── bootstrap.css
│   │   └── main.css
│   ├── img/
│   │   └── backgrounds/
│   │       ├── cream_dust/
│   │       │   └── readme.txt
│   │       └── subtlenet2/
│   │           └── readme.txt
│   ├── index.html
│   └── js/
│       ├── main.js
│       └── vendor/
│           └── bootstrap.js
├── package.json
├── remote/
│   └── index.js
└── test/
    ├── .eslintrc
    ├── cli/
    │   ├── index_spec.js
    │   └── usage_spec.js
    ├── configs/
    │   ├── backstop.json
    │   ├── backstop_alt.js
    │   ├── backstop_data/
    │   │   ├── cookies.json
    │   │   └── engine_scripts/
    │   │       ├── cookies.json
    │   │       ├── onBefore.js
    │   │       ├── onReady.js
    │   │       ├── playwright/
    │   │       │   ├── clickAndHoverHelper.js
    │   │       │   ├── interceptImages.js
    │   │       │   ├── loadCookies.js
    │   │       │   ├── onBefore.js
    │   │       │   ├── onReady.js
    │   │       │   └── overrideCSS.js
    │   │       └── puppet/
    │   │           ├── clickAndHoverHelper.js
    │   │           ├── loadCookies.js
    │   │           ├── onBefore.js
    │   │           ├── onReady.js
    │   │           └── overrideCSS.js
    │   ├── backstop_fail_cases.js
    │   ├── backstop_features.js
    │   ├── backstop_features_pw.js
    │   ├── dynamic_node_app.js
    │   ├── multi_step node_example.js
    │   ├── playwright.json
    │   ├── remote.js
    │   ├── responsiveDemo.json
    │   ├── responsiveTest.json
    │   ├── runFromNode.js
    │   └── special_cases/
    │       ├── scrollToSelector.html
    │       └── scrollToSelector_puppet.js
    └── core/
        ├── command/
        │   └── report_spec.js
        ├── runner_spec.js
        └── util/
            ├── backstop.json
            ├── compare/
            │   ├── compare-hash_spec.js
            │   ├── compare-resemble_spec.js
            │   └── compare_spec.js
            ├── engineErrors_spec.js
            ├── extendConfig_spec.js
            ├── fixtures/
            │   ├── engineErrorsFail.json
            │   └── engineErrorsSuccess.json
            ├── makeConfig_it_spec.js
            ├── makeConfig_spec.js
            ├── remote_spec.js
            └── runDocker_spec.js
Download .txt
SYMBOL INDEX (1627 symbols across 89 files)

FILE: capture/engine_scripts/playwright/interceptImages.js
  constant IMAGE_URL_RE (line 18) | const IMAGE_URL_RE = /\.gif|\.jpg|\.png/i;
  constant IMAGE_STUB_URL (line 19) | const IMAGE_STUB_URL = path.resolve(__dirname, '../../imageStub.jpg');
  constant IMAGE_DATA_BUFFER (line 20) | const IMAGE_DATA_BUFFER = fs.readFileSync(IMAGE_STUB_URL);
  constant HEADERS_STUB (line 21) | const HEADERS_STUB = {};

FILE: capture/engine_scripts/playwright/overrideCSS.js
  constant BACKSTOP_TEST_CSS_OVERRIDE (line 14) | const BACKSTOP_TEST_CSS_OVERRIDE = `

FILE: capture/engine_scripts/puppet/interceptImages.js
  constant IMAGE_URL_RE (line 18) | const IMAGE_URL_RE = /\.gif|\.jpg|\.png/i;
  constant IMAGE_STUB_URL (line 19) | const IMAGE_STUB_URL = path.resolve(__dirname, '../imageStub.jpg');
  constant IMAGE_DATA_BUFFER (line 20) | const IMAGE_DATA_BUFFER = fs.readFileSync(IMAGE_STUB_URL);
  constant HEADERS_STUB (line 21) | const HEADERS_STUB = {};

FILE: capture/engine_scripts/puppet/overrideCSS.js
  constant BACKSTOP_TEST_CSS_OVERRIDE (line 1) | const BACKSTOP_TEST_CSS_OVERRIDE = 'html {background-image: none;}';

FILE: cli/index.js
  function main (line 10) | function main () {

FILE: cli/usage.js
  function makeDescription (line 21) | function makeDescription (descriptions) {
  function spacesBetweenCommandAndDescription (line 39) | function spacesBetweenCommandAndDescription (commandName) {

FILE: compare/output/diff.js
  function __webpack_require__ (line 53) | function __webpack_require__(moduleId) {
  function _interopRequireDefault (line 129) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function Diff (line 178) | function Diff() {}
  function done (line 193) | function done(value) {
  function execEditLength (line 225) | function execEditLength() {
  function buildValues (line 352) | function buildValues(diff, components, newString, oldString, useLongestT...
  function clonePath (line 405) | function clonePath(path) {
  function _interopRequireDefault (line 425) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function diffChars (line 428) | function diffChars(oldStr, newStr, options) {
  function _interopRequireDefault (line 451) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function diffWords (line 499) | function diffWords(oldStr, newStr, options) {
  function diffWordsWithSpace (line 504) | function diffWordsWithSpace(oldStr, newStr, options) {
  function generateOptions (line 518) | function generateOptions(options, defaults) {
  function _interopRequireDefault (line 551) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function diffLines (line 580) | function diffLines(oldStr, newStr, callback) {
  function diffTrimmedLines (line 583) | function diffTrimmedLines(oldStr, newStr, callback) {
  function _interopRequireDefault (line 604) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function diffSentences (line 611) | function diffSentences(oldStr, newStr, callback) {
  function _interopRequireDefault (line 631) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function diffCss (line 638) | function diffCss(oldStr, newStr, callback) {
  function _interopRequireDefault (line 664) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function diffJson (line 691) | function diffJson(oldObj, newObj, options) {
  function canonicalize (line 697) | function canonicalize(obj, stack, replacementStack, replacer, key) {
  function _interopRequireDefault (line 772) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function diffArrays (line 782) | function diffArrays(oldArr, newArr, callback) {
  function _interopRequireDefault (line 804) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function applyPatch (line 806) | function applyPatch(source, uniDiff) {
  function applyPatches (line 942) | function applyPatches(uniDiff, options) {
  function parsePatch (line 982) | function parsePatch(uniDiff) {
  function _toConsumableArray (line 1196) | function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i ...
  function calcLineCount (line 1198) | function calcLineCount(hunk) {
  function merge (line 1216) | function merge(mine, theirs, base) {
  function loadPatch (line 1292) | function loadPatch(param, base) {
  function fileNameChanged (line 1309) | function fileNameChanged(patch) {
  function selectField (line 1313) | function selectField(index, mine, theirs) {
  function hunkBefore (line 1322) | function hunkBefore(test, check) {
  function cloneHunk (line 1326) | function cloneHunk(hunk, offset) {
  function mergeLines (line 1334) | function mergeLines(hunk, mineOffset, mineLines, theirOffset, theirLines) {
  function mutualChange (line 1386) | function mutualChange(hunk, mine, their) {
  function removal (line 1413) | function removal(hunk, mine, their, swap) {
  function conflict (line 1425) | function conflict(hunk, mine, their) {
  function insertLeading (line 1434) | function insertLeading(hunk, insert, their) {
  function insertTrailing (line 1441) | function insertTrailing(hunk, insert) {
  function collectChange (line 1448) | function collectChange(state) {
  function collectContext (line 1469) | function collectContext(state, matchChanges) {
  function allRemoves (line 1526) | function allRemoves(changes) {
  function skipRemoveSuperset (line 1531) | function skipRemoveSuperset(state, removeChanges, delta) {
  function calcOldNewLineCount (line 1543) | function calcOldNewLineCount(lines) {
  function _toConsumableArray (line 1595) | function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i ...
  function structuredPatch (line 1597) | function structuredPatch(oldFileName, newFileName, oldStr, newStr, oldHe...
  function createTwoFilesPatch (line 1710) | function createTwoFilesPatch(oldFileName, newFileName, oldStr, newStr, o...
  function createPatch (line 1730) | function createPatch(fileName, oldStr, newStr, oldHeader, newHeader, opt...
  function arrayEqual (line 1745) | function arrayEqual(a, b) {
  function arrayStartsWith (line 1753) | function arrayStartsWith(array, start) {
  function convertChangesToDMP (line 1778) | function convertChangesToDMP(changes) {
  function convertChangesToXML (line 1807) | function convertChangesToXML(changes) {
  function escapeHTML (line 1828) | function escapeHTML(s) {

FILE: compare/output/diverged.js
  constant LCS_DIFF_ARRAY_METHOD (line 3) | let LCS_DIFF_ARRAY_METHOD = undefined;
  constant IS_ADDED_WORD (line 18) | const IS_ADDED_WORD = '0_255_0_255';
  constant IS_REMOVED_WORD (line 19) | const IS_REMOVED_WORD = '255_0_0_255';
  constant IS_ADDED_AND_REMOVED_WORD (line 20) | const IS_ADDED_AND_REMOVED_WORD = '0_255_255_255';
  constant IS_SAME_WORD (line 21) | const IS_SAME_WORD = '';
  constant OPACITY (line 22) | const OPACITY = '40';
  function diverged (line 37) | function diverged(reference, test, h, w) {
  function columnWordDataToImgDataFormatAsWords (line 90) | function columnWordDataToImgDataFormatAsWords(columns, h, w) {
  function convertImgDataWordsToClampedImgData (line 101) | function convertImgDataWordsToClampedImgData(wordsArr) {
  function reduceColumnDiffRaw (line 114) | function reduceColumnDiffRaw(columnDiffs, h, w) {
  function diffArr (line 190) | function diffArr(refArr, testArr, h, w) {
  function groupAdjacent (line 198) | function groupAdjacent(columns, spread, h, w) {
  function ungroupAdjacent (line 269) | function ungroupAdjacent(grouped, spread, columnUnderlay, h, w) {
  function imgDataWordArrToColsAndRows (line 298) | function imgDataWordArrToColsAndRows(arr, h, w) {
  function serialToColumnMap (line 320) | function serialToColumnMap(index, h, w) {
  function serialToRowMap (line 327) | function serialToRowMap(index, h, w) {
  function imgDataToWords (line 334) | function imgDataToWords(arr) {

FILE: compare/output/index_bundle.js
  function r (line 2) | function r(e){return r="function"==typeof Symbol&&"symbol"==typeof Symbo...
  function i (line 2) | function i(e){if("function"!=typeof WeakMap)return null;var t=new WeakMa...
  function a (line 2) | function a(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.en...
  function l (line 2) | function l(e){var t=function(e,t){if("object"!=r(e)||!e)return e;var n=e...
  function u (line 2) | function u(e,t){return u=Object.setPrototypeOf?Object.setPrototypeOf.bin...
  function c (line 2) | function c(e){if(void 0===e)throw new ReferenceError("this hasn't been i...
  function s (line 2) | function s(e){return s=Object.setPrototypeOf?Object.getPrototypeOf.bind(...
  function d (line 2) | function d(e){var t;return function(e,t){if(!(e instanceof t))throw new ...
  function o (line 2) | function o(){}
  function i (line 2) | function i(){}
  function e (line 2) | function e(e,t,n,o,i,a){if(a!==r){var l=new Error("Calling PropTypes val...
  function t (line 2) | function t(){return e}
  function i (line 2) | function i(e){for(var t="https://reactjs.org/docs/error-decoder.html?inv...
  function u (line 2) | function u(e,t){c(e,t),c(e+"Capture",t)}
  function c (line 2) | function c(e,t){for(l[e]=t,e=0;e<t.length;e++)a.add(t[e])}
  function h (line 2) | function h(e,t,n,r,o,i,a){this.acceptsBooleans=2===t||3===t||4===t,this....
  function v (line 2) | function v(e){return e[1].toUpperCase()}
  function g (line 2) | function g(e,t,n,r){var o=m.hasOwnProperty(t)?m[t]:null;(null!==o?0!==o....
  function M (line 2) | function M(e){return null===e||"object"!=typeof e?null:"function"==typeo...
  function z (line 2) | function z(e){if(void 0===D)try{throw Error()}catch(e){var t=e.stack.tri...
  function F (line 2) | function F(e,t){if(!e||B)return"";B=!0;var n=Error.prepareStackTrace;Err...
  function U (line 2) | function U(e){switch(e.tag){case 5:return z(e.type);case 16:return z("La...
  function W (line 2) | function W(e){if(null==e)return null;if("function"==typeof e)return e.di...
  function H (line 2) | function H(e){var t=e.type;switch(e.tag){case 24:return"Cache";case 9:re...
  function V (line 2) | function V(e){switch(typeof e){case"boolean":case"number":case"string":c...
  function G (line 2) | function G(e){var t=e.type;return(e=e.nodeName)&&"input"===e.toLowerCase...
  function q (line 2) | function q(e){e._valueTracker||(e._valueTracker=function(e){var t=G(e)?"...
  function Q (line 2) | function Q(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var n=...
  function Y (line 2) | function Y(e){if(void 0===(e=e||("undefined"!=typeof document?document:v...
  function Z (line 2) | function Z(e,t){var n=t.checked;return L({},t,{defaultChecked:void 0,def...
  function J (line 2) | function J(e,t){var n=null==t.defaultValue?"":t.defaultValue,r=null!=t.c...
  function X (line 2) | function X(e,t){null!=(t=t.checked)&&g(e,"checked",t,!1)}
  function K (line 2) | function K(e,t){X(e,t);var n=V(t.value),r=t.type;if(null!=n)"number"===r...
  function $ (line 2) | function $(e,t,n){if(t.hasOwnProperty("value")||t.hasOwnProperty("defaul...
  function ee (line 2) | function ee(e,t,n){"number"===t&&Y(e.ownerDocument)===e||(null==n?e.defa...
  function ne (line 2) | function ne(e,t,n,r){if(e=e.options,t){t={};for(var o=0;o<n.length;o++)t...
  function re (line 2) | function re(e,t){if(null!=t.dangerouslySetInnerHTML)throw Error(i(91));r...
  function oe (line 2) | function oe(e,t){var n=t.value;if(null==n){if(n=t.children,t=t.defaultVa...
  function ie (line 2) | function ie(e,t){var n=V(t.value),r=V(t.defaultValue);null!=n&&((n=""+n)...
  function ae (line 2) | function ae(e){var t=e.textContent;t===e._wrapperState.initialValue&&""!...
  function le (line 2) | function le(e){switch(e){case"svg":return"http://www.w3.org/2000/svg";ca...
  function ue (line 2) | function ue(e,t){return null==e||"http://www.w3.org/1999/xhtml"===e?le(t...
  function pe (line 2) | function pe(e,t){if(t){var n=e.firstChild;if(n&&n===e.lastChild&&3===n.n...
  function he (line 2) | function he(e,t,n){return null==t||"boolean"==typeof t||""===t?"":n||"nu...
  function me (line 2) | function me(e,t){for(var n in e=e.style,t)if(t.hasOwnProperty(n)){var r=...
  function ve (line 2) | function ve(e,t){if(t){if(be[e]&&(null!=t.children||null!=t.dangerouslyS...
  function ge (line 2) | function ge(e,t){if(-1===e.indexOf("-"))return"string"==typeof t.is;swit...
  function Se (line 2) | function Se(e){return(e=e.target||e.srcElement||window).correspondingUse...
  function Pe (line 2) | function Pe(e){if(e=wo(e)){if("function"!=typeof Oe)throw Error(i(280));...
  function xe (line 2) | function xe(e){Ee?ke?ke.push(e):ke=[e]:Ee=e}
  function je (line 2) | function je(){if(Ee){var e=Ee,t=ke;if(ke=Ee=null,Pe(e),t)for(e=0;e<t.len...
  function Ce (line 2) | function Ce(e,t){return e(t)}
  function Te (line 2) | function Te(){}
  function Re (line 2) | function Re(e,t,n){if(Ae)return e(t,n);Ae=!0;try{return Ce(e,t,n)}finall...
  function _e (line 2) | function _e(e,t){var n=e.stateNode;if(null===n)return null;var r=Oo(n);i...
  function Me (line 2) | function Me(e,t,n,r,o,i,a,l,u){var c=Array.prototype.slice.call(argument...
  function Ue (line 2) | function Ue(e,t,n,r,o,i,a,l,u){De=!1,Le=null,Me.apply(Fe,arguments)}
  function We (line 2) | function We(e){var t=e,n=e;if(e.alternate)for(;t.return;)t=t.return;else...
  function He (line 2) | function He(e){if(13===e.tag){var t=e.memoizedState;if(null===t&&null!==...
  function Ve (line 2) | function Ve(e){if(We(e)!==e)throw Error(i(188))}
  function Ge (line 2) | function Ge(e){return null!==(e=function(e){var t=e.alternate;if(!t){if(...
  function qe (line 2) | function qe(e){if(5===e.tag||6===e.tag)return e;for(e=e.child;null!==e;)...
  function ft (line 2) | function ft(e){switch(e&-e){case 1:return 1;case 2:return 2;case 4:retur...
  function pt (line 2) | function pt(e,t){var n=e.pendingLanes;if(0===n)return 0;var r=0,o=e.susp...
  function dt (line 2) | function dt(e,t){switch(e){case 1:case 2:case 4:return t+250;case 8:case...
  function yt (line 2) | function yt(e){return 0!=(e=-1073741825&e.pendingLanes)?e:1073741824&e?1...
  function ht (line 2) | function ht(){var e=ct;return 0==(4194240&(ct<<=1))&&(ct=64),e}
  function mt (line 2) | function mt(e){for(var t=[],n=0;31>n;n++)t.push(e);return t}
  function bt (line 2) | function bt(e,t,n){e.pendingLanes|=t,536870912!==t&&(e.suspendedLanes=0,...
  function vt (line 2) | function vt(e,t){var n=e.entangledLanes|=t;for(e=e.entanglements;n;){var...
  function wt (line 2) | function wt(e){return 1<(e&=-e)?4<e?0!=(268435455&e)?16:536870912:4:1}
  function Mt (line 2) | function Mt(e,t){switch(e){case"focusin":case"focusout":Ct=null;break;ca...
  function Dt (line 2) | function Dt(e,t,n,r,o,i){return null===e||e.nativeEvent!==i?(e={blockedO...
  function Lt (line 2) | function Lt(e){var t=go(e.target);if(null!==t){var n=We(t);if(null!==n)i...
  function zt (line 2) | function zt(e){if(null!==e.blockedOn)return!1;for(var t=e.targetContaine...
  function Bt (line 2) | function Bt(e,t,n){zt(e)&&n.delete(t)}
  function Ft (line 2) | function Ft(){xt=!1,null!==Ct&&zt(Ct)&&(Ct=null),null!==Tt&&zt(Tt)&&(Tt=...
  function Ut (line 2) | function Ut(e,t){e.blockedOn===t&&(e.blockedOn=null,xt||(xt=!0,o.unstabl...
  function Wt (line 2) | function Wt(e){function t(t){return Ut(t,e)}if(0<jt.length){Ut(jt[0],e);...
  function Gt (line 2) | function Gt(e,t,n,r){var o=gt,i=Ht.transition;Ht.transition=null;try{gt=...
  function qt (line 2) | function qt(e,t,n,r){var o=gt,i=Ht.transition;Ht.transition=null;try{gt=...
  function Qt (line 2) | function Qt(e,t,n,r){if(Vt){var o=Zt(e,t,n,r);if(null===o)Vr(e,t,r,Yt,n)...
  function Zt (line 2) | function Zt(e,t,n,r){if(Yt=null,null!==(e=go(e=Se(r))))if(null===(t=We(e...
  function Jt (line 2) | function Jt(e){switch(e){case"cancel":case"click":case"close":case"conte...
  function en (line 2) | function en(){if($t)return $t;var e,t,n=Kt,r=n.length,o="value"in Xt?Xt....
  function tn (line 2) | function tn(e){var t=e.keyCode;return"charCode"in e?0===(e=e.charCode)&&...
  function nn (line 2) | function nn(){return!0}
  function rn (line 2) | function rn(){return!1}
  function on (line 2) | function on(e){function t(t,n,r,o,i){for(var a in this._reactName=t,this...
  function kn (line 2) | function kn(e){var t=this.nativeEvent;return t.getModifierState?t.getMod...
  function Pn (line 2) | function Pn(){return kn}
  function Fn (line 2) | function Fn(e,t){switch(e){case"keyup":return-1!==In.indexOf(t.keyCode);...
  function Un (line 2) | function Un(e){return"object"==typeof(e=e.detail)&&"data"in e?e.data:null}
  function Vn (line 2) | function Vn(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return"inpu...
  function Gn (line 2) | function Gn(e,t,n,r){xe(r),0<(t=qr(t,"onChange")).length&&(n=new sn("onC...
  function Yn (line 2) | function Yn(e){zr(e,0)}
  function Zn (line 2) | function Zn(e){if(Q(So(e)))return e}
  function Jn (line 2) | function Jn(e,t){if("change"===e)return t}
  function tr (line 2) | function tr(){qn&&(qn.detachEvent("onpropertychange",nr),Qn=qn=null)}
  function nr (line 2) | function nr(e){if("value"===e.propertyName&&Zn(Qn)){var t=[];Gn(t,Qn,e,S...
  function rr (line 2) | function rr(e,t,n){"focusin"===e?(tr(),Qn=n,(qn=t).attachEvent("onproper...
  function or (line 2) | function or(e){if("selectionchange"===e||"keyup"===e||"keydown"===e)retu...
  function ir (line 2) | function ir(e,t){if("click"===e)return Zn(t)}
  function ar (line 2) | function ar(e,t){if("input"===e||"change"===e)return Zn(t)}
  function ur (line 2) | function ur(e,t){if(lr(e,t))return!0;if("object"!=typeof e||null===e||"o...
  function cr (line 2) | function cr(e){for(;e&&e.firstChild;)e=e.firstChild;return e}
  function sr (line 2) | function sr(e,t){var n,r=cr(e);for(e=0;r;){if(3===r.nodeType){if(n=e+r.t...
  function fr (line 2) | function fr(e,t){return!(!e||!t)&&(e===t||(!e||3!==e.nodeType)&&(t&&3===...
  function pr (line 2) | function pr(){for(var e=window,t=Y();t instanceof e.HTMLIFrameElement;){...
  function dr (line 2) | function dr(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(...
  function yr (line 2) | function yr(e){var t=pr(),n=e.focusedElem,r=e.selectionRange;if(t!==n&&n...
  function wr (line 2) | function wr(e,t,n){var r=n.window===n?n.document:9===n.nodeType?n:n.owne...
  function Sr (line 2) | function Sr(e,t){var n={};return n[e.toLowerCase()]=t.toLowerCase(),n["W...
  function Pr (line 2) | function Pr(e){if(Er[e])return Er[e];if(!Or[e])return e;var t,n=Or[e];fo...
  function _r (line 2) | function _r(e,t){Ar.set(e,t),u(t,[e])}
  function Lr (line 2) | function Lr(e,t,n){var r=e.type||"unknown-event";e.currentTarget=n,funct...
  function zr (line 2) | function zr(e,t){t=0!=(4&t);for(var n=0;n<e.length;n++){var r=e[n],o=r.e...
  function Br (line 2) | function Br(e,t){var n=t[mo];void 0===n&&(n=t[mo]=new Set);var r=e+"__bu...
  function Fr (line 2) | function Fr(e,t,n){var r=0;t&&(r|=4),Hr(n,e,r,t)}
  function Wr (line 2) | function Wr(e){if(!e[Ur]){e[Ur]=!0,a.forEach((function(t){"selectionchan...
  function Hr (line 2) | function Hr(e,t,n,r){switch(Jt(t)){case 1:var o=Gt;break;case 4:o=qt;bre...
  function Vr (line 2) | function Vr(e,t,n,r,o){var i=r;if(0==(1&t)&&0==(2&t)&&null!==r)e:for(;;)...
  function Gr (line 2) | function Gr(e,t,n){return{instance:e,listener:t,currentTarget:n}}
  function qr (line 2) | function qr(e,t){for(var n=t+"Capture",r=[];null!==e;){var o=e,i=o.state...
  function Qr (line 2) | function Qr(e){if(null===e)return null;do{e=e.return}while(e&&5!==e.tag)...
  function Yr (line 2) | function Yr(e,t,n,r,o){for(var i=t._reactName,a=[];null!==n&&n!==r;){var...
  function Xr (line 2) | function Xr(e){return("string"==typeof e?e:""+e).replace(Zr,"\n").replac...
  function Kr (line 2) | function Kr(e,t,n){if(t=Xr(t),Xr(e)!==t&&n)throw Error(i(425))}
  function $r (line 2) | function $r(){}
  function no (line 2) | function no(e,t){return"textarea"===e||"noscript"===e||"string"==typeof ...
  function lo (line 2) | function lo(e){setTimeout((function(){throw e}))}
  function uo (line 2) | function uo(e,t){var n=t,r=0;do{var o=n.nextSibling;if(e.removeChild(n),...
  function co (line 2) | function co(e){for(;null!=e;e=e.nextSibling){var t=e.nodeType;if(1===t||...
  function so (line 2) | function so(e){e=e.previousSibling;for(var t=0;e;){if(8===e.nodeType){va...
  function go (line 2) | function go(e){var t=e[po];if(t)return t;for(var n=e.parentNode;n;){if(t...
  function wo (line 2) | function wo(e){return!(e=e[po]||e[ho])||5!==e.tag&&6!==e.tag&&13!==e.tag...
  function So (line 2) | function So(e){if(5===e.tag||6===e.tag)return e.stateNode;throw Error(i(...
  function Oo (line 2) | function Oo(e){return e[yo]||null}
  function Po (line 2) | function Po(e){return{current:e}}
  function xo (line 2) | function xo(e){0>ko||(e.current=Eo[ko],Eo[ko]=null,ko--)}
  function jo (line 2) | function jo(e,t){ko++,Eo[ko]=e.current,e.current=t}
  function _o (line 2) | function _o(e,t){var n=e.type.contextTypes;if(!n)return Co;var r=e.state...
  function Io (line 2) | function Io(e){return null!=e.childContextTypes}
  function No (line 2) | function No(){xo(Ao),xo(To)}
  function Mo (line 2) | function Mo(e,t,n){if(To.current!==Co)throw Error(i(168));jo(To,t),jo(Ao...
  function Do (line 2) | function Do(e,t,n){var r=e.stateNode;if(t=t.childContextTypes,"function"...
  function Lo (line 2) | function Lo(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMerged...
  function zo (line 2) | function zo(e,t,n){var r=e.stateNode;if(!r)throw Error(i(169));n?(e=Do(e...
  function Wo (line 2) | function Wo(e){null===Bo?Bo=[e]:Bo.push(e)}
  function Ho (line 2) | function Ho(){if(!Uo&&null!==Bo){Uo=!0;var e=0,t=gt;try{var n=Bo;for(gt=...
  function $o (line 2) | function $o(e,t){Vo[Go++]=Qo,Vo[Go++]=qo,qo=e,Qo=t}
  function ei (line 2) | function ei(e,t,n){Yo[Zo++]=Xo,Yo[Zo++]=Ko,Yo[Zo++]=Jo,Jo=e;var r=Xo;e=K...
  function ti (line 2) | function ti(e){null!==e.return&&($o(e,1),ei(e,1,0))}
  function ni (line 2) | function ni(e){for(;e===qo;)qo=Vo[--Go],Vo[Go]=null,Qo=Vo[--Go],Vo[Go]=n...
  function li (line 2) | function li(e,t){var n=_c(5,null,null,0);n.elementType="DELETED",n.state...
  function ui (line 2) | function ui(e,t){switch(e.tag){case 5:var n=e.type;return null!==(t=1!==...
  function ci (line 2) | function ci(e){return 0!=(1&e.mode)&&0==(128&e.flags)}
  function si (line 2) | function si(e){if(ii){var t=oi;if(t){var n=t;if(!ui(e,t)){if(ci(e))throw...
  function fi (line 2) | function fi(e){for(e=e.return;null!==e&&5!==e.tag&&3!==e.tag&&13!==e.tag...
  function pi (line 2) | function pi(e){if(e!==ri)return!1;if(!ii)return fi(e),ii=!0,!1;var t;if(...
  function di (line 2) | function di(){for(var e=oi;e;)e=co(e.nextSibling)}
  function yi (line 2) | function yi(){oi=ri=null,ii=!1}
  function hi (line 2) | function hi(e){null===ai?ai=[e]:ai.push(e)}
  function bi (line 2) | function bi(e,t){if(e&&e.defaultProps){for(var n in t=L({},t),e=e.defaul...
  function Oi (line 2) | function Oi(){Si=wi=gi=null}
  function Ei (line 2) | function Ei(e){var t=vi.current;xo(vi),e._currentValue=t}
  function ki (line 2) | function ki(e,t,n){for(;null!==e;){var r=e.alternate;if((e.childLanes&t)...
  function Pi (line 2) | function Pi(e,t){gi=e,Si=wi=null,null!==(e=e.dependencies)&&null!==e.fir...
  function xi (line 2) | function xi(e){var t=e._currentValue;if(Si!==e)if(e={context:e,memoizedV...
  function Ci (line 2) | function Ci(e){null===ji?ji=[e]:ji.push(e)}
  function Ti (line 2) | function Ti(e,t,n,r){var o=t.interleaved;return null===o?(n.next=n,Ci(t)...
  function Ai (line 2) | function Ai(e,t){e.lanes|=t;var n=e.alternate;for(null!==n&&(n.lanes|=t)...
  function _i (line 2) | function _i(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:...
  function Ii (line 2) | function Ii(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={base...
  function Ni (line 2) | function Ni(e,t){return{eventTime:e,lane:t,tag:0,payload:null,callback:n...
  function Mi (line 2) | function Mi(e,t,n){var r=e.updateQueue;if(null===r)return null;if(r=r.sh...
  function Di (line 2) | function Di(e,t,n){if(null!==(t=t.updateQueue)&&(t=t.shared,0!=(4194240&...
  function Li (line 2) | function Li(e,t){var n=e.updateQueue,r=e.alternate;if(null!==r&&n===(r=r...
  function zi (line 2) | function zi(e,t,n,r){var o=e.updateQueue;Ri=!1;var i=o.firstBaseUpdate,a...
  function Bi (line 2) | function Bi(e,t,n){if(e=t.effects,t.effects=null,null!==e)for(t=0;t<e.le...
  function Ui (line 2) | function Ui(e,t,n,r){n=null==(n=n(r,t=e.memoizedState))?t:L({},t,n),e.me...
  function Hi (line 2) | function Hi(e,t,n,r,o,i,a){return"function"==typeof(e=e.stateNode).shoul...
  function Vi (line 2) | function Vi(e,t,n){var r=!1,o=Co,i=t.contextType;return"object"==typeof ...
  function Gi (line 2) | function Gi(e,t,n,r){e=t.state,"function"==typeof t.componentWillReceive...
  function qi (line 2) | function qi(e,t,n,r){var o=e.stateNode;o.props=n,o.state=e.memoizedState...
  function Qi (line 2) | function Qi(e,t,n){if(null!==(e=n.ref)&&"function"!=typeof e&&"object"!=...
  function Yi (line 2) | function Yi(e,t){throw e=Object.prototype.toString.call(t),Error(i(31,"[...
  function Zi (line 2) | function Zi(e){return(0,e._init)(e._payload)}
  function Ji (line 2) | function Ji(e){function t(t,n){if(e){var r=t.deletions;null===r?(t.delet...
  function ra (line 2) | function ra(e){if(e===$i)throw Error(i(174));return e}
  function oa (line 2) | function oa(e,t){switch(jo(na,t),jo(ta,e),jo(ea,$i),e=t.nodeType){case 9...
  function ia (line 2) | function ia(){xo(ea),xo(ta),xo(na)}
  function aa (line 2) | function aa(e){ra(na.current);var t=ra(ea.current),n=ue(t,e.type);t!==n&...
  function la (line 2) | function la(e){ta.current===e&&(xo(ea),xo(ta))}
  function ca (line 2) | function ca(e){for(var t=e;null!==t;){if(13===t.tag){var n=t.memoizedSta...
  function fa (line 2) | function fa(){for(var e=0;e<sa.length;e++)sa[e]._workInProgressVersionPr...
  function Oa (line 2) | function Oa(){throw Error(i(321))}
  function Ea (line 2) | function Ea(e,t){if(null===t)return!1;for(var n=0;n<t.length&&n<e.length...
  function ka (line 2) | function ka(e,t,n,r,o,a){if(ya=a,ha=t,t.memoizedState=null,t.updateQueue...
  function Pa (line 2) | function Pa(){var e=0!==wa;return wa=0,e}
  function xa (line 2) | function xa(){var e={memoizedState:null,baseState:null,baseQueue:null,qu...
  function ja (line 2) | function ja(){if(null===ma){var e=ha.alternate;e=null!==e?e.memoizedStat...
  function Ca (line 2) | function Ca(e,t){return"function"==typeof t?t(e):t}
  function Ta (line 2) | function Ta(e){var t=ja(),n=t.queue;if(null===n)throw Error(i(311));n.la...
  function Aa (line 2) | function Aa(e){var t=ja(),n=t.queue;if(null===n)throw Error(i(311));n.la...
  function Ra (line 2) | function Ra(){}
  function _a (line 2) | function _a(e,t){var n=ha,r=ja(),o=t(),a=!lr(r.memoizedState,o);if(a&&(r...
  function Ia (line 2) | function Ia(e,t,n){e.flags|=16384,e={getSnapshot:t,value:n},null===(t=ha...
  function Na (line 2) | function Na(e,t,n,r){t.value=n,t.getSnapshot=r,Da(t)&&La(e)}
  function Ma (line 2) | function Ma(e,t,n){return n((function(){Da(t)&&La(e)}))}
  function Da (line 2) | function Da(e){var t=e.getSnapshot;e=e.value;try{var n=t();return!lr(e,n...
  function La (line 2) | function La(e){var t=Ai(e,1);null!==t&&rc(t,e,1,-1)}
  function za (line 2) | function za(e){var t=xa();return"function"==typeof e&&(e=e()),t.memoized...
  function Ba (line 2) | function Ba(e,t,n,r){return e={tag:e,create:t,destroy:n,deps:r,next:null...
  function Fa (line 2) | function Fa(){return ja().memoizedState}
  function Ua (line 2) | function Ua(e,t,n,r){var o=xa();ha.flags|=e,o.memoizedState=Ba(1|t,n,voi...
  function Wa (line 2) | function Wa(e,t,n,r){var o=ja();r=void 0===r?null:r;var i=void 0;if(null...
  function Ha (line 2) | function Ha(e,t){return Ua(8390656,8,e,t)}
  function Va (line 2) | function Va(e,t){return Wa(2048,8,e,t)}
  function Ga (line 2) | function Ga(e,t){return Wa(4,2,e,t)}
  function qa (line 2) | function qa(e,t){return Wa(4,4,e,t)}
  function Qa (line 2) | function Qa(e,t){return"function"==typeof t?(e=e(),t(e),function(){t(nul...
  function Ya (line 2) | function Ya(e,t,n){return n=null!=n?n.concat([e]):null,Wa(4,4,Qa.bind(nu...
  function Za (line 2) | function Za(){}
  function Ja (line 2) | function Ja(e,t){var n=ja();t=void 0===t?null:t;var r=n.memoizedState;re...
  function Xa (line 2) | function Xa(e,t){var n=ja();t=void 0===t?null:t;var r=n.memoizedState;re...
  function Ka (line 2) | function Ka(e,t,n){return 0==(21&ya)?(e.baseState&&(e.baseState=!1,wl=!0...
  function $a (line 2) | function $a(e,t){var n=gt;gt=0!==n&&4>n?n:4,e(!0);var r=da.transition;da...
  function el (line 2) | function el(){return ja().memoizedState}
  function tl (line 2) | function tl(e,t,n){var r=nc(e);n={lane:r,action:n,hasEagerState:!1,eager...
  function nl (line 2) | function nl(e,t,n){var r=nc(e),o={lane:r,action:n,hasEagerState:!1,eager...
  function rl (line 2) | function rl(e){var t=e.alternate;return e===ha||null!==t&&t===ha}
  function ol (line 2) | function ol(e,t){ga=va=!0;var n=e.pending;null===n?t.next=t:(t.next=n.ne...
  function il (line 2) | function il(e,t,n){if(0!=(4194240&n)){var r=t.lanes;n|=r&=e.pendingLanes...
  function sl (line 2) | function sl(e,t){try{var n="",r=t;do{n+=U(r),r=r.return}while(r);var o=n...
  function fl (line 2) | function fl(e,t,n){return{value:e,source:null,stack:null!=n?n:null,diges...
  function pl (line 2) | function pl(e,t){try{console.error(t.value)}catch(e){setTimeout((functio...
  function yl (line 2) | function yl(e,t,n){(n=Ni(-1,n)).tag=3,n.payload={element:null};var r=t.v...
  function hl (line 2) | function hl(e,t,n){(n=Ni(-1,n)).tag=3;var r=e.type.getDerivedStateFromEr...
  function ml (line 2) | function ml(e,t,n){var r=e.pingCache;if(null===r){r=e.pingCache=new dl;v...
  function bl (line 2) | function bl(e){do{var t;if((t=13===e.tag)&&(t=null===(t=e.memoizedState)...
  function vl (line 2) | function vl(e,t,n,r,o){return 0==(1&e.mode)?(e===t?e.flags|=65536:(e.fla...
  function Sl (line 2) | function Sl(e,t,n,r){t.child=null===e?Ki(t,null,n,r):Xi(t,e.child,n,r)}
  function Ol (line 2) | function Ol(e,t,n,r,o){n=n.render;var i=t.ref;return Pi(t,o),r=ka(e,t,n,...
  function El (line 2) | function El(e,t,n,r,o){if(null===e){var i=n.type;return"function"!=typeo...
  function kl (line 2) | function kl(e,t,n,r,o){if(null!==e){var i=e.memoizedProps;if(ur(i,r)&&e....
  function Pl (line 2) | function Pl(e,t,n){var r=t.pendingProps,o=r.children,i=null!==e?e.memoiz...
  function xl (line 2) | function xl(e,t){var n=t.ref;(null===e&&null!==n||null!==e&&e.ref!==n)&&...
  function jl (line 2) | function jl(e,t,n,r,o){var i=Io(n)?Ro:To.current;return i=_o(t,i),Pi(t,o...
  function Cl (line 2) | function Cl(e,t,n,r,o){if(Io(n)){var i=!0;Lo(t)}else i=!1;if(Pi(t,o),nul...
  function Tl (line 2) | function Tl(e,t,n,r,o,i){xl(e,t);var a=0!=(128&t.flags);if(!r&&!a)return...
  function Al (line 2) | function Al(e){var t=e.stateNode;t.pendingContext?Mo(0,t.pendingContext,...
  function Rl (line 2) | function Rl(e,t,n,r,o){return yi(),hi(o),t.flags|=256,Sl(e,t,n,r),t.child}
  function Ll (line 2) | function Ll(e){return{baseLanes:e,cachePool:null,transitions:null}}
  function zl (line 2) | function zl(e,t,n){var r,o=t.pendingProps,a=ua.current,l=!1,u=0!=(128&t....
  function Bl (line 2) | function Bl(e,t){return(t=Lc({mode:"visible",children:t},e.mode,0,null))...
  function Fl (line 2) | function Fl(e,t,n,r){return null!==r&&hi(r),Xi(t,e.child,null,n),(e=Bl(t...
  function Ul (line 2) | function Ul(e,t,n){e.lanes|=t;var r=e.alternate;null!==r&&(r.lanes|=t),k...
  function Wl (line 2) | function Wl(e,t,n,r,o){var i=e.memoizedState;null===i?e.memoizedState={i...
  function Hl (line 2) | function Hl(e,t,n){var r=t.pendingProps,o=r.revealOrder,i=r.tail;if(Sl(e...
  function Vl (line 2) | function Vl(e,t){0==(1&t.mode)&&null!==e&&(e.alternate=null,t.alternate=...
  function Gl (line 2) | function Gl(e,t,n){if(null!==e&&(t.dependencies=e.dependencies),Lu|=t.la...
  function ql (line 2) | function ql(e,t){if(!ii)switch(e.tailMode){case"hidden":t=e.tail;for(var...
  function Ql (line 2) | function Ql(e){var t=null!==e.alternate&&e.alternate.child===e.child,n=0...
  function Yl (line 2) | function Yl(e,t,n){var r=t.pendingProps;switch(ni(t),t.tag){case 2:case ...
  function Zl (line 2) | function Zl(e,t){switch(ni(t),t.tag){case 1:return Io(t.type)&&No(),6553...
  function eu (line 2) | function eu(e,t){var n=e.ref;if(null!==n)if("function"==typeof n)try{n(n...
  function tu (line 2) | function tu(e,t,n){try{n()}catch(n){Pc(e,t,n)}}
  function ru (line 2) | function ru(e,t,n){var r=t.updateQueue;if(null!==(r=null!==r?r.lastEffec...
  function ou (line 2) | function ou(e,t){if(null!==(t=null!==(t=t.updateQueue)?t.lastEffect:null...
  function iu (line 2) | function iu(e){var t=e.ref;if(null!==t){var n=e.stateNode;e.tag,e=n,"fun...
  function au (line 2) | function au(e){var t=e.alternate;null!==t&&(e.alternate=null,au(t)),e.ch...
  function lu (line 2) | function lu(e){return 5===e.tag||3===e.tag||4===e.tag}
  function uu (line 2) | function uu(e){e:for(;;){for(;null===e.sibling;){if(null===e.return||lu(...
  function cu (line 2) | function cu(e,t,n){var r=e.tag;if(5===r||6===r)e=e.stateNode,t?8===n.nod...
  function su (line 2) | function su(e,t,n){var r=e.tag;if(5===r||6===r)e=e.stateNode,t?n.insertB...
  function du (line 2) | function du(e,t,n){for(n=n.child;null!==n;)yu(e,t,n),n=n.sibling}
  function yu (line 2) | function yu(e,t,n){if(it&&"function"==typeof it.onCommitFiberUnmount)try...
  function hu (line 2) | function hu(e){var t=e.updateQueue;if(null!==t){e.updateQueue=null;var n...
  function mu (line 2) | function mu(e,t){var n=t.deletions;if(null!==n)for(var r=0;r<n.length;r+...
  function bu (line 2) | function bu(e,t){var n=e.alternate,r=e.flags;switch(e.tag){case 0:case 1...
  function vu (line 2) | function vu(e){var t=e.flags;if(2&t){try{e:{for(var n=e.return;null!==n;...
  function gu (line 2) | function gu(e,t,n){$l=e,wu(e,t,n)}
  function wu (line 2) | function wu(e,t,n){for(var r=0!=(1&e.mode);null!==$l;){var o=$l,i=o.chil...
  function Su (line 2) | function Su(e){for(;null!==$l;){var t=$l;if(0!=(8772&t.flags)){var n=t.a...
  function Ou (line 2) | function Ou(e){for(;null!==$l;){var t=$l;if(t===e){$l=null;break}var n=t...
  function Eu (line 2) | function Eu(e){for(;null!==$l;){var t=$l;try{switch(t.tag){case 0:case 1...
  function tc (line 2) | function tc(){return 0!=(6&Tu)?Xe():-1!==$u?$u:$u=Xe()}
  function nc (line 2) | function nc(e){return 0==(1&e.mode)?1:0!=(2&Tu)&&0!==_u?_u&-_u:null!==mi...
  function rc (line 2) | function rc(e,t,n,r){if(50<Xu)throw Xu=0,Ku=null,Error(i(185));bt(e,n,r)...
  function oc (line 2) | function oc(e,t){var n=e.callbackNode;!function(e,t){for(var n=e.suspend...
  function ic (line 2) | function ic(e,t){if($u=-1,ec=0,0!=(6&Tu))throw Error(i(327));var n=e.cal...
  function ac (line 2) | function ac(e,t){var n=Fu;return e.current.memoizedState.isDehydrated&&(...
  function lc (line 2) | function lc(e){null===Uu?Uu=e:Uu.push.apply(Uu,e)}
  function uc (line 2) | function uc(e,t){for(t&=~Bu,t&=~zu,e.suspendedLanes|=t,e.pingedLanes&=~t...
  function cc (line 2) | function cc(e){if(0!=(6&Tu))throw Error(i(327));Ec();var t=pt(e,0);if(0=...
  function sc (line 2) | function sc(e,t){var n=Tu;Tu|=1;try{return e(t)}finally{0===(Tu=n)&&(Hu=...
  function fc (line 2) | function fc(e){null!==Zu&&0===Zu.tag&&0==(6&Tu)&&Ec();var t=Tu;Tu|=1;var...
  function pc (line 2) | function pc(){Iu=Nu.current,xo(Nu)}
  function dc (line 2) | function dc(e,t){e.finishedWork=null,e.finishedLanes=0;var n=e.timeoutHa...
  function yc (line 2) | function yc(e,t){for(;;){var n=Ru;try{if(Oi(),pa.current=al,va){for(var ...
  function hc (line 2) | function hc(){var e=xu.current;return xu.current=al,null===e?al:e}
  function mc (line 2) | function mc(){0!==Mu&&3!==Mu&&2!==Mu||(Mu=4),null===Au||0==(268435455&Lu...
  function bc (line 2) | function bc(e,t){var n=Tu;Tu|=2;var r=hc();for(Au===e&&_u===t||(Vu=null,...
  function vc (line 2) | function vc(){for(;null!==Ru;)wc(Ru)}
  function gc (line 2) | function gc(){for(;null!==Ru&&!Ze();)wc(Ru)}
  function wc (line 2) | function wc(e){var t=ku(e.alternate,e,Iu);e.memoizedProps=e.pendingProps...
  function Sc (line 2) | function Sc(e){var t=e;do{var n=t.alternate;if(e=t.return,0==(32768&t.fl...
  function Oc (line 2) | function Oc(e,t,n){var r=gt,o=Cu.transition;try{Cu.transition=null,gt=1,...
  function Ec (line 2) | function Ec(){if(null!==Zu){var e=wt(Ju),t=Cu.transition,n=gt;try{if(Cu....
  function kc (line 2) | function kc(e,t,n){e=Mi(e,t=yl(0,t=sl(n,t),1),1),t=tc(),null!==e&&(bt(e,...
  function Pc (line 2) | function Pc(e,t,n){if(3===e.tag)kc(e,e,n);else for(;null!==t;){if(3===t....
  function xc (line 2) | function xc(e,t,n){var r=e.pingCache;null!==r&&r.delete(t),t=tc(),e.ping...
  function jc (line 2) | function jc(e,t){0===t&&(0==(1&e.mode)?t=1:(t=st,0==(130023424&(st<<=1))...
  function Cc (line 2) | function Cc(e){var t=e.memoizedState,n=0;null!==t&&(n=t.retryLane),jc(e,n)}
  function Tc (line 2) | function Tc(e,t){var n=0;switch(e.tag){case 13:var r=e.stateNode,o=e.mem...
  function Ac (line 2) | function Ac(e,t){return Qe(e,t)}
  function Rc (line 2) | function Rc(e,t,n,r){this.tag=e,this.key=n,this.sibling=this.child=this....
  function _c (line 2) | function _c(e,t,n,r){return new Rc(e,t,n,r)}
  function Ic (line 2) | function Ic(e){return!(!(e=e.prototype)||!e.isReactComponent)}
  function Nc (line 2) | function Nc(e,t){var n=e.alternate;return null===n?((n=_c(e.tag,t,e.key,...
  function Mc (line 2) | function Mc(e,t,n,r,o,a){var l=2;if(r=e,"function"==typeof e)Ic(e)&&(l=1...
  function Dc (line 2) | function Dc(e,t,n,r){return(e=_c(7,e,r,t)).lanes=n,e}
  function Lc (line 2) | function Lc(e,t,n,r){return(e=_c(22,e,r,t)).elementType=I,e.lanes=n,e.st...
  function zc (line 2) | function zc(e,t,n){return(e=_c(6,e,null,t)).lanes=n,e}
  function Bc (line 2) | function Bc(e,t,n){return(t=_c(4,null!==e.children?e.children:[],e.key,t...
  function Fc (line 2) | function Fc(e,t,n,r,o){this.tag=t,this.containerInfo=e,this.finishedWork...
  function Uc (line 2) | function Uc(e,t,n,r,o,i,a,l,u){return e=new Fc(e,t,n,l,u),1===t?(t=1,!0=...
  function Wc (line 2) | function Wc(e){if(!e)return Co;e:{if(We(e=e._reactInternals)!==e||1!==e....
  function Hc (line 2) | function Hc(e,t,n,r,o,i,a,l,u){return(e=Uc(n,r,!0,e,0,i,0,l,u)).context=...
  function Vc (line 2) | function Vc(e,t,n,r){var o=t.current,i=tc(),a=nc(o);return n=Wc(n),null=...
  function Gc (line 2) | function Gc(e){return(e=e.current).child?(e.child.tag,e.child.stateNode)...
  function qc (line 2) | function qc(e,t){if(null!==(e=e.memoizedState)&&null!==e.dehydrated){var...
  function Qc (line 2) | function Qc(e,t){qc(e,t),(e=e.alternate)&&qc(e,t)}
  function Zc (line 2) | function Zc(e){this._internalRoot=e}
  function Jc (line 2) | function Jc(e){this._internalRoot=e}
  function Xc (line 2) | function Xc(e){return!(!e||1!==e.nodeType&&9!==e.nodeType&&11!==e.nodeTy...
  function Kc (line 2) | function Kc(e){return!(!e||1!==e.nodeType&&9!==e.nodeType&&11!==e.nodeTy...
  function $c (line 2) | function $c(){}
  function es (line 2) | function es(e,t,n,r,o){var i=n._reactRootContainer;if(i){var a=i;if("fun...
  function r (line 2) | function r(){var e=this.constructor.getDerivedStateFromProps(this.props,...
  function o (line 2) | function o(e){this.setState(function(t){var n=this.constructor.getDerive...
  function i (line 2) | function i(e,t){try{var n=this.props,r=this.state;this.props=e,this.stat...
  function a (line 2) | function a(e){var t=e.prototype;if(!t||!t.isReactComponent)throw new Err...
  function e (line 2) | function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.en...
  function y (line 2) | function y(e){return e&&e.__esModule?e:{default:e}}
  function h (line 2) | function h(e,t){if(!e)throw new ReferenceError("this hasn't been initial...
  function S (line 2) | function S(e){return e()}
  function t (line 2) | function t(){var e,n,o;!function(e,t){if(!(e instanceof t))throw new Typ...
  function e (line 2) | function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.en...
  function h (line 2) | function h(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n ...
  function m (line 2) | function m(e){return e&&e.__esModule?e:{default:e}}
  function t (line 2) | function t(e){!function(e,t){if(!(e instanceof t))throw new TypeError("C...
  function l (line 2) | function l(e,t){if(!e||!e.length)throw new Error("react-modal: No elemen...
  function u (line 2) | function u(e){var t=e||a;return t?Array.isArray(t)||t instanceof HTMLCol...
  function u (line 2) | function u(){0!==l.length&&l[l.length-1].focusContent()}
  function o (line 2) | function o(e,t){e.classList.remove(t)}
  function u (line 2) | function u(){l=!0}
  function c (line 2) | function c(){if(l){if(l=!1,!a)return;setTimeout((function(){a.contains(d...
  function i (line 2) | function i(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0...
  function i (line 2) | function i(e){var t=e.offsetWidth<=0&&e.offsetHeight<=0;if(t&&!e.innerHT...
  function a (line 2) | function a(e){var t=e.getAttribute("tabindex");null===t&&(t=void 0);var ...
  function e (line 2) | function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.en...
  function c (line 2) | function c(e){return e&&e.__esModule?e:{default:e}}
  function s (line 2) | function s(e,t){if(!e)throw new ReferenceError("this hasn't been initial...
  function t (line 2) | function t(){var e,n,r;!function(e,t){if(!(e instanceof t))throw new Typ...
  function e (line 2) | function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.en...
  function u (line 2) | function u(e){return e&&e.__esModule?e:{default:e}}
  function c (line 2) | function c(e,t){if(!e)throw new ReferenceError("this hasn't been initial...
  function t (line 2) | function t(){var e,n,r;!function(e,t){if(!(e instanceof t))throw new Typ...
  function i (line 2) | function i(e){return e&&e.__esModule?e:{default:e}}
  function t (line 2) | function t(r){if(n[r])return n[r].exports;var o=n[r]={exports:{},id:r,lo...
  function n (line 2) | function n(){throw new Error("setTimeout has not been defined")}
  function r (line 2) | function r(){throw new Error("clearTimeout has not been defined")}
  function o (line 2) | function o(e){if(c===setTimeout)return setTimeout(e,0);if((c===n||!c)&&s...
  function i (line 2) | function i(){y&&p&&(y=!1,p.length?d=p.concat(d):h=-1,d.length&&a())}
  function a (line 2) | function a(){if(!y){var e=o(i);y=!0;for(var t=d.length;t;){for(p=d,d=[];...
  function l (line 2) | function l(e,t){this.fun=e,this.array=t}
  function u (line 2) | function u(){}
  function n (line 2) | function n(e){var t=-1!=e.indexOf("rgb"),n=-1!=e.indexOf("rgba"),r=e.mat...
  function r (line 2) | function r(e,t,n,r,o){return r+(e-t)/(n-t)*(o-r)}
  function r (line 2) | function r(e){return e&&e.__esModule?e:{default:e}}
  function e (line 2) | function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.en...
  function t (line 2) | function t(e){!function(e,t){if(!(e instanceof t))throw new TypeError("C...
  function n (line 2) | function n(e){return function(){return e}}
  function e (line 2) | function e(e,t,n,r,a,l){l!==i&&o(!1,"Calling PropTypes validators direct...
  function t (line 2) | function t(){return e}
  function r (line 2) | function r(e){return e&&e.__esModule?e:{default:e}}
  function e (line 2) | function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.en...
  function t (line 2) | function t(n){var r=this;(function(e,t){if(!(e instanceof t))throw new T...
  function r (line 2) | function r(e){return e&&e.__esModule?e:{default:e}}
  function o (line 2) | function o(e,t,n){for(var r=0;r<e.length;r++)if(!p.default(e[r],t[r],n[r...
  function e (line 2) | function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.en...
  function t (line 2) | function t(n){var r=this;(function(e,t){if(!(e instanceof t))throw new T...
  function r (line 2) | function r(e){return e&&e.__esModule?e:{default:e}}
  function o (line 2) | function o(e,t,n){var r=t;return null==r?e.map((function(e,t){return{key...
  function i (line 2) | function i(e,t,n,r){if(r.length!==t.length)return!1;for(var o=0;o<r.leng...
  function a (line 2) | function a(e,t,n,r,o,i,a,l,u){for(var s=p.default(r,o,(function(e,r){var...
  function e (line 2) | function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.en...
  function t (line 2) | function t(n){var r=this;(function(e,t){if(!(e instanceof t))throw new T...
  function r (line 2) | function r(e){return e&&e.__esModule?e.default:e}
  function n (line 2) | function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{...
  function f (line 2) | function f(e){return f="function"==typeof Symbol&&"symbol"==typeof Symbo...
  function p (line 2) | function p(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.en...
  function d (line 2) | function d(e){return d=Object.setPrototypeOf?Object.getPrototypeOf:funct...
  function y (line 2) | function y(e){if(void 0===e)throw new ReferenceError("this hasn't been i...
  function h (line 2) | function h(e,t){return h=Object.setPrototypeOf||function(e,t){return e._...
  function m (line 2) | function m(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enume...
  function t (line 2) | function t(e){var n,r;return function(e,t){if(!(e instanceof t))throw ne...
  function o (line 2) | function o(){}
  function i (line 2) | function i(){}
  function e (line 2) | function e(e,t,n,o,i,a){if(a!==r){var l=new Error("Calling PropTypes val...
  function t (line 2) | function t(){return e}
  function b (line 2) | function b(e,t,n){this.props=e,this.context=t,this.refs=m,this.updater=n...
  function v (line 2) | function v(){}
  function g (line 2) | function g(e,t,n){this.props=e,this.context=t,this.refs=m,this.updater=n...
  function P (line 2) | function P(e,t,r){var o,i={},a=null,l=null;if(null!=t)for(o in void 0!==...
  function x (line 2) | function x(e){return"object"==typeof e&&null!==e&&e.$$typeof===n}
  function C (line 2) | function C(e,t){return"object"==typeof e&&null!==e&&null!=e.key?function...
  function T (line 2) | function T(e,t,o,i,a){var l=typeof e;"undefined"!==l&&"boolean"!==l||(e=...
  function A (line 2) | function A(e,t,n){if(null==e)return e;var r=[],o=0;return T(e,r,"","",(f...
  function R (line 2) | function R(e){if(-1===e._status){var t=e._result;(t=t()).then((function(...
  function n (line 2) | function n(e,t){var n=e.length;e.push(t);e:for(;0<n;){var r=n-1>>>1,o=e[...
  function r (line 2) | function r(e){return 0===e.length?null:e[0]}
  function o (line 2) | function o(e){if(0===e.length)return null;var t=e[0],n=e.pop();if(n!==t)...
  function i (line 2) | function i(e,t){var n=e.sortIndex-t.sortIndex;return 0!==n?n:e.id-t.id}
  function w (line 2) | function w(e){for(var t=r(s);null!==t;){if(null===t.callback)o(s);else{i...
  function S (line 2) | function S(e){if(m=!1,w(e),!h)if(null!==r(c))h=!0,I(O);else{var t=r(s);n...
  function O (line 2) | function O(e,n){h=!1,m&&(m=!1,v(x),x=-1),y=!0;var i=d;try{for(w(n),p=r(c...
  function T (line 2) | function T(){return!(t.unstable_now()-C<j)}
  function A (line 2) | function A(){if(null!==P){var e=t.unstable_now();C=e;var n=!0;try{n=P(!0...
  function I (line 2) | function I(e){P=e,k||(k=!0,E())}
  function N (line 2) | function N(e,n){x=b((function(){e(t.unstable_now())}),n)}
  function e (line 2) | function e(e){if(!l){if(l=!0,i=e,e=r(e),void 0!==s&&p.hasValue){var t=p....
  function o (line 2) | function o(e){var t=r[e];if(void 0!==t)return t.exports;var i=r[e]={expo...
  function l (line 2) | function l(){if(!r.createContext)return{};const e=a[i]??(a[i]=new Map);l...
  function k (line 2) | function k(e,t,n,r,{areStatesEqual:o,areOwnPropsEqual:i,areStatePropsEqu...
  function P (line 2) | function P(e){return function(t){const n=e(t);function r(){return n}retu...
  function x (line 2) | function x(e){return e.dependsOnOwnProps?Boolean(e.dependsOnOwnProps):1!...
  function j (line 2) | function j(e,t){return function(t,{displayName:n}){const r=function(e,t)...
  function C (line 2) | function C(e,t){return(n,r)=>{throw new Error(`Invalid value of type ${t...
  function T (line 2) | function T(e,t,n){return{...n,...e,...t}}
  method notify (line 2) | notify(){}
  function R (line 2) | function R(e,t){let n,r=A,o=0,i=!1;function a(){c.onStateChange&&c.onSta...
  function I (line 2) | function I(e,t){return e===t?0!==e||0!==t||1/e==1/t:e!=e&&t!=t}
  function N (line 2) | function N(e,t){if(I(e,t))return!0;if("object"!=typeof e||null===e||"obj...
  function B (line 2) | function B(e){return function(e){if("object"==typeof e&&null!==e){const ...
  function q (line 2) | function q(e,t){if("string"!=typeof t){if(G){const n=V(t);n&&n!==G&&q(e,...
  function Z (line 2) | function Z(e,t,n,r,o,i){e.current=r,n.current=!1,o.current&&(o.current=n...
  function J (line 2) | function J(e,t){return e===t}
  function u (line 2) | function u(t){const[n,i,a]=r.useMemo((()=>{const{reactReduxForwardedRef:...
  function $ (line 2) | function $(e){return`Minified Redux error #${e}; visit https://redux.js....
  function re (line 2) | function re(e){return re="function"==typeof Symbol&&"symbol"==typeof Sym...
  function oe (line 2) | function oe(e){switch(e){case"refImage":return 100;case"testImage":case"...
  function ie (line 2) | function ie(e){switch(e){case"refImage":return"SHOW_SCRUBBER_REF_IMAGE";...
  function ue (line 2) | function ue(e){return ue="function"==typeof Symbol&&"symbol"==typeof Sym...
  function ce (line 2) | function ce(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){v...
  function se (line 2) | function se(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments...
  function s (line 2) | function s(){l===a&&(l=new Map,a.forEach(((e,t)=>{l.set(t,e)})))}
  function f (line 2) | function f(){if(c)throw new Error($(3));return i}
  function p (line 2) | function p(e){if("function"!=typeof e)throw new Error($(4));if(c)throw n...
  function d (line 2) | function d(e){if(!function(e){if("object"!=typeof e||null===e)return!1;l...
  method subscribe (line 2) | subscribe(t){if("object"!=typeof t||null===t)throw new Error($(11));func...
  method [ee] (line 2) | [ee](){return this}
  function be (line 2) | function be(e,t,n){if(n||2===arguments.length)for(var r,o=0,i=t.length;o...
  function _e (line 2) | function _e(e){return e.trim()}
  function Ie (line 2) | function Ie(e,t){return(e=t.exec(e))?e[0]:e}
  function Ne (line 2) | function Ne(e,t,n){return e.replace(t,n)}
  function Me (line 2) | function Me(e,t){return e.indexOf(t)}
  function De (line 2) | function De(e,t){return 0|e.charCodeAt(t)}
  function Le (line 2) | function Le(e,t,n){return e.slice(t,n)}
  function ze (line 2) | function ze(e){return e.length}
  function Be (line 2) | function Be(e){return e.length}
  function Fe (line 2) | function Fe(e,t){return t.push(e),e}
  function Ue (line 2) | function Ue(e,t){return e.filter((function(e){return!Ie(e,t)}))}
  function Ye (line 2) | function Ye(e,t,n,r,o,i,a,l){return{value:e,root:t,parent:n,type:r,props...
  function Ze (line 2) | function Ze(e,t){return Re(Ye("",null,null,"",null,null,0,e.siblings),e,...
  function Je (line 2) | function Je(e){for(;e.root;)e=Ze(e.root,{children:[e]});Fe(e,e.siblings)}
  function Xe (line 2) | function Xe(){return qe=Ge>0?De(Qe,--Ge):0,He--,10===qe&&(He=1,We--),qe}
  function Ke (line 2) | function Ke(){return qe=Ge<Ve?De(Qe,Ge++):0,He++,10===qe&&(He=1,We++),qe}
  function $e (line 2) | function $e(){return De(Qe,Ge)}
  function et (line 2) | function et(){return Ge}
  function tt (line 2) | function tt(e,t){return Le(Qe,e,t)}
  function nt (line 2) | function nt(e){switch(e){case 0:case 9:case 10:case 13:case 32:return 5;...
  function rt (line 2) | function rt(e){return _e(tt(Ge-1,at(91===e?e+2:40===e?e+1:e)))}
  function ot (line 2) | function ot(e){for(;(qe=$e())&&qe<33;)Ke();return nt(e)>2||nt(qe)>3?"":" "}
  function it (line 2) | function it(e,t){for(;--t&&Ke()&&!(qe<48||qe>102||qe>57&&qe<65||qe>70&&q...
  function at (line 2) | function at(e){for(;Ke();)switch(qe){case e:return Ge;case 34:case 39:34...
  function lt (line 2) | function lt(e,t){for(;Ke()&&e+qe!==57&&(e+qe!==84||47!==$e()););return"/...
  function ut (line 2) | function ut(e){for(;!nt($e());)Ke();return tt(e,Ge)}
  function ct (line 2) | function ct(e,t){for(var n="",r=0;r<e.length;r++)n+=t(e[r],r,e,t)||"";re...
  function st (line 2) | function st(e,t,n,r){switch(e.type){case Ce:if(e.children.length)break;c...
  function ft (line 2) | function ft(e,t,n){switch(function(e,t){return 45^De(e,0)?(((t<<2^De(e,0...
  function pt (line 2) | function pt(e,t,n,r){if(e.length>-1&&!e.return)switch(e.type){case Pe:re...
  function dt (line 2) | function dt(e){return function(e){return Qe="",e}(yt("",null,null,null,[...
  function yt (line 2) | function yt(e,t,n,r,o,i,a,l,u){for(var c=0,s=0,f=a,p=0,d=0,y=0,h=1,m=1,b...
  function ht (line 2) | function ht(e,t,n,r,o,i,a,l,u,c,s,f){for(var p=o-1,d=0===o?i:[""],y=Be(d...
  function mt (line 2) | function mt(e,t,n,r){return Ye(e,t,n,Ee,Ae(qe),Le(e,2,-2),0,r)}
  function bt (line 2) | function bt(e,t,n,r,o){return Ye(e,t,n,Pe,Le(e,0,r),Le(e,r+1,-1),r,o)}
  function Rt (line 2) | function Rt(e){return e.replace(Tt,"-").replace(At,"")}
  function Mt (line 2) | function Mt(e){var t,n="";for(t=Math.abs(e);t>It;t=t/It|0)n=Nt(t%It)+n;r...
  function Ft (line 2) | function Ft(e){return"string"==typeof e&&!0}
  function Yt (line 2) | function Yt(e){return("type"in(t=e)&&t.type.$$typeof)===Wt?qt:"$$typeof"...
  function tn (line 2) | function tn(e,t,n){if("string"!=typeof t){if(en){var r=$t(t);r&&r!==en&&...
  function nn (line 2) | function nn(e){return"function"==typeof e}
  function rn (line 2) | function rn(e){return"object"==typeof e&&"styledComponentId"in e}
  function on (line 2) | function on(e,t){return e&&t?"".concat(e," ").concat(t):e||t||""}
  function an (line 2) | function an(e,t){if(0===e.length)return"";for(var n=e[0],r=1;r<e.length;...
  function ln (line 2) | function ln(e){return null!==e&&"object"==typeof e&&e.constructor.name==...
  function un (line 2) | function un(e,t,n){if(void 0===n&&(n=!1),!n&&!ln(e)&&!Array.isArray(e))r...
  function cn (line 2) | function cn(e,t){Object.defineProperty(e,"toString",{value:t})}
  function sn (line 2) | function sn(e){for(var t=[],n=1;n<arguments.length;n++)t[n-1]=arguments[...
  function e (line 2) | function e(e){this.groupSizes=new Uint32Array(512),this.length=512,this....
  function Sn (line 2) | function Sn(){return o.nc}
  function e (line 2) | function e(e){this.element=On(e),this.element.appendChild(document.creat...
  function e (line 2) | function e(e){this.element=On(e),this.nodes=this.element.childNodes,this...
  function e (line 2) | function e(e){this.rules=[],this.length=0}
  function e (line 2) | function e(e,t,n){void 0===e&&(e=jt),void 0===t&&(t={});var r=this;this....
  function Rn (line 2) | function Rn(e,t){return e.map((function(e){return"rule"===e.type&&(e.val...
  function _n (line 2) | function _n(e){var t,n,r,o=void 0===e?jt:e,i=o.options,a=void 0===i?jt:i...
  function Ln (line 2) | function Ln(){return(0,e.useContext)(Mn)}
  function zn (line 2) | function zn(t){var n=(0,e.useState)(t.stylisPlugins),r=n[0],o=n[1],i=Ln(...
  function e (line 2) | function e(e,t){var n=this;this.inject=function(e,t){void 0===t&&(t=Nn);...
  function Un (line 2) | function Un(e){for(var t="",n=0;n<e.length;n++){var r=e[n];if(1===n&&"-"...
  function Vn (line 2) | function Vn(e,t,n,r){return Wn(e)?[]:rn(e)?[".".concat(e.styledComponent...
  function Gn (line 2) | function Gn(e){for(var t=0;t<e.length;t+=1){var n=e[t];if(nn(n)&&!rn(n))...
  function e (line 2) | function e(e,t,n){this.rules=e,this.staticRulesId="",this.isStatic=(void...
  function Jn (line 2) | function Jn(t,n,r){var o=rn(t),i=t,a=!Ft(t),l=n.attrs,u=void 0===l?xt:l,...
  function Xn (line 2) | function Xn(e,t){for(var n=[e[0]],r=0,o=t.length;r<o;r+=1)n.push(t[r],e[...
  function $n (line 2) | function $n(e){for(var t=[],n=1;n<arguments.length;n++)t[n-1]=arguments[...
  function er (line 2) | function er(e,t,n){if(void 0===n&&(n=jt),!t)throw sn(1,t);var r=function...
  function e (line 2) | function e(e,t){this.rules=e,this.componentId=t,this.isStatic=Gn(e),Cn.r...
  function t (line 2) | function t(){var t=this;this._emitSheetCSS=function(){var e=t.instance.t...
  function vr (line 2) | function vr(e){return vr="function"==typeof Symbol&&"symbol"==typeof Sym...
  function gr (line 2) | function gr(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.e...
  function wr (line 2) | function wr(e){var t=function(e,t){if("object"!=vr(e)||!e)return e;var n...
  function Sr (line 2) | function Sr(e,t){return Sr=Object.setPrototypeOf?Object.setPrototypeOf.b...
  function Or (line 2) | function Or(e){return Or=Object.setPrototypeOf?Object.getPrototypeOf.bin...
  function l (line 2) | function l(){return function(e,t){if(!(e instanceof t))throw new TypeErr...
  function Cr (line 2) | function Cr(e){return Cr="function"==typeof Symbol&&"symbol"==typeof Sym...
  function Ar (line 2) | function Ar(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.e...
  function Rr (line 2) | function Rr(e){var t=function(e,t){if("object"!=Cr(e)||!e)return e;var n...
  function _r (line 2) | function _r(e,t){return _r=Object.setPrototypeOf?Object.setPrototypeOf.b...
  function Ir (line 2) | function Ir(e){return Ir=Object.setPrototypeOf?Object.getPrototypeOf.bin...
  function l (line 2) | function l(){return function(e,t){if(!(e instanceof t))throw new TypeErr...
  function Lr (line 2) | function Lr(e){return Lr="function"==typeof Symbol&&"symbol"==typeof Sym...
  function Br (line 2) | function Br(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.e...
  function Fr (line 2) | function Fr(e){var t=function(e,t){if("object"!=Lr(e)||!e)return e;var n...
  function Ur (line 2) | function Ur(e,t){return Ur=Object.setPrototypeOf?Object.setPrototypeOf.b...
  function Wr (line 2) | function Wr(e){return Wr=Object.setPrototypeOf?Object.getPrototypeOf.bin...
  function l (line 2) | function l(){return function(e,t){if(!(e instanceof t))throw new TypeErr...
  function Qr (line 2) | function Qr(e){return Qr="function"==typeof Symbol&&"symbol"==typeof Sym...
  function Yr (line 2) | function Yr(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.e...
  function Zr (line 2) | function Zr(e){var t=function(e,t){if("object"!=Qr(e)||!e)return e;var n...
  function Jr (line 2) | function Jr(e,t){return Jr=Object.setPrototypeOf?Object.setPrototypeOf.b...
  function Xr (line 2) | function Xr(e){return Xr=Object.setPrototypeOf?Object.getPrototypeOf.bin...
  function Kr (line 2) | function Kr(e,t){return t||(t=e.slice(0)),Object.freeze(Object.definePro...
  function l (line 2) | function l(){return function(e,t){if(!(e instanceof t))throw new TypeErr...
  function oo (line 2) | function oo(e){return oo="function"==typeof Symbol&&"symbol"==typeof Sym...
  function io (line 2) | function io(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.e...
  function ao (line 2) | function ao(e){var t=function(e,t){if("object"!=oo(e)||!e)return e;var n...
  function lo (line 2) | function lo(e,t){return lo=Object.setPrototypeOf?Object.setPrototypeOf.b...
  function uo (line 2) | function uo(e){return uo=Object.setPrototypeOf?Object.getPrototypeOf.bin...
  function l (line 2) | function l(){return function(e,t){if(!(e instanceof t))throw new TypeErr...
  function po (line 2) | function po(e){return po="function"==typeof Symbol&&"symbol"==typeof Sym...
  function yo (line 2) | function yo(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.e...
  function ho (line 2) | function ho(e){var t=function(e,t){if("object"!=po(e)||!e)return e;var n...
  function mo (line 2) | function mo(e,t){return mo=Object.setPrototypeOf?Object.setPrototypeOf.b...
  function bo (line 2) | function bo(e){return bo=Object.setPrototypeOf?Object.getPrototypeOf.bin...
  function go (line 2) | function go(t){var n=t.availableStatus.map((function(n){return e.createE...
  function l (line 2) | function l(){return function(e,t){if(!(e instanceof t))throw new TypeErr...
  function Oo (line 2) | function Oo(e){return Oo="function"==typeof Symbol&&"symbol"==typeof Sym...
  function ko (line 2) | function ko(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.e...
  function Po (line 2) | function Po(e){var t=function(e,t){if("object"!=Oo(e)||!e)return e;var n...
  function xo (line 2) | function xo(e,t){return xo=Object.setPrototypeOf?Object.setPrototypeOf.b...
  function jo (line 2) | function jo(e){return jo=Object.setPrototypeOf?Object.getPrototypeOf.bin...
  function l (line 2) | function l(){return function(e,t){if(!(e instanceof t))throw new TypeErr...
  function Ro (line 2) | function Ro(e){return Ro="function"==typeof Symbol&&"symbol"==typeof Sym...
  function _o (line 2) | function _o(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.e...
  function Io (line 2) | function Io(e){var t=function(e,t){if("object"!=Ro(e)||!e)return e;var n...
  function No (line 2) | function No(e,t){return No=Object.setPrototypeOf?Object.setPrototypeOf.b...
  function Mo (line 2) | function Mo(e){return Mo=Object.setPrototypeOf?Object.getPrototypeOf.bin...
  function l (line 2) | function l(){return function(e,t){if(!(e instanceof t))throw new TypeErr...
  function Bo (line 2) | function Bo(e){return Bo="function"==typeof Symbol&&"symbol"==typeof Sym...
  function Uo (line 2) | function Uo(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.e...
  function Wo (line 2) | function Wo(e){var t=function(e,t){if("object"!=Bo(e)||!e)return e;var n...
  function Ho (line 2) | function Ho(e,t){return Ho=Object.setPrototypeOf?Object.setPrototypeOf.b...
  function Vo (line 2) | function Vo(e){return Vo=Object.setPrototypeOf?Object.getPrototypeOf.bin...
  function l (line 2) | function l(){return function(e,t){if(!(e instanceof t))throw new TypeErr...
  function Jo (line 2) | function Jo(e){return Jo="function"==typeof Symbol&&"symbol"==typeof Sym...
  function Xo (line 2) | function Xo(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.e...
  function Ko (line 2) | function Ko(e){var t=function(e,t){if("object"!=Jo(e)||!e)return e;var n...
  function $o (line 2) | function $o(e,t){return $o=Object.setPrototypeOf?Object.setPrototypeOf.b...
  function ei (line 2) | function ei(e){return ei=Object.setPrototypeOf?Object.getPrototypeOf.bin...
  function l (line 2) | function l(){return function(e,t){if(!(e instanceof t))throw new TypeErr...
  function oi (line 2) | function oi(e){return oi="function"==typeof Symbol&&"symbol"==typeof Sym...
  function ii (line 2) | function ii(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.e...
  function ai (line 2) | function ai(e){var t=function(e,t){if("object"!=oi(e)||!e)return e;var n...
  function li (line 2) | function li(e,t){return li=Object.setPrototypeOf?Object.setPrototypeOf.b...
  function ui (line 2) | function ui(e){return ui=Object.setPrototypeOf?Object.getPrototypeOf.bin...
  function l (line 2) | function l(e){var t;return function(e,t){if(!(e instanceof t))throw new ...
  function pi (line 2) | function pi(e){return pi="function"==typeof Symbol&&"symbol"==typeof Sym...
  function yi (line 2) | function yi(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.e...
  function hi (line 2) | function hi(e){var t=function(e,t){if("object"!=pi(e)||!e)return e;var n...
  function mi (line 2) | function mi(e,t){return mi=Object.setPrototypeOf?Object.setPrototypeOf.b...
  function bi (line 2) | function bi(e){return bi=Object.setPrototypeOf?Object.getPrototypeOf.bin...
  function l (line 2) | function l(e){var t;return function(e,t){if(!(e instanceof t))throw new ...
  function Si (line 2) | function Si(e){return Si="function"==typeof Symbol&&"symbol"==typeof Sym...
  function Ei (line 2) | function Ei(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.e...
  function ki (line 2) | function ki(e){var t=function(e,t){if("object"!=Si(e)||!e)return e;var n...
  function Pi (line 2) | function Pi(e,t){return Pi=Object.setPrototypeOf?Object.setPrototypeOf.b...
  function xi (line 2) | function xi(e){return xi=Object.setPrototypeOf?Object.getPrototypeOf.bin...
  function l (line 2) | function l(){return function(e,t){if(!(e instanceof t))throw new TypeErr...
  function Ai (line 2) | function Ai(e){return Ai="function"==typeof Symbol&&"symbol"==typeof Sym...
  function Ri (line 2) | function Ri(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.e...
  function _i (line 2) | function _i(e){var t=function(e,t){if("object"!=Ai(e)||!e)return e;var n...
  function Ii (line 2) | function Ii(e,t){return Ii=Object.setPrototypeOf?Object.setPrototypeOf.b...
  function Ni (line 2) | function Ni(e){return Ni=Object.setPrototypeOf?Object.getPrototypeOf.bin...
  function l (line 2) | function l(){return function(e,t){if(!(e instanceof t))throw new TypeErr...
  function Bi (line 2) | function Bi(e){return Bi="function"==typeof Symbol&&"symbol"==typeof Sym...
  function Fi (line 2) | function Fi(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.e...
  function Ui (line 2) | function Ui(e){var t=function(e,t){if("object"!=Bi(e)||!e)return e;var n...
  function Wi (line 2) | function Wi(e,t){return Wi=Object.setPrototypeOf?Object.setPrototypeOf.b...
  function Hi (line 2) | function Hi(e){return Hi=Object.setPrototypeOf?Object.getPrototypeOf.bin...
  function Vi (line 2) | function Vi(e,t){return t||(t=e.slice(0)),Object.freeze(Object.definePro...
  function l (line 2) | function l(e){var t;return function(e,t){if(!(e instanceof t))throw new ...
  function Zi (line 2) | function Zi(e){return Zi="function"==typeof Symbol&&"symbol"==typeof Sym...
  function Ki (line 2) | function Ki(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.e...
  function $i (line 2) | function $i(e){var t=function(e,t){if("object"!=Zi(e)||!e)return e;var n...
  function ea (line 2) | function ea(e,t){return ea=Object.setPrototypeOf?Object.setPrototypeOf.b...
  function ta (line 2) | function ta(e){return ta=Object.setPrototypeOf?Object.getPrototypeOf.bin...
  function na (line 2) | function na(e,t){return t||(t=e.slice(0)),Object.freeze(Object.definePro...
  function l (line 2) | function l(){return function(e,t){if(!(e instanceof t))throw new TypeErr...
  function ca (line 2) | function ca(e){return ca="function"==typeof Symbol&&"symbol"==typeof Sym...
  function sa (line 2) | function sa(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.e...
  function fa (line 2) | function fa(e){var t=function(e,t){if("object"!=ca(e)||!e)return e;var n...
  function pa (line 2) | function pa(e,t){return pa=Object.setPrototypeOf?Object.setPrototypeOf.b...
  function da (line 2) | function da(e){return da=Object.setPrototypeOf?Object.getPrototypeOf.bin...
  function ya (line 2) | function ya(e,t){return t||(t=e.slice(0)),Object.freeze(Object.definePro...
  function l (line 2) | function l(){return function(e,t){if(!(e instanceof t))throw new TypeErr...
  function Oa (line 2) | function Oa(e){return Oa="function"==typeof Symbol&&"symbol"==typeof Sym...
  function Ea (line 2) | function Ea(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.e...
  function ka (line 2) | function ka(e){var t=function(e,t){if("object"!=Oa(e)||!e)return e;var n...
  function Pa (line 2) | function Pa(e,t){return Pa=Object.setPrototypeOf?Object.setPrototypeOf.b...
  function xa (line 2) | function xa(e){return xa=Object.setPrototypeOf?Object.getPrototypeOf.bin...
  function ja (line 2) | function ja(e,t){return t||(t=e.slice(0)),Object.freeze(Object.definePro...
  function l (line 2) | function l(){return function(e,t){if(!(e instanceof t))throw new TypeErr...
  function Ia (line 2) | function Ia(e){return Ia="function"==typeof Symbol&&"symbol"==typeof Sym...
  function Ba (line 2) | function Ba(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.e...
  function Fa (line 2) | function Fa(e){var t=function(e,t){if("object"!=Ia(e)||!e)return e;var n...
  function Ua (line 2) | function Ua(e,t){return Ua=Object.setPrototypeOf?Object.setPrototypeOf.b...
  function Wa (line 2) | function Wa(e){if(void 0===e)throw new ReferenceError("this hasn't been ...
  function Ha (line 2) | function Ha(e){return Ha=Object.setPrototypeOf?Object.getPrototypeOf.bin...
  function Va (line 2) | function Va(e,t){return t||(t=e.slice(0)),Object.freeze(Object.definePro...
  function l (line 2) | function l(e){var t;return function(e,t){if(!(e instanceof t))throw new ...
  function p (line 2) | function p(e){return e.getBoundingClientRect().top+t}
  function d (line 2) | function d(n){u||(u=n),s=o(c=n-u,t,a,l),window.scrollTo(0,s),c<l?window....
  function nl (line 2) | function nl(e){return nl="function"==typeof Symbol&&"symbol"==typeof Sym...
  function il (line 2) | function il(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.e...
  function al (line 2) | function al(e){var t=function(e,t){if("object"!=nl(e)||!e)return e;var n...
  function ll (line 2) | function ll(e,t){return ll=Object.setPrototypeOf?Object.setPrototypeOf.b...
  function ul (line 2) | function ul(e){return ul=Object.setPrototypeOf?Object.getPrototypeOf.bin...
  function cl (line 2) | function cl(e,t){return t||(t=e.slice(0)),Object.freeze(Object.definePro...
  function l (line 2) | function l(){return function(e,t){if(!(e instanceof t))throw new TypeErr...
  function vl (line 2) | function vl(e){return vl="function"==typeof Symbol&&"symbol"==typeof Sym...
  function gl (line 2) | function gl(){return gl=Object.assign?Object.assign.bind():function(e){f...
  function wl (line 2) | function wl(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.e...
  function Sl (line 2) | function Sl(e){var t=function(e,t){if("object"!=vl(e)||!e)return e;var n...
  function Ol (line 2) | function Ol(e,t){return Ol=Object.setPrototypeOf?Object.setPrototypeOf.b...
  function El (line 2) | function El(e){if(void 0===e)throw new ReferenceError("this hasn't been ...
  function kl (line 2) | function kl(e){return kl=Object.setPrototypeOf?Object.getPrototypeOf.bin...
  function Pl (line 2) | function Pl(e,t){return t||(t=e.slice(0)),Object.freeze(Object.definePro...
  function l (line 2) | function l(e){var t;return function(e,t){if(!(e instanceof t))throw new ...
  function _l (line 2) | function _l(e){return _l="function"==typeof Symbol&&"symbol"==typeof Sym...
  function Nl (line 2) | function Nl(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.e...
  function Ml (line 2) | function Ml(e){var t=function(e,t){if("object"!=_l(e)||!e)return e;var n...
  function Dl (line 2) | function Dl(e,t){return Dl=Object.setPrototypeOf?Object.setPrototypeOf.b...
  function Ll (line 2) | function Ll(e){return Ll=Object.setPrototypeOf?Object.getPrototypeOf.bin...
  function l (line 2) | function l(e){var t;return function(e,t){if(!(e instanceof t))throw new ...
  function Ul (line 2) | function Ul(e){return Ul="function"==typeof Symbol&&"symbol"==typeof Sym...
  function Hl (line 2) | function Hl(){Hl=function(){return t};var e,t={},n=Object.prototype,r=n....
  function Vl (line 2) | function Vl(e,t,n,r,o,i,a){try{var l=e[i](a),u=l.value}catch(e){return v...
  function Gl (line 2) | function Gl(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.e...
  function ql (line 2) | function ql(e){var t=function(e,t){if("object"!=Ul(e)||!e)return e;var n...
  function Ql (line 2) | function Ql(e,t){return Ql=Object.setPrototypeOf?Object.setPrototypeOf.b...
  function Yl (line 2) | function Yl(e){if(void 0===e)throw new ReferenceError("this hasn't been ...
  function Zl (line 2) | function Zl(e){return Zl=Object.setPrototypeOf?Object.getPrototypeOf.bin...
  function u (line 2) | function u(e){var t;return function(e,t){if(!(e instanceof t))throw new ...
  function a (line 2) | function a(e){Vl(i,r,o,a,l,"next",e)}
  function l (line 2) | function l(e){Vl(i,r,o,a,l,"throw",e)}
  function tu (line 2) | function tu(e){return tu="function"==typeof Symbol&&"symbol"==typeof Sym...
  function ou (line 2) | function ou(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.e...
  function iu (line 2) | function iu(e){var t=function(e,t){if("object"!=tu(e)||!e)return e;var n...
  function au (line 2) | function au(e,t){return au=Object.setPrototypeOf?Object.setPrototypeOf.b...
  function lu (line 2) | function lu(e){return lu=Object.setPrototypeOf?Object.getPrototypeOf.bin...
  function uu (line 2) | function uu(e,t){return t||(t=e.slice(0)),Object.freeze(Object.definePro...
  function l (line 2) | function l(){return function(e,t){if(!(e instanceof t))throw new TypeErr...
  function du (line 2) | function du(e){return du="function"==typeof Symbol&&"symbol"==typeof Sym...
  function yu (line 2) | function yu(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.e...
  function hu (line 2) | function hu(e){var t=function(e,t){if("object"!=du(e)||!e)return e;var n...
  function mu (line 2) | function mu(e,t){return mu=Object.setPrototypeOf?Object.setPrototypeOf.b...
  function bu (line 2) | function bu(e){return bu=Object.setPrototypeOf?Object.getPrototypeOf.bin...
  function l (line 2) | function l(){return function(e,t){if(!(e instanceof t))throw new TypeErr...
  function Tu (line 2) | function Tu(e){return Tu="function"==typeof Symbol&&"symbol"==typeof Sym...
  function Au (line 2) | function Au(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.e...
  function Ru (line 2) | function Ru(e){var t=function(e,t){if("object"!=Tu(e)||!e)return e;var n...
  function _u (line 2) | function _u(e,t){return _u=Object.setPrototypeOf?Object.setPrototypeOf.b...
  function Iu (line 2) | function Iu(e){if(void 0===e)throw new ReferenceError("this hasn't been ...
  function Nu (line 2) | function Nu(e){return Nu=Object.setPrototypeOf?Object.getPrototypeOf.bin...
  function Mu (line 2) | function Mu(e,t){return t||(t=e.slice(0)),Object.freeze(Object.definePro...
  function l (line 2) | function l(e){var t;return function(e,t){if(!(e instanceof t))throw new ...
  function Vu (line 2) | function Vu(e){return e.getImageData(0,0,e.canvas.width,e.canvas.height)...
  function Gu (line 2) | function Gu(e,t,n){var r=e;e||(r={height:t,width:n});var o=document.crea...
  function qu (line 2) | function qu(e){return qu="function"==typeof Symbol&&"symbol"==typeof Sym...
  function Qu (line 2) | function Qu(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.e...
  function Yu (line 2) | function Yu(e){var t=function(e,t){if("object"!=qu(e)||!e)return e;var n...
  function Zu (line 2) | function Zu(e,t){return Zu=Object.setPrototypeOf?Object.setPrototypeOf.b...
  function Ju (line 2) | function Ju(e){return Ju=Object.setPrototypeOf?Object.getPrototypeOf.bin...
  function Xu (line 2) | function Xu(e,t){return t||(t=e.slice(0)),Object.freeze(Object.definePro...
  function l (line 2) | function l(){return function(e,t){if(!(e instanceof t))throw new TypeErr...
  function oc (line 2) | function oc(e){return oc="function"==typeof Symbol&&"symbol"==typeof Sym...
  function cc (line 2) | function cc(){cc=function(){return t};var e,t={},n=Object.prototype,r=n....
  function sc (line 2) | function sc(e,t,n,r,o,i,a){try{var l=e[i](a),u=l.value}catch(e){return v...
  function fc (line 2) | function fc(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.e...
  function pc (line 2) | function pc(e){var t=function(e,t){if("object"!=oc(e)||!e)return e;var n...
  function dc (line 2) | function dc(e,t){return dc=Object.setPrototypeOf?Object.setPrototypeOf.b...
  function yc (line 2) | function yc(e){return yc=Object.setPrototypeOf?Object.getPrototypeOf.bin...
  function hc (line 2) | function hc(e,t){return t||(t=e.slice(0)),Object.freeze(Object.definePro...
  function l (line 2) | function l(e){var t;return function(e,t){if(!(e instanceof t))throw new ...
  function a (line 2) | function a(e){sc(i,r,o,a,l,"next",e)}
  function l (line 2) | function l(e){sc(i,r,o,a,l,"throw",e)}
  function Ec (line 2) | function Ec(e){return Ec="function"==typeof Symbol&&"symbol"==typeof Sym...
  function Pc (line 2) | function Pc(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.e...
  function xc (line 2) | function xc(e){var t=function(e,t){if("object"!=Ec(e)||!e)return e;var n...
  function jc (line 2) | function jc(e,t){return jc=Object.setPrototypeOf?Object.setPrototypeOf.b...
  function Cc (line 2) | function Cc(e){return Cc=Object.setPrototypeOf?Object.getPrototypeOf.bin...
  function l (line 2) | function l(){return function(e,t){if(!(e instanceof t))throw new TypeErr...

FILE: compare/src/components/App.js
  class App (line 16) | class App extends React.Component {
    method render (line 17) | render () {

FILE: compare/src/components/atoms/ButtonFilter.js
  class ButtonFilter (line 39) | class ButtonFilter extends React.Component {
    method render (line 40) | render () {

FILE: compare/src/components/atoms/ButtonSettings.js
  class ButtonSettings (line 50) | class ButtonSettings extends React.Component {
    method render (line 51) | render () {

FILE: compare/src/components/atoms/DiffDetails.js
  class DiffDetails (line 19) | class DiffDetails extends React.Component {
    method render (line 20) | render () {

FILE: compare/src/components/atoms/ErrorMessages.js
  class ErrorMessages (line 23) | class ErrorMessages extends React.Component {
    method constructor (line 24) | constructor (props) {
    method render (line 29) | render () {

FILE: compare/src/components/atoms/IdContainer.js
  class IdConfig (line 32) | class IdConfig extends React.Component {
    method render (line 33) | render () {

FILE: compare/src/components/atoms/ImagePreview.js
  constant BASE64_PNG_STUB (line 7) | const BASE64_PNG_STUB =
  class ImagePreview (line 46) | class ImagePreview extends React.Component {
    method constructor (line 47) | constructor (props) {
    method onChange (line 56) | onChange (isVisible) {
    method onLoadError (line 65) | onLoadError () {
    method render (line 71) | render () {

FILE: compare/src/components/atoms/ImageScrubber.js
  class ImageScrubber (line 84) | class ImageScrubber extends React.Component {
    method constructor (line 85) | constructor (props) {
    method handleRefImageLoadingError (line 96) | handleRefImageLoadingError () {
    method loadingDiverge (line 102) | loadingDiverge (torf) {
    method render (line 108) | render () {
  function getImgDataDataFromContext (line 302) | function getImgDataDataFromContext (context) {
  function getEmptyImgData (line 307) | function getEmptyImgData (h, w) {
  function imageToCanvasContext (line 312) | function imageToCanvasContext (_img, h, w) {

FILE: compare/src/components/atoms/InputTextSearch.js
  class ButtonFilter (line 37) | class ButtonFilter extends React.Component {
    method render (line 38) | render () {

FILE: compare/src/components/atoms/LogDetails.js
  class LogDetails (line 28) | class LogDetails extends React.Component {
    method onClick (line 29) | onClick (log, event) {
    method render (line 35) | render () {

FILE: compare/src/components/atoms/Logo.js
  class Logo (line 11) | class Logo extends React.Component {
    method render (line 12) | render () {

FILE: compare/src/components/atoms/NavButtons.js
  class NavButtons (line 36) | class NavButtons extends React.Component {
    method nextTest (line 37) | nextTest () {
    method prevTest (line 42) | prevTest () {
    method jumpTo (line 47) | jumpTo (dest) {
    method render (line 54) | render () {

FILE: compare/src/components/atoms/SettingOption.js
  class SettingOption (line 22) | class SettingOption extends React.Component {
    method render (line 23) | render () {

FILE: compare/src/components/atoms/SuiteName.js
  class SuiteName (line 15) | class SuiteName extends React.Component {
    method render (line 16) | render () {

FILE: compare/src/components/atoms/TextDetails.js
  class TextDetails (line 42) | class TextDetails extends React.Component {
    method constructor (line 43) | constructor (props) {
    method showPanel (line 54) | showPanel () {
    method hidePanel (line 63) | hidePanel () {
    method render (line 69) | render () {

FILE: compare/src/components/atoms/UrlDetails.js
  class DiffDetails (line 26) | class DiffDetails extends React.Component {
    method render (line 27) | render () {

FILE: compare/src/components/ecosystems/Header.js
  class Header (line 17) | class Header extends React.Component {
    method render (line 18) | render () {

FILE: compare/src/components/ecosystems/List.js
  class List (line 15) | class List extends React.Component {
    method render (line 16) | render () {

FILE: compare/src/components/ecosystems/LogModal.js
  class LogModal (line 67) | class LogModal extends React.Component {
    method constructor (line 68) | constructor (props) {
    method render (line 73) | render () {
    method clearAndCloseModal (line 102) | clearAndCloseModal () {
    method afterOpenModal (line 113) | afterOpenModal () {

FILE: compare/src/components/ecosystems/ScrubberModal.js
  class ScrubberModal (line 65) | class ScrubberModal extends React.Component {
    method render (line 66) | render () {

FILE: compare/src/components/molecules/ApproveButton.js
  constant REMOTE_HOST (line 7) | const REMOTE_HOST = 'http://127.0.0.1';
  constant REMOTE_PORT (line 8) | const REMOTE_PORT = location.port;
  constant APPROVE_STATUS_TO_LABEL_MAP (line 9) | const APPROVE_STATUS_TO_LABEL_MAP = Object.freeze({
  class ApproveButton (line 46) | class ApproveButton extends React.Component {
    method constructor (line 47) | constructor (props) {
    method approve (line 56) | async approve () {
    method render (line 85) | render () {

FILE: compare/src/components/molecules/FiltersSwitch.js
  function ButtonsFilter (line 14) | function ButtonsFilter (props) {
  class FiltersSwitch (line 34) | class FiltersSwitch extends React.Component {
    method render (line 35) | render () {

FILE: compare/src/components/molecules/ScrubberButton.js
  class ScrubberButton (line 40) | class ScrubberButton extends React.Component {
    method onClick (line 41) | onClick () {
    method render (line 46) | render () {

FILE: compare/src/components/molecules/SettingsContainer.js
  class SettingsPanel (line 17) | class SettingsPanel extends React.Component {
    method constructor (line 18) | constructor (props) {
    method onButtonClick (line 26) | onButtonClick () {
    method render (line 32) | render () {

FILE: compare/src/components/molecules/SettingsPopup.js
  class SettingsPopup (line 40) | class SettingsPopup extends React.Component {
    method constructor (line 41) | constructor (props) {
    method toggleAll (line 49) | toggleAll (val) {
    method onToggle (line 57) | onToggle (id, val) {
    method render (line 67) | render () {

FILE: compare/src/components/molecules/TestImages.js
  class TestImages (line 14) | class TestImages extends React.Component {
    method constructor (line 15) | constructor (props) {
    method onImageClick (line 23) | onImageClick (img) {
    method render (line 29) | render () {

FILE: compare/src/components/molecules/TextSearch.js
  class TextSearch (line 13) | class TextSearch extends React.Component {
    method onChange (line 14) | onChange (event) {
    method render (line 24) | render () {

FILE: compare/src/components/organisms/TestCard.js
  function isRemoteOption (line 46) | function isRemoteOption () {
  class TestCard (line 50) | class TestCard extends React.Component {
    method render (line 51) | render () {

FILE: compare/src/components/organisms/Toolbar.js
  class Toolbar (line 23) | class Toolbar extends React.Component {
    method render (line 24) | render () {

FILE: compare/src/components/organisms/Topbar.js
  class Topbar (line 28) | class Topbar extends React.Component {
    method render (line 29) | render () {

FILE: compare/src/reducers/scrubber.js
  function getPosFromImgId (line 1) | function getPosFromImgId (imgId) {
  function getModeFromImgId (line 14) | function getModeFromImgId (imgId) {

FILE: compare/src/store.js
  function parseLocalStorage (line 16) | function parseLocalStorage (localStorageItem) {

FILE: core/command/approve.js
  constant FAILED_DIFF_RE (line 5) | const FAILED_DIFF_RE = /^failed_diff_/;
  constant FILTER_DEFAULT (line 6) | const FILTER_DEFAULT = /\w+/;

FILE: core/command/index.js
  function toObjectReducer (line 40) | function toObjectReducer (object, command) {
  function execute (line 100) | function execute (commandName, config) {

FILE: core/command/openReport.js
  constant BACKSTOP_REPORT_SIGNATURE_RE (line 6) | const BACKSTOP_REPORT_SIGNATURE_RE = /BackstopJS Report/i;

FILE: core/command/report.js
  function replaceInFile (line 11) | function replaceInFile (file, search, replace) {
  function writeReport (line 28) | function writeReport (config, reporter) {
  function archiveReport (line 44) | function archiveReport (config) {
  function writeBrowserReport (line 63) | function writeBrowserReport (config, reporter) {
  function writeJunitReport (line 176) | function writeJunitReport (config, reporter) {
  function writeJsonReport (line 211) | function writeJsonReport (config, reporter) {

FILE: core/util/BackstopException.js
  method constructor (line 2) | constructor (msg, scenario, viewport, originalError) {
  method toString (line 9) | toString () {

FILE: core/util/Reporter.js
  function Test (line 1) | function Test (pair) {
  function Reporter (line 10) | function Reporter (testSuite) {

FILE: core/util/compare/compare-hash.js
  function getFileHash (line 4) | function getFileHash (filename) {

FILE: core/util/compare/compare.js
  function compare (line 7) | function compare (data) {
  function sendMessage (line 28) | function sendMessage (data) {

FILE: core/util/compare/index.js
  constant ASYNC_COMPARE_LIMIT (line 10) | const ASYNC_COMPARE_LIMIT = 20;
  function comparePair (line 12) | function comparePair (pair, report, config, compareConfig) {
  function compareImages (line 60) | function compareImages (referencePath, testPath, pair, resembleOutputSet...

FILE: core/util/compare/store-failed-diff-stub.js
  constant BASE64_PNG_STUB (line 5) | const BASE64_PNG_STUB = 'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAA...
  function getFailedDiffFilename (line 13) | function getFailedDiffFilename (testPath) {

FILE: core/util/compare/store-failed-diff.js
  function getFailedDiffFilename (line 25) | function getFailedDiffFilename (testPath) {

FILE: core/util/createBitmaps.js
  constant CONCURRENCY_DEFAULT (line 12) | const CONCURRENCY_DEFAULT = 10;
  function regexTest (line 14) | function regexTest (string, search) {
  function ensureViewportLabel (line 19) | function ensureViewportLabel (config) {
  function decorateConfigForCapture (line 29) | function decorateConfigForCapture (config, isReference) {
  function saveViewportIndexes (line 83) | function saveViewportIndexes (viewport, index) {
  function delegateScenarios (line 87) | function delegateScenarios (config) {
  function writeCompareConfigFile (line 157) | function writeCompareConfigFile (comparePairsFileName, compareConfig) {
  function flatMapTestPairs (line 163) | function flatMapTestPairs (rawTestPairs) {

FILE: core/util/engineTools.js
  function getMisMatchThreshHold (line 8) | function getMisMatchThreshHold (scenario, config) {
  function ensureFileSuffix (line 12) | function ensureFileSuffix (filename, suffix) {
  function glueStringsWithSlash (line 18) | function glueStringsWithSlash (stringA, stringB) {
  function genHash (line 22) | function genHash (str) {
  function getRequireSameDimensions (line 45) | function getRequireSameDimensions (scenario, config) {
  function getSelectorName (line 49) | function getSelectorName (selector) {
  function makeSafe (line 53) | function makeSafe (str) {
  function getFilename (line 57) | function getFilename (fileNameTemplate, outputFileFormatSuffix, configId...
  function getEngineOption (line 75) | function getEngineOption (config, optionName, fallBack) {
  function getScenarioExpect (line 82) | function getScenarioExpect (scenario) {
  function generateTestPair (line 91) | function generateTestPair (config, scenario, viewport, variantOrScenario...

FILE: core/util/ensureDirectoryPath.js
  function ensureDirectoryPath (line 4) | function ensureDirectoryPath (filePath) {

FILE: core/util/extendConfig.js
  function extendConfig (line 8) | function extendConfig (config, userConfig) {
  function bitmapPaths (line 30) | function bitmapPaths (config, userConfig) {
  function ci (line 39) | function ci (config, userConfig) {
  function htmlReport (line 59) | function htmlReport (config, userConfig) {
  function jsonReport (line 74) | function jsonReport (config, userConfig) {
  function comparePaths (line 83) | function comparePaths (config) {
  function captureConfigPaths (line 88) | function captureConfigPaths (config) {
  function engine (line 98) | function engine (config, userConfig) {

FILE: core/util/getFreePorts.js
  function findFreePorts (line 16) | function findFreePorts (startPort, pointer) {

FILE: core/util/logger.js
  function identity (line 5) | function identity (string) { return string; }
  function paddedString (line 27) | function paddedString (length, string) {
  function message (line 49) | function message (type, subject, string) {

FILE: core/util/makeConfig.js
  constant NON_CONFIG_COMMANDS (line 4) | const NON_CONFIG_COMMANDS = ['init', 'version', 'stop'];
  function projectPath (line 6) | function projectPath (config) {
  function loadProjectConfig (line 10) | function loadProjectConfig (command, options, config) {
  function makeConfig (line 53) | function makeConfig (command, options) {

FILE: core/util/remote.js
  function extractReport (line 9) | function extractReport (jsonpReport) {
  function modifyJsonpReportHelper (line 21) | function modifyJsonpReportHelper (originalJsonpReport, approvedFileName) {
  function modifyJsonpReport (line 46) | async function modifyJsonpReport ({ reportConfigFilename, approvedFileNa...

FILE: core/util/runDocker.js
  constant DEFAULT_DOCKER_COMMAND_TEMPLATE (line 5) | const DEFAULT_DOCKER_COMMAND_TEMPLATE = 'docker run --rm -it --mount typ...

FILE: core/util/runPlaywright.js
  constant TEST_TIMEOUT (line 11) | const TEST_TIMEOUT = 60000;
  constant DEFAULT_FILENAME_TEMPLATE (line 12) | const DEFAULT_FILENAME_TEMPLATE = '{configId}_{scenarioLabel}_{selectorI...
  constant DEFAULT_BITMAPS_TEST_DIR (line 13) | const DEFAULT_BITMAPS_TEST_DIR = 'bitmaps_test';
  constant DEFAULT_BITMAPS_REFERENCE_DIR (line 14) | const DEFAULT_BITMAPS_REFERENCE_DIR = 'bitmaps_reference';
  constant SELECTOR_NOT_FOUND_PATH (line 15) | const SELECTOR_NOT_FOUND_PATH = '/capture/resources/notFound.png';
  constant HIDDEN_SELECTOR_PATH (line 16) | const HIDDEN_SELECTOR_PATH = '/capture/resources/notVisible.png';
  constant ERROR_SELECTOR_PATH (line 17) | const ERROR_SELECTOR_PATH = '/capture/resources/unexpectedErrorSm.png';
  constant BODY_SELECTOR (line 18) | const BODY_SELECTOR = 'body';
  constant DOCUMENT_SELECTOR (line 19) | const DOCUMENT_SELECTOR = 'document';
  constant NOCLIP_SELECTOR (line 20) | const NOCLIP_SELECTOR = 'body:noclip';
  constant VIEWPORT_SELECTOR (line 21) | const VIEWPORT_SELECTOR = 'viewport';
  function processScenarioView (line 125) | async function processScenarioView (scenario, variantOrScenarioLabelSafe...
  function delegateSelectors (line 359) | async function delegateSelectors (
  function captureScreenshot (line 435) | async function captureScreenshot (page, browserContext, selector, select...
  function translateUrl (line 501) | function translateUrl (url) {

FILE: core/util/runPuppet.js
  constant MIN_CHROME_VERSION (line 11) | const MIN_CHROME_VERSION = 62;
  constant TEST_TIMEOUT (line 12) | const TEST_TIMEOUT = 60000;
  constant DEFAULT_FILENAME_TEMPLATE (line 13) | const DEFAULT_FILENAME_TEMPLATE = '{configId}_{scenarioLabel}_{selectorI...
  constant DEFAULT_BITMAPS_TEST_DIR (line 14) | const DEFAULT_BITMAPS_TEST_DIR = 'bitmaps_test';
  constant DEFAULT_BITMAPS_REFERENCE_DIR (line 15) | const DEFAULT_BITMAPS_REFERENCE_DIR = 'bitmaps_reference';
  constant SELECTOR_NOT_FOUND_PATH (line 16) | const SELECTOR_NOT_FOUND_PATH = '/capture/resources/notFound.png';
  constant HIDDEN_SELECTOR_PATH (line 17) | const HIDDEN_SELECTOR_PATH = '/capture/resources/notVisible.png';
  constant ERROR_SELECTOR_PATH (line 18) | const ERROR_SELECTOR_PATH = '/capture/resources/unexpectedErrorSm.png';
  constant BODY_SELECTOR (line 19) | const BODY_SELECTOR = 'body';
  constant DOCUMENT_SELECTOR (line 20) | const DOCUMENT_SELECTOR = 'document';
  constant NOCLIP_SELECTOR (line 21) | const NOCLIP_SELECTOR = 'body:noclip';
  constant VIEWPORT_SELECTOR (line 22) | const VIEWPORT_SELECTOR = 'viewport';
  function loggerAction (line 47) | function loggerAction (action, color, message, ...rest) {
  function processScenarioView (line 52) | async function processScenarioView (scenario, variantOrScenarioLabelSafe...
  function delegateSelectors (line 309) | async function delegateSelectors (
  function captureScreenshot (line 388) | async function captureScreenshot (page, browser, selector, selectorMap, ...
  function translateUrl (line 468) | function translateUrl (url, logger) {
  function writeScenarioLogs (line 479) | function writeScenarioLogs (config, logFilePath, logger) {

FILE: examples/Jenkins/Sample/backstop_data/engine_scripts/puppet/interceptImages.js
  constant IMAGE_URL_RE (line 18) | const IMAGE_URL_RE = /\.gif|\.jpg|\.png/i;
  constant IMAGE_STUB_URL (line 19) | const IMAGE_STUB_URL = path.resolve(__dirname, '../../imageStub.jpg');
  constant IMAGE_DATA_BUFFER (line 20) | const IMAGE_DATA_BUFFER = fs.readFileSync(IMAGE_STUB_URL);
  constant HEADERS_STUB (line 21) | const HEADERS_STUB = {};

FILE: examples/featureTests/dist/js/bootstrap.js
  function transitionEnd (line 33) | function transitionEnd() {
  function removeElement (line 125) | function removeElement() {
  function Plugin (line 141) | function Plugin(option) {
  function Plugin (line 246) | function Plugin(option) {
  function Plugin (line 468) | function Plugin(option) {
  function getTargetFromTrigger (line 687) | function getTargetFromTrigger($trigger) {
  function Plugin (line 699) | function Plugin(option) {
  function clearMenus (line 831) | function clearMenus(e) {
  function getParent (line 850) | function getParent($this) {
  function Plugin (line 867) | function Plugin(option) {
  function Plugin (line 1181) | function Plugin(option, _relatedTarget) {
  function complete (line 1523) | function complete() {
  function Plugin (line 1675) | function Plugin(option) {
  function Plugin (line 1795) | function Plugin(option) {
  function ScrollSpy (line 1844) | function ScrollSpy(element, options) {
  function Plugin (line 1967) | function Plugin(option) {
  function next (line 2074) | function next() {
  function Plugin (line 2120) | function Plugin(option) {
  function Plugin (line 2277) | function Plugin(option) {

FILE: examples/myCoolProject/dist/js/bootstrap.js
  function transitionEnd (line 33) | function transitionEnd() {
  function removeElement (line 125) | function removeElement() {
  function Plugin (line 141) | function Plugin(option) {
  function Plugin (line 246) | function Plugin(option) {
  function Plugin (line 468) | function Plugin(option) {
  function getTargetFromTrigger (line 687) | function getTargetFromTrigger($trigger) {
  function Plugin (line 699) | function Plugin(option) {
  function clearMenus (line 831) | function clearMenus(e) {
  function getParent (line 850) | function getParent($this) {
  function Plugin (line 867) | function Plugin(option) {
  function Plugin (line 1181) | function Plugin(option, _relatedTarget) {
  function complete (line 1523) | function complete() {
  function Plugin (line 1675) | function Plugin(option) {
  function Plugin (line 1795) | function Plugin(option) {
  function ScrollSpy (line 1844) | function ScrollSpy(element, options) {
  function Plugin (line 1967) | function Plugin(option) {
  function next (line 2074) | function next() {
  function Plugin (line 2120) | function Plugin(option) {
  function Plugin (line 2277) | function Plugin(option) {

FILE: examples/nodeIntegration/backstop.js
  function getScenariosForProject (line 42) | function getScenariosForProject (projectPath) {
  function isFileToIgnore (line 63) | function isFileToIgnore (file) {

FILE: examples/responsiveDemo/backstop_data/engine_scripts/puppet/interceptImages.js
  constant IMAGE_URL_RE (line 18) | const IMAGE_URL_RE = /\.gif|\.jpg|\.png/i;
  constant IMAGE_STUB_URL (line 19) | const IMAGE_STUB_URL = path.resolve(__dirname, '../../imageStub.jpg');
  constant IMAGE_DATA_BUFFER (line 20) | const IMAGE_DATA_BUFFER = fs.readFileSync(IMAGE_STUB_URL);
  constant HEADERS_STUB (line 21) | const HEADERS_STUB = {};

FILE: examples/simpleReactApp/compiled.js
  function s (line 1) | function s (o, u) { if (!n[o]) { if (!t[o]) { var a = typeof require ===...
  function utils_hooks__hooks (line 10) | function utils_hooks__hooks () { return hookCallback.apply(null, argumen...
  function setHookCallback (line 10) | function setHookCallback (callback) { hookCallback = callback; }
  function isArray (line 10) | function isArray (input) { return input instanceof Array || Object.proto...
  function isObject (line 10) | function isObject (input) { return Object.prototype.toString.call(input)...
  function isObjectEmpty (line 10) | function isObjectEmpty (obj) { var k; for (k in obj) { return false; } r...
  function isDate (line 10) | function isDate (input) { return input instanceof Date || Object.prototy...
  function map (line 10) | function map (arr, fn) { var res = []; var i; for (i = 0; i < arr.length...
  function hasOwnProp (line 10) | function hasOwnProp (a, b) { return Object.prototype.hasOwnProperty.call...
  function extend (line 10) | function extend (a, b) { for (var i in b) { if (hasOwnProp(b, i)) { a[i]...
  function create_utc__createUTC (line 10) | function create_utc__createUTC (input, format, locale, strict) { return ...
  function defaultParsingFlags (line 10) | function defaultParsingFlags () { return { empty: false, unusedTokens: [...
  function getParsingFlags (line 10) | function getParsingFlags (m) { if (m._pf == null) { m._pf = defaultParsi...
  function valid__isValid (line 10) | function valid__isValid (m) { if (m._isValid == null) { var flags = getP...
  function valid__createInvalid (line 10) | function valid__createInvalid (flags) { var m = create_utc__createUTC(Na...
  function isUndefined (line 10) | function isUndefined (input) { return input === void 0; }
  function copyConfig (line 10) | function copyConfig (to, from) { var i, prop, val; if (!isUndefined(from...
  function Moment (line 10) | function Moment (config) { copyConfig(this, config); this._d = new Date(...
  function isMoment (line 10) | function isMoment (obj) { return obj instanceof Moment || obj != null &&...
  function absFloor (line 10) | function absFloor (number) { if (number < 0) { return Math.ceil(number) ...
  function toInt (line 10) | function toInt (argumentForCoercion) { var coercedNumber = +argumentForC...
  function compareArrays (line 10) | function compareArrays (array1, array2, dontConvert) { var len = Math.mi...
  function warn (line 10) | function warn (msg) { if (utils_hooks__hooks.suppressDeprecationWarnings...
  function deprecate (line 10) | function deprecate (msg, fn) { var firstTime = true; return extend(funct...
  function deprecateSimple (line 10) | function deprecateSimple (name, msg) { if (utils_hooks__hooks.deprecatio...
  function isFunction (line 10) | function isFunction (input) { return input instanceof Function || Object...
  function locale_set__set (line 10) | function locale_set__set (config) { var prop, i; for (i in config) { pro...
  function mergeConfigs (line 10) | function mergeConfigs (parentConfig, childConfig) { var res = extend({},...
  function Locale (line 10) | function Locale (config) { if (config != null) { this.set(config); } }
  function locale_calendar__calendar (line 10) | function locale_calendar__calendar (key, mom, now) { var output = this._...
  function longDateFormat (line 10) | function longDateFormat (key) { var format = this._longDateFormat[key]; ...
  function invalidDate (line 10) | function invalidDate () { return this._invalidDate; }
  function ordinal (line 10) | function ordinal (number) { return this._ordinal.replace('%d', number); }
  function relative__relativeTime (line 10) | function relative__relativeTime (number, withoutSuffix, string, isFuture...
  function pastFuture (line 10) | function pastFuture (diff, output) { var format = this._relativeTime[dif...
  function addUnitAlias (line 10) | function addUnitAlias (unit, shorthand) { var lowerCase = unit.toLowerCa...
  function normalizeUnits (line 10) | function normalizeUnits (units) { return typeof units === 'string' ? ali...
  function normalizeObjectUnits (line 10) | function normalizeObjectUnits (inputObject) { var normalizedInput = {}; ...
  function addUnitPriority (line 10) | function addUnitPriority (unit, priority) { priorities[unit] = priority; }
  function getPrioritizedUnits (line 10) | function getPrioritizedUnits (unitsObj) { var units = []; for (var u in ...
  function makeGetSet (line 10) | function makeGetSet (unit, keepTime) { return function (value) { if (val...
  function get_set__get (line 10) | function get_set__get (mom, unit) { return mom.isValid() ? mom._d['get' ...
  function get_set__set (line 10) | function get_set__set (mom, unit, value) { if (mom.isValid()) { mom._d['...
  function stringGet (line 10) | function stringGet (units) { units = normalizeUnits(units); if (isFuncti...
  function stringSet (line 10) | function stringSet (units, value) { if (typeof units === 'object') { uni...
  function zeroFill (line 10) | function zeroFill (number, targetLength, forceSign) { var absNumber = ''...
  function addFormatToken (line 10) | function addFormatToken (token, padded, ordinal, callback) { var func = ...
  function removeFormattingTokens (line 10) | function removeFormattingTokens (input) { if (input.match(/\[[\s\S]/)) {...
  function makeFormatFunction (line 10) | function makeFormatFunction (format) { var array = format.match(formatti...
  function formatMoment (line 10) | function formatMoment (m, format) { if (!m.isValid()) { return m.localeD...
  function expandFormat (line 10) | function expandFormat (format, locale) { var i = 5; function replaceLong...
  function addRegexToken (line 10) | function addRegexToken (token, regex, strictRegex) { regexes[token] = is...
  function getParseRegexForToken (line 10) | function getParseRegexForToken (token, config) { if (!hasOwnProp(regexes...
  function unescapeFormat (line 10) | function unescapeFormat (s) { return regexEscape(s.replace('\\', '').rep...
  function regexEscape (line 10) | function regexEscape (s) { return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\...
  function addParseToken (line 10) | function addParseToken (token, callback) { var i; var func = callback; i...
  function addWeekParseToken (line 10) | function addWeekParseToken (token, callback) { addParseToken(token, func...
  function addTimeToArrayFromToken (line 10) | function addTimeToArrayFromToken (token, input, config) { if (input != n...
  function daysInMonth (line 10) | function daysInMonth (year, month) { return new Date(Date.UTC(year, mont...
  function localeMonths (line 10) | function localeMonths (m, format) { return isArray(this._months) ? this....
  function localeMonthsShort (line 10) | function localeMonthsShort (m, format) { return isArray(this._monthsShor...
  function units_month__handleStrictParse (line 10) | function units_month__handleStrictParse (monthName, format, strict) { va...
  function localeMonthsParse (line 10) | function localeMonthsParse (monthName, format, strict) { var i, mom, reg...
  function setMonth (line 10) | function setMonth (mom, value) { var dayOfMonth; if (!mom.isValid()) { r...
  function getSetMonth (line 10) | function getSetMonth (value) { if (value != null) { setMonth(this, value...
  function getDaysInMonth (line 10) | function getDaysInMonth () { return daysInMonth(this.year(), this.month(...
  function monthsShortRegex (line 10) | function monthsShortRegex (isStrict) { if (this._monthsParseExact) { if ...
  function monthsRegex (line 10) | function monthsRegex (isStrict) { if (this._monthsParseExact) { if (!has...
  function computeMonthsParse (line 10) | function computeMonthsParse () { function cmpLenRev (a, b) { return b.le...
  function daysInYear (line 10) | function daysInYear (year) { return isLeapYear(year) ? 366 : 365; }
  function isLeapYear (line 10) | function isLeapYear (year) { return year % 4 === 0 && year % 100 !== 0 |...
  function getIsLeapYear (line 10) | function getIsLeapYear () { return isLeapYear(this.year()); }
  function createDate (line 10) | function createDate (y, m, d, h, M, s, ms) { var date = new Date(y, m, d...
  function createUTCDate (line 10) | function createUTCDate (y) { var date = new Date(Date.UTC.apply(null, ar...
  function firstWeekOffset (line 10) | function firstWeekOffset (year, dow, doy) { var fwd = 7 + dow - doy; var...
  function dayOfYearFromWeeks (line 10) | function dayOfYearFromWeeks (year, week, weekday, dow, doy) { var localW...
  function weekOfYear (line 10) | function weekOfYear (mom, dow, doy) { var weekOffset = firstWeekOffset(m...
  function weeksInYear (line 10) | function weeksInYear (year, dow, doy) { var weekOffset = firstWeekOffset...
  function localeWeek (line 10) | function localeWeek (mom) { return weekOfYear(mom, this._week.dow, this....
  function localeFirstDayOfWeek (line 10) | function localeFirstDayOfWeek () { return this._week.dow; }
  function localeFirstDayOfYear (line 10) | function localeFirstDayOfYear () { return this._week.doy; }
  function getSetWeek (line 10) | function getSetWeek (input) { var week = this.localeData().week(this); r...
  function getSetISOWeek (line 10) | function getSetISOWeek (input) { var week = weekOfYear(this, 1, 4).week;...
  function parseWeekday (line 10) | function parseWeekday (input, locale) { if (typeof input !== 'string') {...
  function parseIsoWeekday (line 10) | function parseIsoWeekday (input, locale) { if (typeof input === 'string'...
  function localeWeekdays (line 10) | function localeWeekdays (m, format) { return isArray(this._weekdays) ? t...
  function localeWeekdaysShort (line 10) | function localeWeekdaysShort (m) { return this._weekdaysShort[m.day()]; }
  function localeWeekdaysMin (line 10) | function localeWeekdaysMin (m) { return this._weekdaysMin[m.day()]; }
  function day_of_week__handleStrictParse (line 10) | function day_of_week__handleStrictParse (weekdayName, format, strict) {
  function localeWeekdaysParse (line 14) | function localeWeekdaysParse (weekdayName, format, strict) { var i, mom,...
  function getSetDayOfWeek (line 14) | function getSetDayOfWeek (input) { if (!this.isValid()) { return input !...
  function getSetLocaleDayOfWeek (line 14) | function getSetLocaleDayOfWeek (input) { if (!this.isValid()) { return i...
  function getSetISODayOfWeek (line 14) | function getSetISODayOfWeek (input) { if (!this.isValid()) { return inpu...
  function weekdaysRegex (line 14) | function weekdaysRegex (isStrict) { if (this._weekdaysParseExact) { if (...
  function weekdaysShortRegex (line 14) | function weekdaysShortRegex (isStrict) { if (this._weekdaysParseExact) {...
  function weekdaysMinRegex (line 14) | function weekdaysMinRegex (isStrict) { if (this._weekdaysParseExact) { i...
  function computeWeekdaysParse (line 14) | function computeWeekdaysParse () { function cmpLenRev (a, b) { return b....
  function hFormat (line 14) | function hFormat () { return this.hours() % 12 || 12; }
  function kFormat (line 14) | function kFormat () { return this.hours() || 24; }
  function meridiem (line 14) | function meridiem (token, lowercase) { addFormatToken(token, 0, 0, funct...
  function matchMeridiem (line 14) | function matchMeridiem (isStrict, locale) { return locale._meridiemParse; }
  function localeIsPM (line 14) | function localeIsPM (input) { return (input + '').toLowerCase().charAt(0...
  function localeMeridiem (line 14) | function localeMeridiem (hours, minutes, isLower) { if (hours > 11) { re...
  function normalizeLocale (line 14) | function normalizeLocale (key) { return key ? key.toLowerCase().replace(...
  function chooseLocale (line 14) | function chooseLocale (names) { var i = 0; var j; var next; var locale; ...
  function loadLocale (line 14) | function loadLocale (name) { var oldLocale = null; if (!locales[name] &&...
  function locale_locales__getSetGlobalLocale (line 14) | function locale_locales__getSetGlobalLocale (key, values) { var data; if...
  function defineLocale (line 14) | function defineLocale (name, config) { if (config !== null) { var parent...
  function updateLocale (line 14) | function updateLocale (name, config) { if (config != null) { var locale;...
  function locale_locales__getLocale (line 14) | function locale_locales__getLocale (key) { var locale; if (key && key._l...
  function locale_locales__listLocales (line 14) | function locale_locales__listLocales () { return keys(locales); }
  function checkOverflow (line 14) | function checkOverflow (m) { var overflow; var a = m._a; if (a && getPar...
  function configFromISO (line 14) | function configFromISO (config) { var i; var l; var string = config._i; ...
  function configFromString (line 14) | function configFromString (config) { var matched = aspNetJsonRegex.exec(...
  function defaults (line 14) | function defaults (a, b, c) { if (a != null) { return a; } if (b != null...
  function currentDateArray (line 14) | function currentDateArray (config) { var nowValue = new Date(utils_hooks...
  function configFromArray (line 14) | function configFromArray (config) { var i; var date; var input = []; var...
  function dayOfYearFromWeekInfo (line 14) | function dayOfYearFromWeekInfo (config) { var w, weekYear, week, weekday...
  function configFromStringAndFormat (line 14) | function configFromStringAndFormat (config) { if (config._f === utils_ho...
  function meridiemFixWrap (line 14) | function meridiemFixWrap (locale, hour, meridiem) { var isPm; if (meridi...
  function configFromStringAndArray (line 14) | function configFromStringAndArray (config) { var tempConfig, bestMoment,...
  function configFromObject (line 14) | function configFromObject (config) { if (config._d) { return; } var i = ...
  function createFromConfig (line 14) | function createFromConfig (config) { var res = new Moment(checkOverflow(...
  function prepareConfig (line 14) | function prepareConfig (config) { var input = config._i; var format = co...
  function configFromInput (line 14) | function configFromInput (config) { var input = config._i; if (input ===...
  function createLocalOrUTC (line 14) | function createLocalOrUTC (input, format, locale, strict, isUTC) { var c...
  function local__createLocal (line 14) | function local__createLocal (input, format, locale, strict) { return cre...
  function pickBy (line 14) | function pickBy (fn, moments) { var res, i; if (moments.length === 1 && ...
  function min (line 14) | function min () { var args = [].slice.call(arguments, 0); return pickBy(...
  function max (line 14) | function max () { var args = [].slice.call(arguments, 0); return pickBy(...
  function Duration (line 14) | function Duration (duration) { var normalizedInput = normalizeObjectUnit...
  function isDuration (line 14) | function isDuration (obj) { return obj instanceof Duration; }
  function offset (line 14) | function offset (token, separator) { addFormatToken(token, 0, 0, functio...
  function offsetFromString (line 14) | function offsetFromString (matcher, string) { var matches = (string || '...
  function cloneWithOffset (line 14) | function cloneWithOffset (input, model) { var res, diff; if (model._isUT...
  function getDateOffset (line 14) | function getDateOffset (m) { return -Math.round(m._d.getTimezoneOffset()...
  function getSetOffset (line 14) | function getSetOffset (input, keepLocalTime) { var offset = this._offset...
  function getSetZone (line 14) | function getSetZone (input, keepLocalTime) { if (input != null) { if (ty...
  function setOffsetToUTC (line 14) | function setOffsetToUTC (keepLocalTime) { return this.utcOffset(0, keepL...
  function setOffsetToLocal (line 14) | function setOffsetToLocal (keepLocalTime) { if (this._isUTC) { this.utcO...
  function setOffsetToParsedOffset (line 14) | function setOffsetToParsedOffset () { if (this._tzm) { this.utcOffset(th...
  function hasAlignedHourOffset (line 14) | function hasAlignedHourOffset (input) { if (!this.isValid()) { return fa...
  function isDaylightSavingTime (line 14) | function isDaylightSavingTime () { return this.utcOffset() > this.clone(...
  function isDaylightSavingTimeShifted (line 14) | function isDaylightSavingTimeShifted () { if (!isUndefined(this._isDSTSh...
  function isLocal (line 14) | function isLocal () { return this.isValid() ? !this._isUTC : false; }
  function isUtcOffset (line 14) | function isUtcOffset () { return this.isValid() ? this._isUTC : false; }
  function isUtc (line 14) | function isUtc () { return this.isValid() ? this._isUTC && this._offset ...
  function create__createDuration (line 14) | function create__createDuration (input, key) { var duration = input; var...
  function parseIso (line 14) | function parseIso (inp, sign) { var res = inp && parseFloat(inp.replace(...
  function positiveMomentsDifference (line 14) | function positiveMomentsDifference (base, other) { var res = { milliseco...
  function momentsDifference (line 14) | function momentsDifference (base, other) { var res; if (!(base.isValid()...
  function absRound (line 14) | function absRound (number) { if (number < 0) { return Math.round(-1 * nu...
  function createAdder (line 14) | function createAdder (direction, name) { return function (val, period) {...
  function add_subtract__addSubtract (line 14) | function add_subtract__addSubtract (mom, duration, isAdding, updateOffse...
  function getCalendarFormat (line 14) | function getCalendarFormat (myMoment, now) { var diff = myMoment.diff(no...
  function moment_calendar__calendar (line 14) | function moment_calendar__calendar (time, formats) { var now = time || l...
  function clone (line 14) | function clone () { return new Moment(this); }
  function isAfter (line 14) | function isAfter (input, units) { var localInput = isMoment(input) ? inp...
  function isBefore (line 14) | function isBefore (input, units) { var localInput = isMoment(input) ? in...
  function isBetween (line 14) | function isBetween (from, to, units, inclusivity) { inclusivity = inclus...
  function isSame (line 14) | function isSame (input, units) { var localInput = isMoment(input) ? inpu...
  function isSameOrAfter (line 14) | function isSameOrAfter (input, units) { return this.isSame(input, units)...
  function isSameOrBefore (line 14) | function isSameOrBefore (input, units) { return this.isSame(input, units...
  function diff (line 14) | function diff (input, units, asFloat) {
  function monthDiff (line 18) | function monthDiff (a, b) { var wholeMonthDiff = (b.year() - a.year()) *...
  function toString (line 18) | function toString () { return this.clone().locale('en').format('ddd MMM ...
  function moment_format__toISOString (line 18) | function moment_format__toISOString () { var m = this.clone().utc(); if ...
  function format (line 18) | function format (inputString) { if (!inputString) { inputString = this.i...
  function from (line 18) | function from (time, withoutSuffix) { if (this.isValid() && (isMoment(ti...
  function fromNow (line 18) | function fromNow (withoutSuffix) { return this.from(local__createLocal()...
  function to (line 18) | function to (time, withoutSuffix) { if (this.isValid() && (isMoment(time...
  function toNow (line 18) | function toNow (withoutSuffix) { return this.to(local__createLocal(), wi...
  function locale (line 18) | function locale (key) { var newLocaleData; if (key === undefined) { retu...
  function localeData (line 18) | function localeData () { return this._locale; }
  function startOf (line 18) | function startOf (units) { units = normalizeUnits(units); switch (units)...
  function endOf (line 18) | function endOf (units) { units = normalizeUnits(units); if (units === un...
  function to_type__valueOf (line 18) | function to_type__valueOf () { return this._d.valueOf() - (this._offset ...
  function unix (line 18) | function unix () { return Math.floor(this.valueOf() / 1e3); }
  function toDate (line 18) | function toDate () { return new Date(this.valueOf()); }
  function toArray (line 18) | function toArray () { var m = this; return [m.year(), m.month(), m.date(...
  function toObject (line 18) | function toObject () { var m = this; return { years: m.year(), months: m...
  function toJSON (line 18) | function toJSON () { return this.isValid() ? this.toISOString() : null; }
  function moment_valid__isValid (line 18) | function moment_valid__isValid () { return valid__isValid(this); }
  function parsingFlags (line 18) | function parsingFlags () { return extend({}, getParsingFlags(this)); }
  function invalidAt (line 18) | function invalidAt () { return getParsingFlags(this).overflow; }
  function creationData (line 18) | function creationData () { return { input: this._i, format: this._f, loc...
  function addWeekYearFormatToken (line 18) | function addWeekYearFormatToken (token, getter) { addFormatToken(0, [tok...
  function getSetWeekYear (line 18) | function getSetWeekYear (input) { return getSetWeekYearHelper.call(this,...
  function getSetISOWeekYear (line 18) | function getSetISOWeekYear (input) { return getSetWeekYearHelper.call(th...
  function getISOWeeksInYear (line 18) | function getISOWeeksInYear () { return weeksInYear(this.year(), 1, 4); }
  function getWeeksInYear (line 18) | function getWeeksInYear () { var weekInfo = this.localeData()._week; ret...
  function getSetWeekYearHelper (line 18) | function getSetWeekYearHelper (input, week, weekday, dow, doy) { var wee...
  function setWeekAll (line 18) | function setWeekAll (weekYear, week, weekday, dow, doy) { var dayOfYearD...
  function getSetQuarter (line 18) | function getSetQuarter (input) { return input == null ? Math.ceil((this....
  function getSetDayOfYear (line 18) | function getSetDayOfYear (input) { var dayOfYear = Math.round((this.clon...
  function parseMs (line 18) | function parseMs (input, array) { array[MILLISECOND] = toInt(('0.' + inp...
  function getZoneAbbr (line 18) | function getZoneAbbr () { return this._isUTC ? 'UTC' : ''; }
  function getZoneName (line 18) | function getZoneName () { return this._isUTC ? 'Coordinated Universal Ti...
  function moment__createUnix (line 18) | function moment__createUnix (input) { return local__createLocal(input * ...
  function moment__createInZone (line 18) | function moment__createInZone () { return local__createLocal.apply(null,...
  function preParsePostFormat (line 18) | function preParsePostFormat (string) { return string; }
  function lists__get (line 18) | function lists__get (format, index, field, setter) { var locale = locale...
  function listMonthsImpl (line 18) | function listMonthsImpl (format, index, field) { if (typeof format === '...
  function listWeekdaysImpl (line 18) | function listWeekdaysImpl (localeSorted, format, index, field) { if (typ...
  function lists__listMonths (line 18) | function lists__listMonths (format, index) { return listMonthsImpl(forma...
  function lists__listMonthsShort (line 18) | function lists__listMonthsShort (format, index) { return listMonthsImpl(...
  function lists__listWeekdays (line 18) | function lists__listWeekdays (localeSorted, format, index) { return list...
  function lists__listWeekdaysShort (line 18) | function lists__listWeekdaysShort (localeSorted, format, index) { return...
  function lists__listWeekdaysMin (line 18) | function lists__listWeekdaysMin (localeSorted, format, index) { return l...
  function duration_abs__abs (line 18) | function duration_abs__abs () { var data = this._data; this._millisecond...
  function duration_add_subtract__addSubtract (line 18) | function duration_add_subtract__addSubtract (duration, input, value, dir...
  function duration_add_subtract__add (line 18) | function duration_add_subtract__add (input, value) { return duration_add...
  function duration_add_subtract__subtract (line 18) | function duration_add_subtract__subtract (input, value) { return duratio...
  function absCeil (line 18) | function absCeil (number) { if (number < 0) { return Math.floor(number);...
  function bubble (line 18) | function bubble () { var milliseconds = this._milliseconds; var days = t...
  function daysToMonths (line 18) | function daysToMonths (days) { return days * 4800 / 146097; }
  function monthsToDays (line 18) | function monthsToDays (months) { return months * 146097 / 4800; }
  function as (line 18) | function as (units) { var days; var months; var milliseconds = this._mil...
  function duration_as__valueOf (line 18) | function duration_as__valueOf () { return this._milliseconds + this._day...
  function makeAs (line 18) | function makeAs (alias) { return function () { return this.as(alias); }; }
  function duration_get__get (line 18) | function duration_get__get (units) { units = normalizeUnits(units); retu...
  function makeGetter (line 18) | function makeGetter (name) { return function () { return this._data[name...
  function weeks (line 18) | function weeks () { return absFloor(this.days() / 7); }
  function substituteTimeAgo (line 18) | function substituteTimeAgo (string, number, withoutSuffix, isFuture, loc...
  function duration_humanize__relativeTime (line 18) | function duration_humanize__relativeTime (posNegDuration, withoutSuffix,...
  function duration_humanize__getSetRelativeTimeRounding (line 18) | function duration_humanize__getSetRelativeTimeRounding (roundingFunction...
  function duration_humanize__getSetRelativeTimeThreshold (line 18) | function duration_humanize__getSetRelativeTimeThreshold (threshold, limi...
  function humanize (line 18) | function humanize (withSuffix) { var locale = this.localeData(); var out...
  function iso_string__toISOString (line 18) | function iso_string__toISOString () { var seconds = iso_string__abs(this...
  function isPresto (line 22) | function isPresto () { var opera = window.opera; return typeof opera ===...
  function isKeypressCommand (line 22) | function isKeypressCommand (nativeEvent) { return (nativeEvent.ctrlKey |...
  function getCompositionEventType (line 22) | function getCompositionEventType (topLevelType) { switch (topLevelType) ...
  function isFallbackCompositionStart (line 22) | function isFallbackCompositionStart (topLevelType, nativeEvent) { return...
  function isFallbackCompositionEnd (line 22) | function isFallbackCompositionEnd (topLevelType, nativeEvent) { switch (...
  function getDataFromCustomEvent (line 22) | function getDataFromCustomEvent (nativeEvent) { var detail = nativeEvent...
  function extractCompositionEvent (line 22) | function extractCompositionEvent (topLevelType, topLevelTarget, topLevel...
  function getNativeBeforeInputChars (line 22) | function getNativeBeforeInputChars (topLevelType, nativeEvent) { switch ...
  function getFallbackBeforeInputChars (line 22) | function getFallbackBeforeInputChars (topLevelType, nativeEvent) { if (c...
  function extractBeforeInputEvent (line 22) | function extractBeforeInputEvent (topLevelType, topLevelTarget, topLevel...
  function prefixKey (line 29) | function prefixKey (prefix, key) { return prefix + key.charAt(0).toUpper...
  function CallbackQueue (line 31) | function CallbackQueue () { this._callbacks = null; this._contexts = nul...
  function shouldUseChangeEvent (line 32) | function shouldUseChangeEvent (elem) { return elem.nodeName === 'SELECT'...
  function manualDispatchChangeEvent (line 32) | function manualDispatchChangeEvent (nativeEvent) { var event = Synthetic...
  function runEventInBatch (line 32) | function runEventInBatch (event) { EventPluginHub.enqueueEvents(event); ...
  function startWatchingForChangeEventIE8 (line 32) | function startWatchingForChangeEventIE8 (target, targetID) { activeEleme...
  function stopWatchingForChangeEventIE8 (line 32) | function stopWatchingForChangeEventIE8 () { if (!activeElement) { return...
  function getTargetIDForChangeEvent (line 32) | function getTargetIDForChangeEvent (topLevelType, topLevelTarget, topLev...
  function handleEventsForChangeEventIE8 (line 32) | function handleEventsForChangeEventIE8 (topLevelType, topLevelTarget, to...
  function startWatchingForValueChange (line 32) | function startWatchingForValueChange (target, targetID) { activeElement ...
  function stopWatchingForValueChange (line 32) | function stopWatchingForValueChange () { if (!activeElement) { return; }...
  function handlePropertyChange (line 32) | function handlePropertyChange (nativeEvent) { if (nativeEvent.propertyNa...
  function getTargetIDForInputEvent (line 32) | function getTargetIDForInputEvent (topLevelType, topLevelTarget, topLeve...
  function handleEventsForInputEventIE (line 32) | function handleEventsForInputEventIE (topLevelType, topLevelTarget, topL...
  function getTargetIDForInputEventIE (line 32) | function getTargetIDForInputEventIE (topLevelType, topLevelTarget, topLe...
  function shouldUseClickEvent (line 32) | function shouldUseClickEvent (elem) { return elem.nodeName === 'INPUT' &...
  function getTargetIDForClickEvent (line 32) | function getTargetIDForClickEvent (topLevelType, topLevelTarget, topLeve...
  function insertChildAt (line 34) | function insertChildAt (parentNode, childNode, index) { parentNode.inser...
  function checkMask (line 35) | function checkMask (value, bitmask) { return (value & bitmask) === bitma...
  function shouldIgnoreValue (line 36) | function shouldIgnoreValue (name, value) { return value == null || DOMPr...
  function getNodeName (line 37) | function getNodeName (markup) { return markup.substring(1, markup.indexO...
  function validateInstanceHandle (line 43) | function validateInstanceHandle () { var valid = InstanceHandle && Insta...
  function recomputePluginOrdering (line 64) | function recomputePluginOrdering () { if (!EventPluginOrder) { return; }...
  function publishEventForPlugin (line 64) | function publishEventForPlugin (dispatchConfig, PluginModule, eventName)...
  function publishRegistrationName (line 64) | function publishRegistrationName (registrationName, PluginModule, eventN...
  function isEndish (line 65) | function isEndish (topLevelType) { return topLevelType === topLevelTypes...
  function isMoveish (line 65) | function isMoveish (topLevelType) { return topLevelType === topLevelType...
  function isStartish (line 65) | function isStartish (topLevelType) { return topLevelType === topLevelTyp...
  function forEachEventDispatch (line 65) | function forEachEventDispatch (event, cb) { var dispatchListeners = even...
  function executeDispatch (line 65) | function executeDispatch (event, listener, domID) { event.currentTarget ...
  function executeDispatchesInOrder (line 65) | function executeDispatchesInOrder (event, cb) { forEachEventDispatch(eve...
  function executeDispatchesInOrderStopAtTrueImpl (line 65) | function executeDispatchesInOrderStopAtTrueImpl (event) { var dispatchLi...
  function executeDispatchesInOrderStopAtTrue (line 65) | function executeDispatchesInOrderStopAtTrue (event) { var ret = executeD...
  function executeDirectDispatch (line 65) | function executeDirectDispatch (event) { if ('production' !== 'productio...
  function hasDispatches (line 65) | function hasDispatches (event) { return !!event._dispatchListeners; }
  function listenerAtPhase (line 66) | function listenerAtPhase (id, event, propagationPhase) { var registratio...
  function accumulateDirectionalDispatches (line 66) | function accumulateDirectionalDispatches (domID, upwards, event) { if ('...
  function accumulateTwoPhaseDispatchesSingle (line 66) | function accumulateTwoPhaseDispatchesSingle (event) { if (event && event...
  function accumulateDispatches (line 66) | function accumulateDispatches (id, ignoredDirection, event) { if (event ...
  function accumulateDirectDispatchesSingle (line 66) | function accumulateDirectDispatchesSingle (event) { if (event && event.d...
  function accumulateTwoPhaseDispatches (line 66) | function accumulateTwoPhaseDispatches (events) { forEachAccumulated(even...
  function accumulateEnterLeaveDispatches (line 66) | function accumulateEnterLeaveDispatches (leave, enter, fromID, toID) { E...
  function accumulateDirectDispatches (line 66) | function accumulateDirectDispatches (events) { forEachAccumulated(events...
  function FallbackCompositionState (line 68) | function FallbackCompositionState (root) { this._root = root; this._star...
  function _assertSingleLink (line 70) | function _assertSingleLink (input) { 'production' !== 'production' ? inv...
  function _assertValueLink (line 70) | function _assertValueLink (input) { _assertSingleLink(input); 'productio...
  function _assertCheckedLink (line 70) | function _assertCheckedLink (input) { _assertSingleLink(input); 'product...
  function _handleLinkedValueChange (line 70) | function _handleLinkedValueChange (e) { this.props.valueLink.requestChan...
  function _handleLinkedCheckChange (line 70) | function _handleLinkedCheckChange (e) { this.props.checkedLink.requestCh...
  function remove (line 71) | function remove (event) { event.remove(); }
  function assign (line 73) | function assign (target, sources) { if (target == null) { throw new Type...
  function getListeningForDocument (line 78) | function getListeningForDocument (mountAt) {
  function ForEachBookKeeping (line 85) | function ForEachBookKeeping (forEachFunction, forEachContext) { this.for...
  function forEachSingleChild (line 85) | function forEachSingleChild (traverseContext, child, name, i) { var forE...
  function forEachChildren (line 85) | function forEachChildren (children, forEachFunc, forEachContext) { if (c...
  function MapBookKeeping (line 85) | function MapBookKeeping (mapResult, mapFunction, mapContext) { this.mapR...
  function mapSingleChildIntoContext (line 85) | function mapSingleChildIntoContext (traverseContext, child, name, i) { v...
  function mapChildren (line 85) | function mapChildren (children, func, context) { if (children == null) {...
  function forEachSingleChildDummy (line 85) | function forEachSingleChildDummy (traverseContext, child, name, i) { ret...
  function countChildren (line 85) | function countChildren (children, context) { return traverseAllChildren(...
  function validateTypeDef (line 86) | function validateTypeDef (Constructor, typeDef, location) { for (var pro...
  function validateMethodOverride (line 86) | function validateMethodOverride (proto, name) { var specPolicy = ReactCl...
  function mixSpecIntoComponent (line 86) | function mixSpecIntoComponent (Constructor, spec) { if (!spec) { return;...
  function mixStaticSpecIntoComponent (line 86) | function mixStaticSpecIntoComponent (Constructor, statics) { if (!static...
  function mergeIntoWithNoDuplicateKeys (line 86) | function mergeIntoWithNoDuplicateKeys (one, two) { 'production' !== 'pro...
  function createMergedResultFunction (line 86) | function createMergedResultFunction (one, two) { return function mergedR...
  function createChainedFunction (line 86) | function createChainedFunction (one, two) { return function chainedFunct...
  function bindAutoBindMethod (line 86) | function bindAutoBindMethod (component, method) { var boundMethod = meth...
  function bindAutoBindMethods (line 86) | function bindAutoBindMethods (component) { for (var autoBindKey in compo...
  function ReactComponent (line 87) | function ReactComponent (props, context) { this.props = props; this.cont...
  function getDeclarationErrorAddendum (line 91) | function getDeclarationErrorAddendum (component) { var owner = component...
  function createDOMFactory (line 121) | function createDOMFactory (tag) { if ('production' !== 'production') { r...
  function assertValidProps (line 123) | function assertValidProps (props) { if (!props) { return; } if (props.da...
  function putListener (line 123) | function putListener (id, registrationName, listener, transaction) { if ...
  function validateDangerousTag (line 123) | function validateDangerousTag (tag) { if (!hasOwnProperty.call(validated...
  function ReactDOMComponent (line 123) | function ReactDOMComponent (tag) { validateDangerousTag(tag); this._tag ...
  function forceUpdateIfMounted (line 128) | function forceUpdateIfMounted () { if (this.isMounted()) { this.forceUpd...
  function updateOptionsIfPendingUpdateAndMounted (line 131) | function updateOptionsIfPendingUpdateAndMounted () { if (this._pendingUp...
  function selectValueType (line 131) | function selectValueType (props, propName, componentName) { if (props[pr...
  function updateOptions (line 131) | function updateOptions (component, propValue) { var selectedValue, i, l;...
  function isCollapsed (line 132) | function isCollapsed (anchorNode, anchorOffset, focusNode, focusOffset) ...
  function getIEOffsets (line 132) | function getIEOffsets (node) { var selection = document.selection; var s...
  function getModernOffsets (line 132) | function getModernOffsets (node) { var selection = window.getSelection &...
  function setIEOffsets (line 132) | function setIEOffsets (node, offsets) { var range = document.selection.c...
  function setModernOffsets (line 132) | function setModernOffsets (node, offsets) { if (!window.getSelection) { ...
  function forceUpdateIfMounted (line 134) | function forceUpdateIfMounted () { if (this.isMounted()) { this.forceUpd...
  function ReactDefaultBatchingStrategyTransaction (line 135) | function ReactDefaultBatchingStrategyTransaction () { this.reinitializeT...
  function autoGenerateWrapperClass (line 136) | function autoGenerateWrapperClass (type) { return ReactClass.createClass...
  function inject (line 136) | function inject () { ReactInjection.EventEmitter.injectReactEventListene...
  function roundFloat (line 137) | function roundFloat (val) { return Math.floor(val * 100) / 100; }
  function addValue (line 137) | function addValue (obj, key, val) { obj[key] = (obj[key] || 0) + val; }
  function getTotalTime (line 138) | function getTotalTime (measurements) { var totalTime = 0; for (var i = 0...
  function getDOMSummary (line 138) | function getDOMSummary (measurements) { var items = []; for (var i = 0; ...
  function getExclusiveSummary (line 138) | function getExclusiveSummary (measurements) { var candidates = {}; var d...
  function getInclusiveSummary (line 138) | function getInclusiveSummary (measurements, onlyClean) { var candidates ...
  function getUnchangedComponents (line 138) | function getUnchangedComponents (measurement) { var cleanComponents = {}...
  function defineWarningProperty (line 139) | function defineWarningProperty (object, key) { Object.defineProperty(obj...
  function defineMutationMembrane (line 139) | function defineMutationMembrane (prototype) { try { var pseudoFrozenProp...
  function getDeclarationErrorAddendum (line 141) | function getDeclarationErrorAddendum () { if (ReactCurrentOwner.current)...
  function getName (line 141) | function getName (instance) { var publicInstance = instance && instance....
  function getCurrentOwnerDisplayName (line 141) | function getCurrentOwnerDisplayName () { var current = ReactCurrentOwner...
  function validateExplicitKey (line 141) | function validateExplicitKey (element, parentType) {
  function validatePropertyKey (line 144) | function validatePropertyKey (name, element, parentType) { if (!NUMERIC_...
  function warnAndMonitorForKeyUse (line 144) | function warnAndMonitorForKeyUse (message, element, parentType) { var ow...
  function validateChildKeys (line 144) | function validateChildKeys (node, parentType) { if (Array.isArray(node))...
  function checkPropTypes (line 144) | function checkPropTypes (componentName, propTypes, props, location) { fo...
  function warnForPropsMutation (line 144) | function warnForPropsMutation (propName, element) { var type = element.t...
  function is (line 144) | function is (a, b) { if (a !== a) { return b !== b; } if (a === 0 && b =...
  function checkAndWarnForMutatedProps (line 144) | function checkAndWarnForMutatedProps (element) { if (!element._store) { ...
  function validatePropTypes (line 144) | function validatePropTypes (element) { if (element.type == null) { retur...
  function registerNullComponentID (line 146) | function registerNullComponentID (id) { nullComponentIDsRegistry[id] = t...
  function deregisterNullComponentID (line 146) | function deregisterNullComponentID (id) { delete nullComponentIDsRegistr...
  function isNullComponentID (line 146) | function isNullComponentID (id) { return !!nullComponentIDsRegistry[id]; }
  function runEventQueueInBatch (line 148) | function runEventQueueInBatch (events) { EventPluginHub.enqueueEvents(ev...
  function findParent (line 149) | function findParent (node) { var nodeID = ReactMount.getID(node); var ro...
  function TopLevelCallbackBookKeeping (line 149) | function TopLevelCallbackBookKeeping (topLevelType, nativeEvent) { this....
  function handleTopLevelImpl (line 149) | function handleTopLevelImpl (bookKeeping) { var topLevelTarget = ReactMo...
  function scrollValueMonitor (line 149) | function scrollValueMonitor (cb) { var scrollPosition = getUnboundedScro...
  function isInDocument (line 152) | function isInDocument (node) { return containsNode(document.documentElem...
  function getReactRootIDString (line 153) | function getReactRootIDString (index) { return SEPARATOR + index.toStrin...
  function isBoundary (line 153) | function isBoundary (id, index) { return id.charAt(index) === SEPARATOR ...
  function isValidID (line 153) | function isValidID (id) { return id === '' || id.charAt(0) === SEPARATOR...
  function isAncestorIDOf (line 153) | function isAncestorIDOf (ancestorID, descendantID) { return descendantID...
  function getParentID (line 153) | function getParentID (id) { return id ? id.substr(0, id.lastIndexOf(SEPA...
  function getNextDescendantID (line 153) | function getNextDescendantID (ancestorID, destinationID) { 'production' ...
  function getFirstCommonAncestorID (line 153) | function getFirstCommonAncestorID (oneID, twoID) { var minLength = Math....
  function traverseParentPath (line 153) | function traverseParentPath (start, stop, cb, arg, skipFirst, skipLast) ...
  function firstDifferenceIndex (line 158) | function firstDifferenceIndex (string1, string2) { var minLen = Math.min...
  function getReactRootID (line 158) | function getReactRootID (container) { var rootElement = getReactRootElem...
  function getID (line 158) | function getID (node) { var id = internalGetID(node); if (id) { if (node...
  function internalGetID (line 158) | function internalGetID (node) { return node && node.getAttribute && node...
  function setID (line 158) | function setID (node, id) { var oldID = internalGetID(node); if (oldID !...
  function getNode (line 158) | function getNode (id) { if (!nodeCache.hasOwnProperty(id) || !isValid(no...
  function getNodeFromInstance (line 158) | function getNodeFromInstance (instance) { var id = ReactInstanceMap.get(...
  function isValid (line 158) | function isValid (node, id) { if (node) { 'production' !== 'production' ...
  function purgeID (line 158) | function purgeID (id) { delete nodeCache[id]; }
  function findDeepestCachedAncestorImpl (line 158) | function findDeepestCachedAncestorImpl (ancestorID) { var ancestor = nod...
  function findDeepestCachedAncestor (line 158) | function findDeepestCachedAncestor (targetID) { deepestNodeSoFar = null;...
  function mountComponentIntoNode (line 158) | function mountComponentIntoNode (componentInstance, rootID, container, t...
  function batchedMountComponentIntoNode (line 158) | function batchedMountComponentIntoNode (componentInstance, rootID, conta...
  function enqueueMarkup (line 186) | function enqueueMarkup (parentID, markup, toIndex) { updateQueue.push({ ...
  function enqueueMove (line 186) | function enqueueMove (parentID, fromIndex, toIndex) { updateQueue.push({...
  function enqueueRemove (line 186) | function enqueueRemove (parentID, fromIndex) { updateQueue.push({ parent...
  function enqueueTextContent (line 186) | function enqueueTextContent (parentID, textContent) { updateQueue.push({...
  function processQueue (line 186) | function processQueue () { if (updateQueue.length) { ReactComponentEnvir...
  function clearQueue (line 186) | function clearQueue () { updateQueue.length = 0; markupQueue.length = 0; }
  function getComponentClassForElement (line 188) | function getComponentClassForElement (element) { if (typeof element.type...
  function createInternalComponent (line 188) | function createInternalComponent (element) { 'production' !== 'productio...
  function createInstanceForText (line 188) | function createInstanceForText (text) { return new textComponentClass(te...
  function isTextComponent (line 188) | function isTextComponent (component) { return component instanceof textC...
  function _noMeasure (line 190) | function _noMeasure (objName, fnName, func) { return func; }
  function createChainableTypeChecker (line 193) | function createChainableTypeChecker (validate) { function checkType (isR...
  function createPrimitiveTypeChecker (line 193) | function createPrimitiveTypeChecker (expectedType) { function validate (...
  function createAnyTypeChecker (line 193) | function createAnyTypeChecker () { return createChainableTypeChecker(emp...
  function createArrayOfTypeChecker (line 193) | function createArrayOfTypeChecker (typeChecker) { function validate (pro...
  function createElementTypeChecker (line 193) | function createElementTypeChecker () { function validate (props, propNam...
  function createInstanceTypeChecker (line 193) | function createInstanceTypeChecker (expectedClass) { function validate (...
  function createEnumTypeChecker (line 193) | function createEnumTypeChecker (expectedValues) { function validate (pro...
  function createObjectOfTypeChecker (line 193) | function createObjectOfTypeChecker (typeChecker) { function validate (pr...
  function createUnionTypeChecker (line 193) | function createUnionTypeChecker (arrayOfTypeCheckers) { function validat...
  function createNodeChecker (line 193) | function createNodeChecker () { function validate (props, propName, comp...
  function createShapeTypeChecker (line 193) | function createShapeTypeChecker (shapeTypes) { function validate (props,...
  function isNode (line 193) | function isNode (propValue) { switch (typeof propValue) { case 'number':...
  function getPropType (line 193) | function getPropType (propValue) { var propType = typeof propValue; if (...
  function getPreciseType (line 193) | function getPreciseType (propValue) { var propType = getPropType(propVal...
  function ReactPutListenerQueue (line 194) | function ReactPutListenerQueue () { this.listenersToPut = []; }
  function ReactReconcileTransaction (line 195) | function ReactReconcileTransaction () { this.reinitializeTransaction(); ...
  function attachRefs (line 196) | function attachRefs () { ReactRef.attachRefs(this, this._currentElement); }
  function attachRef (line 197) | function attachRef (ref, component, owner) { if (typeof ref === 'functio...
  function detachRef (line 197) | function detachRef (ref, component, owner) { if (typeof ref === 'functio...
  function renderToString (line 199) | function renderToString (element) { 'production' !== 'production' ? inva...
  function renderToStaticMarkup (line 199) | function renderToStaticMarkup (element) { 'production' !== 'production' ...
  function ReactServerRenderingTransaction (line 201) | function ReactServerRenderingTransaction (renderToStaticMarkup) { this.r...
  function enqueueUpdate (line 208) | function enqueueUpdate (internalInstance) { if (internalInstance !== Rea...
  function getInternalInstanceReadyForUpdate (line 208) | function getInternalInstanceReadyForUpdate (publicInstance, callerName) ...
  function ensureInjected (line 209) | function ensureInjected () { 'production' !== 'production' ? invariant(R...
  function ReactUpdatesFlushTransaction (line 209) | function ReactUpdatesFlushTransaction () { this.reinitializeTransaction(...
  function batchedUpdates (line 209) | function batchedUpdates (callback, a, b, c, d) { ensureInjected(); batch...
  function mountOrderComparator (line 209) | function mountOrderComparator (c1, c2) { return c1._mountOrder - c2._mou...
  function runBatchedUpdates (line 209) | function runBatchedUpdates (transaction) { var len = transaction.dirtyCo...
  function enqueueUpdate (line 209) | function enqueueUpdate (component) { ensureInjected(); 'production' !== ...
  function asap (line 209) | function asap (callback, context) { 'production' !== 'production' ? inva...
  function getSelection (line 211) | function getSelection (node) { if ('selectionStart' in node && ReactInpu...
  function constructSelectEvent (line 211) | function constructSelectEvent (nativeEvent) { if (mouseDown || activeEle...
  function SyntheticClipboardEvent (line 214) | function SyntheticClipboardEvent (dispatchConfig, dispatchMarker, native...
  function SyntheticCompositionEvent (line 215) | function SyntheticCompositionEvent (dispatchConfig, dispatchMarker, nati...
  function SyntheticDragEvent (line 216) | function SyntheticDragEvent (dispatchConfig, dispatchMarker, nativeEvent...
  function SyntheticEvent (line 217) | function SyntheticEvent (dispatchConfig, dispatchMarker, nativeEvent) { ...
  function SyntheticFocusEvent (line 218) | function SyntheticFocusEvent (dispatchConfig, dispatchMarker, nativeEven...
  function SyntheticInputEvent (line 219) | function SyntheticInputEvent (dispatchConfig, dispatchMarker, nativeEven...
  function SyntheticKeyboardEvent (line 220) | function SyntheticKeyboardEvent (dispatchConfig, dispatchMarker, nativeE...
  function SyntheticMouseEvent (line 237) | function SyntheticMouseEvent (dispatchConfig, dispatchMarker, nativeEven...
  function SyntheticTouchEvent (line 239) | function SyntheticTouchEvent (dispatchConfig, dispatchMarker, nativeEven...
  function SyntheticUIEvent (line 240) | function SyntheticUIEvent (dispatchConfig, dispatchMarker, nativeEvent) ...
  function SyntheticWheelEvent (line 241) | function SyntheticWheelEvent (dispatchConfig, dispatchMarker, nativeEven...
  function accumulateInto (line 244) | function accumulateInto (current, next) { 'production' !== 'production' ...
  function adler32 (line 245) | function adler32 (data) { var a = 1; var b = 0; for (var i = 0; i < data...
  function camelize (line 246) | function camelize (string) { return string.replace(_hyphenPattern, funct...
  function camelizeStyleName (line 247) | function camelizeStyleName (string) { return camelize(string.replace(msP...
  function containsNode (line 248) | function containsNode (outerNode, innerNode) { if (!outerNode || !innerN...
  function hasArrayNature (line 249) | function hasArrayNature (obj) { return !!obj && (typeof obj === 'object'...
  function createArrayFromMixed (line 249) | function createArrayFromMixed (obj) { if (!hasArrayNature(obj)) { return...
  function createFullPageComponent (line 250) | function createFullPageComponent (tag) { var elementFactory = ReactEleme...
  function getNodeName (line 251) | function getNodeName (markup) { var nodeNameMatch = markup.match(nodeNam...
  function createNodesFromMarkup (line 251) | function createNodesFromMarkup (markup, handleScript) { var node = dummy...
  function dangerousStyleValue (line 252) | function dangerousStyleValue (name, value) { var isEmpty = value == null...
  function makeEmptyFunction (line 253) | function makeEmptyFunction (arg) { return function () { return arg; }; }
  function emptyFunction (line 253) | function emptyFunction () {}
  function escaper (line 255) | function escaper (match) { return ESCAPE_LOOKUP[match]; }
  function escapeTextContentForBrowser (line 255) | function escapeTextContentForBrowser (text) { return ('' + text).replace...
  function findDOMNode (line 256) | function findDOMNode (componentOrElement) { if ('production' !== 'produc...
  function flattenSingleChildIntoContext (line 257) | function flattenSingleChildIntoContext (traverseContext, child, name) { ...
  function flattenChildren (line 257) | function flattenChildren (children) { if (children == null) { return chi...
  function focusNode (line 258) | function focusNode (node) { try { node.focus(); } catch (e) {} }
  function getActiveElement (line 260) | function getActiveElement () { try { return document.activeElement || do...
  function getEventCharCode (line 261) | function getEventCharCode (nativeEvent) { var charCode; var keyCode = na...
  function getEventKey (line 262) | function getEventKey (nativeEvent) { if (nativeEvent.key) { var key = no...
  function modifierStateGetter (line 263) | function modifierStateGetter (keyArg) { var syntheticEvent = this; var n...
  function getEventModifierState (line 263) | function getEventModifierState (nativeEvent) { return modifierStateGette...
  function getEventTarget (line 264) | function getEventTarget (nativeEvent) { var target = nativeEvent.target ...
  function getIteratorFn (line 265) | function getIteratorFn (maybeIterable) { var iteratorFn = maybeIterable ...
  function getMarkupWrap (line 266) | function getMarkupWrap (nodeName) { 'production' !== 'production' ? inva...
  function getLeafNode (line 267) | function getLeafNode (node) { while (node && node.firstChild) { node = n...
  function getSiblingNode (line 267) | function getSiblingNode (node) { while (node) { if (node.nextSibling) { ...
  function getNodeForCharacterOffset (line 267) | function getNodeForCharacterOffset (root, offset) { var node = getLeafNo...
  function getReactRootElementInContainer (line 268) | function getReactRootElementInContainer (container) { if (!container) { ...
  function getTextContentAccessor (line 269) | function getTextContentAccessor () { if (!contentKey && ExecutionEnviron...
  function getUnboundedScrollPosition (line 270) | function getUnboundedScrollPosition (scrollable) { if (scrollable === wi...
  function hyphenate (line 271) | function hyphenate (string) { return string.replace(_uppercasePattern, '...
  function hyphenateStyleName (line 272) | function hyphenateStyleName (string) { return hyphenate(string).replace(...
  function isInternalComponentType (line 273) | function isInternalComponentType (type) { return typeof type === 'functi...
  function instantiateReactComponent (line 273) | function instantiateReactComponent (node, parentCompositeType) { var ins...
  function isEventSupported (line 275) | function isEventSupported (eventNameSuffix, capture) { if (!ExecutionEnv...
  function isNode (line 276) | function isNode (object) { return !!(object && (typeof Node === 'functio...
  function isTextInputElement (line 277) | function isTextInputElement (elem) { return elem && (elem.nodeName === '...
  function isTextNode (line 278) | function isTextNode (object) { return isNode(object) && object.nodeType ...
  function mapObject (line 281) | function mapObject (object, callback, context) { if (!object) { return n...
  function memoizeStringOnly (line 282) | function memoizeStringOnly (callback) { var cache = {}; return function ...
  function onlyChild (line 283) | function onlyChild (children) { 'production' !== 'production' ? invarian...
  function quoteAttributeValueForBrowser (line 286) | function quoteAttributeValueForBrowser (value) { return '"' + escapeText...
  function shallowEqual (line 289) | function shallowEqual (objA, objB) { if (objA === objB) { return true; }...
  function shouldUpdateReactComponent (line 291) | function shouldUpdateReactComponent (prevElement, nextElement) {
  function toArray (line 309) | function toArray (obj) { var length = obj.length; 'production' !== 'prod...
  function userProvidedKeyEscaper (line 310) | function userProvidedKeyEscaper (match) { return userProvidedKeyEscaperL...
  function getComponentKey (line 310) | function getComponentKey (component, index) { if (component && component...
  function escapeUserProvidedKey (line 310) | function escapeUserProvidedKey (text) { return ('' + text).replace(userP...
  function wrapUserProvidedKey (line 310) | function wrapUserProvidedKey (key) { return '$' + escapeUserProvidedKey(...
  function traverseAllChildrenImpl (line 310) | function traverseAllChildrenImpl (children, nameSoFar, indexSoFar, callb...
  function traverseAllChildren (line 310) | function traverseAllChildren (children, callback, traverseContext) { if ...

FILE: examples/simpleReactApp/components/App.js
  method getInitialState (line 10) | getInitialState() {
  method toggleFavorite (line 31) | toggleFavorite(address) {
  method addToFavorites (line 39) | addToFavorites(address) {
  method removeFromFavorites (line 54) | removeFromFavorites(address) {
  method isAddressInFavorites (line 78) | isAddressInFavorites(address) {
  method searchForAddress (line 90) | searchForAddress(address) {
  method componentDidMount (line 117) | componentDidMount() {
  method render (line 124) | render() {

FILE: examples/simpleReactApp/components/CurrentLocation.js
  method toggleFavorite (line 5) | toggleFavorite() {
  method render (line 9) | render() {

FILE: examples/simpleReactApp/components/LocationItem.js
  method handleClick (line 6) | handleClick () {
  method render (line 10) | render () {

FILE: examples/simpleReactApp/components/LocationList.js
  method render (line 6) | render() {

FILE: examples/simpleReactApp/components/Map.js
  method componentDidMount (line 5) | componentDidMount() {
  method componentDidUpdate (line 13) | componentDidUpdate() {
  method render (line 39) | render() {

FILE: examples/simpleReactApp/components/Search.js
  method getInitialState (line 5) | getInitialState() {
  method handleChange (line 9) | handleChange(event) {
  method handleSubmit (line 13) | handleSubmit(event) {
  method render (line 24) | render() {

FILE: old_splash_page_v2.0/js/main.js
  constant READY_LAG_MS (line 7) | const READY_LAG_MS = 10000;
  constant READY_TAG (line 8) | const READY_TAG = '_the_lemur_is_ready_to_see_you';
  constant LEMUR_CLASS_ACTION (line 9) | const LEMUR_CLASS_ACTION = 'hideLemur';
  constant COOKIE_TEST (line 10) | const COOKIE_TEST = /cookie/i;
  constant CLICK_TEST (line 11) | const CLICK_TEST = /click/i;
  constant DELAY_TEST (line 12) | const DELAY_TEST = /delay/i;
  function modifyLemurBehavior (line 24) | function modifyLemurBehavior () {
  function showCookies (line 36) | function showCookies () {
  function setReadyFlags (line 40) | function setReadyFlags () {
  function releaseTheLemur (line 45) | function releaseTheLemur () {
  function containTheLemur (line 49) | function containTheLemur () {
  function delayLemurification (line 53) | function delayLemurification () {

FILE: old_splash_page_v2.0/js/vendor/bootstrap.js
  function transitionEnd (line 24) | function transitionEnd() {
  function removeElement (line 101) | function removeElement() {
  function clearMenus (line 716) | function clearMenus(e) {
  function getParent (line 728) | function getParent($this) {
  function complete (line 1296) | function complete() {
  function ScrollSpy (line 1550) | function ScrollSpy(element, options) {
  function next (line 1746) | function next() {

FILE: remote/index.js
  constant PROJECT_PATH (line 8) | const PROJECT_PATH = argsOptions._[0];
  constant PATH_TO_CONFIG (line 9) | const PATH_TO_CONFIG = argsOptions.config;

FILE: test/configs/backstop_data/engine_scripts/playwright/interceptImages.js
  constant IMAGE_URL_RE (line 18) | const IMAGE_URL_RE = /\.gif|\.jpg|\.png/i;
  constant IMAGE_STUB_URL (line 19) | const IMAGE_STUB_URL = path.resolve(__dirname, '../../imageStub.jpg');
  constant IMAGE_DATA_BUFFER (line 20) | const IMAGE_DATA_BUFFER = fs.readFileSync(IMAGE_STUB_URL);
  constant HEADERS_STUB (line 21) | const HEADERS_STUB = {};

FILE: test/configs/backstop_data/engine_scripts/playwright/overrideCSS.js
  constant BACKSTOP_TEST_CSS_OVERRIDE (line 14) | const BACKSTOP_TEST_CSS_OVERRIDE = `

FILE: test/configs/backstop_data/engine_scripts/puppet/overrideCSS.js
  constant BACKSTOP_TEST_CSS_OVERRIDE (line 1) | const BACKSTOP_TEST_CSS_OVERRIDE = 'html {background-image: none;}';

FILE: test/configs/backstop_fail_cases.js
  constant ENGINE (line 5) | const ENGINE = 'puppet';
  constant SCRIPT_PATH (line 6) | const SCRIPT_PATH = 'puppet';

FILE: test/configs/backstop_features.js
  constant ENGINE (line 1) | const ENGINE = 'puppet';
  constant SCRIPT_PATH (line 2) | const SCRIPT_PATH = 'puppet';
  constant URL (line 3) | const URL = 'https://garris.github.io/BackstopJS';

FILE: test/configs/backstop_features_pw.js
  constant ENGINE (line 1) | const ENGINE = 'playwright';
  constant BROWSER (line 2) | const BROWSER = 'chromium';
  constant SCRIPT_PATH (line 3) | const SCRIPT_PATH = 'playwright';
  constant URL (line 4) | const URL = 'https://garris.github.io/BackstopJS';

FILE: test/configs/dynamic_node_app.js
  constant URL (line 24) | const URL = 'https://garris.github.io/BackstopJS';
  function approve (line 81) | function approve () {
  function open (line 85) | function open () {
  function main (line 89) | function main () {

FILE: test/configs/multi_step node_example.js
  function approveChanges (line 25) | function approveChanges () {

FILE: test/configs/special_cases/scrollToSelector_puppet.js
  constant ENGINE (line 1) | const ENGINE = 'puppet';
  constant SCRIPT_PATH (line 2) | const SCRIPT_PATH = 'puppet';

FILE: test/core/util/compare/compare-hash_spec.js
  constant REF_IMG1 (line 5) | const REF_IMG1 = path.join(__dirname, 'refImage-1.png');
  constant REF_IMG1_OPTIMIZED (line 6) | const REF_IMG1_OPTIMIZED = path.join(__dirname, 'refImage-1-optimized.pn...
  constant REF_IMG2 (line 7) | const REF_IMG2 = path.join(__dirname, 'refImage-2.png');

FILE: test/core/util/compare/compare-resemble_spec.js
  constant REF_IMG1 (line 4) | const REF_IMG1 = path.join(__dirname, 'refImage-1.png');
  constant REF_IMG1_OPTIMIZED (line 5) | const REF_IMG1_OPTIMIZED = path.join(__dirname, 'refImage-1-optimized.pn...
  constant REF_IMG2 (line 6) | const REF_IMG2 = path.join(__dirname, 'refImage-2.png');
  constant REF_IMG3 (line 7) | const REF_IMG3 = path.join(__dirname, 'refImage-3.png');
Condensed preview — 253 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (2,170K chars).
[
  {
    "path": ".babelrc",
    "chars": 73,
    "preview": "{\n  \"presets\": [\n    \"@babel/preset-env\",\n    \"@babel/preset-react\"\n  ]\n}"
  },
  {
    "path": ".editorconfig",
    "chars": 192,
    "preview": "# editorconfig.org\nroot = true\n\n[*]\nindent_style = space\nend_of_line = lf\ncharset = utf-8\ntrim_trailing_whitespace = tru"
  },
  {
    "path": ".eslintignore",
    "chars": 151,
    "preview": "index_bundle.js\nconfig.js\ndiff.js\ndiverged.js\ndivergedWorker.js\n**/examples/**\n**/old_splash_page_v2.0/**\n**/dist/**\n**/"
  },
  {
    "path": ".eslintrc",
    "chars": 86,
    "preview": "{\n  \"extends\": \"eslint-config-semistandard\",\n  \"rules\": {\n    \"no-multi-str\": 0\n  }\n}\n"
  },
  {
    "path": ".github/workflows/_backstop-ci-runner.yml",
    "chars": 682,
    "preview": "name: 👀 Backstop CI Runner\nrun-name: \"CI running on ${{ github.event_name == 'pull_request' && format('PR #{0}: {1}', gi"
  },
  {
    "path": ".github/workflows/backstop-publish.yml",
    "chars": 573,
    "preview": "name: Backstop Publish\n#doesnt work :(\n\non:\n  workflow_dispatch:\n  workflow_call:\n\n\npermissions:\n  actions: write\n  chec"
  },
  {
    "path": ".github/workflows/backstop-reference-test.yml",
    "chars": 696,
    "preview": "name: 🛞 Backstop Reference Test\n\non:\n  workflow_dispatch:\n  workflow_call:\n\npermissions:\n  actions: write\n  contents: wr"
  },
  {
    "path": ".github/workflows/backstop-sanity-docker.yml",
    "chars": 1806,
    "preview": "name: Backstop Sanity Docker\n\non:\n  workflow_dispatch:\n  workflow_call:\n\npermissions:\n  actions: write\n  checks: write\n "
  },
  {
    "path": ".github/workflows/docker-sanity-test.yml",
    "chars": 3642,
    "preview": "name: Docker Sanity Tests\n\non:\n  workflow_dispatch:\n  workflow_call:\n\npermissions:\n  actions: write\n  checks: write\n  co"
  },
  {
    "path": ".github/workflows/dockerhub-build-push.yml",
    "chars": 1369,
    "preview": "name: 🐳 Docker Hub Build & Push\n\non:\n  workflow_dispatch:\n  workflow_call:\n\npermissions:\n  actions: write\n  checks: writ"
  },
  {
    "path": ".github/workflows/npm-push.yml",
    "chars": 814,
    "preview": "name: 📦 NPM Push\n\non:\n  workflow_dispatch:\n  workflow_call:\n\npermissions:\n  actions: write\n  checks: write\n  contents: w"
  },
  {
    "path": ".github/workflows/test-build-pub-npm-dockerhub.yml",
    "chars": 483,
    "preview": "name: Test build & publish npm + docker\n\non:\n  workflow_dispatch:\n        \npermissions:\n  actions: write\n  checks: write"
  },
  {
    "path": ".gitignore",
    "chars": 675,
    "preview": ".DS_Store\n\n# Logs\nlogs\n*.log\n\n# Runtime data\npids\n*.pid\n*.seed\n*.cache\n\n# Dependency directory\n# Commenting this out is "
  },
  {
    "path": ".gitlab-ci.yml",
    "chars": 317,
    "preview": "image: node:$NODEJS\n\n# Select what we should cache\ncache:\n  key: ${CI_COMMIT_REF_SLUG}\n  paths:\n    - node_modules/\n\nbef"
  },
  {
    "path": ".travis.yml",
    "chars": 169,
    "preview": "addons: # get google-chrome [stable|beta]\n  chrome: beta\nlanguage: node_js\nnode_js:\n  - 14\n  - 16\ninstall:\n  - npm insta"
  },
  {
    "path": "CONTRIBUTING.md",
    "chars": 248,
    "preview": "# Contributing to this project\n\nThank you for contributing to developer happiness all over the world!\n\nFor notes on cont"
  },
  {
    "path": "LICENSE",
    "chars": 1081,
    "preview": "The MIT License (MIT)\n\nCopyright (c) 2014 Garris Shipon\n\nPermission is hereby granted, free of charge, to any person obt"
  },
  {
    "path": "README.md",
    "chars": 54213,
    "preview": "![npm@latest](https://img.shields.io/npm/v/backstopjs/latest.svg) ![GitHub Repo stars](https://img.shields.io/github/sta"
  },
  {
    "path": "assets/styles.css",
    "chars": 2194,
    "preview": "html {\n  background:#faebd7 url('./duskBg1.png') no-repeat center center fixed;\n  background-size: cover;\n}\nbody {\n  fon"
  },
  {
    "path": "capture/backstopTools.js",
    "chars": 3942,
    "preview": "'use strict';\nmodule.exports = (target) => {\n  return target.evaluate(() => {\n    if (window._backstopTools) {\n      ret"
  },
  {
    "path": "capture/config.default.json",
    "chars": 1334,
    "preview": "{\n  \"id\": \"backstop_default\",\n  \"viewports\": [\n    {\n      \"label\": \"phone\",\n      \"width\": 320,\n      \"height\": 480\n   "
  },
  {
    "path": "capture/engine_scripts/cookies.json",
    "chars": 273,
    "preview": "[\n  {\n    \"domain\": \".www.yourdomain.com\",\n    \"path\": \"/\",\n    \"name\": \"yourCookieName\",\n    \"value\": \"yourCookieValue\""
  },
  {
    "path": "capture/engine_scripts/playwright/clickAndHoverHelper.js",
    "chars": 1501,
    "preview": "module.exports = async (page, scenario) => {\n  const hoverSelector = scenario.hoverSelectors || scenario.hoverSelector;\n"
  },
  {
    "path": "capture/engine_scripts/playwright/interceptImages.js",
    "chars": 766,
    "preview": "/**\n * INTERCEPT IMAGES\n * Listen to all requests. If a request matches IMAGE_URL_RE\n * then stub the image with data fr"
  },
  {
    "path": "capture/engine_scripts/playwright/loadCookies.js",
    "chars": 429,
    "preview": "const fs = require('fs');\n\nmodule.exports = async (browserContext, scenario) => {\n  let cookies = [];\n  const cookiePath"
  },
  {
    "path": "capture/engine_scripts/playwright/onBefore.js",
    "chars": 147,
    "preview": "module.exports = async (page, scenario, viewport, isReference, browserContext) => {\n  await require('./loadCookies')(bro"
  },
  {
    "path": "capture/engine_scripts/playwright/onReady.js",
    "chars": 230,
    "preview": "module.exports = async (page, scenario, viewport, isReference, browserContext) => {\n  console.log('SCENARIO > ' + scenar"
  },
  {
    "path": "capture/engine_scripts/playwright/overrideCSS.js",
    "chars": 582,
    "preview": "/**\n * OVERRIDE CSS\n * Apply this CSS to the loaded page, as a way to override styles.\n *\n * Use this in an onReady scri"
  },
  {
    "path": "capture/engine_scripts/puppet/clickAndHoverHelper.js",
    "chars": 1419,
    "preview": "module.exports = async (page, scenario) => {\n  const hoverSelector = scenario.hoverSelectors || scenario.hoverSelector;\n"
  },
  {
    "path": "capture/engine_scripts/puppet/ignoreCSP.js",
    "chars": 1933,
    "preview": "/**\n * IGNORE CSP HEADERS\n * Listen to all requests. If a request matches scenario.url\n * then fetch the request again m"
  },
  {
    "path": "capture/engine_scripts/puppet/interceptImages.js",
    "chars": 959,
    "preview": "/**\n * INTERCEPT IMAGES\n * Listen to all requests. If a request matches IMAGE_URL_RE\n * then stub the image with data fr"
  },
  {
    "path": "capture/engine_scripts/puppet/loadCookies.js",
    "chars": 846,
    "preview": "const fs = require('fs');\n\nmodule.exports = async (page, scenario) => {\n  let cookies = [];\n  const cookiePath = scenari"
  },
  {
    "path": "capture/engine_scripts/puppet/onBefore.js",
    "chars": 102,
    "preview": "module.exports = async (page, scenario, vp) => {\n  await require('./loadCookies')(page, scenario);\n};\n"
  },
  {
    "path": "capture/engine_scripts/puppet/onReady.js",
    "chars": 195,
    "preview": "module.exports = async (page, scenario, vp) => {\n  console.log('SCENARIO > ' + scenario.label);\n  await require('./click"
  },
  {
    "path": "capture/engine_scripts/puppet/overrideCSS.js",
    "chars": 573,
    "preview": "const BACKSTOP_TEST_CSS_OVERRIDE = 'html {background-image: none;}';\n\nmodule.exports = async (page, scenario) => {\n  // "
  },
  {
    "path": "changelog.md",
    "chars": 1520,
    "preview": "\n# Change Log\n\n \n## [6.0.4] - 2021-12-10\n### Added\n\n### Changed\n- Bump puppeteer to v12 (#1381)\n- Travis remove node 10,"
  },
  {
    "path": "cli/index.js",
    "chars": 1132,
    "preview": "#!/usr/bin/env node\n\nconst parseArgs = require('minimist');\nconst usage = require('./usage');\nconst version = require('."
  },
  {
    "path": "cli/usage.js",
    "chars": 1959,
    "preview": "const version = require('../package.json').version;\nconst makeSpaces = require('../core/util/makeSpaces');\n\nconst comman"
  },
  {
    "path": "compare/README.md",
    "chars": 708,
    "preview": "HTML report resource bundle\n====\n\nThis directory contains the source files for the BackstopJS report UI.\n\nTo build the R"
  },
  {
    "path": "compare/output/diff.js",
    "chars": 184201,
    "preview": "/*!\n\n diff v3.5.0\n\nSoftware License Agreement (BSD License)\n\nCopyright (c) 2009-2015, Kevin Decker <kpdecker@gmail.com>\n"
  },
  {
    "path": "compare/output/diverged.js",
    "chars": 11241,
    "preview": "'use strict';\nconst noop = function (){};\nlet LCS_DIFF_ARRAY_METHOD = undefined;\n// debugger\nif (typeof require !== 'und"
  },
  {
    "path": "compare/output/divergedWorker.js",
    "chars": 185,
    "preview": "importScripts('diff.js');\nimportScripts('diverged.js');\nself.addEventListener('message', function(e) {\n  self.postMessag"
  },
  {
    "path": "compare/output/index.html",
    "chars": 1346,
    "preview": "<!DOCTYPE html>\n<html>\n  <head>\n    <meta charset=\"utf-8\">\n    <!-- Disable Cache -->\n    <meta http-equiv=\"Cache-Contro"
  },
  {
    "path": "compare/output/index_bundle.js",
    "chars": 400426,
    "preview": "/*! For license information please see index_bundle.js.LICENSE.txt */\n(()=>{var e,t,n={184:(e,t,n)=>{\"use strict\";functi"
  },
  {
    "path": "compare/output/index_bundle.js.LICENSE.txt",
    "chars": 1505,
    "preview": "/*!\n  Copyright (c) 2015 Jed Watson.\n  Based on code that is Copyright 2013-2015, Facebook, Inc.\n  All rights reserved.\n"
  },
  {
    "path": "compare/src/.eslintrc",
    "chars": 300,
    "preview": "{\n  \"extends\": \"../../.eslintrc\",\n  \"parserOptions\": {\n    \"ecmaFeatures\": {\n      \"jsx\": true\n    },\n    \"sourceType\": "
  },
  {
    "path": "compare/src/actions/index.js",
    "chars": 1434,
    "preview": "export const approveTest = id => {\n  return {\n    type: 'APPROVE_TEST',\n    id\n  };\n};\n\nexport const filterTests = statu"
  },
  {
    "path": "compare/src/components/App.js",
    "chars": 662,
    "preview": "import React from 'react';\nimport styled from 'styled-components';\n// ESLint\n/* eslint-disable no-unused-vars */\nimport "
  },
  {
    "path": "compare/src/components/atoms/ButtonFilter.js",
    "chars": 1203,
    "preview": "import React from 'react';\nimport styled from 'styled-components';\n\nimport { colors, fonts, shadows } from '../../styles"
  },
  {
    "path": "compare/src/components/atoms/ButtonSettings.js",
    "chars": 1296,
    "preview": "import React from 'react';\nimport styled from 'styled-components';\n\nimport { colors, fonts, shadows } from '../../styles"
  },
  {
    "path": "compare/src/components/atoms/DiffDetails.js",
    "chars": 880,
    "preview": "import React from 'react';\nimport styled from 'styled-components';\nimport { colors, fonts } from '../../styles';\n\nconst "
  },
  {
    "path": "compare/src/components/atoms/ErrorMessages.js",
    "chars": 1333,
    "preview": "import React from 'react';\nimport { connect } from 'react-redux';\nimport styled from 'styled-components';\nimport { color"
  },
  {
    "path": "compare/src/components/atoms/IdContainer.js",
    "chars": 902,
    "preview": "import React from 'react';\nimport { connect } from 'react-redux';\nimport styled from 'styled-components';\n\nimport { colo"
  },
  {
    "path": "compare/src/components/atoms/ImagePreview.js",
    "chars": 2325,
    "preview": "import React from 'react';\nimport { connect } from 'react-redux';\nimport VisibilitySensor from 'react-visibility-sensor'"
  },
  {
    "path": "compare/src/components/atoms/ImageScrubber.js",
    "chars": 8428,
    "preview": "import React from 'react';\nimport styled from 'styled-components';\nimport TwentyTwenty from 'backstop-twentytwenty';\nimp"
  },
  {
    "path": "compare/src/components/atoms/InputTextSearch.js",
    "chars": 1006,
    "preview": "import React from 'react';\nimport styled from 'styled-components';\n\nimport { colors, fonts } from '../../styles';\n\nimpor"
  },
  {
    "path": "compare/src/components/atoms/LogDetails.js",
    "chars": 1771,
    "preview": "import React from 'react';\nimport styled from 'styled-components';\nimport { colors, fonts } from '../../styles';\nimport "
  },
  {
    "path": "compare/src/components/atoms/Logo.js",
    "chars": 398,
    "preview": "import React from 'react';\nimport styled from 'styled-components';\n\nimport LogoImg from '../../assets/images/logo.png';\n"
  },
  {
    "path": "compare/src/components/atoms/NavButtons.js",
    "chars": 1800,
    "preview": "import React from 'react';\nimport styled from 'styled-components';\n\nimport jump from 'jump.js';\n\nimport { colors } from "
  },
  {
    "path": "compare/src/components/atoms/SettingOption.js",
    "chars": 745,
    "preview": "import React from 'react';\nimport styled from 'styled-components';\nimport ToggleButton from 'react-toggle-button';\n\nimpo"
  },
  {
    "path": "compare/src/components/atoms/SuiteName.js",
    "chars": 649,
    "preview": "import React from 'react';\nimport { connect } from 'react-redux';\nimport styled from 'styled-components';\n\nimport { colo"
  },
  {
    "path": "compare/src/components/atoms/TextDetails.js",
    "chars": 2977,
    "preview": "import React from 'react';\nimport { connect } from 'react-redux';\nimport styled from 'styled-components';\nimport DiffDet"
  },
  {
    "path": "compare/src/components/atoms/UrlDetails.js",
    "chars": 1033,
    "preview": "import React from 'react';\nimport styled from 'styled-components';\nimport { colors, fonts } from '../../styles';\n\nconst "
  },
  {
    "path": "compare/src/components/ecosystems/Header.js",
    "chars": 824,
    "preview": "import React from 'react';\nimport styled from 'styled-components';\nimport { Sticky } from 'react-sticky';\n\nimport Topbar"
  },
  {
    "path": "compare/src/components/ecosystems/List.js",
    "chars": 985,
    "preview": "import React from 'react';\nimport styled from 'styled-components';\nimport { connect } from 'react-redux';\n\n// organisms\n"
  },
  {
    "path": "compare/src/components/ecosystems/LogModal.js",
    "chars": 3330,
    "preview": "import React from 'react';\nimport { connect } from 'react-redux';\nimport styled from 'styled-components';\nimport Modal f"
  },
  {
    "path": "compare/src/components/ecosystems/ScrubberModal.js",
    "chars": 3445,
    "preview": "import React from 'react';\nimport { connect } from 'react-redux';\nimport styled from 'styled-components';\nimport Modal f"
  },
  {
    "path": "compare/src/components/molecules/ApproveButton.js",
    "chars": 2794,
    "preview": "import React from 'react';\nimport { connect } from 'react-redux';\nimport styled from 'styled-components';\nimport { appro"
  },
  {
    "path": "compare/src/components/molecules/FiltersSwitch.js",
    "chars": 1832,
    "preview": "import React from 'react';\nimport { connect } from 'react-redux';\nimport styled from 'styled-components';\nimport { filte"
  },
  {
    "path": "compare/src/components/molecules/ScrubberButton.js",
    "chars": 1466,
    "preview": "import React from 'react';\nimport { connect } from 'react-redux';\nimport styled from 'styled-components';\nimport { openM"
  },
  {
    "path": "compare/src/components/molecules/SettingsContainer.js",
    "chars": 1184,
    "preview": "import React from 'react';\nimport { connect } from 'react-redux';\nimport styled from 'styled-components';\n// import { fi"
  },
  {
    "path": "compare/src/components/molecules/SettingsPopup.js",
    "chars": 2720,
    "preview": "import React from 'react';\nimport { connect } from 'react-redux';\nimport styled from 'styled-components';\nimport { updat"
  },
  {
    "path": "compare/src/components/molecules/TestImages.js",
    "chars": 1847,
    "preview": "import React from 'react';\nimport styled from 'styled-components';\nimport { connect } from 'react-redux';\nimport { openM"
  },
  {
    "path": "compare/src/components/molecules/TextSearch.js",
    "chars": 1093,
    "preview": "import React from 'react';\nimport { connect } from 'react-redux';\nimport styled from 'styled-components';\nimport { findT"
  },
  {
    "path": "compare/src/components/organisms/TestCard.js",
    "chars": 1781,
    "preview": "import React from 'react';\nimport styled from 'styled-components';\n\nimport { colors, shadows } from '../../styles';\n\n// "
  },
  {
    "path": "compare/src/components/organisms/Toolbar.js",
    "chars": 776,
    "preview": "import React from 'react';\nimport styled from 'styled-components';\n\nimport FiltersSwitchContainer from '../molecules/Fil"
  },
  {
    "path": "compare/src/components/organisms/Topbar.js",
    "chars": 794,
    "preview": "import React from 'react';\nimport styled from 'styled-components';\n\nimport { colors } from '../../styles';\n\nimport Suite"
  },
  {
    "path": "compare/src/index.js",
    "chars": 279,
    "preview": "import React from 'react';\nimport ReactDOM from 'react-dom';\nimport { Provider } from 'react-redux';\nimport store from '"
  },
  {
    "path": "compare/src/reducers/index.js",
    "chars": 347,
    "preview": "import { combineReducers } from 'redux';\nimport tests from './tests';\nimport suiteInfo from './suiteInfo';\nimport layout"
  },
  {
    "path": "compare/src/reducers/layoutSettings.js",
    "chars": 446,
    "preview": "const visibilityFilter = (state = {}, action) => {\n  switch (action.type) {\n    case 'UPDATE_SETTINGS':\n      return Obj"
  },
  {
    "path": "compare/src/reducers/logs.js",
    "chars": 355,
    "preview": "const logs = (state = {}, action) => {\n  switch (action.type) {\n    case 'OPEN_LOG_MODAL':\n      return Object.assign({}"
  },
  {
    "path": "compare/src/reducers/scrubber.js",
    "chars": 2321,
    "preview": "function getPosFromImgId (imgId) {\n  switch (imgId) {\n    case 'refImage':\n      return 100; // just passed the right bo"
  },
  {
    "path": "compare/src/reducers/suiteInfo.js",
    "chars": 198,
    "preview": "const suiteInfo = (state = {}, action) => {\n  switch (action.type) {\n    case 'SET_VISIBILITY_FILTER':\n      return acti"
  },
  {
    "path": "compare/src/reducers/tests.js",
    "chars": 1730,
    "preview": "const tests = (state = {}, action) => {\n  switch (action.type) {\n    case 'APPROVE_TEST':\n      return Object.assign({},"
  },
  {
    "path": "compare/src/store.js",
    "chars": 2625,
    "preview": "import { createStore } from 'redux';\nimport rootReducer from './reducers';\n\n/**\n * Parses a JSON string from local stora"
  },
  {
    "path": "compare/src/styles/index.js",
    "chars": 538,
    "preview": "export const colors = {\n  primaryText: '#4A4A4A',\n  bodyColor: '#E2E7EA',\n  secondaryText: '#787878',\n  borderGray: '#D1"
  },
  {
    "path": "compare/webpack.config.js",
    "chars": 1080,
    "preview": "const path = require('path');\n\nmodule.exports = {\n  mode: 'production',\n  entry: path.join(__dirname, 'src', 'index.js')"
  },
  {
    "path": "core/command/approve.js",
    "chars": 1664,
    "preview": "const fs = require('../util/fs');\nconst path = require('path');\nconst map = require('p-map');\n\nconst FAILED_DIFF_RE = /^"
  },
  {
    "path": "core/command/index.js",
    "chars": 3139,
    "preview": "const path = require('path');\nconst _ = require('lodash');\nconst logger = require('../util/logger')('COMMAND');\n\n/*\n * E"
  },
  {
    "path": "core/command/init.js",
    "chars": 991,
    "preview": "const fs = require('../util/fs');\nconst logger = require('../util/logger')('init');\n\n/**\n * Copies a boilerplate config "
  },
  {
    "path": "core/command/openReport.js",
    "chars": 1415,
    "preview": "const open = require('opn');\nconst logger = require('../util/logger')('openReport');\nconst path = require('path');\nconst"
  },
  {
    "path": "core/command/reference.js",
    "chars": 1020,
    "preview": "const createBitmaps = require('../util/createBitmaps');\nconst fs = require('../util/fs');\nconst logger = require('../uti"
  },
  {
    "path": "core/command/remote.js",
    "chars": 1154,
    "preview": "const logger = require('../util/logger')('remote');\nconst path = require('path');\nconst { exec } = require('child_proces"
  },
  {
    "path": "core/command/report.js",
    "chars": 10401,
    "preview": "const path = require('path');\nconst chalk = require('chalk');\nconst _ = require('lodash');\nconst cloneDeep = require('lo"
  },
  {
    "path": "core/command/stop.js",
    "chars": 883,
    "preview": "const http = require('http');\nconst getRemotePort = require('../util/getRemotePort');\nconst logger = require('../util/lo"
  },
  {
    "path": "core/command/test.js",
    "chars": 1013,
    "preview": "const createBitmaps = require('../util/createBitmaps');\nconst { shouldRunDocker, runDocker } = require('../util/runDocke"
  },
  {
    "path": "core/command/version.js",
    "chars": 236,
    "preview": "const version = require('../../package.json').version;\n\nmodule.exports = {\n  execute: function (config) {\n    return new"
  },
  {
    "path": "core/runner.js",
    "chars": 2702,
    "preview": "const executeCommand = require('./command/');\nconst makeConfig = require('./util/makeConfig');\n\nmodule.exports = functio"
  },
  {
    "path": "core/util/BackstopException.js",
    "chars": 392,
    "preview": "module.exports = class BackstopException {\n  constructor (msg, scenario, viewport, originalError) {\n    this.msg = msg;\n"
  },
  {
    "path": "core/util/Reporter.js",
    "chars": 700,
    "preview": "function Test (pair) {\n  this.pair = pair;\n  this.status = 'running';\n}\n\nTest.prototype.passed = function () {\n  return "
  },
  {
    "path": "core/util/allSettled.js",
    "chars": 276,
    "preview": "module.exports = function (promises) {\n  return Promise.all(promises.map(function (promise) {\n    return promise.then(fu"
  },
  {
    "path": "core/util/compare/compare-hash.js",
    "chars": 762,
    "preview": "const crypto = require('crypto');\nconst fs = require('fs');\n\nfunction getFileHash (filename) {\n  if (!filename) {\n    re"
  },
  {
    "path": "core/util/compare/compare-resemble.js",
    "chars": 858,
    "preview": "const resemble = require('@mirzazeyrek/node-resemble-js');\n\nmodule.exports = function (referencePath, testPath, misMatch"
  },
  {
    "path": "core/util/compare/compare.js",
    "chars": 915,
    "preview": "const compareHashes = require('./compare-hash');\nconst compareResemble = require('./compare-resemble');\nconst storeFaile"
  },
  {
    "path": "core/util/compare/index.js",
    "chars": 3513,
    "preview": "const path = require('path');\nconst map = require('p-map');\nconst fs = require('fs');\nconst cp = require('child_process'"
  },
  {
    "path": "core/util/compare/store-failed-diff-stub.js",
    "chars": 645,
    "preview": "const fs = require('fs');\nconst path = require('path');\n\n// BASE64_PNG_STUB is 1x1 white pixel\nconst BASE64_PNG_STUB = '"
  },
  {
    "path": "core/util/compare/store-failed-diff.js",
    "chars": 980,
    "preview": "const streamToPromise = require('./../streamToPromise');\nconst fs = require('fs');\nconst path = require('path');\n\nmodule"
  },
  {
    "path": "core/util/createBitmaps.js",
    "chars": 6641,
    "preview": "const cloneDeep = require('lodash/cloneDeep');\nconst fs = require('./fs');\nconst _ = require('lodash');\nconst pMap = req"
  },
  {
    "path": "core/util/engineErrors.js",
    "chars": 306,
    "preview": "module.exports = function (config) {\n  const compareConfig = require(config.tempCompareConfigFileName).compareConfig;\n  "
  },
  {
    "path": "core/util/engineTools.js",
    "chars": 5622,
    "preview": "/**\n * @description Retrieves the mismatch threshold based on the given scenario and configuration.\n *\n * @param {Object"
  },
  {
    "path": "core/util/ensureDirectoryPath.js",
    "chars": 328,
    "preview": "const path = require('path');\nconst fs = require('fs');\n\nfunction ensureDirectoryPath (filePath) {\n  const dirname = pat"
  },
  {
    "path": "core/util/extendConfig.js",
    "chars": 4074,
    "preview": "const path = require('path');\nconst temp = require('temp');\nconst fs = require('fs');\nconst hash = require('object-hash'"
  },
  {
    "path": "core/util/findExecutable.js",
    "chars": 692,
    "preview": "const path = require('path');\n\nmodule.exports = function (module, bin) {\n  try {\n    const pathToExecutableModulePackage"
  },
  {
    "path": "core/util/fs.js",
    "chars": 716,
    "preview": "const fs = require('fs');\nconst fsExtra = require('fs-extra');\nconst promisify = require('./promisify');\n\nconst fsPromis"
  },
  {
    "path": "core/util/getFreePorts.js",
    "chars": 1053,
    "preview": "const portfinder = require('portfinder');\n/**\n * Gets the free ports.\n *\n * @param      {number}  startingPort    The st"
  },
  {
    "path": "core/util/getRemotePort.js",
    "chars": 260,
    "preview": "/**\n * Gets the custom remote port, otherwise return the default (3000).\n *\n * @return     {number}   The remote port.\n "
  },
  {
    "path": "core/util/isWin.js",
    "chars": 48,
    "preview": "module.exports = /^win/.test(process.platform);\n"
  },
  {
    "path": "core/util/logger.js",
    "chars": 1767,
    "preview": "const chalk = require('chalk');\nconst _ = require('lodash');\nconst makeSpaces = require('./makeSpaces');\n\nfunction ident"
  },
  {
    "path": "core/util/makeConfig.js",
    "chars": 2218,
    "preview": "const path = require('path');\nconst extendConfig = require('./extendConfig');\n\nconst NON_CONFIG_COMMANDS = ['init', 'ver"
  },
  {
    "path": "core/util/makeSpaces.js",
    "chars": 155,
    "preview": "module.exports = function makeSpaces (length) {\n  let i = 0;\n  let result = '';\n  while (i < length) {\n    result += ' '"
  },
  {
    "path": "core/util/promisify.js",
    "chars": 498,
    "preview": "module.exports = function promisify (func) {\n  return function () {\n    const args = (arguments.length === 1 ? [argument"
  },
  {
    "path": "core/util/remote.js",
    "chars": 2104,
    "preview": "const fs = require('./fs');\n\n/**\n * Extract jsonReport from the jsonpReport\n *\n * @param {String} jsonpReport - jsonpRep"
  },
  {
    "path": "core/util/runDocker.js",
    "chars": 2874,
    "preview": "const { spawn } = require('child_process');\nconst version = require('../../package').version;\nconst fs = require('./fs')"
  },
  {
    "path": "core/util/runPlaywright.js",
    "chars": 17633,
    "preview": "const playwright = require('playwright');\n\nconst fs = require('./fs');\nconst path = require('path');\nconst chalk = requi"
  },
  {
    "path": "core/util/runPuppet.js",
    "chars": 16458,
    "preview": "const puppeteer = require('puppeteer');\n\nconst fs = require('./fs');\nconst path = require('path');\nconst chalk = require"
  },
  {
    "path": "core/util/streamToPromise.js",
    "chars": 471,
    "preview": "module.exports = function onStreamEnd (stream, result) {\n  return new Promise(function (resolve, reject) {\n    if (strea"
  },
  {
    "path": "docker/Dockerfile",
    "chars": 1265,
    "preview": "# use bullseye node base, as debian does provide a chromium for arm64 and amd64 flavour\nFROM node:20-bullseye\n\nARG BACKS"
  },
  {
    "path": "docker/README.md",
    "chars": 2612,
    "preview": "# BackstopJS Docker Image\n\nA self-contained Docker image to run [BackstopJS](https://github.com/garris/BackstopJS) with "
  },
  {
    "path": "docker/burn-docker-builder.sh",
    "chars": 442,
    "preview": "#!/usr/bin/env bash\necho starting a fire\nset -e\nset -o errexit\n\ndocker stop `docker ps -qa` > /dev/null 2>&1; ## Stop al"
  },
  {
    "path": "docker/hooks/build",
    "chars": 185,
    "preview": "#!/bin/bash\nBACKSTOPJS_VERSION=$(grep -Po '(?<=\"version\": \")[^\"]*' $(dirname \"$0\")/../../package.json)\n\ndocker build --b"
  },
  {
    "path": "docker/hooks/post_push",
    "chars": 281,
    "preview": "#!/bin/bash\nBACKSTOPJS_VERSION=$(grep -Po '(?<=\"version\": \")[^\"]*' $(dirname \"$0\")/../../package.json)\n\ndocker tag $IMAG"
  },
  {
    "path": "docker/xvfb-run",
    "chars": 6031,
    "preview": "#!/bin/sh\n\n# $Id: xvfb-run 2027 2004-11-16 14:54:16Z branden $\n\n# This script starts an instance of Xvfb, the \"fake\" X s"
  },
  {
    "path": "examples/Jenkins/README.md",
    "chars": 8619,
    "preview": "# Jenkins Integration\n\nHere, we use the DooD (Docker-outside-of-Docker) to run the jenkins.\n\nFor more info about DooD, w"
  },
  {
    "path": "examples/Jenkins/Sample/backstop.json",
    "chars": 1471,
    "preview": "{\n  \"id\": \"demo\",\n  \"viewports\": [\n    {\n      \"label\": \"PC\",\n      \"width\": 1920,\n      \"height\": 1080\n    },\n    {\n   "
  },
  {
    "path": "examples/Jenkins/Sample/backstop_data/engine_scripts/puppet/clickAndHoverHelper.js",
    "chars": 582,
    "preview": "module.exports = async (page, scenario) => {\n  const hoverSelector = scenario.hoverSelector;\n  const clickSelector = sce"
  },
  {
    "path": "examples/Jenkins/Sample/backstop_data/engine_scripts/puppet/ignoreCSP.js",
    "chars": 1942,
    "preview": "/**\n * IGNORE CSP HEADERS\n * Listen to all requests. If a request matches scenario.url\n * then fetch the request again m"
  },
  {
    "path": "examples/Jenkins/Sample/backstop_data/engine_scripts/puppet/interceptImages.js",
    "chars": 962,
    "preview": "/**\n * INTERCEPT IMAGES\n * Listen to all requests. If a request matches IMAGE_URL_RE\n * then stub the image with data fr"
  },
  {
    "path": "examples/Jenkins/Sample/backstop_data/engine_scripts/puppet/loadCookies.js",
    "chars": 846,
    "preview": "const fs = require('fs');\n\nmodule.exports = async (page, scenario) => {\n  let cookies = [];\n  const cookiePath = scenari"
  },
  {
    "path": "examples/Jenkins/Sample/backstop_data/engine_scripts/puppet/onBefore.js",
    "chars": 402,
    "preview": "module.exports = async (page, scenario, vp) => {\n  await require('./loadCookies')(page, scenario);\n\n  // Emulate iPhone\n"
  },
  {
    "path": "examples/Jenkins/Sample/backstop_data/engine_scripts/puppet/onReady.js",
    "chars": 195,
    "preview": "module.exports = async (page, scenario, vp) => {\n  console.log('SCENARIO > ' + scenario.label);\n  await require('./click"
  },
  {
    "path": "examples/angularAppWithCssTransitions/backstopConfig_1.json",
    "chars": 909,
    "preview": "{\n  \"viewports\": [\n    {\n      \"name\": \"phone\",\n      \"width\": 320,\n      \"height\": 480\n    },\n    {\n      \"name\": \"tabl"
  },
  {
    "path": "examples/angularAppWithCssTransitions/backstopConfig_2.json",
    "chars": 700,
    "preview": "{\n  \"viewports\": [\n    {\n      \"name\": \"phone\",\n      \"width\": 320,\n      \"height\": 480\n    },\n    {\n      \"name\": \"tabl"
  },
  {
    "path": "examples/angularAppWithCssTransitions/index.html",
    "chars": 3968,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE="
  },
  {
    "path": "examples/featureTests/dist/css/bootstrap-theme.css",
    "chars": 22474,
    "preview": "/*!\n * Bootstrap v3.3.1 (http://getbootstrap.com)\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://gi"
  },
  {
    "path": "examples/featureTests/dist/css/bootstrap.css",
    "chars": 137067,
    "preview": "/*!\n * Bootstrap v3.3.1 (http://getbootstrap.com)\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://gi"
  },
  {
    "path": "examples/featureTests/dist/js/bootstrap.js",
    "chars": 67155,
    "preview": "/*!\n * Bootstrap v3.3.1 (http://getbootstrap.com)\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://gi"
  },
  {
    "path": "examples/featureTests/dist/js/npm.js",
    "chars": 484,
    "preview": "// This file is autogenerated via the `commonjs` Grunt task. You can require() this file in a CommonJS environment.\nrequ"
  },
  {
    "path": "examples/featureTests/index.html",
    "chars": 4779,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE="
  },
  {
    "path": "examples/featureTests/readme.md",
    "chars": 24,
    "preview": "\n### My Cool Project\n\n\n\n"
  },
  {
    "path": "examples/jsBasedConfig/backstopConfig.js",
    "chars": 975,
    "preview": "module.exports = {\n  id: 'test',\n  viewports: [\n    {\n      name: 'phone',\n      width: 320,\n      height: 480\n    },\n  "
  },
  {
    "path": "examples/jsBasedConfig/readme.md",
    "chars": 560,
    "preview": "BackstopJS allows you to import all config parameters as a node module (as an option instead of JSON) which allows you t"
  },
  {
    "path": "examples/myCoolProject/dist/css/bootstrap-theme.css",
    "chars": 22474,
    "preview": "/*!\n * Bootstrap v3.3.1 (http://getbootstrap.com)\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://gi"
  },
  {
    "path": "examples/myCoolProject/dist/css/bootstrap.css",
    "chars": 137067,
    "preview": "/*!\n * Bootstrap v3.3.1 (http://getbootstrap.com)\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://gi"
  },
  {
    "path": "examples/myCoolProject/dist/js/bootstrap.js",
    "chars": 67155,
    "preview": "/*!\n * Bootstrap v3.3.1 (http://getbootstrap.com)\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://gi"
  },
  {
    "path": "examples/myCoolProject/dist/js/npm.js",
    "chars": 484,
    "preview": "// This file is autogenerated via the `commonjs` Grunt task. You can require() this file in a CommonJS environment.\nrequ"
  },
  {
    "path": "examples/myCoolProject/index.html",
    "chars": 4373,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE="
  },
  {
    "path": "examples/myCoolProject/readme.md",
    "chars": 570,
    "preview": "\n### My Cool Project\n\ndo `backstop init`  then replace scenario with...\n\n```\n    {\n      \"label\": \"My Homepage\",\n      \""
  },
  {
    "path": "examples/nodeIntegration/backstop.config.js",
    "chars": 568,
    "preview": "module.exports = options => {\n  return {\n    id: `${options.project}_test`,\n    viewports: [\n      {\n        name: 'tabl"
  },
  {
    "path": "examples/nodeIntegration/backstop.js",
    "chars": 1518,
    "preview": "const _ = require('lodash');\nconst fs = require('fs');\nconst args = require('yargs').argv;\nconst projectPath = `public/$"
  },
  {
    "path": "examples/nodeIntegration/package.json",
    "chars": 530,
    "preview": "{\n  \"name\": \"node-integration\",\n  \"version\": \"1.0.0\",\n  \"description\": \"A simple example of using BackstopJS with NodeJS"
  },
  {
    "path": "examples/nodeIntegration/public/first-project/about-us.html",
    "chars": 618,
    "preview": "<!doctype html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\"\n          content=\"width=de"
  },
  {
    "path": "examples/nodeIntegration/public/first-project/homepage.html",
    "chars": 856,
    "preview": "<!doctype html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\"\n          content=\"width=de"
  },
  {
    "path": "examples/nodeIntegration/public/first-project/ignore-me.html",
    "chars": 370,
    "preview": "<!doctype html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\"\n          content=\"width=de"
  },
  {
    "path": "examples/nodeIntegration/public/second-project/contact-us.html",
    "chars": 624,
    "preview": "<!doctype html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\"\n          content=\"width=de"
  },
  {
    "path": "examples/nodeIntegration/public/second-project/dummy.json",
    "chars": 20,
    "preview": "{\n    \"foo\": \"bar\"\n}"
  },
  {
    "path": "examples/nodeIntegration/public/second-project/ignore-me.html",
    "chars": 370,
    "preview": "<!doctype html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\"\n          content=\"width=de"
  },
  {
    "path": "examples/nodeIntegration/public/second-project/index.html",
    "chars": 842,
    "preview": "<!doctype html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\"\n          content=\"width=de"
  },
  {
    "path": "examples/nodeIntegration/public/third-project/ignore-me.html",
    "chars": 370,
    "preview": "<!doctype html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\"\n          content=\"width=de"
  },
  {
    "path": "examples/nodeIntegration/public/third-project/terms-of-use.html",
    "chars": 869,
    "preview": "<!doctype html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\"\n          content=\"width=de"
  },
  {
    "path": "examples/nodeIntegration/readme.md",
    "chars": 1991,
    "preview": "# NodeJS example\n\nWe have 3 separate projects in the `public` folder: `first-project`, `second-project` and `third-proje"
  },
  {
    "path": "examples/nodeIntegration/server.js",
    "chars": 194,
    "preview": "const koa = require('koa');\nconst serve = require('koa-serve');\n\nconst app = koa();\n\napp.use(serve('public'));\n\napp.list"
  },
  {
    "path": "examples/responsiveDemo/backstop.json",
    "chars": 1316,
    "preview": "{\n  \"id\": \"responsiveDemoPage\",\n  \"viewports\": [\n    {\n      \"label\": \"phone\",\n      \"width\": 320,\n      \"height\": 480\n "
  },
  {
    "path": "examples/responsiveDemo/backstop_data/engine_scripts/cookies.json",
    "chars": 284,
    "preview": "[\n  {\n    \"domain\": \".www.yourdomain.com\",\n    \"path\": \"/\",\n    \"name\": \"yourCookieName\",\n    \"value\": \"yourCookieValue\""
  },
  {
    "path": "examples/responsiveDemo/backstop_data/engine_scripts/puppet/clickAndHoverHelper.js",
    "chars": 1078,
    "preview": "module.exports = async (page, scenario) => {\n  const hoverSelector = scenario.hoverSelectors || scenario.hoverSelector;\n"
  },
  {
    "path": "examples/responsiveDemo/backstop_data/engine_scripts/puppet/ignoreCSP.js",
    "chars": 1933,
    "preview": "/**\n * IGNORE CSP HEADERS\n * Listen to all requests. If a request matches scenario.url\n * then fetch the request again m"
  },
  {
    "path": "examples/responsiveDemo/backstop_data/engine_scripts/puppet/interceptImages.js",
    "chars": 962,
    "preview": "/**\n * INTERCEPT IMAGES\n * Listen to all requests. If a request matches IMAGE_URL_RE\n * then stub the image with data fr"
  },
  {
    "path": "examples/responsiveDemo/backstop_data/engine_scripts/puppet/loadCookies.js",
    "chars": 846,
    "preview": "const fs = require('fs');\n\nmodule.exports = async (page, scenario) => {\n  let cookies = [];\n  const cookiePath = scenari"
  },
  {
    "path": "examples/responsiveDemo/backstop_data/engine_scripts/puppet/onBefore.js",
    "chars": 102,
    "preview": "module.exports = async (page, scenario, vp) => {\n  await require('./loadCookies')(page, scenario);\n};\n"
  },
  {
    "path": "examples/responsiveDemo/backstop_data/engine_scripts/puppet/onReady.js",
    "chars": 195,
    "preview": "module.exports = async (page, scenario, vp) => {\n  console.log('SCENARIO > ' + scenario.label);\n  await require('./click"
  },
  {
    "path": "examples/responsiveDemo/index.html",
    "chars": 7203,
    "preview": "<!doctype html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-wid"
  },
  {
    "path": "examples/responsiveDemo/package.json",
    "chars": 395,
    "preview": "{\n  \"name\": \"responsivedemo\",\n  \"version\": \"1.0.0\",\n  \"description\": \"\",\n  \"main\": \"index.html\",\n  \"scripts\": {\n    \"tes"
  },
  {
    "path": "examples/responsiveDemo/readme.md",
    "chars": 116,
    "preview": "Start me with...\n\n```\nnpm run serve\n```\n\n...then you can see me here...\n\n[http://127.0.0.1:3000]()\n\nKeep on truckin!"
  },
  {
    "path": "examples/responsiveDemo/responsiveDemo.css",
    "chars": 414,
    "preview": "html {\n  font-size: 14px;\n}\n@media (min-width: 768px) {\n  html {\n    font-size: 16px;\n  }\n}\n\n.container {\n  max-width: 9"
  },
  {
    "path": "examples/simpleReactApp/assets/css/styles.css",
    "chars": 1543,
    "preview": ".container {\n\tmax-width: 980px;\n\ttext-align: center;\n\tmargin: 20px auto;\n}\n\nh1 {\n\tmargin-bottom: 20px;\n  text-shadow: 0 "
  },
  {
    "path": "examples/simpleReactApp/backstop.json",
    "chars": 975,
    "preview": "{\n  \"viewports\": [\n    {\n      \"name\": \"phone\",\n      \"width\": 320,\n      \"height\": 480\n    },\n    {\n      \"name\": \"tabl"
  },
  {
    "path": "examples/simpleReactApp/compiled.js",
    "chars": 432254,
    "preview": "(function e (t, n, r) { function s (o, u) { if (!n[o]) { if (!t[o]) { var a = typeof require === 'function' && require; "
  },
  {
    "path": "examples/simpleReactApp/components/App.js",
    "chars": 3287,
    "preview": "const React = require('react');\n\nconst Search = require('./Search');\nconst Map = require('./Map');\nconst CurrentLocation"
  },
  {
    "path": "examples/simpleReactApp/components/CurrentLocation.js",
    "chars": 691,
    "preview": "const React = require('react');\n\nconst CurrentLocation = React.createClass({\n\n    toggleFavorite() {\n        this.props."
  },
  {
    "path": "examples/simpleReactApp/components/LocationItem.js",
    "chars": 601,
    "preview": "const React = require('react');\nconst moment = require('moment');\n\nconst LocationItem = React.createClass({\n\n  handleCli"
  },
  {
    "path": "examples/simpleReactApp/components/LocationList.js",
    "chars": 943,
    "preview": "const React = require('react');\nconst LocationItem = require('./LocationItem');\n\nconst LocationList = React.createClass("
  },
  {
    "path": "examples/simpleReactApp/components/Map.js",
    "chars": 1290,
    "preview": "const React = require('react');\n\nconst Map = React.createClass({\n\n    componentDidMount() {\n        // Only componentDid"
  },
  {
    "path": "examples/simpleReactApp/components/Search.js",
    "chars": 1356,
    "preview": "const React = require('react');\n\nconst Search = React.createClass({\n\n    getInitialState() {\n        return {value: ''};"
  },
  {
    "path": "examples/simpleReactApp/index.html",
    "chars": 738,
    "preview": "<!DOCTYPE html>\n<html>\n<head lang=\"en\">\n\t<meta charset=\"UTF-8\">\n\t<title>Your First Webapp With React</title>\n\t<link href"
  },
  {
    "path": "examples/simpleReactApp/main.js",
    "chars": 136,
    "preview": "const React = require('react');\nconst App = require('./components/App');\n\nReact.render(\n  <App />,\n  document.getElement"
  },
  {
    "path": "examples/simpleReactApp/package.json",
    "chars": 704,
    "preview": "{\n  \"name\": \"first-webapp-react\",\n  \"version\": \"1.0.0\",\n  \"description\": \"\",\n  \"main\": \"main.js\",\n  \"private\": true,\n  \""
  },
  {
    "path": "examples/simpleReactApp/readme.md",
    "chars": 719,
    "preview": "**This simple project was originally found here...**\n\nhttp://tutorialzine.com/2015/04/first-webapp-react/\n\nInstall:\nmake"
  },
  {
    "path": "index.html",
    "chars": 5449,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <!-- Required meta tags -->\n    <meta charset=\"utf-8\">\n    <meta name=\"vie"
  },
  {
    "path": "old_splash_page_v2.0/css/bootstrap-theme.css",
    "chars": 14936,
    "preview": "/*!\n * Bootstrap v3.1.1 (http://getbootstrap.com)\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://gi"
  },
  {
    "path": "old_splash_page_v2.0/css/bootstrap.css",
    "chars": 121220,
    "preview": "/*!\n * Bootstrap v3.1.1 (http://getbootstrap.com)\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://gi"
  },
  {
    "path": "old_splash_page_v2.0/css/main.css",
    "chars": 3974,
    "preview": "\n@import url('https://fonts.googleapis.com/css?family=Raleway:100,700,300');\n\n/* ======================================="
  }
]

// ... and 53 more files (download for full content)

About this extraction

This page contains the full source code of the garris/BackstopJS GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 253 files (2.0 MB), approximately 536.1k tokens, and a symbol index with 1627 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!