UNPKG

@fenge/eslint-config

Version:

A super strict eslint config for linting js/ts/package.json.

570 lines 78.9 kB
import eslintCommentsPlugin from "@eslint-community/eslint-plugin-eslint-comments"; import * as fengePlugin from "@fenge/eslint-plugin"; import tsPlugin from "@typescript-eslint/eslint-plugin"; import tsParser from "@typescript-eslint/parser"; import confusingKeys from "confusing-browser-globals"; import esxPlugin from "eslint-plugin-es-x"; import * as esmPlugin from "eslint-plugin-esm"; import fpPlugin from "eslint-plugin-fp"; import importPlugin from "eslint-plugin-import"; import nPlugin from "eslint-plugin-n"; import promisePlugin from "eslint-plugin-promise"; import reactPlugin from "eslint-plugin-react"; import reactHooksPlugin from "eslint-plugin-react-hooks"; import regexpPlugin from "eslint-plugin-regexp"; import simpleImportSortPlugin from "eslint-plugin-simple-import-sort"; import sonarjsPlugin from "eslint-plugin-sonarjs"; import unicornPlugin from "eslint-plugin-unicorn"; import globals from "globals"; export function getJsBase() { // copied from https://github.com/standard/eslint-config-standard/blob/master/src/index.ts const standardConfigRules = { "accessor-pairs": [ "error", { setWithoutGet: true, enforceForClassMembers: true }, ], "array-callback-return": [ "error", { allowImplicit: false, checkForEach: false, }, ], camelcase: [ "error", { allow: ["^UNSAFE_"], properties: "never", ignoreGlobals: true, }, ], "constructor-super": "error", "default-case-last": "error", // 'dot-notation': ['error', { allowKeywords: true }], // TODO: This should be enabled. Disable it as it conflicts with ts when enabling ts-check eqeqeq: ["error", "always", { null: "ignore" }], "new-cap": ["error", { newIsCap: true, capIsNew: false, properties: true }], // 'new-parens': 'error', "no-array-constructor": "error", "no-async-promise-executor": "error", "no-caller": "error", "no-case-declarations": "error", "no-class-assign": "error", "no-compare-neg-zero": "error", "no-cond-assign": "error", "no-const-assign": "error", "no-constant-condition": ["error", { checkLoops: false }], "no-control-regex": "error", "no-debugger": "error", "no-delete-var": "error", "no-dupe-args": "error", "no-dupe-class-members": "error", "no-dupe-keys": "error", "no-duplicate-case": "error", "no-useless-backreference": "error", "no-empty": ["error", { allowEmptyCatch: true }], "no-empty-character-class": "error", "no-empty-pattern": "error", "no-eval": "error", "no-ex-assign": "error", "no-extend-native": "error", "no-extra-bind": "error", "no-extra-boolean-cast": "error", "no-fallthrough": "error", "no-func-assign": "error", "no-global-assign": "error", "no-implied-eval": "error", "no-import-assign": "error", "no-invalid-regexp": "error", "no-irregular-whitespace": "error", "no-iterator": "error", "no-labels": ["error", { allowLoop: false, allowSwitch: false }], "no-lone-blocks": "error", "no-loss-of-precision": "error", "no-misleading-character-class": "error", "no-prototype-builtins": "error", "no-multi-str": "error", "no-new": "error", "no-new-func": "error", "no-new-wrappers": "error", "no-obj-calls": "error", "no-octal": "error", "no-octal-escape": "error", "no-promise-executor-return": "error", "no-proto": "error", "no-redeclare": ["error", { builtinGlobals: false }], "no-regex-spaces": "error", "no-return-assign": ["error", "except-parens"], "no-script-url": "error", "no-self-assign": ["error", { props: true }], "no-self-compare": "error", "no-sequences": "error", "no-shadow-restricted-names": "error", "no-sparse-arrays": "error", // 'no-template-curly-in-string': 'error', // VSCode an WebStorm can detect it. Enabling this will decrease flexibility. For example, long content containing ${foo} is reasonable. "no-this-before-super": "error", "no-throw-literal": "error", "no-undef": "error", "no-unmodified-loop-condition": "error", "no-unneeded-ternary": ["error", { defaultAssignment: false }], "no-unreachable": "error", "no-unreachable-loop": "error", "no-unsafe-finally": "error", "no-unsafe-negation": "error", "no-unused-expressions": [ "error", { enforceForJSX: true, allowShortCircuit: true, allowTernary: true, allowTaggedTemplates: true, }, ], "no-unused-vars": [ "error", { args: "none", caughtErrors: "none", ignoreRestSiblings: true, vars: "all", }, ], "no-use-before-define": [ "error", { functions: false, classes: false, variables: false }, ], "no-void": "error", "no-with": "error", "one-var": ["error", { initialized: "never" }], "prefer-const": ["error", { destructuring: "all" }], "prefer-promise-reject-errors": "error", "prefer-regex-literals": ["error", { disallowRedundantWrapping: true }], "symbol-description": "error", "unicode-bom": ["error", "never"], "use-isnan": [ "error", { enforceForSwitchCase: true, enforceForIndexOf: true, }, ], "valid-typeof": ["error", { requireStringLiterals: true }], yoda: ["error", "never"], }; return { name: "fenge/javascript", files: ["**/*.{js,cjs,mjs,jsx}"], // https://eslint.org/docs/latest/use/configure/language-options languageOptions: { ecmaVersion: "latest", sourceType: "module", parser: tsParser, // Unfortunately parser cannot be a string. Eslint should support it. https://eslint.org/docs/latest/use/configure/configuration-files-new#configuring-a-custom-parser-and-its-options parserOptions: { // TODO `ecmaVersion` and `sourceType` are no standard here. import/no-default-export required this ecmaVersion: "latest", sourceType: "module", ecmaFeatures: { jsx: true, }, }, globals: { ...Object.fromEntries(Object.entries(globals["shared-node-browser"]) .filter(([k]) => !confusingKeys.includes(k)) .filter(([k]) => !["self", "global"].includes(k))), }, }, plugins: { fp: fpPlugin, n: nPlugin, import: importPlugin, promise: promisePlugin, react: reactPlugin, "react-hooks": reactHooksPlugin, regexp: regexpPlugin, sonarjs: sonarjsPlugin, unicorn: unicornPlugin, "es-x": esxPlugin, "eslint-comments": eslintCommentsPlugin, esm: esmPlugin, "simple-import-sort": simpleImportSortPlugin, "@fenge": fengePlugin, "@typescript-eslint": { rules: tsPlugin.rules }, // TODO: Ugly. Submit a pr to typescript-plugin to fix it. }, rules: { // 1. standard config rules ...standardConfigRules, // 2. code style for a better readability "arrow-body-style": ["error", "as-needed"], // Sort imports by prettier. Turn in off. // "simple-import-sort/imports": [ // "error", // { groups: [["^\\u0000", "^node:", "^@?\\w", "^", "^\\."]] }, // ], "simple-import-sort/exports": "error", "unicorn/prefer-node-protocol": "error", "unicorn/escape-case": "error", // '\ud834' -> '\uD834' // "unicorn/number-literal-case": "error", // 0XFF -> 0xFF // conflict with prettier // 3. ban some syntaxes to reduce mistakes "default-param-last": "error", "for-direction": "error", "func-name-matching": "error", "func-names": "error", // always require a name for function declaration "func-style": ["error", "declaration", { allowArrowFunctions: true }], "getter-return": "error", // "init-declarations": "error", "logical-assignment-operators": [ "error", "always", { enforceForIfStatements: true }, ], "max-depth": ["error", { max: 5 }], "max-params": ["error", { max: 4 }], "no-bitwise": "error", "no-console": "error", "no-constant-binary-expression": "error", "no-dupe-else-if": "error", "no-duplicate-imports": "error", "no-empty-static-block": "error", "no-empty-function": "error", "no-implicit-coercion": [ "error", { disallowTemplateShorthand: true, allow: ["!!"] }, ], // forbid code like `const num = +str`; "no-inner-declarations": [ "error", "functions", { blockScopedFunctions: "disallow" }, ], "no-invalid-this": "error", "no-lonely-if": "error", "no-multi-assign": "error", "no-new-native-nonconstructor": "error", "no-nonoctal-decimal-escape": "error", "no-object-constructor": "error", "no-param-reassign": "error", "no-plusplus": "error", "no-setter-return": "error", "no-shadow": ["error", { ignoreOnInitialization: true }], "no-unassigned-vars": "error", "no-unsafe-optional-chaining": [ "error", { disallowArithmeticOperators: true }, ], "no-unused-labels": "error", "no-unused-private-class-members": "error", "no-useless-assignment": "error", "no-useless-call": "error", "no-useless-catch": "error", "no-useless-computed-key": "error", "no-useless-constructor": "error", "no-useless-escape": "error", "no-useless-rename": "error", "no-useless-return": "error", "no-var": "error", "object-shorthand": "error", "prefer-arrow-callback": "error", "prefer-exponentiation-operator": "error", "prefer-object-has-own": "error", // "prefer-object-spread": "error", "prefer-spread": "error", "prefer-template": "error", "require-await": "error", "require-yield": "error", // es "es-x/no-accessor-properties": "error", "es-x/no-async-iteration": "error", "es-x/no-generators": "error", "es-x/no-hashbang": "error", "es-x/no-legacy-object-prototype-accessor-methods": "error", "es-x/no-top-level-await": "error", // eslint-comments "eslint-comments/disable-enable-pair": "error", "eslint-comments/no-aggregating-enable": "error", "eslint-comments/no-duplicate-disable": "error", "eslint-comments/no-unlimited-disable": "error", "eslint-comments/no-unused-enable": "error", "eslint-comments/no-use": [ "error", // Refer ESLint doc: https://eslint.org/docs/latest/use/command-line-interface#--no-inline-config // And https://eslint-community.github.io/eslint-plugin-eslint-comments/rules/no-use.html { allow: ["eslint-disable-line", "eslint-disable-next-line"] }, ], "eslint-comments/require-description": "error", // esm "esm/existing-file-imports": "error", "esm/no-circular-imports": "error", "esm/no-cli-imports": "error", "esm/no-declaration-file-imports": "error", "esm/no-directory-imports": "error", "esm/no-dynamic-imports": "error", "esm/no-empty-exports": "error", "esm/no-external-src-imports": "error", "esm/no-git-ignored-imports": "error", "esm/no-phantom-dep-imports": "error", "esm/no-query-suffixes": "error", "esm/no-relative-parent-imports": "error", "esm/no-rename-exports": "error", "esm/no-rename-imports": "error", "esm/no-side-effect-imports": "error", "esm/no-useless-path-segments": "error", "esm/required-exports": "error", "esm/top-side-effect-imports": "error", // fp "fp/no-arguments": "error", "fp/no-delete": "error", // import "import/export": "error", "import/first": "error", // "import/newline-after-import": "error", // already handled by prettier's plugin `@ianvs/prettier-plugin-sort-imports` "import/no-absolute-path": "error", "import/no-commonjs": [ "error", { allowRequire: false, allowConditionalRequire: false, allowPrimitiveModules: false, }, ], /** * 1. The ESM specification didn’t say anything about interoperability with CommonJS. See: https://blog.andrewbran.ch/default-exports-in-commonjs-libraries/ * 2. Reexporting like `export * from 'foo'` will be difficult. */ "import/no-default-export": "error", "import/no-duplicates": "error", "import/no-dynamic-require": "error", "import/no-empty-named-blocks": "error", // The feature of this rule is already handled by Prettier. But we still put it here. "import/no-mutable-exports": "error", // forbid code like `export let count = 3` "import/no-named-default": "error", "import/no-relative-packages": "error", // forbid to import module from other monorepo packages by relative paths "import/no-self-import": "error", "import/no-webpack-loader-syntax": "error", // n "n/handle-callback-err": ["error", "^(err|error)$"], "n/no-callback-literal": "error", "n/no-deprecated-api": "error", "n/no-exports-assign": "error", "n/no-new-require": "error", "n/no-path-concat": "error", "n/no-process-exit": "error", "n/no-unpublished-bin": "error", "n/prefer-global/buffer": ["error", "never"], "n/prefer-global/console": "error", "n/prefer-global/crypto": "error", "n/prefer-global/process": ["error", "never"], "n/prefer-global/text-decoder": "error", "n/prefer-global/text-encoder": "error", "n/prefer-global/timers": "error", "n/prefer-global/url": "error", "n/prefer-global/url-search-params": "error", "n/process-exit-as-throw": "error", // promise "promise/no-return-wrap": "error", "promise/param-names": "error", "promise/prefer-catch": "error", // react // "react/hook-use-state": "error", // This rule will cause some warnings because we don't specify the version of react. "react/jsx-filename-extension": [ "error", { allow: "as-needed", extensions: [".jsx", ".tsx"] }, ], "react/jsx-key": "error", "react/jsx-no-duplicate-props": "error", "react/jsx-no-undef": "error", "react/jsx-no-useless-fragment": "error", "react/jsx-props-no-spread-multi": "error", "react/jsx-uses-vars": "error", "react/jsx-fragments": "error", // react-hooks "react-hooks/exhaustive-deps": "error", "react-hooks/rules-of-hooks": "error", // regexp // Copied from https://github.com/ota-meshi/eslint-plugin-regexp/blob/master/lib/configs/rules/recommended.ts "regexp/confusing-quantifier": "error", "regexp/control-character-escape": "error", "regexp/match-any": "error", "regexp/negation": "error", "regexp/no-contradiction-with-assertion": "error", "regexp/no-dupe-characters-character-class": "error", "regexp/no-dupe-disjunctions": "error", "regexp/no-empty-alternative": "error", "regexp/no-empty-capturing-group": "error", "regexp/no-empty-character-class": "error", "regexp/no-empty-group": "error", "regexp/no-empty-lookarounds-assertion": "error", "regexp/no-empty-string-literal": "error", "regexp/no-escape-backspace": "error", "regexp/no-extra-lookaround-assertions": "error", "regexp/no-invalid-regexp": "error", "regexp/no-invisible-character": "error", "regexp/no-lazy-ends": "error", "regexp/no-legacy-features": "error", "regexp/no-misleading-capturing-group": "error", "regexp/no-misleading-unicode-character": "error", "regexp/no-missing-g-flag": "error", "regexp/no-non-standard-flag": "error", "regexp/no-obscure-range": "error", "regexp/no-optional-assertion": "error", "regexp/no-potentially-useless-backreference": "error", "regexp/no-super-linear-backtracking": "error", "regexp/no-trivially-nested-assertion": "error", "regexp/no-trivially-nested-quantifier": "error", // "regexp/no-unused-capturing-group": "error", "regexp/no-useless-assertions": "error", "regexp/no-useless-backreference": "error", "regexp/no-useless-character-class": "error", "regexp/no-useless-dollar-replacements": "error", "regexp/no-useless-escape": "error", "regexp/no-useless-flag": "error", "regexp/no-useless-lazy": "error", "regexp/no-useless-non-capturing-group": "error", "regexp/no-useless-quantifier": "error", "regexp/no-useless-range": "error", "regexp/no-useless-set-operand": "error", "regexp/no-useless-string-literal": "error", "regexp/no-useless-two-nums-quantifier": "error", "regexp/no-zero-quantifier": "error", "regexp/optimal-lookaround-quantifier": "error", "regexp/optimal-quantifier-concatenation": "error", "regexp/prefer-character-class": "error", "regexp/prefer-d": "error", "regexp/prefer-plus-quantifier": "error", "regexp/prefer-predefined-assertion": "error", "regexp/prefer-question-quantifier": "error", "regexp/prefer-range": "error", "regexp/prefer-set-operation": "error", "regexp/prefer-star-quantifier": "error", "regexp/prefer-unicode-codepoint-escapes": "error", "regexp/prefer-w": "error", "regexp/simplify-set-operations": "error", "regexp/sort-flags": "error", "regexp/strict": "error", // "regexp/use-ignore-case": "error", // sonarjs "sonarjs/no-collapsible-if": "error", "sonarjs/no-all-duplicated-branches": "error", "sonarjs/no-identical-conditions": "error", "sonarjs/no-identical-expressions": "error", "sonarjs/no-ignored-return": "error", "sonarjs/no-inverted-boolean-check": "error", "sonarjs/no-nested-switch": "error", "sonarjs/no-useless-catch": "error", "sonarjs/prefer-immediate-return": "error", // unicorn // 'unicorn/no-null': 'error', // null can be useful when interact with json. "unicorn/catch-error-name": ["error", { ignore: ["^e$", "^err$"] }], "unicorn/consistent-assert": "error", "unicorn/consistent-date-clone": "error", "unicorn/consistent-destructuring": "error", "unicorn/consistent-empty-array-spread": "error", "unicorn/error-message": "error", "unicorn/explicit-length-check": "error", "unicorn/filename-case": [ "error", { cases: { kebabCase: true, pascalCase: true } }, ], "unicorn/import-style": [ "error", { styles: { react: { named: true }, child_process: { default: true }, fs: { default: true }, "fs/promises": { default: true }, process: { default: true }, "util/types": { named: true }, "node:child_process": { default: true }, "node:fs": { default: true }, "node:fs/promises": { default: true }, "node:process": { default: true }, "node:util/types": { named: true }, }, }, ], "unicorn/new-for-builtins": "error", "unicorn/no-abusive-eslint-disable": "error", "unicorn/no-accessor-recursion": "error", "unicorn/no-array-callback-reference": "error", "unicorn/no-array-method-this-argument": "error", "unicorn/no-array-reverse": [ "error", { allowExpressionStatement: false }, ], "unicorn/no-array-sort": ["error", { allowExpressionStatement: false }], "unicorn/no-await-in-promise-methods": "error", "unicorn/no-for-loop": "error", "unicorn/no-instanceof-builtins": "error", "unicorn/no-lonely-if": "error", "unicorn/no-named-default": "error", "unicorn/no-negation-in-equality-check": "error", "unicorn/no-new-array": "error", "unicorn/no-new-buffer": "error", "unicorn/no-process-exit": "error", // Prefer `n/no-process-exit`, but at the same time using this rule seems have no problem "unicorn/no-single-promise-in-promise-methods": "error", "unicorn/no-static-only-class": "error", "unicorn/no-thenable": "error", "unicorn/no-this-assignment": "error", "unicorn/no-typeof-undefined": "error", "unicorn/no-unnecessary-array-flat-depth": "error", "unicorn/no-unnecessary-await": "error", "unicorn/no-unreadable-array-destructuring": "error", "unicorn/no-unreadable-iife": "error", "unicorn/no-useless-error-capture-stack-trace": "error", "unicorn/no-useless-fallback-in-spread": "error", "unicorn/no-useless-promise-resolve-reject": "error", "unicorn/no-useless-spread": "error", "unicorn/no-useless-switch-case": "error", "unicorn/no-zero-fractions": "error", "unicorn/prefer-array-flat-map": "error", "unicorn/prefer-bigint-literals": "error", "unicorn/prefer-class-fields": "error", "unicorn/prefer-classlist-toggle": "error", "unicorn/prefer-date-now": "error", "unicorn/prefer-export-from": "error", "unicorn/prefer-global-this": "error", "unicorn/prefer-import-meta-properties": "error", "unicorn/prefer-includes": "error", "unicorn/prefer-logical-operator-over-ternary": "error", "unicorn/prefer-math-min-max": "error", "unicorn/prefer-module": "error", "unicorn/prefer-negative-index": "error", "unicorn/prefer-number-properties": "error", "unicorn/prefer-object-from-entries": "error", "unicorn/prefer-optional-catch-binding": "error", "unicorn/prefer-prototype-methods": "error", "unicorn/prefer-reflect-apply": "error", // https://github.com/sindresorhus/eslint-plugin-unicorn/issues/2365 "unicorn/prefer-regexp-test": "error", "unicorn/prefer-string-replace-all": "error", "unicorn/prefer-string-slice": "error", "unicorn/prefer-ternary": "error", // "unicorn/prefer-type-error": "error", "unicorn/require-array-join-separator": "error", "unicorn/require-module-attributes": "error", "unicorn/require-module-specifiers": "error", "unicorn/require-number-to-fixed-digits-argument": "error", "unicorn/text-encoding-identifier-case": "error", "unicorn/throw-new-error": "error", "@fenge/call-arguments-length": "error", "@fenge/consistent-hashbang-and-filename": "error", "@fenge/no-empty-condition": "error", "@fenge/no-instanceof-builtin": "error", "@fenge/no-nested-class": "error", "@fenge/no-nested-function": "error", "@fenge/no-restricted-loops": "error", "@fenge/no-top-level-arrow-function": "error", "@fenge/no-triple-slash-directive": "error", "@fenge/no-unnecessary-template-string": "error", "@fenge/no-used-underscore-param": "error", "@typescript-eslint/ban-ts-comment": [ "error", { "ts-expect-error": true, "ts-ignore": true, "ts-nocheck": true, }, ], "@typescript-eslint/no-this-alias": "error", "@typescript-eslint/no-useless-empty-export": "error", "@typescript-eslint/prefer-for-of": "error", }, }; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb25maWcvanMvYmFzZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLG9CQUFvQixNQUFNLGlEQUFpRCxDQUFDO0FBQ25GLE9BQU8sS0FBSyxXQUFXLE1BQU0sc0JBQXNCLENBQUM7QUFDcEQsT0FBTyxRQUFRLE1BQU0sa0NBQWtDLENBQUM7QUFDeEQsT0FBTyxRQUFRLE1BQU0sMkJBQTJCLENBQUM7QUFDakQsT0FBTyxhQUFhLE1BQU0sMkJBQTJCLENBQUM7QUFDdEQsT0FBTyxTQUFTLE1BQU0sb0JBQW9CLENBQUM7QUFDM0MsT0FBTyxLQUFLLFNBQVMsTUFBTSxtQkFBbUIsQ0FBQztBQUMvQyxPQUFPLFFBQVEsTUFBTSxrQkFBa0IsQ0FBQztBQUN4QyxPQUFPLFlBQVksTUFBTSxzQkFBc0IsQ0FBQztBQUNoRCxPQUFPLE9BQU8sTUFBTSxpQkFBaUIsQ0FBQztBQUN0QyxPQUFPLGFBQWEsTUFBTSx1QkFBdUIsQ0FBQztBQUNsRCxPQUFPLFdBQVcsTUFBTSxxQkFBcUIsQ0FBQztBQUM5QyxPQUFPLGdCQUFnQixNQUFNLDJCQUEyQixDQUFDO0FBQ3pELE9BQU8sWUFBWSxNQUFNLHNCQUFzQixDQUFDO0FBQ2hELE9BQU8sc0JBQXNCLE1BQU0sa0NBQWtDLENBQUM7QUFDdEUsT0FBTyxhQUFhLE1BQU0sdUJBQXVCLENBQUM7QUFDbEQsT0FBTyxhQUFhLE1BQU0sdUJBQXVCLENBQUM7QUFDbEQsT0FBTyxPQUFPLE1BQU0sU0FBUyxDQUFDO0FBRTlCLE1BQU0sVUFBVSxTQUFTO0lBQ3ZCLDBGQUEwRjtJQUMxRixNQUFNLG1CQUFtQixHQUFHO1FBQzFCLGdCQUFnQixFQUFFO1lBQ2hCLE9BQU87WUFDUCxFQUFFLGFBQWEsRUFBRSxJQUFJLEVBQUUsc0JBQXNCLEVBQUUsSUFBSSxFQUFFO1NBQ3REO1FBQ0QsdUJBQXVCLEVBQUU7WUFDdkIsT0FBTztZQUNQO2dC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XCJAZXNsaW50LWNvbW11bml0eS9lc2xpbnQtcGx1Z2luLWVzbGludC1jb21tZW50c1wiO1xuaW1wb3J0ICogYXMgZmVuZ2VQbHVnaW4gZnJvbSBcIkBmZW5nZS9lc2xpbnQtcGx1Z2luXCI7XG5pbXBvcnQgdHNQbHVnaW4gZnJvbSBcIkB0eXBlc2NyaXB0LWVzbGludC9lc2xpbnQtcGx1Z2luXCI7XG5pbXBvcnQgdHNQYXJzZXIgZnJvbSBcIkB0eXBlc2NyaXB0LWVzbGludC9wYXJzZXJcIjtcbmltcG9ydCBjb25mdXNpbmdLZXlzIGZyb20gXCJjb25mdXNpbmctYnJvd3Nlci1nbG9iYWxzXCI7XG5pbXBvcnQgZXN4UGx1Z2luIGZyb20gXCJlc2xpbnQtcGx1Z2luLWVzLXhcIjtcbmltcG9ydCAqIGFzIGVzbVBsdWdpbiBmcm9tIFwiZXNsaW50LXBsdWdpbi1lc21cIjtcbmltcG9ydCBmcFBsdWdpbiBmcm9tIFwiZXNsaW50LXBsdWdpbi1mcFwiO1xuaW1wb3J0IGltcG9ydFBsdWdpbiBmcm9tIFwiZXNsaW50LXBsdWdpbi1pbXBvcnRcIjtcbmltcG9ydCBuUGx1Z2luIGZyb20gXCJlc2xpbnQtcGx1Z2luLW5cIjtcbmltcG9ydCBwcm9taXNlUGx1Z2luIGZyb20gXCJlc2xpbnQtcGx1Z2luLXByb21pc2VcIjtcbmltcG9ydCByZWFjdFBsdWdpbiBmcm9tIFwiZXNsaW50LXBsdWdpbi1yZWFjdFwiO1xuaW1wb3J0IHJlYWN0SG9va3NQbHVnaW4gZnJvbSBcImVzbGludC1wbHVnaW4tcmVhY3QtaG9va3NcIjtcbmltcG9ydCByZWdleHBQbHVnaW4gZnJvbSBcImVzbGludC1wbHVnaW4tcmVnZXhwXCI7XG5pbXBvcnQgc2ltcGxlSW1wb3J0U29ydFBsdWdpbiBmcm9tIFwiZXNsaW50LXBsdWdpbi1zaW1wbGUtaW1wb3J0LXNvcnRcIjtcbmltcG9ydCBzb25hcmpzUGx1Z2luIGZyb20gXCJlc2xpbnQtcGx1Z2luLXNvbmFyanNcIjtcbmltcG9ydCB1bmljb3JuUGx1Z2luIGZyb20gXCJlc2xpbnQtcGx1Z2luLXVuaWNvcm5cIjtcbmltcG9ydCBnbG9iYWxzIGZyb20gXCJnbG9iYWxzXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRKc0Jhc2UoKSB7XG4gIC8vIGNvcGllZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9zdGFuZGFyZC9lc2xpbnQtY29uZmlnLXN0YW5kYXJkL2Jsb2IvbWFzdGVyL3NyYy9pbmRleC50c1xuICBjb25zdCBzdGFuZGFyZENvbmZpZ1J1bGVzID0ge1xuICAgIFwiYWNjZXNzb3ItcGFpcnNcIjogW1xuICAgICAgXCJlcnJvclwiLFxuICAgICAgeyBzZXRXaXRob3V0R2V0OiB0cnVlLCBlbmZvcmNlRm9yQ2xhc3NNZW1iZXJzOiB0cnVlIH0sXG4gICAgXSxcbiAgICBcImFycmF5LWNhbGxiYWNrLXJldHVyblwiOiBbXG4gICAgICBcImVycm9yXCIsXG4gICAgICB7XG4gICAgICAgIGFsbG93SW1wbGljaXQ6IGZhbHNlLFxuICAgICAgICBjaGVja0ZvckVhY2g6IGZhbHNlLFxuICAgICAgfSxcbiAgICBdLFxuICAgIGNhbWVsY2FzZTogW1xuICAgICAgXCJlcnJvclwiLFxuICAgICAge1xuICAgICAgICBhbGxvdzogW1wiXlVOU0FGRV9cIl0sXG4gICAgICAgIHByb3BlcnRpZXM6IFwibmV2ZXJcIixcbiAgICAgICAgaWdub3JlR2xvYmFsczogdHJ1ZSxcbiAgICAgIH0sXG4gICAgXSxcbiAgICBcImNvbnN0cnVjdG9yLXN1cGVyXCI6IFwiZXJyb3JcIixcbiAgICBcImRlZmF1bHQtY2FzZS1sYXN0XCI6IFwiZXJyb3JcIixcbiAgICAvLyAnZG90LW5vdGF0aW9uJzogWydlcnJvcicsIHsgYWxsb3dLZXl3b3JkczogdHJ1ZSB9XSwgLy8gVE9ETzogVGhpcyBzaG91bGQgYmUgZW5hYmxlZC4gRGlzYWJsZSBpdCBhcyBpdCBjb25mbGljdHMgd2l0aCB0cyB3aGVuIGVuYWJsaW5nIHRzLWNoZWNrXG4gICAgZXFlcWVxOiBbXCJlcnJvclwiLCBcImFsd2F5c1wiLCB7IG51bGw6IFwiaWdub3JlXCIgfV0sXG4gICAgXCJuZXctY2FwXCI6IFtcImVycm9yXCIsIHsgbmV3SXNDYXA6IHRydWUsIGNhcElzTmV3OiBmYWxzZSwgcHJvcGVydGllczogdHJ1ZSB9XSxcbiAgICAvLyAnbmV3LXBhcmVucyc6ICdlcnJvcicsXG4gICAgXCJuby1hcnJheS1jb25zdHJ1Y3RvclwiOiBcImVycm9yXCIsXG4gICAgXCJuby1hc3luYy1wcm9taXNlLWV4ZWN1dG9yXCI6IFwiZXJyb3JcIixcbiAgICBcIm5vLWNhbGxlclwiOiBcImVycm9yXCIsXG4gICAgXCJuby1jYXNlLWRlY2xhcmF0aW9uc1wiOiBcImVycm9yXCIsXG4gICAgXCJuby1jbGFzcy1hc3NpZ25cIjogXCJlcnJvclwiLFxuICAgIFwibm8tY29tcGFyZS1uZWctemVyb1wiOiBcImVycm9yXCIsXG4gICAgXCJuby1jb25kLWFzc2lnblwiOiBcImVycm9yXCIsXG4gICAgXCJuby1jb25zdC1hc3NpZ25cIjogXCJlcnJvclwiLFxuICAgIFwibm8tY29uc3RhbnQtY29uZGl0aW9uXCI6IFtcImVycm9yXCIsIHsgY2hlY2tMb29wczogZmFsc2UgfV0sXG4gICAgXCJuby1jb250cm9sLXJlZ2V4XCI6IFwiZXJyb3JcIixcbiAgICBcIm5vLWRlYnVnZ2VyXCI6IFwiZXJyb3JcIixcbiAgICBcIm5vLWRlbGV0ZS12YXJcIjogXCJlcnJvclwiLFxuICAgIFwibm8tZHVwZS1hcmdzXCI6IFwiZXJyb3JcIixcbiAgICBcIm5vLWR1cGUtY2xhc3MtbWVtYmVyc1wiOiBcImVycm9yXCIsXG4gICAgXCJuby1kdXBlLWtleXNcIjogXCJlcnJvclwiLFxuICAgIFwibm8tZHVwbGljYXRlLWNhc2VcIjogXCJlcnJvclwiLFxuICAgIFwibm8tdXNlbGVzcy1iYWNrcmVmZXJlbmNlXCI6IFwiZXJyb3JcIixcbiAgICBcIm5vLWVtcHR5XCI6IFtcImVycm9yXCIsIHsgYWxsb3dFbXB0eUNhdGNoOiB0cnVlIH1dLFxuICAgIFwibm8tZW1wdHktY2hhcmFjdGVyLWNsYXNzXCI6IFwiZXJyb3JcIixcbiAgICBcIm5vLWVtcHR5LXBhdHRlcm5cIjogXCJlcnJvclwiLFxuICAgIFwibm8tZXZhbFwiOiBcImVycm9yXCIsXG4gICAgXCJuby1leC1hc3NpZ25cIjogXCJlcnJvclwiLFxuICAgIFwibm8tZXh0ZW5kLW5hdGl2ZVwiOiBcImVycm9yXCIsXG4gICAgXCJuby1leHRyYS1iaW5kXCI6IFwiZXJyb3JcIixcbiAgICBcIm5vLWV4dHJhLWJvb2xlYW4tY2FzdFwiOiBcImVycm9yXCIsXG4gICAgXCJuby1mYWxsdGhyb3VnaFwiOiBcImVycm9yXCIsXG4gICAgXCJuby1mdW5jLWFzc2lnblwiOiBcImVycm9yXCIsXG4gICAgXCJuby1nbG9iYWwtYXNzaWduXCI6IFwiZXJyb3JcIixcbiAgICBcIm5vLWltcGxpZWQtZXZhbFwiOiBcImVycm9yXCIsXG4gICAgXCJuby1pbXBvcnQtYXNzaWduXCI6IFwiZXJyb3JcIixcbiAgICBcIm5vLWludmFsaWQtcmVnZXhwXCI6IFwiZXJyb3JcIixcbiAgICBcIm5vLWlycmVndWxhci13aGl0ZXNwYWNlXCI6IFwiZXJyb3JcIixcbiAgICBcIm5vLWl0ZXJhdG9yXCI6IFwiZXJyb3JcIixcbiAgICBcIm5vLWxhYmVsc1wiOiBbXCJlcnJvclwiLCB7IGFsbG93TG9vcDogZmFsc2UsIGFsbG93U3dpdGNoOiBmYWxzZSB9XSxcbiAgICBcIm5vLWxvbmUtYmxvY2tzXCI6IFwiZXJyb3JcIixcbiAgICBcIm5vLWxvc3Mtb2YtcHJlY2lzaW9uXCI6IFwiZXJyb3JcIixcbiAgICBcIm5vLW1pc2xlYWRpbmctY2hhcmFjdGVyLWNsYXNzXCI6IFwiZXJyb3JcIixcbiAgICBcIm5vLXByb3RvdHlwZS1idWlsdGluc1wiOiBcImVycm9yXCIsXG4gICAgXCJuby1tdWx0aS1zdHJcIjogXCJlcnJvclwiLFxuICAgIFwibm8tbmV3XCI6IFwiZXJyb3JcIixcbiAgICBcIm5vLW5ldy1mdW5jXCI6IFwiZXJyb3JcIixcbiAgICBcIm5vLW5ldy13cmFwcGVyc1wiOiBcImVycm9yXCIsXG4gICAgXCJuby1vYmotY2FsbHNcIjogXCJlcnJvclwiLFxuICAgIFwibm8tb2N0YWxcIjogXCJlcnJvclwiLFxuICAgIFwibm8tb2N0YWwtZXNjYXBlXCI6IFwiZXJyb3JcIixcbiAgICBcIm5vLXByb21pc2UtZXhlY3V0b3ItcmV0dXJuXCI6IFwiZXJyb3JcIixcbiAgICBcIm5vLXByb3RvXCI6IFwiZXJyb3JcIixcbiAgICBcIm5vLXJlZGVjbGFyZVwiOiBbXCJlcnJvclwiLCB7IGJ1aWx0aW5HbG9iYWxzOiBmYWxzZSB9XSxcbiAgICBcIm5vLXJlZ2V4LXNwYWNlc1wiOiBcImVycm9yXCIsXG4gICAgXCJuby1yZXR1cm4tYXNzaWduXCI6IFtcImVycm9yXCIsIFwiZXhjZXB0LXBhcmVuc1wiXSxcbiAgICBcIm5vLXNjcmlwdC11cmxcIjog