Copy disabled (too large)
Download .txt
Showing preview only (14,618K chars total). Download the full file to get everything.
Repository: screenshotbot/screenshotbot-oss
Branch: main
Commit: 4e2227dbdd55
Files: 2159
Total size: 26.8 MB
Directory structure:
gitextract_4xm2v9ll/
├── .circleci/
│ └── config.yml
├── .dockerignore
├── .gitattributes
├── .gitignore
├── Dockerfile
├── LICENSE
├── Makefile
├── README.md
├── docker-compose.yml
├── launch.lisp
├── quicklisp/
│ ├── .gitignore
│ ├── asdf.lisp
│ ├── client-info.sexp
│ ├── dists/
│ │ └── quicklisp/
│ │ ├── distinfo.txt
│ │ ├── enabled.txt
│ │ └── preference.txt
│ ├── log4slime-setup.el
│ ├── quicklisp/
│ │ ├── bundle-template.lisp
│ │ ├── bundle.lisp
│ │ ├── cdb.lisp
│ │ ├── client-info.lisp
│ │ ├── client-update.lisp
│ │ ├── client.lisp
│ │ ├── config.lisp
│ │ ├── deflate.lisp
│ │ ├── dist-update.lisp
│ │ ├── dist.lisp
│ │ ├── fetch-gzipped.lisp
│ │ ├── http.lisp
│ │ ├── impl-util.lisp
│ │ ├── impl.lisp
│ │ ├── local-projects.lisp
│ │ ├── minitar.lisp
│ │ ├── misc.lisp
│ │ ├── network.lisp
│ │ ├── package.lisp
│ │ ├── progress.lisp
│ │ ├── quicklisp.asd
│ │ ├── setup.lisp
│ │ ├── utils.lisp
│ │ └── version.txt
│ └── setup.lisp
├── scripts/
│ ├── asdf.lisp
│ ├── build-cli.lisp
│ ├── build-image.lisp
│ ├── common.mk
│ ├── docker-compose-with-replay.yml
│ ├── init.lisp
│ ├── install-sbcl.sh
│ ├── jenkins.lisp
│ ├── lispworks-versions.mk
│ ├── prepare-image.lisp
│ └── update-phabricator.lisp
├── src/
│ ├── auth/
│ │ ├── acceptor.lisp
│ │ ├── auth.asd
│ │ ├── auth.lisp
│ │ ├── avatar.lisp
│ │ ├── company.lisp
│ │ ├── dummy-init-key.out
│ │ ├── login/
│ │ │ ├── auth.login.asd
│ │ │ ├── cached-avatar.lisp
│ │ │ ├── common.lisp
│ │ │ ├── forgot-password.lisp
│ │ │ ├── github.lisp
│ │ │ ├── impersonation.lisp
│ │ │ ├── login.lisp
│ │ │ ├── oidc.lisp
│ │ │ ├── roles-auth-provider.lisp
│ │ │ ├── saml.lisp
│ │ │ ├── signup.lisp
│ │ │ ├── sso.lisp
│ │ │ ├── test-cached-avatar.lisp
│ │ │ ├── test-roles-auth-provider.lisp
│ │ │ ├── test-sso.lisp
│ │ │ ├── test-verify-email.lisp
│ │ │ └── verify-email.lisp
│ │ ├── model/
│ │ │ ├── auth.model.asd
│ │ │ ├── company-sso.lisp
│ │ │ ├── email-confirmation.lisp
│ │ │ ├── invite.lisp
│ │ │ ├── roles.lisp
│ │ │ ├── test-email-confirmation.lisp
│ │ │ ├── test-invite.lisp
│ │ │ ├── test-roles.lisp
│ │ │ └── user.lisp
│ │ ├── package.lisp
│ │ ├── request.lisp
│ │ ├── test-auth.lisp
│ │ ├── test-avatar.lisp
│ │ ├── test-view.lisp
│ │ ├── view.lisp
│ │ └── viewer-context.lisp
│ ├── auto-restart/
│ │ ├── .circleci/
│ │ │ └── config.yml
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── auto-restart.asd
│ │ ├── auto-restart.lisp
│ │ ├── run-circleci.lisp
│ │ └── test-auto-restart.lisp
│ ├── build-utils/
│ │ ├── all.lisp
│ │ ├── build-utils.asd
│ │ ├── closure-compiler/
│ │ │ ├── COPYING
│ │ │ ├── README.md
│ │ │ └── closure-compiler-v20240317.jar
│ │ ├── closure-compiler.lisp
│ │ ├── common.lisp
│ │ ├── css-package.lisp
│ │ ├── dart-sass/
│ │ │ ├── sass
│ │ │ └── src/
│ │ │ ├── LICENSE
│ │ │ ├── dart
│ │ │ └── sass.snapshot
│ │ ├── darwin/
│ │ │ └── dart-sass/
│ │ │ ├── sass
│ │ │ └── src/
│ │ │ ├── LICENSE
│ │ │ ├── dart
│ │ │ └── sass.snapshot
│ │ ├── deliver-script.lisp
│ │ ├── jar-file.lisp
│ │ ├── js-package.lisp
│ │ ├── linux-arm64/
│ │ │ └── dart-sass/
│ │ │ ├── sass
│ │ │ └── src/
│ │ │ ├── LICENSE
│ │ │ ├── dart
│ │ │ └── sass.snapshot
│ │ ├── remote-file.lisp
│ │ └── wild-module.lisp
│ ├── cl-mongo-id/
│ │ ├── LICENSE
│ │ ├── README.markdown
│ │ ├── cl-mongo-id.asd
│ │ ├── mongo-id.lisp
│ │ └── test-mongo-id.lisp
│ ├── common/
│ │ └── bootstrap/
│ │ ├── .babelrc.js
│ │ ├── .browserslistrc
│ │ ├── .bundlewatch.config.json
│ │ ├── .cspell.json
│ │ ├── .editorconfig
│ │ ├── .eslintignore
│ │ ├── .eslintrc.json
│ │ ├── .gitattributes
│ │ ├── .github/
│ │ │ ├── CODEOWNERS
│ │ │ ├── CONTRIBUTING.md
│ │ │ ├── ISSUE_TEMPLATE/
│ │ │ │ ├── bug_report.yml
│ │ │ │ ├── config.yml
│ │ │ │ └── feature_request.yml
│ │ │ ├── PULL_REQUEST_TEMPLATE.md
│ │ │ ├── SUPPORT.md
│ │ │ ├── dependabot.yml
│ │ │ ├── release-drafter.yml
│ │ │ └── workflows/
│ │ │ ├── browserstack.yml
│ │ │ ├── bundlewatch.yml
│ │ │ ├── calibreapp-image-actions.yml
│ │ │ ├── codeql.yml
│ │ │ ├── cspell.yml
│ │ │ ├── css.yml
│ │ │ ├── docs.yml
│ │ │ ├── issue-close-require.yml
│ │ │ ├── issue-labeled.yml
│ │ │ ├── js.yml
│ │ │ ├── lint.yml
│ │ │ ├── node-sass.yml
│ │ │ └── release-notes.yml
│ │ ├── .gitignore
│ │ ├── .stylelintignore
│ │ ├── .stylelintrc
│ │ ├── CODE_OF_CONDUCT.md
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── SECURITY.md
│ │ ├── build/
│ │ │ ├── .eslintrc.json
│ │ │ ├── banner.js
│ │ │ ├── build-plugins.js
│ │ │ ├── change-version.js
│ │ │ ├── generate-sri.js
│ │ │ ├── postcss.config.js
│ │ │ ├── rollup.config.js
│ │ │ ├── vnu-jar.js
│ │ │ └── zip-examples.js
│ │ ├── composer.json
│ │ ├── config.yml
│ │ ├── dist/
│ │ │ ├── css/
│ │ │ │ ├── bootstrap-grid.css
│ │ │ │ ├── bootstrap-grid.rtl.css
│ │ │ │ ├── bootstrap-reboot.css
│ │ │ │ ├── bootstrap-reboot.rtl.css
│ │ │ │ ├── bootstrap-utilities.css
│ │ │ │ ├── bootstrap-utilities.rtl.css
│ │ │ │ ├── bootstrap.css
│ │ │ │ └── bootstrap.rtl.css
│ │ │ └── js/
│ │ │ ├── bootstrap.bundle.js
│ │ │ ├── bootstrap.esm.js
│ │ │ ├── bootstrap.js
│ │ │ └── bootstrap5-js.asd
│ │ ├── js/
│ │ │ ├── dist/
│ │ │ │ ├── alert.js
│ │ │ │ ├── base-component.js
│ │ │ │ ├── button.js
│ │ │ │ ├── carousel.js
│ │ │ │ ├── collapse.js
│ │ │ │ ├── dom/
│ │ │ │ │ ├── data.js
│ │ │ │ │ ├── event-handler.js
│ │ │ │ │ ├── manipulator.js
│ │ │ │ │ └── selector-engine.js
│ │ │ │ ├── dropdown.js
│ │ │ │ ├── modal.js
│ │ │ │ ├── offcanvas.js
│ │ │ │ ├── popover.js
│ │ │ │ ├── scrollspy.js
│ │ │ │ ├── tab.js
│ │ │ │ ├── toast.js
│ │ │ │ ├── tooltip.js
│ │ │ │ └── util/
│ │ │ │ ├── backdrop.js
│ │ │ │ ├── component-functions.js
│ │ │ │ ├── config.js
│ │ │ │ ├── focustrap.js
│ │ │ │ ├── index.js
│ │ │ │ ├── sanitizer.js
│ │ │ │ ├── scrollbar.js
│ │ │ │ ├── swipe.js
│ │ │ │ └── template-factory.js
│ │ │ ├── index.esm.js
│ │ │ ├── index.umd.js
│ │ │ ├── src/
│ │ │ │ ├── alert.js
│ │ │ │ ├── base-component.js
│ │ │ │ ├── button.js
│ │ │ │ ├── carousel.js
│ │ │ │ ├── collapse.js
│ │ │ │ ├── dom/
│ │ │ │ │ ├── data.js
│ │ │ │ │ ├── event-handler.js
│ │ │ │ │ ├── manipulator.js
│ │ │ │ │ └── selector-engine.js
│ │ │ │ ├── dropdown.js
│ │ │ │ ├── modal.js
│ │ │ │ ├── offcanvas.js
│ │ │ │ ├── popover.js
│ │ │ │ ├── scrollspy.js
│ │ │ │ ├── tab.js
│ │ │ │ ├── toast.js
│ │ │ │ ├── tooltip.js
│ │ │ │ └── util/
│ │ │ │ ├── backdrop.js
│ │ │ │ ├── component-functions.js
│ │ │ │ ├── config.js
│ │ │ │ ├── focustrap.js
│ │ │ │ ├── index.js
│ │ │ │ ├── sanitizer.js
│ │ │ │ ├── scrollbar.js
│ │ │ │ ├── swipe.js
│ │ │ │ └── template-factory.js
│ │ │ └── tests/
│ │ │ ├── README.md
│ │ │ ├── browsers.js
│ │ │ ├── helpers/
│ │ │ │ └── fixture.js
│ │ │ ├── integration/
│ │ │ │ ├── bundle-modularity.js
│ │ │ │ ├── bundle.js
│ │ │ │ ├── index.html
│ │ │ │ ├── rollup.bundle-modularity.js
│ │ │ │ └── rollup.bundle.js
│ │ │ ├── karma.conf.js
│ │ │ ├── unit/
│ │ │ │ ├── .eslintrc.json
│ │ │ │ ├── alert.spec.js
│ │ │ │ ├── base-component.spec.js
│ │ │ │ ├── button.spec.js
│ │ │ │ ├── carousel.spec.js
│ │ │ │ ├── collapse.spec.js
│ │ │ │ ├── dom/
│ │ │ │ │ ├── data.spec.js
│ │ │ │ │ ├── event-handler.spec.js
│ │ │ │ │ ├── manipulator.spec.js
│ │ │ │ │ └── selector-engine.spec.js
│ │ │ │ ├── dropdown.spec.js
│ │ │ │ ├── jquery.spec.js
│ │ │ │ ├── modal.spec.js
│ │ │ │ ├── offcanvas.spec.js
│ │ │ │ ├── popover.spec.js
│ │ │ │ ├── scrollspy.spec.js
│ │ │ │ ├── tab.spec.js
│ │ │ │ ├── toast.spec.js
│ │ │ │ ├── tooltip.spec.js
│ │ │ │ └── util/
│ │ │ │ ├── backdrop.spec.js
│ │ │ │ ├── component-functions.spec.js
│ │ │ │ ├── config.spec.js
│ │ │ │ ├── focustrap.spec.js
│ │ │ │ ├── index.spec.js
│ │ │ │ ├── sanitizer.spec.js
│ │ │ │ ├── scrollbar.spec.js
│ │ │ │ ├── swipe.spec.js
│ │ │ │ └── template-factory.spec.js
│ │ │ └── visual/
│ │ │ ├── .eslintrc.json
│ │ │ ├── alert.html
│ │ │ ├── button.html
│ │ │ ├── carousel.html
│ │ │ ├── collapse.html
│ │ │ ├── dropdown.html
│ │ │ ├── modal.html
│ │ │ ├── popover.html
│ │ │ ├── scrollspy.html
│ │ │ ├── tab.html
│ │ │ ├── toast.html
│ │ │ └── tooltip.html
│ │ ├── nuget/
│ │ │ ├── MyGet.ps1
│ │ │ ├── bootstrap.nuspec
│ │ │ └── bootstrap.sass.nuspec
│ │ ├── package.js
│ │ ├── package.json
│ │ ├── scss/
│ │ │ ├── _accordion.scss
│ │ │ ├── _alert.scss
│ │ │ ├── _badge.scss
│ │ │ ├── _breadcrumb.scss
│ │ │ ├── _button-group.scss
│ │ │ ├── _buttons.scss
│ │ │ ├── _card.scss
│ │ │ ├── _carousel.scss
│ │ │ ├── _close.scss
│ │ │ ├── _containers.scss
│ │ │ ├── _dropdown.scss
│ │ │ ├── _forms.scss
│ │ │ ├── _functions.scss
│ │ │ ├── _grid.scss
│ │ │ ├── _helpers.scss
│ │ │ ├── _images.scss
│ │ │ ├── _list-group.scss
│ │ │ ├── _maps.scss
│ │ │ ├── _mixins.scss
│ │ │ ├── _modal.scss
│ │ │ ├── _nav.scss
│ │ │ ├── _navbar.scss
│ │ │ ├── _offcanvas.scss
│ │ │ ├── _pagination.scss
│ │ │ ├── _placeholders.scss
│ │ │ ├── _popover.scss
│ │ │ ├── _progress.scss
│ │ │ ├── _reboot.scss
│ │ │ ├── _root.scss
│ │ │ ├── _spinners.scss
│ │ │ ├── _tables.scss
│ │ │ ├── _toasts.scss
│ │ │ ├── _tooltip.scss
│ │ │ ├── _transitions.scss
│ │ │ ├── _type.scss
│ │ │ ├── _utilities.scss
│ │ │ ├── _variables.scss
│ │ │ ├── bootstrap-grid.scss
│ │ │ ├── bootstrap-reboot.scss
│ │ │ ├── bootstrap-utilities.scss
│ │ │ ├── bootstrap.scss
│ │ │ ├── bootstrap5-css.asd
│ │ │ ├── forms/
│ │ │ │ ├── _floating-labels.scss
│ │ │ │ ├── _form-check.scss
│ │ │ │ ├── _form-control.scss
│ │ │ │ ├── _form-range.scss
│ │ │ │ ├── _form-select.scss
│ │ │ │ ├── _form-text.scss
│ │ │ │ ├── _input-group.scss
│ │ │ │ ├── _labels.scss
│ │ │ │ └── _validation.scss
│ │ │ ├── helpers/
│ │ │ │ ├── _clearfix.scss
│ │ │ │ ├── _color-bg.scss
│ │ │ │ ├── _colored-links.scss
│ │ │ │ ├── _position.scss
│ │ │ │ ├── _ratio.scss
│ │ │ │ ├── _stacks.scss
│ │ │ │ ├── _stretched-link.scss
│ │ │ │ ├── _text-truncation.scss
│ │ │ │ ├── _visually-hidden.scss
│ │ │ │ └── _vr.scss
│ │ │ ├── mixins/
│ │ │ │ ├── _alert.scss
│ │ │ │ ├── _backdrop.scss
│ │ │ │ ├── _banner.scss
│ │ │ │ ├── _border-radius.scss
│ │ │ │ ├── _box-shadow.scss
│ │ │ │ ├── _breakpoints.scss
│ │ │ │ ├── _buttons.scss
│ │ │ │ ├── _caret.scss
│ │ │ │ ├── _clearfix.scss
│ │ │ │ ├── _color-scheme.scss
│ │ │ │ ├── _container.scss
│ │ │ │ ├── _deprecate.scss
│ │ │ │ ├── _forms.scss
│ │ │ │ ├── _gradients.scss
│ │ │ │ ├── _grid.scss
│ │ │ │ ├── _image.scss
│ │ │ │ ├── _list-group.scss
│ │ │ │ ├── _lists.scss
│ │ │ │ ├── _pagination.scss
│ │ │ │ ├── _reset-text.scss
│ │ │ │ ├── _resize.scss
│ │ │ │ ├── _table-variants.scss
│ │ │ │ ├── _text-truncate.scss
│ │ │ │ ├── _transition.scss
│ │ │ │ ├── _utilities.scss
│ │ │ │ └── _visually-hidden.scss
│ │ │ ├── utilities/
│ │ │ │ └── _api.scss
│ │ │ └── vendor/
│ │ │ └── _rfs.scss
│ │ └── site/
│ │ ├── .eslintrc.json
│ │ ├── assets/
│ │ │ ├── js/
│ │ │ │ ├── application.js
│ │ │ │ ├── code-examples.js
│ │ │ │ ├── search.js
│ │ │ │ └── snippets.js
│ │ │ └── scss/
│ │ │ ├── _ads.scss
│ │ │ ├── _anchor.scss
│ │ │ ├── _brand.scss
│ │ │ ├── _buttons.scss
│ │ │ ├── _callouts.scss
│ │ │ ├── _clipboard-js.scss
│ │ │ ├── _colors.scss
│ │ │ ├── _component-examples.scss
│ │ │ ├── _content.scss
│ │ │ ├── _footer.scss
│ │ │ ├── _layout.scss
│ │ │ ├── _masthead.scss
│ │ │ ├── _navbar.scss
│ │ │ ├── _placeholder-img.scss
│ │ │ ├── _search.scss
│ │ │ ├── _sidebar.scss
│ │ │ ├── _skippy.scss
│ │ │ ├── _syntax.scss
│ │ │ ├── _toc.scss
│ │ │ ├── _variables.scss
│ │ │ └── docs.scss
│ │ ├── content/
│ │ │ ├── 404.md
│ │ │ └── docs/
│ │ │ ├── 5.2/
│ │ │ │ ├── _index.html
│ │ │ │ ├── about/
│ │ │ │ │ ├── brand.md
│ │ │ │ │ ├── license.md
│ │ │ │ │ ├── overview.md
│ │ │ │ │ ├── team.md
│ │ │ │ │ └── translations.md
│ │ │ │ ├── components/
│ │ │ │ │ ├── accordion.md
│ │ │ │ │ ├── alerts.md
│ │ │ │ │ ├── badge.md
│ │ │ │ │ ├── breadcrumb.md
│ │ │ │ │ ├── button-group.md
│ │ │ │ │ ├── buttons.md
│ │ │ │ │ ├── card.md
│ │ │ │ │ ├── carousel.md
│ │ │ │ │ ├── close-button.md
│ │ │ │ │ ├── collapse.md
│ │ │ │ │ ├── dropdowns.md
│ │ │ │ │ ├── list-group.md
│ │ │ │ │ ├── modal.md
│ │ │ │ │ ├── navbar.md
│ │ │ │ │ ├── navs-tabs.md
│ │ │ │ │ ├── offcanvas.md
│ │ │ │ │ ├── pagination.md
│ │ │ │ │ ├── placeholders.md
│ │ │ │ │ ├── popovers.md
│ │ │ │ │ ├── progress.md
│ │ │ │ │ ├── scrollspy.md
│ │ │ │ │ ├── spinners.md
│ │ │ │ │ ├── toasts.md
│ │ │ │ │ └── tooltips.md
│ │ │ │ ├── content/
│ │ │ │ │ ├── figures.md
│ │ │ │ │ ├── images.md
│ │ │ │ │ ├── reboot.md
│ │ │ │ │ ├── tables.md
│ │ │ │ │ └── typography.md
│ │ │ │ ├── customize/
│ │ │ │ │ ├── color.md
│ │ │ │ │ ├── components.md
│ │ │ │ │ ├── css-variables.md
│ │ │ │ │ ├── optimize.md
│ │ │ │ │ ├── options.md
│ │ │ │ │ ├── overview.md
│ │ │ │ │ └── sass.md
│ │ │ │ ├── examples/
│ │ │ │ │ ├── .stylelintrc
│ │ │ │ │ ├── _index.md
│ │ │ │ │ ├── album/
│ │ │ │ │ │ └── index.html
│ │ │ │ │ ├── album-rtl/
│ │ │ │ │ │ └── index.html
│ │ │ │ │ ├── blog/
│ │ │ │ │ │ ├── blog.css
│ │ │ │ │ │ ├── blog.rtl.css
│ │ │ │ │ │ └── index.html
│ │ │ │ │ ├── blog-rtl/
│ │ │ │ │ │ └── index.html
│ │ │ │ │ ├── carousel/
│ │ │ │ │ │ ├── carousel.css
│ │ │ │ │ │ ├── carousel.rtl.css
│ │ │ │ │ │ └── index.html
│ │ │ │ │ ├── carousel-rtl/
│ │ │ │ │ │ └── index.html
│ │ │ │ │ ├── cheatsheet/
│ │ │ │ │ │ ├── cheatsheet.css
│ │ │ │ │ │ ├── cheatsheet.js
│ │ │ │ │ │ ├── cheatsheet.rtl.css
│ │ │ │ │ │ └── index.html
│ │ │ │ │ ├── cheatsheet-rtl/
│ │ │ │ │ │ └── index.html
│ │ │ │ │ ├── checkout/
│ │ │ │ │ │ ├── form-validation.css
│ │ │ │ │ │ ├── form-validation.js
│ │ │ │ │ │ └── index.html
│ │ │ │ │ ├── checkout-rtl/
│ │ │ │ │ │ └── index.html
│ │ │ │ │ ├── cover/
│ │ │ │ │ │ ├── cover.css
│ │ │ │ │ │ └── index.html
│ │ │ │ │ ├── dashboard/
│ │ │ │ │ │ ├── dashboard.css
│ │ │ │ │ │ ├── dashboard.js
│ │ │ │ │ │ ├── dashboard.rtl.css
│ │ │ │ │ │ └── index.html
│ │ │ │ │ ├── dashboard-rtl/
│ │ │ │ │ │ ├── dashboard.js
│ │ │ │ │ │ └── index.html
│ │ │ │ │ ├── dropdowns/
│ │ │ │ │ │ ├── dropdowns.css
│ │ │ │ │ │ └── index.html
│ │ │ │ │ ├── features/
│ │ │ │ │ │ ├── features.css
│ │ │ │ │ │ └── index.html
│ │ │ │ │ ├── footers/
│ │ │ │ │ │ └── index.html
│ │ │ │ │ ├── grid/
│ │ │ │ │ │ ├── grid.css
│ │ │ │ │ │ └── index.html
│ │ │ │ │ ├── headers/
│ │ │ │ │ │ ├── headers.css
│ │ │ │ │ │ └── index.html
│ │ │ │ │ ├── heroes/
│ │ │ │ │ │ ├── heroes.css
│ │ │ │ │ │ └── index.html
│ │ │ │ │ ├── jumbotron/
│ │ │ │ │ │ └── index.html
│ │ │ │ │ ├── list-groups/
│ │ │ │ │ │ ├── index.html
│ │ │ │ │ │ └── list-groups.css
│ │ │ │ │ ├── masonry/
│ │ │ │ │ │ └── index.html
│ │ │ │ │ ├── modals/
│ │ │ │ │ │ ├── index.html
│ │ │ │ │ │ └── modals.css
│ │ │ │ │ ├── navbar-bottom/
│ │ │ │ │ │ └── index.html
│ │ │ │ │ ├── navbar-fixed/
│ │ │ │ │ │ ├── index.html
│ │ │ │ │ │ └── navbar-top-fixed.css
│ │ │ │ │ ├── navbar-static/
│ │ │ │ │ │ ├── index.html
│ │ │ │ │ │ └── navbar-top.css
│ │ │ │ │ ├── navbars/
│ │ │ │ │ │ ├── index.html
│ │ │ │ │ │ └── navbar.css
│ │ │ │ │ ├── navbars-offcanvas/
│ │ │ │ │ │ ├── index.html
│ │ │ │ │ │ └── navbar.css
│ │ │ │ │ ├── offcanvas-navbar/
│ │ │ │ │ │ ├── index.html
│ │ │ │ │ │ ├── offcanvas.css
│ │ │ │ │ │ └── offcanvas.js
│ │ │ │ │ ├── pricing/
│ │ │ │ │ │ ├── index.html
│ │ │ │ │ │ └── pricing.css
│ │ │ │ │ ├── product/
│ │ │ │ │ │ ├── index.html
│ │ │ │ │ │ └── product.css
│ │ │ │ │ ├── sidebars/
│ │ │ │ │ │ ├── index.html
│ │ │ │ │ │ ├── sidebars.css
│ │ │ │ │ │ └── sidebars.js
│ │ │ │ │ ├── sign-in/
│ │ │ │ │ │ ├── index.html
│ │ │ │ │ │ └── signin.css
│ │ │ │ │ ├── starter-template/
│ │ │ │ │ │ ├── index.html
│ │ │ │ │ │ └── starter-template.css
│ │ │ │ │ ├── sticky-footer/
│ │ │ │ │ │ ├── index.html
│ │ │ │ │ │ └── sticky-footer.css
│ │ │ │ │ └── sticky-footer-navbar/
│ │ │ │ │ ├── index.html
│ │ │ │ │ └── sticky-footer-navbar.css
│ │ │ │ ├── extend/
│ │ │ │ │ ├── approach.md
│ │ │ │ │ └── icons.md
│ │ │ │ ├── forms/
│ │ │ │ │ ├── checks-radios.md
│ │ │ │ │ ├── floating-labels.md
│ │ │ │ │ ├── form-control.md
│ │ │ │ │ ├── input-group.md
│ │ │ │ │ ├── layout.md
│ │ │ │ │ ├── overview.md
│ │ │ │ │ ├── range.md
│ │ │ │ │ ├── select.md
│ │ │ │ │ └── validation.md
│ │ │ │ ├── getting-started/
│ │ │ │ │ ├── accessibility.md
│ │ │ │ │ ├── best-practices.md
│ │ │ │ │ ├── browsers-devices.md
│ │ │ │ │ ├── contents.md
│ │ │ │ │ ├── contribute.md
│ │ │ │ │ ├── download.md
│ │ │ │ │ ├── introduction.md
│ │ │ │ │ ├── javascript.md
│ │ │ │ │ ├── parcel.md
│ │ │ │ │ ├── rfs.md
│ │ │ │ │ ├── rtl.md
│ │ │ │ │ ├── vite.md
│ │ │ │ │ └── webpack.md
│ │ │ │ ├── helpers/
│ │ │ │ │ ├── clearfix.md
│ │ │ │ │ ├── color-background.md
│ │ │ │ │ ├── colored-links.md
│ │ │ │ │ ├── position.md
│ │ │ │ │ ├── ratio.md
│ │ │ │ │ ├── stacks.md
│ │ │ │ │ ├── stretched-link.md
│ │ │ │ │ ├── text-truncation.md
│ │ │ │ │ ├── vertical-rule.md
│ │ │ │ │ └── visually-hidden.md
│ │ │ │ ├── layout/
│ │ │ │ │ ├── breakpoints.md
│ │ │ │ │ ├── columns.md
│ │ │ │ │ ├── containers.md
│ │ │ │ │ ├── css-grid.md
│ │ │ │ │ ├── grid.md
│ │ │ │ │ ├── gutters.md
│ │ │ │ │ ├── utilities.md
│ │ │ │ │ └── z-index.md
│ │ │ │ ├── migration.md
│ │ │ │ └── utilities/
│ │ │ │ ├── api.md
│ │ │ │ ├── background.md
│ │ │ │ ├── borders.md
│ │ │ │ ├── colors.md
│ │ │ │ ├── display.md
│ │ │ │ ├── flex.md
│ │ │ │ ├── float.md
│ │ │ │ ├── interactions.md
│ │ │ │ ├── opacity.md
│ │ │ │ ├── overflow.md
│ │ │ │ ├── position.md
│ │ │ │ ├── shadows.md
│ │ │ │ ├── sizing.md
│ │ │ │ ├── spacing.md
│ │ │ │ ├── text.md
│ │ │ │ ├── vertical-align.md
│ │ │ │ └── visibility.md
│ │ │ ├── _index.html
│ │ │ └── versions.md
│ │ ├── data/
│ │ │ ├── breakpoints.yml
│ │ │ ├── colors.yml
│ │ │ ├── core-team.yml
│ │ │ ├── docs-versions.yml
│ │ │ ├── examples.yml
│ │ │ ├── grays.yml
│ │ │ ├── icons.yml
│ │ │ ├── plugins.yml
│ │ │ ├── sidebar.yml
│ │ │ ├── theme-colors.yml
│ │ │ └── translations.yml
│ │ ├── layouts/
│ │ │ ├── _default/
│ │ │ │ ├── 404.html
│ │ │ │ ├── _markup/
│ │ │ │ │ └── render-heading.html
│ │ │ │ ├── baseof.html
│ │ │ │ ├── docs.html
│ │ │ │ ├── examples.html
│ │ │ │ ├── home.html
│ │ │ │ ├── redirect.html
│ │ │ │ └── single.html
│ │ │ ├── alias.html
│ │ │ ├── partials/
│ │ │ │ ├── ads.html
│ │ │ │ ├── analytics.html
│ │ │ │ ├── callout-danger-async-methods.md
│ │ │ │ ├── callout-info-mediaqueries-breakpoints.md
│ │ │ │ ├── callout-info-npm-starter.md
│ │ │ │ ├── callout-info-prefersreducedmotion.md
│ │ │ │ ├── callout-info-sanitizer.md
│ │ │ │ ├── callout-warning-color-assistive-technologies.md
│ │ │ │ ├── callout-warning-data-bs-title-vs-title.md
│ │ │ │ ├── callout-warning-input-support.md
│ │ │ │ ├── docs-navbar.html
│ │ │ │ ├── docs-sidebar.html
│ │ │ │ ├── docs-versions.html
│ │ │ │ ├── favicons.html
│ │ │ │ ├── footer.html
│ │ │ │ ├── guide-footer.md
│ │ │ │ ├── header.html
│ │ │ │ ├── home/
│ │ │ │ │ ├── masthead-followup.html
│ │ │ │ │ └── masthead.html
│ │ │ │ ├── icons.html
│ │ │ │ ├── js-data-attributes.md
│ │ │ │ ├── redirect.html
│ │ │ │ ├── scripts.html
│ │ │ │ ├── skippy.html
│ │ │ │ ├── social.html
│ │ │ │ ├── stylesheet.html
│ │ │ │ └── table-content.html
│ │ │ ├── robots.txt
│ │ │ ├── shortcodes/
│ │ │ │ ├── added-in.html
│ │ │ │ ├── bs-table.html
│ │ │ │ ├── callout.html
│ │ │ │ ├── docsref.html
│ │ │ │ ├── example.html
│ │ │ │ ├── js-dismiss.html
│ │ │ │ ├── markdown.html
│ │ │ │ ├── param.html
│ │ │ │ ├── partial.html
│ │ │ │ ├── placeholder.html
│ │ │ │ ├── scss-docs.html
│ │ │ │ ├── table.html
│ │ │ │ └── year.html
│ │ │ └── sitemap.xml
│ │ └── static/
│ │ ├── CNAME
│ │ ├── docs/
│ │ │ └── 5.2/
│ │ │ └── assets/
│ │ │ ├── img/
│ │ │ │ └── favicons/
│ │ │ │ └── manifest.json
│ │ │ └── js/
│ │ │ └── validate-forms.js
│ │ └── sw.js
│ ├── control-socket/
│ │ ├── control-socket.asd
│ │ └── server.lisp
│ ├── core/
│ │ ├── active-users/
│ │ │ ├── active-users.lisp
│ │ │ ├── core.active-users.asd
│ │ │ └── test-active-users.lisp
│ │ ├── api/
│ │ │ ├── acceptor.lisp
│ │ │ ├── api-key-api.lisp
│ │ │ ├── core.api.asd
│ │ │ ├── dashboard/
│ │ │ │ ├── api-keys.lisp
│ │ │ │ └── test-api-keys.lisp
│ │ │ └── model/
│ │ │ ├── api-key.lisp
│ │ │ └── test-api-key.lisp
│ │ ├── cli/
│ │ │ ├── core.cli.asd
│ │ │ ├── darwin-template.lisp
│ │ │ ├── deliver.lisp
│ │ │ ├── sentry.lisp
│ │ │ └── test-sentry.lisp
│ │ ├── config/
│ │ │ ├── api.lisp
│ │ │ ├── core.config.asd
│ │ │ ├── model.lisp
│ │ │ └── test-model.lisp
│ │ ├── installation/
│ │ │ ├── auth-provider.lisp
│ │ │ ├── auth.lisp
│ │ │ ├── core.installation.asd
│ │ │ ├── installation.lisp
│ │ │ ├── mailer.lisp
│ │ │ ├── request.lisp
│ │ │ ├── test-installation.lisp
│ │ │ ├── test-mailer.lisp
│ │ │ └── test-request.lisp
│ │ ├── rpc/
│ │ │ ├── core.rpc.asd
│ │ │ ├── rpc.lisp
│ │ │ └── test-rpc.lisp
│ │ └── ui/
│ │ ├── assets/
│ │ │ ├── README
│ │ │ └── fonts/
│ │ │ └── metropolis/
│ │ │ ├── Metropolis-Bold-arnold.otf
│ │ │ ├── Metropolis-Medium.otf
│ │ │ ├── Metropolis-MediumItalic.otf
│ │ │ ├── Metropolis-Regular.otf
│ │ │ ├── Metropolis-RegularItalic.otf
│ │ │ ├── Metropolis-SemiBold.otf
│ │ │ └── Metropolis-SemiBoldItalic.otf
│ │ ├── assets.lisp
│ │ ├── core.ui.asd
│ │ ├── fonts.lisp
│ │ ├── image.lisp
│ │ ├── left-side-bar.lisp
│ │ ├── mdi.lisp
│ │ ├── nibble-span.lisp
│ │ ├── paginated.lisp
│ │ ├── post.lisp
│ │ ├── simple-card-page.lisp
│ │ ├── taskie.lisp
│ │ ├── template.lisp
│ │ ├── test-paginated.lisp
│ │ └── test-taskie.lisp
│ ├── encrypt/
│ │ ├── encrypt.asd
│ │ ├── encrypt.lisp
│ │ ├── hmac.lisp
│ │ ├── test-encrypt.lisp
│ │ └── test-hmac.lisp
│ ├── file-lock/
│ │ ├── .circleci/
│ │ │ └── config.yml
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── file-lock.asd
│ │ ├── file-lock.lisp
│ │ ├── run-circleci.lisp
│ │ └── test-file-lock.lisp
│ ├── gatekeeper/
│ │ ├── gatekeeper.asd
│ │ ├── gatekeeper.lisp
│ │ └── test-gatekeeper.lisp
│ ├── graphs/
│ │ ├── all.lisp
│ │ ├── dfs.lisp
│ │ ├── graphs.asd
│ │ └── test-dfs.lisp
│ ├── http-proxy/
│ │ ├── http-proxy.asd
│ │ ├── server.lisp
│ │ └── test-server.lisp
│ ├── hunchentoot-extensions/
│ │ ├── acceptor-with-plugins.lisp
│ │ ├── asdf-acceptor.lisp
│ │ ├── async.lisp
│ │ ├── better-easy-handler.lisp
│ │ ├── clos-dispatcher.lisp
│ │ ├── existing-socket.lisp
│ │ ├── forward.lisp
│ │ ├── hunchentoot-extensions.asd
│ │ ├── package.lisp
│ │ ├── postdata.lisp
│ │ ├── random-port.lisp
│ │ ├── test-acceptor-with-plugins.lisp
│ │ ├── test-async.lisp
│ │ ├── test-better-easy-handler.lisp
│ │ ├── test-clos-dispatcher.lisp
│ │ ├── test-forward.lisp
│ │ ├── test-random-port.lisp
│ │ ├── test-url.lisp
│ │ ├── url.lisp
│ │ └── webp.lisp
│ ├── java/
│ │ ├── libs/
│ │ │ ├── asana-0.10.3.jar
│ │ │ ├── atlassian-event-4.1.1.jar
│ │ │ ├── atlassian-httpclient-api-2.1.5.jar
│ │ │ ├── atlassian-httpclient-library-2.1.5.jar
│ │ │ ├── atlassian-util-concurrent-4.0.1.jar
│ │ │ ├── bcprov-jdk15on-1.68.jar
│ │ │ ├── checker-qual-3.8.0.jar
│ │ │ ├── commons-codec-1.15.jar
│ │ │ ├── commons-lang3-3.11.jar
│ │ │ ├── commons-logging-1.2.jar
│ │ │ ├── error_prone_annotations-2.5.1.jar
│ │ │ ├── failureaccess-1.0.1.jar
│ │ │ ├── fugue-4.7.2.jar
│ │ │ ├── google-http-client-1.20.0.jar
│ │ │ ├── google-http-client-gson-1.20.0.jar
│ │ │ ├── google-oauth-client-1.20.0.jar
│ │ │ ├── gson-2.3.1.jar
│ │ │ ├── guava-30.1.1-jre.jar
│ │ │ ├── httpasyncclient-4.1.4.jar
│ │ │ ├── httpasyncclient-cache-4.1.4.jar
│ │ │ ├── httpclient-4.5.13.jar
│ │ │ ├── httpclient-cache-4.5.13.jar
│ │ │ ├── httpcore-4.4.13.jar
│ │ │ ├── httpcore-nio-4.4.10.jar
│ │ │ ├── httpmime-4.5.13.jar
│ │ │ ├── j2objc-annotations-1.3.jar
│ │ │ ├── jackson-annotations-2.9.8.jar
│ │ │ ├── jackson-core-2.9.8.jar
│ │ │ ├── jackson-databind-2.9.8.jar
│ │ │ ├── jakarta.annotation-api-1.3.5.jar
│ │ │ ├── jakarta.inject-2.6.1.jar
│ │ │ ├── jakarta.ws.rs-api-2.1.6.jar
│ │ │ ├── java.libs.asd
│ │ │ ├── jersey-client-2.35.jar
│ │ │ ├── jersey-common-2.35.jar
│ │ │ ├── jersey-media-jaxb-2.35.jar
│ │ │ ├── jersey-media-json-jettison-2.35.jar
│ │ │ ├── jettison-1.3.7.jar
│ │ │ ├── jira-rest-java-client-api-5.2.4.jar
│ │ │ ├── jira-rest-java-client-core-5.2.4.jar
│ │ │ ├── joda-time-2.9.9.jar
│ │ │ ├── json-20210307.jar
│ │ │ ├── jsr305-3.0.2.jar
│ │ │ ├── listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar
│ │ │ ├── org.eclipse.egit.github.core-5.10.0.202012080955-r.jar
│ │ │ ├── osgi-resource-locator-1.0.3.jar
│ │ │ ├── sal-api-4.4.2.jar
│ │ │ ├── slf4j-api-1.7.30.jar
│ │ │ ├── slf4j-simple-1.7.25.jar
│ │ │ ├── spring-beans-5.3.6.jar
│ │ │ ├── spring-core-5.3.6.jar
│ │ │ ├── spring-jcl-5.3.6.jar
│ │ │ └── trello-java-wrapper-0.14.jar
│ │ └── main/
│ │ ├── com/
│ │ │ ├── atlassian/
│ │ │ │ └── oauth/
│ │ │ │ └── client/
│ │ │ │ └── example/
│ │ │ │ ├── ClientMain.java
│ │ │ │ ├── Command.java
│ │ │ │ ├── JiraOAuthClient.java
│ │ │ │ ├── JiraOAuthGetAccessToken.java
│ │ │ │ ├── JiraOAuthGetTemporaryToken.java
│ │ │ │ ├── JiraOAuthTokenFactory.java
│ │ │ │ ├── OAuthAuthenticationHandler.java
│ │ │ │ ├── OAuthClient.java
│ │ │ │ ├── PropertiesClient.java
│ │ │ │ └── TokenAuthenticationHandler.java
│ │ │ └── tdrhq/
│ │ │ ├── PrimitiveWrapper.java
│ │ │ ├── SimpleNativeLibrary.java
│ │ │ └── Whitebox.java
│ │ └── java.main.asd
│ ├── jvm/
│ │ ├── jvm.asd
│ │ └── jvm.lisp
│ ├── nibble/
│ │ ├── nibble.asd
│ │ ├── nibble.lisp
│ │ ├── package.lisp
│ │ └── test-nibble.lisp
│ ├── oidc/
│ │ ├── all.lisp
│ │ ├── oauth.lisp
│ │ ├── oidc.asd
│ │ ├── oidc.lisp
│ │ ├── test-oauth.lisp
│ │ └── test-oidc.lisp
│ ├── pixel-diff/
│ │ ├── CHANGELOG.md
│ │ ├── LICENSE
│ │ ├── PixelDiff.icns
│ │ ├── README.md
│ │ ├── about.lisp
│ │ ├── browser.lisp
│ │ ├── common-ps.lisp
│ │ ├── deliver.lisp
│ │ ├── differ.lisp
│ │ ├── external-images.lisp
│ │ ├── fli-templates.lisp
│ │ ├── git-diff.lisp
│ │ ├── image-pair.lisp
│ │ ├── lisp-stubs.lisp
│ │ ├── lispworks.entitlements
│ │ ├── main.lisp
│ │ ├── make-dmg.sh
│ │ ├── package.lisp
│ │ ├── pixel-diff.asd
│ │ ├── pixel-diff.math-js.asd
│ │ ├── pixel-diff.math.asd
│ │ ├── sign-mac-app.sh
│ │ ├── suite.lisp
│ │ ├── test-common-ps.lisp
│ │ ├── test-differ.lisp
│ │ └── usage.lisp
│ ├── pkg/
│ │ ├── cl-pkg.el
│ │ ├── pkg.asd
│ │ └── pkg.lisp
│ ├── quick-patch/
│ │ ├── .circleci/
│ │ │ └── config.yml
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── all.lisp
│ │ ├── impl.lisp
│ │ ├── quick-patch.asd
│ │ ├── run-circleci.lisp
│ │ ├── test-impl.lisp
│ │ └── util.lisp
│ ├── remark/
│ │ ├── all.lisp
│ │ ├── js/
│ │ │ └── remark.js
│ │ ├── markdown.lisp
│ │ ├── nodes.lisp
│ │ ├── remark.asd
│ │ ├── render.lisp
│ │ ├── search.lisp
│ │ ├── test-markdown.lisp
│ │ ├── test-nodes.lisp
│ │ └── test-search.lisp
│ ├── scheduled-jobs/
│ │ ├── bindings.lisp
│ │ ├── ccronexpr.c
│ │ ├── ccronexpr.h
│ │ ├── model.lisp
│ │ ├── scheduled-jobs.asd
│ │ ├── scheduled-jobs.lisp
│ │ ├── test-bindings.lisp
│ │ └── test-scheduled-jobs.lisp
│ ├── screenshotbot/
│ │ ├── .gitignore
│ │ ├── abstract-pr-promoter.lisp
│ │ ├── admin/
│ │ │ ├── core.lisp
│ │ │ ├── index.lisp
│ │ │ └── test-writes.lisp
│ │ ├── analytics.lisp
│ │ ├── android/
│ │ │ ├── activity.lisp
│ │ │ ├── api.lisp
│ │ │ ├── edit-text.lisp
│ │ │ ├── linear-layout.lisp
│ │ │ ├── screenshotbot.android.asd
│ │ │ ├── text-view.lisp
│ │ │ └── view.lisp
│ │ ├── api/
│ │ │ ├── CHANGELOG.md
│ │ │ ├── active-runs.lisp
│ │ │ ├── analytics-event.lisp
│ │ │ ├── api-key.lisp
│ │ │ ├── batch.lisp
│ │ │ ├── build-info.lisp
│ │ │ ├── cli-log.lisp
│ │ │ ├── commit-graph.lisp
│ │ │ ├── compare.lisp
│ │ │ ├── core.lisp
│ │ │ ├── doc.lisp
│ │ │ ├── docs/
│ │ │ │ └── recorder-run.lisp
│ │ │ ├── failed-run.lisp
│ │ │ ├── finalized-commit.lisp
│ │ │ ├── image.lisp
│ │ │ ├── model.lisp
│ │ │ ├── promote.lisp
│ │ │ ├── recorder-run.lisp
│ │ │ ├── replay-asset.lisp
│ │ │ ├── report.lisp
│ │ │ ├── test-active-runs.lisp
│ │ │ ├── test-analytics-event.lisp
│ │ │ ├── test-batch.lisp
│ │ │ ├── test-build-info.lisp
│ │ │ ├── test-commit-graph.lisp
│ │ │ ├── test-compare.lisp
│ │ │ ├── test-core.lisp
│ │ │ ├── test-failed-run.lisp
│ │ │ ├── test-finalized-commit.lisp
│ │ │ ├── test-image.lisp
│ │ │ ├── test-model.lisp
│ │ │ ├── test-promote.lisp
│ │ │ ├── test-recorder-runs.lisp
│ │ │ ├── test-report.lisp
│ │ │ ├── test-send-tasks.lisp
│ │ │ ├── test-unchanged-run.lisp
│ │ │ ├── test-version.lisp
│ │ │ ├── unchanged-run.lisp
│ │ │ └── version.lisp
│ │ ├── artifacts.lisp
│ │ ├── assets.lisp
│ │ ├── async.lisp
│ │ ├── audit-log.lisp
│ │ ├── aws/
│ │ │ ├── aws.lisp
│ │ │ └── screenshotbot.aws.asd
│ │ ├── azure/
│ │ │ ├── audit-log.lisp
│ │ │ ├── plugin.lisp
│ │ │ ├── promoter.lisp
│ │ │ ├── request.lisp
│ │ │ ├── run-warnings.lisp
│ │ │ ├── settings.lisp
│ │ │ ├── test-plugin.lisp
│ │ │ ├── test-promoter.lisp
│ │ │ ├── test-request.lisp
│ │ │ ├── test-run-warnings.lisp
│ │ │ └── test-settings.lisp
│ │ ├── batch-promoter.lisp
│ │ ├── billing-meter.lisp
│ │ ├── bitbucket/
│ │ │ ├── audit-log.lisp
│ │ │ ├── core.lisp
│ │ │ ├── error-response-1.json
│ │ │ ├── plugin.lisp
│ │ │ ├── promoter.lisp
│ │ │ ├── review-link.lisp
│ │ │ ├── settings.lisp
│ │ │ ├── test-audit-log.lisp
│ │ │ ├── test-plugin.lisp
│ │ │ ├── test-promoter.lisp
│ │ │ ├── test-review-link.lisp
│ │ │ └── test-settings.lisp
│ │ ├── cdn.lisp
│ │ ├── cleanup.lisp
│ │ ├── client-hub/
│ │ │ ├── deliver-client-hub.lisp
│ │ │ ├── flags.lisp
│ │ │ ├── main.lisp
│ │ │ ├── screenshotbot.client-hub.asd
│ │ │ └── selenium.lisp
│ │ ├── company/
│ │ │ ├── members.lisp
│ │ │ ├── new.lisp
│ │ │ ├── rename.lisp
│ │ │ ├── request.lisp
│ │ │ ├── test-rename.lisp
│ │ │ └── test-request.lisp
│ │ ├── config.lisp
│ │ ├── css/
│ │ │ ├── auth.scss
│ │ │ ├── autocomplete.scss
│ │ │ ├── avatar.scss
│ │ │ ├── billing.scss
│ │ │ ├── bootstrap-icons.css
│ │ │ ├── breakpoints.scss
│ │ │ ├── dashboard.scss
│ │ │ ├── default-toplevel.scss
│ │ │ ├── default.scss
│ │ │ ├── doks-default.scss
│ │ │ ├── headroom-custom.scss
│ │ │ ├── mask-builder.scss
│ │ │ ├── material-icons.scss
│ │ │ ├── montserrat.scss
│ │ │ ├── pro-common.scss
│ │ │ ├── roboto.scss
│ │ │ ├── screenshotbot.css-assets.asd
│ │ │ ├── settings.scss
│ │ │ ├── sidebar.scss
│ │ │ ├── split.scss
│ │ │ ├── variables.scss
│ │ │ └── vendor/
│ │ │ ├── _bootstrap-datepicker.min.scss
│ │ │ ├── _bootstrap-timepicker.min.scss
│ │ │ ├── _daterangepicker.scss
│ │ │ ├── _jquery.bootstrap-touchspin.min.scss
│ │ │ ├── _jquery.toast.min.scss
│ │ │ ├── _select2.min.scss
│ │ │ ├── baguetteBox.css
│ │ │ ├── buttons.bootstrap4.css
│ │ │ ├── dataTables.bootstrap4.css
│ │ │ ├── frappe-gantt.css
│ │ │ ├── jquery-jvectormap-1.2.2.css
│ │ │ ├── responsive.bootstrap4.css
│ │ │ ├── select.bootstrap4.css
│ │ │ └── summernote-bs4.css
│ │ ├── dag/
│ │ │ ├── dag.asd
│ │ │ ├── dag.lisp
│ │ │ ├── package.lisp
│ │ │ └── test-dag.lisp
│ │ ├── dashboard/
│ │ │ ├── api-key-impl.lisp
│ │ │ ├── audit-log.lisp
│ │ │ ├── batch.lisp
│ │ │ ├── bisect.lisp
│ │ │ ├── channels.lisp
│ │ │ ├── commit-graph.lisp
│ │ │ ├── compare-branches.lisp
│ │ │ ├── compare.lisp
│ │ │ ├── dashboard.lisp
│ │ │ ├── ensure-company.lisp
│ │ │ ├── explain.lisp
│ │ │ ├── flaky-screenshots.lisp
│ │ │ ├── git-graph
│ │ │ ├── history.lisp
│ │ │ ├── home.lisp
│ │ │ ├── image.lisp
│ │ │ ├── mask-builder.lisp
│ │ │ ├── notes.lisp
│ │ │ ├── notices.lisp
│ │ │ ├── recent-runs.lisp
│ │ │ ├── reports.lisp
│ │ │ ├── review-link.lisp
│ │ │ ├── run-page.lisp
│ │ │ ├── site-admin.lisp
│ │ │ ├── test-api-keys.lisp
│ │ │ ├── test-batch.lisp
│ │ │ ├── test-bisect.lisp
│ │ │ ├── test-channels.lisp
│ │ │ ├── test-commit-graph.lisp
│ │ │ ├── test-compare-branches.lisp
│ │ │ ├── test-compare.lisp
│ │ │ ├── test-dashboard.lisp
│ │ │ ├── test-ensure-company.lisp
│ │ │ ├── test-flaky-screenshots.lisp
│ │ │ ├── test-history.lisp
│ │ │ ├── test-image.lisp
│ │ │ ├── test-notices.lisp
│ │ │ ├── test-recent-runs.lisp
│ │ │ ├── test-reports.lisp
│ │ │ ├── test-review-link.lisp
│ │ │ └── test-run-page.lisp
│ │ ├── debugging.lisp
│ │ ├── default-oidc-provider.lisp
│ │ ├── diff-report.lisp
│ │ ├── dtd/
│ │ │ ├── api.dtd
│ │ │ └── secret.dtd
│ │ ├── email-tasks/
│ │ │ ├── settings.lisp
│ │ │ ├── task-integration.lisp
│ │ │ └── test-task-integration.lisp
│ │ ├── email-template.lisp
│ │ ├── figma/
│ │ │ ├── dropdown.lisp
│ │ │ ├── figma.lisp
│ │ │ ├── test-view.lisp
│ │ │ └── view.lisp
│ │ ├── fixture/
│ │ │ ├── rose.heic
│ │ │ └── secrets.xml
│ │ ├── git-repo.lisp
│ │ ├── github/
│ │ │ ├── access-checks.lisp
│ │ │ ├── all.lisp
│ │ │ ├── app-installation.lisp
│ │ │ ├── audit-log.lisp
│ │ │ ├── fixture/
│ │ │ │ ├── can-edit-for-private-repo.rec
│ │ │ │ ├── can-edit-simple-repo.rec
│ │ │ │ ├── cannot-edit-repo-owned-somewhere-else.rec
│ │ │ │ ├── get-repo-stars.rec
│ │ │ │ ├── private-key.README.md
│ │ │ │ ├── private-key.test-pem
│ │ │ │ └── whoami-integration-test.rec
│ │ │ ├── github-installation.lisp
│ │ │ ├── jwt-token.lisp
│ │ │ ├── marketplace.lisp
│ │ │ ├── plugin.lisp
│ │ │ ├── pr-checks.lisp
│ │ │ ├── pull-request-promoter.lisp
│ │ │ ├── read-repos.lisp
│ │ │ ├── repo-push-webhook.lisp
│ │ │ ├── review-link.lisp
│ │ │ ├── settings.lisp
│ │ │ ├── task-integration.lisp
│ │ │ ├── test-access-checks.lisp
│ │ │ ├── test-app-installation.lisp
│ │ │ ├── test-jwt-token.lisp
│ │ │ ├── test-plugin.lisp
│ │ │ ├── test-pull-request-promoter.lisp
│ │ │ ├── test-read-repos.lisp
│ │ │ ├── test-repo-push-webhook.lisp
│ │ │ ├── test-review-link.lisp
│ │ │ ├── test-settings.lisp
│ │ │ ├── test-webhook.lisp
│ │ │ └── webhook.lisp
│ │ ├── gitlab/
│ │ │ ├── all.lisp
│ │ │ ├── audit-logs.lisp
│ │ │ ├── merge-request-promoter.lisp
│ │ │ ├── plugin.lisp
│ │ │ ├── repo.lisp
│ │ │ ├── review-link.lisp
│ │ │ ├── settings.lisp
│ │ │ ├── test-merge-request-promoter.lisp
│ │ │ ├── test-review-link.lisp
│ │ │ ├── test-settings.lisp
│ │ │ └── webhook.lisp
│ │ ├── hub/
│ │ │ ├── api.lisp
│ │ │ ├── container.lisp
│ │ │ └── server.lisp
│ │ ├── ignore-and-log-errors.lisp
│ │ ├── image-comparison.lisp
│ │ ├── insights/
│ │ │ ├── dashboard.lisp
│ │ │ ├── date.lisp
│ │ │ ├── fuzz.lisp
│ │ │ ├── maps.lisp
│ │ │ ├── pull-requests.lisp
│ │ │ ├── runs.lisp
│ │ │ ├── screenshotbot.insights.asd
│ │ │ ├── test-date.lisp
│ │ │ └── variables.lisp
│ │ ├── installation.lisp
│ │ ├── invite.lisp
│ │ ├── js/
│ │ │ ├── acceptance.js
│ │ │ ├── common.js
│ │ │ ├── compare-branches.js
│ │ │ ├── default.js
│ │ │ ├── dummy.lisp
│ │ │ ├── git-graph.js
│ │ │ ├── home.js
│ │ │ ├── image-canvas.js
│ │ │ ├── jquery-js.asd
│ │ │ ├── jquery.timeago.js
│ │ │ ├── js-stubs.js
│ │ │ ├── mask-editor.js
│ │ │ ├── runs.js
│ │ │ ├── screenshotbot.js-assets.asd
│ │ │ ├── split.js
│ │ │ ├── vendor/
│ │ │ │ ├── baguetteBox.js
│ │ │ │ ├── bootstrap-modal.js
│ │ │ │ ├── bootstrap-modalmanager.js
│ │ │ │ ├── headroom.js
│ │ │ │ ├── jquery-3.5.1.js
│ │ │ │ ├── jquery-ui.js
│ │ │ │ ├── metisMenu.js
│ │ │ │ ├── moment.js
│ │ │ │ ├── select2.js
│ │ │ │ └── sizzle.js
│ │ │ └── websocket-logs.js
│ │ ├── katalon/
│ │ │ ├── .gitignore
│ │ │ ├── deliver.lisp
│ │ │ └── screenshotbot.katalon.asd
│ │ ├── left-side-bar.lisp
│ │ ├── login/
│ │ │ ├── aws-cognito.lisp
│ │ │ ├── github-oauth-ui.lisp
│ │ │ ├── github-oauth.lisp
│ │ │ ├── google-oauth.lisp
│ │ │ ├── microsoft-entra.lisp
│ │ │ ├── populate.lisp
│ │ │ ├── require-invite-sso-mixin.lisp
│ │ │ ├── template.lisp
│ │ │ ├── test-common.lisp
│ │ │ ├── test-forgot-password.lisp
│ │ │ ├── test-github-oauth.lisp
│ │ │ ├── test-google-oauth.lisp
│ │ │ ├── test-login.lisp
│ │ │ ├── test-oidc.lisp
│ │ │ ├── test-populate.lisp
│ │ │ ├── test-signup.lisp
│ │ │ └── test-verify-email.lisp
│ │ ├── magick/
│ │ │ ├── build.lisp
│ │ │ ├── ffi-6.lisp
│ │ │ ├── ffi-7.lisp
│ │ │ ├── health-checks.lisp
│ │ │ ├── magick-lw.lisp
│ │ │ ├── magick-native.c
│ │ │ ├── magick.lisp
│ │ │ ├── screenshotbot.magick.asd
│ │ │ ├── screenshotbot.magick.build.asd
│ │ │ └── test-magick-lw.lisp
│ │ ├── mask-rect-api.lisp
│ │ ├── mcp/
│ │ │ ├── mcp.lisp
│ │ │ └── screenshotbot.mcp.asd
│ │ ├── metrics.lisp
│ │ ├── microsoft-teams/
│ │ │ ├── audit-log.lisp
│ │ │ ├── channel-card.lisp
│ │ │ ├── model.lisp
│ │ │ ├── settings.lisp
│ │ │ ├── task-integration.lisp
│ │ │ └── teams-api.lisp
│ │ ├── migrations/
│ │ │ ├── report.lisp
│ │ │ └── screenshotbot.migrations.asd
│ │ ├── model/
│ │ │ ├── archived-run.lisp
│ │ │ ├── auto-cleanup.lisp
│ │ │ ├── batch.lisp
│ │ │ ├── build-info.lisp
│ │ │ ├── channel.lisp
│ │ │ ├── commit-graph.lisp
│ │ │ ├── company-graph.lisp
│ │ │ ├── company.lisp
│ │ │ ├── constant-string.lisp
│ │ │ ├── core.lisp
│ │ │ ├── counter.lisp
│ │ │ ├── deprecated.lisp
│ │ │ ├── downloadable-run.lisp
│ │ │ ├── enterprise.lisp
│ │ │ ├── failed-run.lisp
│ │ │ ├── figma.lisp
│ │ │ ├── finalized-commit.lisp
│ │ │ ├── image-comparer.lisp
│ │ │ ├── image-comparison.lisp
│ │ │ ├── image.lisp
│ │ │ ├── note.lisp
│ │ │ ├── pr-rollout-rule.lisp
│ │ │ ├── recorder-run.lisp
│ │ │ ├── report.lisp
│ │ │ ├── review-policy.lisp
│ │ │ ├── run-commit-lookup.lisp
│ │ │ ├── screenshot-key.lisp
│ │ │ ├── screenshot-map.lisp
│ │ │ ├── screenshot.lisp
│ │ │ ├── sharing.lisp
│ │ │ ├── test-acceptable.lisp
│ │ │ ├── test-archived-run.lisp
│ │ │ ├── test-auto-cleanup.lisp
│ │ │ ├── test-batch.lisp
│ │ │ ├── test-build-info.lisp
│ │ │ ├── test-channel.lisp
│ │ │ ├── test-commit-graph.lisp
│ │ │ ├── test-company-graph.lisp
│ │ │ ├── test-company.lisp
│ │ │ ├── test-constant-string.lisp
│ │ │ ├── test-core.lisp
│ │ │ ├── test-counter.lisp
│ │ │ ├── test-downloadable-run.lisp
│ │ │ ├── test-figma.lisp
│ │ │ ├── test-finalized-commit.lisp
│ │ │ ├── test-image-comparer.lisp
│ │ │ ├── test-image-comparison.lisp
│ │ │ ├── test-image.lisp
│ │ │ ├── test-object.lisp
│ │ │ ├── test-pr-rollout-rule.lisp
│ │ │ ├── test-recorder-run.lisp
│ │ │ ├── test-report.lisp
│ │ │ ├── test-review-policy.lisp
│ │ │ ├── test-run-commit-lookup.lisp
│ │ │ ├── test-screenshot-key.lisp
│ │ │ ├── test-screenshot-map.lisp
│ │ │ ├── test-screenshot.lisp
│ │ │ ├── test-transient-object.lisp
│ │ │ ├── test-user.lisp
│ │ │ ├── testing.lisp
│ │ │ ├── transient-object.lisp
│ │ │ ├── user.lisp
│ │ │ └── view.lisp
│ │ ├── notice-api.lisp
│ │ ├── phabricator/
│ │ │ ├── all.lisp
│ │ │ ├── builds.lisp
│ │ │ ├── diff-promoter.lisp
│ │ │ ├── plugin.lisp
│ │ │ ├── settings.lisp
│ │ │ ├── test-builds.lisp
│ │ │ └── test-diff-promoter.lisp
│ │ ├── plan.lisp
│ │ ├── plugin/
│ │ │ ├── .gitignore
│ │ │ ├── build.gradle
│ │ │ ├── gradle/
│ │ │ │ ├── gradle-mvn-push.gradle
│ │ │ │ └── wrapper/
│ │ │ │ ├── gradle-wrapper.jar
│ │ │ │ └── gradle-wrapper.properties
│ │ │ ├── gradlew
│ │ │ ├── libs/
│ │ │ │ └── lispcalls.jar
│ │ │ └── src/
│ │ │ └── main/
│ │ │ └── java/
│ │ │ └── io/
│ │ │ └── screenshotbot/
│ │ │ └── plugin/
│ │ │ ├── RecordFacebookTask.java
│ │ │ ├── SbNative.java
│ │ │ └── ScreenshotbotPlugin.java
│ │ ├── plugin.lisp
│ │ ├── promote-api.lisp
│ │ ├── raft-redirect.lisp
│ │ ├── replay/
│ │ │ ├── AWS-SELENIUM-IAM-POLICY.md
│ │ │ ├── aws-selenium-provider.lisp
│ │ │ ├── browser-config.lisp
│ │ │ ├── core.lisp
│ │ │ ├── css-tokenizer.lisp
│ │ │ ├── fixtures/
│ │ │ │ ├── sitemap-0.xml
│ │ │ │ └── sitemap-index.xml
│ │ │ ├── frontend.lisp
│ │ │ ├── integration.lisp
│ │ │ ├── proxy-main.lisp
│ │ │ ├── proxy.lisp
│ │ │ ├── remote.lisp
│ │ │ ├── replay-acceptor.lisp
│ │ │ ├── replay-regex.txt
│ │ │ ├── run-builder.lisp
│ │ │ ├── safe-interrupt.lisp
│ │ │ ├── services.lisp
│ │ │ ├── sitemap.lisp
│ │ │ ├── squid.lisp
│ │ │ ├── test-core.lisp
│ │ │ ├── test-css-tokenizer.lisp
│ │ │ ├── test-integration.lisp
│ │ │ ├── test-remote.lisp
│ │ │ ├── test-replay-acceptor.lisp
│ │ │ ├── test-run-builder.lisp
│ │ │ └── test-sitemap.lisp
│ │ ├── report-api.lisp
│ │ ├── run-prod
│ │ ├── s3/
│ │ │ ├── backup.lisp
│ │ │ └── core.lisp
│ │ ├── s3-policy.json
│ │ ├── screenshot-api.lisp
│ │ ├── screenshotbot.asd
│ │ ├── sdk/
│ │ │ ├── .gitattributes
│ │ │ ├── .gitignore
│ │ │ ├── CHANGELOG.md
│ │ │ ├── UTF-8-demo.html
│ │ │ ├── active-run.lisp
│ │ │ ├── adb-puller.lisp
│ │ │ ├── android.lisp
│ │ │ ├── api-context.lisp
│ │ │ ├── backoff.lisp
│ │ │ ├── batch.lisp
│ │ │ ├── bundle.lisp
│ │ │ ├── cli-common.lisp
│ │ │ ├── clingon-api-context.lisp
│ │ │ ├── commit-graph.lisp
│ │ │ ├── common-flags.lisp
│ │ │ ├── deliver-java.lisp
│ │ │ ├── deliver-sdk.lisp
│ │ │ ├── dev/
│ │ │ │ ├── commands.lisp
│ │ │ │ ├── record-verify.lisp
│ │ │ │ ├── test-record-verify.lisp
│ │ │ │ ├── test-verify-against-ci.lisp
│ │ │ │ └── verify-against-ci.lisp
│ │ │ ├── env.lisp
│ │ │ ├── example/
│ │ │ │ ├── com.facebook.testing.screenshot.sample.ExampleScreenshotTest_testDefault_dump.json
│ │ │ │ ├── com.facebook.testing.screenshot.sample.ExampleScreenshotTest_testDefault_issues.json
│ │ │ │ ├── com.facebook.testing.screenshot.sample.ImageRowScreenshotTest_testDefault2_dump.json
│ │ │ │ ├── com.facebook.testing.screenshot.sample.ImageRowScreenshotTest_testDefault2_issues.json
│ │ │ │ ├── com.facebook.testing.screenshot.sample.MainActivityTest_errorTextShouldBeRed_dump.json
│ │ │ │ ├── com.facebook.testing.screenshot.sample.MainActivityTest_errorTextShouldBeRed_issues.json
│ │ │ │ ├── com.facebook.testing.screenshot.sample.MainActivityTest_mainActivityTestSettingsOpen_dump.json
│ │ │ │ ├── com.facebook.testing.screenshot.sample.MainActivityTest_mainActivityTestSettingsOpen_issues.json
│ │ │ │ ├── com.facebook.testing.screenshot.sample.MainActivityTest_okTextShouldBeGreen_dump.json
│ │ │ │ ├── com.facebook.testing.screenshot.sample.MainActivityTest_okTextShouldBeGreen_issues.json
│ │ │ │ ├── com.facebook.testing.screenshot.sample.MainActivityTest_testScreenshotEntireActivityWithoutAccessibilityMetadata_dump.json
│ │ │ │ ├── com.facebook.testing.screenshot.sample.MainActivityTest_testScreenshotEntireActivity_dump.json
│ │ │ │ ├── com.facebook.testing.screenshot.sample.MainActivityTest_testScreenshotEntireActivity_issues.json
│ │ │ │ ├── com.facebook.testing.screenshot.sample.MainActivityTest_warningTextShouldBeYellow_dump.json
│ │ │ │ ├── com.facebook.testing.screenshot.sample.MainActivityTest_warningTextShouldBeYellow_issues.json
│ │ │ │ ├── com.facebook.testing.screenshot.sample.StandardAndroidViewTest_testChinese_dump.json
│ │ │ │ ├── com.facebook.testing.screenshot.sample.StandardAndroidViewTest_testChinese_issues.json
│ │ │ │ ├── com.facebook.testing.screenshot.sample.StandardAndroidViewTest_testLongText_dump.json
│ │ │ │ ├── com.facebook.testing.screenshot.sample.StandardAndroidViewTest_testLongText_issues.json
│ │ │ │ ├── com.facebook.testing.screenshot.sample.StandardAndroidViewTest_testRendering_dump.json
│ │ │ │ ├── com.facebook.testing.screenshot.sample.StandardAndroidViewTest_testRendering_issues.json
│ │ │ │ ├── default.css
│ │ │ │ ├── default.js
│ │ │ │ ├── fab_dump.json
│ │ │ │ ├── fab_issues.json
│ │ │ │ ├── index.html
│ │ │ │ └── metadata.xml
│ │ │ ├── example-firebase-artifacts/
│ │ │ │ └── artifacts/
│ │ │ │ └── sdcard/
│ │ │ │ └── screenshots/
│ │ │ │ └── com.facebook.testing.screenshot.example.test/
│ │ │ │ └── screenshots-default/
│ │ │ │ ├── com.facebook.testing.screenshot.sample.ExampleScreenshotTest_testDefault_dump.json
│ │ │ │ ├── com.facebook.testing.screenshot.sample.ExampleScreenshotTest_testDefault_issues.json
│ │ │ │ ├── com.facebook.testing.screenshot.sample.ImageRowScreenshotTest_testDefault_dump.json
│ │ │ │ ├── com.facebook.testing.screenshot.sample.ImageRowScreenshotTest_testDefault_issues.json
│ │ │ │ ├── com.facebook.testing.screenshot.sample.MainActivityTest_errorTextShouldBeRed_dump.json
│ │ │ │ ├── com.facebook.testing.screenshot.sample.MainActivityTest_errorTextShouldBeRed_issues.json
│ │ │ │ ├── com.facebook.testing.screenshot.sample.MainActivityTest_mainActivityTestSettingsOpen_dump.json
│ │ │ │ ├── com.facebook.testing.screenshot.sample.MainActivityTest_mainActivityTestSettingsOpen_issues.json
│ │ │ │ ├── com.facebook.testing.screenshot.sample.MainActivityTest_okTextShouldBeGreen_dump.json
│ │ │ │ ├── com.facebook.testing.screenshot.sample.MainActivityTest_okTextShouldBeGreen_issues.json
│ │ │ │ ├── com.facebook.testing.screenshot.sample.MainActivityTest_testScreenshotEntireActivityWithoutAccessibilityMetadata_dump.json
│ │ │ │ ├── com.facebook.testing.screenshot.sample.MainActivityTest_testScreenshotEntireActivity_dump.json
│ │ │ │ ├── com.facebook.testing.screenshot.sample.MainActivityTest_testScreenshotEntireActivity_issues.json
│ │ │ │ ├── com.facebook.testing.screenshot.sample.MainActivityTest_warningTextShouldBeYellow_dump.json
│ │ │ │ ├── com.facebook.testing.screenshot.sample.MainActivityTest_warningTextShouldBeYellow_issues.json
│ │ │ │ ├── com.facebook.testing.screenshot.sample.StandardAndroidViewTest_testChinese_dump.json
│ │ │ │ ├── com.facebook.testing.screenshot.sample.StandardAndroidViewTest_testChinese_issues.json
│ │ │ │ ├── com.facebook.testing.screenshot.sample.StandardAndroidViewTest_testLongText_dump.json
│ │ │ │ ├── com.facebook.testing.screenshot.sample.StandardAndroidViewTest_testLongText_issues.json
│ │ │ │ ├── com.facebook.testing.screenshot.sample.StandardAndroidViewTest_testRendering_dump.json
│ │ │ │ ├── com.facebook.testing.screenshot.sample.StandardAndroidViewTest_testRendering_issues.json
│ │ │ │ ├── fab_dump.json
│ │ │ │ ├── fab_issues.json
│ │ │ │ ├── metadata.json
│ │ │ │ └── tests_run_id
│ │ │ ├── example-shot-artifacts/
│ │ │ │ └── com.karumi.shotconsumercompose.staging.debug.test/
│ │ │ │ ├── screenshots-compose-default/
│ │ │ │ │ └── metadata_compose.json
│ │ │ │ └── screenshots-default/
│ │ │ │ ├── com.karumi.shotconsumercompose.MainActivityTest_activityTest_dump.json
│ │ │ │ ├── metadata.json
│ │ │ │ └── tests_run_id
│ │ │ ├── failed-run.lisp
│ │ │ ├── fetch-run.lisp
│ │ │ ├── finalized-commit.lisp
│ │ │ ├── firebase.lisp
│ │ │ ├── fixture/
│ │ │ │ ├── braft-expected.log
│ │ │ │ ├── braft.log
│ │ │ │ ├── result12.xcresult/
│ │ │ │ │ ├── Data/
│ │ │ │ │ │ ├── data.0~06eElEqhYuN_viqTCjodWIWcItfFrDQx8-89G9taauMy7nuUs6llm5-WzGoNbAqCFhU21JLa7lg2TzOKEaOc2w==
│ │ │ │ │ │ ├── data.0~0TgqQPqltxD2fcwCfwkYTyJUFEUcN7mutaxQrnbflxBtGUL6q0q-w9j-TbqZ9pvJLh3QCA-k-_rFdVJyt_FXIA==
│ │ │ │ │ │ ├── data.0~0fAMG3G0pF2soWVuoI-EQdB5nAUKfJhtrDhJ8fquCN_HExcAQGd6PxBrMs_TK3PbB4AmXi0mqZASeTi7-xRM1g==
│ │ │ │ │ │ ├── data.0~1O88WBKsbq-19qla4nu_iw50pQo9ObRRa5K0apfi7K1PRIdknH-uzIVno1KUx5kVRe9Fx_v2DRCdO7SKTFzQPA==
│ │ │ │ │ │ ├── data.0~3yv1MadYKtFaPgQLOcNbeosIIax4mOLvqKcn9dJauwvWo7CG6v-VrQlP2J731PdhAdZHwVuETn4EsiDnSOyVaw==
│ │ │ │ │ │ ├── data.0~4VeaO-yhS3kVMv0yjG1hdHe1h38D79uGIIRAb53AWN1YfesDbDDVe_hRW0ilyYdEH7PoZIP_TlciUG-9nCh6Tw==
│ │ │ │ │ │ ├── data.0~4VqMqsI5lOfxRppnud6-VDWcNsU8J7VgFCJfW2dXPwOcAkvU-I8Um5yp9n0Zv6nr3VmcxYggaVMDFfR0U_vjKw==
│ │ │ │ │ │ ├── data.0~8hbCIwY6qNvcWAw3ya_TeDjmsyMdpstEQcYiI_VnxJdIfOP_Xdaa143BZ6_-8dna-9WYxcLrsBG497BiEIb1-Q==
│ │ │ │ │ │ ├── data.0~8rfNRM_I-f8BiNiW8qWkZuiHPzJn5mU4s4cFLKZuyjbgVd1l3NPznUqO_fSXuExsNWag0kYJ7bFzSZkyPzzOhQ==
│ │ │ │ │ │ ├── data.0~9nfJsl_CyeiGx_OkZgfxuDXCkhYtC8uXJEPTPCavOq-YArWDsOu8KIXm2KSuP5VovEITW_ActhJPuX0x6yz2_w==
│ │ │ │ │ │ ├── data.0~Bbsc8KoFFWe_3Eml4aqyL_mltStg9MSuFyTLvgKxVgGhR23hzWV9XYwff-gES4vip7xePvH8LIL1ZSzvzGVFjg==
│ │ │ │ │ │ ├── data.0~C64aGvRF0659k83KqbRKOWqGUlK9rButy3MKh6L6FG_3cSCQihsIGEeKTuEeQ9cGDxzBqVBD9GXwVugrD2-nIQ==
│ │ │ │ │ │ ├── data.0~CIxsCVpFlJLwi1Q_HYfE2MyEfgLWrED7CxgJXfPObMzyDUVuFoms_f-8O3eZ4H0adC8D2VLmkNKGE1jq7zpFDw==
│ │ │ │ │ │ ├── data.0~CtkVCuqDejEyBsfLuf1gbcWmIOnvDT5vyRNstIGS9k1egkexhAl4L9Gh1hMQNuR-1Jv9C-G0_b7Xdyr5hpap4w==
│ │ │ │ │ │ ├── data.0~ESkjZR3lfbgy5n036G_Poc1eL5brLd8ZgOmCRzt9bNCV8M0PssVGfWi3hXNtHe2VsGNZCfpMBtbz2ufoCLJ8wA==
│ │ │ │ │ │ ├── data.0~GdHqNv0Rcxo4E1uKDjmzHRfgzfYX1IIrf6enWktYsfSLH2ZTlfP0S1ucj09zzjJKNlXGrKr39OfmZjfMClahTQ==
│ │ │ │ │ │ ├── data.0~GhB22DxEKbNQtjzJQ42iodDJUdX-eJWbJ0Q8_OtUQjfQ6ZOeUVj5XIlYix5cImL3APbvyyNSXloyFus7XhEtCA==
│ │ │ │ │ │ ├── data.0~IuTy9KuaY_oGEbddgicn4rGTZ6DlUdk-3IFaLtAtIy9Grb9oX9kX6kr6v7zNJ--_dqGm8yjQ6iIupS8ek9hT9g==
│ │ │ │ │ │ ├── data.0~KyXicDIcdSxF_KIP102tjEK_pZ6XlVSJA4Z8vIhMSaV8GS3xxEZIyZ5FVnf4sK4QgG9hE_aqoRzZFUF8CftG3g==
│ │ │ │ │ │ ├── data.0~MapkA4cgU0tr0Z7hLbOaWDTtktOBJcuxcDHdAA9kpSavLCSztPZMPsQ5cxHUN-UoZV2x2Jez_-FtxpBnjGVJEg==
│ │ │ │ │ │ ├── data.0~N2rVyxSAcn-Jy_KSWQLN2uvz4gRzBEedrqckuRVRMEnKnVoMSwJikfRp8si5LOPil5bxE0dBeX2wEKQXubsUMw==
│ │ │ │ │ │ ├── data.0~Nu2-eTw67CgTS4yMe4Bmr3a5P-9MulBMVsN9BjlRcNJbzTVEzn3YIG7DXjJITUvspEQk3sftLTDaMA3gr-nxdQ==
│ │ │ │ │ │ ├── data.0~Oaa9GEZlbuUu3kCakBXBvHevypj9sFPqdvBNCLddNdy0HmvbjEBC4u-41avFMHOArH3zLVm2NfIICe5fjhZSqA==
│ │ │ │ │ │ ├── data.0~TIsaG4mWYvUw2aAa9ddNoD2NC4Wzb6lxf848peyO7QmvT4x-9UNSP53ObXmZZ5yjess9CMQq6Dc-zWj2Zp9BAA==
│ │ │ │ │ │ ├── data.0~TqyOe-QFeBwFl1P8y09sGCJSxUz47gHNOtZVAkmABrO6H_lRaPH_TT6wQtXT1s6hKusnX8RajPhjsCnG7QrO_w==
│ │ │ │ │ │ ├── data.0~V6MabtdV7iVaTOIoTUKXY_uv5Ic2RO6VjmSKralTeFVuDOKapV8w4Rru0oqxzeLUN7zUsx9VV9LkptjIRck1Yw==
│ │ │ │ │ │ ├── data.0~W4cv_QjE4X88RtzNXXgJ4qflLVBIdzoddkFvGCiCzwRxRF1vFB1zHRZEC9xj4bnwNrPUsohr5Ji2YRY1v4K9SA==
│ │ │ │ │ │ ├── data.0~WAeDWkvX4htYZHAld6PE4WIYk4YhShlEWapAiaeqGnEFPE3D2rx8Ib2ucQeGD9sX2KXRCdXiwpjfmDAAwrgmzQ==
│ │ │ │ │ │ ├── data.0~WCfmr-kV_Ra_l8C6VvAb9o2Bk2uoUqXvY_hslpxPwmmY95xAHm4LEFVMttX23p4xGzvufYSx2AqzVwTOKHgjRQ==
│ │ │ │ │ │ ├── data.0~XUAlhhemQaTQVtRfqkL-LyQDeqCYGHfK2_OF9ZN_tPVbaS8z4vUYIR4bxdFHOxUx5jRZpBvWsqwdWv6aDyRrCQ==
│ │ │ │ │ │ ├── data.0~ZTqxGrIflZc47jajv-GpQvBdJx_hWl9komq8Uh5E74Xcjff9Vy52CZOpm7LO2mv9qdoIJ4MwWHmajprH0UJWQA==
│ │ │ │ │ │ ├── data.0~_QoR-0dQn0sNWymkYye049iakX_XulItmKK4GQSufbsrkvCl58eBLh7k83KTdMVZNkMdkyXssMlLe_isSg9E4w==
│ │ │ │ │ │ ├── data.0~arVHxe88d0XfM4a_iw9FQ-c1fy-2HjCLGMrWJrzB7UBc6y5GAWtzZiGCU5b44PWXLt2cJt2wCDGHvWZhrThzIg==
│ │ │ │ │ │ ├── data.0~b6rBGHFM55xTxTH2NRf4cKTeFgDEIbsa-K6R_CUYEEBrl3LdtgwVVeSWSl7dM0MZ1P_fNcOcR1pUPwxGyxQLFg==
│ │ │ │ │ │ ├── data.0~bTNtmsOCSaQWsONvq8shw8JaB5sTfV4jLdsMohdvbk1wY3TFNc06HSe10fzznGFXZY7ljxjb4l8QrKyA8FvjYg==
│ │ │ │ │ │ ├── data.0~cGShflEJBARoixS1GsvQECcSXDe_RToOUASg4dt2evSJUrPo4DGe9wi_KSE_LITnN49kLhLYwqADoFxwdO4IkQ==
│ │ │ │ │ │ ├── data.0~dhcZQk7pHZj_rXPkyk0l0_EvG7VPvTeVFYSyFac3ZrbSa1oqvtltI43MWKPWskI-7JLSENxKbDCQpX4uG2n21Q==
│ │ │ │ │ │ ├── data.0~fWJAoUYy2rHEyGyiUV0ibka0nbDMIQGrIQbDHbg5uVU-orJk49KesO9utOUlumL_KVn1aWHJEMjkio2tPRX_Lg==
│ │ │ │ │ │ ├── data.0~fwKHNwmXFbI-CiOtAXpG75NEv8CdtUCV_ryk4aEcd1MssZEKme91B5qPBcN25wq64Ow7ze-iffoQpCf4QDTLoQ==
│ │ │ │ │ │ ├── data.0~g_biHu-Yf80XFLLu6pNy4sYr2cI3y56nHrYn-Jtub2ZxKDEPc_Y-v1DRWE7ZhqKxjbu1UgH0bsV_sOThuQlYGg==
│ │ │ │ │ │ ├── data.0~h4vu5HpkJwt8pXHb8o1j3fGL9h1dr7Y11VyxECBy2C4nP4kBO00VTByjEaOrOhCifX6bNQTIq2Dy5xGlqjdHhw==
│ │ │ │ │ │ ├── data.0~kFpRFrgGEeBh9uvA-3MuJgNTSwW13Ow2V_3URBYMSH-0k4ZJ_Ox5K-g1rDuSOJ-gyMo87MiandTZsPmy75OOjA==
│ │ │ │ │ │ ├── data.0~m7pxmLgHK4lUyl5MCRovwK5yQEJYHRKeM8lXOFR3ue1YinjywaoSK-44-WQRgl3aehIEkGCurIfn0hyHT63umw==
│ │ │ │ │ │ ├── data.0~nqtjyxgscHiZYdt4Y8ICuh3SgKydPuah7I-GxreD8fGSkhEUXa0St_rRnKDM_k7wTDpMNkr5aAZxz0YpyZaoVA==
│ │ │ │ │ │ ├── data.0~oNtXghNehRZ1Ttuy9I1ikWx2An-_WBLlr3Pl4wyb17Gp8o-Q28jEMYpDQgFCHlBeFaTy4wYd91bdDDD4voUmHg==
│ │ │ │ │ │ ├── data.0~oRMi0sbQLktfDDDGUS-SqBKpdDiD6HCztVES_ShfGr0KVcYENoIq7y9oUSDWL5B_P2gkdtWG8JEsJLxPbdWOZA==
│ │ │ │ │ │ ├── data.0~pf2ENc4jrljwDk1PKQibk8aX7ljZHyznLIpseS0jyHAeNqjrBTUHrz-vR-2mrclgBDnu04N8Q7a1qSBrGiDpWQ==
│ │ │ │ │ │ ├── data.0~psoZXY0KQG2o1pHrYKVvMz7DK3EkxTM3VI7rWjLgKXzoFc_9-Kkzg1ieDlEop5425mPFShni4xZaGmwqTMacAQ==
│ │ │ │ │ │ ├── data.0~qcUUa26y26YwdmhFZUEF5pH0pZuNwPkJ_KtAo-kEn6joYnjSzzg4le6ly8nG1TVKl26maTsIsmOig53j1fZyxg==
│ │ │ │ │ │ ├── data.0~y5oK5BFKNIKCE8AkvHzMr-Aj11jJmHoG-Lz9wYUt93QIdefWc7TaJ6DWGiWngjJkRJ1XEJI7UQQpeLZk4gQ_Zw==
│ │ │ │ │ │ ├── data.0~yTk_0HmUrv4Tsf9SvkX3yAZwG9OgPBrR89Hy48TH2EoodJHqV_M7R3Lix9-tpSIqOVkv-GS8LXNsIkb5X7L1EA==
│ │ │ │ │ │ ├── refs.0~06eElEqhYuN_viqTCjodWIWcItfFrDQx8-89G9taauMy7nuUs6llm5-WzGoNbAqCFhU21JLa7lg2TzOKEaOc2w==
│ │ │ │ │ │ ├── refs.0~0TgqQPqltxD2fcwCfwkYTyJUFEUcN7mutaxQrnbflxBtGUL6q0q-w9j-TbqZ9pvJLh3QCA-k-_rFdVJyt_FXIA==
│ │ │ │ │ │ ├── refs.0~0fAMG3G0pF2soWVuoI-EQdB5nAUKfJhtrDhJ8fquCN_HExcAQGd6PxBrMs_TK3PbB4AmXi0mqZASeTi7-xRM1g==
│ │ │ │ │ │ ├── refs.0~1O88WBKsbq-19qla4nu_iw50pQo9ObRRa5K0apfi7K1PRIdknH-uzIVno1KUx5kVRe9Fx_v2DRCdO7SKTFzQPA==
│ │ │ │ │ │ ├── refs.0~3yv1MadYKtFaPgQLOcNbeosIIax4mOLvqKcn9dJauwvWo7CG6v-VrQlP2J731PdhAdZHwVuETn4EsiDnSOyVaw==
│ │ │ │ │ │ ├── refs.0~4VeaO-yhS3kVMv0yjG1hdHe1h38D79uGIIRAb53AWN1YfesDbDDVe_hRW0ilyYdEH7PoZIP_TlciUG-9nCh6Tw==
│ │ │ │ │ │ ├── refs.0~4VqMqsI5lOfxRppnud6-VDWcNsU8J7VgFCJfW2dXPwOcAkvU-I8Um5yp9n0Zv6nr3VmcxYggaVMDFfR0U_vjKw==
│ │ │ │ │ │ ├── refs.0~8hbCIwY6qNvcWAw3ya_TeDjmsyMdpstEQcYiI_VnxJdIfOP_Xdaa143BZ6_-8dna-9WYxcLrsBG497BiEIb1-Q==
│ │ │ │ │ │ ├── refs.0~8rfNRM_I-f8BiNiW8qWkZuiHPzJn5mU4s4cFLKZuyjbgVd1l3NPznUqO_fSXuExsNWag0kYJ7bFzSZkyPzzOhQ==
│ │ │ │ │ │ ├── refs.0~9nfJsl_CyeiGx_OkZgfxuDXCkhYtC8uXJEPTPCavOq-YArWDsOu8KIXm2KSuP5VovEITW_ActhJPuX0x6yz2_w==
│ │ │ │ │ │ ├── refs.0~Bbsc8KoFFWe_3Eml4aqyL_mltStg9MSuFyTLvgKxVgGhR23hzWV9XYwff-gES4vip7xePvH8LIL1ZSzvzGVFjg==
│ │ │ │ │ │ ├── refs.0~C64aGvRF0659k83KqbRKOWqGUlK9rButy3MKh6L6FG_3cSCQihsIGEeKTuEeQ9cGDxzBqVBD9GXwVugrD2-nIQ==
│ │ │ │ │ │ ├── refs.0~CIxsCVpFlJLwi1Q_HYfE2MyEfgLWrED7CxgJXfPObMzyDUVuFoms_f-8O3eZ4H0adC8D2VLmkNKGE1jq7zpFDw==
│ │ │ │ │ │ ├── refs.0~CtkVCuqDejEyBsfLuf1gbcWmIOnvDT5vyRNstIGS9k1egkexhAl4L9Gh1hMQNuR-1Jv9C-G0_b7Xdyr5hpap4w==
│ │ │ │ │ │ ├── refs.0~ESkjZR3lfbgy5n036G_Poc1eL5brLd8ZgOmCRzt9bNCV8M0PssVGfWi3hXNtHe2VsGNZCfpMBtbz2ufoCLJ8wA==
│ │ │ │ │ │ ├── refs.0~GdHqNv0Rcxo4E1uKDjmzHRfgzfYX1IIrf6enWktYsfSLH2ZTlfP0S1ucj09zzjJKNlXGrKr39OfmZjfMClahTQ==
│ │ │ │ │ │ ├── refs.0~GhB22DxEKbNQtjzJQ42iodDJUdX-eJWbJ0Q8_OtUQjfQ6ZOeUVj5XIlYix5cImL3APbvyyNSXloyFus7XhEtCA==
│ │ │ │ │ │ ├── refs.0~IuTy9KuaY_oGEbddgicn4rGTZ6DlUdk-3IFaLtAtIy9Grb9oX9kX6kr6v7zNJ--_dqGm8yjQ6iIupS8ek9hT9g==
│ │ │ │ │ │ ├── refs.0~KyXicDIcdSxF_KIP102tjEK_pZ6XlVSJA4Z8vIhMSaV8GS3xxEZIyZ5FVnf4sK4QgG9hE_aqoRzZFUF8CftG3g==
│ │ │ │ │ │ ├── refs.0~MapkA4cgU0tr0Z7hLbOaWDTtktOBJcuxcDHdAA9kpSavLCSztPZMPsQ5cxHUN-UoZV2x2Jez_-FtxpBnjGVJEg==
│ │ │ │ │ │ ├── refs.0~N2rVyxSAcn-Jy_KSWQLN2uvz4gRzBEedrqckuRVRMEnKnVoMSwJikfRp8si5LOPil5bxE0dBeX2wEKQXubsUMw==
│ │ │ │ │ │ ├── refs.0~Nu2-eTw67CgTS4yMe4Bmr3a5P-9MulBMVsN9BjlRcNJbzTVEzn3YIG7DXjJITUvspEQk3sftLTDaMA3gr-nxdQ==
│ │ │ │ │ │ ├── refs.0~Oaa9GEZlbuUu3kCakBXBvHevypj9sFPqdvBNCLddNdy0HmvbjEBC4u-41avFMHOArH3zLVm2NfIICe5fjhZSqA==
│ │ │ │ │ │ ├── refs.0~TIsaG4mWYvUw2aAa9ddNoD2NC4Wzb6lxf848peyO7QmvT4x-9UNSP53ObXmZZ5yjess9CMQq6Dc-zWj2Zp9BAA==
│ │ │ │ │ │ ├── refs.0~TqyOe-QFeBwFl1P8y09sGCJSxUz47gHNOtZVAkmABrO6H_lRaPH_TT6wQtXT1s6hKusnX8RajPhjsCnG7QrO_w==
│ │ │ │ │ │ ├── refs.0~V6MabtdV7iVaTOIoTUKXY_uv5Ic2RO6VjmSKralTeFVuDOKapV8w4Rru0oqxzeLUN7zUsx9VV9LkptjIRck1Yw==
│ │ │ │ │ │ ├── refs.0~W4cv_QjE4X88RtzNXXgJ4qflLVBIdzoddkFvGCiCzwRxRF1vFB1zHRZEC9xj4bnwNrPUsohr5Ji2YRY1v4K9SA==
│ │ │ │ │ │ ├── refs.0~WAeDWkvX4htYZHAld6PE4WIYk4YhShlEWapAiaeqGnEFPE3D2rx8Ib2ucQeGD9sX2KXRCdXiwpjfmDAAwrgmzQ==
│ │ │ │ │ │ ├── refs.0~WCfmr-kV_Ra_l8C6VvAb9o2Bk2uoUqXvY_hslpxPwmmY95xAHm4LEFVMttX23p4xGzvufYSx2AqzVwTOKHgjRQ==
│ │ │ │ │ │ ├── refs.0~XUAlhhemQaTQVtRfqkL-LyQDeqCYGHfK2_OF9ZN_tPVbaS8z4vUYIR4bxdFHOxUx5jRZpBvWsqwdWv6aDyRrCQ==
│ │ │ │ │ │ ├── refs.0~ZTqxGrIflZc47jajv-GpQvBdJx_hWl9komq8Uh5E74Xcjff9Vy52CZOpm7LO2mv9qdoIJ4MwWHmajprH0UJWQA==
│ │ │ │ │ │ ├── refs.0~_QoR-0dQn0sNWymkYye049iakX_XulItmKK4GQSufbsrkvCl58eBLh7k83KTdMVZNkMdkyXssMlLe_isSg9E4w==
│ │ │ │ │ │ ├── refs.0~arVHxe88d0XfM4a_iw9FQ-c1fy-2HjCLGMrWJrzB7UBc6y5GAWtzZiGCU5b44PWXLt2cJt2wCDGHvWZhrThzIg==
│ │ │ │ │ │ ├── refs.0~b6rBGHFM55xTxTH2NRf4cKTeFgDEIbsa-K6R_CUYEEBrl3LdtgwVVeSWSl7dM0MZ1P_fNcOcR1pUPwxGyxQLFg==
│ │ │ │ │ │ ├── refs.0~bTNtmsOCSaQWsONvq8shw8JaB5sTfV4jLdsMohdvbk1wY3TFNc06HSe10fzznGFXZY7ljxjb4l8QrKyA8FvjYg==
│ │ │ │ │ │ ├── refs.0~cGShflEJBARoixS1GsvQECcSXDe_RToOUASg4dt2evSJUrPo4DGe9wi_KSE_LITnN49kLhLYwqADoFxwdO4IkQ==
│ │ │ │ │ │ ├── refs.0~dhcZQk7pHZj_rXPkyk0l0_EvG7VPvTeVFYSyFac3ZrbSa1oqvtltI43MWKPWskI-7JLSENxKbDCQpX4uG2n21Q==
│ │ │ │ │ │ ├── refs.0~fWJAoUYy2rHEyGyiUV0ibka0nbDMIQGrIQbDHbg5uVU-orJk49KesO9utOUlumL_KVn1aWHJEMjkio2tPRX_Lg==
│ │ │ │ │ │ ├── refs.0~fwKHNwmXFbI-CiOtAXpG75NEv8CdtUCV_ryk4aEcd1MssZEKme91B5qPBcN25wq64Ow7ze-iffoQpCf4QDTLoQ==
│ │ │ │ │ │ ├── refs.0~g_biHu-Yf80XFLLu6pNy4sYr2cI3y56nHrYn-Jtub2ZxKDEPc_Y-v1DRWE7ZhqKxjbu1UgH0bsV_sOThuQlYGg==
│ │ │ │ │ │ ├── refs.0~h4vu5HpkJwt8pXHb8o1j3fGL9h1dr7Y11VyxECBy2C4nP4kBO00VTByjEaOrOhCifX6bNQTIq2Dy5xGlqjdHhw==
│ │ │ │ │ │ ├── refs.0~kFpRFrgGEeBh9uvA-3MuJgNTSwW13Ow2V_3URBYMSH-0k4ZJ_Ox5K-g1rDuSOJ-gyMo87MiandTZsPmy75OOjA==
│ │ │ │ │ │ ├── refs.0~m7pxmLgHK4lUyl5MCRovwK5yQEJYHRKeM8lXOFR3ue1YinjywaoSK-44-WQRgl3aehIEkGCurIfn0hyHT63umw==
│ │ │ │ │ │ ├── refs.0~nqtjyxgscHiZYdt4Y8ICuh3SgKydPuah7I-GxreD8fGSkhEUXa0St_rRnKDM_k7wTDpMNkr5aAZxz0YpyZaoVA==
│ │ │ │ │ │ ├── refs.0~oNtXghNehRZ1Ttuy9I1ikWx2An-_WBLlr3Pl4wyb17Gp8o-Q28jEMYpDQgFCHlBeFaTy4wYd91bdDDD4voUmHg==
│ │ │ │ │ │ ├── refs.0~oRMi0sbQLktfDDDGUS-SqBKpdDiD6HCztVES_ShfGr0KVcYENoIq7y9oUSDWL5B_P2gkdtWG8JEsJLxPbdWOZA==
│ │ │ │ │ │ ├── refs.0~pf2ENc4jrljwDk1PKQibk8aX7ljZHyznLIpseS0jyHAeNqjrBTUHrz-vR-2mrclgBDnu04N8Q7a1qSBrGiDpWQ==
│ │ │ │ │ │ ├── refs.0~psoZXY0KQG2o1pHrYKVvMz7DK3EkxTM3VI7rWjLgKXzoFc_9-Kkzg1ieDlEop5425mPFShni4xZaGmwqTMacAQ==
│ │ │ │ │ │ ├── refs.0~qcUUa26y26YwdmhFZUEF5pH0pZuNwPkJ_KtAo-kEn6joYnjSzzg4le6ly8nG1TVKl26maTsIsmOig53j1fZyxg==
│ │ │ │ │ │ ├── refs.0~y5oK5BFKNIKCE8AkvHzMr-Aj11jJmHoG-Lz9wYUt93QIdefWc7TaJ6DWGiWngjJkRJ1XEJI7UQQpeLZk4gQ_Zw==
│ │ │ │ │ │ └── refs.0~yTk_0HmUrv4Tsf9SvkX3yAZwG9OgPBrR89Hy48TH2EoodJHqV_M7R3Lix9-tpSIqOVkv-GS8LXNsIkb5X7L1EA==
│ │ │ │ │ ├── Info.plist
│ │ │ │ │ └── database.sqlite3
│ │ │ │ ├── teamcity/
│ │ │ │ │ ├── teamcity.build.parameters
│ │ │ │ │ └── teamcity.config.parameters
│ │ │ │ └── xcresults-attachments/
│ │ │ │ └── manifest.json
│ │ │ ├── flags.lisp
│ │ │ ├── git-pack.lisp
│ │ │ ├── git.lisp
│ │ │ ├── gradle.lisp
│ │ │ ├── health-checks.lisp
│ │ │ ├── help.lisp
│ │ │ ├── hostname.lisp
│ │ │ ├── install.lisp
│ │ │ ├── installer.sh
│ │ │ ├── integration-fixture.lisp
│ │ │ ├── integration-tests.lisp
│ │ │ ├── main.lisp
│ │ │ ├── metadata.json
│ │ │ ├── package.lisp
│ │ │ ├── pull.lisp
│ │ │ ├── request.lisp
│ │ │ ├── run-context.lisp
│ │ │ ├── screenshotbot.sdk.asd
│ │ │ ├── scripts/
│ │ │ │ ├── .gitignore
│ │ │ │ └── gen-images.sh
│ │ │ ├── sdk-integration-tests-impl.lisp
│ │ │ ├── sdk-integration-tests.lisp
│ │ │ ├── sdk.lisp
│ │ │ ├── sentry.lisp
│ │ │ ├── server-log-appender.lisp
│ │ │ ├── static-example/
│ │ │ │ └── index.html
│ │ │ ├── static.lisp
│ │ │ ├── test-active-run.lisp
│ │ │ ├── test-android.lisp
│ │ │ ├── test-api-context.lisp
│ │ │ ├── test-backoff.lisp
│ │ │ ├── test-bundle.lisp
│ │ │ ├── test-cli-common.lisp
│ │ │ ├── test-clingon-api-context.lisp
│ │ │ ├── test-commit-graph.lisp
│ │ │ ├── test-env.lisp
│ │ │ ├── test-fetch-run.lisp
│ │ │ ├── test-firebase.lisp
│ │ │ ├── test-flags.lisp
│ │ │ ├── test-git-pack.lisp
│ │ │ ├── test-git.lisp
│ │ │ ├── test-installer.lisp
│ │ │ ├── test-main.lisp
│ │ │ ├── test-request.lisp
│ │ │ ├── test-run-context.lisp
│ │ │ ├── test-sdk.lisp
│ │ │ ├── test-sentry.lisp
│ │ │ ├── test-server-log-appender.lisp
│ │ │ ├── test-static.lisp
│ │ │ ├── test-unchanged-run.lisp
│ │ │ ├── test-version-check.lisp
│ │ │ ├── test-xcresult.lisp
│ │ │ ├── unchanged-run.lisp
│ │ │ ├── upload-commit-graph.lisp
│ │ │ ├── version-check.lisp
│ │ │ └── xcresult.lisp
│ │ ├── secret.lisp
│ │ ├── server.lisp
│ │ ├── settings/
│ │ │ ├── general.lisp
│ │ │ ├── security.lisp
│ │ │ ├── settings-template.lisp
│ │ │ ├── shares.lisp
│ │ │ └── test-security.lisp
│ │ ├── settings-api.lisp
│ │ ├── setup-oss.sh
│ │ ├── showkase/
│ │ │ ├── .gitignore
│ │ │ ├── Makefile
│ │ │ ├── deliver-showkase-libs.lisp
│ │ │ ├── instr/
│ │ │ │ ├── .gitignore
│ │ │ │ ├── app/
│ │ │ │ │ ├── build.gradle
│ │ │ │ │ └── src/
│ │ │ │ │ └── main/
│ │ │ │ │ ├── AndroidManifest.xml
│ │ │ │ │ ├── java/
│ │ │ │ │ │ └── io/
│ │ │ │ │ │ └── screenshotbot/
│ │ │ │ │ │ ├── ContainerFragment.java
│ │ │ │ │ │ ├── Factory.kt
│ │ │ │ │ │ ├── LispworksManager.java
│ │ │ │ │ │ ├── MainActivity.java
│ │ │ │ │ │ ├── PrimitiveWrapper.java
│ │ │ │ │ │ ├── SbInstrumentation.java
│ │ │ │ │ │ ├── SimpleNativeLibrary.java
│ │ │ │ │ │ ├── ViewOwner.java
│ │ │ │ │ │ ├── ViewOwners.java
│ │ │ │ │ │ └── Whitebox.java
│ │ │ │ │ └── res/
│ │ │ │ │ ├── drawable/
│ │ │ │ │ │ └── ic_launcher_background.xml
│ │ │ │ │ ├── drawable-v24/
│ │ │ │ │ │ └── ic_launcher_foreground.xml
│ │ │ │ │ ├── layout/
│ │ │ │ │ │ └── activity_main.xml
│ │ │ │ │ ├── mipmap-anydpi-v26/
│ │ │ │ │ │ ├── ic_launcher.xml
│ │ │ │ │ │ └── ic_launcher_round.xml
│ │ │ │ │ └── values/
│ │ │ │ │ ├── colors.xml
│ │ │ │ │ ├── strings.xml
│ │ │ │ │ └── styles.xml
│ │ │ │ ├── build.gradle
│ │ │ │ ├── gradle/
│ │ │ │ │ └── wrapper/
│ │ │ │ │ ├── gradle-wrapper.jar
│ │ │ │ │ └── gradle-wrapper.properties
│ │ │ │ ├── gradle.properties
│ │ │ │ ├── gradlew
│ │ │ │ ├── gradlew.bat
│ │ │ │ └── settings.gradle
│ │ │ ├── lib.lisp
│ │ │ ├── main.lisp
│ │ │ └── screenshotbot.showkase.asd
│ │ ├── site-admin.lisp
│ │ ├── slack/
│ │ │ ├── all.lisp
│ │ │ ├── core.lisp
│ │ │ ├── plugin.lisp
│ │ │ ├── rules-card.lisp
│ │ │ ├── rules.lisp
│ │ │ ├── settings.lisp
│ │ │ ├── task-integration.lisp
│ │ │ ├── test-core.lisp
│ │ │ ├── test-rules.lisp
│ │ │ ├── test-settings.lisp
│ │ │ └── test-task-integration.lisp
│ │ ├── sso/
│ │ │ ├── fake.lisp
│ │ │ ├── model.lisp
│ │ │ ├── redirect.lisp
│ │ │ └── settings.lisp
│ │ ├── static/
│ │ │ └── assets/
│ │ │ ├── css/
│ │ │ │ ├── aos.css
│ │ │ │ └── selenium.css
│ │ │ ├── images/
│ │ │ │ └── logos/
│ │ │ │ ├── logo-square-with-margin.xcf
│ │ │ │ └── text-logo-with-vertical-space.xcf
│ │ │ └── js/
│ │ │ ├── annotate.js
│ │ │ ├── aos.js
│ │ │ └── browser-tests.js
│ │ ├── task-integration-api.lisp
│ │ ├── tasks/
│ │ │ ├── common.lisp
│ │ │ └── test-common.lisp
│ │ ├── template.lisp
│ │ ├── test-abstract-pr-promoter.lisp
│ │ ├── test-analytics.lisp
│ │ ├── test-artifacts.lisp
│ │ ├── test-assets.lisp
│ │ ├── test-async.lisp
│ │ ├── test-audit-log.lisp
│ │ ├── test-batch-promoter.lisp
│ │ ├── test-billing-meter.lisp
│ │ ├── test-cdn.lisp
│ │ ├── test-config.lisp
│ │ ├── test-diff-report.lisp
│ │ ├── test-email-template.lisp
│ │ ├── test-git-repo.lisp
│ │ ├── test-installation.lisp
│ │ ├── test-invite.lisp
│ │ ├── test-promote-api.lisp
│ │ ├── test-raft-redirect.lisp
│ │ ├── test-secret.lisp
│ │ ├── test-server.lisp
│ │ ├── test-settings-api.lisp
│ │ ├── test-store.lisp
│ │ ├── test-template.lisp
│ │ ├── test-testing.lisp
│ │ ├── test-throttler.lisp
│ │ ├── test-uname.lisp
│ │ ├── testing.lisp
│ │ ├── thresholds/
│ │ │ ├── dsl.lisp
│ │ │ └── test-dsl.lisp
│ │ ├── throttler.lisp
│ │ ├── ui/
│ │ │ ├── all.lisp
│ │ │ └── core.lisp
│ │ ├── uname.lisp
│ │ ├── user-api.lisp
│ │ ├── utils.lisp
│ │ ├── web-build/
│ │ │ ├── browsers.lisp
│ │ │ ├── device-list.lisp
│ │ │ ├── project.lisp
│ │ │ ├── scheduler.lisp
│ │ │ ├── test-project.lisp
│ │ │ └── test-scheduler.lisp
│ │ ├── webdriver/
│ │ │ ├── all.lisp
│ │ │ ├── impl.lisp
│ │ │ ├── runner.lisp
│ │ │ ├── screenshot.lisp
│ │ │ └── test-screenshot.lisp
│ │ └── webhook/
│ │ ├── model.lisp
│ │ ├── settings.lisp
│ │ ├── test-model.lisp
│ │ ├── test-settings.lisp
│ │ ├── test-webhook.lisp
│ │ └── webhook.lisp
│ ├── screenshotbot.oss.tests.asd
│ ├── server/
│ │ ├── .gitignore
│ │ ├── Makefile
│ │ ├── acceptor-override.lisp
│ │ ├── cli.lisp
│ │ ├── cluster/
│ │ │ ├── cluster-init.lisp
│ │ │ ├── leadership.lisp
│ │ │ ├── peers.lisp
│ │ │ └── status.lisp
│ │ ├── config-cli.lisp
│ │ ├── config.lisp
│ │ ├── control-socket.lisp
│ │ ├── eval.lisp
│ │ ├── health-checks.lisp
│ │ ├── interrupts.lisp
│ │ ├── launch.c
│ │ ├── server.asd
│ │ ├── setup.lisp
│ │ ├── slynk-preparer.lisp
│ │ ├── test-config.lisp
│ │ ├── test-server.lisp
│ │ ├── test-slynk-preparer.lisp
│ │ ├── test-util.lisp
│ │ └── util.lisp
│ ├── test-runner/
│ │ ├── affected-systems.lisp
│ │ ├── build-test-runner.lisp
│ │ ├── test-runner.asd
│ │ └── test-runner.lisp
│ └── util/
│ ├── .gitattributes
│ ├── acceptor.lisp
│ ├── asdf.lisp
│ ├── atomics.lisp
│ ├── benchmark.lisp
│ ├── bind-form.lisp
│ ├── bknr-slynk.lisp
│ ├── cdn.lisp
│ ├── clsql/
│ │ ├── clsql.lisp
│ │ ├── libmariadb.so.3
│ │ └── libsqlite3.so.0.8.6
│ ├── cookies.lisp
│ ├── copy-file.lisp
│ ├── copying.lisp
│ ├── countries.csv
│ ├── countries.lisp
│ ├── cron.lisp
│ ├── debugger-hook.lisp
│ ├── digest.c
│ ├── digests-non-lw.lisp
│ ├── digests.lisp
│ ├── disk-size.lisp
│ ├── download-file.lisp
│ ├── emacs.lisp
│ ├── engines.lisp
│ ├── events.lisp
│ ├── fake-clingon.lisp
│ ├── fake-fli.lisp
│ ├── fiveam.lisp
│ ├── fixture/
│ │ └── file.txt
│ ├── form-errors.lisp
│ ├── form-state.lisp
│ ├── fset.lisp
│ ├── gcloud.lisp
│ ├── google-analytics.lisp
│ ├── hash-lock.lisp
│ ├── health-check.lisp
│ ├── html2text.lisp
│ ├── http-cache.lisp
│ ├── http-ping.lisp
│ ├── hunchentoot-engine.lisp
│ ├── java/
│ │ ├── all.lisp
│ │ ├── binding.lisp
│ │ ├── iterate.lisp
│ │ ├── java.lisp
│ │ ├── reader.lisp
│ │ ├── test-binding.lisp
│ │ ├── test-iterate.lisp
│ │ ├── test-java.lisp
│ │ └── util.java.asd
│ ├── json-mop.lisp
│ ├── logger.lisp
│ ├── logrotate.lisp
│ ├── lparallel.lisp
│ ├── lru-cache.lisp
│ ├── mail.lisp
│ ├── make-instance-with-accessors.lisp
│ ├── memory.lisp
│ ├── misc/
│ │ ├── lists.lisp
│ │ ├── misc.lisp
│ │ ├── test-lists.lisp
│ │ ├── test-misc.lisp
│ │ └── util.misc.asd
│ ├── mock-recording.lisp
│ ├── mockable.lisp
│ ├── mquery.lisp
│ ├── native-module.lisp
│ ├── package.lisp
│ ├── payment-method.lisp
│ ├── phabricator/
│ │ ├── conduit.lisp
│ │ ├── fixture/
│ │ │ ├── create-artifact.rec
│ │ │ ├── upload-file.rec
│ │ │ └── upload-large-file.rec
│ │ ├── harbormaster.lisp
│ │ ├── maniphest.lisp
│ │ ├── passphrase.lisp
│ │ ├── phabricator.el
│ │ ├── project.lisp
│ │ ├── test-conduit.lisp
│ │ └── test-harbormaster.lisp
│ ├── posix.lisp
│ ├── random-port.lisp
│ ├── rb-tree.lisp
│ ├── recaptcha.lisp
│ ├── remote-debugging.lisp
│ ├── request.lisp
│ ├── ret-let.lisp
│ ├── reused-ssl.lisp
│ ├── schema/
│ │ ├── core.lisp
│ │ └── history.lisp
│ ├── simple-queue.lisp
│ ├── sizeof.lisp
│ ├── ssl.lisp
│ ├── states.csv
│ ├── statsig/
│ │ ├── statsig.lisp
│ │ ├── test-statsig.lisp
│ │ └── util.statsig.asd
│ ├── store/
│ │ ├── aws-store.lisp
│ │ ├── benchmarks.lisp
│ │ ├── checksums.lisp
│ │ ├── clone-logs-store.lisp
│ │ ├── delayed-accessors.lisp
│ │ ├── elb-store.lisp
│ │ ├── encodable.lisp
│ │ ├── export.lisp
│ │ ├── fset-index.lisp
│ │ ├── fset.lisp
│ │ ├── migrations.lisp
│ │ ├── object-id.lisp
│ │ ├── permissive-persistent-class.lisp
│ │ ├── raft-state-http.lisp
│ │ ├── simple-object-snapshot.lisp
│ │ ├── single.lisp
│ │ ├── slot-subsystem.lisp
│ │ ├── store-migrations.lisp
│ │ ├── store-version.lisp
│ │ ├── store.lisp
│ │ ├── summing-index.lisp
│ │ ├── sync.lisp
│ │ ├── test-checksums.lisp
│ │ ├── test-delayed-accessors.lisp
│ │ ├── test-encodable.lisp
│ │ ├── test-fset-index.lisp
│ │ ├── test-fset.lisp
│ │ ├── test-migrations.lisp
│ │ ├── test-objectid.lisp
│ │ ├── test-permissive-persistent-class.lisp
│ │ ├── test-raft-state-http.lisp
│ │ ├── test-simple-object-snapshot.lisp
│ │ ├── test-single.lisp
│ │ ├── test-slot-subsystem.lisp
│ │ ├── test-store-version.lisp
│ │ ├── test-store.lisp
│ │ ├── test-summing-index.lisp
│ │ ├── test-sync.lisp
│ │ ├── test-validate.lisp
│ │ ├── util.store.asd
│ │ └── validate.lisp
│ ├── symbol-detector.lisp
│ ├── test-file.txt
│ ├── testing/
│ │ ├── test-testing.lisp
│ │ ├── testing.lisp
│ │ └── util.testing.asd
│ ├── tests/
│ │ ├── test-asdf.lisp
│ │ ├── test-benchmark.lisp
│ │ ├── test-bind-form.lisp
│ │ ├── test-cdn.lisp
│ │ ├── test-cookies.lisp
│ │ ├── test-copy-file.lisp
│ │ ├── test-digests.lisp
│ │ ├── test-disk-size.lisp
│ │ ├── test-events.lisp
│ │ ├── test-fake-clingon.lisp
│ │ ├── test-fake-fli.lisp
│ │ ├── test-fiveam.lisp
│ │ ├── test-fset.lisp
│ │ ├── test-hash-lock.lisp
│ │ ├── test-health-check.lisp
│ │ ├── test-html2text.lisp
│ │ ├── test-hunchentoot-engine.lisp
│ │ ├── test-json-mop.lisp
│ │ ├── test-lispworks.lisp
│ │ ├── test-logger.lisp
│ │ ├── test-lparallel.lisp
│ │ ├── test-lru-cache.lisp
│ │ ├── test-mail.lisp
│ │ ├── test-make-instance-with-accessors.lisp
│ │ ├── test-memory.lisp
│ │ ├── test-mock-recording.lisp
│ │ ├── test-mockable.lisp
│ │ ├── test-models.lisp
│ │ ├── test-mquery.lisp
│ │ ├── test-random-port.lisp
│ │ ├── test-rb-tree.lisp
│ │ ├── test-request-integration.lisp
│ │ ├── test-request.lisp
│ │ ├── test-ret-let.lisp
│ │ ├── test-reused-ssl.lisp
│ │ ├── test-simple-queue.lisp
│ │ ├── test-sizeof.lisp
│ │ ├── test-ssl.lisp
│ │ ├── test-throttler.lisp
│ │ ├── test-timeago.lisp
│ │ └── test-truncated-stream.lisp
│ ├── threading/
│ │ ├── fake-mp.lisp
│ │ ├── tests/
│ │ │ └── test-threading.lisp
│ │ ├── threading.lisp
│ │ └── util.threading.asd
│ ├── throttler.lisp
│ ├── timeago.lisp
│ ├── tools.el
│ ├── truncated-stream.lisp
│ ├── utf-8.lisp
│ ├── util.asd
│ └── uuid.lisp
└── third-party/
├── asn1/
│ ├── README.md
│ ├── asn1.asd
│ ├── decode.lisp
│ ├── encode.lisp
│ ├── format/
│ │ ├── public-key.lisp
│ │ └── rsa.lisp
│ ├── main.lisp
│ └── tests/
│ └── main.lisp
├── bknr.datastore/
│ ├── .gitignore
│ ├── README.mkdn
│ ├── doc/
│ │ ├── 1_introduction.txt
│ │ ├── 2_guided_tour.txt
│ │ ├── Makefile
│ │ ├── README-orig
│ │ ├── TODO
│ │ ├── example.tex
│ │ ├── guidedtour.tex
│ │ ├── introduction.tex
│ │ ├── manual.tex
│ │ ├── schleuder-artikel.txt
│ │ ├── templates.tex
│ │ └── web.tex
│ ├── experimental/
│ │ ├── dump-core.lisp
│ │ ├── fswrap/
│ │ │ ├── fsd.pl
│ │ │ ├── fswrap.c
│ │ │ └── fswrap.lisp
│ │ ├── mop-bug.lisp
│ │ ├── shop/
│ │ │ ├── money.lisp
│ │ │ └── shop.lisp
│ │ ├── slot-attributes.lisp
│ │ └── xml-schema/
│ │ ├── examples/
│ │ │ ├── test-schema.xml
│ │ │ └── test-schema2.xml
│ │ └── xml-schema.lisp
│ ├── license.txt
│ ├── patches/
│ │ └── patch-around-mop-cmucl19.lisp
│ └── src/
│ ├── bknr.data.impex.asd
│ ├── bknr.datastore.asd
│ ├── bknr.impex.asd
│ ├── bknr.indices.asd
│ ├── bknr.skip-list.asd
│ ├── bknr.utils.asd
│ ├── bknr.xml.asd
│ ├── data/
│ │ ├── TODO
│ │ ├── blob.lisp
│ │ ├── convert.lisp
│ │ ├── encoding-test.lisp
│ │ ├── encoding.lisp
│ │ ├── json.lisp
│ │ ├── object-tests.lisp
│ │ ├── object.lisp
│ │ ├── package.lisp
│ │ ├── tests.lisp
│ │ ├── tutorial.lisp
│ │ ├── txn.lisp
│ │ ├── xml-object.lisp
│ │ └── xml-tutorial.lisp
│ ├── indices/
│ │ ├── TODO
│ │ ├── category-index.lisp
│ │ ├── indexed-class.lisp
│ │ ├── indices-tests.lisp
│ │ ├── indices.lisp
│ │ ├── package.lisp
│ │ ├── protocol.lisp
│ │ └── tutorial.lisp
│ ├── skip-list/
│ │ ├── package.lisp
│ │ ├── skip-list-tests.lisp
│ │ └── skip-list.lisp
│ ├── statistics/
│ │ ├── package.lisp
│ │ └── runtime-statistics.lisp
│ ├── utils/
│ │ ├── Makefile
│ │ ├── acl-mp-compat.lisp
│ │ ├── actor.lisp
│ │ ├── capability.lisp
│ │ ├── class.lisp
│ │ ├── crypt-md5.lisp
│ │ ├── date-calc.lisp
│ │ ├── make-fdf-file.lisp
│ │ ├── package.lisp
│ │ ├── parse-time.lisp
│ │ ├── pathnames.lisp
│ │ ├── reader.lisp
│ │ ├── smbpasswd-wrapper.c
│ │ ├── smbpasswd.lisp
│ │ ├── utils.lisp
│ │ └── xml.lisp
│ ├── xml/
│ │ ├── package.lisp
│ │ └── xml.lisp
│ └── xml-impex/
│ ├── package.lisp
│ ├── tutorial.dtd
│ ├── tutorial.lisp
│ ├── tutorial.xml
│ ├── tutorial2.dtd
│ ├── tutorial2.xml
│ ├── tutorial3.dtd
│ ├── tutorial3.xml
│ ├── tutorial4.dtd
│ ├── tutorial4.xml
│ ├── tutorial5.dtd
│ ├── tutorial5.xml
│ ├── xml-class.lisp
│ ├── xml-export.lisp
│ ├── xml-import.lisp
│ └── xml-update.lisp
├── cl+j-0.4/
│ ├── Copyright
│ ├── cl+j.asd
│ ├── cl+j.lisp
│ ├── cl+j_pkg.lisp
│ ├── cl+swt.asd
│ ├── cl_j/
│ │ ├── LispCondition.java
│ │ ├── RunInLisp.java
│ │ └── swt/
│ │ └── LispListener.java
│ ├── cl_j.jar
│ ├── demos/
│ │ ├── CCL/
│ │ │ ├── hello_swing_on_ccl.lisp
│ │ │ ├── hello_swt.lisp
│ │ │ ├── java_REPL/
│ │ │ │ ├── EndOfReplException.java
│ │ │ │ ├── EvalAbortedException.java
│ │ │ │ ├── HelloLispWorld.java
│ │ │ │ ├── LispRef.java
│ │ │ │ ├── ReplFromJava.java
│ │ │ │ ├── java_lisp_ref.lisp
│ │ │ │ ├── java_repl.lisp
│ │ │ │ └── test_java_callback.lisp
│ │ │ └── swt_buttons.lisp
│ │ ├── HelloSWT.java
│ │ ├── HelloSwing.java
│ │ ├── Jabber.lisp
│ │ ├── hello_swing.lisp
│ │ ├── hello_swt.lisp
│ │ ├── java_REPL/
│ │ │ ├── EndOfReplException.java
│ │ │ ├── EvalAbortedException.java
│ │ │ ├── HelloLispWorld.java
│ │ │ ├── LispRef.java
│ │ │ ├── ReplFromJava.java
│ │ │ ├── java_lisp_ref.lisp
│ │ │ ├── java_repl.lisp
│ │ │ └── test_java_callback.lisp
│ │ ├── jfli_example.lisp
│ │ └── swt_buttons.lisp
│ ├── java_adapter.lisp
│ ├── java_callback.lisp
│ ├── jni.lisp
│ ├── reference.lisp
│ ├── sbcl_repl.lisp
│ ├── swt_adapter.lisp
│ ├── swt_adapter_for_ccl.lisp
│ └── vtable.lisp
├── cl-gravatar/
│ ├── LICENSE.txt
│ ├── README.mkdn
│ ├── gravatar.asd
│ ├── gravatar.lisp
│ └── package.lisp
├── cl-libssh2/
│ ├── .gitignore
│ ├── .travis.yml
│ ├── LICENSE
│ ├── examples.lisp
│ ├── libssh2.asd
│ ├── libssh2.test.asd
│ ├── src/
│ │ ├── libssh2-cffi.lisp
│ │ ├── libssh2-libc-cffi.lisp
│ │ ├── logging.lisp
│ │ ├── package.lisp
│ │ ├── scp.lisp
│ │ ├── sftp.lisp
│ │ ├── solutions.lisp
│ │ ├── streams.lisp
│ │ ├── types.lisp
│ │ └── util.lisp
│ └── test/
│ ├── data/
│ │ └── testfile.tgz
│ ├── package.lisp
│ ├── scp.lisp
│ └── sftp.lisp
├── damn-fast-priority-queue/
│ ├── .gitignore
│ ├── README.md
│ ├── damn-fast-priority-queue/
│ │ ├── damn-fast-priority-queue.asd
│ │ ├── src.lisp
│ │ └── test.lisp
│ ├── damn-fast-stable-priority-queue/
│ │ ├── damn-fast-stable-priority-queue.asd
│ │ ├── src.lisp
│ │ ├── test-distinct.lisp
│ │ ├── test-same.lisp
│ │ └── test.lisp
│ └── priority-queue-benchmark/
│ ├── README.md
│ ├── benchmark.lisp
│ └── priority-queue-benchmark.asd
├── fiveam/
│ ├── .boring
│ ├── .travis.yml
│ ├── COPYING
│ ├── README
│ ├── docs/
│ │ └── make-qbook.lisp
│ ├── fiveam.asd
│ ├── src/
│ │ ├── check.lisp
│ │ ├── classes.lisp
│ │ ├── explain.lisp
│ │ ├── fixture.lisp
│ │ ├── package.lisp
│ │ ├── random.lisp
│ │ ├── run.lisp
│ │ ├── style.css
│ │ ├── suite.lisp
│ │ ├── test.lisp
│ │ └── utils.lisp
│ ├── t/
│ │ ├── example.lisp
│ │ └── tests.lisp
│ └── version.sexp
├── hunchensocket/
│ ├── .travis.yml
│ ├── COPYING
│ ├── README.md
│ ├── VERSION
│ ├── demo.lisp
│ ├── hunchensocket-tests.lisp
│ ├── hunchensocket.asd
│ ├── hunchensocket.lisp
│ └── package.lisp
├── hunchentoot-multi-acceptor/
│ ├── .gitignore
│ ├── LICENSE
│ ├── README.md
│ ├── hunchentoot-multi-acceptor.asd
│ ├── hunchentoot-multi-acceptor.lisp
│ ├── package.lisp
│ └── test-hunchentoot-multi-acceptor.lisp
├── json-mop/
│ ├── .github/
│ │ └── workflows/
│ │ └── CI.yml
│ ├── COPYING
│ ├── README.md
│ ├── json-mop.asd
│ ├── src/
│ │ ├── conditions.lisp
│ │ ├── json-mop.lisp
│ │ ├── package.lisp
│ │ ├── to-json.lisp
│ │ └── to-lisp.lisp
│ └── tests/
│ ├── encode-decode.lisp
│ ├── json-mop-tests.asd
│ ├── package.lisp
│ └── tests.lisp
├── pem/
│ ├── README.md
│ ├── main.lisp
│ ├── parser.lisp
│ ├── pem.asd
│ └── pkey.lisp
└── sentry/
└── sentry-js.asd
================================================
FILE CONTENTS
================================================
================================================
FILE: .circleci/config.yml
================================================
version: 2.1
jobs:
build:
docker:
- image: debian:trixie
steps:
- run: &install_deps
name: Install Deps
command: |
whoami
apt-get update
apt-get install -y build-essential sbcl libssh2-1-dev ssh git sudo curl pkg-config
apt-get install -y imagemagick libmagickwand-dev
apt-get install -y openjdk-21-jdk-headless
- checkout
- run:
name: SBCL tests
command: |
make test-sb
- run:
name: build-cli
command: |
sbcl --script scripts/build-cli.lisp
- run:
name: Upload assets for Screenshots
command: |
make upload-screenshots-oss
launch:
docker:
- image: debian:trixie
steps:
- run:
<<: *install_deps
- checkout
- run:
name: Launch Screenshotbot
command: |
mkdir -p ~/.config/screenshotbot/object-store/current/
sbcl --script launch.lisp --verify-store
build_cli:
docker:
- image: debian:trixie
steps:
- run:
<<: *install_deps
- checkout
- run:
name: Build CLI
command: |
sbcl --script scripts/build-cli.lisp
workflows:
tests:
jobs:
- build
launch:
jobs:
- launch
build_cli:
jobs:
- build_cli
================================================
FILE: .dockerignore
================================================
bazel-*
*.pyc
.#*
log/*
supervise
jipr/static/binary/
jipr/static/releases/
pictures for sam
gallery-uploads
web-bin
.web-bin-copy
*ansi-term*
system-index.txt
.sass-cache
repl.lisp-repl
*.64ufasl
*.fasl
config.lisp
build
/assets
screenshotbot-installer.sh
analytics-log-file.log
*.lx64fsl
.git
buck-out
quicklisp
src
local-projects
tools
log
analytics-log-file.log
.buckd
================================================
FILE: .gitattributes
================================================
*.lisp text eol=lf
*.txt text eol=lf
================================================
FILE: .gitignore
================================================
bazel-*
*.pyc
.#*
log/*
supervise
jipr/static/binary/
jipr/static/releases/
pictures for sam
gallery-uploads
web-bin
.web-bin-copy
*ansi-term*
system-index.txt
.sass-cache
repl.lisp-repl
*.64ufasl
*.64ofasl
*.fasl
/config.lisp
/build
/assets
screenshotbot-installer.sh
analytics-log-file.log
*.lx64fsl
.moma.yml
*.64xfasl
nohup.out
sandbox
*~
*.64yfasl
# competitive programming
input
buck-out
.buckd
dummy-input
.buckconfig.local
static-web-output
amazon-acceptance-test.zip
tmp-upload
.secrets
.qlot
.vagrant
.env
a.out
cl-cron.log
# HubSpot config file
hubspot.config.yml
screenshotbot-cli
/pixel-diff
.DS_Store
pixel-diff.app
pixel-diff.zip
pixel-diff-notarization.zip
pixel-diff.lwheap
ansible.log
nfs-disk.vdi
# Arcanist phutil cache files
.phutil_module_cache
screenshotbot*.deb
vagrant-efs
*fasl
================================================
FILE: Dockerfile
================================================
FROM debian:trixie AS magick_base
RUN apt-get update && apt-get install -y libyaml-dev git-core libpng-dev zlib1g-dev libpng16-16 zlib1g gcc makeself exiftool build-essential logrotate sbcl pkg-config imagemagick libmagickwand-dev
RUN apt-get update && apt-get install -y openjdk-21-jdk-headless
FROM magick_base AS builder
# Update copybara config if you change this line
WORKDIR /app
ENTRYPOINT ["sbcl", "--script", "launch.lisp"]
CMD ["--object-store", "/data/", "--start-slynk", "--slynk-port", "4005", "--slynk-loopback-interface", "0.0.0.0"]
================================================
FILE: LICENSE
================================================
Mozilla Public License Version 2.0
==================================
1. Definitions
--------------
1.1. "Contributor"
means each individual or legal entity that creates, contributes to
the creation of, or owns Covered Software.
1.2. "Contributor Version"
means the combination of the Contributions of others (if any) used
by a Contributor and that particular Contributor's Contribution.
1.3. "Contribution"
means Covered Software of a particular Contributor.
1.4. "Covered Software"
means Source Code Form to which the initial Contributor has attached
the notice in Exhibit A, the Executable Form of such Source Code
Form, and Modifications of such Source Code Form, in each case
including portions thereof.
1.5. "Incompatible With Secondary Licenses"
means
(a) that the initial Contributor has attached the notice described
in Exhibit B to the Covered Software; or
(b) that the Covered Software was made available under the terms of
version 1.1 or earlier of the License, but not also under the
terms of a Secondary License.
1.6. "Executable Form"
means any form of the work other than Source Code Form.
1.7. "Larger Work"
means a work that combines Covered Software with other material, in
a separate file or files, that is not Covered Software.
1.8. "License"
means this document.
1.9. "Licensable"
means having the right to grant, to the maximum extent possible,
whether at the time of the initial grant or subsequently, any and
all of the rights conveyed by this License.
1.10. "Modifications"
means any of the following:
(a) any file in Source Code Form that results from an addition to,
deletion from, or modification of the contents of Covered
Software; or
(b) any new file in Source Code Form that contains any Covered
Software.
1.11. "Patent Claims" of a Contributor
means any patent claim(s), including without limitation, method,
process, and apparatus claims, in any patent Licensable by such
Contributor that would be infringed, but for the grant of the
License, by the making, using, selling, offering for sale, having
made, import, or transfer of either its Contributions or its
Contributor Version.
1.12. "Secondary License"
means either the GNU General Public License, Version 2.0, the GNU
Lesser General Public License, Version 2.1, the GNU Affero General
Public License, Version 3.0, or any later versions of those
licenses.
1.13. "Source Code Form"
means the form of the work preferred for making modifications.
1.14. "You" (or "Your")
means an individual or a legal entity exercising rights under this
License. For legal entities, "You" includes any entity that
controls, is controlled by, or is under common control with You. For
purposes of this definition, "control" means (a) the power, direct
or indirect, to cause the direction or management of such entity,
whether by contract or otherwise, or (b) ownership of more than
fifty percent (50%) of the outstanding shares or beneficial
ownership of such entity.
2. License Grants and Conditions
--------------------------------
2.1. Grants
Each Contributor hereby grants You a world-wide, royalty-free,
non-exclusive license:
(a) under intellectual property rights (other than patent or trademark)
Licensable by such Contributor to use, reproduce, make available,
modify, display, perform, distribute, and otherwise exploit its
Contributions, either on an unmodified basis, with Modifications, or
as part of a Larger Work; and
(b) under Patent Claims of such Contributor to make, use, sell, offer
for sale, have made, import, and otherwise transfer either its
Contributions or its Contributor Version.
2.2. Effective Date
The licenses granted in Section 2.1 with respect to any Contribution
become effective for each Contribution on the date the Contributor first
distributes such Contribution.
2.3. Limitations on Grant Scope
The licenses granted in this Section 2 are the only rights granted under
this License. No additional rights or licenses will be implied from the
distribution or licensing of Covered Software under this License.
Notwithstanding Section 2.1(b) above, no patent license is granted by a
Contributor:
(a) for any code that a Contributor has removed from Covered Software;
or
(b) for infringements caused by: (i) Your and any other third party's
modifications of Covered Software, or (ii) the combination of its
Contributions with other software (except as part of its Contributor
Version); or
(c) under Patent Claims infringed by Covered Software in the absence of
its Contributions.
This License does not grant any rights in the trademarks, service marks,
or logos of any Contributor (except as may be necessary to comply with
the notice requirements in Section 3.4).
2.4. Subsequent Licenses
No Contributor makes additional grants as a result of Your choice to
distribute the Covered Software under a subsequent version of this
License (see Section 10.2) or under the terms of a Secondary License (if
permitted under the terms of Section 3.3).
2.5. Representation
Each Contributor represents that the Contributor believes its
Contributions are its original creation(s) or it has sufficient rights
to grant the rights to its Contributions conveyed by this License.
2.6. Fair Use
This License is not intended to limit any rights You have under
applicable copyright doctrines of fair use, fair dealing, or other
equivalents.
2.7. Conditions
Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted
in Section 2.1.
3. Responsibilities
-------------------
3.1. Distribution of Source Form
All distribution of Covered Software in Source Code Form, including any
Modifications that You create or to which You contribute, must be under
the terms of this License. You must inform recipients that the Source
Code Form of the Covered Software is governed by the terms of this
License, and how they can obtain a copy of this License. You may not
attempt to alter or restrict the recipients' rights in the Source Code
Form.
3.2. Distribution of Executable Form
If You distribute Covered Software in Executable Form then:
(a) such Covered Software must also be made available in Source Code
Form, as described in Section 3.1, and You must inform recipients of
the Executable Form how they can obtain a copy of such Source Code
Form by reasonable means in a timely manner, at a charge no more
than the cost of distribution to the recipient; and
(b) You may distribute such Executable Form under the terms of this
License, or sublicense it under different terms, provided that the
license for the Executable Form does not attempt to limit or alter
the recipients' rights in the Source Code Form under this License.
3.3. Distribution of a Larger Work
You may create and distribute a Larger Work under terms of Your choice,
provided that You also comply with the requirements of this License for
the Covered Software. If the Larger Work is a combination of Covered
Software with a work governed by one or more Secondary Licenses, and the
Covered Software is not Incompatible With Secondary Licenses, this
License permits You to additionally distribute such Covered Software
under the terms of such Secondary License(s), so that the recipient of
the Larger Work may, at their option, further distribute the Covered
Software under the terms of either this License or such Secondary
License(s).
3.4. Notices
You may not remove or alter the substance of any license notices
(including copyright notices, patent notices, disclaimers of warranty,
or limitations of liability) contained within the Source Code Form of
the Covered Software, except that You may alter any license notices to
the extent required to remedy known factual inaccuracies.
3.5. Application of Additional Terms
You may choose to offer, and to charge a fee for, warranty, support,
indemnity or liability obligations to one or more recipients of Covered
Software. However, You may do so only on Your own behalf, and not on
behalf of any Contributor. You must make it absolutely clear that any
such warranty, support, indemnity, or liability obligation is offered by
You alone, and You hereby agree to indemnify every Contributor for any
liability incurred by such Contributor as a result of warranty, support,
indemnity or liability terms You offer. You may include additional
disclaimers of warranty and limitations of liability specific to any
jurisdiction.
4. Inability to Comply Due to Statute or Regulation
---------------------------------------------------
If it is impossible for You to comply with any of the terms of this
License with respect to some or all of the Covered Software due to
statute, judicial order, or regulation then You must: (a) comply with
the terms of this License to the maximum extent possible; and (b)
describe the limitations and the code they affect. Such description must
be placed in a text file included with all distributions of the Covered
Software under this License. Except to the extent prohibited by statute
or regulation, such description must be sufficiently detailed for a
recipient of ordinary skill to be able to understand it.
5. Termination
--------------
5.1. The rights granted under this License will terminate automatically
if You fail to comply with any of its terms. However, if You become
compliant, then the rights granted under this License from a particular
Contributor are reinstated (a) provisionally, unless and until such
Contributor explicitly and finally terminates Your grants, and (b) on an
ongoing basis, if such Contributor fails to notify You of the
non-compliance by some reasonable means prior to 60 days after You have
come back into compliance. Moreover, Your grants from a particular
Contributor are reinstated on an ongoing basis if such Contributor
notifies You of the non-compliance by some reasonable means, this is the
first time You have received notice of non-compliance with this License
from such Contributor, and You become compliant prior to 30 days after
Your receipt of the notice.
5.2. If You initiate litigation against any entity by asserting a patent
infringement claim (excluding declaratory judgment actions,
counter-claims, and cross-claims) alleging that a Contributor Version
directly or indirectly infringes any patent, then the rights granted to
You by any and all Contributors for the Covered Software under Section
2.1 of this License shall terminate.
5.3. In the event of termination under Sections 5.1 or 5.2 above, all
end user license agreements (excluding distributors and resellers) which
have been validly granted by You or Your distributors under this License
prior to termination shall survive termination.
************************************************************************
* *
* 6. Disclaimer of Warranty *
* ------------------------- *
* *
* Covered Software is provided under this License on an "as is" *
* basis, without warranty of any kind, either expressed, implied, or *
* statutory, including, without limitation, warranties that the *
* Covered Software is free of defects, merchantable, fit for a *
* particular purpose or non-infringing. The entire risk as to the *
* quality and performance of the Covered Software is with You. *
* Should any Covered Software prove defective in any respect, You *
* (not any Contributor) assume the cost of any necessary servicing, *
* repair, or correction. This disclaimer of warranty constitutes an *
* essential part of this License. No use of any Covered Software is *
* authorized under this License except under this disclaimer. *
* *
************************************************************************
************************************************************************
* *
* 7. Limitation of Liability *
* -------------------------- *
* *
* Under no circumstances and under no legal theory, whether tort *
* (including negligence), contract, or otherwise, shall any *
* Contributor, or anyone who distributes Covered Software as *
* permitted above, be liable to You for any direct, indirect, *
* special, incidental, or consequential damages of any character *
* including, without limitation, damages for lost profits, loss of *
* goodwill, work stoppage, computer failure or malfunction, or any *
* and all other commercial damages or losses, even if such party *
* shall have been informed of the possibility of such damages. This *
* limitation of liability shall not apply to liability for death or *
* personal injury resulting from such party's negligence to the *
* extent applicable law prohibits such limitation. Some *
* jurisdictions do not allow the exclusion or limitation of *
* incidental or consequential damages, so this exclusion and *
* limitation may not apply to You. *
* *
************************************************************************
8. Litigation
-------------
Any litigation relating to this License may be brought only in the
courts of a jurisdiction where the defendant maintains its principal
place of business and such litigation shall be governed by laws of that
jurisdiction, without reference to its conflict-of-law provisions.
Nothing in this Section shall prevent a party's ability to bring
cross-claims or counter-claims.
9. Miscellaneous
----------------
This License represents the complete agreement concerning the subject
matter hereof. If any provision of this License is held to be
unenforceable, such provision shall be reformed only to the extent
necessary to make it enforceable. Any law or regulation which provides
that the language of a contract shall be construed against the drafter
shall not be used to construe this License against a Contributor.
10. Versions of the License
---------------------------
10.1. New Versions
Mozilla Foundation is the license steward. Except as provided in Section
10.3, no one other than the license steward has the right to modify or
publish new versions of this License. Each version will be given a
distinguishing version number.
10.2. Effect of New Versions
You may distribute the Covered Software under the terms of the version
of the License under which You originally received the Covered Software,
or under the terms of any subsequent version published by the license
steward.
10.3. Modified Versions
If you create software not governed by this License, and you want to
create a new license for such software, you may create and use a
modified version of this License if you rename the license and remove
any references to the name of the license steward (except to note that
such modified license differs from this License).
10.4. Distributing Source Code Form that is Incompatible With Secondary
Licenses
If You choose to distribute Source Code Form that is Incompatible With
Secondary Licenses under the terms of this version of the License, the
notice described in Exhibit B of this License must be attached.
Exhibit A - Source Code Form License Notice
-------------------------------------------
This Source Code Form is subject to the terms of the Mozilla Public
License, v. 2.0. If a copy of the MPL was not distributed with this
file, You can obtain one at https://mozilla.org/MPL/2.0/.
If it is not possible or desirable to put the notice in a particular
file, then You may include the notice in a location (such as a LICENSE
file in a relevant directory) where a recipient would be likely to look
for such a notice.
You may add additional accurate notices of copyright ownership.
Exhibit B - "Incompatible With Secondary Licenses" Notice
---------------------------------------------------------
This Source Code Form is "Incompatible With Secondary Licenses", as
defined by the Mozilla Public License, v. 2.0.
================================================
FILE: Makefile
================================================
# Copyright 2018-Present Modern Interpreters Inc.
#
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
SBCL_C_FLAGS=--dynamic-space-size 2048
sbcl=build/sbcl-console
CACHE_KEY=12
SBCL_CORE=sbcl $(SBCL_C_FLAGS) --no-userinit
CCL_DEFAULT_DIRECTORY?=/opt/software/ccl
CCL_CORE=$(CCL_DEFAULT_DIRECTORY)/lx86cl64
CCL_IMAGE=build/ccl-console
tests= \
./test-stuff.lisp \
./test-stuff2.lisp
ARCH?=
ARCH_CMD=
ifeq ($(ARCH),x86_64)
ARCH_CMD=arch -$(ARCH)
endif
LW_PREFIX=/opt/software/lispworks
ifeq ($(UNAME),Linux)
define timeout
timeout $1
endef
define timeout
endef
else
endif
define wild_src
$(call FIND,$(SRC_DIRS), $(1))
endef
JIPR=../jippo
SRC_DIRS=src local-projects third-party scripts quicklisp
LISP_FILES=$(call wild_src, '*.lisp') $(call wild_src, '*.asd') $(call will_src,'*.c') $(call wild_src,'*.cpp')
JS_FILES=$(call wild_src, '*.js')
CSS_FILES=$(call wild_src, '*.css') $(call wild_src, '*.scss')
LW_SCRIPT=PATH=/opt/homebrew/bin:$$PATH $(call timeout,15m) $(LW) -quiet -build
SBCL_SCRIPT=$(sbcl) --script
TMPFILE=$(shell mktemp)
JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64/
SBCL_SCRIPT=$(call timeout,5m) $(sbcl) --script
CCL_SCRIPT=CCL_DEFAULT_DIRECTORY=$(CCL_DEFAULT_DIRECTORY) $(CCL_CORE) -b -I $(CCL_IMAGE)
QUICKLISP=quicklisp/dists/quicklisp/
COPYBARA_CMD=java -jar scripts/copybara_deploy.jar
define COPYBARA
( $(COPYBARA_CMD) copy.bara.sky $1 | tee build/cb-output ) || grep "No new changes to import" build/cb-output
endef
ifeq ($(OS), Windows_NT)
UNAME=Windows
MKDIR=mkdir -pf
TOUCH=powershell -command New-Item
FIND=$(shell gci -r $2 | Select FullName)
RM=echo
else
UNAME=$(shell uname -s)
MKDIR=mkdir -p
TOUCH=touch
FIND=$(shell find $(1) -name $(2))
RM=rm -f
endif
CYGWIN=$(findstring CYGWIN,$(UNAME))
DISTINFO=quicklisp/dists/quicklisp/distinfo.txt
ARC=build/arc/bin/arc
REVISION_ID=$(shell echo '{"ids":["$(DIFF_ID)"]}' | $(ARC) call-conduit differential.querydiffs -- | jq -r '.["response"]["$(DIFF_ID)"]["revisionID"]')
QUICKLISP_DEPS=$(call FIND,quicklisp,'*.txt') $(call FIND,quicklisp,'*.lisp')
IMAGE_DEPS=scripts/build-image.lisp scripts/asdf.lisp $(DISTINFO) scripts/prepare-image.lisp scripts/init.lisp scripts/asdf.lisp $(QUICKLISP_DEPS)
define ht_check_tests
TMP=$(TMPFILE) && $1 | tee $$TMP && grep "all tests PASSED" $$TMP && rm $$TMP
endef
include scripts/lispworks-versions.mk
ifneq ("$(wildcard scripts/common.mk)", "")
include scripts/common.mk
endif
all:
true
submodule:
# git submodule init
# git submodule update
build/cache-key: .PHONY
ifneq ($(OS),Windows_NT)
if ! [ -e build/cache-key ] || ! [ x`cat build/cache-key` = x$(CACHE_KEY) ] ; then \
echo "Cleaning build/ directory" ; \
rm -rf build/asdf-cache build/slime-fasls ; \
rm -rf quicklisp/dists/quicklisp/software ; \
mkdir build ; \
echo $(CACHE_KEY) > $@ ; \
fi
else
# TODO: detect the cache-key correctly, currently you have to manually delete this file to reset
if not exist build mkdir build
if not exist $@ ( echo $(CACHE_KEY) > $@ )
endif
.PHONY:
update-quicklisp: .PHONY
$(SBCL_CORE) --eval '(load "quicklisp/setup.lisp")' --eval '(ql:update-all-dists :prompt nil)' --quit
update-quicklisp-client: .PHONY
$(SBCL_CORE) --eval '(load "quicklisp/setup.lisp")' --eval '(ql:update-client :prompt nil)' --quit
start-dev: $(sbcl)
$(sbcl) --script ./start-dev.lisp
install-dep: install-dep.lisp $(sbcl)
$(sbcl) --script ./install-dep.lisp
show-info:
git status
env
clean-sys-index:
rm -f system-index.txt
rm -rfv local-projects/quicklisp
rm -rfv */system-index.txt
rm -f quicklisp/local-projects/system-index.txt
tests:| show-info clean-sys-index test-parts selenium-tests conditional-copybara
test-parts: test-sb test-lw test-ccl test-store
test-sb: submodule $(sbcl) build/affected-files.txt
$(sbcl) $(SBCL_C_FLAGS) --script ./scripts/jenkins.lisp
test-ccl: submodule $(CCL_IMAGE)
$(CCL_SCRIPT) ./scripts/jenkins.lisp
test-lw: submodule $(LW) build/affected-files.txt
$(LW_SCRIPT) ./scripts/jenkins.lisp
test-store: submodule $(LW)
$(LW_SCRIPT) ./scripts/run-store-tests.lisp
build/.keep: | build/cache-key $(DISTINFO)
$(TOUCH) $@
clean-fasl: .PHONY
find src -name *.64ufasl -delete
clean: clean-fasl
rm -rf build
hunchentoot-tests-sb: $(sbcl)
$(call ht_check_tests,$(SBCL_SCRIPT) scripts/run-hunchentoot-tests.lisp)
hunchentoot-tests-lw: $(LW)
$(call ht_check_tests,$(LW_SCRIPT) scripts/run-hunchentoot-tests.lisp)
screenshotbot-flow:
adb shell settings put global hidden_api_policy_p_apps 1
adb shell settings put global hidden_api_policy_pre_p_apps 1
adb shell settings put global hidden_api_policy 1
cd ~/builds/silkwrmsdk && ./gradlew :core:publishToMavenLocal :plugin:publishToMavenLocal
# cd ~/builds/screenshotbot-example && ./gradlew :connectedDebugAndroidTest
cd ~/builds/screenshotbot-example && ./gradlew -i :debugAndroidTestScreenshotbot
screenshotbot-tests: $(LW) .PHONY
$(LW_SCRIPT) ./scripts/jenkins.lisp -system screenshotbot/tests,screenshotbot.pro/tests,screenshotbot.sdk/tests
sdk-tests: $(LW) .PHONY
$(LW_SCRIPT) ./scripts/jenkins.lisp -system screenshotbot.sdk/tests -no-jvm
$(LW): build/.keep $(IMAGE_DEPS)
echo in here
# $$PWD is workaround over LW issue #42471
$(ARCH_CMD) $(LW_CORE) -build scripts/build-image.lisp
test -f $(LW)
$(sbcl): build/.keep $(IMAGE_DEPS) .PHONY Makefile
$(SBCL_CORE) --script scripts/build-image.lisp
selenium-tests: $(LW)
# rm -rf src/screenshotbot/selenium-output
# $(LW_SCRIPT) scripts/run-selenium-tests.lisp
selenium-tests-without-x: $(LW)
$(LW_SCRIPT) scripts/run-selenium-tests.lisp
$(CCL_IMAGE): build/.keep $(IMAGE_DEPS)
rm -f $@
$(CCL_CORE) -l scripts/build-image.lisp
chmod a+x $@
update-ip: $(sbcl)
$(SBCL_SCRIPT) update-ip.lisp
copybara: .PHONY build
# This is on arnold's jenkins server. Disregard for OSS use.
ssh-add ~/.ssh/id_rsa_screenshotbot_oss
$(call COPYBARA)
copybara-slite: .PHONY build
ssh-add ~/.ssh/id_rsa_slite
$(call COPYBARA,slite)
copybara-quick-patch: .PHONY build
ssh-add ~/.ssh/id_rsa_quick_patch
$(call COPYBARA,quick-patch)
conditional-copybara: validate-copybara
if [ x$$DIFF_ID = x ] ; then \
make all-copybara ; \
fi
all-copybara:
ssh-agent $(MAKE) copybara
ssh-agent $(MAKE) copybara-slite
ssh-agent $(MAKE) copybara-quick-patch
validate-copybara: .PHONY
$(COPYBARA_CMD) validate copy.bara.sky
update-harbormaster-pass: $(sbcl)
$(SBCL_SCRIPT) ./scripts/update-phabricator.lisp pass
update-harbormaster-fail: $(sbcl)
$(SBCL_SCRIPT) ./scripts/update-phabricator.lisp fail
autoland:
if ( echo "{\"revision_id\":\"$(REVISION_ID)\"}" | $(ARC) call-conduit differential.getcommitmessage -- | grep "#autoland" ) ; then \
$(MAKE) -s actually-land ; \
fi
actually-land:
git status
echo "Landing..."
$(ARC) land --
src/java/libs: .PHONY
cd src/java && make libs
upload-mac-intel-sdk:
ARCH="x86_64" make upload-sdk
upload-screenshots-oss: .PHONY
curl https://screenshotbot.io/recorder.sh | bash
SCREENSHOTBOT_CLI_V2=1 ~/screenshotbot/recorder ci static-website --directory src/screenshotbot/static-web-output/ --main-branch master --channel screenshotbot-oss --repo-url 'git@github.com:screenshotbot/screenshotbot-oss.git' --main-branch main
emacs-tests:
cd src/emacs && make all
================================================
FILE: README.md
================================================
<p align="center">
<img src="https://screenshotbot.io/assets/images/logo-dark.svg" width="40%" />
</p>
# Screenshotbot: Screenshot Testing Service
[](https://app.circleci.com/pipelines/github/screenshotbot/screenshotbot-oss?branch=main)
[](https://screenshotbot.io/active-run?org=5fd16bcf4f4b3822fd0000e1&channel=screenshotbot-oss&branch=master)
Screenshotbot is a Screenshot Testing service. Screenshotbot will
connect your existing Android, iOS or Selenium tests to track how
screenshots change over time, notifying you on Pull Requests, Jira
etc. We provide several integrations to common Code Review and Task
Management platforms, and have more in the pipeline.
Screenshotbot-oss powers our own commercial platform
[screenshotbot.io](https://screenshotbot.io).
<p align="center">
<img src="https://cdn.screenshotbot.io/assets/images/new-landing/landing-hero.png" width="60%" />
</p>
## Quick installation with Docker
```
$ docker-compose up --build
```
If you need to modify the `config.lisp`, modify it before running this
command. In the future we'll provide live reloading of config.lisp for
docker, but at the moment that's only available when not using docker.
## Quick Installation in the cloud
If you want a publicly accessible instance, complete with HTTPS, we
have a script that will help you set it up in your cloud.
See [this wiki page](https://github.com/screenshotbot/screenshotbot-oss/wiki/Quick-installation-in-the-cloud) for details.
## Configuration
Screenshotbot has integrations with various external tools,
e.g. GitHub, Jira, SSO etc. Most of these platforms require some
kind of API key to access their APIs, and must be configured with
Screenshotbot before you can use them.
For simplicity and maintainability, we don't have complex GUIs to
modify these _site-admin_ configurations. Instead each of these
integrations are exposed as plugins that must be configured with basic
Common Lisp code. The configuration can be hot-reloaded.
Screenshotbot looks for a file called `config.lisp` in both the
git-root, and in `~/.config/screenshotbot/`. If found, it loads this
file as the configuration.
See [Updating
config.lisp](https://github.com/screenshotbot/screenshotbot-oss/wiki/Updating-config.lisp)
for a more thorough discussion.
### Becoming a Site-Admin
After installing Screenshotbot, we recommend setting up one user as a
site-admin. The site-admin gets special administrative powers that
will be required for hot-reloading config files, and hot-reloading
updates. We might also build more configuration powers for site-admins
in the future.
After signing up and logging in, go to
`https://<domain>/site-admin/self-promotion`. Follow the steps. You'll
need shell access to the directory with the Screenshotbot
installation. You'll now have access to an Admin menu on the bottom
left.
## Calling Screenshotbot from your CI jobs
First, you'll need to generate an API key inside Screenshotbot. You'll
use this to access the API or the CLI tools.
Next you need to build the CLI tool for your platform. Common Lisp is
a compiled language, so in general you'll need different binaries for
different platforms (Linux, Mac or Windows; Intel vs ARM). You can
download pre-built binaries for Linux and Mac from
https://screenshotbot.io/recorder.sh.
To create a binary on a specific platform, call the script
`scripts/build-cli.lisp`. For instance, if you're using SBCL to build the CLI,
it will look like:
```
$ sbcl --script scripts/build-cli.lisp
```
This will generate a screenshotbot-cli executable script. Copy it to a
location from which it can be dowloading during your CI runs, or check
it in to your repository. (As of this writing SBCL generates a binary
that is 105MB in size, and 24MB zipped; CCL 100MB/21MB excluding core;
LispWorks 25MB/4.4MB. LispWorks has extra features to remove unused
code.)
For an example use of this executable see:
https://github.com/tdrhq/fast-example/blob/master/.circleci/config.yml.
You'll also have to pass the `--hostname` argument, which will be the
URL of your Screenshotbot installation.
## Setting up SSO
Screenshotbot comes with an in-built email/password authentication
system, and also supports OpenID Connect out of the box. We also have
in-built connectors for Google OAuth restricted to domains, which
might be easier for smaller companies.
See [Configuring
SSO](https://github.com/screenshotbot/screenshotbot-oss/wiki/Configuring-SSO)
for a thorough discussion.
## Feature Status
Not all the features on [screenshotbot.io](https://screenshotbot.io)
are available in this OSS repository. We are in the process of moving
most integrations here, but that will depend on community interest.
| Feature | LispWorks | CCL | SBCL | screenshotbot.io (Enterprise) |
|:---------------------:|:------------:|:------------:|:-----------------:|:------------------------------:|
| **SSO/OAuth** | | | | |
| User / Email | Supported | Supported | Supported | Supported |
| OpenID Connect | Supported | Supported | Supported | Supported |
| SAML | Via Keycloak | Via Keycloak | Via Keycloak | Supported |
| **VCS Integrations** | | | | |
| GitHub | Supported | Supported | Supported | Supported |
| GitLab | Supported | Supported | Supported | Supported |
| Phabricator | Supported | Supported | Supported | Supported |
| BitBucket | Supported | Supported | Supported | Supported |
| Azure DevOps | Supported | Supported | Supported | Supported |
| **Tasks Integration** | | | | |
| Slack | Supported | Supported | Supported | Supported |
| Email | Supported | Supported | Supported | Supported |
| Jira | Planned | Planned | Not supported [1] | Supported |
| Trello | Planned | Planned | Not supported [1] | Supported |
| Asana | Planned | Planned | Not supported [1] | Planned |
| **Annotations** [2] | Planned | Planned | Planned | Supported |
| Jira | Planned | Planned | Not supported [1] | Supported |
Footnotes:
1. Not supported because SBCL doesn't support Java
2. Annotations allow you to create tasks directly from Screenshotbot
## Upgrading
In most cases, upgrading will be done via hot-reloading. As a
site-admin, you can `git pull` on the repository, on the shell, go to
go `https://<domain>/admin` and hit `Reload`. This will bring the new
code live without any downtime.
Small catch: Our database is stored is in-memory (with transactions
logged to disk for recovery). Hot-reloading code can force schema
changes. For instance, if a field is deleted between two major
versions, hot reloading will cause that field to be lost forever (but
there are snapshots of old versions of the database for recovery). In
general we'll try to guarantee that between minor versions, on
released commits, as long as you're upgrading (as opposed to
downgrading), we'll be able to auto-migrate any schema cleanly.
You can also upgrade by killing the Lisp process and restarting it. If
you do so, we recommend hitting `Snapshot` on the admin menu before
killing the Lisp process. However killing the Lisp process can cause a
minor downtime. You can work around this by using a tool called
`socketmaster`, but the description of that tool is beyond the scope
of this document.
## Contributing
We welcome Pull Requests!
Keep in mind, we'll do the code review on GitHub, but we'll merge it
via our internal Phabricator instance. The source of truth for the
code is in our internal mono-repo, which is copied over to the OSS
code via Copybara, similar to the process that Google and Facebook
use. We have open sourced many other projects where the source of
truth is GitHub, but Screenshotbot is an actively-developed complex
application that makes this difficult.
We might reject large new features if we think it adds too much
maintenance overhead for us. Bug-fixes are always welcome.
## Open Source Support
We want the Open Source version of Screenshotbot to be successful. That being
said, we are a very small company, so it's difficult for us to dedicate
a lot of resources specifically for keeping Open Source supported across multiple
platforms, multiple deployment styles, etc.
You can help us! Just be patient with us when we ask for specifics about your installation.
Send us any feedback---good, bad or neutral---to arnold@screenshotbot.io.
Get other
teams to use Screenshotbot, either open-source or paid. The more users we have the
easier it is for us to catch bugs early and stream-line the open source experience.
Give us a star on GitHub!
We aren't currently accepting donations, but consider convincing your
team to pay us for support. If you're a small team or an individual
developer, just send us an email and we'll make sure you have a plan
you can afford. Most of our code is open-source, so by paying us
you're directly supporting our open-source contributions.
## Security
We take security at Screenshotbot very seriously. We partner with an
external security research firm, [Pensive
Security](https://pensivesecurity.io) to perform annual penetration
tests. The latest Penetration Test reports can be requested on our
[Trust and Security](https://trust.screenshotbot.io) dashboard.
## Authors
Screenshotbot is built and maintained by Arnold Noronha
(arnold@screenshotbot.io). I also wrote
[screenshot-tests-for-android](https://github.com/facebook/screenshot-tests-for-android),
the de-facto screenshot testing library for Android.
## License
Screenshot is licensed under the Mozilla Public License, v2.
================================================
FILE: docker-compose.yml
================================================
version: "3.9"
services:
screenshotbot:
build:
context: ${SB_OSS_CONTEXT-.}
dockerfile: ${SB_OSS_DOCKERFILE-Dockerfile}
ports:
- "4091:4091"
volumes:
- screenshotbot-oss:/data
- ${SB_OSS_CONTEXT-.}:/app
- screenshotbot-build:/app/build
volumes:
screenshotbot-oss:
screenshotbot-build:
# test
================================================
FILE: launch.lisp
================================================
;;;; Copyright 2018-Present Modern Interpreters Inc.
;;;;
;;;; This Source Code Form is subject to the terms of the Mozilla Public
;;;; License, v. 2.0. If a copy of the MPL was not distributed with this
;;;; file, You can obtain one at https://mozilla.org/MPL/2.0/.
(load "scripts/prepare-image")
(load "scripts/init")
#+ccl
(ql:quickload "jvm")
#+ccl
(jvm:jvm-init)
(ql:quickload "server")
(ql:quickload "server/slynk")
(ql:quickload "screenshotbot/all")
(screenshotbot/config:load-config)
(unless (member "compile" (uiop:command-line-arguments) :test 'string=)
(server:main :acceptor screenshotbot/server:*acceptor*))
(uiop:quit)
================================================
FILE: quicklisp/.gitignore
================================================
cache
dists/quicklisp/software
dists/quicklisp/archives
dists/quicklisp/installed
dists/quicklisp/*.cdb
retired/
tmp
*fasl*
================================================
FILE: quicklisp/asdf.lisp
================================================
;;; -*- mode: Lisp; Base: 10 ; Syntax: ANSI-Common-Lisp ; buffer-read-only: t; -*-
;;; This is ASDF 3.2.1: Another System Definition Facility.
;;;
;;; Feedback, bug reports, and patches are all welcome:
;;; please mail to <asdf-devel@common-lisp.net>.
;;; Note first that the canonical source for ASDF is presently
;;; <URL:http://common-lisp.net/project/asdf/>.
;;;
;;; If you obtained this copy from anywhere else, and you experience
;;; trouble using it, or find bugs, you may want to check at the
;;; location above for a more recent version (and for documentation
;;; and test files, if your copy came without them) before reporting
;;; bugs. There are usually two "supported" revisions - the git master
;;; branch is the latest development version, whereas the git release
;;; branch may be slightly older but is considered `stable'
;;; -- LICENSE START
;;; (This is the MIT / X Consortium license as taken from
;;; http://www.opensource.org/licenses/mit-license.html on or about
;;; Monday; July 13, 2009)
;;;
;;; Copyright (c) 2001-2016 Daniel Barlow and contributors
;;;
;;; 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.
;;;
;;; -- LICENSE END
;;; The problem with writing a defsystem replacement is bootstrapping:
;;; we can't use defsystem to compile it. Hence, all in one file.
;;;; ---------------------------------------------------------------------------
;;;; Handle ASDF package upgrade, including implementation-dependent magic.
;;
;; See https://bugs.launchpad.net/asdf/+bug/485687
;;
(defpackage :uiop/package
;; CAUTION: we must handle the first few packages specially for hot-upgrade.
;; This package definition MUST NOT change unless its name too changes;
;; if/when it changes, don't forget to add new functions missing from below.
;; Until then, uiop/package is frozen to forever
;; import and export the same exact symbols as for ASDF 2.27.
;; Any other symbol must be import-from'ed and re-export'ed in a different package.
(:use :common-lisp)
(:export
#:find-package* #:find-symbol* #:symbol-call
#:intern* #:export* #:import* #:shadowing-import* #:shadow* #:make-symbol* #:unintern*
#:symbol-shadowing-p #:home-package-p
#:symbol-package-name #:standard-common-lisp-symbol-p
#:reify-package #:unreify-package #:reify-symbol #:unreify-symbol
#:nuke-symbol-in-package #:nuke-symbol #:rehome-symbol
#:ensure-package-unused #:delete-package*
#:package-names #:packages-from-names #:fresh-package-name #:rename-package-away
#:package-definition-form #:parse-define-package-form
#:ensure-package #:define-package))
(in-package :uiop/package)
;;;; General purpose package utilities
(eval-when (:load-toplevel :compile-toplevel :execute)
(defun find-package* (package-designator &optional (error t))
(let ((package (find-package package-designator)))
(cond
(package package)
(error (error "No package named ~S" (string package-designator)))
(t nil))))
(defun find-symbol* (name package-designator &optional (error t))
"Find a symbol in a package of given string'ified NAME;
unlike CL:FIND-SYMBOL, work well with 'modern' case sensitive syntax
by letting you supply a symbol or keyword for the name;
also works well when the package is not present.
If optional ERROR argument is NIL, return NIL instead of an error
when the symbol is not found."
(block nil
(let ((package (find-package* package-designator error)))
(when package ;; package error handled by find-package* already
(multiple-value-bind (symbol status) (find-symbol (string name) package)
(cond
(status (return (values symbol status)))
(error (error "There is no symbol ~S in package ~S" name (package-name package))))))
(values nil nil))))
(defun symbol-call (package name &rest args)
"Call a function associated with symbol of given name in given package,
with given ARGS. Useful when the call is read before the package is loaded,
or when loading the package is optional."
(apply (find-symbol* name package) args))
(defun intern* (name package-designator &optional (error t))
(intern (string name) (find-package* package-designator error)))
(defun export* (name package-designator)
(let* ((package (find-package* package-designator))
(symbol (intern* name package)))
(export (or symbol (list symbol)) package)))
(defun import* (symbol package-designator)
(import (or symbol (list symbol)) (find-package* package-designator)))
(defun shadowing-import* (symbol package-designator)
(shadowing-import (or symbol (list symbol)) (find-package* package-designator)))
(defun shadow* (name package-designator)
(shadow (list (string name)) (find-package* package-designator)))
(defun make-symbol* (name)
(etypecase name
(string (make-symbol name))
(symbol (copy-symbol name))))
(defun unintern* (name package-designator &optional (error t))
(block nil
(let ((package (find-package* package-designator error)))
(when package
(multiple-value-bind (symbol status) (find-symbol* name package error)
(cond
(status (unintern symbol package)
(return (values symbol status)))
(error (error "symbol ~A not present in package ~A"
(string symbol) (package-name package))))))
(values nil nil))))
(defun symbol-shadowing-p (symbol package)
(and (member symbol (package-shadowing-symbols package)) t))
(defun home-package-p (symbol package)
(and package (let ((sp (symbol-package symbol)))
(and sp (let ((pp (find-package* package)))
(and pp (eq sp pp))))))))
(eval-when (:load-toplevel :compile-toplevel :execute)
(defun symbol-package-name (symbol)
(let ((package (symbol-package symbol)))
(and package (package-name package))))
(defun standard-common-lisp-symbol-p (symbol)
(multiple-value-bind (sym status) (find-symbol* symbol :common-lisp nil)
(and (eq sym symbol) (eq status :external))))
(defun reify-package (package &optional package-context)
(if (eq package package-context) t
(etypecase package
(null nil)
((eql (find-package :cl)) :cl)
(package (package-name package)))))
(defun unreify-package (package &optional package-context)
(etypecase package
(null nil)
((eql t) package-context)
((or symbol string) (find-package package))))
(defun reify-symbol (symbol &optional package-context)
(etypecase symbol
((or keyword (satisfies standard-common-lisp-symbol-p)) symbol)
(symbol (vector (symbol-name symbol)
(reify-package (symbol-package symbol) package-context)))))
(defun unreify-symbol (symbol &optional package-context)
(etypecase symbol
(symbol symbol)
((simple-vector 2)
(let* ((symbol-name (svref symbol 0))
(package-foo (svref symbol 1))
(package (unreify-package package-foo package-context)))
(if package (intern* symbol-name package)
(make-symbol* symbol-name)))))))
(eval-when (:load-toplevel :compile-toplevel :execute)
(defvar *all-package-happiness* '())
(defvar *all-package-fishiness* (list t))
(defun record-fishy (info)
;;(format t "~&FISHY: ~S~%" info)
(push info *all-package-fishiness*))
(defmacro when-package-fishiness (&body body)
`(when *all-package-fishiness* ,@body))
(defmacro note-package-fishiness (&rest info)
`(when-package-fishiness (record-fishy (list ,@info)))))
(eval-when (:load-toplevel :compile-toplevel :execute)
#+(or clisp clozure)
(defun get-setf-function-symbol (symbol)
#+clisp (let ((sym (get symbol 'system::setf-function)))
(if sym (values sym :setf-function)
(let ((sym (get symbol 'system::setf-expander)))
(if sym (values sym :setf-expander)
(values nil nil)))))
#+clozure (gethash symbol ccl::%setf-function-names%))
#+(or clisp clozure)
(defun set-setf-function-symbol (new-setf-symbol symbol &optional kind)
#+clisp (assert (member kind '(:setf-function :setf-expander)))
#+clozure (assert (eq kind t))
#+clisp
(cond
((null new-setf-symbol)
(remprop symbol 'system::setf-function)
(remprop symbol 'system::setf-expander))
((eq kind :setf-function)
(setf (get symbol 'system::setf-function) new-setf-symbol))
((eq kind :setf-expander)
(setf (get symbol 'system::setf-expander) new-setf-symbol))
(t (error "invalid kind of setf-function ~S for ~S to be set to ~S"
kind symbol new-setf-symbol)))
#+clozure
(progn
(gethash symbol ccl::%setf-function-names%) new-setf-symbol
(gethash new-setf-symbol ccl::%setf-function-name-inverses%) symbol))
#+(or clisp clozure)
(defun create-setf-function-symbol (symbol)
#+clisp (system::setf-symbol symbol)
#+clozure (ccl::construct-setf-function-name symbol))
(defun set-dummy-symbol (symbol reason other-symbol)
(setf (get symbol 'dummy-symbol) (cons reason other-symbol)))
(defun make-dummy-symbol (symbol)
(let ((dummy (copy-symbol symbol)))
(set-dummy-symbol dummy 'replacing symbol)
(set-dummy-symbol symbol 'replaced-by dummy)
dummy))
(defun dummy-symbol (symbol)
(get symbol 'dummy-symbol))
(defun get-dummy-symbol (symbol)
(let ((existing (dummy-symbol symbol)))
(if existing (values (cdr existing) (car existing))
(make-dummy-symbol symbol))))
(defun nuke-symbol-in-package (symbol package-designator)
(let ((package (find-package* package-designator))
(name (symbol-name symbol)))
(multiple-value-bind (sym stat) (find-symbol name package)
(when (and (member stat '(:internal :external)) (eq symbol sym))
(if (symbol-shadowing-p symbol package)
(shadowing-import* (get-dummy-symbol symbol) package)
(unintern* symbol package))))))
(defun nuke-symbol (symbol &optional (packages (list-all-packages)))
#+(or clisp clozure)
(multiple-value-bind (setf-symbol kind)
(get-setf-function-symbol symbol)
(when kind (nuke-symbol setf-symbol)))
(loop :for p :in packages :do (nuke-symbol-in-package symbol p)))
(defun rehome-symbol (symbol package-designator)
"Changes the home package of a symbol, also leaving it present in its old home if any"
(let* ((name (symbol-name symbol))
(package (find-package* package-designator))
(old-package (symbol-package symbol))
(old-status (and old-package (nth-value 1 (find-symbol name old-package))))
(shadowing (and old-package (symbol-shadowing-p symbol old-package) (make-symbol name))))
(multiple-value-bind (overwritten-symbol overwritten-symbol-status) (find-symbol name package)
(unless (eq package old-package)
(let ((overwritten-symbol-shadowing-p
(and overwritten-symbol-status
(symbol-shadowing-p overwritten-symbol package))))
(note-package-fishiness
:rehome-symbol name
(when old-package (package-name old-package)) old-status (and shadowing t)
(package-name package) overwritten-symbol-status overwritten-symbol-shadowing-p)
(when old-package
(if shadowing
(shadowing-import* shadowing old-package))
(unintern* symbol old-package))
(cond
(overwritten-symbol-shadowing-p
(shadowing-import* symbol package))
(t
(when overwritten-symbol-status
(unintern* overwritten-symbol package))
(import* symbol package)))
(if shadowing
(shadowing-import* symbol old-package)
(import* symbol old-package))
#+(or clisp clozure)
(multiple-value-bind (setf-symbol kind)
(get-setf-function-symbol symbol)
(when kind
(let* ((setf-function (fdefinition setf-symbol))
(new-setf-symbol (create-setf-function-symbol symbol)))
(note-package-fishiness
:setf-function
name (package-name package)
(symbol-name setf-symbol) (symbol-package-name setf-symbol)
(symbol-name new-setf-symbol) (symbol-package-name new-setf-symbol))
(when (symbol-package setf-symbol)
(unintern* setf-symbol (symbol-package setf-symbol)))
(setf (fdefinition new-setf-symbol) setf-function)
(set-setf-function-symbol new-setf-symbol symbol kind))))
#+(or clisp clozure)
(multiple-value-bind (overwritten-setf foundp)
(get-setf-function-symbol overwritten-symbol)
(when foundp
(unintern overwritten-setf)))
(when (eq old-status :external)
(export* symbol old-package))
(when (eq overwritten-symbol-status :external)
(export* symbol package))))
(values overwritten-symbol overwritten-symbol-status))))
(defun ensure-package-unused (package)
(loop :for p :in (package-used-by-list package) :do
(unuse-package package p)))
(defun delete-package* (package &key nuke)
(let ((p (find-package package)))
(when p
(when nuke (do-symbols (s p) (when (home-package-p s p) (nuke-symbol s))))
(ensure-package-unused p)
(delete-package package))))
(defun package-names (package)
(cons (package-name package) (package-nicknames package)))
(defun packages-from-names (names)
(remove-duplicates (remove nil (mapcar #'find-package names)) :from-end t))
(defun fresh-package-name (&key (prefix :%TO-BE-DELETED)
separator
(index (random most-positive-fixnum)))
(loop :for i :from index
:for n = (format nil "~A~@[~A~D~]" prefix (and (plusp i) (or separator "")) i)
:thereis (and (not (find-package n)) n)))
(defun rename-package-away (p &rest keys &key prefix &allow-other-keys)
(let ((new-name
(apply 'fresh-package-name
:prefix (or prefix (format nil "__~A__" (package-name p))) keys)))
(record-fishy (list :rename-away (package-names p) new-name))
(rename-package p new-name))))
;;; Communicable representation of symbol and package information
(eval-when (:load-toplevel :compile-toplevel :execute)
(defun package-definition-form (package-designator
&key (nicknamesp t) (usep t)
(shadowp t) (shadowing-import-p t)
(exportp t) (importp t) internp (error t))
(let* ((package (or (find-package* package-designator error)
(return-from package-definition-form nil)))
(name (package-name package))
(nicknames (package-nicknames package))
(use (mapcar #'package-name (package-use-list package)))
(shadow ())
(shadowing-import (make-hash-table :test 'equal))
(import (make-hash-table :test 'equal))
(export ())
(intern ()))
(when package
(loop :for sym :being :the :symbols :in package
:for status = (nth-value 1 (find-symbol* sym package)) :do
(ecase status
((nil :inherited))
((:internal :external)
(let* ((name (symbol-name sym))
(external (eq status :external))
(home (symbol-package sym))
(home-name (package-name home))
(imported (not (eq home package)))
(shadowing (symbol-shadowing-p sym package)))
(cond
((and shadowing imported)
(push name (gethash home-name shadowing-import)))
(shadowing
(push name shadow))
(imported
(push name (gethash home-name import))))
(cond
(external
(push name export))
(imported)
(t (push name intern)))))))
(labels ((sort-names (names)
(sort (copy-list names) #'string<))
(table-keys (table)
(loop :for k :being :the :hash-keys :of table :collect k))
(when-relevant (key value)
(when value (list (cons key value))))
(import-options (key table)
(loop :for i :in (sort-names (table-keys table))
:collect `(,key ,i ,@(sort-names (gethash i table))))))
`(defpackage ,name
,@(when-relevant :nicknames (and nicknamesp (sort-names nicknames)))
(:use ,@(and usep (sort-names use)))
,@(when-relevant :shadow (and shadowp (sort-names shadow)))
,@(import-options :shadowing-import-from (and shadowing-import-p shadowing-import))
,@(import-options :import-from (and importp import))
,@(when-relevant :export (and exportp (sort-names export)))
,@(when-relevant :intern (and internp (sort-names intern)))))))))
;;; ensure-package, define-package
(eval-when (:load-toplevel :compile-toplevel :execute)
(defun ensure-shadowing-import (name to-package from-package shadowed imported)
(check-type name string)
(check-type to-package package)
(check-type from-package package)
(check-type shadowed hash-table)
(check-type imported hash-table)
(let ((import-me (find-symbol* name from-package)))
(multiple-value-bind (existing status) (find-symbol name to-package)
(cond
((gethash name shadowed)
(unless (eq import-me existing)
(error "Conflicting shadowings for ~A" name)))
(t
(setf (gethash name shadowed) t)
(setf (gethash name imported) t)
(unless (or (null status)
(and (member status '(:internal :external))
(eq existing import-me)
(symbol-shadowing-p existing to-package)))
(note-package-fishiness
:shadowing-import name
(package-name from-package)
(or (home-package-p import-me from-package) (symbol-package-name import-me))
(package-name to-package) status
(and status (or (home-package-p existing to-package) (symbol-package-name existing)))))
(shadowing-import* import-me to-package))))))
(defun ensure-imported (import-me into-package &optional from-package)
(check-type import-me symbol)
(check-type into-package package)
(check-type from-package (or null package))
(let ((name (symbol-name import-me)))
(multiple-value-bind (existing status) (find-symbol name into-package)
(cond
((not status)
(import* import-me into-package))
((eq import-me existing))
(t
(let ((shadowing-p (symbol-shadowing-p existing into-package)))
(note-package-fishiness
:ensure-imported name
(and from-package (package-name from-package))
(or (home-package-p import-me from-package) (symbol-package-name import-me))
(package-name into-package)
status
(and status (or (home-package-p existing into-package) (symbol-package-name existing)))
shadowing-p)
(cond
((or shadowing-p (eq status :inherited))
(shadowing-import* import-me into-package))
(t
(unintern* existing into-package)
(import* import-me into-package))))))))
(values))
(defun ensure-import (name to-package from-package shadowed imported)
(check-type name string)
(check-type to-package package)
(check-type from-package package)
(check-type shadowed hash-table)
(check-type imported hash-table)
(multiple-value-bind (import-me import-status) (find-symbol name from-package)
(when (null import-status)
(note-package-fishiness
:import-uninterned name (package-name from-package) (package-name to-package))
(setf import-me (intern* name from-package)))
(multiple-value-bind (existing status) (find-symbol name to-package)
(cond
((and imported (gethash name imported))
(unless (and status (eq import-me existing))
(error "Can't import ~S from both ~S and ~S"
name (package-name (symbol-package existing)) (package-name from-package))))
((gethash name shadowed)
(error "Can't both shadow ~S and import it from ~S" name (package-name from-package)))
(t
(setf (gethash name imported) t))))
(ensure-imported import-me to-package from-package)))
(defun ensure-inherited (name symbol to-package from-package mixp shadowed imported inherited)
(check-type name string)
(check-type symbol symbol)
(check-type to-package package)
(check-type from-package package)
(check-type mixp (member nil t)) ; no cl:boolean on Genera
(check-type shadowed hash-table)
(check-type imported hash-table)
(check-type inherited hash-table)
(multiple-value-bind (existing status) (find-symbol name to-package)
(let* ((sp (symbol-package symbol))
(in (gethash name inherited))
(xp (and status (symbol-package existing))))
(when (null sp)
(note-package-fishiness
:import-uninterned name
(package-name from-package) (package-name to-package) mixp)
(import* symbol from-package)
(setf sp (package-name from-package)))
(cond
((gethash name shadowed))
(in
(unless (equal sp (first in))
(if mixp
(ensure-shadowing-import name to-package (second in) shadowed imported)
(error "Can't inherit ~S from ~S, it is inherited from ~S"
name (package-name sp) (package-name (first in))))))
((gethash name imported)
(unless (eq symbol existing)
(error "Can't inherit ~S from ~S, it is imported from ~S"
name (package-name sp) (package-name xp))))
(t
(setf (gethash name inherited) (list sp from-package))
(when (and status (not (eq sp xp)))
(let ((shadowing (symbol-shadowing-p existing to-package)))
(note-package-fishiness
:inherited name
(package-name from-package)
(or (home-package-p symbol from-package) (symbol-package-name symbol))
(package-name to-package)
(or (home-package-p existing to-package) (symbol-package-name existing)))
(if shadowing (ensure-shadowing-import name to-package from-package shadowed imported)
(unintern* existing to-package)))))))))
(defun ensure-mix (name symbol to-package from-package shadowed imported inherited)
(check-type name string)
(check-type symbol symbol)
(check-type to-package package)
(check-type from-package package)
(check-type shadowed hash-table)
(check-type imported hash-table)
(check-type inherited hash-table)
(unless (gethash name shadowed)
(multiple-value-bind (existing status) (find-symbol name to-package)
(let* ((sp (symbol-package symbol))
(im (gethash name imported))
(in (gethash name inherited)))
(cond
((or (null status)
(and status (eq symbol existing))
(and in (eq sp (first in))))
(ensure-inherited name symbol to-package from-package t shadowed imported inherited))
(in
(remhash name inherited)
(ensure-shadowing-import name to-package (second in) shadowed imported))
(im
(error "Symbol ~S import from ~S~:[~; actually ~:[uninterned~;~:*from ~S~]~] conflicts with existing symbol in ~S~:[~; actually ~:[uninterned~;from ~:*~S~]~]"
name (package-name from-package)
(home-package-p symbol from-package) (symbol-package-name symbol)
(package-name to-package)
(home-package-p existing to-package) (symbol-package-name existing)))
(t
(ensure-inherited name symbol to-package from-package t shadowed imported inherited)))))))
(defun recycle-symbol (name recycle exported)
;; Takes a symbol NAME (a string), a list of package designators for RECYCLE
;; packages, and a hash-table of names (strings) of symbols scheduled to be
;; EXPORTED from the package being defined. It returns two values, the
;; symbol found (if any, or else NIL), and a boolean flag indicating whether
;; a symbol was found. The caller (DEFINE-PACKAGE) will then do the
;; re-homing of the symbol, etc.
(check-type name string)
(check-type recycle list)
(check-type exported hash-table)
(when (gethash name exported) ;; don't bother recycling private symbols
(let (recycled foundp)
(dolist (r recycle (values recycled foundp))
(multiple-value-bind (symbol status) (find-symbol name r)
(when (and status (home-package-p symbol r))
(cond
(foundp
;; (nuke-symbol symbol)) -- even simple variable names like O or C will do that.
(note-package-fishiness :recycled-duplicate name (package-name foundp) (package-name r)))
(t
(setf recycled symbol foundp r)))))))))
(defun symbol-recycled-p (sym recycle)
(check-type sym symbol)
(check-type recycle list)
(and (member (symbol-package sym) recycle) t))
(defun ensure-symbol (name package intern recycle shadowed imported inherited exported)
(check-type name string)
(check-type package package)
(check-type intern (member nil t)) ; no cl:boolean on Genera
(check-type shadowed hash-table)
(check-type imported hash-table)
(check-type inherited hash-table)
(unless (or (gethash name shadowed)
(gethash name imported)
(gethash name inherited))
(multiple-value-bind (existing status)
(find-symbol name package)
(multiple-value-bind (recycled previous) (recycle-symbol name recycle exported)
(cond
((and status (eq existing recycled) (eq previous package)))
(previous
(rehome-symbol recycled package))
((and status (eq package (symbol-package existing))))
(t
(when status
(note-package-fishiness
:ensure-symbol name
(reify-package (symbol-package existing) package)
status intern)
(unintern existing))
(when intern
(intern* name package))))))))
(declaim (ftype (function (t t t &optional t) t) ensure-exported))
(defun ensure-exported-to-user (name symbol to-package &optional recycle)
(check-type name string)
(check-type symbol symbol)
(check-type to-package package)
(check-type recycle list)
(assert (equal name (symbol-name symbol)))
(multiple-value-bind (existing status) (find-symbol name to-package)
(unless (and status (eq symbol existing))
(let ((accessible
(or (null status)
(let ((shadowing (symbol-shadowing-p existing to-package))
(recycled (symbol-recycled-p existing recycle)))
(unless (and shadowing (not recycled))
(note-package-fishiness
:ensure-export name (symbol-package-name symbol)
(package-name to-package)
(or (home-package-p existing to-package) (symbol-package-name existing))
status shadowing)
(if (or (eq status :inherited) shadowing)
(shadowing-import* symbol to-package)
(unintern existing to-package))
t)))))
(when (and accessible (eq status :external))
(ensure-exported name symbol to-package recycle))))))
(defun ensure-exported (name symbol from-package &optional recycle)
(dolist (to-package (package-used-by-list from-package))
(ensure-exported-to-user name symbol to-package recycle))
(unless (eq from-package (symbol-package symbol))
(ensure-imported symbol from-package))
(export* name from-package))
(defun ensure-export (name from-package &optional recycle)
(multiple-value-bind (symbol status) (find-symbol* name from-package)
(unless (eq status :external)
(ensure-exported name symbol from-package recycle))))
(defun ensure-package (name &key
nicknames documentation use
shadow shadowing-import-from
import-from export intern
recycle mix reexport
unintern)
#+genera (declare (ignore documentation))
(let* ((package-name (string name))
(nicknames (mapcar #'string nicknames))
(names (cons package-name nicknames))
(previous (packages-from-names names))
(discarded (cdr previous))
(to-delete ())
(package (or (first previous) (make-package package-name :nicknames nicknames)))
(recycle (packages-from-names recycle))
(use (mapcar 'find-package* use))
(mix (mapcar 'find-package* mix))
(reexport (mapcar 'find-package* reexport))
(shadow (mapcar 'string shadow))
(export (mapcar 'string export))
(intern (mapcar 'string intern))
(unintern (mapcar 'string unintern))
(shadowed (make-hash-table :test 'equal)) ; string to bool
(imported (make-hash-table :test 'equal)) ; string to bool
(exported (make-hash-table :test 'equal)) ; string to bool
;; string to list home package and use package:
(inherited (make-hash-table :test 'equal)))
(when-package-fishiness (record-fishy package-name))
#-genera
(when documentation (setf (documentation package t) documentation))
(loop :for p :in (set-difference (package-use-list package) (append mix use))
:do (note-package-fishiness :over-use name (package-names p))
(unuse-package p package))
(loop :for p :in discarded
:for n = (remove-if #'(lambda (x) (member x names :test 'equal))
(package-names p))
:do (note-package-fishiness :nickname name (package-names p))
(cond (n (rename-package p (first n) (rest n)))
(t (rename-package-away p)
(push p to-delete))))
(rename-package package package-name nicknames)
(dolist (name unintern)
(multiple-value-bind (existing status) (find-symbol name package)
(when status
(unless (eq status :inherited)
(note-package-fishiness
:unintern (package-name package) name (symbol-package-name existing) status)
(unintern* name package nil)))))
(dolist (name export)
(setf (gethash name exported) t))
(dolist (p reexport)
(do-external-symbols (sym p)
(setf (gethash (string sym) exported) t)))
(do-external-symbols (sym package)
(let ((name (symbol-name sym)))
(unless (gethash name exported)
(note-package-fishiness
:over-export (package-name package) name
(or (home-package-p sym package) (symbol-package-name sym)))
(unexport sym package))))
(dolist (name shadow)
(setf (gethash name shadowed) t)
(multiple-value-bind (existing status) (find-symbol name package)
(multiple-value-bind (recycled previous) (recycle-symbol name recycle exported)
(let ((shadowing (and status (symbol-shadowing-p existing package))))
(cond
((eq previous package))
(previous
(rehome-symbol recycled package))
((or (member status '(nil :inherited))
(home-package-p existing package)))
(t
(let ((dummy (make-symbol name)))
(note-package-fishiness
:shadow-imported (package-name package) name
(symbol-package-name existing) status shadowing)
(shadowing-import* dummy package)
(import* dummy package)))))))
(shadow* name package))
(loop :for (p . syms) :in shadowing-import-from
:for pp = (find-package* p) :do
(dolist (sym syms) (ensure-shadowing-import (string sym) package pp shadowed imported)))
(loop :for p :in mix
:for pp = (find-package* p) :do
(do-external-symbols (sym pp) (ensure-mix (symbol-name sym) sym package pp shadowed imported inherited)))
(loop :for (p . syms) :in import-from
:for pp = (find-package p) :do
(dolist (sym syms) (ensure-import (symbol-name sym) package pp shadowed imported)))
(dolist (p (append use mix))
(do-external-symbols (sym p) (ensure-inherited (string sym) sym package p nil shadowed imported inherited))
(use-package p package))
(loop :for name :being :the :hash-keys :of exported :do
(ensure-symbol name package t recycle shadowed imported inherited exported)
(ensure-export name package recycle))
(dolist (name intern)
(ensure-symbol name package t recycle shadowed imported inherited exported))
(do-symbols (sym package)
(ensure-symbol (symbol-name sym) package nil recycle shadowed imported inherited exported))
(map () 'delete-package* to-delete)
package)))
(eval-when (:load-toplevel :compile-toplevel :execute)
(defun parse-define-package-form (package clauses)
(loop
:with use-p = nil :with recycle-p = nil
:with documentation = nil
:for (kw . args) :in clauses
:when (eq kw :nicknames) :append args :into nicknames :else
:when (eq kw :documentation)
:do (cond
(documentation (error "define-package: can't define documentation twice"))
((or (atom args) (cdr args)) (error "define-package: bad documentation"))
(t (setf documentation (car args)))) :else
:when (eq kw :use) :append args :into use :and :do (setf use-p t) :else
:when (eq kw :shadow) :append args :into shadow :else
:when (eq kw :shadowing-import-from) :collect args :into shadowing-import-from :else
:when (eq kw :import-from) :collect args :into import-from :else
:when (eq kw :export) :append args :into export :else
:when (eq kw :intern) :append args :into intern :else
:when (eq kw :recycle) :append args :into recycle :and :do (setf recycle-p t) :else
:when (eq kw :mix) :append args :into mix :else
:when (eq kw :reexport) :append args :into reexport :else
:when (eq kw :use-reexport) :append args :into use :and :append args :into reexport
:and :do (setf use-p t) :else
:when (eq kw :mix-reexport) :append args :into mix :and :append args :into reexport
:and :do (setf use-p t) :else
:when (eq kw :unintern) :append args :into unintern :else
:do (error "unrecognized define-package keyword ~S" kw)
:finally (return `(,package
:nicknames ,nicknames :documentation ,documentation
:use ,(if use-p use '(:common-lisp))
:shadow ,shadow :shadowing-import-from ,shadowing-import-from
:import-from ,import-from :export ,export :intern ,intern
:recycle ,(if recycle-p recycle (cons package nicknames))
:mix ,mix :reexport ,reexport :unintern ,unintern)))))
(defmacro define-package (package &rest clauses)
"DEFINE-PACKAGE takes a PACKAGE and a number of CLAUSES, of the form
\(KEYWORD . ARGS\).
DEFINE-PACKAGE supports the following keywords:
USE, SHADOW, SHADOWING-IMPORT-FROM, IMPORT-FROM, EXPORT, INTERN -- as per CL:DEFPACKAGE.
RECYCLE -- Recycle the package's exported symbols from the specified packages,
in order. For every symbol scheduled to be exported by the DEFINE-PACKAGE,
either through an :EXPORT option or a :REEXPORT option, if the symbol exists in
one of the :RECYCLE packages, the first such symbol is re-homed to the package
being defined.
For the sake of idempotence, it is important that the package being defined
should appear in first position if it already exists, and even if it doesn't,
ahead of any package that is not going to be deleted afterwards and never
created again. In short, except for special cases, always make it the first
package on the list if the list is not empty.
MIX -- Takes a list of package designators. MIX behaves like
\(:USE PKG1 PKG2 ... PKGn\) but additionally uses :SHADOWING-IMPORT-FROM to
resolve conflicts in favor of the first found symbol. It may still yield
an error if there is a conflict with an explicitly :IMPORT-FROM symbol.
REEXPORT -- Takes a list of package designators. For each package, p, in the list,
export symbols with the same name as those exported from p. Note that in the case
of shadowing, etc. the symbols with the same name may not be the same symbols.
UNINTERN -- Remove symbols here from PACKAGE."
(let ((ensure-form
`(apply 'ensure-package ',(parse-define-package-form package clauses))))
`(progn
#+(or clasp ecl gcl mkcl) (defpackage ,package (:use))
(eval-when (:compile-toplevel :load-toplevel :execute)
,ensure-form))))
;;;; -------------------------------------------------------------------------
;;;; Handle compatibility with multiple implementations.
;;; This file is for papering over the deficiencies and peculiarities
;;; of various Common Lisp implementations.
;;; For implementation-specific access to the system, see os.lisp instead.
;;; A few functions are defined here, but actually exported from utility;
;;; from this package only common-lisp symbols are exported.
(uiop/package:define-package :uiop/common-lisp
(:nicknames :uoip/cl)
(:use :uiop/package)
(:use-reexport #-genera :common-lisp #+genera :future-common-lisp)
#+allegro (:intern #:*acl-warn-save*)
#+cormanlisp (:shadow #:user-homedir-pathname)
#+cormanlisp
(:export
#:logical-pathname #:translate-logical-pathname
#:make-broadcast-stream #:file-namestring)
#+genera (:shadowing-import-from :scl #:boolean)
#+genera (:export #:boolean #:ensure-directories-exist #:read-sequence #:write-sequence)
#+(or mcl cmucl) (:shadow #:user-homedir-pathname))
(in-package :uiop/common-lisp)
#-(or abcl allegro clasp clisp clozure cmucl cormanlisp ecl gcl genera lispworks mcl mkcl sbcl scl xcl)
(error "ASDF is not supported on your implementation. Please help us port it.")
;; (declaim (optimize (speed 1) (debug 3) (safety 3))) ; DON'T: trust implementation defaults.
;;;; Early meta-level tweaks
#+(or allegro clasp clisp clozure cmucl ecl mkcl sbcl)
(eval-when (:load-toplevel :compile-toplevel :execute)
(when (and #+allegro (member :ics *features*)
#+(or clasp clisp cmucl ecl mkcl) (member :unicode *features*)
#+clozure (member :openmcl-unicode-strings *features*)
#+sbcl (member :sb-unicode *features*))
;; Check for unicode at runtime, so that a hypothetical FASL compiled with unicode
;; but loaded in a non-unicode setting (e.g. on Allegro) won't tell a lie.
(pushnew :asdf-unicode *features*)))
#+allegro
(eval-when (:load-toplevel :compile-toplevel :execute)
;; We need to disable autoloading BEFORE any mention of package ASDF.
;; In particular, there must NOT be a mention of package ASDF in the defpackage of this file
;; or any previous file.
(setf excl::*autoload-package-name-alist*
(remove "asdf" excl::*autoload-package-name-alist*
:test 'equalp :key 'car))
(defparameter *acl-warn-save*
(when (boundp 'excl:*warn-on-nested-reader-conditionals*)
excl:*warn-on-nested-reader-conditionals*))
(when (boundp 'excl:*warn-on-nested-reader-conditionals*)
(setf excl:*warn-on-nested-reader-conditionals* nil))
(setf *print-readably* nil))
#+clasp
(eval-when (:load-toplevel :compile-toplevel :execute)
(setf *load-verbose* nil)
(defun use-ecl-byte-compiler-p () nil))
#+clozure (in-package :ccl)
#+(and clozure windows-target) ;; See http://trac.clozure.com/ccl/ticket/1117
(eval-when (:load-toplevel :compile-toplevel :execute)
(unless (fboundp 'external-process-wait)
(in-development-mode
(defun external-process-wait (proc)
(when (and (external-process-pid proc) (eq (external-process-%status proc) :running))
(with-interrupts-enabled
(wait-on-semaphore (external-process-completed proc))))
(values (external-process-%exit-code proc)
(external-process-%status proc))))))
#+clozure (in-package :uiop/common-lisp) ;; back in this package.
#+cmucl
(eval-when (:load-toplevel :compile-toplevel :execute)
(setf ext:*gc-verbose* nil)
(defun user-homedir-pathname ()
(first (ext:search-list (cl:user-homedir-pathname)))))
#+cormanlisp
(eval-when (:load-toplevel :compile-toplevel :execute)
(deftype logical-pathname () nil)
(defun make-broadcast-stream () *error-output*)
(defun translate-logical-pathname (x) x)
(defun user-homedir-pathname (&optional host)
(declare (ignore host))
(parse-namestring (format nil "~A\\" (cl:user-homedir-pathname))))
(defun file-namestring (p)
(setf p (pathname p))
(format nil "~@[~A~]~@[.~A~]" (pathname-name p) (pathname-type p))))
#+ecl
(eval-when (:load-toplevel :compile-toplevel :execute)
(setf *load-verbose* nil)
(defun use-ecl-byte-compiler-p () (and (member :ecl-bytecmp *features*) t))
(unless (use-ecl-byte-compiler-p) (require :cmp)))
#+gcl
(eval-when (:load-toplevel :compile-toplevel :execute)
(unless (member :ansi-cl *features*)
(error "ASDF only supports GCL in ANSI mode. Aborting.~%"))
(setf compiler::*compiler-default-type* (pathname "")
compiler::*lsp-ext* "")
#.(let ((code ;; Only support very recent GCL 2.7.0 from November 2013 or later.
(cond
#+gcl
((or (< system::*gcl-major-version* 2)
(and (= system::*gcl-major-version* 2)
(< system::*gcl-minor-version* 7)))
'(error "GCL 2.7 or later required to use ASDF")))))
(eval code)
code))
#+genera
(eval-when (:load-toplevel :compile-toplevel :execute)
(unless (fboundp 'lambda)
(defmacro lambda (&whole form &rest bvl-decls-and-body)
(declare (ignore bvl-decls-and-body)(zwei::indentation 1 1))
`#',(cons 'lisp::lambda (cdr form))))
(unless (fboundp 'ensure-directories-exist)
(defun ensure-directories-exist (path)
(fs:create-directories-recursively (pathname path))))
(unless (fboundp 'read-sequence)
(defun read-sequence (sequence stream &key (start 0) end)
(scl:send stream :string-in nil sequence start end)))
(unless (fboundp 'write-sequence)
(defun write-sequence (sequence stream &key (start 0) end)
(scl:send stream :string-out sequence start end)
sequence)))
#+lispworks
(eval-when (:load-toplevel :compile-toplevel :execute)
;; lispworks 3 and earlier cannot be checked for so we always assume
;; at least version 4
(unless (member :lispworks4 *features*)
(pushnew :lispworks5+ *features*)
(unless (member :lispworks5 *features*)
(pushnew :lispworks6+ *features*)
(unless (member :lispworks6 *features*)
(pushnew :lispworks7+ *features*)))))
#.(or #+mcl ;; the #$ doesn't work on other lisps, even protected by #+mcl, so we use this trick
(read-from-string
"(eval-when (:load-toplevel :compile-toplevel :execute)
(ccl:define-entry-point (_getenv \"getenv\") ((name :string)) :string)
(ccl:define-entry-point (_system \"system\") ((name :string)) :int)
;; Note: ASDF may expect user-homedir-pathname to provide
;; the pathname of the current user's home directory, whereas
;; MCL by default provides the directory from which MCL was started.
;; See http://code.google.com/p/mcl/wiki/Portability
(defun user-homedir-pathname ()
(ccl::findfolder #$kuserdomain #$kCurrentUserFolderType))
(defun probe-posix (posix-namestring)
\"If a file exists for the posix namestring, return the pathname\"
(ccl::with-cstrs ((cpath posix-namestring))
(ccl::rlet ((is-dir :boolean)
(fsref :fsref))
(when (eq #$noerr (#_fspathmakeref cpath fsref is-dir))
(ccl::%path-from-fsref fsref is-dir))))))"))
#+mkcl
(eval-when (:load-toplevel :compile-toplevel :execute)
(require :cmp)
(setq clos::*redefine-class-in-place* t)) ;; Make sure we have strict ANSI class redefinition semantics
;;;; Looping
(eval-when (:load-toplevel :compile-toplevel :execute)
(defmacro loop* (&rest rest)
#-genera `(loop ,@rest)
#+genera `(lisp:loop ,@rest))) ;; In genera, CL:LOOP can't destructure, so we use LOOP*. Sigh.
;;;; compatfmt: avoid fancy format directives when unsupported
(eval-when (:load-toplevel :compile-toplevel :execute)
(defun frob-substrings (string substrings &optional frob)
"for each substring in SUBSTRINGS, find occurrences of it within STRING
that don't use parts of matched occurrences of previous strings, and
FROB them, that is to say, remove them if FROB is NIL,
replace by FROB if FROB is a STRING, or if FROB is a FUNCTION,
call FROB with the match and a function that emits a string in the output.
Return a string made of the parts not omitted or emitted by FROB."
(declare (optimize (speed 0) (safety #-gcl 3 #+gcl 0) (debug 3)))
(let ((length (length string)) (stream nil))
(labels ((emit-string (x &optional (start 0) (end (length x)))
(when (< start end)
(unless stream (setf stream (make-string-output-stream)))
(write-string x stream :start start :end end)))
(emit-substring (start end)
(when (and (zerop start) (= end length))
(return-from frob-substrings string))
(emit-string string start end))
(recurse (substrings start end)
(cond
((>= start end))
((null substrings) (emit-substring start end))
(t (let* ((sub-spec (first substrings))
(sub (if (consp sub-spec) (car sub-spec) sub-spec))
(fun (if (consp sub-spec) (cdr sub-spec) frob))
(found (search sub string :start2 start :end2 end))
(more (rest substrings)))
(cond
(found
(recurse more start found)
(etypecase fun
(null)
(string (emit-string fun))
(function (funcall fun sub #'emit-string)))
(recurse substrings (+ found (length sub)) end))
(t
(recurse more start end))))))))
(recurse substrings 0 length))
(if stream (get-output-stream-string stream) "")))
(defmacro compatfmt (format)
#+(or gcl genera)
(frob-substrings format `("~3i~_" #+genera ,@'("~@<" "~@;" "~@:>" "~:>")))
#-(or gcl genera) format))
;;;; -------------------------------------------------------------------------
;;;; General Purpose Utilities for ASDF
(uiop/package:define-package :uiop/utility
(:use :uiop/common-lisp :uiop/package)
;; import and reexport a few things defined in :uiop/common-lisp
(:import-from :uiop/common-lisp #:compatfmt #:loop* #:frob-substrings
#+(or clasp ecl) #:use-ecl-byte-compiler-p #+mcl #:probe-posix)
(:export #:compatfmt #:loop* #:frob-substrings #:compatfmt
#+(or clasp ecl) #:use-ecl-byte-compiler-p #+mcl #:probe-posix)
(:export
;; magic helper to define debugging functions:
#:uiop-debug #:load-uiop-debug-utility #:*uiop-debug-utility*
#:with-upgradability ;; (un)defining functions in an upgrade-friendly way
#:defun* #:defgeneric*
#:nest #:if-let ;; basic flow control
#:parse-body ;; macro definition helper
#:while-collecting #:appendf #:length=n-p #:ensure-list ;; lists
#:remove-plist-keys #:remove-plist-key ;; plists
#:emptyp ;; sequences
#:+non-base-chars-exist-p+ ;; characters
#:+max-character-type-index+ #:character-type-index #:+character-types+
#:base-string-p #:strings-common-element-type #:reduce/strcat #:strcat ;; strings
#:first-char #:last-char #:split-string #:stripln #:+cr+ #:+lf+ #:+crlf+
#:string-prefix-p #:string-enclosed-p #:string-suffix-p
#:standard-case-symbol-name #:find-standard-case-symbol ;; symbols
#:coerce-class ;; CLOS
#:stamp< #:stamps< #:stamp*< #:stamp<= ;; stamps
#:earlier-stamp #:stamps-earliest #:earliest-stamp
#:later-stamp #:stamps-latest #:latest-stamp #:latest-stamp-f
#:list-to-hash-set #:ensure-gethash ;; hash-table
#:ensure-function #:access-at #:access-at-count ;; functions
#:call-function #:call-functions #:register-hook-function
#:lexicographic< #:lexicographic<= ;; version
#:simple-style-warning #:style-warn ;; simple style warnings
#:match-condition-p #:match-any-condition-p ;; conditions
#:call-with-muffled-conditions #:with-muffled-conditions
#:not-implemented-error #:parameter-error))
(in-package :uiop/utility)
;;;; Defining functions in a way compatible with hot-upgrade:
;; DEFUN* and DEFGENERIC* use FMAKUNBOUND to delete any previous fdefinition,
;; thus replacing the function without warning or error
;; even if the signature and/or generic-ness of the function has changed.
;; For a generic function, this invalidates any previous DEFMETHOD.
(eval-when (:load-toplevel :compile-toplevel :execute)
(macrolet
((defdef (def* def)
`(defmacro ,def* (name formals &rest rest)
(destructuring-bind (name &key (supersede t))
(if (or (atom name) (eq (car name) 'setf))
(list name :supersede nil)
name)
(declare (ignorable supersede))
`(progn
;; We usually try to do it only for the functions that need it,
;; which happens in asdf/upgrade - however, for ECL, we need this hammer.
,@(when supersede
`((fmakunbound ',name)))
,@(when (and #+(or clasp ecl) (symbolp name)) ; fails for setf functions on ecl
`((declaim (notinline ,name))))
(,',def ,name ,formals ,@rest))))))
(defdef defgeneric* defgeneric)
(defdef defun* defun))
(defmacro with-upgradability ((&optional) &body body)
"Evaluate BODY at compile- load- and run- times, with DEFUN and DEFGENERIC modified
to also declare the functions NOTINLINE and to accept a wrapping the function name
specification into a list with keyword argument SUPERSEDE (which defaults to T if the name
is not wrapped, and NIL if it is wrapped). If SUPERSEDE is true, call UNDEFINE-FUNCTION
to supersede any previous definition."
`(eval-when (:compile-toplevel :load-toplevel :execute)
,@(loop :for form :in body :collect
(if (consp form)
(destructuring-bind (car . cdr) form
(case car
((defun) `(defun* ,@cdr))
((defgeneric) `(defgeneric* ,@cdr))
(otherwise form)))
form)))))
;;; Magic debugging help. See contrib/debug.lisp
(with-upgradability ()
(defvar *uiop-debug-utility*
'(or (ignore-errors
(symbol-call :asdf :system-relative-pathname :uiop "contrib/debug.lisp"))
(symbol-call :uiop/pathname :subpathname (user-homedir-pathname) "common-lisp/asdf/uiop/contrib/debug.lisp"))
"form that evaluates to the pathname to your favorite debugging utilities")
(defmacro uiop-debug (&rest keys)
`(eval-when (:compile-toplevel :load-toplevel :execute)
(load-uiop-debug-utility ,@keys)))
(defun load-uiop-debug-utility (&key package utility-file)
(let* ((*package* (if package (find-package package) *package*))
(keyword (read-from-string
(format nil ":DBG-~:@(~A~)" (package-name *package*)))))
(unless (member keyword *features*)
(let* ((utility-file (or utility-file *uiop-debug-utility*))
(file (ignore-errors (probe-file (eval utility-file)))))
(if file (load file)
(error "Failed to locate debug utility file: ~S" utility-file)))))))
;;; Flow control
(with-upgradability ()
(defmacro nest (&rest things)
"Macro to do keep code nesting and indentation under control." ;; Thanks to mbaringer
(reduce #'(lambda (outer inner) `(,@outer ,inner))
things :from-end t))
(defmacro if-let (bindings &body (then-form &optional else-form)) ;; from alexandria
;; bindings can be (var form) or ((var1 form1) ...)
(let* ((binding-list (if (and (consp bindings) (symbolp (car bindings)))
(list bindings)
bindings))
(variables (mapcar #'car binding-list)))
`(let ,binding-list
(if (and ,@variables)
,then-form
,else-form)))))
;;; Macro definition helper
(with-upgradability ()
(defun parse-body (body &key documentation whole) ;; from alexandria
"Parses BODY into (values remaining-forms declarations doc-string).
Documentation strings are recognized only if DOCUMENTATION is true.
Syntax errors in body are signalled and WHOLE is used in the signal
arguments when given."
(let ((doc nil)
(decls nil)
(current nil))
(tagbody
:declarations
(setf current (car body))
(when (and documentation (stringp current) (cdr body))
(if doc
(error "Too many documentation strings in ~S." (or whole body))
(setf doc (pop body)))
(go :declarations))
(when (and (listp current) (eql (first current) 'declare))
(push (pop body) decls)
(go :declarations)))
(values body (nreverse decls) doc))))
;;; List manipulation
(with-upgradability ()
(defmacro while-collecting ((&rest collectors) &body body)
"COLLECTORS should be a list of names for collections. A collector
defines a function that, when applied to an argument inside BODY, will
add its argument to the corresponding collection. Returns multiple values,
a list for each collection, in order.
E.g.,
\(while-collecting \(foo bar\)
\(dolist \(x '\(\(a 1\) \(b 2\) \(c 3\)\)\)
\(foo \(first x\)\)
\(bar \(second x\)\)\)\)
Returns two values: \(A B C\) and \(1 2 3\)."
(let ((vars (mapcar #'(lambda (x) (gensym (symbol-name x))) collectors))
(initial-values (mapcar (constantly nil) collectors)))
`(let ,(mapcar #'list vars initial-values)
(flet ,(mapcar #'(lambda (c v) `(,c (x) (push x ,v) (values))) collectors vars)
,@body
(values ,@(mapcar #'(lambda (v) `(reverse ,v)) vars))))))
(define-modify-macro appendf (&rest args)
append "Append onto list") ;; only to be used on short lists.
(defun length=n-p (x n) ;is it that (= (length x) n) ?
(check-type n (integer 0 *))
(loop
:for l = x :then (cdr l)
:for i :downfrom n :do
(cond
((zerop i) (return (null l)))
((not (consp l)) (return nil)))))
(defun ensure-list (x)
(if (listp x) x (list x))))
;;; Remove a key from a plist, i.e. for keyword argument cleanup
(with-upgradability ()
(defun remove-plist-key (key plist)
"Remove a single key from a plist"
(loop* :for (k v) :on plist :by #'cddr
:unless (eq k key)
:append (list k v)))
(defun remove-plist-keys (keys plist)
"Remove a list of keys from a plist"
(loop* :for (k v) :on plist :by #'cddr
:unless (member k keys)
:append (list k v))))
;;; Sequences
(with-upgradability ()
(defun emptyp (x)
"Predicate that is true for an empty sequence"
(or (null x) (and (vectorp x) (zerop (length x))))))
;;; Characters
(with-upgradability ()
;; base-char != character on ECL, LW, SBCL, Genera.
;; NB: We assume a total order on character types.
;; If that's not true... this code will need to be updated.
(defparameter +character-types+ ;; assuming a simple hierarchy
#.(coerce (loop* :for (type next) :on
'(;; In SCL, all characters seem to be 16-bit base-char
;; Yet somehow character fails to be a subtype of base-char
#-scl base-char
;; LW6 has BASE-CHAR < SIMPLE-CHAR < CHARACTER
;; LW7 has BASE-CHAR < BMP-CHAR < SIMPLE-CHAR = CHARACTER
#+lispworks7+ lw:bmp-char
#+lispworks lw:simple-char
character)
:unless (and next (subtypep next type))
:collect type) 'vector))
(defparameter +max-character-type-index+ (1- (length +character-types+)))
(defconstant +non-base-chars-exist-p+ (plusp +max-character-type-index+))
(when +non-base-chars-exist-p+ (pushnew :non-base-chars-exist-p *features*)))
(with-upgradability ()
(defun character-type-index (x)
(declare (ignorable x))
#.(case +max-character-type-index+
(0 0)
(1 '(etypecase x
(character (if (typep x 'base-char) 0 1))
(symbol (if (subtypep x 'base-char) 0 1))))
(otherwise
'(or (position-if (etypecase x
(character #'(lambda (type) (typep x type)))
(symbol #'(lambda (type) (subtypep x type))))
+character-types+)
(error "Not a character or character type: ~S" x))))))
;;; Strings
(with-upgradability ()
(defun base-string-p (string)
"Does the STRING only contain BASE-CHARs?"
(declare (ignorable string))
(and #+non-base-chars-exist-p (eq 'base-char (array-element-type string))))
(defun strings-common-element-type (strings)
"What least subtype of CHARACTER can contain all the elements of all the STRINGS?"
(declare (ignorable strings))
#.(if +non-base-chars-exist-p+
`(aref +character-types+
(loop :with index = 0 :for s :in strings :do
(flet ((consider (i)
(cond ((= i ,+max-character-type-index+) (return i))
,@(when (> +max-character-type-index+ 1) `(((> i index) (setf index i)))))))
(cond
((emptyp s)) ;; NIL or empty string
((characterp s) (consider (character-type-index s)))
((stringp s) (let ((string-type-index
(character-type-index (array-element-type s))))
(unless (>= index string-type-index)
(loop :for c :across s :for i = (character-type-index c)
:do (consider i)
,@(when (> +max-character-type-index+ 1)
`((when (= i string-type-index) (return))))))))
(t (error "Invalid string designator ~S for ~S" s 'strings-common-element-type))))
:finally (return index)))
''character))
(defun reduce/strcat (strings &key key start end)
"Reduce a list as if by STRCAT, accepting KEY START and END keywords like REDUCE.
NIL is interpreted as an empty string. A character is interpreted as a string of length one."
(when (or start end) (setf strings (subseq strings start end)))
(when key (setf strings (mapcar key strings)))
(loop :with output = (make-string (loop :for s :in strings
:sum (if (characterp s) 1 (length s)))
:element-type (strings-common-element-type strings))
:with pos = 0
:for input :in strings
:do (etypecase input
(null)
(character (setf (char output pos) input) (incf pos))
(string (replace output input :start1 pos) (incf pos (length input))))
:finally (return output)))
(defun strcat (&rest strings)
"Concatenate strings.
NIL is interpreted as an empty string, a character as a string of length one."
(reduce/strcat strings))
(defun first-char (s)
"Return the first character of a non-empty string S, or NIL"
(and (stringp s) (plusp (length s)) (char s 0)))
(defun last-char (s)
"Return the last character of a non-empty string S, or NIL"
(and (stringp s) (plusp (length s)) (char s (1- (length s)))))
(defun split-string (string &key max (separator '(#\Space #\Tab)))
"Split STRING into a list of components separated by
any of the characters in the sequence SEPARATOR.
If MAX is specified, then no more than max(1,MAX) components will be returned,
starting the separation from the end, e.g. when called with arguments
\"a.b.c.d.e\" :max 3 :separator \".\" it will return (\"a.b.c\" \"d\" \"e\")."
(block ()
(let ((list nil) (words 0) (end (length string)))
(when (zerop end) (return nil))
(flet ((separatorp (char) (find char separator))
(done () (return (cons (subseq string 0 end) list))))
(loop
:for start = (if (and max (>= words (1- max)))
(done)
(position-if #'separatorp string :end end :from-end t))
:do (when (null start) (done))
(push (subseq string (1+ start) end) list)
(incf words)
(setf end start))))))
(defun string-prefix-p (prefix string)
"Does STRING begin with PREFIX?"
(let* ((x (string prefix))
(y (string string))
(lx (length x))
(ly (length y)))
(and (<= lx ly) (string= x y :end2 lx))))
(defun string-suffix-p (string suffix)
"Does STRING end with SUFFIX?"
(let* ((x (string string))
(y (string suffix))
(lx (length x))
(ly (length y)))
(and (<= ly lx) (string= x y :start1 (- lx ly)))))
(defun string-enclosed-p (prefix string suffix)
"Does STRING begin with PREFIX and end with SUFFIX?"
(and (string-prefix-p prefix string)
(string-suffix-p string suffix)))
(defvar +cr+ (coerce #(#\Return) 'string))
(defvar +lf+ (coerce #(#\Linefeed) 'string))
(defvar +crlf+ (coerce #(#\Return #\Linefeed) 'string))
(defun stripln (x)
"Strip a string X from any ending CR, LF or CRLF.
Return two values, the stripped string and the ending that was stripped,
or the original value and NIL if no stripping took place.
Since our STRCAT accepts NIL as empty string designator,
the two results passed to STRCAT always reconstitute the original string"
(check-type x string)
(block nil
(flet ((c (end) (when (string-suffix-p x end)
(return (values (subseq x 0 (- (length x) (length end))) end)))))
(when x (c +crlf+) (c +lf+) (c +cr+) (values x nil)))))
(defun standard-case-symbol-name (name-designator)
"Given a NAME-DESIGNATOR for a symbol, if it is a symbol, convert it to a string using STRING;
if it is a string, use STRING-UPCASE on an ANSI CL platform, or STRING on a so-called \"modern\"
platform such as Allegro with modern syntax."
(check-type name-designator (or string symbol))
(cond
((or (symbolp name-designator) #+allegro (eq excl:*current-case-mode* :case-sensitive-lower))
(string name-designator))
;; Should we be doing something on CLISP?
(t (string-upcase name-designator))))
(defun find-standard-case-symbol (name-designator package-designator &optional (error t))
"Find a symbol designated by NAME-DESIGNATOR in a package designated by PACKAGE-DESIGNATOR,
where STANDARD-CASE-SYMBOL-NAME is used to transform them if these designators are strings.
If optional ERROR argument is NIL, return NIL instead of an error when the symbol is not found."
(find-symbol* (standard-case-symbol-name name-designator)
(etypecase package-designator
((or package symbol) package-designator)
(string (standard-case-symbol-name package-designator)))
error)))
;;; stamps: a REAL or a boolean where NIL=-infinity, T=+infinity
(eval-when (#-lispworks :compile-toplevel :load-toplevel :execute)
(deftype stamp () '(or real boolean)))
(with-upgradability ()
(defun stamp< (x y)
(etypecase x
(null (and y t))
((eql t) nil)
(real (etypecase y
(null nil)
((eql t) t)
(real (< x y))))))
(defun stamps< (list) (loop :for y :in list :for x = nil :then y :always (stamp< x y)))
(defun stamp*< (&rest list) (stamps< list))
(defun stamp<= (x y) (not (stamp< y x)))
(defun earlier-stamp (x y) (if (stamp< x y) x y))
(defun stamps-earliest (list) (reduce 'earlier-stamp list :initial-value t))
(defun earliest-stamp (&rest list) (stamps-earliest list))
(defun later-stamp (x y) (if (stamp< x y) y x))
(defun stamps-latest (list) (reduce 'later-stamp list :initial-value nil))
(defun latest-stamp (&rest list) (stamps-latest list))
(define-modify-macro latest-stamp-f (&rest stamps) latest-stamp))
;;; Function designators
(with-upgradability ()
(defun ensure-function (fun &key (package :cl))
"Coerce the object FUN into a function.
If FUN is a FUNCTION, return it.
If the FUN is a non-sequence literal constant, return constantly that,
i.e. for a boolean keyword character number or pathname.
Otherwise if FUN is a non-literally constant symbol, return its FDEFINITION.
If FUN is a CONS, return the function that applies its CAR
to the appended list of the rest of its CDR and the arguments,
unless the CAR is LAMBDA, in which case the expression is evaluated.
If FUN is a string, READ a form from it in the specified PACKAGE (default: CL)
and EVAL that in a (FUNCTION ...) context."
(etypecase fun
(function fun)
((or boolean keyword character number pathname) (constantly fun))
(hash-table #'(lambda (x) (gethash x fun)))
(symbol (fdefinition fun))
(cons (if (eq 'lambda (car fun))
(eval fun)
#'(lambda (&rest args) (apply (car fun) (append (cdr fun) args)))))
(string (eval `(function ,(with-standard-io-syntax
(let ((*package* (find-package package)))
(read-from-string fun))))))))
(defun access-at (object at)
"Given an OBJECT and an AT specifier, list of successive accessors,
call each accessor on the result of the previous calls.
An accessor may be an integer, meaning a call to ELT,
a keyword, meaning a call to GETF,
NIL, meaning identity,
a function or other symbol, meaning itself,
or a list of a function designator and arguments, interpreted as per ENSURE-FUNCTION.
As a degenerate case, the AT specifier may be an atom of a single such accessor
instead of a list."
(flet ((access (object accessor)
(etypecase accessor
(function (funcall accessor object))
(integer (elt object accessor))
(keyword (getf object accessor))
(null object)
(symbol (funcall accessor object))
(cons (funcall (ensure-function accessor) object)))))
(if (listp at)
(dolist (accessor at object)
(setf object (access object accessor)))
(access object at))))
(defun access-at-count (at)
"From an AT specification, extract a COUNT of maximum number
of sub-objects to read as per ACCESS-AT"
(cond
((integerp at)
(1+ at))
((and (consp at) (integerp (first at)))
(1+ (first at)))))
(defun call-function (function-spec &rest arguments)
"Call the function designated by FUNCTION-SPEC as per ENSURE-FUNCTION,
with the given ARGUMENTS"
(apply (ensure-function function-spec) arguments))
(defun call-functions (function-specs)
"For each function in the list FUNCTION-SPECS, in order, call the function as per CALL-FUNCTION"
(map () 'call-function function-specs))
(defun register-hook-function (variable hook &optional call-now-p)
"Push the HOOK function (a designator as per ENSURE-FUNCTION) onto the hook VARIABLE.
When CALL-NOW-P is true, also call the function immediately."
(pushnew hook (symbol-value variable) :test 'equal)
(when call-now-p (call-function hook))))
;;; CLOS
(with-upgradability ()
(defun coerce-class (class &key (package :cl) (super t) (error 'error))
"Coerce CLASS to a class that is subclass of SUPER if specified,
or invoke ERROR handler as per CALL-FUNCTION.
A keyword designates the name a symbol, which when found in either PACKAGE, designates a class.
-- for backward compatibility, *PACKAGE* is also accepted for now, but this may go in the future.
A string is read as a symbol while in PACKAGE, the symbol designates a class.
A class object designates itself.
NIL designates itself (no class).
A symbol otherwise designates a class by name."
(let* ((normalized
(typecase class
(keyword (or (find-symbol* class package nil)
(find-symbol* class *package* nil)))
(string (symbol-call :uiop :safe-read-from-string class :package package))
(t class)))
(found
(etypecase normalized
((or standard-class built-in-class) normalized)
((or null keyword) nil)
(symbol (find-class normalized nil nil))))
(super-class
(etypecase super
((or standard-class built-in-class) super)
((or null keyword) nil)
(symbol (find-class super nil nil)))))
#+allegro (when found (mop:finalize-inheritance found))
(or (and found
(or (eq super t) (#-cormanlisp subtypep #+cormanlisp cl::subclassp found super-class))
found)
(call-function error "Can't coerce ~S to a ~:[class~;subclass of ~:*~S~]" class super)))))
;;; Hash-tables
(with-upgradability ()
(defun ensure-gethash (key table default)
"Lookup the TABLE for a KEY as by GETHASH, but if not present,
call the (possibly constant) function designated by DEFAULT as per CALL-FUNCTION,
set the corresponding entry to the result in the table.
Return two values: the entry after its optional computation, and whether it was found"
(multiple-value-bind (value foundp) (gethash key table)
(values
(if foundp
value
(setf (gethash key table) (call-function default)))
foundp)))
(defun list-to-hash-set (list &aux (h (make-hash-table :test 'equal)))
"Convert a LIST into hash-table that has the same elements when viewed as a set,
up to the given equality TEST"
(dolist (x list h) (setf (gethash x h) t))))
;;; Lexicographic comparison of lists of numbers
(with-upgradability ()
(defun lexicographic< (element< x y)
"Lexicographically compare two lists of using the function element< to compare elements.
element< is a strict total order; the resulting order on X and Y will also be strict."
(cond ((null y) nil)
((null x) t)
((funcall element< (car x) (car y)) t)
((funcall element< (car y) (car x)) nil)
(t (lexicographic< element< (cdr x) (cdr y)))))
(defun lexicographic<= (element< x y)
"Lexicographically compare two lists of using the function element< to compare elements.
element< is a strict total order; the resulting order on X and Y will be a non-strict total order."
(not (lexicographic< element< y x))))
;;; Simple style warnings
(with-upgradability ()
(define-condition simple-style-warning
#+sbcl (sb-int:simple-style-warning) #-sbcl (simple-condition style-warning)
())
(defun style-warn (datum &rest arguments)
(etypecase datum
(string (warn (make-condition 'simple-style-warning :format-control datum :format-arguments arguments)))
(symbol (assert (subtypep datum 'style-warning)) (apply 'warn datum arguments))
(style-warning (apply 'warn datum arguments)))))
;;; Condition control
(with-upgradability ()
(defparameter +simple-condition-format-control-slot+
#+abcl 'system::format-control
#+allegro 'excl::format-control
#+(or clasp ecl mkcl) 'si::format-control
#+clisp 'system::$format-control
#+clozure 'ccl::format-control
#+(or cmucl scl) 'conditions::format-control
#+(or gcl lispworks) 'conditions::format-string
#+sbcl 'sb-kernel:format-control
#-(or abcl allegro clasp clisp clozure cmucl ecl gcl lispworks mkcl sbcl scl) nil
"Name of the slot for FORMAT-CONTROL in simple-condition")
(defun match-condition-p (x condition)
"Compare received CONDITION to some pattern X:
a symbol naming a condition class,
a simple vector of length 2, arguments to find-symbol* with result as above,
or a string describing the format-control of a simple-condition."
(etypecase x
(symbol (typep condition x))
((simple-vector 2)
(ignore-errors (typep condition (find-symbol* (svref x 0) (svref x 1) nil))))
(function (funcall x condition))
(string (and (typep condition 'simple-condition)
;; On SBCL, it's always set and the check triggers a warning
#+(or allegro clozure cmucl lispworks scl)
(slot-boundp condition +simple-condition-format-control-slot+)
(ignore-errors (equal (simple-condition-format-control condition) x))))))
(defun match-any-condition-p (condition conditions)
"match CONDITION against any of the patterns of CONDITIONS supplied"
(loop :for x :in conditions :thereis (match-condition-p x condition)))
(defun call-with-muffled-conditions (thunk conditions)
"calls the THUNK in a context where the CONDITIONS are muffled"
(handler-bind ((t #'(lambda (c) (when (match-any-condition-p c conditions)
(muffle-warning c)))))
(funcall thunk)))
(defmacro with-muffled-conditions ((conditions) &body body)
"Shorthand syntax for CALL-WITH-MUFFLED-CONDITIONS"
`(call-with-muffled-conditions #'(lambda () ,@body) ,conditions)))
;;; Conditions
(with-upgradability ()
(define-condition not-implemented-error (error)
((functionality :initarg :functionality)
(format-control :initarg :format-control)
(format-arguments :initarg :format-arguments))
(:report (lambda (condition stream)
(format stream "Not (currently) implemented on ~A: ~S~@[ ~?~]"
(nth-value 1 (symbol-call :uiop :implementation-type))
(slot-value condition 'functionality)
(slot-value condition 'format-control)
(slot-value condition 'format-arguments)))))
(defun not-implemented-error (functionality &optional format-control &rest format-arguments)
"Signal an error because some FUNCTIONALITY is not implemented in the current version
of the software on the current platform; it may or may not be implemented in different combinations
of version of the software and of the underlying platform. Optionally, report a formatted error
message."
(error 'not-implemented-error
:functionality functionality
:format-control format-control
:format-arguments format-arguments))
(define-condition parameter-error (error)
((functionality :initarg :functionality)
(format-control :initarg :format-control)
(format-arguments :initarg :format-arguments))
(:report (lambda (condition stream)
(apply 'format stream
(slot-value condition 'format-control)
(slot-value condition 'functionality)
(slot-value condition 'format-arguments)))))
;; Note that functionality MUST be passed as the second argument to parameter-error, just after
;; the format-control. If you want it to not appear in first position in actual message, use
;; ~* and ~:* to adjust parameter order.
(defun parameter-error (format-control functionality &rest format-arguments)
"Signal an error because some FUNCTIONALITY or its specific implementation on a given underlying
platform does not accept a given parameter or combination of parameters. Report a formatted error
message, that takes the functionality as its first argument (that can be skipped with ~*)."
(error 'parameter-error
:functionality functionality
:format-control format-control
:format-arguments format-arguments)))
(uiop/package:define-package :uiop/version
(:recycle :uiop/version :uiop/utility :asdf)
(:use :uiop/common-lisp :uiop/package :uiop/utility)
(:export
#:*uiop-version*
#:parse-version #:unparse-version #:version< #:version<= ;; version support, moved from uiop/utility
#:next-version
#:deprecated-function-condition #:deprecated-function-name ;; deprecation control
#:deprecated-function-style-warning #:deprecated-function-warning
#:deprecated-function-error #:deprecated-function-should-be-deleted
#:version-deprecation #:with-deprecation))
(in-package :uiop/version)
(with-upgradability ()
(defparameter *uiop-version* "3.2.1")
(defun unparse-version (version-list)
"From a parsed version (a list of natural numbers), compute the version string"
(format nil "~{~D~^.~}" version-list))
(defun parse-version (version-string &optional on-error)
"Parse a VERSION-STRING as a series of natural numbers separated by dots.
Return a (non-null) list of integers if the string is valid;
otherwise return NIL.
When invalid, ON-ERROR is called as per CALL-FUNCTION before to return NIL,
with format arguments explaining why the version is invalid.
ON-ERROR is also called if the version is not canonical
in that it doesn't print back to itself, but the list is returned anyway."
(block nil
(unless (stringp version-string)
(call-function on-error "~S: ~S is not a string" 'parse-version version-string)
(return))
(unless (loop :for prev = nil :then c :for c :across version-string
:always (or (digit-char-p c)
(and (eql c #\.) prev (not (eql prev #\.))))
:finally (return (and c (digit-char-p c))))
(call-function on-error "~S: ~S doesn't follow asdf version numbering convention"
'parse-version version-string)
(return))
(let* ((version-list
(mapcar #'parse-integer (split-string version-string :separator ".")))
(normalized-version (unparse-version version-list)))
(unless (equal version-string normalized-version)
(call-function on-error "~S: ~S contains leading zeros" 'parse-version version-string))
version-list)))
(defun next-version (version)
"When VERSION is not nil, it is a string, then parse it as a version, compute the next version
and return it as a string."
(when version
(let ((version-list (parse-version version)))
(incf (car (last version-list)))
(unparse-version version-list))))
(defun version< (version1 version2)
"Given two version strings, return T if the second is strictly newer"
(let ((v1 (parse-version version1 nil))
(v2 (parse-version version2 nil)))
(lexicographic< '< v1 v2)))
(defun version<= (version1 version2)
"Given two version strings, return T if the second is newer or the same"
(not (version< version2 version1))))
(with-upgradability ()
(define-condition deprecated-function-condition (condition)
((name :initarg :name :reader deprecated-function-name)))
(define-condition deprecated-function-style-warning (deprecated-function-condition style-warning) ())
(define-condition deprecated-function-warning (deprecated-function-condition warning) ())
(define-condition deprecated-function-error (deprecated-function-condition error) ())
(define-condition deprecated-function-should-be-deleted (deprecated-function-condition error) ())
(defun deprecated-function-condition-kind (type)
(ecase type
((deprecated-function-style-warning) :style-warning)
((deprecated-function-warning) :warning)
((deprecated-function-error) :error)
((deprecated-function-should-be-deleted) :delete)))
(defmethod print-object ((c deprecated-function-condition) stream)
(let ((name (deprecated-function-name c)))
(cond
(*print-readably*
(let ((fmt "#.(make-condition '~S :name ~S)")
(args (list (type-of c) name)))
(if *read-eval*
(apply 'format stream fmt args)
(error "Can't print ~?" fmt args))))
(*print-escape*
(print-unreadable-object (c stream :type t) (format stream ":name ~S" name)))
(t
(let ((*package* (find-package :cl))
(type (type-of c)))
(format stream
(if (eq type 'deprecated-function-should-be-deleted)
"~A: Still defining deprecated function~:P ~{~S~^ ~} that promised to delete"
"~A: Using deprecated function ~S -- please update your code to use a newer API.~
~@[~%The docstring for this function says:~%~A~%~]")
type name (when (symbolp name) (documentation name 'function))))))))
(defun notify-deprecated-function (status name)
(ecase status
((nil) nil)
((:style-warning) (style-warn 'deprecated-function-style-warning :name name))
((:warning) (warn 'deprecated-function-warning :name name))
((:error) (cerror "USE FUNCTION ANYWAY" 'deprecated-function-error :name name))))
(defun version-deprecation (version &key (style-warning nil)
(warning (next-version style-warning))
(error (next-version warning))
(delete (next-version error)))
"Given a VERSION string, and the starting versions for notifying the programmer of
various levels of deprecation, return the current level of deprecation as per WITH-DEPRECATION
that is the highest level that has a declared version older than the specified version.
Each start version for a level of deprecation can be specified by a keyword argument, or
if left unspecified, will be the NEXT-VERSION of the immediate lower level of deprecation."
(cond
((and delete (version<= delete version)) :delete)
((and error (version<= error version)) :error)
((and warning (version<= warning version)) :warning)
((and style-warning (version<= style-warning version)) :style-warning)))
(defmacro with-deprecation ((level) &body definitions)
"Given a deprecation LEVEL (a form to be EVAL'ed at macro-expansion time), instrument the
DEFUN and DEFMETHOD forms in DEFINITIONS to notify the programmer of the deprecation of the function
when it is compiled or called.
Increasing levels (as result from evaluating LEVEL) are: NIL (not deprecated yet),
:STYLE-WARNING (a style warning is issued when used), :WARNING (a full warning is issued when used),
:ERROR (a continuable error instead), and :DELETE (it's an error if the code is still there while
at that level).
Forms other than DEFUN and DEFMETHOD are not instrumented, and you can protect a DEFUN or DEFMETHOD
from instrumentation by enclosing it in a PROGN."
(let ((level (eval level)))
(check-type level (member nil :style-warning :warning :error :delete))
(when (eq level :delete)
(error 'deprecated-function-should-be-deleted :name
(mapcar 'second
(remove-if-not #'(lambda (x) (member x '(defun defmethod)))
definitions :key 'first))))
(labels ((instrument (name head body whole)
(if level
(let ((notifiedp
(intern (format nil "*~A-~A-~A-~A*"
:deprecated-function level name :notified-p))))
(multiple-value-bind (remaining-forms declarations doc-string)
(parse-body body :documentation t :whole whole)
`(progn
(defparameter ,notifiedp nil)
;; tell some implementations to use the compiler-macro
(declaim (inline ,name))
(define-compiler-macro ,name (&whole form &rest args)
(declare (ignore args))
(notify-deprecated-function ,level ',name)
form)
(,@head ,@(when doc-string (list doc-string)) ,@declarations
(unless ,notifiedp
(setf ,notifiedp t)
(notify-deprecated-function ,level ',name))
,@remaining-forms))))
`(progn
(eval-when (:compile-toplevel :load-toplevel :execute)
(setf (compiler-macro-function ',name) nil))
(declaim (notinline ,name))
(,@head ,@body)))))
`(progn
,@(loop :for form :in definitions :collect
(cond
((and (consp form) (eq (car form) 'defun))
(instrument (second form) (subseq form 0 3) (subseq form 3) form))
((and (consp form) (eq (car form) 'defmethod))
(let ((body-start (if (listp (third form)) 3 4)))
(instrument (second form)
(subseq form 0 body-start)
(subseq form body-start)
form)))
(t
form))))))))
;;;; ---------------------------------------------------------------------------
;;;; Access to the Operating System
(uiop/package:define-package :uiop/os
(:use :uiop/common-lisp :uiop/package :uiop/utility)
(:export
#:featurep #:os-unix-p #:os-macosx-p #:os-windows-p #:os-genera-p #:detect-os ;; features
#:os-cond
#:getenv #:getenvp ;; environment variables
#:implementation-identifier ;; implementation identifier
#:implementation-type #:*implementation-type*
#:operating-system #:architecture #:lisp-version-string
#:hostname #:getcwd #:chdir
;; Windows shortcut support
#:read-null-terminated-string #:read-little-endian
#:parse-file-location-info #:parse-windows-shortcut))
(in-package :uiop/os)
;;; Features
(with-upgradability ()
(defun featurep (x &optional (*features* *features*))
"Checks whether a feature expression X is true with respect to the *FEATURES* set,
as per the CLHS standard for #+ and #-. Beware that just like the CLHS,
we assume symbols from the KEYWORD package are used, but that unless you're using #+/#-
your reader will not have magically used the KEYWORD package, so you need specify
keywords explicitly."
(cond
((atom x) (and (member x *features*) t))
((eq :not (car x)) (assert (null (cddr x))) (not (featurep (cadr x))))
((eq :or (car x)) (some #'featurep (cdr x)))
((eq :and (car x)) (every #'featurep (cdr x)))
(t (parameter-error "~S: malformed feature specification ~S" 'featurep x))))
;; Starting with UIOP 3.1.5, these are runtime tests.
;; You may bind *features* with a copy of what your target system offers to test its properties.
(defun os-macosx-p ()
"Is the underlying operating system MacOS X?"
;; OS-MACOSX is not mutually exclusive with OS-UNIX,
;; in fact the former implies the latter.
(featurep '(:or :darwin (:and :allegro :macosx) (:and :clisp :macos))))
(defun os-unix-p ()
"Is the underlying operating system some Unix variant?"
(or (featurep '(:or :unix :cygwin)) (os-macosx-p)))
(defun os-windows-p ()
"Is the underlying operating system Microsoft Windows?"
(and (not (os-unix-p)) (featurep '(:or :win32 :windows :mswindows :mingw32 :mingw64))))
(defun os-genera-p ()
"Is the underlying operating system Genera (running on a Symbolics Lisp Machine)?"
(featurep :genera))
(defun os-oldmac-p ()
"Is the underlying operating system an (emulated?) MacOS 9 or earlier?"
(featurep :mcl))
(defun os-haiku-p ()
"Is the underlying operating system Haiku?"
(featurep :haiku))
(defun detect-os ()
"Detects the current operating system. Only needs be run at compile-time,
except on ABCL where it might change between FASL compilation and runtime."
(loop* :with o
:for (feature . detect) :in '((:os-unix . os-unix-p) (:os-macosx . os-macosx-p)
(:os-windows . os-windows-p)
(:genera . os-genera-p) (:os-oldmac . os-oldmac-p)
(:haiku . os-haiku-p))
:when (and (or (not o) (eq feature :os-macosx)) (funcall detect))
:do (setf o feature) (pushnew feature *features*)
:else :do (setf *features* (remove feature *features*))
:finally
(return (or o (error "Congratulations for trying ASDF on an operating system~%~
that is neither Unix, nor Windows, nor Genera, nor even old MacOS.~%Now you port it.")))))
(defmacro os-cond (&rest clauses)
#+abcl `(cond ,@clauses)
#-abcl (loop* :for (test . body) :in clauses :when (eval test) :return `(progn ,@body)))
(detect-os))
;;;; Environment variables: getting them, and parsing them.
(with-upgradability ()
(defun getenv (x)
"Query the environment, as in C getenv.
Beware: may return empty string if a variable is present but empty;
use getenvp to return NIL in such a case."
(declare (ignorable x))
#+(or abcl clasp clisp ecl xcl) (ext:getenv x)
#+allegro (sys:getenv x)
#+clozure (ccl:getenv x)
#+cmucl (unix:unix-getenv x)
#+scl (cdr (assoc x ext:*environment-list* :test #'string=))
#+cormanlisp
(let* ((buffer (ct:malloc 1))
(cname (ct:lisp-string-to-c-string x))
(needed-size (win:getenvironmentvariable cname buffer 0))
(buffer1 (ct:malloc (1+ needed-size))))
(prog1 (if (zerop (win:getenvironmentvariable cname buffer1 needed-size))
nil
(ct:c-string-to-lisp-string buffer1))
(ct:free buffer)
(ct:free buffer1)))
#+gcl (system:getenv x)
#+genera nil
#+lispworks (lispworks:environment-variable x)
#+mcl (ccl:with-cstrs ((name x))
(let ((value (_getenv name)))
(unless (ccl:%null-ptr-p value)
(ccl:%get-cstring value))))
#+mkcl (#.(or (find-symbol* 'getenv :si nil) (find-symbol* 'getenv :mk-ext nil)) x)
#+sbcl (sb-ext:posix-getenv x)
#-(or abcl allegro clasp clisp clozure cmucl cormanlisp ecl gcl genera lispworks mcl mkcl sbcl scl xcl)
(not-implemented-error 'getenv))
(defsetf getenv (x) (val)
"Set an environment variable."
(declare (ignorable x val))
#+allegro `(setf (sys:getenv ,x) ,val)
#+clisp `(system::setenv ,x ,val)
#+clozure `(ccl:setenv ,x ,val)
#+cmucl `(unix:unix-setenv ,x ,val 1)
#+ecl `(ext:setenv ,x ,val)
#+lispworks `(hcl:setenv ,x ,val)
#+mkcl `(mkcl:setenv ,x ,val)
#+sbcl `(progn (require :sb-posix) (symbol-call :sb-posix :setenv ,x ,val 1))
#-(or allegro clisp clozure cmucl ecl lispworks mkcl sbcl)
'(not-implemented-error '(setf getenv)))
(defun getenvp (x)
"Predicate that is true if the named variable is present in the libc environment,
then returning the non-empty string value of the variable"
(let ((g (getenv x))) (and (not (emptyp g)) g))))
;;;; implementation-identifier
;;
;; produce a string to identify current implementation.
;; Initially stolen from SLIME's SWANK, completely rewritten since.
;; We're back to runtime checking, for the sake of e.g. ABCL.
(with-upgradability ()
(defun first-feature (feature-sets)
"A helper for various feature detection functions"
(dolist (x feature-sets)
(multiple-value-bind (short long feature-expr)
(if (consp x)
(values (first x) (second x) (cons :or (rest x)))
(values x x x))
(when (featurep feature-expr)
(return (values short long))))))
(defun implementation-type ()
"The type of Lisp implementation used, as a short UIOP-standardized keyword"
(first-feature
'(:abcl (:acl :allegro) (:ccl :clozure) :clisp (:corman :cormanlisp)
(:cmu :cmucl :cmu) :clasp :ecl :gcl
(:lwpe :lispworks-personal-edition) (:lw :lispworks)
:mcl :mkcl :sbcl :scl (:smbx :symbolics) :xcl)))
(defvar *implementation-type* (implementation-type)
"The type of Lisp implementation used, as a short UIOP-standardized keyword")
(defun operating-system ()
"The operating system of the current host"
(first-feature
'(:cygwin
(:win :windows :mswindows :win32 :mingw32) ;; try cygwin first!
(:linux :linux :linux-target) ;; for GCL at least, must appear before :bsd
(:macosx :macosx :darwin :darwin-target :apple) ; also before :bsd
(:solaris :solaris :sunos)
(:bsd :bsd :freebsd :netbsd :openbsd :dragonfly)
:unix
:genera)))
(defun architecture ()
"The CPU architecture of the current host"
(first-feature
'((:x64 :x86-64 :x86_64 :x8664-target :amd64 (:and :word-size=64 :pc386))
(:x86 :x86 :i386 :i486 :i586 :i686 :pentium3 :pentium4 :pc386 :iapx386 :x8632-target)
(:ppc64 :ppc64 :ppc64-target) (:ppc32 :ppc32 :ppc32-target :ppc :powerpc)
:hppa64 :hppa :sparc64 (:sparc32 :sparc32 :sparc)
:mipsel :mipseb :mips :alpha (:arm :arm :arm-target) :imach
;; Java comes last: if someone uses C via CFFI or otherwise JNA or JNI,
;; we may have to segregate the code still by architecture.
(:java :java :java-1.4 :java-1.5 :java-1.6 :java-1.7))))
#+clozure
(defun ccl-fasl-version ()
;; the fasl version is target-dependent from CCL 1.8 on.
(or (let ((s 'ccl::target-fasl-version))
(and (fboundp s) (funcall s)))
(and (boundp 'ccl::fasl-version)
(symbol-value 'ccl::fasl-version))
(error "Can't determine fasl version.")))
(defun lisp-version-string ()
"return a string that identifies the current Lisp implementation version"
(let ((s (lisp-implementation-version)))
(car ; as opposed to OR, this idiom prevents some unreachable code warning
(list
#+allegro
(format nil "~A~@[~A~]~@[~A~]~@[~A~]"
excl::*common-lisp-version-number*
;; M means "modern", as opposed to ANSI-compatible mode (which I consider default)
(and (eq excl:*current-case-mode* :case-sensitive-lower) "M")
;; Note if not using International ACL
;; see http://www.franz.com/support/documentation/8.1/doc/operators/excl/ics-target-case.htm
(excl:ics-target-case (:-ics "8"))
(and (member :smp *features*) "S"))
#+armedbear (format nil "~a-fasl~a" s system::*fasl-version*)
#+clisp
(subseq s 0 (position #\space s)) ; strip build information (date, etc.)
#+clozure
(format nil "~d.~d-f~d" ; shorten for windows
ccl::*openmcl-major-version*
ccl::*openmcl-minor-version*
(logand (ccl-fasl-version) #xFF))
#+cmucl (substitute #\- #\/ s)
#+scl (format nil "~A~A" s
;; ANSI upper case vs lower case.
(ecase ext:*case-mode* (:upper "") (:lower "l")))
#+ecl (format nil "~A~@[-~A~]" s
(let ((vcs-id (ext:lisp-implementation-vcs-id)))
(unless (equal vcs-id "UNKNOWN")
(subseq vcs-id 0 (min (length vcs-id) 8)))))
#+gcl (subseq s (1+ (position #\space s)))
#+genera
(multiple-value-bind (major minor) (sct:get-system-version "System")
(format nil "~D.~D" major minor))
#+mcl (subseq s 8) ; strip the leading "Version "
;; seems like there should be a shorter way to do this, like ACALL.
#+mkcl (or
(let ((fname (find-symbol* '#:git-describe-this-mkcl :mkcl nil)))
(when (and fname (fboundp fname))
(funcall fname)))
s)
s))))
(defun implementation-identifier ()
"Return a string that identifies the ABI of the current implementation,
suitable for use as a directory name to segregate Lisp FASLs, C dynamic libraries, etc."
(substitute-if
#\_ #'(lambda (x) (find x " /:;&^\\|?<>(){}[]$#`'\""))
(format nil "~(~a~@{~@[-~a~]~}~)"
(or (implementation-type) (lisp-implementation-type))
(lisp-version-string)
(or (operating-system) (software-type))
(or (architecture) (machine-type))))))
;;;; Other system information
(with-upgradability ()
(defun hostname ()
"return the hostname of the current host"
;; Note: untested on RMCL
#+(or abcl clasp clozure cmucl ecl genera lispworks mcl mkcl sbcl scl xcl) (machine-instance)
#+cormanlisp "localhost" ;; is there a better way? Does it matter?
#+allegro (symbol-call :excl.osi :gethostname)
#+clisp (first (split-string (machine-instance) :separator " "))
#+gcl (system:gethostname)))
;;; Current directory
(with-upgradability ()
#+cmucl
(defun parse-unix-namestring* (unix-namestring)
"variant of LISP::PARSE-UNIX-NAMESTRING that returns a pathname object"
(multiple-value-bind (host device directory name type version)
(lisp::parse-unix-namestring unix-namestring 0 (length unix-namestring))
(make-pathname :host (or host lisp::*unix-host*) :device device
:directory directory :name name :type type :version version)))
(defun getcwd ()
"Get the current working directory as per POSIX getcwd(3), as a pathname object"
(or #+(or abcl genera xcl) (truename *default-pathname-defaults*) ;; d-p-d is canonical!
#+allegro (excl::current-directory)
#+clisp (ext:default-directory)
#+clozure (ccl:current-directory)
#+(or cmucl scl) (#+cmucl parse-unix-namestring* #+scl lisp::parse-unix-namestring
(strcat (nth-value 1 (unix:unix-current-directory)) "/"))
#+cormanlisp (pathname (pl::get-current-directory)) ;; Q: what type does it return?
#+(or clasp ecl) (ext:getcwd)
#+gcl (let ((*default-pathname-defaults* #p"")) (truename #p""))
#+lispworks (hcl:get-working-directory)
#+mkcl (mk-ext:getcwd)
#+sbcl (sb-ext:parse-native-namestring (sb-unix:posix-getcwd/))
#+xcl (extensions:current-directory)
(not-implemented-error 'getcwd)))
(defun chdir (x)
"Change current directory, as per POSIX chdir(2), to a given pathname object"
(if-let (x (pathname x))
#+(or abcl genera xcl) (setf *default-pathname-defaults* (truename x)) ;; d-p-d is canonical!
#+allegro (excl:chdir x)
#+clisp (ext:cd x)
#+clozure (setf (ccl:current-directory) x)
#+(or cmucl scl) (unix:unix-chdir (ext:unix-namestring x))
#+cormanlisp (unless (zerop (win32::_chdir (namestring x)))
(error "Could not set current directory to ~A" x))
#+(or clasp ecl) (ext:chdir x)
#+gcl (system:chdir x)
#+lispworks (hcl:change-directory x)
#+mkcl (mk-ext:chdir x)
#+sbcl (progn (require :sb-posix) (symbol-call :sb-posix :chdir (sb-ext:native-namestring x)))
#-(or abcl allegro clasp clisp clozure cmucl cormanlisp ecl gcl genera lispworks mkcl sbcl scl xcl)
(not-implemented-error 'chdir))))
;;;; -----------------------------------------------------------------
;;;; Windows shortcut support. Based on:
;;;;
;;;; Jesse Hager: The Windows Shortcut File Format.
;;;; http://www.wotsit.org/list.asp?fc=13
#-(or clisp genera) ; CLISP doesn't need it, and READ-SEQUENCE annoys old Genera that doesn't need it
(with-upgradability ()
(defparameter *link-initial-dword* 76)
(defparameter *link-guid* #(1 20 2 0 0 0 0 0 192 0 0 0 0 0 0 70))
(defun read-null-terminated-string (s)
"Read a null-terminated string from an octet stream S"
;; note: doesn't play well with UNICODE
(with-output-to-string (out)
(loop :for code = (read-byte s)
:until (zerop code)
:do (write-char (code-char code) out))))
(defun read-little-endian (s &optional (bytes 4))
"Read a number in little-endian format from an byte (octet) stream S,
the number having BYTES octets (defaulting to 4)."
(loop :for i :from 0 :below bytes
:sum (ash (read-byte s) (* 8 i))))
(defun parse-file-location-info (s)
"helper to parse-windows-shortcut"
(let ((start (file-position s))
(total-length (read-little-endian s))
(end-of-header (read-little-endian s))
(fli-flags (read-little-endian s))
(local-volume-offset (read-little-endian s))
(local-offset (read-little-endian s))
(network-volume-offset (read-little-endian s))
(remaining-offset (read-little-endian s)))
(declare (ignore total-length end-of-header local-volume-offset))
(unless (zerop fli-flags)
(cond
((logbitp 0 fli-flags)
(file-position s (+ start local-offset)))
((logbitp 1 fli-flags)
(file-position s (+ start
network-volume-offset
#x14))))
(strcat (read-null-terminated-string s)
(progn
(file-position s (+ start remaining-offset))
(read-null-terminated-string s))))))
(defun parse-windows-shortcut (pathname)
"From a .lnk windows shortcut, extract the pathname linked to"
;; NB: doesn't do much checking & doesn't look like it will work well with UNICODE.
(with-open-file (s pathname :element-type '(unsigned-byte 8))
(handler-case
(when (and (= (read-little-endian s) *link-initial-dword*)
(let ((header (make-array (length *link-guid*))))
(read-sequence header s)
(equalp header *link-guid*)))
(let ((flags (read-little-endian s)))
(file-position s 76) ;skip rest of header
(when (logbitp 0 flags)
;; skip shell item id list
(let ((length (read-little-endian s 2)))
(file-position s (+ length (file-position s)))))
(cond
((logbitp 1 flags)
(parse-file-location-info s))
(t
(when (logbitp 2 flags)
;; skip description string
(let ((length (read-little-endian s 2)))
(file-position s (+ length (file-position s)))))
(when (logbitp 3 flags)
;; finally, our pathname
(let* ((length (read-little-endian s 2))
(buffer (make-array length)))
(read-sequence buffer s)
(map 'string #'code-char buffer)))))))
(end-of-file (c)
(declare (ignore c))
nil)))))
;;;; -------------------------------------------------------------------------
;;;; Portability layer around Common Lisp pathnames
;; This layer allows for portable manipulation of pathname objects themselves,
;; which all is necessary prior to any access the filesystem or environment.
(uiop/package:define-package :uiop/pathname
(:nicknames :asdf/pathname) ;; deprecated. Used by ceramic
(:use :uiop/common-lisp :uiop/package :uiop/utility :uiop/os)
(:export
;; Making and merging pathnames, portably
#:normalize-pathname-directory-component #:denormalize-pathname-directory-component
#:merge-pathname-directory-components #:*unspecific-pathname-type* #:make-pathname*
#:make-pathname-component-logical #:make-pathname-logical
#:merge-pathnames*
#:nil-pathname #:*nil-pathname* #:with-pathname-defaults
;; Predicates
#:pathname-equal #:logical-pathname-p #:physical-pathname-p #:physicalize-pathname
#:absolute-pathname-p #:relative-pathname-p #:hidden-pathname-p #:file-pathname-p
;; Directories
#:pathname-directory-pathname #:pathname-parent-directory-pathname
#:directory-pathname-p #:ensure-directory-pathname
;; Parsing filenames
#:split-name-type #:parse-unix-namestring #:unix-namestring
#:split-unix-namestring-directory-components
;; Absolute and relative pathnames
#:subpathname #:subpathname*
#:ensure-absolute-pathname
#:pathname-root #:pathname-host-pathname
#:subpathp #:enough-pathname #:with-enough-pathname #:call-with-enough-pathname
;; Checking constraints
#:ensure-pathname ;; implemented in filesystem.lisp to accommodate for existence constraints
;; Wildcard pathnames
#:*wild* #:*wild-file* #:*wild-file-for-directory* #:*wild-directory*
#:*wild-inferiors* #:*wild-path* #:wilden
;; Translate a pathname
#:relativize-directory-component #:relativize-pathname-directory
#:directory-separator-for-host #:directorize-pathname-host-device
#:translate-pathname*
#:*output-translation-function*))
(in-package :uiop/pathname)
;;; Normalizing pathnames across implementations
(with-upgradability ()
(defun normalize-pathname-directory-component (directory)
"Convert the DIRECTORY component from a format usable by the underlying
implementation's MAKE-PATHNAME and other primitives to a CLHS-standard format
that is a list and not a string."
(cond
#-(or cmucl sbcl scl) ;; these implementations already normalize directory components.
((stringp directory) `(:absolute ,directory))
((or (null directory)
(and (consp directory) (member (first directory) '(:absolute :relative))))
directory)
#+gcl
((consp directory)
(cons :relative directory))
(t
(parameter-error (compatfmt "~@<~S: Unrecognized pathname directory component ~S~@:>")
'normalize-pathname-directory-component directory))))
(defun denormalize-pathname-directory-component (directory-component)
"Convert the DIRECTORY-COMPONENT from a CLHS-standard format to a format usable
by the underlying implementation's MAKE-PATHNAME and other primitives"
directory-component)
(defun merge-pathname-directory-components (specified defaults)
"Helper for MERGE-PATHNAMES* that handles directory components"
(let ((directory (normalize-pathname-directory-component specified)))
(ecase (first directory)
((nil) defaults)
(:absolute specified)
(:relative
(let ((defdir (normalize-pathname-directory-component defaults))
(reldir (cdr directory)))
(cond
((null defdir)
directory)
((not (eq :back (first reldir)))
(append defdir reldir))
(t
(loop :with defabs = (first defdir)
:with defrev = (reverse (rest defdir))
:while (and (eq :back (car reldir))
(or (and (eq :absolute defabs) (null defrev))
(stringp (car defrev))))
:do (pop reldir) (pop defrev)
:finally (return (cons defabs (append (reverse defrev) reldir)))))))))))
;; Giving :unspecific as :type argument to make-pathname is not portable.
;; See CLHS make-pathname and 19.2.2.2.3.
;; This will be :unspecific if supported, or NIL if not.
(defparameter *unspecific-pathname-type*
#+(or abcl allegro clozure cmucl genera lispworks sbcl scl) :unspecific
#+(or clasp clisp ecl mkcl gcl xcl #|These haven't been tested:|# cormanlisp mcl) nil
"Unspecific type component to use with the underlying implementation's MAKE-PATHNAME")
(defun make-pathname* (&rest keys &key directory host device name type version defaults
#+scl &allow-other-keys)
"Takes arguments like CL:MAKE-PATHNAME in the CLHS, and
tries hard to make a pathname that will actually behave as documented,
despite the peculiarities of each implementation. DEPRECATED: just use MAKE-PATHNAME."
(declare (ignore host device directory name type version defaults))
(apply 'make-pathname keys))
(defun make-pathname-component-logical (x)
"Make a pathname component suitable for use in a logical-pathname"
(typecase x
((eql :unspecific) nil)
#+clisp (string (string-upcase x))
#+clisp (cons (mapcar 'make-pathname-component-logical x))
(t x)))
(defun make-pathname-logical (pathname host)
"Take a PATHNAME's directory, name, type and version components,
and make a new pathname with corresponding components and specified logical HOST"
(make-pathname
:host host
:directory (make-pathname-component-logical (pathname-directory pathname))
:name (make-pathname-component-logical (pathname-name pathname))
:type (make-pathname-component-logical (pathname-type pathname))
:version (make-pathname-component-logical (pathname-version pathname))))
(defun merge-pathnames* (specified &optional (defaults *default-pathname-defaults*))
"MERGE-PATHNAMES* is like MERGE-PATHNAMES except that
if the SPECIFIED pathname does not have an absolute directory,
then the HOST and DEVICE both come from the DEFAULTS, whereas
if the SPECIFIED pathname does have an absolute directory,
then the HOST and DEVICE both come from the SPECIFIED pathname.
This is what users want on a modern Unix or Windows operating system,
unlike the MERGE-PATHNAMES behavior.
Also, if either argument is NIL, then the other argument is returned unmodified;
this is unlike MERGE-PATHNAMES which always merges with a pathname,
by default *DEFAULT-PATHNAME-DEFAULTS*, which cannot be NIL."
(when (null specified) (return-from merge-pathnames* defaults))
(when (null defaults) (return-from merge-pathnames* specified))
#+scl
(ext:resolve-pathname specified defaults)
#-scl
(let* ((specified (pathname specified))
(defaults (pathname defaults))
(directory (normalize-pathname-directory-component (pathname-directory specified)))
(name (or (pathname-name specified) (pathname-name defaults)))
(type (or (pathname-type specified) (pathname-type defaults)))
(version (or (pathname-version specified) (pathname-version defaults))))
(labels ((unspecific-handler (p)
(if (typep p 'logical-pathname) #'make-pathname-component-logical #'identity)))
(multiple-value-bind (host device directory unspecific-handler)
(ecase (first directory)
((:absolute)
(values (pathname-host specified)
(pathname-device specified)
directory
(unspecific-handler specified)))
((nil :relative)
(values (pathname-host defaults)
(pathname-device defaults)
(merge-pathname-directory-components directory (pathname-directory defaults))
(unspecific-handler defaults))))
(make-pathname :host host :device device :directory directory
:name (funcall unspecific-handler name)
:type (funcall unspecific-handler type)
:version (funcall unspecific-handler version))))))
(defun logical-pathname-p (x)
"is X a logical-pathname?"
(typep x 'logical-pathname))
(defun physical-pathname-p (x)
"is X a pathname that is not a logical-pathname?"
(and (pathnamep x) (not (logical-pathname-p x))))
(defun physicalize-pathname (x)
"if X is a logical pathname, use translate-logical-pathname on it."
;; Ought to be the same as translate-logical-pathname, except the latter borks on CLISP
(let ((p (when x (pathname x))))
(if (logical-pathname-p p) (translate-logical-pathname p) p)))
(defun nil-pathname (&optional (defaults *default-pathname-defaults*))
"A pathname that is as neutral as possible for use as defaults
when merging, making or parsing pathnames"
;; 19.2.2.2.1 says a NIL host can mean a default host;
;; see also "valid physical pathname host" in the CLHS glossary, that suggests
;; strings and lists of strings or :unspecific
;; But CMUCL decides to die on NIL.
;; MCL has issues with make-pathname, nil and defaulting
(declare (ignorable defaults))
#.`(make-pathname :directory nil :name nil :type nil :version nil
:device (or #+(and mkcl os-unix) :unspecific)
:host (or #+cmucl lisp::*unix-host* #+(and mkcl os-unix) "localhost")
#+scl ,@'(:scheme nil :scheme-specific-part nil
:username nil :password nil :parameters nil :query nil :fragment nil)
;; the default shouldn't matter, but we really want something physical
#-mcl ,@'(:defaults defaults)))
(defvar *nil-pathname* (nil-pathname (physicalize-pathname (user-homedir-pathname)))
"A pathname that is as neutral as possible for use as defaults
when merging, making or parsing pathnames")
(defmacro with-pathname-defaults ((&optional defaults) &body body)
"Execute BODY in a context where the *DEFAULT-PATHNAME-DEFAULTS* is as specified,
where leaving the defaults NIL or unspecified means a (NIL-PATHNAME), except
on ABCL, Genera and XCL, where it remains unchanged for it doubles as current-directory."
`(let ((*default-pathname-defaults*
,(or defaults
#-(or abcl genera xcl) '*nil-pathname*
#+(or abcl genera xcl) '*default-pathname-defaults*)))
,@body)))
;;; Some pathname predicates
(with-upgradability ()
(defun pathname-equal (p1 p2)
"Are the two pathnames P1 and P2 reasonably equal in the paths they denote?"
(when (stringp p1) (setf p1 (pathname p1)))
(when (stringp p2) (setf p2 (pathname p2)))
(flet ((normalize-component (x)
(unless (member x '(nil :unspecific :newest (:relative)) :test 'equal)
x)))
(macrolet ((=? (&rest accessors)
(flet ((frob (x)
(reduce 'list (cons 'normalize-component accessors)
:initial-value x :from-end t)))
`(equal ,(frob 'p1) ,(frob 'p2)))))
(or (and (null p1) (null p2))
(and (pathnamep p1) (pathnamep p2)
(and (=? pathname-host)
#-(and mkcl os-unix) (=? pathname-device)
(=? normalize-pathname-directory-component pathname-directory)
(=? pathname-name)
(=? pathname-type)
#-mkcl (=? pathname-version)))))))
(defun absolute-pathname-p (pathspec)
"If PATHSPEC is a pathname or namestring object that parses as a pathname
possessing an :ABSOLUTE directory component, return the (parsed) pathname.
Otherwise return NIL"
(and pathspec
(typep pathspec '(or null pathname string))
(let ((pathname (pathname pathspec)))
(and (eq :absolute (car (normalize-pathname-directory-component
(pathname-directory pathname))))
pathname))))
(defun relative-pathname-p (pathspec)
"If PATHSPEC is a pathname or namestring object that parses as a pathname
possessing a :RELATIVE or NIL directory component, return the (parsed) pathname.
Otherwise return NIL"
(and pathspec
(typep pathspec '(or null pathname string))
(let* ((pathname (pathname pathspec))
(directory (normalize-pathname-directory-component
(pathname-directory pathname))))
(when (or (null directory) (eq :relative (car directory)))
pathname))))
(defun hidden-pathname-p (pathname)
"Return a boolean that is true if the pathname is hidden as per Unix style,
i.e. its name starts with a dot."
(and pathname (equal (first-char (pathname-name pathname)) #\.)))
(defun file-pathname-p (pathname)
"Does PATHNAME represent a file, i.e. has a non-null NAME component?
Accepts NIL, a string (converted through PARSE-NAMESTRING) or a PATHNAME.
Note that this does _not_ check to see that PATHNAME points to an
actually-existing file.
Returns the (parsed) PATHNAME when true"
(when pathname
(let ((pathname (pathname pathname)))
(unless (and (member (pathname-name pathname) '(nil :unspecific "") :test 'equal)
(member (pathname-type pathname) '(nil :unspecific "") :test 'equal))
pathname)))))
;;; Directory pathnames
(with-upgradability ()
(defun pathname-directory-pathname (pathname)
"Returns a new pathname with same HOST, DEVICE, DIRECTORY as PATHNAME,
and NIL NAME, TYPE and VERSION components"
(when pathname
(make-pathname :name nil :type nil :version nil :defaults pathname)))
(defun pathname-parent-directory-pathname (pathname)
"Returns a new pathname that corresponds to the parent of the current pathname's directory,
i.e. removing one level of depth in the DIRECTORY component. e.g. if pathname is
Unix pathname /foo/bar/baz/file.type then return /foo/bar/"
(when pathname
(make-pathname :name nil :type nil :version nil
:directory (merge-pathname-directory-components
'(:relative :back) (pathname-directory pathname))
:defaults pathname)))
(defun directory-pathname-p (pathname)
"Does PATHNAME represent a directory?
A directory-pathname is a pathname _without_ a filename. The three
ways that the filename components can be missing are for it to be NIL,
:UNSPECIFIC or the empty string.
Note that this does _not_ check to see that PATHNAME points to an
actually-existing directory."
(when pathname
;; I tried using Allegro's excl:file-directory-p, but this cannot be done,
;; because it rejects apparently legal pathnames as
;; ill-formed. [2014/02/10:rpg]
(let ((pathname (pathname pathname)))
(flet ((check-one (x)
(member x '(nil :unspecific) :test 'equal)))
(and (not (wild-pathname-p pathname))
(check-one (pathname-name pathname))
(check-one (pathname-type pathname))
t)))))
(defun ensure-directory-pathname (pathspec &optional (on-error 'error))
"Converts the non-wild pathname designator PATHSPEC to directory form."
(cond
((stringp pathspec)
(ensure-directory-pathname (pathname pathspec)))
((not (pathnamep pathspec))
(call-function on-error (compatfmt "~@<Invalid pathname designator ~S~@:>") pathspec))
((wild-pathname-p pathspec)
(call-function on-error (compatfmt "~@<Can't reliably convert wild pathname ~3i~_~S~@:>") pathspec))
((directory-pathname-p pathspec)
pathspec)
(t
(handler-case
(make-pathname :directory (append (or (normalize-pathname-directory-component
(pathname-directory pathspec))
(list :relative))
(list (file-namestring pathspec)))
:name nil :type nil :version nil :defaults pathspec)
(error (c) (call-function on-error (compatfmt "~@<error while trying to create a directory pathname for ~S: ~A~@:>") pathspec c)))))))
;;; Parsing filenames
(with-upgradability ()
(declaim (ftype function ensure-pathname)) ; forward reference
(defun split-unix-namestring-directory-components
(unix-namestring &key ensure-directory dot-dot)
"Splits the path string UNIX-NAMESTRING, returning four values:
A flag that is either :absolute or :relative, indicating
how the rest of the values are to be interpreted.
A directory path --- a list of strings and keywords, suitable for
use with MAKE-PATHNAME when prepended with the flag value.
Directory components with an empty name or the name . are removed.
Any directory named .. is read as DOT-DOT, or :BACK if it's NIL (not :UP).
A last-component, either a file-namestring including type extension,
or NIL in the case of a directory pathname.
A flag that is true iff the unix-style-pathname was just
a file-namestring without / path specification.
ENSURE-DIRECTORY forces the namestring to be interpreted as a directory pathname:
the third return value will be NIL, and final component of the namestring
will be treated as part of the directory path.
An empty string is thus read as meaning a pathname object with all fields nil.
Note that colon characters #\: will NOT be interpreted as host specification.
Absolute pathnames are only appropriate on Unix-style systems.
The intention of this function is to support structured component names,
e.g., \(:file \"foo/bar\"\), which will be unpacked to relative pathnames."
(check-type unix-namestring string)
(check-type dot-dot (member nil :back :up))
(if (and (not (find #\/ unix-namestring)) (not ensure-directory)
(plusp (length unix-namestring)))
(values :relative () unix-namestring t)
(let* ((components (split-string unix-namestring :separator "/"))
(last-comp (car (last components))))
(multiple-value-bind (relative components)
(if (equal (first components) "")
(if (equal (first-char unix-namestring) #\/)
(values :absolute (cdr components))
(values :relative nil))
(values :relative components))
(setf components (remove-if #'(lambda (x) (member x '("" ".") :test #'equal))
components))
(setf components (substitute (or dot-dot :back) ".." components :test #'equal))
(cond
((equal last-comp "")
(values relative components nil nil)) ; "" already removed from components
(ensure-directory
(values relative components nil nil))
(t
(values relative (butlast components) last-comp nil)))))))
(defun split-name-type (filename)
"Split a filename into two values NAME and TYPE that are returned.
We assume filename has no directory component.
The last . if any separates name and type from from type,
except that if there is only one . and it is in first position,
the whole filename is the NAME with an empty type.
NAME is always a string.
For an empty type, *UNSPECIFIC-PATHNAME-TYPE* is returned."
(check-type filename string)
(assert (plusp (length filename)))
(destructuring-bind (name &optional (type *unspecific-pathname-type*))
(split-string filename :max 2 :separator ".")
(if (equal name "")
(values filename *unspecific-pathname-type*)
(values name type))))
(defun parse-unix-namestring (name &rest keys &key type defaults dot-dot ensure-directory
&allow-other-keys)
"Coerce NAME into a PATHNAME using standard Unix syntax.
Unix syntax is used whether or not the underlying system is Unix;
on such non-Unix systems it is reliably usable only for relative pathnames.
This function is especially useful to manipulate relative pathnames portably,
where it is of crucial to possess a portable pathname syntax independent of the underlying OS.
This is what PARSE-UNIX-NAMESTRING provides, and why we use it in ASDF.
When given a PATHNAME object, just return it untouched.
When given NIL, just return NIL.
When given a non-null SYMBOL, first downcase its name and treat it as a string.
When given a STRING, portably decompose it into a pathname as below.
#\\/ separates directory components.
The last #\\/-separated substring is interpreted as follows:
1- If TYPE is :DIRECTORY or ENSURE-DIRECTORY is true,
the string is made the last directory component, and NAME and TYPE are NIL.
if the string is empty, it's the empty pathname with all slots NIL.
2- If TYPE is NIL, the substring is a file-namestring, and its NAME and TYPE
are separated by SPLIT-NAME-TYPE.
3- If TYPE is a string, it is the given TYPE, and the whole string is the NAME.
Directory components with an empty name or the name \".\" are removed.
Any directory named \"..\" is read as DOT-DOT,
which must be one of :BACK or :UP and defaults to :BACK.
HOST, DEVICE and VERSION components are taken from DEFAULTS,
which itself defaults to *NIL-PATHNAME*, also used if DEFAULTS is NIL.
No host or device can be specified in the string itself,
which makes it unsuitable for absolute pathnames outside Unix.
For relative pathnames, these components (and hence the defaults) won't matter
if you use MERGE-PATHNAMES* but will matter if you use MERGE-PATHNAMES,
which is an important reason to always use MERGE-PATHNAMES*.
Arbitrary keys are accepted, and the parse result is passed to ENSURE-PATHNAME
with those keys, removing TYPE DEFAULTS and DOT-DOT.
When you're manipulating pathnames that are supposed to make sense portably
even though the OS may not be Unixish, we recommend you use :WANT-RELATIVE T
to throw an error if the pathname is absolute"
(block nil
(check-type type (or null string (eql :directory)))
(when ensure-directory
(setf type :directory))
(etypecase name
((or null pathname) (return name))
(symbol
(setf name (string-downcase name)))
(string))
(multiple-value-bind (relative path filename file-only)
(split-unix-namestring-directory-components
name :dot-dot dot-dot :ensure-directory (eq type :directory))
(multiple-value-bind (name type)
(cond
((or (eq type :directory) (null filename))
(values nil nil))
(type
(values filename type))
(t
(split-name-type filename)))
(apply 'ensure-pathname
(make-pathname
:directory (unless file-only (cons relative path))
:name name :type type
:defaults (or #-mcl defaults *nil-pathname*))
(remove-plist-keys '(:type :dot-dot :defaults) keys))))))
(defun unix-namestring (pathname)
"Given a non-wild PATHNAME, return a Unix-style namestring for it.
If the PATHNAME is NIL or a STRING, return it unchanged.
This only considers the DIRECTORY, NAME and TYPE components of the pathname.
This is a portable solution for representing relative pathnames,
But unless you are running on a Unix system, it is not a general solution
to representing native pathnames.
An error is signaled if the argument is not NULL, a STRING or a PATHNAME,
or if it is a PATHNAME but some of its components are not recognized."
(etypecase pathname
((or null string) pathname)
(pathname
(with-output-to-string (s)
(flet ((err () (parameter-error "~S: invalid unix-namestring ~S"
'unix-namestring pathname)))
(let* ((dir (normalize-pathname-directory-component (pathname-directory pathname)))
(name (pathname-name pathname))
(name (and (not (eq name :unspecific)) name))
(type (pathname-type pathname))
(type (and (not (eq type :unspecific)) type)))
(cond
((member dir '(nil :unspecific)))
((eq dir '(:relative)) (princ "./" s))
((consp dir)
(destructuring-bind (relabs &rest dirs) dir
(or (member relabs '(:relative :absolute)) (err))
(when (eq relabs :absolute) (princ #\/ s))
(loop :for x :in dirs :do
(cond
((member x '(:back :up)) (princ "../" s))
((equal x "") (err))
;;((member x '("." "..") :test 'equal) (err))
((stringp x) (format s "~A/" x))
(t (err))))))
(t (err)))
(cond
(name
(unless (and (stringp name) (or (null type) (stringp type))) (err))
(format s "~A~@[.~A~]" name type))
(t
(or (null type) (err)))))))))))
;;; Absolute and relative pathnames
(with-upgradability ()
(defun subpathname (pathname subpath &key type)
"This function takes a PATHNAME and a SUBPATH and a TYPE.
If SUBPATH is already a PATHNAME object (not namestring),
and is an absolute pathname at that, it is returned unchanged;
otherwise, SUBPATH is turned into a relative pathname with given TYPE
as per PARSE-UNIX-NAMESTRING with :WANT-RELATIVE T :TYPE TYPE,
then it is merged with the PATHNAME-DIRECTORY-PATHNAME of PATHNAME."
(or (and (pathnamep subpath) (absolute-pathname-p subpath))
(merge-pathnames* (parse-unix-namestring subpath :type type :want-relative t)
(pathname-directory-pathname pathname))))
(defun subpathname* (pathname subpath &key type)
"returns NIL if the base pathname is NIL, otherwise like SUBPATHNAME."
(and pathname
(subpathname (ensure-directory-pathname pathname) subpath :type type)))
(defun pathname-root (pathname)
"return the root directory for the host and device of given PATHNAME"
(make-pathname :directory '(:absolute)
:name nil :type nil :version nil
:defaults pathname ;; host device, and on scl, *some*
;; scheme-specific parts: port username password, not others:
. #.(or #+scl '(:parameters nil :query nil :fragment nil))))
(defun pathname-host-pathname (pathname)
"return a pathname with the same host as given PATHNAME, and all other fields NIL"
(make-pathname :directory nil
:name nil :type nil :version nil :device nil
:defaults pathname ;; host device, and on scl, *some*
;; scheme-specific parts: port username password, not others:
. #.(or #+scl '(:parameters nil :query nil :fragment nil))))
(defun ensure-absolute-pathname (path &optional defaults (on-error 'error))
"Given a pathname designator PATH, return an absolute pathname as specified by PATH
considering the DEFAULTS, or, if not possible, use CALL-FUNCTION on the specified ON-ERROR behavior,
with a format control-string and other arguments as arguments"
(cond
((absolute-pathname-p path))
((stringp path) (ensure-absolute-pathname (pathname path) defaults on-error))
((not (pathnamep path)) (call-function on-error "not a valid pathname designator ~S" path))
((let ((default-pathname (if (pathnamep defaults) defaults (call-function defaults))))
(or (if (absolute-pathname-p default-pathname)
(absolute-pathname-p (merge-pathnames* path default-pathname))
(call-function on-error "Default pathname ~S is not an absolute pathname"
default-pathname))
(call-function on-error "Failed to merge ~S with ~S into an absolute pathname"
path default-pathname))))
(t (call-function on-error
"Cannot ensure ~S is evaluated as an absolute pathname with defaults ~S"
path defaults))))
(defun subpathp (maybe-subpath base-pathname)
"if MAYBE-SUBPATH is a pathname that is under BASE-PATHNAME, return a pathname object that
when used with MERGE-PATHNAMES* with defaults BASE-PATHNAME, returns MAYBE-SUBPATH."
(and (pathnamep maybe-subpath) (pathnamep base-pathname)
(absolute-pathname-p maybe-subpath) (absolute-pathname-p base-pathname)
(directory-pathname-p base-pathname) (not (wild-pathname-p base-pathname))
(pathname-equal (pathname-root maybe-subpath) (pathname-root base-pathname))
(with-pathname-defaults (*nil-pathname*)
(let ((enough (enough-namestring maybe-subpath base-pathname)))
(and (relative-pathname-p enough) (pathname enough))))))
(defun enough-pathname (maybe-subpath base-pathname)
"if MAYBE-SUBPATH is a pathname that is under BASE-PATHNAME, return a pathname object that
when used with MERGE-PATHNAMES* with defaults BASE-PATHNAME, returns MAYBE-SUBPATH."
(let ((sub (when maybe-subpath (pathname maybe-subpath)))
(base (when base-pathname (ensure-absolute-pathname (pathname base-pathname)))))
(or (and base (subpathp sub base)) sub)))
(defun call-with-enough-pathname (maybe-subpath defaults-pathname thunk)
"In a context where *DEFAULT-PATHNAME-DEFAULTS* is bound to DEFAULTS-PATHNAME (if not null,
or else to its current value), call THUNK with ENOUGH-PATHNAME for MAYBE-SUBPATH
given DEFAULTS-PATHNAME as a base pathname."
(let ((enough (enough-pathname maybe-subpath defaults-pathname))
(*default-pathname-defaults* (or defaults-pathname *default-pathname-defaults*)))
(funcall thunk enough)))
(defmacro with-enough-pathname ((pathname-var &key (pathname pathname-var)
(defaults *default-pathname-defaults*))
&body body)
"Shorthand syntax for CALL-WITH-ENOUGH-PATHNAME"
`(call-with-enough-pathname ,pathname ,defaults #'(lambda (,pathname-var) ,@body))))
;;; Wildcard pathnames
(with-upgradability ()
(defparameter *wild* (or #+cormanlisp "*" :wild)
"Wild component for use with MAKE-PATHNAME")
(defparameter *wild-directory-component* (or :wild)
"Wild directory component for use with MAKE-PATHNAME")
(defparameter *wild-inferiors-component* (or :wild-inferiors)
"Wild-inferiors directory component for use with MAKE-PATHNAME")
(defparameter *wild-file*
(make-pathname :directory nil :name *wild* :type *wild*
:version (or #-(or allegro abcl xcl) *wild*))
"A pathname object with wildcards for matching any file with TRANSLATE-PATHNAME")
(defparameter *wild-file-for-directory*
(make-pathname :directory nil :name *wild* :type (or #-(or clisp gcl) *wild*)
:version (or #-(or allegro abcl clisp gcl xcl) *wild*))
"A pathname object with wildcards for matching any file with DIRECTORY")
(defparameter *wild-directory*
(make-pathname :directory `(:relative ,*wild-directory-component*)
:name nil :type nil :version nil)
"A pathname object with wildcards for matching any subdirectory")
(defparameter *wild-inferiors*
(make-pathname :directory `(:relative ,*wild-inferiors-component*)
:name nil :type nil :version nil)
"A pathname object with wildcards for matching any recursive subdirectory")
(defparameter *wild-path*
(merge-pathnames* *wild-file* *wild-inferiors*)
"A pathname object with wildcards for matching any file in any recursive subdirectory")
(defun wilden (path)
"From a pathname, return a wildcard pathname matching any file in any subdirectory of given pathname's directory"
(merge-pathnames* *wild-path* path)))
;;; Translate a pathname
(with-upgradability ()
(defun relativize-directory-component (directory-component)
"Given the DIRECTORY-COMPONENT of a pathname, return an otherwise similar relative directory component"
(let ((directory (normalize-pathname-directory-component directory-component)))
(cond
((stringp directory)
(list :relative directory))
((eq (car directory) :absolute)
(cons :relative (cdr directory)))
(t
directory))))
(defun relativize-pathname-directory (pathspec)
"Given a PATHNAME, return a relative pathname with otherwise the same components"
(let ((p (pathname pathspec)))
(make-pathname
:directory (relativize-directory-component (pathname-directory p))
:defaults p)))
(defun directory-separator-for-host (&optional (pathname *default-pathname-defaults*))
"Given a PATHNAME, return the character used to delimit directory names on this host and device."
(let ((foo (make-pathname :directory '(:absolute "FOO") :defaults pathname)))
(last-char (namestring foo))))
#-scl
(defun directorize-pathname-host-device (pathname)
"Given a PATHNAME, return a pathname that has representations of its HOST and DEVICE components
added to its DIRECTORY component. This is useful for output translations."
(os-cond
((os-unix-p)
(when (physical-pathname-p pathname)
(return-from directorize-pathname-host-device pathname))))
(let* ((root (pathname-root pathname))
(wild-root (wilden root))
(absolute-pathname (merge-pathnames* pathname root))
(separator (directory-separator-for-host root))
(root-namestring (namestring root))
(root-string
(substitute-if #\/
#'(lambda (x) (or (eql x #\:)
(eql x separator)))
root-namestring)))
(multiple-value-bind (relative path filename)
(split-unix-namestring-directory-components root-string :ensure-directory t)
(declare (ignore relative filename))
(let ((new-base (make-pathname :defaults root :directory `(:absolute ,@path))))
(translate-pathname absolute-pathname wild-root (wilden new-base))))))
#+scl
(defun directorize-pathname-host-device (pathname)
(let ((scheme (ext:pathname-scheme pathname))
(host (pathname-host pathname))
(port (ext:pathname-port pathname))
(directory (pathname-directory pathname)))
(flet ((specificp (x) (and x (not (eq x :unspecific)))))
(if (or (specificp port)
(and (specificp host) (plusp (length host)))
(specificp scheme))
(let ((prefix ""))
(when (specificp port)
(setf prefix (format nil ":~D" port)))
(when (and (specificp host) (plusp (length host)))
(setf prefix (strcat host prefix)))
(setf prefix (strcat ":" prefix))
(when (specificp scheme)
(setf prefix (strcat scheme prefix)))
(assert (and directory (eq (first directory) :absolute)))
(make-pathname :directory `(:absolute ,prefix ,@(rest directory))
:defaults pathname)))
pathname)))
(defun* (translate-pathname*) (path absolute-source destination &optional root source)
"A wrapper around TRANSLATE-PATHNAME to be used by the ASDF output-translations facility.
PATH is the pathname to be translated.
ABSOLUTE-SOURCE is an absolute pathname to use as source for translate-pathname,
DESTINATION is either a function, to be called with PATH and ABSOLUTE-SOURCE,
or a relative pathname, to be merged with ROOT and used as destination for translate-pathname
or an absolute pathname, to be used as destination for translate-pathname.
In that last case, if ROOT is non-NIL, PATH is first transformated by DIRECTORIZE-PATHNAME-HOST-DEVICE."
(declare (ignore source))
(cond
((functionp destination)
(funcall destination path absolute-source))
((eq destination t)
path)
((not (pathnamep destination))
(parameter-error "~S: Invalid destination" 'translate-pathname*))
((not (absolute-pathname-p destination))
(translate-pathname path absolute-source (merge-pathnames* destination root)))
(root
(translate-pathname (directorize-pathname-host-device path) absolute-source destination))
(t
(translate-pathname path absolute-source destination))))
(defvar *output-translation-function* 'identity
"Hook for output translations.
This function needs to be idempotent, so that actions can work
whether their inputs were translated or not,
which they will be if we are composing operations. e.g. if some
create-lisp-op creates a lisp file from some higher-level input,
you need to still be able to use compile-op on that lisp file."))
;;;; -------------------------------------------------------------------------
;;;; Portability layer around Common Lisp filesystem access
(uiop/package:define-package :uiop/filesystem
(:use :uiop/common-lisp :uiop/package :uiop/utility :uiop/os :uiop/pathname)
(:export
;; Native namestrings
#:native-namestring #:parse-native-namestring
;; Probing the filesystem
#:truename* #:safe-file-write-date #:probe-file* #:directory-exists-p #:file-exists-p
#:directory* #:filter-logical-directory-results #:directory-files #:subdirectories
#:collect-sub*directories
;; Resolving symlinks somewhat
#:truenamize #:resolve-symlinks #:*resolve-symlinks* #:resolve-symlinks*
;; merging with cwd
#:get-pathname-defaults #:call-with-current-directory #:with-current-directory
;; Environment pathnames
#:inter-directory-separator #:split-native-pathnames-string
#:getenv-pathname #:getenv-pathnames
#:getenv-absolute-directory #:getenv-absolute-directories
#:lisp-implementation-directory #:lisp-implementation-pathname-p
;; Simple filesystem operations
#:ensure-all-directories-exist
#:rename-file-overwriting-target
#:delete-file-if-exists #:delete-empty-directory #:delete-directory-tree))
(in-package :uiop/filesystem)
;;; Native namestrings, as seen by the operating system calls rather than Lisp
(with-upgradability ()
(defun native-namestring (x)
"From a non-wildcard CL pathname, a return namestring suitable for passing to the operating system"
(when x
(let ((p (pathname x)))
#+clozure (with-pathname-defaults () (ccl:native-translated-namestring p)) ; see ccl bug 978
#+(or cmucl scl) (ext:unix-namestring p nil)
#+sbcl (sb-ext:native-namestring p)
#-(or clozure cmucl sbcl scl)
(os-cond
((os-unix-p) (unix-namestring p))
(t (namestring p))))))
(defun parse-native-namestring (string &rest constraints &key ensure-directory &allow-other-keys)
"From a native namestring suitable for use by the operating system, return
a CL pathname satisfying all the specified constraints as per ENSURE-PATHNAME"
(check-type string (or string null))
(let* ((pathname
(when string
(with-pathname-defaults ()
#+clozure (ccl:native-to-pathname string)
#+cmucl (uiop/os::parse-unix-namestring* string)
#+sbcl (sb-ext:parse-native-namestring string)
#+scl (lisp::parse-unix-namestring string)
#-(or clozure cmucl sbcl scl)
(os-cond
((os-unix-p) (parse-unix-namestring string :ensure-directory ensure-directory))
(t (parse-namestring string))))))
(pathname
(if ensure-directory
(and pathname (ensure-directory-pathname pathname))
pathname)))
(apply 'ensure-pathname pathname constraints))))
;;; Probing the filesystem
(with-upgradability ()
(defun truename* (p)
"Nicer variant of TRUENAME that plays well with NIL, avoids logical pathname contexts, and tries both files and directories"
(when p
(when (stringp p) (setf p (with-pathname-defaults () (parse-namestring p))))
(values
(or (ignore-errors (truename p))
;; this is here because trying to find the truename of a directory pathname WITHOUT supplying
;; a trailing directory separator, causes an error on some lisps.
#+(or clisp gcl) (if-let (d (ensure-directory-pathname p nil)) (ignore-errors (truename d)))))))
(defun safe-file-write-date (pathname)
"Safe variant of FILE-WRITE-DATE that may return NIL rather than raise an error."
;; If FILE-WRITE-DATE returns NIL, it's possible that
;; the user or some other agent has deleted an input file.
;; Also, generated files will not exist at the time planning is done
;; and calls compute-action-stamp which calls safe-file-write-date.
;; So it is very possible that we can't get a valid file-write-date,
;; and we can survive and we will continue the planning
;; as if the file were very old.
;; (or should we treat the case in a different, special way?)
(and pathname
(handler-case (file-write-date (physicalize-pathname pathname))
(file-error () nil))))
(defun probe-file* (p &key truename)
"when given a pathname P (designated by a string as per PARSE-NAMESTRING),
probes the filesystem for a file or directory with given pathname.
If it exists, return its truename if TRUENAME is true,
or the original (parsed) pathname if it is false (the default)."
(values
(ignore-errors
(setf p (funcall 'ensure-pathname p
:namestring :lisp
:ensure-physical t
:ensure-absolute t :defaults 'get-pathname-defaults
:want-non-wild t
:on-error nil))
(when p
#+allegro
(probe-file p :follow-symlinks truename)
#+gcl
(if truename
(truename* p)
(let ((kind (car (si::stat p))))
(when (eq kind :link)
(setf kind (ignore-errors (car (si::stat (truename* p))))))
(ecase kind
((nil) nil)
((:file :link)
(cond
((file-pathname-p p) p)
((directory-pathname-p p)
(subpathname p (car (last (pathname-directory p)))))))
(:directory (ensure-directory-pathname p)))))
#+clisp
#.(let* ((fs (or #-os-windows (find-symbol* '#:file-stat :posix nil)))
(pp (find-symbol* '#:probe-pathname :ext nil)))
`(if truename
,(if pp
`(values (,pp p))
'(or (truename* p)
(truename* (ignore-errors (ensure-directory-pathname p)))))
,(cond
(fs `(and (,fs p) p))
(pp `(nth-value 1 (,pp p)))
(t '(or (and (truename* p) p)
(if-let (d (ensure-directory-pathname p))
(and (truename* d) d)))))))
#-(or allegro clisp gcl)
(if truename
(probe-file p)
(and
#+(or cmucl scl) (unix:unix-stat (ext:unix-namestring p))
#+(and lispworks os-unix) (system:get-file-stat p)
#+sbcl (sb-unix:unix-stat (sb-ext:native-namestring p))
#-(or cmucl (and lispworks os-unix) sbcl scl) (file-write-date p)
p))))))
(defun directory-exists-p (x)
"Is X the name of a directory that exists on the filesystem?"
#+allegro
(excl:probe-directory x)
#+clisp
(handler-case (ext:probe-directory x)
(sys::simple-file-error ()
nil))
#-(or allegro clisp)
(let ((p (probe-file* x :truename t)))
(and (directory-pathname-p p) p)))
(defun file-exists-p (x)
"Is X the name of a file that exists on the filesystem?"
(let ((p (probe-file* x :truename t)))
(and (file-pathname-p p) p)))
(defun directory* (pathname-spec &rest keys &key &allow-other-keys)
"Return a list of the entries in a directory by calling DIRECTORY.
Try to override the defaults to not resolving symlinks, if implementation allows."
(apply 'directory pathname-spec
(append keys '#.(or #+allegro '(:directories-are-files nil :follow-symbolic-links nil)
#+(or clozure digitool) '(:follow-links nil)
#+clisp '(:circle t :if-does-not-exist :ignore)
#+(or cmucl scl) '(:follow-links nil :truenamep nil)
#+lispworks '(:link-transparency nil)
#+sbcl (when (find-symbol* :resolve-symlinks '#:sb-impl nil)
'(:resolve-symlinks nil))))))
(defun filter-logical-directory-results (directory entries merger)
"If DIRECTORY isn't a logical pathname, return ENTRIES. If it is,
given ENTRIES in the DIRECTORY, remove the entries which are physical yet
when transformed by MERGER have a different TRUENAME.
Also remove duplicates as may appear with some translation rules.
This function is used as a helper to DIRECTORY-FILES to avoid invalid entries
when using logical-pathnames."
(if (logical-pathname-p directory)
(remove-duplicates ;; on CLISP, querying ~/ will return duplicates
;; Try hard to not resolve logical-pathname into physical pathnames;
;; otherwise logical-pathname users/lovers will be disappointed.
;; If directory* could use some implementation-dependent magic,
;; we will have logical pathnames already; otherwise,
;; we only keep pathnames for which specifying the name and
;; translating the LPN commute.
(loop :for f :in entries
:for p = (or (and (logical-pathname-p f) f)
(let* ((u (ignore-errors (call-function merger f))))
;; The first u avoids a cumbersome (truename u) error.
;; At this point f should already be a truename,
;; but isn't quite in CLISP, for it doesn't have :version :newest
(and u (equal (truename* u) (truename* f)) u)))
:when p :collect p)
:test 'pathname-equal)
entries))
(defun directory-files (directory &optional (pattern *wild-file-for-directory*))
"Return a list of the files in a directory according to the PATTERN.
Subdirectories should NOT be returned.
PATTERN defaults to a pattern carefully chosen based on the implementation;
override the default at your own risk.
DIRECTORY-FILES tries NOT to resolve symlinks if the implementation permits this,
but the behavior in presence of symlinks is not portable. Use IOlib to handle such situations."
(let ((dir (pathname directory)))
(when (logical-pathname-p dir)
;; Because of the filtering we do below,
;; logical pathnames have restrictions on wild patterns.
;; Not that the results are very portable when you use these patterns on physical pathnames.
(when (wild-pathname-p dir)
(parameter-error "~S: Invalid wild pattern in logical directory ~S"
'directory-files directory))
(unless (member (pathname-directory pattern) '(() (:relative)) :test 'equal)
(parameter-error "~S: Invalid file pattern ~S for logical directory ~S" 'directory-files pattern directory))
(setf pattern (make-pathname-logical pattern (pathname-host dir))))
(let* ((pat (merge-pathnames* pattern dir))
(entries (ignore-errors (directory* pat))))
(remove-if 'directory-pathname-p
(filter-logical-directory-results
directory entries
#'(lambda (f)
(make-pathname :defaults dir
:name (make-pathname-component-logical (pathname-name f))
:type (make-pathname-component-logical (pathname-type f))
:version (make-pathname-component-logical (pathname-version f)))))))))
(defun subdirectories (directory)
"Given a DIRECTORY pathname designator, return a list of the subdirectories under it.
The behavior in presence of symlinks is not portable. Use IOlib to handle such situations."
(let* ((directory (ensure-directory-pathname directory))
#-(or abcl cormanlisp genera xcl)
(wild (merge-pathnames*
#-(or abcl allegro cmucl lispworks sbcl scl xcl)
*wild-directory*
#+(or abcl allegro cmucl lispworks sbcl scl xcl) "*.*"
directory))
(dirs
#-(or abcl cormanlisp genera xcl)
(ignore-errors
(directory* wild . #.(or #+clozure '(:directories t :files nil)
#+mcl '(:directories t))))
#+(or abcl xcl) (system:list-directory directory)
#+cormanlisp (cl::directory-subdirs directory)
#+genera (handler-case (fs:directory-list directory) (fs:directory-not-found () nil)))
#+(or abcl allegro cmucl genera lispworks sbcl scl xcl)
(dirs (loop :for x :in dirs
:for d = #+(or abcl xcl) (extensions:probe-directory x)
#+allegro (excl:probe-directory x)
#+(or cmucl sbcl scl) (directory-pathname-p x)
#+genera (getf (cdr x) :directory)
#+lispworks (lw:file-directory-p x)
:when d :collect #+(or abcl allegro xcl) (ensure-directory-pathname d)
#+genera (ensure-directory-pathname (first x))
#+(or cmucl lispworks sbcl scl) x)))
(filter-logical-directory-results
directory dirs
(let ((prefix (or (normalize-pathname-directory-component (pathname-directory directory))
'(:absolute)))) ; because allegro returns NIL for #p"FOO:"
#'(lambda (d)
(let ((dir (normalize-pathname-directory-component (pathname-directory d))))
(and (consp dir) (consp (cdr dir))
(make-pathname
:defaults directory :name nil :type nil :version nil
:directory (append prefix (make-pathname-component-logical (last dir)))))))))))
(defun collect-sub*directories (directory collectp recursep collector)
"Given a DIRECTORY, when COLLECTP returns true when CALL-FUNCTION'ed with the directory,
call-function the COLLECTOR function designator on the directory,
and recurse each of its subdirectories on which the RECURSEP returns true when CALL-FUNCTION'ed with them.
This function will thus let you traverse a filesystem hierarchy,
superseding the functionality of CL-FAD:WALK-DIRECTORY.
The behavior in presence of symlinks is not portable. Use IOlib to handle such situations."
(when (call-function collectp directory)
(call-function collector directory)
(dolist (subdir (subdirectories directory))
(when (call-function recursep subdir)
(collect-sub*directories subdir collectp recursep collector))))))
;;; Resolving symlinks somewhat
(with-upgradability ()
(defun truenamize (pathname)
"Resolve as much of a pathname as possible"
(block nil
(when (typep pathname '(or null logical-pathname)) (return pathname))
(let ((p pathname))
(unless (absolute-pathname-p p)
(setf p (or (absolute-pathname-p (ensure-absolute-pathname p 'get-pathname-defaults nil))
(return p))))
(when (logical-pathname-p p) (return p))
(let ((found (probe-file* p :truename t)))
(when found (return found)))
(let* ((directory (normalize-pathname-directory-component (pathname-directory p)))
(up-components (reverse (rest directory)))
(down-components ()))
(assert (eq :absolute (first directory)))
(loop :while up-components :do
(if-let (parent
(ignore-errors
(probe-file* (make-pathname :directory `(:absolute ,@(reverse up-components))
:name nil :type nil :version nil :defaults p))))
(if-let (simplified
(ignore-errors
(merge-pathnames*
gitextract_4xm2v9ll/
├── .circleci/
│ └── config.yml
├── .dockerignore
├── .gitattributes
├── .gitignore
├── Dockerfile
├── LICENSE
├── Makefile
├── README.md
├── docker-compose.yml
├── launch.lisp
├── quicklisp/
│ ├── .gitignore
│ ├── asdf.lisp
│ ├── client-info.sexp
│ ├── dists/
│ │ └── quicklisp/
│ │ ├── distinfo.txt
│ │ ├── enabled.txt
│ │ └── preference.txt
│ ├── log4slime-setup.el
│ ├── quicklisp/
│ │ ├── bundle-template.lisp
│ │ ├── bundle.lisp
│ │ ├── cdb.lisp
│ │ ├── client-info.lisp
│ │ ├── client-update.lisp
│ │ ├── client.lisp
│ │ ├── config.lisp
│ │ ├── deflate.lisp
│ │ ├── dist-update.lisp
│ │ ├── dist.lisp
│ │ ├── fetch-gzipped.lisp
│ │ ├── http.lisp
│ │ ├── impl-util.lisp
│ │ ├── impl.lisp
│ │ ├── local-projects.lisp
│ │ ├── minitar.lisp
│ │ ├── misc.lisp
│ │ ├── network.lisp
│ │ ├── package.lisp
│ │ ├── progress.lisp
│ │ ├── quicklisp.asd
│ │ ├── setup.lisp
│ │ ├── utils.lisp
│ │ └── version.txt
│ └── setup.lisp
├── scripts/
│ ├── asdf.lisp
│ ├── build-cli.lisp
│ ├── build-image.lisp
│ ├── common.mk
│ ├── docker-compose-with-replay.yml
│ ├── init.lisp
│ ├── install-sbcl.sh
│ ├── jenkins.lisp
│ ├── lispworks-versions.mk
│ ├── prepare-image.lisp
│ └── update-phabricator.lisp
├── src/
│ ├── auth/
│ │ ├── acceptor.lisp
│ │ ├── auth.asd
│ │ ├── auth.lisp
│ │ ├── avatar.lisp
│ │ ├── company.lisp
│ │ ├── dummy-init-key.out
│ │ ├── login/
│ │ │ ├── auth.login.asd
│ │ │ ├── cached-avatar.lisp
│ │ │ ├── common.lisp
│ │ │ ├── forgot-password.lisp
│ │ │ ├── github.lisp
│ │ │ ├── impersonation.lisp
│ │ │ ├── login.lisp
│ │ │ ├── oidc.lisp
│ │ │ ├── roles-auth-provider.lisp
│ │ │ ├── saml.lisp
│ │ │ ├── signup.lisp
│ │ │ ├── sso.lisp
│ │ │ ├── test-cached-avatar.lisp
│ │ │ ├── test-roles-auth-provider.lisp
│ │ │ ├── test-sso.lisp
│ │ │ ├── test-verify-email.lisp
│ │ │ └── verify-email.lisp
│ │ ├── model/
│ │ │ ├── auth.model.asd
│ │ │ ├── company-sso.lisp
│ │ │ ├── email-confirmation.lisp
│ │ │ ├── invite.lisp
│ │ │ ├── roles.lisp
│ │ │ ├── test-email-confirmation.lisp
│ │ │ ├── test-invite.lisp
│ │ │ ├── test-roles.lisp
│ │ │ └── user.lisp
│ │ ├── package.lisp
│ │ ├── request.lisp
│ │ ├── test-auth.lisp
│ │ ├── test-avatar.lisp
│ │ ├── test-view.lisp
│ │ ├── view.lisp
│ │ └── viewer-context.lisp
│ ├── auto-restart/
│ │ ├── .circleci/
│ │ │ └── config.yml
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── auto-restart.asd
│ │ ├── auto-restart.lisp
│ │ ├── run-circleci.lisp
│ │ └── test-auto-restart.lisp
│ ├── build-utils/
│ │ ├── all.lisp
│ │ ├── build-utils.asd
│ │ ├── closure-compiler/
│ │ │ ├── COPYING
│ │ │ ├── README.md
│ │ │ └── closure-compiler-v20240317.jar
│ │ ├── closure-compiler.lisp
│ │ ├── common.lisp
│ │ ├── css-package.lisp
│ │ ├── dart-sass/
│ │ │ ├── sass
│ │ │ └── src/
│ │ │ ├── LICENSE
│ │ │ ├── dart
│ │ │ └── sass.snapshot
│ │ ├── darwin/
│ │ │ └── dart-sass/
│ │ │ ├── sass
│ │ │ └── src/
│ │ │ ├── LICENSE
│ │ │ ├── dart
│ │ │ └── sass.snapshot
│ │ ├── deliver-script.lisp
│ │ ├── jar-file.lisp
│ │ ├── js-package.lisp
│ │ ├── linux-arm64/
│ │ │ └── dart-sass/
│ │ │ ├── sass
│ │ │ └── src/
│ │ │ ├── LICENSE
│ │ │ ├── dart
│ │ │ └── sass.snapshot
│ │ ├── remote-file.lisp
│ │ └── wild-module.lisp
│ ├── cl-mongo-id/
│ │ ├── LICENSE
│ │ ├── README.markdown
│ │ ├── cl-mongo-id.asd
│ │ ├── mongo-id.lisp
│ │ └── test-mongo-id.lisp
│ ├── common/
│ │ └── bootstrap/
│ │ ├── .babelrc.js
│ │ ├── .browserslistrc
│ │ ├── .bundlewatch.config.json
│ │ ├── .cspell.json
│ │ ├── .editorconfig
│ │ ├── .eslintignore
│ │ ├── .eslintrc.json
│ │ ├── .gitattributes
│ │ ├── .github/
│ │ │ ├── CODEOWNERS
│ │ │ ├── CONTRIBUTING.md
│ │ │ ├── ISSUE_TEMPLATE/
│ │ │ │ ├── bug_report.yml
│ │ │ │ ├── config.yml
│ │ │ │ └── feature_request.yml
│ │ │ ├── PULL_REQUEST_TEMPLATE.md
│ │ │ ├── SUPPORT.md
│ │ │ ├── dependabot.yml
│ │ │ ├── release-drafter.yml
│ │ │ └── workflows/
│ │ │ ├── browserstack.yml
│ │ │ ├── bundlewatch.yml
│ │ │ ├── calibreapp-image-actions.yml
│ │ │ ├── codeql.yml
│ │ │ ├── cspell.yml
│ │ │ ├── css.yml
│ │ │ ├── docs.yml
│ │ │ ├── issue-close-require.yml
│ │ │ ├── issue-labeled.yml
│ │ │ ├── js.yml
│ │ │ ├── lint.yml
│ │ │ ├── node-sass.yml
│ │ │ └── release-notes.yml
│ │ ├── .gitignore
│ │ ├── .stylelintignore
│ │ ├── .stylelintrc
│ │ ├── CODE_OF_CONDUCT.md
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── SECURITY.md
│ │ ├── build/
│ │ │ ├── .eslintrc.json
│ │ │ ├── banner.js
│ │ │ ├── build-plugins.js
│ │ │ ├── change-version.js
│ │ │ ├── generate-sri.js
│ │ │ ├── postcss.config.js
│ │ │ ├── rollup.config.js
│ │ │ ├── vnu-jar.js
│ │ │ └── zip-examples.js
│ │ ├── composer.json
│ │ ├── config.yml
│ │ ├── dist/
│ │ │ ├── css/
│ │ │ │ ├── bootstrap-grid.css
│ │ │ │ ├── bootstrap-grid.rtl.css
│ │ │ │ ├── bootstrap-reboot.css
│ │ │ │ ├── bootstrap-reboot.rtl.css
│ │ │ │ ├── bootstrap-utilities.css
│ │ │ │ ├── bootstrap-utilities.rtl.css
│ │ │ │ ├── bootstrap.css
│ │ │ │ └── bootstrap.rtl.css
│ │ │ └── js/
│ │ │ ├── bootstrap.bundle.js
│ │ │ ├── bootstrap.esm.js
│ │ │ ├── bootstrap.js
│ │ │ └── bootstrap5-js.asd
│ │ ├── js/
│ │ │ ├── dist/
│ │ │ │ ├── alert.js
│ │ │ │ ├── base-component.js
│ │ │ │ ├── button.js
│ │ │ │ ├── carousel.js
│ │ │ │ ├── collapse.js
│ │ │ │ ├── dom/
│ │ │ │ │ ├── data.js
│ │ │ │ │ ├── event-handler.js
│ │ │ │ │ ├── manipulator.js
│ │ │ │ │ └── selector-engine.js
│ │ │ │ ├── dropdown.js
│ │ │ │ ├── modal.js
│ │ │ │ ├── offcanvas.js
│ │ │ │ ├── popover.js
│ │ │ │ ├── scrollspy.js
│ │ │ │ ├── tab.js
│ │ │ │ ├── toast.js
│ │ │ │ ├── tooltip.js
│ │ │ │ └── util/
│ │ │ │ ├── backdrop.js
│ │ │ │ ├── component-functions.js
│ │ │ │ ├── config.js
│ │ │ │ ├── focustrap.js
│ │ │ │ ├── index.js
│ │ │ │ ├── sanitizer.js
│ │ │ │ ├── scrollbar.js
│ │ │ │ ├── swipe.js
│ │ │ │ └── template-factory.js
│ │ │ ├── index.esm.js
│ │ │ ├── index.umd.js
│ │ │ ├── src/
│ │ │ │ ├── alert.js
│ │ │ │ ├── base-component.js
│ │ │ │ ├── button.js
│ │ │ │ ├── carousel.js
│ │ │ │ ├── collapse.js
│ │ │ │ ├── dom/
│ │ │ │ │ ├── data.js
│ │ │ │ │ ├── event-handler.js
│ │ │ │ │ ├── manipulator.js
│ │ │ │ │ └── selector-engine.js
│ │ │ │ ├── dropdown.js
│ │ │ │ ├── modal.js
│ │ │ │ ├── offcanvas.js
│ │ │ │ ├── popover.js
│ │ │ │ ├── scrollspy.js
│ │ │ │ ├── tab.js
│ │ │ │ ├── toast.js
│ │ │ │ ├── tooltip.js
│ │ │ │ └── util/
│ │ │ │ ├── backdrop.js
│ │ │ │ ├── component-functions.js
│ │ │ │ ├── config.js
│ │ │ │ ├── focustrap.js
│ │ │ │ ├── index.js
│ │ │ │ ├── sanitizer.js
│ │ │ │ ├── scrollbar.js
│ │ │ │ ├── swipe.js
│ │ │ │ └── template-factory.js
│ │ │ └── tests/
│ │ │ ├── README.md
│ │ │ ├── browsers.js
│ │ │ ├── helpers/
│ │ │ │ └── fixture.js
│ │ │ ├── integration/
│ │ │ │ ├── bundle-modularity.js
│ │ │ │ ├── bundle.js
│ │ │ │ ├── index.html
│ │ │ │ ├── rollup.bundle-modularity.js
│ │ │ │ └── rollup.bundle.js
│ │ │ ├── karma.conf.js
│ │ │ ├── unit/
│ │ │ │ ├── .eslintrc.json
│ │ │ │ ├── alert.spec.js
│ │ │ │ ├── base-component.spec.js
│ │ │ │ ├── button.spec.js
│ │ │ │ ├── carousel.spec.js
│ │ │ │ ├── collapse.spec.js
│ │ │ │ ├── dom/
│ │ │ │ │ ├── data.spec.js
│ │ │ │ │ ├── event-handler.spec.js
│ │ │ │ │ ├── manipulator.spec.js
│ │ │ │ │ └── selector-engine.spec.js
│ │ │ │ ├── dropdown.spec.js
│ │ │ │ ├── jquery.spec.js
│ │ │ │ ├── modal.spec.js
│ │ │ │ ├── offcanvas.spec.js
│ │ │ │ ├── popover.spec.js
│ │ │ │ ├── scrollspy.spec.js
│ │ │ │ ├── tab.spec.js
│ │ │ │ ├── toast.spec.js
│ │ │ │ ├── tooltip.spec.js
│ │ │ │ └── util/
│ │ │ │ ├── backdrop.spec.js
│ │ │ │ ├── component-functions.spec.js
│ │ │ │ ├── config.spec.js
│ │ │ │ ├── focustrap.spec.js
│ │ │ │ ├── index.spec.js
│ │ │ │ ├── sanitizer.spec.js
│ │ │ │ ├── scrollbar.spec.js
│ │ │ │ ├── swipe.spec.js
│ │ │ │ └── template-factory.spec.js
│ │ │ └── visual/
│ │ │ ├── .eslintrc.json
│ │ │ ├── alert.html
│ │ │ ├── button.html
│ │ │ ├── carousel.html
│ │ │ ├── collapse.html
│ │ │ ├── dropdown.html
│ │ │ ├── modal.html
│ │ │ ├── popover.html
│ │ │ ├── scrollspy.html
│ │ │ ├── tab.html
│ │ │ ├── toast.html
│ │ │ └── tooltip.html
│ │ ├── nuget/
│ │ │ ├── MyGet.ps1
│ │ │ ├── bootstrap.nuspec
│ │ │ └── bootstrap.sass.nuspec
│ │ ├── package.js
│ │ ├── package.json
│ │ ├── scss/
│ │ │ ├── _accordion.scss
│ │ │ ├── _alert.scss
│ │ │ ├── _badge.scss
│ │ │ ├── _breadcrumb.scss
│ │ │ ├── _button-group.scss
│ │ │ ├── _buttons.scss
│ │ │ ├── _card.scss
│ │ │ ├── _carousel.scss
│ │ │ ├── _close.scss
│ │ │ ├── _containers.scss
│ │ │ ├── _dropdown.scss
│ │ │ ├── _forms.scss
│ │ │ ├── _functions.scss
│ │ │ ├── _grid.scss
│ │ │ ├── _helpers.scss
│ │ │ ├── _images.scss
│ │ │ ├── _list-group.scss
│ │ │ ├── _maps.scss
│ │ │ ├── _mixins.scss
│ │ │ ├── _modal.scss
│ │ │ ├── _nav.scss
│ │ │ ├── _navbar.scss
│ │ │ ├── _offcanvas.scss
│ │ │ ├── _pagination.scss
│ │ │ ├── _placeholders.scss
│ │ │ ├── _popover.scss
│ │ │ ├── _progress.scss
│ │ │ ├── _reboot.scss
│ │ │ ├── _root.scss
│ │ │ ├── _spinners.scss
│ │ │ ├── _tables.scss
│ │ │ ├── _toasts.scss
│ │ │ ├── _tooltip.scss
│ │ │ ├── _transitions.scss
│ │ │ ├── _type.scss
│ │ │ ├── _utilities.scss
│ │ │ ├── _variables.scss
│ │ │ ├── bootstrap-grid.scss
│ │ │ ├── bootstrap-reboot.scss
│ │ │ ├── bootstrap-utilities.scss
│ │ │ ├── bootstrap.scss
│ │ │ ├── bootstrap5-css.asd
│ │ │ ├── forms/
│ │ │ │ ├── _floating-labels.scss
│ │ │ │ ├── _form-check.scss
│ │ │ │ ├── _form-control.scss
│ │ │ │ ├── _form-range.scss
│ │ │ │ ├── _form-select.scss
│ │ │ │ ├── _form-text.scss
│ │ │ │ ├── _input-group.scss
│ │ │ │ ├── _labels.scss
│ │ │ │ └── _validation.scss
│ │ │ ├── helpers/
│ │ │ │ ├── _clearfix.scss
│ │ │ │ ├── _color-bg.scss
│ │ │ │ ├── _colored-links.scss
│ │ │ │ ├── _position.scss
│ │ │ │ ├── _ratio.scss
│ │ │ │ ├── _stacks.scss
│ │ │ │ ├── _stretched-link.scss
│ │ │ │ ├── _text-truncation.scss
│ │ │ │ ├── _visually-hidden.scss
│ │ │ │ └── _vr.scss
│ │ │ ├── mixins/
│ │ │ │ ├── _alert.scss
│ │ │ │ ├── _backdrop.scss
│ │ │ │ ├── _banner.scss
│ │ │ │ ├── _border-radius.scss
│ │ │ │ ├── _box-shadow.scss
│ │ │ │ ├── _breakpoints.scss
│ │ │ │ ├── _buttons.scss
│ │ │ │ ├── _caret.scss
│ │ │ │ ├── _clearfix.scss
│ │ │ │ ├── _color-scheme.scss
│ │ │ │ ├── _container.scss
│ │ │ │ ├── _deprecate.scss
│ │ │ │ ├── _forms.scss
│ │ │ │ ├── _gradients.scss
│ │ │ │ ├── _grid.scss
│ │ │ │ ├── _image.scss
│ │ │ │ ├── _list-group.scss
│ │ │ │ ├── _lists.scss
│ │ │ │ ├── _pagination.scss
│ │ │ │ ├── _reset-text.scss
│ │ │ │ ├── _resize.scss
│ │ │ │ ├── _table-variants.scss
│ │ │ │ ├── _text-truncate.scss
│ │ │ │ ├── _transition.scss
│ │ │ │ ├── _utilities.scss
│ │ │ │ └── _visually-hidden.scss
│ │ │ ├── utilities/
│ │ │ │ └── _api.scss
│ │ │ └── vendor/
│ │ │ └── _rfs.scss
│ │ └── site/
│ │ ├── .eslintrc.json
│ │ ├── assets/
│ │ │ ├── js/
│ │ │ │ ├── application.js
│ │ │ │ ├── code-examples.js
│ │ │ │ ├── search.js
│ │ │ │ └── snippets.js
│ │ │ └── scss/
│ │ │ ├── _ads.scss
│ │ │ ├── _anchor.scss
│ │ │ ├── _brand.scss
│ │ │ ├── _buttons.scss
│ │ │ ├── _callouts.scss
│ │ │ ├── _clipboard-js.scss
│ │ │ ├── _colors.scss
│ │ │ ├── _component-examples.scss
│ │ │ ├── _content.scss
│ │ │ ├── _footer.scss
│ │ │ ├── _layout.scss
│ │ │ ├── _masthead.scss
│ │ │ ├── _navbar.scss
│ │ │ ├── _placeholder-img.scss
│ │ │ ├── _search.scss
│ │ │ ├── _sidebar.scss
│ │ │ ├── _skippy.scss
│ │ │ ├── _syntax.scss
│ │ │ ├── _toc.scss
│ │ │ ├── _variables.scss
│ │ │ └── docs.scss
│ │ ├── content/
│ │ │ ├── 404.md
│ │ │ └── docs/
│ │ │ ├── 5.2/
│ │ │ │ ├── _index.html
│ │ │ │ ├── about/
│ │ │ │ │ ├── brand.md
│ │ │ │ │ ├── license.md
│ │ │ │ │ ├── overview.md
│ │ │ │ │ ├── team.md
│ │ │ │ │ └── translations.md
│ │ │ │ ├── components/
│ │ │ │ │ ├── accordion.md
│ │ │ │ │ ├── alerts.md
│ │ │ │ │ ├── badge.md
│ │ │ │ │ ├── breadcrumb.md
│ │ │ │ │ ├── button-group.md
│ │ │ │ │ ├── buttons.md
│ │ │ │ │ ├── card.md
│ │ │ │ │ ├── carousel.md
│ │ │ │ │ ├── close-button.md
│ │ │ │ │ ├── collapse.md
│ │ │ │ │ ├── dropdowns.md
│ │ │ │ │ ├── list-group.md
│ │ │ │ │ ├── modal.md
│ │ │ │ │ ├── navbar.md
│ │ │ │ │ ├── navs-tabs.md
│ │ │ │ │ ├── offcanvas.md
│ │ │ │ │ ├── pagination.md
│ │ │ │ │ ├── placeholders.md
│ │ │ │ │ ├── popovers.md
│ │ │ │ │ ├── progress.md
│ │ │ │ │ ├── scrollspy.md
│ │ │ │ │ ├── spinners.md
│ │ │ │ │ ├── toasts.md
│ │ │ │ │ └── tooltips.md
│ │ │ │ ├── content/
│ │ │ │ │ ├── figures.md
│ │ │ │ │ ├── images.md
│ │ │ │ │ ├── reboot.md
│ │ │ │ │ ├── tables.md
│ │ │ │ │ └── typography.md
│ │ │ │ ├── customize/
│ │ │ │ │ ├── color.md
│ │ │ │ │ ├── components.md
│ │ │ │ │ ├── css-variables.md
│ │ │ │ │ ├── optimize.md
│ │ │ │ │ ├── options.md
│ │ │ │ │ ├── overview.md
│ │ │ │ │ └── sass.md
│ │ │ │ ├── examples/
│ │ │ │ │ ├── .stylelintrc
│ │ │ │ │ ├── _index.md
│ │ │ │ │ ├── album/
│ │ │ │ │ │ └── index.html
│ │ │ │ │ ├── album-rtl/
│ │ │ │ │ │ └── index.html
│ │ │ │ │ ├── blog/
│ │ │ │ │ │ ├── blog.css
│ │ │ │ │ │ ├── blog.rtl.css
│ │ │ │ │ │ └── index.html
│ │ │ │ │ ├── blog-rtl/
│ │ │ │ │ │ └── index.html
│ │ │ │ │ ├── carousel/
│ │ │ │ │ │ ├── carousel.css
│ │ │ │ │ │ ├── carousel.rtl.css
│ │ │ │ │ │ └── index.html
│ │ │ │ │ ├── carousel-rtl/
│ │ │ │ │ │ └── index.html
│ │ │ │ │ ├── cheatsheet/
│ │ │ │ │ │ ├── cheatsheet.css
│ │ │ │ │ │ ├── cheatsheet.js
│ │ │ │ │ │ ├── cheatsheet.rtl.css
│ │ │ │ │ │ └── index.html
│ │ │ │ │ ├── cheatsheet-rtl/
│ │ │ │ │ │ └── index.html
│ │ │ │ │ ├── checkout/
│ │ │ │ │ │ ├── form-validation.css
│ │ │ │ │ │ ├── form-validation.js
│ │ │ │ │ │ └── index.html
│ │ │ │ │ ├── checkout-rtl/
│ │ │ │ │ │ └── index.html
│ │ │ │ │ ├── cover/
│ │ │ │ │ │ ├── cover.css
│ │ │ │ │ │ └── index.html
│ │ │ │ │ ├── dashboard/
│ │ │ │ │ │ ├── dashboard.css
│ │ │ │ │ │ ├── dashboard.js
│ │ │ │ │ │ ├── dashboard.rtl.css
│ │ │ │ │ │ └── index.html
│ │ │ │ │ ├── dashboard-rtl/
│ │ │ │ │ │ ├── dashboard.js
│ │ │ │ │ │ └── index.html
│ │ │ │ │ ├── dropdowns/
│ │ │ │ │ │ ├── dropdowns.css
│ │ │ │ │ │ └── index.html
│ │ │ │ │ ├── features/
│ │ │ │ │ │ ├── features.css
│ │ │ │ │ │ └── index.html
│ │ │ │ │ ├── footers/
│ │ │ │ │ │ └── index.html
│ │ │ │ │ ├── grid/
│ │ │ │ │ │ ├── grid.css
│ │ │ │ │ │ └── index.html
│ │ │ │ │ ├── headers/
│ │ │ │ │ │ ├── headers.css
│ │ │ │ │ │ └── index.html
│ │ │ │ │ ├── heroes/
│ │ │ │ │ │ ├── heroes.css
│ │ │ │ │ │ └── index.html
│ │ │ │ │ ├── jumbotron/
│ │ │ │ │ │ └── index.html
│ │ │ │ │ ├── list-groups/
│ │ │ │ │ │ ├── index.html
│ │ │ │ │ │ └── list-groups.css
│ │ │ │ │ ├── masonry/
│ │ │ │ │ │ └── index.html
│ │ │ │ │ ├── modals/
│ │ │ │ │ │ ├── index.html
│ │ │ │ │ │ └── modals.css
│ │ │ │ │ ├── navbar-bottom/
│ │ │ │ │ │ └── index.html
│ │ │ │ │ ├── navbar-fixed/
│ │ │ │ │ │ ├── index.html
│ │ │ │ │ │ └── navbar-top-fixed.css
│ │ │ │ │ ├── navbar-static/
│ │ │ │ │ │ ├── index.html
│ │ │ │ │ │ └── navbar-top.css
│ │ │ │ │ ├── navbars/
│ │ │ │ │ │ ├── index.html
│ │ │ │ │ │ └── navbar.css
│ │ │ │ │ ├── navbars-offcanvas/
│ │ │ │ │ │ ├── index.html
│ │ │ │ │ │ └── navbar.css
│ │ │ │ │ ├── offcanvas-navbar/
│ │ │ │ │ │ ├── index.html
│ │ │ │ │ │ ├── offcanvas.css
│ │ │ │ │ │ └── offcanvas.js
│ │ │ │ │ ├── pricing/
│ │ │ │ │ │ ├── index.html
│ │ │ │ │ │ └── pricing.css
│ │ │ │ │ ├── product/
│ │ │ │ │ │ ├── index.html
│ │ │ │ │ │ └── product.css
│ │ │ │ │ ├── sidebars/
│ │ │ │ │ │ ├── index.html
│ │ │ │ │ │ ├── sidebars.css
│ │ │ │ │ │ └── sidebars.js
│ │ │ │ │ ├── sign-in/
│ │ │ │ │ │ ├── index.html
│ │ │ │ │ │ └── signin.css
│ │ │ │ │ ├── starter-template/
│ │ │ │ │ │ ├── index.html
│ │ │ │ │ │ └── starter-template.css
│ │ │ │ │ ├── sticky-footer/
│ │ │ │ │ │ ├── index.html
│ │ │ │ │ │ └── sticky-footer.css
│ │ │ │ │ └── sticky-footer-navbar/
│ │ │ │ │ ├── index.html
│ │ │ │ │ └── sticky-footer-navbar.css
│ │ │ │ ├── extend/
│ │ │ │ │ ├── approach.md
│ │ │ │ │ └── icons.md
│ │ │ │ ├── forms/
│ │ │ │ │ ├── checks-radios.md
│ │ │ │ │ ├── floating-labels.md
│ │ │ │ │ ├── form-control.md
│ │ │ │ │ ├── input-group.md
│ │ │ │ │ ├── layout.md
│ │ │ │ │ ├── overview.md
│ │ │ │ │ ├── range.md
│ │ │ │ │ ├── select.md
│ │ │ │ │ └── validation.md
│ │ │ │ ├── getting-started/
│ │ │ │ │ ├── accessibility.md
│ │ │ │ │ ├── best-practices.md
│ │ │ │ │ ├── browsers-devices.md
│ │ │ │ │ ├── contents.md
│ │ │ │ │ ├── contribute.md
│ │ │ │ │ ├── download.md
│ │ │ │ │ ├── introduction.md
│ │ │ │ │ ├── javascript.md
│ │ │ │ │ ├── parcel.md
│ │ │ │ │ ├── rfs.md
│ │ │ │ │ ├── rtl.md
│ │ │ │ │ ├── vite.md
│ │ │ │ │ └── webpack.md
│ │ │ │ ├── helpers/
│ │ │ │ │ ├── clearfix.md
│ │ │ │ │ ├── color-background.md
│ │ │ │ │ ├── colored-links.md
│ │ │ │ │ ├── position.md
│ │ │ │ │ ├── ratio.md
│ │ │ │ │ ├── stacks.md
│ │ │ │ │ ├── stretched-link.md
│ │ │ │ │ ├── text-truncation.md
│ │ │ │ │ ├── vertical-rule.md
│ │ │ │ │ └── visually-hidden.md
│ │ │ │ ├── layout/
│ │ │ │ │ ├── breakpoints.md
│ │ │ │ │ ├── columns.md
│ │ │ │ │ ├── containers.md
│ │ │ │ │ ├── css-grid.md
│ │ │ │ │ ├── grid.md
│ │ │ │ │ ├── gutters.md
│ │ │ │ │ ├── utilities.md
│ │ │ │ │ └── z-index.md
│ │ │ │ ├── migration.md
│ │ │ │ └── utilities/
│ │ │ │ ├── api.md
│ │ │ │ ├── background.md
│ │ │ │ ├── borders.md
│ │ │ │ ├── colors.md
│ │ │ │ ├── display.md
│ │ │ │ ├── flex.md
│ │ │ │ ├── float.md
│ │ │ │ ├── interactions.md
│ │ │ │ ├── opacity.md
│ │ │ │ ├── overflow.md
│ │ │ │ ├── position.md
│ │ │ │ ├── shadows.md
│ │ │ │ ├── sizing.md
│ │ │ │ ├── spacing.md
│ │ │ │ ├── text.md
│ │ │ │ ├── vertical-align.md
│ │ │ │ └── visibility.md
│ │ │ ├── _index.html
│ │ │ └── versions.md
│ │ ├── data/
│ │ │ ├── breakpoints.yml
│ │ │ ├── colors.yml
│ │ │ ├── core-team.yml
│ │ │ ├── docs-versions.yml
│ │ │ ├── examples.yml
│ │ │ ├── grays.yml
│ │ │ ├── icons.yml
│ │ │ ├── plugins.yml
│ │ │ ├── sidebar.yml
│ │ │ ├── theme-colors.yml
│ │ │ └── translations.yml
│ │ ├── layouts/
│ │ │ ├── _default/
│ │ │ │ ├── 404.html
│ │ │ │ ├── _markup/
│ │ │ │ │ └── render-heading.html
│ │ │ │ ├── baseof.html
│ │ │ │ ├── docs.html
│ │ │ │ ├── examples.html
│ │ │ │ ├── home.html
│ │ │ │ ├── redirect.html
│ │ │ │ └── single.html
│ │ │ ├── alias.html
│ │ │ ├── partials/
│ │ │ │ ├── ads.html
│ │ │ │ ├── analytics.html
│ │ │ │ ├── callout-danger-async-methods.md
│ │ │ │ ├── callout-info-mediaqueries-breakpoints.md
│ │ │ │ ├── callout-info-npm-starter.md
│ │ │ │ ├── callout-info-prefersreducedmotion.md
│ │ │ │ ├── callout-info-sanitizer.md
│ │ │ │ ├── callout-warning-color-assistive-technologies.md
│ │ │ │ ├── callout-warning-data-bs-title-vs-title.md
│ │ │ │ ├── callout-warning-input-support.md
│ │ │ │ ├── docs-navbar.html
│ │ │ │ ├── docs-sidebar.html
│ │ │ │ ├── docs-versions.html
│ │ │ │ ├── favicons.html
│ │ │ │ ├── footer.html
│ │ │ │ ├── guide-footer.md
│ │ │ │ ├── header.html
│ │ │ │ ├── home/
│ │ │ │ │ ├── masthead-followup.html
│ │ │ │ │ └── masthead.html
│ │ │ │ ├── icons.html
│ │ │ │ ├── js-data-attributes.md
│ │ │ │ ├── redirect.html
│ │ │ │ ├── scripts.html
│ │ │ │ ├── skippy.html
│ │ │ │ ├── social.html
│ │ │ │ ├── stylesheet.html
│ │ │ │ └── table-content.html
│ │ │ ├── robots.txt
│ │ │ ├── shortcodes/
│ │ │ │ ├── added-in.html
│ │ │ │ ├── bs-table.html
│ │ │ │ ├── callout.html
│ │ │ │ ├── docsref.html
│ │ │ │ ├── example.html
│ │ │ │ ├── js-dismiss.html
│ │ │ │ ├── markdown.html
│ │ │ │ ├── param.html
│ │ │ │ ├── partial.html
│ │ │ │ ├── placeholder.html
│ │ │ │ ├── scss-docs.html
│ │ │ │ ├── table.html
│ │ │ │ └── year.html
│ │ │ └── sitemap.xml
│ │ └── static/
│ │ ├── CNAME
│ │ ├── docs/
│ │ │ └── 5.2/
│ │ │ └── assets/
│ │ │ ├── img/
│ │ │ │ └── favicons/
│ │ │ │ └── manifest.json
│ │ │ └── js/
│ │ │ └── validate-forms.js
│ │ └── sw.js
│ ├── control-socket/
│ │ ├── control-socket.asd
│ │ └── server.lisp
│ ├── core/
│ │ ├── active-users/
│ │ │ ├── active-users.lisp
│ │ │ ├── core.active-users.asd
│ │ │ └── test-active-users.lisp
│ │ ├── api/
│ │ │ ├── acceptor.lisp
│ │ │ ├── api-key-api.lisp
│ │ │ ├── core.api.asd
│ │ │ ├── dashboard/
│ │ │ │ ├── api-keys.lisp
│ │ │ │ └── test-api-keys.lisp
│ │ │ └── model/
│ │ │ ├── api-key.lisp
│ │ │ └── test-api-key.lisp
│ │ ├── cli/
│ │ │ ├── core.cli.asd
│ │ │ ├── darwin-template.lisp
│ │ │ ├── deliver.lisp
│ │ │ ├── sentry.lisp
│ │ │ └── test-sentry.lisp
│ │ ├── config/
│ │ │ ├── api.lisp
│ │ │ ├── core.config.asd
│ │ │ ├── model.lisp
│ │ │ └── test-model.lisp
│ │ ├── installation/
│ │ │ ├── auth-provider.lisp
│ │ │ ├── auth.lisp
│ │ │ ├── core.installation.asd
│ │ │ ├── installation.lisp
│ │ │ ├── mailer.lisp
│ │ │ ├── request.lisp
│ │ │ ├── test-installation.lisp
│ │ │ ├── test-mailer.lisp
│ │ │ └── test-request.lisp
│ │ ├── rpc/
│ │ │ ├── core.rpc.asd
│ │ │ ├── rpc.lisp
│ │ │ └── test-rpc.lisp
│ │ └── ui/
│ │ ├── assets/
│ │ │ ├── README
│ │ │ └── fonts/
│ │ │ └── metropolis/
│ │ │ ├── Metropolis-Bold-arnold.otf
│ │ │ ├── Metropolis-Medium.otf
│ │ │ ├── Metropolis-MediumItalic.otf
│ │ │ ├── Metropolis-Regular.otf
│ │ │ ├── Metropolis-RegularItalic.otf
│ │ │ ├── Metropolis-SemiBold.otf
│ │ │ └── Metropolis-SemiBoldItalic.otf
│ │ ├── assets.lisp
│ │ ├── core.ui.asd
│ │ ├── fonts.lisp
│ │ ├── image.lisp
│ │ ├── left-side-bar.lisp
│ │ ├── mdi.lisp
│ │ ├── nibble-span.lisp
│ │ ├── paginated.lisp
│ │ ├── post.lisp
│ │ ├── simple-card-page.lisp
│ │ ├── taskie.lisp
│ │ ├── template.lisp
│ │ ├── test-paginated.lisp
│ │ └── test-taskie.lisp
│ ├── encrypt/
│ │ ├── encrypt.asd
│ │ ├── encrypt.lisp
│ │ ├── hmac.lisp
│ │ ├── test-encrypt.lisp
│ │ └── test-hmac.lisp
│ ├── file-lock/
│ │ ├── .circleci/
│ │ │ └── config.yml
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── file-lock.asd
│ │ ├── file-lock.lisp
│ │ ├── run-circleci.lisp
│ │ └── test-file-lock.lisp
│ ├── gatekeeper/
│ │ ├── gatekeeper.asd
│ │ ├── gatekeeper.lisp
│ │ └── test-gatekeeper.lisp
│ ├── graphs/
│ │ ├── all.lisp
│ │ ├── dfs.lisp
│ │ ├── graphs.asd
│ │ └── test-dfs.lisp
│ ├── http-proxy/
│ │ ├── http-proxy.asd
│ │ ├── server.lisp
│ │ └── test-server.lisp
│ ├── hunchentoot-extensions/
│ │ ├── acceptor-with-plugins.lisp
│ │ ├── asdf-acceptor.lisp
│ │ ├── async.lisp
│ │ ├── better-easy-handler.lisp
│ │ ├── clos-dispatcher.lisp
│ │ ├── existing-socket.lisp
│ │ ├── forward.lisp
│ │ ├── hunchentoot-extensions.asd
│ │ ├── package.lisp
│ │ ├── postdata.lisp
│ │ ├── random-port.lisp
│ │ ├── test-acceptor-with-plugins.lisp
│ │ ├── test-async.lisp
│ │ ├── test-better-easy-handler.lisp
│ │ ├── test-clos-dispatcher.lisp
│ │ ├── test-forward.lisp
│ │ ├── test-random-port.lisp
│ │ ├── test-url.lisp
│ │ ├── url.lisp
│ │ └── webp.lisp
│ ├── java/
│ │ ├── libs/
│ │ │ ├── asana-0.10.3.jar
│ │ │ ├── atlassian-event-4.1.1.jar
│ │ │ ├── atlassian-httpclient-api-2.1.5.jar
│ │ │ ├── atlassian-httpclient-library-2.1.5.jar
│ │ │ ├── atlassian-util-concurrent-4.0.1.jar
│ │ │ ├── bcprov-jdk15on-1.68.jar
│ │ │ ├── checker-qual-3.8.0.jar
│ │ │ ├── commons-codec-1.15.jar
│ │ │ ├── commons-lang3-3.11.jar
│ │ │ ├── commons-logging-1.2.jar
│ │ │ ├── error_prone_annotations-2.5.1.jar
│ │ │ ├── failureaccess-1.0.1.jar
│ │ │ ├── fugue-4.7.2.jar
│ │ │ ├── google-http-client-1.20.0.jar
│ │ │ ├── google-http-client-gson-1.20.0.jar
│ │ │ ├── google-oauth-client-1.20.0.jar
│ │ │ ├── gson-2.3.1.jar
│ │ │ ├── guava-30.1.1-jre.jar
│ │ │ ├── httpasyncclient-4.1.4.jar
│ │ │ ├── httpasyncclient-cache-4.1.4.jar
│ │ │ ├── httpclient-4.5.13.jar
│ │ │ ├── httpclient-cache-4.5.13.jar
│ │ │ ├── httpcore-4.4.13.jar
│ │ │ ├── httpcore-nio-4.4.10.jar
│ │ │ ├── httpmime-4.5.13.jar
│ │ │ ├── j2objc-annotations-1.3.jar
│ │ │ ├── jackson-annotations-2.9.8.jar
│ │ │ ├── jackson-core-2.9.8.jar
│ │ │ ├── jackson-databind-2.9.8.jar
│ │ │ ├── jakarta.annotation-api-1.3.5.jar
│ │ │ ├── jakarta.inject-2.6.1.jar
│ │ │ ├── jakarta.ws.rs-api-2.1.6.jar
│ │ │ ├── java.libs.asd
│ │ │ ├── jersey-client-2.35.jar
│ │ │ ├── jersey-common-2.35.jar
│ │ │ ├── jersey-media-jaxb-2.35.jar
│ │ │ ├── jersey-media-json-jettison-2.35.jar
│ │ │ ├── jettison-1.3.7.jar
│ │ │ ├── jira-rest-java-client-api-5.2.4.jar
│ │ │ ├── jira-rest-java-client-core-5.2.4.jar
│ │ │ ├── joda-time-2.9.9.jar
│ │ │ ├── json-20210307.jar
│ │ │ ├── jsr305-3.0.2.jar
│ │ │ ├── listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar
│ │ │ ├── org.eclipse.egit.github.core-5.10.0.202012080955-r.jar
│ │ │ ├── osgi-resource-locator-1.0.3.jar
│ │ │ ├── sal-api-4.4.2.jar
│ │ │ ├── slf4j-api-1.7.30.jar
│ │ │ ├── slf4j-simple-1.7.25.jar
│ │ │ ├── spring-beans-5.3.6.jar
│ │ │ ├── spring-core-5.3.6.jar
│ │ │ ├── spring-jcl-5.3.6.jar
│ │ │ └── trello-java-wrapper-0.14.jar
│ │ └── main/
│ │ ├── com/
│ │ │ ├── atlassian/
│ │ │ │ └── oauth/
│ │ │ │ └── client/
│ │ │ │ └── example/
│ │ │ │ ├── ClientMain.java
│ │ │ │ ├── Command.java
│ │ │ │ ├── JiraOAuthClient.java
│ │ │ │ ├── JiraOAuthGetAccessToken.java
│ │ │ │ ├── JiraOAuthGetTemporaryToken.java
│ │ │ │ ├── JiraOAuthTokenFactory.java
│ │ │ │ ├── OAuthAuthenticationHandler.java
│ │ │ │ ├── OAuthClient.java
│ │ │ │ ├── PropertiesClient.java
│ │ │ │ └── TokenAuthenticationHandler.java
│ │ │ └── tdrhq/
│ │ │ ├── PrimitiveWrapper.java
│ │ │ ├── SimpleNativeLibrary.java
│ │ │ └── Whitebox.java
│ │ └── java.main.asd
│ ├── jvm/
│ │ ├── jvm.asd
│ │ └── jvm.lisp
│ ├── nibble/
│ │ ├── nibble.asd
│ │ ├── nibble.lisp
│ │ ├── package.lisp
│ │ └── test-nibble.lisp
│ ├── oidc/
│ │ ├── all.lisp
│ │ ├── oauth.lisp
│ │ ├── oidc.asd
│ │ ├── oidc.lisp
│ │ ├── test-oauth.lisp
│ │ └── test-oidc.lisp
│ ├── pixel-diff/
│ │ ├── CHANGELOG.md
│ │ ├── LICENSE
│ │ ├── PixelDiff.icns
│ │ ├── README.md
│ │ ├── about.lisp
│ │ ├── browser.lisp
│ │ ├── common-ps.lisp
│ │ ├── deliver.lisp
│ │ ├── differ.lisp
│ │ ├── external-images.lisp
│ │ ├── fli-templates.lisp
│ │ ├── git-diff.lisp
│ │ ├── image-pair.lisp
│ │ ├── lisp-stubs.lisp
│ │ ├── lispworks.entitlements
│ │ ├── main.lisp
│ │ ├── make-dmg.sh
│ │ ├── package.lisp
│ │ ├── pixel-diff.asd
│ │ ├── pixel-diff.math-js.asd
│ │ ├── pixel-diff.math.asd
│ │ ├── sign-mac-app.sh
│ │ ├── suite.lisp
│ │ ├── test-common-ps.lisp
│ │ ├── test-differ.lisp
│ │ └── usage.lisp
│ ├── pkg/
│ │ ├── cl-pkg.el
│ │ ├── pkg.asd
│ │ └── pkg.lisp
│ ├── quick-patch/
│ │ ├── .circleci/
│ │ │ └── config.yml
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── all.lisp
│ │ ├── impl.lisp
│ │ ├── quick-patch.asd
│ │ ├── run-circleci.lisp
│ │ ├── test-impl.lisp
│ │ └── util.lisp
│ ├── remark/
│ │ ├── all.lisp
│ │ ├── js/
│ │ │ └── remark.js
│ │ ├── markdown.lisp
│ │ ├── nodes.lisp
│ │ ├── remark.asd
│ │ ├── render.lisp
│ │ ├── search.lisp
│ │ ├── test-markdown.lisp
│ │ ├── test-nodes.lisp
│ │ └── test-search.lisp
│ ├── scheduled-jobs/
│ │ ├── bindings.lisp
│ │ ├── ccronexpr.c
│ │ ├── ccronexpr.h
│ │ ├── model.lisp
│ │ ├── scheduled-jobs.asd
│ │ ├── scheduled-jobs.lisp
│ │ ├── test-bindings.lisp
│ │ └── test-scheduled-jobs.lisp
│ ├── screenshotbot/
│ │ ├── .gitignore
│ │ ├── abstract-pr-promoter.lisp
│ │ ├── admin/
│ │ │ ├── core.lisp
│ │ │ ├── index.lisp
│ │ │ └── test-writes.lisp
│ │ ├── analytics.lisp
│ │ ├── android/
│ │ │ ├── activity.lisp
│ │ │ ├── api.lisp
│ │ │ ├── edit-text.lisp
│ │ │ ├── linear-layout.lisp
│ │ │ ├── screenshotbot.android.asd
│ │ │ ├── text-view.lisp
│ │ │ └── view.lisp
│ │ ├── api/
│ │ │ ├── CHANGELOG.md
│ │ │ ├── active-runs.lisp
│ │ │ ├── analytics-event.lisp
│ │ │ ├── api-key.lisp
│ │ │ ├── batch.lisp
│ │ │ ├── build-info.lisp
│ │ │ ├── cli-log.lisp
│ │ │ ├── commit-graph.lisp
│ │ │ ├── compare.lisp
│ │ │ ├── core.lisp
│ │ │ ├── doc.lisp
│ │ │ ├── docs/
│ │ │ │ └── recorder-run.lisp
│ │ │ ├── failed-run.lisp
│ │ │ ├── finalized-commit.lisp
│ │ │ ├── image.lisp
│ │ │ ├── model.lisp
│ │ │ ├── promote.lisp
│ │ │ ├── recorder-run.lisp
│ │ │ ├── replay-asset.lisp
│ │ │ ├── report.lisp
│ │ │ ├── test-active-runs.lisp
│ │ │ ├── test-analytics-event.lisp
│ │ │ ├── test-batch.lisp
│ │ │ ├── test-build-info.lisp
│ │ │ ├── test-commit-graph.lisp
│ │ │ ├── test-compare.lisp
│ │ │ ├── test-core.lisp
│ │ │ ├── test-failed-run.lisp
│ │ │ ├── test-finalized-commit.lisp
│ │ │ ├── test-image.lisp
│ │ │ ├── test-model.lisp
│ │ │ ├── test-promote.lisp
│ │ │ ├── test-recorder-runs.lisp
│ │ │ ├── test-report.lisp
│ │ │ ├── test-send-tasks.lisp
│ │ │ ├── test-unchanged-run.lisp
│ │ │ ├── test-version.lisp
│ │ │ ├── unchanged-run.lisp
│ │ │ └── version.lisp
│ │ ├── artifacts.lisp
│ │ ├── assets.lisp
│ │ ├── async.lisp
│ │ ├── audit-log.lisp
│ │ ├── aws/
│ │ │ ├── aws.lisp
│ │ │ └── screenshotbot.aws.asd
│ │ ├── azure/
│ │ │ ├── audit-log.lisp
│ │ │ ├── plugin.lisp
│ │ │ ├── promoter.lisp
│ │ │ ├── request.lisp
│ │ │ ├── run-warnings.lisp
│ │ │ ├── settings.lisp
│ │ │ ├── test-plugin.lisp
│ │ │ ├── test-promoter.lisp
│ │ │ ├── test-request.lisp
│ │ │ ├── test-run-warnings.lisp
│ │ │ └── test-settings.lisp
│ │ ├── batch-promoter.lisp
│ │ ├── billing-meter.lisp
│ │ ├── bitbucket/
│ │ │ ├── audit-log.lisp
│ │ │ ├── core.lisp
│ │ │ ├── error-response-1.json
│ │ │ ├── plugin.lisp
│ │ │ ├── promoter.lisp
│ │ │ ├── review-link.lisp
│ │ │ ├── settings.lisp
│ │ │ ├── test-audit-log.lisp
│ │ │ ├── test-plugin.lisp
│ │ │ ├── test-promoter.lisp
│ │ │ ├── test-review-link.lisp
│ │ │ └── test-settings.lisp
│ │ ├── cdn.lisp
│ │ ├── cleanup.lisp
│ │ ├── client-hub/
│ │ │ ├── deliver-client-hub.lisp
│ │ │ ├── flags.lisp
│ │ │ ├── main.lisp
│ │ │ ├── screenshotbot.client-hub.asd
│ │ │ └── selenium.lisp
│ │ ├── company/
│ │ │ ├── members.lisp
│ │ │ ├── new.lisp
│ │ │ ├── rename.lisp
│ │ │ ├── request.lisp
│ │ │ ├── test-rename.lisp
│ │ │ └── test-request.lisp
│ │ ├── config.lisp
│ │ ├── css/
│ │ │ ├── auth.scss
│ │ │ ├── autocomplete.scss
│ │ │ ├── avatar.scss
│ │ │ ├── billing.scss
│ │ │ ├── bootstrap-icons.css
│ │ │ ├── breakpoints.scss
│ │ │ ├── dashboard.scss
│ │ │ ├── default-toplevel.scss
│ │ │ ├── default.scss
│ │ │ ├── doks-default.scss
│ │ │ ├── headroom-custom.scss
│ │ │ ├── mask-builder.scss
│ │ │ ├── material-icons.scss
│ │ │ ├── montserrat.scss
│ │ │ ├── pro-common.scss
│ │ │ ├── roboto.scss
│ │ │ ├── screenshotbot.css-assets.asd
│ │ │ ├── settings.scss
│ │ │ ├── sidebar.scss
│ │ │ ├── split.scss
│ │ │ ├── variables.scss
│ │ │ └── vendor/
│ │ │ ├── _bootstrap-datepicker.min.scss
│ │ │ ├── _bootstrap-timepicker.min.scss
│ │ │ ├── _daterangepicker.scss
│ │ │ ├── _jquery.bootstrap-touchspin.min.scss
│ │ │ ├── _jquery.toast.min.scss
│ │ │ ├── _select2.min.scss
│ │ │ ├── baguetteBox.css
│ │ │ ├── buttons.bootstrap4.css
│ │ │ ├── dataTables.bootstrap4.css
│ │ │ ├── frappe-gantt.css
│ │ │ ├── jquery-jvectormap-1.2.2.css
│ │ │ ├── responsive.bootstrap4.css
│ │ │ ├── select.bootstrap4.css
│ │ │ └── summernote-bs4.css
│ │ ├── dag/
│ │ │ ├── dag.asd
│ │ │ ├── dag.lisp
│ │ │ ├── package.lisp
│ │ │ └── test-dag.lisp
│ │ ├── dashboard/
│ │ │ ├── api-key-impl.lisp
│ │ │ ├── audit-log.lisp
│ │ │ ├── batch.lisp
│ │ │ ├── bisect.lisp
│ │ │ ├── channels.lisp
│ │ │ ├── commit-graph.lisp
│ │ │ ├── compare-branches.lisp
│ │ │ ├── compare.lisp
│ │ │ ├── dashboard.lisp
│ │ │ ├── ensure-company.lisp
│ │ │ ├── explain.lisp
│ │ │ ├── flaky-screenshots.lisp
│ │ │ ├── git-graph
│ │ │ ├── history.lisp
│ │ │ ├── home.lisp
│ │ │ ├── image.lisp
│ │ │ ├── mask-builder.lisp
│ │ │ ├── notes.lisp
│ │ │ ├── notices.lisp
│ │ │ ├── recent-runs.lisp
│ │ │ ├── reports.lisp
│ │ │ ├── review-link.lisp
│ │ │ ├── run-page.lisp
│ │ │ ├── site-admin.lisp
│ │ │ ├── test-api-keys.lisp
│ │ │ ├── test-batch.lisp
│ │ │ ├── test-bisect.lisp
│ │ │ ├── test-channels.lisp
│ │ │ ├── test-commit-graph.lisp
│ │ │ ├── test-compare-branches.lisp
│ │ │ ├── test-compare.lisp
│ │ │ ├── test-dashboard.lisp
│ │ │ ├── test-ensure-company.lisp
│ │ │ ├── test-flaky-screenshots.lisp
│ │ │ ├── test-history.lisp
│ │ │ ├── test-image.lisp
│ │ │ ├── test-notices.lisp
│ │ │ ├── test-recent-runs.lisp
│ │ │ ├── test-reports.lisp
│ │ │ ├── test-review-link.lisp
│ │ │ └── test-run-page.lisp
│ │ ├── debugging.lisp
│ │ ├── default-oidc-provider.lisp
│ │ ├── diff-report.lisp
│ │ ├── dtd/
│ │ │ ├── api.dtd
│ │ │ └── secret.dtd
│ │ ├── email-tasks/
│ │ │ ├── settings.lisp
│ │ │ ├── task-integration.lisp
│ │ │ └── test-task-integration.lisp
│ │ ├── email-template.lisp
│ │ ├── figma/
│ │ │ ├── dropdown.lisp
│ │ │ ├── figma.lisp
│ │ │ ├── test-view.lisp
│ │ │ └── view.lisp
│ │ ├── fixture/
│ │ │ ├── rose.heic
│ │ │ └── secrets.xml
│ │ ├── git-repo.lisp
│ │ ├── github/
│ │ │ ├── access-checks.lisp
│ │ │ ├── all.lisp
│ │ │ ├── app-installation.lisp
│ │ │ ├── audit-log.lisp
│ │ │ ├── fixture/
│ │ │ │ ├── can-edit-for-private-repo.rec
│ │ │ │ ├── can-edit-simple-repo.rec
│ │ │ │ ├── cannot-edit-repo-owned-somewhere-else.rec
│ │ │ │ ├── get-repo-stars.rec
│ │ │ │ ├── private-key.README.md
│ │ │ │ ├── private-key.test-pem
│ │ │ │ └── whoami-integration-test.rec
│ │ │ ├── github-installation.lisp
│ │ │ ├── jwt-token.lisp
│ │ │ ├── marketplace.lisp
│ │ │ ├── plugin.lisp
│ │ │ ├── pr-checks.lisp
│ │ │ ├── pull-request-promoter.lisp
│ │ │ ├── read-repos.lisp
│ │ │ ├── repo-push-webhook.lisp
│ │ │ ├── review-link.lisp
│ │ │ ├── settings.lisp
│ │ │ ├── task-integration.lisp
│ │ │ ├── test-access-checks.lisp
│ │ │ ├── test-app-installation.lisp
│ │ │ ├── test-jwt-token.lisp
│ │ │ ├── test-plugin.lisp
│ │ │ ├── test-pull-request-promoter.lisp
│ │ │ ├── test-read-repos.lisp
│ │ │ ├── test-repo-push-webhook.lisp
│ │ │ ├── test-review-link.lisp
│ │ │ ├── test-settings.lisp
│ │ │ ├── test-webhook.lisp
│ │ │ └── webhook.lisp
│ │ ├── gitlab/
│ │ │ ├── all.lisp
│ │ │ ├── audit-logs.lisp
│ │ │ ├── merge-request-promoter.lisp
│ │ │ ├── plugin.lisp
│ │ │ ├── repo.lisp
│ │ │ ├── review-link.lisp
│ │ │ ├── settings.lisp
│ │ │ ├── test-merge-request-promoter.lisp
│ │ │ ├── test-review-link.lisp
│ │ │ ├── test-settings.lisp
│ │ │ └── webhook.lisp
│ │ ├── hub/
│ │ │ ├── api.lisp
│ │ │ ├── container.lisp
│ │ │ └── server.lisp
│ │ ├── ignore-and-log-errors.lisp
│ │ ├── image-comparison.lisp
│ │ ├── insights/
│ │ │ ├── dashboard.lisp
│ │ │ ├── date.lisp
│ │ │ ├── fuzz.lisp
│ │ │ ├── maps.lisp
│ │ │ ├── pull-requests.lisp
│ │ │ ├── runs.lisp
│ │ │ ├── screenshotbot.insights.asd
│ │ │ ├── test-date.lisp
│ │ │ └── variables.lisp
│ │ ├── installation.lisp
│ │ ├── invite.lisp
│ │ ├── js/
│ │ │ ├── acceptance.js
│ │ │ ├── common.js
│ │ │ ├── compare-branches.js
│ │ │ ├── default.js
│ │ │ ├── dummy.lisp
│ │ │ ├── git-graph.js
│ │ │ ├── home.js
│ │ │ ├── image-canvas.js
│ │ │ ├── jquery-js.asd
│ │ │ ├── jquery.timeago.js
│ │ │ ├── js-stubs.js
│ │ │ ├── mask-editor.js
│ │ │ ├── runs.js
│ │ │ ├── screenshotbot.js-assets.asd
│ │ │ ├── split.js
│ │ │ ├── vendor/
│ │ │ │ ├── baguetteBox.js
│ │ │ │ ├── bootstrap-modal.js
│ │ │ │ ├── bootstrap-modalmanager.js
│ │ │ │ ├── headroom.js
│ │ │ │ ├── jquery-3.5.1.js
│ │ │ │ ├── jquery-ui.js
│ │ │ │ ├── metisMenu.js
│ │ │ │ ├── moment.js
│ │ │ │ ├── select2.js
│ │ │ │ └── sizzle.js
│ │ │ └── websocket-logs.js
│ │ ├── katalon/
│ │ │ ├── .gitignore
│ │ │ ├── deliver.lisp
│ │ │ └── screenshotbot.katalon.asd
│ │ ├── left-side-bar.lisp
│ │ ├── login/
│ │ │ ├── aws-cognito.lisp
│ │ │ ├── github-oauth-ui.lisp
│ │ │ ├── github-oauth.lisp
│ │ │ ├── google-oauth.lisp
│ │ │ ├── microsoft-entra.lisp
│ │ │ ├── populate.lisp
│ │ │ ├── require-invite-sso-mixin.lisp
│ │ │ ├── template.lisp
│ │ │ ├── test-common.lisp
│ │ │ ├── test-forgot-password.lisp
│ │ │ ├── test-github-oauth.lisp
│ │ │ ├── test-google-oauth.lisp
│ │ │ ├── test-login.lisp
│ │ │ ├── test-oidc.lisp
│ │ │ ├── test-populate.lisp
│ │ │ ├── test-signup.lisp
│ │ │ └── test-verify-email.lisp
│ │ ├── magick/
│ │ │ ├── build.lisp
│ │ │ ├── ffi-6.lisp
│ │ │ ├── ffi-7.lisp
│ │ │ ├── health-checks.lisp
│ │ │ ├── magick-lw.lisp
│ │ │ ├── magick-native.c
│ │ │ ├── magick.lisp
│ │ │ ├── screenshotbot.magick.asd
│ │ │ ├── screenshotbot.magick.build.asd
│ │ │ └── test-magick-lw.lisp
│ │ ├── mask-rect-api.lisp
│ │ ├── mcp/
│ │ │ ├── mcp.lisp
│ │ │ └── screenshotbot.mcp.asd
│ │ ├── metrics.lisp
│ │ ├── microsoft-teams/
│ │ │ ├── audit-log.lisp
│ │ │ ├── channel-card.lisp
│ │ │ ├── model.lisp
│ │ │ ├── settings.lisp
│ │ │ ├── task-integration.lisp
│ │ │ └── teams-api.lisp
│ │ ├── migrations/
│ │ │ ├── report.lisp
│ │ │ └── screenshotbot.migrations.asd
│ │ ├── model/
│ │ │ ├── archived-run.lisp
│ │ │ ├── auto-cleanup.lisp
│ │ │ ├── batch.lisp
│ │ │ ├── build-info.lisp
│ │ │ ├── channel.lisp
│ │ │ ├── commit-graph.lisp
│ │ │ ├── company-graph.lisp
│ │ │ ├── company.lisp
│ │ │ ├── constant-string.lisp
│ │ │ ├── core.lisp
│ │ │ ├── counter.lisp
│ │ │ ├── deprecated.lisp
│ │ │ ├── downloadable-run.lisp
│ │ │ ├── enterprise.lisp
│ │ │ ├── failed-run.lisp
│ │ │ ├── figma.lisp
│ │ │ ├── finalized-commit.lisp
│ │ │ ├── image-comparer.lisp
│ │ │ ├── image-comparison.lisp
│ │ │ ├── image.lisp
│ │ │ ├── note.lisp
│ │ │ ├── pr-rollout-rule.lisp
│ │ │ ├── recorder-run.lisp
│ │ │ ├── report.lisp
│ │ │ ├── review-policy.lisp
│ │ │ ├── run-commit-lookup.lisp
│ │ │ ├── screenshot-key.lisp
│ │ │ ├── screenshot-map.lisp
│ │ │ ├── screenshot.lisp
│ │ │ ├── sharing.lisp
│ │ │ ├── test-acceptable.lisp
│ │ │ ├── test-archived-run.lisp
│ │ │ ├── test-auto-cleanup.lisp
│ │ │ ├── test-batch.lisp
│ │ │ ├── test-build-info.lisp
│ │ │ ├── test-channel.lisp
│ │ │ ├── test-commit-graph.lisp
│ │ │ ├── test-company-graph.lisp
│ │ │ ├── test-company.lisp
│ │ │ ├── test-constant-string.lisp
│ │ │ ├── test-core.lisp
│ │ │ ├── test-counter.lisp
│ │ │ ├── test-downloadable-run.lisp
│ │ │ ├── test-figma.lisp
│ │ │ ├── test-finalized-commit.lisp
│ │ │ ├── test-image-comparer.lisp
│ │ │ ├── test-image-comparison.lisp
│ │ │ ├── test-image.lisp
│ │ │ ├── test-object.lisp
│ │ │ ├── test-pr-rollout-rule.lisp
│ │ │ ├── test-recorder-run.lisp
│ │ │ ├── test-report.lisp
│ │ │ ├── test-review-policy.lisp
│ │ │ ├── test-run-commit-lookup.lisp
│ │ │ ├── test-screenshot-key.lisp
│ │ │ ├── test-screenshot-map.lisp
│ │ │ ├── test-screenshot.lisp
│ │ │ ├── test-transient-object.lisp
│ │ │ ├── test-user.lisp
│ │ │ ├── testing.lisp
│ │ │ ├── transient-object.lisp
│ │ │ ├── user.lisp
│ │ │ └── view.lisp
│ │ ├── notice-api.lisp
│ │ ├── phabricator/
│ │ │ ├── all.lisp
│ │ │ ├── builds.lisp
│ │ │ ├── diff-promoter.lisp
│ │ │ ├── plugin.lisp
│ │ │ ├── settings.lisp
│ │ │ ├── test-builds.lisp
│ │ │ └── test-diff-promoter.lisp
│ │ ├── plan.lisp
│ │ ├── plugin/
│ │ │ ├── .gitignore
│ │ │ ├── build.gradle
│ │ │ ├── gradle/
│ │ │ │ ├── gradle-mvn-push.gradle
│ │ │ │ └── wrapper/
│ │ │ │ ├── gradle-wrapper.jar
│ │ │ │ └── gradle-wrapper.properties
│ │ │ ├── gradlew
│ │ │ ├── libs/
│ │ │ │ └── lispcalls.jar
│ │ │ └── src/
│ │ │ └── main/
│ │ │ └── java/
│ │ │ └── io/
│ │ │ └── screenshotbot/
│ │ │ └── plugin/
│ │ │ ├── RecordFacebookTask.java
│ │ │ ├── SbNative.java
│ │ │ └── ScreenshotbotPlugin.java
│ │ ├── plugin.lisp
│ │ ├── promote-api.lisp
│ │ ├── raft-redirect.lisp
│ │ ├── replay/
│ │ │ ├── AWS-SELENIUM-IAM-POLICY.md
│ │ │ ├── aws-selenium-provider.lisp
│ │ │ ├── browser-config.lisp
│ │ │ ├── core.lisp
│ │ │ ├── css-tokenizer.lisp
│ │ │ ├── fixtures/
│ │ │ │ ├── sitemap-0.xml
│ │ │ │ └── sitemap-index.xml
│ │ │ ├── frontend.lisp
│ │ │ ├── integration.lisp
│ │ │ ├── proxy-main.lisp
│ │ │ ├── proxy.lisp
│ │ │ ├── remote.lisp
│ │ │ ├── replay-acceptor.lisp
│ │ │ ├── replay-regex.txt
│ │ │ ├── run-builder.lisp
│ │ │ ├── safe-interrupt.lisp
│ │ │ ├── services.lisp
│ │ │ ├── sitemap.lisp
│ │ │ ├── squid.lisp
│ │ │ ├── test-core.lisp
│ │ │ ├── test-css-tokenizer.lisp
│ │ │ ├── test-integration.lisp
│ │ │ ├── test-remote.lisp
│ │ │ ├── test-replay-acceptor.lisp
│ │ │ ├── test-run-builder.lisp
│ │ │ └── test-sitemap.lisp
│ │ ├── report-api.lisp
│ │ ├── run-prod
│ │ ├── s3/
│ │ │ ├── backup.lisp
│ │ │ └── core.lisp
│ │ ├── s3-policy.json
│ │ ├── screenshot-api.lisp
│ │ ├── screenshotbot.asd
│ │ ├── sdk/
│ │ │ ├── .gitattributes
│ │ │ ├── .gitignore
│ │ │ ├── CHANGELOG.md
│ │ │ ├── UTF-8-demo.html
│ │ │ ├── active-run.lisp
│ │ │ ├── adb-puller.lisp
│ │ │ ├── android.lisp
│ │ │ ├── api-context.lisp
│ │ │ ├── backoff.lisp
│ │ │ ├── batch.lisp
│ │ │ ├── bundle.lisp
│ │ │ ├── cli-common.lisp
│ │ │ ├── clingon-api-context.lisp
│ │ │ ├── commit-graph.lisp
│ │ │ ├── common-flags.lisp
│ │ │ ├── deliver-java.lisp
│ │ │ ├── deliver-sdk.lisp
│ │ │ ├── dev/
│ │ │ │ ├── commands.lisp
│ │ │ │ ├── record-verify.lisp
│ │ │ │ ├── test-record-verify.lisp
│ │ │ │ ├── test-verify-against-ci.lisp
│ │ │ │ └── verify-against-ci.lisp
│ │ │ ├── env.lisp
│ │ │ ├── example/
│ │ │ │ ├── com.facebook.testing.screenshot.sample.ExampleScreenshotTest_testDefault_dump.json
│ │ │ │ ├── com.facebook.testing.screenshot.sample.ExampleScreenshotTest_testDefault_issues.json
│ │ │ │ ├── com.facebook.testing.screenshot.sample.ImageRowScreenshotTest_testDefault2_dump.json
│ │ │ │ ├── com.facebook.testing.screenshot.sample.ImageRowScreenshotTest_testDefault2_issues.json
│ │ │ │ ├── com.facebook.testing.screenshot.sample.MainActivityTest_errorTextShouldBeRed_dump.json
│ │ │ │ ├── com.facebook.testing.screenshot.sample.MainActivityTest_errorTextShouldBeRed_issues.json
│ │ │ │ ├── com.facebook.testing.screenshot.sample.MainActivityTest_mainActivityTestSettingsOpen_dump.json
│ │ │ │ ├── com.facebook.testing.screenshot.sample.MainActivityTest_mainActivityTestSettingsOpen_issues.json
│ │ │ │ ├── com.facebook.testing.screenshot.sample.MainActivityTest_okTextShouldBeGreen_dump.json
│ │ │ │ ├── com.facebook.testing.screenshot.sample.MainActivityTest_okTextShouldBeGreen_issues.json
│ │ │ │ ├── com.facebook.testing.screenshot.sample.MainActivityTest_testScreenshotEntireActivityWithoutAccessibilityMetadata_dump.json
│ │ │ │ ├── com.facebook.testing.screenshot.sample.MainActivityTest_testScreenshotEntireActivity_dump.json
│ │ │ │ ├── com.facebook.testing.screenshot.sample.MainActivityTest_testScreenshotEntireActivity_issues.json
│ │ │ │ ├── com.facebook.testing.screenshot.sample.MainActivityTest_warningTextShouldBeYellow_dump.json
│ │ │ │ ├── com.facebook.testing.screenshot.sample.MainActivityTest_warningTextShouldBeYellow_issues.json
│ │ │ │ ├── com.facebook.testing.screenshot.sample.StandardAndroidViewTest_testChinese_dump.json
│ │ │ │ ├── com.facebook.testing.screenshot.sample.StandardAndroidViewTest_testChinese_issues.json
│ │ │ │ ├── com.facebook.testing.screenshot.sample.StandardAndroidViewTest_testLongText_dump.json
│ │ │ │ ├── com.facebook.testing.screenshot.sample.StandardAndroidViewTest_testLongText_issues.json
│ │ │ │ ├── com.facebook.testing.screenshot.sample.StandardAndroidViewTest_testRendering_dump.json
│ │ │ │ ├── com.facebook.testing.screenshot.sample.StandardAndroidViewTest_testRendering_issues.json
│ │ │ │ ├── default.css
│ │ │ │ ├── default.js
│ │ │ │ ├── fab_dump.json
│ │ │ │ ├── fab_issues.json
│ │ │ │ ├── index.html
│ │ │ │ └── metadata.xml
│ │ │ ├── example-firebase-artifacts/
│ │ │ │ └── artifacts/
│ │ │ │ └── sdcard/
│ │ │ │ └── screenshots/
│ │ │ │ └── com.facebook.testing.screenshot.example.test/
│ │ │ │ └── screenshots-default/
│ │ │ │ ├── com.facebook.testing.screenshot.sample.ExampleScreenshotTest_testDefault_dump.json
│ │ │ │ ├── com.facebook.testing.screenshot.sample.ExampleScreenshotTest_testDefault_issues.json
│ │ │ │ ├── com.facebook.testing.screenshot.sample.ImageRowScreenshotTest_testDefault_dump.json
│ │ │ │ ├── com.facebook.testing.screenshot.sample.ImageRowScreenshotTest_testDefault_issues.json
│ │ │ │ ├── com.facebook.testing.screenshot.sample.MainActivityTest_errorTextShouldBeRed_dump.json
│ │ │ │ ├── com.facebook.testing.screenshot.sample.MainActivityTest_errorTextShouldBeRed_issues.json
│ │ │ │ ├── com.facebook.testing.screenshot.sample.MainActivityTest_mainActivityTestSettingsOpen_dump.json
│ │ │ │ ├── com.facebook.testing.screenshot.sample.MainActivityTest_mainActivityTestSettingsOpen_issues.json
│ │ │ │ ├── com.facebook.testing.screenshot.sample.MainActivityTest_okTextShouldBeGreen_dump.json
│ │ │ │ ├── com.facebook.testing.screenshot.sample.MainActivityTest_okTextShouldBeGreen_issues.json
│ │ │ │ ├── com.facebook.testing.screenshot.sample.MainActivityTest_testScreenshotEntireActivityWithoutAccessibilityMetadata_dump.json
│ │ │ │ ├── com.facebook.testing.screenshot.sample.MainActivityTest_testScreenshotEntireActivity_dump.json
│ │ │ │ ├── com.facebook.testing.screenshot.sample.MainActivityTest_testScreenshotEntireActivity_issues.json
│ │ │ │ ├── com.facebook.testing.screenshot.sample.MainActivityTest_warningTextShouldBeYellow_dump.json
│ │ │ │ ├── com.facebook.testing.screenshot.sample.MainActivityTest_warningTextShouldBeYellow_issues.json
│ │ │ │ ├── com.facebook.testing.screenshot.sample.StandardAndroidViewTest_testChinese_dump.json
│ │ │ │ ├── com.facebook.testing.screenshot.sample.StandardAndroidViewTest_testChinese_issues.json
│ │ │ │ ├── com.facebook.testing.screenshot.sample.StandardAndroidViewTest_testLongText_dump.json
│ │ │ │ ├── com.facebook.testing.screenshot.sample.StandardAndroidViewTest_testLongText_issues.json
│ │ │ │ ├── com.facebook.testing.screenshot.sample.StandardAndroidViewTest_testRendering_dump.json
│ │ │ │ ├── com.facebook.testing.screenshot.sample.StandardAndroidViewTest_testRendering_issues.json
│ │ │ │ ├── fab_dump.json
│ │ │ │ ├── fab_issues.json
│ │ │ │ ├── metadata.json
│ │ │ │ └── tests_run_id
│ │ │ ├── example-shot-artifacts/
│ │ │ │ └── com.karumi.shotconsumercompose.staging.debug.test/
│ │ │ │ ├── screenshots-compose-default/
│ │ │ │ │ └── metadata_compose.json
│ │ │ │ └── screenshots-default/
│ │ │ │ ├── com.karumi.shotconsumercompose.MainActivityTest_activityTest_dump.json
│ │ │ │ ├── metadata.json
│ │ │ │ └── tests_run_id
│ │ │ ├── failed-run.lisp
│ │ │ ├── fetch-run.lisp
│ │ │ ├── finalized-commit.lisp
│ │ │ ├── firebase.lisp
│ │ │ ├── fixture/
│ │ │ │ ├── braft-expected.log
│ │ │ │ ├── braft.log
│ │ │ │ ├── result12.xcresult/
│ │ │ │ │ ├── Data/
│ │ │ │ │ │ ├── data.0~06eElEqhYuN_viqTCjodWIWcItfFrDQx8-89G9taauMy7nuUs6llm5-WzGoNbAqCFhU21JLa7lg2TzOKEaOc2w==
│ │ │ │ │ │ ├── data.0~0TgqQPqltxD2fcwCfwkYTyJUFEUcN7mutaxQrnbflxBtGUL6q0q-w9j-TbqZ9pvJLh3QCA-k-_rFdVJyt_FXIA==
│ │ │ │ │ │ ├── data.0~0fAMG3G0pF2soWVuoI-EQdB5nAUKfJhtrDhJ8fquCN_HExcAQGd6PxBrMs_TK3PbB4AmXi0mqZASeTi7-xRM1g==
│ │ │ │ │ │ ├── data.0~1O88WBKsbq-19qla4nu_iw50pQo9ObRRa5K0apfi7K1PRIdknH-uzIVno1KUx5kVRe9Fx_v2DRCdO7SKTFzQPA==
│ │ │ │ │ │ ├── data.0~3yv1MadYKtFaPgQLOcNbeosIIax4mOLvqKcn9dJauwvWo7CG6v-VrQlP2J731PdhAdZHwVuETn4EsiDnSOyVaw==
│ │ │ │ │ │ ├── data.0~4VeaO-yhS3kVMv0yjG1hdHe1h38D79uGIIRAb53AWN1YfesDbDDVe_hRW0ilyYdEH7PoZIP_TlciUG-9nCh6Tw==
│ │ │ │ │ │ ├── data.0~4VqMqsI5lOfxRppnud6-VDWcNsU8J7VgFCJfW2dXPwOcAkvU-I8Um5yp9n0Zv6nr3VmcxYggaVMDFfR0U_vjKw==
│ │ │ │ │ │ ├── data.0~8hbCIwY6qNvcWAw3ya_TeDjmsyMdpstEQcYiI_VnxJdIfOP_Xdaa143BZ6_-8dna-9WYxcLrsBG497BiEIb1-Q==
│ │ │ │ │ │ ├── data.0~8rfNRM_I-f8BiNiW8qWkZuiHPzJn5mU4s4cFLKZuyjbgVd1l3NPznUqO_fSXuExsNWag0kYJ7bFzSZkyPzzOhQ==
│ │ │ │ │ │ ├── data.0~9nfJsl_CyeiGx_OkZgfxuDXCkhYtC8uXJEPTPCavOq-YArWDsOu8KIXm2KSuP5VovEITW_ActhJPuX0x6yz2_w==
│ │ │ │ │ │ ├── data.0~Bbsc8KoFFWe_3Eml4aqyL_mltStg9MSuFyTLvgKxVgGhR23hzWV9XYwff-gES4vip7xePvH8LIL1ZSzvzGVFjg==
│ │ │ │ │ │ ├── data.0~C64aGvRF0659k83KqbRKOWqGUlK9rButy3MKh6L6FG_3cSCQihsIGEeKTuEeQ9cGDxzBqVBD9GXwVugrD2-nIQ==
│ │ │ │ │ │ ├── data.0~CIxsCVpFlJLwi1Q_HYfE2MyEfgLWrED7CxgJXfPObMzyDUVuFoms_f-8O3eZ4H0adC8D2VLmkNKGE1jq7zpFDw==
│ │ │ │ │ │ ├── data.0~CtkVCuqDejEyBsfLuf1gbcWmIOnvDT5vyRNstIGS9k1egkexhAl4L9Gh1hMQNuR-1Jv9C-G0_b7Xdyr5hpap4w==
│ │ │ │ │ │ ├── data.0~ESkjZR3lfbgy5n036G_Poc1eL5brLd8ZgOmCRzt9bNCV8M0PssVGfWi3hXNtHe2VsGNZCfpMBtbz2ufoCLJ8wA==
│ │ │ │ │ │ ├── data.0~GdHqNv0Rcxo4E1uKDjmzHRfgzfYX1IIrf6enWktYsfSLH2ZTlfP0S1ucj09zzjJKNlXGrKr39OfmZjfMClahTQ==
│ │ │ │ │ │ ├── data.0~GhB22DxEKbNQtjzJQ42iodDJUdX-eJWbJ0Q8_OtUQjfQ6ZOeUVj5XIlYix5cImL3APbvyyNSXloyFus7XhEtCA==
│ │ │ │ │ │ ├── data.0~IuTy9KuaY_oGEbddgicn4rGTZ6DlUdk-3IFaLtAtIy9Grb9oX9kX6kr6v7zNJ--_dqGm8yjQ6iIupS8ek9hT9g==
│ │ │ │ │ │ ├── data.0~KyXicDIcdSxF_KIP102tjEK_pZ6XlVSJA4Z8vIhMSaV8GS3xxEZIyZ5FVnf4sK4QgG9hE_aqoRzZFUF8CftG3g==
│ │ │ │ │ │ ├── data.0~MapkA4cgU0tr0Z7hLbOaWDTtktOBJcuxcDHdAA9kpSavLCSztPZMPsQ5cxHUN-UoZV2x2Jez_-FtxpBnjGVJEg==
│ │ │ │ │ │ ├── data.0~N2rVyxSAcn-Jy_KSWQLN2uvz4gRzBEedrqckuRVRMEnKnVoMSwJikfRp8si5LOPil5bxE0dBeX2wEKQXubsUMw==
│ │ │ │ │ │ ├── data.0~Nu2-eTw67CgTS4yMe4Bmr3a5P-9MulBMVsN9BjlRcNJbzTVEzn3YIG7DXjJITUvspEQk3sftLTDaMA3gr-nxdQ==
│ │ │ │ │ │ ├── data.0~Oaa9GEZlbuUu3kCakBXBvHevypj9sFPqdvBNCLddNdy0HmvbjEBC4u-41avFMHOArH3zLVm2NfIICe5fjhZSqA==
│ │ │ │ │ │ ├── data.0~TIsaG4mWYvUw2aAa9ddNoD2NC4Wzb6lxf848peyO7QmvT4x-9UNSP53ObXmZZ5yjess9CMQq6Dc-zWj2Zp9BAA==
│ │ │ │ │ │ ├── data.0~TqyOe-QFeBwFl1P8y09sGCJSxUz47gHNOtZVAkmABrO6H_lRaPH_TT6wQtXT1s6hKusnX8RajPhjsCnG7QrO_w==
│ │ │ │ │ │ ├── data.0~V6MabtdV7iVaTOIoTUKXY_uv5Ic2RO6VjmSKralTeFVuDOKapV8w4Rru0oqxzeLUN7zUsx9VV9LkptjIRck1Yw==
│ │ │ │ │ │ ├── data.0~W4cv_QjE4X88RtzNXXgJ4qflLVBIdzoddkFvGCiCzwRxRF1vFB1zHRZEC9xj4bnwNrPUsohr5Ji2YRY1v4K9SA==
│ │ │ │ │ │ ├── data.0~WAeDWkvX4htYZHAld6PE4WIYk4YhShlEWapAiaeqGnEFPE3D2rx8Ib2ucQeGD9sX2KXRCdXiwpjfmDAAwrgmzQ==
│ │ │ │ │ │ ├── data.0~WCfmr-kV_Ra_l8C6VvAb9o2Bk2uoUqXvY_hslpxPwmmY95xAHm4LEFVMttX23p4xGzvufYSx2AqzVwTOKHgjRQ==
│ │ │ │ │ │ ├── data.0~XUAlhhemQaTQVtRfqkL-LyQDeqCYGHfK2_OF9ZN_tPVbaS8z4vUYIR4bxdFHOxUx5jRZpBvWsqwdWv6aDyRrCQ==
│ │ │ │ │ │ ├── data.0~ZTqxGrIflZc47jajv-GpQvBdJx_hWl9komq8Uh5E74Xcjff9Vy52CZOpm7LO2mv9qdoIJ4MwWHmajprH0UJWQA==
│ │ │ │ │ │ ├── data.0~_QoR-0dQn0sNWymkYye049iakX_XulItmKK4GQSufbsrkvCl58eBLh7k83KTdMVZNkMdkyXssMlLe_isSg9E4w==
│ │ │ │ │ │ ├── data.0~arVHxe88d0XfM4a_iw9FQ-c1fy-2HjCLGMrWJrzB7UBc6y5GAWtzZiGCU5b44PWXLt2cJt2wCDGHvWZhrThzIg==
│ │ │ │ │ │ ├── data.0~b6rBGHFM55xTxTH2NRf4cKTeFgDEIbsa-K6R_CUYEEBrl3LdtgwVVeSWSl7dM0MZ1P_fNcOcR1pUPwxGyxQLFg==
│ │ │ │ │ │ ├── data.0~bTNtmsOCSaQWsONvq8shw8JaB5sTfV4jLdsMohdvbk1wY3TFNc06HSe10fzznGFXZY7ljxjb4l8QrKyA8FvjYg==
│ │ │ │ │ │ ├── data.0~cGShflEJBARoixS1GsvQECcSXDe_RToOUASg4dt2evSJUrPo4DGe9wi_KSE_LITnN49kLhLYwqADoFxwdO4IkQ==
│ │ │ │ │ │ ├── data.0~dhcZQk7pHZj_rXPkyk0l0_EvG7VPvTeVFYSyFac3ZrbSa1oqvtltI43MWKPWskI-7JLSENxKbDCQpX4uG2n21Q==
│ │ │ │ │ │ ├── data.0~fWJAoUYy2rHEyGyiUV0ibka0nbDMIQGrIQbDHbg5uVU-orJk49KesO9utOUlumL_KVn1aWHJEMjkio2tPRX_Lg==
│ │ │ │ │ │ ├── data.0~fwKHNwmXFbI-CiOtAXpG75NEv8CdtUCV_ryk4aEcd1MssZEKme91B5qPBcN25wq64Ow7ze-iffoQpCf4QDTLoQ==
│ │ │ │ │ │ ├── data.0~g_biHu-Yf80XFLLu6pNy4sYr2cI3y56nHrYn-Jtub2ZxKDEPc_Y-v1DRWE7ZhqKxjbu1UgH0bsV_sOThuQlYGg==
│ │ │ │ │ │ ├── data.0~h4vu5HpkJwt8pXHb8o1j3fGL9h1dr7Y11VyxECBy2C4nP4kBO00VTByjEaOrOhCifX6bNQTIq2Dy5xGlqjdHhw==
│ │ │ │ │ │ ├── data.0~kFpRFrgGEeBh9uvA-3MuJgNTSwW13Ow2V_3URBYMSH-0k4ZJ_Ox5K-g1rDuSOJ-gyMo87MiandTZsPmy75OOjA==
│ │ │ │ │ │ ├── data.0~m7pxmLgHK4lUyl5MCRovwK5yQEJYHRKeM8lXOFR3ue1YinjywaoSK-44-WQRgl3aehIEkGCurIfn0hyHT63umw==
│ │ │ │ │ │ ├── data.0~nqtjyxgscHiZYdt4Y8ICuh3SgKydPuah7I-GxreD8fGSkhEUXa0St_rRnKDM_k7wTDpMNkr5aAZxz0YpyZaoVA==
│ │ │ │ │ │ ├── data.0~oNtXghNehRZ1Ttuy9I1ikWx2An-_WBLlr3Pl4wyb17Gp8o-Q28jEMYpDQgFCHlBeFaTy4wYd91bdDDD4voUmHg==
│ │ │ │ │ │ ├── data.0~oRMi0sbQLktfDDDGUS-SqBKpdDiD6HCztVES_ShfGr0KVcYENoIq7y9oUSDWL5B_P2gkdtWG8JEsJLxPbdWOZA==
│ │ │ │ │ │ ├── data.0~pf2ENc4jrljwDk1PKQibk8aX7ljZHyznLIpseS0jyHAeNqjrBTUHrz-vR-2mrclgBDnu04N8Q7a1qSBrGiDpWQ==
│ │ │ │ │ │ ├── data.0~psoZXY0KQG2o1pHrYKVvMz7DK3EkxTM3VI7rWjLgKXzoFc_9-Kkzg1ieDlEop5425mPFShni4xZaGmwqTMacAQ==
│ │ │ │ │ │ ├── data.0~qcUUa26y26YwdmhFZUEF5pH0pZuNwPkJ_KtAo-kEn6joYnjSzzg4le6ly8nG1TVKl26maTsIsmOig53j1fZyxg==
│ │ │ │ │ │ ├── data.0~y5oK5BFKNIKCE8AkvHzMr-Aj11jJmHoG-Lz9wYUt93QIdefWc7TaJ6DWGiWngjJkRJ1XEJI7UQQpeLZk4gQ_Zw==
│ │ │ │ │ │ ├── data.0~yTk_0HmUrv4Tsf9SvkX3yAZwG9OgPBrR89Hy48TH2EoodJHqV_M7R3Lix9-tpSIqOVkv-GS8LXNsIkb5X7L1EA==
│ │ │ │ │ │ ├── refs.0~06eElEqhYuN_viqTCjodWIWcItfFrDQx8-89G9taauMy7nuUs6llm5-WzGoNbAqCFhU21JLa7lg2TzOKEaOc2w==
│ │ │ │ │ │ ├── refs.0~0TgqQPqltxD2fcwCfwkYTyJUFEUcN7mutaxQrnbflxBtGUL6q0q-w9j-TbqZ9pvJLh3QCA-k-_rFdVJyt_FXIA==
│ │ │ │ │ │ ├── refs.0~0fAMG3G0pF2soWVuoI-EQdB5nAUKfJhtrDhJ8fquCN_HExcAQGd6PxBrMs_TK3PbB4AmXi0mqZASeTi7-xRM1g==
│ │ │ │ │ │ ├── refs.0~1O88WBKsbq-19qla4nu_iw50pQo9ObRRa5K0apfi7K1PRIdknH-uzIVno1KUx5kVRe9Fx_v2DRCdO7SKTFzQPA==
│ │ │ │ │ │ ├── refs.0~3yv1MadYKtFaPgQLOcNbeosIIax4mOLvqKcn9dJauwvWo7CG6v-VrQlP2J731PdhAdZHwVuETn4EsiDnSOyVaw==
│ │ │ │ │ │ ├── refs.0~4VeaO-yhS3kVMv0yjG1hdHe1h38D79uGIIRAb53AWN1YfesDbDDVe_hRW0ilyYdEH7PoZIP_TlciUG-9nCh6Tw==
│ │ │ │ │ │ ├── refs.0~4VqMqsI5lOfxRppnud6-VDWcNsU8J7VgFCJfW2dXPwOcAkvU-I8Um5yp9n0Zv6nr3VmcxYggaVMDFfR0U_vjKw==
│ │ │ │ │ │ ├── refs.0~8hbCIwY6qNvcWAw3ya_TeDjmsyMdpstEQcYiI_VnxJdIfOP_Xdaa143BZ6_-8dna-9WYxcLrsBG497BiEIb1-Q==
│ │ │ │ │ │ ├── refs.0~8rfNRM_I-f8BiNiW8qWkZuiHPzJn5mU4s4cFLKZuyjbgVd1l3NPznUqO_fSXuExsNWag0kYJ7bFzSZkyPzzOhQ==
│ │ │ │ │ │ ├── refs.0~9nfJsl_CyeiGx_OkZgfxuDXCkhYtC8uXJEPTPCavOq-YArWDsOu8KIXm2KSuP5VovEITW_ActhJPuX0x6yz2_w==
│ │ │ │ │ │ ├── refs.0~Bbsc8KoFFWe_3Eml4aqyL_mltStg9MSuFyTLvgKxVgGhR23hzWV9XYwff-gES4vip7xePvH8LIL1ZSzvzGVFjg==
│ │ │ │ │ │ ├── refs.0~C64aGvRF0659k83KqbRKOWqGUlK9rButy3MKh6L6FG_3cSCQihsIGEeKTuEeQ9cGDxzBqVBD9GXwVugrD2-nIQ==
│ │ │ │ │ │ ├── refs.0~CIxsCVpFlJLwi1Q_HYfE2MyEfgLWrED7CxgJXfPObMzyDUVuFoms_f-8O3eZ4H0adC8D2VLmkNKGE1jq7zpFDw==
│ │ │ │ │ │ ├── refs.0~CtkVCuqDejEyBsfLuf1gbcWmIOnvDT5vyRNstIGS9k1egkexhAl4L9Gh1hMQNuR-1Jv9C-G0_b7Xdyr5hpap4w==
│ │ │ │ │ │ ├── refs.0~ESkjZR3lfbgy5n036G_Poc1eL5brLd8ZgOmCRzt9bNCV8M0PssVGfWi3hXNtHe2VsGNZCfpMBtbz2ufoCLJ8wA==
│ │ │ │ │ │ ├── refs.0~GdHqNv0Rcxo4E1uKDjmzHRfgzfYX1IIrf6enWktYsfSLH2ZTlfP0S1ucj09zzjJKNlXGrKr39OfmZjfMClahTQ==
│ │ │ │ │ │ ├── refs.0~GhB22DxEKbNQtjzJQ42iodDJUdX-eJWbJ0Q8_OtUQjfQ6ZOeUVj5XIlYix5cImL3APbvyyNSXloyFus7XhEtCA==
│ │ │ │ │ │ ├── refs.0~IuTy9KuaY_oGEbddgicn4rGTZ6DlUdk-3IFaLtAtIy9Grb9oX9kX6kr6v7zNJ--_dqGm8yjQ6iIupS8ek9hT9g==
│ │ │ │ │ │ ├── refs.0~KyXicDIcdSxF_KIP102tjEK_pZ6XlVSJA4Z8vIhMSaV8GS3xxEZIyZ5FVnf4sK4QgG9hE_aqoRzZFUF8CftG3g==
│ │ │ │ │ │ ├── refs.0~MapkA4cgU0tr0Z7hLbOaWDTtktOBJcuxcDHdAA9kpSavLCSztPZMPsQ5cxHUN-UoZV2x2Jez_-FtxpBnjGVJEg==
│ │ │ │ │ │ ├── refs.0~N2rVyxSAcn-Jy_KSWQLN2uvz4gRzBEedrqckuRVRMEnKnVoMSwJikfRp8si5LOPil5bxE0dBeX2wEKQXubsUMw==
│ │ │ │ │ │ ├── refs.0~Nu2-eTw67CgTS4yMe4Bmr3a5P-9MulBMVsN9BjlRcNJbzTVEzn3YIG7DXjJITUvspEQk3sftLTDaMA3gr-nxdQ==
│ │ │ │ │ │ ├── refs.0~Oaa9GEZlbuUu3kCakBXBvHevypj9sFPqdvBNCLddNdy0HmvbjEBC4u-41avFMHOArH3zLVm2NfIICe5fjhZSqA==
│ │ │ │ │ │ ├── refs.0~TIsaG4mWYvUw2aAa9ddNoD2NC4Wzb6lxf848peyO7QmvT4x-9UNSP53ObXmZZ5yjess9CMQq6Dc-zWj2Zp9BAA==
│ │ │ │ │ │ ├── refs.0~TqyOe-QFeBwFl1P8y09sGCJSxUz47gHNOtZVAkmABrO6H_lRaPH_TT6wQtXT1s6hKusnX8RajPhjsCnG7QrO_w==
│ │ │ │ │ │ ├── refs.0~V6MabtdV7iVaTOIoTUKXY_uv5Ic2RO6VjmSKralTeFVuDOKapV8w4Rru0oqxzeLUN7zUsx9VV9LkptjIRck1Yw==
│ │ │ │ │ │ ├── refs.0~W4cv_QjE4X88RtzNXXgJ4qflLVBIdzoddkFvGCiCzwRxRF1vFB1zHRZEC9xj4bnwNrPUsohr5Ji2YRY1v4K9SA==
│ │ │ │ │ │ ├── refs.0~WAeDWkvX4htYZHAld6PE4WIYk4YhShlEWapAiaeqGnEFPE3D2rx8Ib2ucQeGD9sX2KXRCdXiwpjfmDAAwrgmzQ==
│ │ │ │ │ │ ├── refs.0~WCfmr-kV_Ra_l8C6VvAb9o2Bk2uoUqXvY_hslpxPwmmY95xAHm4LEFVMttX23p4xGzvufYSx2AqzVwTOKHgjRQ==
│ │ │ │ │ │ ├── refs.0~XUAlhhemQaTQVtRfqkL-LyQDeqCYGHfK2_OF9ZN_tPVbaS8z4vUYIR4bxdFHOxUx5jRZpBvWsqwdWv6aDyRrCQ==
│ │ │ │ │ │ ├── refs.0~ZTqxGrIflZc47jajv-GpQvBdJx_hWl9komq8Uh5E74Xcjff9Vy52CZOpm7LO2mv9qdoIJ4MwWHmajprH0UJWQA==
│ │ │ │ │ │ ├── refs.0~_QoR-0dQn0sNWymkYye049iakX_XulItmKK4GQSufbsrkvCl58eBLh7k83KTdMVZNkMdkyXssMlLe_isSg9E4w==
│ │ │ │ │ │ ├── refs.0~arVHxe88d0XfM4a_iw9FQ-c1fy-2HjCLGMrWJrzB7UBc6y5GAWtzZiGCU5b44PWXLt2cJt2wCDGHvWZhrThzIg==
│ │ │ │ │ │ ├── refs.0~b6rBGHFM55xTxTH2NRf4cKTeFgDEIbsa-K6R_CUYEEBrl3LdtgwVVeSWSl7dM0MZ1P_fNcOcR1pUPwxGyxQLFg==
│ │ │ │ │ │ ├── refs.0~bTNtmsOCSaQWsONvq8shw8JaB5sTfV4jLdsMohdvbk1wY3TFNc06HSe10fzznGFXZY7ljxjb4l8QrKyA8FvjYg==
│ │ │ │ │ │ ├── refs.0~cGShflEJBARoixS1GsvQECcSXDe_RToOUASg4dt2evSJUrPo4DGe9wi_KSE_LITnN49kLhLYwqADoFxwdO4IkQ==
│ │ │ │ │ │ ├── refs.0~dhcZQk7pHZj_rXPkyk0l0_EvG7VPvTeVFYSyFac3ZrbSa1oqvtltI43MWKPWskI-7JLSENxKbDCQpX4uG2n21Q==
│ │ │ │ │ │ ├── refs.0~fWJAoUYy2rHEyGyiUV0ibka0nbDMIQGrIQbDHbg5uVU-orJk49KesO9utOUlumL_KVn1aWHJEMjkio2tPRX_Lg==
│ │ │ │ │ │ ├── refs.0~fwKHNwmXFbI-CiOtAXpG75NEv8CdtUCV_ryk4aEcd1MssZEKme91B5qPBcN25wq64Ow7ze-iffoQpCf4QDTLoQ==
│ │ │ │ │ │ ├── refs.0~g_biHu-Yf80XFLLu6pNy4sYr2cI3y56nHrYn-Jtub2ZxKDEPc_Y-v1DRWE7ZhqKxjbu1UgH0bsV_sOThuQlYGg==
│ │ │ │ │ │ ├── refs.0~h4vu5HpkJwt8pXHb8o1j3fGL9h1dr7Y11VyxECBy2C4nP4kBO00VTByjEaOrOhCifX6bNQTIq2Dy5xGlqjdHhw==
│ │ │ │ │ │ ├── refs.0~kFpRFrgGEeBh9uvA-3MuJgNTSwW13Ow2V_3URBYMSH-0k4ZJ_Ox5K-g1rDuSOJ-gyMo87MiandTZsPmy75OOjA==
│ │ │ │ │ │ ├── refs.0~m7pxmLgHK4lUyl5MCRovwK5yQEJYHRKeM8lXOFR3ue1YinjywaoSK-44-WQRgl3aehIEkGCurIfn0hyHT63umw==
│ │ │ │ │ │ ├── refs.0~nqtjyxgscHiZYdt4Y8ICuh3SgKydPuah7I-GxreD8fGSkhEUXa0St_rRnKDM_k7wTDpMNkr5aAZxz0YpyZaoVA==
│ │ │ │ │ │ ├── refs.0~oNtXghNehRZ1Ttuy9I1ikWx2An-_WBLlr3Pl4wyb17Gp8o-Q28jEMYpDQgFCHlBeFaTy4wYd91bdDDD4voUmHg==
│ │ │ │ │ │ ├── refs.0~oRMi0sbQLktfDDDGUS-SqBKpdDiD6HCztVES_ShfGr0KVcYENoIq7y9oUSDWL5B_P2gkdtWG8JEsJLxPbdWOZA==
│ │ │ │ │ │ ├── refs.0~pf2ENc4jrljwDk1PKQibk8aX7ljZHyznLIpseS0jyHAeNqjrBTUHrz-vR-2mrclgBDnu04N8Q7a1qSBrGiDpWQ==
│ │ │ │ │ │ ├── refs.0~psoZXY0KQG2o1pHrYKVvMz7DK3EkxTM3VI7rWjLgKXzoFc_9-Kkzg1ieDlEop5425mPFShni4xZaGmwqTMacAQ==
│ │ │ │ │ │ ├── refs.0~qcUUa26y26YwdmhFZUEF5pH0pZuNwPkJ_KtAo-kEn6joYnjSzzg4le6ly8nG1TVKl26maTsIsmOig53j1fZyxg==
│ │ │ │ │ │ ├── refs.0~y5oK5BFKNIKCE8AkvHzMr-Aj11jJmHoG-Lz9wYUt93QIdefWc7TaJ6DWGiWngjJkRJ1XEJI7UQQpeLZk4gQ_Zw==
│ │ │ │ │ │ └── refs.0~yTk_0HmUrv4Tsf9SvkX3yAZwG9OgPBrR89Hy48TH2EoodJHqV_M7R3Lix9-tpSIqOVkv-GS8LXNsIkb5X7L1EA==
│ │ │ │ │ ├── Info.plist
│ │ │ │ │ └── database.sqlite3
│ │ │ │ ├── teamcity/
│ │ │ │ │ ├── teamcity.build.parameters
│ │ │ │ │ └── teamcity.config.parameters
│ │ │ │ └── xcresults-attachments/
│ │ │ │ └── manifest.json
│ │ │ ├── flags.lisp
│ │ │ ├── git-pack.lisp
│ │ │ ├── git.lisp
│ │ │ ├── gradle.lisp
│ │ │ ├── health-checks.lisp
│ │ │ ├── help.lisp
│ │ │ ├── hostname.lisp
│ │ │ ├── install.lisp
│ │ │ ├── installer.sh
│ │ │ ├── integration-fixture.lisp
│ │ │ ├── integration-tests.lisp
│ │ │ ├── main.lisp
│ │ │ ├── metadata.json
│ │ │ ├── package.lisp
│ │ │ ├── pull.lisp
│ │ │ ├── request.lisp
│ │ │ ├── run-context.lisp
│ │ │ ├── screenshotbot.sdk.asd
│ │ │ ├── scripts/
│ │ │ │ ├── .gitignore
│ │ │ │ └── gen-images.sh
│ │ │ ├── sdk-integration-tests-impl.lisp
│ │ │ ├── sdk-integration-tests.lisp
│ │ │ ├── sdk.lisp
│ │ │ ├── sentry.lisp
│ │ │ ├── server-log-appender.lisp
│ │ │ ├── static-example/
│ │ │ │ └── index.html
│ │ │ ├── static.lisp
│ │ │ ├── test-active-run.lisp
│ │ │ ├── test-android.lisp
│ │ │ ├── test-api-context.lisp
│ │ │ ├── test-backoff.lisp
│ │ │ ├── test-bundle.lisp
│ │ │ ├── test-cli-common.lisp
│ │ │ ├── test-clingon-api-context.lisp
│ │ │ ├── test-commit-graph.lisp
│ │ │ ├── test-env.lisp
│ │ │ ├── test-fetch-run.lisp
│ │ │ ├── test-firebase.lisp
│ │ │ ├── test-flags.lisp
│ │ │ ├── test-git-pack.lisp
│ │ │ ├── test-git.lisp
│ │ │ ├── test-installer.lisp
│ │ │ ├── test-main.lisp
│ │ │ ├── test-request.lisp
│ │ │ ├── test-run-context.lisp
│ │ │ ├── test-sdk.lisp
│ │ │ ├── test-sentry.lisp
│ │ │ ├── test-server-log-appender.lisp
│ │ │ ├── test-static.lisp
│ │ │ ├── test-unchanged-run.lisp
│ │ │ ├── test-version-check.lisp
│ │ │ ├── test-xcresult.lisp
│ │ │ ├── unchanged-run.lisp
│ │ │ ├── upload-commit-graph.lisp
│ │ │ ├── version-check.lisp
│ │ │ └── xcresult.lisp
│ │ ├── secret.lisp
│ │ ├── server.lisp
│ │ ├── settings/
│ │ │ ├── general.lisp
│ │ │ ├── security.lisp
│ │ │ ├── settings-template.lisp
│ │ │ ├── shares.lisp
│ │ │ └── test-security.lisp
│ │ ├── settings-api.lisp
│ │ ├── setup-oss.sh
│ │ ├── showkase/
│ │ │ ├── .gitignore
│ │ │ ├── Makefile
│ │ │ ├── deliver-showkase-libs.lisp
│ │ │ ├── instr/
│ │ │ │ ├── .gitignore
│ │ │ │ ├── app/
│ │ │ │ │ ├── build.gradle
│ │ │ │ │ └── src/
│ │ │ │ │ └── main/
│ │ │ │ │ ├── AndroidManifest.xml
│ │ │ │ │ ├── java/
│ │ │ │ │ │ └── io/
│ │ │ │ │ │ └── screenshotbot/
│ │ │ │ │ │ ├── ContainerFragment.java
│ │ │ │ │ │ ├── Factory.kt
│ │ │ │ │ │ ├── LispworksManager.java
│ │ │ │ │ │ ├── MainActivity.java
│ │ │ │ │ │ ├── PrimitiveWrapper.java
│ │ │ │ │ │ ├── SbInstrumentation.java
│ │ │ │ │ │ ├── SimpleNativeLibrary.java
│ │ │ │ │ │ ├── ViewOwner.java
│ │ │ │ │ │ ├── ViewOwners.java
│ │ │ │ │ │ └── Whitebox.java
│ │ │ │ │ └── res/
│ │ │ │ │ ├── drawable/
│ │ │ │ │ │ └── ic_launcher_background.xml
│ │ │ │ │ ├── drawable-v24/
│ │ │ │ │ │ └── ic_launcher_foreground.xml
│ │ │ │ │ ├── layout/
│ │ │ │ │ │ └── activity_main.xml
│ │ │ │ │ ├── mipmap-anydpi-v26/
│ │ │ │ │ │ ├── ic_launcher.xml
│ │ │ │ │ │ └── ic_launcher_round.xml
│ │ │ │ │ └── values/
│ │ │ │ │ ├── colors.xml
│ │ │ │ │ ├── strings.xml
│ │ │ │ │ └── styles.xml
│ │ │ │ ├── build.gradle
│ │ │ │ ├── gradle/
│ │ │ │ │ └── wrapper/
│ │ │ │ │ ├── gradle-wrapper.jar
│ │ │ │ │ └── gradle-wrapper.properties
│ │ │ │ ├── gradle.properties
│ │ │ │ ├── gradlew
│ │ │ │ ├── gradlew.bat
│ │ │ │ └── settings.gradle
│ │ │ ├── lib.lisp
│ │ │ ├── main.lisp
│ │ │ └── screenshotbot.showkase.asd
│ │ ├── site-admin.lisp
│ │ ├── slack/
│ │ │ ├── all.lisp
│ │ │ ├── core.lisp
│ │ │ ├── plugin.lisp
│ │ │ ├── rules-card.lisp
│ │ │ ├── rules.lisp
│ │ │ ├── settings.lisp
│ │ │ ├── task-integration.lisp
│ │ │ ├── test-core.lisp
│ │ │ ├── test-rules.lisp
│ │ │ ├── test-settings.lisp
│ │ │ └── test-task-integration.lisp
│ │ ├── sso/
│ │ │ ├── fake.lisp
│ │ │ ├── model.lisp
│ │ │ ├── redirect.lisp
│ │ │ └── settings.lisp
│ │ ├── static/
│ │ │ └── assets/
│ │ │ ├── css/
│ │ │ │ ├── aos.css
│ │ │ │ └── selenium.css
│ │ │ ├── images/
│ │ │ │ └── logos/
│ │ │ │ ├── logo-square-with-margin.xcf
│ │ │ │ └── text-logo-with-vertical-space.xcf
│ │ │ └── js/
│ │ │ ├── annotate.js
│ │ │ ├── aos.js
│ │ │ └── browser-tests.js
│ │ ├── task-integration-api.lisp
│ │ ├── tasks/
│ │ │ ├── common.lisp
│ │ │ └── test-common.lisp
│ │ ├── template.lisp
│ │ ├── test-abstract-pr-promoter.lisp
│ │ ├── test-analytics.lisp
│ │ ├── test-artifacts.lisp
│ │ ├── test-assets.lisp
│ │ ├── test-async.lisp
│ │ ├── test-audit-log.lisp
│ │ ├── test-batch-promoter.lisp
│ │ ├── test-billing-meter.lisp
│ │ ├── test-cdn.lisp
│ │ ├── test-config.lisp
│ │ ├── test-diff-report.lisp
│ │ ├── test-email-template.lisp
│ │ ├── test-git-repo.lisp
│ │ ├── test-installation.lisp
│ │ ├── test-invite.lisp
│ │ ├── test-promote-api.lisp
│ │ ├── test-raft-redirect.lisp
│ │ ├── test-secret.lisp
│ │ ├── test-server.lisp
│ │ ├── test-settings-api.lisp
│ │ ├── test-store.lisp
│ │ ├── test-template.lisp
│ │ ├── test-testing.lisp
│ │ ├── test-throttler.lisp
│ │ ├── test-uname.lisp
│ │ ├── testing.lisp
│ │ ├── thresholds/
│ │ │ ├── dsl.lisp
│ │ │ └── test-dsl.lisp
│ │ ├── throttler.lisp
│ │ ├── ui/
│ │ │ ├── all.lisp
│ │ │ └── core.lisp
│ │ ├── uname.lisp
│ │ ├── user-api.lisp
│ │ ├── utils.lisp
│ │ ├── web-build/
│ │ │ ├── browsers.lisp
│ │ │ ├── device-list.lisp
│ │ │ ├── project.lisp
│ │ │ ├── scheduler.lisp
│ │ │ ├── test-project.lisp
│ │ │ └── test-scheduler.lisp
│ │ ├── webdriver/
│ │ │ ├── all.lisp
│ │ │ ├── impl.lisp
│ │ │ ├── runner.lisp
│ │ │ ├── screenshot.lisp
│ │ │ └── test-screenshot.lisp
│ │ └── webhook/
│ │ ├── model.lisp
│ │ ├── settings.lisp
│ │ ├── test-model.lisp
│ │ ├── test-settings.lisp
│ │ ├── test-webhook.lisp
│ │ └── webhook.lisp
│ ├── screenshotbot.oss.tests.asd
│ ├── server/
│ │ ├── .gitignore
│ │ ├── Makefile
│ │ ├── acceptor-override.lisp
│ │ ├── cli.lisp
│ │ ├── cluster/
│ │ │ ├── cluster-init.lisp
│ │ │ ├── leadership.lisp
│ │ │ ├── peers.lisp
│ │ │ └── status.lisp
│ │ ├── config-cli.lisp
│ │ ├── config.lisp
│ │ ├── control-socket.lisp
│ │ ├── eval.lisp
│ │ ├── health-checks.lisp
│ │ ├── interrupts.lisp
│ │ ├── launch.c
│ │ ├── server.asd
│ │ ├── setup.lisp
│ │ ├── slynk-preparer.lisp
│ │ ├── test-config.lisp
│ │ ├── test-server.lisp
│ │ ├── test-slynk-preparer.lisp
│ │ ├── test-util.lisp
│ │ └── util.lisp
│ ├── test-runner/
│ │ ├── affected-systems.lisp
│ │ ├── build-test-runner.lisp
│ │ ├── test-runner.asd
│ │ └── test-runner.lisp
│ └── util/
│ ├── .gitattributes
│ ├── acceptor.lisp
│ ├── asdf.lisp
│ ├── atomics.lisp
│ ├── benchmark.lisp
│ ├── bind-form.lisp
│ ├── bknr-slynk.lisp
│ ├── cdn.lisp
│ ├── clsql/
│ │ ├── clsql.lisp
│ │ ├── libmariadb.so.3
│ │ └── libsqlite3.so.0.8.6
│ ├── cookies.lisp
│ ├── copy-file.lisp
│ ├── copying.lisp
│ ├── countries.csv
│ ├── countries.lisp
│ ├── cron.lisp
│ ├── debugger-hook.lisp
│ ├── digest.c
│ ├── digests-non-lw.lisp
│ ├── digests.lisp
│ ├── disk-size.lisp
│ ├── download-file.lisp
│ ├── emacs.lisp
│ ├── engines.lisp
│ ├── events.lisp
│ ├── fake-clingon.lisp
│ ├── fake-fli.lisp
│ ├── fiveam.lisp
│ ├── fixture/
│ │ └── file.txt
│ ├── form-errors.lisp
│ ├── form-state.lisp
│ ├── fset.lisp
│ ├── gcloud.lisp
│ ├── google-analytics.lisp
│ ├── hash-lock.lisp
│ ├── health-check.lisp
│ ├── html2text.lisp
│ ├── http-cache.lisp
│ ├── http-ping.lisp
│ ├── hunchentoot-engine.lisp
│ ├── java/
│ │ ├── all.lisp
│ │ ├── binding.lisp
│ │ ├── iterate.lisp
│ │ ├── java.lisp
│ │ ├── reader.lisp
│ │ ├── test-binding.lisp
│ │ ├── test-iterate.lisp
│ │ ├── test-java.lisp
│ │ └── util.java.asd
│ ├── json-mop.lisp
│ ├── logger.lisp
│ ├── logrotate.lisp
│ ├── lparallel.lisp
│ ├── lru-cache.lisp
│ ├── mail.lisp
│ ├── make-instance-with-accessors.lisp
│ ├── memory.lisp
│ ├── misc/
│ │ ├── lists.lisp
│ │ ├── misc.lisp
│ │ ├── test-lists.lisp
│ │ ├── test-misc.lisp
│ │ └── util.misc.asd
│ ├── mock-recording.lisp
│ ├── mockable.lisp
│ ├── mquery.lisp
│ ├── native-module.lisp
│ ├── package.lisp
│ ├── payment-method.lisp
│ ├── phabricator/
│ │ ├── conduit.lisp
│ │ ├── fixture/
│ │ │ ├── create-artifact.rec
│ │ │ ├── upload-file.rec
│ │ │ └── upload-large-file.rec
│ │ ├── harbormaster.lisp
│ │ ├── maniphest.lisp
│ │ ├── passphrase.lisp
│ │ ├── phabricator.el
│ │ ├── project.lisp
│ │ ├── test-conduit.lisp
│ │ └── test-harbormaster.lisp
│ ├── posix.lisp
│ ├── random-port.lisp
│ ├── rb-tree.lisp
│ ├── recaptcha.lisp
│ ├── remote-debugging.lisp
│ ├── request.lisp
│ ├── ret-let.lisp
│ ├── reused-ssl.lisp
│ ├── schema/
│ │ ├── core.lisp
│ │ └── history.lisp
│ ├── simple-queue.lisp
│ ├── sizeof.lisp
│ ├── ssl.lisp
│ ├── states.csv
│ ├── statsig/
│ │ ├── statsig.lisp
│ │ ├── test-statsig.lisp
│ │ └── util.statsig.asd
│ ├── store/
│ │ ├── aws-store.lisp
│ │ ├── benchmarks.lisp
│ │ ├── checksums.lisp
│ │ ├── clone-logs-store.lisp
│ │ ├── delayed-accessors.lisp
│ │ ├── elb-store.lisp
│ │ ├── encodable.lisp
│ │ ├── export.lisp
│ │ ├── fset-index.lisp
│ │ ├── fset.lisp
│ │ ├── migrations.lisp
│ │ ├── object-id.lisp
│ │ ├── permissive-persistent-class.lisp
│ │ ├── raft-state-http.lisp
│ │ ├── simple-object-snapshot.lisp
│ │ ├── single.lisp
│ │ ├── slot-subsystem.lisp
│ │ ├── store-migrations.lisp
│ │ ├── store-version.lisp
│ │ ├── store.lisp
│ │ ├── summing-index.lisp
│ │ ├── sync.lisp
│ │ ├── test-checksums.lisp
│ │ ├── test-delayed-accessors.lisp
│ │ ├── test-encodable.lisp
│ │ ├── test-fset-index.lisp
│ │ ├── test-fset.lisp
│ │ ├── test-migrations.lisp
│ │ ├── test-objectid.lisp
│ │ ├── test-permissive-persistent-class.lisp
│ │ ├── test-raft-state-http.lisp
│ │ ├── test-simple-object-snapshot.lisp
│ │ ├── test-single.lisp
│ │ ├── test-slot-subsystem.lisp
│ │ ├── test-store-version.lisp
│ │ ├── test-store.lisp
│ │ ├── test-summing-index.lisp
│ │ ├── test-sync.lisp
│ │ ├── test-validate.lisp
│ │ ├── util.store.asd
│ │ └── validate.lisp
│ ├── symbol-detector.lisp
│ ├── test-file.txt
│ ├── testing/
│ │ ├── test-testing.lisp
│ │ ├── testing.lisp
│ │ └── util.testing.asd
│ ├── tests/
│ │ ├── test-asdf.lisp
│ │ ├── test-benchmark.lisp
│ │ ├── test-bind-form.lisp
│ │ ├── test-cdn.lisp
│ │ ├── test-cookies.lisp
│ │ ├── test-copy-file.lisp
│ │ ├── test-digests.lisp
│ │ ├── test-disk-size.lisp
│ │ ├── test-events.lisp
│ │ ├── test-fake-clingon.lisp
│ │ ├── test-fake-fli.lisp
│ │ ├── test-fiveam.lisp
│ │ ├── test-fset.lisp
│ │ ├── test-hash-lock.lisp
│ │ ├── test-health-check.lisp
│ │ ├── test-html2text.lisp
│ │ ├── test-hunchentoot-engine.lisp
│ │ ├── test-json-mop.lisp
│ │ ├── test-lispworks.lisp
│ │ ├── test-logger.lisp
│ │ ├── test-lparallel.lisp
│ │ ├── test-lru-cache.lisp
│ │ ├── test-mail.lisp
│ │ ├── test-make-instance-with-accessors.lisp
│ │ ├── test-memory.lisp
│ │ ├── test-mock-recording.lisp
│ │ ├── test-mockable.lisp
│ │ ├── test-models.lisp
│ │ ├── test-mquery.lisp
│ │ ├── test-random-port.lisp
│ │ ├── test-rb-tree.lisp
│ │ ├── test-request-integration.lisp
│ │ ├── test-request.lisp
│ │ ├── test-ret-let.lisp
│ │ ├── test-reused-ssl.lisp
│ │ ├── test-simple-queue.lisp
│ │ ├── test-sizeof.lisp
│ │ ├── test-ssl.lisp
│ │ ├── test-throttler.lisp
│ │ ├── test-timeago.lisp
│ │ └── test-truncated-stream.lisp
│ ├── threading/
│ │ ├── fake-mp.lisp
│ │ ├── tests/
│ │ │ └── test-threading.lisp
│ │ ├── threading.lisp
│ │ └── util.threading.asd
│ ├── throttler.lisp
│ ├── timeago.lisp
│ ├── tools.el
│ ├── truncated-stream.lisp
│ ├── utf-8.lisp
│ ├── util.asd
│ └── uuid.lisp
└── third-party/
├── asn1/
│ ├── README.md
│ ├── asn1.asd
│ ├── decode.lisp
│ ├── encode.lisp
│ ├── format/
│ │ ├── public-key.lisp
│ │ └── rsa.lisp
│ ├── main.lisp
│ └── tests/
│ └── main.lisp
├── bknr.datastore/
│ ├── .gitignore
│ ├── README.mkdn
│ ├── doc/
│ │ ├── 1_introduction.txt
│ │ ├── 2_guided_tour.txt
│ │ ├── Makefile
│ │ ├── README-orig
│ │ ├── TODO
│ │ ├── example.tex
│ │ ├── guidedtour.tex
│ │ ├── introduction.tex
│ │ ├── manual.tex
│ │ ├── schleuder-artikel.txt
│ │ ├── templates.tex
│ │ └── web.tex
│ ├── experimental/
│ │ ├── dump-core.lisp
│ │ ├── fswrap/
│ │ │ ├── fsd.pl
│ │ │ ├── fswrap.c
│ │ │ └── fswrap.lisp
│ │ ├── mop-bug.lisp
│ │ ├── shop/
│ │ │ ├── money.lisp
│ │ │ └── shop.lisp
│ │ ├── slot-attributes.lisp
│ │ └── xml-schema/
│ │ ├── examples/
│ │ │ ├── test-schema.xml
│ │ │ └── test-schema2.xml
│ │ └── xml-schema.lisp
│ ├── license.txt
│ ├── patches/
│ │ └── patch-around-mop-cmucl19.lisp
│ └── src/
│ ├── bknr.data.impex.asd
│ ├── bknr.datastore.asd
│ ├── bknr.impex.asd
│ ├── bknr.indices.asd
│ ├── bknr.skip-list.asd
│ ├── bknr.utils.asd
│ ├── bknr.xml.asd
│ ├── data/
│ │ ├── TODO
│ │ ├── blob.lisp
│ │ ├── convert.lisp
│ │ ├── encoding-test.lisp
│ │ ├── encoding.lisp
│ │ ├── json.lisp
│ │ ├── object-tests.lisp
│ │ ├── object.lisp
│ │ ├── package.lisp
│ │ ├── tests.lisp
│ │ ├── tutorial.lisp
│ │ ├── txn.lisp
│ │ ├── xml-object.lisp
│ │ └── xml-tutorial.lisp
│ ├── indices/
│ │ ├── TODO
│ │ ├── category-index.lisp
│ │ ├── indexed-class.lisp
│ │ ├── indices-tests.lisp
│ │ ├── indices.lisp
│ │ ├── package.lisp
│ │ ├── protocol.lisp
│ │ └── tutorial.lisp
│ ├── skip-list/
│ │ ├── package.lisp
│ │ ├── skip-list-tests.lisp
│ │ └── skip-list.lisp
│ ├── statistics/
│ │ ├── package.lisp
│ │ └── runtime-statistics.lisp
│ ├── utils/
│ │ ├── Makefile
│ │ ├── acl-mp-compat.lisp
│ │ ├── actor.lisp
│ │ ├── capability.lisp
│ │ ├── class.lisp
│ │ ├── crypt-md5.lisp
│ │ ├── date-calc.lisp
│ │ ├── make-fdf-file.lisp
│ │ ├── package.lisp
│ │ ├── parse-time.lisp
│ │ ├── pathnames.lisp
│ │ ├── reader.lisp
│ │ ├── smbpasswd-wrapper.c
│ │ ├── smbpasswd.lisp
│ │ ├── utils.lisp
│ │ └── xml.lisp
│ ├── xml/
│ │ ├── package.lisp
│ │ └── xml.lisp
│ └── xml-impex/
│ ├── package.lisp
│ ├── tutorial.dtd
│ ├── tutorial.lisp
│ ├── tutorial.xml
│ ├── tutorial2.dtd
│ ├── tutorial2.xml
│ ├── tutorial3.dtd
│ ├── tutorial3.xml
│ ├── tutorial4.dtd
│ ├── tutorial4.xml
│ ├── tutorial5.dtd
│ ├── tutorial5.xml
│ ├── xml-class.lisp
│ ├── xml-export.lisp
│ ├── xml-import.lisp
│ └── xml-update.lisp
├── cl+j-0.4/
│ ├── Copyright
│ ├── cl+j.asd
│ ├── cl+j.lisp
│ ├── cl+j_pkg.lisp
│ ├── cl+swt.asd
│ ├── cl_j/
│ │ ├── LispCondition.java
│ │ ├── RunInLisp.java
│ │ └── swt/
│ │ └── LispListener.java
│ ├── cl_j.jar
│ ├── demos/
│ │ ├── CCL/
│ │ │ ├── hello_swing_on_ccl.lisp
│ │ │ ├── hello_swt.lisp
│ │ │ ├── java_REPL/
│ │ │ │ ├── EndOfReplException.java
│ │ │ │ ├── EvalAbortedException.java
│ │ │ │ ├── HelloLispWorld.java
│ │ │ │ ├── LispRef.java
│ │ │ │ ├── ReplFromJava.java
│ │ │ │ ├── java_lisp_ref.lisp
│ │ │ │ ├── java_repl.lisp
│ │ │ │ └── test_java_callback.lisp
│ │ │ └── swt_buttons.lisp
│ │ ├── HelloSWT.java
│ │ ├── HelloSwing.java
│ │ ├── Jabber.lisp
│ │ ├── hello_swing.lisp
│ │ ├── hello_swt.lisp
│ │ ├── java_REPL/
│ │ │ ├── EndOfReplException.java
│ │ │ ├── EvalAbortedException.java
│ │ │ ├── HelloLispWorld.java
│ │ │ ├── LispRef.java
│ │ │ ├── ReplFromJava.java
│ │ │ ├── java_lisp_ref.lisp
│ │ │ ├── java_repl.lisp
│ │ │ └── test_java_callback.lisp
│ │ ├── jfli_example.lisp
│ │ └── swt_buttons.lisp
│ ├── java_adapter.lisp
│ ├── java_callback.lisp
│ ├── jni.lisp
│ ├── reference.lisp
│ ├── sbcl_repl.lisp
│ ├── swt_adapter.lisp
│ ├── swt_adapter_for_ccl.lisp
│ └── vtable.lisp
├── cl-gravatar/
│ ├── LICENSE.txt
│ ├── README.mkdn
│ ├── gravatar.asd
│ ├── gravatar.lisp
│ └── package.lisp
├── cl-libssh2/
│ ├── .gitignore
│ ├── .travis.yml
│ ├── LICENSE
│ ├── examples.lisp
│ ├── libssh2.asd
│ ├── libssh2.test.asd
│ ├── src/
│ │ ├── libssh2-cffi.lisp
│ │ ├── libssh2-libc-cffi.lisp
│ │ ├── logging.lisp
│ │ ├── package.lisp
│ │ ├── scp.lisp
│ │ ├── sftp.lisp
│ │ ├── solutions.lisp
│ │ ├── streams.lisp
│ │ ├── types.lisp
│ │ └── util.lisp
│ └── test/
│ ├── data/
│ │ └── testfile.tgz
│ ├── package.lisp
│ ├── scp.lisp
│ └── sftp.lisp
├── damn-fast-priority-queue/
│ ├── .gitignore
│ ├── README.md
│ ├── damn-fast-priority-queue/
│ │ ├── damn-fast-priority-queue.asd
│ │ ├── src.lisp
│ │ └── test.lisp
│ ├── damn-fast-stable-priority-queue/
│ │ ├── damn-fast-stable-priority-queue.asd
│ │ ├── src.lisp
│ │ ├── test-distinct.lisp
│ │ ├── test-same.lisp
│ │ └── test.lisp
│ └── priority-queue-benchmark/
│ ├── README.md
│ ├── benchmark.lisp
│ └── priority-queue-benchmark.asd
├── fiveam/
│ ├── .boring
│ ├── .travis.yml
│ ├── COPYING
│ ├── README
│ ├── docs/
│ │ └── make-qbook.lisp
│ ├── fiveam.asd
│ ├── src/
│ │ ├── check.lisp
│ │ ├── classes.lisp
│ │ ├── explain.lisp
│ │ ├── fixture.lisp
│ │ ├── package.lisp
│ │ ├── random.lisp
│ │ ├── run.lisp
│ │ ├── style.css
│ │ ├── suite.lisp
│ │ ├── test.lisp
│ │ └── utils.lisp
│ ├── t/
│ │ ├── example.lisp
│ │ └── tests.lisp
│ └── version.sexp
├── hunchensocket/
│ ├── .travis.yml
│ ├── COPYING
│ ├── README.md
│ ├── VERSION
│ ├── demo.lisp
│ ├── hunchensocket-tests.lisp
│ ├── hunchensocket.asd
│ ├── hunchensocket.lisp
│ └── package.lisp
├── hunchentoot-multi-acceptor/
│ ├── .gitignore
│ ├── LICENSE
│ ├── README.md
│ ├── hunchentoot-multi-acceptor.asd
│ ├── hunchentoot-multi-acceptor.lisp
│ ├── package.lisp
│ └── test-hunchentoot-multi-acceptor.lisp
├── json-mop/
│ ├── .github/
│ │ └── workflows/
│ │ └── CI.yml
│ ├── COPYING
│ ├── README.md
│ ├── json-mop.asd
│ ├── src/
│ │ ├── conditions.lisp
│ │ ├── json-mop.lisp
│ │ ├── package.lisp
│ │ ├── to-json.lisp
│ │ └── to-lisp.lisp
│ └── tests/
│ ├── encode-decode.lisp
│ ├── json-mop-tests.asd
│ ├── package.lisp
│ └── tests.lisp
├── pem/
│ ├── README.md
│ ├── main.lisp
│ ├── parser.lisp
│ ├── pem.asd
│ └── pkey.lisp
└── sentry/
└── sentry-js.asd
Showing preview only (220K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (3023 symbols across 142 files)
FILE: src/common/bootstrap/build/banner.js
function getBanner (line 6) | function getBanner(pluginFilename) {
FILE: src/common/bootstrap/build/build-plugins.js
method external (line 51) | external(source) {
FILE: src/common/bootstrap/build/change-version.js
constant VERBOSE (line 16) | const VERBOSE = process.argv.includes('--verbose')
constant DRY_RUN (line 17) | const DRY_RUN = process.argv.includes('--dry') || process.argv.includes(...
constant GLOB (line 20) | const GLOB = [
constant GLOBBY_OPTIONS (line 23) | const GLOBBY_OPTIONS = {
function regExpQuote (line 29) | function regExpQuote(string) {
function regExpQuoteReplacement (line 33) | function regExpQuoteReplacement(string) {
function replaceRecursively (line 37) | async function replaceRecursively(file, oldVersion, newVersion) {
function main (line 59) | async function main(args) {
FILE: src/common/bootstrap/build/rollup.config.js
constant BUNDLE (line 9) | const BUNDLE = process.env.BUNDLE === 'true'
constant ESM (line 10) | const ESM = process.env.ESM === 'true'
FILE: src/common/bootstrap/dist/js/bootstrap.bundle.js
function makeEventUid (line 352) | function makeEventUid(element, uid) {
function getElementEvents (line 356) | function getElementEvents(element) {
function bootstrapHandler (line 363) | function bootstrapHandler(element, fn) {
function bootstrapDelegationHandler (line 377) | function bootstrapDelegationHandler(element, selector, fn) {
function findHandler (line 403) | function findHandler(events, callable, delegationSelector = null) {
function normalizeParameters (line 407) | function normalizeParameters(originalTypeEvent, handler, delegationFunct...
function addHandler (line 420) | function addHandler(element, originalTypeEvent, handler, delegationFunct...
function removeHandler (line 459) | function removeHandler(element, events, typeEvent, handler, delegationSe...
function removeNamespacedHandlers (line 470) | function removeNamespacedHandlers(element, events, typeEvent, namespace) {
function getTypeEvent (line 481) | function getTypeEvent(event) {
method on (line 488) | on(element, event, handler, delegationFunction) {
method one (line 492) | one(element, event, handler, delegationFunction) {
method off (line 496) | off(element, originalTypeEvent, handler, delegationFunction) {
method trigger (line 533) | trigger(element, event, args) {
function hydrateObj (line 577) | function hydrateObj(obj, meta) {
method set (line 608) | set(element, key, instance) {
method get (line 625) | get(element, key) {
method remove (line 633) | remove(element, key) {
function normalizeData (line 654) | function normalizeData(value) {
function normalizeDataKey (line 682) | function normalizeDataKey(key) {
method setDataAttribute (line 687) | setDataAttribute(element, key, value) {
method removeDataAttribute (line 691) | removeDataAttribute(element, key) {
method getDataAttributes (line 695) | getDataAttributes(element) {
method getDataAttribute (line 712) | getDataAttribute(element, key) {
class Config (line 728) | class Config {
method Default (line 730) | static get Default() {
method DefaultType (line 734) | static get DefaultType() {
method NAME (line 738) | static get NAME() {
method _getConfig (line 742) | _getConfig(config) {
method _configAfterMerge (line 751) | _configAfterMerge(config) {
method _mergeConfigObj (line 755) | _mergeConfigObj(config, element) {
method _typeCheckConfig (line 765) | _typeCheckConfig(config, configTypes = this.constructor.DefaultType) {
class BaseComponent (line 794) | class BaseComponent extends Config {
method constructor (line 795) | constructor(element, config) {
method dispose (line 809) | dispose() {
method _queueCallback (line 818) | _queueCallback(callback, element, isAnimated = true) {
method _getConfig (line 822) | _getConfig(config) {
method getInstance (line 832) | static getInstance(element) {
method getOrCreateInstance (line 836) | static getOrCreateInstance(element, config = {}) {
method VERSION (line 840) | static get VERSION() {
method DATA_KEY (line 844) | static get DATA_KEY() {
method EVENT_KEY (line 848) | static get EVENT_KEY() {
method eventName (line 852) | static eventName(name) {
class Alert (line 905) | class Alert extends BaseComponent {
method NAME (line 907) | static get NAME() {
method close (line 912) | close() {
method _destroyElement (line 927) | _destroyElement() {
method jQueryInterface (line 935) | static jQueryInterface(config) {
class Button (line 985) | class Button extends BaseComponent {
method NAME (line 987) | static get NAME() {
method toggle (line 992) | toggle() {
method jQueryInterface (line 998) | static jQueryInterface(config) {
method find (line 1037) | find(selector, element = document.documentElement) {
method findOne (line 1041) | findOne(selector, element = document.documentElement) {
method children (line 1045) | children(element, selector) {
method parents (line 1049) | parents(element, selector) {
method prev (line 1061) | prev(element, selector) {
method next (line 1076) | next(element, selector) {
method focusableChildren (line 1090) | focusableChildren(element) {
class Swipe (line 1132) | class Swipe extends Config {
method constructor (line 1133) | constructor(element, config) {
method Default (line 1149) | static get Default() {
method DefaultType (line 1153) | static get DefaultType() {
method NAME (line 1157) | static get NAME() {
method dispose (line 1162) | dispose() {
method _start (line 1167) | _start(event) {
method _end (line 1178) | _end(event) {
method _move (line 1188) | _move(event) {
method _handleSwipe (line 1192) | _handleSwipe() {
method _initEvents (line 1209) | _initEvents() {
method _eventIsPointerPenTouch (line 1222) | _eventIsPointerPenTouch(event) {
method isSupported (line 1227) | static isSupported() {
class Carousel (line 1302) | class Carousel extends BaseComponent {
method constructor (line 1303) | constructor(element, config) {
method Default (line 1320) | static get Default() {
method DefaultType (line 1324) | static get DefaultType() {
method NAME (line 1328) | static get NAME() {
method next (line 1333) | next() {
method nextWhenVisible (line 1337) | nextWhenVisible() {
method prev (line 1346) | prev() {
method pause (line 1350) | pause() {
method cycle (line 1358) | cycle() {
method _maybeEnableCycle (line 1366) | _maybeEnableCycle() {
method to (line 1379) | to(index) {
method dispose (line 1402) | dispose() {
method _configAfterMerge (line 1411) | _configAfterMerge(config) {
method _addEventListeners (line 1416) | _addEventListeners() {
method _addTouchEventListeners (line 1431) | _addTouchEventListeners() {
method _keydown (line 1465) | _keydown(event) {
method _getItemIndex (line 1479) | _getItemIndex(element) {
method _setActiveIndicatorElement (line 1483) | _setActiveIndicatorElement(index) {
method _updateInterval (line 1499) | _updateInterval() {
method _slide (line 1510) | _slide(order, element = null) {
method _isAnimated (line 1576) | _isAnimated() {
method _getActive (line 1580) | _getActive() {
method _getItems (line 1584) | _getItems() {
method _clearInterval (line 1588) | _clearInterval() {
method _directionToOrder (line 1595) | _directionToOrder(direction) {
method _orderToDirection (line 1603) | _orderToDirection(order) {
method jQueryInterface (line 1612) | static jQueryInterface(config) {
class Collapse (line 1722) | class Collapse extends BaseComponent {
method constructor (line 1723) | constructor(element, config) {
method Default (line 1750) | static get Default() {
method DefaultType (line 1754) | static get DefaultType() {
method NAME (line 1758) | static get NAME() {
method toggle (line 1763) | toggle() {
method show (line 1771) | show() {
method hide (line 1829) | hide() {
method _isShown (line 1874) | _isShown(element = this._element) {
method _configAfterMerge (line 1879) | _configAfterMerge(config) {
method _getDimension (line 1886) | _getDimension() {
method _initializeChildren (line 1890) | _initializeChildren() {
method _getFirstLevelChildren (line 1906) | _getFirstLevelChildren(selector) {
method _addAriaAndCollapsedClass (line 1912) | _addAriaAndCollapsedClass(triggerArray, isOpen) {
method jQueryInterface (line 1924) | static jQueryInterface(config) {
function getNodeName (line 2003) | function getNodeName(element) {
function getWindow (line 2007) | function getWindow(node) {
function isElement (line 2020) | function isElement(node) {
function isHTMLElement (line 2025) | function isHTMLElement(node) {
function isShadowRoot (line 2030) | function isShadowRoot(node) {
function applyStyles (line 2042) | function applyStyles(_ref) {
function effect$2 (line 2069) | function effect$2(_ref2) {
function getBasePlacement (line 2123) | function getBasePlacement(placement) {
function getUAString (line 2131) | function getUAString() {
function isLayoutViewport (line 2143) | function isLayoutViewport() {
function getBoundingClientRect (line 2147) | function getBoundingClientRect(element, includeScale, isFixedStrategy) {
function getLayoutRect (line 2187) | function getLayoutRect(element) {
function contains (line 2210) | function contains(parent, child) {
function getComputedStyle$1 (line 2233) | function getComputedStyle$1(element) {
function isTableElement (line 2237) | function isTableElement(element) {
function getDocumentElement (line 2241) | function getDocumentElement(element) {
function getParentNode (line 2247) | function getParentNode(element) {
function getTrueOffsetParent (line 2264) | function getTrueOffsetParent(element) {
function getContainingBlock (line 2275) | function getContainingBlock(element) {
function getOffsetParent (line 2311) | function getOffsetParent(element) {
function getMainAxisFromPlacement (line 2326) | function getMainAxisFromPlacement(placement) {
function within (line 2330) | function within(min$1, value, max$1) {
function withinMaxClamp (line 2333) | function withinMaxClamp(min, value, max) {
function getFreshSideObject (line 2338) | function getFreshSideObject() {
function mergePaddingObject (line 2347) | function mergePaddingObject(paddingObject) {
function expandToHashMap (line 2351) | function expandToHashMap(value, keys) {
function arrow (line 2365) | function arrow(_ref) {
function effect$1 (line 2402) | function effect$1(_ref2) {
function getVariation (line 2440) | function getVariation(placement) {
function roundOffsetsByDPR (line 2453) | function roundOffsetsByDPR(_ref) {
function mapToStyles (line 2464) | function mapToStyles(_ref2) {
function computeStyles (line 2556) | function computeStyles(_ref5) {
function effect (line 2611) | function effect(_ref) {
function getOppositePlacement (line 2661) | function getOppositePlacement(placement) {
function getOppositeVariationPlacement (line 2671) | function getOppositeVariationPlacement(placement) {
function getWindowScroll (line 2677) | function getWindowScroll(node) {
function getWindowScrollBarX (line 2687) | function getWindowScrollBarX(element) {
function getViewportRect (line 2698) | function getViewportRect(element, strategy) {
function getDocumentRect (line 2728) | function getDocumentRect(element) {
function isScrollParent (line 2751) | function isScrollParent(element) {
function getScrollParent (line 2761) | function getScrollParent(node) {
function listScrollParents (line 2781) | function listScrollParents(element, list) {
function rectToClientRect (line 2797) | function rectToClientRect(rect) {
function getInnerBoundingClientRect (line 2806) | function getInnerBoundingClientRect(element, strategy) {
function getClientRectFromMixedType (line 2819) | function getClientRectFromMixedType(element, clippingParent, strategy) {
function getClippingParents (line 2826) | function getClippingParents(element) {
function getClippingRect (line 2843) | function getClippingRect(element, boundary, rootBoundary, strategy) {
function computeOffsets (line 2862) | function computeOffsets(_ref) {
function detectOverflow (line 2927) | function detectOverflow(state, options) {
function computeAutoPlacement (line 2983) | function computeAutoPlacement(state, options) {
function getExpandedFallbackPlacements (line 3023) | function getExpandedFallbackPlacements(placement) {
function flip (line 3032) | function flip(_ref) {
function getSideOffsets (line 3163) | function getSideOffsets(overflow, rect, preventedOffsets) {
function isAnySideFullyClipped (line 3179) | function isAnySideFullyClipped(overflow) {
function hide (line 3185) | function hide(_ref) {
function distanceAndSkiddingToXY (line 3222) | function distanceAndSkiddingToXY(placement, rects, offset) {
function offset (line 3243) | function offset(_ref2) {
function popperOffsets (line 3274) | function popperOffsets(_ref) {
function getAltAxis (line 3298) | function getAltAxis(axis) {
function preventOverflow (line 3302) | function preventOverflow(_ref) {
function getHTMLElementScroll (line 3433) | function getHTMLElementScroll(element) {
function getNodeScroll (line 3440) | function getNodeScroll(node) {
function isElementScaled (line 3448) | function isElementScaled(element) {
function getCompositeRect (line 3457) | function getCompositeRect(elementOrVirtualElement, offsetParent, isFixed) {
function order (line 3498) | function order(modifiers) {
function orderModifiers (line 3530) | function orderModifiers(modifiers) {
function debounce (line 3541) | function debounce(fn) {
function mergeByName (line 3557) | function mergeByName(modifiers) {
function areValidElements (line 3578) | function areValidElements() {
function popperGenerator (line 3588) | function popperGenerator(generatorOptions) {
class Dropdown (line 3884) | class Dropdown extends BaseComponent {
method constructor (line 3885) | constructor(element, config) {
method Default (line 3896) | static get Default() {
method DefaultType (line 3900) | static get DefaultType() {
method NAME (line 3904) | static get NAME() {
method toggle (line 3909) | toggle() {
method show (line 3913) | show() {
method hide (line 3950) | hide() {
method dispose (line 3962) | dispose() {
method update (line 3970) | update() {
method _completeHide (line 3979) | _completeHide(relatedTarget) {
method _getConfig (line 4008) | _getConfig(config) {
method _createPopper (line 4019) | _createPopper() {
method _isShown (line 4039) | _isShown() {
method _getPlacement (line 4043) | _getPlacement() {
method _detectNavbar (line 4072) | _detectNavbar() {
method _getOffset (line 4076) | _getOffset() {
method _getPopperConfig (line 4092) | _getPopperConfig() {
method _selectMenuItem (line 4122) | _selectMenuItem({
method jQueryInterface (line 4138) | static jQueryInterface(config) {
method clearMenus (line 4154) | static clearMenus(event) {
method dataApiKeydownHandler (line 4192) | static dataApiKeydownHandler(event) {
class ScrollBarHelper (line 4267) | class ScrollBarHelper {
method constructor (line 4268) | constructor() {
method getWidth (line 4273) | getWidth() {
method hide (line 4279) | hide() {
method reset (line 4293) | reset() {
method isOverflowing (line 4303) | isOverflowing() {
method _disableOverFlow (line 4308) | _disableOverFlow() {
method _setElementAttributes (line 4314) | _setElementAttributes(selector, styleProperty, callback) {
method _saveInitialAttribute (line 4331) | _saveInitialAttribute(element, styleProperty) {
method _resetElementAttributes (line 4339) | _resetElementAttributes(selector, styleProperty) {
method _applyManipulationCallback (line 4355) | _applyManipulationCallback(selector, callBack) {
class Backdrop (line 4402) | class Backdrop extends Config {
method constructor (line 4403) | constructor(config) {
method Default (line 4411) | static get Default() {
method DefaultType (line 4415) | static get DefaultType() {
method NAME (line 4419) | static get NAME() {
method show (line 4424) | show(callback) {
method hide (line 4445) | hide(callback) {
method dispose (line 4459) | dispose() {
method _getElement (line 4472) | _getElement() {
method _configAfterMerge (line 4487) | _configAfterMerge(config) {
method _append (line 4493) | _append() {
method _emulateAnimation (line 4508) | _emulateAnimation(callback) {
class FocusTrap (line 4545) | class FocusTrap extends Config {
method constructor (line 4546) | constructor(config) {
method Default (line 4554) | static get Default() {
method DefaultType (line 4558) | static get DefaultType() {
method NAME (line 4562) | static get NAME() {
method activate (line 4567) | activate() {
method deactivate (line 4583) | deactivate() {
method _handleFocusin (line 4593) | _handleFocusin(event) {
method _handleKeydown (line 4613) | _handleKeydown(event) {
class Modal (line 4670) | class Modal extends BaseComponent {
method constructor (line 4671) | constructor(element, config) {
method Default (line 4684) | static get Default() {
method DefaultType (line 4688) | static get DefaultType() {
method NAME (line 4692) | static get NAME() {
method toggle (line 4697) | toggle(relatedTarget) {
method show (line 4701) | show(relatedTarget) {
method hide (line 4726) | hide() {
method dispose (line 4747) | dispose() {
method handleUpdate (line 4759) | handleUpdate() {
method _initializeBackDrop (line 4764) | _initializeBackDrop() {
method _initializeFocusTrap (line 4772) | _initializeFocusTrap() {
method _showElement (line 4778) | _showElement(relatedTarget) {
method _addEventListeners (line 4817) | _addEventListeners() {
method _hideModal (line 4856) | _hideModal() {
method _isAnimated (line 4878) | _isAnimated() {
method _triggerBackdropTransition (line 4882) | _triggerBackdropTransition() {
method _adjustDialog (line 4917) | _adjustDialog() {
method _resetAdjustments (line 4935) | _resetAdjustments() {
method jQueryInterface (line 4941) | static jQueryInterface(config, relatedTarget) {
class Offcanvas (line 5043) | class Offcanvas extends BaseComponent {
method constructor (line 5044) | constructor(element, config) {
method Default (line 5054) | static get Default() {
method DefaultType (line 5058) | static get DefaultType() {
method NAME (line 5062) | static get NAME() {
method toggle (line 5067) | toggle(relatedTarget) {
method show (line 5071) | show(relatedTarget) {
method hide (line 5115) | hide() {
method dispose (line 5153) | dispose() {
method _initializeBackDrop (line 5162) | _initializeBackDrop() {
method _initializeFocusTrap (line 5183) | _initializeFocusTrap() {
method _addEventListeners (line 5189) | _addEventListeners() {
method jQueryInterface (line 5205) | static jQueryInterface(config) {
function sanitizeHtml (line 5344) | function sanitizeHtml(unsafeHtml, allowList, sanitizeFunction) {
class TemplateFactory (line 5416) | class TemplateFactory extends Config {
method constructor (line 5417) | constructor(config) {
method Default (line 5423) | static get Default() {
method DefaultType (line 5427) | static get DefaultType() {
method NAME (line 5431) | static get NAME() {
method getContent (line 5436) | getContent() {
method hasContent (line 5440) | hasContent() {
method changeContent (line 5444) | changeContent(content) {
method toHtml (line 5453) | toHtml() {
method _typeCheckConfig (line 5473) | _typeCheckConfig(config) {
method _checkContent (line 5479) | _checkContent(arg) {
method _setContent (line 5488) | _setContent(template, content, selector) {
method _maybeSanitize (line 5516) | _maybeSanitize(arg) {
method _resolvePossibleFunction (line 5520) | _resolvePossibleFunction(arg) {
method _putElementInTemplate (line 5524) | _putElementInTemplate(element, templateElement) {
class Tooltip (line 5617) | class Tooltip extends BaseComponent {
method constructor (line 5618) | constructor(element, config) {
method Default (line 5643) | static get Default() {
method DefaultType (line 5647) | static get DefaultType() {
method NAME (line 5651) | static get NAME() {
method enable (line 5656) | enable() {
method disable (line 5660) | disable() {
method toggleEnabled (line 5664) | toggleEnabled() {
method toggle (line 5668) | toggle() {
method dispose (line 5684) | dispose() {
method show (line 5697) | show() {
method hide (line 5756) | hide() {
method update (line 5800) | update() {
method _isWithContent (line 5807) | _isWithContent() {
method _getTipElement (line 5811) | _getTipElement() {
method _createTipElement (line 5819) | _createTipElement(content) {
method setContent (line 5840) | setContent(content) {
method _getTemplateFactory (line 5850) | _getTemplateFactory(content) {
method _getContentForTemplate (line 5865) | _getContentForTemplate() {
method _getTitle (line 5871) | _getTitle() {
method _initializeOnDelegatedTarget (line 5876) | _initializeOnDelegatedTarget(event) {
method _isAnimated (line 5880) | _isAnimated() {
method _isShown (line 5884) | _isShown() {
method _createPopper (line 5888) | _createPopper(tip) {
method _getOffset (line 5894) | _getOffset() {
method _resolvePossibleFunction (line 5910) | _resolvePossibleFunction(arg) {
method _getPopperConfig (line 5914) | _getPopperConfig(attachment) {
method _setListeners (line 5953) | _setListeners() {
method _fixTitle (line 5992) | _fixTitle() {
method _enter (line 6009) | _enter() {
method _leave (line 6024) | _leave() {
method _setTimeout (line 6038) | _setTimeout(handler, timeout) {
method _isWithActiveTrigger (line 6043) | _isWithActiveTrigger() {
method _getConfig (line 6047) | _getConfig(config) {
method _configAfterMerge (line 6067) | _configAfterMerge(config) {
method _getDelegateConfig (line 6088) | _getDelegateConfig() {
method _disposePopper (line 6105) | _disposePopper() {
method jQueryInterface (line 6119) | static jQueryInterface(config) {
class Popover (line 6170) | class Popover extends Tooltip {
method Default (line 6172) | static get Default() {
method DefaultType (line 6176) | static get DefaultType() {
method NAME (line 6180) | static get NAME() {
method _isWithContent (line 6185) | _isWithContent() {
method _getContentForTemplate (line 6190) | _getContentForTemplate() {
method _getContent (line 6197) | _getContent() {
method jQueryInterface (line 6202) | static jQueryInterface(config) {
class ScrollSpy (line 6274) | class ScrollSpy extends BaseComponent {
method constructor (line 6275) | constructor(element, config) {
method Default (line 6291) | static get Default() {
method DefaultType (line 6295) | static get DefaultType() {
method NAME (line 6299) | static get NAME() {
method refresh (line 6304) | refresh() {
method dispose (line 6320) | dispose() {
method _configAfterMerge (line 6327) | _configAfterMerge(config) {
method _maybeEnableSmoothScroll (line 6340) | _maybeEnableSmoothScroll() {
method _getNewObserver (line 6369) | _getNewObserver() {
method _observerCallback (line 6379) | _observerCallback(entries) {
method _initializeTargetsAndObservables (line 6420) | _initializeTargetsAndObservables() {
method _process (line 6441) | _process(target) {
method _activateParents (line 6458) | _activateParents(target) {
method _clearActiveClass (line 6474) | _clearActiveClass(parent) {
method jQueryInterface (line 6484) | static jQueryInterface(config) {
class Tab (line 6559) | class Tab extends BaseComponent {
method constructor (line 6560) | constructor(element) {
method NAME (line 6576) | static get NAME() {
method show (line 6581) | show() {
method _activate (line 6609) | _activate(element, relatedElem) {
method _deactivate (line 6638) | _deactivate(element, relatedElem) {
method _keydown (line 6668) | _keydown(event) {
method _getChildren (line 6687) | _getChildren() {
method _getActiveElem (line 6692) | _getActiveElem() {
method _setInitialAttributes (line 6696) | _setInitialAttributes(parent, children) {
method _setInitialAttributesOnChild (line 6704) | _setInitialAttributesOnChild(child) {
method _setInitialAttributesOnTargetPanel (line 6727) | _setInitialAttributesOnTargetPanel(child) {
method _toggleDropDown (line 6741) | _toggleDropDown(element, open) {
method _setAttributeIfNotExists (line 6761) | _setAttributeIfNotExists(element, attribute, value) {
method _elemIsActive (line 6767) | _elemIsActive(elem) {
method _getInnerElement (line 6772) | _getInnerElement(elem) {
method _getOuterElement (line 6777) | _getOuterElement(elem) {
method jQueryInterface (line 6782) | static jQueryInterface(config) {
class Toast (line 6870) | class Toast extends BaseComponent {
method constructor (line 6871) | constructor(element, config) {
method Default (line 6881) | static get Default() {
method DefaultType (line 6885) | static get DefaultType() {
method NAME (line 6889) | static get NAME() {
method show (line 6894) | show() {
method hide (line 6925) | hide() {
method dispose (line 6950) | dispose() {
method isShown (line 6960) | isShown() {
method _maybeScheduleHide (line 6965) | _maybeScheduleHide() {
method _onInteraction (line 6979) | _onInteraction(event, isInteracting) {
method _setListeners (line 7011) | _setListeners() {
method _clearTimeout (line 7018) | _clearTimeout() {
method jQueryInterface (line 7024) | static jQueryInterface(config) {
FILE: src/common/bootstrap/dist/js/bootstrap.esm.js
constant MAX_UID (line 14) | const MAX_UID = 1000000;
constant MILLISECONDS_MULTIPLIER (line 15) | const MILLISECONDS_MULTIPLIER = 1000;
constant TRANSITION_END (line 16) | const TRANSITION_END = 'transitionend';
function makeEventUid (line 348) | function makeEventUid(element, uid) {
function getElementEvents (line 352) | function getElementEvents(element) {
function bootstrapHandler (line 359) | function bootstrapHandler(element, fn) {
function bootstrapDelegationHandler (line 373) | function bootstrapDelegationHandler(element, selector, fn) {
function findHandler (line 399) | function findHandler(events, callable, delegationSelector = null) {
function normalizeParameters (line 403) | function normalizeParameters(originalTypeEvent, handler, delegationFunct...
function addHandler (line 416) | function addHandler(element, originalTypeEvent, handler, delegationFunct...
function removeHandler (line 455) | function removeHandler(element, events, typeEvent, handler, delegationSe...
function removeNamespacedHandlers (line 466) | function removeNamespacedHandlers(element, events, typeEvent, namespace) {
function getTypeEvent (line 477) | function getTypeEvent(event) {
method on (line 484) | on(element, event, handler, delegationFunction) {
method one (line 488) | one(element, event, handler, delegationFunction) {
method off (line 492) | off(element, originalTypeEvent, handler, delegationFunction) {
method trigger (line 529) | trigger(element, event, args) {
function hydrateObj (line 573) | function hydrateObj(obj, meta) {
method set (line 604) | set(element, key, instance) {
method get (line 621) | get(element, key) {
method remove (line 629) | remove(element, key) {
function normalizeData (line 650) | function normalizeData(value) {
function normalizeDataKey (line 678) | function normalizeDataKey(key) {
method setDataAttribute (line 683) | setDataAttribute(element, key, value) {
method removeDataAttribute (line 687) | removeDataAttribute(element, key) {
method getDataAttributes (line 691) | getDataAttributes(element) {
method getDataAttribute (line 708) | getDataAttribute(element, key) {
class Config (line 724) | class Config {
method Default (line 726) | static get Default() {
method DefaultType (line 730) | static get DefaultType() {
method NAME (line 734) | static get NAME() {
method _getConfig (line 738) | _getConfig(config) {
method _configAfterMerge (line 747) | _configAfterMerge(config) {
method _mergeConfigObj (line 751) | _mergeConfigObj(config, element) {
method _typeCheckConfig (line 761) | _typeCheckConfig(config, configTypes = this.constructor.DefaultType) {
constant VERSION (line 785) | const VERSION = '5.2.3';
class BaseComponent (line 790) | class BaseComponent extends Config {
method constructor (line 791) | constructor(element, config) {
method dispose (line 805) | dispose() {
method _queueCallback (line 814) | _queueCallback(callback, element, isAnimated = true) {
method _getConfig (line 818) | _getConfig(config) {
method getInstance (line 828) | static getInstance(element) {
method getOrCreateInstance (line 832) | static getOrCreateInstance(element, config = {}) {
method VERSION (line 836) | static get VERSION() {
method DATA_KEY (line 840) | static get DATA_KEY() {
method EVENT_KEY (line 844) | static get EVENT_KEY() {
method eventName (line 848) | static eventName(name) {
constant EVENT_CLOSE (line 893) | const EVENT_CLOSE = `close${EVENT_KEY$b}`;
constant EVENT_CLOSED (line 894) | const EVENT_CLOSED = `closed${EVENT_KEY$b}`;
class Alert (line 901) | class Alert extends BaseComponent {
method NAME (line 903) | static get NAME() {
method close (line 908) | close() {
method _destroyElement (line 923) | _destroyElement() {
method jQueryInterface (line 931) | static jQueryInterface(config) {
class Button (line 981) | class Button extends BaseComponent {
method NAME (line 983) | static get NAME() {
method toggle (line 988) | toggle() {
method jQueryInterface (line 994) | static jQueryInterface(config) {
method find (line 1033) | find(selector, element = document.documentElement) {
method findOne (line 1037) | findOne(selector, element = document.documentElement) {
method children (line 1041) | children(element, selector) {
method parents (line 1045) | parents(element, selector) {
method prev (line 1057) | prev(element, selector) {
method next (line 1072) | next(element, selector) {
method focusableChildren (line 1086) | focusableChildren(element) {
constant EVENT_TOUCHSTART (line 1105) | const EVENT_TOUCHSTART = `touchstart${EVENT_KEY$9}`;
constant EVENT_TOUCHMOVE (line 1106) | const EVENT_TOUCHMOVE = `touchmove${EVENT_KEY$9}`;
constant EVENT_TOUCHEND (line 1107) | const EVENT_TOUCHEND = `touchend${EVENT_KEY$9}`;
constant EVENT_POINTERDOWN (line 1108) | const EVENT_POINTERDOWN = `pointerdown${EVENT_KEY$9}`;
constant EVENT_POINTERUP (line 1109) | const EVENT_POINTERUP = `pointerup${EVENT_KEY$9}`;
constant POINTER_TYPE_TOUCH (line 1110) | const POINTER_TYPE_TOUCH = 'touch';
constant POINTER_TYPE_PEN (line 1111) | const POINTER_TYPE_PEN = 'pen';
constant CLASS_NAME_POINTER_EVENT (line 1112) | const CLASS_NAME_POINTER_EVENT = 'pointer-event';
constant SWIPE_THRESHOLD (line 1113) | const SWIPE_THRESHOLD = 40;
class Swipe (line 1128) | class Swipe extends Config {
method constructor (line 1129) | constructor(element, config) {
method Default (line 1145) | static get Default() {
method DefaultType (line 1149) | static get DefaultType() {
method NAME (line 1153) | static get NAME() {
method dispose (line 1158) | dispose() {
method _start (line 1163) | _start(event) {
method _end (line 1174) | _end(event) {
method _move (line 1184) | _move(event) {
method _handleSwipe (line 1188) | _handleSwipe() {
method _initEvents (line 1205) | _initEvents() {
method _eventIsPointerPenTouch (line 1218) | _eventIsPointerPenTouch(event) {
method isSupported (line 1223) | static isSupported() {
constant TOUCHEVENT_COMPAT_WAIT (line 1245) | const TOUCHEVENT_COMPAT_WAIT = 500;
constant ORDER_NEXT (line 1247) | const ORDER_NEXT = 'next';
constant ORDER_PREV (line 1248) | const ORDER_PREV = 'prev';
constant DIRECTION_LEFT (line 1249) | const DIRECTION_LEFT = 'left';
constant DIRECTION_RIGHT (line 1250) | const DIRECTION_RIGHT = 'right';
constant EVENT_SLIDE (line 1251) | const EVENT_SLIDE = `slide${EVENT_KEY$8}`;
constant EVENT_SLID (line 1252) | const EVENT_SLID = `slid${EVENT_KEY$8}`;
constant EVENT_DRAG_START (line 1256) | const EVENT_DRAG_START = `dragstart${EVENT_KEY$8}`;
constant CLASS_NAME_CAROUSEL (line 1259) | const CLASS_NAME_CAROUSEL = 'carousel';
constant CLASS_NAME_SLIDE (line 1261) | const CLASS_NAME_SLIDE = 'slide';
constant CLASS_NAME_END (line 1262) | const CLASS_NAME_END = 'carousel-item-end';
constant CLASS_NAME_START (line 1263) | const CLASS_NAME_START = 'carousel-item-start';
constant CLASS_NAME_NEXT (line 1264) | const CLASS_NAME_NEXT = 'carousel-item-next';
constant CLASS_NAME_PREV (line 1265) | const CLASS_NAME_PREV = 'carousel-item-prev';
constant SELECTOR_ACTIVE (line 1266) | const SELECTOR_ACTIVE = '.active';
constant SELECTOR_ITEM (line 1267) | const SELECTOR_ITEM = '.carousel-item';
constant SELECTOR_ACTIVE_ITEM (line 1268) | const SELECTOR_ACTIVE_ITEM = SELECTOR_ACTIVE + SELECTOR_ITEM;
constant SELECTOR_ITEM_IMG (line 1269) | const SELECTOR_ITEM_IMG = '.carousel-item img';
constant SELECTOR_INDICATORS (line 1270) | const SELECTOR_INDICATORS = '.carousel-indicators';
constant SELECTOR_DATA_SLIDE (line 1271) | const SELECTOR_DATA_SLIDE = '[data-bs-slide], [data-bs-slide-to]';
constant SELECTOR_DATA_RIDE (line 1272) | const SELECTOR_DATA_RIDE = '[data-bs-ride="carousel"]';
constant KEY_TO_DIRECTION (line 1273) | const KEY_TO_DIRECTION = {
class Carousel (line 1298) | class Carousel extends BaseComponent {
method constructor (line 1299) | constructor(element, config) {
method Default (line 1316) | static get Default() {
method DefaultType (line 1320) | static get DefaultType() {
method NAME (line 1324) | static get NAME() {
method next (line 1329) | next() {
method nextWhenVisible (line 1333) | nextWhenVisible() {
method prev (line 1342) | prev() {
method pause (line 1346) | pause() {
method cycle (line 1354) | cycle() {
method _maybeEnableCycle (line 1362) | _maybeEnableCycle() {
method to (line 1375) | to(index) {
method dispose (line 1398) | dispose() {
method _configAfterMerge (line 1407) | _configAfterMerge(config) {
method _addEventListeners (line 1412) | _addEventListeners() {
method _addTouchEventListeners (line 1427) | _addTouchEventListeners() {
method _keydown (line 1461) | _keydown(event) {
method _getItemIndex (line 1475) | _getItemIndex(element) {
method _setActiveIndicatorElement (line 1479) | _setActiveIndicatorElement(index) {
method _updateInterval (line 1495) | _updateInterval() {
method _slide (line 1506) | _slide(order, element = null) {
method _isAnimated (line 1572) | _isAnimated() {
method _getActive (line 1576) | _getActive() {
method _getItems (line 1580) | _getItems() {
method _clearInterval (line 1584) | _clearInterval() {
method _directionToOrder (line 1591) | _directionToOrder(direction) {
method _orderToDirection (line 1599) | _orderToDirection(order) {
method jQueryInterface (line 1608) | static jQueryInterface(config) {
constant CLASS_NAME_COLLAPSE (line 1697) | const CLASS_NAME_COLLAPSE = 'collapse';
constant CLASS_NAME_COLLAPSING (line 1698) | const CLASS_NAME_COLLAPSING = 'collapsing';
constant CLASS_NAME_COLLAPSED (line 1699) | const CLASS_NAME_COLLAPSED = 'collapsed';
constant CLASS_NAME_DEEPER_CHILDREN (line 1700) | const CLASS_NAME_DEEPER_CHILDREN = `:scope .${CLASS_NAME_COLLAPSE} .${CL...
constant CLASS_NAME_HORIZONTAL (line 1701) | const CLASS_NAME_HORIZONTAL = 'collapse-horizontal';
constant WIDTH (line 1702) | const WIDTH = 'width';
constant HEIGHT (line 1703) | const HEIGHT = 'height';
constant SELECTOR_ACTIVES (line 1704) | const SELECTOR_ACTIVES = '.collapse.show, .collapse.collapsing';
class Collapse (line 1718) | class Collapse extends BaseComponent {
method constructor (line 1719) | constructor(element, config) {
method Default (line 1746) | static get Default() {
method DefaultType (line 1750) | static get DefaultType() {
method NAME (line 1754) | static get NAME() {
method toggle (line 1759) | toggle() {
method show (line 1767) | show() {
method hide (line 1825) | hide() {
method _isShown (line 1870) | _isShown(element = this._element) {
method _configAfterMerge (line 1875) | _configAfterMerge(config) {
method _getDimension (line 1882) | _getDimension() {
method _initializeChildren (line 1886) | _initializeChildren() {
method _getFirstLevelChildren (line 1902) | _getFirstLevelChildren(selector) {
method _addAriaAndCollapsedClass (line 1908) | _addAriaAndCollapsedClass(triggerArray, isOpen) {
method jQueryInterface (line 1920) | static jQueryInterface(config) {
constant RIGHT_MOUSE_BUTTON (line 1985) | const RIGHT_MOUSE_BUTTON = 2;
constant EVENT_KEYDOWN_DATA_API (line 1992) | const EVENT_KEYDOWN_DATA_API = `keydown${EVENT_KEY$6}${DATA_API_KEY$3}`;
constant EVENT_KEYUP_DATA_API (line 1993) | const EVENT_KEYUP_DATA_API = `keyup${EVENT_KEY$6}${DATA_API_KEY$3}`;
constant CLASS_NAME_DROPUP (line 1995) | const CLASS_NAME_DROPUP = 'dropup';
constant CLASS_NAME_DROPEND (line 1996) | const CLASS_NAME_DROPEND = 'dropend';
constant CLASS_NAME_DROPSTART (line 1997) | const CLASS_NAME_DROPSTART = 'dropstart';
constant CLASS_NAME_DROPUP_CENTER (line 1998) | const CLASS_NAME_DROPUP_CENTER = 'dropup-center';
constant CLASS_NAME_DROPDOWN_CENTER (line 1999) | const CLASS_NAME_DROPDOWN_CENTER = 'dropdown-center';
constant SELECTOR_DATA_TOGGLE_SHOWN (line 2001) | const SELECTOR_DATA_TOGGLE_SHOWN = `${SELECTOR_DATA_TOGGLE$3}.${CLASS_NA...
constant SELECTOR_MENU (line 2002) | const SELECTOR_MENU = '.dropdown-menu';
constant SELECTOR_NAVBAR (line 2003) | const SELECTOR_NAVBAR = '.navbar';
constant SELECTOR_NAVBAR_NAV (line 2004) | const SELECTOR_NAVBAR_NAV = '.navbar-nav';
constant SELECTOR_VISIBLE_ITEMS (line 2005) | const SELECTOR_VISIBLE_ITEMS = '.dropdown-menu .dropdown-item:not(.disab...
constant PLACEMENT_TOP (line 2006) | const PLACEMENT_TOP = isRTL() ? 'top-end' : 'top-start';
constant PLACEMENT_TOPEND (line 2007) | const PLACEMENT_TOPEND = isRTL() ? 'top-start' : 'top-end';
constant PLACEMENT_BOTTOM (line 2008) | const PLACEMENT_BOTTOM = isRTL() ? 'bottom-end' : 'bottom-start';
constant PLACEMENT_BOTTOMEND (line 2009) | const PLACEMENT_BOTTOMEND = isRTL() ? 'bottom-start' : 'bottom-end';
constant PLACEMENT_RIGHT (line 2010) | const PLACEMENT_RIGHT = isRTL() ? 'left-start' : 'right-start';
constant PLACEMENT_LEFT (line 2011) | const PLACEMENT_LEFT = isRTL() ? 'right-start' : 'left-start';
constant PLACEMENT_TOPCENTER (line 2012) | const PLACEMENT_TOPCENTER = 'top';
constant PLACEMENT_BOTTOMCENTER (line 2013) | const PLACEMENT_BOTTOMCENTER = 'bottom';
class Dropdown (line 2034) | class Dropdown extends BaseComponent {
method constructor (line 2035) | constructor(element, config) {
method Default (line 2046) | static get Default() {
method DefaultType (line 2050) | static get DefaultType() {
method NAME (line 2054) | static get NAME() {
method toggle (line 2059) | toggle() {
method show (line 2063) | show() {
method hide (line 2100) | hide() {
method dispose (line 2112) | dispose() {
method update (line 2120) | update() {
method _completeHide (line 2129) | _completeHide(relatedTarget) {
method _getConfig (line 2158) | _getConfig(config) {
method _createPopper (line 2169) | _createPopper() {
method _isShown (line 2189) | _isShown() {
method _getPlacement (line 2193) | _getPlacement() {
method _detectNavbar (line 2222) | _detectNavbar() {
method _getOffset (line 2226) | _getOffset() {
method _getPopperConfig (line 2242) | _getPopperConfig() {
method _selectMenuItem (line 2272) | _selectMenuItem({
method jQueryInterface (line 2288) | static jQueryInterface(config) {
method clearMenus (line 2304) | static clearMenus(event) {
method dataApiKeydownHandler (line 2342) | static dataApiKeydownHandler(event) {
constant SELECTOR_FIXED_CONTENT (line 2409) | const SELECTOR_FIXED_CONTENT = '.fixed-top, .fixed-bottom, .is-fixed, .s...
constant SELECTOR_STICKY_CONTENT (line 2410) | const SELECTOR_STICKY_CONTENT = '.sticky-top';
constant PROPERTY_PADDING (line 2411) | const PROPERTY_PADDING = 'padding-right';
constant PROPERTY_MARGIN (line 2412) | const PROPERTY_MARGIN = 'margin-right';
class ScrollBarHelper (line 2417) | class ScrollBarHelper {
method constructor (line 2418) | constructor() {
method getWidth (line 2423) | getWidth() {
method hide (line 2429) | hide() {
method reset (line 2443) | reset() {
method isOverflowing (line 2453) | isOverflowing() {
method _disableOverFlow (line 2458) | _disableOverFlow() {
method _setElementAttributes (line 2464) | _setElementAttributes(selector, styleProperty, callback) {
method _saveInitialAttribute (line 2481) | _saveInitialAttribute(element, styleProperty) {
method _resetElementAttributes (line 2489) | _resetElementAttributes(selector, styleProperty) {
method _applyManipulationCallback (line 2505) | _applyManipulationCallback(selector, callBack) {
constant EVENT_MOUSEDOWN (line 2531) | const EVENT_MOUSEDOWN = `mousedown.bs.${NAME$9}`;
class Backdrop (line 2552) | class Backdrop extends Config {
method constructor (line 2553) | constructor(config) {
method Default (line 2561) | static get Default() {
method DefaultType (line 2565) | static get DefaultType() {
method NAME (line 2569) | static get NAME() {
method show (line 2574) | show(callback) {
method hide (line 2595) | hide(callback) {
method dispose (line 2609) | dispose() {
method _getElement (line 2622) | _getElement() {
method _configAfterMerge (line 2637) | _configAfterMerge(config) {
method _append (line 2643) | _append() {
method _emulateAnimation (line 2658) | _emulateAnimation(callback) {
constant EVENT_KEYDOWN_TAB (line 2678) | const EVENT_KEYDOWN_TAB = `keydown.tab${EVENT_KEY$5}`;
constant TAB_KEY (line 2679) | const TAB_KEY = 'Tab';
constant TAB_NAV_FORWARD (line 2680) | const TAB_NAV_FORWARD = 'forward';
constant TAB_NAV_BACKWARD (line 2681) | const TAB_NAV_BACKWARD = 'backward';
class FocusTrap (line 2695) | class FocusTrap extends Config {
method constructor (line 2696) | constructor(config) {
method Default (line 2704) | static get Default() {
method DefaultType (line 2708) | static get DefaultType() {
method NAME (line 2712) | static get NAME() {
method activate (line 2717) | activate() {
method deactivate (line 2733) | deactivate() {
method _handleFocusin (line 2743) | _handleFocusin(event) {
method _handleKeydown (line 2763) | _handleKeydown(event) {
constant EVENT_CLICK_DISMISS (line 2794) | const EVENT_CLICK_DISMISS = `click.dismiss${EVENT_KEY$4}`;
constant EVENT_MOUSEDOWN_DISMISS (line 2795) | const EVENT_MOUSEDOWN_DISMISS = `mousedown.dismiss${EVENT_KEY$4}`;
constant CLASS_NAME_OPEN (line 2798) | const CLASS_NAME_OPEN = 'modal-open';
constant CLASS_NAME_STATIC (line 2801) | const CLASS_NAME_STATIC = 'modal-static';
constant SELECTOR_DIALOG (line 2803) | const SELECTOR_DIALOG = '.modal-dialog';
constant SELECTOR_MODAL_BODY (line 2804) | const SELECTOR_MODAL_BODY = '.modal-body';
class Modal (line 2820) | class Modal extends BaseComponent {
method constructor (line 2821) | constructor(element, config) {
method Default (line 2834) | static get Default() {
method DefaultType (line 2838) | static get DefaultType() {
method NAME (line 2842) | static get NAME() {
method toggle (line 2847) | toggle(relatedTarget) {
method show (line 2851) | show(relatedTarget) {
method hide (line 2876) | hide() {
method dispose (line 2897) | dispose() {
method handleUpdate (line 2909) | handleUpdate() {
method _initializeBackDrop (line 2914) | _initializeBackDrop() {
method _initializeFocusTrap (line 2922) | _initializeFocusTrap() {
method _showElement (line 2928) | _showElement(relatedTarget) {
method _addEventListeners (line 2967) | _addEventListeners() {
method _hideModal (line 3006) | _hideModal() {
method _isAnimated (line 3028) | _isAnimated() {
method _triggerBackdropTransition (line 3032) | _triggerBackdropTransition() {
method _adjustDialog (line 3067) | _adjustDialog() {
method _resetAdjustments (line 3085) | _resetAdjustments() {
method jQueryInterface (line 3091) | static jQueryInterface(config, relatedTarget) {
constant ESCAPE_KEY (line 3164) | const ESCAPE_KEY = 'Escape';
constant CLASS_NAME_HIDING (line 3167) | const CLASS_NAME_HIDING = 'hiding';
constant CLASS_NAME_BACKDROP (line 3168) | const CLASS_NAME_BACKDROP = 'offcanvas-backdrop';
constant OPEN_SELECTOR (line 3169) | const OPEN_SELECTOR = '.offcanvas.show';
constant EVENT_HIDE_PREVENTED (line 3173) | const EVENT_HIDE_PREVENTED = `hidePrevented${EVENT_KEY$3}`;
constant EVENT_RESIZE (line 3175) | const EVENT_RESIZE = `resize${EVENT_KEY$3}`;
constant EVENT_KEYDOWN_DISMISS (line 3177) | const EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY$3}`;
class Offcanvas (line 3193) | class Offcanvas extends BaseComponent {
method constructor (line 3194) | constructor(element, config) {
method Default (line 3204) | static get Default() {
method DefaultType (line 3208) | static get DefaultType() {
method NAME (line 3212) | static get NAME() {
method toggle (line 3217) | toggle(relatedTarget) {
method show (line 3221) | show(relatedTarget) {
method hide (line 3265) | hide() {
method dispose (line 3303) | dispose() {
method _initializeBackDrop (line 3312) | _initializeBackDrop() {
method _initializeFocusTrap (line 3333) | _initializeFocusTrap() {
method _addEventListeners (line 3339) | _addEventListeners() {
method jQueryInterface (line 3355) | static jQueryInterface(config) {
constant ARIA_ATTRIBUTE_PATTERN (line 3430) | const ARIA_ATTRIBUTE_PATTERN = /^aria-[\w-]*$/i;
constant SAFE_URL_PATTERN (line 3437) | const SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file|sms):|[^#&/:...
constant DATA_URL_PATTERN (line 3444) | const DATA_URL_PATTERN = /^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|w...
function sanitizeHtml (line 3494) | function sanitizeHtml(unsafeHtml, allowList, sanitizeFunction) {
class TemplateFactory (line 3566) | class TemplateFactory extends Config {
method constructor (line 3567) | constructor(config) {
method Default (line 3573) | static get Default() {
method DefaultType (line 3577) | static get DefaultType() {
method NAME (line 3581) | static get NAME() {
method getContent (line 3586) | getContent() {
method hasContent (line 3590) | hasContent() {
method changeContent (line 3594) | changeContent(content) {
method toHtml (line 3603) | toHtml() {
method _typeCheckConfig (line 3623) | _typeCheckConfig(config) {
method _checkContent (line 3629) | _checkContent(arg) {
method _setContent (line 3638) | _setContent(template, content, selector) {
method _maybeSanitize (line 3666) | _maybeSanitize(arg) {
method _resolvePossibleFunction (line 3670) | _resolvePossibleFunction(arg) {
method _putElementInTemplate (line 3674) | _putElementInTemplate(element, templateElement) {
constant DISALLOWED_ATTRIBUTES (line 3697) | const DISALLOWED_ATTRIBUTES = new Set(['sanitize', 'allowList', 'sanitiz...
constant CLASS_NAME_MODAL (line 3699) | const CLASS_NAME_MODAL = 'modal';
constant SELECTOR_TOOLTIP_INNER (line 3701) | const SELECTOR_TOOLTIP_INNER = '.tooltip-inner';
constant SELECTOR_MODAL (line 3702) | const SELECTOR_MODAL = `.${CLASS_NAME_MODAL}`;
constant EVENT_MODAL_HIDE (line 3703) | const EVENT_MODAL_HIDE = 'hide.bs.modal';
constant TRIGGER_HOVER (line 3704) | const TRIGGER_HOVER = 'hover';
constant TRIGGER_FOCUS (line 3705) | const TRIGGER_FOCUS = 'focus';
constant TRIGGER_CLICK (line 3706) | const TRIGGER_CLICK = 'click';
constant TRIGGER_MANUAL (line 3707) | const TRIGGER_MANUAL = 'manual';
constant EVENT_INSERTED (line 3712) | const EVENT_INSERTED = 'inserted';
constant EVENT_MOUSEENTER (line 3716) | const EVENT_MOUSEENTER = 'mouseenter';
constant EVENT_MOUSELEAVE (line 3717) | const EVENT_MOUSELEAVE = 'mouseleave';
class Tooltip (line 3767) | class Tooltip extends BaseComponent {
method constructor (line 3768) | constructor(element, config) {
method Default (line 3793) | static get Default() {
method DefaultType (line 3797) | static get DefaultType() {
method NAME (line 3801) | static get NAME() {
method enable (line 3806) | enable() {
method disable (line 3810) | disable() {
method toggleEnabled (line 3814) | toggleEnabled() {
method toggle (line 3818) | toggle() {
method dispose (line 3834) | dispose() {
method show (line 3847) | show() {
method hide (line 3906) | hide() {
method update (line 3950) | update() {
method _isWithContent (line 3957) | _isWithContent() {
method _getTipElement (line 3961) | _getTipElement() {
method _createTipElement (line 3969) | _createTipElement(content) {
method setContent (line 3990) | setContent(content) {
method _getTemplateFactory (line 4000) | _getTemplateFactory(content) {
method _getContentForTemplate (line 4015) | _getContentForTemplate() {
method _getTitle (line 4021) | _getTitle() {
method _initializeOnDelegatedTarget (line 4026) | _initializeOnDelegatedTarget(event) {
method _isAnimated (line 4030) | _isAnimated() {
method _isShown (line 4034) | _isShown() {
method _createPopper (line 4038) | _createPopper(tip) {
method _getOffset (line 4044) | _getOffset() {
method _resolvePossibleFunction (line 4060) | _resolvePossibleFunction(arg) {
method _getPopperConfig (line 4064) | _getPopperConfig(attachment) {
method _setListeners (line 4103) | _setListeners() {
method _fixTitle (line 4142) | _fixTitle() {
method _enter (line 4159) | _enter() {
method _leave (line 4174) | _leave() {
method _setTimeout (line 4188) | _setTimeout(handler, timeout) {
method _isWithActiveTrigger (line 4193) | _isWithActiveTrigger() {
method _getConfig (line 4197) | _getConfig(config) {
method _configAfterMerge (line 4217) | _configAfterMerge(config) {
method _getDelegateConfig (line 4238) | _getDelegateConfig() {
method _disposePopper (line 4255) | _disposePopper() {
method jQueryInterface (line 4269) | static jQueryInterface(config) {
constant SELECTOR_TITLE (line 4304) | const SELECTOR_TITLE = '.popover-header';
constant SELECTOR_CONTENT (line 4305) | const SELECTOR_CONTENT = '.popover-body';
class Popover (line 4320) | class Popover extends Tooltip {
method Default (line 4322) | static get Default() {
method DefaultType (line 4326) | static get DefaultType() {
method NAME (line 4330) | static get NAME() {
method _isWithContent (line 4335) | _isWithContent() {
method _getContentForTemplate (line 4340) | _getContentForTemplate() {
method _getContent (line 4347) | _getContent() {
method jQueryInterface (line 4352) | static jQueryInterface(config) {
constant DATA_API_KEY (line 4389) | const DATA_API_KEY = '.data-api';
constant EVENT_ACTIVATE (line 4390) | const EVENT_ACTIVATE = `activate${EVENT_KEY$2}`;
constant EVENT_CLICK (line 4391) | const EVENT_CLICK = `click${EVENT_KEY$2}`;
constant CLASS_NAME_DROPDOWN_ITEM (line 4393) | const CLASS_NAME_DROPDOWN_ITEM = 'dropdown-item';
constant SELECTOR_DATA_SPY (line 4395) | const SELECTOR_DATA_SPY = '[data-bs-spy="scroll"]';
constant SELECTOR_TARGET_LINKS (line 4396) | const SELECTOR_TARGET_LINKS = '[href]';
constant SELECTOR_NAV_LIST_GROUP (line 4397) | const SELECTOR_NAV_LIST_GROUP = '.nav, .list-group';
constant SELECTOR_NAV_LINKS (line 4398) | const SELECTOR_NAV_LINKS = '.nav-link';
constant SELECTOR_NAV_ITEMS (line 4399) | const SELECTOR_NAV_ITEMS = '.nav-item';
constant SELECTOR_LIST_ITEMS (line 4400) | const SELECTOR_LIST_ITEMS = '.list-group-item';
constant SELECTOR_LINK_ITEMS (line 4401) | const SELECTOR_LINK_ITEMS = `${SELECTOR_NAV_LINKS}, ${SELECTOR_NAV_ITEMS...
constant SELECTOR_DROPDOWN (line 4402) | const SELECTOR_DROPDOWN = '.dropdown';
class ScrollSpy (line 4424) | class ScrollSpy extends BaseComponent {
method constructor (line 4425) | constructor(element, config) {
method Default (line 4441) | static get Default() {
method DefaultType (line 4445) | static get DefaultType() {
method NAME (line 4449) | static get NAME() {
method refresh (line 4454) | refresh() {
method dispose (line 4470) | dispose() {
method _configAfterMerge (line 4477) | _configAfterMerge(config) {
method _maybeEnableSmoothScroll (line 4490) | _maybeEnableSmoothScroll() {
method _getNewObserver (line 4519) | _getNewObserver() {
method _observerCallback (line 4529) | _observerCallback(entries) {
method _initializeTargetsAndObservables (line 4570) | _initializeTargetsAndObservables() {
method _process (line 4591) | _process(target) {
method _activateParents (line 4608) | _activateParents(target) {
method _clearActiveClass (line 4624) | _clearActiveClass(parent) {
method jQueryInterface (line 4634) | static jQueryInterface(config) {
constant EVENT_CLICK_DATA_API (line 4684) | const EVENT_CLICK_DATA_API = `click${EVENT_KEY$1}`;
constant EVENT_KEYDOWN (line 4685) | const EVENT_KEYDOWN = `keydown${EVENT_KEY$1}`;
constant EVENT_LOAD_DATA_API (line 4686) | const EVENT_LOAD_DATA_API = `load${EVENT_KEY$1}`;
constant ARROW_LEFT_KEY (line 4687) | const ARROW_LEFT_KEY = 'ArrowLeft';
constant ARROW_RIGHT_KEY (line 4688) | const ARROW_RIGHT_KEY = 'ArrowRight';
constant ARROW_UP_KEY (line 4689) | const ARROW_UP_KEY = 'ArrowUp';
constant ARROW_DOWN_KEY (line 4690) | const ARROW_DOWN_KEY = 'ArrowDown';
constant CLASS_NAME_ACTIVE (line 4691) | const CLASS_NAME_ACTIVE = 'active';
constant CLASS_DROPDOWN (line 4694) | const CLASS_DROPDOWN = 'dropdown';
constant SELECTOR_DROPDOWN_TOGGLE (line 4695) | const SELECTOR_DROPDOWN_TOGGLE = '.dropdown-toggle';
constant SELECTOR_DROPDOWN_MENU (line 4696) | const SELECTOR_DROPDOWN_MENU = '.dropdown-menu';
constant NOT_SELECTOR_DROPDOWN_TOGGLE (line 4697) | const NOT_SELECTOR_DROPDOWN_TOGGLE = ':not(.dropdown-toggle)';
constant SELECTOR_TAB_PANEL (line 4698) | const SELECTOR_TAB_PANEL = '.list-group, .nav, [role="tablist"]';
constant SELECTOR_OUTER (line 4699) | const SELECTOR_OUTER = '.nav-item, .list-group-item';
constant SELECTOR_INNER (line 4700) | const SELECTOR_INNER = `.nav-link${NOT_SELECTOR_DROPDOWN_TOGGLE}, .list-...
constant SELECTOR_DATA_TOGGLE (line 4701) | const SELECTOR_DATA_TOGGLE = '[data-bs-toggle="tab"], [data-bs-toggle="p...
constant SELECTOR_INNER_ELEM (line 4703) | const SELECTOR_INNER_ELEM = `${SELECTOR_INNER}, ${SELECTOR_DATA_TOGGLE}`;
constant SELECTOR_DATA_TOGGLE_ACTIVE (line 4704) | const SELECTOR_DATA_TOGGLE_ACTIVE = `.${CLASS_NAME_ACTIVE}[data-bs-toggl...
class Tab (line 4709) | class Tab extends BaseComponent {
method constructor (line 4710) | constructor(element) {
method NAME (line 4726) | static get NAME() {
method show (line 4731) | show() {
method _activate (line 4759) | _activate(element, relatedElem) {
method _deactivate (line 4788) | _deactivate(element, relatedElem) {
method _keydown (line 4818) | _keydown(event) {
method _getChildren (line 4837) | _getChildren() {
method _getActiveElem (line 4842) | _getActiveElem() {
method _setInitialAttributes (line 4846) | _setInitialAttributes(parent, children) {
method _setInitialAttributesOnChild (line 4854) | _setInitialAttributesOnChild(child) {
method _setInitialAttributesOnTargetPanel (line 4877) | _setInitialAttributesOnTargetPanel(child) {
method _toggleDropDown (line 4891) | _toggleDropDown(element, open) {
method _setAttributeIfNotExists (line 4911) | _setAttributeIfNotExists(element, attribute, value) {
method _elemIsActive (line 4917) | _elemIsActive(elem) {
method _getInnerElement (line 4922) | _getInnerElement(elem) {
method _getOuterElement (line 4927) | _getOuterElement(elem) {
method jQueryInterface (line 4932) | static jQueryInterface(config) {
constant NAME (line 4990) | const NAME = 'toast';
constant DATA_KEY (line 4991) | const DATA_KEY = 'bs.toast';
constant EVENT_KEY (line 4992) | const EVENT_KEY = `.${DATA_KEY}`;
constant EVENT_MOUSEOVER (line 4993) | const EVENT_MOUSEOVER = `mouseover${EVENT_KEY}`;
constant EVENT_MOUSEOUT (line 4994) | const EVENT_MOUSEOUT = `mouseout${EVENT_KEY}`;
constant EVENT_FOCUSIN (line 4995) | const EVENT_FOCUSIN = `focusin${EVENT_KEY}`;
constant EVENT_FOCUSOUT (line 4996) | const EVENT_FOCUSOUT = `focusout${EVENT_KEY}`;
constant EVENT_HIDE (line 4997) | const EVENT_HIDE = `hide${EVENT_KEY}`;
constant EVENT_HIDDEN (line 4998) | const EVENT_HIDDEN = `hidden${EVENT_KEY}`;
constant EVENT_SHOW (line 4999) | const EVENT_SHOW = `show${EVENT_KEY}`;
constant EVENT_SHOWN (line 5000) | const EVENT_SHOWN = `shown${EVENT_KEY}`;
constant CLASS_NAME_FADE (line 5001) | const CLASS_NAME_FADE = 'fade';
constant CLASS_NAME_HIDE (line 5002) | const CLASS_NAME_HIDE = 'hide';
constant CLASS_NAME_SHOW (line 5004) | const CLASS_NAME_SHOW = 'show';
constant CLASS_NAME_SHOWING (line 5005) | const CLASS_NAME_SHOWING = 'showing';
class Toast (line 5020) | class Toast extends BaseComponent {
method constructor (line 5021) | constructor(element, config) {
method Default (line 5031) | static get Default() {
method DefaultType (line 5035) | static get DefaultType() {
method NAME (line 5039) | static get NAME() {
method show (line 5044) | show() {
method hide (line 5075) | hide() {
method dispose (line 5100) | dispose() {
method isShown (line 5110) | isShown() {
method _maybeScheduleHide (line 5115) | _maybeScheduleHide() {
method _onInteraction (line 5129) | _onInteraction(event, isInteracting) {
method _setListeners (line 5161) | _setListeners() {
method _clearTimeout (line 5168) | _clearTimeout() {
method jQueryInterface (line 5174) | static jQueryInterface(config) {
FILE: src/common/bootstrap/dist/js/bootstrap.js
function _interopNamespace (line 12) | function _interopNamespace(e) {
function makeEventUid (line 372) | function makeEventUid(element, uid) {
function getElementEvents (line 376) | function getElementEvents(element) {
function bootstrapHandler (line 383) | function bootstrapHandler(element, fn) {
function bootstrapDelegationHandler (line 397) | function bootstrapDelegationHandler(element, selector, fn) {
function findHandler (line 423) | function findHandler(events, callable, delegationSelector = null) {
function normalizeParameters (line 427) | function normalizeParameters(originalTypeEvent, handler, delegationFunct...
function addHandler (line 440) | function addHandler(element, originalTypeEvent, handler, delegationFunct...
function removeHandler (line 479) | function removeHandler(element, events, typeEvent, handler, delegationSe...
function removeNamespacedHandlers (line 490) | function removeNamespacedHandlers(element, events, typeEvent, namespace) {
function getTypeEvent (line 501) | function getTypeEvent(event) {
method on (line 508) | on(element, event, handler, delegationFunction) {
method one (line 512) | one(element, event, handler, delegationFunction) {
method off (line 516) | off(element, originalTypeEvent, handler, delegationFunction) {
method trigger (line 553) | trigger(element, event, args) {
function hydrateObj (line 597) | function hydrateObj(obj, meta) {
method set (line 628) | set(element, key, instance) {
method get (line 645) | get(element, key) {
method remove (line 653) | remove(element, key) {
function normalizeData (line 674) | function normalizeData(value) {
function normalizeDataKey (line 702) | function normalizeDataKey(key) {
method setDataAttribute (line 707) | setDataAttribute(element, key, value) {
method removeDataAttribute (line 711) | removeDataAttribute(element, key) {
method getDataAttributes (line 715) | getDataAttributes(element) {
method getDataAttribute (line 732) | getDataAttribute(element, key) {
class Config (line 748) | class Config {
method Default (line 750) | static get Default() {
method DefaultType (line 754) | static get DefaultType() {
method NAME (line 758) | static get NAME() {
method _getConfig (line 762) | _getConfig(config) {
method _configAfterMerge (line 771) | _configAfterMerge(config) {
method _mergeConfigObj (line 775) | _mergeConfigObj(config, element) {
method _typeCheckConfig (line 785) | _typeCheckConfig(config, configTypes = this.constructor.DefaultType) {
class BaseComponent (line 814) | class BaseComponent extends Config {
method constructor (line 815) | constructor(element, config) {
method dispose (line 829) | dispose() {
method _queueCallback (line 838) | _queueCallback(callback, element, isAnimated = true) {
method _getConfig (line 842) | _getConfig(config) {
method getInstance (line 852) | static getInstance(element) {
method getOrCreateInstance (line 856) | static getOrCreateInstance(element, config = {}) {
method VERSION (line 860) | static get VERSION() {
method DATA_KEY (line 864) | static get DATA_KEY() {
method EVENT_KEY (line 868) | static get EVENT_KEY() {
method eventName (line 872) | static eventName(name) {
class Alert (line 925) | class Alert extends BaseComponent {
method NAME (line 927) | static get NAME() {
method close (line 932) | close() {
method _destroyElement (line 947) | _destroyElement() {
method jQueryInterface (line 955) | static jQueryInterface(config) {
class Button (line 1005) | class Button extends BaseComponent {
method NAME (line 1007) | static get NAME() {
method toggle (line 1012) | toggle() {
method jQueryInterface (line 1018) | static jQueryInterface(config) {
method find (line 1057) | find(selector, element = document.documentElement) {
method findOne (line 1061) | findOne(selector, element = document.documentElement) {
method children (line 1065) | children(element, selector) {
method parents (line 1069) | parents(element, selector) {
method prev (line 1081) | prev(element, selector) {
method next (line 1096) | next(element, selector) {
method focusableChildren (line 1110) | focusableChildren(element) {
class Swipe (line 1152) | class Swipe extends Config {
method constructor (line 1153) | constructor(element, config) {
method Default (line 1169) | static get Default() {
method DefaultType (line 1173) | static get DefaultType() {
method NAME (line 1177) | static get NAME() {
method dispose (line 1182) | dispose() {
method _start (line 1187) | _start(event) {
method _end (line 1198) | _end(event) {
method _move (line 1208) | _move(event) {
method _handleSwipe (line 1212) | _handleSwipe() {
method _initEvents (line 1229) | _initEvents() {
method _eventIsPointerPenTouch (line 1242) | _eventIsPointerPenTouch(event) {
method isSupported (line 1247) | static isSupported() {
class Carousel (line 1322) | class Carousel extends BaseComponent {
method constructor (line 1323) | constructor(element, config) {
method Default (line 1340) | static get Default() {
method DefaultType (line 1344) | static get DefaultType() {
method NAME (line 1348) | static get NAME() {
method next (line 1353) | next() {
method nextWhenVisible (line 1357) | nextWhenVisible() {
method prev (line 1366) | prev() {
method pause (line 1370) | pause() {
method cycle (line 1378) | cycle() {
method _maybeEnableCycle (line 1386) | _maybeEnableCycle() {
method to (line 1399) | to(index) {
method dispose (line 1422) | dispose() {
method _configAfterMerge (line 1431) | _configAfterMerge(config) {
method _addEventListeners (line 1436) | _addEventListeners() {
method _addTouchEventListeners (line 1451) | _addTouchEventListeners() {
method _keydown (line 1485) | _keydown(event) {
method _getItemIndex (line 1499) | _getItemIndex(element) {
method _setActiveIndicatorElement (line 1503) | _setActiveIndicatorElement(index) {
method _updateInterval (line 1519) | _updateInterval() {
method _slide (line 1530) | _slide(order, element = null) {
method _isAnimated (line 1596) | _isAnimated() {
method _getActive (line 1600) | _getActive() {
method _getItems (line 1604) | _getItems() {
method _clearInterval (line 1608) | _clearInterval() {
method _directionToOrder (line 1615) | _directionToOrder(direction) {
method _orderToDirection (line 1623) | _orderToDirection(order) {
method jQueryInterface (line 1632) | static jQueryInterface(config) {
class Collapse (line 1742) | class Collapse extends BaseComponent {
method constructor (line 1743) | constructor(element, config) {
method Default (line 1770) | static get Default() {
method DefaultType (line 1774) | static get DefaultType() {
method NAME (line 1778) | static get NAME() {
method toggle (line 1783) | toggle() {
method show (line 1791) | show() {
method hide (line 1849) | hide() {
method _isShown (line 1894) | _isShown(element = this._element) {
method _configAfterMerge (line 1899) | _configAfterMerge(config) {
method _getDimension (line 1906) | _getDimension() {
method _initializeChildren (line 1910) | _initializeChildren() {
method _getFirstLevelChildren (line 1926) | _getFirstLevelChildren(selector) {
method _addAriaAndCollapsedClass (line 1932) | _addAriaAndCollapsedClass(triggerArray, isOpen) {
method jQueryInterface (line 1944) | static jQueryInterface(config) {
class Dropdown (line 2058) | class Dropdown extends BaseComponent {
method constructor (line 2059) | constructor(element, config) {
method Default (line 2070) | static get Default() {
method DefaultType (line 2074) | static get DefaultType() {
method NAME (line 2078) | static get NAME() {
method toggle (line 2083) | toggle() {
method show (line 2087) | show() {
method hide (line 2124) | hide() {
method dispose (line 2136) | dispose() {
method update (line 2144) | update() {
method _completeHide (line 2153) | _completeHide(relatedTarget) {
method _getConfig (line 2182) | _getConfig(config) {
method _createPopper (line 2193) | _createPopper() {
method _isShown (line 2213) | _isShown() {
method _getPlacement (line 2217) | _getPlacement() {
method _detectNavbar (line 2246) | _detectNavbar() {
method _getOffset (line 2250) | _getOffset() {
method _getPopperConfig (line 2266) | _getPopperConfig() {
method _selectMenuItem (line 2296) | _selectMenuItem({
method jQueryInterface (line 2312) | static jQueryInterface(config) {
method clearMenus (line 2328) | static clearMenus(event) {
method dataApiKeydownHandler (line 2366) | static dataApiKeydownHandler(event) {
class ScrollBarHelper (line 2441) | class ScrollBarHelper {
method constructor (line 2442) | constructor() {
method getWidth (line 2447) | getWidth() {
method hide (line 2453) | hide() {
method reset (line 2467) | reset() {
method isOverflowing (line 2477) | isOverflowing() {
method _disableOverFlow (line 2482) | _disableOverFlow() {
method _setElementAttributes (line 2488) | _setElementAttributes(selector, styleProperty, callback) {
method _saveInitialAttribute (line 2505) | _saveInitialAttribute(element, styleProperty) {
method _resetElementAttributes (line 2513) | _resetElementAttributes(selector, styleProperty) {
method _applyManipulationCallback (line 2529) | _applyManipulationCallback(selector, callBack) {
class Backdrop (line 2576) | class Backdrop extends Config {
method constructor (line 2577) | constructor(config) {
method Default (line 2585) | static get Default() {
method DefaultType (line 2589) | static get DefaultType() {
method NAME (line 2593) | static get NAME() {
method show (line 2598) | show(callback) {
method hide (line 2619) | hide(callback) {
method dispose (line 2633) | dispose() {
method _getElement (line 2646) | _getElement() {
method _configAfterMerge (line 2661) | _configAfterMerge(config) {
method _append (line 2667) | _append() {
method _emulateAnimation (line 2682) | _emulateAnimation(callback) {
class FocusTrap (line 2719) | class FocusTrap extends Config {
method constructor (line 2720) | constructor(config) {
method Default (line 2728) | static get Default() {
method DefaultType (line 2732) | static get DefaultType() {
method NAME (line 2736) | static get NAME() {
method activate (line 2741) | activate() {
method deactivate (line 2757) | deactivate() {
method _handleFocusin (line 2767) | _handleFocusin(event) {
method _handleKeydown (line 2787) | _handleKeydown(event) {
class Modal (line 2844) | class Modal extends BaseComponent {
method constructor (line 2845) | constructor(element, config) {
method Default (line 2858) | static get Default() {
method DefaultType (line 2862) | static get DefaultType() {
method NAME (line 2866) | static get NAME() {
method toggle (line 2871) | toggle(relatedTarget) {
method show (line 2875) | show(relatedTarget) {
method hide (line 2900) | hide() {
method dispose (line 2921) | dispose() {
method handleUpdate (line 2933) | handleUpdate() {
method _initializeBackDrop (line 2938) | _initializeBackDrop() {
method _initializeFocusTrap (line 2946) | _initializeFocusTrap() {
method _showElement (line 2952) | _showElement(relatedTarget) {
method _addEventListeners (line 2991) | _addEventListeners() {
method _hideModal (line 3030) | _hideModal() {
method _isAnimated (line 3052) | _isAnimated() {
method _triggerBackdropTransition (line 3056) | _triggerBackdropTransition() {
method _adjustDialog (line 3091) | _adjustDialog() {
method _resetAdjustments (line 3109) | _resetAdjustments() {
method jQueryInterface (line 3115) | static jQueryInterface(config, relatedTarget) {
class Offcanvas (line 3217) | class Offcanvas extends BaseComponent {
method constructor (line 3218) | constructor(element, config) {
method Default (line 3228) | static get Default() {
method DefaultType (line 3232) | static get DefaultType() {
method NAME (line 3236) | static get NAME() {
method toggle (line 3241) | toggle(relatedTarget) {
method show (line 3245) | show(relatedTarget) {
method hide (line 3289) | hide() {
method dispose (line 3327) | dispose() {
method _initializeBackDrop (line 3336) | _initializeBackDrop() {
method _initializeFocusTrap (line 3357) | _initializeFocusTrap() {
method _addEventListeners (line 3363) | _addEventListeners() {
method jQueryInterface (line 3379) | static jQueryInterface(config) {
function sanitizeHtml (line 3518) | function sanitizeHtml(unsafeHtml, allowList, sanitizeFunction) {
class TemplateFactory (line 3590) | class TemplateFactory extends Config {
method constructor (line 3591) | constructor(config) {
method Default (line 3597) | static get Default() {
method DefaultType (line 3601) | static get DefaultType() {
method NAME (line 3605) | static get NAME() {
method getContent (line 3610) | getContent() {
method hasContent (line 3614) | hasContent() {
method changeContent (line 3618) | changeContent(content) {
method toHtml (line 3627) | toHtml() {
method _typeCheckConfig (line 3647) | _typeCheckConfig(config) {
method _checkContent (line 3653) | _checkContent(arg) {
method _setContent (line 3662) | _setContent(template, content, selector) {
method _maybeSanitize (line 3690) | _maybeSanitize(arg) {
method _resolvePossibleFunction (line 3694) | _resolvePossibleFunction(arg) {
method _putElementInTemplate (line 3698) | _putElementInTemplate(element, templateElement) {
class Tooltip (line 3791) | class Tooltip extends BaseComponent {
method constructor (line 3792) | constructor(element, config) {
method Default (line 3817) | static get Default() {
method DefaultType (line 3821) | static get DefaultType() {
method NAME (line 3825) | static get NAME() {
method enable (line 3830) | enable() {
method disable (line 3834) | disable() {
method toggleEnabled (line 3838) | toggleEnabled() {
method toggle (line 3842) | toggle() {
method dispose (line 3858) | dispose() {
method show (line 3871) | show() {
method hide (line 3930) | hide() {
method update (line 3974) | update() {
method _isWithContent (line 3981) | _isWithContent() {
method _getTipElement (line 3985) | _getTipElement() {
method _createTipElement (line 3993) | _createTipElement(content) {
method setContent (line 4014) | setContent(content) {
method _getTemplateFactory (line 4024) | _getTemplateFactory(content) {
method _getContentForTemplate (line 4039) | _getContentForTemplate() {
method _getTitle (line 4045) | _getTitle() {
method _initializeOnDelegatedTarget (line 4050) | _initializeOnDelegatedTarget(event) {
method _isAnimated (line 4054) | _isAnimated() {
method _isShown (line 4058) | _isShown() {
method _createPopper (line 4062) | _createPopper(tip) {
method _getOffset (line 4068) | _getOffset() {
method _resolvePossibleFunction (line 4084) | _resolvePossibleFunction(arg) {
method _getPopperConfig (line 4088) | _getPopperConfig(attachment) {
method _setListeners (line 4127) | _setListeners() {
method _fixTitle (line 4166) | _fixTitle() {
method _enter (line 4183) | _enter() {
method _leave (line 4198) | _leave() {
method _setTimeout (line 4212) | _setTimeout(handler, timeout) {
method _isWithActiveTrigger (line 4217) | _isWithActiveTrigger() {
method _getConfig (line 4221) | _getConfig(config) {
method _configAfterMerge (line 4241) | _configAfterMerge(config) {
method _getDelegateConfig (line 4262) | _getDelegateConfig() {
method _disposePopper (line 4279) | _disposePopper() {
method jQueryInterface (line 4293) | static jQueryInterface(config) {
class Popover (line 4344) | class Popover extends Tooltip {
method Default (line 4346) | static get Default() {
method DefaultType (line 4350) | static get DefaultType() {
method NAME (line 4354) | static get NAME() {
method _isWithContent (line 4359) | _isWithContent() {
method _getContentForTemplate (line 4364) | _getContentForTemplate() {
method _getContent (line 4371) | _getContent() {
method jQueryInterface (line 4376) | static jQueryInterface(config) {
class ScrollSpy (line 4448) | class ScrollSpy extends BaseComponent {
method constructor (line 4449) | constructor(element, config) {
method Default (line 4465) | static get Default() {
method DefaultType (line 4469) | static get DefaultType() {
method NAME (line 4473) | static get NAME() {
method refresh (line 4478) | refresh() {
method dispose (line 4494) | dispose() {
method _configAfterMerge (line 4501) | _configAfterMerge(config) {
method _maybeEnableSmoothScroll (line 4514) | _maybeEnableSmoothScroll() {
method _getNewObserver (line 4543) | _getNewObserver() {
method _observerCallback (line 4553) | _observerCallback(entries) {
method _initializeTargetsAndObservables (line 4594) | _initializeTargetsAndObservables() {
method _process (line 4615) | _process(target) {
method _activateParents (line 4632) | _activateParents(target) {
method _clearActiveClass (line 4648) | _clearActiveClass(parent) {
method jQueryInterface (line 4658) | static jQueryInterface(config) {
class Tab (line 4733) | class Tab extends BaseComponent {
method constructor (line 4734) | constructor(element) {
method NAME (line 4750) | static get NAME() {
method show (line 4755) | show() {
method _activate (line 4783) | _activate(element, relatedElem) {
method _deactivate (line 4812) | _deactivate(element, relatedElem) {
method _keydown (line 4842) | _keydown(event) {
method _getChildren (line 4861) | _getChildren() {
method _getActiveElem (line 4866) | _getActiveElem() {
method _setInitialAttributes (line 4870) | _setInitialAttributes(parent, children) {
method _setInitialAttributesOnChild (line 4878) | _setInitialAttributesOnChild(child) {
method _setInitialAttributesOnTargetPanel (line 4901) | _setInitialAttributesOnTargetPanel(child) {
method _toggleDropDown (line 4915) | _toggleDropDown(element, open) {
method _setAttributeIfNotExists (line 4935) | _setAttributeIfNotExists(element, attribute, value) {
method _elemIsActive (line 4941) | _elemIsActive(elem) {
method _getInnerElement (line 4946) | _getInnerElement(elem) {
method _getOuterElement (line 4951) | _getOuterElement(elem) {
method jQueryInterface (line 4956) | static jQueryInterface(config) {
class Toast (line 5044) | class Toast extends BaseComponent {
method constructor (line 5045) | constructor(element, config) {
method Default (line 5055) | static get Default() {
method DefaultType (line 5059) | static get DefaultType() {
method NAME (line 5063) | static get NAME() {
method show (line 5068) | show() {
method hide (line 5099) | hide() {
method dispose (line 5124) | dispose() {
method isShown (line 5134) | isShown() {
method _maybeScheduleHide (line 5139) | _maybeScheduleHide() {
method _onInteraction (line 5153) | _onInteraction(event, isInteracting) {
method _setListeners (line 5185) | _setListeners() {
method _clearTimeout (line 5192) | _clearTimeout() {
method jQueryInterface (line 5198) | static jQueryInterface(config) {
FILE: src/common/bootstrap/js/dist/alert.js
class Alert (line 38) | class Alert extends BaseComponent__default.default {
method NAME (line 40) | static get NAME() {
method close (line 45) | close() {
method _destroyElement (line 60) | _destroyElement() {
method jQueryInterface (line 68) | static jQueryInterface(config) {
FILE: src/common/bootstrap/js/dist/base-component.js
class BaseComponent (line 33) | class BaseComponent extends Config__default.default {
method constructor (line 34) | constructor(element, config) {
method dispose (line 48) | dispose() {
method _queueCallback (line 57) | _queueCallback(callback, element, isAnimated = true) {
method _getConfig (line 61) | _getConfig(config) {
method getInstance (line 71) | static getInstance(element) {
method getOrCreateInstance (line 75) | static getOrCreateInstance(element, config = {}) {
method VERSION (line 79) | static get VERSION() {
method DATA_KEY (line 83) | static get DATA_KEY() {
method EVENT_KEY (line 87) | static get EVENT_KEY() {
method eventName (line 91) | static eventName(name) {
FILE: src/common/bootstrap/js/dist/button.js
class Button (line 38) | class Button extends BaseComponent__default.default {
method NAME (line 40) | static get NAME() {
method toggle (line 45) | toggle() {
method jQueryInterface (line 51) | static jQueryInterface(config) {
FILE: src/common/bootstrap/js/dist/carousel.js
class Carousel (line 89) | class Carousel extends BaseComponent__default.default {
method constructor (line 90) | constructor(element, config) {
method Default (line 107) | static get Default() {
method DefaultType (line 111) | static get DefaultType() {
method NAME (line 115) | static get NAME() {
method next (line 120) | next() {
method nextWhenVisible (line 124) | nextWhenVisible() {
method prev (line 133) | prev() {
method pause (line 137) | pause() {
method cycle (line 145) | cycle() {
method _maybeEnableCycle (line 153) | _maybeEnableCycle() {
method to (line 166) | to(index) {
method dispose (line 189) | dispose() {
method _configAfterMerge (line 198) | _configAfterMerge(config) {
method _addEventListeners (line 203) | _addEventListeners() {
method _addTouchEventListeners (line 218) | _addTouchEventListeners() {
method _keydown (line 252) | _keydown(event) {
method _getItemIndex (line 266) | _getItemIndex(element) {
method _setActiveIndicatorElement (line 270) | _setActiveIndicatorElement(index) {
method _updateInterval (line 286) | _updateInterval() {
method _slide (line 297) | _slide(order, element = null) {
method _isAnimated (line 363) | _isAnimated() {
method _getActive (line 367) | _getActive() {
method _getItems (line 371) | _getItems() {
method _clearInterval (line 375) | _clearInterval() {
method _directionToOrder (line 382) | _directionToOrder(direction) {
method _orderToDirection (line 390) | _orderToDirection(order) {
method jQueryInterface (line 399) | static jQueryInterface(config) {
FILE: src/common/bootstrap/js/dist/collapse.js
class Collapse (line 59) | class Collapse extends BaseComponent__default.default {
method constructor (line 60) | constructor(element, config) {
method Default (line 87) | static get Default() {
method DefaultType (line 91) | static get DefaultType() {
method NAME (line 95) | static get NAME() {
method toggle (line 100) | toggle() {
method show (line 108) | show() {
method hide (line 166) | hide() {
method _isShown (line 211) | _isShown(element = this._element) {
method _configAfterMerge (line 216) | _configAfterMerge(config) {
method _getDimension (line 223) | _getDimension() {
method _initializeChildren (line 227) | _initializeChildren() {
method _getFirstLevelChildren (line 243) | _getFirstLevelChildren(selector) {
method _addAriaAndCollapsedClass (line 249) | _addAriaAndCollapsedClass(triggerArray, isOpen) {
method jQueryInterface (line 261) | static jQueryInterface(config) {
FILE: src/common/bootstrap/js/dist/dom/data.js
method set (line 24) | set(element, key, instance) {
method get (line 41) | get(element, key) {
method remove (line 49) | remove(element, key) {
FILE: src/common/bootstrap/js/dist/dom/event-handler.js
function makeEventUid (line 37) | function makeEventUid(element, uid) {
function getElementEvents (line 41) | function getElementEvents(element) {
function bootstrapHandler (line 48) | function bootstrapHandler(element, fn) {
function bootstrapDelegationHandler (line 62) | function bootstrapDelegationHandler(element, selector, fn) {
function findHandler (line 88) | function findHandler(events, callable, delegationSelector = null) {
function normalizeParameters (line 92) | function normalizeParameters(originalTypeEvent, handler, delegationFunct...
function addHandler (line 105) | function addHandler(element, originalTypeEvent, handler, delegationFunct...
function removeHandler (line 144) | function removeHandler(element, events, typeEvent, handler, delegationSe...
function removeNamespacedHandlers (line 155) | function removeNamespacedHandlers(element, events, typeEvent, namespace) {
function getTypeEvent (line 166) | function getTypeEvent(event) {
method on (line 173) | on(element, event, handler, delegationFunction) {
method one (line 177) | one(element, event, handler, delegationFunction) {
method off (line 181) | off(element, originalTypeEvent, handler, delegationFunction) {
method trigger (line 218) | trigger(element, event, args) {
function hydrateObj (line 262) | function hydrateObj(obj, meta) {
FILE: src/common/bootstrap/js/dist/dom/manipulator.js
function normalizeData (line 18) | function normalizeData(value) {
function normalizeDataKey (line 46) | function normalizeDataKey(key) {
method setDataAttribute (line 51) | setDataAttribute(element, key, value) {
method removeDataAttribute (line 55) | removeDataAttribute(element, key) {
method getDataAttributes (line 59) | getDataAttributes(element) {
method getDataAttribute (line 76) | getDataAttribute(element, key) {
FILE: src/common/bootstrap/js/dist/dom/selector-engine.js
method find (line 23) | find(selector, element = document.documentElement) {
method findOne (line 27) | findOne(selector, element = document.documentElement) {
method children (line 31) | children(element, selector) {
method parents (line 35) | parents(element, selector) {
method prev (line 47) | prev(element, selector) {
method next (line 62) | next(element, selector) {
method focusableChildren (line 76) | focusableChildren(element) {
FILE: src/common/bootstrap/js/dist/dropdown.js
function _interopNamespace (line 14) | function _interopNamespace(e) {
class Dropdown (line 105) | class Dropdown extends BaseComponent__default.default {
method constructor (line 106) | constructor(element, config) {
method Default (line 117) | static get Default() {
method DefaultType (line 121) | static get DefaultType() {
method NAME (line 125) | static get NAME() {
method toggle (line 130) | toggle() {
method show (line 134) | show() {
method hide (line 171) | hide() {
method dispose (line 183) | dispose() {
method update (line 191) | update() {
method _completeHide (line 200) | _completeHide(relatedTarget) {
method _getConfig (line 229) | _getConfig(config) {
method _createPopper (line 240) | _createPopper() {
method _isShown (line 260) | _isShown() {
method _getPlacement (line 264) | _getPlacement() {
method _detectNavbar (line 293) | _detectNavbar() {
method _getOffset (line 297) | _getOffset() {
method _getPopperConfig (line 313) | _getPopperConfig() {
method _selectMenuItem (line 343) | _selectMenuItem({
method jQueryInterface (line 359) | static jQueryInterface(config) {
method clearMenus (line 375) | static clearMenus(event) {
method dataApiKeydownHandler (line 413) | static dataApiKeydownHandler(event) {
FILE: src/common/bootstrap/js/dist/modal.js
class Modal (line 68) | class Modal extends BaseComponent__default.default {
method constructor (line 69) | constructor(element, config) {
method Default (line 82) | static get Default() {
method DefaultType (line 86) | static get DefaultType() {
method NAME (line 90) | static get NAME() {
method toggle (line 95) | toggle(relatedTarget) {
method show (line 99) | show(relatedTarget) {
method hide (line 124) | hide() {
method dispose (line 145) | dispose() {
method handleUpdate (line 157) | handleUpdate() {
method _initializeBackDrop (line 162) | _initializeBackDrop() {
method _initializeFocusTrap (line 170) | _initializeFocusTrap() {
method _showElement (line 176) | _showElement(relatedTarget) {
method _addEventListeners (line 215) | _addEventListeners() {
method _hideModal (line 254) | _hideModal() {
method _isAnimated (line 276) | _isAnimated() {
method _triggerBackdropTransition (line 280) | _triggerBackdropTransition() {
method _adjustDialog (line 315) | _adjustDialog() {
method _resetAdjustments (line 333) | _resetAdjustments() {
method jQueryInterface (line 339) | static jQueryInterface(config, relatedTarget) {
FILE: src/common/bootstrap/js/dist/offcanvas.js
class Offcanvas (line 65) | class Offcanvas extends BaseComponent__default.default {
method constructor (line 66) | constructor(element, config) {
method Default (line 76) | static get Default() {
method DefaultType (line 80) | static get DefaultType() {
method NAME (line 84) | static get NAME() {
method toggle (line 89) | toggle(relatedTarget) {
method show (line 93) | show(relatedTarget) {
method hide (line 137) | hide() {
method dispose (line 175) | dispose() {
method _initializeBackDrop (line 184) | _initializeBackDrop() {
method _initializeFocusTrap (line 205) | _initializeFocusTrap() {
method _addEventListeners (line 211) | _addEventListeners() {
method jQueryInterface (line 227) | static jQueryInterface(config) {
FILE: src/common/bootstrap/js/dist/popover.js
class Popover (line 43) | class Popover extends Tooltip__default.default {
method Default (line 45) | static get Default() {
method DefaultType (line 49) | static get DefaultType() {
method NAME (line 53) | static get NAME() {
method _isWithContent (line 58) | _isWithContent() {
method _getContentForTemplate (line 63) | _getContentForTemplate() {
method _getContent (line 70) | _getContent() {
method jQueryInterface (line 75) | static jQueryInterface(config) {
FILE: src/common/bootstrap/js/dist/scrollspy.js
class ScrollSpy (line 66) | class ScrollSpy extends BaseComponent__default.default {
method constructor (line 67) | constructor(element, config) {
method Default (line 83) | static get Default() {
method DefaultType (line 87) | static get DefaultType() {
method NAME (line 91) | static get NAME() {
method refresh (line 96) | refresh() {
method dispose (line 112) | dispose() {
method _configAfterMerge (line 119) | _configAfterMerge(config) {
method _maybeEnableSmoothScroll (line 132) | _maybeEnableSmoothScroll() {
method _getNewObserver (line 161) | _getNewObserver() {
method _observerCallback (line 171) | _observerCallback(entries) {
method _initializeTargetsAndObservables (line 212) | _initializeTargetsAndObservables() {
method _process (line 233) | _process(target) {
method _activateParents (line 250) | _activateParents(target) {
method _clearActiveClass (line 266) | _clearActiveClass(parent) {
method jQueryInterface (line 276) | static jQueryInterface(config) {
FILE: src/common/bootstrap/js/dist/tab.js
class Tab (line 60) | class Tab extends BaseComponent__default.default {
method constructor (line 61) | constructor(element) {
method NAME (line 77) | static get NAME() {
method show (line 82) | show() {
method _activate (line 110) | _activate(element, relatedElem) {
method _deactivate (line 139) | _deactivate(element, relatedElem) {
method _keydown (line 169) | _keydown(event) {
method _getChildren (line 188) | _getChildren() {
method _getActiveElem (line 193) | _getActiveElem() {
method _setInitialAttributes (line 197) | _setInitialAttributes(parent, children) {
method _setInitialAttributesOnChild (line 205) | _setInitialAttributesOnChild(child) {
method _setInitialAttributesOnTargetPanel (line 228) | _setInitialAttributesOnTargetPanel(child) {
method _toggleDropDown (line 242) | _toggleDropDown(element, open) {
method _setAttributeIfNotExists (line 262) | _setAttributeIfNotExists(element, attribute, value) {
method _elemIsActive (line 268) | _elemIsActive(elem) {
method _getInnerElement (line 273) | _getInnerElement(elem) {
method _getOuterElement (line 278) | _getOuterElement(elem) {
method jQueryInterface (line 283) | static jQueryInterface(config) {
FILE: src/common/bootstrap/js/dist/toast.js
class Toast (line 57) | class Toast extends BaseComponent__default.default {
method constructor (line 58) | constructor(element, config) {
method Default (line 68) | static get Default() {
method DefaultType (line 72) | static get DefaultType() {
method NAME (line 76) | static get NAME() {
method show (line 81) | show() {
method hide (line 112) | hide() {
method dispose (line 137) | dispose() {
method isShown (line 147) | isShown() {
method _maybeScheduleHide (line 152) | _maybeScheduleHide() {
method _onInteraction (line 166) | _onInteraction(event, isInteracting) {
method _setListeners (line 198) | _setListeners() {
method _clearTimeout (line 205) | _clearTimeout() {
method jQueryInterface (line 211) | static jQueryInterface(config) {
FILE: src/common/bootstrap/js/dist/tooltip.js
function _interopNamespace (line 14) | function _interopNamespace(e) {
class Tooltip (line 119) | class Tooltip extends BaseComponent__default.default {
method constructor (line 120) | constructor(element, config) {
method Default (line 145) | static get Default() {
method DefaultType (line 149) | static get DefaultType() {
method NAME (line 153) | static get NAME() {
method enable (line 158) | enable() {
method disable (line 162) | disable() {
method toggleEnabled (line 166) | toggleEnabled() {
method toggle (line 170) | toggle() {
method dispose (line 186) | dispose() {
method show (line 199) | show() {
method hide (line 258) | hide() {
method update (line 302) | update() {
method _isWithContent (line 309) | _isWithContent() {
method _getTipElement (line 313) | _getTipElement() {
method _createTipElement (line 321) | _createTipElement(content) {
method setContent (line 342) | setContent(content) {
method _getTemplateFactory (line 352) | _getTemplateFactory(content) {
method _getContentForTemplate (line 367) | _getContentForTemplate() {
method _getTitle (line 373) | _getTitle() {
method _initializeOnDelegatedTarget (line 378) | _initializeOnDelegatedTarget(event) {
method _isAnimated (line 382) | _isAnimated() {
method _isShown (line 386) | _isShown() {
method _createPopper (line 390) | _createPopper(tip) {
method _getOffset (line 396) | _getOffset() {
method _resolvePossibleFunction (line 412) | _resolvePossibleFunction(arg) {
method _getPopperConfig (line 416) | _getPopperConfig(attachment) {
method _setListeners (line 455) | _setListeners() {
method _fixTitle (line 494) | _fixTitle() {
method _enter (line 511) | _enter() {
method _leave (line 526) | _leave() {
method _setTimeout (line 540) | _setTimeout(handler, timeout) {
method _isWithActiveTrigger (line 545) | _isWithActiveTrigger() {
method _getConfig (line 549) | _getConfig(config) {
method _configAfterMerge (line 569) | _configAfterMerge(config) {
method _getDelegateConfig (line 590) | _getDelegateConfig() {
method _disposePopper (line 607) | _disposePopper() {
method jQueryInterface (line 621) | static jQueryInterface(config) {
FILE: src/common/bootstrap/js/dist/util/backdrop.js
class Backdrop (line 51) | class Backdrop extends Config__default.default {
method constructor (line 52) | constructor(config) {
method Default (line 60) | static get Default() {
method DefaultType (line 64) | static get DefaultType() {
method NAME (line 68) | static get NAME() {
method show (line 73) | show(callback) {
method hide (line 94) | hide(callback) {
method dispose (line 108) | dispose() {
method _getElement (line 121) | _getElement() {
method _configAfterMerge (line 136) | _configAfterMerge(config) {
method _append (line 142) | _append() {
method _emulateAnimation (line 157) | _emulateAnimation(callback) {
FILE: src/common/bootstrap/js/dist/util/config.js
class Config (line 26) | class Config {
method Default (line 28) | static get Default() {
method DefaultType (line 32) | static get DefaultType() {
method NAME (line 36) | static get NAME() {
method _getConfig (line 40) | _getConfig(config) {
method _configAfterMerge (line 49) | _configAfterMerge(config) {
method _mergeConfigObj (line 53) | _mergeConfigObj(config, element) {
method _typeCheckConfig (line 63) | _typeCheckConfig(config, configTypes = this.constructor.DefaultType) {
FILE: src/common/bootstrap/js/dist/util/focustrap.js
class FocusTrap (line 49) | class FocusTrap extends Config__default.default {
method constructor (line 50) | constructor(config) {
method Default (line 58) | static get Default() {
method DefaultType (line 62) | static get DefaultType() {
method NAME (line 66) | static get NAME() {
method activate (line 71) | activate() {
method deactivate (line 87) | deactivate() {
method _handleFocusin (line 97) | _handleFocusin(event) {
method _handleKeydown (line 117) | _handleKeydown(event) {
FILE: src/common/bootstrap/js/dist/util/sanitizer.js
function sanitizeHtml (line 83) | function sanitizeHtml(unsafeHtml, allowList, sanitizeFunction) {
FILE: src/common/bootstrap/js/dist/util/scrollbar.js
class ScrollBarHelper (line 35) | class ScrollBarHelper {
method constructor (line 36) | constructor() {
method getWidth (line 41) | getWidth() {
method hide (line 47) | hide() {
method reset (line 61) | reset() {
method isOverflowing (line 71) | isOverflowing() {
method _disableOverFlow (line 76) | _disableOverFlow() {
method _setElementAttributes (line 82) | _setElementAttributes(selector, styleProperty, callback) {
method _saveInitialAttribute (line 99) | _saveInitialAttribute(element, styleProperty) {
method _resetElementAttributes (line 107) | _resetElementAttributes(selector, styleProperty) {
method _applyManipulationCallback (line 123) | _applyManipulationCallback(selector, callBack) {
FILE: src/common/bootstrap/js/dist/util/swipe.js
class Swipe (line 52) | class Swipe extends Config__default.default {
method constructor (line 53) | constructor(element, config) {
method Default (line 69) | static get Default() {
method DefaultType (line 73) | static get DefaultType() {
method NAME (line 77) | static get NAME() {
method dispose (line 82) | dispose() {
method _start (line 87) | _start(event) {
method _end (line 98) | _end(event) {
method _move (line 108) | _move(event) {
method _handleSwipe (line 112) | _handleSwipe() {
method _initEvents (line 129) | _initEvents() {
method _eventIsPointerPenTouch (line 142) | _eventIsPointerPenTouch(event) {
method isSupported (line 147) | static isSupported() {
FILE: src/common/bootstrap/js/dist/util/template-factory.js
class TemplateFactory (line 55) | class TemplateFactory extends Config__default.default {
method constructor (line 56) | constructor(config) {
method Default (line 62) | static get Default() {
method DefaultType (line 66) | static get DefaultType() {
method NAME (line 70) | static get NAME() {
method getContent (line 75) | getContent() {
method hasContent (line 79) | hasContent() {
method changeContent (line 83) | changeContent(content) {
method toHtml (line 92) | toHtml() {
method _typeCheckConfig (line 112) | _typeCheckConfig(config) {
method _checkContent (line 118) | _checkContent(arg) {
method _setContent (line 127) | _setContent(template, content, selector) {
method _maybeSanitize (line 155) | _maybeSanitize(arg) {
method _resolvePossibleFunction (line 159) | _resolvePossibleFunction(arg) {
method _putElementInTemplate (line 163) | _putElementInTemplate(element, templateElement) {
FILE: src/common/bootstrap/js/src/alert.js
constant NAME (line 17) | const NAME = 'alert'
constant DATA_KEY (line 18) | const DATA_KEY = 'bs.alert'
constant EVENT_KEY (line 19) | const EVENT_KEY = `.${DATA_KEY}`
constant EVENT_CLOSE (line 21) | const EVENT_CLOSE = `close${EVENT_KEY}`
constant EVENT_CLOSED (line 22) | const EVENT_CLOSED = `closed${EVENT_KEY}`
constant CLASS_NAME_FADE (line 23) | const CLASS_NAME_FADE = 'fade'
constant CLASS_NAME_SHOW (line 24) | const CLASS_NAME_SHOW = 'show'
class Alert (line 30) | class Alert extends BaseComponent {
method NAME (line 32) | static get NAME() {
method close (line 37) | close() {
method _destroyElement (line 51) | _destroyElement() {
method jQueryInterface (line 58) | static jQueryInterface(config) {
FILE: src/common/bootstrap/js/src/base-component.js
constant VERSION (line 17) | const VERSION = '5.2.3'
class BaseComponent (line 23) | class BaseComponent extends Config {
method constructor (line 24) | constructor(element, config) {
method dispose (line 39) | dispose() {
method _queueCallback (line 48) | _queueCallback(callback, element, isAnimated = true) {
method _getConfig (line 52) | _getConfig(config) {
method getInstance (line 60) | static getInstance(element) {
method getOrCreateInstance (line 64) | static getOrCreateInstance(element, config = {}) {
method VERSION (line 68) | static get VERSION() {
method DATA_KEY (line 72) | static get DATA_KEY() {
method EVENT_KEY (line 76) | static get EVENT_KEY() {
method eventName (line 80) | static eventName(name) {
FILE: src/common/bootstrap/js/src/button.js
constant NAME (line 16) | const NAME = 'button'
constant DATA_KEY (line 17) | const DATA_KEY = 'bs.button'
constant EVENT_KEY (line 18) | const EVENT_KEY = `.${DATA_KEY}`
constant DATA_API_KEY (line 19) | const DATA_API_KEY = '.data-api'
constant CLASS_NAME_ACTIVE (line 21) | const CLASS_NAME_ACTIVE = 'active'
constant SELECTOR_DATA_TOGGLE (line 22) | const SELECTOR_DATA_TOGGLE = '[data-bs-toggle="button"]'
constant EVENT_CLICK_DATA_API (line 23) | const EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`
class Button (line 29) | class Button extends BaseComponent {
method NAME (line 31) | static get NAME() {
method toggle (line 36) | toggle() {
method jQueryInterface (line 42) | static jQueryInterface(config) {
FILE: src/common/bootstrap/js/src/carousel.js
constant NAME (line 27) | const NAME = 'carousel'
constant DATA_KEY (line 28) | const DATA_KEY = 'bs.carousel'
constant EVENT_KEY (line 29) | const EVENT_KEY = `.${DATA_KEY}`
constant DATA_API_KEY (line 30) | const DATA_API_KEY = '.data-api'
constant ARROW_LEFT_KEY (line 32) | const ARROW_LEFT_KEY = 'ArrowLeft'
constant ARROW_RIGHT_KEY (line 33) | const ARROW_RIGHT_KEY = 'ArrowRight'
constant TOUCHEVENT_COMPAT_WAIT (line 34) | const TOUCHEVENT_COMPAT_WAIT = 500 // Time for mouse compat events to fi...
constant ORDER_NEXT (line 36) | const ORDER_NEXT = 'next'
constant ORDER_PREV (line 37) | const ORDER_PREV = 'prev'
constant DIRECTION_LEFT (line 38) | const DIRECTION_LEFT = 'left'
constant DIRECTION_RIGHT (line 39) | const DIRECTION_RIGHT = 'right'
constant EVENT_SLIDE (line 41) | const EVENT_SLIDE = `slide${EVENT_KEY}`
constant EVENT_SLID (line 42) | const EVENT_SLID = `slid${EVENT_KEY}`
constant EVENT_KEYDOWN (line 43) | const EVENT_KEYDOWN = `keydown${EVENT_KEY}`
constant EVENT_MOUSEENTER (line 44) | const EVENT_MOUSEENTER = `mouseenter${EVENT_KEY}`
constant EVENT_MOUSELEAVE (line 45) | const EVENT_MOUSELEAVE = `mouseleave${EVENT_KEY}`
constant EVENT_DRAG_START (line 46) | const EVENT_DRAG_START = `dragstart${EVENT_KEY}`
constant EVENT_LOAD_DATA_API (line 47) | const EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`
constant EVENT_CLICK_DATA_API (line 48) | const EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`
constant CLASS_NAME_CAROUSEL (line 50) | const CLASS_NAME_CAROUSEL = 'carousel'
constant CLASS_NAME_ACTIVE (line 51) | const CLASS_NAME_ACTIVE = 'active'
constant CLASS_NAME_SLIDE (line 52) | const CLASS_NAME_SLIDE = 'slide'
constant CLASS_NAME_END (line 53) | const CLASS_NAME_END = 'carousel-item-end'
constant CLASS_NAME_START (line 54) | const CLASS_NAME_START = 'carousel-item-start'
constant CLASS_NAME_NEXT (line 55) | const CLASS_NAME_NEXT = 'carousel-item-next'
constant CLASS_NAME_PREV (line 56) | const CLASS_NAME_PREV = 'carousel-item-prev'
constant SELECTOR_ACTIVE (line 58) | const SELECTOR_ACTIVE = '.active'
constant SELECTOR_ITEM (line 59) | const SELECTOR_ITEM = '.carousel-item'
constant SELECTOR_ACTIVE_ITEM (line 60) | const SELECTOR_ACTIVE_ITEM = SELECTOR_ACTIVE + SELECTOR_ITEM
constant SELECTOR_ITEM_IMG (line 61) | const SELECTOR_ITEM_IMG = '.carousel-item img'
constant SELECTOR_INDICATORS (line 62) | const SELECTOR_INDICATORS = '.carousel-indicators'
constant SELECTOR_DATA_SLIDE (line 63) | const SELECTOR_DATA_SLIDE = '[data-bs-slide], [data-bs-slide-to]'
constant SELECTOR_DATA_RIDE (line 64) | const SELECTOR_DATA_RIDE = '[data-bs-ride="carousel"]'
constant KEY_TO_DIRECTION (line 66) | const KEY_TO_DIRECTION = {
class Carousel (line 93) | class Carousel extends BaseComponent {
method constructor (line 94) | constructor(element, config) {
method Default (line 112) | static get Default() {
method DefaultType (line 116) | static get DefaultType() {
method NAME (line 120) | static get NAME() {
method next (line 125) | next() {
method nextWhenVisible (line 129) | nextWhenVisible() {
method prev (line 138) | prev() {
method pause (line 142) | pause() {
method cycle (line 150) | cycle() {
method _maybeEnableCycle (line 157) | _maybeEnableCycle() {
method to (line 170) | to(index) {
method dispose (line 191) | dispose() {
method _configAfterMerge (line 200) | _configAfterMerge(config) {
method _addEventListeners (line 205) | _addEventListeners() {
method _addTouchEventListeners (line 220) | _addTouchEventListeners() {
method _keydown (line 255) | _keydown(event) {
method _getItemIndex (line 267) | _getItemIndex(element) {
method _setActiveIndicatorElement (line 271) | _setActiveIndicatorElement(index) {
method _updateInterval (line 289) | _updateInterval() {
method _slide (line 301) | _slide(order, element = null) {
method _isAnimated (line 373) | _isAnimated() {
method _getActive (line 377) | _getActive() {
method _getItems (line 381) | _getItems() {
method _clearInterval (line 385) | _clearInterval() {
method _directionToOrder (line 392) | _directionToOrder(direction) {
method _orderToDirection (line 400) | _orderToDirection(order) {
method jQueryInterface (line 409) | static jQueryInterface(config) {
FILE: src/common/bootstrap/js/src/collapse.js
constant NAME (line 23) | const NAME = 'collapse'
constant DATA_KEY (line 24) | const DATA_KEY = 'bs.collapse'
constant EVENT_KEY (line 25) | const EVENT_KEY = `.${DATA_KEY}`
constant DATA_API_KEY (line 26) | const DATA_API_KEY = '.data-api'
constant EVENT_SHOW (line 28) | const EVENT_SHOW = `show${EVENT_KEY}`
constant EVENT_SHOWN (line 29) | const EVENT_SHOWN = `shown${EVENT_KEY}`
constant EVENT_HIDE (line 30) | const EVENT_HIDE = `hide${EVENT_KEY}`
constant EVENT_HIDDEN (line 31) | const EVENT_HIDDEN = `hidden${EVENT_KEY}`
constant EVENT_CLICK_DATA_API (line 32) | const EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`
constant CLASS_NAME_SHOW (line 34) | const CLASS_NAME_SHOW = 'show'
constant CLASS_NAME_COLLAPSE (line 35) | const CLASS_NAME_COLLAPSE = 'collapse'
constant CLASS_NAME_COLLAPSING (line 36) | const CLASS_NAME_COLLAPSING = 'collapsing'
constant CLASS_NAME_COLLAPSED (line 37) | const CLASS_NAME_COLLAPSED = 'collapsed'
constant CLASS_NAME_DEEPER_CHILDREN (line 38) | const CLASS_NAME_DEEPER_CHILDREN = `:scope .${CLASS_NAME_COLLAPSE} .${CL...
constant CLASS_NAME_HORIZONTAL (line 39) | const CLASS_NAME_HORIZONTAL = 'collapse-horizontal'
constant WIDTH (line 41) | const WIDTH = 'width'
constant HEIGHT (line 42) | const HEIGHT = 'height'
constant SELECTOR_ACTIVES (line 44) | const SELECTOR_ACTIVES = '.collapse.show, .collapse.collapsing'
constant SELECTOR_DATA_TOGGLE (line 45) | const SELECTOR_DATA_TOGGLE = '[data-bs-toggle="collapse"]'
class Collapse (line 61) | class Collapse extends BaseComponent {
method constructor (line 62) | constructor(element, config) {
method Default (line 92) | static get Default() {
method DefaultType (line 96) | static get DefaultType() {
method NAME (line 100) | static get NAME() {
method toggle (line 105) | toggle() {
method show (line 113) | show() {
method hide (line 168) | hide() {
method _isShown (line 209) | _isShown(element = this._element) {
method _configAfterMerge (line 214) | _configAfterMerge(config) {
method _getDimension (line 220) | _getDimension() {
method _initializeChildren (line 224) | _initializeChildren() {
method _getFirstLevelChildren (line 240) | _getFirstLevelChildren(selector) {
method _addAriaAndCollapsedClass (line 246) | _addAriaAndCollapsedClass(triggerArray, isOpen) {
method jQueryInterface (line 258) | static jQueryInterface(config) {
FILE: src/common/bootstrap/js/src/dom/data.js
method set (line 15) | set(element, key, instance) {
method get (line 33) | get(element, key) {
method remove (line 41) | remove(element, key) {
FILE: src/common/bootstrap/js/src/dom/event-handler.js
function makeEventUid (line 77) | function makeEventUid(element, uid) {
function getElementEvents (line 81) | function getElementEvents(element) {
function bootstrapHandler (line 90) | function bootstrapHandler(element, fn) {
function bootstrapDelegationHandler (line 102) | function bootstrapDelegationHandler(element, selector, fn) {
function findHandler (line 124) | function findHandler(events, callable, delegationSelector = null) {
function normalizeParameters (line 129) | function normalizeParameters(originalTypeEvent, handler, delegationFunct...
function addHandler (line 142) | function addHandler(element, originalTypeEvent, handler, delegationFunct...
function removeHandler (line 187) | function removeHandler(element, events, typeEvent, handler, delegationSe...
function removeNamespacedHandlers (line 198) | function removeNamespacedHandlers(element, events, typeEvent, namespace) {
function getTypeEvent (line 209) | function getTypeEvent(event) {
method on (line 216) | on(element, event, handler, delegationFunction) {
method one (line 220) | one(element, event, handler, delegationFunction) {
method off (line 224) | off(element, originalTypeEvent, handler, delegationFunction) {
method trigger (line 261) | trigger(element, event, args) {
function hydrateObj (line 303) | function hydrateObj(obj, meta) {
FILE: src/common/bootstrap/js/src/dom/manipulator.js
function normalizeData (line 8) | function normalizeData(value) {
function normalizeDataKey (line 36) | function normalizeDataKey(key) {
method setDataAttribute (line 41) | setDataAttribute(element, key, value) {
method removeDataAttribute (line 45) | removeDataAttribute(element, key) {
method getDataAttributes (line 49) | getDataAttributes(element) {
method getDataAttribute (line 66) | getDataAttribute(element, key) {
FILE: src/common/bootstrap/js/src/dom/selector-engine.js
method find (line 15) | find(selector, element = document.documentElement) {
method findOne (line 19) | findOne(selector, element = document.documentElement) {
method children (line 23) | children(element, selector) {
method parents (line 27) | parents(element, selector) {
method prev (line 39) | prev(element, selector) {
method next (line 53) | next(element, selector) {
method focusableChildren (line 67) | focusableChildren(element) {
FILE: src/common/bootstrap/js/src/dropdown.js
constant NAME (line 28) | const NAME = 'dropdown'
constant DATA_KEY (line 29) | const DATA_KEY = 'bs.dropdown'
constant EVENT_KEY (line 30) | const EVENT_KEY = `.${DATA_KEY}`
constant DATA_API_KEY (line 31) | const DATA_API_KEY = '.data-api'
constant ESCAPE_KEY (line 33) | const ESCAPE_KEY = 'Escape'
constant TAB_KEY (line 34) | const TAB_KEY = 'Tab'
constant ARROW_UP_KEY (line 35) | const ARROW_UP_KEY = 'ArrowUp'
constant ARROW_DOWN_KEY (line 36) | const ARROW_DOWN_KEY = 'ArrowDown'
constant RIGHT_MOUSE_BUTTON (line 37) | const RIGHT_MOUSE_BUTTON = 2 // MouseEvent.button value for the secondar...
constant EVENT_HIDE (line 39) | const EVENT_HIDE = `hide${EVENT_KEY}`
constant EVENT_HIDDEN (line 40) | const EVENT_HIDDEN = `hidden${EVENT_KEY}`
constant EVENT_SHOW (line 41) | const EVENT_SHOW = `show${EVENT_KEY}`
constant EVENT_SHOWN (line 42) | const EVENT_SHOWN = `shown${EVENT_KEY}`
constant EVENT_CLICK_DATA_API (line 43) | const EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`
constant EVENT_KEYDOWN_DATA_API (line 44) | const EVENT_KEYDOWN_DATA_API = `keydown${EVENT_KEY}${DATA_API_KEY}`
constant EVENT_KEYUP_DATA_API (line 45) | const EVENT_KEYUP_DATA_API = `keyup${EVENT_KEY}${DATA_API_KEY}`
constant CLASS_NAME_SHOW (line 47) | const CLASS_NAME_SHOW = 'show'
constant CLASS_NAME_DROPUP (line 48) | const CLASS_NAME_DROPUP = 'dropup'
constant CLASS_NAME_DROPEND (line 49) | const CLASS_NAME_DROPEND = 'dropend'
constant CLASS_NAME_DROPSTART (line 50) | const CLASS_NAME_DROPSTART = 'dropstart'
constant CLASS_NAME_DROPUP_CENTER (line 51) | const CLASS_NAME_DROPUP_CENTER = 'dropup-center'
constant CLASS_NAME_DROPDOWN_CENTER (line 52) | const CLASS_NAME_DROPDOWN_CENTER = 'dropdown-center'
constant SELECTOR_DATA_TOGGLE (line 54) | const SELECTOR_DATA_TOGGLE = '[data-bs-toggle="dropdown"]:not(.disabled)...
constant SELECTOR_DATA_TOGGLE_SHOWN (line 55) | const SELECTOR_DATA_TOGGLE_SHOWN = `${SELECTOR_DATA_TOGGLE}.${CLASS_NAME...
constant SELECTOR_MENU (line 56) | const SELECTOR_MENU = '.dropdown-menu'
constant SELECTOR_NAVBAR (line 57) | const SELECTOR_NAVBAR = '.navbar'
constant SELECTOR_NAVBAR_NAV (line 58) | const SELECTOR_NAVBAR_NAV = '.navbar-nav'
constant SELECTOR_VISIBLE_ITEMS (line 59) | const SELECTOR_VISIBLE_ITEMS = '.dropdown-menu .dropdown-item:not(.disab...
constant PLACEMENT_TOP (line 61) | const PLACEMENT_TOP = isRTL() ? 'top-end' : 'top-start'
constant PLACEMENT_TOPEND (line 62) | const PLACEMENT_TOPEND = isRTL() ? 'top-start' : 'top-end'
constant PLACEMENT_BOTTOM (line 63) | const PLACEMENT_BOTTOM = isRTL() ? 'bottom-end' : 'bottom-start'
constant PLACEMENT_BOTTOMEND (line 64) | const PLACEMENT_BOTTOMEND = isRTL() ? 'bottom-start' : 'bottom-end'
constant PLACEMENT_RIGHT (line 65) | const PLACEMENT_RIGHT = isRTL() ? 'left-start' : 'right-start'
constant PLACEMENT_LEFT (line 66) | const PLACEMENT_LEFT = isRTL() ? 'right-start' : 'left-start'
constant PLACEMENT_TOPCENTER (line 67) | const PLACEMENT_TOPCENTER = 'top'
constant PLACEMENT_BOTTOMCENTER (line 68) | const PLACEMENT_BOTTOMCENTER = 'bottom'
class Dropdown (line 92) | class Dropdown extends BaseComponent {
method constructor (line 93) | constructor(element, config) {
method Default (line 106) | static get Default() {
method DefaultType (line 110) | static get DefaultType() {
method NAME (line 114) | static get NAME() {
method toggle (line 119) | toggle() {
method show (line 123) | show() {
method hide (line 158) | hide() {
method dispose (line 170) | dispose() {
method update (line 178) | update() {
method _completeHide (line 186) | _completeHide(relatedTarget) {
method _getConfig (line 211) | _getConfig(config) {
method _createPopper (line 224) | _createPopper() {
method _isShown (line 243) | _isShown() {
method _getPlacement (line 247) | _getPlacement() {
method _detectNavbar (line 276) | _detectNavbar() {
method _getOffset (line 280) | _getOffset() {
method _getPopperConfig (line 294) | _getPopperConfig() {
method _selectMenuItem (line 326) | _selectMenuItem({ key, target }) {
method jQueryInterface (line 339) | static jQueryInterface(config) {
method clearMenus (line 355) | static clearMenus(event) {
method dataApiKeydownHandler (line 393) | static dataApiKeydownHandler(event) {
FILE: src/common/bootstrap/js/src/modal.js
constant NAME (line 21) | const NAME = 'modal'
constant DATA_KEY (line 22) | const DATA_KEY = 'bs.modal'
constant EVENT_KEY (line 23) | const EVENT_KEY = `.${DATA_KEY}`
constant DATA_API_KEY (line 24) | const DATA_API_KEY = '.data-api'
constant ESCAPE_KEY (line 25) | const ESCAPE_KEY = 'Escape'
constant EVENT_HIDE (line 27) | const EVENT_HIDE = `hide${EVENT_KEY}`
constant EVENT_HIDE_PREVENTED (line 28) | const EVENT_HIDE_PREVENTED = `hidePrevented${EVENT_KEY}`
constant EVENT_HIDDEN (line 29) | const EVENT_HIDDEN = `hidden${EVENT_KEY}`
constant EVENT_SHOW (line 30) | const EVENT_SHOW = `show${EVENT_KEY}`
constant EVENT_SHOWN (line 31) | const EVENT_SHOWN = `shown${EVENT_KEY}`
constant EVENT_RESIZE (line 32) | const EVENT_RESIZE = `resize${EVENT_KEY}`
constant EVENT_CLICK_DISMISS (line 33) | const EVENT_CLICK_DISMISS = `click.dismiss${EVENT_KEY}`
constant EVENT_MOUSEDOWN_DISMISS (line 34) | const EVENT_MOUSEDOWN_DISMISS = `mousedown.dismiss${EVENT_KEY}`
constant EVENT_KEYDOWN_DISMISS (line 35) | const EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY}`
constant EVENT_CLICK_DATA_API (line 36) | const EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`
constant CLASS_NAME_OPEN (line 38) | const CLASS_NAME_OPEN = 'modal-open'
constant CLASS_NAME_FADE (line 39) | const CLASS_NAME_FADE = 'fade'
constant CLASS_NAME_SHOW (line 40) | const CLASS_NAME_SHOW = 'show'
constant CLASS_NAME_STATIC (line 41) | const CLASS_NAME_STATIC = 'modal-static'
constant OPEN_SELECTOR (line 43) | const OPEN_SELECTOR = '.modal.show'
constant SELECTOR_DIALOG (line 44) | const SELECTOR_DIALOG = '.modal-dialog'
constant SELECTOR_MODAL_BODY (line 45) | const SELECTOR_MODAL_BODY = '.modal-body'
constant SELECTOR_DATA_TOGGLE (line 46) | const SELECTOR_DATA_TOGGLE = '[data-bs-toggle="modal"]'
class Modal (line 64) | class Modal extends BaseComponent {
method constructor (line 65) | constructor(element, config) {
method Default (line 79) | static get Default() {
method DefaultType (line 83) | static get DefaultType() {
method NAME (line 87) | static get NAME() {
method toggle (line 92) | toggle(relatedTarget) {
method show (line 96) | show(relatedTarget) {
method hide (line 121) | hide() {
method dispose (line 141) | dispose() {
method handleUpdate (line 151) | handleUpdate() {
method _initializeBackDrop (line 156) | _initializeBackDrop() {
method _initializeFocusTrap (line 163) | _initializeFocusTrap() {
method _showElement (line 169) | _showElement(relatedTarget) {
method _addEventListeners (line 204) | _addEventListeners() {
method _hideModal (line 244) | _hideModal() {
method _isAnimated (line 259) | _isAnimated() {
method _triggerBackdropTransition (line 263) | _triggerBackdropTransition() {
method _adjustDialog (line 295) | _adjustDialog() {
method _resetAdjustments (line 311) | _resetAdjustments() {
method jQueryInterface (line 317) | static jQueryInterface(config, relatedTarget) {
FILE: src/common/bootstrap/js/src/offcanvas.js
constant NAME (line 26) | const NAME = 'offcanvas'
constant DATA_KEY (line 27) | const DATA_KEY = 'bs.offcanvas'
constant EVENT_KEY (line 28) | const EVENT_KEY = `.${DATA_KEY}`
constant DATA_API_KEY (line 29) | const DATA_API_KEY = '.data-api'
constant EVENT_LOAD_DATA_API (line 30) | const EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`
constant ESCAPE_KEY (line 31) | const ESCAPE_KEY = 'Escape'
constant CLASS_NAME_SHOW (line 33) | const CLASS_NAME_SHOW = 'show'
constant CLASS_NAME_SHOWING (line 34) | const CLASS_NAME_SHOWING = 'showing'
constant CLASS_NAME_HIDING (line 35) | const CLASS_NAME_HIDING = 'hiding'
constant CLASS_NAME_BACKDROP (line 36) | const CLASS_NAME_BACKDROP = 'offcanvas-backdrop'
constant OPEN_SELECTOR (line 37) | const OPEN_SELECTOR = '.offcanvas.show'
constant EVENT_SHOW (line 39) | const EVENT_SHOW = `show${EVENT_KEY}`
constant EVENT_SHOWN (line 40) | const EVENT_SHOWN = `shown${EVENT_KEY}`
constant EVENT_HIDE (line 41) | const EVENT_HIDE = `hide${EVENT_KEY}`
constant EVENT_HIDE_PREVENTED (line 42) | const EVENT_HIDE_PREVENTED = `hidePrevented${EVENT_KEY}`
constant EVENT_HIDDEN (line 43) | const EVENT_HIDDEN = `hidden${EVENT_KEY}`
constant EVENT_RESIZE (line 44) | const EVENT_RESIZE = `resize${EVENT_KEY}`
constant EVENT_CLICK_DATA_API (line 45) | const EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`
constant EVENT_KEYDOWN_DISMISS (line 46) | const EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY}`
constant SELECTOR_DATA_TOGGLE (line 48) | const SELECTOR_DATA_TOGGLE = '[data-bs-toggle="offcanvas"]'
class Offcanvas (line 66) | class Offcanvas extends BaseComponent {
method constructor (line 67) | constructor(element, config) {
method Default (line 77) | static get Default() {
method DefaultType (line 81) | static get DefaultType() {
method NAME (line 85) | static get NAME() {
method toggle (line 90) | toggle(relatedTarget) {
method show (line 94) | show(relatedTarget) {
method hide (line 129) | hide() {
method dispose (line 161) | dispose() {
method _initializeBackDrop (line 168) | _initializeBackDrop() {
method _initializeFocusTrap (line 190) | _initializeFocusTrap() {
method _addEventListeners (line 196) | _addEventListeners() {
method jQueryInterface (line 212) | static jQueryInterface(config) {
FILE: src/common/bootstrap/js/src/popover.js
constant NAME (line 15) | const NAME = 'popover'
constant SELECTOR_TITLE (line 17) | const SELECTOR_TITLE = '.popover-header'
constant SELECTOR_CONTENT (line 18) | const SELECTOR_CONTENT = '.popover-body'
class Popover (line 42) | class Popover extends Tooltip {
method Default (line 44) | static get Default() {
method DefaultType (line 48) | static get DefaultType() {
method NAME (line 52) | static get NAME() {
method _isWithContent (line 57) | _isWithContent() {
method _getContentForTemplate (line 62) | _getContentForTemplate() {
method _getContent (line 69) | _getContent() {
method jQueryInterface (line 74) | static jQueryInterface(config) {
FILE: src/common/bootstrap/js/src/scrollspy.js
constant NAME (line 17) | const NAME = 'scrollspy'
constant DATA_KEY (line 18) | const DATA_KEY = 'bs.scrollspy'
constant EVENT_KEY (line 19) | const EVENT_KEY = `.${DATA_KEY}`
constant DATA_API_KEY (line 20) | const DATA_API_KEY = '.data-api'
constant EVENT_ACTIVATE (line 22) | const EVENT_ACTIVATE = `activate${EVENT_KEY}`
constant EVENT_CLICK (line 23) | const EVENT_CLICK = `click${EVENT_KEY}`
constant EVENT_LOAD_DATA_API (line 24) | const EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`
constant CLASS_NAME_DROPDOWN_ITEM (line 26) | const CLASS_NAME_DROPDOWN_ITEM = 'dropdown-item'
constant CLASS_NAME_ACTIVE (line 27) | const CLASS_NAME_ACTIVE = 'active'
constant SELECTOR_DATA_SPY (line 29) | const SELECTOR_DATA_SPY = '[data-bs-spy="scroll"]'
constant SELECTOR_TARGET_LINKS (line 30) | const SELECTOR_TARGET_LINKS = '[href]'
constant SELECTOR_NAV_LIST_GROUP (line 31) | const SELECTOR_NAV_LIST_GROUP = '.nav, .list-group'
constant SELECTOR_NAV_LINKS (line 32) | const SELECTOR_NAV_LINKS = '.nav-link'
constant SELECTOR_NAV_ITEMS (line 33) | const SELECTOR_NAV_ITEMS = '.nav-item'
constant SELECTOR_LIST_ITEMS (line 34) | const SELECTOR_LIST_ITEMS = '.list-group-item'
constant SELECTOR_LINK_ITEMS (line 35) | const SELECTOR_LINK_ITEMS = `${SELECTOR_NAV_LINKS}, ${SELECTOR_NAV_ITEMS...
constant SELECTOR_DROPDOWN (line 36) | const SELECTOR_DROPDOWN = '.dropdown'
constant SELECTOR_DROPDOWN_TOGGLE (line 37) | const SELECTOR_DROPDOWN_TOGGLE = '.dropdown-toggle'
class ScrollSpy (line 59) | class ScrollSpy extends BaseComponent {
method constructor (line 60) | constructor(element, config) {
method Default (line 77) | static get Default() {
method DefaultType (line 81) | static get DefaultType() {
method NAME (line 85) | static get NAME() {
method refresh (line 90) | refresh() {
method dispose (line 105) | dispose() {
method _configAfterMerge (line 111) | _configAfterMerge(config) {
method _maybeEnableSmoothScroll (line 125) | _maybeEnableSmoothScroll() {
method _getNewObserver (line 150) | _getNewObserver() {
method _observerCallback (line 161) | _observerCallback(entries) {
method _initializeTargetsAndObservables (line 199) | _initializeTargetsAndObservables() {
method _process (line 221) | _process(target) {
method _activateParents (line 234) | _activateParents(target) {
method _clearActiveClass (line 251) | _clearActiveClass(parent) {
method jQueryInterface (line 261) | static jQueryInterface(config) {
FILE: src/common/bootstrap/js/src/tab.js
constant NAME (line 17) | const NAME = 'tab'
constant DATA_KEY (line 18) | const DATA_KEY = 'bs.tab'
constant EVENT_KEY (line 19) | const EVENT_KEY = `.${DATA_KEY}`
constant EVENT_HIDE (line 21) | const EVENT_HIDE = `hide${EVENT_KEY}`
constant EVENT_HIDDEN (line 22) | const EVENT_HIDDEN = `hidden${EVENT_KEY}`
constant EVENT_SHOW (line 23) | const EVENT_SHOW = `show${EVENT_KEY}`
constant EVENT_SHOWN (line 24) | const EVENT_SHOWN = `shown${EVENT_KEY}`
constant EVENT_CLICK_DATA_API (line 25) | const EVENT_CLICK_DATA_API = `click${EVENT_KEY}`
constant EVENT_KEYDOWN (line 26) | const EVENT_KEYDOWN = `keydown${EVENT_KEY}`
constant EVENT_LOAD_DATA_API (line 27) | const EVENT_LOAD_DATA_API = `load${EVENT_KEY}`
constant ARROW_LEFT_KEY (line 29) | const ARROW_LEFT_KEY = 'ArrowLeft'
constant ARROW_RIGHT_KEY (line 30) | const ARROW_RIGHT_KEY = 'ArrowRight'
constant ARROW_UP_KEY (line 31) | const ARROW_UP_KEY = 'ArrowUp'
constant ARROW_DOWN_KEY (line 32) | const ARROW_DOWN_KEY = 'ArrowDown'
constant CLASS_NAME_ACTIVE (line 34) | const CLASS_NAME_ACTIVE = 'active'
constant CLASS_NAME_FADE (line 35) | const CLASS_NAME_FADE = 'fade'
constant CLASS_NAME_SHOW (line 36) | const CLASS_NAME_SHOW = 'show'
constant CLASS_DROPDOWN (line 37) | const CLASS_DROPDOWN = 'dropdown'
constant SELECTOR_DROPDOWN_TOGGLE (line 39) | const SELECTOR_DROPDOWN_TOGGLE = '.dropdown-toggle'
constant SELECTOR_DROPDOWN_MENU (line 40) | const SELECTOR_DROPDOWN_MENU = '.dropdown-menu'
constant NOT_SELECTOR_DROPDOWN_TOGGLE (line 41) | const NOT_SELECTOR_DROPDOWN_TOGGLE = ':not(.dropdown-toggle)'
constant SELECTOR_TAB_PANEL (line 43) | const SELECTOR_TAB_PANEL = '.list-group, .nav, [role="tablist"]'
constant SELECTOR_OUTER (line 44) | const SELECTOR_OUTER = '.nav-item, .list-group-item'
constant SELECTOR_INNER (line 45) | const SELECTOR_INNER = `.nav-link${NOT_SELECTOR_DROPDOWN_TOGGLE}, .list-...
constant SELECTOR_DATA_TOGGLE (line 46) | const SELECTOR_DATA_TOGGLE = '[data-bs-toggle="tab"], [data-bs-toggle="p...
constant SELECTOR_INNER_ELEM (line 47) | const SELECTOR_INNER_ELEM = `${SELECTOR_INNER}, ${SELECTOR_DATA_TOGGLE}`
constant SELECTOR_DATA_TOGGLE_ACTIVE (line 49) | const SELECTOR_DATA_TOGGLE_ACTIVE = `.${CLASS_NAME_ACTIVE}[data-bs-toggl...
class Tab (line 55) | class Tab extends BaseComponent {
method constructor (line 56) | constructor(element) {
method NAME (line 73) | static get NAME() {
method show (line 78) | show() { // Shows this elem and deactivate the active sibling if exists
method _activate (line 102) | _activate(element, relatedElem) {
method _deactivate (line 128) | _deactivate(element, relatedElem) {
method _keydown (line 153) | _keydown(event) {
method _getChildren (line 169) | _getChildren() { // collection of inner elements
method _getActiveElem (line 173) | _getActiveElem() {
method _setInitialAttributes (line 177) | _setInitialAttributes(parent, children) {
method _setInitialAttributesOnChild (line 185) | _setInitialAttributesOnChild(child) {
method _setInitialAttributesOnTargetPanel (line 205) | _setInitialAttributesOnTargetPanel(child) {
method _toggleDropDown (line 219) | _toggleDropDown(element, open) {
method _setAttributeIfNotExists (line 237) | _setAttributeIfNotExists(element, attribute, value) {
method _elemIsActive (line 243) | _elemIsActive(elem) {
method _getInnerElement (line 248) | _getInnerElement(elem) {
method _getOuterElement (line 253) | _getOuterElement(elem) {
method jQueryInterface (line 258) | static jQueryInterface(config) {
FILE: src/common/bootstrap/js/src/toast.js
constant NAME (line 17) | const NAME = 'toast'
constant DATA_KEY (line 18) | const DATA_KEY = 'bs.toast'
constant EVENT_KEY (line 19) | const EVENT_KEY = `.${DATA_KEY}`
constant EVENT_MOUSEOVER (line 21) | const EVENT_MOUSEOVER = `mouseover${EVENT_KEY}`
constant EVENT_MOUSEOUT (line 22) | const EVENT_MOUSEOUT = `mouseout${EVENT_KEY}`
constant EVENT_FOCUSIN (line 23) | const EVENT_FOCUSIN = `focusin${EVENT_KEY}`
constant EVENT_FOCUSOUT (line 24) | const EVENT_FOCUSOUT = `focusout${EVENT_KEY}`
constant EVENT_HIDE (line 25) | const EVENT_HIDE = `hide${EVENT_KEY}`
constant EVENT_HIDDEN (line 26) | const EVENT_HIDDEN = `hidden${EVENT_KEY}`
constant EVENT_SHOW (line 27) | const EVENT_SHOW = `show${EVENT_KEY}`
constant EVENT_SHOWN (line 28) | const EVENT_SHOWN = `shown${EVENT_KEY}`
constant CLASS_NAME_FADE (line 30) | const CLASS_NAME_FADE = 'fade'
constant CLASS_NAME_HIDE (line 31) | const CLASS_NAME_HIDE = 'hide' // @deprecated - kept here only for backw...
constant CLASS_NAME_SHOW (line 32) | const CLASS_NAME_SHOW = 'show'
constant CLASS_NAME_SHOWING (line 33) | const CLASS_NAME_SHOWING = 'showing'
class Toast (line 51) | class Toast extends BaseComponent {
method constructor (line 52) | constructor(element, config) {
method Default (line 62) | static get Default() {
method DefaultType (line 66) | static get DefaultType() {
method NAME (line 70) | static get NAME() {
method show (line 75) | show() {
method hide (line 102) | hide() {
method dispose (line 123) | dispose() {
method isShown (line 133) | isShown() {
method _maybeScheduleHide (line 139) | _maybeScheduleHide() {
method _onInteraction (line 153) | _onInteraction(event, isInteracting) {
method _setListeners (line 185) | _setListeners() {
method _clearTimeout (line 192) | _clearTimeout() {
method jQueryInterface (line 198) | static jQueryInterface(config) {
FILE: src/common/bootstrap/js/src/tooltip.js
constant NAME (line 20) | const NAME = 'tooltip'
constant DISALLOWED_ATTRIBUTES (line 21) | const DISALLOWED_ATTRIBUTES = new Set(['sanitize', 'allowList', 'sanitiz...
constant CLASS_NAME_FADE (line 23) | const CLASS_NAME_FADE = 'fade'
constant CLASS_NAME_MODAL (line 24) | const CLASS_NAME_MODAL = 'modal'
constant CLASS_NAME_SHOW (line 25) | const CLASS_NAME_SHOW = 'show'
constant SELECTOR_TOOLTIP_INNER (line 27) | const SELECTOR_TOOLTIP_INNER = '.tooltip-inner'
constant SELECTOR_MODAL (line 28) | const SELECTOR_MODAL = `.${CLASS_NAME_MODAL}`
constant EVENT_MODAL_HIDE (line 30) | const EVENT_MODAL_HIDE = 'hide.bs.modal'
constant TRIGGER_HOVER (line 32) | const TRIGGER_HOVER = 'hover'
constant TRIGGER_FOCUS (line 33) | const TRIGGER_FOCUS = 'focus'
constant TRIGGER_CLICK (line 34) | const TRIGGER_CLICK = 'click'
constant TRIGGER_MANUAL (line 35) | const TRIGGER_MANUAL = 'manual'
constant EVENT_HIDE (line 37) | const EVENT_HIDE = 'hide'
constant EVENT_HIDDEN (line 38) | const EVENT_HIDDEN = 'hidden'
constant EVENT_SHOW (line 39) | const EVENT_SHOW = 'show'
constant EVENT_SHOWN (line 40) | const EVENT_SHOWN = 'shown'
constant EVENT_INSERTED (line 41) | const EVENT_INSERTED = 'inserted'
constant EVENT_CLICK (line 42) | const EVENT_CLICK = 'click'
constant EVENT_FOCUSIN (line 43) | const EVENT_FOCUSIN = 'focusin'
constant EVENT_FOCUSOUT (line 44) | const EVENT_FOCUSOUT = 'focusout'
constant EVENT_MOUSEENTER (line 45) | const EVENT_MOUSEENTER = 'mouseenter'
constant EVENT_MOUSELEAVE (line 46) | const EVENT_MOUSELEAVE = 'mouseleave'
class Tooltip (line 103) | class Tooltip extends BaseComponent {
method constructor (line 104) | constructor(element, config) {
method Default (line 131) | static get Default() {
method DefaultType (line 135) | static get DefaultType() {
method NAME (line 139) | static get NAME() {
method enable (line 144) | enable() {
method disable (line 148) | disable() {
method toggleEnabled (line 152) | toggleEnabled() {
method toggle (line 156) | toggle() {
method dispose (line 170) | dispose() {
method show (line 183) | show() {
method hide (line 241) | hide() {
method update (line 283) | update() {
method _isWithContent (line 290) | _isWithContent() {
method _getTipElement (line 294) | _getTipElement() {
method _createTipElement (line 302) | _createTipElement(content) {
method setContent (line 325) | setContent(content) {
method _getTemplateFactory (line 333) | _getTemplateFactory(content) {
method _getContentForTemplate (line 349) | _getContentForTemplate() {
method _getTitle (line 355) | _getTitle() {
method _initializeOnDelegatedTarget (line 360) | _initializeOnDelegatedTarget(event) {
method _isAnimated (line 364) | _isAnimated() {
method _isShown (line 368) | _isShown() {
method _createPopper (line 372) | _createPopper(tip) {
method _getOffset (line 380) | _getOffset() {
method _resolvePossibleFunction (line 394) | _resolvePossibleFunction(arg) {
method _getPopperConfig (line 398) | _getPopperConfig(attachment) {
method _setListeners (line 445) | _setListeners() {
method _fixTitle (line 486) | _fixTitle() {
method _enter (line 501) | _enter() {
method _leave (line 516) | _leave() {
method _setTimeout (line 530) | _setTimeout(handler, timeout) {
method _isWithActiveTrigger (line 535) | _isWithActiveTrigger() {
method _getConfig (line 539) | _getConfig(config) {
method _configAfterMerge (line 558) | _configAfterMerge(config) {
method _getDelegateConfig (line 579) | _getDelegateConfig() {
method _disposePopper (line 597) | _disposePopper() {
method jQueryInterface (line 610) | static jQueryInterface(config) {
FILE: src/common/bootstrap/js/src/util/backdrop.js
constant NAME (line 16) | const NAME = 'backdrop'
constant CLASS_NAME_FADE (line 17) | const CLASS_NAME_FADE = 'fade'
constant CLASS_NAME_SHOW (line 18) | const CLASS_NAME_SHOW = 'show'
constant EVENT_MOUSEDOWN (line 19) | const EVENT_MOUSEDOWN = `mousedown.bs.${NAME}`
class Backdrop (line 41) | class Backdrop extends Config {
method constructor (line 42) | constructor(config) {
method Default (line 50) | static get Default() {
method DefaultType (line 54) | static get DefaultType() {
method NAME (line 58) | static get NAME() {
method show (line 63) | show(callback) {
method hide (line 83) | hide(callback) {
method dispose (line 97) | dispose() {
method _getElement (line 109) | _getElement() {
method _configAfterMerge (line 123) | _configAfterMerge(config) {
method _append (line 129) | _append() {
method _emulateAnimation (line 144) | _emulateAnimation(callback) {
FILE: src/common/bootstrap/js/src/util/config.js
class Config (line 15) | class Config {
method Default (line 17) | static get Default() {
method DefaultType (line 21) | static get DefaultType() {
method NAME (line 25) | static get NAME() {
method _getConfig (line 29) | _getConfig(config) {
method _configAfterMerge (line 36) | _configAfterMerge(config) {
method _mergeConfigObj (line 40) | _mergeConfigObj(config, element) {
method _typeCheckConfig (line 51) | _typeCheckConfig(config, configTypes = this.constructor.DefaultType) {
FILE: src/common/bootstrap/js/src/util/focustrap.js
constant NAME (line 16) | const NAME = 'focustrap'
constant DATA_KEY (line 17) | const DATA_KEY = 'bs.focustrap'
constant EVENT_KEY (line 18) | const EVENT_KEY = `.${DATA_KEY}`
constant EVENT_FOCUSIN (line 19) | const EVENT_FOCUSIN = `focusin${EVENT_KEY}`
constant EVENT_KEYDOWN_TAB (line 20) | const EVENT_KEYDOWN_TAB = `keydown.tab${EVENT_KEY}`
constant TAB_KEY (line 22) | const TAB_KEY = 'Tab'
constant TAB_NAV_FORWARD (line 23) | const TAB_NAV_FORWARD = 'forward'
constant TAB_NAV_BACKWARD (line 24) | const TAB_NAV_BACKWARD = 'backward'
class FocusTrap (line 40) | class FocusTrap extends Config {
method constructor (line 41) | constructor(config) {
method Default (line 49) | static get Default() {
method DefaultType (line 53) | static get DefaultType() {
method NAME (line 57) | static get NAME() {
method activate (line 62) | activate() {
method deactivate (line 78) | deactivate() {
method _handleFocusin (line 88) | _handleFocusin(event) {
method _handleKeydown (line 106) | _handleKeydown(event) {
FILE: src/common/bootstrap/js/src/util/index.js
constant MAX_UID (line 8) | const MAX_UID = 1_000_000
constant MILLISECONDS_MULTIPLIER (line 9) | const MILLISECONDS_MULTIPLIER = 1000
constant TRANSITION_END (line 10) | const TRANSITION_END = 'transitionend'
FILE: src/common/bootstrap/js/src/util/sanitizer.js
constant ARIA_ATTRIBUTE_PATTERN (line 19) | const ARIA_ATTRIBUTE_PATTERN = /^aria-[\w-]*$/i
constant SAFE_URL_PATTERN (line 26) | const SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file|sms):|[^#&/:...
constant DATA_URL_PATTERN (line 33) | const DATA_URL_PATTERN = /^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|w...
function sanitizeHtml (line 85) | function sanitizeHtml(unsafeHtml, allowList, sanitizeFunction) {
FILE: src/common/bootstrap/js/src/util/scrollbar.js
constant SELECTOR_FIXED_CONTENT (line 16) | const SELECTOR_FIXED_CONTENT = '.fixed-top, .fixed-bottom, .is-fixed, .s...
constant SELECTOR_STICKY_CONTENT (line 17) | const SELECTOR_STICKY_CONTENT = '.sticky-top'
constant PROPERTY_PADDING (line 18) | const PROPERTY_PADDING = 'padding-right'
constant PROPERTY_MARGIN (line 19) | const PROPERTY_MARGIN = 'margin-right'
class ScrollBarHelper (line 25) | class ScrollBarHelper {
method constructor (line 26) | constructor() {
method getWidth (line 31) | getWidth() {
method hide (line 37) | hide() {
method reset (line 47) | reset() {
method isOverflowing (line 54) | isOverflowing() {
method _disableOverFlow (line 59) | _disableOverFlow() {
method _setElementAttributes (line 64) | _setElementAttributes(selector, styleProperty, callback) {
method _saveInitialAttribute (line 79) | _saveInitialAttribute(element, styleProperty) {
method _resetElementAttributes (line 86) | _resetElementAttributes(selector, styleProperty) {
method _applyManipulationCallback (line 102) | _applyManipulationCallback(selector, callBack) {
FILE: src/common/bootstrap/js/src/util/swipe.js
constant NAME (line 16) | const NAME = 'swipe'
constant EVENT_KEY (line 17) | const EVENT_KEY = '.bs.swipe'
constant EVENT_TOUCHSTART (line 18) | const EVENT_TOUCHSTART = `touchstart${EVENT_KEY}`
constant EVENT_TOUCHMOVE (line 19) | const EVENT_TOUCHMOVE = `touchmove${EVENT_KEY}`
constant EVENT_TOUCHEND (line 20) | const EVENT_TOUCHEND = `touchend${EVENT_KEY}`
constant EVENT_POINTERDOWN (line 21) | const EVENT_POINTERDOWN = `pointerdown${EVENT_KEY}`
constant EVENT_POINTERUP (line 22) | const EVENT_POINTERUP = `pointerup${EVENT_KEY}`
constant POINTER_TYPE_TOUCH (line 23) | const POINTER_TYPE_TOUCH = 'touch'
constant POINTER_TYPE_PEN (line 24) | const POINTER_TYPE_PEN = 'pen'
constant CLASS_NAME_POINTER_EVENT (line 25) | const CLASS_NAME_POINTER_EVENT = 'pointer-event'
constant SWIPE_THRESHOLD (line 26) | const SWIPE_THRESHOLD = 40
class Swipe (line 44) | class Swipe extends Config {
method constructor (line 45) | constructor(element, config) {
method Default (line 60) | static get Default() {
method DefaultType (line 64) | static get DefaultType() {
method NAME (line 68) | static get NAME() {
method dispose (line 73) | dispose() {
method _start (line 78) | _start(event) {
method _end (line 90) | _end(event) {
method _move (line 99) | _move(event) {
method _handleSwipe (line 105) | _handleSwipe() {
method _initEvents (line 123) | _initEvents() {
method _eventIsPointerPenTouch (line 136) | _eventIsPointerPenTouch(event) {
method isSupported (line 141) | static isSupported() {
FILE: src/common/bootstrap/js/src/util/template-factory.js
constant NAME (line 17) | const NAME = 'TemplateFactory'
class TemplateFactory (line 48) | class TemplateFactory extends Config {
method constructor (line 49) | constructor(config) {
method Default (line 55) | static get Default() {
method DefaultType (line 59) | static get DefaultType() {
method NAME (line 63) | static get NAME() {
method getContent (line 68) | getContent() {
method hasContent (line 74) | hasContent() {
method changeContent (line 78) | changeContent(content) {
method toHtml (line 84) | toHtml() {
method _typeCheckConfig (line 103) | _typeCheckConfig(config) {
method _checkContent (line 108) | _checkContent(arg) {
method _setContent (line 114) | _setContent(template, content, selector) {
method _maybeSanitize (line 141) | _maybeSanitize(arg) {
method _resolvePossibleFunction (line 145) | _resolvePossibleFunction(arg) {
method _putElementInTemplate (line 149) | _putElementInTemplate(element, templateElement) {
FILE: src/common/bootstrap/js/tests/helpers/fixture.js
method each (line 33) | each(fn) {
FILE: src/common/bootstrap/js/tests/karma.conf.js
constant ENV (line 13) | const ENV = process.env
constant BROWSERSTACK (line 14) | const BROWSERSTACK = Boolean(ENV.BROWSERSTACK)
constant DEBUG (line 15) | const DEBUG = Boolean(ENV.DEBUG)
constant JQUERY_TEST (line 16) | const JQUERY_TEST = Boolean(ENV.JQUERY)
method postDetection (line 31) | postDetection(availableBrowser) {
FILE: src/common/bootstrap/js/tests/unit/base-component.spec.js
class DummyClass (line 6) | class DummyClass extends BaseComponent {
method constructor (line 7) | constructor(element) {
method NAME (line 13) | static get NAME() {
FILE: src/common/bootstrap/js/tests/unit/collapse.spec.js
function firstTest (line 771) | function firstTest() {
function secondTest (line 781) | function secondTest() {
function handlerCollapseOne (line 855) | function handlerCollapseOne() {
function handlerNestedCollapseOne (line 865) | function handlerNestedCollapseOne() {
FILE: src/common/bootstrap/js/tests/unit/dom/event-handler.spec.js
method oneListener (line 167) | oneListener() {
method oneListener (line 191) | oneListener() {
method get (line 465) | get() {
FILE: src/common/bootstrap/js/tests/unit/dropdown.spec.js
method onFirstUpdate (line 98) | onFirstUpdate(state) {
method getBoundingClientRect (line 545) | getBoundingClientRect() {
method onFirstUpdate (line 571) | onFirstUpdate() {
FILE: src/common/bootstrap/js/tests/unit/scrollspy.spec.js
method cb (line 363) | cb() {
method cb (line 402) | cb() {
method cb (line 441) | cb() {
method cb (line 579) | cb() {
FILE: src/common/bootstrap/js/tests/unit/tooltip.spec.js
method onFirstUpdate (line 124) | onFirstUpdate(state) {
FILE: src/common/bootstrap/js/tests/unit/util/backdrop.spec.js
constant CLASS_BACKDROP (line 5) | const CLASS_BACKDROP = '.modal-backdrop'
constant CLASS_NAME_FADE (line 6) | const CLASS_NAME_FADE = 'fade'
constant CLASS_NAME_SHOW (line 7) | const CLASS_NAME_SHOW = 'show'
FILE: src/common/bootstrap/js/tests/unit/util/component-functions.spec.js
class DummyClass2 (line 7) | class DummyClass2 extends BaseComponent {
method NAME (line 8) | static get NAME() {
method hide (line 12) | hide() {
method testMethod (line 16) | testMethod() {
FILE: src/common/bootstrap/js/tests/unit/util/config.spec.js
class DummyConfigClass (line 4) | class DummyConfigClass extends Config {
method NAME (line 5) | static get NAME() {
FILE: src/common/bootstrap/js/tests/unit/util/index.spec.js
method trigger (line 542) | trigger() {}
FILE: src/common/bootstrap/js/tests/unit/util/sanitizer.spec.js
function mySanitize (line 83) | function mySanitize(htmlUnsafe) {
FILE: src/common/bootstrap/js/tests/unit/util/swipe.spec.js
method leftCallback (line 88) | leftCallback() {
method rightCallback (line 110) | rightCallback() {
method rightCallback (line 193) | rightCallback() {
method leftCallback (line 218) | leftCallback() {
FILE: src/common/bootstrap/js/tests/unit/util/template-factory.spec.js
method extraClass (line 102) | extraClass(arg) {
FILE: src/common/bootstrap/site/assets/js/code-examples.js
function snippetButtonTooltip (line 45) | function snippetButtonTooltip(selector, title) {
FILE: src/common/bootstrap/site/assets/js/search.js
method transformItems (line 24) | transformItems(items) {
FILE: src/common/bootstrap/site/content/docs/5.2/examples/cheatsheet/cheatsheet.js
function setActiveItem (line 36) | function setActiveItem() {
FILE: src/java/main/com/atlassian/oauth/client/example/ClientMain.java
class ClientMain (line 6) | public class ClientMain {
method main (line 8) | public static void main(String[] args) throws Exception {
FILE: src/java/main/com/atlassian/oauth/client/example/Command.java
type Command (line 6) | public enum Command {
method Command (line 13) | Command(final String name) {
method getName (line 17) | public String getName() {
method names (line 21) | public static String names() {
method fromString (line 28) | public static Command fromString(String name) {
FILE: src/java/main/com/atlassian/oauth/client/example/JiraOAuthClient.java
class JiraOAuthClient (line 13) | public class JiraOAuthClient {
method JiraOAuthClient (line 19) | public JiraOAuthClient(PropertiesClient propertiesClient) throws Excep...
method JiraOAuthClient (line 23) | public JiraOAuthClient(String jiraBaseUrl) {
method getAndAuthorizeTemporaryToken (line 39) | public String getAndAuthorizeTemporaryToken(String consumerKey, String...
method getAccessToken (line 65) | public String getAccessToken(String tmpToken, String secret, String co...
method getParameters (line 84) | public OAuthParameters getParameters(String tmpToken, String secret, S...
FILE: src/java/main/com/atlassian/oauth/client/example/JiraOAuthGetAccessToken.java
class JiraOAuthGetAccessToken (line 5) | public class JiraOAuthGetAccessToken extends OAuthGetAccessToken {
method JiraOAuthGetAccessToken (line 10) | public JiraOAuthGetAccessToken(String authorizationServerUrl) {
FILE: src/java/main/com/atlassian/oauth/client/example/JiraOAuthGetTemporaryToken.java
class JiraOAuthGetTemporaryToken (line 5) | public class JiraOAuthGetTemporaryToken extends OAuthGetTemporaryToken {
method JiraOAuthGetTemporaryToken (line 10) | public JiraOAuthGetTemporaryToken(String authorizationServerUrl) {
FILE: src/java/main/com/atlassian/oauth/client/example/JiraOAuthTokenFactory.java
class JiraOAuthTokenFactory (line 13) | public class JiraOAuthTokenFactory {
method JiraOAuthTokenFactory (line 18) | public JiraOAuthTokenFactory(String jiraBaseUrl) {
method getJiraOAuthGetAccessToken (line 37) | public JiraOAuthGetAccessToken getJiraOAuthGetAccessToken(String tmpTo...
method getTemporaryToken (line 59) | public JiraOAuthGetTemporaryToken getTemporaryToken(String consumerKey...
method getOAuthRsaSigner (line 74) | private OAuthRsaSigner getOAuthRsaSigner(String privateKey) throws NoS...
method getPrivateKey (line 88) | private PrivateKey getPrivateKey(String privateKey) throws NoSuchAlgor...
FILE: src/java/main/com/atlassian/oauth/client/example/OAuthAuthenticationHandler.java
class OAuthAuthenticationHandler (line 21) | public class OAuthAuthenticationHandler implements AuthenticationHandler {
method OAuthAuthenticationHandler (line 23) | public OAuthAuthenticationHandler(OAuthParameters parameters) {
method configure (line 26) | @Override
FILE: src/java/main/com/atlassian/oauth/client/example/OAuthClient.java
class OAuthClient (line 25) | public class OAuthClient {
method OAuthClient (line 32) | public OAuthClient(PropertiesClient propertiesClient, JiraOAuthClient ...
method execute (line 49) | public void execute(Command action, List<String> arguments) {
method handleUnknownCommand (line 55) | private Optional<Exception> handleUnknownCommand(List<String> argument...
method handleGetRequestTokenAction (line 66) | private Optional<Exception> handleGetRequestTokenAction(List<String> a...
method handleGetAccessToken (line 84) | private Optional<Exception> handleGetAccessToken(List<String> argument...
method handleGetRequest (line 106) | private Optional<Exception> handleGetRequest(List<String> arguments) {
method parseResponse (line 130) | private void parseResponse(HttpResponse response) throws IOException {
method getResponseFromUrl (line 150) | private static HttpResponse getResponseFromUrl(OAuthParameters paramet...
FILE: src/java/main/com/atlassian/oauth/client/example/PropertiesClient.java
class PropertiesClient (line 21) | public class PropertiesClient {
method PropertiesClient (line 39) | public PropertiesClient() throws Exception {
method getPropertiesOrDefaults (line 43) | public Map<String, String> getPropertiesOrDefaults() {
method toMap (line 56) | private Map<String, String> toMap(Properties properties) {
method toProperties (line 62) | private Properties toProperties(Map<String, String> propertiesMap) {
method tryGetProperties (line 70) | private Properties tryGetProperties() throws IOException {
method savePropertiesToFile (line 77) | public void savePropertiesToFile(Map<String, String> properties) {
method tryCreateDefaultFile (line 92) | public void tryCreateDefaultFile() {
method tryCreateFile (line 97) | private Optional<File> tryCreateFile() {
method closeQuietly (line 107) | private void closeQuietly(Closeable closeable) {
FILE: src/java/main/com/atlassian/oauth/client/example/TokenAuthenticationHandler.java
class TokenAuthenticationHandler (line 21) | public class TokenAuthenticationHandler implements AuthenticationHandler {
method TokenAuthenticationHandler (line 23) | public TokenAuthenticationHandler(String token) {
method configure (line 27) | @Override
FILE: src/java/main/com/tdrhq/PrimitiveWrapper.java
class PrimitiveWrapper (line 9) | public class PrimitiveWrapper {
method PrimitiveWrapper (line 11) | public PrimitiveWrapper(Object obj) {
method getType (line 18) | public int getType() {
method asBoolean (line 28) | public Boolean asBoolean() {
method asCharacter (line 32) | public Character asCharacter() {
FILE: src/java/main/com/tdrhq/SimpleNativeLibrary.java
class SimpleNativeLibrary (line 19) | public class SimpleNativeLibrary implements Serializable {
method SimpleNativeLibrary (line 24) | public SimpleNativeLibrary() {
method copyResource (line 27) | public static void copyResource(String resourceName, String outputFile...
method send_static_method_wrapped (line 44) | public static Object send_static_method_wrapped(Class klass, String me...
method wrapPrimitives (line 49) | public static Object wrapPrimitives(Object ret) {
method send_static_method (line 65) | public static Object send_static_method(Class klass, String methodName...
method send_method (line 90) | public static Object send_method(Object o, String methodName, Object[]...
method send_method_wrapped (line 106) | public static Object send_method_wrapped(Object o, String methodName, ...
method newInstance (line 110) | public static Object newInstance(Class klass, Object[] args)
method newInstance_wrapped (line 119) | public static Object newInstance_wrapped(Class klass, Object[] args)
method getLogger (line 137) | public static Object getLogger() {
method charFromCodePoint (line 141) | public static Character charFromCodePoint(char ch) {
method readStaticField (line 145) | public static Object readStaticField(Class klass, String field) throws...
method writeStaticField (line 149) | public static Object writeStaticField(Class klass, String field, Objec...
method readField (line 154) | public static Object readField(Object o, String field) throws Exception {
method writeField (line 158) | public static Object writeField(Object o, String field, Object val) th...
method throwJavaException (line 163) | public static void throwJavaException(Exception e) throws Exception {
FILE: src/java/main/com/tdrhq/Whitebox.java
class Whitebox (line 19) | class Whitebox {
class CacheKey (line 22) | public static class CacheKey {
method CacheKey (line 27) | public CacheKey(Class klass, String method, Class[] args) {
method equals (line 33) | @Override
method hashCode (line 41) | @Override
method invokeMethod (line 49) | static Object invokeMethod(Object o, String methodName, Object[] args)...
method getMatchingAccessibleMethod (line 62) | static Method getMatchingAccessibleMethod(Class klass, String methodNa...
method invokeStaticMethod (line 89) | static Object invokeStaticMethod(Class klass, String methodName, Objec...
method toVarArgs (line 101) | private static Object[] toVarArgs(final Method method, Object[] args) {
method getVarArgs (line 119) | static Object[] getVarArgs(final Object[] args, final Class<?>[] metho...
FILE: src/remark/js/remark.js
function undoSearch (line 10) | function undoSearch($this) {
function update (line 16) | function update($this) {
FILE: src/scheduled-jobs/ccronexpr.c
type tm (line 89) | struct tm
type tm (line 89) | struct tm
type tm (line 90) | struct tm
type tm (line 91) | struct tm
type tm (line 91) | struct tm
type tm (line 95) | struct tm
function time_t (line 99) | time_t cron_mktime_gm(struct tm* tm) {
type tm (line 137) | struct tm
type tm (line 137) | struct tm
function time_t (line 153) | time_t cron_mktime_local(struct tm* tm) {
type tm (line 158) | struct tm
type tm (line 158) | struct tm
function time_t (line 173) | time_t cron_mktime(struct tm* tm) {
type tm (line 177) | struct tm
type tm (line 177) | struct tm
function time_t (line 182) | time_t cron_mktime(struct tm* tm) {
type tm (line 186) | struct tm
type tm (line 186) | struct tm
function cron_set_bit (line 196) | void cron_set_bit(uint8_t* rbyte, int idx) {
function cron_del_bit (line 203) | void cron_del_bit(uint8_t* rbyte, int idx) {
function cron_get_bit (line 210) | uint8_t cron_get_bit(uint8_t* rbyte, int idx) {
function free_splitted (line 221) | static void free_splitted(char** splitted, size_t len) {
function next_set_bit (line 241) | static unsigned int next_set_bit(uint8_t* bits, unsigned int max, unsign...
function push_to_fields_arr (line 254) | static void push_to_fields_arr(int* arr, int fi) {
function add_to_field (line 270) | static int add_to_field(struct tm* calendar, int field, int val) {
function reset_min (line 307) | static int reset_min(struct tm* calendar, int field) {
function reset_all_min (line 343) | static int reset_all_min(struct tm* calendar, int* fields) {
function set_field (line 358) | static int set_field(struct tm* calendar, int field, int val) {
function find_next (line 398) | static unsigned int find_next(uint8_t* bits, unsigned int max, unsigned ...
function find_next_day (line 424) | static unsigned int find_next_day(struct tm* calendar, uint8_t* days_of_...
function do_next (line 443) | static int do_next(cron_expr* expr, struct tm* calendar, unsigned int do...
function to_upper (line 533) | static int to_upper(char* str) {
function parse_uint (line 594) | static unsigned int parse_uint(const char* str, int* errcode) {
function has_char (line 710) | static int has_char(char* str, char ch) {
function set_number_hits (line 787) | static void set_number_hits(const char* value, uint8_t* target, unsigned...
function set_months (line 866) | static void set_months(char* value, uint8_t* targ, const char** error) {
function set_days_of_week (line 890) | static void set_days_of_week(char* field, uint8_t* targ, const char** er...
function set_days_of_month (line 912) | static void set_days_of_month(char* field, uint8_t* targ, const char** e...
function cron_parse_expr (line 920) | void cron_parse_expr(const char* expression, cron_expr* target, const ch...
function time_t (line 962) | time_t cron_next(cron_expr* expr, time_t date) {
function prev_set_bit (line 1008) | static unsigned int prev_set_bit(uint8_t* bits, int from_index, int to_i...
function last_day_of_month (line 1021) | static int last_day_of_month(int month, int year) {
function reset_max (line 1038) | static int reset_max(struct tm* calendar, int field) {
function reset_all_max (line 1075) | static int reset_all_max(struct tm* calendar, int* fields) {
function find_prev (line 1094) | static unsigned int find_prev(uint8_t* bits, unsigned int max, unsigned ...
function find_prev_day (line 1120) | static unsigned int find_prev_day(struct tm* calendar, uint8_t* days_of_...
function do_prev (line 1139) | static int do_prev(cron_expr* expr, struct tm* calendar, unsigned int do...
function time_t (line 1229) | time_t cron_prev(cron_expr* expr, time_t date) {
FILE: src/scheduled-jobs/ccronexpr.h
type cron_expr (line 42) | typedef struct {
FILE: src/screenshotbot/js/acceptance.js
function replace (line 26) | function replace(href, comment) {
function refreshLeftSideBar (line 44) | function refreshLeftSideBar() {
function updateTab (line 60) | function updateTab(klass) {
FILE: src/screenshotbot/js/common.js
function setupLiveOnAttach (line 21) | function setupLiveOnAttach(selector, fn) {
function callLiveOnAttach (line 30) | function callLiveOnAttach(nodes) {
function updateResizeObserver (line 48) | function updateResizeObserver(el, obs) {
function toggleVisibilityForTwoChildren (line 64) | function toggleVisibilityForTwoChildren(parent,
function prepareReportJs (line 85) | function prepareReportJs () {
function fetchData (line 361) | function fetchData() {
function updateData (line 379) | function updateData(data) {
function setEnabled (line 389) | function setEnabled(link, enabled) {
function updateN (line 397) | function updateN(fn) {
function setupHeadroom (line 427) | function setupHeadroom() {
function prepareBaguetteBox (line 446) | function prepareBaguetteBox(el) {
function setUrlParameter (line 480) | function setUrlParameter(key, value) {
FILE: src/screenshotbot/js/default.js
function stripeTokenHandler (line 75) | function stripeTokenHandler(token) {
function makeHiddenField (line 83) | function makeHiddenField(name, value) {
function getSelectedRuns (line 97) | function getSelectedRuns() {
function swAlert (line 108) | function swAlert(x) {
function deleteNextRun (line 116) | function deleteNextRun() {
function reset (line 169) | function reset () {
function setupNoticeDismiss (line 208) | function setupNoticeDismiss() {
function onError (line 233) | function onError() {
function tryNext (line 237) | function tryNext() {
function setDisabled (line 275) | function setDisabled(val) {
FILE: src/screenshotbot/js/git-graph.js
function setFontWeight (line 9) | function setFontWeight(link, fontWeight) {
function highlightBranch (line 26) | function highlightBranch(commit) {
FILE: src/screenshotbot/js/image-canvas.js
class SbImageCanvas (line 1) | class SbImageCanvas {
method constructor (line 2) | constructor(canvasContainer,
method callCallback (line 34) | callCallback(fn) {
method drawMasks (line 40) | drawMasks() {
method setZoom (line 55) | setZoom(z) {
method getZoom (line 60) | getZoom() {
method setTranslate (line 64) | setTranslate(x, y) {
method updateTransform (line 69) | updateTransform () {
method setForceTransform (line 76) | setForceTransform(z, x, y) {
method animateTo (line 81) | animateTo(newTransform, callback) {
method zoomToImagePx (line 97) | zoomToImagePx(data) {
method updateCoreTransform (line 120) | updateCoreTransform() {
method clearCtx (line 142) | clearCtx() {
method drawBackground (line 150) | drawBackground() {
method draw (line 166) | draw() {
method scheduleDraw (line 236) | scheduleDraw () {
method onImagesLoaded (line 246) | onImagesLoaded() {
method getEventPositionOnCanvas (line 261) | getEventPositionOnCanvas(e) {
method setupDragging (line 274) | setupDragging() {
method setupZoomWheel (line 330) | setupZoomWheel() {
method load (line 372) | load() {
function getSbCanvas (line 449) | function getSbCanvas() {
FILE: src/screenshotbot/js/jquery.timeago.js
function substitute (line 96) | function substitute(stringOrFunction, number) {
function refresh (line 183) | function refresh() {
function prepareData (line 207) | function prepareData(element) {
function inWords (line 221) | function inWords(date) {
function distance (line 225) | function distance(date) {
FILE: src/screenshotbot/js/js-stubs.js
function makeMatrix (line 1) | function makeMatrix(a, b, c, d, e, f) {
function _mat_mstar (line 5) | function _mat_mstar(a, b) {
function _vec_vec3 (line 22) | function _vec_vec3(a, b) {
function _vec_v (line 26) | function _vec_v(a, b) { // this is actually `v-`.
function _vec_vstar (line 31) | function _vec_vstar(mult, vec) {
function _vec_vx3 (line 36) | function _vec_vx3(vec) {
function _vec_vy3 (line 40) | function _vec_vy3(vec) {
function _mat_mplus (line 44) | function _mat_mplus(v1, v2) {
FILE: src/screenshotbot/js/mask-editor.js
function getOriginalPoint (line 1) | function getOriginalPoint(canvas, point) {
function prepareMaskEditor (line 7) | function prepareMaskEditor() {
function prepareMaskEditorHelper (line 34) | function prepareMaskEditorHelper(img, overlay) {
function enableZoomOnCanvas (line 216) | function enableZoomOnCanvas(canvas) {
function enablePanningOnCanvas (line 253) | function enablePanningOnCanvas(canvas) {
FILE: src/screenshotbot/js/runs.js
function updateAjaxResults (line 3) | function updateAjaxResults($target) {
function switchTab (line 52) | function switchTab() {
FILE: src/screenshotbot/js/split.js
function setElementSize (line 225) | function setElementSize(el, size, gutSize, i) {
function setGutterSize (line 238) | function setGutterSize(gutterElement, gutSize, i) {
function getSizes (line 247) | function getSizes() {
function getMousePosition (line 253) | function getMousePosition(e) {
function adjust (line 264) | function adjust(offset) {
function drag (line 290) | function drag(e) {
function calculateSizes (line 342) | function calculateSizes() {
function innerSize (line 359) | function innerSize(element) {
function trimToMin (line 389) | function trimToMin(sizesToTrim) {
function stopDragging (line 457) | function stopDragging() {
function startDragging (line 502) | function startDragging(e) {
function adjustToMin (line 681) | function adjustToMin(element) {
function setSizes (line 707) | function setSizes(newSizes) {
function destroy (line 725) | function destroy(preserveStyles, preserveGutter) {
FILE: src/screenshotbot/js/vendor/baguetteBox.js
function run (line 164) | function run(selector, userOptions) {
function bindImageClickListeners (line 175) | function bindImageClickListeners(selector, userOptions) {
function clearCachedData (line 227) | function clearCachedData() {
function removeFromCache (line 235) | function removeFromCache(selector) {
function buildOverlay (line 253) | function buildOverlay() {
function keyDownHandler (line 299) | function keyDownHandler(event) {
function bindEvents (line 319) | function bindEvents() {
function unbindEvents (line 334) | function unbindEvents() {
function prepareOverlay (line 349) | function prepareOverlay(gallery, userOptions) {
function setOptions (line 380) | function setOptions(newOptions) {
function showOverlay (line 409) | function showOverlay(chosenImageIndex) {
function initFocus (line 453) | function initFocus() {
function enterFullScreen (line 461) | function enterFullScreen() {
function exitFullscreen (line 471) | function exitFullscreen() {
function hideOverlay (line 481) | function hideOverlay() {
function loadImage (line 509) | function loadImage(index, callback) {
function getImageSrc (line 575) | function getImageSrc(image) {
function showNextImage (line 604) | function showNextImage() {
function showPreviousImage (line 609) | function showPreviousImage() {
function showFirstImage (line 614) | function showFirstImage(event) {
function showLastImage (line 622) | function showLastImage(event) {
function show (line 635) | function show(index, gallery) {
function bounceAnimation (line 672) | function bounceAnimation(direction) {
function updateOffset (line 679) | function updateOffset() {
function testTransformsSupport (line 697) | function testTransformsSupport() {
function testSvgSupport (line 703) | function testSvgSupport() {
function testPassiveEventsSupport (line 711) | function testPassiveEventsSupport() {
function preloadNext (line 726) | function preloadNext(index) {
function preloadPrev (line 735) | function preloadPrev(index) {
function bind (line 744) | function bind(element, event, callback, options) {
function unbind (line 758) | function unbind(element, event, callback, options) {
function getByID (line 767) | function getByID(id) {
function create (line 771) | function create(element) {
function destroyPlugin (line 775) | function destroyPlugin() {
FILE: src/screenshotbot/js/vendor/bootstrap-modalmanager.js
function targetIsSelf (line 386) | function targetIsSelf(callback){
FILE: src/screenshotbot/js/vendor/headroom.js
function isBrowser (line 13) | function isBrowser() {
function passiveEventsSupported (line 21) | function passiveEventsSupported() {
function isSupported (line 40) | function isSupported() {
function isDocument (line 51) | function isDocument(obj) {
function isWindow (line 55) | function isWindow(obj) {
function windowScroller (line 61) | function windowScroller(win) {
function elementScroller (line 104) | function elementScroller(element) {
function createScroller (line 134) | function createScroller(element) {
function trackScroll (line 141) | function trackScroll(element, options, callback) {
function normalizeUpDown (line 193) | function normalizeUpDown(t) {
function Headroom (line 205) | function Headroom(elem, options) {
FILE: src/screenshotbot/js/vendor/jquery-3.5.1.js
function DOMEval (line 103) | function DOMEval( code, node, doc ) {
function toType (line 133) | function toType( obj ) {
function isArrayLike (line 503) | function isArrayLike( obj ) {
function Sizzle (line 755) | function Sizzle( selector, context, results, seed ) {
function createCache (line 903) | function createCache() {
function markFunction (line 923) | function markFunction( fn ) {
function assert (line 932) | function assert( fn ) {
function addHandle (line 956) | function addHandle( attrs, handler ) {
function siblingCheck (line 971) | function siblingCheck( a, b ) {
function createInputPseudo (line 997) | function createInputPseudo( type ) {
function createButtonPseudo (line 1008) | function createButtonPseudo( type ) {
function createDisabledPseudo (line 1019) | function createDisabledPseudo( disabled ) {
function createPositionalPseudo (line 1075) | function createPositionalPseudo( fn ) {
function testContext (line 1098) | function testContext( context ) {
function setFilters (line 2309) | function setFilters() {}
function toSelector (line 2383) | function toSelector( tokens ) {
function addCombinator (line 2393) | function addCombinator( matcher, combinator, base ) {
function elementMatcher (line 2460) | function elementMatcher( matchers ) {
function multipleContexts (line 2474) | function multipleContexts( selector, contexts, results ) {
function condense (line 2483) | function condense( unmatched, map, filter, context, xml ) {
function setMatcher (line 2504) | function setMatcher( preFilter, selector, matcher, postFilter, postFinde...
function matcherFromTokens (line 2604) | function matcherFromTokens( tokens ) {
function matcherFromGroupMatchers (line 2667) | function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
function nodeName (line 3025) | function nodeName( elem, name ) {
function winnow (line 3035) | function winnow( elements, qualifier, not ) {
function sibling (line 3330) | function sibling( cur, dir ) {
function createOptions (line 3423) | function createOptions( options ) {
function Identity (line 3648) | function Identity( v ) {
function Thrower (line 3651) | function Thrower( ex ) {
function adoptValue (line 3655) | function adoptValue( value, resolve, reject, noValue ) {
function resolve (line 3748) | function resolve( depth, deferred, handler, special ) {
function completed (line 4113) | function completed() {
function fcamelCase (line 4208) | function fcamelCase( _all, letter ) {
function camelCase (line 4215) | function camelCase( string ) {
function Data (line 4232) | function Data() {
function getData (line 4401) | function getData( data ) {
function dataAttr (line 4426) | function dataAttr( elem, key, data ) {
function adjustCSS (line 4738) | function adjustCSS( elem, prop, valueParts, tween ) {
function getDefaultDisplay (line 4806) | function getDefaultDisplay( elem ) {
function showHide (line 4829) | function showHide( elements, show ) {
function getAll (line 4961) | function getAll( context, tag ) {
function setGlobalEval (line 4986) | function setGlobalEval( elems, refElements ) {
function buildFragment (line 5002) | function buildFragment( elems, context, scripts, selection, ignored ) {
function returnTrue (line 5097) | function returnTrue() {
function returnFalse (line 5101) | function returnFalse() {
function expectSync (line 5111) | function expectSync( elem, type ) {
function safeActiveElement (line 5118) | function safeActiveElement() {
function on (line 5124) | function on( elem, types, selector, data, fn, one ) {
function leverageNative (line 5612) | function leverageNative( el, type, expectSync ) {
function manipulationTarget (line 5976) | function manipulationTarget( elem, content ) {
function disableScript (line 5987) | function disableScript( elem ) {
function restoreScript (line 5991) | function restoreScript( elem ) {
function cloneCopyEvent (line 6001) | function cloneCopyEvent( src, dest ) {
function fixInput (line 6034) | function fixInput( src, dest ) {
function domManip (line 6047) | function domManip( collection, args, callback, ignored ) {
function remove (line 6139) | function remove( elem, selector, keepData ) {
function computeStyleTests (line 6453) | function computeStyleTests() {
function roundPixelMeasures (line 6497) | function roundPixelMeasures( measure ) {
function curCSS (line 6571) | function curCSS( elem, name, computed ) {
function addGetHookIf (line 6624) | function addGetHookIf( conditionFn, hookFn ) {
function vendorPropName (line 6649) | function vendorPropName( name ) {
function finalPropName (line 6664) | function finalPropName( name ) {
function setPositiveNumber (line 6690) | function setPositiveNumber( _elem, value, subtract ) {
function boxModelAdjustment (line 6702) | function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, ...
function getWidthOrHeight (line 6770) | function getWidthOrHeight( elem, dimension, extra ) {
function Tween (line 7146) | function Tween( elem, options, prop, end, easing ) {
function schedule (line 7269) | function schedule() {
function createFxNow (line 7282) | function createFxNow() {
function genFx (line 7290) | function genFx( type, includeWidth ) {
function createTween (line 7310) | function createTween( value, prop, animation ) {
function defaultPrefilter (line 7324) | function defaultPrefilter( elem, props, opts ) {
function propFilter (line 7496) | function propFilter( props, specialEasing ) {
function Animation (line 7533) | function Animation( elem, properties, options ) {
function stripAndCollapse (line 8248) | function stripAndCollapse( value ) {
function getClass (line 8254) | function getClass( elem ) {
function classesToArray (line 8258) | function classesToArray( value ) {
function buildParams (line 8885) | function buildParams( prefix, obj, traditional, add ) {
function addToPrefiltersOrTransports (line 9039) | function addToPrefiltersOrTransports( structure ) {
function inspectPrefiltersOrTransports (line 9073) | function inspectPrefiltersOrTransports( structure, options, originalOpti...
function ajaxExtend (line 9102) | function ajaxExtend( target, src ) {
function ajaxHandleResponses (line 9122) | function ajaxHandleResponses( s, jqXHR, responses ) {
function ajaxConvert (line 9180) | function ajaxConvert( s, response, jqXHR, isSuccess ) {
function done (line 9696) | function done( status, nativeStatusText, responses, headers ) {
FILE: src/screenshotbot/js/vendor/jquery-ui.js
function _super (line 128) | function _super() {
function _superApply (line 132) | function _superApply( args ) {
function processClassString (line 512) | function processClassString( classes, checkOption ) {
function handlerProxy (line 595) | function handlerProxy() {
function handlerProxy (line 639) | function handlerProxy() {
function getOffsets (line 775) | function getOffsets( offsets, width, height ) {
function parseCss (line 782) | function parseCss( element, property ) {
function getDimensions (line 786) | function getDimensions( elem ) {
function clamp (line 1482) | function clamp( value, prop, allowEmpty ) {
function stringParse (line 1509) | function stringParse( string ) {
function hue2rgb (line 1763) | function hue2rgb( p, q, h ) {
function getElementStyles (line 2037) | function getElementStyles( elem ) {
function styleDifference (line 2065) | function styleDifference( oldStyle, newStyle ) {
function _normalizeArguments (line 2558) | function _normalizeArguments( effect, options, speed, callback ) {
function standardAnimationOption (line 2610) | function standardAnimationOption( option ) {
function run (line 2687) | function run( next ) {
function parseClip (line 2835) | function parseClip( str, element ) {
function childComplete (line 3219) | function childComplete() {
function animComplete (line 3269) | function animComplete() {
function visible (line 3929) | function visible( element ) {
function reduce (line 4057) | function reduce( elem, size, border, margin ) {
function datepicker_getZindex (line 7189) | function datepicker_getZindex( elem ) {
function Datepicker (line 7218) | function Datepicker() {
function datepicker_bindHover (line 9184) | function datepicker_bindHover( dpDiv ) {
function datepicker_handleMouseover (line 9198) | function datepicker_handleMouseover() {
function datepicker_extendRemove (line 9212) | function datepicker_extendRemove( target, props ) {
function checkFocus (line 12247) | function checkFocus() {
function filteredUi (line 12454) | function filteredUi( ui ) {
function filteredUi (line 12502) | function filteredUi( ui ) {
function isOverAxis (line 13099) | function isOverAxis( x, reference, size ) {
function addItems (line 15923) | function addItems() {
function delayEvent (line 16657) | function delayEvent( type, instance, container ) {
function spinnerModifer (line 16757) | function spinnerModifer( fn ) {
function checkFocus (line 16888) | function checkFocus() {
function constrain (line 17539) | function constrain() {
function complete (line 17926) | function complete() {
function show (line 17931) | function show() {
function position (line 18483) | function position( event ) {
FILE: src/screenshotbot/js/vendor/metisMenu.js
function _extends (line 16) | function _extends() {
function getSpecialTransitionEndEvent (line 48) | function getSpecialTransitionEndEvent() {
function transitionEndEmulator (line 62) | function transitionEndEmulator(duration) {
function setTransitionEndSupport (line 77) | function setTransitionEndSupport() {
function MetisMenu (line 119) | function MetisMenu(element, config) {
FILE: src/screenshotbot/js/vendor/moment.js
function hooks (line 15) | function hooks() {
function setHookCallback (line 21) | function setHookCallback(callback) {
function isArray (line 25) | function isArray(input) {
function isObject (line 32) | function isObject(input) {
function hasOwnProp (line 41) | function hasOwnProp(a, b) {
function isObjectEmpty (line 45) | function isObjectEmpty(obj) {
function isUndefined (line 59) | function isUndefined(input) {
function isNumber (line 63) | function isNumber(input) {
function isDate (line 70) | function isDate(input) {
function map (line 77) | function map(arr, fn) {
function extend (line 86) | function extend(a, b) {
function createUTC (line 104) | function createUTC(input, format, locale, strict) {
function defaultParsingFlags (line 108) | function defaultParsingFlags() {
function getParsingFlags (line 130) | function getParsingFlags(m) {
function isValid (line 156) | function isValid(m) {
function createInvalid (line 192) | function createInvalid(flags) {
function copyConfig (line 208) | function copyConfig(to, from) {
function Moment (line 256) | function Moment(config) {
function isMoment (line 271) | function isMoment(obj) {
function warn (line 277) | function warn(msg) {
function deprecate (line 287) | function deprecate(msg, fn) {
function deprecateSimple (line 329) | function deprecateSimple(name, msg) {
function isFunction (line 342) | function isFunction(input) {
function set (line 349) | function set(config) {
function mergeConfigs (line 372) | function mergeConfigs(parentConfig, childConfig) {
function Locale (line 401) | function Locale(config) {
function calendar (line 433) | function calendar(key, mom, now) {
function zeroFill (line 438) | function zeroFill(number, targetLength, forceSign) {
function addFormatToken (line 458) | function addFormatToken(token, padded, ordinal, callback) {
function removeFormattingTokens (line 483) | function removeFormattingTokens(input) {
function makeFormatFunction (line 490) | function makeFormatFunction(format) {
function formatMoment (line 516) | function formatMoment(m, format) {
function expandFormat (line 528) | function expandFormat(format, locale) {
function longDateFormat (line 557) | function longDateFormat(key) {
function invalidDate (line 585) | function invalidDate() {
function ordinal (line 592) | function ordinal(number) {
function relativeTime (line 615) | function relativeTime(number, withoutSuffix, string, isFuture) {
function pastFuture (line 622) | function pastFuture(diff, output) {
function addUnitAlias (line 629) | function addUnitAlias(unit, shorthand) {
function normalizeUnits (line 634) | function normalizeUnits(units) {
function normalizeObjectUnits (line 640) | function normalizeObjectUnits(inputObject) {
function addUnitPriority (line 659) | function addUnitPriority(unit, priority) {
function getPrioritizedUnits (line 663) | function getPrioritizedUnits(unitsObj) {
function isLeapYear (line 677) | function isLeapYear(year) {
function absFloor (line 681) | function absFloor(number) {
function toInt (line 690) | function toInt(argumentForCoercion) {
function makeGetSet (line 701) | function makeGetSet(unit, keepTime) {
function get (line 713) | function get(mom, unit) {
function set$1 (line 719) | function set$1(mom, unit, value) {
function stringGet (line 741) | function stringGet(units) {
function stringSet (line 749) | function stringSet(units, value) {
function addRegexToken (line 789) | function addRegexToken(token, regex, strictRegex) {
function getParseRegexForToken (line 797) | function getParseRegexForToken(token, config) {
function unescapeFormat (line 806) | function unescapeFormat(s) {
function regexEscape (line 822) | function regexEscape(s) {
function addParseToken (line 828) | function addParseToken(token, callback) {
function addWeekParseToken (line 844) | function addWeekParseToken(token, callback) {
function addTimeToArrayFromToken (line 851) | function addTimeToArrayFromToken(token, input, config) {
function mod (line 867) | function mod(n, x) {
function daysInMonth (line 888) | function daysInMonth(year, month) {
function localeMonths (line 960) | function localeMonths(m, format) {
function localeMonthsShort (line 975) | function localeMonthsShort(m, format) {
function handleStrictParse (line 988) | function handleStrictParse(monthName, format, strict) {
function localeMonthsParse (line 1035) | function localeMonthsParse(monthName, format, strict) {
function setMonth (line 1090) | function setMonth(mom, value) {
function getSetMonth (line 1115) | function getSetMonth(value) {
function getDaysInMonth (line 1125) | function getDaysInMonth() {
function monthsShortRegex (line 1129) | function monthsShortRegex(isStrict) {
function monthsRegex (line 1149) | function monthsRegex(isStrict) {
function computeMonthsParse (line 1169) | function computeMonthsParse() {
function daysInYear (line 1257) | function daysInYear(year) {
function getIsLeapYear (line 1271) | function getIsLeapYear() {
function createDate (line 1275) | function createDate(y, m, d, h, M, s, ms) {
function createUTCDate (line 1293) | function createUTCDate(y) {
function firstWeekOffset (line 1312) | function firstWeekOffset(year, dow, doy) {
function dayOfYearFromWeeks (line 1322) | function dayOfYearFromWeeks(year, week, weekday, dow, doy) {
function weekOfYear (line 1346) | function weekOfYear(mom, dow, doy) {
function weeksInYear (line 1369) | function weeksInYear(year, dow, doy) {
function localeWeek (line 1410) | function localeWeek(mom) {
function localeFirstDayOfWeek (line 1419) | function localeFirstDayOfWeek() {
function localeFirstDayOfYear (line 1423) | function localeFirstDayOfYear() {
function getSetWeek (line 1429) | function getSetWeek(input) {
function getSetISOWeek (line 1434) | function getSetISOWeek(input) {
function parseWeekday (line 1500) | function parseWeekday(input, locale) {
function parseIsoWeekday (line 1517) | function parseIsoWeekday(input, locale) {
function shiftWeekdays (line 1525) | function shiftWeekdays(ws, n) {
function localeWeekdays (line 1538) | function localeWeekdays(m, format) {
function localeWeekdaysShort (line 1553) | function localeWeekdaysShort(m) {
function localeWeekdaysMin (line 1561) | function localeWeekdaysMin(m) {
function handleStrictParse$1 (line 1569) | function handleStrictParse$1(weekdayName, format, strict) {
function localeWeekdaysParse (line 1642) | function localeWeekdaysParse(weekdayName, format, strict) {
function getSetDayOfWeek (line 1711) | function getSetDayOfWeek(input) {
function getSetLocaleDayOfWeek (line 1724) | function getSetLocaleDayOfWeek(input) {
function getSetISODayOfWeek (line 1732) | function getSetISODayOfWeek(input) {
function weekdaysRegex (line 1749) | function weekdaysRegex(isStrict) {
function weekdaysShortRegex (line 1769) | function weekdaysShortRegex(isStrict) {
function weekdaysMinRegex (line 1789) | function weekdaysMinRegex(isStrict) {
function computeWeekdaysParse (line 1809) | function computeWeekdaysParse() {
function hFormat (line 1863) | function hFormat() {
function kFormat (line 1867) | function kFormat() {
function meridiem (line 1901) | function meridiem(token, lowercase) {
function matchMeridiem (line 1923) | function matchMeridiem(isStrict, locale) {
function localeIsPM (line 1983) | function localeIsPM(input) {
function localeMeridiem (line 1996) | function localeMeridiem(hours, minutes, isLower) {
function commonPrefix (line 2029) | function commonPrefix(arr1, arr2) {
function normalizeLocale (line 2040) | function normalizeLocale(key) {
function chooseLocale (line 2047) | function chooseLocale(names) {
function loadLocale (line 2079) | function loadLocale(name) {
function getSetGlobalLocale (line 2106) | function getSetGlobalLocale(key, values) {
function defineLocale (line 2131) | function defineLocale(name, config) {
function updateLocale (line 2185) | function updateLocale(name, config) {
function getLocale (line 2231) | function getLocale(key) {
function listLocales (line 2254) | function listLocales() {
function checkOverflow (line 2258) | function checkOverflow(m) {
function configFromISO (line 2351) | function configFromISO(config) {
function extractFromRFC2822Strings (line 2407) | function extractFromRFC2822Strings(
function untruncateYear (line 2430) | function untruncateYear(yearStr) {
function preprocessRFC2822 (line 2440) | function preprocessRFC2822(s) {
function checkWeekday (line 2449) | function checkWeekday(weekdayStr, parsedInput, config) {
function calculateOffset (line 2467) | function calculateOffset(obsOffset, militaryOffset, numOffset) {
function configFromRFC2822 (line 2482) | function configFromRFC2822(config) {
function configFromString (line 2511) | function configFromString(config) {
function defaults (line 2550) | function defaults(a, b, c) {
function currentDateArray (line 2560) | function currentDateArray(config) {
function configFromArray (line 2577) | function configFromArray(config) {
function dayOfYearFromWeekInfo (line 2666) | function dayOfYearFromWeekInfo(config) {
function configFromStringAndFormat (line 2734) | function configFromStringAndFormat(config) {
function meridiemFixWrap (line 2823) | function meridiemFixWrap(locale, hour, meridiem) {
function configFromStringAndArray (line 2849) | function configFromStringAndArray(config) {
function configFromObject (line 2909) | function configFromObject(config) {
function createFromConfig (line 2926) | function createFromConfig(config) {
function prepareConfig (line 2937) | function prepareConfig(config) {
function configFromInput (line 2970) | function configFromInput(config) {
function createLocalOrUTC (line 2993) | function createLocalOrUTC(input, format, locale, strict, isUTC) {
function createLocal (line 3024) | function createLocal(input, format, locale, strict) {
function pickBy (line 3056) | function pickBy(fn, moments) {
function min (line 3074) | function min() {
function max (line 3080) | function max() {
function isDurationValid (line 3102) | function isDurationValid(m) {
function isValid$1 (line 3132) | function isValid$1() {
function createInvalid$1 (line 3136) | function createInvalid$1() {
function Duration (line 3140) | function Duration(duration) {
function isDuration (line 3175) | function isDuration(obj) {
function absRound (line 3179) | function absRound(number) {
function compareArrays (line 3188) | function compareArrays(array1, array2, dontConvert) {
function offset (line 3206) | function offset(token, separator) {
function offsetFromString (line 3242) | function offsetFromString(matcher, string) {
function cloneWithOffset (line 3260) | function cloneWithOffset(input, model) {
function getDateOffset (line 3277) | function getDateOffset(m) {
function getSetOffset (line 3301) | function getSetOffset(input, keepLocalTime, keepMinutes) {
function getSetZone (line 3344) | function getSetZone(input, keepLocalTime) {
function setOffsetToUTC (line 3358) | function setOffsetToUTC(keepLocalTime) {
function setOffsetToLocal (line 3362) | function setOffsetToLocal(keepLocalTime) {
function setOffsetToParsedOffset (line 3374) | function setOffsetToParsedOffset() {
function hasAlignedHourOffset (line 3388) | function hasAlignedHourOffset(input) {
function isDaylightSavingTime (line 3397) | function isDaylightSavingTime() {
function isDaylightSavingTimeShifted (line 3404) | function isDaylightSavingTimeShifted() {
function isLocal (line 3426) | function isLocal() {
function isUtcOffset (line 3430) | function isUtcOffset() {
function isUtc (line 3434) | function isUtc() {
function createDuration (line 3445) | function createDuration(input, key) {
function parseIso (line 3520) | function parseIso(inp, sign) {
function positiveMomentsDifference (line 3529) | function positiveMomentsDifference(base, other) {
function momentsDifference (line 3543) | function momentsDifference(base, other) {
function createAdder (line 3562) | function createAdder(direction, name) {
function addSubtract (line 3587) | function addSubtract(mom, duration, isAdding, updateOffset) {
function isString (line 3616) | function isString(input) {
function isMomentInput (line 3621) | function isMomentInput(input) {
function isMomentInputObject (line 3634) | function isMomentInputObject(input) {
function isNumberOrStringArray (line 3674) | function isNumberOrStringArray(input) {
function isCalendarSpec (line 3686) | function isCalendarSpec(input) {
function getCalendarFormat (line 3708) | function getCalendarFormat(myMoment, now) {
function calendar$1 (line 3725) | function calendar$1(time, formats) {
function clone (line 3755) | function clone() {
function isAfter (line 3759) | function isAfter(input, units) {
function isBefore (line 3772) | function isBefore(input, units) {
function isBetween (line 3785) | function isBetween(from, to, units, inclusivity) {
function isSame (line 3802) | function isSame(input, units) {
function isSameOrAfter (line 3820) | function isSameOrAfter(input, units) {
function isSameOrBefore (line 3824) | function isSameOrBefore(input, units) {
function diff (line 3828) | function diff(input, units, asFloat) {
function monthDiff (line 3877) | function monthDiff(a, b) {
function toString (line 3907) | function toString() {
function toISOString (line 3911) | function toISOString(keepOffset) {
function inspect (line 3947) | function inspect() {
function format (line 3969) | function format(inputString) {
function from (line 3979) | function from(time, withoutSuffix) {
function fromNow (line 3992) | function fromNow(withoutSuffix) {
function to (line 3996) | function to(time, withoutSuffix) {
function toNow (line 4009) | function toNow(withoutSuffix) {
function locale (line 4016) | function locale(key) {
function localeData (line 4041) | function localeData() {
function mod$1 (line 4051) | function mod$1(dividend, divisor) {
function localStartOfDate (line 4055) | function localStartOfDate(y, m, d) {
function utcStartOfDate (line 4065) | function utcStartOfDate(y, m, d) {
function startOf (line 4075) | function startOf(units) {
function endOf (line 4138) | function endOf(units) {
function valueOf (line 4207) | function valueOf() {
function unix (line 4211) | function unix() {
function toDate (line 4215) | function toDate() {
function toArray (line 4219) | function toArray() {
function toObject (line 4232) | function toObject() {
function toJSON (line 4245) | function toJSON() {
function isValid$2 (line 4250) | function isValid$2() {
function parsingFlags (line 4254) | function parsingFlags() {
function invalidAt (line 4258) | function invalidAt() {
function creationData (line 4262) | function creationData() {
function localeEras (line 4323) | function localeEras(m, format) {
function localeErasParse (line 4351) | function localeErasParse(eraName, format, strict) {
function localeErasConvertYear (line 4393) | function localeErasConvertYear(era, year) {
function getEraName (line 4402) | function getEraName() {
function getEraNarrow (line 4422) | function getEraNarrow() {
function getEraAbbr (line 4442) | function getEraAbbr() {
function getEraYear (line 4462) | function getEraYear() {
function erasNameRegex (line 4488) | function erasNameRegex(isStrict) {
function erasAbbrRegex (line 4495) | function erasAbbrRegex(isStrict) {
function erasNarrowRegex (line 4502) | function erasNarrowRegex(isStrict) {
function matchEraAbbr (line 4509) | function matchEraAbbr(isStrict, locale) {
function matchEraName (line 4513) | function matchEraName(isStrict, locale) {
function matchEraNarrow (line 4517) | function matchEraNarrow(isStrict, locale) {
function matchEraYearOrdinal (line 4521) | function matchEraYearOrdinal(isStrict, locale) {
function computeErasParse (line 4525) | function computeErasParse() {
function addWeekYearFormatToken (line 4563) | function addWeekYearFormatToken(token, getter) {
function getSetWeekYear (line 4608) | function getSetWeekYear(input) {
function getSetISOWeekYear (line 4619) | function getSetISOWeekYear(input) {
function getISOWeeksInYear (line 4630) | function getISOWeeksInYear() {
function getISOWeeksInISOWeekYear (line 4634) | function getISOWeeksInISOWeekYear() {
function getWeeksInYear (line 4638) | function getWeeksInYear() {
function getWeeksInWeekYear (line 4643) | function getWeeksInWeekYear() {
function getSetWeekYearHelper (line 4648) | function getSetWeekYearHelper(input, week, weekday, dow, doy) {
function setWeekAll (line 4661) | function setWeekAll(weekYear, week, weekday, dow, doy) {
function getSetQuarter (line 4692) | function getSetQuarter(input) {
function getSetDayOfYear (line 4752) | function getSetDayOfYear(input) {
function parseMs (line 4853) | function parseMs(input, array) {
function getZoneAbbr (line 4870) | function getZoneAbbr() {
function getZoneName (line 4874) | function getZoneName() {
function createUnix (line 4982) | function createUnix(input) {
function createInZone (line 4986) | function createInZone() {
function preParsePostFormat (line 4990) | function preParsePostFormat(string) {
function get$1 (line 5033) | function get$1(format, index, field, setter) {
function listMonthsImpl (line 5039) | function listMonthsImpl(format, index, field) {
function listWeekdaysImpl (line 5067) | function listWeekdaysImpl(localeSorted, format, index, field) {
function listMonths (line 5103) | function listMonths(format, index) {
function listMonthsShort (line 5107) | function listMonthsShort(format, index) {
function listWeekdays (line 5111) | function listWeekdays(localeSorted, format, index) {
function listWeekdaysShort (line 5115) | function listWeekdaysShort(localeSorted, format, index) {
function listWeekdaysMin (line 5119) | function listWeekdaysMin(localeSorted, format, index) {
function abs (line 5172) | function abs() {
function addSubtract$1 (line 5189) | function addSubtract$1(duration, input, value, direction) {
function add$1 (line 5200) | function add$1(input, value) {
function subtract$1 (line 5205) | function subtract$1(input, value) {
function absCeil (line 5209) | function absCeil(number) {
function bubble (line 5217) | function bubble() {
function daysToMonths (line 5272) | function daysToMonths(days) {
function monthsToDays (line 5278) | function monthsToDays(months) {
function as (line 5283) | function as(units) {
function valueOf$1 (line 5328) | function valueOf$1() {
function makeAs (line 5340) | function makeAs(alias) {
function clone$1 (line 5356) | function clone$1() {
function get$2 (line 5360) | function get$2(units) {
function makeGetter (line 5365) | function makeGetter(name) {
function weeks (line 5379) | function weeks() {
function substituteTimeAgo (line 5395) | function substituteTimeAgo(string, number, withoutSuffix, isFuture, loca...
function relativeTime$1 (line 5399) | function relativeTime$1(posNegDuration, withoutSuffix, thresholds, local...
function getSetRelativeTimeRounding (line 5436) | function getSetRelativeTimeRounding(roundingFunction) {
function getSetRelativeTimeThreshold (line 5448) | function getSetRelativeTimeThreshold(threshold, limit) {
function humanize (line 5462) | function humanize(argWithSuffix, argThresholds) {
function sign (line 5498) | function sign(x) {
function toISOString$1 (line 5502) | function toISOString$1() {
FILE: src/screenshotbot/js/vendor/select2.js
function hasProp (line 65) | function hasProp(obj, prop) {
function normalize (line 77) | function normalize(name, baseName) {
function makeRequire (line 187) | function makeRequire(relName, forceSync) {
function makeNormalize (line 204) | function makeNormalize(relName) {
function makeLoad (line 210) | function makeLoad(depName) {
function callDep (line 216) | function callDep(name) {
function splitPrefix (line 233) | function splitPrefix(name) {
function makeRelParts (line 245) | function makeRelParts(relName) {
function makeConfig (line 293) | function makeConfig(name) {
function BaseConstructor (line 509) | function BaseConstructor () {
function getMethods (line 526) | function getMethods (theClass) {
function DecoratedClass (line 552) | function DecoratedClass () {
function ctr (line 570) | function ctr () {
function Results (line 846) | function Results ($element, options, dataAdapter) {
function BaseSelection (line 1409) | function BaseSelection ($element, options) {
function SingleSelection (line 1589) | function SingleSelection () {
function MultipleSelection (line 1696) | function MultipleSelection ($element, options) {
function Placeholder (line 1811) | function Placeholder (decorated, $element, options) {
function AllowClear (line 1863) | function AllowClear () { }
function Search (line 1977) | function Search (decorated, $element, options) {
function EventRelay (line 2212) | function EventRelay () { }
function Translation (line 2262) | function Translation (dict) {
function BaseAdapter (line 3149) | function BaseAdapter ($element, options) {
function SelectAdapter (line 3192) | function SelectAdapter ($element, options) {
function ArrayAdapter (line 3478) | function ArrayAdapter ($element, options) {
function onlyItem (line 3517) | function onlyItem (item) {
function AjaxAdapter (line 3562) | function AjaxAdapter ($element, options) {
function request (line 3623) | function request () {
function Tags (line 3671) | function Tags (decorated, $element, options) {
function wrapper (line 3710) | function wrapper (obj, child) {
function Tokenizer (line 3798) | function Tokenizer (decorated, $element, options) {
function createAndSelect (line 3818) | function createAndSelect (data) {
function select (line 3841) | function select (data) {
function MinimumInputLength (line 3915) | function MinimumInputLength (decorated, $e, options) {
function MaximumInputLength (line 3946) | function MaximumInputLength (decorated, $e, options) {
function MaximumSelectionLength (line 3978) | function MaximumSelectionLength (decorated, $e, options) {
function Dropdown (line 4034) | function Dropdown ($element, options) {
function Search (line 4077) | function Search () { }
function HidePlaceholder (line 4192) | function HidePlaceholder (decorated, $element, options, dataAdapter) {
function InfiniteScroll (line 4235) | function InfiniteScroll (decorated, $element, options, dataAdapter) {
function AttachBody (line 4329) | function AttachBody (decorated, $element, options) {
function countResults (line 4586) | function countResults (data) {
function MinimumResultsFor
Copy disabled (too large)
Download .json
Condensed preview — 2159 files, each showing path, character count, and a content snippet. Download the .json file for the full structured content (14,966K chars).
[
{
"path": ".circleci/config.yml",
"chars": 1416,
"preview": "version: 2.1\n\njobs:\n build:\n docker:\n - image: debian:trixie\n steps:\n - run: &install_deps\n na"
},
{
"path": ".dockerignore",
"chars": 372,
"preview": "bazel-*\n*.pyc\n.#*\nlog/*\nsupervise\njipr/static/binary/\njipr/static/releases/\npictures for sam\ngallery-uploads\nweb-bin\n.we"
},
{
"path": ".gitattributes",
"chars": 36,
"preview": "*.lisp text eol=lf\n*.txt text eol=lf"
},
{
"path": ".gitignore",
"chars": 812,
"preview": "bazel-*\n*.pyc\n.#*\nlog/*\nsupervise\njipr/static/binary/\njipr/static/releases/\npictures for sam\ngallery-uploads\nweb-bin\n.we"
},
{
"path": "Dockerfile",
"chars": 557,
"preview": "FROM debian:trixie AS magick_base\n\n\nRUN apt-get update && apt-get install -y libyaml-dev git-core libpng-dev zlib1g-dev "
},
{
"path": "LICENSE",
"chars": 16726,
"preview": "Mozilla Public License Version 2.0\n==================================\n\n1. Definitions\n--------------\n\n1.1. \"Contributor\""
},
{
"path": "Makefile",
"chars": 7392,
"preview": "# Copyright 2018-Present Modern Interpreters Inc.\n#\n# This Source Code Form is subject to the terms of the Mozilla Publi"
},
{
"path": "README.md",
"chars": 10633,
"preview": "<p align=\"center\">\n <img src=\"https://screenshotbot.io/assets/images/logo-dark.svg\" width=\"40%\" />\n</p>\n\n# Screenshot"
},
{
"path": "docker-compose.yml",
"chars": 348,
"preview": "version: \"3.9\"\nservices:\n screenshotbot:\n build:\n context: ${SB_OSS_CONTEXT-.}\n dockerfile: ${SB_OSS_DOCKE"
},
{
"path": "launch.lisp",
"chars": 642,
"preview": ";;;; Copyright 2018-Present Modern Interpreters Inc.\n;;;;\n;;;; This Source Code Form is subject to the terms of the Mozi"
},
{
"path": "quicklisp/.gitignore",
"chars": 124,
"preview": "cache\ndists/quicklisp/software\ndists/quicklisp/archives\ndists/quicklisp/installed\ndists/quicklisp/*.cdb\nretired/\ntmp\n*fa"
},
{
"path": "quicklisp/asdf.lisp",
"chars": 643253,
"preview": ";;; -*- mode: Lisp; Base: 10 ; Syntax: ANSI-Common-Lisp ; buffer-read-only: t; -*-\n;;; This is ASDF 3.2.1: Another Syste"
},
{
"path": "quicklisp/client-info.sexp",
"chars": 839,
"preview": "(:version \"2021-02-13\"\n :client-info-format \"1\"\n\n :subscription-url\n \"http://beta.quicklisp.org/client/quicklisp.sexp\"\n "
},
{
"path": "quicklisp/dists/quicklisp/distinfo.txt",
"chars": 408,
"preview": "name: quicklisp\nversion: 2026-01-01\nsystem-index-url: http://beta.quicklisp.org/dist/quicklisp/2026-01-01/systems.txt\nre"
},
{
"path": "quicklisp/dists/quicklisp/enabled.txt",
"chars": 0,
"preview": ""
},
{
"path": "quicklisp/dists/quicklisp/preference.txt",
"chars": 10,
"preview": "3828362824"
},
{
"path": "quicklisp/log4slime-setup.el",
"chars": 139,
"preview": ";; load Log4slime support\n\n(add-to-list 'load-path \"~/quicklisp/dists/quicklisp/software/log4cl-20200925-git/elisp/\")\n(r"
},
{
"path": "quicklisp/quicklisp/bundle-template.lisp",
"chars": 6978,
"preview": "(cl:in-package #:cl-user)\n\n(eval-when (:compile-toplevel :load-toplevel :execute)\n (require \"asdf\")\n (unless (find-pac"
},
{
"path": "quicklisp/quicklisp/bundle.lisp",
"chars": 14070,
"preview": ";;;; bundle.lisp\n\n(in-package #:ql-bundle)\n\n;;; Bundling is taking a set of Quicklisp-provided systems and\n;;; creating "
},
{
"path": "quicklisp/quicklisp/cdb.lisp",
"chars": 13548,
"preview": ";;;; cdb.lisp\n\n(in-package #:ql-cdb)\n\n(defconstant +initial-hash-value+ 5381)\n\n(defun cdb-hash (octets)\n \"http://cr.yp."
},
{
"path": "quicklisp/quicklisp/client-info.lisp",
"chars": 8720,
"preview": ";;;; client-info.lisp\n\n(in-package #:quicklisp-client)\n\n(defparameter *client-base-url* \"http://beta.quicklisp.org/\")\n\n("
},
{
"path": "quicklisp/quicklisp/client-update.lisp",
"chars": 4446,
"preview": ";;;; client-update.lisp\n\n(in-package #:quicklisp-client)\n\n(defun fetch-client-file-info (client-file-info output-file)\n "
},
{
"path": "quicklisp/quicklisp/client.lisp",
"chars": 5532,
"preview": ";;;; client.lisp\n\n(in-package #:quicklisp-client)\n\n(defvar *quickload-verbose* nil\n \"When NIL, show terse output when q"
},
{
"path": "quicklisp/quicklisp/config.lisp",
"chars": 1356,
"preview": ";;;; config.lisp\n\n(in-package #:ql-config)\n\n(defun config-value-file-pathname (path)\n (let ((bad-position (position #\\S"
},
{
"path": "quicklisp/quicklisp/deflate.lisp",
"chars": 34317,
"preview": ";;;; Deflate --- RFC 1951 Deflate Decompression\n;;;;\n;;;; Copyright (C) 2000-2009 PMSF IT Consulting Pierre R. Mai.\n;;;;"
},
{
"path": "quicklisp/quicklisp/dist-update.lisp",
"chars": 6954,
"preview": ";;;; dist-update.lisp\n\n(in-package #:ql-dist)\n\n(defgeneric available-update (dist)\n (:documentation \"If an update is av"
},
{
"path": "quicklisp/quicklisp/dist.lisp",
"chars": 38423,
"preview": ";;;; dist.lisp\n\n(in-package #:ql-dist)\n\n\n;;; Generic functions\n\n(defgeneric dist (object)\n (:documentation\n \"Return t"
},
{
"path": "quicklisp/quicklisp/fetch-gzipped.lisp",
"chars": 887,
"preview": ";;;; fetch-gzipped.lisp\n\n(in-package #:quicklisp-client)\n\n(defun gzipped-url (url)\n (check-type url string)\n (concaten"
},
{
"path": "quicklisp/quicklisp/http.lisp",
"chars": 27724,
"preview": ";;;\n;;; A simple HTTP client\n;;;\n\n(in-package #:ql-http)\n\n;;; Octet data\n\n(deftype octet ()\n '(unsigned-byte 8))\n\n(defu"
},
{
"path": "quicklisp/quicklisp/impl-util.lisp",
"chars": 12468,
"preview": ";;;; impl-util.lisp\n\n(in-package #:ql-impl-util)\n\n(definterface call-with-quiet-compilation (fun)\n (:documentation\n \""
},
{
"path": "quicklisp/quicklisp/impl.lisp",
"chars": 10024,
"preview": "(in-package #:ql-impl)\n\n(eval-when (:compile-toplevel :load-toplevel :execute)\n (defun error-unimplemented (&rest args)"
},
{
"path": "quicklisp/quicklisp/local-projects.lisp",
"chars": 5706,
"preview": ";;;; local-projects.lisp\n\n;;;\n;;; Local project support.\n;;;\n;;; Local projects can be placed in <quicklisp>/local-proje"
},
{
"path": "quicklisp/quicklisp/minitar.lisp",
"chars": 6950,
"preview": "(in-package #:ql-minitar)\n\n(defconstant +block-size+ 512)\n(defconstant +space-code+ 32)\n(defconstant +newline-code+ 10)\n"
},
{
"path": "quicklisp/quicklisp/misc.lisp",
"chars": 587,
"preview": ";;;; misc.lisp\n\n(in-package #:quicklisp-client)\n\n;;;\n;;; This stuff will probably end up somewhere else.\n;;;\n\n(defun use"
},
{
"path": "quicklisp/quicklisp/network.lisp",
"chars": 5767,
"preview": ";;;\n;;; Low-level networking implementations\n;;;\n\n(in-package #:ql-network)\n\n(definterface host-address (host)\n (:imple"
},
{
"path": "quicklisp/quicklisp/package.lisp",
"chars": 9341,
"preview": ";;;; package.lisp\n\n(defpackage #:ql-util\n (:documentation\n \"Utility functions used in various places.\")\n (:use #:cl)"
},
{
"path": "quicklisp/quicklisp/progress.lisp",
"chars": 5100,
"preview": ";;;\n;;; A text progress bar\n;;;\n\n(in-package #:ql-progress)\n\n(defclass progress-bar ()\n ((start-time\n :initarg :star"
},
{
"path": "quicklisp/quicklisp/quicklisp.asd",
"chars": 1117,
"preview": ";;;; quicklisp.asd\n\n(defpackage #:ql-info\n (:export #:*version*))\n\n(defvar ql-info:*version*\n (with-open-file (stream "
},
{
"path": "quicklisp/quicklisp/setup.lisp",
"chars": 10243,
"preview": "(in-package #:quicklisp)\n\n(defun show-wrapped-list (words &key (indent 4) (margin 60))\n (let ((*print-right-margin* marg"
},
{
"path": "quicklisp/quicklisp/utils.lisp",
"chars": 5189,
"preview": ";;;; utils.lisp\n\n(in-package #:ql-util)\n\n(defun write-line-to-file (string file)\n (with-open-file (stream file\n "
},
{
"path": "quicklisp/quicklisp/version.txt",
"chars": 11,
"preview": "2021-02-13\n"
},
{
"path": "quicklisp/setup.lisp",
"chars": 5057,
"preview": "(defpackage #:ql-setup\n (:use #:cl)\n (:export #:*quicklisp-home*\n #:qmerge\n #:qenough))\n\n(in-packa"
},
{
"path": "scripts/asdf.lisp",
"chars": 716807,
"preview": ";;; -*- mode: Lisp; Base: 10 ; Syntax: ANSI-Common-Lisp ; Package: CL-USER ; buffer-read-only: t; -*-\n;;; This is ASDF 3"
},
{
"path": "scripts/build-cli.lisp",
"chars": 1069,
"preview": ";;;; Copyright 2018-Present Modern Interpreters Inc.\n;;;;\n;;;; This Source Code Form is subject to the terms of the Mozi"
},
{
"path": "scripts/build-image.lisp",
"chars": 2378,
"preview": ";; Copyright 2018-Present Modern Interpreters Inc.\n;;\n;; This Source Code Form is subject to the terms of the Mozilla Pu"
},
{
"path": "scripts/common.mk",
"chars": 27,
"preview": "\nbuild/affected-files.txt:\n"
},
{
"path": "scripts/docker-compose-with-replay.yml",
"chars": 1810,
"preview": "version: \"3.9\"\nservices:\n screenshotbot:\n build:\n context: ${SB_OSS_CONTEXT}\n dockerfile: ${SB_OSS_DOCKERF"
},
{
"path": "scripts/init.lisp",
"chars": 3745,
"preview": ";;;; Copyright 2018-Present Modern Interpreters Inc.\n;;;;\n;;;; This Source Code Form is subject to the terms of the Mozi"
},
{
"path": "scripts/install-sbcl.sh",
"chars": 322,
"preview": "#!/bin/bash\n\nset -e\nset -x\n\napt-get update \napt-get install -y wget sbcl build-essential \n# apt-get install -y valgrind\n"
},
{
"path": "scripts/jenkins.lisp",
"chars": 575,
"preview": ";; Copyright 2018-Present Modern Interpreters Inc.\n;;\n;; This Source Code Form is subject to the terms of the Mozilla Pu"
},
{
"path": "scripts/lispworks-versions.mk",
"chars": 837,
"preview": "# Links to all the Lispworks versions being used. By having a Makefile\n# dependency on this file, we can essentially add"
},
{
"path": "scripts/prepare-image.lisp",
"chars": 9702,
"preview": ";;;; Copyright 2018-Present Modern Interpreters Inc.\n;;;;\n;;;; This Source Code Form is subject to the terms of the Mozi"
},
{
"path": "scripts/update-phabricator.lisp",
"chars": 660,
"preview": "(require :asdf)\n\n(ql:quickload :util/phabricator)\n\n(defpackage :my-test\n (:use :cl\n :util/phabricator/conduit))\n(in-p"
},
{
"path": "src/auth/acceptor.lisp",
"chars": 393,
"preview": ";;;; Copyright 2018-Present Modern Interpreters Inc.\n;;;;\n;;;; This Source Code Form is subject to the terms of the Mozi"
},
{
"path": "src/auth/auth.asd",
"chars": 1042,
"preview": "(asdf:defsystem \"auth\"\n :serial t\n :depends-on (\"cl-pass\"\n \"bknr.datastore\"\n \"util.misc\""
},
{
"path": "src/auth/auth.lisp",
"chars": 12497,
"preview": ";;;; Copyright 2018-Present Modern Interpreters Inc.\n;;;;\n;;;; This Source Code Form is subject to the terms of the Mozi"
},
{
"path": "src/auth/avatar.lisp",
"chars": 2933,
"preview": ";;;; Copyright 2018-Present Modern Interpreters Inc.\n;;;;\n;;;; This Source Code Form is subject to the terms of the Mozi"
},
{
"path": "src/auth/company.lisp",
"chars": 642,
"preview": ";;;; Copyright 2018-Present Modern Interpreters Inc.\n;;;;\n;;;; This Source Code Form is subject to the terms of the Mozi"
},
{
"path": "src/auth/login/auth.login.asd",
"chars": 1201,
"preview": "(defsystem :auth.login\n :serial t\n :depends-on (:auth\n :auth.model\n :util.statsig\n "
},
{
"path": "src/auth/login/cached-avatar.lisp",
"chars": 2971,
"preview": ";;;; Copyright 2018-Present Modern Interpreters Inc.\n;;;;\n;;;; This Source Code Form is subject to the terms of the Mozi"
},
{
"path": "src/auth/login/common.lisp",
"chars": 8980,
"preview": ";;;; Copyright 2018-Present Modern Interpreters Inc.\n;;;;\n;;;; This Source Code Form is subject to the terms of the Mozi"
},
{
"path": "src/auth/login/forgot-password.lisp",
"chars": 7183,
"preview": ";;;; Copyright 2018-Present Modern Interpreters Inc.\n;;;;\n;;;; This Source Code Form is subject to the terms of the Mozi"
},
{
"path": "src/auth/login/github.lisp",
"chars": 3041,
"preview": ";;;; Copyright 2018-Present Modern Interpreters Inc.\n;;;;\n;;;; This Source Code Form is subject to the terms of the Mozi"
},
{
"path": "src/auth/login/impersonation.lisp",
"chars": 1608,
"preview": ";;;; Copyright 2018-Present Modern Interpreters Inc.\n;;;;\n;;;; This Source Code Form is subject to the terms of the Mozi"
},
{
"path": "src/auth/login/login.lisp",
"chars": 11188,
"preview": ";;;; -*- coding: utf-8 -*-\n;;;; Copyright 2018-Present Modern Interpreters Inc.\n;;;;\n;;;; This Source Code Form is subje"
},
{
"path": "src/auth/login/oidc.lisp",
"chars": 8948,
"preview": ";;;; Copyright 2018-Present Modern Interpreters Inc.\n;;;;\n;;;; This Source Code Form is subject to the terms of the Mozi"
},
{
"path": "src/auth/login/roles-auth-provider.lisp",
"chars": 1666,
"preview": ";;;; Copyright 2018-Present Modern Interpreters Inc.\n;;;;\n;;;; This Source Code Form is subject to the terms of the Mozi"
},
{
"path": "src/auth/login/saml.lisp",
"chars": 791,
"preview": ";;;; Copyright 2018-Present Modern Interpreters Inc.\n;;;;\n;;;; This Source Code Form is subject to the terms of the Mozi"
},
{
"path": "src/auth/login/signup.lisp",
"chars": 20243,
"preview": ";;;; Copyright 2018-Present Modern Interpreters Inc.\n;;;;\n;;;; This Source Code Form is subject to the terms of the Mozi"
},
{
"path": "src/auth/login/sso.lisp",
"chars": 1640,
"preview": ";;;; Copyright 2018-Present Modern Interpreters Inc.\n;;;;\n;;;; This Source Code Form is subject to the terms of the Mozi"
},
{
"path": "src/auth/login/test-cached-avatar.lisp",
"chars": 3650,
"preview": ";;;; Copyright 2018-Present Modern Interpreters Inc.\n;;;;\n;;;; This Source Code Form is subject to the terms of the Mozi"
},
{
"path": "src/auth/login/test-roles-auth-provider.lisp",
"chars": 2259,
"preview": ";;;; Copyright 2018-Present Modern Interpreters Inc.\n;;;;\n;;;; This Source Code Form is subject to the terms of the Mozi"
},
{
"path": "src/auth/login/test-sso.lisp",
"chars": 1292,
"preview": ";;;; Copyright 2018-Present Modern Interpreters Inc.\n;;;;\n;;;; This Source Code Form is subject to the terms of the Mozi"
},
{
"path": "src/auth/login/test-verify-email.lisp",
"chars": 2497,
"preview": ";;;; Copyright 2018-Present Modern Interpreters Inc.\n;;;;\n;;;; This Source Code Form is subject to the terms of the Mozi"
},
{
"path": "src/auth/login/verify-email.lisp",
"chars": 5493,
"preview": ";;;; Copyright 2018-Present Modern Interpreters Inc.\n;;;;\n;;;; This Source Code Form is subject to the terms of the Mozi"
},
{
"path": "src/auth/model/auth.model.asd",
"chars": 535,
"preview": "(defsystem :auth.model\n :serial t\n :depends-on (:auth\n :util\n :util.store)\n :components ("
},
{
"path": "src/auth/model/company-sso.lisp",
"chars": 994,
"preview": ";;;; Copyright 2018-Present Modern Interpreters Inc.\n;;;;\n;;;; This Source Code Form is subject to the terms of the Mozi"
},
{
"path": "src/auth/model/email-confirmation.lisp",
"chars": 1747,
"preview": ";;;; Copyright 2018-Present Modern Interpreters Inc.\n;;;;\n;;;; This Source Code Form is subject to the terms of the Mozi"
},
{
"path": "src/auth/model/invite.lisp",
"chars": 3333,
"preview": ";;;; Copyright 2018-Present Modern Interpreters Inc.\n;;;;\n;;;; This Source Code Form is subject to the terms of the Mozi"
},
{
"path": "src/auth/model/roles.lisp",
"chars": 5236,
"preview": ";;;; Copyright 2018-Present Modern Interpreters Inc.\n;;;;\n;;;; This Source Code Form is subject to the terms of the Mozi"
},
{
"path": "src/auth/model/test-email-confirmation.lisp",
"chars": 1364,
"preview": ";;;; Copyright 2018-Present Modern Interpreters Inc.\n;;;;\n;;;; This Source Code Form is subject to the terms of the Mozi"
},
{
"path": "src/auth/model/test-invite.lisp",
"chars": 2603,
"preview": ";;;; Copyright 2018-Present Modern Interpreters Inc.\n;;;;\n;;;; This Source Code Form is subject to the terms of the Mozi"
},
{
"path": "src/auth/model/test-roles.lisp",
"chars": 3481,
"preview": ";;;; Copyright 2018-Present Modern Interpreters Inc.\n;;;;\n;;;; This Source Code Form is subject to the terms of the Mozi"
},
{
"path": "src/auth/model/user.lisp",
"chars": 817,
"preview": ";;;; Copyright 2018-Present Modern Interpreters Inc.\n;;;;\n;;;; This Source Code Form is subject to the terms of the Mozi"
},
{
"path": "src/auth/package.lisp",
"chars": 3308,
"preview": ";;;; Copyright 2018-Present Modern Interpreters Inc.\n;;;;\n;;;; This Source Code Form is subject to the terms of the Mozi"
},
{
"path": "src/auth/request.lisp",
"chars": 3294,
"preview": ";;;; Copyright 2018-Present Modern Interpreters Inc.\n;;;;\n;;;; This Source Code Form is subject to the terms of the Mozi"
},
{
"path": "src/auth/test-auth.lisp",
"chars": 9097,
"preview": ";;;; Copyright 2018-Present Modern Interpreters Inc.\n;;;;\n;;;; This Source Code Form is subject to the terms of the Mozi"
},
{
"path": "src/auth/test-avatar.lisp",
"chars": 2735,
"preview": "(defpackage :auth/test-avatar\n (:use #:cl\n #:fiveam)\n (:import-from #:util/store/store\n #:with-t"
},
{
"path": "src/auth/test-view.lisp",
"chars": 4987,
"preview": ";;;; Copyright 2018-Present Modern Interpreters Inc.\n;;;;\n;;;; This Source Code Form is subject to the terms of the Mozi"
},
{
"path": "src/auth/view.lisp",
"chars": 4874,
"preview": ";;;; Copyright 2018-Present Modern Interpreters Inc.\n;;;;\n;;;; This Source Code Form is subject to the terms of the Mozi"
},
{
"path": "src/auth/viewer-context.lisp",
"chars": 1674,
"preview": ";;;; Copyright 2018-Present Modern Interpreters Inc.\n;;;;\n;;;; This Source Code Form is subject to the terms of the Mozi"
},
{
"path": "src/auto-restart/.circleci/config.yml",
"chars": 511,
"preview": "version: 2\njobs:\n build:\n docker:\n - image: cimg/base:2021.04\n steps:\n - checkout\n - run:\n "
},
{
"path": "src/auto-restart/LICENSE",
"chars": 16726,
"preview": "Mozilla Public License Version 2.0\n==================================\n\n1. Definitions\n--------------\n\n1.1. \"Contributor\""
},
{
"path": "src/auto-restart/README.md",
"chars": 3290,
"preview": "# AUTO-RESTART\n\n[](https://app.circleci.com/pipelin"
},
{
"path": "src/auto-restart/auto-restart.asd",
"chars": 1032,
"preview": ";;;; Copyright 2018-Present Modern Interpreters Inc.\n;;;;\n;;;; This Source Code Form is subject to the terms of the Mozi"
},
{
"path": "src/auto-restart/auto-restart.lisp",
"chars": 7069,
"preview": ";;;; Copyright 2018-Present Modern Interpreters Inc.\n;;;;\n;;;; This Source Code Form is subject to the terms of the Mozi"
},
{
"path": "src/auto-restart/run-circleci.lisp",
"chars": 172,
"preview": "(load \"~/quicklisp/setup.lisp\")\n\n(push #P \"./\" asdf:*central-registry*)\n\n(ql:quickload :auto-restart/tests)\n\n(unless (fi"
},
{
"path": "src/auto-restart/test-auto-restart.lisp",
"chars": 9097,
"preview": ";;;; Copyright 2018-Present Modern Interpreters Inc.\n;;;;\n;;;; This Source Code Form is subject to the terms of the Mozi"
},
{
"path": "src/build-utils/all.lisp",
"chars": 515,
"preview": ";; Copyright 2018-Present Modern Interpreters Inc.\n;;\n;; This Source Code Form is subject to the terms of the Mozilla Pu"
},
{
"path": "src/build-utils/build-utils.asd",
"chars": 1061,
"preview": ";; Copyright 2018-Present Modern Interpreters Inc.\n;;\n;; This Source Code Form is subject to the terms of the Mozilla Pu"
},
{
"path": "src/build-utils/closure-compiler/COPYING",
"chars": 11358,
"preview": "\n Apache License\n Version 2.0, January 2004\n "
},
{
"path": "src/build-utils/closure-compiler/README.md",
"chars": 15863,
"preview": "# [Google Closure Compiler](https://developers.google.com/closure/compiler/)\n\n[\n (:export #:find-transitive-system-deps\n #:safe-run-program))\n("
},
{
"path": "src/build-utils/css-package.lisp",
"chars": 9352,
"preview": ";; Copyright 2018-Present Modern Interpreters Inc.\n;;\n;; This Source Code Form is subject to the terms of the Mozilla Pu"
},
{
"path": "src/build-utils/dart-sass/sass",
"chars": 453,
"preview": "#!/bin/sh\n\n# This script drives the standalone dart-sass package, which bundles together a\n# Dart executable and a snaps"
},
{
"path": "src/build-utils/dart-sass/src/LICENSE",
"chars": 59580,
"preview": "Dart Sass license:\n\nCopyright (c) 2016, Google Inc.\n\nPermission is hereby granted, free of charge, to any person obtaini"
},
{
"path": "src/build-utils/darwin/dart-sass/sass",
"chars": 453,
"preview": "#!/bin/sh\n\n# This script drives the standalone dart-sass package, which bundles together a\n# Dart executable and a snaps"
},
{
"path": "src/build-utils/darwin/dart-sass/src/LICENSE",
"chars": 79829,
"preview": "Dart Sass license:\n\nCopyright (c) 2016, Google Inc.\n\nPermission is hereby granted, free of charge, to any person obtaini"
},
{
"path": "src/build-utils/deliver-script.lisp",
"chars": 8892,
"preview": ";;;; Copyright 2018-Present Modern Interpreters Inc.\n;;;;\n;;;; This Source Code Form is subject to the terms of the Mozi"
},
{
"path": "src/build-utils/jar-file.lisp",
"chars": 7669,
"preview": ";; Copyright 2018-Present Modern Interpreters Inc.\n;;\n;; This Source Code Form is subject to the terms of the Mozilla Pu"
},
{
"path": "src/build-utils/js-package.lisp",
"chars": 4452,
"preview": ";; Copyright 2018-Present Modern Interpreters Inc.\n;;\n;; This Source Code Form is subject to the terms of the Mozilla Pu"
},
{
"path": "src/build-utils/linux-arm64/dart-sass/sass",
"chars": 592,
"preview": "#!/bin/sh\n\n# This script drives the standalone dart-sass package, which bundles together a\n# Dart executable and a snaps"
},
{
"path": "src/build-utils/linux-arm64/dart-sass/src/LICENSE",
"chars": 79883,
"preview": "Dart Sass license:\n\nCopyright (c) 2016, Google Inc.\n\nPermission is hereby granted, free of charge, to any person obtaini"
},
{
"path": "src/build-utils/remote-file.lisp",
"chars": 1025,
"preview": "(defpackage :build-utils/remote-file\n (:use #:cl\n #:asdf)\n (:local-nicknames (#:a #:alexandria))\n (:export\n "
},
{
"path": "src/build-utils/wild-module.lisp",
"chars": 1868,
"preview": ";; Copyright 2018-Present Modern Interpreters Inc.\n;;\n;; This Source Code Form is subject to the terms of the Mozilla Pu"
},
{
"path": "src/cl-mongo-id/LICENSE",
"chars": 1071,
"preview": "Copyright (c) 2012 Lyon Bros. Enterprises, LLC\n\nPermission is hereby granted, free of charge, to any person obtaining a "
},
{
"path": "src/cl-mongo-id/README.markdown",
"chars": 2906,
"preview": "cl-mongo-id\n===========\n\nThis is a simple library for creating/handling MongoDB's ObjectIDs. It works by\ngrabbing key pi"
},
{
"path": "src/cl-mongo-id/cl-mongo-id.asd",
"chars": 470,
"preview": "(asdf:defsystem :cl-mongo-id\n :author \"Andrew Lyon <orthecreedence@gmail.com>\"\n :description \"A library for the creati"
},
{
"path": "src/cl-mongo-id/mongo-id.lisp",
"chars": 6350,
"preview": ";;; This is a library for generating MongoDB ObjectIDs per the client\n;;; specification:\n;;;\n;;; https://github.com/mo"
},
{
"path": "src/cl-mongo-id/test-mongo-id.lisp",
"chars": 950,
"preview": ";;;; Copyright 2018-Present Modern Interpreters Inc.\n;;;;\n;;;; This Source Code Form is subject to the terms of the Mozi"
},
{
"path": "src/common/bootstrap/.babelrc.js",
"chars": 162,
"preview": "module.exports = {\n presets: [\n [\n '@babel/preset-env',\n {\n loose: true,\n bugfixes: true,\n "
},
{
"path": "src/common/bootstrap/.browserslistrc",
"chars": 175,
"preview": "# https://github.com/browserslist/browserslist#readme\n\n>= 0.5%\nlast 2 major versions\nnot dead\nChrome >= 60\nFirefox >= 60"
},
{
"path": "src/common/bootstrap/.bundlewatch.config.json",
"chars": 1326,
"preview": "{\n \"files\": [\n {\n \"path\": \"./dist/css/bootstrap-grid.css\",\n \"maxSize\": \"7.5 kB\"\n },\n {\n \"path\":"
},
{
"path": "src/common/bootstrap/.cspell.json",
"chars": 2064,
"preview": "{\n \"version\": \"0.2\",\n \"words\": [\n \"affordance\",\n \"allowfullscreen\",\n \"Analyser\",\n \"autohide\",\n \"autohid"
},
{
"path": "src/common/bootstrap/.editorconfig",
"chars": 167,
"preview": "# editorconfig.org\n\nroot = true\n\n[*]\ncharset = utf-8\nend_of_line = lf\nindent_size = 2\nindent_style = space\ninsert_final_"
},
{
"path": "src/common/bootstrap/.eslintignore",
"chars": 111,
"preview": "**/*.min.js\n**/dist/\n**/vendor/\n/_site/\n/js/coverage/\n/js/tests/integration/\n/site/static/sw.js\n/site/layouts/\n"
},
{
"path": "src/common/bootstrap/.eslintrc.json",
"chars": 1337,
"preview": "{\n \"root\": true,\n \"extends\": [\n \"plugin:import/errors\",\n \"plugin:import/warnings\",\n \"plugin:unicorn/recommend"
},
{
"path": "src/common/bootstrap/.gitattributes",
"chars": 177,
"preview": "# Enforce Unix newlines\n* text=auto eol=lf\n\n# Don't diff or textually merge source maps\n*.map binary\n\nbootstrap.css ling"
},
{
"path": "src/common/bootstrap/.github/CODEOWNERS",
"chars": 74,
"preview": "*.js @twbs/js-review\n*.css @twbs/css-review\n*.scss @twbs/css-review\n"
},
{
"path": "src/common/bootstrap/.github/CONTRIBUTING.md",
"chars": 11409,
"preview": "# Contributing to Bootstrap\n\nLooking to contribute something to Bootstrap? **Here's how you can help.**\n\nPlease take a m"
},
{
"path": "src/common/bootstrap/.github/ISSUE_TEMPLATE/bug_report.yml",
"chars": 2116,
"preview": "name: Report a bug\ndescription: Tell us about a bug or issue you may have identified in Bootstrap.\ntitle: \"Provide a gen"
},
{
"path": "src/common/bootstrap/.github/ISSUE_TEMPLATE/config.yml",
"chars": 179,
"preview": "contact_links:\n - name: Ask the community\n url: https://github.com/twbs/bootstrap/discussions/new\n about: Ask and"
},
{
"path": "src/common/bootstrap/.github/ISSUE_TEMPLATE/feature_request.yml",
"chars": 1141,
"preview": "name: Feature request\ndescription: Suggest new or updated features to include in Bootstrap.\ntitle: \"Suggest a new featur"
},
{
"path": "src/common/bootstrap/.github/PULL_REQUEST_TEMPLATE.md",
"chars": 1343,
"preview": "### Description\n\n<!-- Describe your changes in detail -->\n\n### Motivation & Context\n\n<!-- Why is this change required? W"
},
{
"path": "src/common/bootstrap/.github/SUPPORT.md",
"chars": 473,
"preview": "### Bug reports\n\nSee the [contributing guidelines](CONTRIBUTING.md) for sharing bug reports.\n\n### How-to\n\nFor general tr"
},
{
"path": "src/common/bootstrap/.github/dependabot.yml",
"chars": 510,
"preview": "version: 2\nupdates:\n - package-ecosystem: npm\n directory: \"/\"\n schedule:\n interval: weekly\n day: tuesda"
},
{
"path": "src/common/bootstrap/.github/release-drafter.yml",
"chars": 1154,
"preview": "name-template: 'v$NEXT_MAJOR_VERSION'\ntag-template: 'v$NEXT_MAJOR_VERSION'\nprerelease: true\nexclude-labels:\n - 'skip-ch"
},
{
"path": "src/common/bootstrap/.github/workflows/browserstack.yml",
"chars": 937,
"preview": "name: BrowserStack\n\non:\n push:\n workflow_dispatch:\n\nenv:\n FORCE_COLOR: 2\n NODE: 16\n\njobs:\n browserstack:\n runs-o"
},
{
"path": "src/common/bootstrap/.github/workflows/bundlewatch.yml",
"chars": 712,
"preview": "name: Bundlewatch\n\non:\n push:\n branches-ignore:\n - \"dependabot/**\"\n pull_request:\n workflow_dispatch:\n\nenv:\n "
},
{
"path": "src/common/bootstrap/.github/workflows/calibreapp-image-actions.yml",
"chars": 571,
"preview": "name: Compress Images\n\non:\n pull_request:\n paths:\n - '**.jpg'\n - '**.jpeg'\n - '**.png'\n - '**.we"
},
{
"path": "src/common/bootstrap/.github/workflows/codeql.yml",
"chars": 738,
"preview": "name: \"CodeQL\"\n\non:\n push:\n branches:\n - main\n - v4-dev\n - \"!dependabot/**\"\n pull_request:\n # The"
},
{
"path": "src/common/bootstrap/.github/workflows/cspell.yml",
"chars": 477,
"preview": "name: cspell\n\non:\n push:\n branches-ignore:\n - \"dependabot/**\"\n pull_request:\n workflow_dispatch:\n\nenv:\n FORC"
},
{
"path": "src/common/bootstrap/.github/workflows/css.yml",
"chars": 510,
"preview": "name: CSS\n\non:\n push:\n branches-ignore:\n - \"dependabot/**\"\n pull_request:\n workflow_dispatch:\n\nenv:\n FORCE_C"
},
{
"path": "src/common/bootstrap/.github/workflows/docs.yml",
"chars": 815,
"preview": "name: Docs\n\non:\n push:\n branches-ignore:\n - \"dependabot/**\"\n pull_request:\n workflow_dispatch:\n\nenv:\n FORCE_"
},
{
"path": "src/common/bootstrap/.github/workflows/issue-close-require.yml",
"chars": 569,
"preview": "name: Close Issue Awaiting Reply\n\non:\n schedule:\n - cron: \"0 0 * * *\"\n\njobs:\n issue-close-require:\n runs-on: ubu"
},
{
"path": "src/common/bootstrap/.github/workflows/issue-labeled.yml",
"chars": 832,
"preview": "name: Issue Labeled\n\non:\n issues:\n types: [labeled]\n\njobs:\n issue-labeled:\n if: github.repository == 'twbs/boots"
},
{
"path": "src/common/bootstrap/.github/workflows/js.yml",
"chars": 781,
"preview": "name: JS Tests\n\non:\n push:\n branches-ignore:\n - \"dependabot/**\"\n pull_request:\n workflow_dispatch:\n\nenv:\n FO"
},
{
"path": "src/common/bootstrap/.github/workflows/lint.yml",
"chars": 508,
"preview": "name: Lint\n\non:\n push:\n branches-ignore:\n - \"dependabot/**\"\n pull_request:\n workflow_dispatch:\n\nenv:\n FORCE_"
},
{
"path": "src/common/bootstrap/.github/workflows/node-sass.yml",
"chars": 696,
"preview": "name: CSS (node-sass)\n\non:\n push:\n branches-ignore:\n - \"dependabot/**\"\n pull_request:\n workflow_dispatch:\n\nen"
},
{
"path": "src/common/bootstrap/.github/workflows/release-notes.yml",
"chars": 310,
"preview": "name: Release notes\n\non:\n push:\n branches:\n - main\n workflow_dispatch:\n\njobs:\n update_release_draft:\n runs"
},
{
"path": "src/common/bootstrap/.gitignore",
"chars": 442,
"preview": "# Ignore docs files\n/_site/\n# Hugo files\n/resources/\n/.hugo_build.lock\n\n# Numerous always-ignore extensions\n*.diff\n*.err"
},
{
"path": "src/common/bootstrap/.stylelintignore",
"chars": 55,
"preview": "**/*.min.css\n**/dist/\n**/vendor/\n/_site/\n/js/coverage/\n"
},
{
"path": "src/common/bootstrap/.stylelintrc",
"chars": 637,
"preview": "{\n \"extends\": [\n \"stylelint-config-twbs-bootstrap\"\n ],\n \"rules\": {\n \"declaration-property-value-disallowed-list"
},
{
"path": "src/common/bootstrap/CODE_OF_CONDUCT.md",
"chars": 5485,
"preview": "# Contributor Covenant Code of Conduct\n\n## Our Pledge\n\nWe as members, contributors, and leaders pledge to make participa"
},
{
"path": "src/common/bootstrap/LICENSE",
"chars": 1131,
"preview": "The MIT License (MIT)\n\nCopyright (c) 2011-2022 Twitter, Inc.\nCopyright (c) 2011-2022 The Bootstrap Authors\n\nPermission i"
},
{
"path": "src/common/bootstrap/README.md",
"chars": 13309,
"preview": "<p align=\"center\">\n <a href=\"https://getbootstrap.com/\">\n <img src=\"https://getbootstrap.com/docs/5.2/assets/brand/b"
},
{
"path": "src/common/bootstrap/SECURITY.md",
"chars": 471,
"preview": "# Reporting Security Issues\n\nThe Bootstrap team and community take security issues in Bootstrap seriously. We appreciate"
},
{
"path": "src/common/bootstrap/build/.eslintrc.json",
"chars": 255,
"preview": "{\n \"env\": {\n \"browser\": false,\n \"node\": true\n },\n \"parserOptions\": {\n \"sourceType\": \"script\"\n },\n \"extends"
},
{
"path": "src/common/bootstrap/build/banner.js",
"chars": 390,
"preview": "'use strict'\n\nconst pkg = require('../package.json')\nconst year = new Date().getFullYear()\n\nfunction getBanner(pluginFil"
},
{
"path": "src/common/bootstrap/build/build-plugins.js",
"chars": 2839,
"preview": "#!/usr/bin/env node\n\n/*!\n * Script to build our plugins to use them separately.\n * Copyright 2020-2022 The Bootstrap Aut"
},
{
"path": "src/common/bootstrap/build/change-version.js",
"chars": 2186,
"preview": "#!/usr/bin/env node\n\n/*!\n * Script to update version number references in the project.\n * Copyright 2017-2022 The Bootst"
},
{
"path": "src/common/bootstrap/build/generate-sri.js",
"chars": 1686,
"preview": "#!/usr/bin/env node\n\n/*!\n * Script to generate SRI hashes for use in our docs.\n * Remember to use the same vendor files "
},
{
"path": "src/common/bootstrap/build/postcss.config.js",
"chars": 327,
"preview": "'use strict'\n\nconst mapConfig = {\n inline: false,\n annotation: true,\n sourcesContent: true\n}\n\nmodule.exports = contex"
},
{
"path": "src/common/bootstrap/build/rollup.config.js",
"chars": 1352,
"preview": "'use strict'\n\nconst path = require('node:path')\nconst { babel } = require('@rollup/plugin-babel')\nconst { nodeResolve } "
},
{
"path": "src/common/bootstrap/build/vnu-jar.js",
"chars": 1843,
"preview": "#!/usr/bin/env node\n\n/*!\n * Script to run vnu-jar if Java is available.\n * Copyright 2017-2022 The Bootstrap Authors\n * "
},
{
"path": "src/common/bootstrap/build/zip-examples.js",
"chars": 2455,
"preview": "#!/usr/bin/env node\n\n/*!\n * Script to create the built examples zip archive;\n * requires the `zip` command to be present"
},
{
"path": "src/common/bootstrap/composer.json",
"chars": 667,
"preview": "{\n \"name\": \"twbs/bootstrap\",\n \"description\": \"The most popular front-end framework for developing responsive, mobile f"
},
{
"path": "src/common/bootstrap/config.yml",
"chars": 3662,
"preview": "languageCode: \"en\"\ntitle: \"Bootstrap\"\nbaseURL: \"https://getbootstrap.com\"\n\nsec"
},
{
"path": "src/common/bootstrap/dist/css/bootstrap-grid.css",
"chars": 71861,
"preview": "/*!\n * Bootstrap Grid v5.2.3 (https://getbootstrap.com/)\n * Copyright 2011-2022 The Bootstrap Authors\n * Copyright 2011-"
},
{
"path": "src/common/bootstrap/dist/css/bootstrap-grid.rtl.css",
"chars": 71935,
"preview": "/*!\n * Bootstrap Grid v5.2.3 (https://getbootstrap.com/)\n * Copyright 2011-2022 The Bootstrap Authors\n * Copyright 2011-"
},
{
"path": "src/common/bootstrap/dist/css/bootstrap-reboot.css",
"chars": 7965,
"preview": "/*!\n * Bootstrap Reboot v5.2.3 (https://getbootstrap.com/)\n * Copyright 2011-2022 The Bootstrap Authors\n * Copyright 201"
},
{
"path": "src/common/bootstrap/dist/css/bootstrap-reboot.rtl.css",
"chars": 7958,
"preview": "/*!\n * Bootstrap Reboot v5.2.3 (https://getbootstrap.com/)\n * Copyright 2011-2022 The Bootstrap Authors\n * Copyright 201"
},
{
"path": "src/common/bootstrap/dist/css/bootstrap-utilities.css",
"chars": 76347,
"preview": "/*!\n * Bootstrap Utilities v5.2.3 (https://getbootstrap.com/)\n * Copyright 2011-2022 The Bootstrap Authors\n * Copyright "
},
{
"path": "src/common/bootstrap/dist/css/bootstrap-utilities.rtl.css",
"chars": 76214,
"preview": "/*!\n * Bootstrap Utilities v5.2.3 (https://getbootstrap.com/)\n * Copyright 2011-2022 The Bootstrap Authors\n * Copyright "
},
{
"path": "src/common/bootstrap/dist/css/bootstrap.css",
"chars": 237947,
"preview": "@charset \"UTF-8\";\n/*!\n * Bootstrap v5.2.3 (https://getbootstrap.com/)\n * Copyright 2011-2022 The Bootstrap Authors\n * C"
},
{
"path": "src/common/bootstrap/dist/css/bootstrap.rtl.css",
"chars": 237525,
"preview": "@charset \"UTF-8\";\n/*!\n * Bootstrap v5.2.3 (https://getbootstrap.com/)\n * Copyright 2011-2022 The Bootstrap Authors\n * C"
},
{
"path": "src/common/bootstrap/dist/js/bootstrap.bundle.js",
"chars": 207983,
"preview": "/*!\n * Bootstrap v5.2.3 (https://getbootstrap.com/)\n * Copyright 2011-2022 The Bootstrap Authors (https://github.com/t"
},
{
"path": "src/common/bootstrap/dist/js/bootstrap.esm.js",
"chars": 136215,
"preview": "/*!\n * Bootstrap v5.2.3 (https://getbootstrap.com/)\n * Copyright 2011-2022 The Bootstrap Authors (https://github.com/t"
},
{
"path": "src/common/bootstrap/dist/js/bootstrap.js",
"chars": 145543,
"preview": "/*!\n * Bootstrap v5.2.3 (https://getbootstrap.com/)\n * Copyright 2011-2022 The Bootstrap Authors (https://github.com/t"
},
{
"path": "src/common/bootstrap/dist/js/bootstrap5-js.asd",
"chars": 280,
"preview": "(defpackage :bootstrap5-js-system\n (:use :cl\n :asdf))\n(in-package :bootstrap5-js-system)\n\n\n(defsystem :bootstrap5-js\n"
},
{
"path": "src/common/bootstrap/js/dist/alert.js",
"chars": 3140,
"preview": "/*!\n * Bootstrap alert.js v5.2.3 (https://getbootstrap.com/)\n * Copyright 2011-2022 The Bootstrap Authors (https://git"
},
{
"path": "src/common/bootstrap/js/dist/base-component.js",
"chars": 3224,
"preview": "/*!\n * Bootstrap base-component.js v5.2.3 (https://getbootstrap.com/)\n * Copyright 2011-2022 The Bootstrap Authors (ht"
},
{
"path": "src/common/bootstrap/js/dist/button.js",
"chars": 2756,
"preview": "/*!\n * Bootstrap button.js v5.2.3 (https://getbootstrap.com/)\n * Copyright 2011-2022 The Bootstrap Authors (https://gi"
},
{
"path": "src/common/bootstrap/js/dist/carousel.js",
"chars": 14281,
"preview": "/*!\n * Bootstrap carousel.js v5.2.3 (https://getbootstrap.com/)\n * Copyright 2011-2022 The Bootstrap Authors (https://"
},
{
"path": "src/common/bootstrap/js/dist/collapse.js",
"chars": 9455,
"preview": "/*!\n * Bootstrap collapse.js v5.2.3 (https://getbootstrap.com/)\n * Copyright 2011-2022 The Bootstrap Authors (https://"
},
{
"path": "src/common/bootstrap/js/dist/dom/data.js",
"chars": 2119,
"preview": "/*!\n * Bootstrap data.js v5.2.3 (https://getbootstrap.com/)\n * Copyright 2011-2022 The Bootstrap Authors (https://gith"
},
{
"path": "src/common/bootstrap/js/dist/dom/event-handler.js",
"chars": 9578,
"preview": "/*!\n * Bootstrap event-handler.js v5.2.3 (https://getbootstrap.com/)\n * Copyright 2011-2022 The Bootstrap Authors (htt"
},
{
"path": "src/common/bootstrap/js/dist/dom/manipulator.js",
"chars": 2438,
"preview": "/*!\n * Bootstrap manipulator.js v5.2.3 (https://getbootstrap.com/)\n * Copyright 2011-2022 The Bootstrap Authors (https"
},
{
"path": "src/common/bootstrap/js/dist/dom/selector-engine.js",
"chars": 2700,
"preview": "/*!\n * Bootstrap selector-engine.js v5.2.3 (https://getbootstrap.com/)\n * Copyright 2011-2022 The Bootstrap Authors (h"
},
{
"path": "src/common/bootstrap/js/dist/dropdown.js",
"chars": 16199,
"preview": "/*!\n * Bootstrap dropdown.js v5.2.3 (https://getbootstrap.com/)\n * Copyright 2011-2022 The Bootstrap Authors (https://"
},
{
"path": "src/common/bootstrap/js/dist/modal.js",
"chars": 12194,
"preview": "/*!\n * Bootstrap modal.js v5.2.3 (https://getbootstrap.com/)\n * Copyright 2011-2022 The Bootstrap Authors (https://git"
},
{
"path": "src/common/bootstrap/js/dist/offcanvas.js",
"chars": 9166,
"preview": "/*!\n * Bootstrap offcanvas.js v5.2.3 (https://getbootstrap.com/)\n * Copyright 2011-2022 The Bootstrap Authors (https:/"
},
{
"path": "src/common/bootstrap/js/dist/popover.js",
"chars": 2883,
"preview": "/*!\n * Bootstrap popover.js v5.2.3 (https://getbootstrap.com/)\n * Copyright 2011-2022 The Bootstrap Authors (https://g"
},
{
"path": "src/common/bootstrap/js/dist/scrollspy.js",
"chars": 10303,
"preview": "/*!\n * Bootstrap scrollspy.js v5.2.3 (https://getbootstrap.com/)\n * Copyright 2011-2022 The Bootstrap Authors (https:/"
},
{
"path": "src/common/bootstrap/js/dist/tab.js",
"chars": 10647,
"preview": "/*!\n * Bootstrap tab.js v5.2.3 (https://getbootstrap.com/)\n * Copyright 2011-2022 The Bootstrap Authors (https://githu"
},
{
"path": "src/common/bootstrap/js/dist/toast.js",
"chars": 6632,
"preview": "/*!\n * Bootstrap toast.js v5.2.3 (https://getbootstrap.com/)\n * Copyright 2011-2022 The Bootstrap Authors (https://git"
},
{
"path": "src/common/bootstrap/js/dist/tooltip.js",
"chars": 19225,
"preview": "/*!\n * Bootstrap tooltip.js v5.2.3 (https://getbootstrap.com/)\n * Copyright 2011-2022 The Bootstrap Authors (https://g"
},
{
"path": "src/common/bootstrap/js/dist/util/backdrop.js",
"chars": 4413,
"preview": "/*!\n * Bootstrap backdrop.js v5.2.3 (https://getbootstrap.com/)\n * Copyright 2011-2022 The Bootstrap Authors (https://"
},
{
"path": "src/common/bootstrap/js/dist/util/component-functions.js",
"chars": 2174,
"preview": "/*!\n * Bootstrap component-functions.js v5.2.3 (https://getbootstrap.com/)\n * Copyright 2011-2022 The Bootstrap Author"
}
]
// ... and 1959 more files (download for full content)
About this extraction
This page contains the full source code of the screenshotbot/screenshotbot-oss GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 2159 files (26.8 MB), approximately 3.7M tokens, and a symbol index with 3023 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.