monitor

The Monitor

Live supply-chain watchboard — critical npm & PyPI packages, watched for compromise.

65
watched
26
nominal
0
watch
0
active alerts
39
incidents on record
updated…
npm — by dependents
@ctrl/tinycolor npm
4.2.0 8mo ago incident on record
DELETION ×2BURST ×3
latest 4.2.0 versions 49 maintainers 1
3.5.1
3.6.0
3.6.1
4.0.0
4.0.1
4.0.2
4.0.3
4.0.4
4.1.0
4.1.1
4.1.2
4.2.0
DELETION
4.1.1 published then removed
high · registry-verified · 2025-09-15 · 8mo ago
DELETION
4.1.2 published then removed
high · registry-verified · 2025-09-15 · 8mo ago
BURST
3 releases in 29m: 3.0.0, 3.0.1, 3.0.2
info · registry-verified · 2020-04-22 · 6y ago
BURST
2 releases in 50m: 3.6.1, 4.0.0
info · registry-verified · 2023-08-23 · 2y ago
BURST
2 releases in 21m: 4.1.1, 4.1.2
info · registry-verified · 2025-09-15 · 8mo ago
release diff 4.1.0 → 4.2.0
+0 added · -0 removed · ~2 modified
package.json +3 lines
--- +++ @@ -2,3 +2,3 @@   "name": "@ctrl/tinycolor",-  "version": "4.1.0",+  "version": "4.2.0",   "description": "Fast, small color manipulation and conversion for JavaScript",@@ -6,3 +6,4 @@   "publishConfig": {-    "access": "public"+    "access": "public",+    "provenance": true   },
@typescript-eslint/eslint-plugin npm
8.60.0 5d ago incident on record
DELETIONBURST ×7
latest 8.60.0 versions 4602 maintainers 2
8.57.0
8.57.1
8.57.2
8.58.0
8.58.1
8.58.2
8.59.0
8.59.1
8.59.2
8.59.3
8.59.4
8.60.0
DELETION
1.10.0 published then removed
high · registry-verified · 2019-06-09 · 6y ago
BURST
2 releases in 31m: 1.10.0, 1.10.1
info · registry-verified · 2019-06-09 · 6y ago
BURST
3 releases in 59m: 5.30.1, 5.30.2, 5.30.3
info · registry-verified · 2022-07-01 · 3y ago
BURST
2 releases in 44m: 5.35.0, 5.35.1
info · registry-verified · 2022-08-24 · 3y ago
BURST
2 releases in 45m: 5.59.10, 5.59.11
info · registry-verified · 2023-06-12 · 2y ago
BURST
2 releases in 41m: 5.62.0, 6.0.0
info · registry-verified · 2023-07-10 · 2y ago
BURST
2 releases in 30m: 7.0.0, 7.0.1
info · registry-verified · 2024-02-12 · 2y ago
BURST
2 releases in 20m: 7.14.0, 7.14.1
info · registry-verified · 2024-06-24 · 1y ago
release diff 8.59.4 → 8.60.0
+0 added · -0 removed · ~1 modified
package.json +8 lines
--- +++ @@ -2,3 +2,3 @@   "name": "@typescript-eslint/eslint-plugin",-  "version": "8.59.4",+  "version": "8.60.0",   "description": "TypeScript plugin for ESLint",@@ -54,6 +54,6 @@     "ts-api-utils": "^2.5.0",-    "@typescript-eslint/type-utils": "8.59.4",-    "@typescript-eslint/utils": "8.59.4",-    "@typescript-eslint/scope-manager": "8.59.4",-    "@typescript-eslint/visitor-keys": "8.59.4"+    "@typescript-eslint/scope-manager": "8.60.0",+    "@typescript-eslint/type-utils": "8.60.0",+    "@typescript-eslint/utils": "8.60.0",+    "@typescript-eslint/visitor-keys": "8.60.0"   },@@ -80,4 +80,4 @@     "vitest": "^4.0.18",-    "@typescript-eslint/rule-schema-to-typescript-types": "8.59.4",-    "@typescript-eslint/rule-tester": "8.59.4"+    "@typescript-eslint/rule-schema-to-typescript-types": "8.60.0",+    "@typescript-eslint/rule-tester": "8.60.0"   },@@ -86,3 +86,3 @@     "typescript": ">=4.8.4 <6.1.0",-    "@typescript-eslint/parser": "^8.59.4"+    "@typescript-eslint/parser": "^8.60.0"   },
@typescript-eslint/parser npm
8.60.0 5d ago incident on record
DELETIONBURST ×7
latest 8.60.0 versions 4685 maintainers 2
8.57.0
8.57.1
8.57.2
8.58.0
8.58.1
8.58.2
8.59.0
8.59.1
8.59.2
8.59.3
8.59.4
8.60.0
DELETION
1.10.0 published then removed
high · registry-verified · 2019-06-09 · 6y ago
BURST
2 releases in 31m: 1.10.0, 1.10.1
info · registry-verified · 2019-06-09 · 6y ago
BURST
3 releases in 59m: 5.30.1, 5.30.2, 5.30.3
info · registry-verified · 2022-07-01 · 3y ago
BURST
2 releases in 44m: 5.35.0, 5.35.1
info · registry-verified · 2022-08-24 · 3y ago
BURST
2 releases in 45m: 5.59.10, 5.59.11
info · registry-verified · 2023-06-12 · 2y ago
BURST
2 releases in 41m: 5.62.0, 6.0.0
info · registry-verified · 2023-07-10 · 2y ago
BURST
2 releases in 30m: 7.0.0, 7.0.1
info · registry-verified · 2024-02-12 · 2y ago
BURST
2 releases in 20m: 7.14.0, 7.14.1
info · registry-verified · 2024-06-24 · 1y ago
release diff 8.59.4 → 8.60.0
+0 added · -0 removed · ~1 modified
package.json +5 lines
--- +++ @@ -2,3 +2,3 @@   "name": "@typescript-eslint/parser",-  "version": "8.59.4",+  "version": "8.60.0",   "description": "An ESLint custom parser which leverages TypeScript ESTree",@@ -46,6 +46,6 @@     "debug": "^4.4.3",-    "@typescript-eslint/scope-manager": "8.59.4",-    "@typescript-eslint/types": "8.59.4",-    "@typescript-eslint/visitor-keys": "8.59.4",-    "@typescript-eslint/typescript-estree": "8.59.4"+    "@typescript-eslint/scope-manager": "8.60.0",+    "@typescript-eslint/types": "8.60.0",+    "@typescript-eslint/typescript-estree": "8.60.0",+    "@typescript-eslint/visitor-keys": "8.60.0"   },
axios npm
1.16.1 18d ago incident on record
DELETION ×2BURST ×3
latest 1.16.1 versions 138 maintainers 1
1.13.6
1.14.0
1.14.1
0.30.4
1.15.0
0.31.0
1.15.1
0.31.1
1.15.2
1.16.0
0.32.0
1.16.1
DELETION
1.14.1 published then removed
high · registry-verified · 2026-03-31 · 2mo ago
DELETION
0.30.4 published then removed
high · registry-verified · 2026-03-31 · 2mo ago
BURST
2 releases in 60m: 1.1.1, 1.1.2
info · registry-verified · 2022-10-07 · 3y ago
BURST
2 releases in 39m: 1.14.1, 0.30.4
info · registry-verified · 2026-03-31 · 2mo ago
BURST
2 releases in 4m: 1.15.1, 0.31.1 · ACTIVE
info · registry-verified · 2026-04-19 · 1mo ago
release diff 0.32.0 → 1.16.1
+23 added · -12 removed · ~62 modified
new files touching dangerous APIs: dist/browser/axios.cjs, dist/node/axios.cjs, lib/core/AxiosHeaders.js
+46 more files not shown
dist/axios.js +4012 lines · 3 flagged
--- +++ @@ -1,2 +1,2 @@-// axios v0.32.0 Copyright (c) 2026 Matt Zabriskie+/*! Axios v1.16.1 Copyright (c) 2026 Matt Zabriskie and contributors */ (function (global, factory) {@@ -7,3 +7,552 @@ -  var bind = function bind(fn, thisArg) {+  function _OverloadYield(e, d) {+    this.v = e, this.k = d;+  }+  function _arrayLikeToArray(r, a) {+    (null == a || a > r.length) && (a = r.length);+    for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e];+    return n;+  }+  function _arrayWithHoles(r) {+    if (Array.isArray(r)) return r;+  }+  function _arrayWithoutHoles(r) {+    if (Array.isArray(r)) return _arrayLikeToArray(r);+  }+  function _assertThisInitialized(e) {+    if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called");+    return e;+  }+  function _asyncGeneratorDelegate(t) {+    var e = {},+      n = false;+    function pump(e, r) {+      return n = true, r = new Promise(function (n) {+        n(t[e](r));+      }), {+        done: false,+        value: new _OverloadYield(r, 1)+      };+    }+    return e["undefined" != typeof Symbol && Symbol.iterator || "@@iterator"] = function () {+      return this;+    }, e.next = function (t) {+      return n ? (n = false, t) : pump("next", t);+    }, "function" == typeof t.throw && (e.throw = function (t) {+      if (n) throw n = false, t;+      return pump("throw", t);+    }), "function" == typeof t.return && (e.return = function (t) {+      return n ? (n = false, t) : pump("return", t);+    }), e;+  }+  function _asyncIterator(r) {+    var n,+      t,+      o,+      e = 2;+    for ("undefined" != typeof Symbol && (t = Symbol.asyncIterator, o = Symbol.iterator); e--;) {+      if (t && null != (n = r[t])) return n.call(r);+      if (o && null != (n = r[o])) return new AsyncFromSyncIterator(n.call(r));+      t = "@@asyncIterator", o = "@@iterator";+    }+    throw new TypeError("Object is not async iterable");+  }+  function AsyncFromSyncIterator(r) {+    function AsyncFromSyncIteratorContinuation(r) {+      if (Object(r) !== r) return Promise.reject(new TypeError(r + " is not an object."));+      var n = r.done;+      return Promise.resolve(r.value).then(function (r) {+        return {+          value: r,+          done: n+        };+      });+    }+    return AsyncFromSyncIterator = function (r) {+      this.s = r, this.n = r.next;+    }, AsyncFromSyncIterator.prototype = {+      s: null,+      n: null,+      next: function () {+        return AsyncFromSyncIteratorContinuation(this.n.apply(this.s, arguments));+      },+      return: function (r) {+        var n = this.s.return;+        return void 0 === n ? Promise.resolve({+          value: r,+          done: true+        }) : AsyncFromSyncIteratorContinuation(n.apply(this.s, arguments));+      },+      throw: function (r) {+        var n = this.s.return;+        return void 0 === n ? Promise.reject(r) : AsyncFromSyncIteratorContinuation(n.apply(this.s, arguments));+      }+    }, new AsyncFromSyncIterator(r);+  }+  function asyncGeneratorStep(n, t, e, r, o, a, c) {+    try {+      var i = n[a](c),+        u = i.value;+    } catch (n) {+      return void e(n);+    }+    i.done ? t(u) : Promise.resolve(u).then(r, o);+  }+  function _asyncToGenerator(n) {+    return function () {+      var t = this,+        e = arguments;+      return new Promise(function (r, o) {+        var a = n.apply(t, e);+        function _next(n) {+          asyncGeneratorStep(a, r, o, _next, _throw, "next", n);+        }+        function _throw(n) {+          asyncGeneratorStep(a, r, o, _next, _throw, "throw", n);+        }+        _next(void 0);+      });+    };+  }+  function _awaitAsyncGenerator(e) {+    return new _OverloadYield(e, 0);+  }+  function _callSuper(t, o, e) {+    return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e));+  }+  function _classCallCheck(a, n) {+    if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function");+  }+  function _construct(t, e, r) {+    if (_isNativeReflectConstruct()) return Reflect.construct.apply(null, arguments);+    var o = [null];+    o.push.apply(o, e);+    var p = new (t.bind.apply(t, o))();+    return r && _setPrototypeOf(p, r.prototype), p;+  }+  function _defineProperties(e, r) {+    for (var t = 0; t < r.length; t++) {+      var o = r[t];+      o.enumerable = o.enumerable || false, o.configurable = true, "value" in o && (o.writable = true), Object.defineProperty(e, _toPropertyKey(o.key), o);+    }+  }+  function _createClass(e, r, t) {+    return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", {+      writable: false+    }), e;+  }+  function _createForOfIteratorHelper(r, e) {+    var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"];+    if (!t) {+      if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e) {+        t && (r = t);+        var n = 0,+          F = function () {};+        return {+          s: F,+          n: function () {+            return n >= r.length ? {+              done: true+            } : {+              done: false,+              value: r[n++]+            };+          },+          e: function (r) {+            throw r;+          },+          f: F+        };+      }+      throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");+    }+    var o,+      a = true,+      u = false;+    return {+      s: function () {+        t = t.call(r);+      },+      n: function () {+        var r = t.next();+        return a = r.done, r;+      },+      e: function (r) {+        u = true, o = r;+      },+      f: function () {+        try {+          a || null == t.return || t.return();+        } finally {+          if (u) throw o;+        }+      }+    };+  }+  function _defineProperty(e, r, t) {+    return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, {+      value: t,+      enumerable: true,+      configurable: true,+      writable: true+    }) : e[r] = t, e;+  }+  function _getPrototypeOf(t) {+    return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) {+      return t.__proto__ || Object.getPrototypeOf(t);+    }, _getPrototypeOf(t);+  }+  function _inherits(t, e) {+    if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function");+    t.prototype = Object.create(e && e.prototype, {+      constructor: {+        value: t,+        writable: true,+        configurable: true+      }+    }), Object.defineProperty(t, "prototype", {+      writable: false+    }), e && _setPrototypeOf(t, e);+  }+  function _isNativeFunction(t) {+    try {+      return -1 !== Function.toString.call(t).indexOf("[native code]");+    } catch (n) {+      return "function" == typeof t;+    }+  }+  function _isNativeReflectConstruct() {+    try {+      var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {}));+    } catch (t) {}+    return (_isNativeReflectConstruct = function () {+      return !!t;+    })();+  }+  function _iterableToArray(r) {+    if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r);+  }+  function _iterableToArrayLimit(r, l) {+    var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"];+    if (null != t) {+      var e,+        n,+        i,+        u,+        a = [],+        f = true,+        o = false;+      try {+        if (i = (t = t.call(r)).next, 0 === l) {+          if (Object(t) !== t) return;+          f = !1;
… 6156 more lines (truncated)
dist/browser/axios.cjs +4733 lines · 4 flagged
--- +++ @@ -0,0 +1,4733 @@+/*! Axios v1.16.1 Copyright (c) 2026 Matt Zabriskie and contributors */+'use strict';++/**+ * Create a bound version of a function with a specified `this` context+ *+ * @param {Function} fn - The function to bind+ * @param {*} thisArg - The value to be passed as the `this` parameter+ * @returns {Function} A new function that will call the original function with the specified `this` context+ */+function bind(fn, thisArg) {+  return function wrap() {+    return fn.apply(thisArg, arguments);+  };+}++// utils is a library of generic helper functions non-specific to axios++const { toString } = Object.prototype;+const { getPrototypeOf } = Object;+const { iterator, toStringTag } = Symbol;++const kindOf = ((cache) => (thing) => {+  const str = toString.call(thing);+  return cache[str] || (cache[str] = str.slice(8, -1).toLowerCase());+})(Object.create(null));++const kindOfTest = (type) => {+  type = type.toLowerCase();+  return (thing) => kindOf(thing) === type;+};++const typeOfTest = (type) => (thing) => typeof thing === type;++/**+ * Determine if a value is a non-null object+ *+ * @param {Object} val The value to test+ *+ * @returns {boolean} True if value is an Array, otherwise false+ */+const { isArray } = Array;++/**+ * Determine if a value is undefined+ *+ * @param {*} val The value to test+ *+ * @returns {boolean} True if the value is undefined, otherwise false+ */+const isUndefined = typeOfTest('undefined');++/**+ * Determine if a value is a Buffer+ *+ * @param {*} val The value to test+ *+ * @returns {boolean} True if value is a Buffer, otherwise false+ */+function isBuffer(val) {+  return (+    val !== null &&+    !isUndefined(val) &&+    val.constructor !== null &&+    !isUndefined(val.constructor) &&+    isFunction$1(val.constructor.isBuffer) &&+    val.constructor.isBuffer(val)+  );+}++/**+ * Determine if a value is an ArrayBuffer+ *+ * @param {*} val The value to test+ *+ * @returns {boolean} True if value is an ArrayBuffer, otherwise false+ */+const isArrayBuffer = kindOfTest('ArrayBuffer');++/**+ * Determine if a value is a view on an ArrayBuffer+ *+ * @param {*} val The value to test+ *+ * @returns {boolean} True if value is a view on an ArrayBuffer, otherwise false+ */+function isArrayBufferView(val) {+  let result;+  if (typeof ArrayBuffer !== 'undefined' && ArrayBuffer.isView) {+    result = ArrayBuffer.isView(val);+  } else {+    result = val && val.buffer && isArrayBuffer(val.buffer);+  }+  return result;+}++/**+ * Determine if a value is a String+ *+ * @param {*} val The value to test+ *+ * @returns {boolean} True if value is a String, otherwise false+ */+const isString = typeOfTest('string');++/**+ * Determine if a value is a Function+ *+ * @param {*} val The value to test+ * @returns {boolean} True if value is a Function, otherwise false+ */+const isFunction$1 = typeOfTest('function');++/**+ * Determine if a value is a Number+ *+ * @param {*} val The value to test+ *+ * @returns {boolean} True if value is a Number, otherwise false+ */+const isNumber = typeOfTest('number');++/**+ * Determine if a value is an Object+ *+ * @param {*} thing The value to test+ *+ * @returns {boolean} True if value is an Object, otherwise false+ */+const isObject = (thing) => thing !== null && typeof thing === 'object';++/**+ * Determine if a value is a Boolean+ *+ * @param {*} thing The value to test+ * @returns {boolean} True if value is a Boolean, otherwise false+ */+const isBoolean = (thing) => thing === true || thing === false;++/**+ * Determine if a value is a plain Object+ *+ * @param {*} val The value to test+ *+ * @returns {boolean} True if value is a plain Object, otherwise false+ */+const isPlainObject = (val) => {+  if (kindOf(val) !== 'object') {+    return false;+  }++  const prototype = getPrototypeOf(val);+  return (+    (prototype === null ||+      prototype === Object.prototype ||+      Object.getPrototypeOf(prototype) === null) &&+    !(toStringTag in val) &&+    !(iterator in val)+  );+};++/**+ * Determine if a value is an empty object (safely handles Buffers)+ *+ * @param {*} val The value to test+ *+ * @returns {boolean} True if value is an empty object, otherwise false+ */+const isEmptyObject = (val) => {+  // Early return for non-objects or Buffers to prevent RangeError+  if (!isObject(val) || isBuffer(val)) {+    return false;+  }++  try {+    return Object.keys(val).length === 0 && Object.getPrototypeOf(val) === Object.prototype;+  } catch (e) {+    // Fallback for any other objects that might cause RangeError with Object.keys()+    return false;+  }+};++/**+ * Determine if a value is a Date+ *+ * @param {*} val The value to test+ *+ * @returns {boolean} True if value is a Date, otherwise false+ */+const isDate = kindOfTest('Date');++/**+ * Determine if a value is a File+ *+ * @param {*} val The value to test+ *+ * @returns {boolean} True if value is a File, otherwise false+ */+const isFile = kindOfTest('File');++/**+ * Determine if a value is a React Native Blob+ * React Native "blob": an object with a `uri` attribute. Optionally, it can+ * also have a `name` and `type` attribute to specify filename and content type+ *+ * @see https://github.com/facebook/react-native/blob/26684cf3adf4094eb6c405d345a75bf8c7c0bf88/Libraries/Network/FormData.js#L68-L71+ *+ * @param {*} value The value to test+ *+ * @returns {boolean} True if value is a React Native Blob, otherwise false+ */+const isReactNativeBlob = (value) => {+  return !!(value && typeof value.uri !== 'undefined');+};++/**+ * Determine if environment is React Native+ * ReactNative `FormData` has a non-standard `getParts()` method+ *+ * @param {*} formData The formData to test+ *+ * @returns {boolean} True if environment is React Native, otherwise false+ */+const isReactNative = (formData) => formData && typeof formData.getParts !== 'undefined';++/**+ * Determine if a value is a Blob+ *+ * @param {*} val The value to test+ *+ * @returns {boolean} True if value is a Blob, otherwise false+ */+const isBlob = kindOfTest('Blob');++/**+ * Determine if a value is a FileList+ *+ * @param {*} val The value to test+ *+ * @returns {boolean} True if value is a FileList, otherwise false+ */+const isFileList = kindOfTest('FileList');++/**+ * Determine if a value is a Stream+ *+ * @param {*} val The value to test
… 4486 more lines (truncated)
dist/esm/axios.js +4011 lines · 3 flagged
--- +++ @@ -1,3 +1,10 @@-// axios v0.32.0 Copyright (c) 2026 Matt Zabriskie-var bind = function bind(fn, thisArg) {+/*! Axios v1.16.1 Copyright (c) 2026 Matt Zabriskie and contributors */+/**+ * Create a bound version of a function with a specified `this` context+ *+ * @param {Function} fn - The function to bind+ * @param {*} thisArg - The value to be passed as the `this` parameter+ * @returns {Function} A new function that will call the original function with the specified `this` context+ */+function bind(fn, thisArg) {   return function wrap() {@@ -5,3 +12,3 @@   };-};+} @@ -9,29 +16,26 @@ -var toString = Object.prototype.toString;--// eslint-disable-next-line func-names-var kindOf = (function(cache) {-  // eslint-disable-next-line func-names-  return function(thing) {-    var str = toString.call(thing);-    return cache[str] || (cache[str] = str.slice(8, -1).toLowerCase());-  };+const { toString } = Object.prototype;+const { getPrototypeOf } = Object;+const { iterator, toStringTag } = Symbol;++const kindOf = ((cache) => (thing) => {+  const str = toString.call(thing);+  return cache[str] || (cache[str] = str.slice(8, -1).toLowerCase()); })(Object.create(null)); -function kindOfTest(type) {+const kindOfTest = (type) => {   type = type.toLowerCase();-  return function isKindOf(thing) {-    return kindOf(thing) === type;-  };-}--/**- * Determine if a value is an Array+  return (thing) => kindOf(thing) === type;+};++const typeOfTest = (type) => (thing) => typeof thing === type;++/**+ * Determine if a value is a non-null object  *  * @param {Object} val The value to test+ *  * @returns {boolean} True if value is an Array, otherwise false  */-function isArray(val) {-  return Array.isArray(val);-}+const { isArray } = Array; @@ -40,8 +44,7 @@  *- * @param {Object} val The value to test+ * @param {*} val The value to test+ *  * @returns {boolean} True if the value is undefined, otherwise false  */-function isUndefined(val) {-  return typeof val === 'undefined';-}+const isUndefined = typeOfTest('undefined'); @@ -50,3 +53,4 @@  *- * @param {Object} val The value to test+ * @param {*} val The value to test+ *  * @returns {boolean} True if value is a Buffer, otherwise false@@ -59,3 +63,3 @@     !isUndefined(val.constructor) &&-    typeof val.constructor.isBuffer === 'function' &&+    isFunction$1(val.constructor.isBuffer) &&     val.constructor.isBuffer(val)@@ -67,7 +71,7 @@  *- * @function- * @param {Object} val The value to test+ * @param {*} val The value to test+ *  * @returns {boolean} True if value is an ArrayBuffer, otherwise false  */-var isArrayBuffer = kindOfTest('ArrayBuffer');+const isArrayBuffer = kindOfTest('ArrayBuffer'); @@ -76,3 +80,4 @@  *- * @param {Object} val The value to test+ * @param {*} val The value to test+ *  * @returns {boolean} True if value is a view on an ArrayBuffer, otherwise false@@ -80,3 +85,3 @@ function isArrayBufferView(val) {-  var result;+  let result;   if (typeof ArrayBuffer !== 'undefined' && ArrayBuffer.isView) {@@ -92,8 +97,15 @@  *- * @param {Object} val The value to test+ * @param {*} val The value to test+ *  * @returns {boolean} True if value is a String, otherwise false  */-function isString(val) {-  return typeof val === 'string';-}+const isString = typeOfTest('string');++/**+ * Determine if a value is a Function+ *+ * @param {*} val The value to test+ * @returns {boolean} True if value is a Function, otherwise false+ */+const isFunction$1 = typeOfTest('function'); @@ -102,8 +114,7 @@  *- * @param {Object} val The value to test+ * @param {*} val The value to test+ *  * @returns {boolean} True if value is a Number, otherwise false  */-function isNumber(val) {-  return typeof val === 'number';-}+const isNumber = typeOfTest('number'); @@ -112,8 +123,15 @@  *- * @param {Object} val The value to test+ * @param {*} thing The value to test+ *  * @returns {boolean} True if value is an Object, otherwise false  */-function isObject(val) {-  return val !== null && typeof val === 'object';-}+const isObject = (thing) => thing !== null && typeof thing === 'object';++/**+ * Determine if a value is a Boolean+ *+ * @param {*} thing The value to test+ * @returns {boolean} True if value is a Boolean, otherwise false+ */+const isBoolean = (thing) => thing === true || thing === false; @@ -122,6 +140,7 @@  *- * @param {Object} val The value to test- * @return {boolean} True if value is a plain Object, otherwise false- */-function isPlainObject(val) {+ * @param {*} val The value to test+ *+ * @returns {boolean} True if value is a plain Object, otherwise false+ */+const isPlainObject = (val) => {   if (kindOf(val) !== 'object') {@@ -130,23 +149,32 @@ -  var prototype = Object.getPrototypeOf(val);-  return prototype === null || prototype === Object.prototype;-}--/**- * Determine if a value is a empty Object- *- * @param {Object} val The value to test- * @return {boolean} True if value is a empty Object, otherwise false- */-function isEmptyObject(val) {-  if (!isPlainObject(val)) {+  const prototype = getPrototypeOf(val);+  return (+    (prototype === null ||+      prototype === Object.prototype ||+      Object.getPrototypeOf(prototype) === null) &&+    !(toStringTag in val) &&+    !(iterator in val)+  );+};++/**+ * Determine if a value is an empty object (safely handles Buffers)+ *+ * @param {*} val The value to test+ *+ * @returns {boolean} True if value is an empty object, otherwise false+ */+const isEmptyObject = (val) => {+  // Early return for non-objects or Buffers to prevent RangeError+  if (!isObject(val) || isBuffer(val)) {     return false;   }-  for (var key in val) {-    if (Object.prototype.hasOwnProperty.call(val, key)) {-      return false;-    }-  }-  return true;-}++  try {+    return Object.keys(val).length === 0 && Object.getPrototypeOf(val) === Object.prototype;+  } catch (e) {+    // Fallback for any other objects that might cause RangeError with Object.keys()+    return false;+  }+}; @@ -155,7 +183,7 @@  *- * @function- * @param {Object} val The value to test+ * @param {*} val The value to test+ *  * @returns {boolean} True if value is a Date, otherwise false  */-var isDate = kindOfTest('Date');+const isDate = kindOfTest('Date'); @@ -164,7 +192,32 @@  *- * @function- * @param {Object} val The value to test+ * @param {*} val The value to test+ *  * @returns {boolean} True if value is a File, otherwise false  */-var isFile = kindOfTest('File');+const isFile = kindOfTest('File');+
… 6160 more lines (truncated)
dist/node/axios.cjs +5469 lines · 11 flagged
--- +++ @@ -0,0 +1,5469 @@+/*! Axios v1.16.1 Copyright (c) 2026 Matt Zabriskie and contributors */+'use strict';++var FormData$1 = require('form-data');+var crypto = require('crypto');+var url = require('url');+var HttpsProxyAgent = require('https-proxy-agent');+var http = require('http');+var https = require('https');+var http2 = require('http2');+var util = require('util');+var path = require('path');+var followRedirects = require('follow-redirects');+var zlib = require('zlib');+var stream = require('stream');+var events = require('events');++/**+ * Create a bound version of a function with a specified `this` context+ *+ * @param {Function} fn - The function to bind+ * @param {*} thisArg - The value to be passed as the `this` parameter+ * @returns {Function} A new function that will call the original function with the specified `this` context+ */+function bind(fn, thisArg) {+  return function wrap() {+    return fn.apply(thisArg, arguments);+  };+}++// utils is a library of generic helper functions non-specific to axios++const {+  toString+} = Object.prototype;+const {+  getPrototypeOf+} = Object;+const {+  iterator,+  toStringTag+} = Symbol;+const kindOf = (cache => thing => {+  const str = toString.call(thing);+  return cache[str] || (cache[str] = str.slice(8, -1).toLowerCase());+})(Object.create(null));+const kindOfTest = type => {+  type = type.toLowerCase();+  return thing => kindOf(thing) === type;+};+const typeOfTest = type => thing => typeof thing === type;++/**+ * Determine if a value is a non-null object+ *+ * @param {Object} val The value to test+ *+ * @returns {boolean} True if value is an Array, otherwise false+ */+const {+  isArray+} = Array;++/**+ * Determine if a value is undefined+ *+ * @param {*} val The value to test+ *+ * @returns {boolean} True if the value is undefined, otherwise false+ */+const isUndefined = typeOfTest('undefined');++/**+ * Determine if a value is a Buffer+ *+ * @param {*} val The value to test+ *+ * @returns {boolean} True if value is a Buffer, otherwise false+ */+function isBuffer(val) {+  return val !== null && !isUndefined(val) && val.constructor !== null && !isUndefined(val.constructor) && isFunction$1(val.constructor.isBuffer) && val.constructor.isBuffer(val);+}++/**+ * Determine if a value is an ArrayBuffer+ *+ * @param {*} val The value to test+ *+ * @returns {boolean} True if value is an ArrayBuffer, otherwise false+ */+const isArrayBuffer = kindOfTest('ArrayBuffer');++/**+ * Determine if a value is a view on an ArrayBuffer+ *+ * @param {*} val The value to test+ *+ * @returns {boolean} True if value is a view on an ArrayBuffer, otherwise false+ */+function isArrayBufferView(val) {+  let result;+  if (typeof ArrayBuffer !== 'undefined' && ArrayBuffer.isView) {+    result = ArrayBuffer.isView(val);+  } else {+    result = val && val.buffer && isArrayBuffer(val.buffer);+  }+  return result;+}++/**+ * Determine if a value is a String+ *+ * @param {*} val The value to test+ *+ * @returns {boolean} True if value is a String, otherwise false+ */+const isString = typeOfTest('string');++/**+ * Determine if a value is a Function+ *+ * @param {*} val The value to test+ * @returns {boolean} True if value is a Function, otherwise false+ */+const isFunction$1 = typeOfTest('function');++/**+ * Determine if a value is a Number+ *+ * @param {*} val The value to test+ *+ * @returns {boolean} True if value is a Number, otherwise false+ */+const isNumber = typeOfTest('number');++/**+ * Determine if a value is an Object+ *+ * @param {*} thing The value to test+ *+ * @returns {boolean} True if value is an Object, otherwise false+ */+const isObject = thing => thing !== null && typeof thing === 'object';++/**+ * Determine if a value is a Boolean+ *+ * @param {*} thing The value to test+ * @returns {boolean} True if value is a Boolean, otherwise false+ */+const isBoolean = thing => thing === true || thing === false;++/**+ * Determine if a value is a plain Object+ *+ * @param {*} val The value to test+ *+ * @returns {boolean} True if value is a plain Object, otherwise false+ */+const isPlainObject = val => {+  if (kindOf(val) !== 'object') {+    return false;+  }+  const prototype = getPrototypeOf(val);+  return (prototype === null || prototype === Object.prototype || Object.getPrototypeOf(prototype) === null) && !(toStringTag in val) && !(iterator in val);+};++/**+ * Determine if a value is an empty object (safely handles Buffers)+ *+ * @param {*} val The value to test+ *+ * @returns {boolean} True if value is an empty object, otherwise false+ */+const isEmptyObject = val => {+  // Early return for non-objects or Buffers to prevent RangeError+  if (!isObject(val) || isBuffer(val)) {+    return false;+  }+  try {+    return Object.keys(val).length === 0 && Object.getPrototypeOf(val) === Object.prototype;+  } catch (e) {+    // Fallback for any other objects that might cause RangeError with Object.keys()+    return false;+  }+};++/**+ * Determine if a value is a Date+ *+ * @param {*} val The value to test+ *+ * @returns {boolean} True if value is a Date, otherwise false+ */+const isDate = kindOfTest('Date');++/**+ * Determine if a value is a File+ *+ * @param {*} val The value to test+ *+ * @returns {boolean} True if value is a File, otherwise false+ */+const isFile = kindOfTest('File');++/**+ * Determine if a value is a React Native Blob+ * React Native "blob": an object with a `uri` attribute. Optionally, it can+ * also have a `name` and `type` attribute to specify filename and content type+ *+ * @see https://github.com/facebook/react-native/blob/26684cf3adf4094eb6c405d345a75bf8c7c0bf88/Libraries/Network/FormData.js#L68-L71+ *+ * @param {*} value The value to test+ *+ * @returns {boolean} True if value is a React Native Blob, otherwise false+ */+const isReactNativeBlob = value => {+  return !!(value && typeof value.uri !== 'undefined');+};++/**+ * Determine if environment is React Native+ * ReactNative `FormData` has a non-standard `getParts()` method+ *+ * @param {*} formData The formData to test+ *+ * @returns {boolean} True if environment is React Native, otherwise false+ */+const isReactNative = formData => formData && typeof formData.getParts !== 'undefined';++/**+ * Determine if a value is a Blob+ *+ * @param {*} val The value to test+ *+ * @returns {boolean} True if value is a Blob, otherwise false+ */+const isBlob = kindOfTest('Blob');++/**+ * Determine if a value is a FileList+ *+ * @param {*} val The value to test+ *+ * @returns {boolean} True if value is a FileList, otherwise false+ */+const isFileList = kindOfTest('FileList');
… 5222 more lines (truncated)
lib/adapters/http.js +1249 lines · 2 flagged
--- +++ @@ -1,28 +1,112 @@-'use strict';--var utils = require('./../utils');-var settle = require('./../core/settle');-var buildFullPath = require('../core/buildFullPath');-var buildURL = require('./../helpers/buildURL');-var getProxyForUrl = require('proxy-from-env').getProxyForUrl;-var http = require('http');-var https = require('https');-var httpFollow = require('follow-redirects/http');-var httpsFollow = require('follow-redirects/https');-var url = require('url');-var path = require('path');-var zlib = require('zlib');-var VERSION = require('./../env/data').version;-var transitionalDefaults = require('../defaults/transitional');-var AxiosError = require('../core/AxiosError');-var CanceledError = require('../cancel/CanceledError');-var platform = require('../platform');-var fromDataURI = require('../helpers/fromDataURI');-var stream = require('stream');-var estimateDataURLDecodedBytes = require('../helpers/estimateDataURLDecodedBytes.js');-var shouldBypassProxy = require('../helpers/shouldBypassProxy');--var isHttps = /https:?/;--var supportedProtocols = platform.protocols.map(function(protocol) {+import utils from '../utils.js';+import settle from '../core/settle.js';+import buildFullPath from '../core/buildFullPath.js';+import buildURL from '../helpers/buildURL.js';+import { getProxyForUrl } from 'proxy-from-env';+import HttpsProxyAgent from 'https-proxy-agent';+import http from 'http';+import https from 'https';+import http2 from 'http2';+import util from 'util';+import { resolve as resolvePath } from 'path';+import followRedirects from 'follow-redirects';+import zlib from 'zlib';+import { VERSION } from '../env/data.js';+import transitionalDefaults from '../defaults/transitional.js';+import AxiosError from '../core/AxiosError.js';+import CanceledError from '../cancel/CanceledError.js';+import platform from '../platform/index.js';+import fromDataURI from '../helpers/fromDataURI.js';+import stream from 'stream';+import AxiosHeaders from '../core/AxiosHeaders.js';+import AxiosTransformStream from '../helpers/AxiosTransformStream.js';+import { EventEmitter } from 'events';+import formDataToStream from '../helpers/formDataToStream.js';+import readBlob from '../helpers/readBlob.js';+import ZlibHeaderTransformStream from '../helpers/ZlibHeaderTransformStream.js';+import callbackify from '../helpers/callbackify.js';+import shouldBypassProxy from '../helpers/shouldBypassProxy.js';+import { toByteStringHeaderObject } from '../helpers/sanitizeHeaderValue.js';+import {+  progressEventReducer,+  progressEventDecorator,+  asyncDecorator,+} from '../helpers/progressEventReducer.js';+import estimateDataURLDecodedBytes from '../helpers/estimateDataURLDecodedBytes.js';++const zlibOptions = {+  flush: zlib.constants.Z_SYNC_FLUSH,+  finishFlush: zlib.constants.Z_SYNC_FLUSH,+};++const brotliOptions = {+  flush: zlib.constants.BROTLI_OPERATION_FLUSH,+  finishFlush: zlib.constants.BROTLI_OPERATION_FLUSH,+};++const isBrotliSupported = utils.isFunction(zlib.createBrotliDecompress);++const { http: httpFollow, https: httpsFollow } = followRedirects;++const isHttps = /https:?/;+const FORM_DATA_CONTENT_HEADERS = ['content-type', 'content-length'];++function setFormDataHeaders(headers, formHeaders, policy) {+  if (policy !== 'content-only') {+    headers.set(formHeaders);+    return;+  }++  Object.entries(formHeaders).forEach(([key, val]) => {+    if (FORM_DATA_CONTENT_HEADERS.includes(key.toLowerCase())) {+      headers.set(key, val);+    }+  });+}++// Symbols used to bind a single 'error' listener to a pooled socket and track+// the request currently owning that socket across keep-alive reuse (issue #10780).+const kAxiosSocketListener = Symbol('axios.http.socketListener');+const kAxiosCurrentReq = Symbol('axios.http.currentReq');++// Tags HttpsProxyAgent instances installed by setProxy() so the redirect path+// can strip them without clobbering a user-supplied agent that happens to be+// an HttpsProxyAgent.+const kAxiosInstalledTunnel = Symbol('axios.http.installedTunnel');++// Cache of CONNECT-tunneling agents keyed by proxy config so repeat requests+// through the same proxy reuse a single agent (and its socket pool). The+// keyspace is bounded by the set of distinct proxy configs the process uses,+// so unbounded growth is not a concern in practice.+const tunnelingAgentCache = new Map();+const tunnelingAgentCacheUser = new WeakMap();++function getTunnelingAgent(agentOptions, userHttpsAgent) {+  const key =+    agentOptions.protocol ++    '//' ++    agentOptions.hostname ++    ':' ++    (agentOptions.port || '') ++    '#' ++    (agentOptions.auth || '');+  const cache = userHttpsAgent+    ? (tunnelingAgentCacheUser.get(userHttpsAgent) ||+        tunnelingAgentCacheUser.set(userHttpsAgent, new Map()).get(userHttpsAgent))+    : tunnelingAgentCache;+  let agent = cache.get(key);+  if (agent) return agent;+  // Forward the user's TLS options (custom CA, rejectUnauthorized, client cert,+  // etc.) into the tunneling agent so they apply to the origin TLS upgrade+  // performed after CONNECT. Our proxy fields take precedence on conflict.+  const merged = userHttpsAgent && userHttpsAgent.options+    ? { ...userHttpsAgent.options, ...agentOptions }+    : agentOptions;+  agent = new HttpsProxyAgent(merged);+  agent[kAxiosInstalledTunnel] = true;+  cache.set(key, agent);+  return agent;+}++const supportedProtocols = platform.protocols.map((protocol) => {   return protocol + ':';@@ -30,3 +114,138 @@ -function dispatchBeforeRedirect(options) {+// Node's WHATWG URL parser returns `username` and `password` percent-encoded.+// Decode before composing the `auth` option so credentials such as+// `my%40email.com:pass` are sent as `[email protected]:pass`. Falls back to the+// original value for malformed input so a bad encoding never throws.+const decodeURIComponentSafe = (value) => {+  if (!utils.isString(value)) {+    return value;+  }++  try {+    return decodeURIComponent(value);+  } catch (error) {+    return value;+  }+};++const flushOnFinish = (stream, [throttled, flush]) => {+  stream.on('end', flush).on('error', flush);++  return throttled;+};++class Http2Sessions {+  constructor() {+    this.sessions = Object.create(null);+  }++  getSession(authority, options) {+    options = Object.assign(+      {+        sessionTimeout: 1000,+      },+      options+    );++    let authoritySessions = this.sessions[authority];++    if (authoritySessions) {+      let len = authoritySessions.length;++      for (let i = 0; i < len; i++) {+        const [sessionHandle, sessionOptions] = authoritySessions[i];+        if (+          !sessionHandle.destroyed &&+          !sessionHandle.closed &&+          util.isDeepStrictEqual(sessionOptions, options)+        ) {+          return sessionHandle;+        }+      }+    }++    const session = http2.connect(authority, options);++    let removed;++    const removeSession = () => {+      if (removed) {+        return;+      }++      removed = true;++      let entries = authoritySessions,+        len = entries.length,+        i = len;++      while (i--) {+        if (entries[i][0] === session) {+          if (len === 1) {+            delete this.sessions[authority];+          } else {+            entries.splice(i, 1);+          }+          if (!session.closed) {+            session.close();+          }+          return;+        }+      }+    };++    const originalRequestFn = session.request;++    const { sessionTimeout } = options;++    if (sessionTimeout != null) {+      let timer;+      let streamsCount = 0;++      session.request = function () {+        const stream = originalRequestFn.apply(this, arguments);++        streamsCount++;++        if (timer) {+          clearTimeout(timer);+          timer = null;+        }++        stream.once('close', () => {+          if (!--streamsCount) {+            timer = setTimeout(() => {+              timer = null;+              removeSession();
… 1764 more lines (truncated)
lib/core/AxiosHeaders.js +348 lines · 2 flagged
--- +++ @@ -0,0 +1,348 @@+'use strict';++import utils from '../utils.js';+import parseHeaders from '../helpers/parseHeaders.js';+import { sanitizeHeaderValue } from '../helpers/sanitizeHeaderValue.js';++const $internals = Symbol('internals');++function normalizeHeader(header) {+  return header && String(header).trim().toLowerCase();+}++function normalizeValue(value) {+  if (value === false || value == null) {+    return value;+  }++  return utils.isArray(value) ? value.map(normalizeValue) : sanitizeHeaderValue(String(value));+}++function parseTokens(str) {+  const tokens = Object.create(null);+  const tokensRE = /([^\s,;=]+)\s*(?:=\s*([^,;]+))?/g;+  let match;++  while ((match = tokensRE.exec(str))) {+    tokens[match[1]] = match[2];+  }++  return tokens;+}++const isValidHeaderName = (str) => /^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(str.trim());++function matchHeaderValue(context, value, header, filter, isHeaderNameFilter) {+  if (utils.isFunction(filter)) {+    return filter.call(this, value, header);+  }++  if (isHeaderNameFilter) {+    value = header;+  }++  if (!utils.isString(value)) return;++  if (utils.isString(filter)) {+    return value.indexOf(filter) !== -1;+  }++  if (utils.isRegExp(filter)) {+    return filter.test(value);+  }+}++function formatHeader(header) {+  return header+    .trim()+    .toLowerCase()+    .replace(/([a-z\d])(\w*)/g, (w, char, str) => {+      return char.toUpperCase() + str;+    });+}++function buildAccessors(obj, header) {+  const accessorName = utils.toCamelCase(' ' + header);++  ['get', 'set', 'has'].forEach((methodName) => {+    Object.defineProperty(obj, methodName + accessorName, {+      // Null-proto descriptor so a polluted Object.prototype.get cannot turn+      // this data descriptor into an accessor descriptor on the way in.+      __proto__: null,+      value: function (arg1, arg2, arg3) {+        return this[methodName].call(this, header, arg1, arg2, arg3);+      },+      configurable: true,+    });+  });+}++class AxiosHeaders {+  constructor(headers) {+    headers && this.set(headers);+  }++  set(header, valueOrRewrite, rewrite) {+    const self = this;++    function setHeader(_value, _header, _rewrite) {+      const lHeader = normalizeHeader(_header);++      if (!lHeader) {+        throw new Error('header name must be a non-empty string');+      }++      const key = utils.findKey(self, lHeader);++      if (+        !key ||+        self[key] === undefined ||+        _rewrite === true ||+        (_rewrite === undefined && self[key] !== false)+      ) {+        self[key || _header] = normalizeValue(_value);+      }+    }++    const setHeaders = (headers, _rewrite) =>+      utils.forEach(headers, (_value, _header) => setHeader(_value, _header, _rewrite));++    if (utils.isPlainObject(header) || header instanceof this.constructor) {+      setHeaders(header, valueOrRewrite);+    } else if (utils.isString(header) && (header = header.trim()) && !isValidHeaderName(header)) {+      setHeaders(parseHeaders(header), valueOrRewrite);+    } else if (utils.isObject(header) && utils.isIterable(header)) {+      let obj = {},+        dest,+        key;+      for (const entry of header) {+        if (!utils.isArray(entry)) {+          throw TypeError('Object iterator must return a key-value pair');+        }++        obj[(key = entry[0])] = (dest = obj[key])+          ? utils.isArray(dest)+            ? [...dest, entry[1]]+            : [dest, entry[1]]+          : entry[1];+      }++      setHeaders(obj, valueOrRewrite);+    } else {+      header != null && setHeader(valueOrRewrite, header, rewrite);+    }++    return this;+  }++  get(header, parser) {+    header = normalizeHeader(header);++    if (header) {+      const key = utils.findKey(this, header);++      if (key) {+        const value = this[key];++        if (!parser) {+          return value;+        }++        if (parser === true) {+          return parseTokens(value);+        }++        if (utils.isFunction(parser)) {+          return parser.call(this, value, key);+        }++        if (utils.isRegExp(parser)) {+          return parser.exec(value);+        }++        throw new TypeError('parser must be boolean|regexp|function');+      }+    }+  }++  has(header, matcher) {+    header = normalizeHeader(header);++    if (header) {+      const key = utils.findKey(this, header);++      return !!(+        key &&+        this[key] !== undefined &&+        (!matcher || matchHeaderValue(this, this[key], key, matcher))+      );+    }++    return false;+  }++  delete(header, matcher) {+    const self = this;+    let deleted = false;++    function deleteHeader(_header) {+      _header = normalizeHeader(_header);++      if (_header) {+        const key = utils.findKey(self, _header);++        if (key && (!matcher || matchHeaderValue(self, self[key], key, matcher))) {+          delete self[key];++          deleted = true;+        }+      }+    }++    if (utils.isArray(header)) {+      header.forEach(deleteHeader);+    } else {+      deleteHeader(header);+    }++    return deleted;+  }++  clear(matcher) {+    const keys = Object.keys(this);+    let i = keys.length;+    let deleted = false;++    while (i--) {+      const key = keys[i];+      if (!matcher || matchHeaderValue(this, this[key], key, matcher, true)) {+        delete this[key];+        deleted = true;+      }+    }++    return deleted;+  }++  normalize(format) {+    const self = this;+    const headers = {};++    utils.forEach(this, (value, header) => {+      const key = utils.findKey(headers, header);++      if (key) {+        self[key] = normalizeValue(value);+        delete self[header];+        return;+      }++      const normalized = format ? formatHeader(header) : String(header).trim();++      if (normalized !== header) {+        delete self[header];+      }++      self[normalized] = normalizeValue(value);+
… 101 more lines (truncated)
lib/helpers/fromDataURI.js +29 lines · 1 flagged
--- +++ @@ -2,7 +2,9 @@ -var AxiosError = require('../core/AxiosError');-var parseProtocol = require('./parseProtocol');-var platform = require('../platform');+import AxiosError from '../core/AxiosError.js';+import parseProtocol from './parseProtocol.js';+import platform from '../platform/index.js'; -var DATA_URL_PATTERN = /^(?:([^;]+);)?(?:[^;]+;)?(base64|),([\s\S]*)$/;+// RFC 2397: data:[<mediatype>][;base64],<data>+// mediatype = type/subtype followed by optional ;name=value parameters+const DATA_URL_PATTERN = /^([^,;]+\/[^,;]+)?((?:;[^,;=]+=[^,;]+)*)(;base64)?,([\s\S]*)$/; @@ -10,2 +12,3 @@  * Parse data uri to a Buffer or Blob+ *  * @param {String} uri@@ -14,7 +17,8 @@  * @param {?Function} options.Blob+ *  * @returns {Buffer|Blob}  */-module.exports = function fromDataURI(uri, asBlob, options) {-  var _Blob = options && options.Blob || platform.classes.Blob;-  var protocol = parseProtocol(uri);+export default function fromDataURI(uri, asBlob, options) {+  const _Blob = (options && options.Blob) || platform.classes.Blob;+  const protocol = parseProtocol(uri); @@ -27,3 +31,3 @@ -    var match = DATA_URL_PATTERN.exec(uri);+    const match = DATA_URL_PATTERN.exec(uri); @@ -33,6 +37,17 @@ -    var mime = match[1];-    var isBase64 = match[2];-    var body = match[3];-    var buffer = Buffer.from(decodeURIComponent(body), isBase64 ? 'base64' : 'utf8');+    const type = match[1];+    const params = match[2];+    const encoding = match[3] ? 'base64' : 'utf8';+    const body = match[4];++    // RFC 2397 section 3: default mediatype is text/plain;charset=US-ASCII+    // Bare `data:,` leaves mime undefined; Blob normalises that to "" per spec.+    let mime;+    if (type) {+      mime = params ? type + params : type;+    } else if (params) {+      mime = 'text/plain' + params;+    }++    const buffer = Buffer.from(decodeURIComponent(body), encoding); @@ -43,3 +58,3 @@ -      return new _Blob([buffer], {type: mime});+      return new _Blob([buffer], { type: mime });     }@@ -50,2 +65,2 @@   throw new AxiosError('Unsupported protocol ' + protocol, AxiosError.ERR_NOT_SUPPORT);-};+}
lib/helpers/parseProtocol.js +4 lines · 1 flagged
--- +++ @@ -2,5 +2,5 @@ -module.exports = function parseProtocol(url) {-  var match = /^([-+\w]{1,25})(:?\/\/|:)/.exec(url);-  return match && match[1] || '';-};+export default function parseProtocol(url) {+  const match = /^([-+\w]{1,25}):(?:\/\/)?/.exec(url);+  return (match && match[1]) || '';+}
lib/helpers/shouldBypassProxy.js +103 lines · 1 flagged
--- +++ @@ -1,6 +1,49 @@-'use strict';+const LOOPBACK_HOSTNAMES = new Set(['localhost']); -var URL = require('url').URL;+const isIPv4Loopback = (host) => {+  const parts = host.split('.');+  if (parts.length !== 4) return false;+  if (parts[0] !== '127') return false;+  return parts.every((p) => /^\d+$/.test(p) && Number(p) >= 0 && Number(p) <= 255);+}; -var DEFAULT_PORTS = {+const isIPv6Loopback = (host) => {+  // Collapse all-zero groups: any form of ::1 / 0:0:...:0:1+  // First, strip any leading "::" by normalising with Set lookup of common forms,+  // then fall back to structural check.+  if (host === '::1') return true;++  // Check IPv4-mapped IPv6 loopback: ::ffff:<v4-loopback> or ::ffff:<hex-v4-loopback>+  // Node's URL parser normalises ::ffff:127.0.0.1 → ::ffff:7f00:1+  const v4MappedDotted = host.match(/^::ffff:(\d+\.\d+\.\d+\.\d+)$/i);+  if (v4MappedDotted) return isIPv4Loopback(v4MappedDotted[1]);++  const v4MappedHex = host.match(/^::ffff:([0-9a-f]{1,4}):([0-9a-f]{1,4})$/i);+  if (v4MappedHex) {+    const high = parseInt(v4MappedHex[1], 16);+    // High 16 bits must start with 127 (0x7f) — i.e. 0x7f00..0x7fff+    return high >= 0x7f00 && high <= 0x7fff;+  }++  // Full-form ::1 variants: any number of zero groups followed by trailing 1+  // e.g. 0:0:0:0:0:0:0:1, 0000:...:0001+  const groups = host.split(':');+  if (groups.length === 8) {+    for (let i = 0; i < 7; i++) {+      if (!/^0+$/.test(groups[i])) return false;+    }+    return /^0*1$/.test(groups[7]);+  }++  return false;+};++const isLoopback = (host) => {+  if (!host) return false;+  if (LOOPBACK_HOSTNAMES.has(host)) return true;+  if (isIPv4Loopback(host)) return true;+  return isIPv6Loopback(host);+};++const DEFAULT_PORTS = {   http: 80,@@ -9,18 +52,18 @@   wss: 443,-  ftp: 21+  ftp: 21, }; -function parseNoProxyEntry(entry) {-  var entryHost = entry;-  var entryPort = 0;+const parseNoProxyEntry = (entry) => {+  let entryHost = entry;+  let entryPort = 0;    if (entryHost.charAt(0) === '[') {-    var bracketIndex = entryHost.indexOf(']');+    const bracketIndex = entryHost.indexOf(']');      if (bracketIndex !== -1) {-      var host = entryHost.slice(1, bracketIndex);-      var rest = entryHost.slice(bracketIndex + 1);+      const host = entryHost.slice(1, bracketIndex);+      const rest = entryHost.slice(bracketIndex + 1);        if (rest.charAt(0) === ':' && /^\d+$/.test(rest.slice(1))) {-        entryPort = parseInt(rest.slice(1), 10);+        entryPort = Number.parseInt(rest.slice(1), 10);       }@@ -31,7 +74,11 @@ -  var firstColon = entryHost.indexOf(':');-  var lastColon = entryHost.lastIndexOf(':');+  const firstColon = entryHost.indexOf(':');+  const lastColon = entryHost.lastIndexOf(':'); -  if (firstColon !== -1 && firstColon === lastColon && /^\d+$/.test(entryHost.slice(lastColon + 1))) {-    entryPort = parseInt(entryHost.slice(lastColon + 1), 10);+  if (+    firstColon !== -1 &&+    firstColon === lastColon &&+    /^\d+$/.test(entryHost.slice(lastColon + 1))+  ) {+    entryPort = Number.parseInt(entryHost.slice(lastColon + 1), 10);     entryHost = entryHost.slice(0, lastColon);@@ -40,57 +87,30 @@   return [entryHost, entryPort];-}+}; -function parseIPv4Octets(hostname) {-  var octets = hostname.split('.');+// Convert IPv4-mapped IPv6 (::ffff:0:0/96 prefix) to IPv4 dotted form so both+// sides of a NO_PROXY comparison see the same canonical address. Without this,+// `NO_PROXY=192.168.1.5` would not match a request to `http://[::ffff:192.168.1.5]/`+// (Node's URL parser normalises that to `[::ffff:c0a8:105]`), and vice-versa,+// allowing the proxy-bypass policy to be circumvented by using the alternate+// representation. Returns the input unchanged when not IPv4-mapped.+const IPV4_MAPPED_DOTTED_RE = /^(?:::|(?:0{1,4}:){1,4}:|(?:0{1,4}:){5})ffff:(\d+\.\d+\.\d+\.\d+)$/i;+const IPV4_MAPPED_HEX_RE = /^(?:::|(?:0{1,4}:){1,4}:|(?:0{1,4}:){5})ffff:([0-9a-f]{1,4}):([0-9a-f]{1,4})$/i; -  if (octets.length !== 4) {-    return null;+const unmapIPv4MappedIPv6 = (host) => {+  if (typeof host !== 'string' || host.indexOf(':') === -1) return host;++  const dotted = host.match(IPV4_MAPPED_DOTTED_RE);+  if (dotted) return dotted[1];++  const hex = host.match(IPV4_MAPPED_HEX_RE);+  if (hex) {+    const high = parseInt(hex[1], 16);+    const low = parseInt(hex[2], 16);+    return `${high >> 8}.${high & 0xff}.${low >> 8}.${low & 0xff}`;   } -  for (var i = 0; i < octets.length; i++) {-    if (!/^\d+$/.test(octets[i]) || Number(octets[i]) > 255) {-      return null;-    }-  }+  return host;+}; -  return octets;-}--// Recognises the canonical IPv4-mapped IPv6 forms the Node URL parser produces:-//   ::ffff:127.0.0.1   (dotted-quad tail)-//   ::ffff:7f00:1      (compressed two-group hex tail)-// Fully-expanded forms like 0:0:0:0:0:ffff:7f00:1 or single-group tails like-// ::ffff:1 are not normalised here. URL inputs are canonicalised by the parser-// before reaching this helper, but hand-crafted no_proxy entries in those-// shapes will not match an IPv4 listing.-function normalizeIPv4MappedIPv6(hostname) {-  // Match against the lowercased form so a hand-crafted no_proxy entry like-  // `[::FFFF:7F00:1]` still resolves to its IPv4 alias. Callers that route via-  // URL parsing already lowercase, but the helper stays robust on its own.-  var lower = hostname.toLowerCase();-  var dottedMatch = /^::ffff:(\d+\.\d+\.\d+\.\d+)$/.exec(lower);--  if (dottedMatch) {-    var octets = parseIPv4Octets(dottedMatch[1]);-    return octets ? octets.join('.') : hostname;-  }--  var hexMatch = /^::ffff:([0-9a-f]{1,4}):([0-9a-f]{1,4})$/.exec(lower);--  if (hexMatch) {-    var high = parseInt(hexMatch[1], 16);-    var low = parseInt(hexMatch[2], 16);--    return [-      (high >> 8) & 0xff,-      high & 0xff,-      (low >> 8) & 0xff,-      low & 0xff-    ].join('.');-  }--  return hostname;-}--function normalizeNoProxyHost(hostname) {+const normalizeNoProxyHost = (hostname) => {   if (!hostname) {@@ -103,11 +123,11 @@ -  hostname = hostname.replace(/\.+$/, '');+  return unmapIPv4MappedIPv6(hostname.replace(/\.+$/, ''));+}; -  return normalizeIPv4MappedIPv6(hostname);-}+export default function shouldBypassProxy(location) {+  let parsed; -function isLoopbackIPv4(hostname) {-  var octets = hostname.split('.');--  if (octets.length !== 4) {+  try {+    parsed = new URL(location);+  } catch (_err) {     return false;@@ -115,25 +135,3 @@ -  if (octets[0] !== '127') {-    return false;-  }--  return octets.every(function testOctet(octet) {-    return /^\d+$/.test(octet) && Number(octet) >= 0 && Number(octet) <= 255;-  });-}--function isLoopbackHost(hostname) {-  return hostname === 'localhost' || hostname === '::1' || isLoopbackIPv4(hostname);-}--module.exports = function shouldBypassProxy(location) {-  var parsed;--  try {-    parsed = new URL(location);-  } catch (err) {-    return false;-  }--  var noProxy = (process.env.no_proxy || process.env.NO_PROXY || '').toLowerCase();+  const noProxy = (process.env.no_proxy || process.env.NO_PROXY || '').toLowerCase(); @@ -147,7 +145,8 @@ -  var protocol = parsed.protocol.split(':', 1)[0];-  var port = parsed.port !== '' ? parseInt(parsed.port, 10) : (DEFAULT_PORTS[protocol] || 0);-  var hostname = normalizeNoProxyHost(parsed.hostname.toLowerCase());+  const port =+    Number.parseInt(parsed.port, 10) || DEFAULT_PORTS[parsed.protocol.split(':', 1)[0]] || 0; -  return noProxy.split(/[\s,]+/).some(function testNoProxyEntry(entry) {+  const hostname = normalizeNoProxyHost(parsed.hostname.toLowerCase());++  return noProxy.split(/[\s,]+/).some((entry) => {     if (!entry) {@@ -156,9 +155,5 @@ -    var entryParts = parseNoProxyEntry(entry);-    var entryHost = normalizeNoProxyHost(entryParts[0]);-    var entryPort = entryParts[1];+    let [entryHost, entryPort] = parseNoProxyEntry(entry); -    if (entryHost === '*') {-      return true;-    }+    entryHost = normalizeNoProxyHost(entryHost); 
… 18 more lines (truncated)
index.d.ts +515 lines
--- +++ @@ -1,22 +1,143 @@-// TypeScript Version: 4.1-type HeaderValue = string | string[] | number | boolean;--type AxiosHeaders = Record<string, HeaderValue | Record<Method & CommonHeaders, HeaderValue>>;--type MethodsHeaders = {-  [Key in Method as Lowercase<Key>]: AxiosHeaders;+// TypeScript Version: 4.7+type StringLiteralsOrString<Literals extends string> = Literals | (string & {});++export type AxiosHeaderValue = AxiosHeaders | string | string[] | number | boolean | null;++export interface RawAxiosHeaders {+  [key: string]: AxiosHeaderValue;+}++type MethodsHeaders = Partial<+  {+    [Key in Method as Lowercase<Key>]: AxiosHeaders;+  } & { common: AxiosHeaders }+>;++type AxiosHeaderMatcher =+  | string+  | RegExp+  | ((this: AxiosHeaders, value: string, name: string) => boolean);++type AxiosHeaderParser = (this: AxiosHeaders, value: AxiosHeaderValue, header: string) => any;++export class AxiosHeaders {+  constructor(headers?: RawAxiosHeaders | AxiosHeaders | string);++  [key: string]: any;++  set(+    headerName?: string,+    value?: AxiosHeaderValue,+    rewrite?: boolean | AxiosHeaderMatcher+  ): AxiosHeaders;+  set(headers?: RawAxiosHeaders | AxiosHeaders | string, rewrite?: boolean): AxiosHeaders;++  get(headerName: string, parser: RegExp): RegExpExecArray | null;+  get(headerName: string, matcher?: true | AxiosHeaderParser): AxiosHeaderValue;++  has(header: string, matcher?: AxiosHeaderMatcher): boolean;++  delete(header: string | string[], matcher?: AxiosHeaderMatcher): boolean;++  clear(matcher?: AxiosHeaderMatcher): boolean;++  normalize(format: boolean): AxiosHeaders;++  concat(+    ...targets: Array<AxiosHeaders | RawAxiosHeaders | string | undefined | null>+  ): AxiosHeaders;++  toJSON(asStrings?: boolean): RawAxiosHeaders;++  static from(thing?: AxiosHeaders | RawAxiosHeaders | string): AxiosHeaders;++  static accessor(header: string | string[]): AxiosHeaders;++  static concat(+    ...targets: Array<AxiosHeaders | RawAxiosHeaders | string | undefined | null>+  ): AxiosHeaders;++  setContentType(value: ContentType, rewrite?: boolean | AxiosHeaderMatcher): AxiosHeaders;+  getContentType(parser?: RegExp): RegExpExecArray | null;+  getContentType(matcher?: AxiosHeaderMatcher): AxiosHeaderValue;+  hasContentType(matcher?: AxiosHeaderMatcher): boolean;++  setContentLength(value: AxiosHeaderValue, rewrite?: boolean | AxiosHeaderMatcher): AxiosHeaders;+  getContentLength(parser?: RegExp): RegExpExecArray | null;+  getContentLength(matcher?: AxiosHeaderMatcher): AxiosHeaderValue;+  hasContentLength(matcher?: AxiosHeaderMatcher): boolean;++  setAccept(value: AxiosHeaderValue, rewrite?: boolean | AxiosHeaderMatcher): AxiosHeaders;+  getAccept(parser?: RegExp): RegExpExecArray | null;+  getAccept(matcher?: AxiosHeaderMatcher): AxiosHeaderValue;+  hasAccept(matcher?: AxiosHeaderMatcher): boolean;++  setUserAgent(value: AxiosHeaderValue, rewrite?: boolean | AxiosHeaderMatcher): AxiosHeaders;+  getUserAgent(parser?: RegExp): RegExpExecArray | null;+  getUserAgent(matcher?: AxiosHeaderMatcher): AxiosHeaderValue;+  hasUserAgent(matcher?: AxiosHeaderMatcher): boolean;++  setContentEncoding(value: AxiosHeaderValue, rewrite?: boolean | AxiosHeaderMatcher): AxiosHeaders;+  getContentEncoding(parser?: RegExp): RegExpExecArray | null;+  getContentEncoding(matcher?: AxiosHeaderMatcher): AxiosHeaderValue;+  hasContentEncoding(matcher?: AxiosHeaderMatcher): boolean;++  setAuthorization(value: AxiosHeaderValue, rewrite?: boolean | AxiosHeaderMatcher): AxiosHeaders;+  getAuthorization(parser?: RegExp): RegExpExecArray | null;+  getAuthorization(matcher?: AxiosHeaderMatcher): AxiosHeaderValue;+  hasAuthorization(matcher?: AxiosHeaderMatcher): boolean;++  getSetCookie(): string[];++  [Symbol.iterator](): IterableIterator<[string, AxiosHeaderValue]>;+}++type CommonRequestHeadersList =+  | 'Accept'+  | 'Content-Length'+  | 'User-Agent'+  | 'Content-Encoding'+  | 'Authorization'+  | 'Location';++type ContentType =+  | AxiosHeaderValue+  | 'text/html'+  | 'text/plain'+  | 'multipart/form-data'+  | 'application/json'+  | 'application/x-www-form-urlencoded'+  | 'application/octet-stream';++export type RawAxiosRequestHeaders = Partial<+  RawAxiosHeaders & {+    [Key in CommonRequestHeadersList]: AxiosHeaderValue;+  } & {+    'Content-Type': ContentType;+  }+>;++export type AxiosRequestHeaders = RawAxiosRequestHeaders & AxiosHeaders;++type CommonResponseHeadersList =+  | 'Server'+  | 'Content-Type'+  | 'Content-Length'+  | 'Cache-Control'+  | 'Content-Encoding';++type CommonResponseHeaderKey = CommonResponseHeadersList | Lowercase<CommonResponseHeadersList>;++type RawCommonResponseHeaders = {+  [Key in CommonResponseHeaderKey]: AxiosHeaderValue;+} & {+  'set-cookie': string[]; }; -interface CommonHeaders  {-  common: AxiosHeaders;-}--export type AxiosRequestHeaders = Partial<AxiosHeaders & MethodsHeaders & CommonHeaders>;--export type AxiosResponseHeaders = Partial<Record<string, string>> & {-  "set-cookie"?: string[]-};+export type RawAxiosResponseHeaders = Partial<RawAxiosHeaders & RawCommonResponseHeaders>;++export type AxiosResponseHeaders = RawAxiosResponseHeaders & AxiosHeaders;  export interface AxiosRequestTransformer {-  (data: any, headers: AxiosRequestHeaders): any;+  (this: InternalAxiosRequestConfig, data: any, headers: AxiosRequestHeaders): any; }@@ -24,3 +145,8 @@ export interface AxiosResponseTransformer {-  (data: any, headers?: AxiosResponseHeaders, status?: number): any;+  (+    this: InternalAxiosRequestConfig,+    data: any,+    headers: AxiosResponseHeaders,+    status?: number+  ): any; }@@ -28,3 +154,3 @@ export interface AxiosAdapter {-  (config: AxiosRequestConfig): AxiosPromise;+  (config: InternalAxiosRequestConfig): AxiosPromise; }@@ -39,6 +165,3 @@   port: number;-  auth?: {-    username: string;-    password: string;-  };+  auth?: AxiosBasicCredentials;   protocol?: string;@@ -46,13 +169,82 @@ -export type Method =-  | 'get' | 'GET'-  | 'delete' | 'DELETE'-  | 'head' | 'HEAD'-  | 'options' | 'OPTIONS'-  | 'post' | 'POST'-  | 'put' | 'PUT'-  | 'patch' | 'PATCH'-  | 'purge' | 'PURGE'-  | 'link' | 'LINK'-  | 'unlink' | 'UNLINK';+export enum HttpStatusCode {+  Continue = 100,+  SwitchingProtocols = 101,+  Processing = 102,+  EarlyHints = 103,+  Ok = 200,+  Created = 201,+  Accepted = 202,+  NonAuthoritativeInformation = 203,+  NoContent = 204,+  ResetContent = 205,+  PartialContent = 206,+  MultiStatus = 207,+  AlreadyReported = 208,+  ImUsed = 226,+  MultipleChoices = 300,+  MovedPermanently = 301,+  Found = 302,+  SeeOther = 303,+  NotModified = 304,+  UseProxy = 305,+  Unused = 306,+  TemporaryRedirect = 307,+  PermanentRedirect = 308,+  BadRequest = 400,+  Unauthorized = 401,+  PaymentRequired = 402,+  Forbidden = 403,+  NotFound = 404,+  MethodNotAllowed = 405,+  NotAcceptable = 406,+  ProxyAuthenticationRequired = 407,+  RequestTimeout = 408,+  Conflict = 409,+  Gone = 410,+  LengthRequired = 411,+  PreconditionFailed = 412,+  PayloadTooLarge = 413,+  UriTooLong = 414,+  UnsupportedMediaType = 415,+  RangeNotSatisfiable = 416,+  ExpectationFailed = 417,+  ImATeapot = 418,+  MisdirectedRequest = 421,+  UnprocessableEntity = 422,+  Locked = 423,+  FailedDependency = 424,+  TooEarly = 425,+  UpgradeRequired = 426,+  PreconditionRequired = 428,+  TooManyRequests = 429,
… 504 more lines (truncated)
index.js +45 lines
--- +++ @@ -1 +1,45 @@-module.exports = require('./lib/axios');+import axios from './lib/axios.js';++// This module is intended to unwrap Axios default export as named.+// Keep top-level export same with static properties+// so that it can keep same with es module or cjs+const {+  Axios,+  AxiosError,+  CanceledError,+  isCancel,+  CancelToken,+  VERSION,+  all,+  Cancel,+  isAxiosError,+  spread,+  toFormData,+  AxiosHeaders,+  HttpStatusCode,+  formToJSON,+  getAdapter,+  mergeConfig,+  create,+} = axios;++export {+  axios as default,+  create,+  Axios,+  AxiosError,+  CanceledError,+  isCancel,+  CancelToken,+  VERSION,+  all,+  Cancel,+  isAxiosError,+  spread,+  toFormData,+  AxiosHeaders,+  HttpStatusCode,+  formToJSON,+  getAdapter,+  mergeConfig,+};
lib/adapters/adapters.js +132 lines
--- +++ @@ -0,0 +1,132 @@+import utils from '../utils.js';+import httpAdapter from './http.js';+import xhrAdapter from './xhr.js';+import * as fetchAdapter from './fetch.js';+import AxiosError from '../core/AxiosError.js';++/**+ * Known adapters mapping.+ * Provides environment-specific adapters for Axios:+ * - `http` for Node.js+ * - `xhr` for browsers+ * - `fetch` for fetch API-based requests+ *+ * @type {Object<string, Function|Object>}+ */+const knownAdapters = {+  http: httpAdapter,+  xhr: xhrAdapter,+  fetch: {+    get: fetchAdapter.getFetch,+  },+};++// Assign adapter names for easier debugging and identification+utils.forEach(knownAdapters, (fn, value) => {+  if (fn) {+    try {+      // Null-proto descriptors so a polluted Object.prototype.get cannot turn+      // these data descriptors into accessor descriptors on the way in.+      Object.defineProperty(fn, 'name', { __proto__: null, value });+    } catch (e) {+      // eslint-disable-next-line no-empty+    }+    Object.defineProperty(fn, 'adapterName', { __proto__: null, value });+  }+});++/**+ * Render a rejection reason string for unknown or unsupported adapters+ *+ * @param {string} reason+ * @returns {string}+ */+const renderReason = (reason) => `- ${reason}`;++/**+ * Check if the adapter is resolved (function, null, or false)+ *+ * @param {Function|null|false} adapter+ * @returns {boolean}+ */+const isResolvedHandle = (adapter) =>+  utils.isFunction(adapter) || adapter === null || adapter === false;++/**+ * Get the first suitable adapter from the provided list.+ * Tries each adapter in order until a supported one is found.+ * Throws an AxiosError if no adapter is suitable.+ *+ * @param {Array<string|Function>|string|Function} adapters - Adapter(s) by name or function.+ * @param {Object} config - Axios request configuration+ * @throws {AxiosError} If no suitable adapter is available+ * @returns {Function} The resolved adapter function+ */+function getAdapter(adapters, config) {+  adapters = utils.isArray(adapters) ? adapters : [adapters];++  const { length } = adapters;+  let nameOrAdapter;+  let adapter;++  const rejectedReasons = {};++  for (let i = 0; i < length; i++) {+    nameOrAdapter = adapters[i];+    let id;++    adapter = nameOrAdapter;++    if (!isResolvedHandle(nameOrAdapter)) {+      adapter = knownAdapters[(id = String(nameOrAdapter)).toLowerCase()];++      if (adapter === undefined) {+        throw new AxiosError(`Unknown adapter '${id}'`);+      }+    }++    if (adapter && (utils.isFunction(adapter) || (adapter = adapter.get(config)))) {+      break;+    }++    rejectedReasons[id || '#' + i] = adapter;+  }++  if (!adapter) {+    const reasons = Object.entries(rejectedReasons).map(+      ([id, state]) =>+        `adapter ${id} ` ++        (state === false ? 'is not supported by the environment' : 'is not available in the build')+    );++    let s = length+      ? reasons.length > 1+        ? 'since :\n' + reasons.map(renderReason).join('\n')+        : ' ' + renderReason(reasons[0])+      : 'as no adapter specified';++    throw new AxiosError(+      `There is no suitable adapter to dispatch the request ` + s,+      'ERR_NOT_SUPPORT'+    );+  }++  return adapter;+}++/**+ * Exports Axios adapters and utility to resolve an adapter+ */+export default {+  /**+   * Resolve an adapter from a list of adapter names or functions.+   * @type {Function}+   */+  getAdapter,++  /**+   * Exposes all known adapters+   * @type {Object<string, Function|Object>}+   */+  adapters: knownAdapters,+};
lib/adapters/fetch.js +473 lines
--- +++ @@ -0,0 +1,473 @@+import platform from '../platform/index.js';+import utils from '../utils.js';+import AxiosError from '../core/AxiosError.js';+import composeSignals from '../helpers/composeSignals.js';+import { trackStream } from '../helpers/trackStream.js';+import AxiosHeaders from '../core/AxiosHeaders.js';+import {+  progressEventReducer,+  progressEventDecorator,+  asyncDecorator,+} from '../helpers/progressEventReducer.js';+import resolveConfig from '../helpers/resolveConfig.js';+import settle from '../core/settle.js';+import estimateDataURLDecodedBytes from '../helpers/estimateDataURLDecodedBytes.js';+import { VERSION } from '../env/data.js';+import { toByteStringHeaderObject } from '../helpers/sanitizeHeaderValue.js';++const DEFAULT_CHUNK_SIZE = 64 * 1024;++const { isFunction } = utils;++const test = (fn, ...args) => {+  try {+    return !!fn(...args);+  } catch (e) {+    return false;+  }+};++const factory = (env) => {+  const globalObject =+    utils.global !== undefined && utils.global !== null+      ? utils.global+      : globalThis;+  const { ReadableStream, TextEncoder } = globalObject;++  env = utils.merge.call(+    {+      skipUndefined: true,+    },+    {+      Request: globalObject.Request,+      Response: globalObject.Response,+    },+    env+  );++  const { fetch: envFetch, Request, Response } = env;+  const isFetchSupported = envFetch ? isFunction(envFetch) : typeof fetch === 'function';+  const isRequestSupported = isFunction(Request);+  const isResponseSupported = isFunction(Response);++  if (!isFetchSupported) {+    return false;+  }++  const isReadableStreamSupported = isFetchSupported && isFunction(ReadableStream);++  const encodeText =+    isFetchSupported &&+    (typeof TextEncoder === 'function'+      ? (+          (encoder) => (str) =>+            encoder.encode(str)+        )(new TextEncoder())+      : async (str) => new Uint8Array(await new Request(str).arrayBuffer()));++  const supportsRequestStream =+    isRequestSupported &&+    isReadableStreamSupported &&+    test(() => {+      let duplexAccessed = false;++      const request = new Request(platform.origin, {+        body: new ReadableStream(),+        method: 'POST',+        get duplex() {+          duplexAccessed = true;+          return 'half';+        },+      });++      const hasContentType = request.headers.has('Content-Type');++      if (request.body != null) {+        request.body.cancel();+      }++      return duplexAccessed && !hasContentType;+    });++  const supportsResponseStream =+    isResponseSupported &&+    isReadableStreamSupported &&+    test(() => utils.isReadableStream(new Response('').body));++  const resolvers = {+    stream: supportsResponseStream && ((res) => res.body),+  };++  isFetchSupported &&+    (() => {+      ['text', 'arrayBuffer', 'blob', 'formData', 'stream'].forEach((type) => {+        !resolvers[type] &&+          (resolvers[type] = (res, config) => {+            let method = res && res[type];++            if (method) {+              return method.call(res);+            }++            throw new AxiosError(+              `Response type '${type}' is not supported`,+              AxiosError.ERR_NOT_SUPPORT,+              config+            );+          });+      });+    })();++  const getBodyLength = async (body) => {+    if (body == null) {+      return 0;+    }++    if (utils.isBlob(body)) {+      return body.size;+    }++    if (utils.isSpecCompliantForm(body)) {+      const _request = new Request(platform.origin, {+        method: 'POST',+        body,+      });+      return (await _request.arrayBuffer()).byteLength;+    }++    if (utils.isArrayBufferView(body) || utils.isArrayBuffer(body)) {+      return body.byteLength;+    }++    if (utils.isURLSearchParams(body)) {+      body = body + '';+    }++    if (utils.isString(body)) {+      return (await encodeText(body)).byteLength;+    }+  };++  const resolveBodyLength = async (headers, body) => {+    const length = utils.toFiniteNumber(headers.getContentLength());++    return length == null ? getBodyLength(body) : length;+  };++  return async (config) => {+    let {+      url,+      method,+      data,+      signal,+      cancelToken,+      timeout,+      onDownloadProgress,+      onUploadProgress,+      responseType,+      headers,+      withCredentials = 'same-origin',+      fetchOptions,+      maxContentLength,+      maxBodyLength,+    } = resolveConfig(config);++    const hasMaxContentLength = utils.isNumber(maxContentLength) && maxContentLength > -1;+    const hasMaxBodyLength = utils.isNumber(maxBodyLength) && maxBodyLength > -1;++    let _fetch = envFetch || fetch;++    responseType = responseType ? (responseType + '').toLowerCase() : 'text';++    let composedSignal = composeSignals(+      [signal, cancelToken && cancelToken.toAbortSignal()],+      timeout+    );++    let request = null;++    const unsubscribe =+      composedSignal &&+      composedSignal.unsubscribe &&+      (() => {+        composedSignal.unsubscribe();+      });++    let requestContentLength;++    try {+      // Enforce maxContentLength for data: URLs up-front so we never materialize+      // an oversized payload. The HTTP adapter applies the same check (see http.js+      // "if (protocol === 'data:')" branch).+      if (hasMaxContentLength && typeof url === 'string' && url.startsWith('data:')) {+        const estimated = estimateDataURLDecodedBytes(url);+        if (estimated > maxContentLength) {+          throw new AxiosError(+            'maxContentLength size of ' + maxContentLength + ' exceeded',+            AxiosError.ERR_BAD_RESPONSE,+            config,+            request+          );+        }+      }++      // Enforce maxBodyLength against the outbound request body before dispatch.+      // Mirrors http.js behavior (ERR_BAD_REQUEST / 'Request body larger than+      // maxBodyLength limit'). Skip when the body length cannot be determined+      // (e.g. a live ReadableStream supplied by the caller).+      if (hasMaxBodyLength && method !== 'get' && method !== 'head') {+        const outboundLength = await resolveBodyLength(headers, data);+        if (+          typeof outboundLength === 'number' &&+          isFinite(outboundLength) &&+          outboundLength > maxBodyLength+        ) {+          throw new AxiosError(+            'Request body larger than maxBodyLength limit',+            AxiosError.ERR_BAD_REQUEST,+            config,+            request+          );+        }+      }++      if (+        onUploadProgress &&+        supportsRequestStream &&+        method !== 'get' &&+        method !== 'head' &&+        (requestContentLength = await resolveBodyLength(headers, data)) !== 0+      ) {+        let _request = new Request(url, {+          method: 'POST',+          body: data,+          duplex: 'half',+        });++        let contentTypeHeader;
… 226 more lines (truncated)
lib/adapters/xhr.js +220 lines
--- +++ @@ -1,254 +1,43 @@-'use strict';--var utils = require('./../utils');-var settle = require('./../core/settle');-var cookies = require('./../helpers/cookies');-var buildURL = require('./../helpers/buildURL');-var buildFullPath = require('../core/buildFullPath');-var parseHeaders = require('./../helpers/parseHeaders');-var isURLSameOrigin = require('./../helpers/isURLSameOrigin');-var transitionalDefaults = require('../defaults/transitional');-var AxiosError = require('../core/AxiosError');-var CanceledError = require('../cancel/CanceledError');-var parseProtocol = require('../helpers/parseProtocol');-var platform = require('../platform');--module.exports = function xhrAdapter(config) {-  return new Promise(function dispatchXhrRequest(resolve, reject) {-    var requestData = config.data;-    var requestHeaders = config.headers;-    var responseType = config.responseType;-    // Guard against prototype pollution: only honor own properties.-    var withXSRFToken = utils.hasOwnProperty(config, 'withXSRFToken')-      ? config.withXSRFToken-      : undefined;-    var onCanceled;-    function done() {-      if (config.cancelToken) {-        config.cancelToken.unsubscribe(onCanceled);-      }--      if (config.signal) {-        config.signal.removeEventListener('abort', onCanceled);-      }-    }--    if (utils.isFormData(requestData) && utils.isStandardBrowserEnv()) {-      delete requestHeaders['Content-Type']; // Let the browser set it-    }--    var request = new XMLHttpRequest();--    // HTTP basic authentication-    if (config.auth) {-      var username = config.auth.username || '';-      var password = config.auth.password-        ? unescape(encodeURIComponent(config.auth.password))-        : '';-      requestHeaders.Authorization = 'Basic ' + btoa(username + ':' + password);-    }--    var fullPath = buildFullPath(-      config.baseURL,-      config.url,-      config.allowAbsoluteUrls-    );--    request.open(-      config.method.toUpperCase(),-      buildURL(fullPath, config.params, config.paramsSerializer),-      true-    );--    // Set the request timeout in MS-    request.timeout = config.timeout;--    function onloadend() {-      if (!request) {-        return;-      }-      // Prepare the response-      var responseHeaders =-        'getAllResponseHeaders' in request-          ? parseHeaders(request.getAllResponseHeaders())-          : null;-      var responseData =-        !responseType || responseType === 'text' || responseType === 'json'-          ? request.responseText-          : request.response;-      var response = {-        data: responseData,-        status: request.status,-        statusText: request.statusText,-        headers: responseHeaders,-        config: config,-        request: request-      };--      settle(-        function _resolve(value) {-          resolve(value);-          done();-        },-        function _reject(err) {-          reject(err);-          done();-        },-        response-      );--      // Clean up request-      request = null;-    }--    if ('onloadend' in request) {-      // Use onloadend if available-      request.onloadend = onloadend;-    } else {-      // Listen for ready state to emulate onloadend-      request.onreadystatechange = function handleLoad() {-        if (!request || request.readyState !== 4) {-          return;-        }--        // The request errored out and we didn't get a response, this will be-        // handled by onerror instead-        // With one exception: request that using file: protocol, most browsers-        // will return status as 0 even though it's a successful request-        if (-          request.status === 0 &&-          !(request.responseURL && request.responseURL.indexOf('file:') === 0)-        ) {-          return;-        }-        // readystate handler is calling before onerror or ontimeout handlers,-        // so we should call onloadend on the next 'tick'-        setTimeout(onloadend);-      };-    }--    // Handle browser request cancellation (as opposed to a manual cancellation)-    request.onabort = function handleAbort() {-      if (!request) {-        return;-      }--      reject(-        new AxiosError(-          'Request aborted',-          AxiosError.ECONNABORTED,-          config,-          request-        )-      );--      // Clean up request-      request = null;-    };--    // Handle low level network errors-    request.onerror = function handleError() {-      // Real errors are hidden from us by the browser-      // onerror should only fire if it's a network error-      reject(-        new AxiosError(-          'Network Error',-          AxiosError.ERR_NETWORK,-          config,-          request-        )-      );--      // Clean up request-      request = null;-    };--    // Handle timeout-    request.ontimeout = function handleTimeout() {-      var timeoutErrorMessage = config.timeout-        ? 'timeout of ' + config.timeout + 'ms exceeded'-        : 'timeout exceeded';-      var transitional = config.transitional || transitionalDefaults;-      if (config.timeoutErrorMessage) {-        timeoutErrorMessage = config.timeoutErrorMessage;-      }-      reject(-        new AxiosError(-          timeoutErrorMessage,-          transitional.clarifyTimeoutError-            ? AxiosError.ETIMEDOUT-            : AxiosError.ECONNABORTED,-          config,-          request-        )-      );--      // Clean up request-      request = null;-    };--    // Add xsrf header-    // This is only done if running in a standard browser environment.-    // Specifically not if we're in a web worker, or react-native.-    if (utils.isStandardBrowserEnv()) {-      // Add xsrf header-      if (utils.isFunction(withXSRFToken)) {-        withXSRFToken = withXSRFToken(config);-      }-      // Strict boolean check: only `true` short-circuits the same-origin guard.-      if (-        withXSRFToken === true ||-        (withXSRFToken !== false && isURLSameOrigin(fullPath))-      ) {-        // Add xsrf header-        var xsrfValue =-          config.xsrfHeaderName &&-          config.xsrfCookieName &&-          cookies.read(config.xsrfCookieName);-        if (xsrfValue) {-          requestHeaders[config.xsrfHeaderName] = xsrfValue;-        }-      }-    }--    // Add headers to the request-    if ('setRequestHeader' in request) {-      utils.forEach(requestHeaders, function setRequestHeader(val, key) {-        if (-          typeof requestData === 'undefined' &&-          key.toLowerCase() === 'content-type'-        ) {-          // Remove Content-Type if data is undefined-          delete requestHeaders[key];-        } else {-          // Otherwise add header to the request-          request.setRequestHeader(key, val);-        }-      });-    }--    // Add withCredentials to request if needed-    if (!utils.isUndefined(config.withCredentials)) {-      request.withCredentials = !!config.withCredentials;-    }--    // Add responseType to request if needed-    if (responseType && responseType !== 'json') {-      request.responseType = config.responseType;-    }--    // Handle progress if needed-    if (typeof config.onDownloadProgress === 'function') {-      request.addEventListener('progress', config.onDownloadProgress);-    }--    // Not all browsers support upload events-    if (typeof config.onUploadProgress === 'function' && request.upload) {-      request.upload.addEventListener('progress', config.onUploadProgress);
… 273 more lines (truncated)
lib/axios.js +47 lines
--- +++ @@ -2,8 +2,20 @@ -var utils = require('./utils');-var bind = require('./helpers/bind');-var Axios = require('./core/Axios');-var mergeConfig = require('./core/mergeConfig');-var defaults = require('./defaults');-var formDataToJSON = require('./helpers/formDataToJSON');+import utils from './utils.js';+import bind from './helpers/bind.js';+import Axios from './core/Axios.js';+import mergeConfig from './core/mergeConfig.js';+import defaults from './defaults/index.js';+import formDataToJSON from './helpers/formDataToJSON.js';+import CanceledError from './cancel/CanceledError.js';+import CancelToken from './cancel/CancelToken.js';+import isCancel from './cancel/isCancel.js';+import { VERSION } from './env/data.js';+import toFormData from './helpers/toFormData.js';+import AxiosError from './core/AxiosError.js';+import spread from './helpers/spread.js';+import isAxiosError from './helpers/isAxiosError.js';+import AxiosHeaders from './core/AxiosHeaders.js';+import adapters from './adapters/adapters.js';+import HttpStatusCode from './helpers/HttpStatusCode.js';+ /**@@ -12,13 +24,14 @@  * @param {Object} defaultConfig The default config for the instance- * @return {Axios} A new instance of Axios+ *+ * @returns {Axios} A new instance of Axios  */ function createInstance(defaultConfig) {-  var context = new Axios(defaultConfig);-  var instance = bind(Axios.prototype.request, context);+  const context = new Axios(defaultConfig);+  const instance = bind(Axios.prototype.request, context);    // Copy axios.prototype to instance-  utils.extend(instance, Axios.prototype, context);+  utils.extend(instance, Axios.prototype, context, { allOwnKeys: true });    // Copy context to instance-  utils.extend(instance, context);+  utils.extend(instance, context, null, { allOwnKeys: true }); @@ -33,3 +46,3 @@ // Create the default instance to be exported-var axios = createInstance(defaults);+const axios = createInstance(defaults); @@ -39,10 +52,10 @@ // Expose Cancel & CancelToken-axios.CanceledError = require('./cancel/CanceledError');-axios.CancelToken = require('./cancel/CancelToken');-axios.isCancel = require('./cancel/isCancel');-axios.VERSION = require('./env/data').version;-axios.toFormData = require('./helpers/toFormData');+axios.CanceledError = CanceledError;+axios.CancelToken = CancelToken;+axios.isCancel = isCancel;+axios.VERSION = VERSION;+axios.toFormData = toFormData;  // Expose AxiosError class-axios.AxiosError = require('../lib/core/AxiosError');+axios.AxiosError = AxiosError; @@ -55,14 +68,22 @@ };-axios.spread = require('./helpers/spread');++axios.spread = spread;  // Expose isAxiosError-axios.isAxiosError = require('./helpers/isAxiosError');+axios.isAxiosError = isAxiosError; -axios.formToJSON = function(thing) {-  return formDataToJSON(utils.isHTMLForm(thing) ? new FormData(thing) : thing);-};+// Expose mergeConfig+axios.mergeConfig = mergeConfig; -module.exports = axios;+axios.AxiosHeaders = AxiosHeaders; -// Allow use of default import syntax in TypeScript-module.exports.default = axios;+axios.formToJSON = (thing) => formDataToJSON(utils.isHTMLForm(thing) ? new FormData(thing) : thing);++axios.getAdapter = adapters.getAdapter;++axios.HttpStatusCode = HttpStatusCode;++axios.default = axios;++// this module should only have a default export+export default axios;
lib/cancel/CancelToken.js +118 lines
--- +++ @@ -2,3 +2,3 @@ -var CanceledError = require('./CanceledError');+import CanceledError from './CanceledError.js'; @@ -7,49 +7,75 @@  *- * @class  * @param {Function} executor The executor function.+ *+ * @returns {CancelToken}  */-function CancelToken(executor) {-  if (typeof executor !== 'function') {-    throw new TypeError('executor must be a function.');+class CancelToken {+  constructor(executor) {+    if (typeof executor !== 'function') {+      throw new TypeError('executor must be a function.');+    }++    let resolvePromise;++    this.promise = new Promise(function promiseExecutor(resolve) {+      resolvePromise = resolve;+    });++    const token = this;++    // eslint-disable-next-line func-names+    this.promise.then((cancel) => {+      if (!token._listeners) return;++      let i = token._listeners.length;++      while (i-- > 0) {+        token._listeners[i](cancel);+      }+      token._listeners = null;+    });++    // eslint-disable-next-line func-names+    this.promise.then = (onfulfilled) => {+      let _resolve;+      // eslint-disable-next-line func-names+      const promise = new Promise((resolve) => {+        token.subscribe(resolve);+        _resolve = resolve;+      }).then(onfulfilled);++      promise.cancel = function reject() {+        token.unsubscribe(_resolve);+      };++      return promise;+    };++    executor(function cancel(message, config, request) {+      if (token.reason) {+        // Cancellation has already been requested+        return;+      }++      token.reason = new CanceledError(message, config, request);+      resolvePromise(token.reason);+    });   } -  var resolvePromise;+  /**+   * Throws a `CanceledError` if cancellation has been requested.+   */+  throwIfRequested() {+    if (this.reason) {+      throw this.reason;+    }+  } -  this.promise = new Promise(function promiseExecutor(resolve) {-    resolvePromise = resolve;-  });+  /**+   * Subscribe to the cancel signal+   */ -  var token = this;--  // eslint-disable-next-line func-names-  this.promise.then(function(cancel) {-    if (!token._listeners) return;--    var i = token._listeners.length;--    while (i-- > 0) {-      token._listeners[i](cancel);-    }-    token._listeners = null;-  });--  // eslint-disable-next-line func-names-  this.promise.then = function(onfulfilled) {-    var _resolve;-    // eslint-disable-next-line func-names-    var promise = new Promise(function(resolve) {-      token.subscribe(resolve);-      _resolve = resolve;-    }).then(onfulfilled);--    promise.cancel = function reject() {-      token.unsubscribe(_resolve);-    };--    return promise;-  };--  executor(function cancel(message, config, request) {-    if (token.reason) {-      // Cancellation has already been requested+  subscribe(listener) {+    if (this.reason) {+      listener(this.reason);       return;@@ -57,62 +83,53 @@ -    token.reason = new CanceledError(message, config, request);-    resolvePromise(token.reason);-  });+    if (this._listeners) {+      this._listeners.push(listener);+    } else {+      this._listeners = [listener];+    }+  }++  /**+   * Unsubscribe from the cancel signal+   */++  unsubscribe(listener) {+    if (!this._listeners) {+      return;+    }+    const index = this._listeners.indexOf(listener);+    if (index !== -1) {+      this._listeners.splice(index, 1);+    }+  }++  toAbortSignal() {+    const controller = new AbortController();++    const abort = (err) => {+      controller.abort(err);+    };++    this.subscribe(abort);++    controller.signal.unsubscribe = () => this.unsubscribe(abort);++    return controller.signal;+  }++  /**+   * Returns an object that contains a new `CancelToken` and a function that, when called,+   * cancels the `CancelToken`.+   */+  static source() {+    let cancel;+    const token = new CancelToken(function executor(c) {+      cancel = c;+    });+    return {+      token,+      cancel,+    };+  } } -/**- * Throws a `CanceledError` if cancellation has been requested.- */-CancelToken.prototype.throwIfRequested = function throwIfRequested() {-  if (this.reason) {-    throw this.reason;-  }-};--/**- * Subscribe to the cancel signal- */--CancelToken.prototype.subscribe = function subscribe(listener) {-  if (this.reason) {-    listener(this.reason);-    return;-  }--  if (this._listeners) {-    this._listeners.push(listener);-  } else {-    this._listeners = [listener];-  }-};--/**- * Unsubscribe from the cancel signal- */--CancelToken.prototype.unsubscribe = function unsubscribe(listener) {-  if (!this._listeners) {-    return;-  }-  var index = this._listeners.indexOf(listener);-  if (index !== -1) {-    this._listeners.splice(index, 1);-  }-};--/**- * Returns an object that contains a new `CancelToken` and a function that, when called,- * cancels the `CancelToken`.- */-CancelToken.source = function source() {-  var cancel;-  var token = new CancelToken(function executor(c) {-    cancel = c;-  });-  return {-    token: token,-    cancel: cancel-  };-};--module.exports = CancelToken;+export default CancelToken;
lib/cancel/CanceledError.js +17 lines
--- +++ @@ -2,23 +2,21 @@ -var AxiosError = require('../core/AxiosError');-var utils = require('../utils');+import AxiosError from '../core/AxiosError.js'; -/**- * A `CanceledError` is an object that is thrown when an operation is canceled.- *- * @class- * @param {string=} message The message.- * @param {Object=} config The config.- * @param {Object=} request The request.- */-function CanceledError(message, config, request) {-  // eslint-disable-next-line no-eq-null,eqeqeq-  AxiosError.call(this, message == null ? 'canceled' : message, AxiosError.ERR_CANCELED, config, request);-  this.name = 'CanceledError';+class CanceledError extends AxiosError {+  /**+   * A `CanceledError` is an object that is thrown when an operation is canceled.+   *+   * @param {string=} message The message.+   * @param {Object=} config The config.+   * @param {Object=} request The request.+   *+   * @returns {CanceledError} The created error.+   */+  constructor(message, config, request) {+    super(message == null ? 'canceled' : message, AxiosError.ERR_CANCELED, config, request);+    this.name = 'CanceledError';+    this.__CANCEL__ = true;+  } } -utils.inherits(CanceledError, AxiosError, {-  __CANCEL__: true-});--module.exports = CanceledError;+export default CanceledError;
lib/cancel/isCancel.js +2 lines
--- +++ @@ -2,4 +2,4 @@ -module.exports = function isCancel(value) {+export default function isCancel(value) {   return !!(value && value.__CANCEL__);-};+}
lib/core/Axios.js +257 lines
--- +++ @@ -2,11 +2,14 @@ -var utils = require('./../utils');-var buildURL = require('../helpers/buildURL');-var InterceptorManager = require('./InterceptorManager');-var dispatchRequest = require('./dispatchRequest');-var mergeConfig = require('./mergeConfig');-var buildFullPath = require('./buildFullPath');-var validator = require('../helpers/validator');--var validators = validator.validators;+import utils from '../utils.js';+import buildURL from '../helpers/buildURL.js';+import InterceptorManager from './InterceptorManager.js';+import dispatchRequest from './dispatchRequest.js';+import mergeConfig from './mergeConfig.js';+import buildFullPath from './buildFullPath.js';+import validator from '../helpers/validator.js';+import AxiosHeaders from './AxiosHeaders.js';+import transitionalDefaults from '../defaults/transitional.js';++const validators = validator.validators;+ /**@@ -15,128 +18,222 @@  * @param {Object} instanceConfig The default config for the instance+ *+ * @return {Axios} A new instance of Axios  */-function Axios(instanceConfig) {-  this.defaults = instanceConfig;-  this.interceptors = {-    request: new InterceptorManager(),-    response: new InterceptorManager()-  };+class Axios {+  constructor(instanceConfig) {+    this.defaults = instanceConfig || {};+    this.interceptors = {+      request: new InterceptorManager(),+      response: new InterceptorManager(),+    };+  }++  /**+   * Dispatch a request+   *+   * @param {String|Object} configOrUrl The config specific for this request (merged with this.defaults)+   * @param {?Object} config+   *+   * @returns {Promise} The Promise to be fulfilled+   */+  async request(configOrUrl, config) {+    try {+      return await this._request(configOrUrl, config);+    } catch (err) {+      if (err instanceof Error) {+        let dummy = {};++        Error.captureStackTrace ? Error.captureStackTrace(dummy) : (dummy = new Error());++        // slice off the Error: ... line+        const stack = (() => {+          if (!dummy.stack) {+            return '';+          }++          const firstNewlineIndex = dummy.stack.indexOf('\n');++          return firstNewlineIndex === -1 ? '' : dummy.stack.slice(firstNewlineIndex + 1);+        })();+        try {+          if (!err.stack) {+            err.stack = stack;+            // match without the 2 top stack lines+          } else if (stack) {+            const firstNewlineIndex = stack.indexOf('\n');+            const secondNewlineIndex =+              firstNewlineIndex === -1 ? -1 : stack.indexOf('\n', firstNewlineIndex + 1);+            const stackWithoutTwoTopLines =+              secondNewlineIndex === -1 ? '' : stack.slice(secondNewlineIndex + 1);++            if (!String(err.stack).endsWith(stackWithoutTwoTopLines)) {+              err.stack += '\n' + stack;+            }+          }+        } catch (e) {+          // ignore the case where "stack" is an un-writable property+        }+      }++      throw err;+    }+  }++  _request(configOrUrl, config) {+    /*eslint no-param-reassign:0*/+    // Allow for axios('example/url'[, config]) a la fetch API+    if (typeof configOrUrl === 'string') {+      config = config || {};+      config.url = configOrUrl;+    } else {+      config = configOrUrl || {};+    }++    config = mergeConfig(this.defaults, config);++    const { transitional, paramsSerializer, headers } = config;++    if (transitional !== undefined) {+      validator.assertOptions(+        transitional,+        {+          silentJSONParsing: validators.transitional(validators.boolean),+          forcedJSONParsing: validators.transitional(validators.boolean),+          clarifyTimeoutError: validators.transitional(validators.boolean),+          legacyInterceptorReqResOrdering: validators.transitional(validators.boolean),+        },+        false+      );+    }++    if (paramsSerializer != null) {+      if (utils.isFunction(paramsSerializer)) {+        config.paramsSerializer = {+          serialize: paramsSerializer,+        };+      } else {+        validator.assertOptions(+          paramsSerializer,+          {+            encode: validators.function,+            serialize: validators.function,+          },+          true+        );+      }+    }++    // Set config.allowAbsoluteUrls+    if (config.allowAbsoluteUrls !== undefined) {+      // do nothing+    } else if (this.defaults.allowAbsoluteUrls !== undefined) {+      config.allowAbsoluteUrls = this.defaults.allowAbsoluteUrls;+    } else {+      config.allowAbsoluteUrls = true;+    }++    validator.assertOptions(+      config,+      {+        baseUrl: validators.spelling('baseURL'),+        withXsrfToken: validators.spelling('withXSRFToken'),+      },+      true+    );++    // Set config.method+    config.method = (config.method || this.defaults.method || 'get').toLowerCase();++    // Flatten headers+    let contextHeaders = headers && utils.merge(headers.common, headers[config.method]);++    headers &&+      utils.forEach(['delete', 'get', 'head', 'post', 'put', 'patch', 'query', 'common'], (method) => {+        delete headers[method];+      });++    config.headers = AxiosHeaders.concat(contextHeaders, headers);++    // filter out skipped interceptors+    const requestInterceptorChain = [];+    let synchronousRequestInterceptors = true;+    this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) {+      if (typeof interceptor.runWhen === 'function' && interceptor.runWhen(config) === false) {+        return;+      }++      synchronousRequestInterceptors = synchronousRequestInterceptors && interceptor.synchronous;++      const transitional = config.transitional || transitionalDefaults;+      const legacyInterceptorReqResOrdering =+        transitional && transitional.legacyInterceptorReqResOrdering;++      if (legacyInterceptorReqResOrdering) {+        requestInterceptorChain.unshift(interceptor.fulfilled, interceptor.rejected);+      } else {+        requestInterceptorChain.push(interceptor.fulfilled, interceptor.rejected);+      }+    });++    const responseInterceptorChain = [];+    this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) {+      responseInterceptorChain.push(interceptor.fulfilled, interceptor.rejected);+    });++    let promise;+    let i = 0;+    let len;++    if (!synchronousRequestInterceptors) {+      const chain = [dispatchRequest.bind(this), undefined];+      chain.unshift(...requestInterceptorChain);+      chain.push(...responseInterceptorChain);+      len = chain.length;++      promise = Promise.resolve(config);++      while (i < len) {+        promise = promise.then(chain[i++], chain[i++]);+      }++      return promise;+    }++    len = requestInterceptorChain.length;++    let newConfig = config;++    while (i < len) {+      const onFulfilled = requestInterceptorChain[i++];+      const onRejected = requestInterceptorChain[i++];+      try {+        newConfig = onFulfilled(newConfig);+      } catch (error) {+        onRejected.call(this, error);+        break;+      }+    }++    try {+      promise = dispatchRequest.call(this, newConfig);+    } catch (error) {+      return Promise.reject(error);+    }++    i = 0;+    len = responseInterceptorChain.length;++    while (i < len) {+      promise = promise.then(responseInterceptorChain[i++], responseInterceptorChain[i++]);+    }++    return promise;+  }++  getUri(config) {+    config = mergeConfig(this.defaults, config);
… 181 more lines (truncated)
lib/core/AxiosError.js +139 lines
--- +++ @@ -2,108 +2,139 @@ -var utils = require('../utils');-var DEFAULT_REDACT_KEYS = require('../helpers/defaultRedactKeys');+import utils from '../utils.js';+import AxiosHeaders from './AxiosHeaders.js'; -var REDACTED_VALUE = '[REDACTED ****]';+const REDACTED = '[REDACTED ****]'; -function makeValueDescriptor(value) {-  var descriptor = Object.create(null);-  descriptor.value = value;-  return descriptor;+function hasOwnOrPrototypeToJSON(source) {+  if (utils.hasOwnProp(source, 'toJSON')) {+    return true;+  }++  let prototype = Object.getPrototypeOf(source);++  while (prototype && prototype !== Object.prototype) {+    if (utils.hasOwnProp(prototype, 'toJSON')) {+      return true;+    }++    prototype = Object.getPrototypeOf(prototype);+  }++  return false; } -function getRedactKeys(config) {-  // An empty array is treated as "no override" so an upstream `redact: []` cannot-  // silently disable redaction. To opt out, pass non-string values or unset keys.-  var override = config && utils.isArray(config.redact) && config.redact.length ? config.redact : null;-  var redact = override || DEFAULT_REDACT_KEYS;-  var keys = {};+// Build a plain-object snapshot of `config` and replace the value of any key+// (case-insensitive) listed in `redactKeys` with REDACTED. Walks through arrays+// and AxiosHeaders, and short-circuits on circular references.+function redactConfig(config, redactKeys) {+  const lowerKeys = new Set(redactKeys.map((k) => String(k).toLowerCase()));+  const seen = []; -  utils.forEach(redact, function eachRedactKey(key) {-    if (typeof key === 'string') {-      keys[key.toLowerCase()] = true;+  const visit = (source) => {+    if (source === null || typeof source !== 'object') return source;+    if (utils.isBuffer(source)) return source;+    if (seen.indexOf(source) !== -1) return undefined;++    if (source instanceof AxiosHeaders) {+      source = source.toJSON();     }-  }); -  return keys;+    seen.push(source);++    let result;+    if (utils.isArray(source)) {+      result = [];+      source.forEach((v, i) => {+        const reducedValue = visit(v);+        if (!utils.isUndefined(reducedValue)) {+          result[i] = reducedValue;+        }+      });+    } else {+      if (!utils.isPlainObject(source) && hasOwnOrPrototypeToJSON(source)) {+        seen.pop();+        return source;+      }++      result = Object.create(null);+      for (const [key, value] of Object.entries(source)) {+        const reducedValue = lowerKeys.has(key.toLowerCase()) ? REDACTED : visit(value);+        if (!utils.isUndefined(reducedValue)) {+          result[key] = reducedValue;+        }+      }+    }++    seen.pop();+    return result;+  };++  return visit(config); } -function shouldRedact(key, keys) {-  return typeof key === 'string' && keys[key.toLowerCase()];-}+class AxiosError extends Error {+  static from(error, code, config, request, response, customProps) {+    const axiosError = new AxiosError(error.message, code || error.code, config, request, response);+    axiosError.cause = error;+    axiosError.name = error.name; -var CIRCULAR_VALUE = '[Circular]';+    // Preserve status from the original error if not already set from response+    if (error.status != null && axiosError.status == null) {+      axiosError.status = error.status;+    } -function serializeConfigValue(value, keys, key, seen) {-  var result;--  if (shouldRedact(key, keys)) {-    return REDACTED_VALUE;+    customProps && Object.assign(axiosError, customProps);+    return axiosError;   } -  if (utils.isArray(value)) {-    if (seen.indexOf(value) !== -1) {-      return CIRCULAR_VALUE;+  /**+   * Create an Error with the specified message, config, error code, request and response.+   *+   * @param {string} message The error message.+   * @param {string} [code] The error code (for example, 'ECONNABORTED').+   * @param {Object} [config] The config.+   * @param {Object} [request] The request.+   * @param {Object} [response] The response.+   *+   * @returns {Error} The created error.+   */+  constructor(message, code, config, request, response) {+    super(message);++    // Make message enumerable to maintain backward compatibility+    // The native Error constructor sets message as non-enumerable,+    // but axios < v1.13.3 had it as enumerable+    Object.defineProperty(this, 'message', {+      // Null-proto descriptor so a polluted Object.prototype.get cannot turn+      // this data descriptor into an accessor descriptor on the way in.+      __proto__: null,+      value: message,+      enumerable: true,+      writable: true,+      configurable: true,+    });++    this.name = 'AxiosError';+    this.isAxiosError = true;+    code && (this.code = code);+    config && (this.config = config);+    request && (this.request = request);+    if (response) {+      this.response = response;+      this.status = response.status;     }-    seen.push(value);-    result = [];-    utils.forEach(value, function eachArrayValue(item, index) {-      result[index] = serializeConfigValue(item, keys, index, seen);-    });-    seen.pop();-    return result;   } -  if (utils.isPlainObject(value)) {-    if (seen.indexOf(value) !== -1) {-      return CIRCULAR_VALUE;-    }-    seen.push(value);-    result = {};-    utils.forEach(value, function eachObjectValue(item, itemKey) {-      result[itemKey] = serializeConfigValue(item, keys, itemKey, seen);-    });-    seen.pop();-    return result;-  }+  toJSON() {+    // Opt-in redaction: when the request config carries a `redact` array, the+    // value of any matching key (case-insensitive, at any depth) is replaced+    // with REDACTED in the serialized snapshot. Undefined or empty leaves the+    // existing serialization behavior unchanged.+    const config = this.config;+    const redactKeys = config && utils.hasOwnProp(config, 'redact') ? config.redact : undefined;+    const serializedConfig =+      utils.isArray(redactKeys) && redactKeys.length > 0+        ? redactConfig(config, redactKeys)+        : utils.toJSONObject(config); -  return value;-}--function serializeConfig(config) {-  if (!config) {-    return config;-  }--  return serializeConfigValue(config, getRedactKeys(config), undefined, []);-}--/**- * Create an Error with the specified message, config, error code, request and response.- *- * @param {string} message The error message.- * @param {string} [code] The error code (for example, 'ECONNABORTED').- * @param {Object} [config] The config.- * @param {Object} [request] The request.- * @param {Object} [response] The response.- * @returns {Error} The created error.- */-function AxiosError(message, code, config, request, response) {-  Error.call(this);--  if (Error.captureStackTrace) {-    Error.captureStackTrace(this, this.constructor);-  } else {-    this.stack = (new Error()).stack;-  }--  this.message = message;-  this.name = 'AxiosError';-  code && (this.code = code);-  config && (this.config = config);-  request && (this.request = request);-  response && (this.response = response);-}--utils.inherits(AxiosError, Error, {-  toJSON: function toJSON() {     return {@@ -121,53 +152,25 @@       // Axios-      config: serializeConfig(this.config),+      config: serializedConfig,       code: this.code,-      status: this.response && this.response.status ? this.response.status : null+      status: this.status,     };   }-});+} -var prototype = AxiosError.prototype;-var descriptors = Object.create(null);+// This can be changed to static properties as soon as the parser options in .eslint.cjs are updated.+AxiosError.ERR_BAD_OPTION_VALUE = 'ERR_BAD_OPTION_VALUE';+AxiosError.ERR_BAD_OPTION = 'ERR_BAD_OPTION';+AxiosError.ECONNABORTED = 'ECONNABORTED';+AxiosError.ETIMEDOUT = 'ETIMEDOUT';
… 54 more lines (truncated)
lib/core/InterceptorManager.js +67 lines
--- +++ @@ -2,62 +2,71 @@ -var utils = require('./../utils');+import utils from '../utils.js'; -function InterceptorManager() {-  this.handlers = [];+class InterceptorManager {+  constructor() {+    this.handlers = [];+  }++  /**+   * Add a new interceptor to the stack+   *+   * @param {Function} fulfilled The function to handle `then` for a `Promise`+   * @param {Function} rejected The function to handle `reject` for a `Promise`+   * @param {Object} options The options for the interceptor, synchronous and runWhen+   *+   * @return {Number} An ID used to remove interceptor later+   */+  use(fulfilled, rejected, options) {+    this.handlers.push({+      fulfilled,+      rejected,+      synchronous: options ? options.synchronous : false,+      runWhen: options ? options.runWhen : null,+    });+    return this.handlers.length - 1;+  }++  /**+   * Remove an interceptor from the stack+   *+   * @param {Number} id The ID that was returned by `use`+   *+   * @returns {void}+   */+  eject(id) {+    if (this.handlers[id]) {+      this.handlers[id] = null;+    }+  }++  /**+   * Clear all interceptors from the stack+   *+   * @returns {void}+   */+  clear() {+    if (this.handlers) {+      this.handlers = [];+    }+  }++  /**+   * Iterate over all the registered interceptors+   *+   * This method is particularly useful for skipping over any+   * interceptors that may have become `null` calling `eject`.+   *+   * @param {Function} fn The function to call for each interceptor+   *+   * @returns {void}+   */+  forEach(fn) {+    utils.forEach(this.handlers, function forEachHandler(h) {+      if (h !== null) {+        fn(h);+      }+    });+  } } -/**- * Add a new interceptor to the stack- *- * @param {Function} fulfilled The function to handle `then` for a `Promise`- * @param {Function} rejected The function to handle `reject` for a `Promise`- *- * @return {Number} An ID used to remove interceptor later- */-InterceptorManager.prototype.use = function use(fulfilled, rejected, options) {-  this.handlers.push({-    fulfilled: fulfilled,-    rejected: rejected,-    synchronous: options ? options.synchronous : false,-    runWhen: options ? options.runWhen : null-  });-  return this.handlers.length - 1;-};--/**- * Remove an interceptor from the stack- *- * @param {Number} id The ID that was returned by `use`- */-InterceptorManager.prototype.eject = function eject(id) {-  if (this.handlers[id]) {-    this.handlers[id] = null;-  }-};--/**- * Clear all interceptors from the stack- */-InterceptorManager.prototype.clear = function clear() {-  if (this.handlers) {-    this.handlers = [];-  }-};--/**- * Iterate over all the registered interceptors- *- * This method is particularly useful for skipping over any- * interceptors that may have become `null` calling `eject`.- *- * @param {Function} fn The function to call for each interceptor- */-InterceptorManager.prototype.forEach = function forEach(fn) {-  utils.forEach(this.handlers, function forEachHandler(h) {-    if (h !== null) {-      fn(h);-    }-  });-};--module.exports = InterceptorManager;+export default InterceptorManager;
lib/core/buildFullPath.js +6 lines
--- +++ @@ -2,4 +2,4 @@ -var isAbsoluteURL = require('../helpers/isAbsoluteURL');-var combineURLs = require('../helpers/combineURLs');+import isAbsoluteURL from '../helpers/isAbsoluteURL.js';+import combineURLs from '../helpers/combineURLs.js'; @@ -12,3 +12,2 @@  * @param {string} requestedURL Absolute or relative URL to combine- * @param {boolean} allowAbsoluteUrls Set to true to allow absolute URLs  *@@ -16,5 +15,5 @@  */-module.exports = function buildFullPath(baseURL, requestedURL, allowAbsoluteUrls) {-  var isRelativeURL = !isAbsoluteURL(requestedURL);-  if (baseURL && (isRelativeURL || allowAbsoluteUrls === false)) {+export default function buildFullPath(baseURL, requestedURL, allowAbsoluteUrls) {+  let isRelativeUrl = !isAbsoluteURL(requestedURL);+  if (baseURL && (isRelativeUrl || allowAbsoluteUrls === false)) {     return combineURLs(baseURL, requestedURL);@@ -22,2 +21,2 @@   return requestedURL;-};+}
lib/core/dispatchRequest.js +58 lines
--- +++ @@ -2,9 +2,8 @@ -var utils = require('./../utils');-var transformData = require('./transformData');-var isCancel = require('../cancel/isCancel');-var defaults = require('../defaults');-var CanceledError = require('../cancel/CanceledError');-var normalizeHeaderName = require('../helpers/normalizeHeaderName');-var sanitizeHeaderValue = require('../helpers/sanitizeHeaderValue');+import transformData from './transformData.js';+import isCancel from '../cancel/isCancel.js';+import defaults from '../defaults/index.js';+import CanceledError from '../cancel/CanceledError.js';+import AxiosHeaders from '../core/AxiosHeaders.js';+import adapters from '../adapters/adapters.js'; @@ -12,2 +11,6 @@  * Throws a `CanceledError` if cancellation has been requested.+ *+ * @param {Object} config The config that is to be used for the request+ *+ * @returns {void}  */@@ -19,3 +22,3 @@   if (config.signal && config.signal.aborted) {-    throw new CanceledError();+    throw new CanceledError(null, config);   }@@ -27,78 +30,60 @@  * @param {object} config The config that is to be used for the request+ *  * @returns {Promise} The Promise to be fulfilled  */-module.exports = function dispatchRequest(config) {+export default function dispatchRequest(config) {   throwIfCancellationRequested(config); -  // Ensure headers exist-  config.headers = config.headers || {};+  config.headers = AxiosHeaders.from(config.headers);    // Transform request data-  config.data = transformData.call(-    config,-    config.data,-    config.headers,-    null,-    config.transformRequest-  );+  config.data = transformData.call(config, config.transformRequest); -  normalizeHeaderName(config.headers, 'Accept');-  normalizeHeaderName(config.headers, 'Content-Type');+  if (['post', 'put', 'patch'].indexOf(config.method) !== -1) {+    config.headers.setContentType('application/x-www-form-urlencoded', false);+  } -  // Flatten headers-  var commonHeaders = utils.hasOwnProperty(config.headers, 'common') && config.headers.common-    ? config.headers.common-    : {};-  var methodHeaders = config.method &&-    utils.hasOwnProperty(config.headers, config.method) &&-    config.headers[config.method]-    ? config.headers[config.method]-    : {};+  const adapter = adapters.getAdapter(config.adapter || defaults.adapter, config); -  config.headers = utils.merge(commonHeaders, methodHeaders, config.headers);+  return adapter(config).then(+    function onAdapterResolution(response) {+      throwIfCancellationRequested(config); -  utils.forEach(-    ['delete', 'get', 'head', 'post', 'put', 'patch', 'common'],-    function cleanHeaderConfig(method) {-      delete config.headers[method];+      // Expose the current response on config so that transformResponse can+      // attach it to any AxiosError it throws (e.g. on JSON parse failure).+      // We clean it up afterwards to avoid polluting the config object.+      config.response = response;+      try {+        response.data = transformData.call(config, config.transformResponse, response);+      } finally {+        delete config.response;+      }++      response.headers = AxiosHeaders.from(response.headers);++      return response;+    },+    function onAdapterRejection(reason) {+      if (!isCancel(reason)) {+        throwIfCancellationRequested(config);++        // Transform response data+        if (reason && reason.response) {+          config.response = reason.response;+          try {+            reason.response.data = transformData.call(+              config,+              config.transformResponse,+              reason.response+            );+          } finally {+            delete config.response;+          }+          reason.response.headers = AxiosHeaders.from(reason.response.headers);+        }+      }++      return Promise.reject(reason);     }   );--  utils.forEach(config.headers, function sanitizeHeaderConfigValue(value, header) {-    config.headers[header] = sanitizeHeaderValue(value);-  });--  var adapter = config.adapter || defaults.adapter;--  return adapter(config).then(function onAdapterResolution(response) {-    throwIfCancellationRequested(config);--    // Transform response data-    response.data = transformData.call(-      config,-      response.data,-      response.headers,-      response.status,-      config.transformResponse-    );--    return response;-  }, function onAdapterRejection(reason) {-    if (!isCancel(reason)) {-      throwIfCancellationRequested(config);--      // Transform response data-      if (reason && reason.response) {-        reason.response.data = transformData.call(-          config,-          reason.response.data,-          reason.response.headers,-          reason.response.status,-          config.transformResponse-        );-      }-    }--    return Promise.reject(reason);-  });-};+}
lib/core/mergeConfig.js +79 lines
--- +++ @@ -2,3 +2,6 @@ -var utils = require('../utils');+import utils from '../utils.js';+import AxiosHeaders from './AxiosHeaders.js';++const headersToObject = (thing) => (thing instanceof AxiosHeaders ? { ...thing } : thing); @@ -10,24 +13,27 @@  * @param {Object} config2+ *  * @returns {Object} New object resulting from merging config2 to config1  */-module.exports = function mergeConfig(config1, config2) {+export default function mergeConfig(config1, config2) {   // eslint-disable-next-line no-param-reassign   config2 = config2 || {};-  // Use a null-prototype object so a polluted Object.prototype cannot leak-  // values (e.g. transport, adapter) into the returned config via inheritance.-  var config = Object.create(null); -  function getOwn(source, prop) {-    return utils.hasOwnProperty(source, prop) ? source[prop] : undefined;-  }+  // Use a null-prototype object so that downstream reads such as `config.auth`+  // or `config.baseURL` cannot inherit polluted values from Object.prototype.+  // `hasOwnProperty` is restored as a non-enumerable own slot to preserve+  // ergonomics for user code that relies on it.+  const config = Object.create(null);+  Object.defineProperty(config, 'hasOwnProperty', {+    // Null-proto descriptor so a polluted Object.prototype.get cannot turn+    // this data descriptor into an accessor descriptor on the way in.+    __proto__: null,+    value: Object.prototype.hasOwnProperty,+    enumerable: false,+    writable: true,+    configurable: true,+  }); -  function hasOwn(source, prop) {-    return utils.hasOwnProperty(source, prop);-  }--  function getMergedValue(target, source) {+  function getMergedValue(target, source, prop, caseless) {     if (utils.isPlainObject(target) && utils.isPlainObject(source)) {-      return utils.merge(target, source);-    } else if (utils.isEmptyObject(source)) {-      return utils.merge({}, target);+      return utils.merge.call({ caseless }, target, source);     } else if (utils.isPlainObject(source)) {@@ -40,8 +46,7 @@ -  // eslint-disable-next-line consistent-return-  function mergeDeepProperties(prop) {-    if (hasOwn(config2, prop) && !utils.isUndefined(config2[prop])) {-      return getMergedValue(getOwn(config1, prop), config2[prop]);-    } else if (hasOwn(config1, prop) && !utils.isUndefined(config1[prop])) {-      return getMergedValue(undefined, config1[prop]);+  function mergeDeepProperties(a, b, prop, caseless) {+    if (!utils.isUndefined(b)) {+      return getMergedValue(a, b, prop, caseless);+    } else if (!utils.isUndefined(a)) {+      return getMergedValue(undefined, a, prop, caseless);     }@@ -50,5 +55,5 @@   // eslint-disable-next-line consistent-return-  function valueFromConfig2(prop) {-    if (hasOwn(config2, prop) && !utils.isUndefined(config2[prop])) {-      return getMergedValue(undefined, config2[prop]);+  function valueFromConfig2(a, b) {+    if (!utils.isUndefined(b)) {+      return getMergedValue(undefined, b);     }@@ -57,7 +62,7 @@   // eslint-disable-next-line consistent-return-  function defaultToConfig2(prop) {-    if (hasOwn(config2, prop) && !utils.isUndefined(config2[prop])) {-      return getMergedValue(undefined, config2[prop]);-    } else if (hasOwn(config1, prop) && !utils.isUndefined(config1[prop])) {-      return getMergedValue(undefined, config1[prop]);+  function defaultToConfig2(a, b) {+    if (!utils.isUndefined(b)) {+      return getMergedValue(undefined, b);+    } else if (!utils.isUndefined(a)) {+      return getMergedValue(undefined, a);     }@@ -66,7 +71,7 @@   // eslint-disable-next-line consistent-return-  function mergeDirectKeys(prop) {-    if (hasOwn(config2, prop)) {-      return getMergedValue(getOwn(config1, prop), config2[prop]);-    } else if (hasOwn(config1, prop)) {-      return getMergedValue(undefined, config1[prop]);+  function mergeDirectKeys(a, b, prop) {+    if (utils.hasOwnProp(config2, prop)) {+      return getMergedValue(a, b);+    } else if (utils.hasOwnProp(config1, prop)) {+      return getMergedValue(undefined, a);     }@@ -74,40 +79,42 @@ -  var mergeMap = {-    'url': valueFromConfig2,-    'method': valueFromConfig2,-    'data': valueFromConfig2,-    'baseURL': defaultToConfig2,-    'transformRequest': defaultToConfig2,-    'transformResponse': defaultToConfig2,-    'paramsSerializer': defaultToConfig2,-    'timeout': defaultToConfig2,-    'timeoutMessage': defaultToConfig2,-    'withCredentials': defaultToConfig2,-    'withXSRFToken': defaultToConfig2,-    'adapter': defaultToConfig2,-    'responseType': defaultToConfig2,-    'xsrfCookieName': defaultToConfig2,-    'xsrfHeaderName': defaultToConfig2,-    'onUploadProgress': defaultToConfig2,-    'onDownloadProgress': defaultToConfig2,-    'decompress': defaultToConfig2,-    'maxContentLength': defaultToConfig2,-    'maxBodyLength': defaultToConfig2,-    'beforeRedirect': defaultToConfig2,-    'transport': defaultToConfig2,-    'httpAgent': defaultToConfig2,-    'httpsAgent': defaultToConfig2,-    'cancelToken': defaultToConfig2,-    'socketPath': defaultToConfig2,-    'allowedSocketPaths': defaultToConfig2,-    'responseEncoding': defaultToConfig2,-    'validateStatus': mergeDirectKeys+  const mergeMap = {+    url: valueFromConfig2,+    method: valueFromConfig2,+    data: valueFromConfig2,+    baseURL: defaultToConfig2,+    transformRequest: defaultToConfig2,+    transformResponse: defaultToConfig2,+    paramsSerializer: defaultToConfig2,+    timeout: defaultToConfig2,+    timeoutMessage: defaultToConfig2,+    withCredentials: defaultToConfig2,+    withXSRFToken: defaultToConfig2,+    adapter: defaultToConfig2,+    responseType: defaultToConfig2,+    xsrfCookieName: defaultToConfig2,+    xsrfHeaderName: defaultToConfig2,+    onUploadProgress: defaultToConfig2,+    onDownloadProgress: defaultToConfig2,+    decompress: defaultToConfig2,+    maxContentLength: defaultToConfig2,+    maxBodyLength: defaultToConfig2,+    beforeRedirect: defaultToConfig2,+    transport: defaultToConfig2,+    httpAgent: defaultToConfig2,+    httpsAgent: defaultToConfig2,+    cancelToken: defaultToConfig2,+    socketPath: defaultToConfig2,+    allowedSocketPaths: defaultToConfig2,+    responseEncoding: defaultToConfig2,+    validateStatus: mergeDirectKeys,+    headers: (a, b, prop) =>+      mergeDeepProperties(headersToObject(a), headersToObject(b), prop, true),   }; -  utils.forEach(Object.keys(config1).concat(Object.keys(config2)), function computeConfigValue(prop) {-    if (prop === '__proto__' || prop === 'constructor' || prop === 'prototype') {-      return;-    }-    var merge = utils.hasOwnProperty(mergeMap, prop) ? mergeMap[prop] : mergeDeepProperties;-    var configValue = merge(prop);+  utils.forEach(Object.keys({ ...config1, ...config2 }), function computeConfigValue(prop) {+    if (prop === '__proto__' || prop === 'constructor' || prop === 'prototype') return;+    const merge = utils.hasOwnProp(mergeMap, prop) ? mergeMap[prop] : mergeDeepProperties;+    const a = utils.hasOwnProp(config1, prop) ? config1[prop] : undefined;+    const b = utils.hasOwnProp(config2, prop) ? config2[prop] : undefined;+    const configValue = merge(a, b, prop);     (utils.isUndefined(configValue) && merge !== mergeDirectKeys) || (config[prop] = configValue);@@ -116,2 +123,2 @@   return config;-};+}
lib/core/settle.js +7 lines
--- +++ @@ -2,3 +2,3 @@ -var AxiosError = require('./AxiosError');+import AxiosError from './AxiosError.js'; @@ -10,5 +10,7 @@  * @param {object} response The response.+ *+ * @returns {object} The response.  */-module.exports = function settle(resolve, reject, response) {-  var validateStatus = response.config.validateStatus;+export default function settle(resolve, reject, response) {+  const validateStatus = response.config.validateStatus;   if (!response.status || !validateStatus || validateStatus(response.status)) {@@ -18,3 +20,3 @@       'Request failed with status code ' + response.status,-      [AxiosError.ERR_BAD_REQUEST, AxiosError.ERR_BAD_RESPONSE][Math.floor(response.status / 100) - 4],+      response.status >= 400 && response.status < 500 ? AxiosError.ERR_BAD_REQUEST : AxiosError.ERR_BAD_RESPONSE,       response.config,@@ -24,2 +26,2 @@   }-};+}
babel-core npm
6.26.3 8y ago incident on record
DELETION ×6BURST ×36
latest 6.26.3 versions 257 maintainers 3
6.20.0
6.21.0
6.22.0
6.22.1
6.23.0
6.23.1
6.24.0
6.24.1
6.25.0
6.26.0
6.26.2
6.26.3
DELETION
5.6.0 published then removed
high · registry-verified · 2015-06-20 · 10y ago
DELETION
5.6.8 published then removed
high · registry-verified · 2015-06-25 · 10y ago
DELETION
5.6.9 published then removed
high · registry-verified · 2015-06-25 · 10y ago
DELETION
5.6.17 published then removed
high · registry-verified · 2015-07-09 · 10y ago
DELETION
5.8.4 published then removed
high · registry-verified · 2015-07-24 · 10y ago
DELETION
6.18.1 published then removed
high · registry-verified · 2016-11-01 · 9y ago
BURST
2 releases in 9m: 4.2.0, 4.2.1
info · registry-verified · 2015-02-18 · 11y ago
BURST
2 releases in 8m: 4.4.1, 4.4.2
info · registry-verified · 2015-02-21 · 11y ago
BURST
2 releases in 36m: 4.4.4, 4.4.5
info · registry-verified · 2015-02-22 · 11y ago
BURST
2 releases in 54m: 4.5.0, 4.5.1
info · registry-verified · 2015-02-25 · 11y ago
BURST
3 releases in 18m: 4.5.2, 4.5.3, 4.5.4
info · registry-verified · 2015-02-25 · 11y ago
BURST
2 releases in 53m: 4.7.0, 4.7.1
info · registry-verified · 2015-03-06 · 11y ago
BURST
3 releases in 40m: 4.7.10, 4.7.11, 4.7.12
info · registry-verified · 2015-03-13 · 11y ago
BURST
2 releases in 5m: 4.7.14, 4.7.15
info · registry-verified · 2015-03-18 · 11y ago
BURST
2 releases in 15m: 5.0.0, 5.0.1
info · registry-verified · 2015-04-02 · 11y ago
BURST
2 releases in 6m: 5.0.3, 5.0.4
info · registry-verified · 2015-04-03 · 11y ago
BURST
2 releases in 31m: 5.0.5, 5.0.6
info · registry-verified · 2015-04-03 · 11y ago
BURST
2 releases in 41m: 5.0.11, 5.0.12
info · registry-verified · 2015-04-08 · 11y ago
BURST
2 releases in 8m: 5.0.13, 5.1.0
info · registry-verified · 2015-04-13 · 11y ago
BURST
2 releases in 39m: 5.1.1, 5.1.2
info · registry-verified · 2015-04-13 · 11y ago
BURST
2 releases in 12m: 5.1.3, 5.1.4
info · registry-verified · 2015-04-13 · 11y ago
BURST
2 releases in 32m: 5.1.6, 5.1.7
info · registry-verified · 2015-04-13 · 11y ago
BURST
2 releases in 11m: 5.1.12, 5.1.13
info · registry-verified · 2015-04-25 · 11y ago
BURST
2 releases in 13m: 5.2.1, 5.2.2
info · registry-verified · 2015-04-30 · 11y ago
BURST
2 releases in 12m: 5.2.4, 5.2.5
info · registry-verified · 2015-05-01 · 11y ago
BURST
2 releases in 9m: 5.2.10, 5.2.11
info · registry-verified · 2015-05-04 · 11y ago
BURST
2 releases in 29m: 5.2.14, 5.2.15
info · registry-verified · 2015-05-05 · 11y ago
BURST
2 releases in 35m: 5.4.1, 5.4.2
info · registry-verified · 2015-05-15 · 11y ago
BURST
2 releases in 13m: 5.4.6, 5.4.7
info · registry-verified · 2015-05-21 · 11y ago
BURST
2 releases in 17m: 5.5.2, 5.5.3
info · registry-verified · 2015-06-05 · 10y ago
BURST
2 releases in 29m: 5.6.0, 5.6.1
info · registry-verified · 2015-06-20 · 10y ago
BURST
2 releases in 24m: 5.6.8, 5.6.9
info · registry-verified · 2015-06-25 · 10y ago
BURST
3 releases in 22m: 5.8.1, 5.8.2, 5.8.3
info · registry-verified · 2015-07-21 · 10y ago
BURST
2 releases in 28m: 5.8.4, 5.8.5
info · registry-verified · 2015-07-24 · 10y ago
BURST
2 releases in 16m: 5.8.6, 5.8.8
info · registry-verified · 2015-07-26 · 10y ago
BURST
2 releases in 18m: 5.8.31, 5.8.32
info · registry-verified · 2015-10-28 · 10y ago
BURST
3 releases in 15m: 6.0.0, 6.0.1, 6.0.2
info · registry-verified · 2015-10-29 · 10y ago
BURST
2 releases in 21m: 5.8.34, 6.1.5
info · registry-verified · 2015-11-12 · 10y ago
BURST
6 releases in 26m: 6.1.6, 6.1.7, 6.1.8, 6.1.9, 6.1.10, 6.1.11
info · registry-verified · 2015-11-12 · 10y ago
BURST
3 releases in 21m: 6.1.13, 6.1.14, 6.1.15
info · registry-verified · 2015-11-12 · 10y ago
BURST
4 releases in 45m: 6.1.16, 6.1.17, 6.1.18, 6.1.19
info · registry-verified · 2015-11-12 · 10y ago
BURST
2 releases in 14m: 6.18.1, 6.18.2
info · registry-verified · 2016-11-01 · 9y ago
release diff 6.26.2 → 6.26.3
+0 added · -0 removed · ~2 modified
lib/transformation/file/merge-map.js +58 lines
--- +++ @@ -35,7 +35,2 @@   var output = buildMappingData(map);--  if (output.sources.length !== 1) {-    throw new Error("Assertion failure - expected a single output file");-  }-  var defaultSource = output.sources[0]; @@ -62,59 +57,62 @@ -  var insertedMappings = new _map2.default();--  eachInputGeneratedRange(input, function (generated, original, source) {-    eachOverlappingGeneratedOutputRange(defaultSource, generated, function (item) {-      var key = makeMappingKey(item);-      if (insertedMappings.has(key)) return;-      insertedMappings.set(key, item);--      mergedGenerator.addMapping({-        source: source.path,-        original: {-          line: original.line,-          column: original.columnStart-        },-        generated: {-          line: item.line,-          column: item.columnStart-        },-        name: original.name+  if (output.sources.length === 1) {+    var defaultSource = output.sources[0];+    var insertedMappings = new _map2.default();++    eachInputGeneratedRange(input, function (generated, original, source) {+      eachOverlappingGeneratedOutputRange(defaultSource, generated, function (item) {+        var key = makeMappingKey(item);+        if (insertedMappings.has(key)) return;+        insertedMappings.set(key, item);++        mergedGenerator.addMapping({+          source: source.path,+          original: {+            line: original.line,+            column: original.columnStart+          },+          generated: {+            line: item.line,+            column: item.columnStart+          },+          name: original.name+        });       });     });-  });--  for (var _iterator2 = insertedMappings.values(), _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : (0, _getIterator3.default)(_iterator2);;) {-    var _ref3;--    if (_isArray2) {-      if (_i2 >= _iterator2.length) break;-      _ref3 = _iterator2[_i2++];-    } else {-      _i2 = _iterator2.next();-      if (_i2.done) break;-      _ref3 = _i2.value;-    }--    var item = _ref3;--    if (item.columnEnd === Infinity) {-      continue;-    }--    var clearItem = {-      line: item.line,-      columnStart: item.columnEnd-    };--    var key = makeMappingKey(clearItem);-    if (insertedMappings.has(key)) {-      continue;-    }--    mergedGenerator.addMapping({-      generated: {-        line: clearItem.line,-        column: clearItem.columnStart-      }-    });++    for (var _iterator2 = insertedMappings.values(), _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : (0, _getIterator3.default)(_iterator2);;) {+      var _ref3;++      if (_isArray2) {+        if (_i2 >= _iterator2.length) break;+        _ref3 = _iterator2[_i2++];+      } else {+        _i2 = _iterator2.next();+        if (_i2.done) break;+        _ref3 = _i2.value;+      }++      var item = _ref3;++      if (item.columnEnd === Infinity) {+        continue;+      }++      var clearItem = {+        line: item.line,+        columnStart: item.columnEnd+      };++      var key = makeMappingKey(clearItem);+      if (insertedMappings.has(key)) {+        continue;+      }++      mergedGenerator.addMapping({+        generated: {+          line: clearItem.line,+          column: clearItem.columnStart+        }+      });+    }   }
package.json +1 lines
--- +++ @@ -2,3 +2,3 @@   "name": "babel-core",-  "version": "6.26.2",+  "version": "6.26.3",   "description": "Babel compiler core.",
babel-eslint npm
10.1.0 6y ago incident on record
DELETIONBURST ×12
latest 10.1.0 versions 135 maintainers 6
8.2.1
8.2.2
8.2.3
8.2.4
8.2.5
8.2.6
9.0.0
10.0.0
10.0.1
10.0.2
10.0.3
10.1.0
DELETION
3.1.2 published then removed
high · registry-verified · 2015-05-14 · 11y ago
BURST
3 releases in 21m: 1.0.1, 1.0.2, 1.0.3
info · registry-verified · 2015-02-27 · 11y ago
BURST
3 releases in 18m: 1.0.7, 1.0.8, 1.0.9
info · registry-verified · 2015-02-28 · 11y ago
BURST
2 releases in 34m: 1.0.10, 1.0.11
info · registry-verified · 2015-02-28 · 11y ago
BURST
2 releases in 54m: 3.0.0, 3.0.1
info · registry-verified · 2015-04-14 · 11y ago
BURST
2 releases in 32m: 3.1.12, 3.1.13
info · registry-verified · 2015-06-05 · 10y ago
BURST
2 releases in 15m: 3.1.27, 4.0.0
info · registry-verified · 2015-07-25 · 10y ago
BURST
5 releases in 38m: 4.0.1, 4.0.2, 3.1.28, 4.0.3, 3.1.29
info · registry-verified · 2015-07-27 · 10y ago
BURST
3 releases in 16m: 4.0.4, 3.1.30, 4.0.5
info · registry-verified · 2015-07-27 · 10y ago
BURST
2 releases in 16m: 4.0.9, 4.0.10
info · registry-verified · 2015-08-17 · 10y ago
BURST
2 releases in 6m: 5.0.1, 6.0.0
info · registry-verified · 2016-03-26 · 10y ago
BURST
2 releases in 1m: 5.0.3, 6.0.1
info · registry-verified · 2016-03-31 · 10y ago
BURST
2 releases in 3m: 6.0.2, 5.0.4
info · registry-verified · 2016-03-31 · 10y ago
release diff 10.0.3 → 10.1.0
+0 added · -0 removed · ~3 modified
lib/analyze-scope.js +4 lines
--- +++ @@ -149,2 +149,6 @@     }+  }++  EnumDeclaration(node) {+    this._createScopeVariable(node, node.id);   }
lib/parse.js +1 lines
--- +++ @@ -21,3 +21,3 @@     plugins: [-      ["flow", { all: true }],+      ["flow", { all: true, enums: true }],       "jsx",
package.json +4 lines
--- +++ @@ -2,3 +2,3 @@   "name": "babel-eslint",-  "version": "10.0.3",+  "version": "10.1.0",   "description": "Custom parser for ESLint",@@ -14,5 +14,5 @@     "@babel/code-frame": "^7.0.0",-    "@babel/parser": "^7.0.0",-    "@babel/traverse": "^7.0.0",-    "@babel/types": "^7.0.0",+    "@babel/parser": "^7.7.0",+    "@babel/traverse": "^7.7.0",+    "@babel/types": "^7.7.0",     "eslint-visitor-keys": "^1.0.0",
chalk npm
5.6.2 8mo ago incident on record
DELETIONBURST ×2
latest 5.6.2 versions 43 maintainers 1
5.0.1
5.1.0
5.1.1
5.1.2
5.2.0
5.3.0
5.4.0
5.4.1
5.5.0
5.6.0
5.6.1
5.6.2
DELETION
5.6.1 published then removed
high · registry-verified · 2025-09-08 · 8mo ago
BURST
2 releases in 45m: 1.1.2, 1.1.3
info · registry-verified · 2016-03-28 · 10y ago
BURST
2 releases in 52m: 2.2.2, 2.3.0
info · registry-verified · 2017-10-24 · 8y ago
release diff 5.6.0 → 5.6.2
+0 added · -0 removed · ~1 modified
package.json +1 lines
--- +++ @@ -2,3 +2,3 @@ 	"name": "chalk",-	"version": "5.6.0",+	"version": "5.6.2", 	"description": "Terminal string styling done right",
eslint npm
10.4.1 1d ago incident on record
critical-tier DELETIONBURST ×4
latest 10.4.1 versions 420 maintainers 2 critical-tier (snapshotted)
10.0.0
9.39.3
10.0.1
10.0.2
9.39.4
10.0.3
10.1.0
10.2.0
10.2.1
10.3.0
10.4.0
10.4.1
DELETION
0.7.0 published then removed
high · registry-verified · 2014-05-23 · 12y ago
BURST
2 releases in 10m: 0.6.0, 0.6.1
info · registry-verified · 2014-05-17 · 12y ago
BURST
2 releases in 4m: 0.7.0, 0.6.2
info · registry-verified · 2014-05-23 · 12y ago
BURST
2 releases in 36m: 2.5.2, 2.5.3
info · registry-verified · 2016-03-28 · 10y ago
BURST
2 releases in 41m: 3.2.1, 3.2.2
info · registry-verified · 2016-08-01 · 9y ago
release diff 10.4.0 → 10.4.1
+0 added · -0 removed · ~7 modified
bin/eslint.js +28 lines
--- +++ @@ -64,2 +64,28 @@ /**+ * Spawns an external command and propagates its exit status.+ * @param {string} command The command to run.+ * @param {string[]} args The command arguments.+ * @throws {Error} If the command cannot be spawned.+ * @returns {void}+ */+function spawnExternalCommand(command, args) {+	const spawn = require("cross-spawn");+	const result = spawn.sync(command, args, {+		encoding: "utf8",+		stdio: "inherit",+	});++	if (result.error) {+		throw result.error;+	}++	if (result.signal) {+		process.kill(process.pid, result.signal);+		return;+	}++	process.exitCode = result.status ?? 0;+}++/**  * Get the error message of a given value.@@ -148,8 +174,3 @@ -		const spawn = require("cross-spawn");--		spawn.sync("npm", ["init", "@eslint/config@latest"], {-			encoding: "utf8",-			stdio: "inherit",-		});+		spawnExternalCommand("npm", ["init", "@eslint/config@latest"]); 		return;@@ -163,8 +184,3 @@ -		const spawn = require("cross-spawn");--		spawn.sync("npx", ["@eslint/mcp@latest"], {-			encoding: "utf8",-			stdio: "inherit",-		});+		spawnExternalCommand("npx", ["@eslint/mcp@latest"]); 		return;
lib/linter/code-path-analysis/code-path-analyzer.js +2 lines
--- +++ @@ -619,3 +619,3 @@ 			if (isIdentifierReference(node)) {-				state.makeFirstThrowablePathInTryBlock();+				state.makeFirstThrowablePathInTryOrCatchBlock(); 				dontForward = true;@@ -628,3 +628,3 @@ 		case "NewExpression":-			state.makeFirstThrowablePathInTryBlock();+			state.makeFirstThrowablePathInTryOrCatchBlock(); 			break;
lib/linter/code-path-analysis/code-path-state.js +12 lines
--- +++ @@ -1774,7 +1774,8 @@ 	/**-	 * Makes a code path segment from the first throwable node to the `catch`-	 * block or the `finally` block.-	 * @returns {void}-	 */-	makeFirstThrowablePathInTryBlock() {+	 * Makes a code path segment from the first throwable node in a `try` block to the `catch`+	 * block or the `finally` block or from the first throwable node in a `catch` block+	 * to the `finally` block.+	 * @returns {void}+	 */+	makeFirstThrowablePathInTryOrCatchBlock() { 		const forkContext = this.forkContext;@@ -1787,6 +1788,9 @@ +		if (context === this || !context.thrownForkContext.empty) {+			return;+		}+ 		if (-			context === this ||-			context.position !== "try" ||-			!context.thrownForkContext.empty+			context.position !== "try" &&+			(context.position !== "catch" || !context.hasFinalizer) 		) {
lib/rules/prefer-arrow-callback.js +18 lines
--- +++ @@ -325,2 +325,20 @@ +							const functionToken = sourceCode.getFirstToken(+								node,+								node.async ? 1 : 0,+							);+							const leftParenToken = sourceCode.getTokenAfter(+								functionToken,+								astUtils.isOpeningParenToken,+							);++							if (node.async) {+								if (+									functionToken.loc.end.line <+									leftParenToken.loc.start.line+								) {+									return;+								}+							}+ 							// Remove `.bind(this)` if exists.@@ -377,10 +395,2 @@ 							// Convert the function expression to an arrow function.-							const functionToken = sourceCode.getFirstToken(-								node,-								node.async ? 1 : 0,-							);-							const leftParenToken = sourceCode.getTokenAfter(-								functionToken,-								astUtils.isOpeningParenToken,-							); 							const tokenBeforeBody = sourceCode.getTokenBefore(
lib/types/index.d.ts +23 lines
--- +++ @@ -725,2 +725,18 @@ +	interface CodePathSegmentTraversalController {+		skip(): void;+		break(): void;+	}++	type CodePathSegmentTraversalCallback = (+		this: CodePath,+		segment: CodePathSegment,+		controller: CodePathSegmentTraversalController,+	) => void;++	interface CodePathTraversalOptions {+		first?: CodePathSegment | undefined;+		last?: CodePathSegment | undefined;+	}+ 	interface CodePath {@@ -734,2 +750,7 @@ 		childCodePaths: CodePath[];+		traverseSegments(callback: CodePathSegmentTraversalCallback): void;+		traverseSegments(+			options: CodePathTraversalOptions,+			callback: CodePathSegmentTraversalCallback,+		): void; 	}@@ -740,2 +761,4 @@ 		prevSegments: CodePathSegment[];+		allNextSegments: CodePathSegment[];+		allPrevSegments: CodePathSegment[]; 		reachable: boolean;
package.json +7 lines
--- +++ @@ -2,3 +2,3 @@   "name": "eslint",-  "version": "10.4.0",+  "version": "10.4.1",   "author": "Nicholas C. Zakas <[email protected]>",@@ -126,3 +126,3 @@     "@eslint/core": "^1.2.1",-    "@eslint/plugin-kit": "^0.7.1",+    "@eslint/plugin-kit": "^0.7.2",     "@humanfs/node": "^0.16.6",@@ -230,2 +230,7 @@     "node": "^20.19.0 || ^22.13.0 || >=24"+  },+  "overrides": {+    "@arethetypeswrong/core": {+      "fflate": "0.8.2"+    }   }
eslint-config-prettier npm
10.1.8 10mo ago incident on record
DELETION ×4BURST ×7
latest 10.1.8 versions 85 maintainers 3
10.1.1
10.1.2
10.1.3
10.1.4
10.1.5
9.1.1
8.10.1
10.1.6
10.1.7
10.1.8
8.10.2
9.1.2
DELETION
9.1.1 published then removed
high · registry-verified · 2025-07-18 · 10mo ago
DELETION
8.10.1 published then removed
high · registry-verified · 2025-07-18 · 10mo ago
DELETION
10.1.6 published then removed
high · registry-verified · 2025-07-18 · 10mo ago
DELETION
10.1.7 published then removed
high · registry-verified · 2025-07-18 · 10mo ago
BURST
2 releases in 5m: 1.0.0, 1.0.1
info · registry-verified · 2017-01-29 · 9y ago
BURST
2 releases in 28m: 3.0.0, 3.0.1
info · registry-verified · 2018-08-13 · 7y ago
BURST
2 releases in 2m: 10.0.0, 10.0.1
info · registry-verified · 2025-01-13 · 1y ago
BURST
2 releases in 22m: 10.0.3, 10.1.0
info · registry-verified · 2025-03-07 · 1y ago
BURST
2 releases in 24m: 10.1.4, 10.1.5
info · registry-verified · 2025-05-09 · 1y ago
BURST
4 releases in 22m: 9.1.1, 8.10.1, 10.1.6, 10.1.7
info · registry-verified · 2025-07-18 · 10mo ago
BURST
3 releases in 39m: 10.1.8, 8.10.2, 9.1.2
info · registry-verified · 2025-07-18 · 10mo ago
release diff 8.10.2 → 9.1.2
+0 added · -0 removed · ~4 modified
bin/cli.js +36 lines · 1 flagged
--- +++ @@ -10,5 +10,17 @@ // with no local eslint-config-prettier installation.-const { ESLint } = require(require.resolve("eslint", {-  paths: [process.cwd(), ...require.resolve.paths("eslint")],-}));+const localRequire = (request) =>+  require(+    require.resolve(request, {+      paths: [process.cwd(), ...require.resolve.paths("eslint")],+    })+  );++let experimentalApi = {};+try {+  experimentalApi = localRequire("eslint/use-at-your-own-risk");+  // eslint-disable-next-line unicorn/prefer-optional-catch-binding+} catch (_error) {}++const { ESLint, FlatESLint = experimentalApi.FlatESLint } =+  localRequire("eslint"); @@ -29,4 +41,23 @@   const eslint = new ESLint();--  Promise.all(args.map((file) => eslint.calculateConfigForFile(file)))+  const flatESLint = FlatESLint === undefined ? undefined : new FlatESLint();++  Promise.all(+    args.map((file) => {+      switch (process.env.ESLINT_USE_FLAT_CONFIG) {+        case "true": {+          return flatESLint.calculateConfigForFile(file);+        }+        case "false": {+          return eslint.calculateConfigForFile(file);+        }+        default: {+          // This turns synchronous errors (such as `.calculateConfigForFile` not existing)+          // and turns them into promise rejections.+          return Promise.resolve()+            .then(() => flatESLint.calculateConfigForFile(file))+            .catch(() => eslint.calculateConfigForFile(file));+        }+      }+    })+  )     .then((configs) => {
bin/validators.js +23 lines
--- +++ @@ -50,2 +50,25 @@ +  "unicorn/template-indent"({ options }) {+    if (options.length === 0) {+      return false;+    }++    const { comments = [], tags = [] } = options[0] || {};++    return (+      Array.isArray(comments) &&+      Array.isArray(tags) &&+      !(+        comments.includes("GraphQL") ||+        comments.includes("HTML") ||+        tags.includes("css") ||+        tags.includes("graphql") ||+        tags.includes("gql") ||+        tags.includes("html") ||+        tags.includes("markdown") ||+        tags.includes("md")+      )+    );+  },+   "vue/html-self-closing"({ options }) {
index.js +105 lines
--- +++ @@ -3,2 +3,4 @@ const includeDeprecated = !process.env.ESLINT_CONFIG_PRETTIER_NO_DEPRECATED;++const specialRule = 0; @@ -7,78 +9,15 @@     // The following rules can be used in some cases. See the README for more-    // information. (These are marked with `0` instead of `"off"` so that a-    // script can distinguish them.)-    "curly": 0,-    "lines-around-comment": 0,-    "max-len": 0,-    "no-confusing-arrow": 0,-    "no-mixed-operators": 0,-    "no-tabs": 0,-    "no-unexpected-multiline": 0,-    "quotes": 0,-    "@typescript-eslint/lines-around-comment": 0,-    "@typescript-eslint/quotes": 0,-    "babel/quotes": 0,-    "vue/html-self-closing": 0,-    "vue/max-len": 0,+    // information. These are marked with `0` instead of `"off"` so that a+    // script can distinguish them. Note that there are a few more of these+    // in the deprecated section below.+    "curly": specialRule,+    "no-unexpected-multiline": specialRule,+    "@typescript-eslint/lines-around-comment": specialRule,+    "@typescript-eslint/quotes": specialRule,+    "babel/quotes": specialRule,+    "unicorn/template-indent": specialRule,+    "vue/html-self-closing": specialRule,+    "vue/max-len": specialRule,      // The rest are rules that you never need to enable when using Prettier.-    "array-bracket-newline": "off",-    "array-bracket-spacing": "off",-    "array-element-newline": "off",-    "arrow-parens": "off",-    "arrow-spacing": "off",-    "block-spacing": "off",-    "brace-style": "off",-    "comma-dangle": "off",-    "comma-spacing": "off",-    "comma-style": "off",-    "computed-property-spacing": "off",-    "dot-location": "off",-    "eol-last": "off",-    "func-call-spacing": "off",-    "function-call-argument-newline": "off",-    "function-paren-newline": "off",-    "generator-star-spacing": "off",-    "implicit-arrow-linebreak": "off",-    "indent": "off",-    "jsx-quotes": "off",-    "key-spacing": "off",-    "keyword-spacing": "off",-    "linebreak-style": "off",-    "max-statements-per-line": "off",-    "multiline-ternary": "off",-    "newline-per-chained-call": "off",-    "new-parens": "off",-    "no-extra-parens": "off",-    "no-extra-semi": "off",-    "no-floating-decimal": "off",-    "no-mixed-spaces-and-tabs": "off",-    "no-multi-spaces": "off",-    "no-multiple-empty-lines": "off",-    "no-trailing-spaces": "off",-    "no-whitespace-before-property": "off",-    "nonblock-statement-body-position": "off",-    "object-curly-newline": "off",-    "object-curly-spacing": "off",-    "object-property-newline": "off",-    "one-var-declaration-per-line": "off",-    "operator-linebreak": "off",-    "padded-blocks": "off",-    "quote-props": "off",-    "rest-spread-spacing": "off",-    "semi": "off",-    "semi-spacing": "off",-    "semi-style": "off",-    "space-before-blocks": "off",-    "space-before-function-paren": "off",-    "space-in-parens": "off",-    "space-infix-ops": "off",-    "space-unary-ops": "off",-    "switch-colon-spacing": "off",-    "template-curly-spacing": "off",-    "template-tag-spacing": "off",-    "unicode-bom": "off",-    "wrap-iife": "off",-    "wrap-regex": "off",-    "yield-star-spacing": "off",     "@babel/object-curly-spacing": "off",@@ -175,5 +114,28 @@     ...(includeDeprecated && {+      // Removed in version 0.10.0.+      // https://eslint.org/docs/latest/rules/space-unary-word-ops+      "space-unary-word-ops": "off",+       // Removed in version 1.0.0.-      // https://eslint.org/docs/latest/rules/generator-star+      // https://github.com/eslint/eslint/issues/1898       "generator-star": "off",+      "no-comma-dangle": "off",+      "no-reserved-keys": "off",+      "no-space-before-semi": "off",+      "no-wrap-func": "off",+      "space-after-function-name": "off",+      "space-before-function-parentheses": "off",+      "space-in-brackets": "off",++      // Removed in version 2.0.0.+      // https://github.com/eslint/eslint/issues/5032+      "no-arrow-condition": "off",+      "space-after-keywords": "off",+      "space-before-keywords": "off",+      "space-return-throw-case": "off",++      // Deprecated since version 3.3.0.+      // https://eslint.org/docs/rules/no-spaced-func+      "no-spaced-func": "off",+       // Deprecated since version 4.0.0.@@ -181,41 +143,70 @@       "indent-legacy": "off",-      // Removed in version 2.0.0.-      // https://eslint.org/docs/latest/rules/no-arrow-condition-      "no-arrow-condition": "off",-      // Removed in version 1.0.0.-      // https://eslint.org/docs/latest/rules/no-comma-dangle-      "no-comma-dangle": "off",-      // Removed in version 1.0.0.-      // https://eslint.org/docs/latest/rules/no-reserved-keys-      "no-reserved-keys": "off",-      // Removed in version 1.0.0.-      // https://eslint.org/docs/latest/rules/no-space-before-semi-      "no-space-before-semi": "off",-      // Deprecated since version 3.3.0.-      // https://eslint.org/docs/rules/no-spaced-func-      "no-spaced-func": "off",-      // Removed in version 1.0.0.-      // https://eslint.org/docs/latest/rules/no-wrap-func-      "no-wrap-func": "off",-      // Removed in version 1.0.0.-      // https://eslint.org/docs/latest/rules/space-after-function-name-      "space-after-function-name": "off",-      // Removed in version 2.0.0.-      // https://eslint.org/docs/latest/rules/space-after-keywords-      "space-after-keywords": "off",-      // Removed in version 1.0.0.-      // https://eslint.org/docs/latest/rules/space-before-function-parentheses-      "space-before-function-parentheses": "off",-      // Removed in version 2.0.0.-      // https://eslint.org/docs/latest/rules/space-before-keywords-      "space-before-keywords": "off",-      // Removed in version 1.0.0.-      // https://eslint.org/docs/latest/rules/space-in-brackets-      "space-in-brackets": "off",-      // Removed in version 2.0.0.-      // https://eslint.org/docs/latest/rules/space-return-throw-case-      "space-return-throw-case": "off",-      // Removed in version 0.10.0.-      // https://eslint.org/docs/latest/rules/space-unary-word-ops-      "space-unary-word-ops": "off",++      // Deprecated since version 8.53.0.+      // https://eslint.org/blog/2023/10/deprecating-formatting-rules/+      "array-bracket-newline": "off",+      "array-bracket-spacing": "off",+      "array-element-newline": "off",+      "arrow-parens": "off",+      "arrow-spacing": "off",+      "block-spacing": "off",+      "brace-style": "off",+      "comma-dangle": "off",+      "comma-spacing": "off",+      "comma-style": "off",+      "computed-property-spacing": "off",+      "dot-location": "off",+      "eol-last": "off",+      "func-call-spacing": "off",+      "function-call-argument-newline": "off",+      "function-paren-newline": "off",+      "generator-star-spacing": "off",+      "implicit-arrow-linebreak": "off",+      "indent": "off",+      "jsx-quotes": "off",+      "key-spacing": "off",+      "keyword-spacing": "off",+      "linebreak-style": "off",+      "lines-around-comment": specialRule,+      "max-len": specialRule,+      "max-statements-per-line": "off",+      "multiline-ternary": "off",+      "new-parens": "off",+      "newline-per-chained-call": "off",+      "no-confusing-arrow": specialRule,+      "no-extra-parens": "off",+      "no-extra-semi": "off",+      "no-floating-decimal": "off",+      "no-mixed-operators": specialRule,+      "no-mixed-spaces-and-tabs": "off",+      "no-multi-spaces": "off",+      "no-multiple-empty-lines": "off",+      "no-tabs": specialRule,+      "no-trailing-spaces": "off",+      "no-whitespace-before-property": "off",+      "nonblock-statement-body-position": "off",+      "object-curly-newline": "off",+      "object-curly-spacing": "off",+      "object-property-newline": "off",+      "one-var-declaration-per-line": "off",+      "operator-linebreak": "off",+      "padded-blocks": "off",+      "quote-props": "off",+      "quotes": specialRule,+      "rest-spread-spacing": "off",+      "semi": "off",+      "semi-spacing": "off",+      "semi-style": "off",+      "space-before-blocks": "off",+      "space-before-function-paren": "off",+      "space-in-parens": "off",+      "space-infix-ops": "off",+      "space-unary-ops": "off",+      "switch-colon-spacing": "off",+      "template-curly-spacing": "off",+      "template-tag-spacing": "off",+      "wrap-iife": "off",+      "wrap-regex": "off",+      "yield-star-spacing": "off",+       // Deprecated since version 7.0.0.
package.json +1 lines
--- +++ @@ -2,3 +2,3 @@   "name": "eslint-config-prettier",-  "version": "8.10.2",+  "version": "9.1.2",   "license": "MIT",
eslint-plugin-import npm
2.32.0 11mo ago incident on record
critical-tier DELETION ×4BURST ×6
latest 2.32.0 versions 132 maintainers 3 critical-tier (snapshotted)
2.27.1
2.27.2
2.27.3
2.27.4
2.27.5
2.28.0
2.28.1
2.29.0
2.29.1
2.30.0
2.31.0
2.32.0
DELETION
0.7.6 published then removed
high · registry-verified · 2015-07-29 · 10y ago
DELETION
0.12.2 published then removed
high · registry-verified · 2016-02-08 · 10y ago
DELETION
1.10.1 published then removed
high · registry-verified · 2016-07-03 · 9y ago
DELETION
2.4.0 published then removed
high · registry-verified · 2017-06-02 · 9y ago
BURST
2 releases in 28m: 0.3.4, 0.3.5
info · registry-verified · 2015-03-24 · 11y ago
BURST
3 releases in 27m: 0.3.8, 0.3.9, 0.3.10
info · registry-verified · 2015-03-25 · 11y ago
BURST
2 releases in 31m: 0.7.6, 0.7.7
info · registry-verified · 2015-07-29 · 10y ago
BURST
2 releases in 3m: 2.25.0, 2.25.1
info · registry-verified · 2021-10-12 · 4y ago
BURST
2 releases in 9m: 2.27.1, 2.27.2
info · registry-verified · 2023-01-12 · 3y ago
BURST
2 releases in 3m: 2.27.3, 2.27.4
info · registry-verified · 2023-01-12 · 3y ago
release diff 2.31.0 → 2.32.0
+3 added · -1 removed · ~12 modified
lib/rules/no-unused-modules.js +55 lines · 2 flagged
--- +++ @@ -16,3 +16,2 @@ -var _fsWalk = require('../core/fsWalk'); var _builder = require('../exportMap/builder');var _builder2 = _interopRequireDefault(_builder);@@ -53,3 +52,3 @@ /**-   *+   * Given a FileEnumerator class, instantiate and load the list of files.    * @param FileEnumerator the `FileEnumerator` class from `eslint`'s internal api@@ -60,3 +59,21 @@ function listFilesUsingFileEnumerator(FileEnumerator, src, extensions) {-  var e = new FileEnumerator({+  // We need to know whether this is being run with flat config in order to+  // determine how to report errors if FileEnumerator throws due to a lack of eslintrc.+  var+  ESLINT_USE_FLAT_CONFIG = process.env.ESLINT_USE_FLAT_CONFIG;++  // This condition is sufficient to test in v8, since the environment variable is necessary to turn on flat config+  var isUsingFlatConfig = ESLINT_USE_FLAT_CONFIG && process.env.ESLINT_USE_FLAT_CONFIG !== 'false';++  // In the case of using v9, we can check the `shouldUseFlatConfig` function+  // If this function is present, then we assume it's v9+  try {var _require3 =+    require('eslint/use-at-your-own-risk'),shouldUseFlatConfig = _require3.shouldUseFlatConfig;+    isUsingFlatConfig = shouldUseFlatConfig && ESLINT_USE_FLAT_CONFIG !== 'false';+  } catch (_) {+    // We don't want to throw here, since we only want to update the+    // boolean if the function is available.+  }++  var enumerator = new FileEnumerator({     extensions: extensions });@@ -64,6 +81,29 @@ -  return Array.from(-  e.iterateFiles(src),-  function (_ref) {var filePath = _ref.filePath,ignored = _ref.ignored;return { filename: filePath, ignored: ignored };});-+  try {+    return Array.from(+    enumerator.iterateFiles(src),+    function (_ref) {var filePath = _ref.filePath,ignored = _ref.ignored;return { filename: filePath, ignored: ignored };});++  } catch (e) {+    // If we're using flat config, and FileEnumerator throws due to a lack of eslintrc,+    // then we want to throw an error so that the user knows about this rule's reliance on+    // the legacy config.+    if (+    isUsingFlatConfig &&+    e.message.includes('No ESLint configuration found'))+    {+      throw new Error('\nDue to the exclusion of certain internal ESLint APIs when using flat config,\nthe import/no-unused-modules rule requires an .eslintrc file to know which\nfiles to ignore (even when using flat config).\nThe .eslintrc file only needs to contain "ignorePatterns", or can be empty if\nyou do not want to ignore any files.\n\nSee https://github.com/import-js/eslint-plugin-import/issues/3079\nfor additional context.\n');++++++++++    }+    // If this isn't the case, then we'll just let the error bubble up+    throw e;+  } }@@ -80,3 +120,3 @@     // eslint/lib/util/glob-util has been moved to eslint/lib/util/glob-utils with version 5.3-    var _require3 = require('eslint/lib/util/glob-utils'),originalListFilesToProcess = _require3.listFilesToProcess;+    var _require4 = require('eslint/lib/util/glob-utils'),originalListFilesToProcess = _require4.listFilesToProcess;     // Prevent passing invalid options (extensions array) to old versions of the function.@@ -95,5 +135,5 @@     // Last place to try (pre v5.3)-    var _require4 =--    require('eslint/lib/util/glob-util'),_originalListFilesToProcess = _require4.listFilesToProcess;+    var _require5 =++    require('eslint/lib/util/glob-util'),_originalListFilesToProcess = _require5.listFilesToProcess;     var patterns = src.concat(@@ -107,45 +147,2 @@   }-}--/**-   * Given a source root and list of supported extensions, use fsWalk and the-   * new `eslint` `context.session` api to build the list of files we want to operate on-   * @param {string[]} srcPaths array of source paths (for flat config this should just be a singular root (e.g. cwd))-   * @param {string[]} extensions list of supported extensions-   * @param {{ isDirectoryIgnored: (path: string) => boolean, isFileIgnored: (path: string) => boolean }} session eslint context session object-   * @returns {string[]} list of files to operate on-   */-function listFilesWithModernApi(srcPaths, extensions, session) {-  /** @type {string[]} */-  var files = [];var _loop = function _loop(--  i) {-    var src = srcPaths[i];-    // Use walkSync along with the new session api to gather the list of files-    var entries = (0, _fsWalk.walkSync)(src, {-      deepFilter: function () {function deepFilter(entry) {-          var fullEntryPath = (0, _path.resolve)(src, entry.path);--          // Include the directory if it's not marked as ignore by eslint-          return !session.isDirectoryIgnored(fullEntryPath);-        }return deepFilter;}(),-      entryFilter: function () {function entryFilter(entry) {-          var fullEntryPath = (0, _path.resolve)(src, entry.path);--          // Include the file if it's not marked as ignore by eslint and its extension is included in our list-          return (-            !session.isFileIgnored(fullEntryPath) &&-            extensions.find(function (extension) {return entry.path.endsWith(extension);}));--        }return entryFilter;}() });---    // Filter out directories and map entries to their paths-    files.push.apply(files, _toConsumableArray(-    entries.-    filter(function (entry) {return !entry.dirent.isDirectory();}).-    map(function (entry) {return entry.path;})));};for (var i = 0; i < srcPaths.length; i++) {_loop(i);--  }-  return files; }@@ -157,18 +154,5 @@    * @param {string[]} extensions - list of supported file extensions-   * @param {import('eslint').Rule.RuleContext} context - the eslint context object    * @returns {string[] | { filename: string, ignored: boolean }[]} the list of files that this rule will evaluate.    */-function listFilesToProcess(src, extensions, context) {-  // If the context object has the new session functions, then prefer those-  // Otherwise, fallback to using the deprecated `FileEnumerator` for legacy support.-  // https://github.com/eslint/eslint/issues/18087-  if (-  context.session &&-  context.session.isFileIgnored &&-  context.session.isDirectoryIgnored)-  {-    return listFilesWithModernApi(src, extensions, context.session);-  }--  // Fallback to og FileEnumerator+function listFilesToProcess(src, extensions) {   var FileEnumerator = requireFileEnumerator();@@ -297,6 +281,6 @@ -  var srcFileList = listFilesToProcess(src, extensions, context);+  var srcFileList = listFilesToProcess(src, extensions);    // prepare list of ignored files-  var ignoredFilesList = listFilesToProcess(ignoreExports, extensions, context);+  var ignoredFilesList = listFilesToProcess(ignoreExports, extensions); @@ -1087,2 +1071,2 @@     }return create;}() };-//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWxlcy9uby11bnVzZWQtbW9kdWxlcy5qcyJdLCJuYW1lcyI6WyJyZXF1aXJlRmlsZUVudW1lcmF0b3IiLCJGaWxlRW51bWVyYXRvciIsInJlcXVpcmUiLCJlIiwiY29kZSIsImxpc3RGaWxlc1VzaW5nRmlsZUVudW1lcmF0b3IiLCJzcmMiLCJleHRlbnNpb25zIiwiQXJyYXkiLCJmcm9tIiwiaXRlcmF0ZUZpbGVzIiwiZmlsZVBhdGgiLCJpZ25vcmVkIiwiZmlsZW5hbWUiLCJsaXN0RmlsZXNXaXRoTGVnYWN5RnVuY3Rpb25zIiwib3JpZ2luYWxMaXN0RmlsZXNUb1Byb2Nlc3MiLCJsaXN0RmlsZXNUb1Byb2Nlc3MiLCJwYXR0ZXJucyIsImNvbmNhdCIsInBhdHRlcm4iLCJtYXAiLCJleHRlbnNpb24iLCJ0ZXN0IiwibGlzdEZpbGVzV2l0aE1vZGVybkFwaSIsInNyY1BhdGhzIiwic2Vzc2lvbiIsImZpbGVzIiwiaSIsImVudHJpZXMiLCJkZWVwRmlsdGVyIiwiZW50cnkiLCJmdWxsRW50cnlQYXRoIiwicGF0aCIsImlzRGlyZWN0b3J5SWdub3JlZCIsImVudHJ5RmlsdGVyIiwiaXNGaWxlSWdub3JlZCIsImZpbmQiLCJlbmRzV2l0aCIsInB1c2giLCJmaWx0ZXIiLCJkaXJlbnQiLCJpc0RpcmVjdG9yeSIsImxlbmd0aCIsImNvbnRleHQiLCJFWFBPUlRfREVGQVVMVF9ERUNMQVJBVElPTiIsIkVYUE9SVF9OQU1FRF9ERUNMQVJBVElPTiIsIkVYUE9SVF9BTExfREVDTEFSQVRJT04iLCJJTVBPUlRfREVDTEFSQVRJT04iLCJJTVBPUlRfTkFNRVNQQUNFX1NQRUNJRklFUiIsIklNUE9SVF9ERUZBVUxUX1NQRUNJRklFUiIsIlZBUklBQkxFX0RFQ0xBUkFUSU9OIiwiRlVOQ1RJT05fREVDTEFSQVRJT04iLCJDTEFTU19ERUNMQVJBVElPTiIsIklERU5USUZJRVIiLCJPQkpFQ1RfUEFUVEVSTiIsIkFSUkFZX1BBVFRFUk4iLCJUU19JTlRFUkZBQ0VfREVDTEFSQVRJT04iLCJUU19UWVBFX0FMSUFTX0RFQ0xBUkFUSU9OIiwiVFNfRU5VTV9ERUNMQVJBVElPTiIsIkRFRkFVTFQiLCJmb3JFYWNoRGVjbGFyYXRpb25JZGVudGlmaWVyIiwiZGVjbGFyYXRpb24iLCJjYiIsImlzVHlwZURlY2xhcmF0aW9uIiwidHlwZSIsImlkIiwibmFtZSIsImRlY2xhcmF0aW9ucyIsImZvckVhY2giLCJlbGVtZW50cyIsImltcG9ydExpc3QiLCJNYXAiLCJleHBvcnRMaXN0IiwidmlzaXRvcktleU1hcCIsImlnbm9yZWRGaWxlcyIsIlNldCIsImZpbGVzT3V0c2lkZVNyYyIsImlzTm9kZU1vZHVsZSIsInJlc29sdmVGaWxlcyIsImlnbm9yZUV4cG9ydHMiLCJzZXR0aW5ncyIsInNyY0ZpbGVMaXN0IiwiaWdub3JlZEZpbGVzTGlzdCIsImFkZCIsInJlc29sdmVkRmlsZXMiLCJwcmVwYXJlSW1wb3J0c0FuZEV4cG9ydHMiLCJzcmNGaWxlcyIsImV4cG9ydEFsbCIsImZpbGUiLCJleHBvcnRzIiwiaW1wb3J0cyIsImN1cnJlbnRFeHBvcnRzIiwiRXhwb3J0TWFwQnVpbGRlciIsImdldCIsImRlcGVuZGVuY2llcyIsInJlZXhwb3J0cyIsImxvY2FsSW1wb3J0TGlzdCIsIm5hbWVzcGFjZSIsInZpc2l0b3JLZXlzIiwic2V0IiwiY3VycmVudEV4cG9ydEFsbCIsImdldERlcGVuZGVuY3kiLCJkZXBlbmRlbmN5IiwidmFsdWUiLCJrZXkiLCJ3aGVyZVVzZWQiLCJyZWV4cG9ydCIsImdldEltcG9ydCIsImxvY2FsSW1wb3J0IiwiY3VycmVudFZhbHVlIiwibG9jYWwiLCJpbXBvcnRlZFNwZWNpZmllcnMiLCJzcGVjaWZpZXIiLCJoYXMiLCJ2YWwiLCJjdXJyZW50RXhwb3J0IiwiZGV0ZXJtaW5lVXNhZ2UiLCJsaXN0VmFsdWUiLCJsaXN0S2V5IiwiY3VycmVudEltcG9ydCIsImV4cG9ydFN0YXRlbWVudCIsImdldFNyYyIsInByb2Nlc3MiLCJjd2QiLCJsYXN0UHJlcGFyZUtleSIsImRvUHJlcGFyYXRpb24iLCJwcmVwYXJlS2V5IiwiSlNPTiIsInN0cmluZ2lmeSIsInNvcnQiLCJjbGVhciIsIm5ld05hbWVzcGFjZUltcG9ydEV4aXN0cyIsInNwZWNpZmllcnMiLCJzb21lIiwibmV3RGVmYXVsdEltcG9ydEV4aXN0cyIsImZpbGVJc0luUGtnIiwicGtnIiwiYmFzZVBhdGgiLCJjaGVja1BrZ0ZpZWxkU3RyaW5nIiwicGtnRmllbGQiLCJjaGVja1BrZ0ZpZWxkT2JqZWN0IiwicGtnRmllbGRGaWxlcyIsImNoZWNrUGtnRmllbGQiLCJiaW4iLCJicm93c2VyIiwibWFpbiIsIm1vZHVsZSIsIm1ldGEiLCJkb2NzIiwiY2F0ZWdvcnkiLCJkZXNjcmlwdGlvbiIsInVybCIsInNjaGVtYSIsInByb3BlcnRpZXMiLCJ1bmlxdWVJdGVtcyIsIml0ZW1zIiwibWluTGVuZ3RoIiwibWlzc2luZ0V4cG9ydHMiLCJ1bnVzZWRFeHBvcnRzIiwiaWdub3JlVW51c2VkVHlwZUV4cG9ydHMiLCJhbnlPZiIsIm1pbkl0ZW1zIiwicmVxdWlyZWQiLCJjcmVhdGUiLCJvcHRpb25zIiwiY2hlY2tFeHBvcnRQcmVzZW5jZSIsIm5vZGUiLCJleHBvcnRDb3VudCIsIm5hbWVzcGFjZUltcG9ydHMiLCJzaXplIiwicmVwb3J0IiwiYm9keSIsImNoZWNrVXNhZ2UiLCJleHBvcnRlZFZhbHVlIiwiaXNUeXBlRXhwb3J0IiwiY29uc29sZSIsImVycm9yIiwiZXhwb3J0c0tleSIsInVwZGF0ZUV4cG9ydFVzYWdlIiwibmV3RXhwb3J0cyIsIm5ld0V4cG9ydElkZW50aWZpZXJzIiwiZXhwb3J0ZWQiLCJ1cGRhdGVJbXBvcnRVc2FnZSIsIm9sZEltcG9ydFBhdGhzIiwib2xkTmFtZXNwYWNlSW1wb3J0cyIsIm5ld05hbWVzcGFjZUltcG9ydHMiLCJvbGRFeHBvcnRBbGwiLCJuZXdFeHBvcnRBbGwiLCJvbGREZWZhdWx0SW1wb3J0cyIsIm5ld0RlZmF1bHRJbXBvcnRzIiwib2xkSW1wb3J0cyIsIm5ld0ltcG9ydHMiLCJwcm9jZXNzRHluYW1pY0ltcG9ydCIsInNvdXJjZSIsInAiLCJJbXBvcnRFeHByZXNzaW9uIiwiY2hpbGQiLCJDYWxsRXhwcmVzc2lvbiIsImNhbGxlZSIsImFyZ3VtZW50cyIsImFzdE5vZGUiLCJyZXNvbHZlZFBhdGgiLCJyYXciLCJyZXBsYWNlIiwiaW1wb3J0ZWQiLCJFeHBvcnREZWZhdWx0RGVjbGFyYXRpb24iLCJFeHBvcnROYW1lZERlY2xhcmF0aW9uIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFNQTtBQUNBO0FBQ0Esc0Q7QUFDQSxrRDtBQUNBO0FBQ0EsMkQ7QUFDQSx1QztBQUNBLCtDO0FBQ0EseUQ7O0FBRUE7QUFDQSwrQztBQUNBLDZEO0FBQ0EscUMsMlVBbkJBOzs7O29YQXFCQTs7Ozs7dVhBTUEsU0FBU0EscUJBQVQsR0FBaUMsQ0FDL0IsSUFBSUMsdUJBQUo7O0FBRUE7QUFDQSxNQUFJO0FBQ29CQyxZQUFRLDZCQUFSLENBRHBCLENBQ0NELGNBREQsWUFDQ0EsY0FERDtBQUVILEdBRkQsQ0FFRSxPQUFPRSxDQUFQLEVBQVU7QUFDVjtBQUNBLFFBQUlBLEVBQUVDLElBQUYsS0FBVyxrQkFBZixFQUFtQztBQUNqQyxZQUFNRCxDQUFOO0FBQ0Q7O0FBRUQ7QUFDQSxRQUFJO0FBQ29CRCxjQUFRLHVDQUFSLENBRHBCLENBQ0NELGNBREQsYUFDQ0EsY0FERDtBQUVILEtBRkQsQ0FFRSxPQUFPRSxDQUFQLEVBQVU7QUFDVjtBQUNBLFVBQUlBLEVBQUVDLElBQUYsS0FBVyxrQkFBZixFQUFtQztBQUNqQyxjQUFNRCxDQUFOO0FBQ0Q7QUFDRjtBQUNGO0FBQ0QsU0FBT0YsY0FBUDtBQUNEOztBQUVEOzs7Ozs7O0FBT0EsU0FBU0ksNEJBQVQsQ0FBc0NKLGNBQXRDLEVBQXNESyxHQUF0RCxFQUEyREMsVUFBM0QsRUFBdUU7QUFDckUsTUFBTUosSUFBSSxJQUFJRixjQUFKLENBQW1CO0FBQzNCTSwwQkFEMkIsRUFBbkIsQ0FBVjs7O0FBSUEsU0FBT0MsTUFBTUMsSUFBTjtBQUNMTixJQUFFTyxZQUFGLENBQWVKLEdBQWYsQ0FESztBQUVMLHVCQUFHSyxRQUFILFFBQUdBLFFBQUgsQ0FBYUMsT0FBYixRQUFhQSxPQUFiLFFBQTRCLEVBQUVDLFVBQVVGLFFBQVosRUFBc0JDLGdCQUF0QixFQUE1QixFQUZLLENBQVA7O0FBSUQ7O0FBRUQ7Ozs7Ozs7QUFPQSxTQUFTRSw0QkFBVCxDQUFzQ1IsR0FBdEMsRUFBMkNDLFVBQTNDLEVBQXVEO0FBQ3JELE1BQUk7QUFDRjtBQURFLG9CQUV5REwsUUFBUSw0QkFBUixDQUZ6RCxDQUUwQmEsMEJBRjFCLGFBRU1DLGtCQUZOO0FBR0Y7QUFDQTtBQUNBOztBQUVBLFdBQU9ELDJCQUEyQlQsR0FBM0IsRUFBZ0M7QUFDckNDLDRCQURxQyxFQUFoQyxDQUFQOztBQUdELEdBVkQsQ0FVRSxPQUFPSixDQUFQLEVBQVU7QUFDVjtBQUNBLFFBQUlBLEVBQUVDLElBQUYsS0FBVyxrQkFBZixFQUFtQztBQUNqQyxZQUFNRCxDQUFOO0FBQ0Q7O0FBRUQ7QUFOVTs7QUFTTkQsWUFBUSwyQkFBUixDQVRNLENBUVlhLDJCQVJaLGFBUVJDLGtCQVJRO0FBVVYsUUFBTUMsV0FBV1gsSUFBSVksTUFBSjtBQUNmO0FBQ0VaLE9BREY7QUFFRSxjQUFDYSxPQUFELFVBQWFaLFdBQVdhLEdBQVgsQ0FBZSxVQUFDQyxTQUFELFVBQWdCLFlBQUQsQ0FBY0MsSUFBZCxDQUFtQkgsT0FBbkIsSUFBOEJBLE9BQTlCLFVBQTJDQSxPQUEzQyxxQkFBMERFLFNBQTFELENBQWYsR0FBZixDQUFiLEVBRkYsQ0FEZSxDQUFqQjs7OztBQU9BLFdBQU9OLDRCQUEyQkUsUUFBM0IsQ0FBUDtBQUNEO0FBQ0Y7O0FBRUQ7Ozs7Ozs7O0FBUUEsU0FBU00sc0JBQVQsQ0FBZ0NDLFFBQWhDLEVBQTBDakIsVUFBMUMsRUFBc0RrQixPQUF0RCxFQUErRDtBQUM3RDtBQUNBLE1BQU1DLFFBQVEsRUFBZCxDQUY2RDs7QUFJcERDLEdBSm9EO0FBSzNELFFBQU1yQixNQUFNa0IsU0FBU0csQ0FBVCxDQUFaO0FBQ0E7QUFDQSxRQUFNQyxVQUFVLHNCQUFTdEIsR0FBVCxFQUFjO0FBQzVCdUIsZ0JBRDRCLG1DQUNqQkMsS0FEaUIsRUFDVjtBQUNoQixjQUFNQyxnQkFBZ0IsbUJBQVl6QixHQUFaLEVBQWlCd0IsTUFBTUUsSUFBdkIsQ0FBdEI7O0FBRUE7QUFDQSxpQkFBTyxDQUFDUCxRQUFRUSxrQkFBUixDQUEyQkYsYUFBM0IsQ0FBUjtBQUNELFNBTjJCO0FBTzVCRyxpQkFQNEIsb0NBT2hCSixLQVBnQixFQU9UO0FBQ2pCLGNBQU1DLGdCQUFnQixtQkFBWXpCLEdBQVosRUFBaUJ3QixNQUFNRSxJQUF2QixDQUF0Qjs7QUFFQTtBQUNBO0FBQ0UsYUFBQ1AsUUFBUVUsYUFBUixDQUFzQkosYUFBdEIsQ0FBRDtBQUNHeEIsdUJBQVc2QixJQUFYLENBQWdCLFVBQUNmLFNBQUQsVUFBZVMsTUFBTUUsSUFBTixDQUFXSyxRQUFYLENBQW9CaEIsU0FBcEIsQ0FBZixFQUFoQixDQUZMOztBQUlELFNBZjJCLHdCQUFkLENBQWhCOzs7QUFrQkE7QUFDQUssVUFBTVksSUFBTjtBQUNLVjtBQUNBVyxVQURBLENBQ08sVUFBQ1QsS0FBRCxVQUFXLENBQUNBLE1BQU1VLE1BQU4sQ0FBYUMsV0FBYixFQUFaLEVBRFA7QUFFQXJCLE9BRkEsQ0FFSSxVQUFDVSxLQUFELFVBQVdBLE1BQU1FLElBQWpCLEVBRkosQ0FETCxHQTFCMkQsRUFJN0QsS0FBSyxJQUFJTCxJQUFJLENBQWIsRUFBZ0JBLElBQUlILFNBQVNrQixNQUE3QixFQUFxQ2YsR0FBckMsRUFBMEMsT0FBakNBLENBQWlDOztBQTJCekM7QUFDRCxTQUFPRCxLQUFQO0FBQ0Q7O0FBRUQ7Ozs7Ozs7O0FBUUEsU0FBU1Ysa0JBQVQsQ0FBNEJWLEdBQTVCLEVBQWlDQyxVQUFqQyxFQUE2Q29DLE9BQTdDLEVBQXNEO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBO0FBQ0VBLFVBQVFsQixPQUFSO0FBQ0drQixVQUFRbEIsT0FBUixDQUFnQlUsYUFEbkI7QUFFR1EsVUFBUWxCLE9BQVIsQ0FBZ0JRLGtCQUhyQjtBQUlFO0FBQ0EsV0FBT1YsdUJBQXVCakIsR0FBdkIsRUFBNEJDLFVBQTVCLEVBQXdDb0MsUUFBUWxCLE9BQWhELENBQVA7QUFDRDs7QUFFRDtBQUNBLE1BQU14QixpQkFBaUJELHVCQUF2Qjs7QUFFQTtBQUNBLE1BQUlDLGNBQUosRUFBb0I7QUFDbEIsV0FBT0ksNkJBQTZCSixjQUE3QixFQUE2Q0ssR0FBN0MsRUFBa0RDLFVBQWxELENBQVA7QUFDRDtBQUNEO0FBQ0EsU0FBT08sNkJBQTZCUixHQUE3QixFQUFrQ0MsVUFBbEMsQ0FBUDtBQUNEOztBQUVELElBQU1xQyw2QkFBNkIsMEJBQW5DO0FBQ0EsSUFBTUMsMkJBQTJCLHdCQUFqQztBQUNBLElBQU1DLHlCQUF5QixzQkFBL0I7QUFDQSxJQUFNQyxxQkFBcUIsbUJBQTNCO0FBQ0EsSUFBTUMsNkJBQTZCLDBCQUFuQztBQUNBLElBQU1DLDJCQUEyQix3QkFBakM7QUFDQSxJQUFNQyx1QkFBdUIscUJBQTdCO0FBQ0EsSUFBTUMsdUJBQXVCLHFCQUE3QjtBQUNBLElBQU1DLG9CQUFvQixrQkFBMUI7QUFDQSxJQUFNQyxhQUFhLFlBQW5CO0FBQ0EsSUFBTUMsaUJBQWlCLGVBQXZCO0FBQ0EsSUFBTUMsZ0JBQWdCLGNBQXRCO0FBQ0EsSUFBTUMsMkJBQTJCLHdCQUFqQztBQUNBLElBQU1DLDRCQUE0Qix3QkFBbEM7QUFDQSxJQUFNQyxzQkFBc0IsbUJBQTVCO0FBQ0EsSUFBTUMsVUFBVSxTQUFoQjs7QUFFQSxTQUFTQyw0QkFBVCxDQUFzQ0MsV0FBdEMsRUFBbURDLEVBQW5ELEVBQXVEO0FBQ3JELE1BQUlELFdBQUosRUFBaUI7QUFDZixRQUFNRSxvQkFBb0JGLFlBQVlHLElBQVosS0FBcUJSLHdCQUFyQjtBQUNyQkssZ0JBQVlHLElBQVosS0FBcUJQLHlCQURBO0FBRXJCSSxnQkFBWUcsSUFBWixLQUFxQk4sbUJBRjFCOztBQUlBO0FBQ0VHLGdCQUFZRyxJQUFaLEtBQXFCYixvQkFBckI7QUFDR1UsZ0JBQVlHLElBQVosS0FBcUJaLGlCQUR4QjtBQUVHVyxxQkFITDtBQUlFO0FBQ0FELFNBQUdELFlBQVlJLEVBQVosQ0FBZUMsSUFBbEIsRUFBd0JILGlCQUF4QjtBQUNELEtBTkQsTUFNTyxJQUFJRixZQUFZRyxJQUFaLEtBQXFCZCxvQkFBekIsRUFBK0M7QUFDcERXLGtCQUFZTSxZQUFaLENBQXlCQyxPQUF6QixDQUFpQyxpQkFBWSxLQUFUSCxFQUFTLFNBQVRBLEVBQVM7QUFDM0MsWUFBSUEsR0FBR0QsSUFBSCxLQUFZVixjQUFoQixFQUFnQztBQUM5QiwyQ0FBd0JXLEVBQXhCLEVBQTRCLFVBQUM5QyxPQUFELEVBQWE7QUFDdkMsZ0JBQUlBLFFBQVE2QyxJQUFSLEtBQWlCWCxVQUFyQixFQUFpQztBQUMvQlMsaUJBQUczQyxRQUFRK0MsSUFBWCxFQUFpQixLQUFqQjtBQUNEO0FBQ0YsV0FKRDtBQUtELFNBTkQsTUFNTyxJQUFJRCxHQUFHRCxJQUFILEtBQVlULGFBQWhCLEVBQStCO0FBQ3BDVSxhQUFHSSxRQUFILENBQVlELE9BQVosQ0FBb0IsaUJBQWMsS0FBWEYsSUFBVyxTQUFYQSxJQUFXO0FBQ2hDSixlQUFHSSxJQUFILEVBQVMsS0FBVDtBQUNELFdBRkQ7QUFHRCxTQUpNLE1BSUE7QUFDTEosYUFBR0csR0FBR0MsSUFBTixFQUFZLEtBQVo7QUFDRDtBQUNGLE9BZEQ7QUFlRDtBQUNGO0FBQ0Y7O0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFtQkEsSUFBTUksYUFBYSxJQUFJQyxHQUFKLEVBQW5COztBQUVBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBeUJBLElBQU1DLGFBQWEsSUFBSUQsR0FBSixFQUFuQjs7QUFFQSxJQUFNRSxnQkFBZ0IsSUFBSUYsR0FBSixFQUF0Qjs7QUFFQTtBQUNBLElBQU1HLGVBQWUsSUFBSUMsR0FBSixFQUFyQjtBQUNBLElBQU1DLGtCQUFrQixJQUFJRCxHQUFKLEVBQXhCOztBQUVBLElBQU1FLGVBQWUsU0FBZkEsWUFBZSxDQUFDN0MsSUFBRCxVQUFXLHFCQUFELENBQXVCVixJQUF2QixDQUE0QlUsSUFBNUIsQ0FBVixHQUFyQjs7QUFFQTs7Ozs7O0FBTUEsU0FBUzhDLFlBQVQsQ0FBc0J4RSxHQUF0QixFQUEyQnlFLGFBQTNCLEVBQTBDcEMsT0FBMUMsRUFBbUQ7QUFDakQsTUFBTXBDLGFBQWFDLE1BQU1DLElBQU4sQ0FBVywrQkFBa0JrQyxRQUFRcUMsUUFBMUIsQ0FBWCxDQUFuQjs7QUFFQSxNQUFNQyxjQUFjakUsbUJBQW1CVixHQUFuQixFQUF3QkMsVUFBeEIsRUFBb0NvQyxPQUFwQyxDQUFwQjs7QUFFQTtBQUNBLE1BQU11QyxtQkFBbUJsRSxtQkFBbUIrRCxhQUFuQixFQUFrQ3hFLFVBQWxDLEVBQThDb0MsT0FBOUMsQ0FBekI7O0FBRUE7QUFDQSxNQUFJdUMsaUJBQWlCeEMsTUFBakIsSUFBMkIsT0FBT3dDLGlCQUFpQixDQUFqQixDQUFQLEtBQStCLFFBQTlELEVBQXdFO0FBQ3RFQSxxQkFBaUJkLE9BQWpCLENBQXlCLFVBQUN2RCxRQUFELFVBQWM2RCxhQUFhUyxHQUFiLENBQWlCdEUsUUFBakIsQ0FBZCxFQUF6QjtBQUNELEdBRkQsTUFFTztBQUNMcUUscUJBQWlCZCxPQUFqQixDQUF5QixzQkFBR3ZELFFBQUgsU0FBR0EsUUFBSCxRQUFrQjZELGFBQWFTLEdBQWIsQ0FBaUJ0RSxRQUFqQixDQUFsQixFQUF6QjtBQUNEOztBQUVEO0FBQ0EsTUFBTXVFLGdCQUFnQkgsWUFBWXZDLE1BQVosSUFBc0IsT0FBT3VDLFlBQVksQ0FBWixDQUFQLEtBQTBCLFFBQWhEO0FBQ2xCQSxjQUFZMUMsTUFBWixDQUFtQixVQUFDNUIsUUFBRCxVQUFjLENBQUNrRSxhQUFhbEUsUUFBYixDQUFmLEVBQW5CLENBRGtCO0FBRWxCLG1DQUFRc0UsV0FBUixFQUFxQixzQkFBR3BFLFFBQUgsU0FBR0EsUUFBSCxRQUFrQmdFLGFBQWFoRSxRQUFiLElBQXlCLEVBQXpCLEdBQThCQSxRQUFoRCxFQUFyQixDQUZKOztBQUlBLFNBQU8sSUFBSThELEdBQUosQ0FBUVMsYUFBUixDQUFQO0FBQ0Q7O0FBRUQ7OztBQUdBLElBQU1DLDJCQUEyQixTQUEzQkEsd0JBQTJCLENBQUNDLFFBQUQsRUFBVzNDLE9BQVgsRUFBdUI7QUFDdEQsTUFBTTRDLFlBQVksSUFBSWhCLEdBQUosRUFBbEI7QUFDQWUsV0FBU2xCLE9BQVQsQ0FBaUIsVUFBQ29CLElBQUQsRUFBVTtBQUN6QixRQUFNQyxVQUFVLElBQUlsQixHQUFKLEVBQWhCO0FBQ0EsUUFBTW1CLFVBQVUsSUFBSW5CLEdBQUosRUFBaEI7QUFDQSxRQUFNb0IsaUJBQWlCQyxxQkFBaUJDLEdBQWpCLENBQXFCTCxJQUFyQixFQUEyQjdDLE9BQTNCLENBQXZCO0FBQ0EsUUFBSWdELGNBQUosRUFBb0I7O0FBRWhCRyxrQkFGZ0I7Ozs7O0FBT2RILG9CQVBjLENBRWhCRyxZQUZnQixDQUdoQkMsU0FIZ0IsR0FPZEosY0FQYyxDQUdoQkksU0FIZ0IsQ0FJUEMsZUFKTyxHQU9kTCxjQVBjLENBSWhCRCxPQUpnQixDQUtoQk8sU0FMZ0IsR0FPZE4sY0FQYyxDQUtoQk0sU0FMZ0IsQ0FNaEJDLFdBTmdCLEdBT2RQLGNBUGMsQ0FNaEJPLFdBTmdCOztBQVNsQnpCLG9CQUFjMEIsR0FBZCxDQUFrQlgsSUFBbEIsRUFBd0JVLFdBQXhCO0FBQ0E7QUFDQSxVQUFNRSxtQkFBbUIsSUFBSXpCLEdBQUosRUFBekI7QUFDQW1CLG1CQUFhMUIsT0FBYixDQUFxQixVQUFDaUMsYUFBRCxFQUFtQjtBQUN0QyxZQUFNQyxhQUFhRCxlQUFuQjtBQUNBLFlBQUlDLGVBQWUsSUFBbkIsRUFBeUI7QUFDdkI7QUFDRDs7QUFFREYseUJBQWlCakIsR0FBakIsQ0FBcUJtQixXQUFXdEUsSUFBaEM7QUFDRCxPQVBEO0FBUUF1RCxnQkFBVVksR0FBVixDQUFjWCxJQUFkLEVBQW9CWSxnQkFBcEI7O0FBRUFMLGdCQUFVM0IsT0FBVixDQUFrQixVQUFDbUMsS0FBRCxFQUFRQyxHQUFSLEVBQWdCO0FBQ2hDLFlBQUlBLFFBQVE3QyxPQUFaLEVBQXFCO0FBQ25COEIsa0JBQVFVLEdBQVIsQ0FBWWxELHdCQUFaLEVBQXNDLEVBQUV3RCxXQUFXLElBQUk5QixHQUFKLEVBQWIsRUFBdEM7QUFDRCxTQUZELE1BRU87QUFDTGMsa0JBQVFVLEdBQVIsQ0FBWUssR0FBWixFQUFpQixFQUFFQyxXQUFXLElBQUk5QixHQUFKLEVBQWIsRUFBakI7QUFDRDtBQUNELFlBQU0rQixXQUFXSCxNQUFNSSxTQUFOLEVBQWpCO0FBQ0EsWUFBSSxDQUFDRCxRQUFMLEVBQWU7QUFDYjtBQUNEO0FBQ0QsWUFBSUUsY0FBY2xCLFFBQVFHLEdBQVIsQ0FBWWEsU0FBUzFFLElBQXJCLENBQWxCO0FBQ0EsWUFBSTZFLHFCQUFKO0FBQ0EsWUFBSU4sTUFBTU8sS0FBTixLQUFnQm5ELE9BQXBCLEVBQTZCO0FBQzNCa0QseUJBQWU1RCx3QkFBZjtBQUNELFNBRkQsTUFFTztBQUNMNEQseUJBQWVOLE1BQU1PLEtBQXJCO0FBQ0Q7QUFDRCxZQUFJLE9BQU9GLFdBQVAsS0FBdUIsV0FBM0IsRUFBd0M7QUFDdENBLHdCQUFjLElBQUlqQyxHQUFKLDhCQUFZaUMsV0FBWixJQUF5QkMsWUFBekIsR0FBZDtBQUNELFNBRkQsTUFFTztBQUNMRCx3QkFBYyxJQUFJakMsR0FBSixDQUFRLENBQUNrQyxZQUFELENBQVIsQ0FBZDtBQUNEO0FBQ0RuQixnQkFBUVMsR0FBUixDQUFZTyxTQUFTMUUsSUFBckIsRUFBMkI0RSxXQUEzQjtBQUNELE9BdkJEOztBQXlCQVosc0JBQWdCNUIsT0FBaEIsQ0FBd0IsVUFBQ21DLEtBQUQsRUFBUUMsR0FBUixFQUFnQjtBQUN0QyxZQUFJM0IsYUFBYTJCLEdBQWIsQ0FBSixFQUF1QjtBQUNyQjtBQUNEO0FBQ0QsWUFBTUksY0FBY2xCLFFBQVFHLEdBQVIsQ0FBWVcsR0FBWixLQUFvQixJQUFJN0IsR0FBSixFQUF4QztBQUNBNEIsY0FBTXBDLFlBQU4sQ0FBbUJDLE9BQW5CLENBQTJCLGlCQUE0QixLQUF6QjJDLGtCQUF5QixTQUF6QkEsa0JBQXlCO0FBQ3JEQSw2QkFBbUIzQyxPQUFuQixDQUEyQixVQUFDNEMsU0FBRCxFQUFlO0FBQ3hDSix3QkFBWXpCLEdBQVosQ0FBZ0I2QixTQUFoQjtBQUNELFdBRkQ7QUFHRCxTQUpEO0FBS0F0QixnQkFBUVMsR0FBUixDQUFZSyxHQUFaLEVBQWlCSSxXQUFqQjtBQUNELE9BWEQ7QUFZQXRDLGlCQUFXNkIsR0FBWCxDQUFlWCxJQUFmLEVBQXFCRSxPQUFyQjs7QUFFQTtBQUNBLFVBQUloQixhQUFhdUMsR0FBYixDQUFpQnpCLElBQWpCLENBQUosRUFBNEI7QUFDMUI7QUFDRDtBQUNEUyxnQkFBVTdCLE9BQVYsQ0FBa0IsVUFBQ21DLEtBQUQsRUFBUUMsR0FBUixFQUFnQjtBQUNoQyxZQUFJQSxRQUFRN0MsT0FBWixFQUFxQjtBQUNuQjhCLGtCQUFRVSxHQUFSLENBQVlsRCx3QkFBWixFQUFzQyxFQUFFd0QsV0FBVyxJQUFJOUIsR0FBSixFQUFiLEVBQXRDO0FBQ0QsU0FGRCxNQUVPO0FBQ0xjLGtCQUFRVSxHQUFSLENBQVlLLEdBQVosRUFBaUIsRUFBRUMsV0FBVyxJQUFJOUIsR0FBSixFQUFiLEVBQWpCO0FBQ0Q7QUFDRixPQU5EO0FBT0Q7QUFDRGMsWUFBUVUsR0FBUixDQUFZckQsc0JBQVosRUFBb0MsRUFBRTJELFdBQVcsSUFBSTlCLEdBQUosRUFBYixFQUFwQztBQUNBYyxZQUFRVSxHQUFSLENBQVluRCwwQkFBWixFQUF3QyxFQUFFeUQsV0FBVyxJQUFJOUIsR0FBSixFQUFiLEVBQXhDO0FBQ0FILGVBQVcyQixHQUFYLENBQWVYLElBQWYsRUFBcUJDLE9BQXJCO0FBQ0QsR0FoRkQ7QUFpRkFGLFlBQVVuQixPQUFWLENBQWtCLFVBQUNtQyxLQUFELEVBQVFDLEdBQVIsRUFBZ0I7QUFDaENELFVBQU1uQyxPQUFOLENBQWMsVUFBQzhDLEdBQUQsRUFBUztBQUNyQixVQUFNdkIsaUJBQWlCbkIsV0FBV3FCLEdBQVgsQ0FBZXFCLEdBQWYsQ0FBdkI7QUFDQSxVQUFJdkIsY0FBSixFQUFvQjtBQUNsQixZQUFNd0IsZ0JBQWdCeEIsZUFBZUUsR0FBZixDQUFtQi9DLHNCQUFuQixDQUF0QjtBQUNBcUUsc0JBQWNWLFNBQWQsQ0FBd0J0QixHQUF4QixDQUE0QnFCLEdBQTVCO0FBQ0Q7QUFDRixLQU5EO0FBT0QsR0FSRDtBQVNELENBNUZEOztBQThGQTs7OztBQUlBLElBQU1ZLGlCQUFpQixTQUFqQkEsY0FBaUIsR0FBTTtBQUMzQjlDLGFBQVdGLE9BQVgsQ0FBbUIsVUFBQ2lELFNBQUQsRUFBWUMsT0FBWixFQUF3QjtBQUN6Q0QsY0FBVWpELE9BQVYsQ0FBa0IsVUFBQ21DLEtBQUQsRUFBUUMsR0FBUixFQUFnQjtBQUNoQyxVQUFNZixVQUFVakIsV0FBV3FCLEdBQVgsQ0FBZVcsR0FBZixDQUFoQjtBQUNBLFVBQUksT0FBT2YsT0FBUCxLQUFtQixXQUF2QixFQUFvQztBQUNsQ2MsY0FBTW5DLE9BQU4sQ0FBYyxVQUFDbUQsYUFBRCxFQUFtQjtBQUMvQixjQUFJUCxrQkFBSjtBQUNBLGNBQUlPLGtCQUFrQnZFLDBCQUF0QixFQUFrRDtBQUNoRGdFLHdCQUFZaEUsMEJBQVo7QUFDRCxXQUZELE1BRU8sSUFBSXVFLGtCQUFrQnRFLHdCQUF0QixFQUFnRDtBQUNyRCtELHdCQUFZL0Qsd0JBQVo7QUFDRCxXQUZNLE1BRUE7QUFDTCtELHdCQUFZTyxhQUFaO0FBQ0Q7QUFDRCxjQUFJLE9BQU9QLFNBQVAsS0FBcUIsV0FBekIsRUFBc0M7QUFDcEMsZ0JBQU1RLGtCQUFrQi9CLFFBQVFJLEdBQVIsQ0FBWW1CLFNBQVosQ0FBeEI7QUFDQSxnQkFBSSxPQUFPUSxlQUFQLEtBQTJCLFdBQS9CLEVBQTRDO0FBQ2xDZix1QkFEa0MsR0FDcEJlLGVBRG9CLENBQ2xDZixTQURrQztBQUUxQ0Esd0JBQVV0QixHQUFWLENBQWNtQyxPQUFkO0FBQ0E3QixzQkFBUVUsR0FBUixDQUFZYSxTQUFaLEVBQXVCLEVBQUVQLG9CQUFGLEVBQXZCO0FBQ0Q7QUFDRjtBQUNGLFNBakJEO0FBa0JEO0FBQ0YsS0F0QkQ7QUF1QkQsR0F4QkQ7QUF5QkQsQ0ExQkQ7O0FBNEJBLElBQU1nQixTQUFTLFNBQVRBLE1BQVMsQ0FBQ25ILEdBQUQsRUFBUztBQUN0QixNQUFJQSxHQUFKLEVBQVM7QUFDUCxXQUFPQSxHQUFQO0FBQ0Q7QUFDRCxTQUFPLENBQUNvSCxRQUFRQyxHQUFSLEVBQUQsQ0FBUDtBQUNELENBTEQ7O0FBT0E7Ozs7QUFJQTtBQUNBLElBQUlyQyxpQkFBSjtBQUNBLElBQUlzQyx1QkFBSjtBQUNBLElBQU1DLGdCQUFnQixTQUFoQkEsYUFBZ0IsQ0FBQ3ZILEdBQUQsRUFBTXlFLGFBQU4sRUFBcUJwQyxPQUFyQixFQUFpQztBQUNyRCxNQUFNbUYsYUFBYUMsS0FBS0MsU0FBTCxDQUFlO0FBQ2hDMUgsU0FBSyxDQUFDQSxPQUFPLEVBQVIsRUFBWTJILElBQVosRUFEMkI7QUFFaENsRCxtQkFBZSxDQUFDQSxpQkFBaUIsRUFBbEIsRUFBc0JrRCxJQUF0QixFQUZpQjtBQUdoQzFILGdCQUFZQyxNQUFNQyxJQUFOLENBQVcsK0JBQWtCa0MsUUFBUXFDLFFBQTFCLENBQVgsRUFBZ0RpRCxJQUFoRCxFQUhvQixFQUFmLENBQW5COztBQUtBLE1BQUlILGVBQWVGLGNBQW5CLEVBQW1DO0FBQ2pDO0FBQ0Q7O0FBRUR0RCxhQUFXNEQsS0FBWDtBQUNBMUQsYUFBVzBELEtBQVg7QUFDQXhELGVBQWF3RCxLQUFiO0FBQ0F0RCxrQkFBZ0JzRCxLQUFoQjs7QUFFQTVDLGFBQVdSLGFBQWEyQyxPQUFPbkgsR0FBUCxDQUFiLEVBQTBCeUUsYUFBMUIsRUFBeUNwQyxPQUF6QyxDQUFYO0FBQ0EwQywyQkFBeUJDLFFBQXpCLEVBQW1DM0MsT0FBbkM7QUFDQXlFO0FBQ0FRLG1CQUFpQkUsVUFBakI7QUFDRCxDQW5CRDs7QUFxQkEsSUFBTUssMkJBQTJCLFNBQTNCQSx3QkFBMkIsQ0FBQ0MsVUFBRCxVQUFnQkEsV0FBV0MsSUFBWCxDQUFnQixzQkFBR3JFLElBQUgsU0FBR0EsSUFBSCxRQUFjQSxTQUFTaEIsMEJBQXZCLEVBQWhCLENBQWhCLEVBQWpDOztBQUVBLElBQU1zRix5QkFBeUIsU0FBekJBLHNCQUF5QixDQUFDRixVQUFELFVBQWdCQSxXQUFXQyxJQUFYLENBQWdCLHNCQUFHckUsSUFBSCxTQUFHQSxJQUFILFFBQWNBLFNBQVNmLHdCQUF2QixFQUFoQixDQUFoQixFQUEvQjs7QUFFQSxJQUFNc0YsY0FBYyxTQUFkQSxXQUFjLENBQUMvQyxJQUFELEVBQVU7QUFDTiw4QkFBVSxFQUFFbUMsS0FBS25DLElBQVAsRUFBVixDQURNLENBQ3BCeEQsSUFEb0IsY0FDcEJBLElBRG9CLENBQ2R3RyxHQURjLGNBQ2RBLEdBRGM7QUFFNUIsTUFBTUMsV0FBVyxtQkFBUXpHLElBQVIsQ0FBakI7O0FBRUEsTUFBTTBHLHNCQUFzQixTQUF0QkEsbUJBQXNCLENBQUNDLFFBQUQsRUFBYztBQUN4QyxRQUFJLGdCQUFLRixRQUFMLEVBQWVFLFFBQWYsTUFBNkJuRCxJQUFqQyxFQUF1QztBQUNyQyxhQUFPLElBQVA7QUFDRDtBQUNGLEdBSkQ7O0FBTUEsTUFBTW9ELHNCQUFzQixTQUF0QkEsbUJBQXNCLENBQUNELFFBQUQsRUFBYztBQUN4QyxRQUFNRSxnQkFBZ0IsaUNBQVEseUJBQU9GLFFBQVAsQ0FBUixFQUEwQixVQUFDcEMsS0FBRCxVQUFXLE9BQU9BLEtBQVAsS0FBaUIsU0FBakIsR0FBNkIsRUFBN0IsR0FBa0MsZ0JBQUtrQyxRQUFMLEVBQWVsQyxLQUFmLENBQTdDLEVBQTFCLENBQXRCOztBQUVBLFFBQUksZ0NBQVNzQyxhQUFULEVBQXdCckQsSUFBeEIsQ0FBSixFQUFtQztBQUNqQyxhQUFPLElBQVA7QUFDRDtBQUNGLEdBTkQ7O0FBUUEsTUFBTXNELGdCQUFnQixTQUFoQkEsYUFBZ0IsQ0FBQ0gsUUFBRCxFQUFjO0FBQ2xDLFFBQUksT0FBT0EsUUFBUCxLQUFvQixRQUF4QixFQUFrQztBQUNoQyxhQUFPRCxvQkFBb0JDLFFBQXBCLENBQVA7QUFDRDs7QUFFRCxRQUFJLFFBQU9BLFFBQVAseUNBQU9BLFFBQVAsT0FBb0IsUUFBeEIsRUFBa0M7QUFDaEMsYUFBT0Msb0JBQW9CRCxRQUFwQixDQUFQO0FBQ0Q7QUFDRixHQVJEOztBQVVBLE1BQUlILG1CQUFnQixJQUFwQixFQUEwQjtBQUN4QixXQUFPLEtBQVA7QUFDRDs7QUFFRCxNQUFJQSxJQUFJTyxHQUFSLEVBQWE7QUFDWCxRQUFJRCxjQUFjTixJQUFJTyxHQUFsQixDQUFKLEVBQTRCO0FBQzFCLGFBQU8sSUFBUDtBQUNEO0FBQ0Y7O0FBRUQsTUFBSVAsSUFBSVEsT0FBUixFQUFpQjtBQUNmLFFBQUlGLGNBQWNOLElBQUlRLE9BQWxCLENBQUosRUFBZ0M7QUFDOUIsYUFBTyxJQUFQO0FBQ0Q7QUFDRjs7QUFFRCxNQUFJUixJQUFJUyxJQUFSLEVBQWM7QUFDWixRQUFJUCxvQkFBb0JGLElBQUlTLElBQXhCLENBQUosRUFBbUM7QUFDakMsYUFBTyxJQUFQO0FBQ0Q7QUFDRjs7QUFFRCxTQUFPLEtBQVA7QUFDRCxDQW5ERDs7QUFxREFDLE9BQU96RCxPQUFQLEdBQWlCO0FBQ2YwRCxRQUFNO0FBQ0puRixVQUFNLFlBREY7QUFFSm9GLFVBQU07QUFDSkMsZ0JBQVUsa0JBRE47QUFFSkMsbUJBQWEsdUZBRlQ7QUFHSkMsV0FBSywwQkFBUSxtQkFBUixDQUhELEVBRkY7O0FBT0pDLFlBQVEsQ0FBQztBQUNQQyxrQkFBWTtBQUNWbkosYUFBSztBQUNIZ0osdUJBQWEsc0RBRFY7QUFFSHRGLGdCQUFNLE9BRkg7QUFHSDBGLHVCQUFhLElBSFY7QUFJSEMsaUJBQU87QUFDTDNGLGtCQUFNLFFBREQ7QUFFTDRGLHVCQUFXLENBRk4sRUFKSixFQURLOzs7QUFVVjdFLHVCQUFlO0FBQ2J1RSx1QkFBYSxxRkFEQTtBQUVidEYsZ0JBQU0sT0FGTztBQUdiMEYsdUJBQWEsSUFIQTtBQUliQyxpQkFBTztBQUNMM0Ysa0JBQU0sUUFERDtBQUVMNEYsdUJBQVcsQ0FGTixFQUpNLEVBVkw7OztBQW1CVkMsd0JBQWdCO0FBQ2RQLHVCQUFhLG9DQURDO0FBRWR0RixnQkFBTSxTQUZRLEVBbkJOOztBQXVCVjhGLHVCQUFlO0FBQ2JSLHVCQUFhLGtDQURBO0FBRWJ0RixnQkFBTSxTQUZPLEVBdkJMOztBQTJCVitGLGlDQUF5QjtBQUN2QlQsdUJBQWEsdUNBRFU7QUFFdkJ0RixnQkFBTSxTQUZpQixFQTNCZixFQURMOzs7QUFpQ1BnRyxhQUFPO0FBQ0w7QUFDRVAsb0JBQVk7QUFDVksseUJBQWUsRUFBRSxRQUFNLENBQUMsSUFBRCxDQUFSLEVBREw7QUFFVnhKLGVBQUs7QUFDSDJKLHNCQUFVLENBRFAsRUFGSyxFQURkOzs7QUFPRUMsa0JBQVUsQ0FBQyxlQUFELENBUFosRUFESzs7QUFVTDtBQUNFVCxvQkFBWTtBQUNWSSwwQkFBZ0IsRUFBRSxRQUFNLENBQUMsSUFBRCxDQUFSLEVBRE4sRUFEZDs7QUFJRUssa0JBQVUsQ0FBQyxnQkFBRCxDQUpaLEVBVkssQ0FqQ0EsRUFBRCxDQVBKLEVBRFM7Ozs7OztBQTZEZkMsUUE3RGUsK0JBNkRSeEgsT0E3RFEsRUE2REM7Ozs7Ozs7QUFPVkEsY0FBUXlILE9BQVIsQ0FBZ0IsQ0FBaEIsS0FBc0IsRUFQWixDQUVaOUosR0FGWSxTQUVaQSxHQUZZLDZCQUdaeUUsYUFIWSxDQUdaQSxhQUhZLHVDQUdJLEVBSEosdUJBSVo4RSxjQUpZLFNBSVpBLGNBSlksQ0FLWkMsYUFMWSxTQUtaQSxhQUxZLENBTVpDLHVCQU5ZLFNBTVpBLHVCQU5ZOztBQVNkLFVBQUlELGFBQUosRUFBbUI7QUFDakJqQyxzQkFBY3ZILEdBQWQsRUFBbUJ5RSxhQUFuQixFQUFrQ3BDLE9BQWxDO0FBQ0Q7O0FBRUQsVUFBTTZDLE9BQU8sd0NBQW9CN0MsT0FBcEIsQ0FBYjs7QUFFQSxVQUFNMEgsbUNBQXNCLFNBQXRCQSxtQkFBc0IsQ0FBQ0MsSUFBRCxFQUFVO0FBQ3BDLGNBQUksQ0FBQ1QsY0FBTCxFQUFxQjtBQUNuQjtBQUNEOztBQUVELGNBQUluRixhQUFhdUMsR0FBYixDQUFpQnpCLElBQWpCLENBQUosRUFBNEI7QUFDMUI7QUFDRDs7QUFFRCxjQUFNK0UsY0FBYy9GLFdBQVdxQixHQUFYLENBQWVMLElBQWYsQ0FBcEI7QUFDQSxjQUFNRCxZQUFZZ0YsWUFBWTFFLEdBQVosQ0FBZ0IvQyxzQkFBaEIsQ0FBbEI7QUFDQSxjQUFNMEgsbUJBQW1CRCxZQUFZMUUsR0FBWixDQUFnQjdDLDBCQUFoQixDQUF6Qjs7QUFFQXVILGdDQUFtQnpILHNCQUFuQjtBQUNBeUgsZ0NBQW1CdkgsMEJBQW5CO0FBQ0EsY0FBSXVILFlBQVlFLElBQVosR0FBbUIsQ0FBdkIsRUFBMEI7QUFDeEI7QUFDQTtBQUNBOUgsb0JBQVErSCxNQUFSLENBQWVKLEtBQUtLLElBQUwsQ0FBVSxDQUFWLElBQWVMLEtBQUtLLElBQUwsQ0FBVSxDQUFWLENBQWYsR0FBOEJMLElBQTdDLEVBQW1ELGtCQUFuRDtBQUNEO0FBQ0RDLHNCQUFZcEUsR0FBWixDQUFnQnJELHNCQUFoQixFQUF3Q3lDLFNBQXhDO0FBQ0FnRixzQkFBWXBFLEdBQVosQ0FBZ0JuRCwwQkFBaEIsRUFBNEN3SCxnQkFBNUM7QUFDRCxTQXRCSyw4QkFBTjs7QUF3QkEsVUFBTUksMEJBQWEsU0FBYkEsVUFBYSxDQUFDTixJQUFELEVBQU9PLGFBQVAsRUFBc0JDLFlBQXRCLEVBQXVDO0FBQ3hELGNBQUksQ0FBQ2hCLGFBQUwsRUFBb0I7QUFDbEI7QUFDRDs7QUFFRCxjQUFJZ0IsZ0JBQWdCZix1QkFBcEIsRUFBNkM7QUFDM0M7QUFDRDs7QUFFRCxjQUFJckYsYUFBYXVDLEdBQWIsQ0FBaUJ6QixJQUFqQixDQUFKLEVBQTRCO0FBQzFCO0FBQ0Q7O0FBRUQsY0FBSStDLFlBQVkvQyxJQUFaLENBQUosRUFBdUI7QUFDckI7QUFDRDs7QUFFRCxjQUFJWixnQkFBZ0JxQyxHQUFoQixDQUFvQnpCLElBQXBCLENBQUosRUFBK0I7QUFDN0I7QUFDRDs7QUFFRDtBQUNBLGNBQUksQ0FBQ0YsU0FBUzJCLEdBQVQsQ0FBYXpCLElBQWIsQ0FBTCxFQUF5QjtBQUN2QkYsdUJBQVdSLGFBQWEyQyxPQUFPbkgsR0FBUCxDQUFiLEVBQTBCeUUsYUFBMUIsRUFBeUNwQyxPQUF6QyxDQUFYO0FBQ0EsZ0JBQUksQ0FBQzJDLFNBQVMyQixHQUFULENBQWF6QixJQUFiLENBQUwsRUFBeUI7QUFDdkJaLDhCQUFnQk8sR0FBaEIsQ0FBb0JLLElBQXBCO0FBQ0E7QUFDRDtBQUNGOztBQUVEQyxvQkFBVWpCLFdBQVdxQixHQUFYLENBQWVMLElBQWYsQ0FBVjs7QUFFQSxjQUFJLENBQUNDLE9BQUwsRUFBYztBQUNac0Ysb0JBQVFDLEtBQVIsbUJBQXdCeEYsSUFBeEI7QUFDRDs7QUFFRDtBQUNBLGNBQU1ELFlBQVlFLFFBQVFJLEdBQVIsQ0FBWS9DLHNCQUFaLENBQWxCO0FBQ0EsY0FBSSxPQUFPeUMsU0FBUCxLQUFxQixXQUFyQixJQUFvQ3NGLGtCQUFrQjVILHdCQUExRCxFQUFvRjtBQUNsRixnQkFBSXNDLFVBQVVrQixTQUFWLENBQW9CZ0UsSUFBcEIsR0FBMkIsQ0FBL0IsRUFBa0M7QUFDaEM7QUFDRDtBQUNGOztBQUVEO0FBQ0EsY0FBTUQsbUJBQW1CL0UsUUFBUUksR0FBUixDQUFZN0MsMEJBQVosQ0FBekI7QUFDQSxjQUFJLE9BQU93SCxnQkFBUCxLQUE0QixXQUFoQyxFQUE2QztBQUMzQyxnQkFBSUEsaUJBQWlCL0QsU0FBakIsQ0FBMkJnRSxJQUEzQixHQUFrQyxDQUF0QyxFQUF5QztBQUN2QztBQUNEO0FBQ0Y7O0FBRUQ7QUFDQSxjQUFNUSxhQUFhSixrQkFBa0JsSCxPQUFsQixHQUE0QlYsd0JBQTVCLEdBQXVENEgsYUFBMUU7O0FBRUEsY0FBTXJELGtCQUFrQi9CLFFBQVFJLEdBQVIsQ0FBWW9GLFVBQVosQ0FBeEI7O0FBRUEsY0FBTTFFLFFBQVEwRSxlQUFlaEksd0JBQWYsR0FBMENVLE9BQTFDLEdBQW9Ec0gsVUFBbEU7O0FBRUEsY0FBSSxPQUFPekQsZUFBUCxLQUEyQixXQUEvQixFQUE0QztBQUMxQyxnQkFBSUEsZ0JBQWdCZixTQUFoQixDQUEwQmdFLElBQTFCLEdBQWlDLENBQXJDLEVBQXdDO0FBQ3RDOUgsc0JBQVErSCxNQUFSO0FBQ0VKLGtCQURGO0FBRTJCL0QsbUJBRjNCOztBQUlEO0FBQ0YsV0FQRCxNQU9PO0FBQ0w1RCxvQkFBUStILE1BQVI7QUFDRUosZ0JBREY7QUFFMkIvRCxpQkFGM0I7O0FBSUQ7QUFDRixTQXhFSyxxQkFBTjs7QUEwRUE7Ozs7O0FBS0EsVUFBTTJFLGlDQUFvQixTQUFwQkEsaUJBQW9CLENBQUNaLElBQUQsRUFBVTtBQUNsQyxjQUFJNUYsYUFBYXVDLEdBQWIsQ0FBaUJ6QixJQUFqQixDQUFKLEVBQTRCO0FBQzFCO0FBQ0Q7O0FBRUQsY0FBSUMsVUFBVWpCLFdBQVdxQixHQUFYLENBQWVMLElBQWYsQ0FBZDs7QUFFQTtBQUNBO0FBQ0EsY0FBSSxPQUFPQyxPQUFQLEtBQW1CLFdBQXZCLEVBQW9DO0FBQ2xDQSxzQkFBVSxJQUFJbEIsR0FBSixFQUFWO0FBQ0Q7O0FBRUQsY0FBTTRHLGFBQWEsSUFBSTVHLEdBQUosRUFBbkI7QUFDQSxjQUFNNkcsdUJBQXVCLElBQUl6RyxHQUFKLEVBQTdCOztBQUVBMkYsZUFBS0ssSUFBTCxDQUFVdkcsT0FBVixDQUFrQixrQkFBdUMsS0FBcENKLElBQW9DLFVBQXBDQSxJQUFvQyxDQUE5QkgsV0FBOEIsVUFBOUJBLFdBQThCLENBQWpCdUUsVUFBaUIsVUFBakJBLFVBQWlCO0FBQ3ZELGdCQUFJcEUsU0FBU3BCLDBCQUFiLEVBQXlDO0FBQ3ZDd0ksbUNBQXFCakcsR0FBckIsQ0FBeUJsQyx3QkFBekI7QUFDRDtBQUNELGdCQUFJZSxTQUFTbkIsd0JBQWIsRUFBdUM7QUFDckMsa0JBQUl1RixXQUFXMUYsTUFBWCxHQUFvQixDQUF4QixFQUEyQjtBQUN6QjBGLDJCQUFXaEUsT0FBWCxDQUFtQixVQUFDNEMsU0FBRCxFQUFlO0FBQ2hDLHNCQUFJQSxVQUFVcUUsUUFBZCxFQUF3QjtBQUN0QkQseUNBQXFCakcsR0FBckIsQ0FBeUI2QixVQUFVcUUsUUFBVixDQUFtQm5ILElBQW5CLElBQTJCOEMsVUFBVXFFLFFBQVYsQ0FBbUI5RSxLQUF2RTtBQUNEO0FBQ0YsaUJBSkQ7QUFLRDtBQUNEM0MsMkNBQTZCQyxXQUE3QixFQUEwQyxVQUFDSyxJQUFELEVBQVU7QUFDbERrSCxxQ0FBcUJqRyxHQUFyQixDQUF5QmpCLElBQXpCO0FBQ0QsZUFGRDtBQUdEO0FBQ0YsV0FoQkQ7O0FBa0JBO0FBQ0F1QixrQkFBUXJCLE9BQVIsQ0FBZ0IsVUFBQ21DLEtBQUQsRUFBUUMsR0FBUixFQUFnQjtBQUM5QixnQkFBSTRFLHFCQUFxQm5FLEdBQXJCLENBQXlCVCxHQUF6QixDQUFKLEVBQW1DO0FBQ2pDMkUseUJBQVdoRixHQUFYLENBQWVLLEdBQWYsRUFBb0JELEtBQXBCO0FBQ0Q7QUFDRixXQUpEOztBQU1BO0FBQ0E2RSwrQkFBcUJoSCxPQUFyQixDQUE2QixVQUFDb0MsR0FBRCxFQUFTO0FBQ3BDLGdCQUFJLENBQUNmLFFBQVF3QixHQUFSLENBQVlULEdBQVosQ0FBTCxFQUF1QjtBQUNyQjJFLHlCQUFXaEYsR0FBWCxDQUFlSyxHQUFmLEVBQW9CLEVBQUVDLFdBQVcsSUFBSTlCLEdBQUosRUFBYixFQUFwQjtBQUNEO0FBQ0YsV0FKRDs7QUFNQTtBQUNBLGNBQU1ZLFlBQVlFLFFBQVFJLEdBQVIsQ0FBWS9DLHNCQUFaLENBQWxCO0FBQ0EsY0FBSTBILG1CQUFtQi9FLFFBQVFJLEdBQVIsQ0FBWTdDLDBCQUFaLENBQXZCOztBQUVBLGNBQUksT0FBT3dILGdCQUFQLEtBQTRCLFdBQWhDLEVBQTZDO0FBQzNDQSwrQkFBbUIsRUFBRS9ELFdBQVcsSUFBSTlCLEdBQUosRUFBYixFQUFuQjtBQUNEOztBQUVEd0cscUJBQVdoRixHQUFYLENBQWVyRCxzQkFBZixFQUF1Q3lDLFNBQXZDO0FBQ0E0RixxQkFBV2hGLEdBQVgsQ0FBZW5ELDBCQUFmLEVBQTJDd0gsZ0JBQTNDO0FBQ0FoRyxxQkFBVzJCLEdBQVgsQ0FBZVgsSUFBZixFQUFxQjJGLFVBQXJCO0FBQ0QsU0EzREssNEJBQU47O0FBNkRBOzs7OztBQUtBLFVBQU1HLGlDQUFvQixTQUFwQkEsaUJBQW9CLENBQUNoQixJQUFELEVBQVU7QUFDbEMsY0FBSSxDQUFDUixhQUFMLEVBQW9CO0FBQ2xCO0FBQ0Q7O0FBRUQsY0FBSXlCLGlCQUFpQmpILFdBQVd1QixHQUFYLENBQWVMLElBQWYsQ0FBckI7QUFDQSxjQUFJLE9BQU8rRixjQUFQLEtBQTBCLFdBQTlCLEVBQTJDO0FBQ3pDQSw2QkFBaUIsSUFBSWhILEdBQUosRUFBakI7QUFDRDs7QUFFRCxjQUFNaUgsc0JBQXNCLElBQUk3RyxHQUFKLEVBQTVCO0FBQ0EsY0FBTThHLHNCQUFzQixJQUFJOUcsR0FBSixFQUE1Qjs7QUFFQSxjQUFNK0csZUFBZSxJQUFJL0csR0FBSixFQUFyQjtBQUNBLGNBQU1nSCxlQUFlLElBQUloSCxHQUFKLEVBQXJCOztBQUVBLGNBQU1pSCxvQkFBb0IsSUFBSWpILEdBQUosRUFBMUI7QUFDQSxjQUFNa0gsb0JBQW9CLElBQUlsSCxHQUFKLEVBQTFCOztBQUVBLGNBQU1tSCxhQUFhLElBQUl2SCxHQUFKLEVBQW5CO0FBQ0EsY0FBTXdILGFBQWEsSUFBSXhILEdBQUosRUFBbkI7QUFDQWdILHlCQUFlbkgsT0FBZixDQUF1QixVQUFDbUMsS0FBRCxFQUFRQyxHQUFSLEVBQWdCO0FBQ3JDLGdCQUFJRCxNQUFNVSxHQUFOLENBQVVuRSxzQkFBVixDQUFKLEVBQXVDO0FBQ3JDNEksMkJBQWF2RyxHQUFiLENBQWlCcUIsR0FBakI7QUFDRDtBQUNELGdCQUFJRCxNQUFNVSxHQUFOLENBQVVqRSwwQkFBVixDQUFKLEVBQTJDO0FBQ3pDd0ksa0NBQW9CckcsR0FBcEIsQ0FBd0JxQixHQUF4QjtBQUNEO0FBQ0QsZ0JBQUlELE1BQU1VLEdBQU4sQ0FBVWhFLHdCQUFWLENBQUosRUFBeUM7QUFDdkMySSxnQ0FBa0J6RyxHQUFsQixDQUFzQnFCLEdBQXRCO0FBQ0Q7QUFDREQsa0JBQU1uQyxPQUFOLENBQWMsVUFBQzhDLEdBQUQsRUFBUztBQUNyQjtBQUNFQSxzQkFBUWxFLDBCQUFSO0FBQ0drRSxzQkFBUWpFLHdCQUZiO0FBR0U7QUFDQTZJLDJCQUFXM0YsR0FBWCxDQUFlZSxHQUFmLEVBQW9CVixHQUFwQjtBQUNEO0FBQ0YsYUFQRDtBQVFELFdBbEJEOztBQW9CQSxtQkFBU3dGLG9CQUFULENBQThCQyxNQUE5QixFQUFzQztBQUNwQyxnQkFBSUEsT0FBT2pJLElBQVAsS0FBZ0IsU0FBcEIsRUFBK0I7QUFDN0IscUJBQU8sSUFBUDtBQUNEO0FBQ0QsZ0JBQU1rSSxJQUFJLDBCQUFRRCxPQUFPMUYsS0FBZixFQUFzQjVELE9BQXRCLENBQVY7QUFDQSxnQkFBSXVKLEtBQUssSUFBVCxFQUFlO0FBQ2IscUJBQU8sSUFBUDtBQUNEO0FBQ0RULGdDQUFvQnRHLEdBQXBCLENBQXdCK0csQ0FBeEI7QUFDRDs7QUFFRCxrQ0FBTTVCLElBQU4sRUFBWTdGLGNBQWNvQixHQUFkLENBQWtCTCxJQUFsQixDQUFaLEVBQXFDO0FBQ25DMkcsNEJBRG1DLHlDQUNsQkMsS0FEa0IsRUFDWDtBQUN0QkoscUNBQXFCSSxNQUFNSCxNQUEzQjtBQUNELGVBSGtDO0FBSW5DSSwwQkFKbUMsdUNBSXBCRCxLQUpvQixFQUliO0FBQ3BCLG9CQUFJQSxNQUFNRSxNQUFOLENBQWF0SSxJQUFiLEtBQXNCLFFBQTFCLEVBQW9DO0FBQ2xDZ0ksdUNBQXFCSSxNQUFNRyxTQUFOLENBQWdCLENBQWhCLENBQXJCO0FBQ0Q7QUFDRixlQVJrQywyQkFBckM7OztBQVdBakMsZUFBS0ssSUFBTCxDQUFVdkcsT0FBVixDQUFrQixVQUFDb0ksT0FBRCxFQUFhO0FBQzdCLGdCQUFJQyxxQkFBSjs7QUFFQTtBQUNBLGdCQUFJRCxRQUFReEksSUFBUixLQUFpQm5CLHdCQUFyQixFQUErQztBQUM3QyxrQkFBSTJKLFFBQVFQLE1BQVosRUFBb0I7QUFDbEJRLCtCQUFlLDBCQUFRRCxRQUFRUCxNQUFSLENBQWVTLEdBQWYsQ0FBbUJDLE9BQW5CLENBQTJCLFFBQTNCLEVBQXFDLEVBQXJDLENBQVIsRUFBa0RoSyxPQUFsRCxDQUFmO0FBQ0E2Six3QkFBUXBFLFVBQVIsQ0FBbUJoRSxPQUFuQixDQUEyQixVQUFDNEMsU0FBRCxFQUFlO0FBQ3hDLHNCQUFNOUMsT0FBTzhDLFVBQVVGLEtBQVYsQ0FBZ0I1QyxJQUFoQixJQUF3QjhDLFVBQVVGLEtBQVYsQ0FBZ0JQLEtBQXJEO0FBQ0Esc0JBQUlyQyxTQUFTUCxPQUFiLEVBQXNCO0FBQ3BCa0ksc0NBQWtCMUcsR0FBbEIsQ0FBc0JzSCxZQUF0QjtBQUNELG1CQUZELE1BRU87QUFDTFYsK0JBQVc1RixHQUFYLENBQWVqQyxJQUFmLEVBQXFCdUksWUFBckI7QUFDRDtBQUNGLGlCQVBEO0FBUUQ7QUFDRjs7QUFFRCxnQkFBSUQsUUFBUXhJLElBQVIsS0FBaUJsQixzQkFBckIsRUFBNkM7QUFDM0MySiw2QkFBZSwwQkFBUUQsUUFBUVAsTUFBUixDQUFlUyxHQUFmLENBQW1CQyxPQUFuQixDQUEyQixRQUEzQixFQUFxQyxFQUFyQyxDQUFSLEVBQWtEaEssT0FBbEQsQ0FBZjtBQUNBZ0osMkJBQWF4RyxHQUFiLENBQWlCc0gsWUFBakI7QUFDRDs7QUFFRCxnQkFBSUQsUUFBUXhJLElBQVIsS0FBaUJqQixrQkFBckIsRUFBeUM7QUFDdkMwSiw2QkFBZSwwQkFBUUQsUUFBUVAsTUFBUixDQUFlUyxHQUFmLENBQW1CQyxPQUFuQixDQUEyQixRQUEzQixFQUFxQyxFQUFyQyxDQUFSLEVBQWtEaEssT0FBbEQsQ0FBZjtBQUNBLGtCQUFJLENBQUM4SixZQUFMLEVBQW1CO0FBQ2pCO0FBQ0Q7O0FBRUQsa0JBQUk1SCxhQUFhNEgsWUFBYixDQUFKLEVBQWdDO0FBQzlCO0FBQ0Q7O0FBRUQsa0JBQUl0RSx5QkFBeUJxRSxRQUFRcEUsVUFBakMsQ0FBSixFQUFrRDtBQUNoRHFELG9DQUFvQnRHLEdBQXBCLENBQXdCc0gsWUFBeEI7QUFDRDs7QUFFRCxrQkFBSW5FLHVCQUF1QmtFLFFBQVFwRSxVQUEvQixDQUFKLEVBQWdEO0FBQzlDeUQsa0NBQWtCMUcsR0FBbEIsQ0FBc0JzSCxZQUF0QjtBQUNEOztBQUVERCxzQkFBUXBFLFVBQVI7QUFDRzdGLG9CQURILENBQ1UsVUFBQ3lFLFNBQUQsVUFBZUEsVUFBVWhELElBQVYsS0FBbUJmLHdCQUFuQixJQUErQytELFVBQVVoRCxJQUFWLEtBQW1CaEIsMEJBQWpGLEVBRFY7QUFFR29CLHFCQUZILENBRVcsVUFBQzRDLFNBQUQsRUFBZTtBQUN0QitFLDJCQUFXNUYsR0FBWCxDQUFlYSxVQUFVNEYsUUFBVixDQUFtQjFJLElBQW5CLElBQTJCOEMsVUFBVTRGLFFBQVYsQ0FBbUJyRyxLQUE3RCxFQUFvRWtHLFlBQXBFO0FBQ0QsZUFKSDtBQUtEO0FBQ0YsV0EvQ0Q7O0FBaURBZCx1QkFBYXZILE9BQWIsQ0FBcUIsVUFBQ21DLEtBQUQsRUFBVztBQUM5QixnQkFBSSxDQUFDbUYsYUFBYXpFLEdBQWIsQ0FBaUJWLEtBQWpCLENBQUwsRUFBOEI7QUFDNUIsa0JBQUliLFVBQVU2RixlQUFlMUYsR0FBZixDQUFtQlUsS0FBbkIsQ0FBZDtBQUNBLGtCQUFJLE9BQU9iLE9BQVAsS0FBbUIsV0FBdkIsRUFBb0M7QUFDbENBLDBCQUFVLElBQUlmLEdBQUosRUFBVjtBQUNEO0FBQ0RlLHNCQUFRUCxHQUFSLENBQVlyQyxzQkFBWjtBQUNBeUksNkJBQWVwRixHQUFmLENBQW1CSSxLQUFuQixFQUEwQmIsT0FBMUI7O0FBRUEsa0JBQUlELFdBQVVqQixXQUFXcUIsR0FBWCxDQUFlVSxLQUFmLENBQWQ7QUFDQSxrQkFBSVksc0JBQUo7QUFDQSxrQkFBSSxPQUFPMUIsUUFBUCxLQUFtQixXQUF2QixFQUFvQztBQUNsQzBCLGdDQUFnQjFCLFNBQVFJLEdBQVIsQ0FBWS9DLHNCQUFaLENBQWhCO0FBQ0QsZUFGRCxNQUVPO0FBQ0wyQywyQkFBVSxJQUFJbEIsR0FBSixFQUFWO0FBQ0FDLDJCQUFXMkIsR0FBWCxDQUFlSSxLQUFmLEVBQXNCZCxRQUF0QjtBQUNEOztBQUVELGtCQUFJLE9BQU8wQixhQUFQLEtBQXlCLFdBQTdCLEVBQTBDO0FBQ3hDQSw4QkFBY1YsU0FBZCxDQUF3QnRCLEdBQXhCLENBQTRCSyxJQUE1QjtBQUNELGVBRkQsTUFFTztBQUNMLG9CQUFNaUIsWUFBWSxJQUFJOUIsR0FBSixFQUFsQjtBQUNBOEIsMEJBQVV0QixHQUFWLENBQWNLLElBQWQ7QUFDQUMseUJBQVFVLEdBQVIsQ0FBWXJELHNCQUFaLEVBQW9DLEVBQUUyRCxvQkFBRixFQUFwQztBQUNEO0FBQ0Y7QUFDRixXQTFCRDs7QUE0QkFpRix1QkFBYXRILE9BQWIsQ0FBcUIsVUFBQ21DLEtBQUQsRUFBVztBQUM5QixnQkFBSSxDQUFDb0YsYUFBYTFFLEdBQWIsQ0FBaUJWLEtBQWpCLENBQUwsRUFBOEI7QUFDNUIsa0JBQU1iLFVBQVU2RixlQUFlMUYsR0FBZixDQUFtQlUsS0FBbkIsQ0FBaEI7QUFDQWIsZ0NBQWU1QyxzQkFBZjs7QUFFQSxrQkFBTTJDLFlBQVVqQixXQUFXcUIsR0FBWCxDQUFlVSxLQUFmLENBQWhCO0FBQ0Esa0JBQUksT0FBT2QsU0FBUCxLQUFtQixXQUF2QixFQUFvQztBQUNsQyxvQkFBTTBCLGdCQUFnQjFCLFVBQVFJLEdBQVIsQ0FBWS9DLHNCQUFaLENBQXRCO0FBQ0Esb0JBQUksT0FBT3FFLGFBQVAsS0FBeUIsV0FBN0IsRUFBMEM7QUFDeENBLGdDQUFjVixTQUFkLFdBQStCakIsSUFBL0I7QUFDRDtBQUNGO0FBQ0Y7QUFDRixXQWJEOztBQWVBcUcsNEJBQWtCekgsT0FBbEIsQ0FBMEIsVUFBQ21DLEtBQUQsRUFBVztBQUNuQyxnQkFBSSxDQUFDcUYsa0JBQWtCM0UsR0FBbEIsQ0FBc0JWLEtBQXRCLENBQUwsRUFBbUM7QUFDakMsa0JBQUliLFVBQVU2RixlQUFlMUYsR0FBZixDQUFtQlUsS0FBbkIsQ0FBZDtBQUNBLGtCQUFJLE9BQU9iLE9BQVAsS0FBbUIsV0FBdkIsRUFBb0M7QUFDbENBLDBCQUFVLElBQUlmLEdBQUosRUFBVjtBQUNEO0FBQ0RlLHNCQUFRUCxHQUFSLENBQVlsQyx3QkFBWjtBQUNBc0ksNkJBQWVwRixHQUFmLENBQW1CSSxLQUFuQixFQUEwQmIsT0FBMUI7O0FBRUEsa0JBQUlELFlBQVVqQixXQUFXcUIsR0FBWCxDQUFlVSxLQUFmLENBQWQ7QUFDQSxrQkFBSVksc0JBQUo7QUFDQSxrQkFBSSxPQUFPMUIsU0FBUCxLQUFtQixXQUF2QixFQUFvQztBQUNsQzBCLGdDQUFnQjFCLFVBQVFJLEdBQVIsQ0FBWTVDLHdCQUFaLENBQWhCO0FBQ0QsZUFGRCxNQUVPO0FBQ0x3Qyw0QkFBVSxJQUFJbEIsR0FBSixFQUFWO0FBQ0FDLDJCQUFXMkIsR0FBWCxDQUFlSSxLQUFmLEVBQXNCZCxTQUF0QjtBQUNEOztBQUVELGtCQUFJLE9BQU8wQixhQUFQLEtBQXlCLFdBQTdCLEVBQTBDO0FBQ3hDQSw4QkFBY1YsU0FBZCxDQUF3QnRCLEdBQXhCLENBQTRCSyxJQUE1QjtBQUNELGVBRkQsTUFFTztBQUNMLG9CQUFNaUIsWUFBWSxJQUFJOUIsR0FBSixFQUFsQjtBQUNBOEIsMEJBQVV0QixHQUFWLENBQWNLLElBQWQ7QUFDQUMsMEJBQVFVLEdBQVIsQ0FBWWxELHdCQUFaLEVBQXNDLEVBQUV3RCxvQkFBRixFQUF0QztBQUNEO0FBQ0Y7QUFDRixXQTFCRDs7QUE0QkFtRiw0QkFBa0J4SCxPQUFsQixDQUEwQixVQUFDbUMsS0FBRCxFQUFXO0FBQ25DLGdCQUFJLENBQUNzRixrQkFBa0I1RSxHQUFsQixDQUFzQlYsS0FBdEIsQ0FBTCxFQUFtQztBQUNqQyxrQkFBTWIsVUFBVTZGLGVBQWUxRixHQUFmLENBQW1CVSxLQUFuQixDQUFoQjtBQUNBYixnQ0FBZXpDLHdCQUFmOztBQUVBLGtCQUFNd0MsWUFBVWpCLFdBQVdxQixHQUFYLENBQWVVLEtBQWYsQ0FBaEI7QUFDQSxrQkFBSSxPQUFPZCxTQUFQLEtBQW1CLFdBQXZCLEVBQW9DO0FBQ2xDLG9CQUFNMEIsZ0JBQWdCMUIsVUFBUUksR0FBUixDQUFZNUMsd0JBQVosQ0FBdEI7QUFDQSxvQkFBSSxPQUFPa0UsYUFBUCxLQUF5QixXQUE3QixFQUEwQztBQUN4Q0EsZ0NBQWNWLFNBQWQsV0FBK0JqQixJQUEvQjtBQUNEO0FBQ0Y7QUFDRjtBQUNGLFdBYkQ7O0FBZUFpRyw4QkFBb0JySCxPQUFwQixDQUE0QixVQUFDbUMsS0FBRCxFQUFXO0FBQ3JDLGdCQUFJLENBQUNpRixvQkFBb0J2RSxHQUFwQixDQUF3QlYsS0FBeEIsQ0FBTCxFQUFxQztBQUNuQyxrQkFBSWIsVUFBVTZGLGVBQWUxRixHQUFmLENBQW1CVSxLQUFuQixDQUFkO0FBQ0Esa0JBQUksT0FBT2IsT0FBUCxLQUFtQixXQUF2QixFQUFvQztBQUNsQ0EsMEJBQVUsSUFBSWYsR0FBSixFQUFWO0FBQ0Q7QUFDRGUsc0JBQVFQLEdBQVIsQ0FBWW5DLDBCQUFaO0FBQ0F1SSw2QkFBZXBGLEdBQWYsQ0FBbUJJLEtBQW5CLEVBQTBCYixPQUExQjs7QUFFQSxrQkFBSUQsWUFBVWpCLFdBQVdxQixHQUFYLENBQWVVLEtBQWYsQ0FBZDtBQUNBLGtCQUFJWSxzQkFBSjtBQUNBLGtCQUFJLE9BQU8xQixTQUFQLEtBQW1CLFdBQXZCLEVBQW9DO0FBQ2xDMEIsZ0NBQWdCMUIsVUFBUUksR0FBUixDQUFZN0MsMEJBQVosQ0FBaEI7QUFDRCxlQUZELE1BRU87QUFDTHlDLDRCQUFVLElBQUlsQixHQUFKLEVBQVY7QUFDQUMsMkJBQVcyQixHQUFYLENBQWVJLEtBQWYsRUFBc0JkLFNBQXRCO0FBQ0Q7O0FBRUQsa0JBQUksT0FBTzBCLGFBQVAsS0FBeUIsV0FBN0IsRUFBMEM7QUFDeENBLDhCQUFjVixTQUFkLENBQXdCdEIsR0FBeEIsQ0FBNEJLLElBQTVCO0FBQ0QsZUFGRCxNQUVPO0FBQ0wsb0JBQU1pQixZQUFZLElBQUk5QixHQUFKLEVBQWxCO0FBQ0E4QiwwQkFBVXRCLEdBQVYsQ0FBY0ssSUFBZDtBQUNBQywwQkFBUVUsR0FBUixDQUFZbkQsMEJBQVosRUFBd0MsRUFBRXlELG9CQUFGLEVBQXhDO0FBQ0Q7QUFDRjtBQUNGLFdBMUJEOztBQTRCQStFLDhCQUFvQnBILE9BQXBCLENBQTRCLFVBQUNtQyxLQUFELEVBQVc7QUFDckMsZ0JBQUksQ0FBQ2tGLG9CQUFvQnhFLEdBQXBCLENBQXdCVixLQUF4QixDQUFMLEVBQXFDO0FBQ25DLGtCQUFNYixVQUFVNkYsZUFBZTFGLEdBQWYsQ0FBbUJVLEtBQW5CLENBQWhCO0FBQ0FiLGdDQUFlMUMsMEJBQWY7O0FBRUEsa0JBQU15QyxZQUFVakIsV0FBV3FCLEdBQVgsQ0FBZVUsS0FBZixDQUFoQjtBQUNBLGtCQUFJLE9BQU9kLFNBQVAsS0FBbUIsV0FBdkIsRUFBb0M7QUFDbEMsb0JBQU0wQixnQkFBZ0IxQixVQUFRSSxHQUFSLENBQVk3QywwQkFBWixDQUF0QjtBQUNBLG9CQUFJLE9BQU9tRSxhQUFQLEtBQXlCLFdBQTdCLEVBQTBDO0FBQ3hDQSxnQ0FBY1YsU0FBZCxXQUErQmpCLElBQS9CO0FBQ0Q7QUFDRjtBQUNGO0FBQ0YsV0FiRDs7QUFlQXVHLHFCQUFXM0gsT0FBWCxDQUFtQixVQUFDbUMsS0FBRCxFQUFRQyxHQUFSLEVBQWdCO0FBQ2pDLGdCQUFJLENBQUNzRixXQUFXN0UsR0FBWCxDQUFlVCxHQUFmLENBQUwsRUFBMEI7QUFDeEIsa0JBQUlkLFVBQVU2RixlQUFlMUYsR0FBZixDQUFtQlUsS0FBbkIsQ0FBZDtBQUNBLGtCQUFJLE9BQU9iLE9BQVAsS0FBbUIsV0FBdkIsRUFBb0M7QUFDbENBLDBCQUFVLElBQUlmLEdBQUosRUFBVjtBQUNEO0FBQ0RlLHNCQUFRUCxHQUFSLENBQVlxQixHQUFaO0FBQ0ErRSw2QkFBZXBGLEdBQWYsQ0FBbUJJLEtBQW5CLEVBQTBCYixPQUExQjs7QUFFQSxrQkFBSUQsWUFBVWpCLFdBQVdxQixHQUFYLENBQWVVLEtBQWYsQ0FBZDtBQUNBLGtCQUFJWSxzQkFBSjtBQUNBLGtCQUFJLE9BQU8xQixTQUFQLEtBQW1CLFdBQXZCLEVBQW9DO0FBQ2xDMEIsZ0NBQWdCMUIsVUFBUUksR0FBUixDQUFZVyxHQUFaLENBQWhCO0FBQ0QsZUFGRCxNQUVPO0FBQ0xmLDRCQUFVLElBQUlsQixHQUFKLEVBQVY7QUFDQUMsMkJBQVcyQixHQUFYLENBQWVJLEtBQWYsRUFBc0JkLFNBQXRCO0FBQ0Q7O0FBRUQsa0JBQUksT0FBTzBCLGFBQVAsS0FBeUIsV0FBN0IsRUFBMEM7QUFDeENBLDhCQUFjVixTQUFkLENBQXdCdEIsR0FBeEIsQ0FBNEJLLElBQTVCO0FBQ0QsZUFGRCxNQUVPO0FBQ0wsb0JBQU1pQixZQUFZLElBQUk5QixHQUFKLEVBQWxCO0FBQ0E4QiwwQkFBVXRCLEdBQVYsQ0FBY0ssSUFBZDtBQUNBQywwQkFBUVUsR0FBUixDQUFZSyxHQUFaLEVBQWlCLEVBQUVDLG9CQUFGLEVBQWpCO0FBQ0Q7QUFDRjtBQUNGLFdBMUJEOztBQTRCQXFGLHFCQUFXMUgsT0FBWCxDQUFtQixVQUFDbUMsS0FBRCxFQUFRQyxHQUFSLEVBQWdCO0FBQ2pDLGdCQUFJLENBQUN1RixXQUFXOUUsR0FBWCxDQUFlVCxHQUFmLENBQUwsRUFBMEI7QUFDeEIsa0JBQU1kLFVBQVU2RixlQUFlMUYsR0FBZixDQUFtQlUsS0FBbkIsQ0FBaEI7QUFDQWIsZ0NBQWVjLEdBQWY7O0FBRUEsa0JBQU1mLFlBQVVqQixXQUFXcUIsR0FBWCxDQUFlVSxLQUFmLENBQWhCO0FBQ0Esa0JBQUksT0FBT2QsU0FBUCxLQUFtQixXQUF2QixFQUFvQztBQUNsQyxvQkFBTTBCLGdCQUFnQjFCLFVBQVFJLEdBQVIsQ0FBWVcsR0FBWixDQUF0QjtBQUNBLG9CQUFJLE9BQU9XLGFBQVAsS0FBeUIsV0FBN0IsRUFBMEM7QUFDeENBLGdDQUFjVixTQUFkLFdBQStCakIsSUFBL0I7QUFDRDtBQUNGO0FBQ0Y7QUFDRixXQWJEO0FBY0QsU0EzUkssNEJBQU47O0FBNlJBLGFBQU87QUFDTCxzQkFESyxvQ0FDVThFLElBRFYsRUFDZ0I7QUFDbkJZLDhCQUFrQlosSUFBbEI7QUFDQWdCLDhCQUFrQmhCLElBQWxCO0FBQ0FELGdDQUFvQkMsSUFBcEI7QUFDRCxXQUxJO0FBTUx1QyxnQ0FOSyxpREFNb0J2QyxJQU5wQixFQU0wQjtBQUM3Qk0sdUJBQVdOLElBQVgsRUFBaUJySCx3QkFBakIsRUFBMkMsS0FBM0M7QUFDRCxXQVJJO0FBU0w2Siw4QkFUSywrQ0FTa0J4QyxJQVRsQixFQVN3QjtBQUMzQkEsaUJBQUtsQyxVQUFMLENBQWdCaEUsT0FBaEIsQ0FBd0IsVUFBQzRDLFNBQUQsRUFBZTtBQUNyQzRELHlCQUFXNUQsU0FBWCxFQUFzQkEsVUFBVXFFLFFBQVYsQ0FBbUJuSCxJQUFuQixJQUEyQjhDLFVBQVVxRSxRQUFWLENBQW1COUUsS0FBcEUsRUFBMkUsS0FBM0U7QUFDRCxhQUZEO0FBR0EzQyx5Q0FBNkIwRyxLQUFLekcsV0FBbEMsRUFBK0MsVUFBQ0ssSUFBRCxFQUFPNEcsWUFBUCxFQUF3QjtBQUNyRUYseUJBQVdOLElBQVgsRUFBaUJwRyxJQUFqQixFQUF1QjRHLFlBQXZCO0FBQ0QsYUFGRDtBQUdELFdBaEJJLG1DQUFQOztBQWtCRCxLQXBpQmMsbUJBQWpCIiwiZmlsZSI6Im5vLXVudXNlZC1tb2R1bGVzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZU92ZXJ2aWV3IEVuc3VyZXMgdGhhdCBtb2R1bGVzIGNvbnRhaW4gZXhwb3J0cyBhbmQvb3IgYWxsXG4gKiBtb2R1bGVzIGFyZSBjb25zdW1lZCB3aXRoaW4gb3RoZXIgbW9kdWxlcy5cbiAqIEBhdXRob3IgUmVuw6kgRmVybWFublxuICovXG5cbmltcG9ydCB7IGdldFBoeXNpY2FsRmlsZW5hbWUgfSBmcm9tICdlc2xpbnQtbW9kdWxlLXV0aWxzL2NvbnRleHRDb21wYXQnO1xuaW1wb3J0IHsgZ2V0RmlsZUV4dGVuc2lvbnMgfSBmcm9tICdlc2xpbnQtbW9kdWxlLXV0aWxzL2lnbm9yZSc7XG5pbXBvcnQgcmVzb2x2ZSBmcm9tICdlc2xpbnQtbW9kdWxlLXV0aWxzL3Jlc29sdmUnO1xuaW1wb3J0IHZpc2l0IGZyb20gJ2VzbGludC1tb2R1bGUtdXRpbHMvdmlzaXQnO1xuaW1wb3J0IHsgZGlybmFtZSwgam9pbiwgcmVzb2x2ZSBhcyByZXNvbHZlUGF0aCB9IGZyb20gJ3BhdGgnO1xuaW1wb3J0IHJlYWRQa2dVcCBmcm9tICdlc2xpbnQtbW9kdWxlLXV0aWxzL3JlYWRQa2dVcCc7XG5pbXBvcnQgdmFsdWVzIGZyb20gJ29iamVjdC52YWx1ZXMnO1xuaW1wb3J0IGluY2x1ZGVzIGZyb20gJ2FycmF5LWluY2x1ZGVzJztcbmltcG9ydCBmbGF0TWFwIGZyb20gJ2FycmF5LnByb3RvdHlwZS5mbGF0bWFwJztcblxuaW1wb3J0IHsgd2Fsa1N5bmMgfSBmcm9tICcuLi9jb3JlL2ZzV2Fsayc7XG5pbXBvcnQgRXhwb3J0TWFwQnVpbGRlciBmcm9tICcuLi9leHBvcnRNYXAvYnVpbGRlcic7XG5pbXBvcnQgcmVjdXJzaXZlUGF0dGVybkNhcHR1cmUgZnJvbSAnLi4vZXhwb3J0TWFwL3BhdHRlcm5DYXB0dXJlJztcbmltcG9ydCBkb2NzVXJsIGZyb20gJy4uL2RvY3NVcmwnO1xuXG4vKipcbiAqIEF0dGVtcHQgdG8gbG9hZCB0aGUgaW50ZXJuYWwgYEZpbGVFbnVtZXJhdG9yYCBjbGFzcywgd2hpY2ggaGFzIGV4aXN0ZWQgaW4gYSBjb3VwbGVcbiAqIG9mIGRpZmZlcmVudCBwbGFjZXMsIGRlcGVuZGluZyBvbiB0aGUgdmVyc2lvbiBvZiBgZXNsaW50YC4gIFRyeSByZXF1aXJpbmcgaXQgZnJvbSBib3RoXG4gKiBsb2NhdGlvbnMuXG4gKiBAcmV0dXJucyBSZXR1cm5zIHRoZSBgRmlsZUVudW1lcmF0b3JgIGNsYXNzIGlmIGl0cyByZXF1aXJhYmxlLCBvdGhlcndpc2UgYHVuZGVmaW5lZGAuXG4gKi9cbmZ1bmN0aW9uIHJlcXVpcmVGaWxlRW51bWVyYXRvcigpIHtcbiAgbGV0IEZpbGVFbnVtZXJhdG9yO1xuXG4gIC8vIFRyeSBnZXR0aW5nIGl0IGZyb20gdGhlIGVzbGludCBwcml2YXRlIC8gZGVwcmVjYXRlZCBhcGlcbiAgdHJ5IHtcbiAgICAoeyBGaWxlRW51bWVyYXRvciB9ID0gcmVxdWlyZSgnZXNsaW50L3VzZS1hdC15b3VyLW93bi1yaXNrJykpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgLy8gQWJzb3JiIHRoaXMgaWYgaXQncyBNT0RVTEVfTk9UX0ZPVU5EXG4gICAgaWYgKGUuY29kZSAhPT0gJ01PRFVMRV9OT1RfRk9VTkQnKSB7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cblxuICAgIC8vIElmIG5vdCB0aGVyZSwgdGhlbiB0cnkgZ2V0dGluZyBpdCBmcm9tIGVzbGludC9saWIvY2xpLWVuZ2luZS9maWxlLWVudW1lcmF0b3IgKG1vdmVkIHRoZXJlIGluIHY2KVxuICAgIHRyeSB7XG4gICAgICAoeyBGaWxlRW51bWVyYXRvciB9ID0gcmVxdWlyZSgnZXNsaW50L2xpYi9jbGktZW5naW5lL2ZpbGUtZW51bWVyYXRvcicpKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBBYnNvcmIgdGhpcyBpZiBpdCdzIE1PRFVMRV9OT1RfRk9VTkRcbiAgICAgIGlmIChlLmNvZGUgIT09ICdNT0RVTEVfTk9UX0ZPVU5EJykge1xuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gRmlsZUVudW1lcmF0b3I7XG59XG5cbi8qKlxuICpcbiAqIEBwYXJhbSBGaWxlRW51bWVyYXRvciB0aGUgYEZpbGVFbnVtZXJhdG9yYCBjbGFzcyBmcm9tIGBlc2xpbnRgJ3MgaW50ZXJuYWwgYXBpXG4gKiBAcGFyYW0ge3N0cmluZ30gc3JjIHBhdGggdG8gdGhlIHNyYyByb290XG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBleHRlbnNpb25zIGxpc3Qgb2Ygc3VwcG9ydGVkIGV4dGVuc2lvbnNcbiAqIEByZXR1cm5zIHt7IGZpbGVuYW1lOiBzdHJpbmcsIGlnbm9yZWQ6IGJvb2xlYW4gfVtdfSBsaXN0IG9mIGZpbGVzIHRvIG9wZXJhdGUgb25cbiAqL1xuZnVuY3Rpb24gbGlzdEZpbGVzVXNpbmdGaWxlRW51bWVyYXRvcihGaWxlRW51bWVyYXRvciwgc3JjLCBleHRlbnNpb25zKSB7XG4gIGNvbnN0IGUgPSBuZXcgRmlsZUVudW1lcmF0b3Ioe1xuICAgIGV4dGVuc2lvbnMsXG4gIH0pO1xuXG4gIHJldHVybiBBcnJheS5mcm9tKFxuICAgIGUuaXRlcmF0ZUZpbGVzKHNyYyksXG4gICAgKHsgZmlsZVBhdGgsIGlnbm9yZWQgfSkgPT4gKHsgZmlsZW5hbWU6IGZpbGVQYXRoLCBpZ25vcmVkIH0pLFxuICApO1xufVxuXG4vKipcbiAqIEF0dGVtcHQgdG8gcmVxdWlyZSBvbGQgdmVyc2lvbnMgb2YgdGhlIGZpbGUgZW51bWVyYXRpb24gY2FwYWJpbGl0eSBmcm9tIHY2IGBlc2xpbnRgIGFuZCBlYXJsaWVyLCBhbmQgdXNlXG4gKiB0aG9zZSBmdW5jdGlvbnMgdG8gcHJvdmlkZSB0aGUgbGlzdCBvZiBmaWxlcyB0byBvcGVyYXRlIG9uXG4gKiBAcGFyYW0ge3N0cmluZ30gc3JjIHBhdGggdG8gdGhlIHNyYyByb290XG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBleHRlbnNpb25zIGxpc3Qgb2Ygc3VwcG9ydGVkIGV4dGVuc2lvbnNcbiAqIEByZXR1cm5zIHtzdHJpbmdbXX0gbGlzdCBvZiBmaWxlcyB0byBvcGVyYXRlIG9uXG4gKi9cbmZ1bmN0aW9uIGxpc3RGaWxlc1dpdGhMZWdhY3lGdW5jdGlvbnMoc3JjLCBleHRlbnNpb25zKSB7XG4gIHRyeSB7XG4gICAgLy8gZXNsaW50L2xpYi91dGlsL2dsb2ItdXRpbCBoYXMgYmVlbiBtb3ZlZCB0byBlc2xpbnQvbGliL3V0aWwvZ2xvYi11dGlscyB3aXRoIHZlcnNpb24gNS4zXG4gICAgY29uc3QgeyBsaXN0RmlsZXNUb1Byb2Nlc3M6IG9yaWdpbmFsTGlzdEZpbGVzVG9Qcm9jZXNzIH0gPSByZXF1aXJlKCdlc2xpbnQvbGliL3V0aWwvZ2xvYi11dGlscycpO1xuICAgIC8vIFByZXZlbnQgcGFzc2luZyBpbnZhbGlkIG9wdGlvbnMgKGV4dGVuc2lvbnMgYXJyYXkpIHRvIG9sZCB2ZXJzaW9ucyBvZiB0aGUgZnVuY3Rpb24uXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2VzbGludC9lc2xpbnQvYmxvYi92NS4xNi4wL2xpYi91dGlsL2dsb2ItdXRpbHMuanMjTDE3OC1MMjgwXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2VzbGludC9lc2xpbnQvYmxvYi92NS4yLjAvbGliL3V0aWwvZ2xvYi11dGlsLmpzI0wxNzQtTDI2OVxuXG4gICAgcmV0dXJuIG9yaWdpbmFsTGlzdEZpbGVzVG9Qcm9jZXNzKHNyYywge1xuICAgICAgZXh0ZW5zaW9ucyxcbiAgICB9KTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIC8vIEFic29yYiB0aGlzIGlmIGl0J3MgTU9EVUxFX05PVF9GT1VORFxuICAgIGlmIChlLmNvZGUgIT09ICdNT0RVTEVfTk9UX0ZPVU5EJykge1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG5cbiAgICAvLyBMYXN0IHBsYWNlIHRvIHRyeSAocHJlIHY1LjMpXG4gICAgY29uc3Qge1xuICAgICAgbGlzdEZpbGVzVG9Qcm9jZXNzOiBvcmlnaW5hbExpc3RGaWxlc1RvUHJvY2VzcyxcbiAgICB9ID0gcmVxdWlyZSgnZXNsaW50L2xpYi91dGlsL2dsb2ItdXRpbCcpO1xuICAgIGNvbnN0IHBhdHRlcm5zID0gc3JjLmNvbmNhdChcbiAgICAgIGZsYXRNYXAoXG4gICAgICAgIHNyYyxcbiAgICAgICAgKHBhdHRlcm4pID0+IGV4dGVuc2lvbnMubWFwKChleHRlbnNpb24pID0+ICgvXFwqXFwqfFxcKlxcLi8pLnRlc3QocGF0dGVybikgPyBwYXR0ZXJuIDogYCR7cGF0dGVybn0vKiovKiR7ZXh0ZW5zaW9ufWApLFxuICAgICAgKSxcbiAgICApO1xuXG4gICAgcmV0dXJuIG9yaWdpbmFsTGlzdEZpbGVzVG9Qcm9jZXNzKHBhdHRlcm5zKTtcbiAgfVxufVxuXG4vKipcbiAqIEdpdmVuIGEgc291cmNlIHJvb3QgYW5kIGxpc3Qgb2Ygc3VwcG9ydGVkIGV4dGVuc2lvbnMsIHVzZSBmc1dhbGsgYW5kIHRoZVxuICogbmV3IGBlc2xpbnRgIGBjb250ZXh0LnNlc3Npb25gIGFwaSB0byBidWlsZCB0aGUgbGlzdCBvZiBmaWxlcyB3ZSB3YW50IHRvIG9wZXJhdGUgb25cbiAqIEBwYXJhbSB7c3RyaW5nW119IHNyY1BhdGhzIGFycmF5IG9mIHNvdXJjZSBwYXRocyAoZm9yIGZsYXQgY29uZmlnIHRoaXMgc2hvdWxkIGp1c3QgYmUgYSBzaW5ndWxhciByb290IChlLmcuIGN3ZCkpXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBleHRlbnNpb25zIGxpc3Qgb2Ygc3VwcG9ydGVkIGV4dGVuc2lvbnNcbiAqIEBwYXJhbSB7eyBpc0RpcmVjdG9yeUlnbm9yZWQ6IChwYXRoOiBzdHJpbmcpID0+IGJvb2xlYW4sIGlzRmlsZUlnbm9yZWQ6IChwYXRoOiBzdHJpbmcpID0+IGJvb2xlYW4gfX0gc2Vzc2lvbiBlc2xpbnQgY29udGV4dCBzZXNzaW9uIG9iamVjdFxuICogQHJldHVybnMge3N0cmluZ1tdfSBsaXN0IG9mIGZpbGVzIHRvIG9wZXJhdGUgb25cbiAqL1xuZnVuY3Rpb24gbGlzdEZpbGVzV2l0aE1vZGVybkFwaShzcmNQYXRocywgZXh0ZW5zaW9ucywgc2Vzc2lvbikge1xuICAvKiogQHR5cGUge3N0cmluZ1tdfSAqL1xuICBjb25zdCBmaWxlcyA9IFtdO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc3JjUGF0aHMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBzcmMgPSBzcmNQYXRoc1tpXTtcbiAgICAvLyBVc2Ugd2Fsa1N5bmMgYWxvbmcgd2l0aCB0aGUgbmV3IHNlc3Npb24gYXBpIHRvIGdhdGhlciB0aGUgbGlzdCBvZiBmaWxlc1xuICAgIGNvbnN0IGVudHJpZXMgPSB3YWxrU3luYyhzcmMsIHtcbiAgICAgIGRlZXBGaWx0ZXIoZW50cnkpIHtcbiAgICAgICAgY29uc3QgZnVsbEVudHJ5UGF0aCA9IHJlc29sdmVQYXRoKHNyYywgZW50cnkucGF0aCk7XG5cbiAgICAgICAgLy8gSW5jbHVkZSB0aGUgZGlyZWN0b3J5IGlmIGl0J3Mgbm90IG1hcmtlZCBhcyBpZ25vcmUgYnkgZXNsaW50XG4gICAgICAgIHJldHVybiAhc2Vzc2lvbi5pc0RpcmVjdG9yeUlnbm9yZWQoZnVsbEVudHJ5UGF0aCk7XG4gICAgICB9LFxuICAgICAgZW50cnlGaWx0ZXIoZW50cnkpIHtcbiAgICAgICAgY29uc3QgZnVsbEVudHJ5UGF0aCA9IHJlc29sdmVQYXRoKHNyYywgZW50cnkucGF0aCk7XG5cbiAgICAgICAgLy8gSW5jbHVkZSB0aGUgZmlsZSBpZiBpdCdzIG5vdCBtYXJrZWQgYXMgaWdub3JlIGJ5IGVzbGludCBhbmQgaXRzIGV4dGVuc2lvbiBpcyBpbmNsdWRlZCBpbiBvdXIgbGlzdFxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICFzZXNzaW9uLmlzRmlsZUlnbm9yZWQoZnVsbEVudHJ5UGF0aClcbiAgICAgICAgICAmJiBleHRlbnNpb25zLmZpbmQoKGV4dGVuc2lvbikgPT4gZW50cnkucGF0aC5lbmRzV2l0aChleHRlbnNpb24pKVxuICAgICAgICApO1xuICAgICAgfSxcbiAgICB9KTtcblxuICAgIC8vIEZpbHRlciBvdXQgZGlyZWN0b3JpZXMgYW5kIG1hcCBlbnRyaWVzIHRvIHRoZWlyIHBhdGhzXG4gICAgZmlsZXMucHVzaChcbiAgICAgIC4uLmVudHJpZXNcbiAgICAgICAgLmZpbHRlcigoZW50cnkpID0+ICFlbnRyeS5kaXJlbnQuaXNEaXJlY3RvcnkoKSlcbiAgICAgICAgLm1hcCgoZW50cnkpID0+IGVudHJ5LnBhdGgpLFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIGZpbGVzO1xufVxuXG4vKipcbiAqIEdpdmVuIGEgc3JjIHBhdHRlcm4gYW5kIGxpc3Qgb2Ygc3VwcG9ydGVkIGV4dGVuc2lvbnMsIHJldHVybiBhIGxpc3Qgb2YgZmlsZXMgdG8gcHJvY2Vzc1xuICogd2l0aCB0aGlzIHJ1bGUuXG4gKiBAcGFyYW0ge3N0cmluZ30gc3JjIC0gZmlsZSwgZGlyZWN0b3J5LCBvciBnbG9iIHBhdHRlcm4gb2YgZmlsZXMgdG8gYWN0IG9uXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBleHRlbnNpb25zIC0gbGlzdCBvZiBzdXBwb3J0ZWQgZmlsZSBleHRlbnNpb25zXG4gKiBAcGFyYW0ge2ltcG9ydCgnZXNsaW50JykuUnVsZS5SdWxlQ29udGV4dH0gY29udGV4dCAtIHRoZSBlc2xpbnQgY29udGV4dCBvYmplY3RcbiAqIEByZXR1cm5zIHtzdHJpbmdbXSB8IHsgZmlsZW5hbWU6IHN0cmluZywgaWdub3JlZDogYm9vbGVhbiB9W119IHRoZSBsaXN0IG9mIGZpbGVzIHRoYXQgdGhpcyBydWxlIHdpbGwgZXZhbHVhdGUuXG4gKi9cbmZ1bmN0aW9uIGxpc3RGaWxlc1RvUHJvY2VzcyhzcmMsIGV4dGVuc2lvbnMsIGNvbnRleHQpIHtcbiAgLy8gSWYgdGhlIGNvbnRleHQgb2JqZWN0IGhhcyB0aGUgbmV3IHNlc3Npb24gZnVuY3Rpb25zLCB0aGVuIHByZWZlciB0aG9zZVxuICAvLyBPdGhlcndpc2UsIGZhbGxiYWNrIHRvIHVzaW5nIHRoZSBkZXByZWNhdGVkIGBGaWxlRW51bWVyYXRvcmAgZm9yIGxlZ2FjeSBzdXBwb3J0LlxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vZXNsaW50L2VzbGludC9pc3N1ZXMvMTgwODdcbiAgaWYgKFxuICAgIGNvbnRleHQuc2Vzc2lvblxuICAgICYmIGNvbnRleHQuc2Vzc2lvbi5pc0ZpbGVJZ25vcmVkXG4gICAgJiYgY29udGV4dC5zZXNzaW9uLmlzRGlyZWN0b3J5SWdub3JlZFxuICApIHtcbiAgICByZXR1cm4gbGlzdEZpbGVzV2l0aE1vZGVybkFwaShzcmMsIGV4dGVuc2lvbnMsIGNvbnRleHQuc2Vzc2lvbik7XG4gIH1cblxuICAvLyBGYWxsYmFjayB0byBvZyBGaWxlRW51bWVyYXRvclxuICBjb25zdCBGaWxlRW51bWVyYXRvciA9IHJlcXVpcmVGaWxlRW51bWVyYXRvcigpO1xuXG4gIC8vIElmIHdlIGdvdCB0aGUgRmlsZUVudW1lcmF0b3IsIHRoZW4gbGV0J3MgZ28gd2l0aCB0aGF0XG4gIGlmIChGaWxlRW51bWVyYXRvcikge1xuICAgIHJldHVybiBsaXN0RmlsZXNVc2luZ0ZpbGVFbnVtZXJhdG9yKEZpbGVFbnVtZXJhdG9yLCBzcmMsIGV4dGVuc2lvbnMpO1xuICB9XG4gIC8vIElmIG5vdCwgdGhlbiB3ZSBjYW4gdHJ5IGV2ZW4gb2xkZXIgdmVyc2lvbnMgb2YgdGhpcyBjYXBhYmlsaXR5IChsaXN0RmlsZXNUb1Byb2Nlc3MpXG4gIHJldHVybiBsaXN0RmlsZXNXaXRoTGVnYWN5RnVuY3Rpb25zKHNyYywgZXh0ZW5zaW9ucyk7XG59XG5cbmNvbnN0IEVYUE9SVF9ERUZBVUxUX0RFQ0xBUkFUSU9OID0gJ0V4cG9ydERlZmF1bHREZWNsYXJhdGlvbic7XG5jb25zdCBFWFBPUlRfTkFNRURfREVDTEFSQVRJT04gPSAnRXhwb3J0TmFtZWREZWNsYXJhdGlvbic7XG5jb25zdCBFWFBPUlRfQUxMX0RFQ0xBUkFUSU9OID0gJ0V4cG9ydEFsbERlY2xhcmF0aW9uJztcbmNvbnN0IElNUE9SVF9ERUNMQVJBVElPTiA9ICdJbXBvcnREZWNsYXJhdGlvbic7XG5jb25zdCBJTVBPUlRfTkFNRVNQQUNFX1NQRUNJRklFUiA9ICdJbXBvcnROYW1lc3BhY2VTcGVjaWZpZXInO1xuY29uc3QgSU1QT1JUX0RFRkFVTFRfU1BFQ0lGSUVSID0gJ0ltcG9ydERlZmF1bHRTcGVjaWZpZXInO1xuY29uc3QgVkFSSUFCTEVfREVDTEFSQVRJT04gPSAnVmFyaWFibGVEZWNsYXJhdGlvbic7XG5jb25zdCBGVU5DVElPTl9ERUNMQVJBVElPTiA9ICdGdW5jdGlvbkRlY2xhcmF0aW9uJztcbmNvbnN0IENMQVNTX0RFQ0xBUkFUSU9OID0gJ0NsYXNzRGVjbGFyYXRpb24nO1xuY29uc3QgSURFTlRJRklFUiA9ICdJZGVudGlmaWVyJztcbmNvbnN0IE9CSkVDVF9QQVRURVJOID0gJ09iamVjdFBhdHRlcm4nO1xuY29uc3QgQVJSQVlfUEFUVEVSTiA9ICdBcnJheVBhdHRlcm4nO1xuY29uc3QgVFNfSU5URVJGQUNFX0RFQ0xBUkFUSU9OID0gJ1RTSW50ZXJmYWNlRGVjbGFyYXRpb24nO1xuY29uc3QgVFNfVFlQRV9BTElBU19ERUNMQVJBVElPTiA9ICdUU1R5cGVBbGlhc0RlY2xhcmF0aW9uJztcbmNvbnN0IFRTX0VOVU1fREVDTEFSQVRJT04gPSAnVFNFbnVtRGVjbGFyYXRpb24nO1xuY29uc3QgREVGQVVMVCA9ICdkZWZhdWx0JztcblxuZnVuY3Rpb24gZm9yRWFjaERlY2xhcmF0aW9uSWRlbnRpZmllcihkZWNsYXJhdGlvbiwgY2IpIHtcbiAgaWYgKGRlY2xhcmF0aW9uKSB7XG4gICAgY29uc3QgaXNUeXBlRGVjbGFyYXRpb24gPSBkZWNsYXJhdGlvbi50eXBlID09PSBUU19JTlRFUkZBQ0VfREVDTEFSQVRJT05cbiAgICAgIHx8IGRlY2xhcmF0aW9uLnR5cGUgPT09IFRTX1RZUEVfQUxJQVNfREVDTEFSQVRJT05cbiAgICAgIHx8IGRlY2xhcmF0aW9uLnR5cGUgPT09IFRTX0VOVU1fREVDTEFSQVRJT047XG5cbiAgICBpZiAoXG4gICAgICBkZWNsYXJhdGlvbi50eXBlID09PSBGVU5DVElPTl9ERUNMQVJBVElPTlxuICAgICAgfHwgZGVjbGFyYXRpb24udHlwZSA9PT0gQ0xBU1NfREVDTEFSQVRJT05cbiAgICAgIHx8IGlzVHlwZURlY2xhcmF0aW9uXG4gICAgKSB7XG4gICAgICBjYihkZWNsYXJhdGlvbi5pZC5uYW1lLCBpc1R5cGVEZWNsYXJhdGlvbik7XG4gICAgfSBlbHNlIGlmIChkZWNsYXJhdGlvbi50eXBlID09PSBWQVJJQUJMRV9ERUNMQVJBVElPTikge1xuICAgICAgZGVjbGFyYXRpb24uZGVjbGFyYXRpb25zLmZvckVhY2goKHsgaWQgfSkgPT4ge1xuICAgICAgICBpZiAoaWQudHlwZSA9PT0gT0JKRUNUX1BBVFRFUk4pIHtcbiAgICAgICAgICByZWN1cnNpdmVQYXR0ZXJuQ2FwdHVyZShpZCwgKHBhdHRlcm4pID0+IHtcbiAgICAgICAgICAgIGlmIChwYXR0ZXJuLnR5cGUgPT09IElERU5USUZJRVIpIHtcbiAgICAgICAgICAgICAgY2IocGF0dGVybi5uYW1lLCBmYWxzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAoaWQudHlwZSA9PT0gQVJSQVlfUEFUVEVSTikge1xuICAgICAgICAgIGlkLmVsZW1lbnRzLmZvckVhY2goKHsgbmFtZSB9KSA9PiB7XG4gICAgICAgICAgICBjYihuYW1lLCBmYWxzZSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2IoaWQubmFtZSwgZmFsc2UpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBMaXN0IG9mIGltcG9ydHMgcGVyIGZpbGUuXG4gKlxuICogUmVwcmVzZW50ZWQgYnkgYSB0d28tbGV2ZWwgTWFwIHRvIGEgU2V0IG9mIGlkZW50aWZpZXJzLiBUaGUgdXBwZXItbGV2ZWwgTWFwXG4gKiBrZXlzIGFyZSB0aGUgcGF0aHMgdG8gdGhlIG1vZHVsZXMgY29udGFpbmluZyB0aGUgaW1wb3J0cywgd2hpbGUgdGhlXG4gKiBsb3dlci1sZXZlbCBNYXAga2V5cyBhcmUgdGhlIHBhdGhzIHRvIHRoZSBmaWxlcyB3aGljaCBhcmUgYmVpbmcgaW1wb3J0ZWRcbiAqIGZyb20uIExhc3RseSwgdGhlIFNldCBvZiBpZGVudGlmaWVycyBjb250YWlucyBlaXRoZXIgbmFtZXMgYmVpbmcgaW1wb3J0ZWRcbiAqIG9yIGEgc3BlY2lhbCBBU1Qgbm9kZSBuYW1lIGxpc3RlZCBhYm92ZSAoZS5nIEltcG9ydERlZmF1bHRTcGVjaWZpZXIpLlxuICpcbiAqIEZvciBleGFtcGxlLCBpZiB3ZSBoYXZlIGEgZmlsZSBuYW1lZCBmb28uanMgY29udGFpbmluZzpcbiAqXG4gKiAgIGltcG9ydCB7IG8yIH0gZnJvbSAnLi9iYXIuanMnO1xuICpcbiAqIFRoZW4gd2Ugd2lsbCBoYXZlIGEgc3RydWN0dXJlIHRoYXQgbG9va3MgbGlrZTpcbiAqXG4gKiAgIE1hcCB7ICdmb28uanMnID0+IE1hcCB7ICdiYXIuanMnID0+IFNldCB7ICdvMicgfSB9IH1cbiAqXG4gKiBAdHlwZSB7TWFwPHN0cmluZywgTWFwPHN0cmluZywgU2V0PHN0cmluZz4+Pn1cbiAqL1xuY29uc3QgaW1wb3J0TGlzdCA9IG5ldyBNYXAoKTtcblxuLyoqXG4gKiBMaXN0IG9mIGV4cG9ydHMgcGVyIGZpbGUuXG4gKlxuICogUmVwcmVzZW50ZWQgYnkgYSB0d28tbGV2ZWwgTWFwIHRvIGFuIG9iamVjdCBvZiBtZXRhZGF0YS4gVGhlIHVwcGVyLWxldmVsIE1hcFxuICoga2V5cyBhcmUgdGhlIHBhdGhzIHRvIHRoZSBtb2R1bGVzIGNvbnRhaW5pbmcgdGhlIGV4cG9ydHMsIHdoaWxlIHRoZVxuICogbG93ZXItbGV2ZWwgTWFwIGtleXMgYXJlIHRoZSBzcGVjaWZpYyBpZGVudGlmaWVycyBvciBzcGVjaWFsIEFTVCBub2RlIG5hbWVzXG4gKiBiZWluZyBleHBvcnRlZC4gVGhlIGxlYWYtbGV2ZWwgbWV0YWRhdGEgb2JqZWN0IGF0IHRoZSBtb21lbnQgb25seSBjb250YWlucyBhXG4gKiBgd2hlcmVVc2VkYCBwcm9wZXJ0eSwgd2hpY2ggY29udGFpbnMgYSBTZXQgb2YgcGF0aHMgdG8gbW9kdWxlcyB0aGF0IGltcG9ydFxuICogdGhlIG5hbWUuXG4gKlxuICogRm9yIGV4YW1wbGUsIGlmIHdlIGhhdmUgYSBmaWxlIG5hbWVkIGJhci5qcyBjb250YWluaW5nIHRoZSBmb2xsb3dpbmcgZXhwb3J0czpcbiAqXG4gKiAgIGNvbnN0IG8yID0gJ2Jhcic7XG4gKiAgIGV4cG9ydCB7IG8yIH07XG4gKlxuICogQW5kIGEgZmlsZSBuYW1lZCBmb28uanMgY29udGFpbmluZyB0aGUgZm9sbG93aW5nIGltcG9ydDpcbiAqXG4gKiAgIGltcG9ydCB7IG8yIH0gZnJvbSAnLi9iYXIuanMnO1xuICpcbiAqIFRoZW4gd2Ugd2lsbCBoYXZlIGEgc3RydWN0dXJlIHRoYXQgbG9va3MgbGlrZTpcbiAqXG4gKiAgIE1hcCB7ICdiYXIuanMnID0+IE1hcCB7ICdvMicgPT4geyB3aGVyZVVzZWQ6IFNldCB7ICdmb28uanMnIH0gfSB9IH1cbiAqXG4gKiBAdHlwZSB7TWFwPHN0cmluZywgTWFwPHN0cmluZywgb2JqZWN0Pj59XG4gKi9cbmNvbnN0IGV4cG9ydExpc3QgPSBuZXcgTWFwKCk7XG5cbmNvbnN0IHZpc2l0b3JLZXlNYXAgPSBuZXcgTWFwKCk7XG5cbi8qKiBAdHlwZSB7U2V0PHN0cmluZz59ICovXG5jb25zdCBpZ25vcmVkRmlsZXMgPSBuZXcgU2V0KCk7XG5jb25zdCBmaWxlc091dHNpZGVTcmMgPSBuZXcgU2V0KCk7XG5cbmNvbnN0IGlzTm9kZU1vZHVsZSA9IChwYXRoKSA9PiAoL1xcLyhub2RlX21vZHVsZXMpXFwvLykudGVzdChwYXRoKTtcblxuLyoqXG4gKiByZWFkIGFsbCBmaWxlcyBtYXRjaGluZyB0aGUgcGF0dGVybnMgaW4gc3JjIGFuZCBpZ25vcmVFeHBvcnRzXG4gKlxuICogcmV0dXJuIGFsbCBmaWxlcyBtYXRjaGluZyBzcmMgcGF0dGVybiwgd2hpY2ggYXJlIG5vdCBtYXRjaGluZyB0aGUgaWdub3JlRXhwb3J0cyBwYXR0ZXJuXG4gKiBAdHlwZSB7KHNyYzogc3RyaW5nLCBpZ25vcmVFeHBvcnRzOiBzdHJpbmcsIGNvbnRleHQ6IGltcG9ydCgnZXNsaW50JykuUnVsZS5SdWxlQ29udGV4dCkgPT4gU2V0PHN0cmluZz59XG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVGaWxlcyhzcmMsIGlnbm9yZUV4cG9ydHMsIGNvbnRleHQpIHtcbiAgY29uc3QgZXh0ZW5zaW9ucyA9IEFycmF5LmZyb20oZ2V0RmlsZUV4dGVuc2lvbnMoY29udGV4dC5zZXR0aW5ncykpO1xuXG4gIGNvbnN0IHNyY0ZpbGVMaXN0ID0gbGlzdEZpbGVzVG9Qcm9jZXNzKHNyYywgZXh0ZW5zaW9ucywgY29udGV4dCk7XG5cbiAgLy8gcHJlcGFyZSBsaXN0IG9mIGlnbm9yZWQgZmlsZXNcbiAgY29uc3QgaWdub3JlZEZpbGVzTGlzdCA9IGxpc3RGaWxlc1RvUHJvY2VzcyhpZ25vcmVFeHBvcnRzLCBleHRlbnNpb25zLCBjb250ZXh0KTtcblxuICAvLyBUaGUgbW9kZXJuIGFwaSB3aWxsIHJldHVybiBhIGxpc3Qgb2YgZmlsZSBwYXRocywgcmF0aGVyIHRoYW4gYW4gb2JqZWN0XG4gIGlmIChpZ25vcmVkRmlsZXNMaXN0Lmxlbmd0aCAmJiB0eXBlb2YgaWdub3JlZEZpbGVzTGlzdFswXSA9PT0gJ3N0cmluZycpIHtcbiAgICBpZ25vcmVkRmlsZXNMaXN0LmZvckVhY2goKGZpbGVuYW1lKSA9PiBpZ25vcmVkRmlsZXMuYWRkKGZpbGVuYW1lKSk7XG4gIH0gZWxzZSB7XG4gICAgaWdub3JlZEZpbGVzTGlzdC5mb3JFYWNoKCh7IGZpbGVuYW1lIH0pID0+IGlnbm9yZWRGaWxlcy5hZGQoZmlsZW5hbWUpKTtcbiAgfVxuXG4gIC8vIHByZXBhcmUgbGlzdCBvZiBzb3VyY2UgZmlsZXMsIGRvbid0IGNvbnNpZGVyIGZpbGVzIGZyb20gbm9kZV9tb2R1bGVzXG4gIGNvbnN0IHJlc29sdmVkRmlsZXMgPSBzcmNGaWxlTGlzdC5sZW5ndGggJiYgdHlwZW9mIHNyY0ZpbGVMaXN0WzBdID09PSAnc3RyaW5nJ1xuICAgID8gc3JjRmlsZUxpc3QuZmlsdGVyKChmaWxlUGF0aCkgPT4gIWlzTm9kZU1vZHVsZShmaWxlUGF0aCkpXG4gICAgOiBmbGF0TWFwKHNyY0ZpbGVMaXN0LCAoeyBmaWxlbmFtZSB9KSA9PiBpc05vZGVNb2R1bGUoZmlsZW5hbWUpID8gW10gOiBmaWxlbmFtZSk7XG5cbiAgcmV0dXJuIG5ldyBTZXQocmVzb2x2ZWRGaWxlcyk7XG59XG5cbi8qKlxuICogcGFyc2UgYWxsIHNvdXJjZSBmaWxlcyBhbmQgYnVpbGQgdXAgMiBtYXBzIGNvbnRhaW5pbmcgdGhlIGV4aXN0aW5nIGltcG9ydHMgYW5kIGV4cG9ydHNcbiAqL1xuY29uc3QgcHJlcGFyZUltcG9ydHNBbmRFeHBvcnRzID0gKHNyY0ZpbGVzLCBjb250ZXh0KSA9PiB7XG4gIGNvbnN0IGV4cG9ydEFsbCA9IG5ldyBNYXAoKTtcbiAgc3JjRmlsZXMuZm9yRWFjaCgoZmlsZSkgPT4ge1xuICAgIGNvbnN0IGV4cG9ydHMgPSBuZXcgTWFwKCk7XG4gICAgY29uc3QgaW1wb3J0cyA9IG5ldyBNYXAoKTtcbiAgICBjb25zdCBjdXJyZW50RXhwb3J0cyA9IEV4cG9ydE1hcEJ1aWxkZXIuZ2V0KGZpbGUsIGNvbnRleHQpO1xuICAgIGlmIChjdXJyZW50RXhwb3J0cykge1xuICAgICAgY29uc3Qge1xuICAgICAgICBkZXBlbmRlbmNpZXMsXG4gICAgICAgIHJlZXhwb3J0cyxcbiAgICAgICAgaW1wb3J0czogbG9jYWxJbXBvcnRMaXN0LFxuICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgIHZpc2l0b3JLZXlzLFxuICAgICAgfSA9IGN1cnJlbnRFeHBvcnRzO1xuXG4gICAgICB2aXNpdG9yS2V5TWFwLnNldChmaWxlLCB2aXNpdG9yS2V5cyk7XG4gICAgICAvLyBkZXBlbmRlbmNpZXMgPT09IGV4cG9ydCAqIGZyb21cbiAgICAgIGNvbnN0IGN1cnJlbnRFeHBvcnRBbGwgPSBuZXcgU2V0KCk7XG4gICAgICBkZXBlbmRlbmNpZXMuZm9yRWFjaCgoZ2V0RGVwZW5kZW5jeSkgPT4ge1xuICAgICAgICBjb25zdCBkZXBlbmRlbmN5ID0gZ2V0RGVwZW5kZW5jeSgpO1xuICAgICAgICBpZiAoZGVwZW5kZW5jeSA9PT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGN1cnJlbnRFeHBvcnRBbGwuYWRkKGRlcGVuZGVuY3kucGF0aCk7XG4gICAgICB9KTtcbiAgICAgIGV4cG9ydEFsbC5zZXQoZmlsZSwgY3VycmVudEV4cG9ydEFsbCk7XG5cbiAgICAgIHJlZXhwb3J0cy5mb3JFYWNoKCh2YWx1ZSwga2V5KSA9PiB7XG4gICAgICAgIGlmIChrZXkgPT09IERFRkFVTFQpIHtcbiAgICAgICAgICBleHBvcnRzLnNldChJTVBPUlRfREVGQVVMVF9TUEVDSUZJRVIsIHsgd2hlcmVVc2VkOiBuZXcgU2V0KCkgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZXhwb3J0cy5zZXQoa2V5LCB7IHdoZXJlVXNlZDogbmV3IFNldCgpIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlZXhwb3J0ID0gdmFsdWUuZ2V0SW1wb3J0KCk7XG4gICAgICAgIGlmICghcmVleHBvcnQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGxvY2FsSW1wb3J0ID0gaW1wb3J0cy5nZXQocmVleHBvcnQucGF0aCk7XG4gICAgICAgIGxldCBjdXJyZW50VmFsdWU7XG4gICAgICAgIGlmICh2YWx1ZS5sb2NhbCA9PT0gREVGQVVMVCkge1xuICAgICAgICAgIGN1cnJlbnRWYWx1ZSA9IElNUE9SVF9ERUZBVUxUX1NQRUNJRklFUjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjdXJyZW50VmFsdWUgPSB2YWx1ZS5sb2NhbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGxvY2FsSW1wb3J0ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIGxvY2FsSW1wb3J0ID0gbmV3IFNldChbLi4ubG9jYWxJbXBvcnQsIGN1cnJlbnRWYWx1ZV0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxvY2FsSW1wb3J0ID0gbmV3IFNldChbY3VycmVudFZhbHVlXSk7XG4gICAgICAgIH1cbiAgICAgICAgaW1wb3J0cy5zZXQocmVleHBvcnQucGF0aCwgbG9jYWxJbXBvcnQpO1xuICAgICAgfSk7XG5cbiAgICAgIGxvY2FsSW1wb3J0TGlzdC5mb3JFYWNoKCh2YWx1ZSwga2V5KSA9PiB7XG4gICAgICAgIGlmIChpc05vZGVNb2R1bGUoa2V5KSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBsb2NhbEltcG9ydCA9IGltcG9ydHMuZ2V0KGtleSkgfHwgbmV3IFNldCgpO1xuICAgICAgICB2YWx1ZS5kZWNsYXJhdGlvbnMuZm9yRWFjaCgoeyBpbXBvcnRlZFNwZWNpZmllcnMgfSkgPT4ge1xuICAgICAgICAgIGltcG9ydGVkU3BlY2lmaWVycy5mb3JFYWNoKChzcGVjaWZpZXIpID0+IHtcbiAgICAgICAgICAgIGxvY2FsSW1wb3J0LmFkZChzcGVjaWZpZXIpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgaW1wb3J0cy5zZXQoa2V5LCBsb2NhbEltcG9ydCk7XG4gICAgICB9KTtcbiAgICAgIGltcG9ydExpc3Quc2V0KGZpbGUsIGltcG9ydHMpO1xuXG4gICAgICAvLyBidWlsZCB1cCBleHBvcnQgbGlzdCBvbmx5LCBpZiBmaWxlIGlzIG5vdCBpZ25vcmVkXG4gICAgICBpZiAoaWdub3JlZEZpbGVzLmhhcyhmaWxlKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBuYW1lc3BhY2UuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xuICAgICAgICBpZiAoa2V5ID09PSBERUZBVUxUKSB7XG4gICAgICAgICAgZXhwb3J0cy5zZXQoSU1QT1JUX0RFRkFVTFRfU1BFQ0lGSUVSLCB7IHdoZXJlVXNlZDogbmV3IFNldCgpIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGV4cG9ydHMuc2V0KGtleSwgeyB3aGVyZVVzZWQ6IG5ldyBTZXQoKSB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIGV4cG9ydHMuc2V0KEVYUE9SVF9BTExfREVDTEFSQVRJT04sIHsgd2hlcmVVc2VkOiBuZXcgU2V0KCkgfSk7XG4gICAgZXhwb3J0cy5zZXQoSU1QT1JUX05BTUVTUEFDRV9TUEVDSUZJRVIsIHsgd2hlcmVVc2VkOiBuZXcgU2V0KCkgfSk7XG4gICAgZXhwb3J0TGlzdC5zZXQoZmlsZSwgZXhwb3J0cyk7XG4gIH0pO1xuICBleHBvcnRBbGwuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xuICAgIHZhbHVlLmZvckVhY2goKHZhbCkgPT4ge1xuICAgICAgY29uc3QgY3VycmVudEV4cG9ydHMgPSBleHBvcnRMaXN0LmdldCh2YWwpO1xuICAgICAgaWYgKGN1cnJlbnRFeHBvcnRzKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRFeHBvcnQgPSBjdXJyZW50RXhwb3J0cy5nZXQoRVhQT1JUX0FMTF9ERUNMQVJBVElPTik7XG4gICAgICAgIGN1cnJlbnRFeHBvcnQud2hlcmVVc2VkLmFkZChrZXkpO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbn07XG5cbi8qKlxuICogdHJhdmVyc2UgdGhyb3VnaCBhbGwgaW1wb3J0cyBhbmQgYWRkIHRoZSByZXNwZWN0aXZlIHBhdGggdG8gdGhlIHdoZXJlVXNlZC1saXN0XG4gKiBvZiB0aGUgY29ycmVzcG9uZGluZyBleHBvcnRcbiAqL1xuY29uc3QgZGV0ZXJtaW5lVXNhZ2UgPSAoKSA9PiB7XG4gIGltcG9ydExpc3QuZm9yRWFjaCgobGlzdFZhbHVlLCBsaXN0S2V5KSA9PiB7XG4gICAgbGlzdFZhbHVlLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgIGNvbnN0IGV4cG9ydHMgPSBleHBvcnRMaXN0LmdldChrZXkpO1xuICAgICAgaWYgKHR5cGVvZiBleHBvcnRzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICB2YWx1ZS5mb3JFYWNoKChjdXJyZW50SW1wb3J0KSA9PiB7XG4gICAgICAgICAgbGV0IHNwZWNpZmllcjtcbiAgICAgICAgICBpZiAoY3VycmVudEltcG9ydCA9PT0gSU1QT1JUX05BTUVTUEFDRV9TUEVDSUZJRVIpIHtcbiAgICAgICAgICAgIHNwZWNpZmllciA9IElNUE9SVF9OQU1FU1BBQ0VfU1BFQ0lGSUVSO1xuICAgICAgICAgIH0gZWxzZSBpZiAoY3VycmVudEltcG9ydCA9PT0gSU1QT1JUX0RFRkFVTFRfU1BFQ0lGSUVSKSB7XG4gICAgICAgICAgICBzcGVjaWZpZXIgPSBJTVBPUlRfREVGQVVMVF9TUEVDSUZJRVI7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNwZWNpZmllciA9IGN1cnJlbnRJbXBvcnQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0eXBlb2Ygc3BlY2lmaWVyICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgY29uc3QgZXhwb3J0U3RhdGVtZW50ID0gZXhwb3J0cy5nZXQoc3BlY2lmaWVyKTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZXhwb3J0U3RhdGVtZW50ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICBjb25zdCB7IHdoZXJlVXNlZCB9ID0gZXhwb3J0U3RhdGVtZW50O1xuICAgICAgICAgICAgICB3aGVyZVVzZWQuYWRkKGxpc3RLZXkpO1xuICAgICAgICAgICAgICBleHBvcnRzLnNldChzcGVjaWZpZXIsIHsgd2hlcmVVc2VkIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xufTtcblxuY29uc3QgZ2V0U3JjID0gKHNyYykgPT4ge1xuICBpZiAoc3JjKSB7XG4gICAgcmV0dXJuIHNyYztcbiAgfVxuICByZXR1cm4gW3Byb2Nlc3MuY3dkKCldO1xufTtcblxuLyoqXG4gKiBwcmVwYXJlIHRoZSBsaXN0cyBvZiBleGlzdGluZyBpbXBvcnRzIGFuZCBleHBvcnRzIC0gc2hvdWxkIG9ubHkgYmUgZXhlY3V0ZWQgb25jZSBhdFxuICogdGhlIHN0YXJ0IG9mIGEgbmV3IGVzbGludCBydW5cbiAqL1xuLyoqIEB0eXBlIHtTZXQ8c3RyaW5nPn0gKi9cbmxldCBzcmNGaWxlcztcbmxldCBsYXN0UHJlcGFyZUtleTtcbmNvbnN0IGRvUHJlcGFyYXRpb24gPSAoc3JjLCBpZ25vcmVFeHBvcnRzLCBjb250ZXh0KSA9PiB7XG4gIGNvbnN0IHByZXBhcmVLZXkgPSBKU09OLnN0cmluZ2lmeSh7XG4gICAgc3JjOiAoc3JjIHx8IFtdKS5zb3J0KCksXG4gICAgaWdub3JlRXhwb3J0czogKGlnbm9yZUV4cG9ydHMgfHwgW10pLnNvcnQoKSxcbiAgICBleHRlbnNpb25zOiBBcnJheS5mcm9tKGdldEZpbGVFeHRlbnNpb25zKGNvbnRleHQuc2V0dGluZ3MpKS5zb3J0KCksXG4gIH0pO1xuICBpZiAocHJlcGFyZUtleSA9PT0gbGFzdFByZXBhcmVLZXkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpbXBvcnRMaXN0LmNsZWFyKCk7XG4gIGV4cG9ydExpc3QuY2xlYXIoKTtcbiAgaWdub3JlZEZpbGVzLmNsZWFyKCk7XG4gIGZpbGVzT3V0c2lkZVNyYy5jbGVhcigpO1xuXG4gIHNyY0ZpbGVzID0gcmVzb2x2ZUZpbGVzKGdldFNyYyhzcmMpLCBpZ25vcmVFeHBvcnRzLCBjb250ZXh0KTtcbiAgcHJlcGFyZUltcG9ydHNBbmRFeHBvcnRzKHNyY0ZpbGVzLCBjb250ZXh0KTtcbiAgZGV0ZXJtaW5lVXNhZ2UoKTtcbiAgbGFzdFByZXBhcmVLZXkgPSBwcmVwYXJlS2V5O1xufTtcblxuY29uc3QgbmV3TmFtZXNwYWNlSW1wb3J0RXhpc3RzID0gKHNwZWNpZmllcnMpID0+IHNwZWNpZmllcnMuc29tZSgoeyB0eXBlIH0pID0+IHR5cGUgPT09IElNUE9SVF9OQU1FU1BBQ0VfU1BFQ0lGSUVSKTtcblxuY29uc3QgbmV3RGVmYXVsdEltcG9ydEV4aXN0cyA9IChzcGVjaWZpZXJzKSA9PiBzcGVjaWZpZXJzLnNvbWUoKHsgdHlwZSB9KSA9PiB0eXBlID09PSBJTVBPUlRfREVGQVVMVF9TUEVDSUZJRVIpO1xuXG5jb25zdCBmaWxlSXNJblBrZyA9IChmaWxlKSA9PiB7XG4gIGNvbnN0IHsgcGF0aCwgcGtnIH0gPSByZWFkUGtnVXAoeyBjd2Q6IGZpbGUgfSk7XG4gIGNvbnN0IGJhc2VQYXRoID0gZGlybmFtZShwYXRoKTtcblxuICBjb25zdCBjaGVja1BrZ0ZpZWxkU3RyaW5nID0gKHBrZ0ZpZWxkKSA9PiB7XG4gICAgaWYgKGpvaW4oYmFzZVBhdGgsIHBrZ0ZpZWxkKSA9PT0gZmlsZSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGNoZWNrUGtnRmllbGRPYmplY3QgPSAocGtnRmllbGQpID0+IHtcbiAgICBjb25zdCBwa2dGaWVsZEZpbGVzID0gZmxhdE1hcCh2YWx1ZXMocGtnRmllbGQpLCAodmFsdWUpID0+IHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nID8gW10gOiBqb2luKGJhc2VQYXRoLCB2YWx1ZSkpO1xuXG4gICAgaWYgKGluY2x1ZGVzKHBrZ0ZpZWxkRmlsZXMsIGZpbGUpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgY2hlY2tQa2dGaWVsZCA9IChwa2dGaWVsZCkgPT4ge1xuICAgIGlmICh0eXBlb2YgcGtnRmllbGQgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gY2hlY2tQa2dGaWVsZFN0cmluZyhwa2dGaWVsZCk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBwa2dGaWVsZCA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHJldHVybiBjaGVja1BrZ0ZpZWxkT2JqZWN0KHBrZ0ZpZWxkKTtcbiAgICB9XG4gIH07XG5cbiAgaWYgKHBrZy5wcml2YXRlID09PSB0cnVlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKHBrZy5iaW4pIHtcbiAgICBpZiAoY2hlY2tQa2dGaWVsZChwa2cuYmluKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgaWYgKHBrZy5icm93c2VyKSB7XG4gICAgaWYgKGNoZWNrUGtnRmllbGQocGtnLmJyb3dzZXIpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBpZiAocGtnLm1haW4pIHtcbiAgICBpZiAoY2hlY2tQa2dGaWVsZFN0cmluZyhwa2cubWFpbikpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBtZXRhOiB7XG4gICAgdHlwZTogJ3N1Z2dlc3Rpb24nLFxuICAgIGRvY3M6IHtcbiAgICAgIGNhdGVnb3J5OiAnSGVscGZ1bCB3YXJuaW5ncycsXG4gICAgICBkZXNjcmlwdGlvbjogJ0ZvcmJpZCBtb2R1bGVzIHdpdGhvdXQgZXhwb3J0cywgb3IgZXhwb3J0cyB3aXRob3V0IG1hdGNoaW5nIGltcG9ydCBpbiBhbm90aGVyIG1vZHVsZS4nLFxuICAgICAgdXJsOiBkb2NzVXJsKCduby11bnVzZWQtbW9kdWxlcycpLFxuICAgIH0sXG4gICAgc2NoZW1hOiBbe1xuICAgICAgcHJvcGVydGllczoge1xuICAgICAgICBzcmM6IHtcbiAgICAgICAgICBkZXNjcmlwdGlvbjogJ2ZpbGVzL3BhdGhzIHRvIGJlIGFuYWx5emVkIChvbmx5IGZvciB1bnVzZWQgZXhwb3J0cyknLFxuICAgICAgICAgIHR5cGU6ICdhcnJheScsXG4gICAgICAgICAgdW5pcXVlSXRlbXM6IHRydWUsXG4gICAgICAgICAgaXRlbXM6IHtcbiAgICAgICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICAgICAgbWluTGVuZ3RoOiAxLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIGlnbm9yZUV4cG9ydHM6IHtcbiAgICAgICAgICBkZXNjcmlwdGlvbjogJ2ZpbGVzL3BhdGhzIGZvciB3aGljaCB1bnVzZWQgZXhwb3J0cyB3aWxsIG5vdCBiZSByZXBvcnRlZCAoZS5nIG1vZHVsZSBlbnRyeSBwb2ludHMpJyxcbiAgICAgICAgICB0eXBlOiAnYXJyYXknLFxuICAgICAgICAgIHVuaXF1ZUl0ZW1zOiB0cnVlLFxuICAgICAgICAgIGl0ZW1zOiB7XG4gICAgICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgICAgIG1pbkxlbmd0aDogMSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBtaXNzaW5nRXhwb3J0czoge1xuICAgICAgICAgIGRlc2NyaXB0aW9uOiAncmVwb3J0IG1vZHVsZXMgd2l0aG91dCBhbnkgZXhwb3J0cycsXG4gICAgICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgICB9LFxuICAgICAgICB1bnVzZWRFeHBvcnRzOiB7XG4gICAgICAgICAgZGVzY3JpcHRpb246ICdyZXBvcnQgZXhwb3J0cyB3aXRob3V0IGFueSB1c2FnZScsXG4gICAgICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgICB9LFxuICAgICAgICBpZ25vcmVVbnVzZWRUeXBlRXhwb3J0czoge1xuICAgICAgICAgIGRlc2NyaXB0aW9uOiAnaWdub3JlIHR5cGUgZXhwb3J0cyB3aXRob3V0IGFueSB1c2FnZScsXG4gICAgICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGFueU9mOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICB1bnVzZWRFeHBvcnRzOiB7IGVudW06IFt0cnVlXSB9LFxuICAgICAgICAgICAgc3JjOiB7XG4gICAgICAgICAgICAgIG1pbkl0ZW1zOiAxLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHJlcXVpcmVkOiBbJ3VudXNlZEV4cG9ydHMnXSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIG1pc3NpbmdFeHBvcnRzOiB7IGVudW06IFt0cnVlXSB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgcmVxdWlyZWQ6IFsnbWlzc2luZ0V4cG9ydHMnXSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfV0sXG4gIH0sXG5cbiAgY3JlYXRlKGNvbnRleHQpIHtcbiAgICBjb25zdCB7XG4gICAgICBzcmMsXG4gICAgICBpZ25vcmVFeHBvcnRzID0gW10sXG4gICAgICBtaXNzaW5nRXhwb3J0cyxcbiAgICAgIHVudXNlZEV4cG9ydHMsXG4gICAgICBpZ25vcmVVbnVzZWRUeXBlRXhwb3J0cyxcbiAgICB9ID0gY29udGV4dC5vcHRpb25zWzBdIHx8IHt9O1xuXG4gICAgaWYgKHVudXNlZEV4cG9ydHMpIHtcbiAgICAgIGRvUHJlcGFyYXRpb24oc3JjLCBpZ25vcmVFeHBvcnRzLCBjb250ZXh0KTtcbiAgICB9XG5cbiAgICBjb25zdCBmaWxlID0gZ2V0UGh5c2ljYWxGaWxlbmFtZShjb250ZXh0KTtcblxuICAgIGNvbnN0IGNoZWNrRXhwb3J0UHJlc2VuY2UgPSAobm9kZSkgPT4ge1xuICAgICAgaWYgKCFtaXNzaW5nRXhwb3J0cykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChpZ25vcmVkRmlsZXMuaGFzKGZpbGUpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZXhwb3J0Q291bnQgPSBleHBvcnRMaXN0LmdldChmaWxlKTtcbiAgICAgIGNvbnN0IGV4cG9ydEFsbCA9IGV4cG9ydENvdW50LmdldChFWFBPUlRfQUxMX0RFQ0xBUkFUSU9OKTtcbiAgICAgIGNvbnN0IG5hbWVzcGFjZUltcG9ydHMgPSBleHBvcnRDb3VudC5nZXQoSU1QT1JUX05BTUVTUEFDRV9TUEVDSUZJRVIpO1xuXG4gICAgICBleHBvcnRDb3VudC5kZWxldGUoRVhQT1JUX0FMTF9ERUNMQVJBVElPTik7XG4gICAgICBleHBvcnRDb3VudC5kZWxldGUoSU1QT1JUX05BTUVTUEFDRV9TUEVDSUZJRVIpO1xuICAgICAgaWYgKGV4cG9ydENvdW50LnNpemUgPCAxKSB7XG4gICAgICAgIC8vIG5vZGUuYm9keVswXSA9PT0gJ3VuZGVmaW5lZCcgb25seSBoYXBwZW5zLCBpZiBldmVyeXRoaW5nIGlzIGNvbW1lbnRlZCBvdXQgaW4gdGhlIGZpbGVcbiAgICAgICAgLy8gYmVpbmcgbGludGVkXG4gICAgICAgIGNvbnRleHQucmVwb3J0KG5vZGUuYm9keVswXSA/IG5vZGUuYm9keVswXSA6IG5vZGUsICdObyBleHBvcnRzIGZvdW5kJyk7XG4gICAgICB9XG4gICAgICBleHBvcnRDb3VudC5zZXQoRVhQT1JUX0FMTF9ERUNMQVJBVElPTiwgZXhwb3J0QWxsKTtcbiAgICAgIGV4cG9ydENvdW50LnNldChJTVBPUlRfTkFNRVNQQUNFX1NQRUNJRklFUiwgbmFtZXNwYWNlSW1wb3J0cyk7XG4gICAgfTtcblxuICAgIGNvbnN0IGNoZWNrVXNhZ2UgPSAobm9kZSwgZXhwb3J0ZWRWYWx1ZSwgaXNUeXBlRXhwb3J0KSA9PiB7XG4gICAgICBpZiAoIXVudXNlZEV4cG9ydHMpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNUeXBlRXhwb3J0ICYmIGlnbm9yZVVudXNlZFR5cGVFeHBvcnRzKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGlnbm9yZWRGaWxlcy5oYXMoZmlsZSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoZmlsZUlzSW5Qa2coZmlsZSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoZmlsZXNPdXRzaWRlU3JjLmhhcyhmaWxlKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIG1ha2Ugc3VyZSBmaWxlIHRvIGJlIGxpbnRlZCBpcyBpbmNsdWRlZCBpbiBzb3VyY2UgZmlsZXNcbiAgICAgIGlmICghc3JjRmlsZXMuaGFzKGZpbGUpKSB7XG4gICAgICAgIHNyY0ZpbGVzID0gcmVzb2x2ZUZpbGVzKGdldFNyYyhzcmMpLCBpZ25vcmVFeHBvcnRzLCBjb250ZXh0KTtcbiAgICAgICAgaWYgKCFzcmNGaWxlcy5oYXMoZmlsZSkpIHtcbiAgICAgICAgICBmaWxlc091dHNpZGVTcmMuYWRkKGZpbGUpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBleHBvcnRzID0gZXhwb3J0TGlzdC5nZXQoZmlsZSk7XG5cbiAgICAgIGlmICghZXhwb3J0cykge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBmaWxlIFxcYCR7ZmlsZX1cXGAgaGFzIG5vIGV4cG9ydHMuIFBsZWFzZSB1cGRhdGUgdG8gdGhlIGxhdGVzdCwgYW5kIGlmIGl0IHN0aWxsIGhhcHBlbnMsIHJlcG9ydCB0aGlzIG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9pbXBvcnQtanMvZXNsaW50LXBsdWdpbi1pbXBvcnQvaXNzdWVzLzI4NjYhYCk7XG4gICAgICB9XG5cbiAgICAgIC8vIHNwZWNpYWwgY2FzZTogZXhwb3J0ICogZnJvbVxuICAgICAgY29uc3QgZXhwb3J0QWxsID0gZXhwb3J0cy5nZXQoRVhQT1JUX0FMTF9ERUNMQVJBVElPTik7XG4gICAgICBpZiAodHlwZW9mIGV4cG9ydEFsbCAhPT0gJ3VuZGVmaW5lZCcgJiYgZXhwb3J0ZWRWYWx1ZSAhPT0gSU1QT1JUX0RFRkFVTFRfU1BFQ0lGSUVSKSB7XG4gICAgICAgIGlmIChleHBvcnRBbGwud2hlcmVVc2VkLnNpemUgPiAwKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIHNwZWNpYWwgY2FzZTogbmFtZXNwYWNlIGltcG9ydFxuICAgICAgY29uc3QgbmFtZXNwYWNlSW1wb3J0cyA9IGV4cG9ydHMuZ2V0KElNUE9SVF9OQU1FU1BBQ0VfU1BFQ0lGSUVSKTtcbiAgICAgIGlmICh0eXBlb2YgbmFtZXNwYWNlSW1wb3J0cyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgaWYgKG5hbWVzcGFjZUltcG9ydHMud2hlcmVVc2VkLnNpemUgPiAwKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIGV4cG9ydHNMaXN0IHdpbGwgYWx3YXlzIG1hcCBhbnkgaW1wb3J0ZWQgdmFsdWUgb2YgJ2RlZmF1bHQnIHRvICdJbXBvcnREZWZhdWx0U3BlY2lmaWVyJ1xuICAgICAgY29uc3QgZXhwb3J0c0tleSA9IGV4cG9ydGVkVmFsdWUgPT09IERFRkFVTFQgPyBJTVBPUlRfREVGQVVMVF9TUEVDSUZJRVIgOiBleHBvcnRlZFZhbHVlO1xuXG4gICAgICBjb25zdCBleHBvcnRTdGF0ZW1lbnQgPSBleHBvcnRzLmdldChleHBvcnRzS2V5KTtcblxuICAgICAgY29uc3QgdmFsdWUgPSBleHBvcnRzS2V5ID09PSBJTVBPUlRfREVGQVVMVF9TUEVDSUZJRVIgPyBERUZBVUxUIDogZXhwb3J0c0tleTtcblxuICAgICAgaWYgKHR5cGVvZiBleHBvcnRTdGF0ZW1lbnQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGlmIChleHBvcnRTdGF0ZW1lbnQud2hlcmVVc2VkLnNpemUgPCAxKSB7XG4gICAgICAgICAgY29udGV4dC5yZXBvcnQoXG4gICAgICAgICAgICBub2RlLFxuICAgICAgICAgICAgYGV4cG9ydGVkIGRlY2xhcmF0aW9uICcke3ZhbHVlfScgbm90IHVzZWQgd2l0aGluIG90aGVyIG1vZHVsZXNgLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnRleHQucmVwb3J0KFxuICAgICAgICAgIG5vZGUsXG4gICAgICAgICAgYGV4cG9ydGVkIGRlY2xhcmF0aW9uICcke3ZhbHVlfScgbm90IHVzZWQgd2l0aGluIG90aGVyIG1vZHVsZXNgLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBvbmx5IHVzZWZ1bCBmb3IgdG9vbHMgbGlrZSB2c2NvZGUtZXNsaW50XG4gICAgICpcbiAgICAgKiB1cGRhdGUgbGlzdHMgb2YgZXhpc3RpbmcgZXhwb3J0cyBkdXJpbmcgcnVudGltZVxuICAgICAqL1xuICAgIGNvbnN0IHVwZGF0ZUV4cG9ydFVzYWdlID0gKG5vZGUpID0+IHtcbiAgICAgIGlmIChpZ25vcmVkRmlsZXMuaGFzKGZpbGUpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgbGV0IGV4cG9ydHMgPSBleHBvcnRMaXN0LmdldChmaWxlKTtcblxuICAgICAgLy8gbmV3IG1vZHVsZSBoYXMgYmVlbiBjcmVhdGVkIGR1cmluZyBydW50aW1lXG4gICAgICAvLyBpbmNsdWRlIGl0IGluIGZ1cnRoZXIgcHJvY2Vzc2luZ1xuICAgICAgaWYgKHR5cGVvZiBleHBvcnRzID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICBleHBvcnRzID0gbmV3IE1hcCgpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBuZXdFeHBvcnRzID0gbmV3IE1hcCgpO1xuICAgICAgY29uc3QgbmV3RXhwb3J0SWRlbnRpZmllcnMgPSBuZXcgU2V0KCk7XG5cbiAgICAgIG5vZGUuYm9keS5mb3JFYWNoKCh7IHR5cGUsIGRlY2xhcmF0aW9uLCBzcGVjaWZpZXJzIH0pID0+IHtcbiAgICAgICAgaWYgKHR5cGUgPT09IEVYUE9SVF9ERUZBVUxUX0RFQ0xBUkFUSU9OKSB7XG4gICAgICAgICAgbmV3RXhwb3J0SWRlbnRpZmllcnMuYWRkKElNUE9SVF9ERUZBVUxUX1NQRUNJRklFUik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGUgPT09IEVYUE9SVF9OQU1FRF9ERUNMQVJBVElPTikge1xuICAgICAgICAgIGlmIChzcGVjaWZpZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHNwZWNpZmllcnMuZm9yRWFjaCgoc3BlY2lmaWVyKSA9PiB7XG4gICAgICAgICAgICAgIGlmIChzcGVjaWZpZXIuZXhwb3J0ZWQpIHtcbiAgICAgICAgICAgICAgICBuZXdFeHBvcnRJZGVudGlmaWVycy5hZGQoc3BlY2lmaWVyLmV4cG9ydGVkLm5hbWUgfHwgc3BlY2lmaWVyLmV4cG9ydGVkLnZhbHVlKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGZvckVhY2hEZWNsYXJhdGlvbklkZW50aWZpZXIoZGVjbGFyYXRpb24sIChuYW1lKSA9PiB7XG4gICAgICAgICAgICBuZXdFeHBvcnRJZGVudGlmaWVycy5hZGQobmFtZSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBvbGQgZXhwb3J0cyBleGlzdCB3aXRoaW4gbGlzdCBvZiBuZXcgZXhwb3J0cyBpZGVudGlmaWVyczogYWRkIHRvIG1hcCBvZiBuZXcgZXhwb3J0c1xuICAgICAgZXhwb3J0cy5mb3JFYWNoKCh2YWx1ZSwga2V5KSA9PiB7XG4gICAgICAgIGlmIChuZXdFeHBvcnRJZGVudGlmaWVycy5oYXMoa2V5KSkge1xuICAgICAgICAgIG5ld0V4cG9ydHMuc2V0KGtleSwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLy8gbmV3IGV4cG9ydCBpZGVudGlmaWVycyBhZGRlZDogYWRkIHRvIG1hcCBvZiBuZXcgZXhwb3J0c1xuICAgICAgbmV3RXhwb3J0SWRlbnRpZmllcnMuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgIGlmICghZXhwb3J0cy5oYXMoa2V5KSkge1xuICAgICAgICAgIG5ld0V4cG9ydHMuc2V0KGtleSwgeyB3aGVyZVVzZWQ6IG5ldyBTZXQoKSB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIHByZXNlcnZlIGluZm9ybWF0aW9uIGFib3V0IG5hbWVzcGFjZSBpbXBvcnRzXG4gICAgICBjb25zdCBleHBvcnRBbGwgPSBleHBvcnRzLmdldChFWFBPUlRfQUxMX0RFQ0xBUkFUSU9OKTtcbiAgICAgIGxldCBuYW1lc3BhY2VJbXBvcnRzID0gZXhwb3J0cy5nZXQoSU1QT1JUX05BTUVTUEFDRV9TUEVDSUZJRVIpO1xuXG4gICAgICBpZiAodHlwZW9mIG5hbWVzcGFjZUltcG9ydHMgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIG5hbWVzcGFjZUltcG9ydHMgPSB7IHdoZXJlVXNlZDogbmV3IFNldCgpIH07XG4gICAgICB9XG5cbiAgICAgIG5ld0V4cG9ydHMuc2V0KEVYUE9SVF9BTExfREVDTEFSQVRJT04sIGV4cG9ydEFsbCk7XG4gICAgICBuZXdFeHBvcnRzLnNldChJTVBPUlRfTkFNRVNQQUNFX1NQRUNJRklFUiwgbmFtZXNwYWNlSW1wb3J0cyk7XG4gICAgICBleHBvcnRMaXN0LnNldChmaWxlLCBuZXdFeHBvcnRzKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogb25seSB1c2VmdWwgZm9yIHRvb2xzIGxpa2UgdnNjb2RlLWVzbGludFxuICAgICAqXG4gICAgICogdXBkYXRlIGxpc3RzIG9mIGV4aXN0aW5nIGltcG9ydHMgZHVyaW5nIHJ1bnRpbWVcbiAgICAgKi9cbiAgICBjb25zdCB1cGRhdGVJbXBvcnRVc2FnZSA9IChub2RlKSA9PiB7XG4gICAgICBpZiAoIXVudXNlZEV4cG9ydHMpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBsZXQgb2xkSW1wb3J0UGF0aHMgPSBpbXBvcnRMaXN0LmdldChmaWxlKTtcbiAgICAgIGlmICh0eXBlb2Ygb2xkSW1wb3J0UGF0aHMgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIG9sZEltcG9ydFBhdGhzID0gbmV3IE1hcCgpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBvbGROYW1lc3BhY2VJbXBvcnRzID0gbmV3IFNldCgpO1xuICAgICAgY29uc3QgbmV3TmFtZXNwYWNlSW1wb3J0cyA9IG5ldyBTZXQoKTtcblxuICAgICAgY29uc3Qgb2xkRXhwb3J0QWxsID0gbmV3IFNldCgpO1xuICAgICAgY29uc3QgbmV3RXhwb3J0QWxsID0gbmV3IFNldCgpO1xuXG4gICAgICBjb25zdCBvbGREZWZhdWx0SW1wb3J0cyA9IG5ldyBTZXQoKTtcbiAgICAgIGNvbnN0IG5ld0RlZmF1bHRJbXBvcnRzID0gbmV3IFNldCgpO1xuXG4gICAgICBjb25zdCBvbGRJbXBvcnRzID0gbmV3IE1hcCgpO1xuICAgICAgY29uc3QgbmV3SW1wb3J0cyA9IG5ldyBNYXAoKTtcbiAgICAgIG9sZEltcG9ydFBhdGhzLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgICAgaWYgKHZhbHVlLmhhcyhFWFBPUlRfQUxMX0RFQ0xBUkFUSU9OKSkge1xuICAgICAgICAgIG9sZEV4cG9ydEFsbC5hZGQoa2V5KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsdWUuaGFzKElNUE9SVF9OQU1FU1BBQ0VfU1BFQ0lGSUVSKSkge1xuICAgICAgICAgIG9sZE5hbWVzcGFjZUltcG9ydHMuYWRkKGtleSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbHVlLmhhcyhJTVBPUlRfREVGQVVMVF9TUEVDSUZJRVIpKSB7XG4gICAgICAgICAgb2xkRGVmYXVsdEltcG9ydHMuYWRkKGtleSk7XG4gICAgICAgIH1cbiAgICAgICAgdmFsdWUuZm9yRWFjaCgodmFsKSA9PiB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgdmFsICE9PSBJTVBPUlRfTkFNRVNQQUNFX1NQRUNJRklFUlxuICAgICAgICAgICAgJiYgdmFsICE9PSBJTVBPUlRfREVGQVVMVF9TUEVDSUZJRVJcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIG9sZEltcG9ydHMuc2V0KHZhbCwga2V5KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIGZ1bmN0aW9uIHByb2Nlc3NEeW5hbWljSW1wb3J0KHNvdXJjZSkge1xuICAgICAgICBpZiAoc291cmNlLnR5cGUgIT09ICdMaXRlcmFsJykge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHAgPSByZXNvbHZlKHNvdXJjZS52YWx1ZSwgY29udGV4dCk7XG4gICAgICAgIGlmIChwID09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBuZXdOYW1lc3BhY2VJbXBvcnRzLmFkZChwKTtcbiAgICAgIH1cblxuICAgICAgdmlzaXQobm9kZSwgdmlzaXRvcktleU1hcC5nZXQoZmlsZSksIHtcbiAgICAgICAgSW1wb3J0RXhwcmVzc2lvbihjaGlsZCkge1xuICAgICAgICAgIHByb2Nlc3NEeW5hbWljSW1wb3J0KGNoaWxkLnNvdXJjZSk7XG4gICAgICAgIH0sXG4gICAgICAgIENhbGxFeHByZXNzaW9uKGNoaWxkKSB7XG4gICAgICAgICAgaWYgKGNoaWxkLmNhbGxlZS50eXBlID09PSAnSW1wb3J0Jykge1xuICAgICAgICAgICAgcHJvY2Vzc0R5bmFtaWNJbXBvcnQoY2hpbGQuYXJndW1lbnRzWzBdKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgbm9kZS5ib2R5LmZvckVhY2goKGFzdE5vZGUpID0+IHtcbiAgICAgICAgbGV0IHJlc29sdmVkUGF0aDtcblxuICAgICAgICAvLyBzdXBwb3J0IGZvciBleHBvcnQgeyB2YWx1ZSB9IGZyb20gJ21vZHVsZSdcbiAgICAgICAgaWYgKGFzdE5vZGUudHlwZSA9PT0gRVhQT1JUX05BTUVEX0RFQ0xBUkFUSU9OKSB7XG4gICAgICAgICAgaWYgKGFzdE5vZGUuc291cmNlKSB7XG4gICAgICAgICAgICByZXNvbHZlZFBhdGggPSByZXNvbHZlKGFzdE5vZGUuc291cmNlLnJhdy5yZXBsYWNlKC8oJ3xcIikvZywgJycpLCBjb250ZXh0KTtcbiAgICAgICAgICAgIGFzdE5vZGUuc3BlY2lmaWVycy5mb3JFYWNoKChzcGVjaWZpZXIpID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgbmFtZSA9IHNwZWNpZmllci5sb2NhbC5uYW1lIHx8IHNwZWNpZmllci5sb2NhbC52YWx1ZTtcbiAgICAgICAgICAgICAgaWYgKG5hbWUgPT09IERFRkFVTFQpIHtcbiAgICAgICAgICAgICAgICBuZXdEZWZhdWx0SW1wb3J0cy5hZGQocmVzb2x2ZWRQYXRoKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBuZXdJbXBvcnRzLnNldChuYW1lLCByZXNvbHZlZFBhdGgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYXN0Tm9kZS50eXBlID09PSBFWFBPUlRfQUxMX0RFQ0xBUkFUSU9OKSB7XG4gICAgICAgICAgcmVzb2x2ZWRQYXRoID0gcmVzb2x2ZShhc3ROb2RlLnNvdXJjZS5yYXcucmVwbGFjZSgvKCd8XCIpL2csICcnKSwgY29udGV4dCk7XG4gICAgICAgICAgbmV3RXhwb3J0QWxsLmFkZChyZXNvbHZlZFBhdGgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGFzdE5vZGUudHlwZSA9PT0gSU1QT1JUX0RFQ0xBUkFUSU9OKSB7XG4gICAgICAgICAgcmVzb2x2ZWRQYXRoID0gcmVzb2x2ZShhc3ROb2RlLnNvdXJjZS5yYXcucmVwbGFjZSgvKCd8XCIpL2csICcnKSwgY29udGV4dCk7XG4gICAgICAgICAgaWYgKCFyZXNvbHZlZFBhdGgpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoaXNOb2RlTW9kdWxlKHJlc29sdmVkUGF0aCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAobmV3TmFtZXNwYWNlSW1wb3J0RXhpc3RzKGFzdE5vZGUuc3BlY2lmaWVycykpIHtcbiAgICAgICAgICAgIG5ld05hbWVzcGFjZUltcG9ydHMuYWRkKHJlc29sdmVkUGF0aCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKG5ld0RlZmF1bHRJbXBvcnRFeGlzdHMoYXN0Tm9kZS5zcGVjaWZpZXJzKSkge1xuICAgICAgICAgICAgbmV3RGVmYXVsdEltcG9ydHMuYWRkKHJlc29sdmVkUGF0aCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYXN0Tm9kZS5zcGVjaWZpZXJzXG4gICAgICAgICAgICAuZmlsdGVyKChzcGVjaWZpZXIpID0+IHNwZWNpZmllci50eXBlICE9PSBJTVBPUlRfREVGQVVMVF9TUEVDSUZJRVIgJiYgc3BlY2lmaWVyLnR5cGUgIT09IElNUE9SVF9OQU1FU1BBQ0VfU1BFQ0lGSUVSKVxuICAgICAgICAgICAgLmZvckVhY2goKHNwZWNpZmllcikgPT4ge1xuICAgICAgICAgICAgICBuZXdJbXBvcnRzLnNldChzcGVjaWZpZXIuaW1wb3J0ZWQubmFtZSB8fCBzcGVjaWZpZXIuaW1wb3J0ZWQudmFsdWUsIHJlc29sdmVkUGF0aCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIG5ld0V4cG9ydEFsbC5mb3JFYWNoKCh2YWx1ZSkgPT4ge1xuICAgICAgICBpZiAoIW9sZEV4cG9ydEFsbC5oYXModmFsdWUpKSB7XG4gICAgICAgICAgbGV0IGltcG9ydHMgPSBvbGRJbXBvcnRQYXRocy5nZXQodmFsdWUpO1xuICAgICAgICAgIGlmICh0eXBlb2YgaW1wb3J0cyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGltcG9ydHMgPSBuZXcgU2V0KCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGltcG9ydHMuYWRkKEVYUE9SVF9BTExfREVDTEFSQVRJT04pO1xuICAgICAgICAgIG9sZEltcG9ydFBhdGhzLnNldCh2YWx1ZSwgaW1wb3J0cyk7XG5cbiAgICAgICAgICBsZXQgZXhwb3J0cyA9IGV4cG9ydExpc3QuZ2V0KHZhbHVlKTtcbiAgICAgICAgICBsZXQgY3VycmVudEV4cG9ydDtcbiAgICAgICAgICBpZiAodHlwZW9mIGV4cG9ydHMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBjdXJyZW50RXhwb3J0ID0gZXhwb3J0cy5nZXQoRVhQT1JUX0FMTF9ERUNMQVJBVElPTik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGV4cG9ydHMgPSBuZXcgTWFwKCk7XG4gICAgICAgICAgICBleHBvcnRMaXN0LnNldCh2YWx1ZSwgZXhwb3J0cyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHR5cGVvZiBjdXJyZW50RXhwb3J0ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgY3VycmVudEV4cG9ydC53aGVyZVVzZWQuYWRkKGZpbGUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCB3aGVyZVVzZWQgPSBuZXcgU2V0KCk7XG4gICAgICAgICAgICB3aGVyZVVzZWQuYWRkKGZpbGUpO1xuICAgICAgICAgICAgZXhwb3J0cy5zZXQoRVhQT1JUX0FMTF9ERUNMQVJBVElPTiwgeyB3aGVyZVVzZWQgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgb2xkRXhwb3J0QWxsLmZvckVhY2goKHZhbHVlKSA9PiB7XG4gICAgICAgIGlmICghbmV3RXhwb3J0QWxsLmhhcyh2YWx1ZSkpIHtcbiAgICAgICAgICBjb25zdCBpbXBvcnRzID0gb2xkSW1wb3J0UGF0aHMuZ2V0KHZhbHVlKTtcbiAgICAgICAgICBpbXBvcnRzLmRlbGV0ZShFWFBPUlRfQUxMX0RFQ0xBUkFUSU9OKTtcblxuICAgICAgICAgIGNvbnN0IGV4cG9ydHMgPSBleHBvcnRMaXN0LmdldCh2YWx1ZSk7XG4gICAgICAgICAgaWYgKHR5cGVvZiBleHBvcnRzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgY29uc3QgY3VycmVudEV4cG9ydCA9IGV4cG9ydHMuZ2V0KEVYUE9SVF9BTExfREVDTEFSQVRJT04pO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBjdXJyZW50RXhwb3J0ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICBjdXJyZW50RXhwb3J0LndoZXJlVXNlZC5kZWxldGUoZmlsZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgbmV3RGVmYXVsdEltcG9ydHMuZm9yRWFjaCgodmFsdWUpID0+IHtcbiAgICAgICAgaWYgKCFvbGREZWZhdWx0SW1wb3J0cy5oYXModmFsdWUpKSB7XG4gICAgICAgICAgbGV0IGltcG9ydHMgPSBvbGRJbXBvcnRQYXRocy5nZXQodmFsdWUpO1xuICAgICAgICAgIGlmICh0eXBlb2YgaW1wb3J0cyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGltcG9ydHMgPSBuZXcgU2V0KCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGltcG9ydHMuYWRkKElNUE9SVF9ERUZBVUxUX1NQRUNJRklFUik7XG4gICAgICAgICAgb2xkSW1wb3J0UGF0aHMuc2V0KHZhbHVlLCBpbXBvcnRzKTtcblxuICAgICAgICAgIGxldCBleHBvcnRzID0gZXhwb3J0TGlzdC5nZXQodmFsdWUpO1xuICAgICAgICAgIGxldCBjdXJyZW50RXhwb3J0O1xuICAgICAgICAgIGlmICh0eXBlb2YgZXhwb3J0cyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGN1cnJlbnRFeHBvcnQgPSBleHBvcnRzLmdldChJTVBPUlRfREVGQVVMVF9TUEVDSUZJRVIpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBleHBvcnRzID0gbmV3IE1hcCgpO1xuICAgICAgICAgICAgZXhwb3J0TGlzdC5zZXQodmFsdWUsIGV4cG9ydHMpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh0eXBlb2YgY3VycmVudEV4cG9ydCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGN1cnJlbnRFeHBvcnQud2hlcmVVc2VkLmFkZChmaWxlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qgd2hlcmVVc2VkID0gbmV3IFNldCgpO1xuICAgICAgICAgICAgd2hlcmVVc2VkLmFkZChmaWxlKTtcbiAgICAgICAgICAgIGV4cG9ydHMuc2V0KElNUE9SVF9ERUZBVUxUX1NQRUNJRklFUiwgeyB3aGVyZVVzZWQgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgb2xkRGVmYXVsdEltcG9ydHMuZm9yRWFjaCgodmFsdWUpID0+IHtcbiAgICAgICAgaWYgKCFuZXdEZWZhdWx0SW1wb3J0cy5oYXModmFsdWUpKSB7XG4gICAgICAgICAgY29uc3QgaW1wb3J0cyA9IG9sZEltcG9ydFBhdGhzLmdldCh2YWx1ZSk7XG4gICAgICAgICAgaW1wb3J0cy5kZWxldGUoSU1QT1JUX0RFRkFVTFRfU1BFQ0lGSUVSKTtcblxuICAgICAgICAgIGNvbnN0IGV4cG9ydHMgPSBleHBvcnRMaXN0LmdldCh2YWx1ZSk7XG4gICAgICAgICAgaWYgKHR5cGVvZiBleHBvcnRzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgY29uc3QgY3VycmVudEV4cG9ydCA9IGV4cG9ydHMuZ2V0KElNUE9SVF9ERUZBVUxUX1NQRUNJRklFUik7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGN1cnJlbnRFeHBvcnQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgIGN1cnJlbnRFeHBvcnQud2hlcmVVc2VkLmRlbGV0ZShmaWxlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBuZXdOYW1lc3BhY2VJbXBvcnRzLmZvckVhY2goKHZhbHVlKSA9PiB7XG4gICAgICAgIGlmICghb2xkTmFtZXNwYWNlSW1wb3J0cy5oYXModmFsdWUpKSB7XG4gICAgICAgICAgbGV0IGltcG9ydHMgPSBvbGRJbXBvcnRQYXRocy5nZXQodmFsdWUpO1xuICAgICAgICAgIGlmICh0eXBlb2YgaW1wb3J0cyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGltcG9ydHMgPSBuZXcgU2V0KCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGltcG9ydHMuYWRkKElNUE9SVF9OQU1FU1BBQ0VfU1BFQ0lGSUVSKTtcbiAgICAgICAgICBvbGRJbXBvcnRQYXRocy5zZXQodmFsdWUsIGltcG9ydHMpO1xuXG4gICAgICAgICAgbGV0IGV4cG9ydHMgPSBleHBvcnRMaXN0LmdldCh2YWx1ZSk7XG4gICAgICAgICAgbGV0IGN1cnJlbnRFeHBvcnQ7XG4gICAgICAgICAgaWYgKHR5cGVvZiBleHBvcnRzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgY3VycmVudEV4cG9ydCA9IGV4cG9ydHMuZ2V0KElNUE9SVF9OQU1FU1BBQ0VfU1BFQ0lGSUVSKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZXhwb3J0cyA9IG5ldyBNYXAoKTtcbiAgICAgICAgICAgIGV4cG9ydExpc3Quc2V0KHZhbHVlLCBleHBvcnRzKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodHlwZW9mIGN1cnJlbnRFeHBvcnQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBjdXJyZW50RXhwb3J0LndoZXJlVXNlZC5hZGQoZmlsZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHdoZXJlVXNlZCA9IG5ldyBTZXQoKTtcbiAgICAgICAgICAgIHdoZXJlVXNlZC5hZGQoZmlsZSk7XG4gICAgICAgICAgICBleHBvcnRzLnNldChJTVBPUlRfTkFNRVNQQUNFX1NQRUNJRklFUiwgeyB3aGVyZVVzZWQgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgb2xkTmFtZXNwYWNlSW1wb3J0cy5mb3JFYWNoKCh2YWx1ZSkgPT4ge1xuICAgICAgICBpZiAoIW5ld05hbWVzcGFjZUltcG9ydHMuaGFzKHZhbHVlKSkge1xuICAgICAgICAgIGNvbnN0IGltcG9ydHMgPSBvbGRJbXBvcnRQYXRocy5nZXQodmFsdWUpO1xuICAgICAgICAgIGltcG9ydHMuZGVsZXRlKElNUE9SVF9OQU1FU1BBQ0VfU1BFQ0lGSUVSKTtcblxuICAgICAgICAgIGNvbnN0IGV4cG9ydHMgPSBleHBvcnRMaXN0LmdldCh2YWx1ZSk7XG4gICAgICAgICAgaWYgKHR5cGVvZiBleHBvcnRzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgY29uc3QgY3VycmVudEV4cG9ydCA9IGV4cG9ydHMuZ2V0KElNUE9SVF9OQU1FU1BBQ0VfU1BFQ0lGSUVSKTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgY3VycmVudEV4cG9ydCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgY3VycmVudEV4cG9ydC53aGVyZVVzZWQuZGVsZXRlKGZpbGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIG5ld0ltcG9ydHMuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xuICAgICAgICBpZiAoIW9sZEltcG9ydHMuaGFzKGtleSkpIHtcbiAgICAgICAgICBsZXQgaW1wb3J0cyA9IG9sZEltcG9ydFBhdGhzLmdldCh2YWx1ZSk7XG4gICAgICAgICAgaWYgKHR5cGVvZiBpbXBvcnRzID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgaW1wb3J0cyA9IG5ldyBTZXQoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaW1wb3J0cy5hZGQoa2V5KTtcbiAgICAgICAgICBvbGRJbXBvcnRQYXRocy5zZXQodmFsdWUsIGltcG9ydHMpO1xuXG4gICAgICAgICAgbGV0IGV4cG9ydHMgPSBleHBvcnRMaXN0LmdldCh2YWx1ZSk7XG4gICAgICAgICAgbGV0IGN1cnJlbnRFeHBvcnQ7XG4gICAgICAgICAgaWYgKHR5cGVvZiBleHBvcnRzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgY3VycmVudEV4cG9ydCA9IGV4cG9ydHMuZ2V0KGtleSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGV4cG9ydHMgPSBuZXcgTWFwKCk7XG4gICAgICAgICAgICBleHBvcnRMaXN0LnNldCh2YWx1ZSwgZXhwb3J0cyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHR5cGVvZiBjdXJyZW50RXhwb3J0ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgY3VycmVudEV4cG9ydC53aGVyZVVzZWQuYWRkKGZpbGUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCB3aGVyZVVzZWQgPSBuZXcgU2V0KCk7XG4gICAgICAgICAgICB3aGVyZVVzZWQuYWRkKGZpbGUpO1xuICAgICAgICAgICAgZXhwb3J0cy5zZXQoa2V5LCB7IHdoZXJlVXNlZCB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBvbGRJbXBvcnRzLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgICAgaWYgKCFuZXdJbXBvcnRzLmhhcyhrZXkpKSB7XG4gICAgICAgICAgY29uc3QgaW1wb3J0cyA9IG9sZEltcG9ydFBhdGhzLmdldCh2YWx1ZSk7XG4gICAgICAgICAgaW1wb3J0cy5kZWxldGUoa2V5KTtcblxuICAgICAgICAgIGNvbnN0IGV4cG9ydHMgPSBleHBvcnRMaXN0LmdldCh2YWx1ZSk7XG4gICAgICAgICAgaWYgKHR5cGVvZiBleHBvcnRzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgY29uc3QgY3VycmVudEV4cG9ydCA9IGV4cG9ydHMuZ2V0KGtleSk7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGN1cnJlbnRFeHBvcnQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgIGN1cnJlbnRFeHBvcnQud2hlcmVVc2VkLmRlbGV0ZShmaWxlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICByZXR1cm4ge1xuICAgICAgJ1Byb2dyYW06ZXhpdCcobm9kZSkge1xuICAgICAgICB1cGRhdGVFeHBvcnRVc2FnZShub2RlKTtcbiAgICAgICAgdXBkYXRlSW1wb3J0VXNhZ2Uobm9kZSk7XG4gICAgICAgIGNoZWNrRXhwb3J0UHJlc2VuY2Uobm9kZSk7XG4gICAgICB9LFxuICAgICAgRXhwb3J0RGVmYXVsdERlY2xhcmF0aW9uKG5vZGUpIHtcbiAgICAgICAgY2hlY2tVc2FnZShub2RlLCBJTVBPUlRfREVGQVVMVF9TUEVDSUZJRVIsIGZhbHNlKTtcbiAgICAgIH0sXG4gICAgICBFeHBvcnROYW1lZERlY2xhcmF0aW9uKG5vZGUpIHtcbiAgICAgICAgbm9kZS5zcGVjaWZpZXJzLmZvckVhY2goKHNwZWNpZmllcikgPT4ge1xuICAgICAgICAgIGNoZWNrVXNhZ2Uoc3BlY2lmaWVyLCBzcGVjaWZpZXIuZXhwb3J0ZWQubmFtZSB8fCBzcGVjaWZpZXIuZXhwb3J0ZWQudmFsdWUsIGZhbHNlKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGZvckVhY2hEZWNsYXJhdGlvbklkZW50aWZpZXIobm9kZS5kZWNsYXJhdGlvbiwgKG5hbWUsIGlzVHlwZUV4cG9ydCkgPT4ge1xuICAgICAgICAgIGNoZWNrVXNhZ2Uobm9kZSwgbmFtZSwgaXNUeXBlRXhwb3J0KTtcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgIH07XG4gIH0sXG59O1xuIl19+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWxlcy9uby11bnVzZWQtbW9kdWxlcy5qcyJdLCJuYW1lcyI6WyJyZXF1aXJlRmlsZUVudW1lcmF0b3IiLCJGaWxlRW51bWVyYXRvciIsInJlcXVpcmUiLCJlIiwiY29kZSIsImxpc3RGaWxlc1VzaW5nRmlsZUVudW1lcmF0b3IiLCJzcmMiLCJleHRlbnNpb25zIiwiRVNMSU5UX1VTRV9GTEFUX0NPTkZJRyIsInByb2Nlc3MiLCJlbnYiLCJpc1VzaW5nRmxhdENvbmZpZyIsInNob3VsZFVzZUZsYXRDb25maWciLCJfIiwiZW51bWVyYXRvciIsIkFycmF5IiwiZnJvbSIsIml0ZXJhdGVGaWxlcyIsImZpbGVQYXRoIiwiaWdub3JlZCIsImZpbGVuYW1lIiwibWVzc2FnZSIsImluY2x1ZGVzIiwiRXJyb3IiLCJsaXN0RmlsZXNXaXRoTGVnYWN5RnVuY3Rpb25zIiwib3JpZ2luYWxMaXN0RmlsZXNUb1Byb2Nlc3MiLCJsaXN0RmlsZXNUb1Byb2Nlc3MiLCJwYXR0ZXJucyIsImNvbmNhdCIsInBhdHRlcm4iLCJtYXAiLCJleHRlbnNpb24iLCJ0ZXN0IiwiRVhQT1JUX0RFRkFVTFRfREVDTEFSQVRJT04iLCJFWFBPUlRfTkFNRURfREVDTEFSQVRJT04iLCJFWFBPUlRfQUxMX0RFQ0xBUkFUSU9OIiwiSU1QT1JUX0RFQ0xBUkFUSU9OIiwiSU1QT1JUX05BTUVTUEFDRV9TUEVDSUZJRVIiLCJJTVBPUlRfREVGQVVMVF9TUEVDSUZJRVIiLCJWQVJJQUJMRV9ERUNMQVJBVElPTiIsIkZVTkNUSU9OX0RFQ0xBUkFUSU9OIiwiQ0xBU1NfREVDTEFSQVRJT04iLCJJREVOVElGSUVSIiwiT0JKRUNUX1BBVFRFUk4iLCJBUlJBWV9QQVRURVJOIiwiVFNfSU5URVJGQUNFX0RFQ0xBUkFUSU9OIiwiVFNfVFlQRV9BTElBU19ERUNMQVJBVElPTiIsIlRTX0VOVU1fREVDTEFSQVRJT04iLCJERUZBVUxUIiwiZm9yRWFjaERlY2xhcmF0aW9uSWRlbnRpZmllciIsImRlY2xhcmF0aW9uIiwiY2IiLCJpc1R5cGVEZWNsYXJhdGlvbiIsInR5cGUiLCJpZCIsIm5hbWUiLCJkZWNsYXJhdGlvbnMiLCJmb3JFYWNoIiwiZWxlbWVudHMiLCJpbXBvcnRMaXN0IiwiTWFwIiwiZXhwb3J0TGlzdCIsInZpc2l0b3JLZXlNYXAiLCJpZ25vcmVkRmlsZXMiLCJTZXQiLCJmaWxlc091dHNpZGVTcmMiLCJpc05vZGVNb2R1bGUiLCJwYXRoIiwicmVzb2x2ZUZpbGVzIiwiaWdub3JlRXhwb3J0cyIsImNvbnRleHQiLCJzZXR0aW5ncyIsInNyY0ZpbGVMaXN0IiwiaWdub3JlZEZpbGVzTGlzdCIsImxlbmd0aCIsImFkZCIsInJlc29sdmVkRmlsZXMiLCJmaWx0ZXIiLCJwcmVwYXJlSW1wb3J0c0FuZEV4cG9ydHMiLCJzcmNGaWxlcyIsImV4cG9ydEFsbCIsImZpbGUiLCJleHBvcnRzIiwiaW1wb3J0cyIsImN1cnJlbnRFeHBvcnRzIiwiRXhwb3J0TWFwQnVpbGRlciIsImdldCIsImRlcGVuZGVuY2llcyIsInJlZXhwb3J0cyIsImxvY2FsSW1wb3J0TGlzdCIsIm5hbWVzcGFjZSIsInZpc2l0b3JLZXlzIiwic2V0IiwiY3VycmVudEV4cG9ydEFsbCIsImdldERlcGVuZGVuY3kiLCJkZXBlbmRlbmN5IiwidmFsdWUiLCJrZXkiLCJ3aGVyZVVzZWQiLCJyZWV4cG9ydCIsImdldEltcG9ydCIsImxvY2FsSW1wb3J0IiwiY3VycmVudFZhbHVlIiwibG9jYWwiLCJpbXBvcnRlZFNwZWNpZmllcnMiLCJzcGVjaWZpZXIiLCJoYXMiLCJ2YWwiLCJjdXJyZW50RXhwb3J0IiwiZGV0ZXJtaW5lVXNhZ2UiLCJsaXN0VmFsdWUiLCJsaXN0S2V5IiwiY3VycmVudEltcG9ydCIsImV4cG9ydFN0YXRlbWVudCIsImdldFNyYyIsImN3ZCIsImxhc3RQcmVwYXJlS2V5IiwiZG9QcmVwYXJhdGlvbiIsInByZXBhcmVLZXkiLCJKU09OIiwic3RyaW5naWZ5Iiwic29ydCIsImNsZWFyIiwibmV3TmFtZXNwYWNlSW1wb3J0RXhpc3RzIiwic3BlY2lmaWVycyIsInNvbWUiLCJuZXdEZWZhdWx0SW1wb3J0RXhpc3RzIiwiZmlsZUlzSW5Qa2ciLCJwa2ciLCJiYXNlUGF0aCIsImNoZWNrUGtnRmllbGRTdHJpbmciLCJwa2dGaWVsZCIsImNoZWNrUGtnRmllbGRPYmplY3QiLCJwa2dGaWVsZEZpbGVzIiwiY2hlY2tQa2dGaWVsZCIsImJpbiIsImJyb3dzZXIiLCJtYWluIiwibW9kdWxlIiwibWV0YSIsImRvY3MiLCJjYXRlZ29yeSIsImRlc2NyaXB0aW9uIiwidXJsIiwic2NoZW1hIiwicHJvcGVydGllcyIsInVuaXF1ZUl0ZW1zIiwiaXRlbXMiLCJtaW5MZW5ndGgiLCJtaXNzaW5nRXhwb3J0cyIsInVudXNlZEV4cG9ydHMiLCJpZ25vcmVVbnVzZWRUeXBlRXhwb3J0cyIsImFueU9mIiwibWluSXRlbXMiLCJyZXF1aXJlZCIsImNyZWF0ZSIsIm9wdGlvbnMiLCJjaGVja0V4cG9ydFByZXNlbmNlIiwibm9kZSIsImV4cG9ydENvdW50IiwibmFtZXNwYWNlSW1wb3J0cyIsInNpemUiLCJyZXBvcnQiLCJib2R5IiwiY2hlY2tVc2FnZSIsImV4cG9ydGVkVmFsdWUiLCJpc1R5cGVFeHBvcnQiLCJjb25zb2xlIiwiZXJyb3IiLCJleHBvcnRzS2V5IiwidXBkYXRlRXhwb3J0VXNhZ2UiLCJuZXdFeHBvcnRzIiwibmV3RXhwb3J0SWRlbnRpZmllcnMiLCJleHBvcnRlZCIsInVwZGF0ZUltcG9ydFVzYWdlIiwib2xkSW1wb3J0UGF0aHMiLCJvbGROYW1lc3BhY2VJbXBvcnRzIiwibmV3TmFtZXNwYWNlSW1wb3J0cyIsIm9sZEV4cG9ydEFsbCIsIm5ld0V4cG9ydEFsbCIsIm9sZERlZmF1bHRJbXBvcnRzIiwibmV3RGVmYXVsdEltcG9ydHMiLCJvbGRJbXBvcnRzIiwibmV3SW1wb3J0cyIsInByb2Nlc3NEeW5hbWljSW1wb3J0Iiwic291cmNlIiwicCIsIkltcG9ydEV4cHJlc3Npb24iLCJjaGlsZCIsIkNhbGxFeHByZXNzaW9uIiwiY2FsbGVlIiwiYXJndW1lbnRzIiwiYXN0Tm9kZSIsInJlc29sdmVkUGF0aCIsInJhdyIsInJlcGxhY2UiLCJpbXBvcnRlZCIsIkV4cG9ydERlZmF1bHREZWNsYXJhdGlvbiIsIkV4cG9ydE5hbWVkRGVjbGFyYXRpb24iXSwibWFwcGluZ3MiOiI7Ozs7OztBQU1BO0FBQ0E7QUFDQSxzRDtBQUNBLGtEO0FBQ0E7QUFDQSwyRDtBQUNBLHVDO0FBQ0EsK0M7QUFDQSx5RDs7QUFFQSwrQztBQUNBLDZEO0FBQ0EscUMsMlVBbEJBOzs7O29YQW9CQTs7Ozs7dVhBTUEsU0FBU0EscUJBQVQsR0FBaUMsQ0FDL0IsSUFBSUMsdUJBQUo7O0FBRUE7QUFDQSxNQUFJO0FBQ29CQyxZQUFRLDZCQUFSLENBRHBCLENBQ0NELGNBREQsWUFDQ0EsY0FERDtBQUVILEdBRkQsQ0FFRSxPQUFPRSxDQUFQLEVBQVU7QUFDVjtBQUNBLFFBQUlBLEVBQUVDLElBQUYsS0FBVyxrQkFBZixFQUFtQztBQUNqQyxZQUFNRCxDQUFOO0FBQ0Q7O0FBRUQ7QUFDQSxRQUFJO0FBQ29CRCxjQUFRLHVDQUFSLENBRHBCLENBQ0NELGNBREQsYUFDQ0EsY0FERDtBQUVILEtBRkQsQ0FFRSxPQUFPRSxDQUFQLEVBQVU7QUFDVjtBQUNBLFVBQUlBLEVBQUVDLElBQUYsS0FBVyxrQkFBZixFQUFtQztBQUNqQyxjQUFNRCxDQUFOO0FBQ0Q7QUFDRjtBQUNGO0FBQ0QsU0FBT0YsY0FBUDtBQUNEOztBQUVEOzs7Ozs7O0FBT0EsU0FBU0ksNEJBQVQsQ0FBc0NKLGNBQXRDLEVBQXNESyxHQUF0RCxFQUEyREMsVUFBM0QsRUFBdUU7QUFDckU7QUFDQTtBQUZxRTtBQUk3REMsd0JBSjZELEdBSWxDQyxRQUFRQyxHQUowQixDQUk3REYsc0JBSjZEOztBQU1yRTtBQUNBLE1BQUlHLG9CQUFvQkgsMEJBQTBCQyxRQUFRQyxHQUFSLENBQVlGLHNCQUFaLEtBQXVDLE9BQXpGOztBQUVBO0FBQ0E7QUFDQSxNQUFJO0FBQzhCTixZQUFRLDZCQUFSLENBRDlCLENBQ01VLG1CQUROLGFBQ01BLG1CQUROO0FBRUZELHdCQUFvQkMsdUJBQXVCSiwyQkFBMkIsT0FBdEU7QUFDRCxHQUhELENBR0UsT0FBT0ssQ0FBUCxFQUFVO0FBQ1Y7QUFDQTtBQUNEOztBQUVELE1BQU1DLGFBQWEsSUFBSWIsY0FBSixDQUFtQjtBQUNwQ00sMEJBRG9DLEVBQW5CLENBQW5COzs7QUFJQSxNQUFJO0FBQ0YsV0FBT1EsTUFBTUMsSUFBTjtBQUNMRixlQUFXRyxZQUFYLENBQXdCWCxHQUF4QixDQURLO0FBRUwseUJBQUdZLFFBQUgsUUFBR0EsUUFBSCxDQUFhQyxPQUFiLFFBQWFBLE9BQWIsUUFBNEIsRUFBRUMsVUFBVUYsUUFBWixFQUFzQkMsZ0JBQXRCLEVBQTVCLEVBRkssQ0FBUDs7QUFJRCxHQUxELENBS0UsT0FBT2hCLENBQVAsRUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0VRO0FBQ0dSLE1BQUVrQixPQUFGLENBQVVDLFFBQVYsQ0FBbUIsK0JBQW5CLENBRkw7QUFHRTtBQUNBLFlBQU0sSUFBSUMsS0FBSixtYUFBTjs7Ozs7Ozs7OztBQVVEO0FBQ0Q7QUFDQSxVQUFNcEIsQ0FBTjtBQUNEO0FBQ0Y7O0FBRUQ7Ozs7Ozs7QUFPQSxTQUFTcUIsNEJBQVQsQ0FBc0NsQixHQUF0QyxFQUEyQ0MsVUFBM0MsRUFBdUQ7QUFDckQsTUFBSTtBQUNGO0FBREUsb0JBRXlETCxRQUFRLDRCQUFSLENBRnpELENBRTBCdUIsMEJBRjFCLGFBRU1DLGtCQUZOO0FBR0Y7QUFDQTtBQUNBOztBQUVBLFdBQU9ELDJCQUEyQm5CLEdBQTNCLEVBQWdDO0FBQ3JDQyw0QkFEcUMsRUFBaEMsQ0FBUDs7QUFHRCxHQVZELENBVUUsT0FBT0osQ0FBUCxFQUFVO0FBQ1Y7QUFDQSxRQUFJQSxFQUFFQyxJQUFGLEtBQVcsa0JBQWYsRUFBbUM7QUFDakMsWUFBTUQsQ0FBTjtBQUNEOztBQUVEO0FBTlU7O0FBU05ELFlBQVEsMkJBQVIsQ0FUTSxDQVFZdUIsMkJBUlosYUFRUkMsa0JBUlE7QUFVVixRQUFNQyxXQUFXckIsSUFBSXNCLE1BQUo7QUFDZjtBQUNFdEIsT0FERjtBQUVFLGNBQUN1QixPQUFELFVBQWF0QixXQUFXdUIsR0FBWCxDQUFlLFVBQUNDLFNBQUQsVUFBZ0IsWUFBRCxDQUFjQyxJQUFkLENBQW1CSCxPQUFuQixJQUE4QkEsT0FBOUIsVUFBMkNBLE9BQTNDLHFCQUEwREUsU0FBMUQsQ0FBZixHQUFmLENBQWIsRUFGRixDQURlLENBQWpCOzs7O0FBT0EsV0FBT04sNEJBQTJCRSxRQUEzQixDQUFQO0FBQ0Q7QUFDRjs7QUFFRDs7Ozs7OztBQU9BLFNBQVNELGtCQUFULENBQTRCcEIsR0FBNUIsRUFBaUNDLFVBQWpDLEVBQTZDO0FBQzNDLE1BQU1OLGlCQUFpQkQsdUJBQXZCOztBQUVBO0FBQ0EsTUFBSUMsY0FBSixFQUFvQjtBQUNsQixXQUFPSSw2QkFBNkJKLGNBQTdCLEVBQTZDSyxHQUE3QyxFQUFrREMsVUFBbEQsQ0FBUDtBQUNEO0FBQ0Q7QUFDQSxTQUFPaUIsNkJBQTZCbEIsR0FBN0IsRUFBa0NDLFVBQWxDLENBQVA7QUFDRDs7QUFFRCxJQUFNMEIsNkJBQTZCLDBCQUFuQztBQUNBLElBQU1DLDJCQUEyQix3QkFBakM7QUFDQSxJQUFNQyx5QkFBeUIsc0JBQS9CO0FBQ0EsSUFBTUMscUJBQXFCLG1CQUEzQjtBQUNBLElBQU1DLDZCQUE2QiwwQkFBbkM7QUFDQSxJQUFNQywyQkFBMkIsd0JBQWpDO0FBQ0EsSUFBTUMsdUJBQXVCLHFCQUE3QjtBQUNBLElBQU1DLHVCQUF1QixxQkFBN0I7QUFDQSxJQUFNQyxvQkFBb0Isa0JBQTFCO0FBQ0EsSUFBTUMsYUFBYSxZQUFuQjtBQUNBLElBQU1DLGlCQUFpQixlQUF2QjtBQUNBLElBQU1DLGdCQUFnQixjQUF0QjtBQUNBLElBQU1DLDJCQUEyQix3QkFBakM7QUFDQSxJQUFNQyw0QkFBNEIsd0JBQWxDO0FBQ0EsSUFBTUMsc0JBQXNCLG1CQUE1QjtBQUNBLElBQU1DLFVBQVUsU0FBaEI7O0FBRUEsU0FBU0MsNEJBQVQsQ0FBc0NDLFdBQXRDLEVBQW1EQyxFQUFuRCxFQUF1RDtBQUNyRCxNQUFJRCxXQUFKLEVBQWlCO0FBQ2YsUUFBTUUsb0JBQW9CRixZQUFZRyxJQUFaLEtBQXFCUix3QkFBckI7QUFDckJLLGdCQUFZRyxJQUFaLEtBQXFCUCx5QkFEQTtBQUVyQkksZ0JBQVlHLElBQVosS0FBcUJOLG1CQUYxQjs7QUFJQTtBQUNFRyxnQkFBWUcsSUFBWixLQUFxQmIsb0JBQXJCO0FBQ0dVLGdCQUFZRyxJQUFaLEtBQXFCWixpQkFEeEI7QUFFR1cscUJBSEw7QUFJRTtBQUNBRCxTQUFHRCxZQUFZSSxFQUFaLENBQWVDLElBQWxCLEVBQXdCSCxpQkFBeEI7QUFDRCxLQU5ELE1BTU8sSUFBSUYsWUFBWUcsSUFBWixLQUFxQmQsb0JBQXpCLEVBQStDO0FBQ3BEVyxrQkFBWU0sWUFBWixDQUF5QkMsT0FBekIsQ0FBaUMsaUJBQVksS0FBVEgsRUFBUyxTQUFUQSxFQUFTO0FBQzNDLFlBQUlBLEdBQUdELElBQUgsS0FBWVYsY0FBaEIsRUFBZ0M7QUFDOUIsMkNBQXdCVyxFQUF4QixFQUE0QixVQUFDekIsT0FBRCxFQUFhO0FBQ3ZDLGdCQUFJQSxRQUFRd0IsSUFBUixLQUFpQlgsVUFBckIsRUFBaUM7QUFDL0JTLGlCQUFHdEIsUUFBUTBCLElBQVgsRUFBaUIsS0FBakI7QUFDRDtBQUNGLFdBSkQ7QUFLRCxTQU5ELE1BTU8sSUFBSUQsR0FBR0QsSUFBSCxLQUFZVCxhQUFoQixFQUErQjtBQUNwQ1UsYUFBR0ksUUFBSCxDQUFZRCxPQUFaLENBQW9CLGlCQUFjLEtBQVhGLElBQVcsU0FBWEEsSUFBVztBQUNoQ0osZUFBR0ksSUFBSCxFQUFTLEtBQVQ7QUFDRCxXQUZEO0FBR0QsU0FKTSxNQUlBO0FBQ0xKLGFBQUdHLEdBQUdDLElBQU4sRUFBWSxLQUFaO0FBQ0Q7QUFDRixPQWREO0FBZUQ7QUFDRjtBQUNGOztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBbUJBLElBQU1JLGFBQWEsSUFBSUMsR0FBSixFQUFuQjs7QUFFQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXlCQSxJQUFNQyxhQUFhLElBQUlELEdBQUosRUFBbkI7O0FBRUEsSUFBTUUsZ0JBQWdCLElBQUlGLEdBQUosRUFBdEI7O0FBRUE7QUFDQSxJQUFNRyxlQUFlLElBQUlDLEdBQUosRUFBckI7QUFDQSxJQUFNQyxrQkFBa0IsSUFBSUQsR0FBSixFQUF4Qjs7QUFFQSxJQUFNRSxlQUFlLFNBQWZBLFlBQWUsQ0FBQ0MsSUFBRCxVQUFXLHFCQUFELENBQXVCbkMsSUFBdkIsQ0FBNEJtQyxJQUE1QixDQUFWLEdBQXJCOztBQUVBOzs7Ozs7QUFNQSxTQUFTQyxZQUFULENBQXNCOUQsR0FBdEIsRUFBMkIrRCxhQUEzQixFQUEwQ0MsT0FBMUMsRUFBbUQ7QUFDakQsTUFBTS9ELGFBQWFRLE1BQU1DLElBQU4sQ0FBVywrQkFBa0JzRCxRQUFRQyxRQUExQixDQUFYLENBQW5COztBQUVBLE1BQU1DLGNBQWM5QyxtQkFBbUJwQixHQUFuQixFQUF3QkMsVUFBeEIsQ0FBcEI7O0FBRUE7QUFDQSxNQUFNa0UsbUJBQW1CL0MsbUJBQW1CMkMsYUFBbkIsRUFBa0M5RCxVQUFsQyxDQUF6Qjs7QUFFQTtBQUNBLE1BQUlrRSxpQkFBaUJDLE1BQWpCLElBQTJCLE9BQU9ELGlCQUFpQixDQUFqQixDQUFQLEtBQStCLFFBQTlELEVBQXdFO0FBQ3RFQSxxQkFBaUJoQixPQUFqQixDQUF5QixVQUFDckMsUUFBRCxVQUFjMkMsYUFBYVksR0FBYixDQUFpQnZELFFBQWpCLENBQWQsRUFBekI7QUFDRCxHQUZELE1BRU87QUFDTHFELHFCQUFpQmhCLE9BQWpCLENBQXlCLHNCQUFHckMsUUFBSCxTQUFHQSxRQUFILFFBQWtCMkMsYUFBYVksR0FBYixDQUFpQnZELFFBQWpCLENBQWxCLEVBQXpCO0FBQ0Q7O0FBRUQ7QUFDQSxNQUFNd0QsZ0JBQWdCSixZQUFZRSxNQUFaLElBQXNCLE9BQU9GLFlBQVksQ0FBWixDQUFQLEtBQTBCLFFBQWhEO0FBQ2xCQSxjQUFZSyxNQUFaLENBQW1CLFVBQUMzRCxRQUFELFVBQWMsQ0FBQ2dELGFBQWFoRCxRQUFiLENBQWYsRUFBbkIsQ0FEa0I7QUFFbEIsbUNBQVFzRCxXQUFSLEVBQXFCLHNCQUFHcEQsUUFBSCxTQUFHQSxRQUFILFFBQWtCOEMsYUFBYTlDLFFBQWIsSUFBeUIsRUFBekIsR0FBOEJBLFFBQWhELEVBQXJCLENBRko7O0FBSUEsU0FBTyxJQUFJNEMsR0FBSixDQUFRWSxhQUFSLENBQVA7QUFDRDs7QUFFRDs7O0FBR0EsSUFBTUUsMkJBQTJCLFNBQTNCQSx3QkFBMkIsQ0FBQ0MsUUFBRCxFQUFXVCxPQUFYLEVBQXVCO0FBQ3RELE1BQU1VLFlBQVksSUFBSXBCLEdBQUosRUFBbEI7QUFDQW1CLFdBQVN0QixPQUFULENBQWlCLFVBQUN3QixJQUFELEVBQVU7QUFDekIsUUFBTUMsVUFBVSxJQUFJdEIsR0FBSixFQUFoQjtBQUNBLFFBQU11QixVQUFVLElBQUl2QixHQUFKLEVBQWhCO0FBQ0EsUUFBTXdCLGlCQUFpQkMscUJBQWlCQyxHQUFqQixDQUFxQkwsSUFBckIsRUFBMkJYLE9BQTNCLENBQXZCO0FBQ0EsUUFBSWMsY0FBSixFQUFvQjs7QUFFaEJHLGtCQUZnQjs7Ozs7QUFPZEgsb0JBUGMsQ0FFaEJHLFlBRmdCLENBR2hCQyxTQUhnQixHQU9kSixjQVBjLENBR2hCSSxTQUhnQixDQUlQQyxlQUpPLEdBT2RMLGNBUGMsQ0FJaEJELE9BSmdCLENBS2hCTyxTQUxnQixHQU9kTixjQVBjLENBS2hCTSxTQUxnQixDQU1oQkMsV0FOZ0IsR0FPZFAsY0FQYyxDQU1oQk8sV0FOZ0I7O0FBU2xCN0Isb0JBQWM4QixHQUFkLENBQWtCWCxJQUFsQixFQUF3QlUsV0FBeEI7QUFDQTtBQUNBLFVBQU1FLG1CQUFtQixJQUFJN0IsR0FBSixFQUF6QjtBQUNBdUIsbUJBQWE5QixPQUFiLENBQXFCLFVBQUNxQyxhQUFELEVBQW1CO0FBQ3RDLFlBQU1DLGFBQWFELGVBQW5CO0FBQ0EsWUFBSUMsZUFBZSxJQUFuQixFQUF5QjtBQUN2QjtBQUNEOztBQUVERix5QkFBaUJsQixHQUFqQixDQUFxQm9CLFdBQVc1QixJQUFoQztBQUNELE9BUEQ7QUFRQWEsZ0JBQVVZLEdBQVYsQ0FBY1gsSUFBZCxFQUFvQlksZ0JBQXBCOztBQUVBTCxnQkFBVS9CLE9BQVYsQ0FBa0IsVUFBQ3VDLEtBQUQsRUFBUUMsR0FBUixFQUFnQjtBQUNoQyxZQUFJQSxRQUFRakQsT0FBWixFQUFxQjtBQUNuQmtDLGtCQUFRVSxHQUFSLENBQVl0RCx3QkFBWixFQUFzQyxFQUFFNEQsV0FBVyxJQUFJbEMsR0FBSixFQUFiLEVBQXRDO0FBQ0QsU0FGRCxNQUVPO0FBQ0xrQixrQkFBUVUsR0FBUixDQUFZSyxHQUFaLEVBQWlCLEVBQUVDLFdBQVcsSUFBSWxDLEdBQUosRUFBYixFQUFqQjtBQUNEO0FBQ0QsWUFBTW1DLFdBQVdILE1BQU1JLFNBQU4sRUFBakI7QUFDQSxZQUFJLENBQUNELFFBQUwsRUFBZTtBQUNiO0FBQ0Q7QUFDRCxZQUFJRSxjQUFjbEIsUUFBUUcsR0FBUixDQUFZYSxTQUFTaEMsSUFBckIsQ0FBbEI7QUFDQSxZQUFJbUMscUJBQUo7QUFDQSxZQUFJTixNQUFNTyxLQUFOLEtBQWdCdkQsT0FBcEIsRUFBNkI7QUFDM0JzRCx5QkFBZWhFLHdCQUFmO0FBQ0QsU0FGRCxNQUVPO0FBQ0xnRSx5QkFBZU4sTUFBTU8sS0FBckI7QUFDRDtBQUNELFlBQUksT0FBT0YsV0FBUCxLQUF1QixXQUEzQixFQUF3QztBQUN0Q0Esd0JBQWMsSUFBSXJDLEdBQUosOEJBQVlxQyxXQUFaLElBQXlCQyxZQUF6QixHQUFkO0FBQ0QsU0FGRCxNQUVPO0FBQ0xELHdCQUFjLElBQUlyQyxHQUFKLENBQVEsQ0FBQ3NDLFlBQUQsQ0FBUixDQUFkO0FBQ0Q7QUFDRG5CLGdCQUFRUyxHQUFSLENBQVlPLFNBQVNoQyxJQUFyQixFQUEyQmtDLFdBQTNCO0FBQ0QsT0F2QkQ7O0FBeUJBWixzQkFBZ0JoQyxPQUFoQixDQUF3QixVQUFDdUMsS0FBRCxFQUFRQyxHQUFSLEVBQWdCO0FBQ3RDLFlBQUkvQixhQUFhK0IsR0FBYixDQUFKLEVBQXVCO0FBQ3JCO0FBQ0Q7QUFDRCxZQUFNSSxjQUFjbEIsUUFBUUcsR0FBUixDQUFZVyxHQUFaLEtBQW9CLElBQUlqQyxHQUFKLEVBQXhDO0FBQ0FnQyxjQUFNeEMsWUFBTixDQUFtQkMsT0FBbkIsQ0FBMkIsaUJBQTRCLEtBQXpCK0Msa0JBQXlCLFNBQXpCQSxrQkFBeUI7QUFDckRBLDZCQUFtQi9DLE9BQW5CLENBQTJCLFVBQUNnRCxTQUFELEVBQWU7QUFDeENKLHdCQUFZMUIsR0FBWixDQUFnQjhCLFNBQWhCO0FBQ0QsV0FGRDtBQUdELFNBSkQ7QUFLQXRCLGdCQUFRUyxHQUFSLENBQVlLLEdBQVosRUFBaUJJLFdBQWpCO0FBQ0QsT0FYRDtBQVlBMUMsaUJBQVdpQyxHQUFYLENBQWVYLElBQWYsRUFBcUJFLE9BQXJCOztBQUVBO0FBQ0EsVUFBSXBCLGFBQWEyQyxHQUFiLENBQWlCekIsSUFBakIsQ0FBSixFQUE0QjtBQUMxQjtBQUNEO0FBQ0RTLGdCQUFVakMsT0FBVixDQUFrQixVQUFDdUMsS0FBRCxFQUFRQyxHQUFSLEVBQWdCO0FBQ2hDLFlBQUlBLFFBQVFqRCxPQUFaLEVBQXFCO0FBQ25Ca0Msa0JBQVFVLEdBQVIsQ0FBWXRELHdCQUFaLEVBQXNDLEVBQUU0RCxXQUFXLElBQUlsQyxHQUFKLEVBQWIsRUFBdEM7QUFDRCxTQUZELE1BRU87QUFDTGtCLGtCQUFRVSxHQUFSLENBQVlLLEdBQVosRUFBaUIsRUFBRUMsV0FBVyxJQUFJbEMsR0FBSixFQUFiLEVBQWpCO0FBQ0Q7QUFDRixPQU5EO0FBT0Q7QUFDRGtCLFlBQVFVLEdBQVIsQ0FBWXpELHNCQUFaLEVBQW9DLEVBQUUrRCxXQUFXLElBQUlsQyxHQUFKLEVBQWIsRUFBcEM7QUFDQWtCLFlBQVFVLEdBQVIsQ0FBWXZELDBCQUFaLEVBQXdDLEVBQUU2RCxXQUFXLElBQUlsQyxHQUFKLEVBQWIsRUFBeEM7QUFDQUgsZUFBVytCLEdBQVgsQ0FBZVgsSUFBZixFQUFxQkMsT0FBckI7QUFDRCxHQWhGRDtBQWlGQUYsWUFBVXZCLE9BQVYsQ0FBa0IsVUFBQ3VDLEtBQUQsRUFBUUMsR0FBUixFQUFnQjtBQUNoQ0QsVUFBTXZDLE9BQU4sQ0FBYyxVQUFDa0QsR0FBRCxFQUFTO0FBQ3JCLFVBQU12QixpQkFBaUJ2QixXQUFXeUIsR0FBWCxDQUFlcUIsR0FBZixDQUF2QjtBQUNBLFVBQUl2QixjQUFKLEVBQW9CO0FBQ2xCLFlBQU13QixnQkFBZ0J4QixlQUFlRSxHQUFmLENBQW1CbkQsc0JBQW5CLENBQXRCO0FBQ0F5RSxzQkFBY1YsU0FBZCxDQUF3QnZCLEdBQXhCLENBQTRCc0IsR0FBNUI7QUFDRDtBQUNGLEtBTkQ7QUFPRCxHQVJEO0FBU0QsQ0E1RkQ7O0FBOEZBOzs7O0FBSUEsSUFBTVksaUJBQWlCLFNBQWpCQSxjQUFpQixHQUFNO0FBQzNCbEQsYUFBV0YsT0FBWCxDQUFtQixVQUFDcUQsU0FBRCxFQUFZQyxPQUFaLEVBQXdCO0FBQ3pDRCxjQUFVckQsT0FBVixDQUFrQixVQUFDdUMsS0FBRCxFQUFRQyxHQUFSLEVBQWdCO0FBQ2hDLFVBQU1mLFVBQVVyQixXQUFXeUIsR0FBWCxDQUFlVyxHQUFmLENBQWhCO0FBQ0EsVUFBSSxPQUFPZixPQUFQLEtBQW1CLFdBQXZCLEVBQW9DO0FBQ2xDYyxjQUFNdkMsT0FBTixDQUFjLFVBQUN1RCxhQUFELEVBQW1CO0FBQy9CLGNBQUlQLGtCQUFKO0FBQ0EsY0FBSU8sa0JBQWtCM0UsMEJBQXRCLEVBQWtEO0FBQ2hEb0Usd0JBQVlwRSwwQkFBWjtBQUNELFdBRkQsTUFFTyxJQUFJMkUsa0JBQWtCMUUsd0JBQXRCLEVBQWdEO0FBQ3JEbUUsd0JBQVluRSx3QkFBWjtBQUNELFdBRk0sTUFFQTtBQUNMbUUsd0JBQVlPLGFBQVo7QUFDRDtBQUNELGNBQUksT0FBT1AsU0FBUCxLQUFxQixXQUF6QixFQUFzQztBQUNwQyxnQkFBTVEsa0JBQWtCL0IsUUFBUUksR0FBUixDQUFZbUIsU0FBWixDQUF4QjtBQUNBLGdCQUFJLE9BQU9RLGVBQVAsS0FBMkIsV0FBL0IsRUFBNEM7QUFDbENmLHVCQURrQyxHQUNwQmUsZUFEb0IsQ0FDbENmLFNBRGtDO0FBRTFDQSx3QkFBVXZCLEdBQVYsQ0FBY29DLE9BQWQ7QUFDQTdCLHNCQUFRVSxHQUFSLENBQVlhLFNBQVosRUFBdUIsRUFBRVAsb0JBQUYsRUFBdkI7QUFDRDtBQUNGO0FBQ0YsU0FqQkQ7QUFrQkQ7QUFDRixLQXRCRDtBQXVCRCxHQXhCRDtBQXlCRCxDQTFCRDs7QUE0QkEsSUFBTWdCLFNBQVMsU0FBVEEsTUFBUyxDQUFDNUcsR0FBRCxFQUFTO0FBQ3RCLE1BQUlBLEdBQUosRUFBUztBQUNQLFdBQU9BLEdBQVA7QUFDRDtBQUNELFNBQU8sQ0FBQ0csUUFBUTBHLEdBQVIsRUFBRCxDQUFQO0FBQ0QsQ0FMRDs7QUFPQTs7OztBQUlBO0FBQ0EsSUFBSXBDLGlCQUFKO0FBQ0EsSUFBSXFDLHVCQUFKO0FBQ0EsSUFBTUMsZ0JBQWdCLFNBQWhCQSxhQUFnQixDQUFDL0csR0FBRCxFQUFNK0QsYUFBTixFQUFxQkMsT0FBckIsRUFBaUM7QUFDckQsTUFBTWdELGFBQWFDLEtBQUtDLFNBQUwsQ0FBZTtBQUNoQ2xILFNBQUssQ0FBQ0EsT0FBTyxFQUFSLEVBQVltSCxJQUFaLEVBRDJCO0FBRWhDcEQsbUJBQWUsQ0FBQ0EsaUJBQWlCLEVBQWxCLEVBQXNCb0QsSUFBdEIsRUFGaUI7QUFHaENsSCxnQkFBWVEsTUFBTUMsSUFBTixDQUFXLCtCQUFrQnNELFFBQVFDLFFBQTFCLENBQVgsRUFBZ0RrRCxJQUFoRCxFQUhvQixFQUFmLENBQW5COztBQUtBLE1BQUlILGVBQWVGLGNBQW5CLEVBQW1DO0FBQ2pDO0FBQ0Q7O0FBRUR6RCxhQUFXK0QsS0FBWDtBQUNBN0QsYUFBVzZELEtBQVg7QUFDQTNELGVBQWEyRCxLQUFiO0FBQ0F6RCxrQkFBZ0J5RCxLQUFoQjs7QUFFQTNDLGFBQVdYLGFBQWE4QyxPQUFPNUcsR0FBUCxDQUFiLEVBQTBCK0QsYUFBMUIsRUFBeUNDLE9BQXpDLENBQVg7QUFDQVEsMkJBQXlCQyxRQUF6QixFQUFtQ1QsT0FBbkM7QUFDQXVDO0FBQ0FPLG1CQUFpQkUsVUFBakI7QUFDRCxDQW5CRDs7QUFxQkEsSUFBTUssMkJBQTJCLFNBQTNCQSx3QkFBMkIsQ0FBQ0MsVUFBRCxVQUFnQkEsV0FBV0MsSUFBWCxDQUFnQixzQkFBR3hFLElBQUgsU0FBR0EsSUFBSCxRQUFjQSxTQUFTaEIsMEJBQXZCLEVBQWhCLENBQWhCLEVBQWpDOztBQUVBLElBQU15Rix5QkFBeUIsU0FBekJBLHNCQUF5QixDQUFDRixVQUFELFVBQWdCQSxXQUFXQyxJQUFYLENBQWdCLHNCQUFHeEUsSUFBSCxTQUFHQSxJQUFILFFBQWNBLFNBQVNmLHdCQUF2QixFQUFoQixDQUFoQixFQUEvQjs7QUFFQSxJQUFNeUYsY0FBYyxTQUFkQSxXQUFjLENBQUM5QyxJQUFELEVBQVU7QUFDTiw4QkFBVSxFQUFFa0MsS0FBS2xDLElBQVAsRUFBVixDQURNLENBQ3BCZCxJQURvQixjQUNwQkEsSUFEb0IsQ0FDZDZELEdBRGMsY0FDZEEsR0FEYztBQUU1QixNQUFNQyxXQUFXLG1CQUFROUQsSUFBUixDQUFqQjs7QUFFQSxNQUFNK0Qsc0JBQXNCLFNBQXRCQSxtQkFBc0IsQ0FBQ0MsUUFBRCxFQUFjO0FBQ3hDLFFBQUksZ0JBQUtGLFFBQUwsRUFBZUUsUUFBZixNQUE2QmxELElBQWpDLEVBQXVDO0FBQ3JDLGFBQU8sSUFBUDtBQUNEO0FBQ0YsR0FKRDs7QUFNQSxNQUFNbUQsc0JBQXNCLFNBQXRCQSxtQkFBc0IsQ0FBQ0QsUUFBRCxFQUFjO0FBQ3hDLFFBQU1FLGdCQUFnQixpQ0FBUSx5QkFBT0YsUUFBUCxDQUFSLEVBQTBCLFVBQUNuQyxLQUFELFVBQVcsT0FBT0EsS0FBUCxLQUFpQixTQUFqQixHQUE2QixFQUE3QixHQUFrQyxnQkFBS2lDLFFBQUwsRUFBZWpDLEtBQWYsQ0FBN0MsRUFBMUIsQ0FBdEI7O0FBRUEsUUFBSSxnQ0FBU3FDLGFBQVQsRUFBd0JwRCxJQUF4QixDQUFKLEVBQW1DO0FBQ2pDLGFBQU8sSUFBUDtBQUNEO0FBQ0YsR0FORDs7QUFRQSxNQUFNcUQsZ0JBQWdCLFNBQWhCQSxhQUFnQixDQUFDSCxRQUFELEVBQWM7QUFDbEMsUUFBSSxPQUFPQSxRQUFQLEtBQW9CLFFBQXhCLEVBQWtDO0FBQ2hDLGFBQU9ELG9CQUFvQkMsUUFBcEIsQ0FBUDtBQUNEOztBQUVELFFBQUksUUFBT0EsUUFBUCx5Q0FBT0EsUUFBUCxPQUFvQixRQUF4QixFQUFrQztBQUNoQyxhQUFPQyxvQkFBb0JELFFBQXBCLENBQVA7QUFDRDtBQUNGLEdBUkQ7O0FBVUEsTUFBSUgsbUJBQWdCLElBQXBCLEVBQTBCO0FBQ3hCLFdBQU8sS0FBUDtBQUNEOztBQUVELE1BQUlBLElBQUlPLEdBQVIsRUFBYTtBQUNYLFFBQUlELGNBQWNOLElBQUlPLEdBQWxCLENBQUosRUFBNEI7QUFDMUIsYUFBTyxJQUFQO0FBQ0Q7QUFDRjs7QUFFRCxNQUFJUCxJQUFJUSxPQUFSLEVBQWlCO0FBQ2YsUUFBSUYsY0FBY04sSUFBSVEsT0FBbEIsQ0FBSixFQUFnQztBQUM5QixhQUFPLElBQVA7QUFDRDtBQUNGOztBQUVELE1BQUlSLElBQUlTLElBQVIsRUFBYztBQUNaLFFBQUlQLG9CQUFvQkYsSUFBSVMsSUFBeEIsQ0FBSixFQUFtQztBQUNqQyxhQUFPLElBQVA7QUFDRDtBQUNGOztBQUVELFNBQU8sS0FBUDtBQUNELENBbkREOztBQXFEQUMsT0FBT3hELE9BQVAsR0FBaUI7QUFDZnlELFFBQU07QUFDSnRGLFVBQU0sWUFERjtBQUVKdUYsVUFBTTtBQUNKQyxnQkFBVSxrQkFETjtBQUVKQyxtQkFBYSx1RkFGVDtBQUdKQyxXQUFLLDBCQUFRLG1CQUFSLENBSEQsRUFGRjs7QUFPSkMsWUFBUSxDQUFDO0FBQ1BDLGtCQUFZO0FBQ1YzSSxhQUFLO0FBQ0h3SSx1QkFBYSxzREFEVjtBQUVIekYsZ0JBQU0sT0FGSDtBQUdINkYsdUJBQWEsSUFIVjtBQUlIQyxpQkFBTztBQUNMOUYsa0JBQU0sUUFERDtBQUVMK0YsdUJBQVcsQ0FGTixFQUpKLEVBREs7OztBQVVWL0UsdUJBQWU7QUFDYnlFLHVCQUFhLHFGQURBO0FBRWJ6RixnQkFBTSxPQUZPO0FBR2I2Rix1QkFBYSxJQUhBO0FBSWJDLGlCQUFPO0FBQ0w5RixrQkFBTSxRQUREO0FBRUwrRix1QkFBVyxDQUZOLEVBSk0sRUFWTDs7O0FBbUJWQyx3QkFBZ0I7QUFDZFAsdUJBQWEsb0NBREM7QUFFZHpGLGdCQUFNLFNBRlEsRUFuQk47O0FBdUJWaUcsdUJBQWU7QUFDYlIsdUJBQWEsa0NBREE7QUFFYnpGLGdCQUFNLFNBRk8sRUF2Qkw7O0FBMkJWa0csaUNBQXlCO0FBQ3ZCVCx1QkFBYSx1Q0FEVTtBQUV2QnpGLGdCQUFNLFNBRmlCLEVBM0JmLEVBREw7OztBQWlDUG1HLGFBQU87QUFDTDtBQUNFUCxvQkFBWTtBQUNWSyx5QkFBZSxFQUFFLFFBQU0sQ0FBQyxJQUFELENBQVIsRUFETDtBQUVWaEosZUFBSztBQUNIbUosc0JBQVUsQ0FEUCxFQUZLLEVBRGQ7OztBQU9FQyxrQkFBVSxDQUFDLGVBQUQsQ0FQWixFQURLOztBQVVMO0FBQ0VULG9CQUFZO0FBQ1ZJLDBCQUFnQixFQUFFLFFBQU0sQ0FBQyxJQUFELENBQVIsRUFETixFQURkOztBQUlFSyxrQkFBVSxDQUFDLGdCQUFELENBSlosRUFWSyxDQWpDQSxFQUFELENBUEosRUFEUzs7Ozs7O0FBNkRmQyxRQTdEZSwrQkE2RFJyRixPQTdEUSxFQTZEQzs7Ozs7OztBQU9WQSxjQUFRc0YsT0FBUixDQUFnQixDQUFoQixLQUFzQixFQVBaLENBRVp0SixHQUZZLFNBRVpBLEdBRlksNkJBR1orRCxhQUhZLENBR1pBLGFBSFksdUNBR0ksRUFISix1QkFJWmdGLGNBSlksU0FJWkEsY0FKWSxDQUtaQyxhQUxZLFNBS1pBLGFBTFksQ0FNWkMsdUJBTlksU0FNWkEsdUJBTlk7O0FBU2QsVUFBSUQsYUFBSixFQUFtQjtBQUNqQmpDLHNCQUFjL0csR0FBZCxFQUFtQitELGFBQW5CLEVBQWtDQyxPQUFsQztBQUNEOztBQUVELFVBQU1XLE9BQU8sd0NBQW9CWCxPQUFwQixDQUFiOztBQUVBLFVBQU11RixtQ0FBc0IsU0FBdEJBLG1CQUFzQixDQUFDQyxJQUFELEVBQVU7QUFDcEMsY0FBSSxDQUFDVCxjQUFMLEVBQXFCO0FBQ25CO0FBQ0Q7O0FBRUQsY0FBSXRGLGFBQWEyQyxHQUFiLENBQWlCekIsSUFBakIsQ0FBSixFQUE0QjtBQUMxQjtBQUNEOztBQUVELGNBQU04RSxjQUFjbEcsV0FBV3lCLEdBQVgsQ0FBZUwsSUFBZixDQUFwQjtBQUNBLGNBQU1ELFlBQVkrRSxZQUFZekUsR0FBWixDQUFnQm5ELHNCQUFoQixDQUFsQjtBQUNBLGNBQU02SCxtQkFBbUJELFlBQVl6RSxHQUFaLENBQWdCakQsMEJBQWhCLENBQXpCOztBQUVBMEgsZ0NBQW1CNUgsc0JBQW5CO0FBQ0E0SCxnQ0FBbUIxSCwwQkFBbkI7QUFDQSxjQUFJMEgsWUFBWUUsSUFBWixHQUFtQixDQUF2QixFQUEwQjtBQUN4QjtBQUNBO0FBQ0EzRixvQkFBUTRGLE1BQVIsQ0FBZUosS0FBS0ssSUFBTCxDQUFVLENBQVYsSUFBZUwsS0FBS0ssSUFBTCxDQUFVLENBQVYsQ0FBZixHQUE4QkwsSUFBN0MsRUFBbUQsa0JBQW5EO0FBQ0Q7QUFDREMsc0JBQVluRSxHQUFaLENBQWdCekQsc0JBQWhCLEVBQXdDNkMsU0FBeEM7QUFDQStFLHNCQUFZbkUsR0FBWixDQUFnQnZELDBCQUFoQixFQUE0QzJILGdCQUE1QztBQUNELFNBdEJLLDhCQUFOOztBQXdCQSxVQUFNSSwwQkFBYSxTQUFiQSxVQUFhLENBQUNOLElBQUQsRUFBT08sYUFBUCxFQUFzQkMsWUFBdEIsRUFBdUM7QUFDeEQsY0FBSSxDQUFDaEIsYUFBTCxFQUFvQjtBQUNsQjtBQUNEOztBQUVELGNBQUlnQixnQkFBZ0JmLHVCQUFwQixFQUE2QztBQUMzQztBQUNEOztBQUVELGNBQUl4RixhQUFhMkMsR0FBYixDQUFpQnpCLElBQWpCLENBQUosRUFBNEI7QUFDMUI7QUFDRDs7QUFFRCxjQUFJOEMsWUFBWTlDLElBQVosQ0FBSixFQUF1QjtBQUNyQjtBQUNEOztBQUVELGNBQUloQixnQkFBZ0J5QyxHQUFoQixDQUFvQnpCLElBQXBCLENBQUosRUFBK0I7QUFDN0I7QUFDRDs7QUFFRDtBQUNBLGNBQUksQ0FBQ0YsU0FBUzJCLEdBQVQsQ0FBYXpCLElBQWIsQ0FBTCxFQUF5QjtBQUN2QkYsdUJBQVdYLGFBQWE4QyxPQUFPNUcsR0FBUCxDQUFiLEVBQTBCK0QsYUFBMUIsRUFBeUNDLE9BQXpDLENBQVg7QUFDQSxnQkFBSSxDQUFDUyxTQUFTMkIsR0FBVCxDQUFhekIsSUFBYixDQUFMLEVBQXlCO0FBQ3ZCaEIsOEJBQWdCVSxHQUFoQixDQUFvQk0sSUFBcEI7QUFDQTtBQUNEO0FBQ0Y7O0FBRURDLG9CQUFVckIsV0FBV3lCLEdBQVgsQ0FBZUwsSUFBZixDQUFWOztBQUVBLGNBQUksQ0FBQ0MsT0FBTCxFQUFjO0FBQ1pxRixvQkFBUUMsS0FBUixtQkFBd0J2RixJQUF4QjtBQUNEOztBQUVEO0FBQ0EsY0FBTUQsWUFBWUUsUUFBUUksR0FBUixDQUFZbkQsc0JBQVosQ0FBbEI7QUFDQSxjQUFJLE9BQU82QyxTQUFQLEtBQXFCLFdBQXJCLElBQW9DcUYsa0JBQWtCL0gsd0JBQTFELEVBQW9GO0FBQ2xGLGdCQUFJMEMsVUFBVWtCLFNBQVYsQ0FBb0IrRCxJQUFwQixHQUEyQixDQUEvQixFQUFrQztBQUNoQztBQUNEO0FBQ0Y7O0FBRUQ7QUFDQSxjQUFNRCxtQkFBbUI5RSxRQUFRSSxHQUFSLENBQVlqRCwwQkFBWixDQUF6QjtBQUNBLGNBQUksT0FBTzJILGdCQUFQLEtBQTRCLFdBQWhDLEVBQTZDO0FBQzNDLGdCQUFJQSxpQkFBaUI5RCxTQUFqQixDQUEyQitELElBQTNCLEdBQWtDLENBQXRDLEVBQXlDO0FBQ3ZDO0FBQ0Q7QUFDRjs7QUFFRDtBQUNBLGNBQU1RLGFBQWFKLGtCQUFrQnJILE9BQWxCLEdBQTRCVix3QkFBNUIsR0FBdUQrSCxhQUExRTs7QUFFQSxjQUFNcEQsa0JBQWtCL0IsUUFBUUksR0FBUixDQUFZbUYsVUFBWixDQUF4Qjs7QUFFQSxjQUFNekUsUUFBUXlFLGVBQWVuSSx3QkFBZixHQUEwQ1UsT0FBMUMsR0FBb0R5SCxVQUFsRTs7QUFFQSxjQUFJLE9BQU94RCxlQUFQLEtBQTJCLFdBQS9CLEVBQTRDO0FBQzFDLGdCQUFJQSxnQkFBZ0JmLFNBQWhCLENBQTBCK0QsSUFBMUIsR0FBaUMsQ0FBckMsRUFBd0M7QUFDdEMzRixzQkFBUTRGLE1BQVI7QUFDRUosa0JBREY7QUFFMkI5RCxtQkFGM0I7O0FBSUQ7QUFDRixXQVBELE1BT087QUFDTDFCLG9CQUFRNEYsTUFBUjtBQUNFSixnQkFERjtBQUUyQjlELGlCQUYzQjs7QUFJRDtBQUNGLFNBeEVLLHFCQUFOOztBQTBFQTs7Ozs7QUFLQSxVQUFNMEUsaUNBQW9CLFNBQXBCQSxpQkFBb0IsQ0FBQ1osSUFBRCxFQUFVO0FBQ2xDLGNBQUkvRixhQUFhMkMsR0FBYixDQUFpQnpCLElBQWpCLENBQUosRUFBNEI7QUFDMUI7QUFDRDs7QUFFRCxjQUFJQyxVQUFVckIsV0FBV3lCLEdBQVgsQ0FBZUwsSUFBZixDQUFkOztBQUVBO0FBQ0E7QUFDQSxjQUFJLE9BQU9DLE9BQVAsS0FBbUIsV0FBdkIsRUFBb0M7QUFDbENBLHNCQUFVLElBQUl0QixHQUFKLEVBQVY7QUFDRDs7QUFFRCxjQUFNK0csYUFBYSxJQUFJL0csR0FBSixFQUFuQjtBQUNBLGNBQU1nSCx1QkFBdUIsSUFBSTVHLEdBQUosRUFBN0I7O0FBRUE4RixlQUFLSyxJQUFMLENBQVUxRyxPQUFWLENBQWtCLGtCQUF1QyxLQUFwQ0osSUFBb0MsVUFBcENBLElBQW9DLENBQTlCSCxXQUE4QixVQUE5QkEsV0FBOEIsQ0FBakIwRSxVQUFpQixVQUFqQkEsVUFBaUI7QUFDdkQsZ0JBQUl2RSxTQUFTcEIsMEJBQWIsRUFBeUM7QUFDdkMySSxtQ0FBcUJqRyxHQUFyQixDQUF5QnJDLHdCQUF6QjtBQUNEO0FBQ0QsZ0JBQUllLFNBQVNuQix3QkFBYixFQUF1QztBQUNyQyxrQkFBSTBGLFdBQVdsRCxNQUFYLEdBQW9CLENBQXhCLEVBQTJCO0FBQ3pCa0QsMkJBQVduRSxPQUFYLENBQW1CLFVBQUNnRCxTQUFELEVBQWU7QUFDaEMsc0JBQUlBLFVBQVVvRSxRQUFkLEVBQXdCO0FBQ3RCRCx5Q0FBcUJqRyxHQUFyQixDQUF5QjhCLFVBQVVvRSxRQUFWLENBQW1CdEgsSUFBbkIsSUFBMkJrRCxVQUFVb0UsUUFBVixDQUFtQjdFLEtBQXZFO0FBQ0Q7QUFDRixpQkFKRDtBQUtEO0FBQ0QvQywyQ0FBNkJDLFdBQTdCLEVBQTBDLFVBQUNLLElBQUQsRUFBVTtBQUNsRHFILHFDQUFxQmpHLEdBQXJCLENBQXlCcEIsSUFBekI7QUFDRCxlQUZEO0FBR0Q7QUFDRixXQWhCRDs7QUFrQkE7QUFDQTJCLGtCQUFRekIsT0FBUixDQUFnQixVQUFDdUMsS0FBRCxFQUFRQyxHQUFSLEVBQWdCO0FBQzlCLGdCQUFJMkUscUJBQXFCbEUsR0FBckIsQ0FBeUJULEdBQXpCLENBQUosRUFBbUM7QUFDakMwRSx5QkFBVy9FLEdBQVgsQ0FBZUssR0FBZixFQUFvQkQsS0FBcEI7QUFDRDtBQUNGLFdBSkQ7O0FBTUE7QUFDQTRFLCtCQUFxQm5ILE9BQXJCLENBQTZCLFVBQUN3QyxHQUFELEVBQVM7QUFDcEMsZ0JBQUksQ0FBQ2YsUUFBUXdCLEdBQVIsQ0FBWVQsR0FBWixDQUFMLEVBQXVCO0FBQ3JCMEUseUJBQVcvRSxHQUFYLENBQWVLLEdBQWYsRUFBb0IsRUFBRUMsV0FBVyxJQUFJbEMsR0FBSixFQUFiLEVBQXBCO0FBQ0Q7QUFDRixXQUpEOztBQU1BO0FBQ0EsY0FBTWdCLFlBQVlFLFFBQVFJLEdBQVIsQ0FBWW5ELHNCQUFaLENBQWxCO0FBQ0EsY0FBSTZILG1CQUFtQjlFLFFBQVFJLEdBQVIsQ0FBWWpELDBCQUFaLENBQXZCOztBQUVBLGNBQUksT0FBTzJILGdCQUFQLEtBQTRCLFdBQWhDLEVBQTZDO0FBQzNDQSwrQkFBbUIsRUFBRTlELFdBQVcsSUFBSWxDLEdBQUosRUFBYixFQUFuQjtBQUNEOztBQUVEMkcscUJBQVcvRSxHQUFYLENBQWV6RCxzQkFBZixFQUF1QzZDLFNBQXZDO0FBQ0EyRixxQkFBVy9FLEdBQVgsQ0FBZXZELDBCQUFmLEVBQTJDMkgsZ0JBQTNDO0FBQ0FuRyxxQkFBVytCLEdBQVgsQ0FBZVgsSUFBZixFQUFxQjBGLFVBQXJCO0FBQ0QsU0EzREssNEJBQU47O0FBNkRBOzs7OztBQUtBLFVBQU1HLGlDQUFvQixTQUFwQkEsaUJBQW9CLENBQUNoQixJQUFELEVBQVU7QUFDbEMsY0FBSSxDQUFDUixhQUFMLEVBQW9CO0FBQ2xCO0FBQ0Q7O0FBRUQsY0FBSXlCLGlCQUFpQnBILFdBQVcyQixHQUFYLENBQWVMLElBQWYsQ0FBckI7QUFDQSxjQUFJLE9BQU84RixjQUFQLEtBQTBCLFdBQTlCLEVBQTJDO0FBQ3pDQSw2QkFBaUIsSUFBSW5ILEdBQUosRUFBakI7QUFDRDs7QUFFRCxjQUFNb0gsc0JBQXNCLElBQUloSCxHQUFKLEVBQTVCO0FBQ0EsY0FBTWlILHNCQUFzQixJQUFJakgsR0FBSixFQUE1Qjs7QUFFQSxjQUFNa0gsZUFBZSxJQUFJbEgsR0FBSixFQUFyQjtBQUNBLGNBQU1tSCxlQUFlLElBQUluSCxHQUFKLEVBQXJCOztBQUVBLGNBQU1vSCxvQkFBb0IsSUFBSXBILEdBQUosRUFBMUI7QUFDQSxjQUFNcUgsb0JBQW9CLElBQUlySCxHQUFKLEVBQTFCOztBQUVBLGNBQU1zSCxhQUFhLElBQUkxSCxHQUFKLEVBQW5CO0FBQ0EsY0FBTTJILGFBQWEsSUFBSTNILEdBQUosRUFBbkI7QUFDQW1ILHlCQUFldEgsT0FBZixDQUF1QixVQUFDdUMsS0FBRCxFQUFRQyxHQUFSLEVBQWdCO0FBQ3JDLGdCQUFJRCxNQUFNVSxHQUFOLENBQVV2RSxzQkFBVixDQUFKLEVBQXVDO0FBQ3JDK0ksMkJBQWF2RyxHQUFiLENBQWlCc0IsR0FBakI7QUFDRDtBQUNELGdCQUFJRCxNQUFNVSxHQUFOLENBQVVyRSwwQkFBVixDQUFKLEVBQTJDO0FBQ3pDMkksa0NBQW9CckcsR0FBcEIsQ0FBd0JzQixHQUF4QjtBQUNEO0FBQ0QsZ0JBQUlELE1BQU1VLEdBQU4sQ0FBVXBFLHdCQUFWLENBQUosRUFBeUM7QUFDdkM4SSxnQ0FBa0J6RyxHQUFsQixDQUFzQnNCLEdBQXRCO0FBQ0Q7QUFDREQsa0JBQU12QyxPQUFOLENBQWMsVUFBQ2tELEdBQUQsRUFBUztBQUNyQjtBQUNFQSxzQkFBUXRFLDBCQUFSO0FBQ0dzRSxzQkFBUXJFLHdCQUZiO0FBR0U7QUFDQWdKLDJCQUFXMUYsR0FBWCxDQUFlZSxHQUFmLEVBQW9CVixHQUFwQjtBQUNEO0FBQ0YsYUFQRDtBQVFELFdBbEJEOztBQW9CQSxtQkFBU3VGLG9CQUFULENBQThCQyxNQUE5QixFQUFzQztBQUNwQyxnQkFBSUEsT0FBT3BJLElBQVAsS0FBZ0IsU0FBcEIsRUFBK0I7QUFDN0IscUJBQU8sSUFBUDtBQUNEO0FBQ0QsZ0JBQU1xSSxJQUFJLDBCQUFRRCxPQUFPekYsS0FBZixFQUFzQjFCLE9BQXRCLENBQVY7QUFDQSxnQkFBSW9ILEtBQUssSUFBVCxFQUFlO0FBQ2IscUJBQU8sSUFBUDtBQUNEO0FBQ0RULGdDQUFvQnRHLEdBQXBCLENBQXdCK0csQ0FBeEI7QUFDRDs7QUFFRCxrQ0FBTTVCLElBQU4sRUFBWWhHLGNBQWN3QixHQUFkLENBQWtCTCxJQUFsQixDQUFaLEVBQXFDO0FBQ25DMEcsNEJBRG1DLHlDQUNsQkMsS0FEa0IsRUFDWDtBQUN0QkoscUNBQXFCSSxNQUFNSCxNQUEzQjtBQUNELGVBSGtDO0FBSW5DSSwwQkFKbUMsdUNBSXBCRCxLQUpvQixFQUliO0FBQ3BCLG9CQUFJQSxNQUFNRSxNQUFOLENBQWF6SSxJQUFiLEtBQXNCLFFBQTFCLEVBQW9DO0FBQ2xDbUksdUNBQXFCSSxNQUFNRyxTQUFOLENBQWdCLENBQWhCLENBQXJCO0FBQ0Q7QUFDRixlQVJrQywyQkFBckM7OztBQVdBakMsZUFBS0ssSUFBTCxDQUFVMUcsT0FBVixDQUFrQixVQUFDdUksT0FBRCxFQUFhO0FBQzdCLGdCQUFJQyxxQkFBSjs7QUFFQTtBQUNBLGdCQUFJRCxRQUFRM0ksSUFBUixLQUFpQm5CLHdCQUFyQixFQUErQztBQUM3QyxrQkFBSThKLFFBQVFQLE1BQVosRUFBb0I7QUFDbEJRLCtCQUFlLDBCQUFRRCxRQUFRUCxNQUFSLENBQWVTLEdBQWYsQ0FBbUJDLE9BQW5CLENBQTJCLFFBQTNCLEVBQXFDLEVBQXJDLENBQVIsRUFBa0Q3SCxPQUFsRCxDQUFmO0FBQ0EwSCx3QkFBUXBFLFVBQVIsQ0FBbUJuRSxPQUFuQixDQUEyQixVQUFDZ0QsU0FBRCxFQUFlO0FBQ3hDLHNCQUFNbEQsT0FBT2tELFVBQVVGLEtBQVYsQ0FBZ0JoRCxJQUFoQixJQUF3QmtELFVBQVVGLEtBQVYsQ0FBZ0JQLEtBQXJEO0FBQ0Esc0JBQUl6QyxTQUFTUCxPQUFiLEVBQXNCO0FBQ3BCcUksc0NBQWtCMUcsR0FBbEIsQ0FBc0JzSCxZQUF0QjtBQUNELG1CQUZELE1BRU87QUFDTFYsK0JBQVczRixHQUFYLENBQWVyQyxJQUFmLEVBQXFCMEksWUFBckI7QUFDRDtBQUNGLGlCQVBEO0FBUUQ7QUFDRjs7QUFFRCxnQkFBSUQsUUFBUTNJLElBQVIsS0FBaUJsQixzQkFBckIsRUFBNkM7QUFDM0M4Siw2QkFBZSwwQkFBUUQsUUFBUVAsTUFBUixDQUFlUyxHQUFmLENBQW1CQyxPQUFuQixDQUEyQixRQUEzQixFQUFxQyxFQUFyQyxDQUFSLEVBQWtEN0gsT0FBbEQsQ0FBZjtBQUNBNkcsMkJBQWF4RyxHQUFiLENBQWlCc0gsWUFBakI7QUFDRDs7QUFFRCxnQkFBSUQsUUFBUTNJLElBQVIsS0FBaUJqQixrQkFBckIsRUFBeUM7QUFDdkM2Siw2QkFBZSwwQkFBUUQsUUFBUVAsTUFBUixDQUFlUyxHQUFmLENBQW1CQyxPQUFuQixDQUEyQixRQUEzQixFQUFxQyxFQUFyQyxDQUFSLEVBQWtEN0gsT0FBbEQsQ0FBZjtBQUNBLGtCQUFJLENBQUMySCxZQUFMLEVBQW1CO0FBQ2pCO0FBQ0Q7O0FBRUQsa0JBQUkvSCxhQUFhK0gsWUFBYixDQUFKLEVBQWdDO0FBQzlCO0FBQ0Q7O0FBRUQsa0JBQUl0RSx5QkFBeUJxRSxRQUFRcEUsVUFBakMsQ0FBSixFQUFrRDtBQUNoRHFELG9DQUFvQnRHLEdBQXBCLENBQXdCc0gsWUFBeEI7QUFDRDs7QUFFRCxrQkFBSW5FLHVCQUF1QmtFLFFBQVFwRSxVQUEvQixDQUFKLEVBQWdEO0FBQzlDeUQsa0NBQWtCMUcsR0FBbEIsQ0FBc0JzSCxZQUF0QjtBQUNEOztBQUVERCxzQkFBUXBFLFVBQVI7QUFDRy9DLG9CQURILENBQ1UsVUFBQzRCLFNBQUQsVUFBZUEsVUFBVXBELElBQVYsS0FBbUJmLHdCQUFuQixJQUErQ21FLFVBQVVwRCxJQUFWLEtBQW1CaEIsMEJBQWpGLEVBRFY7QUFFR29CLHFCQUZILENBRVcsVUFBQ2dELFNBQUQsRUFBZTtBQUN0QjhFLDJCQUFXM0YsR0FBWCxDQUFlYSxVQUFVMkYsUUFBVixDQUFtQjdJLElBQW5CLElBQTJCa0QsVUFBVTJGLFFBQVYsQ0FBbUJwRyxLQUE3RCxFQUFvRWlHLFlBQXBFO0FBQ0QsZUFKSDtBQUtEO0FBQ0YsV0EvQ0Q7O0FBaURBZCx1QkFBYTFILE9BQWIsQ0FBcUIsVUFBQ3VDLEtBQUQsRUFBVztBQUM5QixnQkFBSSxDQUFDa0YsYUFBYXhFLEdBQWIsQ0FBaUJWLEtBQWpCLENBQUwsRUFBOEI7QUFDNUIsa0JBQUliLFVBQVU0RixlQUFlekYsR0FBZixDQUFtQlUsS0FBbkIsQ0FBZDtBQUNBLGtCQUFJLE9BQU9iLE9BQVAsS0FBbUIsV0FBdkIsRUFBb0M7QUFDbENBLDBCQUFVLElBQUluQixHQUFKLEVBQVY7QUFDRDtBQUNEbUIsc0JBQVFSLEdBQVIsQ0FBWXhDLHNCQUFaO0FBQ0E0SSw2QkFBZW5GLEdBQWYsQ0FBbUJJLEtBQW5CLEVBQTBCYixPQUExQjs7QUFFQSxrQkFBSUQsV0FBVXJCLFdBQVd5QixHQUFYLENBQWVVLEtBQWYsQ0FBZDtBQUNBLGtCQUFJWSxzQkFBSjtBQUNBLGtCQUFJLE9BQU8xQixRQUFQLEtBQW1CLFdBQXZCLEVBQW9DO0FBQ2xDMEIsZ0NBQWdCMUIsU0FBUUksR0FBUixDQUFZbkQsc0JBQVosQ0FBaEI7QUFDRCxlQUZELE1BRU87QUFDTCtDLDJCQUFVLElBQUl0QixHQUFKLEVBQVY7QUFDQUMsMkJBQVcrQixHQUFYLENBQWVJLEtBQWYsRUFBc0JkLFFBQXRCO0FBQ0Q7O0FBRUQsa0JBQUksT0FBTzBCLGFBQVAsS0FBeUIsV0FBN0IsRUFBMEM7QUFDeENBLDhCQUFjVixTQUFkLENBQXdCdkIsR0FBeEIsQ0FBNEJNLElBQTVCO0FBQ0QsZUFGRCxNQUVPO0FBQ0wsb0JBQU1pQixZQUFZLElBQUlsQyxHQUFKLEVBQWxCO0FBQ0FrQywwQkFBVXZCLEdBQVYsQ0FBY00sSUFBZDtBQUNBQyx5QkFBUVUsR0FBUixDQUFZekQsc0JBQVosRUFBb0MsRUFBRStELG9CQUFGLEVBQXBDO0FBQ0Q7QUFDRjtBQUNGLFdBMUJEOztBQTRCQWdGLHVCQUFhekgsT0FBYixDQUFxQixVQUFDdUMsS0FBRCxFQUFXO0FBQzlCLGdCQUFJLENBQUNtRixhQUFhekUsR0FBYixDQUFpQlYsS0FBakIsQ0FBTCxFQUE4QjtBQUM1QixrQkFBTWIsVUFBVTRGLGVBQWV6RixHQUFmLENBQW1CVSxLQUFuQixDQUFoQjtBQUNBYixnQ0FBZWhELHNCQUFmOztBQUVBLGtCQUFNK0MsWUFBVXJCLFdBQVd5QixHQUFYLENBQWVVLEtBQWYsQ0FBaEI7QUFDQSxrQkFBSSxPQUFPZCxTQUFQLEtBQW1CLFdBQXZCLEVBQW9DO0FBQ2xDLG9CQUFNMEIsZ0JBQWdCMUIsVUFBUUksR0FBUixDQUFZbkQsc0JBQVosQ0FBdEI7QUFDQSxvQkFBSSxPQUFPeUUsYUFBUCxLQUF5QixXQUE3QixFQUEwQztBQUN4Q0EsZ0NBQWNWLFNBQWQsV0FBK0JqQixJQUEvQjtBQUNEO0FBQ0Y7QUFDRjtBQUNGLFdBYkQ7O0FBZUFvRyw0QkFBa0I1SCxPQUFsQixDQUEwQixVQUFDdUMsS0FBRCxFQUFXO0FBQ25DLGdCQUFJLENBQUNvRixrQkFBa0IxRSxHQUFsQixDQUFzQlYsS0FBdEIsQ0FBTCxFQUFtQztBQUNqQyxrQkFBSWIsVUFBVTRGLGVBQWV6RixHQUFmLENBQW1CVSxLQUFuQixDQUFkO0FBQ0Esa0JBQUksT0FBT2IsT0FBUCxLQUFtQixXQUF2QixFQUFvQztBQUNsQ0EsMEJBQVUsSUFBSW5CLEdBQUosRUFBVjtBQUNEO0FBQ0RtQixzQkFBUVIsR0FBUixDQUFZckMsd0JBQVo7QUFDQXlJLDZCQUFlbkYsR0FBZixDQUFtQkksS0FBbkIsRUFBMEJiLE9BQTFCOztBQUVBLGtCQUFJRCxZQUFVckIsV0FBV3lCLEdBQVgsQ0FBZVUsS0FBZixDQUFkO0FBQ0Esa0JBQUlZLHNCQUFKO0FBQ0Esa0JBQUksT0FBTzFCLFNBQVAsS0FBbUIsV0FBdkIsRUFBb0M7QUFDbEMwQixnQ0FBZ0IxQixVQUFRSSxHQUFSLENBQVloRCx3QkFBWixDQUFoQjtBQUNELGVBRkQsTUFFTztBQUNMNEMsNEJBQVUsSUFBSXRCLEdBQUosRUFBVjtBQUNBQywyQkFBVytCLEdBQVgsQ0FBZUksS0FBZixFQUFzQmQsU0FBdEI7QUFDRDs7QUFFRCxrQkFBSSxPQUFPMEIsYUFBUCxLQUF5QixXQUE3QixFQUEwQztBQUN4Q0EsOEJBQWNWLFNBQWQsQ0FBd0J2QixHQUF4QixDQUE0Qk0sSUFBNUI7QUFDRCxlQUZELE1BRU87QUFDTCxvQkFBTWlCLFlBQVksSUFBSWxDLEdBQUosRUFBbEI7QUFDQWtDLDBCQUFVdkIsR0FBVixDQUFjTSxJQUFkO0FBQ0FDLDBCQUFRVSxHQUFSLENBQVl0RCx3QkFBWixFQUFzQyxFQUFFNEQsb0JBQUYsRUFBdEM7QUFDRDtBQUNGO0FBQ0YsV0ExQkQ7O0FBNEJBa0YsNEJBQWtCM0gsT0FBbEIsQ0FBMEIsVUFBQ3VDLEtBQUQsRUFBVztBQUNuQyxnQkFBSSxDQUFDcUYsa0JBQWtCM0UsR0FBbEIsQ0FBc0JWLEtBQXRCLENBQUwsRUFBbUM7QUFDakMsa0JBQU1iLFVBQVU0RixlQUFlekYsR0FBZixDQUFtQlUsS0FBbkIsQ0FBaEI7QUFDQWIsZ0NBQWU3Qyx3QkFBZjs7QUFFQSxrQkFBTTRDLFlBQVVyQixXQUFXeUIsR0FBWCxDQUFlVSxLQUFmLENBQWhCO0FBQ0Esa0JBQUksT0FBT2QsU0FBUCxLQUFtQixXQUF2QixFQUFvQztBQUNsQyxvQkFBTTBCLGdCQUFnQjFCLFVBQVFJLEdBQVIsQ0FBWWhELHdCQUFaLENBQXRCO0FBQ0Esb0JBQUksT0FBT3NFLGFBQVAsS0FBeUIsV0FBN0IsRUFBMEM7QUFDeENBLGdDQUFjVixTQUFkLFdBQStCakIsSUFBL0I7QUFDRDtBQUNGO0FBQ0Y7QUFDRixXQWJEOztBQWVBZ0csOEJBQW9CeEgsT0FBcEIsQ0FBNEIsVUFBQ3VDLEtBQUQsRUFBVztBQUNyQyxnQkFBSSxDQUFDZ0Ysb0JBQW9CdEUsR0FBcEIsQ0FBd0JWLEtBQXhCLENBQUwsRUFBcUM7QUFDbkMsa0JBQUliLFVBQVU0RixlQUFlekYsR0FBZixDQUFtQlUsS0FBbkIsQ0FBZDtBQUNBLGtCQUFJLE9BQU9iLE9BQVAsS0FBbUIsV0FBdkIsRUFBb0M7QUFDbENBLDBCQUFVLElBQUluQixHQUFKLEVBQVY7QUFDRDtBQUNEbUIsc0JBQVFSLEdBQVIsQ0FBWXRDLDBCQUFaO0FBQ0EwSSw2QkFBZW5GLEdBQWYsQ0FBbUJJLEtBQW5CLEVBQTBCYixPQUExQjs7QUFFQSxrQkFBSUQsWUFBVXJCLFdBQVd5QixHQUFYLENBQWVVLEtBQWYsQ0FBZDtBQUNBLGtCQUFJWSxzQkFBSjtBQUNBLGtCQUFJLE9BQU8xQixTQUFQLEtBQW1CLFdBQXZCLEVBQW9DO0FBQ2xDMEIsZ0NBQWdCMUIsVUFBUUksR0FBUixDQUFZakQsMEJBQVosQ0FBaEI7QUFDRCxlQUZELE1BRU87QUFDTDZDLDRCQUFVLElBQUl0QixHQUFKLEVBQVY7QUFDQUMsMkJBQVcrQixHQUFYLENBQWVJLEtBQWYsRUFBc0JkLFNBQXRCO0FBQ0Q7O0FBRUQsa0JBQUksT0FBTzBCLGFBQVAsS0FBeUIsV0FBN0IsRUFBMEM7QUFDeENBLDhCQUFjVixTQUFkLENBQXdCdkIsR0FBeEIsQ0FBNEJNLElBQTVCO0FBQ0QsZUFGRCxNQUVPO0FBQ0wsb0JBQU1pQixZQUFZLElBQUlsQyxHQUFKLEVBQWxCO0FBQ0FrQywwQkFBVXZCLEdBQVYsQ0FBY00sSUFBZDtBQUNBQywwQkFBUVUsR0FBUixDQUFZdkQsMEJBQVosRUFBd0MsRUFBRTZELG9CQUFGLEVBQXhDO0FBQ0Q7QUFDRjtBQUNGLFdBMUJEOztBQTRCQThFLDhCQUFvQnZILE9BQXBCLENBQTRCLFVBQUN1QyxLQUFELEVBQVc7QUFDckMsZ0JBQUksQ0FBQ2lGLG9CQUFvQnZFLEdBQXBCLENBQXdCVixLQUF4QixDQUFMLEVBQXFDO0FBQ25DLGtCQUFNYixVQUFVNEYsZUFBZXpGLEdBQWYsQ0FBbUJVLEtBQW5CLENBQWhCO0FBQ0FiLGdDQUFlOUMsMEJBQWY7O0FBRUEsa0JBQU02QyxZQUFVckIsV0FBV3lCLEdBQVgsQ0FBZVUsS0FBZixDQUFoQjtBQUNBLGtCQUFJLE9BQU9kLFNBQVAsS0FBbUIsV0FBdkIsRUFBb0M7QUFDbEMsb0JBQU0wQixnQkFBZ0IxQixVQUFRSSxHQUFSLENBQVlqRCwwQkFBWixDQUF0QjtBQUNBLG9CQUFJLE9BQU91RSxhQUFQLEtBQXlCLFdBQTdCLEVBQTBDO0FBQ3hDQSxnQ0FBY1YsU0FBZCxXQUErQmpCLElBQS9CO0FBQ0Q7QUFDRjtBQUNGO0FBQ0YsV0FiRDs7QUFlQXNHLHFCQUFXOUgsT0FBWCxDQUFtQixVQUFDdUMsS0FBRCxFQUFRQyxHQUFSLEVBQWdCO0FBQ2pDLGdCQUFJLENBQUNxRixXQUFXNUUsR0FBWCxDQUFlVCxHQUFmLENBQUwsRUFBMEI7QUFDeEIsa0JBQUlkLFVBQVU0RixlQUFlekYsR0FBZixDQUFtQlUsS0FBbkIsQ0FBZDtBQUNBLGtCQUFJLE9BQU9iLE9BQVAsS0FBbUIsV0FBdkIsRUFBb0M7QUFDbENBLDBCQUFVLElBQUluQixHQUFKLEVBQVY7QUFDRDtBQUNEbUIsc0JBQVFSLEdBQVIsQ0FBWXNCLEdBQVo7QUFDQThFLDZCQUFlbkYsR0FBZixDQUFtQkksS0FBbkIsRUFBMEJiLE9BQTFCOztBQUVBLGtCQUFJRCxZQUFVckIsV0FBV3lCLEdBQVgsQ0FBZVUsS0FBZixDQUFkO0FBQ0Esa0JBQUlZLHNCQUFKO0FBQ0Esa0JBQUksT0FBTzFCLFNBQVAsS0FBbUIsV0FBdkIsRUFBb0M7QUFDbEMwQixnQ0FBZ0IxQixVQUFRSSxHQUFSLENBQVlXLEdBQVosQ0FBaEI7QUFDRCxlQUZELE1BRU87QUFDTGYsNEJBQVUsSUFBSXRCLEdBQUosRUFBVjtBQUNBQywyQkFBVytCLEdBQVgsQ0FBZUksS0FBZixFQUFzQmQsU0FBdEI7QUFDRDs7QUFFRCxrQkFBSSxPQUFPMEIsYUFBUCxLQUF5QixXQUE3QixFQUEwQztBQUN4Q0EsOEJBQWNWLFNBQWQsQ0FBd0J2QixHQUF4QixDQUE0Qk0sSUFBNUI7QUFDRCxlQUZELE1BRU87QUFDTCxvQkFBTWlCLFlBQVksSUFBSWxDLEdBQUosRUFBbEI7QUFDQWtDLDBCQUFVdkIsR0FBVixDQUFjTSxJQUFkO0FBQ0FDLDBCQUFRVSxHQUFSLENBQVlLLEdBQVosRUFBaUIsRUFBRUMsb0JBQUYsRUFBakI7QUFDRDtBQUNGO0FBQ0YsV0ExQkQ7O0FBNEJBb0YscUJBQVc3SCxPQUFYLENBQW1CLFVBQUN1QyxLQUFELEVBQVFDLEdBQVIsRUFBZ0I7QUFDakMsZ0JBQUksQ0FBQ3NGLFdBQVc3RSxHQUFYLENBQWVULEdBQWYsQ0FBTCxFQUEwQjtBQUN4QixrQkFBTWQsVUFBVTRGLGVBQWV6RixHQUFmLENBQW1CVSxLQUFuQixDQUFoQjtBQUNBYixnQ0FBZWMsR0FBZjs7QUFFQSxrQkFBTWYsWUFBVXJCLFdBQVd5QixHQUFYLENBQWVVLEtBQWYsQ0FBaEI7QUFDQSxrQkFBSSxPQUFPZCxTQUFQLEtBQW1CLFdBQXZCLEVBQW9DO0FBQ2xDLG9CQUFNMEIsZ0JBQWdCMUIsVUFBUUksR0FBUixDQUFZVyxHQUFaLENBQXRCO0FBQ0Esb0JBQUksT0FBT1csYUFBUCxLQUF5QixXQUE3QixFQUEwQztBQUN4Q0EsZ0NBQWNWLFNBQWQsV0FBK0JqQixJQUEvQjtBQUNEO0FBQ0Y7QUFDRjtBQUNGLFdBYkQ7QUFjRCxTQTNSSyw0QkFBTjs7QUE2UkEsYUFBTztBQUNMLHNCQURLLG9DQUNVNkUsSUFEVixFQUNnQjtBQUNuQlksOEJBQWtCWixJQUFsQjtBQUNBZ0IsOEJBQWtCaEIsSUFBbEI7QUFDQUQsZ0NBQW9CQyxJQUFwQjtBQUNELFdBTEk7QUFNTHVDLGdDQU5LLGlEQU1vQnZDLElBTnBCLEVBTTBCO0FBQzdCTSx1QkFBV04sSUFBWCxFQUFpQnhILHdCQUFqQixFQUEyQyxLQUEzQztBQUNELFdBUkk7QUFTTGdLLDhCQVRLLCtDQVNrQnhDLElBVGxCLEVBU3dCO0FBQzNCQSxpQkFBS2xDLFVBQUwsQ0FBZ0JuRSxPQUFoQixDQUF3QixVQUFDZ0QsU0FBRCxFQUFlO0FBQ3JDMkQseUJBQVczRCxTQUFYLEVBQXNCQSxVQUFVb0UsUUFBVixDQUFtQnRILElBQW5CLElBQTJCa0QsVUFBVW9FLFFBQVYsQ0FBbUI3RSxLQUFwRSxFQUEyRSxLQUEzRTtBQUNELGFBRkQ7QUFHQS9DLHlDQUE2QjZHLEtBQUs1RyxXQUFsQyxFQUErQyxVQUFDSyxJQUFELEVBQU8rRyxZQUFQLEVBQXdCO0FBQ3JFRix5QkFBV04sSUFBWCxFQUFpQnZHLElBQWpCLEVBQXVCK0csWUFBdkI7QUFDRCxhQUZEO0FBR0QsV0FoQkksbUNBQVA7O0FBa0JELEtBcGlCYyxtQkFBakIiLCJmaWxlIjoibm8tdW51c2VkLW1vZHVsZXMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlT3ZlcnZpZXcgRW5zdXJlcyB0aGF0IG1vZHVsZXMgY29udGFpbiBleHBvcnRzIGFuZC9vciBhbGxcbiAqIG1vZHVsZXMgYXJlIGNvbnN1bWVkIHdpdGhpbiBvdGhlciBtb2R1bGVzLlxuICogQGF1dGhvciBSZW7DqSBGZXJtYW5uXG4gKi9cblxuaW1wb3J0IHsgZ2V0UGh5c2ljYWxGaWxlbmFtZSB9IGZyb20gJ2VzbGludC1tb2R1bGUtdXRpbHMvY29udGV4dENvbXBhdCc7XG5pbXBvcnQgeyBnZXRGaWxlRXh0ZW5zaW9ucyB9IGZyb20gJ2VzbGludC1tb2R1bGUtdXRpbHMvaWdub3JlJztcbmltcG9ydCByZXNvbHZlIGZyb20gJ2VzbGludC1tb2R1bGUtdXRpbHMvcmVzb2x2ZSc7XG5pbXBvcnQgdmlzaXQgZnJvbSAnZXNsaW50LW1vZHVsZS11dGlscy92aXNpdCc7XG5pbXBvcnQgeyBkaXJuYW1lLCBqb2luIH0gZnJvbSAncGF0aCc7XG5pbXBvcnQgcmVhZFBrZ1VwIGZyb20gJ2VzbGludC1tb2R1bGUtdXRpbHMvcmVhZFBrZ1VwJztcbmltcG9ydCB2YWx1ZXMgZnJvbSAnb2JqZWN0LnZhbHVlcyc7XG5pbXBvcnQgaW5jbHVkZXMgZnJvbSAnYXJyYXktaW5jbHVkZXMnO1xuaW1wb3J0IGZsYXRNYXAgZnJvbSAnYXJyYXkucHJvdG90eXBlLmZsYXRtYXAnO1xuXG5pbXBvcnQgRXhwb3J0TWFwQnVpbGRlciBmcm9tICcuLi9leHBvcnRNYXAvYnVpbGRlcic7XG5pbXBvcnQgcmVjdXJzaXZlUGF0dGVybkNhcHR1cmUgZnJvbSAnLi4vZXhwb3J0TWFwL3BhdHRlcm5DYXB0dXJlJztcbmltcG9ydCBkb2NzVXJsIGZyb20gJy4uL2RvY3NVcmwnO1xuXG4vKipcbiAqIEF0dGVtcHQgdG8gbG9hZCB0aGUgaW50ZXJuYWwgYEZpbGVFbnVtZXJhdG9yYCBjbGFzcywgd2hpY2ggaGFzIGV4aXN0ZWQgaW4gYSBjb3VwbGVcbiAqIG9mIGRpZmZlcmVudCBwbGFjZXMsIGRlcGVuZGluZyBvbiB0aGUgdmVyc2lvbiBvZiBgZXNsaW50YC4gIFRyeSByZXF1aXJpbmcgaXQgZnJvbSBib3RoXG4gKiBsb2NhdGlvbnMuXG4gKiBAcmV0dXJucyBSZXR1cm5zIHRoZSBgRmlsZUVudW1lcmF0b3JgIGNsYXNzIGlmIGl0cyByZXF1aXJhYmxlLCBvdGhlcndpc2UgYHVuZGVmaW5lZGAuXG4gKi9cbmZ1bmN0aW9uIHJlcXVpcmVGaWxlRW51bWVyYXRvcigpIHtcbiAgbGV0IEZpbGVFbnVtZXJhdG9yO1xuXG4gIC8vIFRyeSBnZXR0aW5nIGl0IGZyb20gdGhlIGVzbGludCBwcml2YXRlIC8gZGVwcmVjYXRlZCBhcGlcbiAgdHJ5IHtcbiAgICAoeyBGaWxlRW51bWVyYXRvciB9ID0gcmVxdWlyZSgnZXNsaW50L3VzZS1hdC15b3VyLW93bi1yaXNrJykpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgLy8gQWJzb3JiIHRoaXMgaWYgaXQncyBNT0RVTEVfTk9UX0ZPVU5EXG4gICAgaWYgKGUuY29kZSAhPT0gJ01PRFVMRV9OT1RfRk9VTkQnKSB7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cblxuICAgIC8vIElmIG5vdCB0aGVyZSwgdGhlbiB0cnkgZ2V0dGluZyBpdCBmcm9tIGVzbGludC9saWIvY2xpLWVuZ2luZS9maWxlLWVudW1lcmF0b3IgKG1vdmVkIHRoZXJlIGluIHY2KVxuICAgIHRyeSB7XG4gICAgICAoeyBGaWxlRW51bWVyYXRvciB9ID0gcmVxdWlyZSgnZXNsaW50L2xpYi9jbGktZW5naW5lL2ZpbGUtZW51bWVyYXRvcicpKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBBYnNvcmIgdGhpcyBpZiBpdCdzIE1PRFVMRV9OT1RfRk9VTkRcbiAgICAgIGlmIChlLmNvZGUgIT09ICdNT0RVTEVfTk9UX0ZPVU5EJykge1xuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gRmlsZUVudW1lcmF0b3I7XG59XG5cbi8qKlxuICogR2l2ZW4gYSBGaWxlRW51bWVyYXRvciBjbGFzcywgaW5zdGFudGlhdGUgYW5kIGxvYWQgdGhlIGxpc3Qgb2YgZmlsZXMuXG4gKiBAcGFyYW0gRmlsZUVudW1lcmF0b3IgdGhlIGBGaWxlRW51bWVyYXRvcmAgY2xhc3MgZnJvbSBgZXNsaW50YCdzIGludGVybmFsIGFwaVxuICogQHBhcmFtIHtzdHJpbmd9IHNyYyBwYXRoIHRvIHRoZSBzcmMgcm9vdFxuICogQHBhcmFtIHtzdHJpbmdbXX0gZXh0ZW5zaW9ucyBsaXN0IG9mIHN1cHBvcnRlZCBleHRlbnNpb25zXG4gKiBAcmV0dXJucyB7eyBmaWxlbmFtZTogc3RyaW5nLCBpZ25vcmVkOiBib29sZWFuIH1bXX0gbGlzdCBvZiBmaWxlcyB0byBvcGVyYXRlIG9uXG4gKi9cbmZ1bmN0aW9uIGxpc3RGaWxlc1VzaW5nRmlsZUVudW1lcmF0b3IoRmlsZUVudW1lcmF0b3IsIHNyYywgZXh0ZW5zaW9ucykge1xuICAvLyBXZSBuZWVkIHRvIGtub3cgd2hldGhlciB0aGlzIGlzIGJlaW5nIHJ1biB3aXRoIGZsYXQgY29uZmlnIGluIG9yZGVyIHRvXG4gIC8vIGRldGVybWluZSBob3cgdG8gcmVwb3J0IGVycm9ycyBpZiBGaWxlRW51bWVyYXRvciB0aHJvd3MgZHVlIHRvIGEgbGFjayBvZiBlc2xpbnRyYy5cblxuICBjb25zdCB7IEVTTElOVF9VU0VfRkxBVF9DT05GSUcgfSA9IHByb2Nlc3MuZW52O1xuXG4gIC8vIFRoaXMgY29uZGl0aW9uIGlzIHN1ZmZpY2llbnQgdG8gdGVzdCBpbiB2OCwgc2luY2UgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIG5lY2Vzc2FyeSB0byB0dXJuIG9uIGZsYXQgY29uZmlnXG4gIGxldCBpc1VzaW5nRmxhdENvbmZpZyA9IEVTTElOVF9VU0VfRkxBVF9DT05GSUcgJiYgcHJvY2Vzcy5lbnYuRVNMSU5UX1VTRV9GTEFUX0NPTkZJRyAhPT0gJ2ZhbHNlJztcblxuICAvLyBJbiB0aGUgY2FzZSBvZiB1c2luZyB2OSwgd2UgY2FuIGNoZWNrIHRoZSBgc2hvdWxkVXNlRmxhdENvbmZpZ2AgZnVuY3Rpb25cbiAgLy8gSWYgdGhpcyBmdW5jdGlvbiBpcyBwcmVzZW50LCB0aGVuIHdlIGFzc3VtZSBpdCdzIHY5XG4gIHRyeSB7XG4gICAgY29uc3QgeyBzaG91bGRVc2VGbGF0Q29uZmlnIH0gPSByZXF1aXJlKCdlc2xpbnQvdXNlLWF0LXlvdXItb3duLXJpc2snKTtcbiAgICBpc1VzaW5nRmxhdENvbmZpZyA9IHNob3VsZFVzZUZsYXRDb25maWcgJiYgRVNMSU5UX1VTRV9GTEFUX0NPTkZJRyAhPT0gJ2ZhbHNlJztcbiAgfSBjYXRjaCAoXykge1xuICAgIC8vIFdlIGRvbid0IHdhbnQgdG8gdGhyb3cgaGVyZSwgc2luY2Ugd2Ugb25seSB3YW50IHRvIHVwZGF0ZSB0aGVcbiAgICAvLyBib29sZWFuIGlmIHRoZSBmdW5jdGlvbiBpcyBhdmFpbGFibGUuXG4gIH1cblxuICBjb25zdCBlbnVtZXJhdG9yID0gbmV3IEZpbGVFbnVtZXJhdG9yKHtcbiAgICBleHRlbnNpb25zLFxuICB9KTtcblxuICB0cnkge1xuICAgIHJldHVybiBBcnJheS5mcm9tKFxuICAgICAgZW51bWVyYXRvci5pdGVyYXRlRmlsZXMoc3JjKSxcbiAgICAgICh7IGZpbGVQYXRoLCBpZ25vcmVkIH0pID0+ICh7IGZpbGVuYW1lOiBmaWxlUGF0aCwgaWdub3JlZCB9KSxcbiAgICApO1xuICB9IGNhdGNoIChlKSB7XG4gICAgLy8gSWYgd2UncmUgdXNpbmcgZmxhdCBjb25maWcsIGFuZCBGaWxlRW51bWVyYXRvciB0aHJvd3MgZHVlIHRvIGEgbGFjayBvZiBlc2xpbnRyYyxcbiAgICAvLyB0aGVuIHdlIHdhbnQgdG8gdGhyb3cgYW4gZXJyb3Igc28gdGhhdCB0aGUgdXNlciBrbm93cyBhYm91dCB0aGlzIHJ1bGUncyByZWxpYW5jZSBvblxuICAgIC8vIHRoZSBsZWdhY3kgY29uZmlnLlxuICAgIGlmIChcbiAgICAgIGlzVXNpbmdGbGF0Q29uZmlnXG4gICAgICAmJiBlLm1lc3NhZ2UuaW5jbHVkZXMoJ05vIEVTTGludCBjb25maWd1cmF0aW9uIGZvdW5kJylcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgXG5EdWUgdG8gdGhlIGV4Y2x1c2lvbiBvZiBjZXJ0YWluIGludGVybmFsIEVTTGludCBBUElzIHdoZW4gdXNpbmcgZmxhdCBjb25maWcsXG50aGUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzIHJ1bGUgcmVxdWlyZXMgYW4gLmVzbGludHJjIGZpbGUgdG8ga25vdyB3aGljaFxuZmlsZXMgdG8gaWdub3JlIChldmVuIHdoZW4gdXNpbmcgZmxhdCBjb25maWcpLlxuVGhlIC5lc2xpbnRyYyBmaWxlIG9ubHkgbmVlZHMgdG8gY29udGFpbiBcImlnbm9yZVBhdHRlcm5zXCIsIG9yIGNhbiBiZSBlbXB0eSBpZlxueW91IGRvIG5vdCB3YW50IHRvIGlnbm9yZSBhbnkgZmlsZXMuXG5cblNlZSBodHRwczovL2dpdGh1Yi5jb20vaW1wb3J0LWpzL2VzbGludC1wbHVnaW4taW1wb3J0L2lzc3Vlcy8zMDc5XG5mb3IgYWRkaXRpb25hbCBjb250ZXh0LlxuYCk7XG4gICAgfVxuICAgIC8vIElmIHRoaXMgaXNuJ3QgdGhlIGNhc2UsIHRoZW4gd2UnbGwganVzdCBsZXQgdGhlIGVycm9yIGJ1YmJsZSB1cFxuICAgIHRocm93IGU7XG4gIH1cbn1cblxuLyoqXG4gKiBBdHRlbXB0IHRvIHJlcXVpcmUgb2xkIHZlcnNpb25zIG9mIHRoZSBmaWxlIGVudW1lcmF0aW9uIGNhcGFiaWxpdHkgZnJvbSB2NiBgZXNsaW50YCBhbmQgZWFybGllciwgYW5kIHVzZVxuICogdGhvc2UgZnVuY3Rpb25zIHRvIHByb3ZpZGUgdGhlIGxpc3Qgb2YgZmlsZXMgdG8gb3BlcmF0ZSBvblxuICogQHBhcmFtIHtzdHJpbmd9IHNyYyBwYXRoIHRvIHRoZSBzcmMgcm9vdFxuICogQHBhcmFtIHtzdHJpbmdbXX0gZXh0ZW5zaW9ucyBsaXN0IG9mIHN1cHBvcnRlZCBleHRlbnNpb25zXG4gKiBAcmV0dXJucyB7c3RyaW5nW119IGxpc3Qgb2YgZmlsZXMgdG8gb3BlcmF0ZSBvblxuICovXG5mdW5jdGlvbiBsaXN0RmlsZXNXaXRoTGVnYWN5RnVuY3Rpb25zKHNyYywgZXh0ZW5zaW9ucykge1xuICB0cnkge1xuICAgIC8vIGVzbGludC9saWIvdXRpbC9nbG9iLXV0aWwgaGFzIGJlZW4gbW92ZWQgdG8gZXNsaW50L2xpYi91dGlsL2dsb2ItdXRpbHMgd2l0aCB2ZXJzaW9uIDUuM1xuICAgIGNvbnN0IHsgbGlzdEZpbGVzVG9Qcm9jZXNzOiBvcmlnaW5hbExpc3RGaWxlc1RvUHJvY2VzcyB9ID0gcmVxdWlyZSgnZXNsaW50L2xpYi91dGlsL2dsb2ItdXRpbHMnKTtcbiAgICAvLyBQcmV2ZW50IHBhc3NpbmcgaW52YWxpZCBvcHRpb25zIChleHRlbnNpb25zIGFycmF5KSB0byBvbGQgdmVyc2lvbnMgb2YgdGhlIGZ1bmN0aW9uLlxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9lc2xpbnQvZXNsaW50L2Jsb2IvdjUuMTYuMC9saWIvdXRpbC9nbG9iLXV0aWxzLmpzI0wxNzgtTDI4MFxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9lc2xpbnQvZXNsaW50L2Jsb2IvdjUuMi4wL2xpYi91dGlsL2dsb2ItdXRpbC5qcyNMMTc0LUwyNjlcblxuICAgIHJldHVybiBvcmlnaW5hbExpc3RGaWxlc1RvUHJvY2VzcyhzcmMsIHtcbiAgICAgIGV4dGVuc2lvbnMsXG4gICAgfSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyBBYnNvcmIgdGhpcyBpZiBpdCdzIE1PRFVMRV9OT1RfRk9VTkRcbiAgICBpZiAoZS5jb2RlICE9PSAnTU9EVUxFX05PVF9GT1VORCcpIHtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuXG4gICAgLy8gTGFzdCBwbGFjZSB0byB0cnkgKHByZSB2NS4zKVxuICAgIGNvbnN0IHtcbiAgICAgIGxpc3RGaWxlc1RvUHJvY2Vzczogb3JpZ2luYWxMaXN0RmlsZXNUb1Byb2Nlc3MsXG4gICAgfSA9IHJlcXVpcmUoJ2VzbGludC9saWIvdXRpbC9nbG9iLXV0aWwnKTtcbiAgICBjb25zdCBwYXR0ZXJucyA9IHNyYy5jb25jYXQoXG4gICAgICBmbGF0TWFwKFxuICAgICAgICBzcmMsXG4gICAgICAgIChwYXR0ZXJuKSA9PiBleHRlbnNpb25zLm1hcCgoZXh0ZW5zaW9uKSA9PiAoL1xcKlxcKnxcXCpcXC4vKS50ZXN0KHBhdHRlcm4pID8gcGF0dGVybiA6IGAke3BhdHRlcm59LyoqLyoke2V4dGVuc2lvbn1gKSxcbiAgICAgICksXG4gICAgKTtcblxuICAgIHJldHVybiBvcmlnaW5hbExpc3RGaWxlc1RvUHJvY2VzcyhwYXR0ZXJucyk7XG4gIH1cbn1cblxuLyoqXG4gKiBHaXZlbiBhIHNyYyBwYXR0ZXJuIGFuZCBsaXN0IG9mIHN1cHBvcnRlZCBleHRlbnNpb25zLCByZXR1cm4gYSBsaXN0IG9mIGZpbGVzIHRvIHByb2Nlc3NcbiAqIHdpdGggdGhpcyBydWxlLlxuICogQHBhcmFtIHtzdHJpbmd9IHNyYyAtIGZpbGUsIGRpcmVjdG9yeSwgb3IgZ2xvYiBwYXR0ZXJuIG9mIGZpbGVzIHRvIGFjdCBvblxuICogQHBhcmFtIHtzdHJpbmdbXX0gZXh0ZW5zaW9ucyAtIGxpc3Qgb2Ygc3VwcG9ydGVkIGZpbGUgZXh0ZW5zaW9uc1xuICogQHJldHVybnMge3N0cmluZ1tdIHwgeyBmaWxlbmFtZTogc3RyaW5nLCBpZ25vcmVkOiBib29sZWFuIH1bXX0gdGhlIGxpc3Qgb2YgZmlsZXMgdGhhdCB0aGlzIHJ1bGUgd2lsbCBldmFsdWF0ZS5cbiAqL1xuZnVuY3Rpb24gbGlzdEZpbGVzVG9Qcm9jZXNzKHNyYywgZXh0ZW5zaW9ucykge1xuICBjb25zdCBGaWxlRW51bWVyYXRvciA9IHJlcXVpcmVGaWxlRW51bWVyYXRvcigpO1xuXG4gIC8vIElmIHdlIGdvdCB0aGUgRmlsZUVudW1lcmF0b3IsIHRoZW4gbGV0J3MgZ28gd2l0aCB0aGF0XG4gIGlmIChGaWxlRW51bWVyYXRvcikge1xuICAgIHJldHVybiBsaXN0RmlsZXNVc2luZ0ZpbGVFbnVtZXJhdG9yKEZpbGVFbnVtZXJhdG9yLCBzcmMsIGV4dGVuc2lvbnMpO1xuICB9XG4gIC8vIElmIG5vdCwgdGhlbiB3ZSBjYW4gdHJ5IGV2ZW4gb2xkZXIgdmVyc2lvbnMgb2YgdGhpcyBjYXBhYmlsaXR5IChsaXN0RmlsZXNUb1Byb2Nlc3MpXG4gIHJldHVybiBsaXN0RmlsZXNXaXRoTGVnYWN5RnVuY3Rpb25zKHNyYywgZXh0ZW5zaW9ucyk7XG59XG5cbmNvbnN0IEVYUE9SVF9ERUZBVUxUX0RFQ0xBUkFUSU9OID0gJ0V4cG9ydERlZmF1bHREZWNsYXJhdGlvbic7XG5jb25zdCBFWFBPUlRfTkFNRURfREVDTEFSQVRJT04gPSAnRXhwb3J0TmFtZWREZWNsYXJhdGlvbic7XG5jb25zdCBFWFBPUlRfQUxMX0RFQ0xBUkFUSU9OID0gJ0V4cG9ydEFsbERlY2xhcmF0aW9uJztcbmNvbnN0IElNUE9SVF9ERUNMQVJBVElPTiA9ICdJbXBvcnREZWNsYXJhdGlvbic7XG5jb25zdCBJTVBPUlRfTkFNRVNQQUNFX1NQRUNJRklFUiA9ICdJbXBvcnROYW1lc3BhY2VTcGVjaWZpZXInO1xuY29uc3QgSU1QT1JUX0RFRkFVTFRfU1BFQ0lGSUVSID0gJ0ltcG9ydERlZmF1bHRTcGVjaWZpZXInO1xuY29uc3QgVkFSSUFCTEVfREVDTEFSQVRJT04gPSAnVmFyaWFibGVEZWNsYXJhdGlvbic7XG5jb25zdCBGVU5DVElPTl9ERUNMQVJBVElPTiA9ICdGdW5jdGlvbkRlY2xhcmF0aW9uJztcbmNvbnN0IENMQVNTX0RFQ0xBUkFUSU9OID0gJ0NsYXNzRGVjbGFyYXRpb24nO1xuY29uc3QgSURFTlRJRklFUiA9ICdJZGVudGlmaWVyJztcbmNvbnN0IE9CSkVDVF9QQVRURVJOID0gJ09iamVjdFBhdHRlcm4nO1xuY29uc3QgQVJSQVlfUEFUVEVSTiA9ICdBcnJheVBhdHRlcm4nO1xuY29uc3QgVFNfSU5URVJGQUNFX0RFQ0xBUkFUSU9OID0gJ1RTSW50ZXJmYWNlRGVjbGFyYXRpb24nO1xuY29uc3QgVFNfVFlQRV9BTElBU19ERUNMQVJBVElPTiA9ICdUU1R5cGVBbGlhc0RlY2xhcmF0aW9uJztcbmNvbnN0IFRTX0VOVU1fREVDTEFSQVRJT04gPSAnVFNFbnVtRGVjbGFyYXRpb24nO1xuY29uc3QgREVGQVVMVCA9ICdkZWZhdWx0JztcblxuZnVuY3Rpb24gZm9yRWFjaERlY2xhcmF0aW9uSWRlbnRpZmllcihkZWNsYXJhdGlvbiwgY2IpIHtcbiAgaWYgKGRlY2xhcmF0aW9uKSB7XG4gICAgY29uc3QgaXNUeXBlRGVjbGFyYXRpb24gPSBkZWNsYXJhdGlvbi50eXBlID09PSBUU19JTlRFUkZBQ0VfREVDTEFSQVRJT05cbiAgICAgIHx8IGRlY2xhcmF0aW9uLnR5cGUgPT09IFRTX1RZUEVfQUxJQVNfREVDTEFSQVRJT05cbiAgICAgIHx8IGRlY2xhcmF0aW9uLnR5cGUgPT09IFRTX0VOVU1fREVDTEFSQVRJT047XG5cbiAgICBpZiAoXG4gICAgICBkZWNsYXJhdGlvbi50eXBlID09PSBGVU5DVElPTl9ERUNMQVJBVElPTlxuICAgICAgfHwgZGVjbGFyYXRpb24udHlwZSA9PT0gQ0xBU1NfREVDTEFSQVRJT05cbiAgICAgIHx8IGlzVHlwZURlY2xhcmF0aW9uXG4gICAgKSB7XG4gICAgICBjYihkZWNsYXJhdGlvbi5pZC5uYW1lLCBpc1R5cGVEZWNsYXJhdGlvbik7XG4gICAgfSBlbHNlIGlmIChkZWNsYXJhdGlvbi50eXBlID09PSBWQVJJQUJMRV9ERUNMQVJBVElPTikge1xuICAgICAgZGVjbGFyYXRpb24uZGVjbGFyYXRpb25zLmZvckVhY2goKHsgaWQgfSkgPT4ge1xuICAgICAgICBpZiAoaWQudHlwZSA9PT0gT0JKRUNUX1BBVFRFUk4pIHtcbiAgICAgICAgICByZWN1cnNpdmVQYXR0ZXJuQ2FwdHVyZShpZCwgKHBhdHRlcm4pID0+IHtcbiAgICAgICAgICAgIGlmIChwYXR0ZXJuLnR5cGUgPT09IElERU5USUZJRVIpIHtcbiAgICAgICAgICAgICAgY2IocGF0dGVybi5uYW1lLCBmYWxzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAoaWQudHlwZSA9PT0gQVJSQVlfUEFUVEVSTikge1xuICAgICAgICAgIGlkLmVsZW1lbnRzLmZvckVhY2goKHsgbmFtZSB9KSA9PiB7XG4gICAgICAgICAgICBjYihuYW1lLCBmYWxzZSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2IoaWQubmFtZSwgZmFsc2UpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBMaXN0IG9mIGltcG9ydHMgcGVyIGZpbGUuXG4gKlxuICogUmVwcmVzZW50ZWQgYnkgYSB0d28tbGV2ZWwgTWFwIHRvIGEgU2V0IG9mIGlkZW50aWZpZXJzLiBUaGUgdXBwZXItbGV2ZWwgTWFwXG4gKiBrZXlzIGFyZSB0aGUgcGF0aHMgdG8gdGhlIG1vZHVsZXMgY29udGFpbmluZyB0aGUgaW1wb3J0cywgd2hpbGUgdGhlXG4gKiBsb3dlci1sZXZlbCBNYXAga2V5cyBhcmUgdGhlIHBhdGhzIHRvIHRoZSBmaWxlcyB3aGljaCBhcmUgYmVpbmcgaW1wb3J0ZWRcbiAqIGZyb20uIExhc3RseSwgdGhlIFNldCBvZiBpZGVudGlmaWVycyBjb250YWlucyBlaXRoZXIgbmFtZXMgYmVpbmcgaW1wb3J0ZWRcbiAqIG9yIGEgc3BlY2lhbCBBU1Qgbm9kZSBuYW1lIGxpc3RlZCBhYm92ZSAoZS5nIEltcG9ydERlZmF1bHRTcGVjaWZpZXIpLlxuICpcbiAqIEZvciBleGFtcGxlLCBpZiB3ZSBoYXZlIGEgZmlsZSBuYW1lZCBmb28uanMgY29udGFpbmluZzpcbiAqXG4gKiAgIGltcG9ydCB7IG8yIH0gZnJvbSAnLi9iYXIuanMnO1xuICpcbiAqIFRoZW4gd2Ugd2lsbCBoYXZlIGEgc3RydWN0dXJlIHRoYXQgbG9va3MgbGlrZTpcbiAqXG4gKiAgIE1hcCB7ICdmb28uanMnID0+IE1hcCB7ICdiYXIuanMnID0+IFNldCB7ICdvMicgfSB9IH1cbiAqXG4gKiBAdHlwZSB7TWFwPHN0cmluZywgTWFwPHN0cmluZywgU2V0PHN0cmluZz4+Pn1cbiAqL1xuY29uc3QgaW1wb3J0TGlzdCA9IG5ldyBNYXAoKTtcblxuLyoqXG4gKiBMaXN0IG9mIGV4cG9ydHMgcGVyIGZpbGUuXG4gKlxuICogUmVwcmVzZW50ZWQgYnkgYSB0d28tbGV2ZWwgTWFwIHRvIGFuIG9iamVjdCBvZiBtZXRhZGF0YS4gVGhlIHVwcGVyLWxldmVsIE1hcFxuICoga2V5cyBhcmUgdGhlIHBhdGhzIHRvIHRoZSBtb2R1bGVzIGNvbnRhaW5pbmcgdGhlIGV4cG9ydHMsIHdoaWxlIHRoZVxuICogbG93ZXItbGV2ZWwgTWFwIGtleXMgYXJlIHRoZSBzcGVjaWZpYyBpZGVudGlmaWVycyBvciBzcGVjaWFsIEFTVCBub2RlIG5hbWVzXG4gKiBiZWluZyBleHBvcnRlZC4gVGhlIGxlYWYtbGV2ZWwgbWV0YWRhdGEgb2JqZWN0IGF0IHRoZSBtb21lbnQgb25seSBjb250YWlucyBhXG4gKiBgd2hlcmVVc2VkYCBwcm9wZXJ0eSwgd2hpY2ggY29udGFpbnMgYSBTZXQgb2YgcGF0aHMgdG8gbW9kdWxlcyB0aGF0IGltcG9ydFxuICogdGhlIG5hbWUuXG4gKlxuICogRm9yIGV4YW1wbGUsIGlmIHdlIGhhdmUgYSBmaWxlIG5hbWVkIGJhci5qcyBjb250YWluaW5nIHRoZSBmb2xsb3dpbmcgZXhwb3J0czpcbiAqXG4gKiAgIGNvbnN0IG8yID0gJ2Jhcic7XG4gKiAgIGV4cG9ydCB7IG8yIH07XG4gKlxuICogQW5kIGEgZmlsZSBuYW1lZCBmb28uanMgY29udGFpbmluZyB0aGUgZm9sbG93aW5nIGltcG9ydDpcbiAqXG4gKiAgIGltcG9ydCB7IG8yIH0gZnJvbSAnLi9iYXIuanMnO1xuICpcbiAqIFRoZW4gd2Ugd2lsbCBoYXZlIGEgc3RydWN0dXJlIHRoYXQgbG9va3MgbGlrZTpcbiAqXG4gKiAgIE1hcCB7ICdiYXIuanMnID0+IE1hcCB7ICdvMicgPT4geyB3aGVyZVVzZWQ6IFNldCB7ICdmb28uanMnIH0gfSB9IH1cbiAqXG4gKiBAdHlwZSB7TWFwPHN0cmluZywgTWFwPHN0cmluZywgb2JqZWN0Pj59XG4gKi9cbmNvbnN0IGV4cG9ydExpc3QgPSBuZXcgTWFwKCk7XG5cbmNvbnN0IHZpc2l0b3JLZXlNYXAgPSBuZXcgTWFwKCk7XG5cbi8qKiBAdHlwZSB7U2V0PHN0cmluZz59ICovXG5jb25zdCBpZ25vcmVkRmlsZXMgPSBuZXcgU2V0KCk7XG5jb25zdCBmaWxlc091dHNpZGVTcmMgPSBuZXcgU2V0KCk7XG5cbmNvbnN0IGlzTm9kZU1vZHVsZSA9IChwYXRoKSA9PiAoL1xcLyhub2RlX21vZHVsZXMpXFwvLykudGVzdChwYXRoKTtcblxuLyoqXG4gKiByZWFkIGFsbCBmaWxlcyBtYXRjaGluZyB0aGUgcGF0dGVybnMgaW4gc3JjIGFuZCBpZ25vcmVFeHBvcnRzXG4gKlxuICogcmV0dXJuIGFsbCBmaWxlcyBtYXRjaGluZyBzcmMgcGF0dGVybiwgd2hpY2ggYXJlIG5vdCBtYXRjaGluZyB0aGUgaWdub3JlRXhwb3J0cyBwYXR0ZXJuXG4gKiBAdHlwZSB7KHNyYzogc3RyaW5nLCBpZ25vcmVFeHBvcnRzOiBzdHJpbmcsIGNvbnRleHQ6IGltcG9ydCgnZXNsaW50JykuUnVsZS5SdWxlQ29udGV4dCkgPT4gU2V0PHN0cmluZz59XG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVGaWxlcyhzcmMsIGlnbm9yZUV4cG9ydHMsIGNvbnRleHQpIHtcbiAgY29uc3QgZXh0ZW5zaW9ucyA9IEFycmF5LmZyb20oZ2V0RmlsZUV4dGVuc2lvbnMoY29udGV4dC5zZXR0aW5ncykpO1xuXG4gIGNvbnN0IHNyY0ZpbGVMaXN0ID0gbGlzdEZpbGVzVG9Qcm9jZXNzKHNyYywgZXh0ZW5zaW9ucyk7XG5cbiAgLy8gcHJlcGFyZSBsaXN0IG9mIGlnbm9yZWQgZmlsZXNcbiAgY29uc3QgaWdub3JlZEZpbGVzTGlzdCA9IGxpc3RGaWxlc1RvUHJvY2VzcyhpZ25vcmVFeHBvcnRzLCBleHRlbnNpb25zKTtcblxuICAvLyBUaGUgbW9kZXJuIGFwaSB3aWxsIHJldHVybiBhIGxpc3Qgb2YgZmlsZSBwYXRocywgcmF0aGVyIHRoYW4gYW4gb2JqZWN0XG4gIGlmIChpZ25vcmVkRmlsZXNMaXN0Lmxlbmd0aCAmJiB0eXBlb2YgaWdub3JlZEZpbGVzTGlzdFswXSA9PT0gJ3N0cmluZycpIHtcbiAgICBpZ25vcmVkRmlsZXNMaXN0LmZvckVhY2goKGZpbGVuYW1lKSA9PiBpZ25vcmVkRmlsZXMuYWRkKGZpbGVuYW1lKSk7XG4gIH0gZWxzZSB7XG4gICAgaWdub3JlZEZpbGVzTGlzdC5mb3JFYWNoKCh7IGZpbGVuYW1lIH0pID0+IGlnbm9yZWRGaWxlcy5hZGQoZmlsZW5hbWUpKTtcbiAgfVxuXG4gIC8vIHByZXBhcmUgbGlzdCBvZiBzb3VyY2UgZmlsZXMsIGRvbid0IGNvbnNpZGVyIGZpbGVzIGZyb20gbm9kZV9tb2R1bGVzXG4gIGNvbnN0IHJlc29sdmVkRmlsZXMgPSBzcmNGaWxlTGlzdC5sZW5ndGggJiYgdHlwZW9mIHNyY0ZpbGVMaXN0WzBdID09PSAnc3RyaW5nJ1xuICAgID8gc3JjRmlsZUxpc3QuZmlsdGVyKChmaWxlUGF0aCkgPT4gIWlzTm9kZU1vZHVsZShmaWxlUGF0aCkpXG4gICAgOiBmbGF0TWFwKHNyY0ZpbGVMaXN0LCAoeyBmaWxlbmFtZSB9KSA9PiBpc05vZGVNb2R1bGUoZmlsZW5hbWUpID8gW10gOiBmaWxlbmFtZSk7XG5cbiAgcmV0dXJuIG5ldyBTZXQocmVzb2x2ZWRGaWxlcyk7XG59XG5cbi8qKlxuICogcGFyc2UgYWxsIHNvdXJjZSBmaWxlcyBhbmQgYnVpbGQgdXAgMiBtYXBzIGNvbnRhaW5pbmcgdGhlIGV4aXN0aW5nIGltcG9ydHMgYW5kIGV4cG9ydHNcbiAqL1xuY29uc3QgcHJlcGFyZUltcG9ydHNBbmRFeHBvcnRzID0gKHNyY0ZpbGVzLCBjb250ZXh0KSA9PiB7XG4gIGNvbnN0IGV4cG9ydEFsbCA9IG5ldyBNYXAoKTtcbiAgc3JjRmlsZXMuZm9yRWFjaCgoZmlsZSkgPT4ge1xuICAgIGNvbnN0IGV4cG9ydHMgPSBuZXcgTWFwKCk7XG4gICAgY29uc3QgaW1wb3J0cyA9IG5ldyBNYXAoKTtcbiAgICBjb25zdCBjdXJyZW50RXhwb3J0cyA9IEV4cG9ydE1hcEJ1aWxkZXIuZ2V0KGZpbGUsIGNvbnRleHQpO1xuICAgIGlmIChjdXJyZW50RXhwb3J0cykge1xuICAgICAgY29uc3Qge1xuICAgICAgICBkZXBlbmRlbmNpZXMsXG4gICAgICAgIHJlZXhwb3J0cyxcbiAgICAgICAgaW1wb3J0czogbG9jYWxJbXBvcnRMaXN0LFxuICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgIHZpc2l0b3JLZXlzLFxuICAgICAgfSA9IGN1cnJlbnRFeHBvcnRzO1xuXG4gICAgICB2aXNpdG9yS2V5TWFwLnNldChmaWxlLCB2aXNpdG9yS2V5cyk7XG4gICAgICAvLyBkZXBlbmRlbmNpZXMgPT09IGV4cG9ydCAqIGZyb21cbiAgICAgIGNvbnN0IGN1cnJlbnRFeHBvcnRBbGwgPSBuZXcgU2V0KCk7XG4gICAgICBkZXBlbmRlbmNpZXMuZm9yRWFjaCgoZ2V0RGVwZW5kZW5jeSkgPT4ge1xuICAgICAgICBjb25zdCBkZXBlbmRlbmN5ID0gZ2V0RGVwZW5kZW5jeSgpO1xuICAgICAgICBpZiAoZGVwZW5kZW5jeSA9PT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGN1cnJlbnRFeHBvcnRBbGwuYWRkKGRlcGVuZGVuY3kucGF0aCk7XG4gICAgICB9KTtcbiAgICAgIGV4cG9ydEFsbC5zZXQoZmlsZSwgY3VycmVudEV4cG9ydEFsbCk7XG5cbiAgICAgIHJlZXhwb3J0cy5mb3JFYWNoKCh2YWx1ZSwga2V5KSA9PiB7XG4gICAgICAgIGlmIChrZXkgPT09IERFRkFVTFQpIHtcbiAgICAgICAgICBleHBvcnRzLnNldChJTVBPUlRfREVGQVVMVF9TUEVDSUZJRVIsIHsgd2hlcmVVc2VkOiBuZXcgU2V0KCkgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZXhwb3J0cy5zZXQoa2V5LCB7IHdoZXJlVXNlZDogbmV3IFNldCgpIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlZXhwb3J0ID0gdmFsdWUuZ2V0SW1wb3J0KCk7XG4gICAgICAgIGlmICghcmVleHBvcnQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGxvY2FsSW1wb3J0ID0gaW1wb3J0cy5nZXQocmVleHBvcnQucGF0aCk7XG4gICAgICAgIGxldCBjdXJyZW50VmFsdWU7XG4gICAgICAgIGlmICh2YWx1ZS5sb2NhbCA9PT0gREVGQVVMVCkge1xuICAgICAgICAgIGN1cnJlbnRWYWx1ZSA9IElNUE9SVF9ERUZBVUxUX1NQRUNJRklFUjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjdXJyZW50VmFsdWUgPSB2YWx1ZS5sb2NhbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGxvY2FsSW1wb3J0ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIGxvY2FsSW1wb3J0ID0gbmV3IFNldChbLi4ubG9jYWxJbXBvcnQsIGN1cnJlbnRWYWx1ZV0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxvY2FsSW1wb3J0ID0gbmV3IFNldChbY3VycmVudFZhbHVlXSk7XG4gICAgICAgIH1cbiAgICAgICAgaW1wb3J0cy5zZXQocmVleHBvcnQucGF0aCwgbG9jYWxJbXBvcnQpO1xuICAgICAgfSk7XG5cbiAgICAgIGxvY2FsSW1wb3J0TGlzdC5mb3JFYWNoKCh2YWx1ZSwga2V5KSA9PiB7XG4gICAgICAgIGlmIChpc05vZGVNb2R1bGUoa2V5KSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBsb2NhbEltcG9ydCA9IGltcG9ydHMuZ2V0KGtleSkgfHwgbmV3IFNldCgpO1xuICAgICAgICB2YWx1ZS5kZWNsYXJhdGlvbnMuZm9yRWFjaCgoeyBpbXBvcnRlZFNwZWNpZmllcnMgfSkgPT4ge1xuICAgICAgICAgIGltcG9ydGVkU3BlY2lmaWVycy5mb3JFYWNoKChzcGVjaWZpZXIpID0+IHtcbiAgICAgICAgICAgIGxvY2FsSW1wb3J0LmFkZChzcGVjaWZpZXIpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgaW1wb3J0cy5zZXQoa2V5LCBsb2NhbEltcG9ydCk7XG4gICAgICB9KTtcbiAgICAgIGltcG9ydExpc3Quc2V0KGZpbGUsIGltcG9ydHMpO1xuXG4gICAgICAvLyBidWlsZCB1cCBleHBvcnQgbGlzdCBvbmx5LCBpZiBmaWxlIGlzIG5vdCBpZ25vcmVkXG4gICAgICBpZiAoaWdub3JlZEZpbGVzLmhhcyhmaWxlKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBuYW1lc3BhY2UuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xuICAgICAgICBpZiAoa2V5ID09PSBERUZBVUxUKSB7XG4gICAgICAgICAgZXhwb3J0cy5zZXQoSU1QT1JUX0RFRkFVTFRfU1BFQ0lGSUVSLCB7IHdoZXJlVXNlZDogbmV3IFNldCgpIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGV4cG9ydHMuc2V0KGtleSwgeyB3aGVyZVVzZWQ6IG5ldyBTZXQoKSB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIGV4cG9ydHMuc2V0KEVYUE9SVF9BTExfREVDTEFSQVRJT04sIHsgd2hlcmVVc2VkOiBuZXcgU2V0KCkgfSk7XG4gICAgZXhwb3J0cy5zZXQoSU1QT1JUX05BTUVTUEFDRV9TUEVDSUZJRVIsIHsgd2hlcmVVc2VkOiBuZXcgU2V0KCkgfSk7XG4gICAgZXhwb3J0TGlzdC5zZXQoZmlsZSwgZXhwb3J0cyk7XG4gIH0pO1xuICBleHBvcnRBbGwuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xuICAgIHZhbHVlLmZvckVhY2goKHZhbCkgPT4ge1xuICAgICAgY29uc3QgY3VycmVudEV4cG9ydHMgPSBleHBvcnRMaXN0LmdldCh2YWwpO1xuICAgICAgaWYgKGN1cnJlbnRFeHBvcnRzKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRFeHBvcnQgPSBjdXJyZW50RXhwb3J0cy5nZXQoRVhQT1JUX0FMTF9ERUNMQVJBVElPTik7XG4gICAgICAgIGN1cnJlbnRFeHBvcnQud2hlcmVVc2VkLmFkZChrZXkpO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbn07XG5cbi8qKlxuICogdHJhdmVyc2UgdGhyb3VnaCBhbGwgaW1wb3J0cyBhbmQgYWRkIHRoZSByZXNwZWN0aXZlIHBhdGggdG8gdGhlIHdoZXJlVXNlZC1saXN0XG4gKiBvZiB0aGUgY29ycmVzcG9uZGluZyBleHBvcnRcbiAqL1xuY29uc3QgZGV0ZXJtaW5lVXNhZ2UgPSAoKSA9PiB7XG4gIGltcG9ydExpc3QuZm9yRWFjaCgobGlzdFZhbHVlLCBsaXN0S2V5KSA9PiB7XG4gICAgbGlzdFZhbHVlLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgIGNvbnN0IGV4cG9ydHMgPSBleHBvcnRMaXN0LmdldChrZXkpO1xuICAgICAgaWYgKHR5cGVvZiBleHBvcnRzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICB2YWx1ZS5mb3JFYWNoKChjdXJyZW50SW1wb3J0KSA9PiB7XG4gICAgICAgICAgbGV0IHNwZWNpZmllcjtcbiAgICAgICAgICBpZiAoY3VycmVudEltcG9ydCA9PT0gSU1QT1JUX05BTUVTUEFDRV9TUEVDSUZJRVIpIHtcbiAgICAgICAgICAgIHNwZWNpZmllciA9IElNUE9SVF9OQU1FU1BBQ0VfU1BFQ0lGSUVSO1xuICAgICAgICAgIH0gZWxzZSBpZiAoY3VycmVudEltcG9ydCA9PT0gSU1QT1JUX0RFRkFVTFRfU1BFQ0lGSUVSKSB7XG4gICAgICAgICAgICBzcGVjaWZpZXIgPSBJTVBPUlRfREVGQVVMVF9TUEVDSUZJRVI7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNwZWNpZmllciA9IGN1cnJlbnRJbXBvcnQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0eXBlb2Ygc3BlY2lmaWVyICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgY29uc3QgZXhwb3J0U3RhdGVtZW50ID0gZXhwb3J0cy5nZXQoc3BlY2lmaWVyKTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZXhwb3J0U3RhdGVtZW50ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICBjb25zdCB7IHdoZXJlVXNlZCB9ID0gZXhwb3J0U3RhdGVtZW50O1xuICAgICAgICAgICAgICB3aGVyZVVzZWQuYWRkKGxpc3RLZXkpO1xuICAgICAgICAgICAgICBleHBvcnRzLnNldChzcGVjaWZpZXIsIHsgd2hlcmVVc2VkIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xufTtcblxuY29uc3QgZ2V0U3JjID0gKHNyYykgPT4ge1xuICBpZiAoc3JjKSB7XG4gICAgcmV0dXJuIHNyYztcbiAgfVxuICByZXR1cm4gW3Byb2Nlc3MuY3dkKCldO1xufTtcblxuLyoqXG4gKiBwcmVwYXJlIHRoZSBsaXN0cyBvZiBleGlzdGluZyBpbXBvcnRzIGFuZCBleHBvcnRzIC0gc2hvdWxkIG9ubHkgYmUgZXhlY3V0ZWQgb25jZSBhdFxuICogdGhlIHN0YXJ0IG9mIGEgbmV3IGVzbGludCBydW5cbiAqL1xuLyoqIEB0eXBlIHtTZXQ8c3RyaW5nPn0gKi9cbmxldCBzcmNGaWxlcztcbmxldCBsYXN0UHJlcGFyZUtleTtcbmNvbnN0IGRvUHJlcGFyYXRpb24gPSAoc3JjLCBpZ25vcmVFeHBvcnRzLCBjb250ZXh0KSA9PiB7XG4gIGNvbnN0IHByZXBhcmVLZXkgPSBKU09OLnN0cmluZ2lmeSh7XG4gICAgc3JjOiAoc3JjIHx8IFtdKS5zb3J0KCksXG4gICAgaWdub3JlRXhwb3J0czogKGlnbm9yZUV4cG9ydHMgfHwgW10pLnNvcnQoKSxcbiAgICBleHRlbnNpb25zOiBBcnJheS5mcm9tKGdldEZpbGVFeHRlbnNpb25zKGNvbnRleHQuc2V0dGluZ3MpKS5zb3J0KCksXG4gIH0pO1xuICBpZiAocHJlcGFyZUtleSA9PT0gbGFzdFByZXBhcmVLZXkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpbXBvcnRMaXN0LmNsZWFyKCk7XG4gIGV4cG9ydExpc3QuY2xlYXIoKTtcbiAgaWdub3JlZEZpbGVzLmNsZWFyKCk7XG4gIGZpbGVzT3V0c2lkZVNyYy5jbGVhcigpO1xuXG4gIHNyY0ZpbGVzID0gcmVzb2x2ZUZpbGVzKGdldFNyYyhzcmMpLCBpZ25vcmVFeHBvcnRzLCBjb250ZXh0KTtcbiAgcHJlcGFyZUltcG9ydHNBbmRFeHBvcnRzKHNyY0ZpbGVzLCBjb250ZXh0KTtcbiAgZGV0ZXJtaW5lVXNhZ2UoKTtcbiAgbGFzdFByZXBhcmVLZXkgPSBwcmVwYXJlS2V5O1xufTtcblxuY29uc3QgbmV3TmFtZXNwYWNlSW1wb3J0RXhpc3RzID0gKHNwZWNpZmllcnMpID0+IHNwZWNpZmllcnMuc29tZSgoeyB0eXBlIH0pID0+IHR5cGUgPT09IElNUE9SVF9OQU1FU1BBQ0VfU1BFQ0lGSUVSKTtcblxuY29uc3QgbmV3RGVmYXVsdEltcG9ydEV4aXN0cyA9IChzcGVjaWZpZXJzKSA9PiBzcGVjaWZpZXJzLnNvbWUoKHsgdHlwZSB9KSA9PiB0eXBlID09PSBJTVBPUlRfREVGQVVMVF9TUEVDSUZJRVIpO1xuXG5jb25zdCBmaWxlSXNJblBrZyA9IChmaWxlKSA9PiB7XG4gIGNvbnN0IHsgcGF0aCwgcGtnIH0gPSByZWFkUGtnVXAoeyBjd2Q6IGZpbGUgfSk7XG4gIGNvbnN0IGJhc2VQYXRoID0gZGlybmFtZShwYXRoKTtcblxuICBjb25zdCBjaGVja1BrZ0ZpZWxkU3RyaW5nID0gKHBrZ0ZpZWxkKSA9PiB7XG4gICAgaWYgKGpvaW4oYmFzZVBhdGgsIHBrZ0ZpZWxkKSA9PT0gZmlsZSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGNoZWNrUGtnRmllbGRPYmplY3QgPSAocGtnRmllbGQpID0+IHtcbiAgICBjb25zdCBwa2dGaWVsZEZpbGVzID0gZmxhdE1hcCh2YWx1ZXMocGtnRmllbGQpLCAodmFsdWUpID0+IHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nID8gW10gOiBqb2luKGJhc2VQYXRoLCB2YWx1ZSkpO1xuXG4gICAgaWYgKGluY2x1ZGVzKHBrZ0ZpZWxkRmlsZXMsIGZpbGUpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgY2hlY2tQa2dGaWVsZCA9IChwa2dGaWVsZCkgPT4ge1xuICAgIGlmICh0eXBlb2YgcGtnRmllbGQgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gY2hlY2tQa2dGaWVsZFN0cmluZyhwa2dGaWVsZCk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBwa2dGaWVsZCA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHJldHVybiBjaGVja1BrZ0ZpZWxkT2JqZWN0KHBrZ0ZpZWxkKTtcbiAgICB9XG4gIH07XG5cbiAgaWYgKHBrZy5wcml2YXRlID09PSB0cnVlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKHBrZy5iaW4pIHtcbiAgICBpZiAoY2hlY2tQa2dGaWVsZChwa2cuYmluKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgaWYgKHBrZy5icm93c2VyKSB7XG4gICAgaWYgKGNoZWNrUGtnRmllbGQocGtnLmJyb3dzZXIpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBpZiAocGtnLm1haW4pIHtcbiAgICBpZiAoY2hlY2tQa2dGaWVsZFN0cmluZyhwa2cubWFpbikpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBtZXRhOiB7XG4gICAgdHlwZTogJ3N1Z2dlc3Rpb24nLFxuICAgIGRvY3M6IHtcbiAgICAgIGNhdGVnb3J5OiAnSGVscGZ1bCB3YXJuaW5ncycsXG4gICAgICBkZXNjcmlwdGlvbjogJ0ZvcmJpZCBtb2R1bGVzIHdpdGhvdXQgZXhwb3J0cywgb3IgZXhwb3J0cyB3aXRob3V0IG1hdGNoaW5nIGltcG9ydCBpbiBhbm90aGVyIG1vZHVsZS4nLFxuICAgICAgdXJsOiBkb2NzVXJsKCduby11bnVzZWQtbW9kdWxlcycpLFxuICAgIH0sXG4gICAgc2NoZW1hOiBbe1xuICAgICAgcHJvcGVydGllczoge1xuICAgICAgICBzcmM6IHtcbiAgICAgICAgICBkZXNjcmlwdGlvbjogJ2ZpbGVzL3BhdGhzIHRvIGJlIGFuYWx5emVkIChvbmx5IGZvciB1bnVzZWQgZXhwb3J0cyknLFxuICAgICAgICAgIHR5cGU6ICdhcnJheScsXG4gICAgICAgICAgdW5pcXVlSXRlbXM6IHRydWUsXG4gICAgICAgICAgaXRlbXM6IHtcbiAgICAgICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICAgICAgbWluTGVuZ3RoOiAxLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIGlnbm9yZUV4cG9ydHM6IHtcbiAgICAgICAgICBkZXNjcmlwdGlvbjogJ2ZpbGVzL3BhdGhzIGZvciB3aGljaCB1bnVzZWQgZXhwb3J0cyB3aWxsIG5vdCBiZSByZXBvcnRlZCAoZS5nIG1vZHVsZSBlbnRyeSBwb2ludHMpJyxcbiAgICAgICAgICB0eXBlOiAnYXJyYXknLFxuICAgICAgICAgIHVuaXF1ZUl0ZW1zOiB0cnVlLFxuICAgICAgICAgIGl0ZW1zOiB7XG4gICAgICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgICAgIG1pbkxlbmd0aDogMSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBtaXNzaW5nRXhwb3J0czoge1xuICAgICAgICAgIGRlc2NyaXB0aW9uOiAncmVwb3J0IG1vZHVsZXMgd2l0aG91dCBhbnkgZXhwb3J0cycsXG4gICAgICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgICB9LFxuICAgICAgICB1bnVzZWRFeHBvcnRzOiB7XG4gICAgICAgICAgZGVzY3JpcHRpb246ICdyZXBvcnQgZXhwb3J0cyB3aXRob3V0IGFueSB1c2FnZScsXG4gICAgICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgICB9LFxuICAgICAgICBpZ25vcmVVbnVzZWRUeXBlRXhwb3J0czoge1xuICAgICAgICAgIGRlc2NyaXB0aW9uOiAnaWdub3JlIHR5cGUgZXhwb3J0cyB3aXRob3V0IGFueSB1c2FnZScsXG4gICAgICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGFueU9mOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICB1bnVzZWRFeHBvcnRzOiB7IGVudW06IFt0cnVlXSB9LFxuICAgICAgICAgICAgc3JjOiB7XG4gICAgICAgICAgICAgIG1pbkl0ZW1zOiAxLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHJlcXVpcmVkOiBbJ3VudXNlZEV4cG9ydHMnXSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIG1pc3NpbmdFeHBvcnRzOiB7IGVudW06IFt0cnVlXSB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgcmVxdWlyZWQ6IFsnbWlzc2luZ0V4cG9ydHMnXSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfV0sXG4gIH0sXG5cbiAgY3JlYXRlKGNvbnRleHQpIHtcbiAgICBjb25zdCB7XG4gICAgICBzcmMsXG4gICAgICBpZ25vcmVFeHBvcnRzID0gW10sXG4gICAgICBtaXNzaW5nRXhwb3J0cyxcbiAgICAgIHVudXNlZEV4cG9ydHMsXG4gICAgICBpZ25vcmVVbnVzZWRUeXBlRXhwb3J0cyxcbiAgICB9ID0gY29udGV4dC5vcHRpb25zWzBdIHx8IHt9O1xuXG4gICAgaWYgKHVudXNlZEV4cG9ydHMpIHtcbiAgICAgIGRvUHJlcGFyYXRpb24oc3JjLCBpZ25vcmVFeHBvcnRzLCBjb250ZXh0KTtcbiAgICB9XG5cbiAgICBjb25zdCBmaWxlID0gZ2V0UGh5c2ljYWxGaWxlbmFtZShjb250ZXh0KTtcblxuICAgIGNvbnN0IGNoZWNrRXhwb3J0UHJlc2VuY2UgPSAobm9kZSkgPT4ge1xuICAgICAgaWYgKCFtaXNzaW5nRXhwb3J0cykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChpZ25vcmVkRmlsZXMuaGFzKGZpbGUpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZXhwb3J0Q291bnQgPSBleHBvcnRMaXN0LmdldChmaWxlKTtcbiAgICAgIGNvbnN0IGV4cG9ydEFsbCA9IGV4cG9ydENvdW50LmdldChFWFBPUlRfQUxMX0RFQ0xBUkFUSU9OKTtcbiAgICAgIGNvbnN0IG5hbWVzcGFjZUltcG9ydHMgPSBleHBvcnRDb3VudC5nZXQoSU1QT1JUX05BTUVTUEFDRV9TUEVDSUZJRVIpO1xuXG4gICAgICBleHBvcnRDb3VudC5kZWxldGUoRVhQT1JUX0FMTF9ERUNMQVJBVElPTik7XG4gICAgICBleHBvcnRDb3VudC5kZWxldGUoSU1QT1JUX05BTUVTUEFDRV9TUEVDSUZJRVIpO1xuICAgICAgaWYgKGV4cG9ydENvdW50LnNpemUgPCAxKSB7XG4gICAgICAgIC8vIG5vZGUuYm9keVswXSA9PT0gJ3VuZGVmaW5lZCcgb25seSBoYXBwZW5zLCBpZiBldmVyeXRoaW5nIGlzIGNvbW1lbnRlZCBvdXQgaW4gdGhlIGZpbGVcbiAgICAgICAgLy8gYmVpbmcgbGludGVkXG4gICAgICAgIGNvbnRleHQucmVwb3J0KG5vZGUuYm9keVswXSA/IG5vZGUuYm9keVswXSA6IG5vZGUsICdObyBleHBvcnRzIGZvdW5kJyk7XG4gICAgICB9XG4gICAgICBleHBvcnRDb3VudC5zZXQoRVhQT1JUX0FMTF9ERUNMQVJBVElPTiwgZXhwb3J0QWxsKTtcbiAgICAgIGV4cG9ydENvdW50LnNldChJTVBPUlRfTkFNRVNQQUNFX1NQRUNJRklFUiwgbmFtZXNwYWNlSW1wb3J0cyk7XG4gICAgfTtcblxuICAgIGNvbnN0IGNoZWNrVXNhZ2UgPSAobm9kZSwgZXhwb3J0ZWRWYWx1ZSwgaXNUeXBlRXhwb3J0KSA9PiB7XG4gICAgICBpZiAoIXVudXNlZEV4cG9ydHMpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNUeXBlRXhwb3J0ICYmIGlnbm9yZVVudXNlZFR5cGVFeHBvcnRzKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGlnbm9yZWRGaWxlcy5oYXMoZmlsZSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoZmlsZUlzSW5Qa2coZmlsZSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoZmlsZXNPdXRzaWRlU3JjLmhhcyhmaWxlKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIG1ha2Ugc3VyZSBmaWxlIHRvIGJlIGxpbnRlZCBpcyBpbmNsdWRlZCBpbiBzb3VyY2UgZmlsZXNcbiAgICAgIGlmICghc3JjRmlsZXMuaGFzKGZpbGUpKSB7XG4gICAgICAgIHNyY0ZpbGVzID0gcmVzb2x2ZUZpbGVzKGdldFNyYyhzcmMpLCBpZ25vcmVFeHBvcnRzLCBjb250ZXh0KTtcbiAgICAgICAgaWYgKCFzcmNGaWxlcy5oYXMoZmlsZSkpIHtcbiAgICAgICAgICBmaWxlc091dHNpZGVTcmMuYWRkKGZpbGUpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBleHBvcnRzID0gZXhwb3J0TGlzdC5nZXQoZmlsZSk7XG5cbiAgICAgIGlmICghZXhwb3J0cykge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBmaWxlIFxcYCR7ZmlsZX1cXGAgaGFzIG5vIGV4cG9ydHMuIFBsZWFzZSB1cGRhdGUgdG8gdGhlIGxhdGVzdCwgYW5kIGlmIGl0IHN0aWxsIGhhcHBlbnMsIHJlcG9ydCB0aGlzIG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9pbXBvcnQtanMvZXNsaW50LXBsdWdpbi1pbXBvcnQvaXNzdWVzLzI4NjYhYCk7XG4gICAgICB9XG5cbiAgICAgIC8vIHNwZWNpYWwgY2FzZTogZXhwb3J0ICogZnJvbVxuICAgICAgY29uc3QgZXhwb3J0QWxsID0gZXhwb3J0cy5nZXQoRVhQT1JUX0FMTF9ERUNMQVJBVElPTik7XG4gICAgICBpZiAodHlwZW9mIGV4cG9ydEFsbCAhPT0gJ3VuZGVmaW5lZCcgJiYgZXhwb3J0ZWRWYWx1ZSAhPT0gSU1QT1JUX0RFRkFVTFRfU1BFQ0lGSUVSKSB7XG4gICAgICAgIGlmIChleHBvcnRBbGwud2hlcmVVc2VkLnNpemUgPiAwKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIHNwZWNpYWwgY2FzZTogbmFtZXNwYWNlIGltcG9ydFxuICAgICAgY29uc3QgbmFtZXNwYWNlSW1wb3J0cyA9IGV4cG9ydHMuZ2V0KElNUE9SVF9OQU1FU1BBQ0VfU1BFQ0lGSUVSKTtcbiAgICAgIGlmICh0eXBlb2YgbmFtZXNwYWNlSW1wb3J0cyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgaWYgKG5hbWVzcGFjZUltcG9ydHMud2hlcmVVc2VkLnNpemUgPiAwKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIGV4cG9ydHNMaXN0IHdpbGwgYWx3YXlzIG1hcCBhbnkgaW1wb3J0ZWQgdmFsdWUgb2YgJ2RlZmF1bHQnIHRvICdJbXBvcnREZWZhdWx0U3BlY2lmaWVyJ1xuICAgICAgY29uc3QgZXhwb3J0c0tleSA9IGV4cG9ydGVkVmFsdWUgPT09IERFRkFVTFQgPyBJTVBPUlRfREVGQVVMVF9TUEVDSUZJRVIgOiBleHBvcnRlZFZhbHVlO1xuXG4gICAgICBjb25zdCBleHBvcnRTdGF0ZW1lbnQgPSBleHBvcnRzLmdldChleHBvcnRzS2V5KTtcblxuICAgICAgY29uc3QgdmFsdWUgPSBleHBvcnRzS2V5ID09PSBJTVBPUlRfREVGQVVMVF9TUEVDSUZJRVIgPyBERUZBVUxUIDogZXhwb3J0c0tleTtcblxuICAgICAgaWYgKHR5cGVvZiBleHBvcnRTdGF0ZW1lbnQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGlmIChleHBvcnRTdGF0ZW1lbnQud2hlcmVVc2VkLnNpemUgPCAxKSB7XG4gICAgICAgICAgY29udGV4dC5yZXBvcnQoXG4gICAgICAgICAgICBub2RlLFxuICAgICAgICAgICAgYGV4cG9ydGVkIGRlY2xhcmF0aW9uICcke3ZhbHVlfScgbm90IHVzZWQgd2l0aGluIG90aGVyIG1vZHVsZXNgLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnRleHQucmVwb3J0KFxuICAgICAgICAgIG5vZGUsXG4gICAgICAgICAgYGV4cG9ydGVkIGRlY2xhcmF0aW9uICcke3ZhbHVlfScgbm90IHVzZWQgd2l0aGluIG90aGVyIG1vZHVsZXNgLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBvbmx5IHVzZWZ1bCBmb3IgdG9vbHMgbGlrZSB2c2NvZGUtZXNsaW50XG4gICAgICpcbiAgICAgKiB1cGRhdGUgbGlzdHMgb2YgZXhpc3RpbmcgZXhwb3J0cyBkdXJpbmcgcnVudGltZVxuICAgICAqL1xuICAgIGNvbnN0IHVwZGF0ZUV4cG9ydFVzYWdlID0gKG5vZGUpID0+IHtcbiAgICAgIGlmIChpZ25vcmVkRmlsZXMuaGFzKGZpbGUpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgbGV0IGV4cG9ydHMgPSBleHBvcnRMaXN0LmdldChmaWxlKTtcblxuICAgICAgLy8gbmV3IG1vZHVsZSBoYXMgYmVlbiBjcmVhdGVkIGR1cmluZyBydW50aW1lXG4gICAgICAvLyBpbmNsdWRlIGl0IGluIGZ1cnRoZXIgcHJvY2Vzc2luZ1xuICAgICAgaWYgKHR5cGVvZiBleHBvcnRzID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICBleHBvcnRzID0gbmV3IE1hcCgpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBuZXdFeHBvcnRzID0gbmV3IE1hcCgpO1xuICAgICAgY29uc3QgbmV3RXhwb3J0SWRlbnRpZmllcnMgPSBuZXcgU2V0KCk7XG5cbiAgICAgIG5vZGUuYm9keS5mb3JFYWNoKCh7IHR5cGUsIGRlY2xhcmF0aW9uLCBzcGVjaWZpZXJzIH0pID0+IHtcbiAgICAgICAgaWYgKHR5cGUgPT09IEVYUE9SVF9ERUZBVUxUX0RFQ0xBUkFUSU9OKSB7XG4gICAgICAgICAgbmV3RXhwb3J0SWRlbnRpZmllcnMuYWRkKElNUE9SVF9ERUZBVUxUX1NQRUNJRklFUik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGUgPT09IEVYUE9SVF9OQU1FRF9ERUNMQVJBVElPTikge1xuICAgICAgICAgIGlmIChzcGVjaWZpZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHNwZWNpZmllcnMuZm9yRWFjaCgoc3BlY2lmaWVyKSA9PiB7XG4gICAgICAgICAgICAgIGlmIChzcGVjaWZpZXIuZXhwb3J0ZWQpIHtcbiAgICAgICAgICAgICAgICBuZXdFeHBvcnRJZGVudGlmaWVycy5hZGQoc3BlY2lmaWVyLmV4cG9ydGVkLm5hbWUgfHwgc3BlY2lmaWVyLmV4cG9ydGVkLnZhbHVlKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGZvckVhY2hEZWNsYXJhdGlvbklkZW50aWZpZXIoZGVjbGFyYXRpb24sIChuYW1lKSA9PiB7XG4gICAgICAgICAgICBuZXdFeHBvcnRJZGVudGlmaWVycy5hZGQobmFtZSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBvbGQgZXhwb3J0cyBleGlzdCB3aXRoaW4gbGlzdCBvZiBuZXcgZXhwb3J0cyBpZGVudGlmaWVyczogYWRkIHRvIG1hcCBvZiBuZXcgZXhwb3J0c1xuICAgICAgZXhwb3J0cy5mb3JFYWNoKCh2YWx1ZSwga2V5KSA9PiB7XG4gICAgICAgIGlmIChuZXdFeHBvcnRJZGVudGlmaWVycy5oYXMoa2V5KSkge1xuICAgICAgICAgIG5ld0V4cG9ydHMuc2V0KGtleSwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLy8gbmV3IGV4cG9ydCBpZGVudGlmaWVycyBhZGRlZDogYWRkIHRvIG1hcCBvZiBuZXcgZXhwb3J0c1xuICAgICAgbmV3RXhwb3J0SWRlbnRpZmllcnMuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgIGlmICghZXhwb3J0cy5oYXMoa2V5KSkge1xuICAgICAgICAgIG5ld0V4cG9ydHMuc2V0KGtleSwgeyB3aGVyZVVzZWQ6IG5ldyBTZXQoKSB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIHByZXNlcnZlIGluZm9ybWF0aW9uIGFib3V0IG5hbWVzcGFjZSBpbXBvcnRzXG4gICAgICBjb25zdCBleHBvcnRBbGwgPSBleHBvcnRzLmdldChFWFBPUlRfQUxMX0RFQ0xBUkFUSU9OKTtcbiAgICAgIGxldCBuYW1lc3BhY2VJbXBvcnRzID0gZXhwb3J0cy5nZXQoSU1QT1JUX05BTUVTUEFDRV9TUEVDSUZJRVIpO1xuXG4gICAgICBpZiAodHlwZW9mIG5hbWVzcGFjZUltcG9ydHMgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIG5hbWVzcGFjZUltcG9ydHMgPSB7IHdoZXJlVXNlZDogbmV3IFNldCgpIH07XG4gICAgICB9XG5cbiAgICAgIG5ld0V4cG9ydHMuc2V0KEVYUE9SVF9BTExfREVDTEFSQVRJT04sIGV4cG9ydEFsbCk7XG4gICAgICBuZXdFeHBvcnRzLnNldChJTVBPUlRfTkFNRVNQQUNFX1NQRUNJRklFUiwgbmFtZXNwYWNlSW1wb3J0cyk7XG4gICAgICBleHBvcnRMaXN0LnNldChmaWxlLCBuZXdFeHBvcnRzKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogb25seSB1c2VmdWwgZm9yIHRvb2xzIGxpa2UgdnNjb2RlLWVzbGludFxuICAgICAqXG4gICAgICogdXBkYXRlIGxpc3RzIG9mIGV4aXN0aW5nIGltcG9ydHMgZHVyaW5nIHJ1bnRpbWVcbiAgICAgKi9cbiAgICBjb25zdCB1cGRhdGVJbXBvcnRVc2FnZSA9IChub2RlKSA9PiB7XG4gICAgICBpZiAoIXVudXNlZEV4cG9ydHMpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBsZXQgb2xkSW1wb3J0UGF0aHMgPSBpbXBvcnRMaXN0LmdldChmaWxlKTtcbiAgICAgIGlmICh0eXBlb2Ygb2xkSW1wb3J0UGF0aHMgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIG9sZEltcG9ydFBhdGhzID0gbmV3IE1hcCgpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBvbGROYW1lc3BhY2VJbXBvcnRzID0gbmV3IFNldCgpO1xuICAgICAgY29uc3QgbmV3TmFtZXNwYWNlSW1wb3J0cyA9IG5ldyBTZXQoKTtcblxuICAgICAgY29uc3Qgb2xkRXhwb3J0QWxsID0gbmV3IFNldCgpO1xuICAgICAgY29uc3QgbmV3RXhwb3J0QWxsID0gbmV3IFNldCgpO1xuXG4gICAgICBjb25zdCBvbGREZWZhdWx0SW1wb3J0cyA9IG5ldyBTZXQoKTtcbiAgICAgIGNvbnN0IG5ld0RlZmF1bHRJbXBvcnRzID0gbmV3IFNldCgpO1xuXG4gICAgICBjb25zdCBvbGRJbXBvcnRzID0gbmV3IE1hcCgpO1xuICAgICAgY29uc3QgbmV3SW1wb3J0cyA9IG5ldyBNYXAoKTtcbiAgICAgIG9sZEltcG9ydFBhdGhzLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgICAgaWYgKHZhbHVlLmhhcyhFWFBPUlRfQUxMX0RFQ0xBUkFUSU9OKSkge1xuICAgICAgICAgIG9sZEV4cG9ydEFsbC5hZGQoa2V5KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsdWUuaGFzKElNUE9SVF9OQU1FU1BBQ0VfU1BFQ0lGSUVSKSkge1xuICAgICAgICAgIG9sZE5hbWVzcGFjZUltcG9ydHMuYWRkKGtleSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbHVlLmhhcyhJTVBPUlRfREVGQVVMVF9TUEVDSUZJRVIpKSB7XG4gICAgICAgICAgb2xkRGVmYXVsdEltcG9ydHMuYWRkKGtleSk7XG4gICAgICAgIH1cbiAgICAgICAgdmFsdWUuZm9yRWFjaCgodmFsKSA9PiB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgdmFsICE9PSBJTVBPUlRfTkFNRVNQQUNFX1NQRUNJRklFUlxuICAgICAgICAgICAgJiYgdmFsICE9PSBJTVBPUlRfREVGQVVMVF9TUEVDSUZJRVJcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIG9sZEltcG9ydHMuc2V0KHZhbCwga2V5KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIGZ1bmN0aW9uIHByb2Nlc3NEeW5hbWljSW1wb3J0KHNvdXJjZSkge1xuICAgICAgICBpZiAoc291cmNlLnR5cGUgIT09ICdMaXRlcmFsJykge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHAgPSByZXNvbHZlKHNvdXJjZS52YWx1ZSwgY29udGV4dCk7XG4gICAgICAgIGlmIChwID09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBuZXdOYW1lc3BhY2VJbXBvcnRzLmFkZChwKTtcbiAgICAgIH1cblxuICAgICAgdmlzaXQobm9kZSwgdmlzaXRvcktleU1hcC5nZXQoZmlsZSksIHtcbiAgICAgICAgSW1wb3J0RXhwcmVzc2lvbihjaGlsZCkge1xuICAgICAgICAgIHByb2Nlc3NEeW5hbWljSW1wb3J0KGNoaWxkLnNvdXJjZSk7XG4gICAgICAgIH0sXG4gICAgICAgIENhbGxFeHByZXNzaW9uKGNoaWxkKSB7XG4gICAgICAgICAgaWYgKGNoaWxkLmNhbGxlZS50eXBlID09PSAnSW1wb3J0Jykge1xuICAgICAgICAgICAgcHJvY2Vzc0R5bmFtaWNJbXBvcnQoY2hpbGQuYXJndW1lbnRzWzBdKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgbm9kZS5ib2R5LmZvckVhY2goKGFzdE5vZGUpID0+IHtcbiAgICAgICAgbGV0IHJlc29sdmVkUGF0aDtcblxuICAgICAgICAvLyBzdXBwb3J0IGZvciBleHBvcnQgeyB2YWx1ZSB9IGZyb20gJ21vZHVsZSdcbiAgICAgICAgaWYgKGFzdE5vZGUudHlwZSA9PT0gRVhQT1JUX05BTUVEX0RFQ0xBUkFUSU9OKSB7XG4gICAgICAgICAgaWYgKGFzdE5vZGUuc291cmNlKSB7XG4gICAgICAgICAgICByZXNvbHZlZFBhdGggPSByZXNvbHZlKGFzdE5vZGUuc291cmNlLnJhdy5yZXBsYWNlKC8oJ3xcIikvZywgJycpLCBjb250ZXh0KTtcbiAgICAgICAgICAgIGFzdE5vZGUuc3BlY2lmaWVycy5mb3JFYWNoKChzcGVjaWZpZXIpID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgbmFtZSA9IHNwZWNpZmllci5sb2NhbC5uYW1lIHx8IHNwZWNpZmllci5sb2NhbC52YWx1ZTtcbiAgICAgICAgICAgICAgaWYgKG5hbWUgPT09IERFRkFVTFQpIHtcbiAgICAgICAgICAgICAgICBuZXdEZWZhdWx0SW1wb3J0cy5hZGQocmVzb2x2ZWRQYXRoKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBuZXdJbXBvcnRzLnNldChuYW1lLCByZXNvbHZlZFBhdGgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYXN0Tm9kZS50eXBlID09PSBFWFBPUlRfQUxMX0RFQ0xBUkFUSU9OKSB7XG4gICAgICAgICAgcmVzb2x2ZWRQYXRoID0gcmVzb2x2ZShhc3ROb2RlLnNvdXJjZS5yYXcucmVwbGFjZSgvKCd8XCIpL2csICcnKSwgY29udGV4dCk7XG4gICAgICAgICAgbmV3RXhwb3J0QWxsLmFkZChyZXNvbHZlZFBhdGgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGFzdE5vZGUudHlwZSA9PT0gSU1QT1JUX0RFQ0xBUkFUSU9OKSB7XG4gICAgICAgICAgcmVzb2x2ZWRQYXRoID0gcmVzb2x2ZShhc3ROb2RlLnNvdXJjZS5yYXcucmVwbGFjZSgvKCd8XCIpL2csICcnKSwgY29udGV4dCk7XG4gICAgICAgICAgaWYgKCFyZXNvbHZlZFBhdGgpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoaXNOb2RlTW9kdWxlKHJlc29sdmVkUGF0aCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAobmV3TmFtZXNwYWNlSW1wb3J0RXhpc3RzKGFzdE5vZGUuc3BlY2lmaWVycykpIHtcbiAgICAgICAgICAgIG5ld05hbWVzcGFjZUltcG9ydHMuYWRkKHJlc29sdmVkUGF0aCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKG5ld0RlZmF1bHRJbXBvcnRFeGlzdHMoYXN0Tm9kZS5zcGVjaWZpZXJzKSkge1xuICAgICAgICAgICAgbmV3RGVmYXVsdEltcG9ydHMuYWRkKHJlc29sdmVkUGF0aCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYXN0Tm9kZS5zcGVjaWZpZXJzXG4gICAgICAgICAgICAuZmlsdGVyKChzcGVjaWZpZXIpID0+IHNwZWNpZmllci50eXBlICE9PSBJTVBPUlRfREVGQVVMVF9TUEVDSUZJRVIgJiYgc3BlY2lmaWVyLnR5cGUgIT09IElNUE9SVF9OQU1FU1BBQ0VfU1BFQ0lGSUVSKVxuICAgICAgICAgICAgLmZvckVhY2goKHNwZWNpZmllcikgPT4ge1xuICAgICAgICAgICAgICBuZXdJbXBvcnRzLnNldChzcGVjaWZpZXIuaW1wb3J0ZWQubmFtZSB8fCBzcGVjaWZpZXIuaW1wb3J0ZWQudmFsdWUsIHJlc29sdmVkUGF0aCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIG5ld0V4cG9ydEFsbC5mb3JFYWNoKCh2YWx1ZSkgPT4ge1xuICAgICAgICBpZiAoIW9sZEV4cG9ydEFsbC5oYXModmFsdWUpKSB7XG4gICAgICAgICAgbGV0IGltcG9ydHMgPSBvbGRJbXBvcnRQYXRocy5nZXQodmFsdWUpO1xuICAgICAgICAgIGlmICh0eXBlb2YgaW1wb3J0cyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGltcG9ydHMgPSBuZXcgU2V0KCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGltcG9ydHMuYWRkKEVYUE9SVF9BTExfREVDTEFSQVRJT04pO1xuICAgICAgICAgIG9sZEltcG9ydFBhdGhzLnNldCh2YWx1ZSwgaW1wb3J0cyk7XG5cbiAgICAgICAgICBsZXQgZXhwb3J0cyA9IGV4cG9ydExpc3QuZ2V0KHZhbHVlKTtcbiAgICAgICAgICBsZXQgY3VycmVudEV4cG9ydDtcbiAgICAgICAgICBpZiAodHlwZW9mIGV4cG9ydHMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBjdXJyZW50RXhwb3J0ID0gZXhwb3J0cy5nZXQoRVhQT1JUX0FMTF9ERUNMQVJBVElPTik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGV4cG9ydHMgPSBuZXcgTWFwKCk7XG4gICAgICAgICAgICBleHBvcnRMaXN0LnNldCh2YWx1ZSwgZXhwb3J0cyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHR5cGVvZiBjdXJyZW50RXhwb3J0ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgY3VycmVudEV4cG9ydC53aGVyZVVzZWQuYWRkKGZpbGUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCB3aGVyZVVzZWQgPSBuZXcgU2V0KCk7XG4gICAgICAgICAgICB3aGVyZVVzZWQuYWRkKGZpbGUpO1xuICAgICAgICAgICAgZXhwb3J0cy5zZXQoRVhQT1JUX0FMTF9ERUNMQVJBVElPTiwgeyB3aGVyZVVzZWQgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgb2xkRXhwb3J0QWxsLmZvckVhY2goKHZhbHVlKSA9PiB7XG4gICAgICAgIGlmICghbmV3RXhwb3J0QWxsLmhhcyh2YWx1ZSkpIHtcbiAgICAgICAgICBjb25zdCBpbXBvcnRzID0gb2xkSW1wb3J0UGF0aHMuZ2V0KHZhbHVlKTtcbiAgICAgICAgICBpbXBvcnRzLmRlbGV0ZShFWFBPUlRfQUxMX0RFQ0xBUkFUSU9OKTtcblxuICAgICAgICAgIGNvbnN0IGV4cG9ydHMgPSBleHBvcnRMaXN0LmdldCh2YWx1ZSk7XG4gICAgICAgICAgaWYgKHR5cGVvZiBleHBvcnRzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgY29uc3QgY3VycmVudEV4cG9ydCA9IGV4cG9ydHMuZ2V0KEVYUE9SVF9BTExfREVDTEFSQVRJT04pO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBjdXJyZW50RXhwb3J0ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICBjdXJyZW50RXhwb3J0LndoZXJlVXNlZC5kZWxldGUoZmlsZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgbmV3RGVmYXVsdEltcG9ydHMuZm9yRWFjaCgodmFsdWUpID0+IHtcbiAgICAgICAgaWYgKCFvbGREZWZhdWx0SW1wb3J0cy5oYXModmFsdWUpKSB7XG4gICAgICAgICAgbGV0IGltcG9ydHMgPSBvbGRJbXBvcnRQYXRocy5nZXQodmFsdWUpO1xuICAgICAgICAgIGlmICh0eXBlb2YgaW1wb3J0cyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGltcG9ydHMgPSBuZXcgU2V0KCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGltcG9ydHMuYWRkKElNUE9SVF9ERUZBVUxUX1NQRUNJRklFUik7XG4gICAgICAgICAgb2xkSW1wb3J0UGF0aHMuc2V0KHZhbHVlLCBpbXBvcnRzKTtcblxuICAgICAgICAgIGxldCBleHBvcnRzID0gZXhwb3J0TGlzdC5nZXQodmFsdWUpO1xuICAgICAgICAgIGxldCBjdXJyZW50RXhwb3J0O1xuICAgICAgICAgIGlmICh0eXBlb2YgZXhwb3J0cyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGN1cnJlbnRFeHBvcnQgPSBleHBvcnRzLmdldChJTVBPUlRfREVGQVVMVF9TUEVDSUZJRVIpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBleHBvcnRzID0gbmV3IE1hcCgpO1xuICAgICAgICAgICAgZXhwb3J0TGlzdC5zZXQodmFsdWUsIGV4cG9ydHMpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh0eXBlb2YgY3VycmVudEV4cG9ydCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGN1cnJlbnRFeHBvcnQud2hlcmVVc2VkLmFkZChmaWxlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qgd2hlcmVVc2VkID0gbmV3IFNldCgpO1xuICAgICAgICAgICAgd2hlcmVVc2VkLmFkZChmaWxlKTtcbiAgICAgICAgICAgIGV4cG9ydHMuc2V0KElNUE9SVF9ERUZBVUxUX1NQRUNJRklFUiwgeyB3aGVyZVVzZWQgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgb2xkRGVmYXVsdEltcG9ydHMuZm9yRWFjaCgodmFsdWUpID0+IHtcbiAgICAgICAgaWYgKCFuZXdEZWZhdWx0SW1wb3J0cy5oYXModmFsdWUpKSB7XG4gICAgICAgICAgY29uc3QgaW1wb3J0cyA9IG9sZEltcG9ydFBhdGhzLmdldCh2YWx1ZSk7XG4gICAgICAgICAgaW1wb3J0cy5kZWxldGUoSU1QT1JUX0RFRkFVTFRfU1BFQ0lGSUVSKTtcblxuICAgICAgICAgIGNvbnN0IGV4cG9ydHMgPSBleHBvcnRMaXN0LmdldCh2YWx1ZSk7XG4gICAgICAgICAgaWYgKHR5cGVvZiBleHBvcnRzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgY29uc3QgY3VycmVudEV4cG9ydCA9IGV4cG9ydHMuZ2V0KElNUE9SVF9ERUZBVUxUX1NQRUNJRklFUik7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGN1cnJlbnRFeHBvcnQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgIGN1cnJlbnRFeHBvcnQud2hlcmVVc2VkLmRlbGV0ZShmaWxlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBuZXdOYW1lc3BhY2VJbXBvcnRzLmZvckVhY2goKHZhbHVlKSA9PiB7XG4gICAgICAgIGlmICghb2xkTmFtZXNwYWNlSW1wb3J0cy5oYXModmFsdWUpKSB7XG4gICAgICAgICAgbGV0IGltcG9ydHMgPSBvbGRJbXBvcnRQYXRocy5nZXQodmFsdWUpO1xuICAgICAgICAgIGlmICh0eXBlb2YgaW1wb3J0cyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGltcG9ydHMgPSBuZXcgU2V0KCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGltcG9ydHMuYWRkKElNUE9SVF9OQU1FU1BBQ0VfU1BFQ0lGSUVSKTtcbiAgICAgICAgICBvbGRJbXBvcnRQYXRocy5zZXQodmFsdWUsIGltcG9ydHMpO1xuXG4gICAgICAgICAgbGV0IGV4cG9ydHMgPSBleHBvcnRMaXN0LmdldCh2YWx1ZSk7XG4gICAgICAgICAgbGV0IGN1cnJlbnRFeHBvcnQ7XG4gICAgICAgICAgaWYgKHR5cGVvZiBleHBvcnRzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgY3VycmVudEV4cG9ydCA9IGV4cG9ydHMuZ2V0KElNUE9SVF9OQU1FU1BBQ0VfU1BFQ0lGSUVSKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZXhwb3J0cyA9IG5ldyBNYXAoKTtcbiAgICAgICAgICAgIGV4cG9ydExpc3Quc2V0KHZhbHVlLCBleHBvcnRzKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodHlwZW9mIGN1cnJlbnRFeHBvcnQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBjdXJyZW50RXhwb3J0LndoZXJlVXNlZC5hZGQoZmlsZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHdoZXJlVXNlZCA9IG5ldyBTZXQoKTtcbiAgICAgICAgICAgIHdoZXJlVXNlZC5hZGQoZmlsZSk7XG4gICAgICAgICAgICBleHBvcnRzLnNldChJTVBPUlRfTkFNRVNQQUNFX1NQRUNJRklFUiwgeyB3aGVyZVVzZWQgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgb2xkTmFtZXNwYWNlSW1wb3J0cy5mb3JFYWNoKCh2YWx1ZSkgPT4ge1xuICAgICAgICBpZiAoIW5ld05hbWVzcGFjZUltcG9ydHMuaGFzKHZhbHVlKSkge1xuICAgICAgICAgIGNvbnN0IGltcG9ydHMgPSBvbGRJbXBvcnRQYXRocy5nZXQodmFsdWUpO1xuICAgICAgICAgIGltcG9ydHMuZGVsZXRlKElNUE9SVF9OQU1FU1BBQ0VfU1BFQ0lGSUVSKTtcblxuICAgICAgICAgIGNvbnN0IGV4cG9ydHMgPSBleHBvcnRMaXN0LmdldCh2YWx1ZSk7XG4gICAgICAgICAgaWYgKHR5cGVvZiBleHBvcnRzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgY29uc3QgY3VycmVudEV4cG9ydCA9IGV4cG9ydHMuZ2V0KElNUE9SVF9OQU1FU1BBQ0VfU1BFQ0lGSUVSKTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgY3VycmVudEV4cG9ydCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgY3VycmVudEV4cG9ydC53aGVyZVVzZWQuZGVsZXRlKGZpbGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIG5ld0ltcG9ydHMuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xuICAgICAgICBpZiAoIW9sZEltcG9ydHMuaGFzKGtleSkpIHtcbiAgICAgICAgICBsZXQgaW1wb3J0cyA9IG9sZEltcG9ydFBhdGhzLmdldCh2YWx1ZSk7XG4gICAgICAgICAgaWYgKHR5cGVvZiBpbXBvcnRzID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgaW1wb3J0cyA9IG5ldyBTZXQoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaW1wb3J0cy5hZGQoa2V5KTtcbiAgICAgICAgICBvbGRJbXBvcnRQYXRocy5zZXQodmFsdWUsIGltcG9ydHMpO1xuXG4gICAgICAgICAgbGV0IGV4cG9ydHMgPSBleHBvcnRMaXN0LmdldCh2YWx1ZSk7XG4gICAgICAgICAgbGV0IGN1cnJlbnRFeHBvcnQ7XG4gICAgICAgICAgaWYgKHR5cGVvZiBleHBvcnRzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgY3VycmVudEV4cG9ydCA9IGV4cG9ydHMuZ2V0KGtleSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGV4cG9ydHMgPSBuZXcgTWFwKCk7XG4gICAgICAgICAgICBleHBvcnRMaXN0LnNldCh2YWx1ZSwgZXhwb3J0cyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHR5cGVvZiBjdXJyZW50RXhwb3J0ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgY3VycmVudEV4cG9ydC53aGVyZVVzZWQuYWRkKGZpbGUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCB3aGVyZVVzZWQgPSBuZXcgU2V0KCk7XG4gICAgICAgICAgICB3aGVyZVVzZWQuYWRkKGZpbGUpO1xuICAgICAgICAgICAgZXhwb3J0cy5zZXQoa2V5LCB7IHdoZXJlVXNlZCB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBvbGRJbXBvcnRzLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgICAgaWYgKCFuZXdJbXBvcnRzLmhhcyhrZXkpKSB7XG4gICAgICAgICAgY29uc3QgaW1wb3J0cyA9IG9sZEltcG9ydFBhdGhzLmdldCh2YWx1ZSk7XG4gICAgICAgICAgaW1wb3J0cy5kZWxldGUoa2V5KTtcblxuICAgICAgICAgIGNvbnN0IGV4cG9ydHMgPSBleHBvcnRMaXN0LmdldCh2YWx1ZSk7XG4gICAgICAgICAgaWYgKHR5cGVvZiBleHBvcnRzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgY29uc3QgY3VycmVudEV4cG9ydCA9IGV4cG9ydHMuZ2V0KGtleSk7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGN1cnJlbnRFeHBvcnQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgIGN1cnJlbnRFeHBvcnQud2hlcmVVc2VkLmRlbGV0ZShmaWxlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICByZXR1cm4ge1xuICAgICAgJ1Byb2dyYW06ZXhpdCcobm9kZSkge1xuICAgICAgICB1cGRhdGVFeHBvcnRVc2FnZShub2RlKTtcbiAgICAgICAgdXBkYXRlSW1wb3J0VXNhZ2Uobm9kZSk7XG4gICAgICAgIGNoZWNrRXhwb3J0UHJlc2VuY2Uobm9kZSk7XG4gICAgICB9LFxuICAgICAgRXhwb3J0RGVmYXVsdERlY2xhcmF0aW9uKG5vZGUpIHtcbiAgICAgICAgY2hlY2tVc2FnZShub2RlLCBJTVBPUlRfREVGQVVMVF9TUEVDSUZJRVIsIGZhbHNlKTtcbiAgICAgIH0sXG4gICAgICBFeHBvcnROYW1lZERlY2xhcmF0aW9uKG5vZGUpIHtcbiAgICAgICAgbm9kZS5zcGVjaWZpZXJzLmZvckVhY2goKHNwZWNpZmllcikgPT4ge1xuICAgICAgICAgIGNoZWNrVXNhZ2Uoc3BlY2lmaWVyLCBzcGVjaWZpZXIuZXhwb3J0ZWQubmFtZSB8fCBzcGVjaWZpZXIuZXhwb3J0ZWQudmFsdWUsIGZhbHNlKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGZvckVhY2hEZWNsYXJhdGlvbklkZW50aWZpZXIobm9kZS5kZWNsYXJhdGlvbiwgKG5hbWUsIGlzVHlwZUV4cG9ydCkgPT4ge1xuICAgICAgICAgIGNoZWNrVXNhZ2Uobm9kZSwgbmFtZSwgaXNUeXBlRXhwb3J0KTtcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgIH07XG4gIH0sXG59O1xuIl19
index.d.ts +33 lines
--- +++ @@ -0,0 +1,33 @@+import { ESLint, Linter, Rule } from 'eslint';++declare const plugin: ESLint.Plugin & {+  meta: {+    name: string;+    version: string;+  };+  configs: {+    'recommended': Linter.LegacyConfig;+    'errors': Linter.LegacyConfig;+    'warnings': Linter.LegacyConfig;+    'stage-0': Linter.LegacyConfig;+    'react': Linter.LegacyConfig;+    'react-native': Linter.LegacyConfig;+    'electron': Linter.LegacyConfig;+    'typescript': Linter.LegacyConfig;+  };+  flatConfigs: {+    'recommended': Linter.FlatConfig;+    'errors': Linter.FlatConfig;+    'warnings': Linter.FlatConfig;+    'stage-0': Linter.FlatConfig;+    'react': Linter.FlatConfig;+    'react-native': Linter.FlatConfig;+    'electron': Linter.FlatConfig;+    'typescript': Linter.FlatConfig;+  };+  rules: {+    [key: string]: Rule.RuleModule;+  };+};++export = plugin;
lib/index.js +6 lines
--- +++ @@ -47,2 +47,3 @@   'no-empty-named-blocks': require('./rules/no-empty-named-blocks'),+  'enforce-node-protocol-usage': require('./rules/enforce-node-protocol-usage'), @@ -97,6 +98,6 @@   // useful stuff for folks using various environments-  react: require('../config/flat/react'),-  'react-native': configs['react-native'],-  electron: configs.electron,-  typescript: configs.typescript };-//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9pbmRleC5qcyJdLCJuYW1lcyI6WyJydWxlcyIsInJlcXVpcmUiLCJuYW1lZCIsIm5hbWVzcGFjZSIsImV4dGVuc2lvbnMiLCJmaXJzdCIsIm9yZGVyIiwidW5hbWJpZ3VvdXMiLCJjb25maWdzIiwicmVjb21tZW5kZWQiLCJlcnJvcnMiLCJ3YXJuaW5ncyIsInJlYWN0IiwiZWxlY3Ryb24iLCJ0eXBlc2NyaXB0IiwiaW1wb3J0UGx1Z2luIiwibWV0YSIsIm5hbWUiLCJ2ZXJzaW9uIiwiY3JlYXRlRmxhdENvbmZpZyIsImJhc2VDb25maWciLCJjb25maWdOYW1lIiwicGx1Z2lucyIsImZsYXRDb25maWdzIl0sIm1hcHBpbmdzIjoiNklBQUE7O0FBRU8sSUFBTUEsd0JBQVE7QUFDbkIsbUJBQWlCQyxRQUFRLHVCQUFSLENBREU7QUFFbkJDLFNBQU9ELFFBQVEsZUFBUixDQUZZO0FBR25CLGFBQVNBLFFBQVEsaUJBQVIsQ0FIVTtBQUluQkUsYUFBV0YsUUFBUSxtQkFBUixDQUpRO0FBS25CLGtCQUFnQkEsUUFBUSxzQkFBUixDQUxHO0FBTW5CLFlBQVFBLFFBQVEsZ0JBQVIsQ0FOVztBQU9uQix3QkFBc0JBLFFBQVEsNEJBQVIsQ0FQSDtBQVFuQkcsY0FBWUgsUUFBUSxvQkFBUixDQVJPO0FBU25CLHlCQUF1QkEsUUFBUSw2QkFBUixDQVRKO0FBVW5CLHlCQUF1QkEsUUFBUSw2QkFBUixDQVZKO0FBV25CLG1CQUFpQkEsUUFBUSx1QkFBUixDQVhFO0FBWW5CLDBCQUF3QkEsUUFBUSw4QkFBUixDQVpMO0FBYW5CLGdDQUE4QkEsUUFBUSxvQ0FBUixDQWJYO0FBY25CLHFDQUFtQ0EsUUFBUSx5Q0FBUixDQWRoQjs7QUFnQm5CLG9CQUFrQkEsUUFBUSx3QkFBUixDQWhCQztBQWlCbkIsY0FBWUEsUUFBUSxrQkFBUixDQWpCTztBQWtCbkIsc0JBQW9CQSxRQUFRLDBCQUFSLENBbEJEO0FBbUJuQix5QkFBdUJBLFFBQVEsNkJBQVIsQ0FuQko7QUFvQm5CLGdDQUE4QkEsUUFBUSxvQ0FBUixDQXBCWDtBQXFCbkIsaUNBQStCQSxRQUFRLHFDQUFSLENBckJaO0FBc0JuQix1QkFBcUJBLFFBQVEsMkJBQVIsQ0F0QkY7O0FBd0JuQixpQkFBZUEsUUFBUSxxQkFBUixDQXhCSTtBQXlCbkIsWUFBVUEsUUFBUSxnQkFBUixDQXpCUztBQTBCbkIsbUJBQWlCQSxRQUFRLHVCQUFSLENBMUJFO0FBMkJuQkksU0FBT0osUUFBUSxlQUFSLENBM0JZO0FBNEJuQixzQkFBb0JBLFFBQVEsMEJBQVIsQ0E1QkQ7QUE2Qm5CLGdDQUE4QkEsUUFBUSxvQ0FBUixDQTdCWDtBQThCbkIsc0JBQW9CQSxRQUFRLDBCQUFSLENBOUJEO0FBK0JuQix1QkFBcUJBLFFBQVEsMkJBQVIsQ0EvQkY7QUFnQ25CLDhCQUE0QkEsUUFBUSxrQ0FBUixDQWhDVDtBQWlDbkJLLFNBQU9MLFFBQVEsZUFBUixDQWpDWTtBQWtDbkIsMEJBQXdCQSxRQUFRLDhCQUFSLENBbENMO0FBbUNuQiwyQkFBeUJBLFFBQVEsK0JBQVIsQ0FuQ047QUFvQ25CLHVCQUFxQkEsUUFBUSwyQkFBUixDQXBDRjtBQXFDbkIscUJBQW1CQSxRQUFRLHlCQUFSLENBckNBO0FBc0NuQix3QkFBc0JBLFFBQVEsNEJBQVIsQ0F0Q0g7QUF1Q25CTSxlQUFhTixRQUFRLHFCQUFSLENBdkNNO0FBd0NuQiwwQkFBd0JBLFFBQVEsOEJBQVIsQ0F4Q0w7QUF5Q25CLDhCQUE0QkEsUUFBUSxrQ0FBUixDQXpDVDtBQTBDbkIsOEJBQTRCQSxRQUFRLGtDQUFSLENBMUNUO0FBMkNuQiw4QkFBNEJBLFFBQVEsa0NBQVIsQ0EzQ1Q7QUE0Q25CLDJCQUF5QkEsUUFBUSwrQkFBUixDQTVDTjs7QUE4Q25CO0FBQ0Esa0JBQWdCQSxRQUFRLHNCQUFSLENBL0NHOztBQWlEbkI7QUFDQSxtQkFBaUJBLFFBQVEsdUJBQVIsQ0FsREU7O0FBb0RuQjtBQUNBLG1CQUFpQkEsUUFBUSx1QkFBUixDQXJERSxFQUFkOzs7QUF3REEsSUFBTU8sNEJBQVU7QUFDckJDLGVBQWFSLFFBQVEsdUJBQVIsQ0FEUTs7QUFHckJTLFVBQVFULFFBQVEsa0JBQVIsQ0FIYTtBQUlyQlUsWUFBVVYsUUFBUSxvQkFBUixDQUpXOztBQU1yQjtBQUNBLGFBQVdBLFFBQVEsbUJBQVIsQ0FQVTs7QUFTckI7QUFDQVcsU0FBT1gsUUFBUSxpQkFBUixDQVZjO0FBV3JCLGtCQUFnQkEsUUFBUSx3QkFBUixDQVhLO0FBWXJCWSxZQUFVWixRQUFRLG9CQUFSLENBWlc7QUFhckJhLGNBQVliLFFBQVEsc0JBQVIsQ0FiUyxFQUFoQjs7O0FBZ0JQO0FBQ0EsSUFBTWMsZUFBZTtBQUNuQkMsUUFBTSxFQUFFQyxtQkFBRixFQUFRQyx5QkFBUixFQURhO0FBRW5CbEIsY0FGbUIsRUFBckI7OztBQUtBO0FBQ0EsSUFBTW1CLG1CQUFtQixTQUFuQkEsZ0JBQW1CLENBQUNDLFVBQUQsRUFBYUMsVUFBYjtBQUNwQkQsWUFEb0I7QUFFdkJILDZCQUFnQkksVUFBaEIsQ0FGdUI7QUFHdkJDLGFBQVMsRUFBRSxVQUFRUCxZQUFWLEVBSGMsS0FBekI7OztBQU1PLElBQU1RLG9DQUFjO0FBQ3pCZCxlQUFhVTtBQUNYbEIsVUFBUSw0QkFBUixDQURXO0FBRVgsZUFGVyxDQURZOzs7QUFNekJTLFVBQVFTLGlCQUFpQmxCLFFBQVEsdUJBQVIsQ0FBakIsRUFBbUQsUUFBbkQsQ0FOaUI7QUFPekJVLFlBQVVRLGlCQUFpQmxCLFFBQVEseUJBQVIsQ0FBakIsRUFBcUQsVUFBckQsQ0FQZTs7QUFTekI7QUFDQVcsU0FBT1gsUUFBUSxzQkFBUixDQVZrQjtBQVd6QixrQkFBZ0JPLFFBQVEsY0FBUixDQVhTO0FBWXpCSyxZQUFVTCxRQUFRSyxRQVpPO0FBYXpCQyxjQUFZTixRQUFRTSxVQWJLLEVBQXBCIiwiZmlsZSI6ImluZGV4LmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgbmFtZSwgdmVyc2lvbiB9IGZyb20gJy4uL3BhY2thZ2UuanNvbic7XG5cbmV4cG9ydCBjb25zdCBydWxlcyA9IHtcbiAgJ25vLXVucmVzb2x2ZWQnOiByZXF1aXJlKCcuL3J1bGVzL25vLXVucmVzb2x2ZWQnKSxcbiAgbmFtZWQ6IHJlcXVpcmUoJy4vcnVsZXMvbmFtZWQnKSxcbiAgZGVmYXVsdDogcmVxdWlyZSgnLi9ydWxlcy9kZWZhdWx0JyksXG4gIG5hbWVzcGFjZTogcmVxdWlyZSgnLi9ydWxlcy9uYW1lc3BhY2UnKSxcbiAgJ25vLW5hbWVzcGFjZSc6IHJlcXVpcmUoJy4vcnVsZXMvbm8tbmFtZXNwYWNlJyksXG4gIGV4cG9ydDogcmVxdWlyZSgnLi9ydWxlcy9leHBvcnQnKSxcbiAgJ25vLW11dGFibGUtZXhwb3J0cyc6IHJlcXVpcmUoJy4vcnVsZXMvbm8tbXV0YWJsZS1leHBvcnRzJyksXG4gIGV4dGVuc2lvbnM6IHJlcXVpcmUoJy4vcnVsZXMvZXh0ZW5zaW9ucycpLFxuICAnbm8tcmVzdHJpY3RlZC1wYXRocyc6IHJlcXVpcmUoJy4vcnVsZXMvbm8tcmVzdHJpY3RlZC1wYXRocycpLFxuICAnbm8taW50ZXJuYWwtbW9kdWxlcyc6IHJlcXVpcmUoJy4vcnVsZXMvbm8taW50ZXJuYWwtbW9kdWxlcycpLFxuICAnZ3JvdXAtZXhwb3J0cyc6IHJlcXVpcmUoJy4vcnVsZXMvZ3JvdXAtZXhwb3J0cycpLFxuICAnbm8tcmVsYXRpdmUtcGFja2FnZXMnOiByZXF1aXJlKCcuL3J1bGVzL25vLXJlbGF0aXZlLXBhY2thZ2VzJyksXG4gICduby1yZWxhdGl2ZS1wYXJlbnQtaW1wb3J0cyc6IHJlcXVpcmUoJy4vcnVsZXMvbm8tcmVsYXRpdmUtcGFyZW50LWltcG9ydHMnKSxcbiAgJ2NvbnNpc3RlbnQtdHlwZS1zcGVjaWZpZXItc3R5bGUnOiByZXF1aXJlKCcuL3J1bGVzL2NvbnNpc3RlbnQtdHlwZS1zcGVjaWZpZXItc3R5bGUnKSxcblxuICAnbm8tc2VsZi1pbXBvcnQnOiByZXF1aXJlKCcuL3J1bGVzL25vLXNlbGYtaW1wb3J0JyksXG4gICduby1jeWNsZSc6IHJlcXVpcmUoJy4vcnVsZXMvbm8tY3ljbGUnKSxcbiAgJ25vLW5hbWVkLWRlZmF1bHQnOiByZXF1aXJlKCcuL3J1bGVzL25vLW5hbWVkLWRlZmF1bHQnKSxcbiAgJ25vLW5hbWVkLWFzLWRlZmF1bHQnOiByZXF1aXJlKCcuL3J1bGVzL25vLW5hbWVkLWFzLWRlZmF1bHQnKSxcbiAgJ25vLW5hbWVkLWFzLWRlZmF1bHQtbWVtYmVyJzogcmVxdWlyZSgnLi9ydWxlcy9uby1uYW1lZC1hcy1kZWZhdWx0LW1lbWJlcicpLFxuICAnbm8tYW5vbnltb3VzLWRlZmF1bHQtZXhwb3J0JzogcmVxdWlyZSgnLi9ydWxlcy9uby1hbm9ueW1vdXMtZGVmYXVsdC1leHBvcnQnKSxcbiAgJ25vLXVudXNlZC1tb2R1bGVzJzogcmVxdWlyZSgnLi9ydWxlcy9uby11bnVzZWQtbW9kdWxlcycpLFxuXG4gICduby1jb21tb25qcyc6IHJlcXVpcmUoJy4vcnVsZXMvbm8tY29tbW9uanMnKSxcbiAgJ25vLWFtZCc6IHJlcXVpcmUoJy4vcnVsZXMvbm8tYW1kJyksXG4gICduby1kdXBsaWNhdGVzJzogcmVxdWlyZSgnLi9ydWxlcy9uby1kdXBsaWNhdGVzJyksXG4gIGZpcnN0OiByZXF1aXJlKCcuL3J1bGVzL2ZpcnN0JyksXG4gICdtYXgtZGVwZW5kZW5jaWVzJzogcmVxdWlyZSgnLi9ydWxlcy9tYXgtZGVwZW5kZW5jaWVzJyksXG4gICduby1leHRyYW5lb3VzLWRlcGVuZGVuY2llcyc6IHJlcXVpcmUoJy4vcnVsZXMvbm8tZXh0cmFuZW91cy1kZXBlbmRlbmNpZXMnKSxcbiAgJ25vLWFic29sdXRlLXBhdGgnOiByZXF1aXJlKCcuL3J1bGVzL25vLWFic29sdXRlLXBhdGgnKSxcbiAgJ25vLW5vZGVqcy1tb2R1bGVzJzogcmVxdWlyZSgnLi9ydWxlcy9uby1ub2RlanMtbW9kdWxlcycpLFxuICAnbm8td2VicGFjay1sb2FkZXItc3ludGF4JzogcmVxdWlyZSgnLi9ydWxlcy9uby13ZWJwYWNrLWxvYWRlci1zeW50YXgnKSxcbiAgb3JkZXI6IHJlcXVpcmUoJy4vcnVsZXMvb3JkZXInKSxcbiAgJ25ld2xpbmUtYWZ0ZXItaW1wb3J0JzogcmVxdWlyZSgnLi9ydWxlcy9uZXdsaW5lLWFmdGVyLWltcG9ydCcpLFxuICAncHJlZmVyLWRlZmF1bHQtZXhwb3J0JzogcmVxdWlyZSgnLi9ydWxlcy9wcmVmZXItZGVmYXVsdC1leHBvcnQnKSxcbiAgJ25vLWRlZmF1bHQtZXhwb3J0JzogcmVxdWlyZSgnLi9ydWxlcy9uby1kZWZhdWx0LWV4cG9ydCcpLFxuICAnbm8tbmFtZWQtZXhwb3J0JzogcmVxdWlyZSgnLi9ydWxlcy9uby1uYW1lZC1leHBvcnQnKSxcbiAgJ25vLWR5bmFtaWMtcmVxdWlyZSc6IHJlcXVpcmUoJy4vcnVsZXMvbm8tZHluYW1pYy1yZXF1aXJlJyksXG4gIHVuYW1iaWd1b3VzOiByZXF1aXJlKCcuL3J1bGVzL3VuYW1iaWd1b3VzJyksXG4gICduby11bmFzc2lnbmVkLWltcG9ydCc6IHJlcXVpcmUoJy4vcnVsZXMvbm8tdW5hc3NpZ25lZC1pbXBvcnQnKSxcbiAgJ25vLXVzZWxlc3MtcGF0aC1zZWdtZW50cyc6IHJlcXVpcmUoJy4vcnVsZXMvbm8tdXNlbGVzcy1wYXRoLXNlZ21lbnRzJyksXG4gICdkeW5hbWljLWltcG9ydC1jaHVua25hbWUnOiByZXF1aXJlKCcuL3J1bGVzL2R5bmFtaWMtaW1wb3J0LWNodW5rbmFtZScpLFxuICAnbm8taW1wb3J0LW1vZHVsZS1leHBvcnRzJzogcmVxdWlyZSgnLi9ydWxlcy9uby1pbXBvcnQtbW9kdWxlLWV4cG9ydHMnKSxcbiAgJ25vLWVtcHR5LW5hbWVkLWJsb2Nrcyc6IHJlcXVpcmUoJy4vcnVsZXMvbm8tZW1wdHktbmFtZWQtYmxvY2tzJyksXG5cbiAgLy8gZXhwb3J0XG4gICdleHBvcnRzLWxhc3QnOiByZXF1aXJlKCcuL3J1bGVzL2V4cG9ydHMtbGFzdCcpLFxuXG4gIC8vIG1ldGFkYXRhLWJhc2VkXG4gICduby1kZXByZWNhdGVkJzogcmVxdWlyZSgnLi9ydWxlcy9uby1kZXByZWNhdGVkJyksXG5cbiAgLy8gZGVwcmVjYXRlZCBhbGlhc2VzIHRvIHJ1bGVzXG4gICdpbXBvcnRzLWZpcnN0JzogcmVxdWlyZSgnLi9ydWxlcy9pbXBvcnRzLWZpcnN0JyksXG59O1xuXG5leHBvcnQgY29uc3QgY29uZmlncyA9IHtcbiAgcmVjb21tZW5kZWQ6IHJlcXVpcmUoJy4uL2NvbmZpZy9yZWNvbW1lbmRlZCcpLFxuXG4gIGVycm9yczogcmVxdWlyZSgnLi4vY29uZmlnL2Vycm9ycycpLFxuICB3YXJuaW5nczogcmVxdWlyZSgnLi4vY29uZmlnL3dhcm5pbmdzJyksXG5cbiAgLy8gc2hoaGguLi4gd29yayBpbiBwcm9ncmVzcyBcInNlY3JldFwiIHJ1bGVzXG4gICdzdGFnZS0wJzogcmVxdWlyZSgnLi4vY29uZmlnL3N0YWdlLTAnKSxcblxuICAvLyB1c2VmdWwgc3R1ZmYgZm9yIGZvbGtzIHVzaW5nIHZhcmlvdXMgZW52aXJvbm1lbnRzXG4gIHJlYWN0OiByZXF1aXJlKCcuLi9jb25maWcvcmVhY3QnKSxcbiAgJ3JlYWN0LW5hdGl2ZSc6IHJlcXVpcmUoJy4uL2NvbmZpZy9yZWFjdC1uYXRpdmUnKSxcbiAgZWxlY3Ryb246IHJlcXVpcmUoJy4uL2NvbmZpZy9lbGVjdHJvbicpLFxuICB0eXBlc2NyaXB0OiByZXF1aXJlKCcuLi9jb25maWcvdHlwZXNjcmlwdCcpLFxufTtcblxuLy8gQmFzZSBQbHVnaW4gT2JqZWN0XG5jb25zdCBpbXBvcnRQbHVnaW4gPSB7XG4gIG1ldGE6IHsgbmFtZSwgdmVyc2lvbiB9LFxuICBydWxlcyxcbn07XG5cbi8vIENyZWF0ZSBmbGF0IGNvbmZpZ3MgKE9ubHkgb25lcyB0aGF0IGRlY2xhcmUgcGx1Z2lucyBhbmQgcGFyc2VyIG9wdGlvbnMgbmVlZCB0byBiZSBkaWZmZXJlbnQgZnJvbSB0aGUgbGVnYWN5IGNvbmZpZylcbmNvbnN0IGNyZWF0ZUZsYXRDb25maWcgPSAoYmFzZUNvbmZpZywgY29uZmlnTmFtZSkgPT4gKHtcbiAgLi4uYmFzZUNvbmZpZyxcbiAgbmFtZTogYGltcG9ydC8ke2NvbmZpZ05hbWV9YCxcbiAgcGx1Z2luczogeyBpbXBvcnQ6IGltcG9ydFBsdWdpbiB9LFxufSk7XG5cbmV4cG9ydCBjb25zdCBmbGF0Q29uZmlncyA9IHtcbiAgcmVjb21tZW5kZWQ6IGNyZWF0ZUZsYXRDb25maWcoXG4gICAgcmVxdWlyZSgnLi4vY29uZmlnL2ZsYXQvcmVjb21tZW5kZWQnKSxcbiAgICAncmVjb21tZW5kZWQnLFxuICApLFxuXG4gIGVycm9yczogY3JlYXRlRmxhdENvbmZpZyhyZXF1aXJlKCcuLi9jb25maWcvZmxhdC9lcnJvcnMnKSwgJ2Vycm9ycycpLFxuICB3YXJuaW5nczogY3JlYXRlRmxhdENvbmZpZyhyZXF1aXJlKCcuLi9jb25maWcvZmxhdC93YXJuaW5ncycpLCAnd2FybmluZ3MnKSxcblxuICAvLyB1c2VmdWwgc3R1ZmYgZm9yIGZvbGtzIHVzaW5nIHZhcmlvdXMgZW52aXJvbm1lbnRzXG4gIHJlYWN0OiByZXF1aXJlKCcuLi9jb25maWcvZmxhdC9yZWFjdCcpLFxuICAncmVhY3QtbmF0aXZlJzogY29uZmlnc1sncmVhY3QtbmF0aXZlJ10sXG4gIGVsZWN0cm9uOiBjb25maWdzLmVsZWN0cm9uLFxuICB0eXBlc2NyaXB0OiBjb25maWdzLnR5cGVzY3JpcHQsXG59O1xuIl19+  react: createFlatConfig(require('../config/flat/react'), 'react'),+  'react-native': createFlatConfig(configs['react-native'], 'react-native'),+  electron: createFlatConfig(configs.electron, 'electron'),+  typescript: createFlatConfig(configs.typescript, 'typescript') };+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9pbmRleC5qcyJdLCJuYW1lcyI6WyJydWxlcyIsInJlcXVpcmUiLCJuYW1lZCIsIm5hbWVzcGFjZSIsImV4dGVuc2lvbnMiLCJmaXJzdCIsIm9yZGVyIiwidW5hbWJpZ3VvdXMiLCJjb25maWdzIiwicmVjb21tZW5kZWQiLCJlcnJvcnMiLCJ3YXJuaW5ncyIsInJlYWN0IiwiZWxlY3Ryb24iLCJ0eXBlc2NyaXB0IiwiaW1wb3J0UGx1Z2luIiwibWV0YSIsIm5hbWUiLCJ2ZXJzaW9uIiwiY3JlYXRlRmxhdENvbmZpZyIsImJhc2VDb25maWciLCJjb25maWdOYW1lIiwicGx1Z2lucyIsImZsYXRDb25maWdzIl0sIm1hcHBpbmdzIjoiNklBQUE7O0FBRU8sSUFBTUEsd0JBQVE7QUFDbkIsbUJBQWlCQyxRQUFRLHVCQUFSLENBREU7QUFFbkJDLFNBQU9ELFFBQVEsZUFBUixDQUZZO0FBR25CLGFBQVNBLFFBQVEsaUJBQVIsQ0FIVTtBQUluQkUsYUFBV0YsUUFBUSxtQkFBUixDQUpRO0FBS25CLGtCQUFnQkEsUUFBUSxzQkFBUixDQUxHO0FBTW5CLFlBQVFBLFFBQVEsZ0JBQVIsQ0FOVztBQU9uQix3QkFBc0JBLFFBQVEsNEJBQVIsQ0FQSDtBQVFuQkcsY0FBWUgsUUFBUSxvQkFBUixDQVJPO0FBU25CLHlCQUF1QkEsUUFBUSw2QkFBUixDQVRKO0FBVW5CLHlCQUF1QkEsUUFBUSw2QkFBUixDQVZKO0FBV25CLG1CQUFpQkEsUUFBUSx1QkFBUixDQVhFO0FBWW5CLDBCQUF3QkEsUUFBUSw4QkFBUixDQVpMO0FBYW5CLGdDQUE4QkEsUUFBUSxvQ0FBUixDQWJYO0FBY25CLHFDQUFtQ0EsUUFBUSx5Q0FBUixDQWRoQjs7QUFnQm5CLG9CQUFrQkEsUUFBUSx3QkFBUixDQWhCQztBQWlCbkIsY0FBWUEsUUFBUSxrQkFBUixDQWpCTztBQWtCbkIsc0JBQW9CQSxRQUFRLDBCQUFSLENBbEJEO0FBbUJuQix5QkFBdUJBLFFBQVEsNkJBQVIsQ0FuQko7QUFvQm5CLGdDQUE4QkEsUUFBUSxvQ0FBUixDQXBCWDtBQXFCbkIsaUNBQStCQSxRQUFRLHFDQUFSLENBckJaO0FBc0JuQix1QkFBcUJBLFFBQVEsMkJBQVIsQ0F0QkY7O0FBd0JuQixpQkFBZUEsUUFBUSxxQkFBUixDQXhCSTtBQXlCbkIsWUFBVUEsUUFBUSxnQkFBUixDQXpCUztBQTBCbkIsbUJBQWlCQSxRQUFRLHVCQUFSLENBMUJFO0FBMkJuQkksU0FBT0osUUFBUSxlQUFSLENBM0JZO0FBNEJuQixzQkFBb0JBLFFBQVEsMEJBQVIsQ0E1QkQ7QUE2Qm5CLGdDQUE4QkEsUUFBUSxvQ0FBUixDQTdCWDtBQThCbkIsc0JBQW9CQSxRQUFRLDBCQUFSLENBOUJEO0FBK0JuQix1QkFBcUJBLFFBQVEsMkJBQVIsQ0EvQkY7QUFnQ25CLDhCQUE0QkEsUUFBUSxrQ0FBUixDQWhDVDtBQWlDbkJLLFNBQU9MLFFBQVEsZUFBUixDQWpDWTtBQWtDbkIsMEJBQXdCQSxRQUFRLDhCQUFSLENBbENMO0FBbUNuQiwyQkFBeUJBLFFBQVEsK0JBQVIsQ0FuQ047QUFvQ25CLHVCQUFxQkEsUUFBUSwyQkFBUixDQXBDRjtBQXFDbkIscUJBQW1CQSxRQUFRLHlCQUFSLENBckNBO0FBc0NuQix3QkFBc0JBLFFBQVEsNEJBQVIsQ0F0Q0g7QUF1Q25CTSxlQUFhTixRQUFRLHFCQUFSLENBdkNNO0FBd0NuQiwwQkFBd0JBLFFBQVEsOEJBQVIsQ0F4Q0w7QUF5Q25CLDhCQUE0QkEsUUFBUSxrQ0FBUixDQXpDVDtBQTBDbkIsOEJBQTRCQSxRQUFRLGtDQUFSLENBMUNUO0FBMkNuQiw4QkFBNEJBLFFBQVEsa0NBQVIsQ0EzQ1Q7QUE0Q25CLDJCQUF5QkEsUUFBUSwrQkFBUixDQTVDTjtBQTZDbkIsaUNBQStCQSxRQUFRLHFDQUFSLENBN0NaOztBQStDbkI7QUFDQSxrQkFBZ0JBLFFBQVEsc0JBQVIsQ0FoREc7O0FBa0RuQjtBQUNBLG1CQUFpQkEsUUFBUSx1QkFBUixDQW5ERTs7QUFxRG5CO0FBQ0EsbUJBQWlCQSxRQUFRLHVCQUFSLENBdERFLEVBQWQ7OztBQXlEQSxJQUFNTyw0QkFBVTtBQUNyQkMsZUFBYVIsUUFBUSx1QkFBUixDQURROztBQUdyQlMsVUFBUVQsUUFBUSxrQkFBUixDQUhhO0FBSXJCVSxZQUFVVixRQUFRLG9CQUFSLENBSlc7O0FBTXJCO0FBQ0EsYUFBV0EsUUFBUSxtQkFBUixDQVBVOztBQVNyQjtBQUNBVyxTQUFPWCxRQUFRLGlCQUFSLENBVmM7QUFXckIsa0JBQWdCQSxRQUFRLHdCQUFSLENBWEs7QUFZckJZLFlBQVVaLFFBQVEsb0JBQVIsQ0FaVztBQWFyQmEsY0FBWWIsUUFBUSxzQkFBUixDQWJTLEVBQWhCOzs7QUFnQlA7QUFDQSxJQUFNYyxlQUFlO0FBQ25CQyxRQUFNLEVBQUVDLG1CQUFGLEVBQVFDLHlCQUFSLEVBRGE7QUFFbkJsQixjQUZtQixFQUFyQjs7O0FBS0E7QUFDQSxJQUFNbUIsbUJBQW1CLFNBQW5CQSxnQkFBbUIsQ0FBQ0MsVUFBRCxFQUFhQyxVQUFiO0FBQ3BCRCxZQURvQjtBQUV2QkgsNkJBQWdCSSxVQUFoQixDQUZ1QjtBQUd2QkMsYUFBUyxFQUFFLFVBQVFQLFlBQVYsRUFIYyxLQUF6Qjs7O0FBTU8sSUFBTVEsb0NBQWM7QUFDekJkLGVBQWFVO0FBQ1hsQixVQUFRLDRCQUFSLENBRFc7QUFFWCxlQUZXLENBRFk7OztBQU16QlMsVUFBUVMsaUJBQWlCbEIsUUFBUSx1QkFBUixDQUFqQixFQUFtRCxRQUFuRCxDQU5pQjtBQU96QlUsWUFBVVEsaUJBQWlCbEIsUUFBUSx5QkFBUixDQUFqQixFQUFxRCxVQUFyRCxDQVBlOztBQVN6QjtBQUNBVyxTQUFPTyxpQkFBaUJsQixRQUFRLHNCQUFSLENBQWpCLEVBQWtELE9BQWxELENBVmtCO0FBV3pCLGtCQUFnQmtCLGlCQUFpQlgsUUFBUSxjQUFSLENBQWpCLEVBQTBDLGNBQTFDLENBWFM7QUFZekJLLFlBQVVNLGlCQUFpQlgsUUFBUUssUUFBekIsRUFBbUMsVUFBbkMsQ0FaZTtBQWF6QkMsY0FBWUssaUJBQWlCWCxRQUFRTSxVQUF6QixFQUFxQyxZQUFyQyxDQWJhLEVBQXBCIiwiZmlsZSI6ImluZGV4LmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgbmFtZSwgdmVyc2lvbiB9IGZyb20gJy4uL3BhY2thZ2UuanNvbic7XG5cbmV4cG9ydCBjb25zdCBydWxlcyA9IHtcbiAgJ25vLXVucmVzb2x2ZWQnOiByZXF1aXJlKCcuL3J1bGVzL25vLXVucmVzb2x2ZWQnKSxcbiAgbmFtZWQ6IHJlcXVpcmUoJy4vcnVsZXMvbmFtZWQnKSxcbiAgZGVmYXVsdDogcmVxdWlyZSgnLi9ydWxlcy9kZWZhdWx0JyksXG4gIG5hbWVzcGFjZTogcmVxdWlyZSgnLi9ydWxlcy9uYW1lc3BhY2UnKSxcbiAgJ25vLW5hbWVzcGFjZSc6IHJlcXVpcmUoJy4vcnVsZXMvbm8tbmFtZXNwYWNlJyksXG4gIGV4cG9ydDogcmVxdWlyZSgnLi9ydWxlcy9leHBvcnQnKSxcbiAgJ25vLW11dGFibGUtZXhwb3J0cyc6IHJlcXVpcmUoJy4vcnVsZXMvbm8tbXV0YWJsZS1leHBvcnRzJyksXG4gIGV4dGVuc2lvbnM6IHJlcXVpcmUoJy4vcnVsZXMvZXh0ZW5zaW9ucycpLFxuICAnbm8tcmVzdHJpY3RlZC1wYXRocyc6IHJlcXVpcmUoJy4vcnVsZXMvbm8tcmVzdHJpY3RlZC1wYXRocycpLFxuICAnbm8taW50ZXJuYWwtbW9kdWxlcyc6IHJlcXVpcmUoJy4vcnVsZXMvbm8taW50ZXJuYWwtbW9kdWxlcycpLFxuICAnZ3JvdXAtZXhwb3J0cyc6IHJlcXVpcmUoJy4vcnVsZXMvZ3JvdXAtZXhwb3J0cycpLFxuICAnbm8tcmVsYXRpdmUtcGFja2FnZXMnOiByZXF1aXJlKCcuL3J1bGVzL25vLXJlbGF0aXZlLXBhY2thZ2VzJyksXG4gICduby1yZWxhdGl2ZS1wYXJlbnQtaW1wb3J0cyc6IHJlcXVpcmUoJy4vcnVsZXMvbm8tcmVsYXRpdmUtcGFyZW50LWltcG9ydHMnKSxcbiAgJ2NvbnNpc3RlbnQtdHlwZS1zcGVjaWZpZXItc3R5bGUnOiByZXF1aXJlKCcuL3J1bGVzL2NvbnNpc3RlbnQtdHlwZS1zcGVjaWZpZXItc3R5bGUnKSxcblxuICAnbm8tc2VsZi1pbXBvcnQnOiByZXF1aXJlKCcuL3J1bGVzL25vLXNlbGYtaW1wb3J0JyksXG4gICduby1jeWNsZSc6IHJlcXVpcmUoJy4vcnVsZXMvbm8tY3ljbGUnKSxcbiAgJ25vLW5hbWVkLWRlZmF1bHQnOiByZXF1aXJlKCcuL3J1bGVzL25vLW5hbWVkLWRlZmF1bHQnKSxcbiAgJ25vLW5hbWVkLWFzLWRlZmF1bHQnOiByZXF1aXJlKCcuL3J1bGVzL25vLW5hbWVkLWFzLWRlZmF1bHQnKSxcbiAgJ25vLW5hbWVkLWFzLWRlZmF1bHQtbWVtYmVyJzogcmVxdWlyZSgnLi9ydWxlcy9uby1uYW1lZC1hcy1kZWZhdWx0LW1lbWJlcicpLFxuICAnbm8tYW5vbnltb3VzLWRlZmF1bHQtZXhwb3J0JzogcmVxdWlyZSgnLi9ydWxlcy9uby1hbm9ueW1vdXMtZGVmYXVsdC1leHBvcnQnKSxcbiAgJ25vLXVudXNlZC1tb2R1bGVzJzogcmVxdWlyZSgnLi9ydWxlcy9uby11bnVzZWQtbW9kdWxlcycpLFxuXG4gICduby1jb21tb25qcyc6IHJlcXVpcmUoJy4vcnVsZXMvbm8tY29tbW9uanMnKSxcbiAgJ25vLWFtZCc6IHJlcXVpcmUoJy4vcnVsZXMvbm8tYW1kJyksXG4gICduby1kdXBsaWNhdGVzJzogcmVxdWlyZSgnLi9ydWxlcy9uby1kdXBsaWNhdGVzJyksXG4gIGZpcnN0OiByZXF1aXJlKCcuL3J1bGVzL2ZpcnN0JyksXG4gICdtYXgtZGVwZW5kZW5jaWVzJzogcmVxdWlyZSgnLi9ydWxlcy9tYXgtZGVwZW5kZW5jaWVzJyksXG4gICduby1leHRyYW5lb3VzLWRlcGVuZGVuY2llcyc6IHJlcXVpcmUoJy4vcnVsZXMvbm8tZXh0cmFuZW91cy1kZXBlbmRlbmNpZXMnKSxcbiAgJ25vLWFic29sdXRlLXBhdGgnOiByZXF1aXJlKCcuL3J1bGVzL25vLWFic29sdXRlLXBhdGgnKSxcbiAgJ25vLW5vZGVqcy1tb2R1bGVzJzogcmVxdWlyZSgnLi9ydWxlcy9uby1ub2RlanMtbW9kdWxlcycpLFxuICAnbm8td2VicGFjay1sb2FkZXItc3ludGF4JzogcmVxdWlyZSgnLi9ydWxlcy9uby13ZWJwYWNrLWxvYWRlci1zeW50YXgnKSxcbiAgb3JkZXI6IHJlcXVpcmUoJy4vcnVsZXMvb3JkZXInKSxcbiAgJ25ld2xpbmUtYWZ0ZXItaW1wb3J0JzogcmVxdWlyZSgnLi9ydWxlcy9uZXdsaW5lLWFmdGVyLWltcG9ydCcpLFxuICAncHJlZmVyLWRlZmF1bHQtZXhwb3J0JzogcmVxdWlyZSgnLi9ydWxlcy9wcmVmZXItZGVmYXVsdC1leHBvcnQnKSxcbiAgJ25vLWRlZmF1bHQtZXhwb3J0JzogcmVxdWlyZSgnLi9ydWxlcy9uby1kZWZhdWx0LWV4cG9ydCcpLFxuICAnbm8tbmFtZWQtZXhwb3J0JzogcmVxdWlyZSgnLi9ydWxlcy9uby1uYW1lZC1leHBvcnQnKSxcbiAgJ25vLWR5bmFtaWMtcmVxdWlyZSc6IHJlcXVpcmUoJy4vcnVsZXMvbm8tZHluYW1pYy1yZXF1aXJlJyksXG4gIHVuYW1iaWd1b3VzOiByZXF1aXJlKCcuL3J1bGVzL3VuYW1iaWd1b3VzJyksXG4gICduby11bmFzc2lnbmVkLWltcG9ydCc6IHJlcXVpcmUoJy4vcnVsZXMvbm8tdW5hc3NpZ25lZC1pbXBvcnQnKSxcbiAgJ25vLXVzZWxlc3MtcGF0aC1zZWdtZW50cyc6IHJlcXVpcmUoJy4vcnVsZXMvbm8tdXNlbGVzcy1wYXRoLXNlZ21lbnRzJyksXG4gICdkeW5hbWljLWltcG9ydC1jaHVua25hbWUnOiByZXF1aXJlKCcuL3J1bGVzL2R5bmFtaWMtaW1wb3J0LWNodW5rbmFtZScpLFxuICAnbm8taW1wb3J0LW1vZHVsZS1leHBvcnRzJzogcmVxdWlyZSgnLi9ydWxlcy9uby1pbXBvcnQtbW9kdWxlLWV4cG9ydHMnKSxcbiAgJ25vLWVtcHR5LW5hbWVkLWJsb2Nrcyc6IHJlcXVpcmUoJy4vcnVsZXMvbm8tZW1wdHktbmFtZWQtYmxvY2tzJyksXG4gICdlbmZvcmNlLW5vZGUtcHJvdG9jb2wtdXNhZ2UnOiByZXF1aXJlKCcuL3J1bGVzL2VuZm9yY2Utbm9kZS1wcm90b2NvbC11c2FnZScpLFxuXG4gIC8vIGV4cG9ydFxuICAnZXhwb3J0cy1sYXN0JzogcmVxdWlyZSgnLi9ydWxlcy9leHBvcnRzLWxhc3QnKSxcblxuICAvLyBtZXRhZGF0YS1iYXNlZFxuICAnbm8tZGVwcmVjYXRlZCc6IHJlcXVpcmUoJy4vcnVsZXMvbm8tZGVwcmVjYXRlZCcpLFxuXG4gIC8vIGRlcHJlY2F0ZWQgYWxpYXNlcyB0byBydWxlc1xuICAnaW1wb3J0cy1maXJzdCc6IHJlcXVpcmUoJy4vcnVsZXMvaW1wb3J0cy1maXJzdCcpLFxufTtcblxuZXhwb3J0IGNvbnN0IGNvbmZpZ3MgPSB7XG4gIHJlY29tbWVuZGVkOiByZXF1aXJlKCcuLi9jb25maWcvcmVjb21tZW5kZWQnKSxcblxuICBlcnJvcnM6IHJlcXVpcmUoJy4uL2NvbmZpZy9lcnJvcnMnKSxcbiAgd2FybmluZ3M6IHJlcXVpcmUoJy4uL2NvbmZpZy93YXJuaW5ncycpLFxuXG4gIC8vIHNoaGhoLi4uIHdvcmsgaW4gcHJvZ3Jlc3MgXCJzZWNyZXRcIiBydWxlc1xuICAnc3RhZ2UtMCc6IHJlcXVpcmUoJy4uL2NvbmZpZy9zdGFnZS0wJyksXG5cbiAgLy8gdXNlZnVsIHN0dWZmIGZvciBmb2xrcyB1c2luZyB2YXJpb3VzIGVudmlyb25tZW50c1xuICByZWFjdDogcmVxdWlyZSgnLi4vY29uZmlnL3JlYWN0JyksXG4gICdyZWFjdC1uYXRpdmUnOiByZXF1aXJlKCcuLi9jb25maWcvcmVhY3QtbmF0aXZlJyksXG4gIGVsZWN0cm9uOiByZXF1aXJlKCcuLi9jb25maWcvZWxlY3Ryb24nKSxcbiAgdHlwZXNjcmlwdDogcmVxdWlyZSgnLi4vY29uZmlnL3R5cGVzY3JpcHQnKSxcbn07XG5cbi8vIEJhc2UgUGx1Z2luIE9iamVjdFxuY29uc3QgaW1wb3J0UGx1Z2luID0ge1xuICBtZXRhOiB7IG5hbWUsIHZlcnNpb24gfSxcbiAgcnVsZXMsXG59O1xuXG4vLyBDcmVhdGUgZmxhdCBjb25maWdzIChPbmx5IG9uZXMgdGhhdCBkZWNsYXJlIHBsdWdpbnMgYW5kIHBhcnNlciBvcHRpb25zIG5lZWQgdG8gYmUgZGlmZmVyZW50IGZyb20gdGhlIGxlZ2FjeSBjb25maWcpXG5jb25zdCBjcmVhdGVGbGF0Q29uZmlnID0gKGJhc2VDb25maWcsIGNvbmZpZ05hbWUpID0+ICh7XG4gIC4uLmJhc2VDb25maWcsXG4gIG5hbWU6IGBpbXBvcnQvJHtjb25maWdOYW1lfWAsXG4gIHBsdWdpbnM6IHsgaW1wb3J0OiBpbXBvcnRQbHVnaW4gfSxcbn0pO1xuXG5leHBvcnQgY29uc3QgZmxhdENvbmZpZ3MgPSB7XG4gIHJlY29tbWVuZGVkOiBjcmVhdGVGbGF0Q29uZmlnKFxuICAgIHJlcXVpcmUoJy4uL2NvbmZpZy9mbGF0L3JlY29tbWVuZGVkJyksXG4gICAgJ3JlY29tbWVuZGVkJyxcbiAgKSxcblxuICBlcnJvcnM6IGNyZWF0ZUZsYXRDb25maWcocmVxdWlyZSgnLi4vY29uZmlnL2ZsYXQvZXJyb3JzJyksICdlcnJvcnMnKSxcbiAgd2FybmluZ3M6IGNyZWF0ZUZsYXRDb25maWcocmVxdWlyZSgnLi4vY29uZmlnL2ZsYXQvd2FybmluZ3MnKSwgJ3dhcm5pbmdzJyksXG5cbiAgLy8gdXNlZnVsIHN0dWZmIGZvciBmb2xrcyB1c2luZyB2YXJpb3VzIGVudmlyb25tZW50c1xuICByZWFjdDogY3JlYXRlRmxhdENvbmZpZyhyZXF1aXJlKCcuLi9jb25maWcvZmxhdC9yZWFjdCcpLCAncmVhY3QnKSxcbiAgJ3JlYWN0LW5hdGl2ZSc6IGNyZWF0ZUZsYXRDb25maWcoY29uZmlnc1sncmVhY3QtbmF0aXZlJ10sICdyZWFjdC1uYXRpdmUnKSxcbiAgZWxlY3Ryb246IGNyZWF0ZUZsYXRDb25maWcoY29uZmlncy5lbGVjdHJvbiwgJ2VsZWN0cm9uJyksXG4gIHR5cGVzY3JpcHQ6IGNyZWF0ZUZsYXRDb25maWcoY29uZmlncy50eXBlc2NyaXB0LCAndHlwZXNjcmlwdCcpLFxufTtcbiJdfQ==
lib/rules/enforce-node-protocol-usage.js +147 lines
--- +++ @@ -0,0 +1,147 @@+'use strict';var _messages;function _defineProperty(obj, key, value) {if (key in obj) {Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true });} else {obj[key] = value;}return obj;}++var isCoreModule = require('is-core-module');var _require =+require('../docsUrl'),docsUrl = _require['default'];++var DO_PREFER_MESSAGE_ID = 'requireNodeProtocol';+var NEVER_PREFER_MESSAGE_ID = 'forbidNodeProtocol';+var messages = (_messages = {}, _defineProperty(_messages,+DO_PREFER_MESSAGE_ID, 'Prefer `node:{{moduleName}}` over `{{moduleName}}`.'), _defineProperty(_messages,+NEVER_PREFER_MESSAGE_ID, 'Prefer `{{moduleName}}` over `node:{{moduleName}}`.'), _messages);+++function replaceStringLiteral(+fixer,+node,+text,+relativeRangeStart,+relativeRangeEnd)+{+  var firstCharacterIndex = node.range[0] + 1;+  var start = Number.isInteger(relativeRangeEnd) ?+  relativeRangeStart + firstCharacterIndex :+  firstCharacterIndex;+  var end = Number.isInteger(relativeRangeEnd) ?+  relativeRangeEnd + firstCharacterIndex :+  node.range[1] - 1;++  return fixer.replaceTextRange([start, end], text);+}++function isStringLiteral(node) {+  return node && node.type === 'Literal' && typeof node.value === 'string';+}++function isStaticRequireWith1Param(node) {+  return !node.optional &&+  node.callee.type === 'Identifier' &&+  node.callee.name === 'require'+  // check for only 1 argument+  && node.arguments.length === 1 &&+  node.arguments[0] &&+  isStringLiteral(node.arguments[0]);+}++function checkAndReport(src, context) {+  // TODO use src.quasis[0].value.raw+  if (!src || src.type === 'TemplateLiteral') {return;}+  var moduleName = 'value' in src ? src.value : src.name;+  if (typeof moduleName !== 'string') {console.log(src, moduleName);}var+  settings = context.settings;+  var nodeVersion = settings && settings['import/node-version'];+  if (+  typeof nodeVersion !== 'undefined' && (++  typeof nodeVersion !== 'string' ||+  !/^[0-9]+\.[0-9]+\.[0-9]+$/.test(nodeVersion)))++  {+    throw new TypeError('`import/node-version` setting must be a string in the format "10.23.45" (a semver version, with no leading zero)');+  }++  if (context.options[0] === 'never') {+    if (!moduleName.startsWith('node:')) {return;}++    var actualModuleName = moduleName.slice(5);+    if (!isCoreModule(actualModuleName, nodeVersion || undefined)) {return;}++    context.report({+      node: src,+      message: messages[NEVER_PREFER_MESSAGE_ID],+      data: { moduleName: actualModuleName },+      /** @param {import('eslint').Rule.RuleFixer} fixer */+      fix: function () {function fix(fixer) {+          return replaceStringLiteral(fixer, src, '', 0, 5);+        }return fix;}() });++  } else if (context.options[0] === 'always') {+    if (+    moduleName.startsWith('node:') ||+    !isCoreModule(moduleName, nodeVersion || undefined) ||+    !isCoreModule('node:' + String(moduleName), nodeVersion || undefined))+    {+      return;+    }++    context.report({+      node: src,+      message: messages[DO_PREFER_MESSAGE_ID],+      data: { moduleName: moduleName },+      /** @param {import('eslint').Rule.RuleFixer} fixer */+      fix: function () {function fix(fixer) {+          return replaceStringLiteral(fixer, src, 'node:', 0, 0);+        }return fix;}() });++  } else if (typeof context.options[0] === 'undefined') {+    throw new Error('Missing option');+  } else {+    throw new Error('Unexpected option: ' + String(context.options[0]));+  }+}++/** @type {import('eslint').Rule.RuleModule} */+module.exports = {+  meta: {+    type: 'suggestion',+    docs: {+      description: 'Enforce either using, or omitting, the `node:` protocol when importing Node.js builtin modules.',+      recommended: true,+      category: 'Static analysis',+      url: docsUrl('enforce-node-protocol-usage') },++    fixable: 'code',+    schema: {+      type: 'array',+      minItems: 1,+      maxItems: 1,+      items: [+      {+        'enum': ['always', 'never'] }] },++++    messages: messages },++  create: function () {function create(context) {+      return {+        CallExpression: function () {function CallExpression(node) {+            if (!isStaticRequireWith1Param(node)) {return;}++            var arg = node.arguments[0];++            return checkAndReport(arg, context);+          }return CallExpression;}(),+        ExportNamedDeclaration: function () {function ExportNamedDeclaration(node) {+            return checkAndReport(node.source, context);+          }return ExportNamedDeclaration;}(),+        ImportDeclaration: function () {function ImportDeclaration(node) {+            return checkAndReport(node.source, context);+          }return ImportDeclaration;}(),+        ImportExpression: function () {function ImportExpression(node) {+            if (!isStringLiteral(node.source)) {return;}++            return checkAndReport(node.source, context);+          }return ImportExpression;}() };++    }return create;}() };+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWxlcy9lbmZvcmNlLW5vZGUtcHJvdG9jb2wtdXNhZ2UuanMiXSwibmFtZXMiOlsiaXNDb3JlTW9kdWxlIiwicmVxdWlyZSIsImRvY3NVcmwiLCJET19QUkVGRVJfTUVTU0FHRV9JRCIsIk5FVkVSX1BSRUZFUl9NRVNTQUdFX0lEIiwibWVzc2FnZXMiLCJyZXBsYWNlU3RyaW5nTGl0ZXJhbCIsImZpeGVyIiwibm9kZSIsInRleHQiLCJyZWxhdGl2ZVJhbmdlU3RhcnQiLCJyZWxhdGl2ZVJhbmdlRW5kIiwiZmlyc3RDaGFyYWN0ZXJJbmRleCIsInJhbmdlIiwic3RhcnQiLCJOdW1iZXIiLCJpc0ludGVnZXIiLCJlbmQiLCJyZXBsYWNlVGV4dFJhbmdlIiwiaXNTdHJpbmdMaXRlcmFsIiwidHlwZSIsInZhbHVlIiwiaXNTdGF0aWNSZXF1aXJlV2l0aDFQYXJhbSIsIm9wdGlvbmFsIiwiY2FsbGVlIiwibmFtZSIsImFyZ3VtZW50cyIsImxlbmd0aCIsImNoZWNrQW5kUmVwb3J0Iiwic3JjIiwiY29udGV4dCIsIm1vZHVsZU5hbWUiLCJjb25zb2xlIiwibG9nIiwic2V0dGluZ3MiLCJub2RlVmVyc2lvbiIsInRlc3QiLCJUeXBlRXJyb3IiLCJvcHRpb25zIiwic3RhcnRzV2l0aCIsImFjdHVhbE1vZHVsZU5hbWUiLCJzbGljZSIsInVuZGVmaW5lZCIsInJlcG9ydCIsIm1lc3NhZ2UiLCJkYXRhIiwiZml4IiwiRXJyb3IiLCJtb2R1bGUiLCJleHBvcnRzIiwibWV0YSIsImRvY3MiLCJkZXNjcmlwdGlvbiIsInJlY29tbWVuZGVkIiwiY2F0ZWdvcnkiLCJ1cmwiLCJmaXhhYmxlIiwic2NoZW1hIiwibWluSXRlbXMiLCJtYXhJdGVtcyIsIml0ZW1zIiwiY3JlYXRlIiwiQ2FsbEV4cHJlc3Npb24iLCJhcmciLCJFeHBvcnROYW1lZERlY2xhcmF0aW9uIiwic291cmNlIiwiSW1wb3J0RGVjbGFyYXRpb24iLCJJbXBvcnRFeHByZXNzaW9uIl0sIm1hcHBpbmdzIjoiQUFBQSxhOztBQUVBLElBQU1BLGVBQWVDLFFBQVEsZ0JBQVIsQ0FBckIsQztBQUM2QkEsUUFBUSxZQUFSLEMsQ0FBWkMsTzs7QUFFakIsSUFBTUMsdUJBQXVCLHFCQUE3QjtBQUNBLElBQU1DLDBCQUEwQixvQkFBaEM7QUFDQSxJQUFNQztBQUNIRixvQkFERyxFQUNvQixxREFEcEI7QUFFSEMsdUJBRkcsRUFFdUIscURBRnZCLGFBQU47OztBQUtBLFNBQVNFLG9CQUFUO0FBQ0VDLEtBREY7QUFFRUMsSUFGRjtBQUdFQyxJQUhGO0FBSUVDLGtCQUpGO0FBS0VDLGdCQUxGO0FBTUU7QUFDQSxNQUFNQyxzQkFBc0JKLEtBQUtLLEtBQUwsQ0FBVyxDQUFYLElBQWdCLENBQTVDO0FBQ0EsTUFBTUMsUUFBUUMsT0FBT0MsU0FBUCxDQUFpQkwsZ0JBQWpCO0FBQ1ZELHVCQUFxQkUsbUJBRFg7QUFFVkEscUJBRko7QUFHQSxNQUFNSyxNQUFNRixPQUFPQyxTQUFQLENBQWlCTCxnQkFBakI7QUFDUkEscUJBQW1CQyxtQkFEWDtBQUVSSixPQUFLSyxLQUFMLENBQVcsQ0FBWCxJQUFnQixDQUZwQjs7QUFJQSxTQUFPTixNQUFNVyxnQkFBTixDQUF1QixDQUFDSixLQUFELEVBQVFHLEdBQVIsQ0FBdkIsRUFBcUNSLElBQXJDLENBQVA7QUFDRDs7QUFFRCxTQUFTVSxlQUFULENBQXlCWCxJQUF6QixFQUErQjtBQUM3QixTQUFPQSxRQUFRQSxLQUFLWSxJQUFMLEtBQWMsU0FBdEIsSUFBbUMsT0FBT1osS0FBS2EsS0FBWixLQUFzQixRQUFoRTtBQUNEOztBQUVELFNBQVNDLHlCQUFULENBQW1DZCxJQUFuQyxFQUF5QztBQUN2QyxTQUFPLENBQUNBLEtBQUtlLFFBQU47QUFDRmYsT0FBS2dCLE1BQUwsQ0FBWUosSUFBWixLQUFxQixZQURuQjtBQUVGWixPQUFLZ0IsTUFBTCxDQUFZQyxJQUFaLEtBQXFCO0FBQ3hCO0FBSEssS0FJRmpCLEtBQUtrQixTQUFMLENBQWVDLE1BQWYsS0FBMEIsQ0FKeEI7QUFLRm5CLE9BQUtrQixTQUFMLENBQWUsQ0FBZixDQUxFO0FBTUZQLGtCQUFnQlgsS0FBS2tCLFNBQUwsQ0FBZSxDQUFmLENBQWhCLENBTkw7QUFPRDs7QUFFRCxTQUFTRSxjQUFULENBQXdCQyxHQUF4QixFQUE2QkMsT0FBN0IsRUFBc0M7QUFDcEM7QUFDQSxNQUFJLENBQUNELEdBQUQsSUFBUUEsSUFBSVQsSUFBSixLQUFhLGlCQUF6QixFQUE0QyxDQUFFLE9BQVM7QUFDdkQsTUFBTVcsYUFBYSxXQUFXRixHQUFYLEdBQWlCQSxJQUFJUixLQUFyQixHQUE2QlEsSUFBSUosSUFBcEQ7QUFDQSxNQUFJLE9BQU9NLFVBQVAsS0FBc0IsUUFBMUIsRUFBb0MsQ0FBRUMsUUFBUUMsR0FBUixDQUFZSixHQUFaLEVBQWlCRSxVQUFqQixFQUErQixDQUpqQztBQUs1QkcsVUFMNEIsR0FLZkosT0FMZSxDQUs1QkksUUFMNEI7QUFNcEMsTUFBTUMsY0FBY0QsWUFBWUEsU0FBUyxxQkFBVCxDQUFoQztBQUNBO0FBQ0UsU0FBT0MsV0FBUCxLQUF1QixXQUF2Qjs7QUFFRSxTQUFPQSxXQUFQLEtBQXVCLFFBQXZCO0FBQ0csR0FBRSwwQkFBRCxDQUE2QkMsSUFBN0IsQ0FBa0NELFdBQWxDLENBSE4sQ0FERjs7QUFNRTtBQUNBLFVBQU0sSUFBSUUsU0FBSixDQUFjLGtIQUFkLENBQU47QUFDRDs7QUFFRCxNQUFJUCxRQUFRUSxPQUFSLENBQWdCLENBQWhCLE1BQXVCLE9BQTNCLEVBQW9DO0FBQ2xDLFFBQUksQ0FBQ1AsV0FBV1EsVUFBWCxDQUFzQixPQUF0QixDQUFMLEVBQXFDLENBQUUsT0FBUzs7QUFFaEQsUUFBTUMsbUJBQW1CVCxXQUFXVSxLQUFYLENBQWlCLENBQWpCLENBQXpCO0FBQ0EsUUFBSSxDQUFDekMsYUFBYXdDLGdCQUFiLEVBQStCTCxlQUFlTyxTQUE5QyxDQUFMLEVBQStELENBQUUsT0FBUzs7QUFFMUVaLFlBQVFhLE1BQVIsQ0FBZTtBQUNibkMsWUFBTXFCLEdBRE87QUFFYmUsZUFBU3ZDLFNBQVNELHVCQUFULENBRkk7QUFHYnlDLFlBQU0sRUFBRWQsWUFBWVMsZ0JBQWQsRUFITztBQUliO0FBQ0FNLFNBTGEsNEJBS1R2QyxLQUxTLEVBS0Y7QUFDVCxpQkFBT0QscUJBQXFCQyxLQUFyQixFQUE0QnNCLEdBQTVCLEVBQWlDLEVBQWpDLEVBQXFDLENBQXJDLEVBQXdDLENBQXhDLENBQVA7QUFDRCxTQVBZLGdCQUFmOztBQVNELEdBZkQsTUFlTyxJQUFJQyxRQUFRUSxPQUFSLENBQWdCLENBQWhCLE1BQXVCLFFBQTNCLEVBQXFDO0FBQzFDO0FBQ0VQLGVBQVdRLFVBQVgsQ0FBc0IsT0FBdEI7QUFDRyxLQUFDdkMsYUFBYStCLFVBQWIsRUFBeUJJLGVBQWVPLFNBQXhDLENBREo7QUFFRyxLQUFDMUMsOEJBQXFCK0IsVUFBckIsR0FBbUNJLGVBQWVPLFNBQWxELENBSE47QUFJRTtBQUNBO0FBQ0Q7O0FBRURaLFlBQVFhLE1BQVIsQ0FBZTtBQUNibkMsWUFBTXFCLEdBRE87QUFFYmUsZUFBU3ZDLFNBQVNGLG9CQUFULENBRkk7QUFHYjBDLFlBQU0sRUFBRWQsc0JBQUYsRUFITztBQUliO0FBQ0FlLFNBTGEsNEJBS1R2QyxLQUxTLEVBS0Y7QUFDVCxpQkFBT0QscUJBQXFCQyxLQUFyQixFQUE0QnNCLEdBQTVCLEVBQWlDLE9BQWpDLEVBQTBDLENBQTFDLEVBQTZDLENBQTdDLENBQVA7QUFDRCxTQVBZLGdCQUFmOztBQVNELEdBbEJNLE1Ba0JBLElBQUksT0FBT0MsUUFBUVEsT0FBUixDQUFnQixDQUFoQixDQUFQLEtBQThCLFdBQWxDLEVBQStDO0FBQ3BELFVBQU0sSUFBSVMsS0FBSixDQUFVLGdCQUFWLENBQU47QUFDRCxHQUZNLE1BRUE7QUFDTCxVQUFNLElBQUlBLEtBQUosZ0NBQWdDakIsUUFBUVEsT0FBUixDQUFnQixDQUFoQixDQUFoQyxFQUFOO0FBQ0Q7QUFDRjs7QUFFRDtBQUNBVSxPQUFPQyxPQUFQLEdBQWlCO0FBQ2ZDLFFBQU07QUFDSjlCLFVBQU0sWUFERjtBQUVKK0IsVUFBTTtBQUNKQyxtQkFBYSxpR0FEVDtBQUVKQyxtQkFBYSxJQUZUO0FBR0pDLGdCQUFVLGlCQUhOO0FBSUpDLFdBQUtyRCxRQUFRLDZCQUFSLENBSkQsRUFGRjs7QUFRSnNELGFBQVMsTUFSTDtBQVNKQyxZQUFRO0FBQ05yQyxZQUFNLE9BREE7QUFFTnNDLGdCQUFVLENBRko7QUFHTkMsZ0JBQVUsQ0FISjtBQUlOQyxhQUFPO0FBQ0w7QUFDRSxnQkFBTSxDQUFDLFFBQUQsRUFBVyxPQUFYLENBRFIsRUFESyxDQUpELEVBVEo7Ozs7QUFtQkp2RCxzQkFuQkksRUFEUzs7QUFzQmZ3RCxRQXRCZSwrQkFzQlIvQixPQXRCUSxFQXNCQztBQUNkLGFBQU87QUFDTGdDLHNCQURLLHVDQUNVdEQsSUFEVixFQUNnQjtBQUNuQixnQkFBSSxDQUFDYywwQkFBMEJkLElBQTFCLENBQUwsRUFBc0MsQ0FBRSxPQUFTOztBQUVqRCxnQkFBTXVELE1BQU12RCxLQUFLa0IsU0FBTCxDQUFlLENBQWYsQ0FBWjs7QUFFQSxtQkFBT0UsZUFBZW1DLEdBQWYsRUFBb0JqQyxPQUFwQixDQUFQO0FBQ0QsV0FQSTtBQVFMa0MsOEJBUkssK0NBUWtCeEQsSUFSbEIsRUFRd0I7QUFDM0IsbUJBQU9vQixlQUFlcEIsS0FBS3lELE1BQXBCLEVBQTRCbkMsT0FBNUIsQ0FBUDtBQUNELFdBVkk7QUFXTG9DLHlCQVhLLDBDQVdhMUQsSUFYYixFQVdtQjtBQUN0QixtQkFBT29CLGVBQWVwQixLQUFLeUQsTUFBcEIsRUFBNEJuQyxPQUE1QixDQUFQO0FBQ0QsV0FiSTtBQWNMcUMsd0JBZEsseUNBY1kzRCxJQWRaLEVBY2tCO0FBQ3JCLGdCQUFJLENBQUNXLGdCQUFnQlgsS0FBS3lELE1BQXJCLENBQUwsRUFBbUMsQ0FBRSxPQUFTOztBQUU5QyxtQkFBT3JDLGVBQWVwQixLQUFLeUQsTUFBcEIsRUFBNEJuQyxPQUE1QixDQUFQO0FBQ0QsV0FsQkksNkJBQVA7O0FBb0JELEtBM0NjLG1CQUFqQiIsImZpbGUiOiJlbmZvcmNlLW5vZGUtcHJvdG9jb2wtdXNhZ2UuanMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbmNvbnN0IGlzQ29yZU1vZHVsZSA9IHJlcXVpcmUoJ2lzLWNvcmUtbW9kdWxlJyk7XG5jb25zdCB7IGRlZmF1bHQ6IGRvY3NVcmwgfSA9IHJlcXVpcmUoJy4uL2RvY3NVcmwnKTtcblxuY29uc3QgRE9fUFJFRkVSX01FU1NBR0VfSUQgPSAncmVxdWlyZU5vZGVQcm90b2NvbCc7XG5jb25zdCBORVZFUl9QUkVGRVJfTUVTU0FHRV9JRCA9ICdmb3JiaWROb2RlUHJvdG9jb2wnO1xuY29uc3QgbWVzc2FnZXMgPSB7XG4gIFtET19QUkVGRVJfTUVTU0FHRV9JRF06ICdQcmVmZXIgYG5vZGU6e3ttb2R1bGVOYW1lfX1gIG92ZXIgYHt7bW9kdWxlTmFtZX19YC4nLFxuICBbTkVWRVJfUFJFRkVSX01FU1NBR0VfSURdOiAnUHJlZmVyIGB7e21vZHVsZU5hbWV9fWAgb3ZlciBgbm9kZTp7e21vZHVsZU5hbWV9fWAuJyxcbn07XG5cbmZ1bmN0aW9uIHJlcGxhY2VTdHJpbmdMaXRlcmFsKFxuICBmaXhlcixcbiAgbm9kZSxcbiAgdGV4dCxcbiAgcmVsYXRpdmVSYW5nZVN0YXJ0LFxuICByZWxhdGl2ZVJhbmdlRW5kLFxuKSB7XG4gIGNvbnN0IGZpcnN0Q2hhcmFjdGVySW5kZXggPSBub2RlLnJhbmdlWzBdICsgMTtcbiAgY29uc3Qgc3RhcnQgPSBOdW1iZXIuaXNJbnRlZ2VyKHJlbGF0aXZlUmFuZ2VFbmQpXG4gICAgPyByZWxhdGl2ZVJhbmdlU3RhcnQgKyBmaXJzdENoYXJhY3RlckluZGV4XG4gICAgOiBmaXJzdENoYXJhY3RlckluZGV4O1xuICBjb25zdCBlbmQgPSBOdW1iZXIuaXNJbnRlZ2VyKHJlbGF0aXZlUmFuZ2VFbmQpXG4gICAgPyByZWxhdGl2ZVJhbmdlRW5kICsgZmlyc3RDaGFyYWN0ZXJJbmRleFxuICAgIDogbm9kZS5yYW5nZVsxXSAtIDE7XG5cbiAgcmV0dXJuIGZpeGVyLnJlcGxhY2VUZXh0UmFuZ2UoW3N0YXJ0LCBlbmRdLCB0ZXh0KTtcbn1cblxuZnVuY3Rpb24gaXNTdHJpbmdMaXRlcmFsKG5vZGUpIHtcbiAgcmV0dXJuIG5vZGUgJiYgbm9kZS50eXBlID09PSAnTGl0ZXJhbCcgJiYgdHlwZW9mIG5vZGUudmFsdWUgPT09ICdzdHJpbmcnO1xufVxuXG5mdW5jdGlvbiBpc1N0YXRpY1JlcXVpcmVXaXRoMVBhcmFtKG5vZGUpIHtcbiAgcmV0dXJuICFub2RlLm9wdGlvbmFsXG4gICAgJiYgbm9kZS5jYWxsZWUudHlwZSA9PT0gJ0lkZW50aWZpZXInXG4gICAgJiYgbm9kZS5jYWxsZWUubmFtZSA9PT0gJ3JlcXVpcmUnXG4gICAgLy8gY2hlY2sgZm9yIG9ubHkgMSBhcmd1bWVudFxuICAgICYmIG5vZGUuYXJndW1lbnRzLmxlbmd0aCA9PT0gMVxuICAgICYmIG5vZGUuYXJndW1lbnRzWzBdXG4gICAgJiYgaXNTdHJpbmdMaXRlcmFsKG5vZGUuYXJndW1lbnRzWzBdKTtcbn1cblxuZnVuY3Rpb24gY2hlY2tBbmRSZXBvcnQoc3JjLCBjb250ZXh0KSB7XG4gIC8vIFRPRE8gdXNlIHNyYy5xdWFzaXNbMF0udmFsdWUucmF3XG4gIGlmICghc3JjIHx8IHNyYy50eXBlID09PSAnVGVtcGxhdGVMaXRlcmFsJykgeyByZXR1cm47IH1cbiAgY29uc3QgbW9kdWxlTmFtZSA9ICd2YWx1ZScgaW4gc3JjID8gc3JjLnZhbHVlIDogc3JjLm5hbWU7XG4gIGlmICh0eXBlb2YgbW9kdWxlTmFtZSAhPT0gJ3N0cmluZycpIHsgY29uc29sZS5sb2coc3JjLCBtb2R1bGVOYW1lKTsgfVxuICBjb25zdCB7IHNldHRpbmdzIH0gPSBjb250ZXh0O1xuICBjb25zdCBub2RlVmVyc2lvbiA9IHNldHRpbmdzICYmIHNldHRpbmdzWydpbXBvcnQvbm9kZS12ZXJzaW9uJ107XG4gIGlmIChcbiAgICB0eXBlb2Ygbm9kZVZlcnNpb24gIT09ICd1bmRlZmluZWQnXG4gICAgJiYgKFxuICAgICAgdHlwZW9mIG5vZGVWZXJzaW9uICE9PSAnc3RyaW5nJ1xuICAgICAgfHwgISgvXlswLTldK1xcLlswLTldK1xcLlswLTldKyQvKS50ZXN0KG5vZGVWZXJzaW9uKVxuICAgIClcbiAgKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignYGltcG9ydC9ub2RlLXZlcnNpb25gIHNldHRpbmcgbXVzdCBiZSBhIHN0cmluZyBpbiB0aGUgZm9ybWF0IFwiMTAuMjMuNDVcIiAoYSBzZW12ZXIgdmVyc2lvbiwgd2l0aCBubyBsZWFkaW5nIHplcm8pJyk7XG4gIH1cblxuICBpZiAoY29udGV4dC5vcHRpb25zWzBdID09PSAnbmV2ZXInKSB7XG4gICAgaWYgKCFtb2R1bGVOYW1lLnN0YXJ0c1dpdGgoJ25vZGU6JykpIHsgcmV0dXJuOyB9XG5cbiAgICBjb25zdCBhY3R1YWxNb2R1bGVOYW1lID0gbW9kdWxlTmFtZS5zbGljZSg1KTtcbiAgICBpZiAoIWlzQ29yZU1vZHVsZShhY3R1YWxNb2R1bGVOYW1lLCBub2RlVmVyc2lvbiB8fCB1bmRlZmluZWQpKSB7IHJldHVybjsgfVxuXG4gICAgY29udGV4dC5yZXBvcnQoe1xuICAgICAgbm9kZTogc3JjLFxuICAgICAgbWVzc2FnZTogbWVzc2FnZXNbTkVWRVJfUFJFRkVSX01FU1NBR0VfSURdLFxuICAgICAgZGF0YTogeyBtb2R1bGVOYW1lOiBhY3R1YWxNb2R1bGVOYW1lIH0sXG4gICAgICAvKiogQHBhcmFtIHtpbXBvcnQoJ2VzbGludCcpLlJ1bGUuUnVsZUZpeGVyfSBmaXhlciAqL1xuICAgICAgZml4KGZpeGVyKSB7XG4gICAgICAgIHJldHVybiByZXBsYWNlU3RyaW5nTGl0ZXJhbChmaXhlciwgc3JjLCAnJywgMCwgNSk7XG4gICAgICB9LFxuICAgIH0pO1xuICB9IGVsc2UgaWYgKGNvbnRleHQub3B0aW9uc1swXSA9PT0gJ2Fsd2F5cycpIHtcbiAgICBpZiAoXG4gICAgICBtb2R1bGVOYW1lLnN0YXJ0c1dpdGgoJ25vZGU6JylcbiAgICAgIHx8ICFpc0NvcmVNb2R1bGUobW9kdWxlTmFtZSwgbm9kZVZlcnNpb24gfHwgdW5kZWZpbmVkKVxuICAgICAgfHwgIWlzQ29yZU1vZHVsZShgbm9kZToke21vZHVsZU5hbWV9YCwgbm9kZVZlcnNpb24gfHwgdW5kZWZpbmVkKVxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnRleHQucmVwb3J0KHtcbiAgICAgIG5vZGU6IHNyYyxcbiAgICAgIG1lc3NhZ2U6IG1lc3NhZ2VzW0RPX1BSRUZFUl9NRVNTQUdFX0lEXSxcbiAgICAgIGRhdGE6IHsgbW9kdWxlTmFtZSB9LFxuICAgICAgLyoqIEBwYXJhbSB7aW1wb3J0KCdlc2xpbnQnKS5SdWxlLlJ1bGVGaXhlcn0gZml4ZXIgKi9cbiAgICAgIGZpeChmaXhlcikge1xuICAgICAgICByZXR1cm4gcmVwbGFjZVN0cmluZ0xpdGVyYWwoZml4ZXIsIHNyYywgJ25vZGU6JywgMCwgMCk7XG4gICAgICB9LFxuICAgIH0pO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBjb250ZXh0Lm9wdGlvbnNbMF0gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIG9wdGlvbicpO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCBvcHRpb246ICR7Y29udGV4dC5vcHRpb25zWzBdfWApO1xuICB9XG59XG5cbi8qKiBAdHlwZSB7aW1wb3J0KCdlc2xpbnQnKS5SdWxlLlJ1bGVNb2R1bGV9ICovXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgbWV0YToge1xuICAgIHR5cGU6ICdzdWdnZXN0aW9uJyxcbiAgICBkb2NzOiB7XG4gICAgICBkZXNjcmlwdGlvbjogJ0VuZm9yY2UgZWl0aGVyIHVzaW5nLCBvciBvbWl0dGluZywgdGhlIGBub2RlOmAgcHJvdG9jb2wgd2hlbiBpbXBvcnRpbmcgTm9kZS5qcyBidWlsdGluIG1vZHVsZXMuJyxcbiAgICAgIHJlY29tbWVuZGVkOiB0cnVlLFxuICAgICAgY2F0ZWdvcnk6ICdTdGF0aWMgYW5hbHlzaXMnLFxuICAgICAgdXJsOiBkb2NzVXJsKCdlbmZvcmNlLW5vZGUtcHJvdG9jb2wtdXNhZ2UnKSxcbiAgICB9LFxuICAgIGZpeGFibGU6ICdjb2RlJyxcbiAgICBzY2hlbWE6IHtcbiAgICAgIHR5cGU6ICdhcnJheScsXG4gICAgICBtaW5JdGVtczogMSxcbiAgICAgIG1heEl0ZW1zOiAxLFxuICAgICAgaXRlbXM6IFtcbiAgICAgICAge1xuICAgICAgICAgIGVudW06IFsnYWx3YXlzJywgJ25ldmVyJ10sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0sXG4gICAgbWVzc2FnZXMsXG4gIH0sXG4gIGNyZWF0ZShjb250ZXh0KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIENhbGxFeHByZXNzaW9uKG5vZGUpIHtcbiAgICAgICAgaWYgKCFpc1N0YXRpY1JlcXVpcmVXaXRoMVBhcmFtKG5vZGUpKSB7IHJldHVybjsgfVxuXG4gICAgICAgIGNvbnN0IGFyZyA9IG5vZGUuYXJndW1lbnRzWzBdO1xuXG4gICAgICAgIHJldHVybiBjaGVja0FuZFJlcG9ydChhcmcsIGNvbnRleHQpO1xuICAgICAgfSxcbiAgICAgIEV4cG9ydE5hbWVkRGVjbGFyYXRpb24obm9kZSkge1xuICAgICAgICByZXR1cm4gY2hlY2tBbmRSZXBvcnQobm9kZS5zb3VyY2UsIGNvbnRleHQpO1xuICAgICAgfSxcbiAgICAgIEltcG9ydERlY2xhcmF0aW9uKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIGNoZWNrQW5kUmVwb3J0KG5vZGUuc291cmNlLCBjb250ZXh0KTtcbiAgICAgIH0sXG4gICAgICBJbXBvcnRFeHByZXNzaW9uKG5vZGUpIHtcbiAgICAgICAgaWYgKCFpc1N0cmluZ0xpdGVyYWwobm9kZS5zb3VyY2UpKSB7IHJldHVybjsgfVxuXG4gICAgICAgIHJldHVybiBjaGVja0FuZFJlcG9ydChub2RlLnNvdXJjZSwgY29udGV4dCk7XG4gICAgICB9LFxuICAgIH07XG4gIH0sXG59O1xuIl19
lib/rules/extensions.js +49 lines
--- +++ @@ -2,2 +2,3 @@ +var _minimatch = require('minimatch');var _minimatch2 = _interopRequireDefault(_minimatch); var _resolve = require('eslint-module-utils/resolve');var _resolve2 = _interopRequireDefault(_resolve);@@ -17,3 +18,23 @@     checkTypeImports: { type: 'boolean' },-    ignorePackages: { type: 'boolean' } } };+    ignorePackages: { type: 'boolean' },+    pathGroupOverrides: {+      type: 'array',+      items: {+        type: 'object',+        properties: {+          pattern: {+            type: 'string' },++          patternOptions: {+            type: 'object' },++          action: {+            type: 'string',+            'enum': ['enforce', 'ignore'] } },+++        additionalProperties: false,+        required: ['pattern', 'action'] } } } };++ @@ -55,2 +76,6 @@       result.checkTypeImports = obj.checkTypeImports;+    }++    if (obj.pathGroupOverrides !== undefined) {+      result.pathGroupOverrides = obj.pathGroupOverrides;     }@@ -145,2 +170,11 @@ +      function computeOverrideAction(pathGroupOverrides, path) {+        for (var i = 0, l = pathGroupOverrides.length; i < l; i++) {var _pathGroupOverrides$i =+          pathGroupOverrides[i],pattern = _pathGroupOverrides$i.pattern,patternOptions = _pathGroupOverrides$i.patternOptions,action = _pathGroupOverrides$i.action;+          if ((0, _minimatch2['default'])(path, pattern, patternOptions || { nocomment: true })) {+            return action;+          }+        }+      }+       function checkFileExtension(source, node) {@@ -151,4 +185,14 @@ +        // If not undefined, the user decided if rules are enforced on this import+        var overrideAction = computeOverrideAction(+        props.pathGroupOverrides || [],+        importPathWithQueryString);+++        if (overrideAction === 'ignore') {+          return;+        }+         // don't enforce anything on builtins-        if ((0, _importType.isBuiltIn)(importPathWithQueryString, context.settings)) {return;}+        if (!overrideAction && (0, _importType.isBuiltIn)(importPathWithQueryString, context.settings)) {return;} @@ -158,3 +202,3 @@         // Like `import Decimal from decimal.js`)-        if (isExternalRootModule(importPath)) {return;}+        if (!overrideAction && isExternalRootModule(importPath)) {return;} @@ -176,3 +220,3 @@           if (!props.checkTypeImports && (node.importKind === 'type' || node.exportKind === 'type')) {return;}-          var extensionRequired = isUseOfExtensionRequired(extension, isPackage);+          var extensionRequired = isUseOfExtensionRequired(extension, !overrideAction && isPackage);           var extensionForbidden = isUseOfExtensionForbidden(extension);@@ -197,2 +241,2 @@     }return create;}() };-//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWxlcy9leHRlbnNpb25zLmpzIl0sIm5hbWVzIjpbImVudW1WYWx1ZXMiLCJwYXR0ZXJuUHJvcGVydGllcyIsInR5cGUiLCJwcm9wZXJ0aWVzIiwicGF0dGVybiIsImNoZWNrVHlwZUltcG9ydHMiLCJpZ25vcmVQYWNrYWdlcyIsImJ1aWxkUHJvcGVydGllcyIsImNvbnRleHQiLCJyZXN1bHQiLCJkZWZhdWx0Q29uZmlnIiwib3B0aW9ucyIsImZvckVhY2giLCJvYmoiLCJ1bmRlZmluZWQiLCJPYmplY3QiLCJhc3NpZ24iLCJtb2R1bGUiLCJleHBvcnRzIiwibWV0YSIsImRvY3MiLCJjYXRlZ29yeSIsImRlc2NyaXB0aW9uIiwidXJsIiwic2NoZW1hIiwiYW55T2YiLCJpdGVtcyIsImFkZGl0aW9uYWxJdGVtcyIsImNyZWF0ZSIsInByb3BzIiwiZ2V0TW9kaWZpZXIiLCJleHRlbnNpb24iLCJpc1VzZU9mRXh0ZW5zaW9uUmVxdWlyZWQiLCJpc1BhY2thZ2UiLCJpc1VzZU9mRXh0ZW5zaW9uRm9yYmlkZGVuIiwiaXNSZXNvbHZhYmxlV2l0aG91dEV4dGVuc2lvbiIsImZpbGUiLCJwYXRoIiwiZXh0bmFtZSIsImZpbGVXaXRob3V0RXh0ZW5zaW9uIiwic2xpY2UiLCJsZW5ndGgiLCJyZXNvbHZlZEZpbGVXaXRob3V0RXh0ZW5zaW9uIiwiaXNFeHRlcm5hbFJvb3RNb2R1bGUiLCJzbGFzaENvdW50Iiwic3BsaXQiLCJjaGVja0ZpbGVFeHRlbnNpb24iLCJzb3VyY2UiLCJub2RlIiwidmFsdWUiLCJpbXBvcnRQYXRoV2l0aFF1ZXJ5U3RyaW5nIiwic2V0dGluZ3MiLCJpbXBvcnRQYXRoIiwicmVwbGFjZSIsInJlc29sdmVkUGF0aCIsInN1YnN0cmluZyIsImVuZHNXaXRoIiwiaW1wb3J0S2luZCIsImV4cG9ydEtpbmQiLCJleHRlbnNpb25SZXF1aXJlZCIsImV4dGVuc2lvbkZvcmJpZGRlbiIsInJlcG9ydCIsIm1lc3NhZ2UiLCJjb21tb25qcyJdLCJtYXBwaW5ncyI6ImFBQUEsNEI7O0FBRUEsc0Q7QUFDQTtBQUNBLGtFO0FBQ0EscUM7O0FBRUEsSUFBTUEsYUFBYSxFQUFFLFFBQU0sQ0FBQyxRQUFELEVBQVcsZ0JBQVgsRUFBNkIsT0FBN0IsQ0FBUixFQUFuQjtBQUNBLElBQU1DLG9CQUFvQjtBQUN4QkMsUUFBTSxRQURrQjtBQUV4QkQscUJBQW1CLEVBQUUsTUFBTUQsVUFBUixFQUZLLEVBQTFCOztBQUlBLElBQU1HLGFBQWE7QUFDakJELFFBQU0sUUFEVztBQUVqQkMsY0FBWTtBQUNWQyxhQUFTSCxpQkFEQztBQUVWSSxzQkFBa0IsRUFBRUgsTUFBTSxTQUFSLEVBRlI7QUFHVkksb0JBQWdCLEVBQUVKLE1BQU0sU0FBUixFQUhOLEVBRkssRUFBbkI7Ozs7QUFTQSxTQUFTSyxlQUFULENBQXlCQyxPQUF6QixFQUFrQzs7QUFFaEMsTUFBTUMsU0FBUztBQUNiQyxtQkFBZSxPQURGO0FBRWJOLGFBQVMsRUFGSTtBQUdiRSxvQkFBZ0IsS0FISCxFQUFmOzs7QUFNQUUsVUFBUUcsT0FBUixDQUFnQkMsT0FBaEIsQ0FBd0IsVUFBQ0MsR0FBRCxFQUFTOztBQUUvQjtBQUNBLFFBQUksT0FBT0EsR0FBUCxLQUFlLFFBQW5CLEVBQTZCO0FBQzNCSixhQUFPQyxhQUFQLEdBQXVCRyxHQUF2QjtBQUNBO0FBQ0Q7O0FBRUQ7QUFDQSxRQUFJQSxJQUFJVCxPQUFKLEtBQWdCVSxTQUFoQixJQUE2QkQsSUFBSVAsY0FBSixLQUF1QlEsU0FBcEQsSUFBaUVELElBQUlSLGdCQUFKLEtBQXlCUyxTQUE5RixFQUF5RztBQUN2R0MsYUFBT0MsTUFBUCxDQUFjUCxPQUFPTCxPQUFyQixFQUE4QlMsR0FBOUI7QUFDQTtBQUNEOztBQUVEO0FBQ0EsUUFBSUEsSUFBSVQsT0FBSixLQUFnQlUsU0FBcEIsRUFBK0I7QUFDN0JDLGFBQU9DLE1BQVAsQ0FBY1AsT0FBT0wsT0FBckIsRUFBOEJTLElBQUlULE9BQWxDO0FBQ0Q7O0FBRUQ7QUFDQSxRQUFJUyxJQUFJUCxjQUFKLEtBQXVCUSxTQUEzQixFQUFzQztBQUNwQ0wsYUFBT0gsY0FBUCxHQUF3Qk8sSUFBSVAsY0FBNUI7QUFDRDs7QUFFRCxRQUFJTyxJQUFJUixnQkFBSixLQUF5QlMsU0FBN0IsRUFBd0M7QUFDdENMLGFBQU9KLGdCQUFQLEdBQTBCUSxJQUFJUixnQkFBOUI7QUFDRDtBQUNGLEdBM0JEOztBQTZCQSxNQUFJSSxPQUFPQyxhQUFQLEtBQXlCLGdCQUE3QixFQUErQztBQUM3Q0QsV0FBT0MsYUFBUCxHQUF1QixRQUF2QjtBQUNBRCxXQUFPSCxjQUFQLEdBQXdCLElBQXhCO0FBQ0Q7O0FBRUQsU0FBT0csTUFBUDtBQUNEOztBQUVEUSxPQUFPQyxPQUFQLEdBQWlCO0FBQ2ZDLFFBQU07QUFDSmpCLFVBQU0sWUFERjtBQUVKa0IsVUFBTTtBQUNKQyxnQkFBVSxhQUROO0FBRUpDLG1CQUFhLGlFQUZUO0FBR0pDLFdBQUssMEJBQVEsWUFBUixDQUhELEVBRkY7OztBQVFKQyxZQUFRO0FBQ05DLGFBQU87QUFDTDtBQUNFdkIsY0FBTSxPQURSO0FBRUV3QixlQUFPLENBQUMxQixVQUFELENBRlQ7QUFHRTJCLHlCQUFpQixLQUhuQixFQURLOztBQU1MO0FBQ0V6QixjQUFNLE9BRFI7QUFFRXdCLGVBQU87QUFDTDFCLGtCQURLO0FBRUxHLGtCQUZLLENBRlQ7O0FBTUV3Qix5QkFBaUIsS0FObkIsRUFOSzs7QUFjTDtBQUNFekIsY0FBTSxPQURSO0FBRUV3QixlQUFPLENBQUN2QixVQUFELENBRlQ7QUFHRXdCLHlCQUFpQixLQUhuQixFQWRLOztBQW1CTDtBQUNFekIsY0FBTSxPQURSO0FBRUV3QixlQUFPLENBQUN6QixpQkFBRCxDQUZUO0FBR0UwQix5QkFBaUIsS0FIbkIsRUFuQks7O0FBd0JMO0FBQ0V6QixjQUFNLE9BRFI7QUFFRXdCLGVBQU87QUFDTDFCLGtCQURLO0FBRUxDLHlCQUZLLENBRlQ7O0FBTUUwQix5QkFBaUIsS0FObkIsRUF4QkssQ0FERCxFQVJKLEVBRFM7Ozs7OztBQThDZkMsUUE5Q2UsK0JBOENScEIsT0E5Q1EsRUE4Q0M7O0FBRWQsVUFBTXFCLFFBQVF0QixnQkFBZ0JDLE9BQWhCLENBQWQ7O0FBRUEsZUFBU3NCLFdBQVQsQ0FBcUJDLFNBQXJCLEVBQWdDO0FBQzlCLGVBQU9GLE1BQU16QixPQUFOLENBQWMyQixTQUFkLEtBQTRCRixNQUFNbkIsYUFBekM7QUFDRDs7QUFFRCxlQUFTc0Isd0JBQVQsQ0FBa0NELFNBQWxDLEVBQTZDRSxTQUE3QyxFQUF3RDtBQUN0RCxlQUFPSCxZQUFZQyxTQUFaLE1BQTJCLFFBQTNCLEtBQXdDLENBQUNGLE1BQU12QixjQUFQLElBQXlCLENBQUMyQixTQUFsRSxDQUFQO0FBQ0Q7O0FBRUQsZUFBU0MseUJBQVQsQ0FBbUNILFNBQW5DLEVBQThDO0FBQzVDLGVBQU9ELFlBQVlDLFNBQVosTUFBMkIsT0FBbEM7QUFDRDs7QUFFRCxlQUFTSSw0QkFBVCxDQUFzQ0MsSUFBdEMsRUFBNEM7QUFDMUMsWUFBTUwsWUFBWU0sa0JBQUtDLE9BQUwsQ0FBYUYsSUFBYixDQUFsQjtBQUNBLFlBQU1HLHVCQUF1QkgsS0FBS0ksS0FBTCxDQUFXLENBQVgsRUFBYyxDQUFDVCxVQUFVVSxNQUF6QixDQUE3QjtBQUNBLFlBQU1DLCtCQUErQiwwQkFBUUgsb0JBQVIsRUFBOEIvQixPQUE5QixDQUFyQzs7QUFFQSxlQUFPa0MsaUNBQWlDLDBCQUFRTixJQUFSLEVBQWM1QixPQUFkLENBQXhDO0FBQ0Q7O0FBRUQsZUFBU21DLG9CQUFULENBQThCUCxJQUE5QixFQUFvQztBQUNsQyxZQUFJQSxTQUFTLEdBQVQsSUFBZ0JBLFNBQVMsSUFBN0IsRUFBbUMsQ0FBRSxPQUFPLEtBQVAsQ0FBZTtBQUNwRCxZQUFNUSxhQUFhUixLQUFLUyxLQUFMLENBQVcsR0FBWCxFQUFnQkosTUFBaEIsR0FBeUIsQ0FBNUM7O0FBRUEsWUFBSUcsZUFBZSxDQUFuQixFQUF1QixDQUFFLE9BQU8sSUFBUCxDQUFjO0FBQ3ZDLFlBQUksMEJBQVNSLElBQVQsS0FBa0JRLGNBQWMsQ0FBcEMsRUFBdUMsQ0FBRSxPQUFPLElBQVAsQ0FBYztBQUN2RCxlQUFPLEtBQVA7QUFDRDs7QUFFRCxlQUFTRSxrQkFBVCxDQUE0QkMsTUFBNUIsRUFBb0NDLElBQXBDLEVBQTBDO0FBQ3hDO0FBQ0EsWUFBSSxDQUFDRCxNQUFELElBQVcsQ0FBQ0EsT0FBT0UsS0FBdkIsRUFBOEIsQ0FBRSxPQUFTOztBQUV6QyxZQUFNQyw0QkFBNEJILE9BQU9FLEtBQXpDOztBQUVBO0FBQ0EsWUFBSSwyQkFBVUMseUJBQVYsRUFBcUMxQyxRQUFRMkMsUUFBN0MsQ0FBSixFQUE0RCxDQUFFLE9BQVM7O0FBRXZFLFlBQU1DLGFBQWFGLDBCQUEwQkcsT0FBMUIsQ0FBa0MsU0FBbEMsRUFBNkMsRUFBN0MsQ0FBbkI7O0FBRUE7QUFDQTtBQUNBLFlBQUlWLHFCQUFxQlMsVUFBckIsQ0FBSixFQUFzQyxDQUFFLE9BQVM7O0FBRWpELFlBQU1FLGVBQWUsMEJBQVFGLFVBQVIsRUFBb0I1QyxPQUFwQixDQUFyQjs7QUFFQTtBQUNBO0FBQ0EsWUFBTXVCLFlBQVlNLGtCQUFLQyxPQUFMLENBQWFnQixnQkFBZ0JGLFVBQTdCLEVBQXlDRyxTQUF6QyxDQUFtRCxDQUFuRCxDQUFsQjs7QUFFQTtBQUNBLFlBQU10QixZQUFZO0FBQ2hCbUIsa0JBRGdCO0FBRWhCLGtDQUFRQSxVQUFSLEVBQW9CNUMsT0FBcEIsQ0FGZ0I7QUFHaEJBLGVBSGdCO0FBSWIsa0NBQVM0QyxVQUFULENBSkw7O0FBTUEsWUFBSSxDQUFDckIsU0FBRCxJQUFjLENBQUNxQixXQUFXSSxRQUFYLGNBQXdCekIsU0FBeEIsRUFBbkIsRUFBeUQ7QUFDdkQ7QUFDQSxjQUFJLENBQUNGLE1BQU14QixnQkFBUCxLQUE0QjJDLEtBQUtTLFVBQUwsS0FBb0IsTUFBcEIsSUFBOEJULEtBQUtVLFVBQUwsS0FBb0IsTUFBOUUsQ0FBSixFQUEyRixDQUFFLE9BQVM7QUFDdEcsY0FBTUMsb0JBQW9CM0IseUJBQXlCRCxTQUF6QixFQUFvQ0UsU0FBcEMsQ0FBMUI7QUFDQSxjQUFNMkIscUJBQXFCMUIsMEJBQTBCSCxTQUExQixDQUEzQjtBQUNBLGNBQUk0QixxQkFBcUIsQ0FBQ0Msa0JBQTFCLEVBQThDO0FBQzVDcEQsb0JBQVFxRCxNQUFSLENBQWU7QUFDYmIsb0JBQU1ELE1BRE87QUFFYmU7QUFDNEIvQix1Q0FBZ0JBLFNBQWhCLFdBQWdDLEVBRDVELHFCQUNzRW1CLHlCQUR0RSxPQUZhLEVBQWY7O0FBS0Q7QUFDRixTQVpELE1BWU8sSUFBSW5CLFNBQUosRUFBZTtBQUNwQixjQUFJRywwQkFBMEJILFNBQTFCLEtBQXdDSSw2QkFBNkJpQixVQUE3QixDQUE1QyxFQUFzRjtBQUNwRjVDLG9CQUFRcUQsTUFBUixDQUFlO0FBQ2JiLG9CQUFNRCxNQURPO0FBRWJlLHFFQUE4Qy9CLFNBQTlDLHVCQUFpRW1CLHlCQUFqRSxPQUZhLEVBQWY7O0FBSUQ7QUFDRjtBQUNGOztBQUVELGFBQU8sZ0NBQWNKLGtCQUFkLEVBQWtDLEVBQUVpQixVQUFVLElBQVosRUFBbEMsQ0FBUDtBQUNELEtBbEljLG1CQUFqQiIsImZpbGUiOiJleHRlbnNpb25zLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5cbmltcG9ydCByZXNvbHZlIGZyb20gJ2VzbGludC1tb2R1bGUtdXRpbHMvcmVzb2x2ZSc7XG5pbXBvcnQgeyBpc0J1aWx0SW4sIGlzRXh0ZXJuYWxNb2R1bGUsIGlzU2NvcGVkIH0gZnJvbSAnLi4vY29yZS9pbXBvcnRUeXBlJztcbmltcG9ydCBtb2R1bGVWaXNpdG9yIGZyb20gJ2VzbGludC1tb2R1bGUtdXRpbHMvbW9kdWxlVmlzaXRvcic7XG5pbXBvcnQgZG9jc1VybCBmcm9tICcuLi9kb2NzVXJsJztcblxuY29uc3QgZW51bVZhbHVlcyA9IHsgZW51bTogWydhbHdheXMnLCAnaWdub3JlUGFja2FnZXMnLCAnbmV2ZXInXSB9O1xuY29uc3QgcGF0dGVyblByb3BlcnRpZXMgPSB7XG4gIHR5cGU6ICdvYmplY3QnLFxuICBwYXR0ZXJuUHJvcGVydGllczogeyAnLionOiBlbnVtVmFsdWVzIH0sXG59O1xuY29uc3QgcHJvcGVydGllcyA9IHtcbiAgdHlwZTogJ29iamVjdCcsXG4gIHByb3BlcnRpZXM6IHtcbiAgICBwYXR0ZXJuOiBwYXR0ZXJuUHJvcGVydGllcyxcbiAgICBjaGVja1R5cGVJbXBvcnRzOiB7IHR5cGU6ICdib29sZWFuJyB9LFxuICAgIGlnbm9yZVBhY2thZ2VzOiB7IHR5cGU6ICdib29sZWFuJyB9LFxuICB9LFxufTtcblxuZnVuY3Rpb24gYnVpbGRQcm9wZXJ0aWVzKGNvbnRleHQpIHtcblxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgZGVmYXVsdENvbmZpZzogJ25ldmVyJyxcbiAgICBwYXR0ZXJuOiB7fSxcbiAgICBpZ25vcmVQYWNrYWdlczogZmFsc2UsXG4gIH07XG5cbiAgY29udGV4dC5vcHRpb25zLmZvckVhY2goKG9iaikgPT4ge1xuXG4gICAgLy8gSWYgdGhpcyBpcyBhIHN0cmluZywgc2V0IGRlZmF1bHRDb25maWcgdG8gaXRzIHZhbHVlXG4gICAgaWYgKHR5cGVvZiBvYmogPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXN1bHQuZGVmYXVsdENvbmZpZyA9IG9iajtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGlzIGlzIG5vdCB0aGUgbmV3IHN0cnVjdHVyZSwgdHJhbnNmZXIgYWxsIHByb3BzIHRvIHJlc3VsdC5wYXR0ZXJuXG4gICAgaWYgKG9iai5wYXR0ZXJuID09PSB1bmRlZmluZWQgJiYgb2JqLmlnbm9yZVBhY2thZ2VzID09PSB1bmRlZmluZWQgJiYgb2JqLmNoZWNrVHlwZUltcG9ydHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgT2JqZWN0LmFzc2lnbihyZXN1bHQucGF0dGVybiwgb2JqKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBJZiBwYXR0ZXJuIGlzIHByb3ZpZGVkLCB0cmFuc2ZlciBhbGwgcHJvcHNcbiAgICBpZiAob2JqLnBhdHRlcm4gIT09IHVuZGVmaW5lZCkge1xuICAgICAgT2JqZWN0LmFzc2lnbihyZXN1bHQucGF0dGVybiwgb2JqLnBhdHRlcm4pO1xuICAgIH1cblxuICAgIC8vIElmIGlnbm9yZVBhY2thZ2VzIGlzIHByb3ZpZGVkLCB0cmFuc2ZlciBpdCB0byByZXN1bHRcbiAgICBpZiAob2JqLmlnbm9yZVBhY2thZ2VzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJlc3VsdC5pZ25vcmVQYWNrYWdlcyA9IG9iai5pZ25vcmVQYWNrYWdlcztcbiAgICB9XG5cbiAgICBpZiAob2JqLmNoZWNrVHlwZUltcG9ydHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmVzdWx0LmNoZWNrVHlwZUltcG9ydHMgPSBvYmouY2hlY2tUeXBlSW1wb3J0cztcbiAgICB9XG4gIH0pO1xuXG4gIGlmIChyZXN1bHQuZGVmYXVsdENvbmZpZyA9PT0gJ2lnbm9yZVBhY2thZ2VzJykge1xuICAgIHJlc3VsdC5kZWZhdWx0Q29uZmlnID0gJ2Fsd2F5cyc7XG4gICAgcmVzdWx0Lmlnbm9yZVBhY2thZ2VzID0gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBtZXRhOiB7XG4gICAgdHlwZTogJ3N1Z2dlc3Rpb24nLFxuICAgIGRvY3M6IHtcbiAgICAgIGNhdGVnb3J5OiAnU3R5bGUgZ3VpZGUnLFxuICAgICAgZGVzY3JpcHRpb246ICdFbnN1cmUgY29uc2lzdGVudCB1c2Ugb2YgZmlsZSBleHRlbnNpb24gd2l0aGluIHRoZSBpbXBvcnQgcGF0aC4nLFxuICAgICAgdXJsOiBkb2NzVXJsKCdleHRlbnNpb25zJyksXG4gICAgfSxcblxuICAgIHNjaGVtYToge1xuICAgICAgYW55T2Y6IFtcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6ICdhcnJheScsXG4gICAgICAgICAgaXRlbXM6IFtlbnVtVmFsdWVzXSxcbiAgICAgICAgICBhZGRpdGlvbmFsSXRlbXM6IGZhbHNlLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogJ2FycmF5JyxcbiAgICAgICAgICBpdGVtczogW1xuICAgICAgICAgICAgZW51bVZhbHVlcyxcbiAgICAgICAgICAgIHByb3BlcnRpZXMsXG4gICAgICAgICAgXSxcbiAgICAgICAgICBhZGRpdGlvbmFsSXRlbXM6IGZhbHNlLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogJ2FycmF5JyxcbiAgICAgICAgICBpdGVtczogW3Byb3BlcnRpZXNdLFxuICAgICAgICAgIGFkZGl0aW9uYWxJdGVtczogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAnYXJyYXknLFxuICAgICAgICAgIGl0ZW1zOiBbcGF0dGVyblByb3BlcnRpZXNdLFxuICAgICAgICAgIGFkZGl0aW9uYWxJdGVtczogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAnYXJyYXknLFxuICAgICAgICAgIGl0ZW1zOiBbXG4gICAgICAgICAgICBlbnVtVmFsdWVzLFxuICAgICAgICAgICAgcGF0dGVyblByb3BlcnRpZXMsXG4gICAgICAgICAgXSxcbiAgICAgICAgICBhZGRpdGlvbmFsSXRlbXM6IGZhbHNlLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9LFxuICB9LFxuXG4gIGNyZWF0ZShjb250ZXh0KSB7XG5cbiAgICBjb25zdCBwcm9wcyA9IGJ1aWxkUHJvcGVydGllcyhjb250ZXh0KTtcblxuICAgIGZ1bmN0aW9uIGdldE1vZGlmaWVyKGV4dGVuc2lvbikge1xuICAgICAgcmV0dXJuIHByb3BzLnBhdHRlcm5bZXh0ZW5zaW9uXSB8fCBwcm9wcy5kZWZhdWx0Q29uZmlnO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzVXNlT2ZFeHRlbnNpb25SZXF1aXJlZChleHRlbnNpb24sIGlzUGFja2FnZSkge1xuICAgICAgcmV0dXJuIGdldE1vZGlmaWVyKGV4dGVuc2lvbikgPT09ICdhbHdheXMnICYmICghcHJvcHMuaWdub3JlUGFja2FnZXMgfHwgIWlzUGFja2FnZSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNVc2VPZkV4dGVuc2lvbkZvcmJpZGRlbihleHRlbnNpb24pIHtcbiAgICAgIHJldHVybiBnZXRNb2RpZmllcihleHRlbnNpb24pID09PSAnbmV2ZXInO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzUmVzb2x2YWJsZVdpdGhvdXRFeHRlbnNpb24oZmlsZSkge1xuICAgICAgY29uc3QgZXh0ZW5zaW9uID0gcGF0aC5leHRuYW1lKGZpbGUpO1xuICAgICAgY29uc3QgZmlsZVdpdGhvdXRFeHRlbnNpb24gPSBmaWxlLnNsaWNlKDAsIC1leHRlbnNpb24ubGVuZ3RoKTtcbiAgICAgIGNvbnN0IHJlc29sdmVkRmlsZVdpdGhvdXRFeHRlbnNpb24gPSByZXNvbHZlKGZpbGVXaXRob3V0RXh0ZW5zaW9uLCBjb250ZXh0KTtcblxuICAgICAgcmV0dXJuIHJlc29sdmVkRmlsZVdpdGhvdXRFeHRlbnNpb24gPT09IHJlc29sdmUoZmlsZSwgY29udGV4dCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNFeHRlcm5hbFJvb3RNb2R1bGUoZmlsZSkge1xuICAgICAgaWYgKGZpbGUgPT09ICcuJyB8fCBmaWxlID09PSAnLi4nKSB7IHJldHVybiBmYWxzZTsgfVxuICAgICAgY29uc3Qgc2xhc2hDb3VudCA9IGZpbGUuc3BsaXQoJy8nKS5sZW5ndGggLSAxO1xuXG4gICAgICBpZiAoc2xhc2hDb3VudCA9PT0gMCkgIHsgcmV0dXJuIHRydWU7IH1cbiAgICAgIGlmIChpc1Njb3BlZChmaWxlKSAmJiBzbGFzaENvdW50IDw9IDEpIHsgcmV0dXJuIHRydWU7IH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjaGVja0ZpbGVFeHRlbnNpb24oc291cmNlLCBub2RlKSB7XG4gICAgICAvLyBiYWlsIGlmIHRoZSBkZWNsYXJhdGlvbiBkb2Vzbid0IGhhdmUgYSBzb3VyY2UsIGUuZy4gXCJleHBvcnQgeyBmb28gfTtcIiwgb3IgaWYgaXQncyBvbmx5IHBhcnRpYWxseSB0eXBlZCBsaWtlIGluIGFuIGVkaXRvclxuICAgICAgaWYgKCFzb3VyY2UgfHwgIXNvdXJjZS52YWx1ZSkgeyByZXR1cm47IH1cblxuICAgICAgY29uc3QgaW1wb3J0UGF0aFdpdGhRdWVyeVN0cmluZyA9IHNvdXJjZS52YWx1ZTtcblxuICAgICAgLy8gZG9uJ3QgZW5mb3JjZSBhbnl0aGluZyBvbiBidWlsdGluc1xuICAgICAgaWYgKGlzQnVpbHRJbihpbXBvcnRQYXRoV2l0aFF1ZXJ5U3RyaW5nLCBjb250ZXh0LnNldHRpbmdzKSkgeyByZXR1cm47IH1cblxuICAgICAgY29uc3QgaW1wb3J0UGF0aCA9IGltcG9ydFBhdGhXaXRoUXVlcnlTdHJpbmcucmVwbGFjZSgvXFw/KC4qKSQvLCAnJyk7XG5cbiAgICAgIC8vIGRvbid0IGVuZm9yY2UgaW4gcm9vdCBleHRlcm5hbCBwYWNrYWdlcyBhcyB0aGV5IG1heSBoYXZlIG5hbWVzIHdpdGggYC5qc2AuXG4gICAgICAvLyBMaWtlIGBpbXBvcnQgRGVjaW1hbCBmcm9tIGRlY2ltYWwuanNgKVxuICAgICAgaWYgKGlzRXh0ZXJuYWxSb290TW9kdWxlKGltcG9ydFBhdGgpKSB7IHJldHVybjsgfVxuXG4gICAgICBjb25zdCByZXNvbHZlZFBhdGggPSByZXNvbHZlKGltcG9ydFBhdGgsIGNvbnRleHQpO1xuXG4gICAgICAvLyBnZXQgZXh0ZW5zaW9uIGZyb20gcmVzb2x2ZWQgcGF0aCwgaWYgcG9zc2libGUuXG4gICAgICAvLyBmb3IgdW5yZXNvbHZlZCwgdXNlIHNvdXJjZSB2YWx1ZS5cbiAgICAgIGNvbnN0IGV4dGVuc2lvbiA9IHBhdGguZXh0bmFtZShyZXNvbHZlZFBhdGggfHwgaW1wb3J0UGF0aCkuc3Vic3RyaW5nKDEpO1xuXG4gICAgICAvLyBkZXRlcm1pbmUgaWYgdGhpcyBpcyBhIG1vZHVsZVxuICAgICAgY29uc3QgaXNQYWNrYWdlID0gaXNFeHRlcm5hbE1vZHVsZShcbiAgICAgICAgaW1wb3J0UGF0aCxcbiAgICAgICAgcmVzb2x2ZShpbXBvcnRQYXRoLCBjb250ZXh0KSxcbiAgICAgICAgY29udGV4dCxcbiAgICAgICkgfHwgaXNTY29wZWQoaW1wb3J0UGF0aCk7XG5cbiAgICAgIGlmICghZXh0ZW5zaW9uIHx8ICFpbXBvcnRQYXRoLmVuZHNXaXRoKGAuJHtleHRlbnNpb259YCkpIHtcbiAgICAgICAgLy8gaWdub3JlIHR5cGUtb25seSBpbXBvcnRzIGFuZCBleHBvcnRzXG4gICAgICAgIGlmICghcHJvcHMuY2hlY2tUeXBlSW1wb3J0cyAmJiAobm9kZS5pbXBvcnRLaW5kID09PSAndHlwZScgfHwgbm9kZS5leHBvcnRLaW5kID09PSAndHlwZScpKSB7IHJldHVybjsgfVxuICAgICAgICBjb25zdCBleHRlbnNpb25SZXF1aXJlZCA9IGlzVXNlT2ZFeHRlbnNpb25SZXF1aXJlZChleHRlbnNpb24sIGlzUGFja2FnZSk7XG4gICAgICAgIGNvbnN0IGV4dGVuc2lvbkZvcmJpZGRlbiA9IGlzVXNlT2ZFeHRlbnNpb25Gb3JiaWRkZW4oZXh0ZW5zaW9uKTtcbiAgICAgICAgaWYgKGV4dGVuc2lvblJlcXVpcmVkICYmICFleHRlbnNpb25Gb3JiaWRkZW4pIHtcbiAgICAgICAgICBjb250ZXh0LnJlcG9ydCh7XG4gICAgICAgICAgICBub2RlOiBzb3VyY2UsXG4gICAgICAgICAgICBtZXNzYWdlOlxuICAgICAgICAgICAgICBgTWlzc2luZyBmaWxlIGV4dGVuc2lvbiAke2V4dGVuc2lvbiA/IGBcIiR7ZXh0ZW5zaW9ufVwiIGAgOiAnJ31mb3IgXCIke2ltcG9ydFBhdGhXaXRoUXVlcnlTdHJpbmd9XCJgLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGV4dGVuc2lvbikge1xuICAgICAgICBpZiAoaXNVc2VPZkV4dGVuc2lvbkZvcmJpZGRlbihleHRlbnNpb24pICYmIGlzUmVzb2x2YWJsZVdpdGhvdXRFeHRlbnNpb24oaW1wb3J0UGF0aCkpIHtcbiAgICAgICAgICBjb250ZXh0LnJlcG9ydCh7XG4gICAgICAgICAgICBub2RlOiBzb3VyY2UsXG4gICAgICAgICAgICBtZXNzYWdlOiBgVW5leHBlY3RlZCB1c2Ugb2YgZmlsZSBleHRlbnNpb24gXCIke2V4dGVuc2lvbn1cIiBmb3IgXCIke2ltcG9ydFBhdGhXaXRoUXVlcnlTdHJpbmd9XCJgLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG1vZHVsZVZpc2l0b3IoY2hlY2tGaWxlRXh0ZW5zaW9uLCB7IGNvbW1vbmpzOiB0cnVlIH0pO1xuICB9LFxufTtcbiJdfQ==+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWxlcy9leHRlbnNpb25zLmpzIl0sIm5hbWVzIjpbImVudW1WYWx1ZXMiLCJwYXR0ZXJuUHJvcGVydGllcyIsInR5cGUiLCJwcm9wZXJ0aWVzIiwicGF0dGVybiIsImNoZWNrVHlwZUltcG9ydHMiLCJpZ25vcmVQYWNrYWdlcyIsInBhdGhHcm91cE92ZXJyaWRlcyIsIml0ZW1zIiwicGF0dGVybk9wdGlvbnMiLCJhY3Rpb24iLCJhZGRpdGlvbmFsUHJvcGVydGllcyIsInJlcXVpcmVkIiwiYnVpbGRQcm9wZXJ0aWVzIiwiY29udGV4dCIsInJlc3VsdCIsImRlZmF1bHRDb25maWciLCJvcHRpb25zIiwiZm9yRWFjaCIsIm9iaiIsInVuZGVmaW5lZCIsIk9iamVjdCIsImFzc2lnbiIsIm1vZHVsZSIsImV4cG9ydHMiLCJtZXRhIiwiZG9jcyIsImNhdGVnb3J5IiwiZGVzY3JpcHRpb24iLCJ1cmwiLCJzY2hlbWEiLCJhbnlPZiIsImFkZGl0aW9uYWxJdGVtcyIsImNyZWF0ZSIsInByb3BzIiwiZ2V0TW9kaWZpZXIiLCJleHRlbnNpb24iLCJpc1VzZU9mRXh0ZW5zaW9uUmVxdWlyZWQiLCJpc1BhY2thZ2UiLCJpc1VzZU9mRXh0ZW5zaW9uRm9yYmlkZGVuIiwiaXNSZXNvbHZhYmxlV2l0aG91dEV4dGVuc2lvbiIsImZpbGUiLCJwYXRoIiwiZXh0bmFtZSIsImZpbGVXaXRob3V0RXh0ZW5zaW9uIiwic2xpY2UiLCJsZW5ndGgiLCJyZXNvbHZlZEZpbGVXaXRob3V0RXh0ZW5zaW9uIiwiaXNFeHRlcm5hbFJvb3RNb2R1bGUiLCJzbGFzaENvdW50Iiwic3BsaXQiLCJjb21wdXRlT3ZlcnJpZGVBY3Rpb24iLCJpIiwibCIsIm5vY29tbWVudCIsImNoZWNrRmlsZUV4dGVuc2lvbiIsInNvdXJjZSIsIm5vZGUiLCJ2YWx1ZSIsImltcG9ydFBhdGhXaXRoUXVlcnlTdHJpbmciLCJvdmVycmlkZUFjdGlvbiIsInNldHRpbmdzIiwiaW1wb3J0UGF0aCIsInJlcGxhY2UiLCJyZXNvbHZlZFBhdGgiLCJzdWJzdHJpbmciLCJlbmRzV2l0aCIsImltcG9ydEtpbmQiLCJleHBvcnRLaW5kIiwiZXh0ZW5zaW9uUmVxdWlyZWQiLCJleHRlbnNpb25Gb3JiaWRkZW4iLCJyZXBvcnQiLCJtZXNzYWdlIiwiY29tbW9uanMiXSwibWFwcGluZ3MiOiJhQUFBLDRCOztBQUVBLHNDO0FBQ0Esc0Q7QUFDQTtBQUNBLGtFO0FBQ0EscUM7O0FBRUEsSUFBTUEsYUFBYSxFQUFFLFFBQU0sQ0FBQyxRQUFELEVBQVcsZ0JBQVgsRUFBNkIsT0FBN0IsQ0FBUixFQUFuQjtBQUNBLElBQU1DLG9CQUFvQjtBQUN4QkMsUUFBTSxRQURrQjtBQUV4QkQscUJBQW1CLEVBQUUsTUFBTUQsVUFBUixFQUZLLEVBQTFCOztBQUlBLElBQU1HLGFBQWE7QUFDakJELFFBQU0sUUFEVztBQUVqQkMsY0FBWTtBQUNWQyxhQUFTSCxpQkFEQztBQUVWSSxzQkFBa0IsRUFBRUgsTUFBTSxTQUFSLEVBRlI7QUFHVkksb0JBQWdCLEVBQUVKLE1BQU0sU0FBUixFQUhOO0FBSVZLLHdCQUFvQjtBQUNsQkwsWUFBTSxPQURZO0FBRWxCTSxhQUFPO0FBQ0xOLGNBQU0sUUFERDtBQUVMQyxvQkFBWTtBQUNWQyxtQkFBUztBQUNQRixrQkFBTSxRQURDLEVBREM7O0FBSVZPLDBCQUFnQjtBQUNkUCxrQkFBTSxRQURRLEVBSk47O0FBT1ZRLGtCQUFRO0FBQ05SLGtCQUFNLFFBREE7QUFFTixvQkFBTSxDQUFDLFNBQUQsRUFBWSxRQUFaLENBRkEsRUFQRSxFQUZQOzs7QUFjTFMsOEJBQXNCLEtBZGpCO0FBZUxDLGtCQUFVLENBQUMsU0FBRCxFQUFZLFFBQVosQ0FmTCxFQUZXLEVBSlYsRUFGSyxFQUFuQjs7Ozs7O0FBNkJBLFNBQVNDLGVBQVQsQ0FBeUJDLE9BQXpCLEVBQWtDOztBQUVoQyxNQUFNQyxTQUFTO0FBQ2JDLG1CQUFlLE9BREY7QUFFYlosYUFBUyxFQUZJO0FBR2JFLG9CQUFnQixLQUhILEVBQWY7OztBQU1BUSxVQUFRRyxPQUFSLENBQWdCQyxPQUFoQixDQUF3QixVQUFDQyxHQUFELEVBQVM7O0FBRS9CO0FBQ0EsUUFBSSxPQUFPQSxHQUFQLEtBQWUsUUFBbkIsRUFBNkI7QUFDM0JKLGFBQU9DLGFBQVAsR0FBdUJHLEdBQXZCO0FBQ0E7QUFDRDs7QUFFRDtBQUNBLFFBQUlBLElBQUlmLE9BQUosS0FBZ0JnQixTQUFoQixJQUE2QkQsSUFBSWIsY0FBSixLQUF1QmMsU0FBcEQsSUFBaUVELElBQUlkLGdCQUFKLEtBQXlCZSxTQUE5RixFQUF5RztBQUN2R0MsYUFBT0MsTUFBUCxDQUFjUCxPQUFPWCxPQUFyQixFQUE4QmUsR0FBOUI7QUFDQTtBQUNEOztBQUVEO0FBQ0EsUUFBSUEsSUFBSWYsT0FBSixLQUFnQmdCLFNBQXBCLEVBQStCO0FBQzdCQyxhQUFPQyxNQUFQLENBQWNQLE9BQU9YLE9BQXJCLEVBQThCZSxJQUFJZixPQUFsQztBQUNEOztBQUVEO0FBQ0EsUUFBSWUsSUFBSWIsY0FBSixLQUF1QmMsU0FBM0IsRUFBc0M7QUFDcENMLGFBQU9ULGNBQVAsR0FBd0JhLElBQUliLGNBQTVCO0FBQ0Q7O0FBRUQsUUFBSWEsSUFBSWQsZ0JBQUosS0FBeUJlLFNBQTdCLEVBQXdDO0FBQ3RDTCxhQUFPVixnQkFBUCxHQUEwQmMsSUFBSWQsZ0JBQTlCO0FBQ0Q7O0FBRUQsUUFBSWMsSUFBSVosa0JBQUosS0FBMkJhLFNBQS9CLEVBQTBDO0FBQ3hDTCxhQUFPUixrQkFBUCxHQUE0QlksSUFBSVosa0JBQWhDO0FBQ0Q7QUFDRixHQS9CRDs7QUFpQ0EsTUFBSVEsT0FBT0MsYUFBUCxLQUF5QixnQkFBN0IsRUFBK0M7QUFDN0NELFdBQU9DLGFBQVAsR0FBdUIsUUFBdkI7QUFDQUQsV0FBT1QsY0FBUCxHQUF3QixJQUF4QjtBQUNEOztBQUVELFNBQU9TLE1BQVA7QUFDRDs7QUFFRFEsT0FBT0MsT0FBUCxHQUFpQjtBQUNmQyxRQUFNO0FBQ0p2QixVQUFNLFlBREY7QUFFSndCLFVBQU07QUFDSkMsZ0JBQVUsYUFETjtBQUVKQyxtQkFBYSxpRUFGVDtBQUdKQyxXQUFLLDBCQUFRLFlBQVIsQ0FIRCxFQUZGOzs7QUFRSkMsWUFBUTtBQUNOQyxhQUFPO0FBQ0w7QUFDRTdCLGNBQU0sT0FEUjtBQUVFTSxlQUFPLENBQUNSLFVBQUQsQ0FGVDtBQUdFZ0MseUJBQWlCLEtBSG5CLEVBREs7O0FBTUw7QUFDRTlCLGNBQU0sT0FEUjtBQUVFTSxlQUFPO0FBQ0xSLGtCQURLO0FBRUxHLGtCQUZLLENBRlQ7O0FBTUU2Qix5QkFBaUIsS0FObkIsRUFOSzs7QUFjTDtBQUNFOUIsY0FBTSxPQURSO0FBRUVNLGVBQU8sQ0FBQ0wsVUFBRCxDQUZUO0FBR0U2Qix5QkFBaUIsS0FIbkIsRUFkSzs7QUFtQkw7QUFDRTlCLGNBQU0sT0FEUjtBQUVFTSxlQUFPLENBQUNQLGlCQUFELENBRlQ7QUFHRStCLHlCQUFpQixLQUhuQixFQW5CSzs7QUF3Qkw7QUFDRTlCLGNBQU0sT0FEUjtBQUVFTSxlQUFPO0FBQ0xSLGtCQURLO0FBRUxDLHlCQUZLLENBRlQ7O0FBTUUrQix5QkFBaUIsS0FObkIsRUF4QkssQ0FERCxFQVJKLEVBRFM7Ozs7OztBQThDZkMsUUE5Q2UsK0JBOENSbkIsT0E5Q1EsRUE4Q0M7O0FBRWQsVUFBTW9CLFFBQVFyQixnQkFBZ0JDLE9BQWhCLENBQWQ7O0FBRUEsZUFBU3FCLFdBQVQsQ0FBcUJDLFNBQXJCLEVBQWdDO0FBQzlCLGVBQU9GLE1BQU05QixPQUFOLENBQWNnQyxTQUFkLEtBQTRCRixNQUFNbEIsYUFBekM7QUFDRDs7QUFFRCxlQUFTcUIsd0JBQVQsQ0FBa0NELFNBQWxDLEVBQTZDRSxTQUE3QyxFQUF3RDtBQUN0RCxlQUFPSCxZQUFZQyxTQUFaLE1BQTJCLFFBQTNCLEtBQXdDLENBQUNGLE1BQU01QixjQUFQLElBQXlCLENBQUNnQyxTQUFsRSxDQUFQO0FBQ0Q7O0FBRUQsZUFBU0MseUJBQVQsQ0FBbUNILFNBQW5DLEVBQThDO0FBQzVDLGVBQU9ELFlBQVlDLFNBQVosTUFBMkIsT0FBbEM7QUFDRDs7QUFFRCxlQUFTSSw0QkFBVCxDQUFzQ0MsSUFBdEMsRUFBNEM7QUFDMUMsWUFBTUwsWUFBWU0sa0JBQUtDLE9BQUwsQ0FBYUYsSUFBYixDQUFsQjtBQUNBLFlBQU1HLHVCQUF1QkgsS0FBS0ksS0FBTCxDQUFXLENBQVgsRUFBYyxDQUFDVCxVQUFVVSxNQUF6QixDQUE3QjtBQUNBLFlBQU1DLCtCQUErQiwwQkFBUUgsb0JBQVIsRUFBOEI5QixPQUE5QixDQUFyQzs7QUFFQSxlQUFPaUMsaUNBQWlDLDBCQUFRTixJQUFSLEVBQWMzQixPQUFkLENBQXhDO0FBQ0Q7O0FBRUQsZUFBU2tDLG9CQUFULENBQThCUCxJQUE5QixFQUFvQztBQUNsQyxZQUFJQSxTQUFTLEdBQVQsSUFBZ0JBLFNBQVMsSUFBN0IsRUFBbUMsQ0FBRSxPQUFPLEtBQVAsQ0FBZTtBQUNwRCxZQUFNUSxhQUFhUixLQUFLUyxLQUFMLENBQVcsR0FBWCxFQUFnQkosTUFBaEIsR0FBeUIsQ0FBNUM7O0FBRUEsWUFBSUcsZUFBZSxDQUFuQixFQUF1QixDQUFFLE9BQU8sSUFBUCxDQUFjO0FBQ3ZDLFlBQUksMEJBQVNSLElBQVQsS0FBa0JRLGNBQWMsQ0FBcEMsRUFBdUMsQ0FBRSxPQUFPLElBQVAsQ0FBYztBQUN2RCxlQUFPLEtBQVA7QUFDRDs7QUFFRCxlQUFTRSxxQkFBVCxDQUErQjVDLGtCQUEvQixFQUFtRG1DLElBQW5ELEVBQXlEO0FBQ3ZELGFBQUssSUFBSVUsSUFBSSxDQUFSLEVBQVdDLElBQUk5QyxtQkFBbUJ1QyxNQUF2QyxFQUErQ00sSUFBSUMsQ0FBbkQsRUFBc0RELEdBQXRELEVBQTJEO0FBQ2I3Qyw2QkFBbUI2QyxDQUFuQixDQURhLENBQ2pEaEQsT0FEaUQseUJBQ2pEQSxPQURpRCxDQUN4Q0ssY0FEd0MseUJBQ3hDQSxjQUR3QyxDQUN4QkMsTUFEd0IseUJBQ3hCQSxNQUR3QjtBQUV6RCxjQUFJLDRCQUFVZ0MsSUFBVixFQUFnQnRDLE9BQWhCLEVBQXlCSyxrQkFBa0IsRUFBRTZDLFdBQVcsSUFBYixFQUEzQyxDQUFKLEVBQXFFO0FBQ25FLG1CQUFPNUMsTUFBUDtBQUNEO0FBQ0Y7QUFDRjs7QUFFRCxlQUFTNkMsa0JBQVQsQ0FBNEJDLE1BQTVCLEVBQW9DQyxJQUFwQyxFQUEwQztBQUN4QztBQUNBLFlBQUksQ0FBQ0QsTUFBRCxJQUFXLENBQUNBLE9BQU9FLEtBQXZCLEVBQThCLENBQUUsT0FBUzs7QUFFekMsWUFBTUMsNEJBQTRCSCxPQUFPRSxLQUF6Qzs7QUFFQTtBQUNBLFlBQU1FLGlCQUFpQlQ7QUFDckJqQixjQUFNM0Isa0JBQU4sSUFBNEIsRUFEUDtBQUVyQm9ELGlDQUZxQixDQUF2Qjs7O0FBS0EsWUFBSUMsbUJBQW1CLFFBQXZCLEVBQWlDO0FBQy9CO0FBQ0Q7O0FBRUQ7QUFDQSxZQUFJLENBQUNBLGNBQUQsSUFBbUIsMkJBQVVELHlCQUFWLEVBQXFDN0MsUUFBUStDLFFBQTdDLENBQXZCLEVBQStFLENBQUUsT0FBUzs7QUFFMUYsWUFBTUMsYUFBYUgsMEJBQTBCSSxPQUExQixDQUFrQyxTQUFsQyxFQUE2QyxFQUE3QyxDQUFuQjs7QUFFQTtBQUNBO0FBQ0EsWUFBSSxDQUFDSCxjQUFELElBQW1CWixxQkFBcUJjLFVBQXJCLENBQXZCLEVBQXlELENBQUUsT0FBUzs7QUFFcEUsWUFBTUUsZUFBZSwwQkFBUUYsVUFBUixFQUFvQmhELE9BQXBCLENBQXJCOztBQUVBO0FBQ0E7QUFDQSxZQUFNc0IsWUFBWU0sa0JBQUtDLE9BQUwsQ0FBYXFCLGdCQUFnQkYsVUFBN0IsRUFBeUNHLFNBQXpDLENBQW1ELENBQW5ELENBQWxCOztBQUVBO0FBQ0EsWUFBTTNCLFlBQVk7QUFDaEJ3QixrQkFEZ0I7QUFFaEIsa0NBQVFBLFVBQVIsRUFBb0JoRCxPQUFwQixDQUZnQjtBQUdoQkEsZUFIZ0I7QUFJYixrQ0FBU2dELFVBQVQsQ0FKTDs7QUFNQSxZQUFJLENBQUMxQixTQUFELElBQWMsQ0FBQzBCLFdBQVdJLFFBQVgsY0FBd0I5QixTQUF4QixFQUFuQixFQUF5RDtBQUN2RDtBQUNBLGNBQUksQ0FBQ0YsTUFBTTdCLGdCQUFQLEtBQTRCb0QsS0FBS1UsVUFBTCxLQUFvQixNQUFwQixJQUE4QlYsS0FBS1csVUFBTCxLQUFvQixNQUE5RSxDQUFKLEVBQTJGLENBQUUsT0FBUztBQUN0RyxjQUFNQyxvQkFBb0JoQyx5QkFBeUJELFNBQXpCLEVBQW9DLENBQUN3QixjQUFELElBQW1CdEIsU0FBdkQsQ0FBMUI7QUFDQSxjQUFNZ0MscUJBQXFCL0IsMEJBQTBCSCxTQUExQixDQUEzQjtBQUNBLGNBQUlpQyxxQkFBcUIsQ0FBQ0Msa0JBQTFCLEVBQThDO0FBQzVDeEQsb0JBQVF5RCxNQUFSLENBQWU7QUFDYmQsb0JBQU1ELE1BRE87QUFFYmdCO0FBQzRCcEMsdUNBQWdCQSxTQUFoQixXQUFnQyxFQUQ1RCxxQkFDc0V1Qix5QkFEdEUsT0FGYSxFQUFmOztBQUtEO0FBQ0YsU0FaRCxNQVlPLElBQUl2QixTQUFKLEVBQWU7QUFDcEIsY0FBSUcsMEJBQTBCSCxTQUExQixLQUF3Q0ksNkJBQTZCc0IsVUFBN0IsQ0FBNUMsRUFBc0Y7QUFDcEZoRCxvQkFBUXlELE1BQVIsQ0FBZTtBQUNiZCxvQkFBTUQsTUFETztBQUViZ0IscUVBQThDcEMsU0FBOUMsdUJBQWlFdUIseUJBQWpFLE9BRmEsRUFBZjs7QUFJRDtBQUNGO0FBQ0Y7O0FBRUQsYUFBTyxnQ0FBY0osa0JBQWQsRUFBa0MsRUFBRWtCLFVBQVUsSUFBWixFQUFsQyxDQUFQO0FBQ0QsS0FySmMsbUJBQWpCIiwiZmlsZSI6ImV4dGVuc2lvbnMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcblxuaW1wb3J0IG1pbmltYXRjaCBmcm9tICdtaW5pbWF0Y2gnO1xuaW1wb3J0IHJlc29sdmUgZnJvbSAnZXNsaW50LW1vZHVsZS11dGlscy9yZXNvbHZlJztcbmltcG9ydCB7IGlzQnVpbHRJbiwgaXNFeHRlcm5hbE1vZHVsZSwgaXNTY29wZWQgfSBmcm9tICcuLi9jb3JlL2ltcG9ydFR5cGUnO1xuaW1wb3J0IG1vZHVsZVZpc2l0b3IgZnJvbSAnZXNsaW50LW1vZHVsZS11dGlscy9tb2R1bGVWaXNpdG9yJztcbmltcG9ydCBkb2NzVXJsIGZyb20gJy4uL2RvY3NVcmwnO1xuXG5jb25zdCBlbnVtVmFsdWVzID0geyBlbnVtOiBbJ2Fsd2F5cycsICdpZ25vcmVQYWNrYWdlcycsICduZXZlciddIH07XG5jb25zdCBwYXR0ZXJuUHJvcGVydGllcyA9IHtcbiAgdHlwZTogJ29iamVjdCcsXG4gIHBhdHRlcm5Qcm9wZXJ0aWVzOiB7ICcuKic6IGVudW1WYWx1ZXMgfSxcbn07XG5jb25zdCBwcm9wZXJ0aWVzID0ge1xuICB0eXBlOiAnb2JqZWN0JyxcbiAgcHJvcGVydGllczoge1xuICAgIHBhdHRlcm46IHBhdHRlcm5Qcm9wZXJ0aWVzLFxuICAgIGNoZWNrVHlwZUltcG9ydHM6IHsgdHlwZTogJ2Jvb2xlYW4nIH0sXG4gICAgaWdub3JlUGFja2FnZXM6IHsgdHlwZTogJ2Jvb2xlYW4nIH0sXG4gICAgcGF0aEdyb3VwT3ZlcnJpZGVzOiB7XG4gICAgICB0eXBlOiAnYXJyYXknLFxuICAgICAgaXRlbXM6IHtcbiAgICAgICAgdHlwZTogJ29iamVjdCcsXG4gICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICBwYXR0ZXJuOiB7XG4gICAgICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHBhdHRlcm5PcHRpb25zOiB7XG4gICAgICAgICAgICB0eXBlOiAnb2JqZWN0JyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGFjdGlvbjoge1xuICAgICAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgICAgICBlbnVtOiBbJ2VuZm9yY2UnLCAnaWdub3JlJ10sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgYWRkaXRpb25hbFByb3BlcnRpZXM6IGZhbHNlLFxuICAgICAgICByZXF1aXJlZDogWydwYXR0ZXJuJywgJ2FjdGlvbiddLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxufTtcblxuZnVuY3Rpb24gYnVpbGRQcm9wZXJ0aWVzKGNvbnRleHQpIHtcblxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgZGVmYXVsdENvbmZpZzogJ25ldmVyJyxcbiAgICBwYXR0ZXJuOiB7fSxcbiAgICBpZ25vcmVQYWNrYWdlczogZmFsc2UsXG4gIH07XG5cbiAgY29udGV4dC5vcHRpb25zLmZvckVhY2goKG9iaikgPT4ge1xuXG4gICAgLy8gSWYgdGhpcyBpcyBhIHN0cmluZywgc2V0IGRlZmF1bHRDb25maWcgdG8gaXRzIHZhbHVlXG4gICAgaWYgKHR5cGVvZiBvYmogPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXN1bHQuZGVmYXVsdENvbmZpZyA9IG9iajtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGlzIGlzIG5vdCB0aGUgbmV3IHN0cnVjdHVyZSwgdHJhbnNmZXIgYWxsIHByb3BzIHRvIHJlc3VsdC5wYXR0ZXJuXG4gICAgaWYgKG9iai5wYXR0ZXJuID09PSB1bmRlZmluZWQgJiYgb2JqLmlnbm9yZVBhY2thZ2VzID09PSB1bmRlZmluZWQgJiYgb2JqLmNoZWNrVHlwZUltcG9ydHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgT2JqZWN0LmFzc2lnbihyZXN1bHQucGF0dGVybiwgb2JqKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBJZiBwYXR0ZXJuIGlzIHByb3ZpZGVkLCB0cmFuc2ZlciBhbGwgcHJvcHNcbiAgICBpZiAob2JqLnBhdHRlcm4gIT09IHVuZGVmaW5lZCkge1xuICAgICAgT2JqZWN0LmFzc2lnbihyZXN1bHQucGF0dGVybiwgb2JqLnBhdHRlcm4pO1xuICAgIH1cblxuICAgIC8vIElmIGlnbm9yZVBhY2thZ2VzIGlzIHByb3ZpZGVkLCB0cmFuc2ZlciBpdCB0byByZXN1bHRcbiAgICBpZiAob2JqLmlnbm9yZVBhY2thZ2VzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJlc3VsdC5pZ25vcmVQYWNrYWdlcyA9IG9iai5pZ25vcmVQYWNrYWdlcztcbiAgICB9XG5cbiAgICBpZiAob2JqLmNoZWNrVHlwZUltcG9ydHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmVzdWx0LmNoZWNrVHlwZUltcG9ydHMgPSBvYmouY2hlY2tUeXBlSW1wb3J0cztcbiAgICB9XG5cbiAgICBpZiAob2JqLnBhdGhHcm91cE92ZXJyaWRlcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXN1bHQucGF0aEdyb3VwT3ZlcnJpZGVzID0gb2JqLnBhdGhHcm91cE92ZXJyaWRlcztcbiAgICB9XG4gIH0pO1xuXG4gIGlmIChyZXN1bHQuZGVmYXVsdENvbmZpZyA9PT0gJ2lnbm9yZVBhY2thZ2VzJykge1xuICAgIHJlc3VsdC5kZWZhdWx0Q29uZmlnID0gJ2Fsd2F5cyc7XG4gICAgcmVzdWx0Lmlnbm9yZVBhY2thZ2VzID0gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBtZXRhOiB7XG4gICAgdHlwZTogJ3N1Z2dlc3Rpb24nLFxuICAgIGRvY3M6IHtcbiAgICAgIGNhdGVnb3J5OiAnU3R5bGUgZ3VpZGUnLFxuICAgICAgZGVzY3JpcHRpb246ICdFbnN1cmUgY29uc2lzdGVudCB1c2Ugb2YgZmlsZSBleHRlbnNpb24gd2l0aGluIHRoZSBpbXBvcnQgcGF0aC4nLFxuICAgICAgdXJsOiBkb2NzVXJsKCdleHRlbnNpb25zJyksXG4gICAgfSxcblxuICAgIHNjaGVtYToge1xuICAgICAgYW55T2Y6IFtcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6ICdhcnJheScsXG4gICAgICAgICAgaXRlbXM6IFtlbnVtVmFsdWVzXSxcbiAgICAgICAgICBhZGRpdGlvbmFsSXRlbXM6IGZhbHNlLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogJ2FycmF5JyxcbiAgICAgICAgICBpdGVtczogW1xuICAgICAgICAgICAgZW51bVZhbHVlcyxcbiAgICAgICAgICAgIHByb3BlcnRpZXMsXG4gICAgICAgICAgXSxcbiAgICAgICAgICBhZGRpdGlvbmFsSXRlbXM6IGZhbHNlLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogJ2FycmF5JyxcbiAgICAgICAgICBpdGVtczogW3Byb3BlcnRpZXNdLFxuICAgICAgICAgIGFkZGl0aW9uYWxJdGVtczogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAnYXJyYXknLFxuICAgICAgICAgIGl0ZW1zOiBbcGF0dGVyblByb3BlcnRpZXNdLFxuICAgICAgICAgIGFkZGl0aW9uYWxJdGVtczogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAnYXJyYXknLFxuICAgICAgICAgIGl0ZW1zOiBbXG4gICAgICAgICAgICBlbnVtVmFsdWVzLFxuICAgICAgICAgICAgcGF0dGVyblByb3BlcnRpZXMsXG4gICAgICAgICAgXSxcbiAgICAgICAgICBhZGRpdGlvbmFsSXRlbXM6IGZhbHNlLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9LFxuICB9LFxuXG4gIGNyZWF0ZShjb250ZXh0KSB7XG5cbiAgICBjb25zdCBwcm9wcyA9IGJ1aWxkUHJvcGVydGllcyhjb250ZXh0KTtcblxuICAgIGZ1bmN0aW9uIGdldE1vZGlmaWVyKGV4dGVuc2lvbikge1xuICAgICAgcmV0dXJuIHByb3BzLnBhdHRlcm5bZXh0ZW5zaW9uXSB8fCBwcm9wcy5kZWZhdWx0Q29uZmlnO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzVXNlT2ZFeHRlbnNpb25SZXF1aXJlZChleHRlbnNpb24sIGlzUGFja2FnZSkge1xuICAgICAgcmV0dXJuIGdldE1vZGlmaWVyKGV4dGVuc2lvbikgPT09ICdhbHdheXMnICYmICghcHJvcHMuaWdub3JlUGFja2FnZXMgfHwgIWlzUGFja2FnZSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNVc2VPZkV4dGVuc2lvbkZvcmJpZGRlbihleHRlbnNpb24pIHtcbiAgICAgIHJldHVybiBnZXRNb2RpZmllcihleHRlbnNpb24pID09PSAnbmV2ZXInO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzUmVzb2x2YWJsZVdpdGhvdXRFeHRlbnNpb24oZmlsZSkge1xuICAgICAgY29uc3QgZXh0ZW5zaW9uID0gcGF0aC5leHRuYW1lKGZpbGUpO1xuICAgICAgY29uc3QgZmlsZVdpdGhvdXRFeHRlbnNpb24gPSBmaWxlLnNsaWNlKDAsIC1leHRlbnNpb24ubGVuZ3RoKTtcbiAgICAgIGNvbnN0IHJlc29sdmVkRmlsZVdpdGhvdXRFeHRlbnNpb24gPSByZXNvbHZlKGZpbGVXaXRob3V0RXh0ZW5zaW9uLCBjb250ZXh0KTtcblxuICAgICAgcmV0dXJuIHJlc29sdmVkRmlsZVdpdGhvdXRFeHRlbnNpb24gPT09IHJlc29sdmUoZmlsZSwgY29udGV4dCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNFeHRlcm5hbFJvb3RNb2R1bGUoZmlsZSkge1xuICAgICAgaWYgKGZpbGUgPT09ICcuJyB8fCBmaWxlID09PSAnLi4nKSB7IHJldHVybiBmYWxzZTsgfVxuICAgICAgY29uc3Qgc2xhc2hDb3VudCA9IGZpbGUuc3BsaXQoJy8nKS5sZW5ndGggLSAxO1xuXG4gICAgICBpZiAoc2xhc2hDb3VudCA9PT0gMCkgIHsgcmV0dXJuIHRydWU7IH1cbiAgICAgIGlmIChpc1Njb3BlZChmaWxlKSAmJiBzbGFzaENvdW50IDw9IDEpIHsgcmV0dXJuIHRydWU7IH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjb21wdXRlT3ZlcnJpZGVBY3Rpb24ocGF0aEdyb3VwT3ZlcnJpZGVzLCBwYXRoKSB7XG4gICAgICBmb3IgKGxldCBpID0gMCwgbCA9IHBhdGhHcm91cE92ZXJyaWRlcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgY29uc3QgeyBwYXR0ZXJuLCBwYXR0ZXJuT3B0aW9ucywgYWN0aW9uIH0gPSBwYXRoR3JvdXBPdmVycmlkZXNbaV07XG4gICAgICAgIGlmIChtaW5pbWF0Y2gocGF0aCwgcGF0dGVybiwgcGF0dGVybk9wdGlvbnMgfHwgeyBub2NvbW1lbnQ6IHRydWUgfSkpIHtcbiAgICAgICAgICByZXR1cm4gYWN0aW9uO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY2hlY2tGaWxlRXh0ZW5zaW9uKHNvdXJjZSwgbm9kZSkge1xuICAgICAgLy8gYmFpbCBpZiB0aGUgZGVjbGFyYXRpb24gZG9lc24ndCBoYXZlIGEgc291cmNlLCBlLmcuIFwiZXhwb3J0IHsgZm9vIH07XCIsIG9yIGlmIGl0J3Mgb25seSBwYXJ0aWFsbHkgdHlwZWQgbGlrZSBpbiBhbiBlZGl0b3JcbiAgICAgIGlmICghc291cmNlIHx8ICFzb3VyY2UudmFsdWUpIHsgcmV0dXJuOyB9XG5cbiAgICAgIGNvbnN0IGltcG9ydFBhdGhXaXRoUXVlcnlTdHJpbmcgPSBzb3VyY2UudmFsdWU7XG5cbiAgICAgIC8vIElmIG5vdCB1bmRlZmluZWQsIHRoZSB1c2VyIGRlY2lkZWQgaWYgcnVsZXMgYXJlIGVuZm9yY2VkIG9uIHRoaXMgaW1wb3J0XG4gICAgICBjb25zdCBvdmVycmlkZUFjdGlvbiA9IGNvbXB1dGVPdmVycmlkZUFjdGlvbihcbiAgICAgICAgcHJvcHMucGF0aEdyb3VwT3ZlcnJpZGVzIHx8IFtdLFxuICAgICAgICBpbXBvcnRQYXRoV2l0aFF1ZXJ5U3RyaW5nLFxuICAgICAgKTtcblxuICAgICAgaWYgKG92ZXJyaWRlQWN0aW9uID09PSAnaWdub3JlJykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIGRvbid0IGVuZm9yY2UgYW55dGhpbmcgb24gYnVpbHRpbnNcbiAgICAgIGlmICghb3ZlcnJpZGVBY3Rpb24gJiYgaXNCdWlsdEluKGltcG9ydFBhdGhXaXRoUXVlcnlTdHJpbmcsIGNvbnRleHQuc2V0dGluZ3MpKSB7IHJldHVybjsgfVxuXG4gICAgICBjb25zdCBpbXBvcnRQYXRoID0gaW1wb3J0UGF0aFdpdGhRdWVyeVN0cmluZy5yZXBsYWNlKC9cXD8oLiopJC8sICcnKTtcblxuICAgICAgLy8gZG9uJ3QgZW5mb3JjZSBpbiByb290IGV4dGVybmFsIHBhY2thZ2VzIGFzIHRoZXkgbWF5IGhhdmUgbmFtZXMgd2l0aCBgLmpzYC5cbiAgICAgIC8vIExpa2UgYGltcG9ydCBEZWNpbWFsIGZyb20gZGVjaW1hbC5qc2ApXG4gICAgICBpZiAoIW92ZXJyaWRlQWN0aW9uICYmIGlzRXh0ZXJuYWxSb290TW9kdWxlKGltcG9ydFBhdGgpKSB7IHJldHVybjsgfVxuXG4gICAgICBjb25zdCByZXNvbHZlZFBhdGggPSByZXNvbHZlKGltcG9ydFBhdGgsIGNvbnRleHQpO1xuXG4gICAgICAvLyBnZXQgZXh0ZW5zaW9uIGZyb20gcmVzb2x2ZWQgcGF0aCwgaWYgcG9zc2libGUuXG4gICAgICAvLyBmb3IgdW5yZXNvbHZlZCwgdXNlIHNvdXJjZSB2YWx1ZS5cbiAgICAgIGNvbnN0IGV4dGVuc2lvbiA9IHBhdGguZXh0bmFtZShyZXNvbHZlZFBhdGggfHwgaW1wb3J0UGF0aCkuc3Vic3RyaW5nKDEpO1xuXG4gICAgICAvLyBkZXRlcm1pbmUgaWYgdGhpcyBpcyBhIG1vZHVsZVxuICAgICAgY29uc3QgaXNQYWNrYWdlID0gaXNFeHRlcm5hbE1vZHVsZShcbiAgICAgICAgaW1wb3J0UGF0aCxcbiAgICAgICAgcmVzb2x2ZShpbXBvcnRQYXRoLCBjb250ZXh0KSxcbiAgICAgICAgY29udGV4dCxcbiAgICAgICkgfHwgaXNTY29wZWQoaW1wb3J0UGF0aCk7XG5cbiAgICAgIGlmICghZXh0ZW5zaW9uIHx8ICFpbXBvcnRQYXRoLmVuZHNXaXRoKGAuJHtleHRlbnNpb259YCkpIHtcbiAgICAgICAgLy8gaWdub3JlIHR5cGUtb25seSBpbXBvcnRzIGFuZCBleHBvcnRzXG4gICAgICAgIGlmICghcHJvcHMuY2hlY2tUeXBlSW1wb3J0cyAmJiAobm9kZS5pbXBvcnRLaW5kID09PSAndHlwZScgfHwgbm9kZS5leHBvcnRLaW5kID09PSAndHlwZScpKSB7IHJldHVybjsgfVxuICAgICAgICBjb25zdCBleHRlbnNpb25SZXF1aXJlZCA9IGlzVXNlT2ZFeHRlbnNpb25SZXF1aXJlZChleHRlbnNpb24sICFvdmVycmlkZUFjdGlvbiAmJiBpc1BhY2thZ2UpO1xuICAgICAgICBjb25zdCBleHRlbnNpb25Gb3JiaWRkZW4gPSBpc1VzZU9mRXh0ZW5zaW9uRm9yYmlkZGVuKGV4dGVuc2lvbik7XG4gICAgICAgIGlmIChleHRlbnNpb25SZXF1aXJlZCAmJiAhZXh0ZW5zaW9uRm9yYmlkZGVuKSB7XG4gICAgICAgICAgY29udGV4dC5yZXBvcnQoe1xuICAgICAgICAgICAgbm9kZTogc291cmNlLFxuICAgICAgICAgICAgbWVzc2FnZTpcbiAgICAgICAgICAgICAgYE1pc3NpbmcgZmlsZSBleHRlbnNpb24gJHtleHRlbnNpb24gPyBgXCIke2V4dGVuc2lvbn1cIiBgIDogJyd9Zm9yIFwiJHtpbXBvcnRQYXRoV2l0aFF1ZXJ5U3RyaW5nfVwiYCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChleHRlbnNpb24pIHtcbiAgICAgICAgaWYgKGlzVXNlT2ZFeHRlbnNpb25Gb3JiaWRkZW4oZXh0ZW5zaW9uKSAmJiBpc1Jlc29sdmFibGVXaXRob3V0RXh0ZW5zaW9uKGltcG9ydFBhdGgpKSB7XG4gICAgICAgICAgY29udGV4dC5yZXBvcnQoe1xuICAgICAgICAgICAgbm9kZTogc291cmNlLFxuICAgICAgICAgICAgbWVzc2FnZTogYFVuZXhwZWN0ZWQgdXNlIG9mIGZpbGUgZXh0ZW5zaW9uIFwiJHtleHRlbnNpb259XCIgZm9yIFwiJHtpbXBvcnRQYXRoV2l0aFF1ZXJ5U3RyaW5nfVwiYCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBtb2R1bGVWaXNpdG9yKGNoZWNrRmlsZUV4dGVuc2lvbiwgeyBjb21tb25qczogdHJ1ZSB9KTtcbiAgfSxcbn07XG4iXX0=
lib/rules/order.js +278 lines
--- +++ @@ -418,3 +418,3 @@ /** Some parsers (languages without types) don't provide ImportKind */-var DEAFULT_IMPORT_KIND = 'value';+var DEFAULT_IMPORT_KIND = 'value'; var getNormalizedValue = function getNormalizedValue(node, toLowerCase) {@@ -464,4 +464,4 @@         result = multiplierImportKind * compareString(-        nodeA.node.importKind || DEAFULT_IMPORT_KIND,-        nodeB.node.importKind || DEAFULT_IMPORT_KIND);+        nodeA.node.importKind || DEFAULT_IMPORT_KIND,+        nodeB.node.importKind || DEFAULT_IMPORT_KIND); @@ -515,8 +515,13 @@ -function computeRank(context, ranks, importEntry, excludedImportTypes) {+function computeRank(context, ranks, importEntry, excludedImportTypes, isSortingTypesGroup) {   var impType = void 0;   var rank = void 0;++  var isTypeGroupInGroups = ranks.omittedTypes.indexOf('type') === -1;+  var isTypeOnlyImport = importEntry.node.importKind === 'type';+  var isExcludedFromPathRank = isTypeOnlyImport && isTypeGroupInGroups && excludedImportTypes.has('type');+   if (importEntry.type === 'import:object') {     impType = 'object';-  } else if (importEntry.node.importKind === 'type' && ranks.omittedTypes.indexOf('type') === -1) {+  } else if (isTypeOnlyImport && isTypeGroupInGroups && !isSortingTypesGroup) {     impType = 'type';@@ -525,8 +530,19 @@   }-  if (!excludedImportTypes.has(impType)) {++  if (!excludedImportTypes.has(impType) && !isExcludedFromPathRank) {     rank = computePathRank(ranks.groups, ranks.pathGroups, importEntry.value, ranks.maxPosition);   }+   if (typeof rank === 'undefined') {     rank = ranks.groups[impType];-  }++    if (typeof rank === 'undefined') {+      return -1;+    }+  }++  if (isTypeOnlyImport && isSortingTypesGroup) {+    rank = ranks.groups.type + rank / 10;+  }+   if (importEntry.type !== 'import' && !importEntry.type.startsWith('import:')) {@@ -538,6 +554,16 @@ -function registerNode(context, importEntry, ranks, imported, excludedImportTypes) {-  var rank = computeRank(context, ranks, importEntry, excludedImportTypes);+function registerNode(context, importEntry, ranks, imported, excludedImportTypes, isSortingTypesGroup) {+  var rank = computeRank(context, ranks, importEntry, excludedImportTypes, isSortingTypesGroup);   if (rank !== -1) {-    imported.push(Object.assign({}, importEntry, { rank: rank }));+    var importNode = importEntry.node;++    if (importEntry.type === 'require' && importNode.parent.parent.type === 'VariableDeclaration') {+      importNode = importNode.parent.parent;+    }++    imported.push(Object.assign({},+    importEntry, {+      rank: rank,+      isMultiline: importNode.loc.end.line !== importNode.loc.start.line }));+   }@@ -566,5 +592,7 @@ -// Creates an object with type-rank pairs.-// Example: { index: 0, sibling: 1, parent: 1, external: 1, builtin: 2, internal: 2 }-// Will throw an error if it contains a type that does not exist, or has a duplicate+/**+                                                                                                             * Creates an object with type-rank pairs.+                                                                                                             *+                                                                                                             * Example: { index: 0, sibling: 1, parent: 1, external: 1, builtin: 2, internal: 2 }+                                                                                                             */ function convertGroupsToRanks(groups) {@@ -572,8 +600,2 @@     [].concat(group).forEach(function (groupItem) {-      if (types.indexOf(groupItem) === -1) {-        throw new Error('Incorrect configuration of the rule: Unknown type `' + String(JSON.stringify(groupItem)) + '`');-      }-      if (res[groupItem] !== undefined) {-        throw new Error('Incorrect configuration of the rule: `' + String(groupItem) + '` is duplicated');-      }       res[groupItem] = index * 2;@@ -667,3 +689,3 @@ -function makeNewlinesBetweenReport(context, imported, newlinesBetweenImports, distinctGroup) {+function makeNewlinesBetweenReport(context, imported, newlinesBetweenImports_, newlinesBetweenTypeOnlyImports_, distinctGroup, isSortingTypesGroup, isConsolidatingSpaceBetweenImports) {   var getNumberOfEmptyLinesBetween = function getNumberOfEmptyLinesBetween(currentImport, previousImport) {@@ -680,21 +702,118 @@   imported.slice(1).forEach(function (currentImport) {-    var emptyLinesBetween = getNumberOfEmptyLinesBetween(currentImport, previousImport);-    var isStartOfDistinctGroup = getIsStartOfDistinctGroup(currentImport, previousImport);--    if (newlinesBetweenImports === 'always' ||-    newlinesBetweenImports === 'always-and-inside-groups') {-      if (currentImport.rank !== previousImport.rank && emptyLinesBetween === 0) {-        if (distinctGroup || !distinctGroup && isStartOfDistinctGroup) {+    var emptyLinesBetween = getNumberOfEmptyLinesBetween(+    currentImport,+    previousImport);+++    var isStartOfDistinctGroup = getIsStartOfDistinctGroup(+    currentImport,+    previousImport);+++    var isTypeOnlyImport = currentImport.node.importKind === 'type';+    var isPreviousImportTypeOnlyImport = previousImport.node.importKind === 'type';++    var isNormalImportNextToTypeOnlyImportAndRelevant = isTypeOnlyImport !== isPreviousImportTypeOnlyImport && isSortingTypesGroup;++    var isTypeOnlyImportAndRelevant = isTypeOnlyImport && isSortingTypesGroup;++    // In the special case where newlinesBetweenImports and consolidateIslands+    // want the opposite thing, consolidateIslands wins+    var newlinesBetweenImports = isSortingTypesGroup &&+    isConsolidatingSpaceBetweenImports && (+    previousImport.isMultiline || currentImport.isMultiline) &&+    newlinesBetweenImports_ === 'never' ?+    'always-and-inside-groups' :+    newlinesBetweenImports_;++    // In the special case where newlinesBetweenTypeOnlyImports and+    // consolidateIslands want the opposite thing, consolidateIslands wins+    var newlinesBetweenTypeOnlyImports = isSortingTypesGroup &&+    isConsolidatingSpaceBetweenImports && (+    isNormalImportNextToTypeOnlyImportAndRelevant ||+    previousImport.isMultiline ||+    currentImport.isMultiline) &&+    newlinesBetweenTypeOnlyImports_ === 'never' ?+    'always-and-inside-groups' :+    newlinesBetweenTypeOnlyImports_;++    var isNotIgnored = isTypeOnlyImportAndRelevant &&+    newlinesBetweenTypeOnlyImports !== 'ignore' ||+    !isTypeOnlyImportAndRelevant && newlinesBetweenImports !== 'ignore';++    if (isNotIgnored) {+      var shouldAssertNewlineBetweenGroups = (isTypeOnlyImportAndRelevant || isNormalImportNextToTypeOnlyImportAndRelevant) && (+      newlinesBetweenTypeOnlyImports === 'always' ||+      newlinesBetweenTypeOnlyImports === 'always-and-inside-groups') ||+      !isTypeOnlyImportAndRelevant && !isNormalImportNextToTypeOnlyImportAndRelevant && (+      newlinesBetweenImports === 'always' ||+      newlinesBetweenImports === 'always-and-inside-groups');++      var shouldAssertNoNewlineWithinGroup = (isTypeOnlyImportAndRelevant || isNormalImportNextToTypeOnlyImportAndRelevant) &&+      newlinesBetweenTypeOnlyImports !== 'always-and-inside-groups' ||+      !isTypeOnlyImportAndRelevant && !isNormalImportNextToTypeOnlyImportAndRelevant &&+      newlinesBetweenImports !== 'always-and-inside-groups';++      var shouldAssertNoNewlineBetweenGroup = !isSortingTypesGroup ||+      !isNormalImportNextToTypeOnlyImportAndRelevant ||+      newlinesBetweenTypeOnlyImports === 'never';++      var isTheNewlineBetweenImportsInTheSameGroup = distinctGroup && currentImport.rank === previousImport.rank ||+      !distinctGroup && !isStartOfDistinctGroup;++      // Let's try to cut down on linting errors sent to the user+      var alreadyReported = false;++      if (shouldAssertNewlineBetweenGroups) {+        if (currentImport.rank !== previousImport.rank && emptyLinesBetween === 0) {+          if (distinctGroup || isStartOfDistinctGroup) {+            alreadyReported = true;+            context.report({+              node: previousImport.node,+              message: 'There should be at least one empty line between import groups',+              fix: fixNewLineAfterImport(context, previousImport) });++          }+        } else if (emptyLinesBetween > 0 && shouldAssertNoNewlineWithinGroup) {+          if (isTheNewlineBetweenImportsInTheSameGroup) {+            alreadyReported = true;+            context.report({+              node: previousImport.node,+              message: 'There should be no empty line within import group',+              fix: removeNewLineAfterImport(context, currentImport, previousImport) });++          }+        }+      } else if (emptyLinesBetween > 0 && shouldAssertNoNewlineBetweenGroup) {+        alreadyReported = true;+        context.report({+          node: previousImport.node,+          message: 'There should be no empty line between import groups',+          fix: removeNewLineAfterImport(context, currentImport, previousImport) });++      }++      if (!alreadyReported && isConsolidatingSpaceBetweenImports) {+        if (emptyLinesBetween === 0 && currentImport.isMultiline) {           context.report({             node: previousImport.node,-            message: 'There should be at least one empty line between import groups',+            message: 'There should be at least one empty line between this import and the multi-line import that follows it',             fix: fixNewLineAfterImport(context, previousImport) }); -        }-      } else if (emptyLinesBetween > 0 &&-      newlinesBetweenImports !== 'always-and-inside-groups') {-        if (distinctGroup && currentImport.rank === previousImport.rank || !distinctGroup && !isStartOfDistinctGroup) {+        } else if (emptyLinesBetween === 0 && previousImport.isMultiline) {           context.report({             node: previousImport.node,-            message: 'There should be no empty line within import group',+            message: 'There should be at least one empty line between this multi-line import and the import that follows it',+            fix: fixNewLineAfterImport(context, previousImport) });++        } else if (+        emptyLinesBetween > 0 &&+        !previousImport.isMultiline &&+        !currentImport.isMultiline &&+        isTheNewlineBetweenImportsInTheSameGroup)+        {+          context.report({+            node: previousImport.node,+            message:+            'There should be no empty lines between this single-line import and the single-line import that follows it',             fix: removeNewLineAfterImport(context, currentImport, previousImport) });@@ -703,8 +822,2 @@       }-    } else if (emptyLinesBetween > 0) {-      context.report({-        node: previousImport.node,-        message: 'There should be no empty line between import groups',-        fix: removeNewLineAfterImport(context, currentImport, previousImport) });-     }@@ -742,3 +855,14 @@         groups: {-          type: 'array' },+          type: 'array',+          uniqueItems: true,+          items: {+            oneOf: [+            { 'enum': types },+            {+              type: 'array',+              uniqueItems: true,+              items: { 'enum': types } }] } },
… 156 more lines (truncated)
package.json +17 lines
--- +++ @@ -2,3 +2,3 @@   "name": "eslint-plugin-import",-  "version": "2.31.0",+  "version": "2.32.0",   "description": "Import with sanity.",@@ -8,2 +8,3 @@   "main": "lib/index.js",+  "types": "index.d.ts",   "directories": {@@ -18,3 +19,4 @@     "config",-    "memo-parser/{*.js,LICENSE,*.md}"+    "memo-parser/{*.js,LICENSE,*.md}",+    "index.d.ts"   ],@@ -33,5 +35,7 @@     "test-all": "node --require babel-register ./scripts/testAll",-    "test-examples": "npm run build && npm run test-example:legacy && npm run test-example:flat",+    "test-examples": "npm run build && npm run test-example:legacy && npm run test-example:flat && npm run test-example:v9",     "test-example:legacy": "cd examples/legacy && npm install && npm run lint",     "test-example:flat": "cd examples/flat && npm install && npm run lint",+    "test-example:v9": "cd examples/v9 && npm install && npm run lint",+    "test-types": "npx --package typescript@latest tsc --noEmit index.d.ts",     "prepublishOnly": "safe-publish-latest && npm run build",@@ -65,2 +69,3 @@     "@test-scope/some-module": "file:./tests/files/symlinked-module",+    "@types/eslint": "^8.56.12",     "@typescript-eslint/parser": "^2.23.0 || ^3.3.0 || ^4.29.3 || ^5.10.0",@@ -104,2 +109,3 @@     "sinon": "^2.4.1",+    "tmp": "^0.2.1",     "typescript": "^2.8.1 || ~3.9.5 || ~4.5.2",@@ -112,6 +118,6 @@     "@rtsao/scc": "^1.1.0",-    "array-includes": "^3.1.8",-    "array.prototype.findlastindex": "^1.2.5",-    "array.prototype.flat": "^1.3.2",-    "array.prototype.flatmap": "^1.3.2",+    "array-includes": "^3.1.9",+    "array.prototype.findlastindex": "^1.2.6",+    "array.prototype.flat": "^1.3.3",+    "array.prototype.flatmap": "^1.3.3",     "debug": "^3.2.7",@@ -119,5 +125,5 @@     "eslint-import-resolver-node": "^0.3.9",-    "eslint-module-utils": "^2.12.0",+    "eslint-module-utils": "^2.12.1",     "hasown": "^2.0.2",-    "is-core-module": "^2.15.1",+    "is-core-module": "^2.16.1",     "is-glob": "^4.0.3",@@ -126,5 +132,5 @@     "object.groupby": "^1.0.3",-    "object.values": "^1.2.0",+    "object.values": "^1.2.1",     "semver": "^6.3.1",-    "string.prototype.trimend": "^1.0.8",+    "string.prototype.trimend": "^1.0.9",     "tsconfig-paths": "^3.15.0"
event-stream npm
4.0.1 7y ago incident on record
DELETIONBURST ×10
latest 4.0.1 versions 84 maintainers 1
3.2.0
3.2.1
3.2.2
3.3.0
3.3.1
3.3.2
3.3.3
3.3.4
3.3.5
3.3.6
4.0.0
4.0.1
DELETION
3.3.6 published then removed
high · registry-verified · 2018-09-09 · 7y ago
BURST
2 releases in 43m: 0.5.2, 0.5.3
info · registry-verified · 2011-11-01 · 14y ago
BURST
8 releases in 0m: 0.1.0, 0.2.0, 0.2.1, 0.3.0, 0.4.0, 0.5.0, 0.5.1, 0.7.0
info · registry-verified · 2011-12-07 · 14y ago
BURST
2 releases in 10m: 0.9.0, 0.9.1
info · registry-verified · 2012-04-21 · 14y ago
BURST
3 releases in 39m: 0.9.4, 0.9.6, 0.9.7
info · registry-verified · 2012-04-25 · 14y ago
BURST
2 releases in 38m: 1.0.0, 1.1.0
info · registry-verified · 2012-05-21 · 14y ago
BURST
3 releases in 15m: 2.0.1, 2.0.2, 2.0.3
info · registry-verified · 2012-06-12 · 13y ago
BURST
2 releases in 41m: 2.1.3, 2.1.4
info · registry-verified · 2012-07-04 · 13y ago
BURST
2 releases in 28m: 2.2.3, 3.0.0
info · registry-verified · 2012-08-18 · 13y ago
BURST
2 releases in 4m: 3.0.6, 3.0.7
info · registry-verified · 2012-09-30 · 13y ago
BURST
2 releases in 16m: 3.0.17, 3.0.18
info · registry-verified · 2013-12-04 · 12y ago
release diff 4.0.0 → 4.0.1
+0 added · -0 removed · ~2 modified
package.json +4 lines
--- +++ @@ -2,3 +2,3 @@   "name": "event-stream",-  "version": "4.0.0",+  "version": "4.0.1",   "description": "construct pipes of streams of events",@@ -30,23 +30,5 @@   },-  "testling": {-    "files": "test/*.js",-    "browsers": {-      "ie": [-        8,-        9-      ],-      "firefox": [-        13-      ],-      "chrome": [-        20-      ],-      "safari": [-        5.1-      ],-      "opera": [-        12-      ]-    }-  },+  "keywords": [+    "stream", "map", "flatmap", "filter", "split", "join", "merge", "replace"+  ],   "license": "MIT",
husky npm
9.1.7 1y ago incident on record
DELETION ×13BURST ×13
latest 9.1.7 versions 215 maintainers 1
9.0.8
9.0.9
9.0.10
9.0.11
9.1.0
9.1.1
9.1.2
9.1.3
9.1.4
9.1.5
9.1.6
9.1.7
DELETION
0.1.0 published then removed
high · registry-verified · 2014-06-09 · 11y ago
DELETION
0.1.1 published then removed
high · registry-verified · 2014-06-09 · 11y ago
DELETION
0.1.2 published then removed
high · registry-verified · 2014-06-09 · 11y ago
DELETION
0.1.3 published then removed
high · registry-verified · 2014-06-09 · 11y ago
DELETION
0.1.4 published then removed
high · registry-verified · 2014-06-10 · 11y ago
DELETION
0.1.5 published then removed
high · registry-verified · 2014-06-10 · 11y ago
DELETION
0.2.0 published then removed
high · registry-verified · 2014-06-16 · 11y ago
DELETION
0.2.1 published then removed
high · registry-verified · 2014-06-16 · 11y ago
DELETION
0.2.3 published then removed
high · registry-verified · 2014-06-18 · 11y ago
DELETION
0.3.0 published then removed
high · registry-verified · 2014-06-23 · 11y ago
DELETION
0.3.1 published then removed
high · registry-verified · 2014-06-23 · 11y ago
DELETION
0.3.2 published then removed
high · registry-verified · 2014-06-23 · 11y ago
DELETION
0.3.3 published then removed
high · registry-verified · 2014-06-23 · 11y ago
BURST
4 releases in 20m: 0.1.0, 0.1.1, 0.1.2, 0.1.3
info · registry-verified · 2014-06-09 · 11y ago
BURST
2 releases in 8m: 0.3.0, 0.3.1
info · registry-verified · 2014-06-23 · 11y ago
BURST
2 releases in 10m: 0.3.3, 0.4.0
info · registry-verified · 2014-06-23 · 11y ago
BURST
3 releases in 49m: 0.4.1, 0.4.2, 0.4.3
info · registry-verified · 2014-06-23 · 11y ago
BURST
2 releases in 59m: 0.9.0, 0.9.1
info · registry-verified · 2015-07-22 · 10y ago
BURST
2 releases in 51m: 3.0.6, 3.0.7
info · registry-verified · 2019-09-28 · 6y ago
BURST
2 releases in 20m: 4.0.2, 4.0.3
info · registry-verified · 2020-01-09 · 6y ago
BURST
3 releases in 51m: 5.0.2, 5.0.3, 5.0.4
info · registry-verified · 2020-11-22 · 5y ago
BURST
2 releases in 2m: 4.3.2, 4.3.3
info · registry-verified · 2020-12-05 · 5y ago
BURST
2 releases in 9m: 5.0.5, 5.0.6
info · registry-verified · 2020-12-11 · 5y ago
BURST
2 releases in 9m: 7.0.3, 7.0.4
info · registry-verified · 2021-10-21 · 4y ago
BURST
2 releases in 48m: 9.0.3, 9.0.4
info · registry-verified · 2024-01-25 · 2y ago
BURST
2 releases in 42m: 9.0.8, 9.0.9
info · registry-verified · 2024-02-01 · 2y ago
release diff 9.1.6 → 9.1.7
+0 added · -0 removed · ~2 modified
bin.js +1 lines
--- +++ @@ -21,3 +21,3 @@ -d = c => console.error(`${c} command is DEPRECATED`)+d = c => console.error(`husky - ${c} command is DEPRECATED`) if (['add', 'set', 'uninstall'].includes(a)) { d(a); p.exit(1) }
package.json +1 lines
--- +++ @@ -2,3 +2,3 @@ 	"name": "husky",-	"version": "9.1.6",+	"version": "9.1.7", 	"type": "module",
mocha npm
11.7.6 10d ago incident on record
critical-tier DELETIONBURST
latest 11.7.6 versions 238 maintainers 2 critical-tier (snapshotted)
11.2.2
11.3.0
11.4.0
11.5.0
11.6.0
11.7.0
11.7.1
11.7.2
11.7.3
11.7.4
11.7.5
11.7.6
DELETION
3.4.0 published then removed
high · registry-verified · 2017-05-14 · 9y ago
BURST
2 releases in 46m: 1.4.3, 1.5.0
info · registry-verified · 2012-09-21 · 13y ago
release diff 11.7.5 → 11.7.6
+0 added · -0 removed · ~67 modified
+38 more files not shown
bin/mocha.js +46 lines · 1 flagged
--- +++ @@ -2,3 +2,3 @@ -'use strict';+"use strict"; @@ -12,4 +12,4 @@ -const os = require('node:os');-const {loadOptions} = require('../lib/cli/options');+const os = require("node:os");+const { loadOptions } = require("../lib/cli/options"); const {@@ -17,7 +17,7 @@   isNodeFlag,-  impliesNoTimeouts-} = require('../lib/cli/node-flags');-const unparse = require('yargs-unparser');-const debug = require('debug')('mocha:cli:mocha');-const {aliases} = require('../lib/cli/run-option-metadata');+  impliesNoTimeouts,+} = require("../lib/cli/node-flags");+const unparse = require("yargs-unparser");+const debug = require("debug")("mocha:cli:mocha");+const { aliases } = require("../lib/cli/run-option-metadata"); @@ -29,3 +29,3 @@ const opts = loadOptions(process.argv.slice(2));-debug('loaded opts', opts);+debug("loaded opts", opts); @@ -36,5 +36,5 @@  */-const disableTimeouts = value => {+const disableTimeouts = (value) => {   if (impliesNoTimeouts(value)) {-    debug('option %s disabled timeouts', value);+    debug("option %s disabled timeouts", value);     mochaArgs.timeout = 0;@@ -49,7 +49,7 @@  */-const trimV8Option = value =>-  value !== 'v8-options' && /^v8-/.test(value) ? value.slice(3) : value;+const trimV8Option = (value) =>+  value !== "v8-options" && /^v8-/.test(value) ? value.slice(3) : value;  // sort options into "node" and "mocha" buckets-Object.keys(opts).forEach(opt => {+Object.keys(opts).forEach((opt) => {   if (isNodeFlag(opt)) {@@ -62,5 +62,5 @@ // disable 'timeout' for debugFlags-Object.keys(nodeArgs).forEach(opt => disableTimeouts(opt));-mochaArgs['node-option'] &&-  mochaArgs['node-option'].forEach(opt => disableTimeouts(opt));+Object.keys(nodeArgs).forEach((opt) => disableTimeouts(opt));+mochaArgs["node-option"] &&+  mochaArgs["node-option"].forEach((opt) => disableTimeouts(opt)); @@ -73,6 +73,6 @@ if (mochaArgs._) {-  const i = mochaArgs._.findIndex(val => val === 'inspect');+  const i = mochaArgs._.findIndex((val) => val === "inspect");   if (i > -1) {     mochaArgs._.splice(i, 1);-    disableTimeouts('inspect');+    disableTimeouts("inspect");     hasInspect = true;@@ -81,14 +81,15 @@ -if (mochaArgs['node-option'] || Object.keys(nodeArgs).length || hasInspect) {-  const {spawn} = require('node:child_process');-  const mochaPath = require.resolve('../lib/cli/cli.js');+if (mochaArgs["node-option"] || Object.keys(nodeArgs).length || hasInspect) {+  const { spawn } = require("node:child_process");+  const mochaPath = require.resolve("../lib/cli/cli.js");    const nodeArgv =-    (mochaArgs['node-option'] && mochaArgs['node-option'].map(v => '--' + v)) ||+    (mochaArgs["node-option"] &&+      mochaArgs["node-option"].map((v) => "--" + v)) ||     unparseNodeFlags(nodeArgs); -  if (hasInspect) nodeArgv.unshift('inspect');-  delete mochaArgs['node-option'];+  if (hasInspect) nodeArgv.unshift("inspect");+  delete mochaArgs["node-option"]; -  debug('final node argv', nodeArgv);+  debug("final node argv", nodeArgv); @@ -97,3 +98,3 @@     mochaPath,-    unparse(mochaArgs, {alias: aliases})+    unparse(mochaArgs, { alias: aliases }),   );@@ -101,5 +102,5 @@   debug(-    'forking child process via command: %s %s',+    "forking child process via command: %s %s",     process.execPath,-    args.join(' ')+    args.join(" "),   );@@ -107,10 +108,11 @@   const proc = spawn(process.execPath, args, {-    stdio: 'inherit'+    stdio: "inherit",   }); -  proc.on('exit', (code, signal) => {-    process.on('exit', () => {+  proc.on("exit", (code, signal) => {+    process.on("exit", () => {       if (signal) {-        signal = typeof signal === 'string' ? os.constants.signals[signal] : signal;-        if (mochaArgs['posix-exit-codes'] === true) {+        signal =+          typeof signal === "string" ? os.constants.signals[signal] : signal;+        if (mochaArgs["posix-exit-codes"] === true) {           process.exitCode = SIGNAL_OFFSET + signal;@@ -119,3 +121,3 @@       } else {-        process.exit(Math.min(code, mochaArgs['posix-exit-codes'] ? 1 : 255));+        process.exit(Math.min(code, mochaArgs["posix-exit-codes"] ? 1 : 255));       }@@ -125,7 +127,7 @@   // terminate children.-  process.on('SIGINT', () => {+  process.on("SIGINT", () => {     // XXX: a previous comment said this would abort the runner, but I can't see that it does     // anything with the default runner.-    debug('main process caught SIGINT');-    proc.kill('SIGINT');+    debug("main process caught SIGINT");+    proc.kill("SIGINT");     // if running in parallel mode, we will have a proper SIGINT handler, so the below won't@@ -134,4 +136,4 @@       // win32 does not support SIGTERM, so use next best thing.-      if (os.platform() === 'win32') {-        proc.kill('SIGKILL');+      if (os.platform() === "win32") {+        proc.kill("SIGKILL");       } else {@@ -139,4 +141,4 @@         // in cut-off text or a befouled terminal.-        debug('sending SIGTERM to child process');-        proc.kill('SIGTERM');+        debug("sending SIGTERM to child process");+        proc.kill("SIGTERM");       }@@ -145,4 +147,4 @@ } else {-  debug('running Mocha in-process');-  require('../lib/cli/cli').main([], mochaArgs);+  debug("running Mocha in-process");+  require("../lib/cli/cli").main([], mochaArgs); }
lib/cli/options.js +49 lines · 1 flagged
--- +++ @@ -1,2 +1,2 @@-'use strict';+"use strict"; @@ -9,5 +9,5 @@ -const fs = require('node:fs');-const pc = require('picocolors');-const yargsParser = require('yargs-parser');+const fs = require("node:fs");+const pc = require("picocolors");+const yargsParser = require("yargs-parser"); const {@@ -16,11 +16,11 @@   isMochaFlag,-  expectedTypeForFlag-} = require('./run-option-metadata');-const {ONE_AND_DONE_ARGS} = require('./one-and-dones');-const mocharc = require('../mocharc.json');-const {list} = require('./run-helpers');-const {loadConfig, findConfig} = require('./config');-const findUp = require('find-up');-const debug = require('debug')('mocha:cli:options');-const {isNodeFlag} = require('./node-flags');+  expectedTypeForFlag,+} = require("./run-option-metadata");+const { ONE_AND_DONE_ARGS } = require("./one-and-dones");+const mocharc = require("../mocharc.json");+const { list } = require("./run-helpers");+const { loadConfig, findConfig } = require("./config");+const findUp = require("find-up");+const debug = require("debug")("mocha:cli:options");+const { isNodeFlag } = require("./node-flags"); const {@@ -28,5 +28,5 @@   createInvalidArgumentTypeError,-  createUnsupportedError-} = require('../errors');-const {isNumeric} = require('../utils');+  createUnsupportedError,+} = require("../errors");+const { isNumeric } = require("../utils"); @@ -49,6 +49,6 @@ const YARGS_PARSER_CONFIG = {-  'combine-arrays': true,-  'short-option-groups': false,-  'dot-notation': false,-  'strip-aliased': true+  "combine-arrays": true,+  "short-option-groups": false,+  "dot-notation": false,+  "strip-aliased": true, };@@ -64,3 +64,3 @@ const configuration = Object.assign({}, YARGS_PARSER_CONFIG, {-  'camel-case-expansion': false+  "camel-case-expansion": false, });@@ -75,3 +75,3 @@  */-const globOptions = ['spec', 'ignore'];+const globOptions = ["spec", "ignore"]; const coerceOpts = Object.assign(@@ -80,5 +80,6 @@       Object.assign(acc, {-        [arg]: v => Array.from(new Set(globOptions.includes(arg) ? v : list(v)))+        [arg]: (v) =>+          Array.from(new Set(globOptions.includes(arg) ? v : list(v))),       }),-    {}+    {},   ),@@ -88,5 +89,5 @@       (acc, arg) =>-        Object.assign(acc, {[arg]: v => (Array.isArray(v) ? v.pop() : v)}),-      {}-    )+        Object.assign(acc, { [arg]: (v) => (Array.isArray(v) ? v.pop() : v) }),+      {},+    ), );@@ -103,3 +104,3 @@   .concat(types.string, types.number)-  .reduce((acc, arg) => Object.assign(acc, {[arg]: 1}), {});+  .reduce((acc, arg) => Object.assign(acc, { [arg]: 1 }), {}); @@ -116,3 +117,3 @@   allArgs,-  parsedResult+  parsedResult, ) => {@@ -122,3 +123,3 @@   const flag = allArgs.find((arg, index) => {-    const normalizedArg = arg.replace(/^--?/, '');+    const normalizedArg = arg.replace(/^--?/, "");     return (@@ -134,3 +135,3 @@       numericArg,-      expectedTypeForFlag(flag)+      expectedTypeForFlag(flag),     );@@ -138,3 +139,3 @@     throw createUnsupportedError(-      `Option ${numericArg} is unsupported by the mocha cli`+      `Option ${numericArg} is unsupported by the mocha cli`,     );@@ -158,9 +159,9 @@   // 4. we can then reapply the values after yargs-parser is done.-  const allArgs = Array.isArray(args) ? args : args.split(' ');+  const allArgs = Array.isArray(args) ? args : args.split(" ");   const nodeArgs = allArgs.reduce((acc, arg) => {-    const pair = arg.split('=');+    const pair = arg.split("=");     let flag = pair[0];     if (isNodeFlag(flag, false)) {-      flag = flag.replace(/^--?/, '');-      return acc.concat([[flag, arg.includes('=') ? pair[1] : true]]);+      flag = flag.replace(/^--?/, "");+      return acc.concat([[flag, arg.includes("=") ? pair[1] : true]]);     }@@ -179,3 +180,3 @@     number: types.number,-    boolean: types.boolean.concat(nodeArgs.map(pair => pair[0]))+    boolean: types.boolean.concat(nodeArgs.map((pair) => pair[0])),   });@@ -186,3 +187,3 @@ -  const numericPositionalArg = result.argv._.find(arg => isNumeric(arg));+  const numericPositionalArg = result.argv._.find((arg) => isNumeric(arg));   if (numericPositionalArg) {@@ -191,3 +192,3 @@       allArgs,-      result.argv+      result.argv,     );@@ -238,3 +239,3 @@     try {-      configData = fs.readFileSync(filepath, 'utf8');+      configData = fs.readFileSync(filepath, "utf8");     } catch (err) {@@ -244,7 +245,6 @@           `Unable to read ${filepath}: ${err}`,-          filepath+          filepath,         );       } else {-        debug('failed to read default package.json at %s; ignoring',-              filepath);+        debug("failed to read default package.json at %s; ignoring", filepath);         return result;@@ -255,6 +255,6 @@       if (pkg.mocha) {-        debug('`mocha` prop of package.json parsed: %O', pkg.mocha);+        debug("`mocha` prop of package.json parsed: %O", pkg.mocha);         result = pkg.mocha;       } else {-        debug('no config found in %s', filepath);+        debug("no config found in %s", filepath);       }@@ -264,3 +264,3 @@         `Unable to parse ${filepath}: ${err}`,-        filepath+        filepath,       );@@ -295,3 +295,3 @@       (acc, arg) => acc || arg in args,-      false+      false,     )@@ -301,3 +301,3 @@ -  const envConfig = parse(process.env.MOCHA_OPTIONS || '');+  const envConfig = parse(process.env.MOCHA_OPTIONS || "");   const rcConfig = loadRc(args);@@ -320,3 +320,3 @@     rcConfig || {},-    pkgConfig || {}+    pkgConfig || {},   );
lib/nodejs/buffered-worker-pool.js +30 lines · 2 flagged
--- +++ @@ -7,3 +7,3 @@ -'use strict';+"use strict"; @@ -15,9 +15,9 @@ -const serializeJavascript = require('serialize-javascript');-const workerpool = require('workerpool');-const {deserialize} = require('./serializer');-const debug = require('debug')('mocha:parallel:buffered-worker-pool');-const {createInvalidArgumentTypeError} = require('../errors');+const serializeJavascript = require("serialize-javascript");+const workerpool = require("workerpool");+const { deserialize } = require("./serializer");+const debug = require("debug")("mocha:parallel:buffered-worker-pool");+const { createInvalidArgumentTypeError } = require("../errors"); -const WORKER_PATH = require.resolve('./worker.js');+const WORKER_PATH = require.resolve("./worker.js"); @@ -38,7 +38,7 @@   // use child processes, not worker threads!-  workerType: 'process',+  workerType: "process",   // ensure the same flags sent to `node` for this `mocha` invocation are passed   // along to children-  forkOpts: {execArgv: process.execArgv},-  maxWorkers: workerpool.cpus - 1+  forkOpts: { execArgv: process.execArgv },+  maxWorkers: workerpool.cpus - 1, };@@ -57,5 +57,5 @@       1,-      typeof opts.maxWorkers === 'undefined'+      typeof opts.maxWorkers === "undefined"         ? WORKER_POOL_DEFAULT_OPTS.maxWorkers-        : opts.maxWorkers+        : opts.maxWorkers,     );@@ -66,3 +66,3 @@       debug(-        'not enough CPU cores available to run multiple jobs; avoid --parallel on this machine'+        "not enough CPU cores available to run multiple jobs; avoid --parallel on this machine",       );@@ -71,5 +71,5 @@       debug(-        '%d concurrent job(s) requested, but only %d core(s) available',+        "%d concurrent job(s) requested, but only %d core(s) available",         maxWorkers,-        workerpool.cpus+        workerpool.cpus,       );@@ -78,5 +78,5 @@     debug(-      'run(): starting worker pool of max size %d, using node args: %s',+      "run(): starting worker pool of max size %d, using node args: %s",       maxWorkers,-      process.execArgv.join(' ')+      process.execArgv.join(" "),     );@@ -84,3 +84,3 @@     let counter = 0;-    const onCreateWorker = ({forkOpts}) => {+    const onCreateWorker = ({ forkOpts }) => {       return {@@ -89,4 +89,4 @@           // adds an incremental id to all workers, which can be useful to allocate resources for each process-          env: {...process.env, MOCHA_WORKER_ID: counter++}-        }+          env: { ...process.env, MOCHA_WORKER_ID: counter++ },+        },       };@@ -98,3 +98,3 @@       maxWorkers,-      onCreateWorker+      onCreateWorker,     };@@ -111,3 +111,3 @@     /* istanbul ignore next */-    debug('terminate(): terminating with force = %s', force);+    debug("terminate(): terminating with force = %s", force);     return this._pool.terminate(force);@@ -126,7 +126,7 @@   async run(filepath, options = {}) {-    if (!filepath || typeof filepath !== 'string') {+    if (!filepath || typeof filepath !== "string") {       throw createInvalidArgumentTypeError(-        'Expected a non-empty filepath',-        'filepath',-        'string'+        "Expected a non-empty filepath",+        "filepath",+        "string",       );@@ -134,3 +134,3 @@     const serializedOptions = BufferedWorkerPool.serializeOptions(options);-    const result = await this._pool.exec('run', [filepath, serializedOptions]);+    const result = await this._pool.exec("run", [filepath, serializedOptions]);     return deserialize(result);@@ -169,3 +169,3 @@         unsafe: true, // this means we don't care about XSS-        ignoreFunction: true // do not serialize functions+        ignoreFunction: true, // do not serialize functions       });@@ -174,5 +174,5 @@       debug(-        'serializeOptions(): serialized options %O to: %s',+        "serializeOptions(): serialized options %O to: %s",         opts,-        serialized+        serialized,       );
lib/nodejs/worker.js +38 lines · 1 flagged
--- +++ @@ -6,3 +6,3 @@ -'use strict';+"use strict"; @@ -15,12 +15,12 @@   createInvalidArgumentTypeError,-  createInvalidArgumentValueError-} = require('../errors');-const workerpool = require('workerpool');-const Mocha = require('../mocha');-const {handleRequires, validateLegacyPlugin} = require('../cli/run-helpers');-const d = require('debug');+  createInvalidArgumentValueError,+} = require("../errors");+const workerpool = require("workerpool");+const Mocha = require("../mocha");+const { handleRequires, validateLegacyPlugin } = require("../cli/run-helpers");+const d = require("debug"); const debug = d.debug(`mocha:parallel:worker:${process.pid}`); const isDebugEnabled = d.enabled(`mocha:parallel:worker:${process.pid}`);-const {serialize} = require('./serializer');-const {setInterval, clearInterval} = global;+const { serialize } = require("./serializer");+const { setInterval, clearInterval } = global; @@ -30,3 +30,3 @@   throw new Error(-    'This script is intended to be run as a worker (by the `workerpool` package).'+    "This script is intended to be run as a worker (by the `workerpool` package).",   );@@ -45,8 +45,8 @@  */-let bootstrap = async argv => {+let bootstrap = async (argv) => {   // globalSetup and globalTeardown do not run in workers   const plugins = await handleRequires(argv.require, {-    ignoredPlugins: ['mochaGlobalSetup', 'mochaGlobalTeardown']+    ignoredPlugins: ["mochaGlobalSetup", "mochaGlobalTeardown"],   });-  validateLegacyPlugin(argv, 'ui', Mocha.interfaces);+  validateLegacyPlugin(argv, "ui", Mocha.interfaces); @@ -54,3 +54,3 @@   bootstrap = () => {};-  debug('bootstrap(): finished with args: %O', argv);+  debug("bootstrap(): finished with args: %O", argv); };@@ -65,3 +65,3 @@  */-async function run(filepath, serializedOptions = '{}') {+async function run(filepath, serializedOptions = "{}") {   if (!filepath) {@@ -69,4 +69,4 @@       'Expected a non-empty "filepath" argument',-      'file',-      'string'+      "file",+      "string",     );@@ -74,9 +74,9 @@ -  debug('run(): running test file %s', filepath);+  debug("run(): running test file %s", filepath); -  if (typeof serializedOptions !== 'string') {+  if (typeof serializedOptions !== "string") {     throw createInvalidArgumentTypeError(-      'run() expects second parameter to be a string which was serialized by the `serialize-javascript` module',-      'serializedOptions',-      'string'+      "run() expects second parameter to be a string which was serialized by the `serialize-javascript` module",+      "serializedOptions",+      "string",     );@@ -86,8 +86,8 @@     // eslint-disable-next-line no-eval-    argv = eval('(' + serializedOptions + ')');+    argv = eval("(" + serializedOptions + ")");   } catch (err) {     throw createInvalidArgumentValueError(-      'run() was unable to deserialize the options',-      'serializedOptions',-      serializedOptions+      "run() was unable to deserialize the options",+      "serializedOptions",+      serializedOptions,     );@@ -95,3 +95,3 @@ -  const opts = Object.assign({ui: 'bdd'}, argv, {+  const opts = Object.assign({ ui: "bdd" }, argv, {     // if this was true, it would cause infinite recursion.@@ -101,3 +101,3 @@     // it's useful for a Mocha instance to know if it's running in a worker process.-    isWorker: true+    isWorker: true,   });@@ -113,3 +113,3 @@   } catch (err) {-    debug('run(): could not load file %s: %s', filepath, err);+    debug("run(): could not load file %s: %s", filepath, err);     throw err;@@ -122,9 +122,9 @@       debugInterval = setInterval(() => {-        debug('run(): still running %s...', filepath);+        debug("run(): still running %s...", filepath);       }, 5000).unref();     }-    mocha.run(result => {+    mocha.run((result) => {       // Runner adds these; if we don't remove them, we'll get a leak.-      process.removeAllListeners('uncaughtException');-      process.removeAllListeners('unhandledRejection');+      process.removeAllListeners("uncaughtException");+      process.removeAllListeners("unhandledRejection"); @@ -133,4 +133,4 @@         debug(-          'run(): completed run with %d test failures; returning to main process',-          typeof result.failures === 'number' ? result.failures : 0+          "run(): completed run with %d test failures; returning to main process",+          typeof result.failures === "number" ? result.failures : 0,         );@@ -140,3 +140,3 @@         // rejection should only happen if an error is "unrecoverable"-        debug('run(): serialization failed; rejecting: %O', err);+        debug("run(): serialization failed; rejecting: %O", err);         reject(err);@@ -150,5 +150,5 @@ // this registers the `run` function.-workerpool.worker({run});+workerpool.worker({ run }); -debug('started worker process');+debug("started worker process"); 
browser-entry.js +22 lines
--- +++ @@ -1,2 +1,2 @@-'use strict';+"use strict"; @@ -9,7 +9,7 @@ -process.stdout = require('browser-stdout')({label: false});--var parseQuery = require('./lib/browser/parse-query');-var highlightTags = require('./lib/browser/highlight-tags');-var Mocha = require('./lib/mocha');+process.stdout = require("browser-stdout")({ label: false });++var parseQuery = require("./lib/browser/parse-query");+var highlightTags = require("./lib/browser/highlight-tags");+var Mocha = require("./lib/mocha"); @@ -21,3 +21,3 @@ -var mocha = new Mocha({reporter: 'html'});+var mocha = new Mocha({ reporter: "html" }); @@ -43,3 +43,3 @@ process.removeListener = function (e, fn) {-  if (e === 'uncaughtException') {+  if (e === "uncaughtException") {     if (originalOnerrorHandler) {@@ -61,3 +61,3 @@ process.listenerCount = function (name) {-  if (name === 'uncaughtException') {+  if (name === "uncaughtException") {     return uncaughtExceptionHandlers.length;@@ -72,5 +72,5 @@ process.on = function (e, fn) {-  if (e === 'uncaughtException') {+  if (e === "uncaughtException") {     global.onerror = function (msg, url, line, col, err) {-      fn(err || new Error(msg + ' (' + url + ':' + line + ':' + col + ')'));+      fn(err || new Error(msg + " (" + url + ":" + line + ":" + col + ")"));       return !mocha.options.allowUncaught;@@ -82,3 +82,3 @@ process.listeners = function (err) {-  if (err === 'uncaughtException') {+  if (err === "uncaughtException") {     return uncaughtExceptionHandlers;@@ -91,3 +91,3 @@ // Ensure that this default UI does not expose its methods to the global scope.-mocha.suite.removeAllListeners('pre-require');+mocha.suite.removeAllListeners("pre-require"); @@ -138,3 +138,3 @@   Mocha.prototype.ui.call(this, ui);-  this.suite.emit('pre-require', global, null, this);+  this.suite.emit("pre-require", global, null, this);   return this;@@ -147,4 +147,4 @@ mocha.setup = function (opts) {-  if (typeof opts === 'string') {-    opts = {ui: opts};+  if (typeof opts === "string") {+    opts = { ui: opts };   }@@ -156,3 +156,3 @@     .filter(function (opt) {-      return opt !== 'delay';+      return opt !== "delay";     })@@ -172,5 +172,5 @@   var options = mocha.options;-  mocha.globals('location');--  var query = parseQuery(global.location.search || '');+  mocha.globals("location");++  var query = parseQuery(global.location.search || "");   if (query.grep) {@@ -190,6 +190,6 @@       document &&-      document.getElementById('mocha') &&+      document.getElementById("mocha") &&       options.noHighlighting !== true     ) {-      highlightTags('code');+      highlightTags("code");     }
index.js +2 lines
--- +++ @@ -1,3 +1,3 @@-'use strict';+"use strict"; -module.exports = require('./lib/mocha');+module.exports = require("./lib/mocha");
lib/browser/highlight-tags.js +6 lines
--- +++ @@ -1,2 +1,2 @@-'use strict';+"use strict"; @@ -11,4 +11,4 @@   return js-    .replace(/</g, '&lt;')-    .replace(/>/g, '&gt;')+    .replace(/</g, "&lt;")+    .replace(/>/g, "&gt;")     .replace(/\/\/(.*)/gm, '<span class="comment">//$1</span>')@@ -19,3 +19,3 @@       /\bnew[ \t]+(\w+)/gm,-      '<span class="keyword">new</span> <span class="init">$1</span>'+      '<span class="keyword">new</span> <span class="init">$1</span>',     )@@ -23,3 +23,3 @@       /\b(function|new|throw|return|var|if|else)\b/gm,-      '<span class="keyword">$1</span>'+      '<span class="keyword">$1</span>',     );@@ -34,3 +34,3 @@ module.exports = function highlightTags(name) {-  var code = document.getElementById('mocha').getElementsByTagName(name);+  var code = document.getElementById("mocha").getElementsByTagName(name);   for (var i = 0, len = code.length; i < len; ++i) {
lib/browser/parse-query.js +5 lines
--- +++ @@ -1,2 +1,2 @@-'use strict';+"use strict"; @@ -11,6 +11,6 @@   return qs-    .replace('?', '')-    .split('&')+    .replace("?", "")+    .split("&")     .reduce(function (obj, pair) {-      var i = pair.indexOf('=');+      var i = pair.indexOf("=");       var key = pair.slice(0, i);@@ -19,3 +19,3 @@       // Due to how the URLSearchParams API treats spaces-      obj[key] = decodeURIComponent(val.replace(/\+/g, '%20'));+      obj[key] = decodeURIComponent(val.replace(/\+/g, "%20")); 
lib/cli/cli.js +32 lines
--- +++ @@ -1,2 +1,2 @@-'use strict';+"use strict"; @@ -10,6 +10,6 @@ -const debug = require('debug')('mocha:cli:cli');-const symbols = require('log-symbols');-const yargs = require('yargs');-const path = require('node:path');+const debug = require("debug")("mocha:cli:cli");+const symbols = require("log-symbols");+const yargs = require("yargs");+const path = require("node:path"); const {@@ -18,9 +18,14 @@   loadOptions,-  YARGS_PARSER_CONFIG-} = require('./options');-const lookupFiles = require('./lookup-files');-const commands = require('./commands');-const pc = require('picocolors');-const {repository, homepage, version, discord} = require('../../package.json');-const {cwd} = require('../utils');+  YARGS_PARSER_CONFIG,+} = require("./options");+const lookupFiles = require("./lookup-files");+const commands = require("./commands");+const pc = require("picocolors");+const {+  repository,+  homepage,+  version,+  discord,+} = require("../../package.json");+const { cwd } = require("../utils"); @@ -36,6 +41,6 @@ exports.main = (argv = process.argv.slice(2), mochaArgs) => {-  debug('entered main with raw args', argv);+  debug("entered main with raw args", argv);   // ensure we can require() from current working directory-  if (typeof module.paths !== 'undefined') {-    module.paths.push(cwd(), path.resolve('node_modules'));+  if (typeof module.paths !== "undefined") {+    module.paths.push(cwd(), path.resolve("node_modules"));   }@@ -45,3 +50,3 @@   } catch (err) {-    debug('unable to set Error.stackTraceLimit = Infinity', err);+    debug("unable to set Error.stackTraceLimit = Infinity", err);   }@@ -51,3 +56,3 @@   yargs()-    .scriptName('mocha')+    .scriptName("mocha")     .command(commands.run)@@ -55,16 +60,16 @@     .updateStrings({-      'Positionals:': 'Positional Arguments',-      'Options:': 'Other Options',-      'Commands:': 'Commands'+      "Positionals:": "Positional Arguments",+      "Options:": "Other Options",+      "Commands:": "Commands",     })     .fail((msg, err, yargs) => {-      debug('caught error sometime before command handler: %O', err);+      debug("caught error sometime before command handler: %O", err);       yargs.showHelp();-      console.error(`\n${symbols.error} ${pc.red('ERROR:')} ${msg}`);+      console.error(`\n${symbols.error} ${pc.red("ERROR:")} ${msg}`);       process.exit(1);     })-    .help('help', 'Show usage information & exit')-    .alias('help', 'h')-    .version('version', 'Show version number & exit', version)-    .alias('version', 'V')+    .help("help", "Show usage information & exit")+    .alias("help", "h")+    .version("version", "Show version number & exit", version)+    .alias("version", "V")     .wrap(process.stdout.columns ? Math.min(process.stdout.columns, 80) : 80)@@ -75,3 +80,3 @@     Docs: ${pc.yellow(homepage)}-      `+      `,     )
lib/cli/collect-files.js +25 lines
--- +++ @@ -1,10 +1,10 @@-'use strict';+"use strict"; -const path = require('node:path');-const pc = require('picocolors');-const debug = require('debug')('mocha:cli:run:helpers');-const { minimatch } = require('minimatch');-const {NO_FILES_MATCH_PATTERN} = require('../error-constants').constants;-const lookupFiles = require('./lookup-files');-const {castArray} = require('../utils');+const path = require("node:path");+const pc = require("picocolors");+const debug = require("debug")("mocha:cli:run:helpers");+const { minimatch } = require("minimatch");+const { NO_FILES_MATCH_PATTERN } = require("../error-constants").constants;+const lookupFiles = require("./lookup-files");+const { castArray } = require("../utils"); @@ -35,3 +35,3 @@   sort,-  spec+  spec, } = {}) => {@@ -41,9 +41,9 @@       const moreSpecFiles = castArray(lookupFiles(arg, extension, recursive))-        .filter(filename =>+        .filter((filename) =>           ignore.every(-            pattern =>-              !minimatch(filename, pattern, {windowsPathsNoEscape: true})-          )+            (pattern) =>+              !minimatch(filename, pattern, { windowsPathsNoEscape: true }),+          ),         )-        .map(filename => path.resolve(filename));+        .map((filename) => path.resolve(filename));       return [...specFiles, ...moreSpecFiles];@@ -51,3 +51,3 @@       if (err.code === NO_FILES_MATCH_PATTERN) {-        unmatchedSpecFiles.push({message: err.message, pattern: err.pattern});+        unmatchedSpecFiles.push({ message: err.message, pattern: err.pattern });         return specFiles;@@ -62,3 +62,3 @@   const unmatchedFiles = [];-  fileArgs.forEach(file => {+  fileArgs.forEach((file) => {     const fileAbsolutePath = path.resolve(file);@@ -68,6 +68,6 @@     } catch (err) {-      if (err.code === 'MODULE_NOT_FOUND') {+      if (err.code === "MODULE_NOT_FOUND") {         unmatchedFiles.push({           pattern: file,-          absolutePath: fileAbsolutePath+          absolutePath: fileAbsolutePath,         });@@ -87,6 +87,6 @@   const files = [-    ...fileArgs.map(filepath => path.resolve(filepath)),-    ...specFiles+    ...fileArgs.map((filepath) => path.resolve(filepath)),+    ...specFiles,   ];-  debug('test files (in order): ', files);+  debug("test files (in order): ", files); @@ -97,5 +97,5 @@         ? `Error: No test files found: ${JSON.stringify(-            unmatchedSpecFiles[0].pattern+            unmatchedSpecFiles[0].pattern,           )}` // stringify to print escaped characters raw-        : 'Error: No test files found';+        : "Error: No test files found";     console.error(pc.red(noneFoundMsg));@@ -104,3 +104,3 @@     // print messages as a warning-    unmatchedSpecFiles.forEach(warning => {+    unmatchedSpecFiles.forEach((warning) => {       console.warn(pc.yellow(`Warning: ${warning.message}`));@@ -111,3 +111,3 @@     files,-    unmatchedFiles+    unmatchedFiles,   };
lib/cli/commands.js +4 lines
--- +++ @@ -1,2 +1,2 @@-'use strict';+"use strict"; @@ -10,5 +10,5 @@ module.exports = {-  init: require('./init'),+  init: require("./init"),   // default command-  run: require('./run'),-}+  run: require("./run"),+};
lib/cli/config.js +26 lines
--- +++ @@ -1,2 +1,2 @@-'use strict';+"use strict"; @@ -9,8 +9,8 @@ -const fs = require('node:fs');-const path = require('node:path');-const debug = require('debug')('mocha:cli:config');-const findUp = require('find-up');-const {createUnparsableFileError} = require('../errors');-const utils = require('../utils');+const fs = require("node:fs");+const path = require("node:path");+const debug = require("debug")("mocha:cli:config");+const findUp = require("find-up");+const { createUnparsableFileError } = require("../errors");+const utils = require("../utils"); @@ -24,8 +24,8 @@ exports.CONFIG_FILES = [-  '.mocharc.cjs',-  '.mocharc.js',-  '.mocharc.yaml',-  '.mocharc.yml',-  '.mocharc.jsonc',-  '.mocharc.json'+  ".mocharc.cjs",+  ".mocharc.js",+  ".mocharc.yaml",+  ".mocharc.yml",+  ".mocharc.jsonc",+  ".mocharc.json", ];@@ -37,4 +37,5 @@ const parsers = (exports.parsers = {-  yaml: filepath => require('js-yaml').load(fs.readFileSync(filepath, 'utf8')),-  js: filepath => {+  yaml: (filepath) =>+    require("js-yaml").load(fs.readFileSync(filepath, "utf8")),+  js: (filepath) => {     let cwdFilepath;@@ -51,6 +52,6 @@   },-  json: filepath =>+  json: (filepath) =>     JSON.parse(-      require('strip-json-comments')(fs.readFileSync(filepath, 'utf8'))-    )+      require("strip-json-comments")(fs.readFileSync(filepath, "utf8")),+    ), });@@ -65,5 +66,5 @@  */-exports.loadConfig = filepath => {+exports.loadConfig = (filepath) => {   let config = {};-  debug('loadConfig: trying to parse config at %s', filepath);+  debug("loadConfig: trying to parse config at %s", filepath); @@ -71,5 +72,5 @@   try {-    if (ext === '.yml' || ext === '.yaml') {+    if (ext === ".yml" || ext === ".yaml") {       config = parsers.yaml(filepath);-    } else if (ext === '.js' || ext === '.cjs') {+    } else if (ext === ".js" || ext === ".cjs") {       config = parsers.js(filepath);@@ -81,3 +82,3 @@       `Unable to read/parse ${filepath}: ${err}`,-      filepath+      filepath,     );@@ -94,5 +95,5 @@ exports.findConfig = (cwd = utils.cwd()) => {-  const filepath = findUp.sync(exports.CONFIG_FILES, {cwd});+  const filepath = findUp.sync(exports.CONFIG_FILES, { cwd });   if (filepath) {-    debug('findConfig: found config file %s', filepath);+    debug("findConfig: found config file %s", filepath);   }
lib/cli/index.js +2 lines
--- +++ @@ -1,3 +1,3 @@-'use strict';+"use strict"; -module.exports = require('./cli');+module.exports = require("./cli");
lib/cli/init.js +19 lines
--- +++ @@ -1,2 +1,2 @@-'use strict';+"use strict"; @@ -9,28 +9,28 @@ -const fs = require('node:fs');-const path = require('node:path');+const fs = require("node:fs");+const path = require("node:path"); -exports.command = 'init <path>';+exports.command = "init <path>"; -exports.description = 'create a client-side Mocha setup at <path>';+exports.description = "create a client-side Mocha setup at <path>"; -exports.builder = yargs =>-  yargs.positional('path', {-    type: 'string',-    normalize: true+exports.builder = (yargs) =>+  yargs.positional("path", {+    type: "string",+    normalize: true,   }); -exports.handler = argv => {+exports.handler = (argv) => {   const destdir = argv.path;-  const srcdir = path.join(__dirname, '..', '..');-  fs.mkdirSync(destdir, {recursive: true});-  const css = fs.readFileSync(path.join(srcdir, 'mocha.css'));-  const js = fs.readFileSync(path.join(srcdir, 'mocha.js'));+  const srcdir = path.join(__dirname, "..", "..");+  fs.mkdirSync(destdir, { recursive: true });+  const css = fs.readFileSync(path.join(srcdir, "mocha.css"));+  const js = fs.readFileSync(path.join(srcdir, "mocha.js"));   const tmpl = fs.readFileSync(-    path.join(srcdir, 'lib', 'browser', 'template.html')+    path.join(srcdir, "lib", "browser", "template.html"),   );-  fs.writeFileSync(path.join(destdir, 'mocha.css'), css);-  fs.writeFileSync(path.join(destdir, 'mocha.js'), js);-  fs.writeFileSync(path.join(destdir, 'tests.spec.js'), '');-  fs.writeFileSync(path.join(destdir, 'index.html'), tmpl);+  fs.writeFileSync(path.join(destdir, "mocha.css"), css);+  fs.writeFileSync(path.join(destdir, "mocha.js"), js);+  fs.writeFileSync(path.join(destdir, "tests.spec.js"), "");+  fs.writeFileSync(path.join(destdir, "index.html"), tmpl); };
lib/cli/lookup-files.js +20 lines
--- +++ @@ -1,2 +1,2 @@-'use strict';+"use strict"; /**@@ -7,9 +7,9 @@ -var fs = require('node:fs');-var path = require('node:path');-var glob = require('glob');-var errors = require('../errors');+var fs = require("node:fs");+var path = require("node:path");+var glob = require("glob");+var errors = require("../errors"); var createNoFilesMatchPatternError = errors.createNoFilesMatchPatternError; var createMissingArgumentError = errors.createMissingArgumentError;-const debug = require('debug')('mocha:cli:lookup-files');+const debug = require("debug")("mocha:cli:lookup-files"); @@ -30,3 +30,3 @@  */-const isHiddenOnUnix = pathname => path.basename(pathname).startsWith('.');+const isHiddenOnUnix = (pathname) => path.basename(pathname).startsWith("."); @@ -48,4 +48,4 @@   exts-    .map(ext => (ext.startsWith('.') ? ext : `.${ext}`))-    .some(ext => pathname.endsWith(ext));+    .map((ext) => (ext.startsWith(".") ? ext : `.${ext}`))+    .some((ext) => pathname.endsWith(ext)); @@ -70,3 +70,3 @@   extensions = [],-  recursive = false+  recursive = false, ) {@@ -77,3 +77,3 @@     let pattern;-    if (glob.hasMagic(filepath, {windowsPathsNoEscape: true})) {+    if (glob.hasMagic(filepath, { windowsPathsNoEscape: true })) {       // Handle glob as is without extensions@@ -83,6 +83,6 @@       const strExtensions = extensions-        .map(ext => (ext.startsWith('.') ? ext : `.${ext}`))-        .join('|');+        .map((ext) => (ext.startsWith(".") ? ext : `.${ext}`))+        .join("|");       pattern = `${filepath}+(${strExtensions})`;-      debug('looking for files using glob pattern: %s', pattern);+      debug("looking for files using glob pattern: %s", pattern);     }@@ -92,3 +92,3 @@           nodir: true,-          windowsPathsNoEscape: true+          windowsPathsNoEscape: true,         })@@ -97,3 +97,3 @@         // https://github.com/mochajs/mocha/pull/5250/files#r1840469747-        .sort((a, b) => a.localeCompare(b, 'en'))+        .sort((a, b) => a.localeCompare(b, "en")),     );@@ -102,3 +102,3 @@         `Cannot find any files matching pattern "${filepath}"`,-        filepath+        filepath,       );@@ -120,3 +120,3 @@   // Handle directory-  fs.readdirSync(filepath).forEach(dirent => {+  fs.readdirSync(filepath).forEach((dirent) => {     const pathname = path.join(filepath, dirent);@@ -138,4 +138,4 @@         `Argument '${extensions}' required when argument '${filepath}' is a directory`,-        'extensions',-        'array'+        "extensions",+        "array",       );
lib/cli/node-flags.js +12 lines
--- +++ @@ -1,2 +1,2 @@-'use strict';+"use strict"; @@ -9,4 +9,4 @@ const nodeFlags = process.allowedNodeEnvironmentFlags;-const {isMochaFlag} = require('./run-option-metadata');-const unparse = require('yargs-unparser');+const { isMochaFlag } = require("./run-option-metadata");+const unparse = require("yargs-unparser"); @@ -17,3 +17,3 @@  */-const debugFlags = new Set(['inspect', 'inspect-brk']);+const debugFlags = new Set(["inspect", "inspect-brk"]); @@ -43,3 +43,3 @@     // strip the leading dashes to match against subsequent checks-    flag = flag.replace(/^--?/, '');+    flag = flag.replace(/^--?/, "");   }@@ -52,3 +52,3 @@     /(?:preserve-symlinks(?:-main)?|harmony(?:[_-]|$)|(?:trace[_-].+$)|gc[_-]global$|es[_-]staging$|use[_-]strict$|v8[_-](?!options).+?$)/.test(-      flag+      flag,     )@@ -64,3 +64,3 @@  */-exports.impliesNoTimeouts = flag => debugFlags.has(flag);+exports.impliesNoTimeouts = (flag) => debugFlags.has(flag); @@ -74,3 +74,3 @@  */-exports.unparseNodeFlags = opts => {+exports.unparseNodeFlags = (opts) => {   var args = unparse(opts);@@ -78,7 +78,7 @@     ? args-        .join(' ')+        .join(" ")         .split(/\b/)-        .map(arg => (arg === ' ' ? '=' : arg))-        .join('')-        .split(' ')+        .map((arg) => (arg === " " ? "=" : arg))+        .join("")+        .split(" ")     : [];
lib/cli/one-and-dones.js +12 lines
--- +++ @@ -1,2 +1,2 @@-'use strict';+"use strict"; @@ -10,3 +10,3 @@ -const Mocha = require('../mocha');+const Mocha = require("../mocha"); @@ -19,3 +19,3 @@  */-const showKeys = obj => {+const showKeys = (obj) => {   console.log();@@ -25,6 +25,7 @@     .filter(-      key => /^[a-z]/.test(key) && !obj[key].browserOnly && !obj[key].abstract+      (key) =>+        /^[a-z]/.test(key) && !obj[key].browserOnly && !obj[key].abstract,     )     .sort()-    .forEach(key => {+    .forEach((key) => {       const description = obj[key].description;@@ -32,4 +33,4 @@         `    ${key.padEnd(maxKeyLength + 1)}${-          description ? `- ${description}` : ''-        }`+          description ? `- ${description}` : ""+        }`,       );@@ -49,3 +50,3 @@    */-  'list-interfaces': () => {+  "list-interfaces": () => {     showKeys(Mocha.interfaces);@@ -56,5 +57,5 @@    */-  'list-reporters': () => {+  "list-reporters": () => {     showKeys(Mocha.reporters);-  }+  }, };@@ -67,3 +68,3 @@ exports.ONE_AND_DONE_ARGS = new Set(-  ['help', 'h', 'version', 'V'].concat(Object.keys(exports.ONE_AND_DONES))+  ["help", "h", "version", "V"].concat(Object.keys(exports.ONE_AND_DONES)), );
lib/cli/run-helpers.js +52 lines
--- +++ @@ -1,2 +1,2 @@-'use strict';+"use strict"; @@ -16,12 +16,12 @@ -const fs = require('node:fs');-const path = require('node:path');-const pc = require('picocolors');-const debug = require('debug')('mocha:cli:run:helpers');-const {watchRun, watchParallelRun} = require('./watch-run');-const collectFiles = require('./collect-files');-const {format} = require('node:util');-const {createInvalidLegacyPluginError} = require('../errors');-const {requireOrImport} = require('../nodejs/esm-utils');-const PluginLoader = require('../plugin-loader');+const fs = require("node:fs");+const path = require("node:path");+const pc = require("picocolors");+const debug = require("debug")("mocha:cli:run:helpers");+const { watchRun, watchParallelRun } = require("./watch-run");+const collectFiles = require("./collect-files");+const { format } = require("node:util");+const { createInvalidLegacyPluginError } = require("../errors");+const { requireOrImport } = require("../nodejs/esm-utils");+const PluginLoader = require("../plugin-loader"); @@ -33,5 +33,8 @@  */-const exitMochaLater = clampedCode => {-  process.on('exit', () => {-    process.exitCode = Math.min(clampedCode, process.argv.includes('--posix-exit-codes') ? 1 : 255);+const exitMochaLater = (clampedCode) => {+  process.on("exit", () => {+    process.exitCode = Math.min(+      clampedCode,+      process.argv.includes("--posix-exit-codes") ? 1 : 255,+    );   });@@ -46,4 +49,4 @@  */-const exitMocha = clampedCode => {-  const usePosixExitCodes = process.argv.includes('--posix-exit-codes');+const exitMocha = (clampedCode) => {+  const usePosixExitCodes = process.argv.includes("--posix-exit-codes");   clampedCode = Math.min(clampedCode, usePosixExitCodes ? 1 : 255);@@ -66,6 +69,6 @@ -  streams.forEach(stream => {+  streams.forEach((stream) => {     // submit empty write request and wait for completion     draining += 1;-    stream.write('', done);+    stream.write("", done);   });@@ -82,4 +85,4 @@  */-exports.list = str =>-  Array.isArray(str) ? exports.list(str.join(',')) : str.split(/ *, */);+exports.list = (str) =>+  Array.isArray(str) ? exports.list(str.join(",")) : str.split(/ *, */); @@ -93,4 +96,7 @@  */-exports.handleRequires = async (requires = [], {ignoredPlugins = []} = {}) => {-  const pluginLoader = PluginLoader.create({ignore: ignoredPlugins});+exports.handleRequires = async (+  requires = [],+  { ignoredPlugins = [] } = {},+) => {+  const pluginLoader = PluginLoader.create({ ignore: ignoredPlugins });   for await (const mod of requires) {@@ -100,8 +106,8 @@       modpath = path.resolve(mod);-      debug('resolved required file %s to %s', mod, modpath);+      debug("resolved required file %s to %s", mod, modpath);     }     const requiredModule = await requireOrImport(modpath);-    if (requiredModule && typeof requiredModule === 'object') {+    if (requiredModule && typeof requiredModule === "object") {       if (pluginLoader.load(requiredModule)) {-        debug('found one or more plugin implementations in %s', modpath);+        debug("found one or more plugin implementations in %s", modpath);       }@@ -112,3 +118,3 @@   if (Object.keys(plugins).length) {-    debug('finalized plugin implementations: %O', plugins);+    debug("finalized plugin implementations: %O", plugins);   }@@ -129,7 +135,7 @@ -  unmatchedFiles.forEach(({pattern, absolutePath}) => {+  unmatchedFiles.forEach(({ pattern, absolutePath }) => {     console.error(       pc.yellow(-        `Warning: Cannot find any files matching pattern "${pattern}" at the absolute path "${absolutePath}"`-      )+        `Warning: Cannot find any files matching pattern "${pattern}" at the absolute path "${absolutePath}"`,+      ),     );@@ -137,3 +143,3 @@   console.log(-    'No test file(s) found with the given pattern, exiting with code 1'+    "No test file(s) found with the given pattern, exiting with code 1",   );@@ -154,4 +160,4 @@   mocha,-  {exit, passOnFailingTestSuite},-  fileCollectParams+  { exit, passOnFailingTestSuite },+  fileCollectParams, ) => {@@ -163,3 +169,3 @@ -  debug('single run with %d file(s)', fileCollectionObj.files.length);+  debug("single run with %d file(s)", fileCollectionObj.files.length);   mocha.files = fileCollectionObj.files;@@ -168,5 +174,3 @@   await mocha.loadFilesAsync();-  return mocha.run(-    createExitHandler({exit, passOnFailingTestSuite})-  );+  return mocha.run(createExitHandler({ exit, passOnFailingTestSuite })); };@@ -194,4 +198,4 @@   debug(-    'executing %d test file(s) in parallel mode',-    fileCollectionObj.files.length+    "executing %d test file(s) in parallel mode",+    fileCollectionObj.files.length,   );@@ -200,5 +204,3 @@   // note that we DO NOT load any files here; this is handled by the worker-  return mocha.run(-    createExitHandler(options)-  );+  return mocha.run(createExitHandler(options)); };@@ -225,3 +227,3 @@     sort = false,-    spec = []+    spec = [],   } = options;@@ -234,3 +236,3 @@     sort,-    spec+    spec,   };@@ -269,3 +271,3 @@       `"--${pluginType}" can only be specified once`,-      pluginType+      pluginType,     );@@ -273,3 +275,3 @@ -  const createUnknownError = err =>+  const createUnknownError = (err) =>     createInvalidLegacyPluginError(@@ -277,3 +279,3 @@       pluginType,-      pluginId+      pluginId,     );@@ -300,10 +302,6 @@ const createExitHandler = ({ exit, passOnFailingTestSuite }) => {-  return code => {-    const clampedCode = passOnFailingTestSuite-      ? 0-      : Math.min(code, 255);--    return exit-      ? exitMocha(clampedCode)-      : exitMochaLater(clampedCode);+  return (code) => {+    const clampedCode = passOnFailingTestSuite ? 0 : Math.min(code, 255);++    return exit ? exitMocha(clampedCode) : exitMochaLater(clampedCode);   };
lib/cli/run-option-metadata.js +75 lines
--- +++ @@ -1,2 +1,2 @@-'use strict';+"use strict"; @@ -16,50 +16,50 @@   array: [-    'extension',-    'file',-    'global',-    'ignore',-    'node-option',-    'reporter-option',-    'require',-    'spec',-    'watch-files',-    'watch-ignore'+    "extension",+    "file",+    "global",+    "ignore",+    "node-option",+    "reporter-option",+    "require",+    "spec",+    "watch-files",+    "watch-ignore",   ],   boolean: [-    'allow-uncaught',-    'async-only',-    'bail',-    'check-leaks',-    'color',-    'delay',-    'diff',-    'dry-run',-    'exit',-    'pass-on-failing-test-suite',-    'fail-zero',-    'forbid-only',-    'forbid-pending',-    'full-trace',-    'inline-diffs',-    'invert',-    'list-interfaces',-    'list-reporters',-    'no-colors',-    'parallel',-    'posix-exit-codes',-    'recursive',-    'sort',-    'watch'+    "allow-uncaught",+    "async-only",+    "bail",+    "check-leaks",+    "color",+    "delay",+    "diff",+    "dry-run",+    "exit",+    "pass-on-failing-test-suite",+    "fail-zero",+    "forbid-only",+    "forbid-pending",+    "full-trace",+    "inline-diffs",+    "invert",+    "list-interfaces",+    "list-reporters",+    "no-colors",+    "parallel",+    "posix-exit-codes",+    "recursive",+    "sort",+    "watch",   ],-  number: ['retries', 'jobs'],+  number: ["retries", "jobs"],   string: [-    'config',-    'fgrep',-    'grep',-    'package',-    'reporter',-    'ui',-    'slow',-    'timeout'-  ]+    "config",+    "fgrep",+    "grep",+    "package",+    "reporter",+    "ui",+    "slow",+    "timeout",+  ], });@@ -73,22 +73,22 @@ exports.aliases = {-  'async-only': ['A'],-  bail: ['b'],-  color: ['c', 'colors'],-  fgrep: ['f'],-  global: ['globals'],-  grep: ['g'],-  ignore: ['exclude'],-  invert: ['i'],-  jobs: ['j'],-  'no-colors': ['C'],-  'node-option': ['n'],-  parallel: ['p'],-  reporter: ['R'],-  'reporter-option': ['reporter-options', 'O'],-  require: ['r'],-  slow: ['s'],-  sort: ['S'],-  timeout: ['t', 'timeouts'],-  ui: ['u'],-  watch: ['w']+  "async-only": ["A"],+  bail: ["b"],+  color: ["c", "colors"],+  fgrep: ["f"],+  global: ["globals"],+  grep: ["g"],+  ignore: ["exclude"],+  invert: ["i"],+  jobs: ["j"],+  "no-colors": ["C"],+  "node-option": ["n"],+  parallel: ["p"],+  reporter: ["R"],+  "reporter-option": ["reporter-options", "O"],+  require: ["r"],+  slow: ["s"],+  sort: ["S"],+  timeout: ["t", "timeouts"],+  ui: ["u"],+  watch: ["w"], };@@ -98,6 +98,6 @@   // then adds aliases of each flag (if any)-  TYPES[key].forEach(flag => {+  TYPES[key].forEach((flag) => {     acc.add(flag);     const aliases = exports.aliases[flag] || [];-    aliases.forEach(alias => {+    aliases.forEach((alias) => {       acc.add(alias);@@ -114,4 +114,4 @@  */-exports.isMochaFlag = flag => {-  return ALL_MOCHA_FLAGS.has(flag.replace(/^--?/, ''));+exports.isMochaFlag = (flag) => {+  return ALL_MOCHA_FLAGS.has(flag.replace(/^--?/, "")); };@@ -124,4 +124,4 @@  */-exports.expectedTypeForFlag = flag => {-  const normalizedName = flag.replace(/^--?/, '');+exports.expectedTypeForFlag = (flag) => {+  const normalizedName = flag.replace(/^--?/, ""); @@ -130,8 +130,8 @@   const fullFlagName =-    Object.keys(aliases).find(flagName =>-      aliases[flagName].includes(normalizedName)+    Object.keys(aliases).find((flagName) =>+      aliases[flagName].includes(normalizedName),     ) || normalizedName; -  return Object.keys(TYPES).find(flagType =>-    TYPES[flagType].includes(fullFlagName)+  return Object.keys(TYPES).find((flagType) =>+    TYPES[flagType].includes(fullFlagName),   );
lib/cli/run.js +210 lines
--- +++ @@ -1,2 +1,2 @@-'use strict';+"use strict"; @@ -9,5 +9,5 @@ -const symbols = require('log-symbols');-const pc = require('picocolors');-const Mocha = require('../mocha');+const symbols = require("log-symbols");+const pc = require("picocolors");+const Mocha = require("../mocha"); const {@@ -15,4 +15,4 @@   createInvalidArgumentValueError,-  createMissingArgumentError-} = require('../errors');+  createMissingArgumentError,+} = require("../errors"); @@ -22,8 +22,8 @@   validateLegacyPlugin,-  runMocha-} = require('./run-helpers');-const {ONE_AND_DONES, ONE_AND_DONE_ARGS} = require('./one-and-dones');-const debug = require('debug')('mocha:cli:run');-const defaults = require('../mocharc.json');-const {types, aliases} = require('./run-option-metadata');+  runMocha,+} = require("./run-helpers");+const { ONE_AND_DONES, ONE_AND_DONE_ARGS } = require("./one-and-dones");+const debug = require("debug")("mocha:cli:run");+const defaults = require("../mocharc.json");+const { types, aliases } = require("./run-option-metadata"); @@ -34,25 +34,25 @@ const GROUPS = {-  FILES: 'File Handling',-  FILTERS: 'Test Filters',-  NODEJS: 'Node.js & V8',-  OUTPUT: 'Reporting & Output',-  RULES: 'Rules & Behavior',-  CONFIG: 'Configuration'+  FILES: "File Handling",+  FILTERS: "Test Filters",+  NODEJS: "Node.js & V8",+  OUTPUT: "Reporting & Output",+  RULES: "Rules & Behavior",+  CONFIG: "Configuration", }; -exports.command = ['$0 [spec..]', 'inspect'];--exports.describe = 'Run tests with Mocha';--exports.builder = yargs =>+exports.command = ["$0 [spec..]", "inspect"];++exports.describe = "Run tests with Mocha";++exports.builder = (yargs) =>   yargs     .options({-      'allow-uncaught': {-        description: 'Allow uncaught errors to propagate',-        group: GROUPS.RULES-      },-      'async-only': {-        description:-          'Require all tests to use a callback (async) or return a Promise',-        group: GROUPS.RULES+      "allow-uncaught": {+        description: "Allow uncaught errors to propagate",+        group: GROUPS.RULES,+      },+      "async-only": {+        description:+          "Require all tests to use a callback (async) or return a Promise",+        group: GROUPS.RULES,       },@@ -60,11 +60,11 @@         description: 'Abort ("bail") after first test failure',-        group: GROUPS.RULES-      },-      'check-leaks': {-        description: 'Check for global variable leaks',-        group: GROUPS.RULES+        group: GROUPS.RULES,+      },+      "check-leaks": {+        description: "Check for global variable leaks",+        group: GROUPS.RULES,       },       color: {-        description: 'Force-enable color output',-        group: GROUPS.OUTPUT+        description: "Force-enable color output",+        group: GROUPS.OUTPUT,       },@@ -72,9 +72,9 @@         config: true,-        defaultDescription: '(nearest rc file)',-        description: 'Path to config file',-        group: GROUPS.CONFIG+        defaultDescription: "(nearest rc file)",+        description: "Path to config file",+        group: GROUPS.CONFIG,       },       delay: {-        description: 'Delay initial execution of root suite',-        group: GROUPS.RULES+        description: "Delay initial execution of root suite",+        group: GROUPS.RULES,       },@@ -82,12 +82,12 @@         default: true,-        description: 'Show diff on failure',-        group: GROUPS.OUTPUT-      },-      'dry-run': {-        description: 'Report tests without executing them',-        group: GROUPS.RULES+        description: "Show diff on failure",+        group: GROUPS.OUTPUT,+      },+      "dry-run": {+        description: "Report tests without executing them",+        group: GROUPS.RULES,       },       exit: {-        description: 'Force Mocha to quit after tests complete',-        group: GROUPS.RULES+        description: "Force Mocha to quit after tests complete",+        group: GROUPS.RULES,       },@@ -95,41 +95,41 @@         default: defaults.extension,-        description: 'File extension(s) to load',-        group: GROUPS.FILES,-        requiresArg: true,-        coerce: list-      },-      'pass-on-failing-test-suite': {+        description: "File extension(s) to load",+        group: GROUPS.FILES,+        requiresArg: true,+        coerce: list,+      },+      "pass-on-failing-test-suite": {         default: false,-        description: 'Not fail test run if tests were failed',-        group: GROUPS.RULES-      },-      'fail-zero': {-        description: 'Fail test run if no test(s) encountered',-        group: GROUPS.RULES+        description: "Not fail test run if tests were failed",+        group: GROUPS.RULES,+      },+      "fail-zero": {+        description: "Fail test run if no test(s) encountered",+        group: GROUPS.RULES,       },       fgrep: {-        conflicts: 'grep',-        description: 'Only run tests containing this string',+        conflicts: "grep",+        description: "Only run tests containing this string",         group: GROUPS.FILTERS,-        requiresArg: true+        requiresArg: true,       },       file: {-        defaultDescription: '(none)',-        description:-          'Specify file(s) to be loaded prior to root suite execution',+        defaultDescription: "(none)",+        description:+          "Specify file(s) to be loaded prior to root suite execution",         group: GROUPS.FILES,         normalize: true,-        requiresArg: true-      },-      'forbid-only': {-        description: 'Fail if exclusive test(s) encountered',-        group: GROUPS.RULES-      },-      'forbid-pending': {-        description: 'Fail if pending test(s) encountered',-        group: GROUPS.RULES-      },-      'full-trace': {-        description: 'Display full stack traces',-        group: GROUPS.OUTPUT+        requiresArg: true,+      },+      "forbid-only": {+        description: "Fail if exclusive test(s) encountered",+        group: GROUPS.RULES,+      },+      "forbid-pending": {+        description: "Fail if pending test(s) encountered",+        group: GROUPS.RULES,+      },+      "full-trace": {+        description: "Display full stack traces",+        group: GROUPS.OUTPUT,       },@@ -137,27 +137,27 @@         coerce: list,-        description: 'List of allowed global variables',-        group: GROUPS.RULES,-        requiresArg: true+        description: "List of allowed global variables",+        group: GROUPS.RULES,+        requiresArg: true,       },       grep: {-        coerce: value => (!value ? null : value),-        conflicts: 'fgrep',-        description: 'Only run tests matching this string or regexp',+        coerce: (value) => (!value ? null : value),+        conflicts: "fgrep",+        description: "Only run tests matching this string or regexp",         group: GROUPS.FILTERS,-        requiresArg: true+        requiresArg: true,       },       ignore: {-        defaultDescription: '(none)',-        description: 'Ignore file(s) or glob pattern(s)',-        group: GROUPS.FILES,-        requiresArg: true-      },-      'inline-diffs': {-        description:-          'Display actual/expected differences inline within each string',-        group: GROUPS.OUTPUT+        defaultDescription: "(none)",+        description: "Ignore file(s) or glob pattern(s)",+        group: GROUPS.FILES,+        requiresArg: true,+      },+      "inline-diffs": {+        description:+          "Display actual/expected differences inline within each string",+        group: GROUPS.OUTPUT,       },
… 296 more lines (truncated)
lib/cli/watch-run.js +78 lines
--- +++ @@ -1,12 +1,12 @@-'use strict';--const logSymbols = require('log-symbols');-const debug = require('debug')('mocha:cli:watch');-const path = require('node:path');-const chokidar = require('chokidar');-const glob = require('glob');-const isPathInside = require('is-path-inside');-const {minimatch} = require('minimatch');-const Context = require('../context');-const collectFiles = require('./collect-files');+"use strict";++const logSymbols = require("log-symbols");+const debug = require("debug")("mocha:cli:watch");+const path = require("node:path");+const chokidar = require("chokidar");+const glob = require("glob");+const isPathInside = require("is-path-inside");+const { minimatch } = require("minimatch");+const Context = require("../context");+const collectFiles = require("./collect-files"); @@ -48,6 +48,6 @@   mocha,-  {watchFiles, watchIgnore},-  fileCollectParams+  { watchFiles, watchIgnore },+  fileCollectParams, ) => {-  debug('creating parallel watcher');+  debug("creating parallel watcher"); @@ -56,3 +56,3 @@     watchIgnore,-    beforeRun({mocha}) {+    beforeRun({ mocha }) {       // I don't know why we're cloning the root suite.@@ -66,3 +66,3 @@       // test depends on this module.-      const Mocha = require('../mocha');+      const Mocha = require("../mocha"); @@ -92,3 +92,3 @@     },-    fileCollectParams+    fileCollectParams,   });@@ -110,4 +110,4 @@  */-exports.watchRun = (mocha, {watchFiles, watchIgnore}, fileCollectParams) => {-  debug('creating serial watcher');+exports.watchRun = (mocha, { watchFiles, watchIgnore }, fileCollectParams) => {+  debug("creating serial watcher"); @@ -116,3 +116,3 @@     watchIgnore,-    beforeRun({mocha}) {+    beforeRun({ mocha }) {       mocha.unloadFiles();@@ -128,3 +128,3 @@       // test depends on this module.-      const Mocha = require('../mocha');+      const Mocha = require("../mocha"); @@ -151,3 +151,3 @@     },-    fileCollectParams+    fileCollectParams,   });@@ -165,3 +165,3 @@ function createPathFilter(globPaths, basePath) {-  debug('creating path filter from glob paths: %s', globPaths);+  debug("creating path filter from glob paths: %s", globPaths); @@ -172,4 +172,4 @@   const res = {-    dir: {paths: new Set(), globs: new Set()},-    match: {paths: new Set(), globs: new Set()}+    dir: { paths: new Set(), globs: new Set() },+    match: { paths: new Set(), globs: new Set() },   };@@ -177,3 +177,3 @@   // for checking if a path ends with `/**/*`-  const globEnd = path.join(path.sep, '**', '*');+  const globEnd = path.join(path.sep, "**", "*"); @@ -183,3 +183,3 @@    */-  const patterns = globPaths.flatMap(globPath => {+  const patterns = globPaths.flatMap((globPath) => {     return new glob.Glob(globPath, {@@ -187,3 +187,3 @@       magicalBraces: true,-      windowsPathsNoEscape: true+      windowsPathsNoEscape: true,     }).patterns;@@ -193,3 +193,3 @@   for (const pattern of patterns) {-    debug('processing glob pattern: %s', pattern.globString());+    debug("processing glob pattern: %s", pattern.globString()); @@ -211,7 +211,7 @@       const entry = currentPattern.pattern();-      const isString = typeof entry === 'string';+      const isString = typeof entry === "string";       debug(-        'found %s pattern: %s',-        isString ? 'string' : 'glob or regexp',-        entry+        "found %s pattern: %s",+        isString ? "string" : "glob or regexp",+        entry,       );@@ -228,3 +228,3 @@     if (!isGlob) {-      debug('all subpatterns of %j processed', pattern.globString());+      debug("all subpatterns of %j processed", pattern.globString());     }@@ -233,5 +233,5 @@     const cleanPath = path.resolve(basePath, ...segments);-    debug('clean path: %s', cleanPath);+    debug("clean path: %s", cleanPath);     res.dir.paths.add(cleanPath);-    res.dir.globs.add(path.resolve(cleanPath, '**', '*'));+    res.dir.globs.add(path.resolve(cleanPath, "**", "*")); @@ -239,3 +239,3 @@     const absPath = path.resolve(basePath, pattern.globString());-    debug('absolute path: %s', absPath);+    debug("absolute path: %s", absPath);     (isGlob ? res.match.globs : res.match.paths).add(absPath);@@ -245,3 +245,3 @@     if (!absPath.endsWith(globEnd)) {-      res.match.globs.add(path.resolve(absPath, '**', '*'));+      res.match.globs.add(path.resolve(absPath, "**", "*"));     }@@ -249,3 +249,3 @@ -  debug('returning path filter: %o', res);+  debug("returning path filter: %o", res);   return res;@@ -278,3 +278,3 @@     if (-      minimatch(filePath, globPath, {dot: true, windowsPathsNoEscape: true})+      minimatch(filePath, globPath, { dot: true, windowsPathsNoEscape: true })     ) {@@ -298,5 +298,5 @@   debug(-    'creating path matcher from allowed: %o, ignored: %o',+    "creating path matcher from allowed: %o, ignored: %o",     allowed,-    ignored+    ignored,   );@@ -381,3 +381,3 @@       return ignore;-    }+    },   };@@ -406,10 +406,10 @@   mocha,-  {watchFiles, watchIgnore, beforeRun, fileCollectParams}+  { watchFiles, watchIgnore, beforeRun, fileCollectParams }, ) => {   if (!watchFiles) {-    watchFiles = fileCollectParams.extension.map(ext => `**/*.${ext}`);+    watchFiles = fileCollectParams.extension.map((ext) => `**/*.${ext}`);   } -  debug('watching files: %s', watchFiles);-  debug('ignoring files matching: %s', watchIgnore);+  debug("watching files: %s", watchFiles);+  debug("ignoring files matching: %s", watchIgnore);   let globalFixtureContext;@@ -433,3 +433,3 @@     ignoreInitial: true,-    ignored: matcher.ignore+    ignored: matcher.ignore,   });@@ -437,9 +437,9 @@   const rerunner = createRerunner(mocha, watcher, {-    beforeRun-  });--  watcher.on('ready', async () => {-    debug('watcher ready');+    beforeRun,+  });++  watcher.on("ready", async () => {+    debug("watcher ready");     if (!globalFixtureContext) {-      debug('triggering global setup');+      debug("triggering global setup");       globalFixtureContext = await mocha.runGlobalSetup();@@ -449,3 +449,3 @@ -  watcher.on('all', (_event, filePath) => {+  watcher.on("all", (_event, filePath) => {     // only allow file paths that match the allowed patterns@@ -457,3 +457,3 @@   hideCursor();-  process.on('exit', () => {+  process.on("exit", () => {     showCursor();@@ -470,5 +470,5 @@   if (process.connected) {-    process.on('message', msg => {-      if (msg === 'SIGINT') {-        process.emit('SIGINT');+    process.on("message", (msg) => {+      if (msg === "SIGINT") {+        process.emit("SIGINT");       }@@ -478,3 +478,3 @@   let exiting = false;-  process.on('SIGINT', async () => {+  process.on("SIGINT", async () => {     showCursor();@@ -484,3 +484,3 @@       if (mocha.hasGlobalTeardownFixtures()) {-        debug('running global teardown');+        debug("running global teardown");         try {@@ -497,6 +497,6 @@   process.stdin.resume();-  process.stdin.setEncoding('utf8');-  process.stdin.on('data', data => {+  process.stdin.setEncoding("utf8");+  process.stdin.on("data", (data) => {     const str = data.toString().trim().toLowerCase();-    if (str === 'rs') rerunner.scheduleRun();+    if (str === "rs") rerunner.scheduleRun();   });@@ -517,3 +517,3 @@  */-const createRerunner = (mocha, watcher, {beforeRun} = {}) => {+const createRerunner = (mocha, watcher, { beforeRun } = {}) => {   // Set to a `Runner` when mocha is running. Set to `null` when mocha is not@@ -527,5 +527,5 @@     try {-      mocha = beforeRun ? beforeRun({mocha, watcher}) || mocha : mocha;+      mocha = beforeRun ? beforeRun({ mocha, watcher }) || mocha : mocha;       runner = mocha.run(() => {-        debug('finished watch run');+        debug("finished watch run");
… 47 more lines (truncated)
lib/context.js +1 lines
--- +++ @@ -1,2 +1,2 @@-'use strict';+"use strict"; 
lib/error-constants.js +17 lines
--- +++ @@ -1,2 +1,2 @@-'use strict';+"use strict"; @@ -14,3 +14,3 @@    */-  FATAL: 'ERR_MOCHA_FATAL',+  FATAL: "ERR_MOCHA_FATAL", @@ -21,3 +21,3 @@    */-  INVALID_ARG_TYPE: 'ERR_MOCHA_INVALID_ARG_TYPE',+  INVALID_ARG_TYPE: "ERR_MOCHA_INVALID_ARG_TYPE", @@ -28,3 +28,3 @@    */-  INVALID_ARG_VALUE: 'ERR_MOCHA_INVALID_ARG_VALUE',+  INVALID_ARG_VALUE: "ERR_MOCHA_INVALID_ARG_VALUE", @@ -35,3 +35,3 @@    */-  INVALID_EXCEPTION: 'ERR_MOCHA_INVALID_EXCEPTION',+  INVALID_EXCEPTION: "ERR_MOCHA_INVALID_EXCEPTION", @@ -42,3 +42,3 @@    */-  INVALID_INTERFACE: 'ERR_MOCHA_INVALID_INTERFACE',+  INVALID_INTERFACE: "ERR_MOCHA_INVALID_INTERFACE", @@ -49,3 +49,3 @@    */-  INVALID_REPORTER: 'ERR_MOCHA_INVALID_REPORTER',+  INVALID_REPORTER: "ERR_MOCHA_INVALID_REPORTER", @@ -56,3 +56,3 @@    */-  MULTIPLE_DONE: 'ERR_MOCHA_MULTIPLE_DONE',+  MULTIPLE_DONE: "ERR_MOCHA_MULTIPLE_DONE", @@ -63,3 +63,3 @@    */-  NO_FILES_MATCH_PATTERN: 'ERR_MOCHA_NO_FILES_MATCH_PATTERN',+  NO_FILES_MATCH_PATTERN: "ERR_MOCHA_NO_FILES_MATCH_PATTERN", @@ -70,3 +70,3 @@    */-  UNSUPPORTED: 'ERR_MOCHA_UNSUPPORTED',+  UNSUPPORTED: "ERR_MOCHA_UNSUPPORTED", @@ -77,3 +77,3 @@    */-  INSTANCE_ALREADY_RUNNING: 'ERR_MOCHA_INSTANCE_ALREADY_RUNNING',+  INSTANCE_ALREADY_RUNNING: "ERR_MOCHA_INSTANCE_ALREADY_RUNNING", @@ -84,3 +84,3 @@    */-  INSTANCE_ALREADY_DISPOSED: 'ERR_MOCHA_INSTANCE_ALREADY_DISPOSED',+  INSTANCE_ALREADY_DISPOSED: "ERR_MOCHA_INSTANCE_ALREADY_DISPOSED", @@ -91,3 +91,3 @@    */-  FORBIDDEN_EXCLUSIVITY: 'ERR_MOCHA_FORBIDDEN_EXCLUSIVITY',+  FORBIDDEN_EXCLUSIVITY: "ERR_MOCHA_FORBIDDEN_EXCLUSIVITY", @@ -98,3 +98,3 @@    */-  INVALID_PLUGIN_IMPLEMENTATION: 'ERR_MOCHA_INVALID_PLUGIN_IMPLEMENTATION',+  INVALID_PLUGIN_IMPLEMENTATION: "ERR_MOCHA_INVALID_PLUGIN_IMPLEMENTATION", @@ -105,3 +105,3 @@    */-  INVALID_PLUGIN_DEFINITION: 'ERR_MOCHA_INVALID_PLUGIN_DEFINITION',+  INVALID_PLUGIN_DEFINITION: "ERR_MOCHA_INVALID_PLUGIN_DEFINITION", @@ -112,3 +112,3 @@    */-  TIMEOUT: 'ERR_MOCHA_TIMEOUT',+  TIMEOUT: "ERR_MOCHA_TIMEOUT", @@ -119,3 +119,3 @@    */-  UNPARSABLE_FILE: 'ERR_MOCHA_UNPARSABLE_FILE'+  UNPARSABLE_FILE: "ERR_MOCHA_UNPARSABLE_FILE", };
lib/errors.js +26 lines
--- +++ @@ -1,2 +1,2 @@-'use strict';+"use strict"; @@ -9,4 +9,4 @@ -const {format} = require('node:util');-const { constants } = require('./error-constants.js');+const { format } = require("node:util");+const { constants } = require("./error-constants.js"); @@ -29,3 +29,3 @@     process.nextTick(function () {-      console.warn(type + ': ' + msg);+      console.warn(type + ": " + msg);     });@@ -41,3 +41,3 @@  */-const deprecate = msg => {+const deprecate = (msg) => {   msg = String(msg);@@ -45,3 +45,3 @@     deprecate.cache[msg] = true;-    emitWarning(msg, 'DeprecationWarning');+    emitWarning(msg, "DeprecationWarning");   }@@ -57,3 +57,3 @@  */-const warn = msg => {+const warn = (msg) => {   if (msg) {@@ -179,3 +179,3 @@   err.value = value;-  err.reason = typeof reason !== 'undefined' ? reason : 'is invalid';+  err.reason = typeof reason !== "undefined" ? reason : "is invalid";   return err;@@ -227,5 +227,5 @@   switch (pluginType) {-    case 'reporter':+    case "reporter":       return createInvalidReporterError(message, pluginId);-    case 'ui':+    case "ui":       return createInvalidInterfaceError(message, pluginId);@@ -248,3 +248,3 @@ function createInvalidPluginError(...args) {-  deprecate('Use createInvalidLegacyPluginError() instead');+  deprecate("Use createInvalidLegacyPluginError() instead");   return createInvalidLegacyPluginError(...args);@@ -262,3 +262,3 @@   cleanReferencesAfterRun,-  instance+  instance, ) {@@ -296,19 +296,19 @@   try {-    title = format('<%s>', runnable.fullTitle());+    title = format("<%s>", runnable.fullTitle());     if (runnable.parent.root) {-      title += ' (of root suite)';+      title += " (of root suite)";     }   } catch (ignored) {-    title = format('<%s> (of unknown suite)', runnable.title);+    title = format("<%s> (of unknown suite)", runnable.title);   }   var message = format(-    'done() called multiple times in %s %s',-    runnable.type ? runnable.type : 'unknown runnable',-    title+    "done() called multiple times in %s %s",+    runnable.type ? runnable.type : "unknown runnable",+    title,   );   if (runnable.file) {-    message += format(' of file %s', runnable.file);+    message += format(" of file %s", runnable.file);   }   if (originalErr) {-    message += format('; in addition, done() received error: %s', originalErr);+    message += format("; in addition, done() received error: %s", originalErr);   }@@ -333,4 +333,4 @@     mocha.isWorker-      ? '`.only` is not supported in parallel mode'-      : '`.only` forbidden by --forbid-only'+      ? "`.only` is not supported in parallel mode"+      : "`.only` forbidden by --forbid-only",   );@@ -367,3 +367,3 @@   msg,-  {pluginDef, pluginImpl} = {}+  { pluginDef, pluginImpl } = {}, ) {@@ -413,4 +413,4 @@  */-const isMochaError = err =>-  Boolean(err && typeof err === 'object' && MOCHA_ERRORS.has(err.code));+const isMochaError = (err) =>+  Boolean(err && typeof err === "object" && MOCHA_ERRORS.has(err.code)); @@ -438,3 +438,3 @@   isMochaError,-  warn+  warn, };
lib/hook.js +9 lines
--- +++ @@ -1,6 +1,6 @@-'use strict';+"use strict"; -var Runnable = require('./runnable');-const {inherits, constants} = require('./utils');-const {MOCHA_ID_PROP_NAME} = constants;+var Runnable = require("./runnable");+const { inherits, constants } = require("./utils");+const { MOCHA_ID_PROP_NAME } = constants; @@ -22,3 +22,3 @@   Runnable.call(this, title, fn);-  this.type = 'hook';+  this.type = "hook"; }@@ -73,4 +73,4 @@               title: this.ctx.currentTest.title,-              [MOCHA_ID_PROP_NAME]: this.ctx.currentTest.id-            }+              [MOCHA_ID_PROP_NAME]: this.ctx.currentTest.id,+            },           }@@ -81,3 +81,3 @@       $$fullTitle: this.parent.fullTitle(),-      [MOCHA_ID_PROP_NAME]: this.parent.id+      [MOCHA_ID_PROP_NAME]: this.parent.id,     },@@ -86,3 +86,3 @@     type: this.type,-    [MOCHA_ID_PROP_NAME]: this.id+    [MOCHA_ID_PROP_NAME]: this.id,   };
rc npm
1.2.8 8y ago incident on record
DELETION ×3BURST ×3
latest 1.2.8 versions 48 maintainers 9
1.2.0
1.2.1
1.2.2
1.2.3
1.2.4
1.2.5
1.2.6
1.2.7
1.2.8
1.2.9
1.3.9
2.3.9
DELETION
1.2.9 published then removed
high · registry-verified · 2021-11-04 · 4y ago
DELETION
1.3.9 published then removed
high · registry-verified · 2021-11-04 · 4y ago
DELETION
2.3.9 published then removed
high · registry-verified · 2021-11-04 · 4y ago
BURST
2 releases in 1m: 0.1.2, 0.1.3
info · registry-verified · 2013-04-27 · 13y ago
BURST
2 releases in 1m: 1.1.3, 1.1.4
info · registry-verified · 2015-11-05 · 10y ago
BURST
3 releases in 0m: 1.2.9, 1.3.9, 2.3.9
info · registry-verified · 2021-11-04 · 4y ago
release diff 1.2.7 → 1.2.8
+0 added · -0 removed · ~1 modified
package.json +2 lines
--- +++ @@ -2,3 +2,3 @@   "name": "rc",-  "version": "1.2.7",+  "version": "1.2.8",   "description": "hardwired configuration loader",@@ -23,3 +23,3 @@   "dependencies": {-    "deep-extend": "^0.5.1",+    "deep-extend": "^0.6.0",     "ini": "~1.3.0",
rimraf npm
6.1.3 3mo ago incident on record
DELETIONBURST ×7
latest 6.1.3 versions 86 maintainers 1
5.0.5
5.0.6
5.0.7
5.0.8
5.0.9
6.0.0
6.0.1
5.0.10
6.1.0
6.1.1
6.1.2
6.1.3
DELETION
2.2.7 published then removed
high · registry-verified · 2014-05-05 · 12y ago
BURST
2 releases in 11m: 1.0.5, 1.0.6
info · registry-verified · 2011-09-03 · 14y ago
BURST
2 releases in 4m: 2.2.3, 2.2.4
info · registry-verified · 2013-11-29 · 12y ago
BURST
2 releases in 24m: 4.0.0, 4.0.1
info · registry-verified · 2023-01-13 · 3y ago
BURST
3 releases in 9m: 4.0.2, 4.0.3, 4.0.4
info · registry-verified · 2023-01-13 · 3y ago
BURST
2 releases in 10m: 5.0.3, 5.0.4
info · registry-verified · 2023-09-25 · 2y ago
BURST
2 releases in 2m: 5.0.9, 6.0.0
info · registry-verified · 2024-07-08 · 1y ago
BURST
2 releases in 24m: 6.1.1, 6.1.2
info · registry-verified · 2025-11-19 · 6mo ago
release diff 6.1.2 → 6.1.3
+0 added · -0 removed · ~45 modified
dist/commonjs/fs.d.ts +9 lines
--- +++ @@ -1,2 +1,3 @@ import fs, { Dirent } from 'fs';+import fsPromises from 'fs/promises'; export { chmodSync, mkdirSync, renameSync, rmdirSync, rmSync, statSync, lstatSync, unlinkSync, } from 'fs';@@ -4,11 +5,11 @@ export declare const promises: {-    chmod: typeof fs.promises.chmod;-    mkdir: typeof fs.promises.mkdir;+    chmod: typeof fsPromises.chmod;+    mkdir: typeof fsPromises.mkdir;     readdir: (path: fs.PathLike) => Promise<fs.Dirent<string>[]>;-    rename: typeof fs.promises.rename;-    rm: typeof fs.promises.rm;-    rmdir: typeof fs.promises.rmdir;-    stat: typeof fs.promises.stat;-    lstat: typeof fs.promises.lstat;-    unlink: typeof fs.promises.unlink;+    rename: typeof fsPromises.rename;+    rm: typeof fsPromises.rm;+    rmdir: typeof fsPromises.rmdir;+    stat: typeof fsPromises.stat;+    lstat: typeof fsPromises.lstat;+    unlink: typeof fsPromises.unlink; };
dist/commonjs/index.js +9 lines
--- +++ @@ -45,7 +45,13 @@ exports.nativeSync = wrapSync(rimraf_native_js_1.rimrafNativeSync);-exports.native = Object.assign(wrap(rimraf_native_js_1.rimrafNative), { sync: exports.nativeSync });+exports.native = Object.assign(wrap(rimraf_native_js_1.rimrafNative), {+    sync: exports.nativeSync,+}); exports.manualSync = wrapSync(rimraf_manual_js_1.rimrafManualSync);-exports.manual = Object.assign(wrap(rimraf_manual_js_1.rimrafManual), { sync: exports.manualSync });+exports.manual = Object.assign(wrap(rimraf_manual_js_1.rimrafManual), {+    sync: exports.manualSync,+}); exports.windowsSync = wrapSync(rimraf_windows_js_1.rimrafWindowsSync);-exports.windows = Object.assign(wrap(rimraf_windows_js_1.rimrafWindows), { sync: exports.windowsSync });+exports.windows = Object.assign(wrap(rimraf_windows_js_1.rimrafWindows), {+    sync: exports.windowsSync,+}); exports.posixSync = wrapSync(rimraf_posix_js_1.rimrafPosixSync);
dist/commonjs/opt-arg.js +2 lines
--- +++ @@ -12,3 +12,4 @@     typeOrUndef(o.maxBackoff, 'number') &&-    (typeOrUndef(o.glob, 'boolean') || (o.glob && typeof o.glob === 'object')) &&+    (typeOrUndef(o.glob, 'boolean') ||+        (o.glob && typeof o.glob === 'object')) &&     typeOrUndef(o.filter, 'function');
dist/commonjs/path-arg.js +2 lines
--- +++ @@ -11,3 +11,4 @@                 : `type ${type} ${path}`;-        const msg = 'The "path" argument must be of type string. ' + `Received ${received}`;+        const msg = 'The "path" argument must be of type string. ' ++            `Received ${received}`;         throw Object.assign(new TypeError(msg), {
dist/commonjs/readdir-or-error.d.ts +2 lines
--- +++ @@ -1,3 +1,3 @@-export declare const readdirOrError: (path: string) => Promise<import("fs").Dirent<string>[] | Error>;-export declare const readdirOrErrorSync: (path: string) => import("fs").Dirent<string>[] | Error;+export declare const readdirOrError: (path: string) => Promise<import("node:fs").Dirent<string>[] | Error>;+export declare const readdirOrErrorSync: (path: string) => import("node:fs").Dirent<string>[] | Error; //# sourceMappingURL=readdir-or-error.d.ts.map
dist/commonjs/rimraf-posix.js +1 lines
--- +++ @@ -21,4 +21,3 @@     opt?.signal?.throwIfAborted();-    return ((0, ignore_enoent_js_1.ignoreENOENTSync)(() => rimrafPosixDirSync(path, opt, (0, fs_js_1.lstatSync)(path))) ??-        true);+    return ((0, ignore_enoent_js_1.ignoreENOENTSync)(() => rimrafPosixDirSync(path, opt, (0, fs_js_1.lstatSync)(path))) ?? true); };
dist/esm/fs.d.ts +9 lines
--- +++ @@ -1,2 +1,3 @@ import fs, { Dirent } from 'fs';+import fsPromises from 'fs/promises'; export { chmodSync, mkdirSync, renameSync, rmdirSync, rmSync, statSync, lstatSync, unlinkSync, } from 'fs';@@ -4,11 +5,11 @@ export declare const promises: {-    chmod: typeof fs.promises.chmod;-    mkdir: typeof fs.promises.mkdir;+    chmod: typeof fsPromises.chmod;+    mkdir: typeof fsPromises.mkdir;     readdir: (path: fs.PathLike) => Promise<fs.Dirent<string>[]>;-    rename: typeof fs.promises.rename;-    rm: typeof fs.promises.rm;-    rmdir: typeof fs.promises.rmdir;-    stat: typeof fs.promises.stat;-    lstat: typeof fs.promises.lstat;-    unlink: typeof fs.promises.unlink;+    rename: typeof fsPromises.rename;+    rm: typeof fsPromises.rm;+    rmdir: typeof fsPromises.rmdir;+    stat: typeof fsPromises.stat;+    lstat: typeof fsPromises.lstat;+    unlink: typeof fsPromises.unlink; };
dist/esm/index.js +10 lines
--- +++ @@ -4,3 +4,3 @@ import { rimrafManual, rimrafManualSync } from './rimraf-manual.js';-import { rimrafMoveRemove, rimrafMoveRemoveSync } from './rimraf-move-remove.js';+import { rimrafMoveRemove, rimrafMoveRemoveSync, } from './rimraf-move-remove.js'; import { rimrafNative, rimrafNativeSync } from './rimraf-native.js';@@ -37,7 +37,13 @@ export const nativeSync = wrapSync(rimrafNativeSync);-export const native = Object.assign(wrap(rimrafNative), { sync: nativeSync });+export const native = Object.assign(wrap(rimrafNative), {+    sync: nativeSync,+}); export const manualSync = wrapSync(rimrafManualSync);-export const manual = Object.assign(wrap(rimrafManual), { sync: manualSync });+export const manual = Object.assign(wrap(rimrafManual), {+    sync: manualSync,+}); export const windowsSync = wrapSync(rimrafWindowsSync);-export const windows = Object.assign(wrap(rimrafWindows), { sync: windowsSync });+export const windows = Object.assign(wrap(rimrafWindows), {+    sync: windowsSync,+}); export const posixSync = wrapSync(rimrafPosixSync);
dist/esm/opt-arg.js +2 lines
--- +++ @@ -9,3 +9,4 @@     typeOrUndef(o.maxBackoff, 'number') &&-    (typeOrUndef(o.glob, 'boolean') || (o.glob && typeof o.glob === 'object')) &&+    (typeOrUndef(o.glob, 'boolean') ||+        (o.glob && typeof o.glob === 'object')) &&     typeOrUndef(o.filter, 'function');
dist/esm/path-arg.js +2 lines
--- +++ @@ -9,3 +9,4 @@                 : `type ${type} ${path}`;-        const msg = 'The "path" argument must be of type string. ' + `Received ${received}`;+        const msg = 'The "path" argument must be of type string. ' ++            `Received ${received}`;         throw Object.assign(new TypeError(msg), {
dist/esm/readdir-or-error.d.ts +2 lines
--- +++ @@ -1,3 +1,3 @@-export declare const readdirOrError: (path: string) => Promise<import("fs").Dirent<string>[] | Error>;-export declare const readdirOrErrorSync: (path: string) => import("fs").Dirent<string>[] | Error;+export declare const readdirOrError: (path: string) => Promise<import("node:fs").Dirent<string>[] | Error>;+export declare const readdirOrErrorSync: (path: string) => import("node:fs").Dirent<string>[] | Error; //# sourceMappingURL=readdir-or-error.d.ts.map
dist/esm/rimraf-move-remove.js +1 lines
--- +++ @@ -15,3 +15,3 @@ import { ignoreENOENT, ignoreENOENTSync } from './ignore-enoent.js';-import { lstatSync, promises, renameSync, rmdirSync, unlinkSync } from './fs.js';+import { lstatSync, promises, renameSync, rmdirSync, unlinkSync, } from './fs.js'; import { readdirOrError, readdirOrErrorSync } from './readdir-or-error.js';
dist/esm/rimraf-posix.js +1 lines
--- +++ @@ -17,4 +17,3 @@     opt?.signal?.throwIfAborted();-    return (ignoreENOENTSync(() => rimrafPosixDirSync(path, opt, lstatSync(path))) ??-        true);+    return (ignoreENOENTSync(() => rimrafPosixDirSync(path, opt, lstatSync(path))) ?? true); };
dist/esm/rimraf-windows.js +1 lines
--- +++ @@ -15,3 +15,3 @@ import { retryBusy, retryBusySync } from './retry-busy.js';-import { rimrafMoveRemove, rimrafMoveRemoveSync } from './rimraf-move-remove.js';+import { rimrafMoveRemove, rimrafMoveRemoveSync, } from './rimraf-move-remove.js'; import { errorCode } from './error.js';
package.json +4 lines
--- +++ @@ -2,3 +2,3 @@   "name": "rimraf",-  "version": "6.1.2",+  "version": "6.1.3",   "type": "module",@@ -47,16 +47,4 @@   },-  "prettier": {-    "experimentalTernaries": true,-    "semi": false,-    "printWidth": 80,-    "tabWidth": 2,-    "useTabs": false,-    "singleQuote": true,-    "jsxSingleQuote": false,-    "bracketSameLine": true,-    "arrowParens": "avoid",-    "endOfLine": "lf"-  },   "devDependencies": {-    "@types/node": "^24.9.2",+    "@types/node": "^25.2.0",     "mkdirp": "^3.0.1",@@ -74,3 +62,3 @@   "dependencies": {-    "glob": "^13.0.0",+    "glob": "^13.0.3",     "package-json-from-dist": "^1.0.1"@@ -87,6 +75,3 @@   ],-  "module": "./dist/esm/index.js",-  "tap": {-    "coverage-map": "map.js"-  }+  "module": "./dist/esm/index.js" }
ts-jest npm
29.4.11 10d ago incident on record
DELETIONBURST ×5
latest 29.4.11 versions 217 maintainers 3
29.4.0
29.4.1
29.4.2
29.4.3
29.4.4
29.4.5
29.4.6
29.4.7
29.4.8
29.4.9
29.4.10
29.4.11
DELETION
0.1.12 published then removed
high · registry-verified · 2016-11-03 · 9y ago
BURST
3 releases in 44m: 0.0.1, 0.1.0, 0.1.1
info · registry-verified · 2016-08-31 · 9y ago
BURST
2 releases in 2m: 0.1.2, 0.1.3
info · registry-verified · 2016-08-31 · 9y ago
BURST
2 releases in 47m: 17.0.2, 17.0.3
info · registry-verified · 2016-12-01 · 9y ago
BURST
2 releases in 59m: 19.0.12, 19.0.13
info · registry-verified · 2017-04-26 · 9y ago
BURST
3 releases in 49m: 29.4.7, 29.4.8, 29.4.9
info · registry-verified · 2026-04-01 · 2mo ago
release diff 29.4.10 → 29.4.11
+1 added · -0 removed · ~5 modified
dist/legacy/compiler/ts-compiler.d.ts +11 lines
--- +++ @@ -68,7 +68,7 @@      *   - User-supplied Bundler with a non-Bundler-compatible forced module is-     *     also TS5095 on the supported TS range — substitute Node10. (TypeScript-     *     6 relaxed this for `module: CommonJS` specifically; that relaxation is-     *     deliberately not encoded here so behavior stays consistent across the-     *     full peerDependency range. See `isBundlerCompatibleModuleKind` for the-     *     follow-up pointer.)+     *     TS5095, substitute Node10. (TypeScript 6 relaxed this for+     *     `module: CommonJS` specifically; that relaxation is encoded inside+     *     `isBundlerCompatibleModuleKind` via a runtime version check, so on+     *     TS ≥ 6 user-supplied Bundler passes through unchanged on the CJS+     *     path.)      *@@ -96,9 +96,8 @@      *-     * Note: TypeScript 6.0 relaxed this restriction for `module: CommonJS`-     * specifically (`CommonJS` + `Bundler` is now a valid pair on TS ≥ 6); the-     * other non-ES module kinds (`AMD` / `UMD` / `System` / `None`) remain-     * Bundler-incompatible on every TypeScript version. The TS 6 relaxation is-     * intentionally not encoded here to keep behavior consistent across the full-     * peerDependency range (`>=4.3 <7`); honoring it can ride in as a follow-up-     * once the TS 6 baseline lands.+     * TypeScript 6.0 relaxed TS5095 for `module: CommonJS` specifically+     * (`CommonJS` + `Bundler` is a valid pair on TS ≥ 6); the other non-ES+     * module kinds (`AMD` / `UMD` / `System` / `None`) remain Bundler-incompatible+     * on every TypeScript version. The version is detected at runtime from+     * `this._ts.version` so the function stays correct across the full+     * peerDependency range (`>=4.3 <7`).      *
dist/legacy/compiler/ts-compiler.js +16 lines
--- +++ @@ -183,7 +183,7 @@      *   - User-supplied Bundler with a non-Bundler-compatible forced module is-     *     also TS5095 on the supported TS range — substitute Node10. (TypeScript-     *     6 relaxed this for `module: CommonJS` specifically; that relaxation is-     *     deliberately not encoded here so behavior stays consistent across the-     *     full peerDependency range. See `isBundlerCompatibleModuleKind` for the-     *     follow-up pointer.)+     *     TS5095, substitute Node10. (TypeScript 6 relaxed this for+     *     `module: CommonJS` specifically; that relaxation is encoded inside+     *     `isBundlerCompatibleModuleKind` via a runtime version check, so on+     *     TS ≥ 6 user-supplied Bundler passes through unchanged on the CJS+     *     path.)      *@@ -226,9 +226,8 @@      *-     * Note: TypeScript 6.0 relaxed this restriction for `module: CommonJS`-     * specifically (`CommonJS` + `Bundler` is now a valid pair on TS ≥ 6); the-     * other non-ES module kinds (`AMD` / `UMD` / `System` / `None`) remain-     * Bundler-incompatible on every TypeScript version. The TS 6 relaxation is-     * intentionally not encoded here to keep behavior consistent across the full-     * peerDependency range (`>=4.3 <7`); honoring it can ride in as a follow-up-     * once the TS 6 baseline lands.+     * TypeScript 6.0 relaxed TS5095 for `module: CommonJS` specifically+     * (`CommonJS` + `Bundler` is a valid pair on TS ≥ 6); the other non-ES+     * module kinds (`AMD` / `UMD` / `System` / `None`) remain Bundler-incompatible+     * on every TypeScript version. The version is detected at runtime from+     * `this._ts.version` so the function stays correct across the full+     * peerDependency range (`>=4.3 <7`).      *@@ -245,2 +244,7 @@             return true;+        }+        // TS 6 made `CommonJS` + `Bundler` a valid pair.+        if (moduleKind === M.CommonJS) {+            const tsMajor = parseInt(this._ts.version.split('.')[0], 10);+            return tsMajor >= 6;         }
package.json +1 lines
--- +++ @@ -2,3 +2,3 @@   "name": "ts-jest",-  "version": "29.4.10",+  "version": "29.4.11",   "main": "dist/index.js",
ts-node npm
10.9.2 2y ago incident on record
DELETIONBURST ×10
latest 10.9.2 versions 128 maintainers 2
10.3.0
10.3.1
10.4.0
10.5.0
10.6.0
10.7.0
10.8.0
10.8.1
10.8.2
10.9.0
10.9.1
10.9.2
DELETION
8.5.1 published then removed
high · registry-verified · 2019-11-15 · 6y ago
BURST
2 releases in 10m: 0.2.1, 0.2.2
info · registry-verified · 2015-09-22 · 10y ago
BURST
2 releases in 18m: 1.2.0, 1.2.1
info · registry-verified · 2016-07-22 · 9y ago
BURST
3 releases in 21m: 1.5.0, 1.5.1, 1.5.2
info · registry-verified · 2016-10-15 · 9y ago
BURST
2 releases in 48m: 2.1.1, 2.1.2
info · registry-verified · 2017-03-21 · 9y ago
BURST
2 releases in 17m: 3.2.2, 3.3.0
info · registry-verified · 2017-07-24 · 8y ago
BURST
2 releases in 53m: 4.0.0, 4.0.1
info · registry-verified · 2017-12-10 · 8y ago
BURST
2 releases in 18m: 6.2.0, 7.0.0
info · registry-verified · 2018-06-22 · 7y ago
BURST
2 releases in 23m: 8.0.0, 8.0.1
info · registry-verified · 2019-01-22 · 7y ago
BURST
2 releases in 57m: 8.4.0, 8.4.1
info · registry-verified · 2019-09-15 · 6y ago
BURST
2 releases in 7m: 8.5.1, 8.5.2
info · registry-verified · 2019-11-15 · 6y ago
release diff 10.9.1 → 10.9.2
+0 added · -0 removed · ~8 modified
dist/transpilers/swc.js +19 lines
--- +++ @@ -3,2 +3,3 @@ exports.createSwcOptions = exports.targetMapping = exports.create = void 0;+const ts_internals_1 = require("../ts-internals"); function create(createOptions) {@@ -37,5 +38,3 @@         const { fileName } = transpileOptions;-        const swcOptions = fileName.endsWith('.tsx') || fileName.endsWith('.jsx')-            ? tsxOptions-            : nonTsxOptions;+        const swcOptions = fileName.endsWith('.tsx') || fileName.endsWith('.jsx') ? tsxOptions : nonTsxOptions;         const { code, map } = swcInstance.transformSync(input, {@@ -63,3 +62,3 @@ exports.targetMapping.set(/* ts.ScriptTarget.ES2022 */ 9, 'es2022');-exports.targetMapping.set(/* ts.ScriptTarget.ESNext */ 99, 'es2022');+exports.targetMapping.set(/* ts.ScriptTarget.ESNext */ 99, 'esnext'); /**@@ -79,2 +78,3 @@     'es2022',+    'esnext', ];@@ -102,3 +102,3 @@     var _a;-    const { esModuleInterop, sourceMap, importHelpers, experimentalDecorators, emitDecoratorMetadata, target, module, jsx, jsxFactory, jsxFragmentFactory, strict, alwaysStrict, noImplicitUseStrict, } = compilerOptions;+    const { esModuleInterop, sourceMap, importHelpers, experimentalDecorators, emitDecoratorMetadata, target, module, jsx, jsxFactory, jsxFragmentFactory, strict, alwaysStrict, noImplicitUseStrict, jsxImportSource, } = compilerOptions;     let swcTarget = (_a = exports.targetMapping.get(target)) !== null && _a !== void 0 ? _a : 'es3';@@ -147,6 +147,5 @@         : true;-    const jsxRuntime = jsx === JsxEmit.ReactJSX || jsx === JsxEmit.ReactJSXDev-        ? 'automatic'-        : undefined;+    const jsxRuntime = jsx === JsxEmit.ReactJSX || jsx === JsxEmit.ReactJSXDev ? 'automatic' : undefined;     const jsxDevelopment = jsx === JsxEmit.ReactJSXDev ? true : undefined;+    const useDefineForClassFields = (0, ts_internals_1.getUseDefineForClassFields)(compilerOptions);     const nonTsxOptions = createVariant(false);@@ -160,7 +159,11 @@                 ? {-                    noInterop: !esModuleInterop,                     type: moduleType,-                    strictMode,-                    // For NodeNext and Node12, emit as CJS but do not transform dynamic imports-                    ignoreDynamic: nodeModuleEmitKind === 'nodecjs',+                    ...(moduleType === 'amd' || moduleType === 'commonjs' || moduleType === 'umd'+                        ? {+                            noInterop: !esModuleInterop,+                            strictMode,+                            // For NodeNext and Node12, emit as CJS but do not transform dynamic imports+                            ignoreDynamic: nodeModuleEmitKind === 'nodecjs',+                        }+                        : {}),                 }@@ -188,3 +191,5 @@                         runtime: jsxRuntime,+                        importSource: jsxImportSource,                     },+                    useDefineForClassFields,                 },@@ -192,3 +197,4 @@                 experimental: {-                    keepImportAssertions: true,+                    keepImportAttributes: true,+                    emitAssertForImportAttributes: true,                 },
dist/ts-internals.d.ts +6 lines
--- +++ @@ -1 +1,6 @@-export {};+import type * as _ts from 'typescript';+export declare function getUseDefineForClassFields(compilerOptions: _ts.CompilerOptions): boolean;+export declare function getEmitScriptTarget(compilerOptions: {+    module?: _ts.CompilerOptions['module'];+    target?: _ts.CompilerOptions['target'];+}): _ts.ScriptTarget;
dist/ts-internals.js +24 lines
--- +++ @@ -2,3 +2,3 @@ Object.defineProperty(exports, "__esModule", { value: true });-exports.getPatternFromSpec = exports.createTsInternals = void 0;+exports.getEmitScriptTarget = exports.getUseDefineForClassFields = exports.getPatternFromSpec = exports.createTsInternals = void 0; const path_1 = require("path");@@ -39,2 +39,3 @@         // If the path isn't a rooted or relative path, resolve like a module+        const tsGte5_3_0 = (0, util_1.versionGteLt)(ts.version, '5.3.0');         const resolved = ts.nodeModuleNameResolver(extendedConfig, combinePaths(basePath, 'tsconfig.json'), { moduleResolution: ts.ModuleResolutionKind.NodeJs }, host, @@ -42,3 +43,4 @@         /*projectRefs*/ undefined, -        /*lookupConfig*/ true);+        /*conditionsOrIsConfigLookup*/ tsGte5_3_0 ? undefined : true, +        /*isConfigLookup*/ tsGte5_3_0 ? true : undefined);         if (resolved.resolvedModule) {@@ -298,2 +300,22 @@ }+const ts_ScriptTarget_ES5 = 1;+const ts_ScriptTarget_ES2022 = 9;+const ts_ScriptTarget_ESNext = 99;+const ts_ModuleKind_Node16 = 100;+const ts_ModuleKind_NodeNext = 199;+// https://github.com/microsoft/TypeScript/blob/fc418a2e611c88cf9afa0115ff73490b2397d311/src/compiler/utilities.ts#L8761+function getUseDefineForClassFields(compilerOptions) {+    return compilerOptions.useDefineForClassFields === undefined+        ? getEmitScriptTarget(compilerOptions) >= ts_ScriptTarget_ES2022+        : compilerOptions.useDefineForClassFields;+}+exports.getUseDefineForClassFields = getUseDefineForClassFields;+// https://github.com/microsoft/TypeScript/blob/fc418a2e611c88cf9afa0115ff73490b2397d311/src/compiler/utilities.ts#L8556+function getEmitScriptTarget(compilerOptions) {+    var _a;+    return ((_a = compilerOptions.target) !== null && _a !== void 0 ? _a : ((compilerOptions.module === ts_ModuleKind_Node16 && ts_ScriptTarget_ES2022) ||+        (compilerOptions.module === ts_ModuleKind_NodeNext && ts_ScriptTarget_ESNext) ||+        ts_ScriptTarget_ES5));+}+exports.getEmitScriptTarget = getEmitScriptTarget; //# sourceMappingURL=ts-internals.js.map
package.json +3 lines
--- +++ @@ -2,3 +2,3 @@   "name": "ts-node",-  "version": "10.9.1",+  "version": "10.9.2",   "description": "TypeScript execution environment and REPL for node.js, with source map support",@@ -114,4 +114,4 @@     "@microsoft/api-extractor": "^7.19.4",-    "@swc/core": ">=1.2.205",-    "@swc/wasm": ">=1.2.205",+    "@swc/core": "^1.3.100",+    "@swc/wasm": "^1.3.100",     "@types/diff": "^4.0.2",
tsconfig.schemastore-schema.json +121 lines
--- +++ @@ -2,2 +2,3 @@   "$schema": "http://json-schema.org/draft-04/schema#",+  "allowTrailingCommas": true,   "allOf": [@@ -94,4 +95,16 @@         "extends": {-          "description": "Path to base configuration file to inherit from. Requires TypeScript version 2.1 or later.",-          "type": "string"+          "description": "Path to base configuration file to inherit from (requires TypeScript version 2.1 or later), or array of base files, with the rightmost files having the greater priority (requires TypeScript version 5.0 or later).",+          "oneOf": [+            {+              "default": "",+              "type": "string"+            },+            {+              "default": [],+              "items": {+                "type": "string"+              },+              "type": "array"+            }+          ]         }@@ -200,2 +213,12 @@           "properties": {+            "allowArbitraryExtensions": {+              "description": "Enable importing files with any extension, provided a declaration file is present.",+              "type": "boolean",+              "markdownDescription": "Enable importing files with any extension, provided a declaration file is present.\n\nSee more: https://www.typescriptlang.org/tsconfig#allowImportingTsExtensions"+            },+            "allowImportingTsExtensions": {+              "description": "Allow imports to include TypeScript file extensions. Requires '--moduleResolution bundler' and either '--noEmit' or '--emitDeclarationOnly' to be set.",+              "type": "boolean",+              "markdownDescription": "Allow imports to include TypeScript file extensions. Requires '--moduleResolution bundler' and either '--noEmit' or '--emitDeclarationOnly' to be set.\n\nSee more: https://www.typescriptlang.org/tsconfig#allowImportingTsExtensions"+            },             "charset": {@@ -210,2 +233,11 @@               "markdownDescription": "Enable constraints that allow a TypeScript project to be used with project references.\n\nSee more: https://www.typescriptlang.org/tsconfig#composite"+            },+            "customConditions": {+              "description": "Conditions to set in addition to the resolver-specific defaults when resolving imports.",+              "type": "array",+              "uniqueItems": true,+              "items": {+                "type": "string"+              },+              "markdownDescription": "Conditions to set in addition to the resolver-specific defaults when resolving imports.\n\nSee more: https://www.typescriptlang.org/tsconfig#customConditions"             },@@ -263,5 +295,9 @@             "tsBuildInfoFile": {+              "$comment": "The value of 'null' is UNDOCUMENTED.",               "description": "Specify the folder for .tsbuildinfo incremental compilation files.",               "default": ".tsbuildinfo",-              "type": "string",+              "type": [+                "string",+                "null"+              ],               "markdownDescription": "Specify the folder for .tsbuildinfo incremental compilation files.\n\nSee more: https://www.typescriptlang.org/tsconfig#tsBuildInfoFile"@@ -346,3 +382,3 @@                 {-                  "pattern": "^([Cc][Oo][Mm][Mm][Oo][Nn][Jj][Ss]|[AaUu][Mm][Dd]|[Ss][Yy][Ss][Tt][Ee][Mm]|[Ee][Ss]([356]|20(1[567]|2[02])|[Nn][Ee][Xx][Tt])|[Nn][Oo][dD][Ee]16|[Nn][Oo][Dd][Ed][Nn][Ee][Xx][Tt]|[Nn][Oo][Nn][Ee])$"+                  "pattern": "^([Cc][Oo][Mm][Mm][Oo][Nn][Jj][Ss]|[AaUu][Mm][Dd]|[Ss][Yy][Ss][Tt][Ee][Mm]|[Ee][Ss]([356]|20(1[567]|2[02])|[Nn][Ee][Xx][Tt])|[Nn][Oo][dD][Ee]16|[Nn][Oo][Dd][Ee][Nn][Ee][Xx][Tt]|[Nn][Oo][Nn][Ee])$"                 }@@ -359,4 +395,14 @@                     "Node",+                    "Node10",                     "Node16",-                    "NodeNext"+                    "NodeNext",+                    "Bundler"+                  ],+                  "markdownEnumDescriptions": [+                    "It’s recommended to use `\"Node16\"` instead",+                    "Deprecated, use `\"Node10\"` in TypeScript 5.0+ instead",+                    "It’s recommended to use `\"Node16\"` instead",+                    "This is the recommended setting for libraries and Node.js applications",+                    "This is the recommended setting for libraries and Node.js applications",+                    "This is the recommended setting in TypeScript 5.0+ for applications that use a bundler"                   ]@@ -364,6 +410,5 @@                 {-                  "pattern": "^(([Nn]ode)|([Nn]ode16)|([Nn]ode[Nn]ext)|([Cc]lassic))$"+                  "pattern": "^(([Nn]ode)|([Nn]ode1[06])|([Nn]ode[Nn]ext)|([Cc]lassic)|([Bb]undler))$"                 }               ],-              "default": "classic",               "markdownDescription": "Specify how TypeScript looks up a file from a given module specifier.\n\nSee more: https://www.typescriptlang.org/tsconfig#moduleResolution"@@ -558,2 +603,3 @@                     "ES2022",+                    "ES2023",                     "ESNext"@@ -562,3 +608,3 @@                 {-                  "pattern": "^([Ee][Ss]([356]|(20(1[56789]|2[012]))|[Nn][Ee][Xx][Tt]))$"+                  "pattern": "^([Ee][Ss]([356]|(20(1[56789]|2[0123]))|[Nn][Ee][Xx][Tt]))$"                 }@@ -802,2 +848,3 @@                       "ES2019.Array",+                      "ES2019.Intl",                       "ES2019.Object",@@ -828,2 +875,4 @@                       "ES2020.Intl",+                      "ES2020.Date",+                      "ES2020.Number",                       "ES2021.Promise",@@ -832,3 +881,3 @@                       "ESNext.WeakRef",-                      "es2021.intl",+                      "ES2021.Intl",                       "ES2022",@@ -838,3 +887,13 @@                       "ES2022.Object",-                      "ES2022.String"+                      "ES2022.String",+                      "ES2022.SharedMemory",+                      "ES2022.RegExp",+                      "ES2023",+                      "ES2023.Array",+                      "Decorators",+                      "Decorators.Legacy",+                      "ES2017.Date",+                      "ES2023.Collection",+                      "ESNext.Decorators",+                      "ESNext.Disposable"                     ]@@ -845,18 +904,18 @@                   {-                    "pattern": "^[Ee][Ss]2015(\\.([Cc][Oo][Ll][Ll][Ee][Cc][Tt][Ii][Oo][Nn]|[Cc][Oo][Rr][Ee]|[Gg][Ee][Nn][Ee][Rr][Aa][Tt][Oo][Rr]|[Ii][Tt][Ee][Rr][Aa][Bb][Ll][Ee]|[Pp][Rr][Oo][Mm][Ii][Ss][Ee]|[Pp][Rr][Oo][Xx][Yy]|[Rr][Ee][Ff][Ll][Ee][Cc][Tt]|[Ss][Yy][Mm][Bb][Oo][Ll].[Ww][Ee][Ll][Ll][Kk][Nn][Oo][Ww][Nn]|[Ss][Yy][Mm][Bb][Oo][Ll]))?$"-                  },-                  {-                    "pattern": "^[Ee][Ss]2016(\\.[Aa][Rr][Rr][Aa][Yy].[Ii][Nn][Cc][Ll][Uu][Dd][Ee])?$"-                  },-                  {-                    "pattern": "^[Ee][Ss]2017(\\.([Ii][Nn][Tt][Ll]|[Oo][Bb][Jj][Ee][Cc][Tt]|[Ss][Hh][Aa][Rr][Ee][Dd][Mm][Ee][Mm][Oo][Rr][Yy]|[Ss][Tt][Rr][Ii][Nn][Gg]|[Tt][Yy][Pp][Ee][Dd][Aa][Rr][Rr][Aa][Yy][Ss]))?$"-                  },-                  {-                    "pattern": "^[Ee][Ss]2018(\\.([Aa][Ss][Yy][Nn][Cc][Ii][Tt][Ee][Rr][Aa][Bb][Ll][Ee]|[Ii][Nn][Tt][Ll]|[Pp][Rr][Oo][Mm][Ii][Ss][Ee]|[Rr][Ee][Gg][Ee][Xx][Pp]))?$"-                  },-                  {-                    "pattern": "^[Ee][Ss]2019(\\.([Aa][Rr][Rr][Aa][Yy]|[Oo][Bb][Jj][Ee][Cc][Tt]|[Ss][Tt][Rr][Ii][Nn][Gg]|[Ss][Yy][Mm][Bb][Oo][Ll]))?$"-                  },-                  {-                    "pattern": "^[Ee][Ss]2020(\\.([Bb][Ii][Gg][Ii][Nn][Tt]|[Pp][Rr][Oo][Mm][Ii][Ss][Ee]|[Ss][Tt][Rr][Ii][Nn][Gg]|[Ss][Yy][Mm][Bb][Oo][Ll].[Ww][Ee][Ll][Ll][Kk][Nn][Oo][Ww][Nn]))?$"+                    "pattern": "^[Ee][Ss]2015(\\.([Cc][Oo][Ll][Ll][Ee][Cc][Tt][Ii][Oo][Nn]|[Cc][Oo][Rr][Ee]|[Gg][Ee][Nn][Ee][Rr][Aa][Tt][Oo][Rr]|[Ii][Tt][Ee][Rr][Aa][Bb][Ll][Ee]|[Pp][Rr][Oo][Mm][Ii][Ss][Ee]|[Pp][Rr][Oo][Xx][Yy]|[Rr][Ee][Ff][Ll][Ee][Cc][Tt]|[Ss][Yy][Mm][Bb][Oo][Ll]\\.[Ww][Ee][Ll][Ll][Kk][Nn][Oo][Ww][Nn]|[Ss][Yy][Mm][Bb][Oo][Ll]))?$"+                  },+                  {+                    "pattern": "^[Ee][Ss]2016(\\.[Aa][Rr][Rr][Aa][Yy]\\.[Ii][Nn][Cc][Ll][Uu][Dd][Ee])?$"+                  },+                  {+                    "pattern": "^[Ee][Ss]2017(\\.([Ii][Nn][Tt][Ll]|[Oo][Bb][Jj][Ee][Cc][Tt]|[Ss][Hh][Aa][Rr][Ee][Dd][Mm][Ee][Mm][Oo][Rr][Yy]|[Ss][Tt][Rr][Ii][Nn][Gg]|[Tt][Yy][Pp][Ee][Dd][Aa][Rr][Rr][Aa][Yy][Ss]|[Dd][Aa][Tt][Ee]))?$"+                  },+                  {+                    "pattern": "^[Ee][Ss]2018(\\.([Aa][Ss][Yy][Nn][Cc][Gg][Ee][Nn][Ee][Rr][Aa][Tt][Oo][Rr]|[Aa][Ss][Yy][Nn][Cc][Ii][Tt][Ee][Rr][Aa][Bb][Ll][Ee]|[Ii][Nn][Tt][Ll]|[Pp][Rr][Oo][Mm][Ii][Ss][Ee]|[Rr][Ee][Gg][Ee][Xx][Pp]))?$"+                  },+                  {+                    "pattern": "^[Ee][Ss]2019(\\.([Aa][Rr][Rr][Aa][Yy]|[Ii][Nn][Tt][Ll]|[Oo][Bb][Jj][Ee][Cc][Tt]|[Ss][Tt][Rr][Ii][Nn][Gg]|[Ss][Yy][Mm][Bb][Oo][Ll]))?$"+                  },+                  {+                    "pattern": "^[Ee][Ss]2020(\\.([Bb][Ii][Gg][Ii][Nn][Tt]|[Pp][Rr][Oo][Mm][Ii][Ss][Ee]|[Ss][Tt][Rr][Ii][Nn][Gg]|[Ss][Yy][Mm][Bb][Oo][Ll]\\.[Ww][Ee][Ll][Ll][Kk][Nn][Oo][Ww][Nn]|[Ss][Hh][Aa][Rr][Ee][Dd][Mm][Ee][Mm][Oo][Rr][Yy]|[Ii][Nn][Tt][Ll]|[Dd][Aa][Tt][Ee]|[Nn][Uu][Mm][Bb][Ee][Rr]))?$"                   },@@ -866,6 +925,9 @@                   {-                    "pattern": "^[Ee][Ss]2022(\\.([Aa][Rr][Rr][Aa][Yy]|[Ee][Rr][Rr][Oo][Rr]|[Ii][Nn][Tt][Ll]|[Oo][Bb][Jj][Ee][Cc][Tt]|[Ss][Tt][Rr][Ii][Nn][Gg]))?$"-                  },-                  {-                    "pattern": "^[Ee][Ss][Nn][Ee][Xx][Tt](\\.([Aa][Rr][Rr][Aa][Yy]|[Aa][Ss][Yy][Nn][Cc][Ii][Tt][Ee][Rr][Aa][Bb][Ll][Ee]|[Bb][Ii][Gg][Ii][Nn][Tt]|[Ii][Nn][Tt][Ll]|[Pp][Rr][Oo][Mm][Ii][Ss][Ee]|[Ss][Tt][Rr][Ii][Nn][Gg]|[Ss][Yy][Mm][Bb][Oo][Ll]|[Ww][Ee][Aa][Kk][Rr][Ee][Ff]))?$"+                    "pattern": "^[Ee][Ss]2022(\\.([Aa][Rr][Rr][Aa][Yy]|[Ee][Rr][Rr][Oo][Rr]|[Ii][Nn][Tt][Ll]|[Oo][Bb][Jj][Ee][Cc][Tt]|[Ss][Tt][Rr][Ii][Nn][Gg]|[Ss][Hh][Aa][Rr][Ee][Dd][Mm][Ee][Mm][Oo][Rr][Yy]|[Rr][Ee][Gg][Ee][Xx][Pp]))?$"+                  },+                  {+                    "pattern": "^[Ee][Ss]2023(\\.([Aa][Rr][Rr][Aa][Yy]|[Cc][Oo][Ll][Ll][Ee][Cc][Tt][Ii][Oo][Nn]))?$"+                  },+                  {+                    "pattern": "^[Ee][Ss][Nn][Ee][Xx][Tt](\\.([Aa][Rr][Rr][Aa][Yy]|[Aa][Ss][Yy][Nn][Cc][Ii][Tt][Ee][Rr][Aa][Bb][Ll][Ee]|[Bb][Ii][Gg][Ii][Nn][Tt]|[Ii][Nn][Tt][Ll]|[Pp][Rr][Oo][Mm][Ii][Ss][Ee]|[Ss][Tt][Rr][Ii][Nn][Gg]|[Ss][Yy][Mm][Bb][Oo][Ll]|[Ww][Ee][Aa][Kk][Rr][Ee][Ff]|[Dd][Ee][Cc][Oo][Rr][Aa][Tt][Oo][Rr][Ss]|[Dd][Ii][Ss][Pp][Oo][Ss][Aa][Bb][Ll][Ee]))?$"                   },@@ -878,3 +940,6 @@                   {-                    "pattern": "^[Ww][Ee][Bb][Ww][Oo][Rr][Kk][Ee][Rr](\\.[Ii][Mm][Pp][Oo][Rr][Tt][Ss][Cc][Rr][Ii][Pp][Tt][Ss])?$"+                    "pattern": "^[Ww][Ee][Bb][Ww][Oo][Rr][Kk][Ee][Rr](\\.([Ii][Mm][Pp][Oo][Rr][Tt][Ss][Cc][Rr][Ii][Pp][Tt][Ss]|[Ii][Tt][Ee][Rr][Aa][Bb][Ll][Ee]))?$"+                  },+                  {+                    "pattern": "^[Dd][Ee][Cc][Oo][Rr][Aa][Tt][Oo][Rr][Ss](\\.([Ll][Ee][Gg][Aa][Cc][Yy]))?$"                   }@@ -883,2 +948,10 @@               "markdownDescription": "Specify a set of bundled library declaration files that describe the target runtime environment.\n\nSee more: https://www.typescriptlang.org/tsconfig#lib"+            },+            "moduleDetection": {+              "description": "Specify how TypeScript determine a file as module.",+              "enum": [+                "auto",+                "legacy",+                "force"+              ]             },@@ -988,2 +1061,14 @@             },+            "resolvePackageJsonExports": {+              "description": "Use the package.json 'exports' field when resolving package imports.",+              "type": "boolean",+              "default": false,+              "markdownDescription": "Use the package.json 'exports' field when resolving package imports.\n\nSee more: https://www.typescriptlang.org/tsconfig#resolvePackageJsonExports"+            },+            "resolvePackageJsonImports": {+              "description": "Use the package.json 'imports' field when resolving imports.",+              "type": "boolean",+              "default": false,+              "markdownDescription": "Use the package.json 'imports' field when resolving imports.\n\nSee more: https://www.typescriptlang.org/tsconfig#resolvePackageJsonImports"+            },             "assumeChangesOnlyAffectDirectDependencies": {@@ -1011,2 +1096,7 @@               "markdownDescription": "Opt a project out of multi-project reference checking when editing.\n\nSee more: https://www.typescriptlang.org/tsconfig#disableSolutionSearching"+            },+            "verbatimModuleSyntax": {+              "description": "Do not transform or elide any imports or exports not marked as type-only, ensuring they are written in the output file's format based on the 'module' setting.",+              "type": "boolean",+              "markdownDescription": "Do not transform or elide any imports or exports not marked as type-only, ensuring they are written in the output file's format based on the 'module' setting.\n\nSee more: https://www.typescriptlang.org/tsconfig#verbatimModuleSyntax"             }
tslib npm
2.8.1 1y ago incident on record
DELETION ×2BURST ×3
latest 2.8.1 versions 46 maintainers 6
2.4.1
2.5.0
2.5.1
2.5.2
2.5.3
2.6.0
2.6.1
2.6.2
2.6.3
2.7.0
2.8.0
2.8.1
DELETION
0.0.1 published then removed
high · registry-verified · 2014-12-30 · 11y ago
DELETION
0.0.2 published then removed
high · registry-verified · 2014-12-30 · 11y ago
BURST
2 releases in 13m: 1.13.0, 2.0.0
info · registry-verified · 2020-05-13 · 6y ago
BURST
2 releases in 3m: 1.14.0, 2.0.2
info · registry-verified · 2020-10-06 · 5y ago
BURST
2 releases in 1m: 1.14.1, 2.0.3
info · registry-verified · 2020-10-09 · 5y ago
release diff 2.8.0 → 2.8.1
+0 added · -0 removed · ~4 modified
package.json +1 lines
--- +++ @@ -4,3 +4,3 @@     "homepage": "https://www.typescriptlang.org/",-    "version": "2.8.0",+    "version": "2.8.1",     "license": "0BSD",
tslib.es6.js +10 lines
--- +++ @@ -265,2 +265,11 @@ +var ownKeys = function(o) {+    ownKeys = Object.getOwnPropertyNames || function (o) {+        var ar = [];+        for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;+        return ar;+    };+    return ownKeys(o);+};+ export function __importStar(mod) {@@ -268,3 +277,3 @@     var result = {};-    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);+    if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);     __setModuleDefault(result, mod);
tslib.es6.mjs +10 lines
--- +++ @@ -265,2 +265,11 @@ +var ownKeys = function(o) {+  ownKeys = Object.getOwnPropertyNames || function (o) {+    var ar = [];+    for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;+    return ar;+  };+  return ownKeys(o);+};+ export function __importStar(mod) {@@ -268,3 +277,3 @@   var result = {};-  if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);+  if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);   __setModuleDefault(result, mod);
tslib.js +42 lines
--- +++ @@ -314,2 +314,11 @@ +    var ownKeys = function(o) {+        ownKeys = Object.getOwnPropertyNames || function (o) {+            var ar = [];+            for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;+            return ar;+        };+        return ownKeys(o);+    };+     __importStar = function (mod) {@@ -317,3 +326,3 @@         var result = {};-        if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);+        if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);         __setModuleDefault(result, mod);@@ -442,34 +451,34 @@ 0 && (module.exports = {-    __extends,-    __assign,-    __rest,-    __decorate,-    __param,-    __esDecorate,-    __runInitializers,-    __propKey,-    __setFunctionName,-    __metadata,-    __awaiter,-    __generator,-    __exportStar,-    __createBinding,-    __values,-    __read,-    __spread,-    __spreadArrays,-    __spreadArray,-    __await,-    __asyncGenerator,-    __asyncDelegator,-    __asyncValues,-    __makeTemplateObject,-    __importStar,-    __importDefault,-    __classPrivateFieldGet,-    __classPrivateFieldSet,-    __classPrivateFieldIn,-    __addDisposableResource,-    __disposeResources,-    __rewriteRelativeImportExtension,+    __extends: __extends,+    __assign: __assign,+    __rest: __rest,+    __decorate: __decorate,+    __param: __param,+    __esDecorate: __esDecorate,+    __runInitializers: __runInitializers,+    __propKey: __propKey,+    __setFunctionName: __setFunctionName,+    __metadata: __metadata,+    __awaiter: __awaiter,+    __generator: __generator,+    __exportStar: __exportStar,+    __createBinding: __createBinding,+    __values: __values,+    __read: __read,+    __spread: __spread,+    __spreadArrays: __spreadArrays,+    __spreadArray: __spreadArray,+    __await: __await,+    __asyncGenerator: __asyncGenerator,+    __asyncDelegator: __asyncDelegator,+    __asyncValues: __asyncValues,+    __makeTemplateObject: __makeTemplateObject,+    __importStar: __importStar,+    __importDefault: __importDefault,+    __classPrivateFieldGet: __classPrivateFieldGet,+    __classPrivateFieldSet: __classPrivateFieldSet,+    __classPrivateFieldIn: __classPrivateFieldIn,+    __addDisposableResource: __addDisposableResource,+    __disposeResources: __disposeResources,+    __rewriteRelativeImportExtension: __rewriteRelativeImportExtension, });
typescript npm
6.0.3 1mo ago incident on record
critical-tier DELETIONBURST ×4
latest 6.0.3 versions 3760 maintainers 6 critical-tier (snapshotted)
5.5.3
5.5.4
5.6.2
5.6.3
5.7.2
5.7.3
5.8.2
5.8.3
5.9.2
5.9.3
6.0.2
6.0.3
DELETION
1.9.0 published then removed
high · registry-verified · 2016-04-28 · 10y ago
BURST
2 releases in 15m: 1.8.6, 1.8.7
info · registry-verified · 2016-03-02 · 10y ago
BURST
5 releases in 8m: 3.1.7, 3.7.6, 3.9.8, 4.0.6, 4.1.4
info · registry-verified · 2021-02-09 · 5y ago
BURST
5 releases in 3m: 3.1.8, 3.7.7, 3.9.9, 4.0.7, 4.1.5
info · registry-verified · 2021-02-10 · 5y ago
BURST
4 releases in 53m: 3.9.10, 4.0.8, 4.3.3, 4.1.6
info · registry-verified · 2021-06-16 · 4y ago
release diff 6.0.2 → 6.0.3
+0 added · -0 removed · ~3 modified
lib/_tsc.js +3 lines
--- +++ @@ -20,3 +20,3 @@ var versionMajorMinor = "6.0";-var version = "6.0.2";+var version = "6.0.3"; @@ -45188,2 +45188,4 @@       return 4 /* IsControlFlowContainer */;+    case 173 /* PropertyDeclaration */:+      return node.initializer ? 4 /* IsControlFlowContainer */ : 0 /* None */;     case 300 /* CatchClause */:
lib/typescript.js +25 lines
--- +++ @@ -2291,3 +2291,3 @@ var versionMajorMinor = "6.0";-var version = "6.0.2";+var version = "6.0.3"; var Comparison = /* @__PURE__ */ ((Comparison3) => {@@ -49723,2 +49723,4 @@       return 4 /* IsControlFlowContainer */;+    case 173 /* PropertyDeclaration */:+      return node.initializer ? 4 /* IsControlFlowContainer */ : 0 /* None */;     case 300 /* CatchClause */:@@ -139653,3 +139655,4 @@   NameValidationResult2[NameValidationResult2["NameStartsWithUnderscore"] = 4] = "NameStartsWithUnderscore";-  NameValidationResult2[NameValidationResult2["NameContainsNonURISafeCharacters"] = 5] = "NameContainsNonURISafeCharacters";+  NameValidationResult2[NameValidationResult2["NameContainsInvalidCharacters"] = 5] = "NameContainsInvalidCharacters";+  NameValidationResult2[NameValidationResult2["NameContainsNonURISafeCharacters"] = 5 /* NameContainsInvalidCharacters */] = "NameContainsNonURISafeCharacters";   return NameValidationResult2;@@ -139699,4 +139702,4 @@   }-  if (encodeURIComponent(packageName) !== packageName) {-    return 5 /* NameContainsNonURISafeCharacters */;+  if (!/^[\w.-]+$/.test(packageName)) {+    return 5 /* NameContainsInvalidCharacters */;   }@@ -139724,4 +139727,4 @@       return `'${typing}':: ${kind} name '${name}' cannot start with '_'`;-    case 5 /* NameContainsNonURISafeCharacters */:-      return `'${typing}':: ${kind} name '${name}' contains non URI safe characters`;+    case 5 /* NameContainsInvalidCharacters */:+      return `'${typing}':: ${kind} name '${name}' contains invalid characters`;     case 0 /* Ok */:@@ -186598,2 +186601,18 @@     const { fileName, packageName, projectName, projectRootPath, id } = req;+    const validationResult = ts_JsTyping_exports.validatePackageName(packageName);+    if (validationResult !== ts_JsTyping_exports.NameValidationResult.Ok) {+      const message = ts_JsTyping_exports.renderPackageNameValidationFailure(validationResult, packageName);+      if (this.log.isEnabled()) {+        this.log.writeLine(message);+      }+      const response = {+        kind: ActionPackageInstalled,+        projectName,+        id,+        success: false,+        message+      };+      this.sendResponse(response);+      return;+    }     const cwd = forEachAncestorDirectory(getDirectoryPath(fileName), (directory) => {
package.json +2 lines
--- +++ @@ -4,3 +4,3 @@     "homepage": "https://www.typescriptlang.org/",-    "version": "6.0.2",+    "version": "6.0.3",     "license": "Apache-2.0",@@ -116,3 +116,3 @@     },-    "gitHead": "607a22a90d1a5a1b507ce01bb8cd7ec020f954e7"+    "gitHead": "050880ce59e30b356b686bd3144efe24f875ebc8" }
ua-parser-js npm
2.0.10 10d ago incident on record
DELETION ×3BURST ×11
latest 2.0.10 versions 94 maintainers 1
2.0.1
2.0.2
2.0.3
2.0.4
0.7.41
1.0.41
2.0.5
2.0.6
2.0.7
2.0.8
2.0.9
2.0.10
DELETION
0.7.29 published then removed
high · registry-verified · 2021-10-22 · 4y ago
DELETION
0.8.0 published then removed
high · registry-verified · 2021-10-22 · 4y ago
DELETION
1.0.0 published then removed
high · registry-verified · 2021-10-22 · 4y ago
BURST
3 releases in 1m: 0.7.29, 0.8.0, 1.0.0
info · registry-verified · 2021-10-22 · 4y ago
BURST
3 releases in 10m: 0.7.30, 0.8.1, 1.0.1
info · registry-verified · 2021-10-22 · 4y ago
BURST
2 releases in 0m: 0.7.32, 1.0.32
info · registry-verified · 2022-10-15 · 3y ago
BURST
2 releases in 0m: 1.0.33, 0.7.33
info · registry-verified · 2023-01-22 · 3y ago
BURST
2 releases in 0m: 0.7.34, 1.0.34
info · registry-verified · 2023-03-05 · 3y ago
BURST
2 releases in 0m: 0.7.35, 1.0.35
info · registry-verified · 2023-04-01 · 3y ago
BURST
2 releases in 3m: 0.7.36, 1.0.36
info · registry-verified · 2023-09-09 · 2y ago
BURST
2 releases in 4m: 0.7.37, 1.0.37
info · registry-verified · 2023-10-27 · 2y ago
BURST
2 releases in 1m: 0.7.38, 1.0.38
info · registry-verified · 2024-05-28 · 2y ago
BURST
2 releases in 5m: 0.7.40, 1.0.40
info · registry-verified · 2024-12-21 · 1y ago
BURST
2 releases in 1m: 0.7.41, 1.0.41
info · registry-verified · 2025-08-19 · 9mo ago
release diff 2.0.9 → 2.0.10
+0 added · -0 removed · ~27 modified
dist/ua-parser.pack.js +2 lines · 1 flagged
--- +++ @@ -1,4 +1,4 @@-/* UAParser.js v2.0.9+/* UAParser.js v2.0.10    Copyright © 2012-2026 Faisal Salman <[email protected]>    AGPLv3 License */-((i,c)=>{function A(i){for(var e={},t=0;t<i.length;t++)e[i[t].toUpperCase()]=i[t];return e}function B(i){return Ti(i)?Oi(/[^\d\.]/g,i).split(".")[0]:c}function H(i,e){if(i&&e)for(var t,o,r,a,s,n=0;n<e.length&&!a;){for(var w=e[n],b=e[n+1],d=t=0;d<w.length&&!a&&w[d];)if(a=w[d++].exec(i))for(o=0;o<b.length;o++)s=a[++t],typeof(r=b[o])===l.OBJECT&&0<r.length?2===r.length?typeof r[1]==l.FUNCTION?this[r[0]]=r[1].call(this,s):this[r[0]]=r[1]:3<=r.length&&(typeof r[1]!==l.FUNCTION||r[1].exec&&r[1].test?3==r.length?this[r[0]]=s?s.replace(r[1],r[2]):c:4==r.length?this[r[0]]=s?r[3].call(this,s.replace(r[1],r[2])):c:4<r.length&&(this[r[0]]=s?r[3].apply(this,[s.replace(r[1],r[2])].concat(r.slice(4))):c):3<r.length?this[r[0]]=s?r[1].apply(this,r.slice(2)):c:this[r[0]]=s?r[1].call(this,s,r[2]):c):this[r]=s||c;n+=2}}function p(i,e){for(var t in e)if(typeof e[t]===l.OBJECT&&0<e[t].length){for(var o=0;o<e[t].length;o++)if(Ei(e[t][o],i))return"?"===t?c:t}else if(Ei(e[t],i))return"?"===t?c:t;return e.hasOwnProperty("*")?e["*"]:i}function M(e,i){var t=Ai.init[i],o=Ai.isIgnore[i]||0,r=Ai.isIgnoreRgx[i]||0,a=Ai.toString[i]||0;function s(){D.call(this,t)}return s.prototype.getItem=function(){return e},s.prototype.withClientHints=function(){return _?_.getHighEntropyValues(oi).then(function(i){return e.setCH(new Bi(i,!1)).parseCH().get()}):e.parseCH().get()},s.prototype.withFeatureCheck=function(){return e.detectFeature().get()},i!=v&&(s.prototype.is=function(i){var e,t=!1;for(e in this)if(this.hasOwnProperty(e)&&!Ei(o,e)&&q(r?Oi(r,this[e]):this[e])==q(r?Oi(r,i):i)){if(t=!0,i!=l.UNDEFINED)break}else if(i==l.UNDEFINED&&t){t=!t;break}return t},s.prototype.toString=function(){var i,e=d;for(i in a)typeof this[a[i]]!==l.UNDEFINED&&(e+=(e?" ":d)+this[a[i]]);return e||l.UNDEFINED}),s.prototype.then=function(i){function e(){for(var i in t)t.hasOwnProperty(i)&&(this[i]=t[i])}var t=this,o=(e.prototype={is:s.prototype.is,toString:s.prototype.toString,withClientHints:s.prototype.withClientHints,withFeatureCheck:s.prototype.withFeatureCheck},new e);return i(o),o},new s}var V="user-agent",d="",l={FUNCTION:"function",OBJECT:"object",STRING:"string",UNDEFINED:"undefined"},h="browser",u="cpu",m="device",f="engine",g="os",v="result",k="name",x="type",y="vendor",C="version",N="architecture",j="major",E="model",P="console",S="mobile",t="tablet",e="smarttv",o="wearable",R="xr",G="embedded",r="inapp",L="brands",T="formFactors",$="fullVersionList",I="platform",W="platformVersion",J="bitness",a="sec-ch-ua",X=a+"-full-version-list",Y=a+"-arch",Z=a+"-"+J,Q=a+"-form-factors",K=a+"-"+S,ii=a+"-"+E,ei=a+"-"+I,ti=ei+"-version",oi=[L,$,S,E,I,W,N,T,J],ri="Amazon",s="Apple",ai="ASUS",si="BlackBerry",n="Google",ni="Huawei",wi="Lenovo",bi="Honor",di="Microsoft",li="Motorola",ci="OnePlus",pi="OPPO",hi="Samsung",ui="Sony",mi="Xiaomi",fi="Zebra",gi="Chromium",w="Chromecast",vi="Edge",ki="Firefox",b="Opera",xi="Facebook",O="Mobile ",yi=" Browser",Ci="Windows",Ni=typeof i!==l.UNDEFINED,U=Ni&&i.navigator?i.navigator:c,_=U&&U.userAgentData?U.userAgentData:c,Ei=function(i,e){if(typeof i===l.OBJECT&&0<i.length){for(var t in i)if(q(e)==q(i[t]))return!0;return!1}return!!Ti(i)&&q(e)==q(i)},Si=function(i,e){for(var t in i)return/^(browser|cpu|device|engine|os)$/.test(t)||!!e&&Si(i[t])},Ti=function(i){return typeof i===l.STRING},Ii=function(i){if(!i)return c;for(var e,t=[],o=Oi(/\\?\"/g,i).split(","),r=0;r<o.length;r++)-1<o[r].indexOf(";")?(e=_i(o[r]).split(";v="),t[r]={brand:e[0],version:e[1]}):t[r]=_i(o[r]);return t},q=function(i){return Ti(i)?i.toLowerCase():i},D=function(i){for(var e in i)i.hasOwnProperty(e)&&(typeof(e=i[e])==l.OBJECT&&2==e.length?this[e[0]]=e[1]:this[e]=c);return this},Oi=function(i,e){return Ti(e)?e.replace(i,d):e},Ui=function(i){return Oi(/\\?\"/g,i)},_i=function(i,e){return i=Oi(/^\s\s*/,String(i)),typeof e===l.UNDEFINED?i:i.substring(0,e)},qi={ME:"4.90","NT 3.51":"3.51","NT 4.0":"4.0",2e3:["5.0","5.01"],XP:["5.1","5.2"],Vista:"6.0",7:"6.1",8:"6.2",8.1:"6.3",10:["6.4","10.0"],NT:""},Di={embedded:"Automotive",mobile:"Mobile",tablet:["Tablet","EInk"],smarttv:"TV",wearable:"Watch",xr:["VR","XR"],"?":["Desktop","Unknown"],"*":c},Fi={Chrome:"Google Chrome",Edge:"Microsoft Edge","Edge WebView2":"Microsoft Edge WebView2","Chrome WebView":"Android WebView","Chrome Headless":"HeadlessChrome","Huawei Browser":"HuaweiBrowser","MIUI Browser":"Miui Browser","Opera Mobi":"OperaMobile",Yandex:"YaBrowser"},zi={browser:[[/\b(?:crmo|crios)\/([\w\.]+)/i],[C,[k,O+"Chrome"]],[/webview.+edge\/([\w\.]+)/i],[C,[k,vi+" WebView"]],[/edg(?:e|ios|a)?\/([\w\.]+)/i],[C,[k,"Edge"]],[/(opera mini)\/([-\w\.]+)/i,/(opera [mobiletab]{3,6})\b.+version\/([-\w\.]+)/i,/(opera)(?:.+version\/|[\/ ]+)([\w\.]+)/i],[k,C],[/opios[\/ ]+([\w\.]+)/i],[C,[k,b+" Mini"]],[/\bop(?:rg)?x\/([\w\.]+)/i],[C,[k,b+" GX"]],[/\bopr\/([\w\.]+)/i],[C,[k,b]],[/\bb[ai]*d(?:uhd|[ub]*[aekoprswx]{5,6})[\/ ]?([\w\.]+)/i],[C,[k,"Baidu"]],[/\b(?:mxbrowser|mxios|myie2)\/?([-\w\.]*)\b/i],[C,[k,"Maxthon"]],[/(kindle)\/([\w\.]+)/i,/(lunascape|maxthon|netfront|jasmine|blazer|sleipnir)[\/ ]?([\w\.]*)/i,/(avant|iemobile|slim(?:browser|boat|jet))[\/ ]?([\d\.]*)/i,/(?:ms|\()(ie) ([\w\.]+)/i,/(atlas|flock|rockmelt|midori|epiphany|silk|skyfire|bolt|iron|vivaldi|iridium|phantomjs|bowser|qupzilla|falkon|rekonq|puffin|whale(?!.+naver)|qqbrowserlite|duckduckgo|klar|helio|(?=comodo_)?dragon|otter|dooble|(?:hi|lg |ovi|qute)browser|palemoon)\/v?([-\w\.]+)/i,/(brave)(?: chrome)?\/([\d\.]+)/i,/(aloha|heytap|ovi|115|surf|qwant)browser\/([\d\.]+)/i,/(qwant)(?:ios|mobile)\/([\d\.]+)/i,/(ecosia|weibo)(?:__| \w+@)([\d\.]+)/i],[k,C],[/quark(?:pc)?\/([-\w\.]+)/i],[C,[k,"Quark"]],[/\bddg\/([\w\.]+)/i],[C,[k,"DuckDuckGo"]],[/(?:\buc? ?browser|(?:juc.+)ucweb)[\/ ]?([\w\.]+)/i],[C,[k,"UCBrowser"]],[/microm.+\bqbcore\/([\w\.]+)/i,/\bqbcore\/([\w\.]+).+microm/i,/micromessenger\/([\w\.]+)/i],[C,[k,"WeChat"]],[/konqueror\/([\w\.]+)/i],[C,[k,"Konqueror"]],[/trident.+rv[: ]([\w\.]{1,9})\b.+like gecko/i],[C,[k,"IE"]],[/ya(?:search)?browser\/([\w\.]+)/i],[C,[k,"Yandex"]],[/slbrowser\/([\w\.]+)/i],[C,[k,"Smart "+wi+yi]],[/(av(?:ast|g|ira))\/([\w\.]+)/i],[[k,/(.+)/,"$1 Secure"+yi],C],[/norton\/([\w\.]+)/i],[C,[k,"Norton Private"+yi]],[/\bfocus\/([\w\.]+)/i],[C,[k,ki+" Focus"]],[/ mms\/([\w\.]+)$/i],[C,[k,b+" Neon"]],[/ opt\/([\w\.]+)$/i],[C,[k,b+" Touch"]],[/coc_coc\w+\/([\w\.]+)/i],[C,[k,"Coc Coc"]],[/dolfin\/([\w\.]+)/i],[C,[k,"Dolphin"]],[/coast\/([\w\.]+)/i],[C,[k,b+" Coast"]],[/miuibrowser\/([\w\.]+)/i],[C,[k,"MIUI"+yi]],[/fxios\/([\w\.-]+)/i],[C,[k,O+ki]],[/\bqihoobrowser\/?([\w\.]*)/i],[C,[k,"360"]],[/\b(qq)\/([\w\.]+)/i],[[k,/(.+)/,"$1Browser"],C],[/(oculus|sailfish|huawei|vivo|pico)browser\/([\w\.]+)/i],[[k,/(.+)/,"$1"+yi],C],[/samsungbrowser\/([\w\.]+)/i],[C,[k,hi+" Internet"]],[/metasr[\/ ]?([\d\.]+)/i],[C,[k,"Sogou Explorer"]],[/(sogou)mo\w+\/([\d\.]+)/i],[[k,"Sogou Mobile"],C],[/(electron)\/([\w\.]+) safari/i,/(tesla)(?: qtcarbrowser|\/(20\d\d\.[-\w\.]+))/i,/m?(qqbrowser|2345(?=browser|chrome|explorer))\w*[\/ ]?v?([\w\.]+)/i],[k,C],[/(lbbrowser|luakit|rekonq|steam(?= (clie|tenf|gameo)))/i],[k],[/ome\/([\w\.]+).+(iron(?= saf)|360(?=[es]e$))/i],[C,k],[/((?:fban\/fbios|fb_iab\/fb4a)(?!.+fbav)|;fbav\/([\w\.]+);)/i],[[k,xi],C,[x,r]],[/(kakao(?:talk|story))[\/ ]([\w\.]+)/i,/(naver)\(.*?(\d+\.[\w\.]+).*\)/i,/(daum)apps[\/ ]([\w\.]+)/i,/safari (line)\/([\w\.]+)/i,/\b(line)\/([\w\.]+)\/iab/i,/(alipay)client\/([\w\.]+)/i,/(twitter)(?:and| f.+e\/([\w\.]+))/i,/(bing)(?:web|sapphire)\/([\w\.]+)/i,/(instagram|snapchat|klarna)[\/ ]([-\w\.]+)/i],[k,C,[x,r]],[/\bgsa\/([\w\.]+) .*safari\//i],[C,[k,"GSA"],[x,r]],[/(?:musical_ly|trill)(?:.+app_?version\/|_)([\w\.]+)/i],[C,[k,"TikTok"],[x,r]],[/\[(linkedin)app\]/i],[k,[x,r]],[/(zalo(?:app)?)[\/\sa-z]*([\w\.-]+)/i],[[k,/(.+)/,"Zalo"],C,[x,r]],[/(chromium)[\/ ]([-\w\.]+)/i],[k,C],[/ome-(lighthouse)$/i],[k,[x,"fetcher"]],[/headlesschrome(?:\/([\w\.]+)| )/i],[C,[k,"Chrome Headless"]],[/wv\).+chrome\/([\w\.]+).+edgw\//i],[C,[k,vi+" WebView2"]],[/ wv\).+(chrome)\/([\w\.]+)/i],[[k,"Chrome WebView"],C],[/droid.+ version\/([\w\.]+)\b.+(?:mobile safari|safari)/i],[C,[k,"Android"+yi]],[/chrome\/([\w\.]+) mobile/i],[C,[k,O+"Chrome"]],[/(chrome|omniweb|arora|[tizenoka]{5} ?browser)\/v?([\w\.]+)/i],[k,C],[/version\/([\w\.\,]+) .*mobile(?:\/\w+ | ?)safari/i],[C,[k,O+"Safari"]],[/iphone .*mobile(?:\/\w+ | ?)safari/i],[[k,O+"Safari"]],[/version\/([\w\.\,]+) .*(safari)/i],[C,k],[/webkit.+?(mobile ?safari|safari)(\/[\w\.]+)/i],[k,[C,"1"]],[/(webkit|khtml)\/([\w\.]+)/i],[k,C],[/(?:mobile|tablet);.*(firefox)\/([\w\.-]+)/i],[[k,O+ki],C],[/(navigator|netscape\d?)\/([-\w\.]+)/i],[[k,"Netscape"],C],[/(wolvic|librewolf)\/([\w\.]+)/i],[k,C],[/mobile vr; rv:([\w\.]+)\).+firefox/i],[C,[k,ki+" Reality"]],[/ekiohf.+(flow)\/([\w\.]+)/i,/(swiftfox)/i,/(icedragon|iceweasel|camino|chimera|fennec|maemo browser|minimo|conkeror)[\/ ]?([\w\.\+]+)/i,/(seamonkey|k-meleon|icecat|iceape|firebird|phoenix|basilisk|waterfox)\/([-\w\.]+)$/i,/(firefox)\/([\w\.]+)/i,/(mozilla)\/([\w\.]+(?= .+rv\:.+gecko\/\d+)|[0-4][\w\.]+(?!.+compatible))/i,/(amaya|dillo|doris|icab|ladybird|lynx|mosaic|netsurf|obigo|polaris|w3m|(?:go|ice|up)[\. ]?browser)[-\/ ]?v?([\w\.]+)/i,/\b(links) \(([\w\.]+)/i],[k,[C,/_/g,"."]],[/(cobalt)\/([\w\.]+)/i],[k,[C,/[^\d\.]+./,d]]],cpu:[[/\b((amd|x|x86[-_]?|wow|win)64)\b/i],[[N,"amd64"]],[/(ia32(?=;))/i,/\b((i[346]|x)86)(pc)?\b/i],[[N,"ia32"]],[/\b(aarch64|arm(v?[89]e?l?|_?64))\b/i],[[N,"arm64"]],[/\b(arm(v[67])?ht?n?[fl]p?)\b/i],[[N,"armhf"]],[/( (ce|mobile); ppc;|\/[\w\.]+arm\b)/i],[[N,"arm"]],[/ sun4\w[;\)]/i],[[N,"sparc"]],[/\b(avr32|ia64(?=;)|68k(?=\))|\barm(?=v([1-7]|[5-7]1)l?|;|eabi)|(irix|mips|sparc)(64)?\b|pa-risc)/i,/((ppc|powerpc)(64)?)( mac|;|\))/i,/(?:osf1|[freopnt]{3,4}bsd) (alpha)/i],[[N,/ower/,d,q]],[/mc680.0/i],[[N,"68k"]],[/winnt.+\[axp/i],[[N,"alpha"]]],device:[[/\b(sch-i[89]0\d|shw-m380s|sm-[ptx]\w{2,4}|gt-[pn]\d{2,4}|sgh-t8[56]9|nexus 10)/i],[E,[y,hi],[x,t]],[/\b((?:s[cgp]h|gt|sm)-(?![lr])\w+|sc[g-]?[\d]+a?|galaxy nexus)/i,/samsung[- ]((?!sm-[lr]|browser)[-\w]+)/i,/sec-(sgh\w+)/i],[E,[y,hi],[x,S]],[/(?:\/|\()(ip(?:hone|od)[\w, ]*)[\/\);]/i],[E,[y,s],[x,S]],[/\b(?:ios|apple\w+)\/.+[\(\/](ipad)/i,/\b(ipad)[\d,]*[;\] ].+(mac |i(pad)?)os/i],[E,[y,s],[x,t]],[/(macintosh);/i],[E,[y,s]],[/\b(sh-?[altvz]?\d\d[a-ekm]?)/i],[E,[y,"Sharp"],[x,S]],[/\b((?:brt|eln|hey2?|gdi|jdn)-a?[lnw]09|(?:ag[rm]3?|jdn2|kob2)-a?[lw]0[09]hn)(?: bui|\)|;)/i],[E,[y,bi],[x,t]],[/honor([-\w ]+)[;\)]/i],[E,[y,bi],[x,S]],[/\b((?:ag[rs][2356]?k?|bah[234]?|bg[2o]|bt[kv]|cmr|cpn|db[ry]2?|jdn2|got|kob2?k?|mon|pce|scm|sht?|[tw]gr|vrd)-[ad]?[lw][0125][09]b?|605hw|bg2-u03|(?:gem|fdr|m2|ple|t1)-[7a]0[1-4][lu]|t1-a2[13][lw]|mediapad[\w\. ]*(?= bui|\)))\b(?!.+d\/s)/i],[E,[y,ni],[x,t]],[/(?:huawei) ?([-\w ]+)[;\)]/i,/\b(nexus 6p|\w{2,4}e?-[atu]?[ln][\dx][\dc][adnt]?)\b(?!.+d\/s)/i],[E,[y,ni],[x,S]],[/oid[^\)]+; (2[\dbc]{4}(182|283|rp\w{2})[cgl]|m2105k81a?c)(?: bui|\))/i,/\b(?:xiao)?((?:red)?mi[-_ ]?pad[\w- ]*)(?: bui|\))/i],[[E,/_/g," "],[y,mi],[x,t]],[/\b; (\w+) build\/hm\1/i,/\b(hm[-_ ]?note?[_ ]?(?:\d\w)?) bui/i,/oid[^\)]+; (redmi[\-_ ]?(?:note|k)?[\w_ ]+|m?[12]\d[01]\d\w{3,6}|poco[\w ]+|(shark )?\w{3}-[ah]0|qin ?[1-3](s\+|ultra| pro)?)( bui|; wv|\))/i,/\b(mi[-_ ]?(?:a\d|one|one[_ ]plus|note|max|cc)?[_ ]?(?:\d{0,2}\w?)[_ ]?(?:plus|se|lite|pro)?( 5g|lte)?)(?: bui|\))/i,/ ([\w ]+) miui\/v?\d/i],[[E,/_/g," "],[y,mi],[x,S]],[/droid.+; (cph2[3-6]\d[13579]|((gm|hd)19|(ac|be|in|kb)20|(d[en]|eb|le|mt)21|ne22)[0-2]\d|p[g-l]\w[1m]10)\b/i,/(?:one)?(?:plus)? (a\d0\d\d)(?: b|\))/i],[E,[y,ci],[x,S]],[/; (\w+) bui.+ oppo/i,/\b(cph[12]\d{3}|p(?:af|c[al]|d\w|e[ar])[mt]\d0|x9007|a101op)\b/i],[E,[y,pi],[x,S]],[/\b(opd2(\d{3}a?))(?: bui|\))/i],[E,[y,p,{OnePlus:["203","304","403","404","413","415"],"*":pi}],[x,t]],[/(vivo (5r?|6|8l?|go|one|s|x[il]?[2-4]?)[\w\+ ]*)(?: bui|\))/i],[E,[y,"BLU"],[x,S]],[/; vivo (\w+)(?: bui|\))/i,/\b(v[12]\d{3}\w?[at])(?: bui|;)/i],[E,[y,"Vivo"],[x,S]],[/\b(rmx[1-3]\d{3})(?: bui|;|\))/i],[E,[y,"Realme"],[x,S]],[/(ideatab[-\w ]+|602lv|d-42a|a101lv|a2109a|a3500-hv|s[56]000|pb-6505[my]|tb-?x?\d{3,4}(?:f[cu]|xu|[av])|yt\d?-[jx]?\d+[lfmx])( bui|;|\)|\/)/i,/lenovo ?(b[68]0[08]0-?[hf]?|tab(?:[\w- ]+?)|tb[\w-]{6,7})( bui|;|\)|\/)/i],[E,[y,wi],[x,t]],[/lenovo[-_ ]?([-\w ]+?)(?: bui|\)|\/)/i],[E,[y,wi],[x,S]],[/\b(milestone|droid(?:[2-4x]| (?:bionic|x2|pro|razr))?:?( 4g)?)\b[\w ]+build\//i,/\bmot(?:orola)?[- ]([\w\s]+)(\)| bui)/i,/((?:moto(?! 360)[-\w\(\) ]+|xt\d{3,4}[cgkosw\+]?[-\d]*|nexus 6)(?= bui|\)))/i],[E,[y,li],[x,S]],[/\b(mz60\d|xoom[2 ]{0,2}) build\//i],[E,[y,li],[x,t]],[/\b(?:lg)?([vl]k\-?\d{3}) bui| 3\.[-\w; ]{10}lg?-([06cv9]{3,4})/i],[E,[y,"LG"],[x,t]],[/(lm(?:-?f100[nv]?|-[\w\.]+)(?= bui|\))|nexus [45])/i,/\blg[-e;\/ ]+(?!.*(?:browser|netcast|android tv|watch|webos))(\w+)/i,/\blg-?([\d\w]+) bui/i],[E,[y,"LG"],[x,S]],[/(nokia) (t[12][01])/i],[y,E,[x,t]],[/(?:maemo|nokia).*(n900|lumia \d+|rm-\d+)/i,/nokia[-_ ]?(([-\w\. ]*?))( bui|\)|;|\/)/i],[[E,/_/g," "],[x,S],[y,"Nokia"]],[/(pixel (c|tablet))\b/i],[E,[y,n],[x,t]],[/droid.+;(?: google)? (g(01[13]a|020[aem]|025[jn]|1b60|1f8f|2ybb|4s1m|576d|5nz6|8hhn|8vou|a02099|c15s|d1yq|e2ae|ec77|gh2x|kv4x|p4bc|pj41|r83y|tt9q|ur25|wvk6)|pixel[\d ]*a?( pro)?( xl)?( fold)?( \(5g\))?)( bui|\))/i],[E,[y,n],[x,S]],[/(google) (pixelbook( go)?)/i],[y,E],[/droid.+; (a?\d[0-2]{2}so|[c-g]\d{4}|so[-gl]\w+|xq-\w\w\d\d)(?= bui|\).+chrome\/(?![1-6]{0,1}\d\.))/i],[E,[y,ui],[x,S]],[/sony tablet [ps]/i,/\b(?:sony)?sgp\w+(?: bui|\))/i],[[E,"Xperia Tablet"],[y,ui],[x,t]],[/(alexa)webm/i,/(kf[a-z]{2}wi|aeo(?!bc)\w\w)( bui|\))/i,/(kf[a-z]+)( bui|\)).+silk\//i],[E,[y,ri],[x,t]],[/((?:sd|kf)[0349hijorstuw]+)( bui|\)).+silk\//i],[[E,/(.+)/g,"Fire Phone $1"],[y,ri],[x,S]],[/(playbook);[-\w\),; ]+(rim)/i],[E,y,[x,t]],[/\b((?:bb[a-f]|st[hv])100-\d)/i,/(?:blackberry|\(bb10;) (\w+)/i],[E,[y,si],[x,S]],[/(?:\b|asus_)(transfo[prime ]{4,10} \w+|eeepc|slider \w+|nexus 7|padfone|p00[cj])/i],[E,[y,ai],[x,t]],[/ (z[bes]6[027][012][km][ls]|zenfone \d\w?)\b/i],[E,[y,ai],[x,S]],[/(nexus 9)/i],[E,[y,"HTC"],[x,t]],[/(htc)[-;_ ]{1,2}([\w ]+(?=\)| bui)|\w+)/i,/(zte)[- ]([\w ]+?)(?: bui|\/|\))/i,/(alcatel|geeksphone|nexian|panasonic(?!(?:;|\.))|sony(?!-bra))[-_ ]?([-\w]*)/i],[y,[E,/_/g," "],[x,S]],[/tcl (xess p17aa)/i,/droid [\w\.]+; ((?:8[14]9[16]|9(?:0(?:48|60|8[01])|1(?:3[27]|66)|2(?:6[69]|9[56])|466))[gqswx])(_\w(\w|\w\w))?(\)| bui)/i],[E,[y,"TCL"],[x,t]],[/droid [\w\.]+; (418(?:7d|8v)|5087z|5102l|61(?:02[dh]|25[adfh]|27[ai]|56[dh]|59k|65[ah])|a509dl|t(?:43(?:0w|1[adepqu])|50(?:6d|7[adju])|6(?:09dl|10k|12b|71[efho]|76[hjk])|7(?:66[ahju]|67[hw]|7[045][bh]|71[hk]|73o|76[ho]|79w|81[hks]?|82h|90[bhsy]|99b)|810[hs]))(_\w(\w|\w\w))?(\)| bui)/i],[E,[y,"TCL"],[x,S]],[/(itel) ((\w+))/i],[[y,q],E,[x,p,{tablet:["p10001l","w7001"],"*":"mobile"}]],[/droid.+; ([ab][1-7]-?[0178a]\d\d?)/i],[E,[y,"Acer"],[x,t]],[/droid.+; (m[1-5] note) bui/i,/\bmz-([-\w]{2,})/i],[E,[y,"Meizu"],[x,S]],[/; ((?:power )?armor(?:[\w ]{0,8}))(?: bui|\))/i],[E,[y,"Ulefone"],[x,S]],[/; (energy ?\w+)(?: bui|\))/i,/; energizer ([\w ]+)(?: bui|\))/i],[E,[y,"Energizer"],[x,S]],[/; cat (b35);/i,/; (b15q?|s22 flip|s48c|s62 pro)(?: bui|\))/i],[E,[y,"Cat"],[x,S]],[/((?:new )?andromax[\w- ]+)(?: bui|\))/i],[E,[y,"Smartfren"],[x,S]],[/droid.+; (a(in)?(0(15|59|6[35])|142)p?)/i],[E,[y,"Nothing"],[x,S]],[/; (x67 5g|tikeasy \w+|ac[1789]\d\w+)( b|\))/i,/archos ?(5|gamepad2?|([\w ]*[t1789]|hello) ?\d+[\w ]*)( b|\))/i],[E,[y,"Archos"],[x,t]],[/archos ([\w ]+)( b|\))/i,/; (ac[3-6]\d\w{2,8})( b|\))/i],[E,[y,"Archos"],[x,S]],[/; (n159v)/i],[E,[y,"HMD"],[x,S]],[/(imo) (tab \w+)/i,/(infinix|tecno) (x1101b?|p904|dp(7c|8d|10a)( pro)?|p70[1-3]a?|p904|t1101)/i],[y,E,[x,t]],[/(blackberry|benq|palm(?=\-)|sonyericsson|acer|asus(?! zenw)|dell|jolla|meizu|motorola|polytron|tecno|micromax|advan)[-_ ]?([-\w]*)/i,/; (blu|hmd|imo|infinix|lava|oneplus|tcl|wiko)[_ ]([\w\+ ]+?)(?: bui|\)|; r)/i,/(hp) ([\w ]+\w)/i,/(microsoft); (lumia[\w ]+)/i,/(oppo) ?([\w ]+) bui/i,/(hisense) ([ehv][\w ]+)\)/i,/droid[^;]+; (philips)[_ ]([sv-x][\d]{3,4}[xz]?)/i],[y,E,[x,S]],[/(kobo)\s(ereader|touch)/i,/(hp).+(touchpad(?!.+tablet)|tablet)/i,/(kindle)\/([\w\.]+)/i],[y,E,[x,t]],[/(surface duo)/i],[E,[y,di],[x,t]],[/droid [\d\.]+; (fp\du?)(?: b|\))/i],[E,[y,"Fairphone"],[x,S]],[/((?:tegranote|shield t(?!.+d tv))[\w- ]*?)(?: b|\))/i],[E,[y,"Nvidia"],[x,t]],[/(sprint) (\w+)/i],[y,E,[x,S]],[/(kin\.[onetw]{3})/i],[[E,/\./g," "],[y,di],[x,S]],[/droid.+; ([c6]+|et5[16]|mc[239][23]x?|vc8[03]x?)\)/i],[E,[y,fi],[x,t]],[/droid.+; (ec30|ps20|tc[2-8]\d[kx])\)/i],[E,[y,fi],[x,S]],[/(philips)[\w ]+tv/i,/smart-tv.+(samsung)/i],[y,[x,e]],[/hbbtv.+maple;(\d+)/i],[[E,/^/,"SmartTV"],[y,hi],[x,e]],[/(vizio)(?: |.+model\/)(\w+-\w+)/i,/tcast.+(lg)e?. ([-\w]+)/i],[y,E,[x,e]],[/(nux; netcast.+smarttv|lg (netcast\.tv-201\d|android tv))/i],[[y,"LG"],[x,e]],[/(apple) ?tv/i],[y,[E,s+" TV"],[x,e]],[/crkey.*devicetype\/chromecast/i],[[E,w+" Third Generation"],[y,n],[x,e]],[/crkey.*devicetype\/([^/]*)/i],[[E,/^/,"Chromecast "],[y,n],[x,e]],[/fuchsia.*crkey/i],[[E,w+" Nest Hub"],[y,n],[x,e]],[/crkey/i],[[E,w],[y,n],[x,e]],[/(portaltv)/i],[E,[y,xi],[x,e]],[/droid.+aft(\w+)( bui|\))/i],[E,[y,ri],[x,e]],[/(shield \w+ tv)/i],[E,[y,"Nvidia"],[x,e]],[/\(dtv[\);].+(aquos)/i,/(aquos-tv[\w ]+)\)/i],[E,[y,"Sharp"],[x,e]],[/(bravia[\w ]+)( bui|\))/i],[E,[y,ui],[x,e]],[/(mi(tv|box)-?\w+) bui/i],[E,[y,mi],[x,e]],[/Hbbtv.*(technisat) (.*);/i],[y,E,[x,e]],[/\b(roku)[\dx]*[\)\/]((?:dvp-)?[\d\.]*)/i,/hbbtv\/\d+\.\d+\.\d+ +\([\w\+ ]*; *([\w\d][^;]*);([^;]*)/i],[[y,/.+\/(\w+)/,"$1",p,{LG:"lge"}],[E,_i],[x,e]],[/(playstation \w+)/i],[E,[y,ui],[x,P]],[/\b(xbox(?: one)?(?!; xbox))[\); ]/i],[E,[y,di],[x,P]],[/(ouya)/i,/(nintendo) (\w+)/i,/(retroid) (pocket ([^\)]+))/i,/(valve).+(steam deck)/i,/droid.+; ((shield|rgcube|gr0006))( bui|\))/i],[[y,p,{Nvidia:"Shield",Anbernic:"RGCUBE",Logitech:"GR0006"}],E,[x,P]],[/\b(sm-[lr]\d\d[0156][fnuw]?s?|gear live)\b/i],[E,[y,hi],[x,o]],[/((pebble))app/i,/(asus|google|lg|oppo|xiaomi) ((pixel |zen)?watch[\w ]*)( bui|\))/i],[y,E,[x,o]],[/(ow(?:19|20)?we?[1-3]{1,3})/i],[E,[y,pi],[x,o]],[/(watch)(?: ?os[,\/]|\d,\d\/)[\d\.]+/i],[E,[y,s],[x,o]],[/(opwwe\d{3})/i],[E,[y,ci],[x,o]],[/(moto 360)/i],[E,[y,li],[x,o]],[/(smartwatch 3)/i],[E,[y,ui],[x,o]],[/(g watch r)/i],[E,[y,"LG"],[x,o]],[/droid.+; (wt63?0{2,3})\)/i],[E,[y,fi],[x,o]],[/droid.+; (glass) \d/i],[E,[y,n],[x,R]],[/(pico) ([\w ]+) os\d/i],[y,E,[x,R]],[/(quest( \d| pro)?s?).+vr/i],[E,[y,xi],[x,R]],[/mobile vr; rv.+firefox/i],[[x,R]],[/(tesla)(?: qtcarbrowser|\/[-\w\.]+)/i],[y,[x,G]],[/(aeobc)\b/i],[E,[y,ri],[x,G]],[/(homepod).+mac os/i],[E,[y,s],[x,G]],[/windows iot/i],[[x,G]],[/droid.+; ([\w- ]+) (4k|android|smart|google)[- ]?tv/i],[E,[x,e]],[/\b((4k|android|smart|opera)[- ]?tv|tv; rv:|large screen[\w ]+safari)\b/i],[[x,e]],[/droid .+?; ([^;]+?)(?: bui|; wv\)|\) applew|; hmsc).+?(mobile|vr|\d) safari/i],[E,[x,p,{mobile:"Mobile",xr:"VR","*":t}]],[/\b((tablet|tab)[;\/]|focus\/\d(?!.+mobile))/i],[[x,t]],[/(phone|mobile(?:[;\/]| [ \w\/\.]*safari)|pda(?=.+windows ce))/i],[[x,S]],[/droid .+?; ([\w\. -]+)( bui|\))/i],[E,[y,"Generic"]]],engine:[[/windows.+ edge\/([\w\.]+)/i],[C,[k,vi+"HTML"]],[/(arkweb)\/([\w\.]+)/i],[k,C],[/webkit\/537\.36.+chrome\/(?!27)([\w\.]+)/i],[C,[k,"Blink"]],[/(presto)\/([\w\.]+)/i,/(webkit|trident|netfront|netsurf|amaya|lynx|w3m|goanna|servo)\/([\w\.]+)/i,/ekioh(flow)\/([\w\.]+)/i,/(khtml|tasman|links|dillo)[\/ ]\(?([\w\.]+)/i,/(icab)[\/ ]([23]\.[\d\.]+)/i,/\b(libweb)/i],[k,C],[/ladybird\//i],[[k,"LibWeb"]],[/rv\:([\w\.]{1,9})\b.+(gecko)/i],[C,k]],os:[[/(windows nt) (6\.[23]); arm/i],[[k,/N/,"R"],[C,p,qi]],[/(windows (?:phone|mobile|iot))(?: os)?[\/ ]?([\d\.]*( se)?)/i,/(windows)[\/ ](1[01]|2000|3\.1|7|8(\.1)?|9[58]|me|server 20\d\d( r2)?|vista|xp)/i],[k,C],[/windows nt ?([\d\.\)]*)(?!.+xbox)/i,/\bwin(?=3| ?9|n)(?:nt| 9x )?([\d\.;]*)/i],[[C,/(;|\))/g,"",p,qi],[k,Ci]],[/(windows ce)\/?([\d\.]*)/i],[k,C],[/[adehimnop]{4,7}\b(?:.*os ([\w]+) like mac|; opera)/i,/(?:ios;fbsv|ios(?=.+ip(?:ad|hone)|.+apple ?tv)|ip(?:ad|hone)(?: |.+i(?:pad)?)os|apple ?tv.+ios)[\/ ]([\w\.]+)/i,/\btvos ?([\w\.]+)/i,/cfnetwork\/.+darwin/i],[[C,/_/g,"."],[k,"iOS"]],[/(mac os x) ?([\w\. ]*)/i,/(macintosh|mac_powerpc\b)(?!.+(haiku|morphos))/i],[[k,"macOS"],[C,/_/g,"."]],[/android ([\d\.]+).*crkey/i],[C,[k,w+" Android"]],[/fuchsia.*crkey\/([\d\.]+)/i],[C,[k,w+" Fuchsia"]],[/crkey\/([\d\.]+).*devicetype\/smartspeaker/i],[C,[k,w+" SmartSpeaker"]],[/linux.*crkey\/([\d\.]+)/i],[C,[k,w+" Linux"]],[/crkey\/([\d\.]+)/i],[C,[k,w]],[/droid ([\w\.]+)\b.+(android[- ]x86)/i],[C,k],[/(ubuntu) ([\w\.]+) like android/i],[[k,/(.+)/,"$1 Touch"],C],[/(harmonyos)[\/ ]?([\d\.]*)/i,/(android|bada|blackberry|kaios|maemo|meego|openharmony|qnx|rim tablet os|sailfish|series40|symbian|tizen)\w*[-\/\.; ]?([\d\.]*)/i],[k,C],[/\(bb(10);/i],[C,[k,si]],[/(?:symbian ?os|symbos|s60(?=;)|series ?60)[-\/ ]?([\w\.]*)/i],[C,[k,"Symbian"]],[/mozilla\/[\d\.]+ \((?:mobile[;\w ]*|tablet|tv|[^\)]*(?:viera|lg(?:l25|-d300)|alcatel ?o.+|y300-f1)); rv:([\w\.]+)\).+gecko\//i],[C,[k,ki+" OS"]],[/\b(?:hp)?wos(?:browser)?\/([\w\.]+)/i,/webos(?:[ \/]?|\.tv-20(?=2[2-9]))(\d[\d\.]*)/i],[C,[k,"webOS"]],[/web0s;.+?(?:chr[o0]me|safari)\/(\d+)/i],[[C,p,{25:"120",24:"108",23:"94",22:"87",6:"79",5:"68",4:"53",3:"38",2:"538",1:"537","*":"TV"}],[k,"webOS"]],[/watch(?: ?os[,\/ ]|\d,\d\/)([\d\.]+)/i],[C,[k,"watchOS"]],[/cros [\w]+(?:\)| ([\w\.]+)\b)/i],[C,[k,"Chrome OS"]],[/kepler ([\w\.]+); (aft|aeo)/i],[C,[k,"Vega OS"]],[/(netrange)mmh/i,/(nettv)\/(\d+\.[\w\.]+)/i,/(nintendo|playstation) (\w+)/i,/(xbox); +xbox ([^\);]+)/i,/(pico) .+os([\w\.]+)/i,/\b(joli|palm)\b ?(?:os)?\/?([\w\.]*)/i,/linux.+(mint)[\/\(\) ]?([\w\.]*)/i,/(mageia|vectorlinux|fuchsia|arcaos|arch(?= ?linux))[;l ]([\d\.]*)/i,/([kxln]?ubuntu|debian|suse|opensuse|gentoo|slackware|fedora|mandriva|centos|pclinuxos|red ?hat|zenwalk|linpus|raspbian|plan 9|minix|risc os|contiki|deepin|manjaro|elementary os|sabayon|linspire|knoppix)(?: gnu[\/ ]linux)?(?: enterprise)?(?:[- ]linux)?(?:-gnu)?[-\/ ]?(?!chrom|package)([-\w\.]*)/i,/((?:open)?solaris)[-\/ ]?([\w\.]*)/i,/\b(aix)[; ]([1-9\.]{0,4})/i,/(hurd|linux|morphos)(?: (?:arm|x86|ppc)\w*| ?)([\w\.]*)/i,/(gnu) ?([\w\.]*)/i,/\b([-frentopcghs]{0,5}bsd|dragonfly)[\/ ]?(?!amd|[ix346]{1,2}86)([\w\.]*)/i,/(haiku) ?(r\d)?/i],[k,C],[/(sunos) ?([\d\.]*)/i],[[k,"Solaris"],C],[/\b(beos|os\/2|amigaos|openvms|hp-ux|serenityos)/i,/(unix) ?([\w\.]*)/i],[k,C]]},Ai=(b={init:{},isIgnore:{},isIgnoreRgx:{},toString:{}},D.call(b.init,[[h,[k,C,j,x]],[u,[N]],[m,[x,E,y]],[f,[k,C]],[g,[k,C]]]),D.call(b.isIgnore,[[h,[C,j]],[f,[C]],[g,[C]]]),D.call(b.isIgnoreRgx,[[h,/ ?browser$/i],[g,/ ?os$/i]]),D.call(b.toString,[[h,[k,C]],[u,[N]],[m,[y,E]],[f,[k,C]],[g,[k,C]]]),b);function Bi(i,e){if(i=i||{},D.call(this,oi),e)D.call(this,[[L,Ii(i[a])],[$,Ii(i[X])],[S,/\?1/.test(i[K])],[E,Ui(i[ii])],[I,Ui(i[ei])],[W,Ui(i[ti])],[N,Ui(i[Y])],[T,Ii(i[Q])],[J,Ui(i[Z])]]);else for(var t in i)this.hasOwnProperty(t)&&typeof i[t]!==l.UNDEFINED&&(this[t]=i[t])}function F(i,e,t,o){return D.call(this,[["itemType",i],["ua",e],["uaCH",o],["rgxMap",t],["data",M(this,i)]]),this}function z(i,e,t){if(typeof i===l.OBJECT?(e=Si(i,!0)?(typeof e===l.OBJECT&&(t=e),i):(t=i,c),i=c):typeof i!==l.STRING||Si(e,!0)||(t=e,e=c),t)if(typeof t.append===l.FUNCTION){var o={};t.forEach(function(i,e){o[String(e).toLowerCase()]=i}),t=o}else{var r,a={};for(r in t)t.hasOwnProperty(r)&&(a[String(r).toLowerCase()]=t[r]);t=a}var s,n,w,b;return this instanceof z?(s=typeof i===l.STRING?i:t&&t[V]?t[V]:U&&U.userAgent?U.userAgent:d,n=new Bi(t,!0),w=e?((i,e)=>{var t,o={},r=e;if(!Si(e))for(var a in r={},e)for(var s in e[a])r[s]=e[a][s].concat(r[s]||[]);for(t in i)o[t]=r[t]&&r[t].length%2==0?r[t].concat(i[t]):i[t];return o})(zi,e):zi,D.call(this,[["getBrowser",(b=function(i){return i==v?function(){return new F(i,s,w,n).set("ua",s).set(h,this.getBrowser()).set(u,this.getCPU()).set(m,this.getDevice()).set(f,this.getEngine()).set(g,this.getOS()).get()}:function(){return new F(i,s,w[i],n).parseUA().get()}})(h)],["getCPU",b(u)],["getDevice",b(m)],["getEngine",b(f)],["getOS",b(g)],["getResult",b(v)],["getUA",function(){return s}],["setUA",function(i){return Ti(i)&&(s=_i(i,500)),this}]]).setUA(s),this):new z(i,e,t).getResult()}F.prototype.get=function(i){return i?this.data.hasOwnProperty(i)?this.data[i]:c:this.data},F.prototype.set=function(i,e){return this.data[i]=e,this},F.prototype.setCH=function(i){return this.uaCH=i,this},F.prototype.detectFeature=function(){if(U&&U.userAgent==this.ua)switch(this.itemType){case h:U.brave&&typeof U.brave.isBrave==l.FUNCTION&&this.set(k,"Brave");break;case m:!this.get(x)&&_&&_[S]&&this.set(x,S),"Macintosh"==this.get(E)&&U&&typeof U.standalone!==l.UNDEFINED&&U.maxTouchPoints&&2<U.maxTouchPoints&&this.set(E,"iPad").set(x,t);break;case g:!this.get(k)&&_&&_[I]&&this.set(k,_[I]);break;case v:var e=this.data,i=function(i){return e[i].getItem().detectFeature().get()};this.set(h,i(h)).set(u,i(u)).set(m,i(m)).set(f,i(f)).set(g,i(g))}return this},F.prototype.parseUA=function(){switch(this.itemType!=v&&H.call(this.data,this.ua,this.rgxMap),this.itemType){case h:this.set(j,B(this.get(C)));break;case g:var i;"iOS"==this.get(k)&&"18.6"==this.get(C)&&(i=/\) Version\/([\d\.]+)/.exec(this.ua))&&26<=parseInt(i[1].substring(0,2),10)&&this.set(C,i[1])}return this},F.prototype.parseCH=function(){var i,e=this.uaCH,t=this.rgxMap;switch(this.itemType){case h:case f:var o,r=e[$]||e[L];if(r)for(var a=0;a<r.length;a++){var s=r[a].brand||r[a],n=r[a].version;this.itemType==h&&!/not.a.brand/i.test(s)&&(!o||/Chrom/.test(o)&&s!=gi||o==vi&&/WebView2/.test(s))&&(s=p(s,Fi),(o=this.get(k))&&!/Chrom/.test(o)&&/Chrom/.test(s)||this.set(k,s).set(C,n).set(j,B(n)),o=s),this.itemType==f&&s==gi&&this.set(C,n)}break;case u:var w=e[N];w&&("64"==e[J]&&(w+="64"),H.call(this.data,w+";",t));break;case m:if(e[S]&&this.set(x,S),e[E]&&(this.set(E,e[E]),this.get(x)&&this.get(y)||(H.call(w={},"droid 9; "+e[E]+")",t),!this.get(x)&&w.type&&this.set(x,w.type),!this.get(y)&&w.vendor&&this.set(y,w.vendor))),e[T]){if("string"!=typeof e[T])for(var b=0;!i&&b<e[T].length;)i=p(e[T][b++],Di);else i=p(e[T],Di);this.set(x,i)}break;case g:var d,w=e[I];w&&(d=e[W],w==Ci&&(d=13<=parseInt(B(d),10)?"11":"10"),this.set(k,w).set(C,d)),this.get(k)==Ci&&"Xbox"==e[E]&&this.set(k,"Xbox").set(C,c);break;case v:var l=this.data,w=function(i){return l[i].getItem().setCH(e).parseCH().get()};this.set(h,w(h)).set(u,w(u)).set(m,w(m)).set(f,w(f)).set(g,w(g))}return this},z.VERSION="2.0.9",z.BROWSER=A([k,C,j,x]),z.CPU=A([N]),z.DEVICE=A([E,y,x,P,S,e,t,o,G]),z.ENGINE=z.OS=A([k,C]),typeof exports!==l.UNDEFINED?(exports=typeof module!==l.UNDEFINED&&module.exports?module.exports=z:exports).UAParser=z:typeof define===l.FUNCTION&&define.amd?define(function(){return z}):Ni&&(i.UAParser=z);var Hi,Mi=Ni&&(i.jQuery||i.Zepto);Mi&&!Mi.ua&&(Hi=new z,Mi.ua=Hi.getResult(),Mi.ua.get=function(){return Hi.getUA()},Mi.ua.set=function(i){Hi.setUA(i);var e,t=Hi.getResult();for(e in t)Mi.ua[e]=t[e]})})("object"==typeof window?window:this);+((i,c)=>{function B(i){for(var e={},t=0;t<i.length;t++)e[i[t].toUpperCase()]=i[t];return e}function H(i){return Ii(i)?_i(/[^\d\.]/g,i).split(".")[0]:c}function A(i,e){if(i&&e)for(var t,o,r,a,s,n=0;n<e.length&&!a;){for(var w=e[n],b=e[n+1],d=t=0;d<w.length&&!a&&w[d];)if(a=w[d++].exec(i))for(o=0;o<b.length;o++)s=a[++t],typeof(r=b[o])===l.OBJECT&&0<r.length?2===r.length?typeof r[1]==l.FUNCTION?this[r[0]]=r[1].call(this,s):this[r[0]]=r[1]:3<=r.length&&(typeof r[1]!==l.FUNCTION||r[1].exec&&r[1].test?3==r.length?this[r[0]]=s?s.replace(r[1],r[2]):c:4==r.length?this[r[0]]=s?r[3].call(this,s.replace(r[1],r[2])):c:4<r.length&&(this[r[0]]=s?r[3].apply(this,[s.replace(r[1],r[2])].concat(r.slice(4))):c):3<r.length?this[r[0]]=s?r[1].apply(this,r.slice(2)):c:this[r[0]]=s?r[1].call(this,s,r[2]):c):this[r]=s||c;n+=2}}function p(i,e){for(var t in e)if(typeof e[t]===l.OBJECT&&0<e[t].length){for(var o=0;o<e[t].length;o++)if(Si(e[t][o],i))return"?"===t?c:t}else if(Si(e[t],i))return"?"===t?c:t;return e.hasOwnProperty("*")?e["*"]:i}function M(e,i){var t=Hi.init[i],o=Hi.isIgnore[i]||0,r=Hi.isIgnoreRgx[i]||0,a=Hi.toString[i]||0;function s(){D.call(this,t)}return s.prototype.getItem=function(){return e},s.prototype.withClientHints=function(){return _?_.getHighEntropyValues(ri).then(function(i){return e.setCH(new Ai(i,!1)).parseCH().get()}):e.parseCH().get()},s.prototype.withFeatureCheck=function(){return e.detectFeature().get()},i!=v&&(s.prototype.is=function(i){var e,t=!1;for(e in this)if(this.hasOwnProperty(e)&&!Si(o,e)&&q(r?_i(r,this[e]):this[e])==q(r?_i(r,i):i)){if(t=!0,i!=l.UNDEFINED)break}else if(i==l.UNDEFINED&&t){t=!t;break}return t},s.prototype.toString=function(){var i,e=d;for(i in a)typeof this[a[i]]!==l.UNDEFINED&&(e+=(e?" ":d)+this[a[i]]);return e||l.UNDEFINED}),s.prototype.then=function(i){function e(){for(var i in t)t.hasOwnProperty(i)&&(this[i]=t[i])}var t=this,o=(e.prototype={is:s.prototype.is,toString:s.prototype.toString,withClientHints:s.prototype.withClientHints,withFeatureCheck:s.prototype.withFeatureCheck},new e);return i(o),o},new s}var P=500,V="user-agent",d="",l={FUNCTION:"function",OBJECT:"object",STRING:"string",UNDEFINED:"undefined"},u="browser",h="cpu",m="device",f="engine",g="os",v="result",k="name",x="type",y="vendor",C="version",N="architecture",j="major",E="model",R="console",S="mobile",t="tablet",e="smarttv",o="wearable",G="xr",L="embedded",r="inapp",$="brands",T="formFactors",W="fullVersionList",I="platform",J="platformVersion",X="bitness",a="sec-ch-ua",Y=a+"-full-version-list",Z=a+"-arch",Q=a+"-"+X,K=a+"-form-factors",ii=a+"-"+S,ei=a+"-"+E,ti=a+"-"+I,oi=ti+"-version",ri=[$,W,S,E,I,J,N,T,X],ai="Amazon",s="Apple",si="ASUS",ni="BlackBerry",n="Google",wi="Huawei",bi="Lenovo",di="Honor",li="Microsoft",ci="Motorola",pi="OnePlus",ui="OPPO",hi="Samsung",mi="Sony",fi="Xiaomi",gi="Zebra",vi="Chromium",w="Chromecast",ki="Edge",xi="Firefox",b="Opera",yi="Facebook",Ci="Mobile ",O=" Browser",Ni="Windows",Ei=typeof i!==l.UNDEFINED,U=Ei&&i.navigator?i.navigator:c,_=U&&U.userAgentData?U.userAgentData:c,Si=function(i,e){if(typeof i===l.OBJECT&&0<i.length){for(var t in i)if(q(e)==q(i[t]))return!0;return!1}return!!Ii(i)&&q(e)==q(i)},Ti=function(i,e){for(var t in i)return/^(browser|cpu|device|engine|os)$/.test(t)||!!e&&Ti(i[t])},Ii=function(i){return typeof i===l.STRING},Oi=function(i){if(!i)return c;for(var e,t=[],o=Ui(i).split(","),r=0;r<o.length;r++)-1<o[r].indexOf(";")?(e=qi(o[r]).split(";v="),t[r]={brand:e[0],version:e[1]}):t[r]=qi(o[r]);return t},q=function(i){return Ii(i)?i.toLowerCase():i},Ui=function(i){return Ii(i)?qi(_i(/\\?\"/g,i),P):c},D=function(i){for(var e in i)i.hasOwnProperty(e)&&(typeof(e=i[e])==l.OBJECT&&2==e.length?this[e[0]]=e[1]:this[e]=c);return this},_i=function(i,e){return Ii(e)?e.replace(i,d):e},qi=function(i,e){return i=_i(/^\s\s*/,String(i)),typeof e===l.UNDEFINED?i:i.substring(0,e)},Di={ME:"4.90","NT 3.51":"3.51","NT 4.0":"4.0",2e3:["5.0","5.01"],XP:["5.1","5.2"],Vista:"6.0",7:"6.1",8:"6.2",8.1:"6.3",10:["6.4","10.0"],NT:""},Fi={embedded:"Automotive",mobile:"Mobile",tablet:["Tablet","EInk"],smarttv:"TV",wearable:"Watch",xr:["VR","XR"],"?":["Desktop","Unknown"],"*":c},zi={Chrome:"Google Chrome",Edge:"Microsoft Edge","Edge WebView2":"Microsoft Edge WebView2","Chrome WebView":"Android WebView","Chrome Headless":"HeadlessChrome","Huawei Browser":"HuaweiBrowser","MIUI Browser":"Miui Browser","Opera Mobi":"OperaMobile",Yandex:"YaBrowser"},Bi={browser:[[/\b(?:crmo|crios)\/([\w\.]+)/i],[C,[k,Ci+"Chrome"]],[/webview.+edge\/([\w\.]+)/i],[C,[k,ki+" WebView"],[x,r]],[/edg(?:e|ios|a)?\/([\w\.]+)/i],[C,[k,"Edge"]],[/(opera mini)\/([-\w\.]+)/i,/(opera [mobiletab]{3,6})\b.+version\/([-\w\.]+)/i,/(opera)(?:.+version\/|[\/ ]+)([\w\.]+)/i],[k,C],[/opios[\/ ]+([\w\.]+)/i],[C,[k,b+" Mini"]],[/\bop(?:rg)?x\/([\w\.]+)/i],[C,[k,b+" GX"]],[/\bopr\/([\w\.]+)/i],[C,[k,b]],[/\bb[ai]*d(?:uhd|[ub]*[aekoprswx]{5,6})[\/ ]?([\w\.]+)/i],[C,[k,"Baidu"]],[/\b(?:mxbrowser|mxios|myie2)\/?([-\w\.]*)\b/i],[C,[k,"Maxthon"]],[/(kindle)\/([\w\.]+)/i,/(lunascape|maxthon|netfront|jasmine|blazer|sleipnir)[\/ ]?([\w\.]*)/i,/(avant|iemobile|slim(?:browser|boat|jet))[\/ ]?([\d\.]*)/i,/(?:ms|\()(ie) ([\w\.]+)/i,/(atlas|flock|rockmelt|midori|epiphany|silk|skyfire|bolt|iron|vivaldi|iridium|phantomjs|bowser|qupzilla|falkon|rekonq|puffin|whale(?!.+naver)|qqbrowserlite|duckduckgo|klar|helio|(?=comodo_)?dragon|otter|dooble|(?:hi|lg |ovi|qute)browser|palemoon)\/v?([-\w\.]+)/i,/(brave)(?: chrome)?\/([\d\.]+)/i,/(aloha|heytap|ovi|115|surf|qwant)browser\/([\d\.]+)/i,/(qwant)(?:ios|mobile)\/([\d\.]+)/i,/(ecosia|weibo)(?:__| \w+@)([\d\.]+)/i],[k,C],[/quark(?:pc)?\/([-\w\.]+)/i],[C,[k,"Quark"]],[/\bddg\/([\w\.]+)/i],[C,[k,"DuckDuckGo"]],[/(?:\buc? ?browser|(?:juc.+)ucweb| ucpc)[\/ ]?([\w\.]+)/i],[C,[k,"UCBrowser"]],[/microm.+\bqbcore\/([\w\.]+)/i,/\bqbcore\/([\w\.]+).+microm/i,/micromessenger\/([\w\.]+)/i],[C,[k,"WeChat"]],[/konqueror\/([\w\.]+)/i],[C,[k,"Konqueror"]],[/trident.+rv[: ]([\w\.]{1,9})\b.+like gecko/i],[C,[k,"IE"]],[/ya(?:search)?browser\/([\w\.]+)/i],[C,[k,"Yandex"]],[/slbrowser\/([\w\.]+)/i],[C,[k,"Smart "+bi+O]],[/(av(?:ast|g|ira))\/([\w\.]+)/i],[[k,/(.+)/,"$1 Secure"+O],C],[/norton\/([\w\.]+)/i],[C,[k,"Norton Private"+O]],[/\bfocus\/([\w\.]+)/i],[C,[k,xi+" Focus"]],[/ mms\/([\w\.]+)$/i],[C,[k,b+" Neon"]],[/ opt\/([\w\.]+)$/i],[C,[k,b+" Touch"]],[/coc_coc\w+\/([\w\.]+)/i],[C,[k,"Coc Coc"]],[/dolfin\/([\w\.]+)/i],[C,[k,"Dolphin"]],[/coast\/([\w\.]+)/i],[C,[k,b+" Coast"]],[/miuibrowser\/([\w\.]+)/i],[C,[k,"MIUI"+O]],[/fxios\/([\w\.-]+)/i],[C,[k,Ci+xi]],[/\bqihoobrowser\/?([\w\.]*)/i],[C,[k,"360"]],[/\b(qq)\/([\w\.]+)/i],[[k,/(.+)/,"$1Browser"],C],[/(oculus|sailfish|huawei|vivo|pico)browser\/([\w\.]+)/i],[[k,/(.+)/,"$1"+O],C],[/ HBPC\/([\w\.]+)/],[C,[k,wi+O]],[/samsungbrowser\/([\w\.]+)/i],[C,[k,hi+" Internet"]],[/metasr[\/ ]?([\d\.]+)/i],[C,[k,"Sogou Explorer"]],[/(sogou)mo\w+\/([\d\.]+)/i],[[k,"Sogou Mobile"],C],[/(electron)\/([\w\.]+) safari/i,/(tesla)(?: qtcarbrowser|\/(20\d\d\.[-\w\.]+))/i,/m?(qqbrowser|2345(?=browser|chrome|explorer))\w*[\/ ]?v?([\w\.]+)/i],[k,C],[/(lbbrowser|luakit|rekonq|steam(?= (clie|tenf|gameo)))/i],[k],[/ome\/([\w\.]+).+(iron(?= saf)|360(?=[es]e$))/i],[C,k],[/((?:fban\/fbios|fb_iab\/fb4a)(?!.+fbav)|;fbav\/([\w\.]+);)/i],[[k,yi],C,[x,r]],[/(kakao(?:talk|story))[\/ ]([\w\.]+)/i,/(naver)\(.*?(\d+\.[\w\.]+).*\)/i,/(daum)apps[\/ ]([\w\.]+)/i,/safari (line)\/([\w\.]+)/i,/\b(line)\/([\w\.]+)\/iab/i,/(alipay)client\/([\w\.]+)/i,/(twitter)(?:and| f.+e\/([\w\.]+))/i,/(bing)(?:web|sapphire)\/([\w\.]+)/i,/(instagram|snapchat|klarna)[\/ ]([-\w\.]+)/i],[k,C,[x,r]],[/\bgsa\/([\w\.]+) .*safari\//i],[C,[k,"GSA"],[x,r]],[/(?:musical_ly|trill)(?:.+app_?version\/|_)([\w\.]+)/i],[C,[k,"TikTok"],[x,r]],[/\[(linkedin)app\]/i],[k,[x,r]],[/(zalo(?:app)?)[\/\sa-z]*([\w\.-]+)/i],[[k,/(.+)/,"Zalo"],C,[x,r]],[/(chromium)[\/ ]([-\w\.]+)/i],[k,C],[/ome-(lighthouse)$/i],[k,[x,"fetcher"]],[/headlesschrome(?:\/([\w\.]+)| )/i],[C,[k,"Chrome Headless"]],[/wv\).+chrome\/([\w\.]+).+edgw\//i],[C,[k,ki+" WebView2"],[x,r]],[/; wv\).+(chrome)\/([\w\.]+)/i],[[k,"Chrome WebView"],C,[x,r]],[/droid.+ version\/([\w\.]+)\b.+(?:mobile safari|safari)/i],[C,[k,"Android"+O]],[/chrome\/([\w\.]+) mobile/i],[C,[k,Ci+"Chrome"]],[/(chrome|omniweb|arora|[tizenoka]{5} ?browser)\/v?([\w\.]+)/i],[k,C],[/version\/([\w\.\,]+) .*mobile(?:\/\w+ | ?)safari/i],[C,[k,Ci+"Safari"]],[/iphone .*mobile(?:\/\w+ | ?)safari/i],[[k,Ci+"Safari"]],[/version\/([\w\.\,]+) .*(safari)/i],[C,k],[/webkit.+?(mobile ?safari|safari)(\/[\w\.]+)/i],[k,[C,"1"]],[/(webkit|khtml)\/([\w\.]+)/i],[k,C],[/(?:mobile|tablet);.*(firefox)\/([\w\.-]+)/i],[[k,Ci+xi],C],[/(navigator|netscape\d?)\/([-\w\.]+)/i],[[k,"Netscape"],C],[/(wolvic|librewolf)\/([\w\.]+)/i],[k,C],[/mobile vr; rv:([\w\.]+)\).+firefox/i],[C,[k,xi+" Reality"]],[/ekiohf.+(flow)\/([\w\.]+)/i,/(swiftfox)/i,/(icedragon|iceweasel|camino|chimera|fennec|maemo browser|minimo|conkeror)[\/ ]?([\w\.\+]+)/i,/(seamonkey|k-meleon|icecat|iceape|firebird|phoenix|basilisk|waterfox)\/([-\w\.]+)$/i,/(firefox)\/([\w\.]+)/i,/(mozilla)\/([\w\.]+(?= .+rv\:.+gecko\/\d+)|[0-4][\w\.]+(?!.+compatible))/i,/(amaya|dillo|doris|icab|ladybird|lynx|mosaic|netsurf|obigo|polaris|w3m|(?:go|ice|up)[\. ]?browser)[-\/ ]?v?([\w\.]+)/i,/\b(links) \(([\w\.]+)/i],[k,[C,/_/g,"."]],[/(cobalt)\/([\w\.]+)/i],[k,[C,/[^\d\.]+./,d]]],cpu:[[/\b((amd|x|x86[-_]?|wow|win)64)\b/i],[[N,"amd64"]],[/(ia32(?=;))/i,/\b((i[346]|x)86)(pc)?\b/i],[[N,"ia32"]],[/\b(aarch64|arm(v?[89]e?l?|_?64))\b/i],[[N,"arm64"]],[/\b(arm(v[67])?ht?n?[fl]p?)\b/i],[[N,"armhf"]],[/( (ce|mobile); ppc;|\/[\w\.]+arm\b)/i],[[N,"arm"]],[/ sun4\w[;\)]/i],[[N,"sparc"]],[/\b(avr32|ia64(?=;)|68k(?=\))|\barm(?=v([1-7]|[5-7]1)l?|;|eabi)|(irix|mips|sparc)(64)?\b|pa-risc)/i,/((ppc|powerpc)(64)?)( mac|;|\))/i,/(?:osf1|[freopnt]{3,4}bsd) (alpha)/i],[[N,/ower/,d,q]],[/mc680.0/i],[[N,"68k"]],[/winnt.+\[axp/i],[[N,"alpha"]]],device:[[/\b(sch-i[89]0\d|shw-m380s|sm-[ptx]\w{2,4}|gt-[pn]\d{2,4}|sgh-t8[56]9|nexus 10)/i],[E,[y,hi],[x,t]],[/\b((?:s[cgp]h|gt|sm)-(?![lr])\w+|sc[g-]?[\d]+a?|galaxy nexus)/i,/samsung[- ]((?!sm-[lr]|browser)[-\w]+)/i,/sec-(sgh\w+)/i],[E,[y,hi],[x,S]],[/(?:\/|\()(ip(?:hone|od)[\w, ]*)[\/\);]/i],[E,[y,s],[x,S]],[/\b(?:ios|apple\w+)\/.+[\(\/](ipad)/i,/\b(ipad)[\d,]*[;\] ].+(mac |i(pad)?)os/i],[E,[y,s],[x,t]],[/(macintosh);/i],[E,[y,s]],[/\b(sh-?[altvz]?\d\d[a-ekm]?)/i],[E,[y,"Sharp"],[x,S]],[/\b((?:brt|eln|hey2?|gdi|jdn)-a?[lnw]09|(?:ag[rm]3?|jdn2|kob2)-a?[lw]0[09]hn)(?: bui|\)|;)/i],[E,[y,di],[x,t]],[/honor([-\w ]+)[;\)]/i],[E,[y,di],[x,S]],[/\b((?:ag[rs][2356]?k?|bah[234]?|bg[2o]|bt[kv]|cmr|cpn|db[ry]2?|jdn2|got|kob2?k?|mon|pce|scm|sht?|[tw]gr|vrd)-[ad]?[lw][0125][09]b?|605hw|bg2-u03|(?:gem|fdr|m2|ple|t1)-[7a]0[1-4][lu]|t1-a2[13][lw]|mediapad[\w\. ]*(?= bui|\)))\b(?!.+d\/s)/i],[E,[y,wi],[x,t]],[/(?:huawei) ?([-\w ]+)[;\)]/i,/\b(nexus 6p|\w{2,4}e?-[atu]?[ln][\dx][\dc][adnt]?)\b(?!.+d\/s)/i],[E,[y,wi],[x,S]],[/oid[^\)]+; (2[\dbc]{4}(182|283|rp\w{2})[cgl]|m2105k81a?c)(?: bui|\))/i,/\b(?:xiao)?((?:red)?mi[-_ ]?pad[\w- ]*)(?: bui|\))/i],[[E,/_/g," "],[y,fi],[x,t]],[/\b; (\w+) build\/hm\1/i,/\b(hm[-_ ]?note?[_ ]?(?:\d\w)?) bui/i,/oid[^\)]+; (redmi[\-_ ]?(?:note|k)?[\w_ ]+|m?[12]\d[01]\d\w{3,6}|poco[\w ]+|(shark )?\w{3}-[ah]0|qin ?[1-3](s\+|ultra| pro)?)( bui|; wv|\))/i,/\b(mi[-_ ]?(?:a\d|one|one[_ ]plus|note|max|cc)?[_ ]?(?:\d{0,2}\w?)[_ ]?(?:plus|se|lite|pro)?( 5g|lte)?)(?: bui|\))/i,/; ([\w ]+) miui\/v?\d/i],[[E,/_/g," "],[y,fi],[x,S]],[/droid.+; (cph2[3-6]\d[13579]|((gm|hd)19|(ac|be|in|kb)20|(d[en]|eb|le|mt)21|ne22)[0-2]\d|p[g-l]\w[1m]10)\b/i,/(?:one)?(?:plus)? (a\d0\d\d)(?: b|\))/i],[E,[y,pi],[x,S]],[/; (\w+) bui.+ oppo/i,/\b(cph[12]\d{3}|p(?:af|c[al]|d\w|e[ar])[mt]\d0|x9007|a101op)\b/i],[E,[y,ui],[x,S]],[/\b(opd2(\d{3}a?))(?: bui|\))/i],[E,[y,p,{OnePlus:["203","304","403","404","413","415"],"*":ui}],[x,t]],[/(vivo (5r?|6|8l?|go|one|s|x[il]?[2-4]?)[\w\+ ]*)(?: bui|\))/i],[E,[y,"BLU"],[x,S]],[/; vivo (\w+)(?: bui|\))/i,/\b(v[12]\d{3}\w?[at])(?: bui|;)/i],[E,[y,"Vivo"],[x,S]],[/\b(rmx[1-3]\d{3})(?: bui|;|\))/i],[E,[y,"Realme"],[x,S]],[/(ideatab[-\w ]+|602lv|d-42a|a101lv|a2109a|a3500-hv|s[56]000|pb-6505[my]|tb-?x?\d{3,4}(?:f[cu]|xu|[av])|yt\d?-[jx]?\d+[lfmx])( bui|;|\)|\/)/i,/lenovo ?(b[68]0[08]0-?[hf]?|tab(?:[\w- ]+?)|tb[\w-]{6,7})( bui|;|\)|\/)/i],[E,[y,bi],[x,t]],[/lenovo[-_ ]?([-\w ]+?)(?: bui|\)|\/)/i],[E,[y,bi],[x,S]],[/\b(milestone|droid(?:[2-4x]| (?:bionic|x2|pro|razr))?:?( 4g)?)\b[\w ]+build\//i,/\bmot(?:orola)?[- ]([\w\s]+)(\)| bui)/i,/((?:moto(?! 360)[-\w\(\) ]+|xt\d{3,4}[cgkosw\+]?[-\d]*|nexus 6)(?= bui|\)))/i],[E,[y,ci],[x,S]],[/\b(mz60\d|xoom[2 ]{0,2}) build\//i],[E,[y,ci],[x,t]],[/\b(?:lg)?([vl]k\-?\d{3}) bui| 3\.[-\w; ]{10}lg?-([06cv9]{3,4})/i],[E,[y,"LG"],[x,t]],[/(lm(?:-?f100[nv]?|-[\w\.]+)(?= bui|\))|nexus [45])/i,/\blg[-e;\/ ]+(?!.*(?:browser|netcast|android tv|watch|webos))(\w+)/i,/\blg-?([\d\w]+) bui/i],[E,[y,"LG"],[x,S]],[/(nokia) (t[12][01])/i],[y,E,[x,t]],[/(?:maemo|nokia).*(n900|lumia \d+|rm-\d+)/i,/nokia[-_ ]?(([-\w\. ]*?))( bui|\)|;|\/)/i],[[E,/_/g," "],[x,S],[y,"Nokia"]],[/(pixel (c|tablet))\b/i],[E,[y,n],[x,t]],[/droid.+;(?: google)? (g(01[13]a|020[aem]|025[jn]|1b60|1f8f|2ybb|4s1m|576d|5nz6|8hhn|8vou|a02099|c15s|d1yq|e2ae|ec77|gh2x|kv4x|p4bc|pj41|r83y|tt9q|ur25|wvk6)|pixel[\d ]*a?( pro)?( xl)?( fold)?( \(5g\))?)( bui|\))/i],[E,[y,n],[x,S]],[/(google) (pixelbook( go)?)/i],[y,E],[/droid.+; (a?\d[0-2]{2}so|[c-g]\d{4}|so[-gl]\w+|xq-\w\w\d\d)(?= bui|\).+chrome\/(?![1-6]{0,1}\d\.))/i],[E,[y,mi],[x,S]],[/sony tablet [ps]/i,/\b(?:sony)?sgp\w+(?: bui|\))/i],[[E,"Xperia Tablet"],[y,mi],[x,t]],[/(alexa)webm/i,/(kf[a-z]{2}wi|aeo(?!bc)\w\w)( bui|\))/i,/(kf[a-z]+)( bui|\)).+silk\//i],[E,[y,ai],[x,t]],[/((?:sd|kf)[0349hijorstuw]+)( bui|\)).+silk\//i],[[E,/(.+)/g,"Fire Phone $1"],[y,ai],[x,S]],[/(playbook);[-\w\),; ]+(rim)/i],[E,y,[x,t]],[/\b((?:bb[a-f]|st[hv])100-\d)/i,/(?:blackberry|\(bb10;) (\w+)/i],[E,[y,ni],[x,S]],[/(?:\b|asus_)(transfo[prime ]{4,10} \w+|eeepc|slider \w+|nexus 7|padfone|p00[cj])/i],[E,[y,si],[x,t]],[/ (z[bes]6[027][012][km][ls]|zenfone \d\w?)\b/i],[E,[y,si],[x,S]],[/(nexus 9)/i],[E,[y,"HTC"],[x,t]],[/(htc)[-;_ ]{1,2}([\w ]+(?=\)| bui)|\w+)/i,/(zte)[- ]([\w ]+?)(?: bui|\/|\))/i,/(alcatel|geeksphone|nexian|panasonic(?!(?:;|\.))|sony(?!-bra))[-_ ]?([-\w]*)/i],[y,[E,/_/g," "],[x,S]],[/tcl (xess p17aa)/i,/droid [\w\.]+; ((?:8[14]9[16]|9(?:0(?:48|60|8[01])|1(?:3[27]|66)|2(?:6[69]|9[56])|466))[gqswx])(_\w(\w|\w\w))?(\)| bui)/i],[E,[y,"TCL"],[x,t]],[/droid [\w\.]+; (418(?:7d|8v)|5087z|5102l|61(?:02[dh]|25[adfh]|27[ai]|56[dh]|59k|65[ah])|a509dl|t(?:43(?:0w|1[adepqu])|50(?:6d|7[adju])|6(?:09dl|10k|12b|71[efho]|76[hjk])|7(?:66[ahju]|67[hw]|7[045][bh]|71[hk]|73o|76[ho]|79w|81[hks]?|82h|90[bhsy]|99b)|810[hs]))(_\w(\w|\w\w))?(\)| bui)/i],[E,[y,"TCL"],[x,S]],[/(itel) ((\w+))/i],[[y,q],E,[x,p,{tablet:["p10001l","w7001"],"*":"mobile"}]],[/droid.+; ([ab][1-7]-?[0178a]\d\d?)/i],[E,[y,"Acer"],[x,t]],[/droid.+; (m[1-5] note) bui/i,/\bmz-([-\w]{2,})/i],[E,[y,"Meizu"],[x,S]],[/; ((?:power )?armor(?:[\w ]{0,8}))(?: bui|\))/i],[E,[y,"Ulefone"],[x,S]],[/; (energy ?\w+)(?: bui|\))/i,/; energizer ([\w ]+)(?: bui|\))/i],[E,[y,"Energizer"],[x,S]],[/; cat (b35);/i,/; (b15q?|s22 flip|s48c|s62 pro)(?: bui|\))/i],[E,[y,"Cat"],[x,S]],[/((?:new )?andromax[\w- ]+)(?: bui|\))/i],[E,[y,"Smartfren"],[x,S]],[/droid.+; (a(in)?(0(15|59|6[35])|142)p?)/i],[E,[y,"Nothing"],[x,S]],[/; (x67 5g|tikeasy \w+|ac[1789]\d\w+)( b|\))/i,/archos ?(5|gamepad2?|([\w ]*[t1789]|hello) ?\d+[\w ]*)( b|\))/i],[E,[y,"Archos"],[x,t]],[/archos ([\w ]+)( b|\))/i,/; (ac[3-6]\d\w{2,8})( b|\))/i],[E,[y,"Archos"],[x,S]],[/blackview ([-\w ]+)( b|\))/i,/; (bv\d{4}[-\w ]*)( b|\))/i],[E,[y,"Blackview"],[x,S]],[/; (n159v)/i],[E,[y,"HMD"],[x,S]],[/((revvl[ \w\+]+|tm(?:rv|af)\w*[45]g(?:tb)?))( b|\))/i],[E,[x,function(i,e){return e.test.test(i)?e.ifTrue:e.ifFalse},{test:/ta?b/i,ifTrue:t,ifFalse:S}],[y,"T-Mobile"]],[/(imo) (tab \w+)/i,/(infinix|tecno) (x1101b?|p904|dp(7c|8d|10a)( pro)?|p70[1-3]a?|p904|t1101)/i],[y,E,[x,t]],[/(blackberry|benq|palm(?=\-)|sonyericsson|acer|asus(?! zenw)|dell|jolla|meizu|motorola|polytron|tecno|micromax|advan)[-_ ]?([-\w]*)/i,/; (blu|coolpad|cubot|hmd|imo|infinix|lava|oneplus|tcl|wiko)[_ ]([-\w\+ ]+?)(?: bui|\)|; r)/i,/(hp) ([\w ]+\w)/i,/(microsoft); (lumia[\w ]+)/i,/(oppo) ?([\w ]+) bui/i,/(hisense) ([ehv][\w ]+)\)/i,/droid[^;]+; (philips)[_ ]([sv-x][\d]{3,4}[xz]?)/i],[y,E,[x,S]],[/(kobo)\s(ereader|touch)/i,/(hp).+(touchpad(?!.+tablet)|tablet)/i,/(kindle)\/([\w\.]+)/i],[y,E,[x,t]],[/(surface duo)/i],[E,[y,li],[x,t]],[/droid [\d\.]+; (fp\du?)(?: b|\))/i],[E,[y,"Fairphone"],[x,S]],[/((?:tegranote|shield t(?!.+d tv))[\w- ]*?)(?: b|\))/i],[E,[y,"Nvidia"],[x,t]],[/(sprint) (\w+)/i],[y,E,[x,S]],[/(kin\.[onetw]{3})/i],[[E,/\./g," "],[y,li],[x,S]],[/droid.+; ([c6]+|et5[16]|mc[239][23]x?|vc8[03]x?)\)/i],[E,[y,gi],[x,t]],[/droid.+; (ec30|ps20|tc[2-8]\d[kx])\)/i],[E,[y,gi],[x,S]],[/(philips)[\w ]+tv/i,/smart-tv.+(samsung)/i],[y,[x,e]],[/hbbtv.+maple;(\d+)/i],[[E,/^/,"SmartTV"],[y,hi],[x,e]],[/(vizio)(?: |.+model\/)(\w+-\w+)/i,/tcast.+(lg)e?. ([-\w]+)/i],[y,E,[x,e]],[/(nux; netcast.+smarttv|lg (netcast\.tv-201\d|android tv))/i],[[y,"LG"],[x,e]],[/(apple) ?tv/i],[y,[E,s+" TV"],[x,e]],[/crkey.*devicetype\/chromecast/i],[[E,w+" Third Generation"],[y,n],[x,e]],[/crkey.*devicetype\/([^/]*)/i],[[E,/^/,"Chromecast "],[y,n],[x,e]],[/fuchsia.*crkey/i],[[E,w+" Nest Hub"],[y,n],[x,e]],[/crkey/i],[[E,w],[y,n],[x,e]],[/(portaltv)/i],[E,[y,yi],[x,e]],[/droid.+aft(\w+)( bui|\))/i],[E,[y,ai],[x,e]],[/(shield \w+ tv)/i],[E,[y,"Nvidia"],[x,e]],[/\(dtv[\);].+(aquos)/i,/(aquos-tv[\w ]+)\)/i],[E,[y,"Sharp"],[x,e]],[/(bravia[\w ]+)( bui|\))/i],[E,[y,mi],[x,e]],[/(mi(tv|box)-?\w+) bui/i],[E,[y,fi],[x,e]],[/Hbbtv.*(technisat) (.*);/i],[y,E,[x,e]],[/\b(roku)[\dx]*[\)\/]((?:dvp-)?[\d\.]*)/i,/hbbtv\/\d+\.\d+\.\d+ +\([\w\+ ]*; *([\w\d][^;]*);([^;]*)/i],[[y,/.+\/(\w+)/,"$1",p,{LG:"lge"}],[E,qi],[x,e]],[/(playstation \w+)/i],[E,[y,mi],[x,R]],[/\b(xbox(?: one)?(?!; xbox))[\); ]/i],[E,[y,li],[x,R]],[/(ouya)/i,/(nintendo) (\w+)/i,/(retroid) (pocket ([^\)]+))/i,/(valve).+(steam deck)/i,/droid.+; ((shield|rgcube|gr0006))( bui|\))/i],[[y,p,{Nvidia:"Shield",Anbernic:"RGCUBE",Logitech:"GR0006"}],E,[x,R]],[/\b(sm-[lr]\d\d[0156][fnuw]?s?|gear live)\b/i],[E,[y,hi],[x,o]],[/((pebble))app/i,/(asus|google|lg|oppo|xiaomi) ((pixel |zen)?watch[\w ]*)( bui|\))/i],[y,E,[x,o]],[/(ow(?:19|20)?we?[1-3]{1,3})/i],[E,[y,ui],[x,o]],[/(watch)(?: ?os[,\/]|\d,\d\/)[\d\.]+/i],[E,[y,s],[x,o]],[/(opwwe\d{3})/i],[E,[y,pi],[x,o]],[/(moto 360)/i],[E,[y,ci],[x,o]],[/(smartwatch 3)/i],[E,[y,mi],[x,o]],[/(g watch r)/i],[E,[y,"LG"],[x,o]],[/droid.+; (wt63?0{2,3})\)/i],[E,[y,gi],[x,o]],[/droid.+; (glass) \d/i],[E,[y,n],[x,G]],[/(pico) ([\w ]+) os\d/i],[y,E,[x,G]],[/(quest( \d| pro)?s?).+vr/i],[E,[y,yi],[x,G]],[/mobile vr; rv.+firefox/i],[[x,G]],[/(tesla)(?: qtcarbrowser|\/[-\w\.]+)/i],[y,[x,L]],[/(aeobc)\b/i],[E,[y,ai],[x,L]],[/(homepod).+mac os/i],[E,[y,s],[x,L]],[/windows iot/i],[[x,L]],[/droid.+; ([\w- ]+) (4k|android|smart|google)[- ]?tv/i],[E,[x,e]],[/\b((4k|android|smart|opera)[- ]?tv|tv; rv:|large screen[\w ]+safari)\b/i],[[x,e]],[/droid .+?; ([^;]+?)(?: bui|; wv\)|\) applew|; hmsc).+?(mobile|vr|\d) safari/i],[E,[x,p,{mobile:"Mobile",xr:"VR","*":t}]],[/\b((tablet|tab)[;\/]|focus\/\d(?!.+mobile))/i],[[x,t]],[/(phone|mobile(?:[;\/]| [ \w\/\.]*safari)|pda(?=.+windows ce))/i],[[x,S]],[/droid .+?; ([\w\. -]+)( bui|\))/i],[E,[y,"Generic"]]],engine:[[/windows.+ edge\/([\w\.]+)/i],[C,[k,ki+"HTML"]],[/(arkweb)\/([\w\.]+)/i],[k,C],[/webkit\/537\.36.+chrome\/(?!27)([\w\.]+)/i],[C,[k,"Blink"]],[/(presto)\/([\w\.]+)/i,/(webkit|trident|netfront|netsurf|amaya|lynx|w3m|goanna|servo)\/([\w\.]+)/i,/ekioh(flow)\/([\w\.]+)/i,/(khtml|tasman|links|dillo)[\/ ]\(?([\w\.]+)/i,/(icab)[\/ ]([23]\.[\d\.]+)/i,/\b(libweb)/i],[k,C],[/ladybird\//i],[[k,"LibWeb"]],[/rv\:([\w\.]{1,9})\b.+(gecko)/i],[C,k]],os:[[/(windows nt) (6\.[23]); arm/i],[[k,/N/,"R"],[C,p,Di]],[/(windows (?:phone|mobile|iot))(?: os)?[\/ ]?([\d\.]*( se)?)/i,/(windows)[\/ ](1[01]|2000|3\.1|7|8(\.1)?|9[58]|me|server 20\d\d( r2)?|vista|xp)/i],[k,C],[/windows nt ?([\d\.\)]*)(?!.+xbox)/i,/\bwin(?=3| ?9|n)(?:nt| 9x )?([\d\.;]*)/i],[[C,/(;|\))/g,"",p,Di],[k,Ni]],[/(windows ce)\/?([\d\.]*)/i],[k,C],[/[adehimnop]{4,7}\b(?:.*os ([\w]+) like mac|; opera)/i,/(?:ios;fbsv|ios(?=.+ip(?:ad|hone)|.+apple ?tv)|ip(?:ad|hone)(?: |.+i(?:pad)?)os|apple ?tv.+ios)[\/ ]([\w\.]+)/i,/\btvos ?([\w\.]+)/i,/cfnetwork\/.+darwin/i],[[C,/_/g,"."],[k,"iOS"]],[/(mac os x) ?([\w\. ]*)/i,/(macintosh|mac_powerpc\b)(?!.+(haiku|morphos))/i],[[k,"macOS"],[C,/_/g,"."]],[/android ([\d\.]+).*crkey/i],[C,[k,w+" Android"]],[/fuchsia.*crkey\/([\d\.]+)/i],[C,[k,w+" Fuchsia"]],[/crkey\/([\d\.]+).*devicetype\/smartspeaker/i],[C,[k,w+" SmartSpeaker"]],[/linux.*crkey\/([\d\.]+)/i],[C,[k,w+" Linux"]],[/crkey\/([\d\.]+)/i],[C,[k,w]],[/droid ([\w\.]+)\b.+(android[- ]x86)/i],[C,k],[/(ubuntu) ([\w\.]+) like android/i],[[k,/(.+)/,"$1 Touch"],C],[/(harmonyos)[\/ ]?([\d\.]*)/i,/(android|bada|blackberry|kaios|maemo|meego|openharmony|qnx|rim tablet os|sailfish|series40|symbian|tizen)\w*[-\/\.; ]?([\d\.]*)/i],[k,C],[/\(bb(10);/i],[C,[k,ni]],[/(?:symbian ?os|symbos|s60(?=;)|series ?60)[-\/ ]?([\w\.]*)/i],[C,[k,"Symbian"]],[/mozilla\/[\d\.]+ \((?:mobile[;\w ]*|tablet|tv|[^\)]*(?:viera|lg(?:l25|-d300)|alcatel ?o.+|y300-f1)); rv:([\w\.]+)\).+gecko\//i],[C,[k,xi+" OS"]],[/\b(?:hp)?wos(?:browser)?\/([\w\.]+)/i,/webos(?:[ \/]?|\.tv-20(?=2[2-9]))(\d[\d\.]*)/i],[C,[k,"webOS"]],[/web0s;.+?(?:chr[o0]me|safari)\/(\d+)/i],[[C,p,{25:"120",24:"108",23:"94",22:"87",6:"79",5:"68",4:"53",3:"38",2:"538",1:"537","*":"TV"}],[k,"webOS"]],[/watch(?: ?os[,\/ ]|\d,\d\/)([\d\.]+)/i],[C,[k,"watchOS"]],[/cros [\w]+(?:\)| ([\w\.]+)\b)/i],[C,[k,"Chrome OS"]],[/kepler ([\w\.]+); (aft|aeo)/i],[C,[k,"Vega OS"]],[/(netrange)mmh/i,/(nettv)\/(\d+\.[\w\.]+)/i,/(nintendo|playstation) (\w+)/i,/(xbox); +xbox ([^\);]+)/i,/(pico) .+os([\w\.]+)/i,/\b(joli|palm)\b ?(?:os)?\/?([\w\.]*)/i,/linux.+(mint)[\/\(\) ]?([\w\.]*)/i,/(mageia|vectorlinux|fuchsia|arcaos|arch(?= ?linux))[;l ]([\d\.]*)/i,/([kxln]?ubuntu|debian|suse|opensuse|gentoo|slackware|fedora|mandriva|centos|pclinuxos|red ?hat|zenwalk|linpus|raspbian|plan 9|minix|risc os|contiki|deepin|manjaro|elementary os|sabayon|linspire|knoppix)(?: gnu[\/ ]linux)?(?: enterprise)?(?:[- ]linux)?(?:-gnu)?[-\/ ]?(?!chrom|package)([-\w\.]*)/i,/((?:open)?solaris)[-\/ ]?([\w\.]*)/i,/\b(aix)[; ]([1-9\.]{0,4})/i,/(hurd|linux|morphos)(?: (?:arm|x86|ppc)\w*| ?)([\w\.]*)/i,/(gnu) ?([\w\.]*)/i,/\b([-frentopcghs]{0,5}bsd|dragonfly)[\/ ]?(?!amd|[ix346]{1,2}86)([\w\.]*)/i,/(haiku) ?(r\d)?/i],[k,C],[/(sunos) ?([\d\.]*)/i],[[k,"Solaris"],C],[/\b(beos|os\/2|amigaos|openvms|hp-ux|serenityos)/i,/(unix) ?([\w\.]*)/i],[k,C]]},Hi=(b={init:{},isIgnore:{},isIgnoreRgx:{},toString:{}},D.call(b.init,[[u,[k,C,j,x]],[h,[N]],[m,[x,E,y]],[f,[k,C]],[g,[k,C]]]),D.call(b.isIgnore,[[u,[C,j]],[f,[C]],[g,[C]]]),D.call(b.isIgnoreRgx,[[u,/ ?browser$/i],[g,/ ?os$/i]]),D.call(b.toString,[[u,[k,C]],[h,[N]],[m,[y,E]],[f,[k,C]],[g,[k,C]]]),b);function Ai(i,e){if(i=i||{},D.call(this,ri),e)D.call(this,[[$,Oi(i[a])],[W,Oi(i[Y])],[S,/\?1/.test(i[ii])],[E,Ui(i[ei])],[I,Ui(i[ti])],[J,Ui(i[oi])],[N,Ui(i[Z])],[T,Oi(i[K])],[X,Ui(i[Q])]]);else for(var t in i)this.hasOwnProperty(t)&&typeof i[t]!==l.UNDEFINED&&(this[t]=i[t])}function F(i,e,t,o){return D.call(this,[["itemType",i],["ua",e],["uaCH",o],["rgxMap",t],["data",M(this,i)]]),this}function z(i,e,t){if(typeof i===l.OBJECT?(e=Ti(i,!0)?(typeof e===l.OBJECT&&(t=e),i):(t=i,c),i=c):typeof i!==l.STRING||Ti(e,!0)||(t=e,e=c),t)if(typeof t.append===l.FUNCTION){var o={};t.forEach(function(i,e){o[String(e).toLowerCase()]=i}),t=o}else{var r,a={};for(r in t)t.hasOwnProperty(r)&&(a[String(r).toLowerCase()]=t[r]);t=a}var s,n,w,b;return this instanceof z?(s=typeof i===l.STRING?i:t&&t[V]?t[V]:U&&U.userAgent?U.userAgent:d,n=new Ai(t,!0),w=Bi,D.call(this,[["getBrowser",(b=function(i){return i==v?function(){return new F(i,s,w,n).set("ua",s).set(u,this.getBrowser()).set(h,this.getCPU()).set(m,this.getDevice()).set(f,this.getEngine()).set(g,this.getOS()).get()}:function(){return new F(i,s,w[i],n).parseUA().get()}})(u)],["getCPU",b(h)],["getDevice",b(m)],["getEngine",b(f)],["getOS",b(g)],["getResult",b(v)],["getUA",function(){return s}],["setUA",function(i){return Ii(i)&&(s=qi(i,P)),this}],["useExtension",function(i){return i&&(w=((i,e)=>{var t,o={},r=e;if(!Ti(e))for(var a in r={},e)for(var s in e[a])r[s]=e[a][s].concat(r[s]||[]);for(t in i)o[t]=r[t]&&r[t].length%2==0?r[t].concat(i[t]):i[t];return o})(w,i)),this}]]).setUA(s).useExtension(e),this):new z(i,e,t).getResult()}F.prototype.get=function(i){return i?this.data.hasOwnProperty(i)?this.data[i]:c:this.data},F.prototype.set=function(i,e){return this.data[i]=e,this},F.prototype.setCH=function(i){return this.uaCH=i,this},F.prototype.detectFeature=function(){if(U&&U.userAgent==this.ua)switch(this.itemType){case u:U.brave&&typeof U.brave.isBrave==l.FUNCTION&&this.set(k,"Brave");break;case m:!this.get(x)&&_&&_[S]&&this.set(x,S),"Macintosh"==this.get(E)&&U&&typeof U.standalone!==l.UNDEFINED&&U.maxTouchPoints&&2<U.maxTouchPoints&&this.set(E,"iPad").set(x,t);break;case g:!this.get(k)&&_&&_[I]&&this.set(k,_[I]);break;case v:var e=this.data,i=function(i){return e[i].getItem().detectFeature().get()};this.set(u,i(u)).set(h,i(h)).set(m,i(m)).set(f,i(f)).set(g,i(g))}return this},F.prototype.parseUA=function(){switch(this.itemType!=v&&A.call(this.data,this.ua,this.rgxMap),this.itemType){case u:this.set(j,H(this.get(C)));break;case g:var i;"iOS"==this.get(k)&&this.get(C)&&/^1[89][^\d]/.exec(this.get(C))&&(i=/\) Version\/((\d+)[\d\.]*)/.exec(this.ua))&&26<=parseInt(i[2],10)&&this.set(C,i[1])}return this},F.prototype.parseCH=function(){var i,e=this.uaCH,t=this.rgxMap;switch(this.itemType){case u:case f:var o,r=e[W]||e[$];if(r)for(var a=0;a<r.length;a++){var s=r[a].brand||r[a],n=r[a].version;this.itemType==u&&!/not.a.brand/i.test(s)&&(!o||/Chrom/.test(o)&&s!=vi||o==ki&&/WebView2/.test(s))&&(s=p(s,zi),(o=this.get(k))&&!/Chrom/.test(o)&&/Chrom/.test(s)||this.set(k,s).set(C,n).set(j,H(n)),o=s),this.itemType==f&&s==vi&&this.set(C,n)}break;case h:var w=e[N];w&&("64"==e[X]&&(w+="64"),A.call(this.data,w+";",t));break;case m:if(e[S]&&this.set(x,S),e[E]&&(this.set(E,e[E]),this.get(x)&&this.get(y)||(A.call(w={},"droid 9; "+e[E]+")",t),!this.get(x)&&w.type&&this.set(x,w.type),!this.get(y)&&w.vendor&&this.set(y,w.vendor))),e[T]){if("string"!=typeof e[T])for(var b=0;!i&&b<e[T].length;)i=p(e[T][b++],Fi);else i=p(e[T],Fi);this.set(x,i)}break;case g:var d,w=e[I];w&&(d=e[J],w==Ni&&(d=13<=parseInt(H(d),10)?"11":"10"),this.set(k,w).set(C,d)),this.get(k)==Ni&&"Xbox"==e[E]&&this.set(k,"Xbox").set(C,c);break;case v:var l=this.data,w=function(i){return l[i].getItem().setCH(e).parseCH().get()};this.set(u,w(u)).set(h,w(h)).set(m,w(m)).set(f,w(f)).set(g,w(g))}return this},z.VERSION="2.0.10",z.BROWSER=B([k,C,j,x]),z.CPU=B([N]),z.DEVICE=B([E,y,x,R,S,e,t,o,L]),z.ENGINE=z.OS=B([k,C]),typeof exports!==l.UNDEFINED?(exports=typeof module!==l.UNDEFINED&&module.exports?module.exports=z:exports).UAParser=z:typeof define===l.FUNCTION&&define.amd?define(function(){return z}):Ei&&(i.UAParser=z);var Mi,Pi=Ei&&(i.jQuery||i.Zepto);Pi&&!Pi.ua&&(Mi=new z,Pi.ua=Mi.getResult(),Pi.ua.get=function(){return Mi.getUA()},Pi.ua.set=function(i){Mi.setUA(i);var e,t=Mi.getResult();for(e in t)Pi.ua[e]=t[e]})})("object"==typeof window?window:this);
dist/ua-parser.pack.mjs +2 lines · 1 flagged
--- +++ @@ -1,4 +1,4 @@-/* UAParser.js v2.0.9+/* UAParser.js v2.0.10    Copyright © 2012-2026 Faisal Salman <[email protected]>    AGPLv3 License */-function B(i){for(var e={},o=0;o<i.length;o++)e[i[o].toUpperCase()]=i[o];return e}function H(i){return Si(i)?z(/[^\d\.]/g,i).split(".")[0]:void 0}function A(i,e){if(i&&e)for(var o,t,r,a,s,n=0;n<e.length&&!a;){for(var w=e[n],d=e[n+1],b=o=0;b<w.length&&!a&&w[b];)if(a=w[b++].exec(i))for(t=0;t<d.length;t++)s=a[++o],typeof(r=d[t])===l.OBJECT&&0<r.length?2===r.length?typeof r[1]==l.FUNCTION?this[r[0]]=r[1].call(this,s):this[r[0]]=r[1]:3<=r.length&&(typeof r[1]!==l.FUNCTION||r[1].exec&&r[1].test?3==r.length?this[r[0]]=s?s.replace(r[1],r[2]):void 0:4==r.length?this[r[0]]=s?r[3].call(this,s.replace(r[1],r[2])):void 0:4<r.length&&(this[r[0]]=s?r[3].apply(this,[s.replace(r[1],r[2])].concat(r.slice(4))):void 0):3<r.length?this[r[0]]=s?r[1].apply(this,r.slice(2)):void 0:this[r[0]]=s?r[1].call(this,s,r[2]):void 0):this[r]=s||void 0;n+=2}}function c(i,e){for(var o in e)if(typeof e[o]===l.OBJECT&&0<e[o].length){for(var t=0;t<e[o].length;t++)if(Ni(e[o][t],i))return"?"===o?void 0:o}else if(Ni(e[o],i))return"?"===o?void 0:o;return e.hasOwnProperty("*")?e["*"]:i}function M(e,i){var o=Di.init[i],t=Di.isIgnore[i]||0,r=Di.isIgnoreRgx[i]||0,a=Di.toString[i]||0;function s(){U.call(this,o)}return s.prototype.getItem=function(){return e},s.prototype.withClientHints=function(){return _?_.getHighEntropyValues(ti).then(function(i){return e.setCH(new Fi(i,!1)).parseCH().get()}):e.parseCH().get()},s.prototype.withFeatureCheck=function(){return e.detectFeature().get()},i!=f&&(s.prototype.is=function(i){var e,o=!1;for(e in this)if(this.hasOwnProperty(e)&&!Ni(t,e)&&q(r?z(r,this[e]):this[e])==q(r?z(r,i):i)){if(o=!0,i!=l.UNDEFINED)break}else if(i==l.UNDEFINED&&o){o=!o;break}return o},s.prototype.toString=function(){var i,e=b;for(i in a)typeof this[a[i]]!==l.UNDEFINED&&(e+=(e?" ":b)+this[a[i]]);return e||l.UNDEFINED}),s.prototype.then=function(i){function e(){for(var i in o)o.hasOwnProperty(i)&&(this[i]=o[i])}var o=this,t=(e.prototype={is:s.prototype.is,toString:s.prototype.toString,withClientHints:s.prototype.withClientHints,withFeatureCheck:s.prototype.withFeatureCheck},new e);return i(t),t},new s}var V="user-agent",b="",l={FUNCTION:"function",OBJECT:"object",STRING:"string",UNDEFINED:"undefined"},h="browser",p="cpu",u="device",m="engine",g="os",f="result",v="name",k="type",x="vendor",y="version",C="architecture",P="major",N="model",j="console",E="mobile",o="tablet",i="smarttv",e="wearable",R="xr",G="embedded",t="inapp",L="brands",S="formFactors",$="fullVersionList",T="platform",W="platformVersion",J="bitness",r="sec-ch-ua",X=r+"-full-version-list",Y=r+"-arch",Z=r+"-"+J,K=r+"-form-factors",Q=r+"-"+E,ii=r+"-"+N,ei=r+"-"+T,oi=ei+"-version",ti=[L,$,E,N,T,W,C,S,J],ri="Amazon",a="Apple",ai="ASUS",si="BlackBerry",s="Google",ni="Huawei",wi="Lenovo",di="Honor",bi="LG",li="Microsoft",ci="Motorola",hi="OnePlus",pi="OPPO",ui="Samsung",mi="Sony",gi="Xiaomi",fi="Zebra",vi="Chromium",n="Chromecast",ki="Edge",xi="Firefox",w="Opera",yi="Facebook",d="Mobile ",O=" Browser",Ci="Windows",I=typeof window!==l.UNDEFINED&&window.navigator?window.navigator:void 0,_=I&&I.userAgentData?I.userAgentData:void 0,Ni=function(i,e){if(typeof i===l.OBJECT&&0<i.length){for(var o in i)if(q(e)==q(i[o]))return!0;return!1}return!!Si(i)&&q(e)==q(i)},Ei=function(i,e){for(var o in i)return/^(browser|cpu|device|engine|os)$/.test(o)||!!e&&Ei(i[o])},Si=function(i){return typeof i===l.STRING},Ti=function(i){if(i){for(var e,o=[],t=z(/\\?\"/g,i).split(","),r=0;r<t.length;r++)-1<t[r].indexOf(";")?(e=Ii(t[r]).split(";v="),o[r]={brand:e[0],version:e[1]}):o[r]=Ii(t[r]);return o}},q=function(i){return Si(i)?i.toLowerCase():i},U=function(i){for(var e in i)i.hasOwnProperty(e)&&(typeof(e=i[e])==l.OBJECT&&2==e.length?this[e[0]]=e[1]:this[e]=void 0);return this},z=function(i,e){return Si(e)?e.replace(i,b):e},Oi=function(i){return z(/\\?\"/g,i)},Ii=function(i,e){return i=z(/^\s\s*/,String(i)),typeof e===l.UNDEFINED?i:i.substring(0,e)},_i={ME:"4.90","NT 3.51":"3.51","NT 4.0":"4.0",2e3:["5.0","5.01"],XP:["5.1","5.2"],Vista:"6.0",7:"6.1",8:"6.2",8.1:"6.3",10:["6.4","10.0"],NT:""},qi={embedded:"Automotive",mobile:"Mobile",tablet:["Tablet","EInk"],smarttv:"TV",wearable:"Watch",xr:["VR","XR"],"?":["Desktop","Unknown"],"*":void 0},Ui={Chrome:"Google Chrome",Edge:"Microsoft Edge","Edge WebView2":"Microsoft Edge WebView2","Chrome WebView":"Android WebView","Chrome Headless":"HeadlessChrome","Huawei Browser":"HuaweiBrowser","MIUI Browser":"Miui Browser","Opera Mobi":"OperaMobile",Yandex:"YaBrowser"},zi={browser:[[/\b(?:crmo|crios)\/([\w\.]+)/i],[y,[v,d+"Chrome"]],[/webview.+edge\/([\w\.]+)/i],[y,[v,ki+" WebView"]],[/edg(?:e|ios|a)?\/([\w\.]+)/i],[y,[v,"Edge"]],[/(opera mini)\/([-\w\.]+)/i,/(opera [mobiletab]{3,6})\b.+version\/([-\w\.]+)/i,/(opera)(?:.+version\/|[\/ ]+)([\w\.]+)/i],[v,y],[/opios[\/ ]+([\w\.]+)/i],[y,[v,w+" Mini"]],[/\bop(?:rg)?x\/([\w\.]+)/i],[y,[v,w+" GX"]],[/\bopr\/([\w\.]+)/i],[y,[v,w]],[/\bb[ai]*d(?:uhd|[ub]*[aekoprswx]{5,6})[\/ ]?([\w\.]+)/i],[y,[v,"Baidu"]],[/\b(?:mxbrowser|mxios|myie2)\/?([-\w\.]*)\b/i],[y,[v,"Maxthon"]],[/(kindle)\/([\w\.]+)/i,/(lunascape|maxthon|netfront|jasmine|blazer|sleipnir)[\/ ]?([\w\.]*)/i,/(avant|iemobile|slim(?:browser|boat|jet))[\/ ]?([\d\.]*)/i,/(?:ms|\()(ie) ([\w\.]+)/i,/(atlas|flock|rockmelt|midori|epiphany|silk|skyfire|bolt|iron|vivaldi|iridium|phantomjs|bowser|qupzilla|falkon|rekonq|puffin|whale(?!.+naver)|qqbrowserlite|duckduckgo|klar|helio|(?=comodo_)?dragon|otter|dooble|(?:hi|lg |ovi|qute)browser|palemoon)\/v?([-\w\.]+)/i,/(brave)(?: chrome)?\/([\d\.]+)/i,/(aloha|heytap|ovi|115|surf|qwant)browser\/([\d\.]+)/i,/(qwant)(?:ios|mobile)\/([\d\.]+)/i,/(ecosia|weibo)(?:__| \w+@)([\d\.]+)/i],[v,y],[/quark(?:pc)?\/([-\w\.]+)/i],[y,[v,"Quark"]],[/\bddg\/([\w\.]+)/i],[y,[v,"DuckDuckGo"]],[/(?:\buc? ?browser|(?:juc.+)ucweb)[\/ ]?([\w\.]+)/i],[y,[v,"UCBrowser"]],[/microm.+\bqbcore\/([\w\.]+)/i,/\bqbcore\/([\w\.]+).+microm/i,/micromessenger\/([\w\.]+)/i],[y,[v,"WeChat"]],[/konqueror\/([\w\.]+)/i],[y,[v,"Konqueror"]],[/trident.+rv[: ]([\w\.]{1,9})\b.+like gecko/i],[y,[v,"IE"]],[/ya(?:search)?browser\/([\w\.]+)/i],[y,[v,"Yandex"]],[/slbrowser\/([\w\.]+)/i],[y,[v,"Smart "+wi+O]],[/(av(?:ast|g|ira))\/([\w\.]+)/i],[[v,/(.+)/,"$1 Secure"+O],y],[/norton\/([\w\.]+)/i],[y,[v,"Norton Private"+O]],[/\bfocus\/([\w\.]+)/i],[y,[v,xi+" Focus"]],[/ mms\/([\w\.]+)$/i],[y,[v,w+" Neon"]],[/ opt\/([\w\.]+)$/i],[y,[v,w+" Touch"]],[/coc_coc\w+\/([\w\.]+)/i],[y,[v,"Coc Coc"]],[/dolfin\/([\w\.]+)/i],[y,[v,"Dolphin"]],[/coast\/([\w\.]+)/i],[y,[v,w+" Coast"]],[/miuibrowser\/([\w\.]+)/i],[y,[v,"MIUI"+O]],[/fxios\/([\w\.-]+)/i],[y,[v,d+xi]],[/\bqihoobrowser\/?([\w\.]*)/i],[y,[v,"360"]],[/\b(qq)\/([\w\.]+)/i],[[v,/(.+)/,"$1Browser"],y],[/(oculus|sailfish|huawei|vivo|pico)browser\/([\w\.]+)/i],[[v,/(.+)/,"$1"+O],y],[/samsungbrowser\/([\w\.]+)/i],[y,[v,ui+" Internet"]],[/metasr[\/ ]?([\d\.]+)/i],[y,[v,"Sogou Explorer"]],[/(sogou)mo\w+\/([\d\.]+)/i],[[v,"Sogou Mobile"],y],[/(electron)\/([\w\.]+) safari/i,/(tesla)(?: qtcarbrowser|\/(20\d\d\.[-\w\.]+))/i,/m?(qqbrowser|2345(?=browser|chrome|explorer))\w*[\/ ]?v?([\w\.]+)/i],[v,y],[/(lbbrowser|luakit|rekonq|steam(?= (clie|tenf|gameo)))/i],[v],[/ome\/([\w\.]+).+(iron(?= saf)|360(?=[es]e$))/i],[y,v],[/((?:fban\/fbios|fb_iab\/fb4a)(?!.+fbav)|;fbav\/([\w\.]+);)/i],[[v,yi],y,[k,t]],[/(kakao(?:talk|story))[\/ ]([\w\.]+)/i,/(naver)\(.*?(\d+\.[\w\.]+).*\)/i,/(daum)apps[\/ ]([\w\.]+)/i,/safari (line)\/([\w\.]+)/i,/\b(line)\/([\w\.]+)\/iab/i,/(alipay)client\/([\w\.]+)/i,/(twitter)(?:and| f.+e\/([\w\.]+))/i,/(bing)(?:web|sapphire)\/([\w\.]+)/i,/(instagram|snapchat|klarna)[\/ ]([-\w\.]+)/i],[v,y,[k,t]],[/\bgsa\/([\w\.]+) .*safari\//i],[y,[v,"GSA"],[k,t]],[/(?:musical_ly|trill)(?:.+app_?version\/|_)([\w\.]+)/i],[y,[v,"TikTok"],[k,t]],[/\[(linkedin)app\]/i],[v,[k,t]],[/(zalo(?:app)?)[\/\sa-z]*([\w\.-]+)/i],[[v,/(.+)/,"Zalo"],y,[k,t]],[/(chromium)[\/ ]([-\w\.]+)/i],[v,y],[/ome-(lighthouse)$/i],[v,[k,"fetcher"]],[/headlesschrome(?:\/([\w\.]+)| )/i],[y,[v,"Chrome Headless"]],[/wv\).+chrome\/([\w\.]+).+edgw\//i],[y,[v,ki+" WebView2"]],[/ wv\).+(chrome)\/([\w\.]+)/i],[[v,"Chrome WebView"],y],[/droid.+ version\/([\w\.]+)\b.+(?:mobile safari|safari)/i],[y,[v,"Android"+O]],[/chrome\/([\w\.]+) mobile/i],[y,[v,d+"Chrome"]],[/(chrome|omniweb|arora|[tizenoka]{5} ?browser)\/v?([\w\.]+)/i],[v,y],[/version\/([\w\.\,]+) .*mobile(?:\/\w+ | ?)safari/i],[y,[v,d+"Safari"]],[/iphone .*mobile(?:\/\w+ | ?)safari/i],[[v,d+"Safari"]],[/version\/([\w\.\,]+) .*(safari)/i],[y,v],[/webkit.+?(mobile ?safari|safari)(\/[\w\.]+)/i],[v,[y,"1"]],[/(webkit|khtml)\/([\w\.]+)/i],[v,y],[/(?:mobile|tablet);.*(firefox)\/([\w\.-]+)/i],[[v,d+xi],y],[/(navigator|netscape\d?)\/([-\w\.]+)/i],[[v,"Netscape"],y],[/(wolvic|librewolf)\/([\w\.]+)/i],[v,y],[/mobile vr; rv:([\w\.]+)\).+firefox/i],[y,[v,xi+" Reality"]],[/ekiohf.+(flow)\/([\w\.]+)/i,/(swiftfox)/i,/(icedragon|iceweasel|camino|chimera|fennec|maemo browser|minimo|conkeror)[\/ ]?([\w\.\+]+)/i,/(seamonkey|k-meleon|icecat|iceape|firebird|phoenix|basilisk|waterfox)\/([-\w\.]+)$/i,/(firefox)\/([\w\.]+)/i,/(mozilla)\/([\w\.]+(?= .+rv\:.+gecko\/\d+)|[0-4][\w\.]+(?!.+compatible))/i,/(amaya|dillo|doris|icab|ladybird|lynx|mosaic|netsurf|obigo|polaris|w3m|(?:go|ice|up)[\. ]?browser)[-\/ ]?v?([\w\.]+)/i,/\b(links) \(([\w\.]+)/i],[v,[y,/_/g,"."]],[/(cobalt)\/([\w\.]+)/i],[v,[y,/[^\d\.]+./,b]]],cpu:[[/\b((amd|x|x86[-_]?|wow|win)64)\b/i],[[C,"amd64"]],[/(ia32(?=;))/i,/\b((i[346]|x)86)(pc)?\b/i],[[C,"ia32"]],[/\b(aarch64|arm(v?[89]e?l?|_?64))\b/i],[[C,"arm64"]],[/\b(arm(v[67])?ht?n?[fl]p?)\b/i],[[C,"armhf"]],[/( (ce|mobile); ppc;|\/[\w\.]+arm\b)/i],[[C,"arm"]],[/ sun4\w[;\)]/i],[[C,"sparc"]],[/\b(avr32|ia64(?=;)|68k(?=\))|\barm(?=v([1-7]|[5-7]1)l?|;|eabi)|(irix|mips|sparc)(64)?\b|pa-risc)/i,/((ppc|powerpc)(64)?)( mac|;|\))/i,/(?:osf1|[freopnt]{3,4}bsd) (alpha)/i],[[C,/ower/,b,q]],[/mc680.0/i],[[C,"68k"]],[/winnt.+\[axp/i],[[C,"alpha"]]],device:[[/\b(sch-i[89]0\d|shw-m380s|sm-[ptx]\w{2,4}|gt-[pn]\d{2,4}|sgh-t8[56]9|nexus 10)/i],[N,[x,ui],[k,o]],[/\b((?:s[cgp]h|gt|sm)-(?![lr])\w+|sc[g-]?[\d]+a?|galaxy nexus)/i,/samsung[- ]((?!sm-[lr]|browser)[-\w]+)/i,/sec-(sgh\w+)/i],[N,[x,ui],[k,E]],[/(?:\/|\()(ip(?:hone|od)[\w, ]*)[\/\);]/i],[N,[x,a],[k,E]],[/\b(?:ios|apple\w+)\/.+[\(\/](ipad)/i,/\b(ipad)[\d,]*[;\] ].+(mac |i(pad)?)os/i],[N,[x,a],[k,o]],[/(macintosh);/i],[N,[x,a]],[/\b(sh-?[altvz]?\d\d[a-ekm]?)/i],[N,[x,"Sharp"],[k,E]],[/\b((?:brt|eln|hey2?|gdi|jdn)-a?[lnw]09|(?:ag[rm]3?|jdn2|kob2)-a?[lw]0[09]hn)(?: bui|\)|;)/i],[N,[x,di],[k,o]],[/honor([-\w ]+)[;\)]/i],[N,[x,di],[k,E]],[/\b((?:ag[rs][2356]?k?|bah[234]?|bg[2o]|bt[kv]|cmr|cpn|db[ry]2?|jdn2|got|kob2?k?|mon|pce|scm|sht?|[tw]gr|vrd)-[ad]?[lw][0125][09]b?|605hw|bg2-u03|(?:gem|fdr|m2|ple|t1)-[7a]0[1-4][lu]|t1-a2[13][lw]|mediapad[\w\. ]*(?= bui|\)))\b(?!.+d\/s)/i],[N,[x,ni],[k,o]],[/(?:huawei) ?([-\w ]+)[;\)]/i,/\b(nexus 6p|\w{2,4}e?-[atu]?[ln][\dx][\dc][adnt]?)\b(?!.+d\/s)/i],[N,[x,ni],[k,E]],[/oid[^\)]+; (2[\dbc]{4}(182|283|rp\w{2})[cgl]|m2105k81a?c)(?: bui|\))/i,/\b(?:xiao)?((?:red)?mi[-_ ]?pad[\w- ]*)(?: bui|\))/i],[[N,/_/g," "],[x,gi],[k,o]],[/\b; (\w+) build\/hm\1/i,/\b(hm[-_ ]?note?[_ ]?(?:\d\w)?) bui/i,/oid[^\)]+; (redmi[\-_ ]?(?:note|k)?[\w_ ]+|m?[12]\d[01]\d\w{3,6}|poco[\w ]+|(shark )?\w{3}-[ah]0|qin ?[1-3](s\+|ultra| pro)?)( bui|; wv|\))/i,/\b(mi[-_ ]?(?:a\d|one|one[_ ]plus|note|max|cc)?[_ ]?(?:\d{0,2}\w?)[_ ]?(?:plus|se|lite|pro)?( 5g|lte)?)(?: bui|\))/i,/ ([\w ]+) miui\/v?\d/i],[[N,/_/g," "],[x,gi],[k,E]],[/droid.+; (cph2[3-6]\d[13579]|((gm|hd)19|(ac|be|in|kb)20|(d[en]|eb|le|mt)21|ne22)[0-2]\d|p[g-l]\w[1m]10)\b/i,/(?:one)?(?:plus)? (a\d0\d\d)(?: b|\))/i],[N,[x,hi],[k,E]],[/; (\w+) bui.+ oppo/i,/\b(cph[12]\d{3}|p(?:af|c[al]|d\w|e[ar])[mt]\d0|x9007|a101op)\b/i],[N,[x,pi],[k,E]],[/\b(opd2(\d{3}a?))(?: bui|\))/i],[N,[x,c,{OnePlus:["203","304","403","404","413","415"],"*":pi}],[k,o]],[/(vivo (5r?|6|8l?|go|one|s|x[il]?[2-4]?)[\w\+ ]*)(?: bui|\))/i],[N,[x,"BLU"],[k,E]],[/; vivo (\w+)(?: bui|\))/i,/\b(v[12]\d{3}\w?[at])(?: bui|;)/i],[N,[x,"Vivo"],[k,E]],[/\b(rmx[1-3]\d{3})(?: bui|;|\))/i],[N,[x,"Realme"],[k,E]],[/(ideatab[-\w ]+|602lv|d-42a|a101lv|a2109a|a3500-hv|s[56]000|pb-6505[my]|tb-?x?\d{3,4}(?:f[cu]|xu|[av])|yt\d?-[jx]?\d+[lfmx])( bui|;|\)|\/)/i,/lenovo ?(b[68]0[08]0-?[hf]?|tab(?:[\w- ]+?)|tb[\w-]{6,7})( bui|;|\)|\/)/i],[N,[x,wi],[k,o]],[/lenovo[-_ ]?([-\w ]+?)(?: bui|\)|\/)/i],[N,[x,wi],[k,E]],[/\b(milestone|droid(?:[2-4x]| (?:bionic|x2|pro|razr))?:?( 4g)?)\b[\w ]+build\//i,/\bmot(?:orola)?[- ]([\w\s]+)(\)| bui)/i,/((?:moto(?! 360)[-\w\(\) ]+|xt\d{3,4}[cgkosw\+]?[-\d]*|nexus 6)(?= bui|\)))/i],[N,[x,ci],[k,E]],[/\b(mz60\d|xoom[2 ]{0,2}) build\//i],[N,[x,ci],[k,o]],[/\b(?:lg)?([vl]k\-?\d{3}) bui| 3\.[-\w; ]{10}lg?-([06cv9]{3,4})/i],[N,[x,bi],[k,o]],[/(lm(?:-?f100[nv]?|-[\w\.]+)(?= bui|\))|nexus [45])/i,/\blg[-e;\/ ]+(?!.*(?:browser|netcast|android tv|watch|webos))(\w+)/i,/\blg-?([\d\w]+) bui/i],[N,[x,bi],[k,E]],[/(nokia) (t[12][01])/i],[x,N,[k,o]],[/(?:maemo|nokia).*(n900|lumia \d+|rm-\d+)/i,/nokia[-_ ]?(([-\w\. ]*?))( bui|\)|;|\/)/i],[[N,/_/g," "],[k,E],[x,"Nokia"]],[/(pixel (c|tablet))\b/i],[N,[x,s],[k,o]],[/droid.+;(?: google)? (g(01[13]a|020[aem]|025[jn]|1b60|1f8f|2ybb|4s1m|576d|5nz6|8hhn|8vou|a02099|c15s|d1yq|e2ae|ec77|gh2x|kv4x|p4bc|pj41|r83y|tt9q|ur25|wvk6)|pixel[\d ]*a?( pro)?( xl)?( fold)?( \(5g\))?)( bui|\))/i],[N,[x,s],[k,E]],[/(google) (pixelbook( go)?)/i],[x,N],[/droid.+; (a?\d[0-2]{2}so|[c-g]\d{4}|so[-gl]\w+|xq-\w\w\d\d)(?= bui|\).+chrome\/(?![1-6]{0,1}\d\.))/i],[N,[x,mi],[k,E]],[/sony tablet [ps]/i,/\b(?:sony)?sgp\w+(?: bui|\))/i],[[N,"Xperia Tablet"],[x,mi],[k,o]],[/(alexa)webm/i,/(kf[a-z]{2}wi|aeo(?!bc)\w\w)( bui|\))/i,/(kf[a-z]+)( bui|\)).+silk\//i],[N,[x,ri],[k,o]],[/((?:sd|kf)[0349hijorstuw]+)( bui|\)).+silk\//i],[[N,/(.+)/g,"Fire Phone $1"],[x,ri],[k,E]],[/(playbook);[-\w\),; ]+(rim)/i],[N,x,[k,o]],[/\b((?:bb[a-f]|st[hv])100-\d)/i,/(?:blackberry|\(bb10;) (\w+)/i],[N,[x,si],[k,E]],[/(?:\b|asus_)(transfo[prime ]{4,10} \w+|eeepc|slider \w+|nexus 7|padfone|p00[cj])/i],[N,[x,ai],[k,o]],[/ (z[bes]6[027][012][km][ls]|zenfone \d\w?)\b/i],[N,[x,ai],[k,E]],[/(nexus 9)/i],[N,[x,"HTC"],[k,o]],[/(htc)[-;_ ]{1,2}([\w ]+(?=\)| bui)|\w+)/i,/(zte)[- ]([\w ]+?)(?: bui|\/|\))/i,/(alcatel|geeksphone|nexian|panasonic(?!(?:;|\.))|sony(?!-bra))[-_ ]?([-\w]*)/i],[x,[N,/_/g," "],[k,E]],[/tcl (xess p17aa)/i,/droid [\w\.]+; ((?:8[14]9[16]|9(?:0(?:48|60|8[01])|1(?:3[27]|66)|2(?:6[69]|9[56])|466))[gqswx])(_\w(\w|\w\w))?(\)| bui)/i],[N,[x,"TCL"],[k,o]],[/droid [\w\.]+; (418(?:7d|8v)|5087z|5102l|61(?:02[dh]|25[adfh]|27[ai]|56[dh]|59k|65[ah])|a509dl|t(?:43(?:0w|1[adepqu])|50(?:6d|7[adju])|6(?:09dl|10k|12b|71[efho]|76[hjk])|7(?:66[ahju]|67[hw]|7[045][bh]|71[hk]|73o|76[ho]|79w|81[hks]?|82h|90[bhsy]|99b)|810[hs]))(_\w(\w|\w\w))?(\)| bui)/i],[N,[x,"TCL"],[k,E]],[/(itel) ((\w+))/i],[[x,q],N,[k,c,{tablet:["p10001l","w7001"],"*":"mobile"}]],[/droid.+; ([ab][1-7]-?[0178a]\d\d?)/i],[N,[x,"Acer"],[k,o]],[/droid.+; (m[1-5] note) bui/i,/\bmz-([-\w]{2,})/i],[N,[x,"Meizu"],[k,E]],[/; ((?:power )?armor(?:[\w ]{0,8}))(?: bui|\))/i],[N,[x,"Ulefone"],[k,E]],[/; (energy ?\w+)(?: bui|\))/i,/; energizer ([\w ]+)(?: bui|\))/i],[N,[x,"Energizer"],[k,E]],[/; cat (b35);/i,/; (b15q?|s22 flip|s48c|s62 pro)(?: bui|\))/i],[N,[x,"Cat"],[k,E]],[/((?:new )?andromax[\w- ]+)(?: bui|\))/i],[N,[x,"Smartfren"],[k,E]],[/droid.+; (a(in)?(0(15|59|6[35])|142)p?)/i],[N,[x,"Nothing"],[k,E]],[/; (x67 5g|tikeasy \w+|ac[1789]\d\w+)( b|\))/i,/archos ?(5|gamepad2?|([\w ]*[t1789]|hello) ?\d+[\w ]*)( b|\))/i],[N,[x,"Archos"],[k,o]],[/archos ([\w ]+)( b|\))/i,/; (ac[3-6]\d\w{2,8})( b|\))/i],[N,[x,"Archos"],[k,E]],[/; (n159v)/i],[N,[x,"HMD"],[k,E]],[/(imo) (tab \w+)/i,/(infinix|tecno) (x1101b?|p904|dp(7c|8d|10a)( pro)?|p70[1-3]a?|p904|t1101)/i],[x,N,[k,o]],[/(blackberry|benq|palm(?=\-)|sonyericsson|acer|asus(?! zenw)|dell|jolla|meizu|motorola|polytron|tecno|micromax|advan)[-_ ]?([-\w]*)/i,/; (blu|hmd|imo|infinix|lava|oneplus|tcl|wiko)[_ ]([\w\+ ]+?)(?: bui|\)|; r)/i,/(hp) ([\w ]+\w)/i,/(microsoft); (lumia[\w ]+)/i,/(oppo) ?([\w ]+) bui/i,/(hisense) ([ehv][\w ]+)\)/i,/droid[^;]+; (philips)[_ ]([sv-x][\d]{3,4}[xz]?)/i],[x,N,[k,E]],[/(kobo)\s(ereader|touch)/i,/(hp).+(touchpad(?!.+tablet)|tablet)/i,/(kindle)\/([\w\.]+)/i],[x,N,[k,o]],[/(surface duo)/i],[N,[x,li],[k,o]],[/droid [\d\.]+; (fp\du?)(?: b|\))/i],[N,[x,"Fairphone"],[k,E]],[/((?:tegranote|shield t(?!.+d tv))[\w- ]*?)(?: b|\))/i],[N,[x,"Nvidia"],[k,o]],[/(sprint) (\w+)/i],[x,N,[k,E]],[/(kin\.[onetw]{3})/i],[[N,/\./g," "],[x,li],[k,E]],[/droid.+; ([c6]+|et5[16]|mc[239][23]x?|vc8[03]x?)\)/i],[N,[x,fi],[k,o]],[/droid.+; (ec30|ps20|tc[2-8]\d[kx])\)/i],[N,[x,fi],[k,E]],[/(philips)[\w ]+tv/i,/smart-tv.+(samsung)/i],[x,[k,i]],[/hbbtv.+maple;(\d+)/i],[[N,/^/,"SmartTV"],[x,ui],[k,i]],[/(vizio)(?: |.+model\/)(\w+-\w+)/i,/tcast.+(lg)e?. ([-\w]+)/i],[x,N,[k,i]],[/(nux; netcast.+smarttv|lg (netcast\.tv-201\d|android tv))/i],[[x,bi],[k,i]],[/(apple) ?tv/i],[x,[N,a+" TV"],[k,i]],[/crkey.*devicetype\/chromecast/i],[[N,n+" Third Generation"],[x,s],[k,i]],[/crkey.*devicetype\/([^/]*)/i],[[N,/^/,"Chromecast "],[x,s],[k,i]],[/fuchsia.*crkey/i],[[N,n+" Nest Hub"],[x,s],[k,i]],[/crkey/i],[[N,n],[x,s],[k,i]],[/(portaltv)/i],[N,[x,yi],[k,i]],[/droid.+aft(\w+)( bui|\))/i],[N,[x,ri],[k,i]],[/(shield \w+ tv)/i],[N,[x,"Nvidia"],[k,i]],[/\(dtv[\);].+(aquos)/i,/(aquos-tv[\w ]+)\)/i],[N,[x,"Sharp"],[k,i]],[/(bravia[\w ]+)( bui|\))/i],[N,[x,mi],[k,i]],[/(mi(tv|box)-?\w+) bui/i],[N,[x,gi],[k,i]],[/Hbbtv.*(technisat) (.*);/i],[x,N,[k,i]],[/\b(roku)[\dx]*[\)\/]((?:dvp-)?[\d\.]*)/i,/hbbtv\/\d+\.\d+\.\d+ +\([\w\+ ]*; *([\w\d][^;]*);([^;]*)/i],[[x,/.+\/(\w+)/,"$1",c,{LG:"lge"}],[N,Ii],[k,i]],[/(playstation \w+)/i],[N,[x,mi],[k,j]],[/\b(xbox(?: one)?(?!; xbox))[\); ]/i],[N,[x,li],[k,j]],[/(ouya)/i,/(nintendo) (\w+)/i,/(retroid) (pocket ([^\)]+))/i,/(valve).+(steam deck)/i,/droid.+; ((shield|rgcube|gr0006))( bui|\))/i],[[x,c,{Nvidia:"Shield",Anbernic:"RGCUBE",Logitech:"GR0006"}],N,[k,j]],[/\b(sm-[lr]\d\d[0156][fnuw]?s?|gear live)\b/i],[N,[x,ui],[k,e]],[/((pebble))app/i,/(asus|google|lg|oppo|xiaomi) ((pixel |zen)?watch[\w ]*)( bui|\))/i],[x,N,[k,e]],[/(ow(?:19|20)?we?[1-3]{1,3})/i],[N,[x,pi],[k,e]],[/(watch)(?: ?os[,\/]|\d,\d\/)[\d\.]+/i],[N,[x,a],[k,e]],[/(opwwe\d{3})/i],[N,[x,hi],[k,e]],[/(moto 360)/i],[N,[x,ci],[k,e]],[/(smartwatch 3)/i],[N,[x,mi],[k,e]],[/(g watch r)/i],[N,[x,bi],[k,e]],[/droid.+; (wt63?0{2,3})\)/i],[N,[x,fi],[k,e]],[/droid.+; (glass) \d/i],[N,[x,s],[k,R]],[/(pico) ([\w ]+) os\d/i],[x,N,[k,R]],[/(quest( \d| pro)?s?).+vr/i],[N,[x,yi],[k,R]],[/mobile vr; rv.+firefox/i],[[k,R]],[/(tesla)(?: qtcarbrowser|\/[-\w\.]+)/i],[x,[k,G]],[/(aeobc)\b/i],[N,[x,ri],[k,G]],[/(homepod).+mac os/i],[N,[x,a],[k,G]],[/windows iot/i],[[k,G]],[/droid.+; ([\w- ]+) (4k|android|smart|google)[- ]?tv/i],[N,[k,i]],[/\b((4k|android|smart|opera)[- ]?tv|tv; rv:|large screen[\w ]+safari)\b/i],[[k,i]],[/droid .+?; ([^;]+?)(?: bui|; wv\)|\) applew|; hmsc).+?(mobile|vr|\d) safari/i],[N,[k,c,{mobile:"Mobile",xr:"VR","*":o}]],[/\b((tablet|tab)[;\/]|focus\/\d(?!.+mobile))/i],[[k,o]],[/(phone|mobile(?:[;\/]| [ \w\/\.]*safari)|pda(?=.+windows ce))/i],[[k,E]],[/droid .+?; ([\w\. -]+)( bui|\))/i],[N,[x,"Generic"]]],engine:[[/windows.+ edge\/([\w\.]+)/i],[y,[v,ki+"HTML"]],[/(arkweb)\/([\w\.]+)/i],[v,y],[/webkit\/537\.36.+chrome\/(?!27)([\w\.]+)/i],[y,[v,"Blink"]],[/(presto)\/([\w\.]+)/i,/(webkit|trident|netfront|netsurf|amaya|lynx|w3m|goanna|servo)\/([\w\.]+)/i,/ekioh(flow)\/([\w\.]+)/i,/(khtml|tasman|links|dillo)[\/ ]\(?([\w\.]+)/i,/(icab)[\/ ]([23]\.[\d\.]+)/i,/\b(libweb)/i],[v,y],[/ladybird\//i],[[v,"LibWeb"]],[/rv\:([\w\.]{1,9})\b.+(gecko)/i],[y,v]],os:[[/(windows nt) (6\.[23]); arm/i],[[v,/N/,"R"],[y,c,_i]],[/(windows (?:phone|mobile|iot))(?: os)?[\/ ]?([\d\.]*( se)?)/i,/(windows)[\/ ](1[01]|2000|3\.1|7|8(\.1)?|9[58]|me|server 20\d\d( r2)?|vista|xp)/i],[v,y],[/windows nt ?([\d\.\)]*)(?!.+xbox)/i,/\bwin(?=3| ?9|n)(?:nt| 9x )?([\d\.;]*)/i],[[y,/(;|\))/g,"",c,_i],[v,Ci]],[/(windows ce)\/?([\d\.]*)/i],[v,y],[/[adehimnop]{4,7}\b(?:.*os ([\w]+) like mac|; opera)/i,/(?:ios;fbsv|ios(?=.+ip(?:ad|hone)|.+apple ?tv)|ip(?:ad|hone)(?: |.+i(?:pad)?)os|apple ?tv.+ios)[\/ ]([\w\.]+)/i,/\btvos ?([\w\.]+)/i,/cfnetwork\/.+darwin/i],[[y,/_/g,"."],[v,"iOS"]],[/(mac os x) ?([\w\. ]*)/i,/(macintosh|mac_powerpc\b)(?!.+(haiku|morphos))/i],[[v,"macOS"],[y,/_/g,"."]],[/android ([\d\.]+).*crkey/i],[y,[v,n+" Android"]],[/fuchsia.*crkey\/([\d\.]+)/i],[y,[v,n+" Fuchsia"]],[/crkey\/([\d\.]+).*devicetype\/smartspeaker/i],[y,[v,n+" SmartSpeaker"]],[/linux.*crkey\/([\d\.]+)/i],[y,[v,n+" Linux"]],[/crkey\/([\d\.]+)/i],[y,[v,n]],[/droid ([\w\.]+)\b.+(android[- ]x86)/i],[y,v],[/(ubuntu) ([\w\.]+) like android/i],[[v,/(.+)/,"$1 Touch"],y],[/(harmonyos)[\/ ]?([\d\.]*)/i,/(android|bada|blackberry|kaios|maemo|meego|openharmony|qnx|rim tablet os|sailfish|series40|symbian|tizen)\w*[-\/\.; ]?([\d\.]*)/i],[v,y],[/\(bb(10);/i],[y,[v,si]],[/(?:symbian ?os|symbos|s60(?=;)|series ?60)[-\/ ]?([\w\.]*)/i],[y,[v,"Symbian"]],[/mozilla\/[\d\.]+ \((?:mobile[;\w ]*|tablet|tv|[^\)]*(?:viera|lg(?:l25|-d300)|alcatel ?o.+|y300-f1)); rv:([\w\.]+)\).+gecko\//i],[y,[v,xi+" OS"]],[/\b(?:hp)?wos(?:browser)?\/([\w\.]+)/i,/webos(?:[ \/]?|\.tv-20(?=2[2-9]))(\d[\d\.]*)/i],[y,[v,"webOS"]],[/web0s;.+?(?:chr[o0]me|safari)\/(\d+)/i],[[y,c,{25:"120",24:"108",23:"94",22:"87",6:"79",5:"68",4:"53",3:"38",2:"538",1:"537","*":"TV"}],[v,"webOS"]],[/watch(?: ?os[,\/ ]|\d,\d\/)([\d\.]+)/i],[y,[v,"watchOS"]],[/cros [\w]+(?:\)| ([\w\.]+)\b)/i],[y,[v,"Chrome OS"]],[/kepler ([\w\.]+); (aft|aeo)/i],[y,[v,"Vega OS"]],[/(netrange)mmh/i,/(nettv)\/(\d+\.[\w\.]+)/i,/(nintendo|playstation) (\w+)/i,/(xbox); +xbox ([^\);]+)/i,/(pico) .+os([\w\.]+)/i,/\b(joli|palm)\b ?(?:os)?\/?([\w\.]*)/i,/linux.+(mint)[\/\(\) ]?([\w\.]*)/i,/(mageia|vectorlinux|fuchsia|arcaos|arch(?= ?linux))[;l ]([\d\.]*)/i,/([kxln]?ubuntu|debian|suse|opensuse|gentoo|slackware|fedora|mandriva|centos|pclinuxos|red ?hat|zenwalk|linpus|raspbian|plan 9|minix|risc os|contiki|deepin|manjaro|elementary os|sabayon|linspire|knoppix)(?: gnu[\/ ]linux)?(?: enterprise)?(?:[- ]linux)?(?:-gnu)?[-\/ ]?(?!chrom|package)([-\w\.]*)/i,/((?:open)?solaris)[-\/ ]?([\w\.]*)/i,/\b(aix)[; ]([1-9\.]{0,4})/i,/(hurd|linux|morphos)(?: (?:arm|x86|ppc)\w*| ?)([\w\.]*)/i,/(gnu) ?([\w\.]*)/i,/\b([-frentopcghs]{0,5}bsd|dragonfly)[\/ ]?(?!amd|[ix346]{1,2}86)([\w\.]*)/i,/(haiku) ?(r\d)?/i],[v,y],[/(sunos) ?([\d\.]*)/i],[[v,"Solaris"],y],[/\b(beos|os\/2|amigaos|openvms|hp-ux|serenityos)/i,/(unix) ?([\w\.]*)/i],[v,y]]},Di=(w={init:{},isIgnore:{},isIgnoreRgx:{},toString:{}},U.call(w.init,[[h,[v,y,P,k]],[p,[C]],[u,[k,N,x]],[m,[v,y]],[g,[v,y]]]),U.call(w.isIgnore,[[h,[y,P]],[m,[y]],[g,[y]]]),U.call(w.isIgnoreRgx,[[h,/ ?browser$/i],[g,/ ?os$/i]]),U.call(w.toString,[[h,[v,y]],[p,[C]],[u,[x,N]],[m,[v,y]],[g,[v,y]]]),w);function Fi(i,e){if(i=i||{},U.call(this,ti),e)U.call(this,[[L,Ti(i[r])],[$,Ti(i[X])],[E,/\?1/.test(i[Q])],[N,Oi(i[ii])],[T,Oi(i[ei])],[W,Oi(i[oi])],[C,Oi(i[Y])],[S,Ti(i[K])],[J,Oi(i[Z])]]);else for(var o in i)this.hasOwnProperty(o)&&typeof i[o]!==l.UNDEFINED&&(this[o]=i[o])}function D(i,e,o,t){return U.call(this,[["itemType",i],["ua",e],["uaCH",t],["rgxMap",o],["data",M(this,i)]]),this}function F(i,e,o){if(typeof i===l.OBJECT?(e=Ei(i,!0)?(typeof e===l.OBJECT&&(o=e),i):void(o=i),i=void 0):typeof i!==l.STRING||Ei(e,!0)||(o=e,e=void 0),o)if(typeof o.append===l.FUNCTION){var t={};o.forEach(function(i,e){t[String(e).toLowerCase()]=i}),o=t}else{var r,a={};for(r in o)o.hasOwnProperty(r)&&(a[String(r).toLowerCase()]=o[r]);o=a}var s,n,w,d;return this instanceof F?(s=typeof i===l.STRING?i:o&&o[V]?o[V]:I&&I.userAgent?I.userAgent:b,n=new Fi(o,!0),w=e?((i,e)=>{var o,t={},r=e;if(!Ei(e))for(var a in r={},e)for(var s in e[a])r[s]=e[a][s].concat(r[s]||[]);for(o in i)t[o]=r[o]&&r[o].length%2==0?r[o].concat(i[o]):i[o];return t})(zi,e):zi,U.call(this,[["getBrowser",(d=function(i){return i==f?function(){return new D(i,s,w,n).set("ua",s).set(h,this.getBrowser()).set(p,this.getCPU()).set(u,this.getDevice()).set(m,this.getEngine()).set(g,this.getOS()).get()}:function(){return new D(i,s,w[i],n).parseUA().get()}})(h)],["getCPU",d(p)],["getDevice",d(u)],["getEngine",d(m)],["getOS",d(g)],["getResult",d(f)],["getUA",function(){return s}],["setUA",function(i){return Si(i)&&(s=Ii(i,500)),this}]]).setUA(s),this):new F(i,e,o).getResult()}D.prototype.get=function(i){return i?this.data.hasOwnProperty(i)?this.data[i]:void 0:this.data},D.prototype.set=function(i,e){return this.data[i]=e,this},D.prototype.setCH=function(i){return this.uaCH=i,this},D.prototype.detectFeature=function(){if(I&&I.userAgent==this.ua)switch(this.itemType){case h:I.brave&&typeof I.brave.isBrave==l.FUNCTION&&this.set(v,"Brave");break;case u:!this.get(k)&&_&&_[E]&&this.set(k,E),"Macintosh"==this.get(N)&&I&&typeof I.standalone!==l.UNDEFINED&&I.maxTouchPoints&&2<I.maxTouchPoints&&this.set(N,"iPad").set(k,o);break;case g:!this.get(v)&&_&&_[T]&&this.set(v,_[T]);break;case f:var e=this.data,i=function(i){return e[i].getItem().detectFeature().get()};this.set(h,i(h)).set(p,i(p)).set(u,i(u)).set(m,i(m)).set(g,i(g))}return this},D.prototype.parseUA=function(){switch(this.itemType!=f&&A.call(this.data,this.ua,this.rgxMap),this.itemType){case h:this.set(P,H(this.get(y)));break;case g:var i;"iOS"==this.get(v)&&"18.6"==this.get(y)&&(i=/\) Version\/([\d\.]+)/.exec(this.ua))&&26<=parseInt(i[1].substring(0,2),10)&&this.set(y,i[1])}return this},D.prototype.parseCH=function(){var i,e=this.uaCH,o=this.rgxMap;switch(this.itemType){case h:case m:var t,r=e[$]||e[L];if(r)for(var a=0;a<r.length;a++){var s=r[a].brand||r[a],n=r[a].version;this.itemType==h&&!/not.a.brand/i.test(s)&&(!t||/Chrom/.test(t)&&s!=vi||t==ki&&/WebView2/.test(s))&&(s=c(s,Ui),(t=this.get(v))&&!/Chrom/.test(t)&&/Chrom/.test(s)||this.set(v,s).set(y,n).set(P,H(n)),t=s),this.itemType==m&&s==vi&&this.set(y,n)}break;case p:var w=e[C];w&&("64"==e[J]&&(w+="64"),A.call(this.data,w+";",o));break;case u:if(e[E]&&this.set(k,E),e[N]&&(this.set(N,e[N]),this.get(k)&&this.get(x)||(A.call(w={},"droid 9; "+e[N]+")",o),!this.get(k)&&w.type&&this.set(k,w.type),!this.get(x)&&w.vendor&&this.set(x,w.vendor))),e[S]){if("string"!=typeof e[S])for(var d=0;!i&&d<e[S].length;)i=c(e[S][d++],qi);else i=c(e[S],qi);this.set(k,i)}break;case g:var b,w=e[T];w&&(b=e[W],w==Ci&&(b=13<=parseInt(H(b),10)?"11":"10"),this.set(v,w).set(y,b)),this.get(v)==Ci&&"Xbox"==e[N]&&this.set(v,"Xbox").set(y,void 0);break;case f:var l=this.data,w=function(i){return l[i].getItem().setCH(e).parseCH().get()};this.set(h,w(h)).set(p,w(p)).set(u,w(u)).set(m,w(m)).set(g,w(g))}return this},F.VERSION="2.0.9",F.BROWSER=B([v,y,P,k]),F.CPU=B([C]),F.DEVICE=B([N,x,k,j,E,i,o,e,G]),F.ENGINE=F.OS=B([v,y]);export{F as UAParser};+function D(i){for(var e={},t=0;t<i.length;t++)e[i[t].toUpperCase()]=i[t];return e}function H(i){return q(i)?Ii(/[^\d\.]/g,i).split(".")[0]:void 0}function M(i,e){if(i&&e)for(var t,o,r,a,s,n=0;n<e.length&&!a;){for(var w=e[n],b=e[n+1],d=t=0;d<w.length&&!a&&w[d];)if(a=w[d++].exec(i))for(o=0;o<b.length;o++)s=a[++t],typeof(r=b[o])===l.OBJECT&&0<r.length?2===r.length?typeof r[1]==l.FUNCTION?this[r[0]]=r[1].call(this,s):this[r[0]]=r[1]:3<=r.length&&(typeof r[1]!==l.FUNCTION||r[1].exec&&r[1].test?3==r.length?this[r[0]]=s?s.replace(r[1],r[2]):void 0:4==r.length?this[r[0]]=s?r[3].call(this,s.replace(r[1],r[2])):void 0:4<r.length&&(this[r[0]]=s?r[3].apply(this,[s.replace(r[1],r[2])].concat(r.slice(4))):void 0):3<r.length?this[r[0]]=s?r[1].apply(this,r.slice(2)):void 0:this[r[0]]=s?r[1].call(this,s,r[2]):void 0):this[r]=s||void 0;n+=2}}function c(i,e){for(var t in e)if(typeof e[t]===l.OBJECT&&0<e[t].length){for(var o=0;o<e[t].length;o++)if(Ni(e[t][o],i))return"?"===t?void 0:t}else if(Ni(e[t],i))return"?"===t?void 0:t;return e.hasOwnProperty("*")?e["*"]:i}function A(e,i){var t=Bi.init[i],o=Bi.isIgnore[i]||0,r=Bi.isIgnoreRgx[i]||0,a=Bi.toString[i]||0;function s(){z.call(this,t)}return s.prototype.getItem=function(){return e},s.prototype.withClientHints=function(){return _?_.getHighEntropyValues(ri).then(function(i){return e.setCH(new Di(i,!1)).parseCH().get()}):e.parseCH().get()},s.prototype.withFeatureCheck=function(){return e.detectFeature().get()},i!=g&&(s.prototype.is=function(i){var e,t=!1;for(e in this)if(this.hasOwnProperty(e)&&!Ni(o,e)&&U(r?Ii(r,this[e]):this[e])==U(r?Ii(r,i):i)){if(t=!0,i!=l.UNDEFINED)break}else if(i==l.UNDEFINED&&t){t=!t;break}return t},s.prototype.toString=function(){var i,e=d;for(i in a)typeof this[a[i]]!==l.UNDEFINED&&(e+=(e?" ":d)+this[a[i]]);return e||l.UNDEFINED}),s.prototype.then=function(i){function e(){for(var i in t)t.hasOwnProperty(i)&&(this[i]=t[i])}var t=this,o=(e.prototype={is:s.prototype.is,toString:s.prototype.toString,withClientHints:s.prototype.withClientHints,withFeatureCheck:s.prototype.withFeatureCheck},new e);return i(o),o},new s}var V=500,P="user-agent",d="",l={FUNCTION:"function",OBJECT:"object",STRING:"string",UNDEFINED:"undefined"},h="browser",p="cpu",u="device",m="engine",f="os",g="result",v="name",k="type",x="vendor",y="version",C="architecture",j="major",E="model",R="console",N="mobile",t="tablet",i="smarttv",e="wearable",G="xr",L="embedded",o="inapp",$="brands",S="formFactors",W="fullVersionList",T="platform",J="platformVersion",X="bitness",r="sec-ch-ua",Y=r+"-full-version-list",Z=r+"-arch",K=r+"-"+X,Q=r+"-form-factors",ii=r+"-"+N,ei=r+"-"+E,ti=r+"-"+T,oi=ti+"-version",ri=[$,W,N,E,T,J,C,S,X],ai="Amazon",a="Apple",si="ASUS",ni="BlackBerry",s="Google",wi="Huawei",bi="Lenovo",di="Honor",li="LG",ci="Microsoft",hi="Motorola",pi="OnePlus",ui="OPPO",mi="Samsung",fi="Sony",gi="Xiaomi",vi="Zebra",ki="Chromium",n="Chromecast",xi="Edge",yi="Firefox",w="Opera",Ci="Facebook",b="Mobile ",O=" Browser",Ei="Windows",I=typeof window!==l.UNDEFINED&&window.navigator?window.navigator:void 0,_=I&&I.userAgentData?I.userAgentData:void 0,Ni=function(i,e){if(typeof i===l.OBJECT&&0<i.length){for(var t in i)if(U(e)==U(i[t]))return!0;return!1}return!!q(i)&&U(e)==U(i)},Si=function(i,e){for(var t in i)return/^(browser|cpu|device|engine|os)$/.test(t)||!!e&&Si(i[t])},q=function(i){return typeof i===l.STRING},Ti=function(i){if(i){for(var e,t=[],o=Oi(i).split(","),r=0;r<o.length;r++)-1<o[r].indexOf(";")?(e=_i(o[r]).split(";v="),t[r]={brand:e[0],version:e[1]}):t[r]=_i(o[r]);return t}},U=function(i){return q(i)?i.toLowerCase():i},Oi=function(i){return q(i)?_i(Ii(/\\?\"/g,i),V):void 0},z=function(i){for(var e in i)i.hasOwnProperty(e)&&(typeof(e=i[e])==l.OBJECT&&2==e.length?this[e[0]]=e[1]:this[e]=void 0);return this},Ii=function(i,e){return q(e)?e.replace(i,d):e},_i=function(i,e){return i=Ii(/^\s\s*/,String(i)),typeof e===l.UNDEFINED?i:i.substring(0,e)},qi={ME:"4.90","NT 3.51":"3.51","NT 4.0":"4.0",2e3:["5.0","5.01"],XP:["5.1","5.2"],Vista:"6.0",7:"6.1",8:"6.2",8.1:"6.3",10:["6.4","10.0"],NT:""},Ui={embedded:"Automotive",mobile:"Mobile",tablet:["Tablet","EInk"],smarttv:"TV",wearable:"Watch",xr:["VR","XR"],"?":["Desktop","Unknown"],"*":void 0},zi={Chrome:"Google Chrome",Edge:"Microsoft Edge","Edge WebView2":"Microsoft Edge WebView2","Chrome WebView":"Android WebView","Chrome Headless":"HeadlessChrome","Huawei Browser":"HuaweiBrowser","MIUI Browser":"Miui Browser","Opera Mobi":"OperaMobile",Yandex:"YaBrowser"},Fi={browser:[[/\b(?:crmo|crios)\/([\w\.]+)/i],[y,[v,b+"Chrome"]],[/webview.+edge\/([\w\.]+)/i],[y,[v,xi+" WebView"],[k,o]],[/edg(?:e|ios|a)?\/([\w\.]+)/i],[y,[v,"Edge"]],[/(opera mini)\/([-\w\.]+)/i,/(opera [mobiletab]{3,6})\b.+version\/([-\w\.]+)/i,/(opera)(?:.+version\/|[\/ ]+)([\w\.]+)/i],[v,y],[/opios[\/ ]+([\w\.]+)/i],[y,[v,w+" Mini"]],[/\bop(?:rg)?x\/([\w\.]+)/i],[y,[v,w+" GX"]],[/\bopr\/([\w\.]+)/i],[y,[v,w]],[/\bb[ai]*d(?:uhd|[ub]*[aekoprswx]{5,6})[\/ ]?([\w\.]+)/i],[y,[v,"Baidu"]],[/\b(?:mxbrowser|mxios|myie2)\/?([-\w\.]*)\b/i],[y,[v,"Maxthon"]],[/(kindle)\/([\w\.]+)/i,/(lunascape|maxthon|netfront|jasmine|blazer|sleipnir)[\/ ]?([\w\.]*)/i,/(avant|iemobile|slim(?:browser|boat|jet))[\/ ]?([\d\.]*)/i,/(?:ms|\()(ie) ([\w\.]+)/i,/(atlas|flock|rockmelt|midori|epiphany|silk|skyfire|bolt|iron|vivaldi|iridium|phantomjs|bowser|qupzilla|falkon|rekonq|puffin|whale(?!.+naver)|qqbrowserlite|duckduckgo|klar|helio|(?=comodo_)?dragon|otter|dooble|(?:hi|lg |ovi|qute)browser|palemoon)\/v?([-\w\.]+)/i,/(brave)(?: chrome)?\/([\d\.]+)/i,/(aloha|heytap|ovi|115|surf|qwant)browser\/([\d\.]+)/i,/(qwant)(?:ios|mobile)\/([\d\.]+)/i,/(ecosia|weibo)(?:__| \w+@)([\d\.]+)/i],[v,y],[/quark(?:pc)?\/([-\w\.]+)/i],[y,[v,"Quark"]],[/\bddg\/([\w\.]+)/i],[y,[v,"DuckDuckGo"]],[/(?:\buc? ?browser|(?:juc.+)ucweb| ucpc)[\/ ]?([\w\.]+)/i],[y,[v,"UCBrowser"]],[/microm.+\bqbcore\/([\w\.]+)/i,/\bqbcore\/([\w\.]+).+microm/i,/micromessenger\/([\w\.]+)/i],[y,[v,"WeChat"]],[/konqueror\/([\w\.]+)/i],[y,[v,"Konqueror"]],[/trident.+rv[: ]([\w\.]{1,9})\b.+like gecko/i],[y,[v,"IE"]],[/ya(?:search)?browser\/([\w\.]+)/i],[y,[v,"Yandex"]],[/slbrowser\/([\w\.]+)/i],[y,[v,"Smart "+bi+O]],[/(av(?:ast|g|ira))\/([\w\.]+)/i],[[v,/(.+)/,"$1 Secure"+O],y],[/norton\/([\w\.]+)/i],[y,[v,"Norton Private"+O]],[/\bfocus\/([\w\.]+)/i],[y,[v,yi+" Focus"]],[/ mms\/([\w\.]+)$/i],[y,[v,w+" Neon"]],[/ opt\/([\w\.]+)$/i],[y,[v,w+" Touch"]],[/coc_coc\w+\/([\w\.]+)/i],[y,[v,"Coc Coc"]],[/dolfin\/([\w\.]+)/i],[y,[v,"Dolphin"]],[/coast\/([\w\.]+)/i],[y,[v,w+" Coast"]],[/miuibrowser\/([\w\.]+)/i],[y,[v,"MIUI"+O]],[/fxios\/([\w\.-]+)/i],[y,[v,b+yi]],[/\bqihoobrowser\/?([\w\.]*)/i],[y,[v,"360"]],[/\b(qq)\/([\w\.]+)/i],[[v,/(.+)/,"$1Browser"],y],[/(oculus|sailfish|huawei|vivo|pico)browser\/([\w\.]+)/i],[[v,/(.+)/,"$1"+O],y],[/ HBPC\/([\w\.]+)/],[y,[v,wi+O]],[/samsungbrowser\/([\w\.]+)/i],[y,[v,mi+" Internet"]],[/metasr[\/ ]?([\d\.]+)/i],[y,[v,"Sogou Explorer"]],[/(sogou)mo\w+\/([\d\.]+)/i],[[v,"Sogou Mobile"],y],[/(electron)\/([\w\.]+) safari/i,/(tesla)(?: qtcarbrowser|\/(20\d\d\.[-\w\.]+))/i,/m?(qqbrowser|2345(?=browser|chrome|explorer))\w*[\/ ]?v?([\w\.]+)/i],[v,y],[/(lbbrowser|luakit|rekonq|steam(?= (clie|tenf|gameo)))/i],[v],[/ome\/([\w\.]+).+(iron(?= saf)|360(?=[es]e$))/i],[y,v],[/((?:fban\/fbios|fb_iab\/fb4a)(?!.+fbav)|;fbav\/([\w\.]+);)/i],[[v,Ci],y,[k,o]],[/(kakao(?:talk|story))[\/ ]([\w\.]+)/i,/(naver)\(.*?(\d+\.[\w\.]+).*\)/i,/(daum)apps[\/ ]([\w\.]+)/i,/safari (line)\/([\w\.]+)/i,/\b(line)\/([\w\.]+)\/iab/i,/(alipay)client\/([\w\.]+)/i,/(twitter)(?:and| f.+e\/([\w\.]+))/i,/(bing)(?:web|sapphire)\/([\w\.]+)/i,/(instagram|snapchat|klarna)[\/ ]([-\w\.]+)/i],[v,y,[k,o]],[/\bgsa\/([\w\.]+) .*safari\//i],[y,[v,"GSA"],[k,o]],[/(?:musical_ly|trill)(?:.+app_?version\/|_)([\w\.]+)/i],[y,[v,"TikTok"],[k,o]],[/\[(linkedin)app\]/i],[v,[k,o]],[/(zalo(?:app)?)[\/\sa-z]*([\w\.-]+)/i],[[v,/(.+)/,"Zalo"],y,[k,o]],[/(chromium)[\/ ]([-\w\.]+)/i],[v,y],[/ome-(lighthouse)$/i],[v,[k,"fetcher"]],[/headlesschrome(?:\/([\w\.]+)| )/i],[y,[v,"Chrome Headless"]],[/wv\).+chrome\/([\w\.]+).+edgw\//i],[y,[v,xi+" WebView2"],[k,o]],[/; wv\).+(chrome)\/([\w\.]+)/i],[[v,"Chrome WebView"],y,[k,o]],[/droid.+ version\/([\w\.]+)\b.+(?:mobile safari|safari)/i],[y,[v,"Android"+O]],[/chrome\/([\w\.]+) mobile/i],[y,[v,b+"Chrome"]],[/(chrome|omniweb|arora|[tizenoka]{5} ?browser)\/v?([\w\.]+)/i],[v,y],[/version\/([\w\.\,]+) .*mobile(?:\/\w+ | ?)safari/i],[y,[v,b+"Safari"]],[/iphone .*mobile(?:\/\w+ | ?)safari/i],[[v,b+"Safari"]],[/version\/([\w\.\,]+) .*(safari)/i],[y,v],[/webkit.+?(mobile ?safari|safari)(\/[\w\.]+)/i],[v,[y,"1"]],[/(webkit|khtml)\/([\w\.]+)/i],[v,y],[/(?:mobile|tablet);.*(firefox)\/([\w\.-]+)/i],[[v,b+yi],y],[/(navigator|netscape\d?)\/([-\w\.]+)/i],[[v,"Netscape"],y],[/(wolvic|librewolf)\/([\w\.]+)/i],[v,y],[/mobile vr; rv:([\w\.]+)\).+firefox/i],[y,[v,yi+" Reality"]],[/ekiohf.+(flow)\/([\w\.]+)/i,/(swiftfox)/i,/(icedragon|iceweasel|camino|chimera|fennec|maemo browser|minimo|conkeror)[\/ ]?([\w\.\+]+)/i,/(seamonkey|k-meleon|icecat|iceape|firebird|phoenix|basilisk|waterfox)\/([-\w\.]+)$/i,/(firefox)\/([\w\.]+)/i,/(mozilla)\/([\w\.]+(?= .+rv\:.+gecko\/\d+)|[0-4][\w\.]+(?!.+compatible))/i,/(amaya|dillo|doris|icab|ladybird|lynx|mosaic|netsurf|obigo|polaris|w3m|(?:go|ice|up)[\. ]?browser)[-\/ ]?v?([\w\.]+)/i,/\b(links) \(([\w\.]+)/i],[v,[y,/_/g,"."]],[/(cobalt)\/([\w\.]+)/i],[v,[y,/[^\d\.]+./,d]]],cpu:[[/\b((amd|x|x86[-_]?|wow|win)64)\b/i],[[C,"amd64"]],[/(ia32(?=;))/i,/\b((i[346]|x)86)(pc)?\b/i],[[C,"ia32"]],[/\b(aarch64|arm(v?[89]e?l?|_?64))\b/i],[[C,"arm64"]],[/\b(arm(v[67])?ht?n?[fl]p?)\b/i],[[C,"armhf"]],[/( (ce|mobile); ppc;|\/[\w\.]+arm\b)/i],[[C,"arm"]],[/ sun4\w[;\)]/i],[[C,"sparc"]],[/\b(avr32|ia64(?=;)|68k(?=\))|\barm(?=v([1-7]|[5-7]1)l?|;|eabi)|(irix|mips|sparc)(64)?\b|pa-risc)/i,/((ppc|powerpc)(64)?)( mac|;|\))/i,/(?:osf1|[freopnt]{3,4}bsd) (alpha)/i],[[C,/ower/,d,U]],[/mc680.0/i],[[C,"68k"]],[/winnt.+\[axp/i],[[C,"alpha"]]],device:[[/\b(sch-i[89]0\d|shw-m380s|sm-[ptx]\w{2,4}|gt-[pn]\d{2,4}|sgh-t8[56]9|nexus 10)/i],[E,[x,mi],[k,t]],[/\b((?:s[cgp]h|gt|sm)-(?![lr])\w+|sc[g-]?[\d]+a?|galaxy nexus)/i,/samsung[- ]((?!sm-[lr]|browser)[-\w]+)/i,/sec-(sgh\w+)/i],[E,[x,mi],[k,N]],[/(?:\/|\()(ip(?:hone|od)[\w, ]*)[\/\);]/i],[E,[x,a],[k,N]],[/\b(?:ios|apple\w+)\/.+[\(\/](ipad)/i,/\b(ipad)[\d,]*[;\] ].+(mac |i(pad)?)os/i],[E,[x,a],[k,t]],[/(macintosh);/i],[E,[x,a]],[/\b(sh-?[altvz]?\d\d[a-ekm]?)/i],[E,[x,"Sharp"],[k,N]],[/\b((?:brt|eln|hey2?|gdi|jdn)-a?[lnw]09|(?:ag[rm]3?|jdn2|kob2)-a?[lw]0[09]hn)(?: bui|\)|;)/i],[E,[x,di],[k,t]],[/honor([-\w ]+)[;\)]/i],[E,[x,di],[k,N]],[/\b((?:ag[rs][2356]?k?|bah[234]?|bg[2o]|bt[kv]|cmr|cpn|db[ry]2?|jdn2|got|kob2?k?|mon|pce|scm|sht?|[tw]gr|vrd)-[ad]?[lw][0125][09]b?|605hw|bg2-u03|(?:gem|fdr|m2|ple|t1)-[7a]0[1-4][lu]|t1-a2[13][lw]|mediapad[\w\. ]*(?= bui|\)))\b(?!.+d\/s)/i],[E,[x,wi],[k,t]],[/(?:huawei) ?([-\w ]+)[;\)]/i,/\b(nexus 6p|\w{2,4}e?-[atu]?[ln][\dx][\dc][adnt]?)\b(?!.+d\/s)/i],[E,[x,wi],[k,N]],[/oid[^\)]+; (2[\dbc]{4}(182|283|rp\w{2})[cgl]|m2105k81a?c)(?: bui|\))/i,/\b(?:xiao)?((?:red)?mi[-_ ]?pad[\w- ]*)(?: bui|\))/i],[[E,/_/g," "],[x,gi],[k,t]],[/\b; (\w+) build\/hm\1/i,/\b(hm[-_ ]?note?[_ ]?(?:\d\w)?) bui/i,/oid[^\)]+; (redmi[\-_ ]?(?:note|k)?[\w_ ]+|m?[12]\d[01]\d\w{3,6}|poco[\w ]+|(shark )?\w{3}-[ah]0|qin ?[1-3](s\+|ultra| pro)?)( bui|; wv|\))/i,/\b(mi[-_ ]?(?:a\d|one|one[_ ]plus|note|max|cc)?[_ ]?(?:\d{0,2}\w?)[_ ]?(?:plus|se|lite|pro)?( 5g|lte)?)(?: bui|\))/i,/; ([\w ]+) miui\/v?\d/i],[[E,/_/g," "],[x,gi],[k,N]],[/droid.+; (cph2[3-6]\d[13579]|((gm|hd)19|(ac|be|in|kb)20|(d[en]|eb|le|mt)21|ne22)[0-2]\d|p[g-l]\w[1m]10)\b/i,/(?:one)?(?:plus)? (a\d0\d\d)(?: b|\))/i],[E,[x,pi],[k,N]],[/; (\w+) bui.+ oppo/i,/\b(cph[12]\d{3}|p(?:af|c[al]|d\w|e[ar])[mt]\d0|x9007|a101op)\b/i],[E,[x,ui],[k,N]],[/\b(opd2(\d{3}a?))(?: bui|\))/i],[E,[x,c,{OnePlus:["203","304","403","404","413","415"],"*":ui}],[k,t]],[/(vivo (5r?|6|8l?|go|one|s|x[il]?[2-4]?)[\w\+ ]*)(?: bui|\))/i],[E,[x,"BLU"],[k,N]],[/; vivo (\w+)(?: bui|\))/i,/\b(v[12]\d{3}\w?[at])(?: bui|;)/i],[E,[x,"Vivo"],[k,N]],[/\b(rmx[1-3]\d{3})(?: bui|;|\))/i],[E,[x,"Realme"],[k,N]],[/(ideatab[-\w ]+|602lv|d-42a|a101lv|a2109a|a3500-hv|s[56]000|pb-6505[my]|tb-?x?\d{3,4}(?:f[cu]|xu|[av])|yt\d?-[jx]?\d+[lfmx])( bui|;|\)|\/)/i,/lenovo ?(b[68]0[08]0-?[hf]?|tab(?:[\w- ]+?)|tb[\w-]{6,7})( bui|;|\)|\/)/i],[E,[x,bi],[k,t]],[/lenovo[-_ ]?([-\w ]+?)(?: bui|\)|\/)/i],[E,[x,bi],[k,N]],[/\b(milestone|droid(?:[2-4x]| (?:bionic|x2|pro|razr))?:?( 4g)?)\b[\w ]+build\//i,/\bmot(?:orola)?[- ]([\w\s]+)(\)| bui)/i,/((?:moto(?! 360)[-\w\(\) ]+|xt\d{3,4}[cgkosw\+]?[-\d]*|nexus 6)(?= bui|\)))/i],[E,[x,hi],[k,N]],[/\b(mz60\d|xoom[2 ]{0,2}) build\//i],[E,[x,hi],[k,t]],[/\b(?:lg)?([vl]k\-?\d{3}) bui| 3\.[-\w; ]{10}lg?-([06cv9]{3,4})/i],[E,[x,li],[k,t]],[/(lm(?:-?f100[nv]?|-[\w\.]+)(?= bui|\))|nexus [45])/i,/\blg[-e;\/ ]+(?!.*(?:browser|netcast|android tv|watch|webos))(\w+)/i,/\blg-?([\d\w]+) bui/i],[E,[x,li],[k,N]],[/(nokia) (t[12][01])/i],[x,E,[k,t]],[/(?:maemo|nokia).*(n900|lumia \d+|rm-\d+)/i,/nokia[-_ ]?(([-\w\. ]*?))( bui|\)|;|\/)/i],[[E,/_/g," "],[k,N],[x,"Nokia"]],[/(pixel (c|tablet))\b/i],[E,[x,s],[k,t]],[/droid.+;(?: google)? (g(01[13]a|020[aem]|025[jn]|1b60|1f8f|2ybb|4s1m|576d|5nz6|8hhn|8vou|a02099|c15s|d1yq|e2ae|ec77|gh2x|kv4x|p4bc|pj41|r83y|tt9q|ur25|wvk6)|pixel[\d ]*a?( pro)?( xl)?( fold)?( \(5g\))?)( bui|\))/i],[E,[x,s],[k,N]],[/(google) (pixelbook( go)?)/i],[x,E],[/droid.+; (a?\d[0-2]{2}so|[c-g]\d{4}|so[-gl]\w+|xq-\w\w\d\d)(?= bui|\).+chrome\/(?![1-6]{0,1}\d\.))/i],[E,[x,fi],[k,N]],[/sony tablet [ps]/i,/\b(?:sony)?sgp\w+(?: bui|\))/i],[[E,"Xperia Tablet"],[x,fi],[k,t]],[/(alexa)webm/i,/(kf[a-z]{2}wi|aeo(?!bc)\w\w)( bui|\))/i,/(kf[a-z]+)( bui|\)).+silk\//i],[E,[x,ai],[k,t]],[/((?:sd|kf)[0349hijorstuw]+)( bui|\)).+silk\//i],[[E,/(.+)/g,"Fire Phone $1"],[x,ai],[k,N]],[/(playbook);[-\w\),; ]+(rim)/i],[E,x,[k,t]],[/\b((?:bb[a-f]|st[hv])100-\d)/i,/(?:blackberry|\(bb10;) (\w+)/i],[E,[x,ni],[k,N]],[/(?:\b|asus_)(transfo[prime ]{4,10} \w+|eeepc|slider \w+|nexus 7|padfone|p00[cj])/i],[E,[x,si],[k,t]],[/ (z[bes]6[027][012][km][ls]|zenfone \d\w?)\b/i],[E,[x,si],[k,N]],[/(nexus 9)/i],[E,[x,"HTC"],[k,t]],[/(htc)[-;_ ]{1,2}([\w ]+(?=\)| bui)|\w+)/i,/(zte)[- ]([\w ]+?)(?: bui|\/|\))/i,/(alcatel|geeksphone|nexian|panasonic(?!(?:;|\.))|sony(?!-bra))[-_ ]?([-\w]*)/i],[x,[E,/_/g," "],[k,N]],[/tcl (xess p17aa)/i,/droid [\w\.]+; ((?:8[14]9[16]|9(?:0(?:48|60|8[01])|1(?:3[27]|66)|2(?:6[69]|9[56])|466))[gqswx])(_\w(\w|\w\w))?(\)| bui)/i],[E,[x,"TCL"],[k,t]],[/droid [\w\.]+; (418(?:7d|8v)|5087z|5102l|61(?:02[dh]|25[adfh]|27[ai]|56[dh]|59k|65[ah])|a509dl|t(?:43(?:0w|1[adepqu])|50(?:6d|7[adju])|6(?:09dl|10k|12b|71[efho]|76[hjk])|7(?:66[ahju]|67[hw]|7[045][bh]|71[hk]|73o|76[ho]|79w|81[hks]?|82h|90[bhsy]|99b)|810[hs]))(_\w(\w|\w\w))?(\)| bui)/i],[E,[x,"TCL"],[k,N]],[/(itel) ((\w+))/i],[[x,U],E,[k,c,{tablet:["p10001l","w7001"],"*":"mobile"}]],[/droid.+; ([ab][1-7]-?[0178a]\d\d?)/i],[E,[x,"Acer"],[k,t]],[/droid.+; (m[1-5] note) bui/i,/\bmz-([-\w]{2,})/i],[E,[x,"Meizu"],[k,N]],[/; ((?:power )?armor(?:[\w ]{0,8}))(?: bui|\))/i],[E,[x,"Ulefone"],[k,N]],[/; (energy ?\w+)(?: bui|\))/i,/; energizer ([\w ]+)(?: bui|\))/i],[E,[x,"Energizer"],[k,N]],[/; cat (b35);/i,/; (b15q?|s22 flip|s48c|s62 pro)(?: bui|\))/i],[E,[x,"Cat"],[k,N]],[/((?:new )?andromax[\w- ]+)(?: bui|\))/i],[E,[x,"Smartfren"],[k,N]],[/droid.+; (a(in)?(0(15|59|6[35])|142)p?)/i],[E,[x,"Nothing"],[k,N]],[/; (x67 5g|tikeasy \w+|ac[1789]\d\w+)( b|\))/i,/archos ?(5|gamepad2?|([\w ]*[t1789]|hello) ?\d+[\w ]*)( b|\))/i],[E,[x,"Archos"],[k,t]],[/archos ([\w ]+)( b|\))/i,/; (ac[3-6]\d\w{2,8})( b|\))/i],[E,[x,"Archos"],[k,N]],[/blackview ([-\w ]+)( b|\))/i,/; (bv\d{4}[-\w ]*)( b|\))/i],[E,[x,"Blackview"],[k,N]],[/; (n159v)/i],[E,[x,"HMD"],[k,N]],[/((revvl[ \w\+]+|tm(?:rv|af)\w*[45]g(?:tb)?))( b|\))/i],[E,[k,function(i,e){return e.test.test(i)?e.ifTrue:e.ifFalse},{test:/ta?b/i,ifTrue:t,ifFalse:N}],[x,"T-Mobile"]],[/(imo) (tab \w+)/i,/(infinix|tecno) (x1101b?|p904|dp(7c|8d|10a)( pro)?|p70[1-3]a?|p904|t1101)/i],[x,E,[k,t]],[/(blackberry|benq|palm(?=\-)|sonyericsson|acer|asus(?! zenw)|dell|jolla|meizu|motorola|polytron|tecno|micromax|advan)[-_ ]?([-\w]*)/i,/; (blu|coolpad|cubot|hmd|imo|infinix|lava|oneplus|tcl|wiko)[_ ]([-\w\+ ]+?)(?: bui|\)|; r)/i,/(hp) ([\w ]+\w)/i,/(microsoft); (lumia[\w ]+)/i,/(oppo) ?([\w ]+) bui/i,/(hisense) ([ehv][\w ]+)\)/i,/droid[^;]+; (philips)[_ ]([sv-x][\d]{3,4}[xz]?)/i],[x,E,[k,N]],[/(kobo)\s(ereader|touch)/i,/(hp).+(touchpad(?!.+tablet)|tablet)/i,/(kindle)\/([\w\.]+)/i],[x,E,[k,t]],[/(surface duo)/i],[E,[x,ci],[k,t]],[/droid [\d\.]+; (fp\du?)(?: b|\))/i],[E,[x,"Fairphone"],[k,N]],[/((?:tegranote|shield t(?!.+d tv))[\w- ]*?)(?: b|\))/i],[E,[x,"Nvidia"],[k,t]],[/(sprint) (\w+)/i],[x,E,[k,N]],[/(kin\.[onetw]{3})/i],[[E,/\./g," "],[x,ci],[k,N]],[/droid.+; ([c6]+|et5[16]|mc[239][23]x?|vc8[03]x?)\)/i],[E,[x,vi],[k,t]],[/droid.+; (ec30|ps20|tc[2-8]\d[kx])\)/i],[E,[x,vi],[k,N]],[/(philips)[\w ]+tv/i,/smart-tv.+(samsung)/i],[x,[k,i]],[/hbbtv.+maple;(\d+)/i],[[E,/^/,"SmartTV"],[x,mi],[k,i]],[/(vizio)(?: |.+model\/)(\w+-\w+)/i,/tcast.+(lg)e?. ([-\w]+)/i],[x,E,[k,i]],[/(nux; netcast.+smarttv|lg (netcast\.tv-201\d|android tv))/i],[[x,li],[k,i]],[/(apple) ?tv/i],[x,[E,a+" TV"],[k,i]],[/crkey.*devicetype\/chromecast/i],[[E,n+" Third Generation"],[x,s],[k,i]],[/crkey.*devicetype\/([^/]*)/i],[[E,/^/,"Chromecast "],[x,s],[k,i]],[/fuchsia.*crkey/i],[[E,n+" Nest Hub"],[x,s],[k,i]],[/crkey/i],[[E,n],[x,s],[k,i]],[/(portaltv)/i],[E,[x,Ci],[k,i]],[/droid.+aft(\w+)( bui|\))/i],[E,[x,ai],[k,i]],[/(shield \w+ tv)/i],[E,[x,"Nvidia"],[k,i]],[/\(dtv[\);].+(aquos)/i,/(aquos-tv[\w ]+)\)/i],[E,[x,"Sharp"],[k,i]],[/(bravia[\w ]+)( bui|\))/i],[E,[x,fi],[k,i]],[/(mi(tv|box)-?\w+) bui/i],[E,[x,gi],[k,i]],[/Hbbtv.*(technisat) (.*);/i],[x,E,[k,i]],[/\b(roku)[\dx]*[\)\/]((?:dvp-)?[\d\.]*)/i,/hbbtv\/\d+\.\d+\.\d+ +\([\w\+ ]*; *([\w\d][^;]*);([^;]*)/i],[[x,/.+\/(\w+)/,"$1",c,{LG:"lge"}],[E,_i],[k,i]],[/(playstation \w+)/i],[E,[x,fi],[k,R]],[/\b(xbox(?: one)?(?!; xbox))[\); ]/i],[E,[x,ci],[k,R]],[/(ouya)/i,/(nintendo) (\w+)/i,/(retroid) (pocket ([^\)]+))/i,/(valve).+(steam deck)/i,/droid.+; ((shield|rgcube|gr0006))( bui|\))/i],[[x,c,{Nvidia:"Shield",Anbernic:"RGCUBE",Logitech:"GR0006"}],E,[k,R]],[/\b(sm-[lr]\d\d[0156][fnuw]?s?|gear live)\b/i],[E,[x,mi],[k,e]],[/((pebble))app/i,/(asus|google|lg|oppo|xiaomi) ((pixel |zen)?watch[\w ]*)( bui|\))/i],[x,E,[k,e]],[/(ow(?:19|20)?we?[1-3]{1,3})/i],[E,[x,ui],[k,e]],[/(watch)(?: ?os[,\/]|\d,\d\/)[\d\.]+/i],[E,[x,a],[k,e]],[/(opwwe\d{3})/i],[E,[x,pi],[k,e]],[/(moto 360)/i],[E,[x,hi],[k,e]],[/(smartwatch 3)/i],[E,[x,fi],[k,e]],[/(g watch r)/i],[E,[x,li],[k,e]],[/droid.+; (wt63?0{2,3})\)/i],[E,[x,vi],[k,e]],[/droid.+; (glass) \d/i],[E,[x,s],[k,G]],[/(pico) ([\w ]+) os\d/i],[x,E,[k,G]],[/(quest( \d| pro)?s?).+vr/i],[E,[x,Ci],[k,G]],[/mobile vr; rv.+firefox/i],[[k,G]],[/(tesla)(?: qtcarbrowser|\/[-\w\.]+)/i],[x,[k,L]],[/(aeobc)\b/i],[E,[x,ai],[k,L]],[/(homepod).+mac os/i],[E,[x,a],[k,L]],[/windows iot/i],[[k,L]],[/droid.+; ([\w- ]+) (4k|android|smart|google)[- ]?tv/i],[E,[k,i]],[/\b((4k|android|smart|opera)[- ]?tv|tv; rv:|large screen[\w ]+safari)\b/i],[[k,i]],[/droid .+?; ([^;]+?)(?: bui|; wv\)|\) applew|; hmsc).+?(mobile|vr|\d) safari/i],[E,[k,c,{mobile:"Mobile",xr:"VR","*":t}]],[/\b((tablet|tab)[;\/]|focus\/\d(?!.+mobile))/i],[[k,t]],[/(phone|mobile(?:[;\/]| [ \w\/\.]*safari)|pda(?=.+windows ce))/i],[[k,N]],[/droid .+?; ([\w\. -]+)( bui|\))/i],[E,[x,"Generic"]]],engine:[[/windows.+ edge\/([\w\.]+)/i],[y,[v,xi+"HTML"]],[/(arkweb)\/([\w\.]+)/i],[v,y],[/webkit\/537\.36.+chrome\/(?!27)([\w\.]+)/i],[y,[v,"Blink"]],[/(presto)\/([\w\.]+)/i,/(webkit|trident|netfront|netsurf|amaya|lynx|w3m|goanna|servo)\/([\w\.]+)/i,/ekioh(flow)\/([\w\.]+)/i,/(khtml|tasman|links|dillo)[\/ ]\(?([\w\.]+)/i,/(icab)[\/ ]([23]\.[\d\.]+)/i,/\b(libweb)/i],[v,y],[/ladybird\//i],[[v,"LibWeb"]],[/rv\:([\w\.]{1,9})\b.+(gecko)/i],[y,v]],os:[[/(windows nt) (6\.[23]); arm/i],[[v,/N/,"R"],[y,c,qi]],[/(windows (?:phone|mobile|iot))(?: os)?[\/ ]?([\d\.]*( se)?)/i,/(windows)[\/ ](1[01]|2000|3\.1|7|8(\.1)?|9[58]|me|server 20\d\d( r2)?|vista|xp)/i],[v,y],[/windows nt ?([\d\.\)]*)(?!.+xbox)/i,/\bwin(?=3| ?9|n)(?:nt| 9x )?([\d\.;]*)/i],[[y,/(;|\))/g,"",c,qi],[v,Ei]],[/(windows ce)\/?([\d\.]*)/i],[v,y],[/[adehimnop]{4,7}\b(?:.*os ([\w]+) like mac|; opera)/i,/(?:ios;fbsv|ios(?=.+ip(?:ad|hone)|.+apple ?tv)|ip(?:ad|hone)(?: |.+i(?:pad)?)os|apple ?tv.+ios)[\/ ]([\w\.]+)/i,/\btvos ?([\w\.]+)/i,/cfnetwork\/.+darwin/i],[[y,/_/g,"."],[v,"iOS"]],[/(mac os x) ?([\w\. ]*)/i,/(macintosh|mac_powerpc\b)(?!.+(haiku|morphos))/i],[[v,"macOS"],[y,/_/g,"."]],[/android ([\d\.]+).*crkey/i],[y,[v,n+" Android"]],[/fuchsia.*crkey\/([\d\.]+)/i],[y,[v,n+" Fuchsia"]],[/crkey\/([\d\.]+).*devicetype\/smartspeaker/i],[y,[v,n+" SmartSpeaker"]],[/linux.*crkey\/([\d\.]+)/i],[y,[v,n+" Linux"]],[/crkey\/([\d\.]+)/i],[y,[v,n]],[/droid ([\w\.]+)\b.+(android[- ]x86)/i],[y,v],[/(ubuntu) ([\w\.]+) like android/i],[[v,/(.+)/,"$1 Touch"],y],[/(harmonyos)[\/ ]?([\d\.]*)/i,/(android|bada|blackberry|kaios|maemo|meego|openharmony|qnx|rim tablet os|sailfish|series40|symbian|tizen)\w*[-\/\.; ]?([\d\.]*)/i],[v,y],[/\(bb(10);/i],[y,[v,ni]],[/(?:symbian ?os|symbos|s60(?=;)|series ?60)[-\/ ]?([\w\.]*)/i],[y,[v,"Symbian"]],[/mozilla\/[\d\.]+ \((?:mobile[;\w ]*|tablet|tv|[^\)]*(?:viera|lg(?:l25|-d300)|alcatel ?o.+|y300-f1)); rv:([\w\.]+)\).+gecko\//i],[y,[v,yi+" OS"]],[/\b(?:hp)?wos(?:browser)?\/([\w\.]+)/i,/webos(?:[ \/]?|\.tv-20(?=2[2-9]))(\d[\d\.]*)/i],[y,[v,"webOS"]],[/web0s;.+?(?:chr[o0]me|safari)\/(\d+)/i],[[y,c,{25:"120",24:"108",23:"94",22:"87",6:"79",5:"68",4:"53",3:"38",2:"538",1:"537","*":"TV"}],[v,"webOS"]],[/watch(?: ?os[,\/ ]|\d,\d\/)([\d\.]+)/i],[y,[v,"watchOS"]],[/cros [\w]+(?:\)| ([\w\.]+)\b)/i],[y,[v,"Chrome OS"]],[/kepler ([\w\.]+); (aft|aeo)/i],[y,[v,"Vega OS"]],[/(netrange)mmh/i,/(nettv)\/(\d+\.[\w\.]+)/i,/(nintendo|playstation) (\w+)/i,/(xbox); +xbox ([^\);]+)/i,/(pico) .+os([\w\.]+)/i,/\b(joli|palm)\b ?(?:os)?\/?([\w\.]*)/i,/linux.+(mint)[\/\(\) ]?([\w\.]*)/i,/(mageia|vectorlinux|fuchsia|arcaos|arch(?= ?linux))[;l ]([\d\.]*)/i,/([kxln]?ubuntu|debian|suse|opensuse|gentoo|slackware|fedora|mandriva|centos|pclinuxos|red ?hat|zenwalk|linpus|raspbian|plan 9|minix|risc os|contiki|deepin|manjaro|elementary os|sabayon|linspire|knoppix)(?: gnu[\/ ]linux)?(?: enterprise)?(?:[- ]linux)?(?:-gnu)?[-\/ ]?(?!chrom|package)([-\w\.]*)/i,/((?:open)?solaris)[-\/ ]?([\w\.]*)/i,/\b(aix)[; ]([1-9\.]{0,4})/i,/(hurd|linux|morphos)(?: (?:arm|x86|ppc)\w*| ?)([\w\.]*)/i,/(gnu) ?([\w\.]*)/i,/\b([-frentopcghs]{0,5}bsd|dragonfly)[\/ ]?(?!amd|[ix346]{1,2}86)([\w\.]*)/i,/(haiku) ?(r\d)?/i],[v,y],[/(sunos) ?([\d\.]*)/i],[[v,"Solaris"],y],[/\b(beos|os\/2|amigaos|openvms|hp-ux|serenityos)/i,/(unix) ?([\w\.]*)/i],[v,y]]},Bi=(w={init:{},isIgnore:{},isIgnoreRgx:{},toString:{}},z.call(w.init,[[h,[v,y,j,k]],[p,[C]],[u,[k,E,x]],[m,[v,y]],[f,[v,y]]]),z.call(w.isIgnore,[[h,[y,j]],[m,[y]],[f,[y]]]),z.call(w.isIgnoreRgx,[[h,/ ?browser$/i],[f,/ ?os$/i]]),z.call(w.toString,[[h,[v,y]],[p,[C]],[u,[x,E]],[m,[v,y]],[f,[v,y]]]),w);function Di(i,e){if(i=i||{},z.call(this,ri),e)z.call(this,[[$,Ti(i[r])],[W,Ti(i[Y])],[N,/\?1/.test(i[ii])],[E,Oi(i[ei])],[T,Oi(i[ti])],[J,Oi(i[oi])],[C,Oi(i[Z])],[S,Ti(i[Q])],[X,Oi(i[K])]]);else for(var t in i)this.hasOwnProperty(t)&&typeof i[t]!==l.UNDEFINED&&(this[t]=i[t])}function F(i,e,t,o){return z.call(this,[["itemType",i],["ua",e],["uaCH",o],["rgxMap",t],["data",A(this,i)]]),this}function B(i,e,t){if(typeof i===l.OBJECT?(e=Si(i,!0)?(typeof e===l.OBJECT&&(t=e),i):void(t=i),i=void 0):typeof i!==l.STRING||Si(e,!0)||(t=e,e=void 0),t)if(typeof t.append===l.FUNCTION){var o={};t.forEach(function(i,e){o[String(e).toLowerCase()]=i}),t=o}else{var r,a={};for(r in t)t.hasOwnProperty(r)&&(a[String(r).toLowerCase()]=t[r]);t=a}var s,n,w,b;return this instanceof B?(s=typeof i===l.STRING?i:t&&t[P]?t[P]:I&&I.userAgent?I.userAgent:d,n=new Di(t,!0),w=Fi,z.call(this,[["getBrowser",(b=function(i){return i==g?function(){return new F(i,s,w,n).set("ua",s).set(h,this.getBrowser()).set(p,this.getCPU()).set(u,this.getDevice()).set(m,this.getEngine()).set(f,this.getOS()).get()}:function(){return new F(i,s,w[i],n).parseUA().get()}})(h)],["getCPU",b(p)],["getDevice",b(u)],["getEngine",b(m)],["getOS",b(f)],["getResult",b(g)],["getUA",function(){return s}],["setUA",function(i){return q(i)&&(s=_i(i,V)),this}],["useExtension",function(i){return i&&(w=((i,e)=>{var t,o={},r=e;if(!Si(e))for(var a in r={},e)for(var s in e[a])r[s]=e[a][s].concat(r[s]||[]);for(t in i)o[t]=r[t]&&r[t].length%2==0?r[t].concat(i[t]):i[t];return o})(w,i)),this}]]).setUA(s).useExtension(e),this):new B(i,e,t).getResult()}F.prototype.get=function(i){return i?this.data.hasOwnProperty(i)?this.data[i]:void 0:this.data},F.prototype.set=function(i,e){return this.data[i]=e,this},F.prototype.setCH=function(i){return this.uaCH=i,this},F.prototype.detectFeature=function(){if(I&&I.userAgent==this.ua)switch(this.itemType){case h:I.brave&&typeof I.brave.isBrave==l.FUNCTION&&this.set(v,"Brave");break;case u:!this.get(k)&&_&&_[N]&&this.set(k,N),"Macintosh"==this.get(E)&&I&&typeof I.standalone!==l.UNDEFINED&&I.maxTouchPoints&&2<I.maxTouchPoints&&this.set(E,"iPad").set(k,t);break;case f:!this.get(v)&&_&&_[T]&&this.set(v,_[T]);break;case g:var e=this.data,i=function(i){return e[i].getItem().detectFeature().get()};this.set(h,i(h)).set(p,i(p)).set(u,i(u)).set(m,i(m)).set(f,i(f))}return this},F.prototype.parseUA=function(){switch(this.itemType!=g&&M.call(this.data,this.ua,this.rgxMap),this.itemType){case h:this.set(j,H(this.get(y)));break;case f:var i;"iOS"==this.get(v)&&this.get(y)&&/^1[89][^\d]/.exec(this.get(y))&&(i=/\) Version\/((\d+)[\d\.]*)/.exec(this.ua))&&26<=parseInt(i[2],10)&&this.set(y,i[1])}return this},F.prototype.parseCH=function(){var i,e=this.uaCH,t=this.rgxMap;switch(this.itemType){case h:case m:var o,r=e[W]||e[$];if(r)for(var a=0;a<r.length;a++){var s=r[a].brand||r[a],n=r[a].version;this.itemType==h&&!/not.a.brand/i.test(s)&&(!o||/Chrom/.test(o)&&s!=ki||o==xi&&/WebView2/.test(s))&&(s=c(s,zi),(o=this.get(v))&&!/Chrom/.test(o)&&/Chrom/.test(s)||this.set(v,s).set(y,n).set(j,H(n)),o=s),this.itemType==m&&s==ki&&this.set(y,n)}break;case p:var w=e[C];w&&("64"==e[X]&&(w+="64"),M.call(this.data,w+";",t));break;case u:if(e[N]&&this.set(k,N),e[E]&&(this.set(E,e[E]),this.get(k)&&this.get(x)||(M.call(w={},"droid 9; "+e[E]+")",t),!this.get(k)&&w.type&&this.set(k,w.type),!this.get(x)&&w.vendor&&this.set(x,w.vendor))),e[S]){if("string"!=typeof e[S])for(var b=0;!i&&b<e[S].length;)i=c(e[S][b++],Ui);else i=c(e[S],Ui);this.set(k,i)}break;case f:var d,w=e[T];w&&(d=e[J],w==Ei&&(d=13<=parseInt(H(d),10)?"11":"10"),this.set(v,w).set(y,d)),this.get(v)==Ei&&"Xbox"==e[E]&&this.set(v,"Xbox").set(y,void 0);break;case g:var l=this.data,w=function(i){return l[i].getItem().setCH(e).parseCH().get()};this.set(h,w(h)).set(p,w(p)).set(u,w(u)).set(m,w(m)).set(f,w(f))}return this},B.VERSION="2.0.10",B.BROWSER=D([v,y,j,k]),B.CPU=D([C]),B.DEVICE=D([E,x,k,R,N,i,t,e,L]),B.ENGINE=B.OS=D([v,y]);export{B as UAParser};
src/main/ua-parser.js +54 lines · 2 flagged
--- +++ @@ -1,3 +1,3 @@ /////////////////////////////////////////////////////////////////////////////////-/* UAParser.js v2.0.9+/* UAParser.js v2.0.10    Copyright © 2012-2026 Faisal Salman <[email protected]>@@ -21,3 +21,3 @@ -    var LIBVERSION  = '2.0.9',+    var LIBVERSION  = '2.0.10',         UA_MAX_LENGTH = 500,@@ -172,3 +172,3 @@             var arr = [];-            var tokens = strip(/\\?\"/g, header).split(',');+            var tokens = normalizeHeaderValue(header).split(',');             for (var i = 0; i < tokens.length; i++) {@@ -189,2 +189,5 @@         },+        normalizeHeaderValue = function (str) {+            return isString(str) ? trim(strip(/\\?\"/g, str), UA_MAX_LENGTH) : undefined;+        },         setProps = function (arr) {@@ -204,5 +207,2 @@             return isString(str) ? str.replace(pattern, EMPTY) : str;-        },-        stripQuotes = function (str) {-            return strip(/\\?\"/g, str);          },@@ -280,2 +280,6 @@ +        strTest = function (str, map) {+            return map.test.test(str) ? map.ifTrue : map.ifFalse;+        },+         strMapper = function (str, map) {@@ -350,3 +354,3 @@             /webview.+edge\/([\w\.]+)/i                                         // Microsoft Edge-            ], [VERSION, [NAME, EDGE+' WebView']], [+            ], [VERSION, [NAME, EDGE+' WebView'], [TYPE, INAPP]], [             /edg(?:e|ios|a)?\/([\w\.]+)/i                                       @@ -390,3 +394,3 @@             ], [VERSION, [NAME, 'DuckDuckGo']], [-            /(?:\buc? ?browser|(?:juc.+)ucweb)[\/ ]?([\w\.]+)/i                 // UCBrowser+            /(?:\buc? ?browser|(?:juc.+)ucweb| ucpc)[\/ ]?([\w\.]+)/i           // UCBrowser             ], [VERSION, [NAME, 'UCBrowser']], [@@ -429,3 +433,5 @@             /(oculus|sailfish|huawei|vivo|pico)browser\/([\w\.]+)/i-            ], [[NAME, /(.+)/, '$1' + SUFFIX_BROWSER], VERSION], [              // Oculus/Sailfish/HuaweiBrowser/VivoBrowser/PicoBrowser+            ], [[NAME, /(.+)/, '$1' + SUFFIX_BROWSER], VERSION], [              // Oculus/Sailfish/VivoBrowser/PicoBrowser+            / HBPC\/([\w\.]+)/                                                  // Huawei Browser+            ], [VERSION, [NAME, HUAWEI + SUFFIX_BROWSER]], [             /samsungbrowser\/([\w\.]+)/i                                        // Samsung Internet@@ -477,6 +483,6 @@             /wv\).+chrome\/([\w\.]+).+edgw\//i                                  // Edge WebView2-            ], [VERSION, [NAME, EDGE+' WebView2']], [--            / wv\).+(chrome)\/([\w\.]+)/i                                       // Chrome WebView-            ], [[NAME, CHROME+' WebView'], VERSION], [+            ], [VERSION, [NAME, EDGE+' WebView2'], [TYPE, INAPP]], [++            /; wv\).+(chrome)\/([\w\.]+)/i                                      // Chrome WebView+            ], [[NAME, CHROME+' WebView'], VERSION, [TYPE, INAPP]], [ @@ -614,3 +620,3 @@             /\b(mi[-_ ]?(?:a\d|one|one[_ ]plus|note|max|cc)?[_ ]?(?:\d{0,2}\w?)[_ ]?(?:plus|se|lite|pro)?( 5g|lte)?)(?: bui|\))/i,-            / ([\w ]+) miui\/v?\d/i+            /; ([\w ]+) miui\/v?\d/i             ], [[MODEL, /_/g, ' '], [VENDOR, XIAOMI], [TYPE, MOBILE]], [@@ -769,2 +775,7 @@ +            // Blackview+            /blackview ([-\w ]+)( b|\))/i,+            /; (bv\d{4}[-\w ]*)( b|\))/i+            ], [MODEL, [VENDOR, 'Blackview'], [TYPE, MOBILE]], [+             // HMD@@ -772,2 +783,6 @@             ], [MODEL, [VENDOR, 'HMD'], [TYPE, MOBILE]], [++            // T-Mobile+            /((revvl[ \w\+]+|tm(?:rv|af)\w*[45]g(?:tb)?))( b|\))/i+            ], [MODEL, [TYPE, strTest, { 'test': /ta?b/i, 'ifTrue': TABLET, 'ifFalse': MOBILE }], [VENDOR, 'T-Mobile']], [ @@ -780,4 +795,4 @@                                                                                 // BlackBerry/BenQ/Palm/Sony-Ericsson/Acer/Asus/Dell/Meizu/Motorola/Polytron/Tecno/Micromax/Advan-                                                                                // BLU/HMD/IMO/Infinix/Lava/OnePlus/TCL/Wiko-            /; (blu|hmd|imo|infinix|lava|oneplus|tcl|wiko)[_ ]([\w\+ ]+?)(?: bui|\)|; r)/i,+                                                                                // BLU/Coolpad/CUBOT/HMD/IMO/Infinix/Lava/OnePlus/TCL/Wiko+            /; (blu|coolpad|cubot|hmd|imo|infinix|lava|oneplus|tcl|wiko)[_ ]([-\w\+ ]+?)(?: bui|\)|; r)/i,             /(hp) ([\w ]+\w)/i,                                                 // HP iPAQ@@ -1189,8 +1204,8 @@                 [MOBILE, /\?1/.test(uach[CH_MOBILE])],-                [MODEL, stripQuotes(uach[CH_MODEL])],-                [PLATFORM, stripQuotes(uach[CH_PLATFORM])],-                [PLATFORMVER, stripQuotes(uach[CH_PLATFORM_VER])],-                [ARCHITECTURE, stripQuotes(uach[CH_ARCH])],+                [MODEL, normalizeHeaderValue(uach[CH_MODEL])],+                [PLATFORM, normalizeHeaderValue(uach[CH_PLATFORM])],+                [PLATFORMVER, normalizeHeaderValue(uach[CH_PLATFORM_VER])],+                [ARCHITECTURE, normalizeHeaderValue(uach[CH_ARCH])],                 [FORMFACTORS, itemListToArray(uach[CH_FORM_FACTORS])],-                [BITNESS, stripQuotes(uach[CH_BITNESS])]+                [BITNESS, normalizeHeaderValue(uach[CH_BITNESS])]             ]);@@ -1282,7 +1297,13 @@             case OS:-                if (this.get(NAME) == 'iOS' && this.get(VERSION) == '18.6') {-                    // Based on the assumption that iOS version is tightly coupled with Safari version-                    var realVersion = /\) Version\/([\d\.]+)/.exec(this.ua); // Get Safari version-                    if (realVersion && parseInt(realVersion[1].substring(0,2), 10) >= 26) {-                        this.set(VERSION, realVersion[1]);  // Set as iOS version+                // Since iOS 26, Safari's UA reports the OS version as frozen at 18:+                // https://webkit.org/blog/17333/webkit-features-in-safari-26-0/#update-to-ua-string+                if (this.get(NAME) == 'iOS' && this.get(VERSION)) {+                    // Only perform this if iOS version is 18/19+                    if (/^1[89][^\d]/.exec(this.get(VERSION))) {+                        // Based on the assumption that "iOS" version is tightly coupled with "Safari" version+                        var realVersion = /\) Version\/((\d+)[\d\.]*)/.exec(this.ua);+                        if (realVersion && parseInt(realVersion[2], 10) >= 26) {+                            // iOS version = Safari version+                            this.set(VERSION, realVersion[1]);+                        }                     }@@ -1442,5 +1463,3 @@             httpUACH = new UACHData(headers, true),-            regexMap = extensions ? -                        extend(defaultRegexes, extensions) : -                        defaultRegexes,+            regexMap = defaultRegexes, @@ -1479,5 +1498,10 @@                 return this;+            }],+            ['useExtension', function (exts) {+                if (exts) regexMap = extend(regexMap, exts);+                return this;             }]         ])-        .setUA(userAgent);+        .setUA(userAgent)+        .useExtension(extensions); 
src/main/ua-parser.mjs +54 lines · 2 flagged
--- +++ @@ -5,3 +5,3 @@ /////////////////////////////////////////////////////////////////////////////////-/* UAParser.js v2.0.9+/* UAParser.js v2.0.10    Copyright © 2012-2026 Faisal Salman <[email protected]>@@ -23,3 +23,3 @@ -    var LIBVERSION  = '2.0.9',+    var LIBVERSION  = '2.0.10',         UA_MAX_LENGTH = 500,@@ -174,3 +174,3 @@             var arr = [];-            var tokens = strip(/\\?\"/g, header).split(',');+            var tokens = normalizeHeaderValue(header).split(',');             for (var i = 0; i < tokens.length; i++) {@@ -191,2 +191,5 @@         },+        normalizeHeaderValue = function (str) {+            return isString(str) ? trim(strip(/\\?\"/g, str), UA_MAX_LENGTH) : undefined;+        },         setProps = function (arr) {@@ -206,5 +209,2 @@             return isString(str) ? str.replace(pattern, EMPTY) : str;-        },-        stripQuotes = function (str) {-            return strip(/\\?\"/g, str);          },@@ -282,2 +282,6 @@ +        strTest = function (str, map) {+            return map.test.test(str) ? map.ifTrue : map.ifFalse;+        },+         strMapper = function (str, map) {@@ -352,3 +356,3 @@             /webview.+edge\/([\w\.]+)/i                                         // Microsoft Edge-            ], [VERSION, [NAME, EDGE+' WebView']], [+            ], [VERSION, [NAME, EDGE+' WebView'], [TYPE, INAPP]], [             /edg(?:e|ios|a)?\/([\w\.]+)/i                                       @@ -392,3 +396,3 @@             ], [VERSION, [NAME, 'DuckDuckGo']], [-            /(?:\buc? ?browser|(?:juc.+)ucweb)[\/ ]?([\w\.]+)/i                 // UCBrowser+            /(?:\buc? ?browser|(?:juc.+)ucweb| ucpc)[\/ ]?([\w\.]+)/i           // UCBrowser             ], [VERSION, [NAME, 'UCBrowser']], [@@ -431,3 +435,5 @@             /(oculus|sailfish|huawei|vivo|pico)browser\/([\w\.]+)/i-            ], [[NAME, /(.+)/, '$1' + SUFFIX_BROWSER], VERSION], [              // Oculus/Sailfish/HuaweiBrowser/VivoBrowser/PicoBrowser+            ], [[NAME, /(.+)/, '$1' + SUFFIX_BROWSER], VERSION], [              // Oculus/Sailfish/VivoBrowser/PicoBrowser+            / HBPC\/([\w\.]+)/                                                  // Huawei Browser+            ], [VERSION, [NAME, HUAWEI + SUFFIX_BROWSER]], [             /samsungbrowser\/([\w\.]+)/i                                        // Samsung Internet@@ -479,6 +485,6 @@             /wv\).+chrome\/([\w\.]+).+edgw\//i                                  // Edge WebView2-            ], [VERSION, [NAME, EDGE+' WebView2']], [--            / wv\).+(chrome)\/([\w\.]+)/i                                       // Chrome WebView-            ], [[NAME, CHROME+' WebView'], VERSION], [+            ], [VERSION, [NAME, EDGE+' WebView2'], [TYPE, INAPP]], [++            /; wv\).+(chrome)\/([\w\.]+)/i                                      // Chrome WebView+            ], [[NAME, CHROME+' WebView'], VERSION, [TYPE, INAPP]], [ @@ -616,3 +622,3 @@             /\b(mi[-_ ]?(?:a\d|one|one[_ ]plus|note|max|cc)?[_ ]?(?:\d{0,2}\w?)[_ ]?(?:plus|se|lite|pro)?( 5g|lte)?)(?: bui|\))/i,-            / ([\w ]+) miui\/v?\d/i+            /; ([\w ]+) miui\/v?\d/i             ], [[MODEL, /_/g, ' '], [VENDOR, XIAOMI], [TYPE, MOBILE]], [@@ -771,2 +777,7 @@ +            // Blackview+            /blackview ([-\w ]+)( b|\))/i,+            /; (bv\d{4}[-\w ]*)( b|\))/i+            ], [MODEL, [VENDOR, 'Blackview'], [TYPE, MOBILE]], [+             // HMD@@ -774,2 +785,6 @@             ], [MODEL, [VENDOR, 'HMD'], [TYPE, MOBILE]], [++            // T-Mobile+            /((revvl[ \w\+]+|tm(?:rv|af)\w*[45]g(?:tb)?))( b|\))/i+            ], [MODEL, [TYPE, strTest, { 'test': /ta?b/i, 'ifTrue': TABLET, 'ifFalse': MOBILE }], [VENDOR, 'T-Mobile']], [ @@ -782,4 +797,4 @@                                                                                 // BlackBerry/BenQ/Palm/Sony-Ericsson/Acer/Asus/Dell/Meizu/Motorola/Polytron/Tecno/Micromax/Advan-                                                                                // BLU/HMD/IMO/Infinix/Lava/OnePlus/TCL/Wiko-            /; (blu|hmd|imo|infinix|lava|oneplus|tcl|wiko)[_ ]([\w\+ ]+?)(?: bui|\)|; r)/i,+                                                                                // BLU/Coolpad/CUBOT/HMD/IMO/Infinix/Lava/OnePlus/TCL/Wiko+            /; (blu|coolpad|cubot|hmd|imo|infinix|lava|oneplus|tcl|wiko)[_ ]([-\w\+ ]+?)(?: bui|\)|; r)/i,             /(hp) ([\w ]+\w)/i,                                                 // HP iPAQ@@ -1191,8 +1206,8 @@                 [MOBILE, /\?1/.test(uach[CH_MOBILE])],-                [MODEL, stripQuotes(uach[CH_MODEL])],-                [PLATFORM, stripQuotes(uach[CH_PLATFORM])],-                [PLATFORMVER, stripQuotes(uach[CH_PLATFORM_VER])],-                [ARCHITECTURE, stripQuotes(uach[CH_ARCH])],+                [MODEL, normalizeHeaderValue(uach[CH_MODEL])],+                [PLATFORM, normalizeHeaderValue(uach[CH_PLATFORM])],+                [PLATFORMVER, normalizeHeaderValue(uach[CH_PLATFORM_VER])],+                [ARCHITECTURE, normalizeHeaderValue(uach[CH_ARCH])],                 [FORMFACTORS, itemListToArray(uach[CH_FORM_FACTORS])],-                [BITNESS, stripQuotes(uach[CH_BITNESS])]+                [BITNESS, normalizeHeaderValue(uach[CH_BITNESS])]             ]);@@ -1284,7 +1299,13 @@             case OS:-                if (this.get(NAME) == 'iOS' && this.get(VERSION) == '18.6') {-                    // Based on the assumption that iOS version is tightly coupled with Safari version-                    var realVersion = /\) Version\/([\d\.]+)/.exec(this.ua); // Get Safari version-                    if (realVersion && parseInt(realVersion[1].substring(0,2), 10) >= 26) {-                        this.set(VERSION, realVersion[1]);  // Set as iOS version+                // Since iOS 26, Safari's UA reports the OS version as frozen at 18:+                // https://webkit.org/blog/17333/webkit-features-in-safari-26-0/#update-to-ua-string+                if (this.get(NAME) == 'iOS' && this.get(VERSION)) {+                    // Only perform this if iOS version is 18/19+                    if (/^1[89][^\d]/.exec(this.get(VERSION))) {+                        // Based on the assumption that "iOS" version is tightly coupled with "Safari" version+                        var realVersion = /\) Version\/((\d+)[\d\.]*)/.exec(this.ua);+                        if (realVersion && parseInt(realVersion[2], 10) >= 26) {+                            // iOS version = Safari version+                            this.set(VERSION, realVersion[1]);+                        }                     }@@ -1444,5 +1465,3 @@             httpUACH = new UACHData(headers, true),-            regexMap = extensions ? -                        extend(defaultRegexes, extensions) : -                        defaultRegexes,+            regexMap = defaultRegexes, @@ -1481,5 +1500,10 @@                 return this;+            }],+            ['useExtension', function (exts) {+                if (exts) regexMap = extend(regexMap, exts);+                return this;             }]         ])-        .setUA(userAgent);+        .setUA(userAgent)+        .useExtension(extensions); 
package.json +19 lines
--- +++ @@ -3,3 +3,3 @@   "name": "ua-parser-js",-  "version": "2.0.9",+  "version": "2.0.10",   "author": "Faisal Salman <[email protected]> (http://faisalman.com)",@@ -25,4 +25,6 @@   "contributors": [+    "23tux <[email protected]>",     "Aamir Poonawalla <[email protected]>",     "Admas <[email protected]>",+    "Aidan Nulman <[email protected]>",     "Aiyush <[email protected]>",@@ -41,4 +43,7 @@     "Benjamin Urban <[email protected]>",+    "Benxamin <[email protected]>",     "boneyao <[email protected]>",+    "carel155 <[email protected]>",     "Carl C Von Lewin <[email protected]>",+    "Casey Grimes <[email protected]>",     "CESAR RAMOS <[email protected]>",@@ -77,2 +82,3 @@     "Germán M. Bravo <[email protected]>",+    "giantyo26 <[email protected]>",     "Grigory Dmitrenko <[email protected]>",@@ -81,2 +87,3 @@     "Harald Reingruber <[email protected]>",+    "Harlan Brawer <[email protected]>",     "Hendrik Helwich <[email protected]>",@@ -85,2 +92,3 @@     "Hyewon Kang <[email protected]>",+    "Hyper-Z11 <[email protected]>",     "Hyunbin <[email protected]>",@@ -114,2 +122,3 @@     "Lukas Eipert <[email protected]>",+    "Maksim Otto <[email protected]>",     "Malash <[email protected]>",@@ -157,2 +166,3 @@     "Sandro Sonntag <[email protected]>",+    "Sébastien Règne <[email protected]>",     "sgautrea <[email protected]>",@@ -167,2 +177,3 @@     "sUP <[email protected]>",+    "Suryaansh Chawla <[email protected]>",     "Sylvain Gizard <[email protected]>",@@ -172,3 +183,5 @@     "Ulrich Schmidt <[email protected]>",+    "undefined <[email protected]>",     "Vadim Kurachevsky <[email protected]>",+    "Valentina <[email protected]>",     "Varun Sharma <[email protected]>",@@ -229,2 +242,3 @@   "bin": "./script/cli.js",+  "sideEffects": false,   "scripts": {@@ -232,3 +246,2 @@     "build+test": "npm run build && npm run test",-    "fuzz": "jazzer ./test/fuzz/redos.js --sync",     "test": "./script/test-all.sh",@@ -236,2 +249,3 @@     "test:eslint": "eslint --no-config-lookup src",+    "test:fuzz": "jazzer ./test/fuzz/redos.js --sync",     "test:jshint": "jshint src/main",@@ -239,2 +253,3 @@     "test:mocha": "mocha --recursive test/unit",+    "test:nyc": "nyc --timeout=50000 --include=src/**/*.js npm run test",     "test:playwright": "npx playwright install && playwright test test/e2e --browser all"@@ -249,2 +264,3 @@     "@babel/traverse": "7.23.2",+    "@jazzer.js/core": "^4.0.0",     "@playwright/test": "^1.57.0",@@ -254,2 +270,3 @@     "mocha": "~8.2.0",+    "nyc": "^18.0.0",     "requirejs": "2.3.2",
src/bot-detection/bot-detection.d.ts +6 lines
--- +++ @@ -1,2 +1,2 @@-// Type definitions for bot-detection submodule of UAParser.js v2.0.9+// Type definitions for bot-detection submodule of UAParser.js v2.0.10 // Project: https://github.com/faisalman/ua-parser-js@@ -4,4 +4,6 @@ -export function isAIAssistant(ua: string): boolean;-export function isAICrawler(ua: string): boolean;-export function isBot(ua: string): boolean;+import type { IResult } from "../main/ua-parser";++export function isAIAssistant(resultOrUA: IResult | string): boolean;+export function isAICrawler(resultOrUA: IResult | string): boolean;+export function isBot(resultOrUA: IResult | string): boolean;
src/bot-detection/bot-detection.js +2 lines
--- +++ @@ -1,3 +1,3 @@ //////////////////////////////////////////////////-/*  bot-detection submodule of UAParser.js v2.0.9+/*  bot-detection submodule of UAParser.js v2.0.10     https://github.com/faisalman/ua-parser-js@@ -139,2 +139,3 @@     Crawler.META_EXTERNALAGENT,+    Crawler.META_WEBINDEXER, 
src/bot-detection/bot-detection.mjs +2 lines
--- +++ @@ -5,3 +5,3 @@ //////////////////////////////////////////////////-/*  bot-detection submodule of UAParser.js v2.0.9+/*  bot-detection submodule of UAParser.js v2.0.10     https://github.com/faisalman/ua-parser-js@@ -143,2 +143,3 @@     Crawler.META_EXTERNALAGENT,+    Crawler.META_WEBINDEXER, 
src/browser-detection/browser-detection.d.ts +1 lines
--- +++ @@ -1,2 +1,2 @@-// Type definitions for browser-detection submodule of UAParser.js v2.0.9+// Type definitions for browser-detection submodule of UAParser.js v2.0.10 // Project: https://github.com/faisalman/ua-parser-js
src/browser-detection/browser-detection.js +6 lines
--- +++ @@ -1,3 +1,3 @@ //////////////////////////////////////////////////////-/*  browser-detection submodule of UAParser.js v2.0.9+/*  browser-detection submodule of UAParser.js v2.0.10     https://github.com/faisalman/ua-parser-js@@ -21,4 +21,7 @@ const isElectron = () => !!(-    process?.versions?.hasOwnProperty('electron') ||    // node.js-    / electron\//i.test(navigator?.userAgent));         // browser+    // in node.js environment+    (typeof process !== 'undefined' && process.versions?.hasOwnProperty('electron')) ||+    // in browser environment+    (typeof navigator !== 'undefined' && / electron\//i.test(navigator.userAgent))+); 
src/browser-detection/browser-detection.mjs +6 lines
--- +++ @@ -5,3 +5,3 @@ //////////////////////////////////////////////////////-/*  browser-detection submodule of UAParser.js v2.0.9+/*  browser-detection submodule of UAParser.js v2.0.10     https://github.com/faisalman/ua-parser-js@@ -25,4 +25,7 @@ const isElectron = () => !!(-    process?.versions?.hasOwnProperty('electron') ||    // node.js-    / electron\//i.test(navigator?.userAgent));         // browser+    // in node.js environment+    (typeof process !== 'undefined' && process.versions?.hasOwnProperty('electron')) ||+    // in browser environment+    (typeof navigator !== 'undefined' && / electron\//i.test(navigator.userAgent))+); 
src/device-detection/device-detection.d.ts +1 lines
--- +++ @@ -1,2 +1,2 @@-// Type definitions for device-detection submodule of UAParser.js v2.0.9+// Type definitions for device-detection submodule of UAParser.js v2.0.10 // Project: https://github.com/faisalman/ua-parser-js
src/device-detection/device-detection.js +1 lines
--- +++ @@ -1,3 +1,3 @@ /////////////////////////////////////////////////////-/*  device-detection submodule of UAParser.js v2.0.9+/*  device-detection submodule of UAParser.js v2.0.10     https://github.com/faisalman/ua-parser-js
src/device-detection/device-detection.mjs +1 lines
--- +++ @@ -5,3 +5,3 @@ /////////////////////////////////////////////////////-/*  device-detection submodule of UAParser.js v2.0.9+/*  device-detection submodule of UAParser.js v2.0.10     https://github.com/faisalman/ua-parser-js
src/enums/ua-parser-enums.d.ts +29 lines
--- +++ @@ -5,3 +5,3 @@ ///////////////////////////////////////////////-/*  Enums for UAParser.js v2.0.9+/*  Enums for UAParser.js v2.0.10     https://github.com/faisalman/ua-parser-js@@ -222,3 +222,2 @@     CONSOLE: 'console',-    DESKTOP: 'desktop',     EMBEDDED: 'embedded',@@ -228,3 +227,7 @@     WEARABLE: 'wearable',-    XR: 'xr'+    XR: 'xr',+    /**+     * @deprecated UAParser doesn't support `desktop` type, see https://docs.uaparser.dev/info/device/type+     */+    DESKTOP: 'desktop' }>;@@ -247,4 +250,7 @@     BLACKBERRY: 'BlackBerry',+    BLACKVIEW: 'Blackview',     BLU: 'BLU',     CAT: 'Cat',+    COOLPAD: 'Coolpad',+    CUBOT: 'CUBOT',     DELL: 'Dell',@@ -303,2 +309,3 @@     TESLA: 'Tesla',+    T_MOBILE: 'T-Mobile',     ULEFONE: 'Ulefone',@@ -475,2 +482,3 @@             AMAZON_CONTXBOT: 'contxbot',+            AMAZON_SEARCHBOT: 'Amzn-SearchBot',             ANTHROPIC_AI: 'anthropic-ai',@@ -479,4 +487,8 @@             ANTHROPIC_CLAUDE_WEB: 'Claude-Web',+            ARCHIVEORG_BOT: 'archive.org_bot',             ATLASSIAN_BOT: 'atlassian-bot',-            ARCHIVEORG_BOT: 'archive.org_bot',+            AUDISTO_CRAWLER: 'Audisto Crawler',+            AWARIO_BOT: 'AwarioBot',+            AWARIO_SMARTBOT: 'AwarioSmartBot',+            AWARIO_RSSBOT: 'AwarioRssBot',             BAIDU_ADS: 'Baidu-ADS',@@ -493,2 +505,3 @@             BRAVE_BOT: 'Bravebot',+            BRIGHTEDGE_CRAWLER: 'BrightEdge Crawler',             BYTEDANCE_BYTESPIDER: 'Bytespider',@@ -500,2 +513,3 @@             COHERE_TRAINING_DATA_CRAWLER: 'cohere-training-data-crawler',+            COMSCORE_PROXIMIC: 'proximic',             COTOYOGI: 'Cotoyogi',@@ -533,2 +547,3 @@             GOOGLE_STOREBOT: 'Storebot-Google',+            HEADLINE: 'Headline',             HIVE_IMAGESIFTBOT: 'ImagesiftBot',@@ -536,2 +551,3 @@             HUAWEI_PETALBOT: 'PetalBot',+            HUBSPOT_CRAWLER: 'HubSpot Crawler',             HUGGINGFACE_BOT: 'HuggingFace-Bot',@@ -546,2 +562,3 @@             MARGINALIA: 'marginalia',+            META_EXTERNALADS: 'meta-externalads',             META_EXTERNALAGENT: 'meta-externalagent',@@ -550,2 +567,3 @@             META_FACEBOOKEXTERNALHIT: 'facebookexternalhit',+            META_WEBINDEXER: 'meta-webindexer',             MAJESTIC_MJ12BOT: 'MJ12bot',@@ -589,2 +607,3 @@             XAI_BOT: 'xAI-Bot',+            YACY_BOT: 'yacybot',             YAHOO_JAPAN: 'Y!J-BRW',@@ -695,2 +714,3 @@             AMAZON_NOVA_ACT: 'NovaAct',+            AMAZON_USER: 'Amzn-User',             ANTHROPIC_CLAUDE_USER: 'Claude-User',@@ -704,4 +724,6 @@             DUCKDUCKGO_ASSISTBOT: 'DuckAssistBot',+            FEEDLY: 'Feedly',             FLIPBOARD_PROXY: 'FlipboardProxy',             GOOGLE_CHROME_LIGHTHOUSE: 'Lighthouse',+            GOOGLE_DOCS: 'GoogleDocs',             GOOGLE_FEEDFETCHER: 'FeedFetcher-Google',@@ -735,2 +757,3 @@             UPTIMEROBOT: 'UptimeRobot',+            UPTIMEBOT: 'UptimeBot',             VERCEL_FAVICON_BOT: 'vercel-favicon-bot',@@ -740,2 +763,3 @@             VERCEL_TRACING: 'verceltracing',+            VIRUSTOTAL: 'virustotal',             X_TWITTERBOT: 'Twitterbot',@@ -794,2 +818,3 @@             OCAML_COHTTP: 'ocaml-cohttp',+            PHP_CRAWL: 'phpcrawl',             PHP_SOAP: 'PHP-SOAP',
src/enums/ua-parser-enums.js +29 lines
--- +++ @@ -1,3 +1,3 @@ ///////////////////////////////////////////////-/*  Enums for UAParser.js v2.0.9+/*  Enums for UAParser.js v2.0.10     https://github.com/faisalman/ua-parser-js@@ -218,3 +218,2 @@     CONSOLE: 'console',-    DESKTOP: 'desktop',     EMBEDDED: 'embedded',@@ -224,3 +223,7 @@     WEARABLE: 'wearable',-    XR: 'xr'+    XR: 'xr',+    /**+     * @deprecated UAParser doesn't support `desktop` type, see https://docs.uaparser.dev/info/device/type+     */+    DESKTOP: 'desktop' });@@ -243,4 +246,7 @@     BLACKBERRY: 'BlackBerry',+    BLACKVIEW: 'Blackview',     BLU: 'BLU',     CAT: 'Cat',+    COOLPAD: 'Coolpad',+    CUBOT: 'CUBOT',     DELL: 'Dell',@@ -299,2 +305,3 @@     TESLA: 'Tesla',+    T_MOBILE: 'T-Mobile',     ULEFONE: 'Ulefone',@@ -471,2 +478,3 @@             AMAZON_CONTXBOT: 'contxbot',+            AMAZON_SEARCHBOT: 'Amzn-SearchBot',             ANTHROPIC_AI: 'anthropic-ai',@@ -475,4 +483,8 @@             ANTHROPIC_CLAUDE_WEB: 'Claude-Web',+            ARCHIVEORG_BOT: 'archive.org_bot',             ATLASSIAN_BOT: 'atlassian-bot',-            ARCHIVEORG_BOT: 'archive.org_bot',+            AUDISTO_CRAWLER: 'Audisto Crawler',+            AWARIO_BOT: 'AwarioBot',+            AWARIO_SMARTBOT: 'AwarioSmartBot',+            AWARIO_RSSBOT: 'AwarioRssBot',             BAIDU_ADS: 'Baidu-ADS',@@ -489,2 +501,3 @@             BRAVE_BOT: 'Bravebot',+            BRIGHTEDGE_CRAWLER: 'BrightEdge Crawler',             BYTEDANCE_BYTESPIDER: 'Bytespider',@@ -496,2 +509,3 @@             COHERE_TRAINING_DATA_CRAWLER: 'cohere-training-data-crawler',+            COMSCORE_PROXIMIC: 'proximic',             COTOYOGI: 'Cotoyogi',@@ -529,2 +543,3 @@             GOOGLE_STOREBOT: 'Storebot-Google',+            HEADLINE: 'Headline',             HIVE_IMAGESIFTBOT: 'ImagesiftBot',@@ -532,2 +547,3 @@             HUAWEI_PETALBOT: 'PetalBot',+            HUBSPOT_CRAWLER: 'HubSpot Crawler',             HUGGINGFACE_BOT: 'HuggingFace-Bot',@@ -542,2 +558,3 @@             MARGINALIA: 'marginalia',+            META_EXTERNALADS: 'meta-externalads',             META_EXTERNALAGENT: 'meta-externalagent',@@ -546,2 +563,3 @@             META_FACEBOOKEXTERNALHIT: 'facebookexternalhit',+            META_WEBINDEXER: 'meta-webindexer',             MAJESTIC_MJ12BOT: 'MJ12bot',@@ -585,2 +603,3 @@             XAI_BOT: 'xAI-Bot',+            YACY_BOT: 'yacybot',             YAHOO_JAPAN: 'Y!J-BRW',@@ -691,2 +710,3 @@             AMAZON_NOVA_ACT: 'NovaAct',+            AMAZON_USER: 'Amzn-User',             ANTHROPIC_CLAUDE_USER: 'Claude-User',@@ -700,4 +720,6 @@             DUCKDUCKGO_ASSISTBOT: 'DuckAssistBot',+            FEEDLY: 'Feedly',             FLIPBOARD_PROXY: 'FlipboardProxy',             GOOGLE_CHROME_LIGHTHOUSE: 'Lighthouse',+            GOOGLE_DOCS: 'GoogleDocs',             GOOGLE_FEEDFETCHER: 'FeedFetcher-Google',@@ -731,2 +753,3 @@             UPTIMEROBOT: 'UptimeRobot',+            UPTIMEBOT: 'UptimeBot',             VERCEL_FAVICON_BOT: 'vercel-favicon-bot',@@ -736,2 +759,3 @@             VERCEL_TRACING: 'verceltracing',+            VIRUSTOTAL: 'virustotal',             X_TWITTERBOT: 'Twitterbot',@@ -790,2 +814,3 @@             OCAML_COHTTP: 'ocaml-cohttp',+            PHP_CRAWL: 'phpcrawl',             PHP_SOAP: 'PHP-SOAP',
src/enums/ua-parser-enums.mjs +29 lines
--- +++ @@ -5,3 +5,3 @@ ///////////////////////////////////////////////-/*  Enums for UAParser.js v2.0.9+/*  Enums for UAParser.js v2.0.10     https://github.com/faisalman/ua-parser-js@@ -222,3 +222,2 @@     CONSOLE: 'console',-    DESKTOP: 'desktop',     EMBEDDED: 'embedded',@@ -228,3 +227,7 @@     WEARABLE: 'wearable',-    XR: 'xr'+    XR: 'xr',+    /**+     * @deprecated UAParser doesn't support `desktop` type, see https://docs.uaparser.dev/info/device/type+     */+    DESKTOP: 'desktop' });@@ -247,4 +250,7 @@     BLACKBERRY: 'BlackBerry',+    BLACKVIEW: 'Blackview',     BLU: 'BLU',     CAT: 'Cat',+    COOLPAD: 'Coolpad',+    CUBOT: 'CUBOT',     DELL: 'Dell',@@ -303,2 +309,3 @@     TESLA: 'Tesla',+    T_MOBILE: 'T-Mobile',     ULEFONE: 'Ulefone',@@ -475,2 +482,3 @@             AMAZON_CONTXBOT: 'contxbot',+            AMAZON_SEARCHBOT: 'Amzn-SearchBot',             ANTHROPIC_AI: 'anthropic-ai',@@ -479,4 +487,8 @@             ANTHROPIC_CLAUDE_WEB: 'Claude-Web',+            ARCHIVEORG_BOT: 'archive.org_bot',             ATLASSIAN_BOT: 'atlassian-bot',-            ARCHIVEORG_BOT: 'archive.org_bot',+            AUDISTO_CRAWLER: 'Audisto Crawler',+            AWARIO_BOT: 'AwarioBot',+            AWARIO_SMARTBOT: 'AwarioSmartBot',+            AWARIO_RSSBOT: 'AwarioRssBot',             BAIDU_ADS: 'Baidu-ADS',@@ -493,2 +505,3 @@             BRAVE_BOT: 'Bravebot',+            BRIGHTEDGE_CRAWLER: 'BrightEdge Crawler',             BYTEDANCE_BYTESPIDER: 'Bytespider',@@ -500,2 +513,3 @@             COHERE_TRAINING_DATA_CRAWLER: 'cohere-training-data-crawler',+            COMSCORE_PROXIMIC: 'proximic',             COTOYOGI: 'Cotoyogi',@@ -533,2 +547,3 @@             GOOGLE_STOREBOT: 'Storebot-Google',+            HEADLINE: 'Headline',             HIVE_IMAGESIFTBOT: 'ImagesiftBot',@@ -536,2 +551,3 @@             HUAWEI_PETALBOT: 'PetalBot',+            HUBSPOT_CRAWLER: 'HubSpot Crawler',             HUGGINGFACE_BOT: 'HuggingFace-Bot',@@ -546,2 +562,3 @@             MARGINALIA: 'marginalia',+            META_EXTERNALADS: 'meta-externalads',             META_EXTERNALAGENT: 'meta-externalagent',@@ -550,2 +567,3 @@             META_FACEBOOKEXTERNALHIT: 'facebookexternalhit',+            META_WEBINDEXER: 'meta-webindexer',             MAJESTIC_MJ12BOT: 'MJ12bot',@@ -589,2 +607,3 @@             XAI_BOT: 'xAI-Bot',+            YACY_BOT: 'yacybot',             YAHOO_JAPAN: 'Y!J-BRW',@@ -695,2 +714,3 @@             AMAZON_NOVA_ACT: 'NovaAct',+            AMAZON_USER: 'Amzn-User',             ANTHROPIC_CLAUDE_USER: 'Claude-User',@@ -704,4 +724,6 @@             DUCKDUCKGO_ASSISTBOT: 'DuckAssistBot',+            FEEDLY: 'Feedly',             FLIPBOARD_PROXY: 'FlipboardProxy',             GOOGLE_CHROME_LIGHTHOUSE: 'Lighthouse',+            GOOGLE_DOCS: 'GoogleDocs',             GOOGLE_FEEDFETCHER: 'FeedFetcher-Google',@@ -735,2 +757,3 @@             UPTIMEROBOT: 'UptimeRobot',+            UPTIMEBOT: 'UptimeBot',             VERCEL_FAVICON_BOT: 'vercel-favicon-bot',@@ -740,2 +763,3 @@             VERCEL_TRACING: 'verceltracing',+            VIRUSTOTAL: 'virustotal',             X_TWITTERBOT: 'Twitterbot',@@ -794,2 +818,3 @@             OCAML_COHTTP: 'ocaml-cohttp',+            PHP_CRAWL: 'phpcrawl',             PHP_SOAP: 'PHP-SOAP',
src/extensions/ua-parser-extensions.d.ts +1 lines
--- +++ @@ -1,2 +1,2 @@-// Type definitions for Helpers submodule of UAParser.js v2.0.9+// Type definitions for Helpers submodule of UAParser.js v2.0.10 // Project: https://github.com/faisalman/ua-parser-js
src/extensions/ua-parser-extensions.js +22 lines
--- +++ @@ -1,3 +1,3 @@ ///////////////////////////////////////////////-/*  Extensions for UAParser.js v2.0.9+/*  Extensions for UAParser.js v2.0.10     https://github.com/faisalman/ua-parser-js@@ -57,2 +57,3 @@             // Amazonbot - https://developer.amazon.com/amazonbot+            // Awario - https://awario.com/bots.html             // Bingbot / AdIdxBot - https://www.bing.com/webmasters/help/which-crawlers-does-bing-use-8c184ec0@@ -81,3 +82,3 @@             // YepBot - https://yep.com/yepbot/-            /((?:adidx|ahrefs|amazon|bing|brave|cc|contx|coveo|criteo|dot|duckduck(?:go-favicons-)?|exa|facebook|gpt|iask|kagi|kangaroo |linkedin|mj12|mojeek|oai-search|onespot-scraper|perplexity|sbintuitions|semrush|seznam|surdotly|swift|yep)bot)\/([\w\.-]+)/i,+            /((?:adidx|ahrefs|amazon|(?:amzn|oai)-search|awario(?:smart|rss)?|bing|brave|cc|contx|coveo|criteo|dot|duckduck(?:go-favicons-)?|exa|facebook|gpt|iask|kagi|kangaroo |linkedin|mj12|mojeek|onespot-scraper|perplexity|sbintuitions|semrush|seznam|surdotly|swift|yep)bot)\/([\w\.-]+)/i, @@ -98,4 +99,4 @@ -            // Daum-            /(daum(?:oa)?(?:-image)?)[ \/]([\w\.]+)/i,+            // Daum / HubSpot Crawler+            /(daum(?:oa)?(?:-image)?|hubspot crawler)[ \/]([\w\.]+)/i, @@ -103,3 +104,3 @@             // https://developers.facebook.com/docs/sharing/webmasters/web-crawlers-            /(facebook(?:externalhit|catalog)|meta-externalagent)\/([\w\.]+)/i,+            /(facebook(?:externalhit|catalog)|meta-(?:externalagent|externalads|webindexer))\/([\w\.]+)/i, @@ -132,8 +133,14 @@ -            // aiHitBot / Algolia Crawler / BLEXBot / Cloudflare AutoRAG / Diffbot / FirecrawlAgent / HuggingFace-Bot / Linespider / MSNBot / Magpie-Crawler / Omgilibot / OpenAI Image Downloader / PanguBot / Replicate-Bot / RunPod-Bot / Webzio-Extended / Screaming Frog SEO Spider / Startpage / Timpibot / Together-Bot / VelenPublicWebCrawler / xAI-Bot / YisouSpider / YouBot / ZumBot+            // aiHitBot / Algolia Crawler / Audisto Crawler / BLEXBot / BrightEdge Crawler / Cloudflare AutoRAG / Diffbot / FirecrawlAgent / HuggingFace-Bot / Linespider / MSNBot / Magpie-Crawler / Omgilibot / OpenAI Image Downloader / PanguBot / Replicate-Bot / RunPod-Bot / Webzio-Extended / Screaming Frog SEO Spider / Startpage / Timpibot / Together-Bot / VelenPublicWebCrawler / xAI-Bot / YisouSpider / YouBot / ZumBot             // Cotoyogi - https://ds.rois.ac.jp/en_center8/en_crawler/             // Freespoke - https://docs.freespoke.com/search/bot/-            /((?:aihit|blex|diff|huggingface-|msn|pangu|replicate-|runpod-|timpi|together-|xai-|you|zum)bot|(?:magpie-|velenpublicweb)crawler|(?:chatglm-|line|screaming frog seo |yisou)spider|cloudflare-autorag|cotoyogi|(?:firecrawl|twin)agent|freespoke|omgili(?:bot)?|openai image downloader|startpageprivateimageproxy|webzio-extended)\/?([\w\.]*)/i+            /((?:aihit|blex|diff|huggingface-|msn|pangu|replicate-|runpod-|timpi|together-|xai-|you|zum)bot|(?:audisto |brightedge |magpie-|velenpublicweb)crawler|(?:chatglm-|line|screaming frog seo |yisou)spider|cloudflare-autorag|cotoyogi|(?:firecrawl|twin)agent|freespoke|omgili(?:bot)?|openai image downloader|startpageprivateimageproxy|webzio-extended)\/?([\w\.]*)/i         ],         [NAME, VERSION, [TYPE, CRAWLER]],++        [+            // Headline - https://headline.com/legal/crawler+            /(ev-crawler)\/([\w\.]+)/i+        ],+        [[NAME, 'Headline'], VERSION, [TYPE, CRAWLER]], @@ -158,3 +165,3 @@             // Botify / Bytespider / DeepSeekBot / Qihoo 360Spider / SeekportBot / TikTokSpider-            /\b((ai2|aspiegel|atlassian-|dataforseo|deepseek|imagesift|petal|seekport|turnitin|v0)bot|360spider-?(image|video)?|baidu-ads|botify|(byte|tiktok)spider|cohere-training-data-crawler|elastic(?=\/s)|marginalia|siteimprove(?=bot|\.com)|teoma|webzio|yahoo! slurp)/i+            /\b((ai2|aspiegel|atlassian-|dataforseo|deepseek|imagesift|petal|seekport|turnitin|v0|yacy)bot|360spider-?(image|video)?|baidu-ads|botify|(byte|tiktok)spider|cohere-training-data-crawler|elastic(?=\/s)|marginalia|proximic|siteimprove(?=bot|\.com)|teoma|webzio|yahoo! slurp)/i         ], @@ -308,2 +315,3 @@             // DuckAssistBot - https://duckduckgo.com/duckassistbot/+            // Feedly - https://feedly.com/fetcher.html             // FlipboardProxy - https://about.flipboard.com/proxy-service/@@ -314,3 +322,3 @@             // Yandex Bots - https://yandex.com/bots-            /(asana|ahrefssiteaudit|(?:bing|microsoft)preview|blueno|(?:chatgpt|claude|mistralai|perplexity)-user|cohere-ai|flipboardproxy|hubspot page fetcher|mastodon|(?:bitly|bufferlinkpreview|discord|duckassist|linkedin|pinterest|reddit|roger|siteaudit|twitter|uptimero|zoom)bot|google-site-verification|iframely|kakaotalk-scrap|meta-externalfetcher|y!?j-dlc|yandex(?:calendar|direct(?:dyn)?|fordomain|pagechecker|searchshop)|yadirectfetcher|whatsapp)\/([\w\.]+)/i,+            /(asana|ahrefssiteaudit|(?:bing|microsoft)preview|blueno|(?:amzn|chatgpt|claude|mistralai|perplexity)-user|cohere-ai|flipboardproxy|hubspot page fetcher|mastodon|(?:bitly|bufferlinkpreview|discord|duckassist|linkedin|pinterest|reddit|roger|siteaudit|twitter|uptime(?:ro)?|zoom)bot|google-site-verification|iframely|kakaotalk-scrap|meta-externalfetcher|y!?j-dlc|yandex(?:calendar|direct(?:dyn)?|fordomain|pagechecker|searchshop)|yadirectfetcher|whatsapp)\/([\w\.]+)/i, @@ -318,2 +326,5 @@             /(bluesky) cardyb\/([\w\.]+)/i,++            // Feedly+            /(feedly)(?:bot)?\/([\w\.]+)/i, @@ -332,3 +343,3 @@             // Google Bots / Chrome-Lighthouse / Gemini-Deep-Research / KeybaseBot / Snapchat / Vercelbot / Yandex Bots-            /((?:better uptime |keybase|telegram|vercel)bot|lighthouse$|feedfetcher-google|gemini-deep-research|google(?:imageproxy|-read-aloud|-pagerenderer|producer)|snap url preview|vercel(flags|tracing|-(favicon|screenshot)-bot)|yandex(?:sitelinks|userproxy))/i+            /((?:better uptime |keybase|telegram|vercel)bot|lighthouse$|feedfetcher-google|gemini-deep-research|google(?:docs|imageproxy|-read-aloud|-pagerenderer|producer)|snap url preview|vercel(flags|tracing|-(favicon|screenshot)-bot)|virustotal(?=cloud)|yandex(?:sitelinks|userproxy))/i         ], @@ -442,3 +453,3 @@         ], [NAME, VERSION, [TYPE, LIBRARY]], [-            /(node-fetch|undici)/i+            /(node-fetch|phpcrawl|undici)/i         ], [NAME, [TYPE, LIBRARY]]
src/extensions/ua-parser-extensions.mjs +22 lines
--- +++ @@ -5,3 +5,3 @@ ///////////////////////////////////////////////-/*  Extensions for UAParser.js v2.0.9+/*  Extensions for UAParser.js v2.0.10     https://github.com/faisalman/ua-parser-js@@ -61,2 +61,3 @@             // Amazonbot - https://developer.amazon.com/amazonbot+            // Awario - https://awario.com/bots.html             // Bingbot / AdIdxBot - https://www.bing.com/webmasters/help/which-crawlers-does-bing-use-8c184ec0@@ -85,3 +86,3 @@             // YepBot - https://yep.com/yepbot/-            /((?:adidx|ahrefs|amazon|bing|brave|cc|contx|coveo|criteo|dot|duckduck(?:go-favicons-)?|exa|facebook|gpt|iask|kagi|kangaroo |linkedin|mj12|mojeek|oai-search|onespot-scraper|perplexity|sbintuitions|semrush|seznam|surdotly|swift|yep)bot)\/([\w\.-]+)/i,+            /((?:adidx|ahrefs|amazon|(?:amzn|oai)-search|awario(?:smart|rss)?|bing|brave|cc|contx|coveo|criteo|dot|duckduck(?:go-favicons-)?|exa|facebook|gpt|iask|kagi|kangaroo |linkedin|mj12|mojeek|onespot-scraper|perplexity|sbintuitions|semrush|seznam|surdotly|swift|yep)bot)\/([\w\.-]+)/i, @@ -102,4 +103,4 @@ -            // Daum-            /(daum(?:oa)?(?:-image)?)[ \/]([\w\.]+)/i,+            // Daum / HubSpot Crawler+            /(daum(?:oa)?(?:-image)?|hubspot crawler)[ \/]([\w\.]+)/i, @@ -107,3 +108,3 @@             // https://developers.facebook.com/docs/sharing/webmasters/web-crawlers-            /(facebook(?:externalhit|catalog)|meta-externalagent)\/([\w\.]+)/i,+            /(facebook(?:externalhit|catalog)|meta-(?:externalagent|externalads|webindexer))\/([\w\.]+)/i, @@ -136,8 +137,14 @@ -            // aiHitBot / Algolia Crawler / BLEXBot / Cloudflare AutoRAG / Diffbot / FirecrawlAgent / HuggingFace-Bot / Linespider / MSNBot / Magpie-Crawler / Omgilibot / OpenAI Image Downloader / PanguBot / Replicate-Bot / RunPod-Bot / Webzio-Extended / Screaming Frog SEO Spider / Startpage / Timpibot / Together-Bot / VelenPublicWebCrawler / xAI-Bot / YisouSpider / YouBot / ZumBot+            // aiHitBot / Algolia Crawler / Audisto Crawler / BLEXBot / BrightEdge Crawler / Cloudflare AutoRAG / Diffbot / FirecrawlAgent / HuggingFace-Bot / Linespider / MSNBot / Magpie-Crawler / Omgilibot / OpenAI Image Downloader / PanguBot / Replicate-Bot / RunPod-Bot / Webzio-Extended / Screaming Frog SEO Spider / Startpage / Timpibot / Together-Bot / VelenPublicWebCrawler / xAI-Bot / YisouSpider / YouBot / ZumBot             // Cotoyogi - https://ds.rois.ac.jp/en_center8/en_crawler/             // Freespoke - https://docs.freespoke.com/search/bot/-            /((?:aihit|blex|diff|huggingface-|msn|pangu|replicate-|runpod-|timpi|together-|xai-|you|zum)bot|(?:magpie-|velenpublicweb)crawler|(?:chatglm-|line|screaming frog seo |yisou)spider|cloudflare-autorag|cotoyogi|(?:firecrawl|twin)agent|freespoke|omgili(?:bot)?|openai image downloader|startpageprivateimageproxy|webzio-extended)\/?([\w\.]*)/i+            /((?:aihit|blex|diff|huggingface-|msn|pangu|replicate-|runpod-|timpi|together-|xai-|you|zum)bot|(?:audisto |brightedge |magpie-|velenpublicweb)crawler|(?:chatglm-|line|screaming frog seo |yisou)spider|cloudflare-autorag|cotoyogi|(?:firecrawl|twin)agent|freespoke|omgili(?:bot)?|openai image downloader|startpageprivateimageproxy|webzio-extended)\/?([\w\.]*)/i         ],         [NAME, VERSION, [TYPE, CRAWLER]],++        [+            // Headline - https://headline.com/legal/crawler+            /(ev-crawler)\/([\w\.]+)/i+        ],+        [[NAME, 'Headline'], VERSION, [TYPE, CRAWLER]], @@ -162,3 +169,3 @@             // Botify / Bytespider / DeepSeekBot / Qihoo 360Spider / SeekportBot / TikTokSpider-            /\b((ai2|aspiegel|atlassian-|dataforseo|deepseek|imagesift|petal|seekport|turnitin|v0)bot|360spider-?(image|video)?|baidu-ads|botify|(byte|tiktok)spider|cohere-training-data-crawler|elastic(?=\/s)|marginalia|siteimprove(?=bot|\.com)|teoma|webzio|yahoo! slurp)/i+            /\b((ai2|aspiegel|atlassian-|dataforseo|deepseek|imagesift|petal|seekport|turnitin|v0|yacy)bot|360spider-?(image|video)?|baidu-ads|botify|(byte|tiktok)spider|cohere-training-data-crawler|elastic(?=\/s)|marginalia|proximic|siteimprove(?=bot|\.com)|teoma|webzio|yahoo! slurp)/i         ], @@ -312,2 +319,3 @@             // DuckAssistBot - https://duckduckgo.com/duckassistbot/+            // Feedly - https://feedly.com/fetcher.html             // FlipboardProxy - https://about.flipboard.com/proxy-service/@@ -318,3 +326,3 @@             // Yandex Bots - https://yandex.com/bots-            /(asana|ahrefssiteaudit|(?:bing|microsoft)preview|blueno|(?:chatgpt|claude|mistralai|perplexity)-user|cohere-ai|flipboardproxy|hubspot page fetcher|mastodon|(?:bitly|bufferlinkpreview|discord|duckassist|linkedin|pinterest|reddit|roger|siteaudit|twitter|uptimero|zoom)bot|google-site-verification|iframely|kakaotalk-scrap|meta-externalfetcher|y!?j-dlc|yandex(?:calendar|direct(?:dyn)?|fordomain|pagechecker|searchshop)|yadirectfetcher|whatsapp)\/([\w\.]+)/i,+            /(asana|ahrefssiteaudit|(?:bing|microsoft)preview|blueno|(?:amzn|chatgpt|claude|mistralai|perplexity)-user|cohere-ai|flipboardproxy|hubspot page fetcher|mastodon|(?:bitly|bufferlinkpreview|discord|duckassist|linkedin|pinterest|reddit|roger|siteaudit|twitter|uptime(?:ro)?|zoom)bot|google-site-verification|iframely|kakaotalk-scrap|meta-externalfetcher|y!?j-dlc|yandex(?:calendar|direct(?:dyn)?|fordomain|pagechecker|searchshop)|yadirectfetcher|whatsapp)\/([\w\.]+)/i, @@ -322,2 +330,5 @@             /(bluesky) cardyb\/([\w\.]+)/i,++            // Feedly+            /(feedly)(?:bot)?\/([\w\.]+)/i, @@ -336,3 +347,3 @@             // Google Bots / Chrome-Lighthouse / Gemini-Deep-Research / KeybaseBot / Snapchat / Vercelbot / Yandex Bots-            /((?:better uptime |keybase|telegram|vercel)bot|lighthouse$|feedfetcher-google|gemini-deep-research|google(?:imageproxy|-read-aloud|-pagerenderer|producer)|snap url preview|vercel(flags|tracing|-(favicon|screenshot)-bot)|yandex(?:sitelinks|userproxy))/i+            /((?:better uptime |keybase|telegram|vercel)bot|lighthouse$|feedfetcher-google|gemini-deep-research|google(?:docs|imageproxy|-read-aloud|-pagerenderer|producer)|snap url preview|vercel(flags|tracing|-(favicon|screenshot)-bot)|virustotal(?=cloud)|yandex(?:sitelinks|userproxy))/i         ], @@ -446,3 +457,3 @@         ], [NAME, VERSION, [TYPE, LIBRARY]], [-            /(node-fetch|undici)/i+            /(node-fetch|phpcrawl|undici)/i         ], [NAME, [TYPE, LIBRARY]]
src/helpers/ua-parser-helpers.d.ts +1 lines
--- +++ @@ -1,2 +1,2 @@-// Type definitions for Helpers submodule of UAParser.js v2.0.9+// Type definitions for Helpers submodule of UAParser.js v2.0.10 // Project: https://github.com/faisalman/ua-parser-js
src/helpers/ua-parser-helpers.js +2 lines
--- +++ @@ -1,3 +1,3 @@ ///////////////////////////////////////////////-/*  Helpers for UAParser.js v2.0.9+/*  Helpers for UAParser.js v2.0.10     https://github.com/faisalman/ua-parser-js@@ -43,3 +43,3 @@  */-const isElectron = () => _isElectron;+const isElectron = _isElectron; 
src/helpers/ua-parser-helpers.mjs +2 lines
--- +++ @@ -5,3 +5,3 @@ ///////////////////////////////////////////////-/*  Helpers for UAParser.js v2.0.9+/*  Helpers for UAParser.js v2.0.10     https://github.com/faisalman/ua-parser-js@@ -47,3 +47,3 @@  */-const isElectron = () => _isElectron;+const isElectron = _isElectron; 
src/main/ua-parser.d.ts +11 lines
--- +++ @@ -1,2 +1,2 @@-// Type definitions for UAParser.js v2.0.9+// Type definitions for UAParser.js v2.0.10 // Project: https://github.com/faisalman/ua-parser-js@@ -7,2 +7,7 @@ declare namespace UAParser {++    type BrowserTypes = typeof BrowserType[keyof typeof BrowserType];+    type CPUArchs = typeof CPUArch[keyof typeof CPUArch];+    type DeviceTypes = typeof DeviceType[keyof typeof DeviceType];+    type EngineNames = typeof EngineName[keyof typeof EngineName];     @@ -19,3 +24,3 @@         major?: string;-        type?: typeof BrowserType[keyof typeof BrowserType];+        type?: BrowserTypes;     }@@ -23,3 +28,3 @@     interface ICPU extends IData<ICPU> {-        architecture?: typeof CPUArch[keyof typeof CPUArch];+        architecture?: CPUArchs;     }@@ -27,3 +32,3 @@     interface IDevice extends IData<IDevice> {-        type?: typeof DeviceType[keyof typeof DeviceType];+        type?: DeviceTypes;         vendor?: string;@@ -33,3 +38,3 @@     interface IEngine extends IData<IEngine> {-        name?: typeof EngineName[keyof typeof EngineName];+        name?: EngineNames;         version?: string;@@ -107,2 +112,3 @@         setUA(uastring: string): UAParser;+        useExtension(extensions: UAParserExt): UAParser;     }
webpack npm
5.107.2 6d ago incident on record
critical-tier DELETIONBURST ×33
latest 5.107.2 versions 875 maintainers 8 critical-tier (snapshotted)
5.104.1
5.105.0
5.105.1
5.105.2
5.105.3
5.105.4
5.106.0
5.106.1
5.106.2
5.107.0
5.107.1
5.107.2
DELETION
1.0.2 published then removed
high · registry-verified · 2014-02-27 · 12y ago
BURST
5 releases in 45m: 0.1.0, 0.1.1, 0.1.2, 0.1.3, 0.1.4
info · registry-verified · 2012-03-11 · 14y ago
BURST
2 releases in 16m: 0.2.1, 0.2.2
info · registry-verified · 2012-03-14 · 14y ago
BURST
2 releases in 9m: 0.2.6, 0.2.7
info · registry-verified · 2012-03-19 · 14y ago
BURST
2 releases in 3m: 0.3.3, 0.3.4
info · registry-verified · 2012-04-07 · 14y ago
BURST
2 releases in 10m: 0.3.6, 0.3.7
info · registry-verified · 2012-05-01 · 14y ago
BURST
2 releases in 9m: 0.3.10, 0.3.11
info · registry-verified · 2012-05-02 · 14y ago
BURST
2 releases in 46m: 0.3.16, 0.3.17
info · registry-verified · 2012-05-12 · 14y ago
BURST
3 releases in 19m: 0.3.18, 0.3.19, 0.3.20
info · registry-verified · 2012-05-13 · 14y ago
BURST
2 releases in 7m: 0.4.5, 0.4.6
info · registry-verified · 2012-05-20 · 14y ago
BURST
2 releases in 8m: 0.4.17, 0.4.18
info · registry-verified · 2012-07-11 · 13y ago
BURST
2 releases in 13m: 0.5.0, 0.5.1
info · registry-verified · 2012-08-06 · 13y ago
BURST
2 releases in 45m: 0.5.2, 0.5.3
info · registry-verified · 2012-08-07 · 13y ago
BURST
4 releases in 50m: 0.5.4, 0.5.5, 0.5.6, 0.5.7
info · registry-verified · 2012-08-07 · 13y ago
BURST
2 releases in 56m: 0.7.0, 0.7.1
info · registry-verified · 2012-10-08 · 13y ago
BURST
2 releases in 4m: 0.7.4, 0.7.5
info · registry-verified · 2012-10-21 · 13y ago
BURST
2 releases in 53m: 0.7.6, 0.7.7
info · registry-verified · 2012-10-25 · 13y ago
BURST
4 releases in 23m: 0.7.13, 0.7.14, 0.7.15, 0.7.16
info · registry-verified · 2012-11-05 · 13y ago
BURST
2 releases in 17m: 0.11.1, 0.11.2
info · registry-verified · 2013-11-03 · 12y ago
BURST
2 releases in 26m: 0.11.4, 0.11.5
info · registry-verified · 2013-11-06 · 12y ago
BURST
2 releases in 17m: 0.11.17, 0.11.18
info · registry-verified · 2013-12-31 · 12y ago
BURST
2 releases in 9m: 1.0.2, 1.0.3
info · registry-verified · 2014-02-27 · 12y ago
BURST
2 releases in 23m: 1.3.4, 1.3.5
info · registry-verified · 2014-08-25 · 11y ago
BURST
2 releases in 3m: 1.5.2, 1.5.3
info · registry-verified · 2015-01-21 · 11y ago
BURST
2 releases in 44m: 1.9.1, 1.9.2
info · registry-verified · 2015-05-10 · 11y ago
BURST
2 releases in 59m: 1.10.4, 1.10.5
info · registry-verified · 2015-07-23 · 10y ago
BURST
2 releases in 60m: 1.12.7, 1.12.8
info · registry-verified · 2015-11-20 · 10y ago
BURST
2 releases in 31m: 4.4.0, 4.4.1
info · registry-verified · 2018-03-29 · 8y ago
BURST
2 releases in 11m: 4.35.1, 4.35.2
info · registry-verified · 2019-07-01 · 6y ago
BURST
2 releases in 9m: 4.40.3, 4.41.0
info · registry-verified · 2019-09-24 · 6y ago
BURST
2 releases in 54m: 5.2.1, 5.3.0
info · registry-verified · 2020-10-27 · 5y ago
BURST
2 releases in 5m: 4.45.0, 5.12.0
info · registry-verified · 2021-01-08 · 5y ago
BURST
2 releases in 43m: 5.31.1, 5.31.2
info · registry-verified · 2021-04-09 · 5y ago
BURST
2 releases in 40m: 5.33.0, 5.33.1
info · registry-verified · 2021-04-14 · 5y ago
release diff 5.107.1 → 5.107.2
+0 added · -0 removed · ~24 modified
lib/Compiler.js +27 lines
--- +++ @@ -494,2 +494,21 @@ 	/**+	 * Release fields on a finished compilation that nothing reads after emit,+	 * so the heap can shrink while user code still holds the Stats reference.+	 * Recurses into child compilations. Stats output is preserved — only+	 * codeGen byproducts are dropped.+	 * @param {Compilation} compilation finished compilation to slim down+	 * @returns {void}+	 */+	_releaseUnusedCompilationData(compilation) {+		for (const child of compilation.children) {+			this._releaseUnusedCompilationData(child);+		}+		// Rendered source per (module × runtime) — used only during seal/emit,+		// never read by Stats, and not serialized to the persistent cache.+		if (compilation.codeGenerationResults !== undefined) {+			compilation.codeGenerationResults.map.clear();+		}+	}++	/** 	 * Returns a compiler watcher.@@ -1441,5 +1460,10 @@ 			if (err) return callback(err);-			// Get rid of reference to last compilation to avoid leaking memory-			// We can't run this._cleanupLastCompilation() as the Stats to this compilation-			// might be still in use. We try to get rid of the reference to the cache instead.+			// Defer a microtask so a close() made inside the run callback can't+			// release codeGenerationResults before afterDone fires on the same stack.+			const lastCompilation = this._lastCompilation;+			if (lastCompilation !== undefined) {+				Promise.resolve().then(() => {+					this._releaseUnusedCompilationData(lastCompilation);+				});+			} 			this._lastCompilation = undefined;
lib/ContextModuleFactory.js +47 lines
--- +++ @@ -381,2 +381,4 @@ 				}+				/** @type {ContextAlternativeRequest[]} */+				const fileObjs = []; 				asyncLib.map(@@ -406,37 +408,12 @@ 								) {-									/** @type {{ context: string, request: string }} */-									const obj = {+									// Collect for a single batched alternativeRequests call+									// per directory below. Calling the hook once per file+									// would pay per-call overhead (closure, resolverFactory+									// lookup, array allocations) for every file in the+									// context — which is the bulk of work on rebuilds.+									fileObjs.push({ 										context: ctx, 										request: `.${subResource.slice(ctx.length).replace(/\\/g, "/")}`-									};--									this.hooks.alternativeRequests.callAsync(-										[obj],-										options,-										(err, alternatives) => {-											if (err) return callback(err);-											callback(-												null,-												/** @type {ContextAlternativeRequest[]} */-												(alternatives)-													.filter((obj) =>-														regExp.test(/** @type {string} */ (obj.request))-													)-													.map((obj) => {-														const dep = new ContextElementDependency(-															`${obj.request}${resourceQuery}${resourceFragment}`,-															obj.request,-															typePrefix,-															/** @type {string} */-															(category),-															referencedExports,-															obj.context,-															attributes-														);-														dep.optional = true;-														return dep;-													})-											);-										}-									);+									});+									callback(); 								} else {@@ -452,4 +429,2 @@ -						if (!result) return callback(null, []);- 						/** @type {ContextElementDependency[]} */@@ -457,7 +432,39 @@ -						for (const item of result) {-							if (item) flattenedResult.push(...item);-						}--						callback(null, flattenedResult);+						if (result) {+							for (const item of result) {+								if (item) flattenedResult.push(...item);+							}+						}++						if (fileObjs.length === 0) {+							return callback(null, flattenedResult);+						}++						this.hooks.alternativeRequests.callAsync(+							fileObjs,+							options,+							(err, alternatives) => {+								if (err) return callback(err);+								for (const alt of /** @type {ContextAlternativeRequest[]} */ (+									alternatives+								)) {+									if (!regExp.test(/** @type {string} */ (alt.request))) {+										continue;+									}+									const dep = new ContextElementDependency(+										`${alt.request}${resourceQuery}${resourceFragment}`,+										alt.request,+										typePrefix,+										/** @type {string} */+										(category),+										referencedExports,+										alt.context,+										attributes+									);+									dep.optional = true;+									flattenedResult.push(dep);+								}+								callback(null, flattenedResult);+							}+						); 					}
lib/MultiCompiler.js +14 lines
--- +++ @@ -130,2 +130,16 @@ 			});+			// Release fields on this child's Compilation once it's done. The+			// stage: Infinity tap runs after every afterDone tap at a lower+			// stage, so plugins observing compilation state in afterDone still+			// see it intact. Stats remains usable; only fields Stats never reads+			// (and that the persistent cache never serializes) are dropped.++			compiler.hooks.afterDone.tap(+				{ name: CLASS_NAME, stage: Infinity },+				(stats) => {+					if (stats !== undefined) {+						compiler._releaseUnusedCompilationData(stats.compilation);+					}+				}+			); 		}
lib/NormalModule.js +462 lines
--- +++ @@ -88,3 +88,2 @@ /** @typedef {import("./ModuleGraphConnection").ConnectionState} ConnectionState */-/** @typedef {Iterator<SideEffectsWalk, ConnectionState, ConnectionState>} SideEffectsWalk */ /** @typedef {import("./NormalModuleFactory")} NormalModuleFactory */@@ -158,23 +157,397 @@ +// Maximum recursive descent depth before switching to the iterative walker.+// #20986 reported overflow around 1300 modules in webpack 5.107.0 where each+// step consumed two stack frames (`NormalModule.getSideEffectsConnectionState`+// plus `HarmonyImportSideEffectDependency.getModuleEvaluationSideEffectsState`).+// `walkSideEffectsRecursive` folds the second call into the first and uses+// one frame per module, so this limit caps the native stack at half the depth+// where the original code overflowed — well within the safe range across+// platforms while keeping the common (shallow) case purely recursive.+const SIDE_EFFECTS_RECURSION_LIMIT = 2000;+ /**- * Generator form of `getSideEffectsConnectionState` — descends through- * `HarmonyImportSideEffectDependency` via `yield` so the trampoline in- * `getSideEffectsConnectionState` can drive the walk iteratively (#20986).- * @param {NormalModule} mod the module being evaluated+ * Iterative form of the side-effects walker. Used as a fallback once the+ * recursive form reaches `SIDE_EFFECTS_RECURSION_LIMIT` so deep chains+ * (#20986) don't overflow V8's stack. Safe to enter while ancestors set+ * `_isEvaluatingSideEffects` on their own modules — those are treated as+ * `CIRCULAR_CONNECTION` if revisited, matching the original recursive+ * behavior.+ * @param {NormalModule} rootMod the module to walk  * @param {ModuleGraph} moduleGraph the module graph- * @returns {SideEffectsWalk} the generator+ * @returns {ConnectionState} the side-effects connection state  */-function* walkSideEffects(mod, moduleGraph) {-	if (mod.factoryMeta !== undefined) {-		if (mod.factoryMeta.sideEffectFree) return false;-		if (mod.factoryMeta.sideEffectFree === false) return true;-	}-	if (!(mod.buildMeta !== undefined && mod.buildMeta.sideEffectFree)) {-		return true;-	}-	if (mod._isEvaluatingSideEffects) {-		return ModuleGraphConnection.CIRCULAR_CONNECTION;-	}-+const walkSideEffectsIterative = (rootMod, moduleGraph) => { 	const SideEffectDep = getHarmonyImportSideEffectDependency();++	/** @type {NormalModule[]} */+	const modStack = [rootMod];+	/** @type {Dependency[][]} */+	const depsStack = [rootMod.dependencies];+	const indexStack = [0];+	/** @type {ConnectionState[]} */+	const currentStack = [false];+	rootMod._isEvaluatingSideEffects = true;++	/**+	 * Result from a just-popped child frame, to be applied to the new+	 * top's current dep. `undefined` means "no pending; advance".+	 * @type {ConnectionState | undefined}+	 */+	let pending;++	while (modStack.length > 0) {+		const top = modStack.length - 1;+		const topMod = modStack[top];+		const deps = depsStack[top];+		let index = indexStack[top];+		let current = currentStack[top];++		if (pending !== undefined) {+			const state = pending;+			pending = undefined;+			const dep = deps[index];++			if (state === true) {+				recordSideEffectsBailout(topMod, moduleGraph, dep);+				topMod._isEvaluatingSideEffects = false;+				// `true` is monotonic — safe to memoize regardless of cycle+				// status, matching the direct-bailout branch below.+				topMod._sideEffectsStateGraph = moduleGraph;+				topMod._sideEffectsStateValue = true;+				modStack.pop();+				depsStack.pop();+				indexStack.pop();+				currentStack.pop();+				pending = true;+				continue;+			}+			if (state !== ModuleGraphConnection.CIRCULAR_CONNECTION) {+				current = ModuleGraphConnection.addConnectionStates(current, state);+			}+			index++;+		}++		let descended = false;+		const depCount = deps.length;+		while (index < depCount) {+			const dep = deps[index];+			/** @type {ConnectionState} */+			let state;++			if (dep instanceof SideEffectDep) {+				const refModule = moduleGraph.getModule(dep);+				if (!refModule) {+					state = true;+				} else if (refModule instanceof NormalModule) {+					// Cache hit+					if (refModule._sideEffectsStateGraph === moduleGraph) {+						state = /** @type {ConnectionState} */ (+							refModule._sideEffectsStateValue+						);+					}+					// Fast-path checks inlined to avoid the helper call.+					else if (refModule.factoryMeta !== undefined) {+						if (refModule.factoryMeta.sideEffectFree) {+							state = false;+						} else if (refModule.factoryMeta.sideEffectFree === false) {+							state = true;+						} else if (+							!(+								refModule.buildMeta !== undefined &&+								refModule.buildMeta.sideEffectFree+							)+						) {+							state = true;+						} else if (refModule._isEvaluatingSideEffects) {+							_sideEffectsCircularSeen = true;+							state = ModuleGraphConnection.CIRCULAR_CONNECTION;+						} else {+							// Descend+							indexStack[top] = index;+							currentStack[top] = current;+							refModule._isEvaluatingSideEffects = true;+							modStack.push(refModule);+							depsStack.push(refModule.dependencies);+							indexStack.push(0);+							currentStack.push(false);+							descended = true;+							break;+						}+					} else if (+						!(+							refModule.buildMeta !== undefined &&+							refModule.buildMeta.sideEffectFree+						)+					) {+						state = true;+					} else if (refModule._isEvaluatingSideEffects) {+						_sideEffectsCircularSeen = true;+						state = ModuleGraphConnection.CIRCULAR_CONNECTION;+					} else {+						// Descend+						indexStack[top] = index;+						currentStack[top] = current;+						refModule._isEvaluatingSideEffects = true;+						modStack.push(refModule);+						depsStack.push(refModule.dependencies);+						indexStack.push(0);+						currentStack.push(false);+						descended = true;+						break;+					}+				} else {+					_sideEffectsCircularSeen = true;+					state = refModule.getSideEffectsConnectionState(moduleGraph);+				}+			} else {+				state = dep.getModuleEvaluationSideEffectsState(moduleGraph);+			}++			if (state === true) {+				recordSideEffectsBailout(topMod, moduleGraph, dep);+				topMod._isEvaluatingSideEffects = false;+				topMod._sideEffectsStateGraph = moduleGraph;+				topMod._sideEffectsStateValue = true;+				modStack.pop();+				depsStack.pop();+				indexStack.pop();+				currentStack.pop();+				pending = true;+				descended = true;+				break;+			}+			if (state !== ModuleGraphConnection.CIRCULAR_CONNECTION) {+				current = ModuleGraphConnection.addConnectionStates(current, state);+			}+			index++;+		}++		if (descended) continue;++		topMod._isEvaluatingSideEffects = false;+		if (!_sideEffectsCircularSeen) {+			topMod._sideEffectsStateGraph = moduleGraph;+			topMod._sideEffectsStateValue = current;+		}+		pending = current;+		modStack.pop();+		depsStack.pop();+		indexStack.pop();+		currentStack.pop();+	}++	return /** @type {ConnectionState} */ (pending);+};++/**+ * Tracks whether a cycle (CIRCULAR_CONNECTION) was encountered anywhere+ * in the currently-executing walk. The walker uses this to decide whether+ * an intermediate result is safe to memoize on the module: a result+ * computed in the presence of a cycle can differ from the result computed+ * fresh, because cycle short-circuiting hides the contribution of the+ * back-edge target. Reset to `false` at the top-level entry; read and+ * propagated by each recursive frame.+ */+let _sideEffectsCircularSeen = false;++/**+ * Walks back up a stack of linear-chain ancestors, applying the result+ * `state` of the chain's tail to each ancestor. Each ancestor in the+ * stack had exactly one `HarmonyImportSideEffectDependency` returning+ * `state`, so its result is just `state` (with the usual aggregation+ * rules) and we can avoid building per-frame `current` accumulators.+ * @param {(NormalModule | Dependency)[] | null} ancestors interleaved stack of `[mod, sideEffectDep, mod, sideEffectDep, …]` in descent order; `null` if there were none+ * @param {ConnectionState} state result from the chain's tail+ * @param {ModuleGraph} moduleGraph the module graph+ * @returns {ConnectionState} the root ancestor's result+ */+const propagateLinearResult = (ancestors, state, moduleGraph) => {+	if (ancestors === null) return state;+	while (ancestors.length > 0) {+		const dep = /** @type {Dependency} */ (ancestors.pop());+		const ancestor = /** @type {NormalModule} */ (ancestors.pop());+		ancestor._isEvaluatingSideEffects = false;++		if (state === true) {+			recordSideEffectsBailout(ancestor, moduleGraph, dep);+			// `true` is monotonic — safe to cache regardless of cycle status.+			ancestor._sideEffectsStateGraph = moduleGraph;+			ancestor._sideEffectsStateValue = true;+		} else if (state === ModuleGraphConnection.CIRCULAR_CONNECTION) {+			// CIRCULAR_CONNECTION is filtered before folding into `current`,+			// so the ancestor's `current` stays at its initial `false`. From+			// this point upward the propagated state is `false`, and the+			// cycle taint prevents memoization further up (handled by+			// `_sideEffectsCircularSeen`).+			state = false;
… 308 more lines (truncated)
lib/ProgressPlugin.js +1 lines
--- +++ @@ -152,3 +152,3 @@  * @param {Logger} logger logger- * @param {ProgressBarOptions | false} progressBar render bar+ * @param {ProgressBarOptions | false=} progressBar render bar  * @returns {HandlerFn} default handler
lib/SourceMapDevToolPlugin.js +102 lines
--- +++ @@ -38,3 +38,2 @@  * @typedef {object} SourceMapTask- * @property {Source} asset  * @property {AssetInfo} assetInfo@@ -44,2 +43,3 @@  * @property {RawSourceMap} sourceMap+ * @property {Source} mapSource the Source instance whose `sourceAndMap` we called (the current asset or, when its map was already stripped, the pinned original from `originalSources`) — what `clearCache` should target  * @property {ItemCacheFacade} cacheItem cache item@@ -113,3 +113,5 @@  * — while the map is taken from the pinned original Source when the current- * one no longer carries it.+ * one no longer carries it. `mapSource` identifies which Source instance was+ * actually queried for the map (the current asset, or the pinned original);+ * that's the one whose internal caches the caller should release.  * @param {string} file file name@@ -118,3 +120,3 @@  * @param {Map<string, Source>} registry compilation-scoped original-source registry- * @returns {{ source: string, sourceMap: RawSourceMap } | undefined} extracted pair or `undefined` when no map is recoverable+ * @returns {{ source: string, sourceMap: RawSourceMap, mapSource: Source } | undefined} extracted pair or `undefined` when no map is recoverable  */@@ -141,16 +143,16 @@ 		if (!registry.has(file)) registry.set(file, asset);-	} else {-		// The current asset (typically a `RawSource` left by an earlier-		// SourceMapDevToolPlugin instance) has no internal map. Re-extract-		// the map from the original Source we pinned earlier. We keep using-		// `source` from the current asset so that any prior wrappers (e.g.-		// appended sourceMappingURL comments) are preserved.-		const original = registry.get(file);-		if (!original) return;-		sourceMap = original.sourceAndMap-			? original.sourceAndMap(options).map-			: original.map(options);-		if (!sourceMap) return;+		return { source, sourceMap, mapSource: asset }; 	}-	return { source, sourceMap };+	// The current asset (typically a `RawSource` left by an earlier+	// SourceMapDevToolPlugin instance) has no internal map. Re-extract+	// the map from the original Source we pinned earlier. We keep using+	// `source` from the current asset so that any prior wrappers (e.g.+	// appended sourceMappingURL comments) are preserved.+	const original = registry.get(file);+	if (!original) return;+	sourceMap = original.sourceAndMap+		? original.sourceAndMap(options).map+		: original.map(options);+	if (!sourceMap) return;+	return { source, sourceMap, mapSource: original }; };@@ -179,3 +181,3 @@ 	if (!extracted) return;-	const { source, sourceMap } = extracted;+	const { source, sourceMap, mapSource } = extracted; 	const context = compilation.options.context;@@ -192,3 +194,2 @@ 		file,-		asset, 		source: /** @type {string} */ (source),@@ -196,2 +197,3 @@ 		sourceMap,+		mapSource, 		modules,@@ -362,2 +364,21 @@ +					// Shared deduplication set for `Source#clearCache` calls below.+					// Webpack chunks routinely share module-level `CachedSource`+					// instances. A per-call WeakSet would re-walk those shared+					// subtrees once per chunk — 50 chunks × thousands of shared+					// modules in dev/non-minified setups — and worse, every+					// chunk's `sourceAndMap` would have to recompute the cleared+					// caches, churning allocations (measured: +700 MB peak RSS,+					// +6 s wall time on a 50×1000 synthetic build).+					//+					// Sharing one set lets each shared subtree be walked exactly+					// once. The trade-off is that subsequent chunks' `sourceAndMap`+					// calls can repopulate a shared module's `_cachedMaps` after+					// its own clear was skipped (because the module is already in+					// the visited set), leaving at most one populated cache entry+					// per shared module at the end of the run — bounded to a few+					// MB even at the scale of #20961. That's strictly preferable+					// to the alternative's hundreds of MB of transient peak RSS.+					const clearCacheVisited = new WeakSet();+ 					asyncLib.each(@@ -459,2 +480,40 @@ 								);++								// Release the per-instance caches that `sourceAndMap`+								// just populated. The composed map (and, for+								// `SourceMapSource`, the parsed `_sourceMapAsObject` /+								// `_innerSourceMapAsObject`) otherwise sit on the+								// CachedSource — and every shared child — until phase+								// 2 replaces the asset, which is what causes the OOM+								// spike on builds with thousands of chunks+								// (webpack#20961). Keep `source` since downstream+								// consumers reading the original asset still need it;+								// `hash`/`size` default to retained because they're+								// cheap to keep but expensive to rebuild.+								// `clearCacheVisited` is shared across every call (see+								// its declaration above for the rationale).+								//+								// Target `task.mapSource` (not `asset.source`): when+								// `extractSourceAndMap` falls back to the pinned+								// original (the current asset is a `RawSource` left+								// by an earlier plugin instance), the `sourceAndMap`+								// call populated the original's caches, not the+								// current asset's.+								//+								// Feature-detected: `clearCache` landed in+								// `webpack-sources` 3.5, but `compilation.assets` may+								// hold `Source`-like instances from a third-party+								// plugin built against an older copy of+								// `webpack-sources` (or a hand-rolled implementation).+								// Calling it unconditionally would throw on those.+								if (task && typeof task.mapSource.clearCache === "function") {+									task.mapSource.clearCache(+										{+											maps: true,+											source: false,+											parsedMap: true+										},+										clearCacheVisited+									);+								} @@ -700,4 +759,15 @@ -									const sourceMapString = JSON.stringify(outputSourceMap); 									if (sourceMapFilename) {+										// External `.map` file: hold the serialized map as a+										// `Buffer` instead of a V8 string. `RawSource` accepts+										// a buffer directly, and the emitted asset stays in+										// `compilation.assets` until the build finishes — so+										// storing the bytes off the V8 heap (where Buffers+										// live, accounted as `external` memory) avoids keeping+										// a large V8 string alive for the rest of the build+										// and reduces heap pressure on `--max-old-space-size`.+										const sourceMapBuffer = Buffer.from(+											JSON.stringify(outputSourceMap),+											"utf8"+										); 										const filename = file;@@ -705,3 +775,3 @@ 											? createHash(compilation.outputOptions.hashFunction)-													.update(sourceMapString)+													.update(sourceMapBuffer) 													.digest("hex")@@ -777,3 +847,3 @@ 										// Add source map file to compilation assets and chunk files-										const sourceMapAsset = new RawSource(sourceMapString);+										const sourceMapAsset = new RawSource(sourceMapBuffer); 										const sourceMapAssetInfo = {@@ -803,2 +873,12 @@ 										}+										// Inline data-URL form: `[map]` gets the raw JSON, `[url]`+										// gets the same JSON base64-encoded. `URL_COMMENT_REGEXP`+										// is a `/g` regex, so a user `append` template with more+										// than one `[url]` placeholder would otherwise re-encode+										// the same JSON per match. Pre-compute both once.+										const sourceMapString = JSON.stringify(outputSourceMap);+										const sourceMapBase64 = Buffer.from(+											sourceMapString,+											"utf8"+										).toString("base64"); 										/**@@ -813,6 +893,3 @@ 													() =>-														`data:application/json;charset=utf-8;base64,${Buffer.from(-															sourceMapString,-															"utf8"-														).toString("base64")}`+														`data:application/json;charset=utf-8;base64,${sourceMapBase64}` 												)
lib/buildChunkGraph.js +24 lines
--- +++ @@ -18,2 +18,3 @@ /** @typedef {import("./Entrypoint")} Entrypoint */+/** @typedef {import("./Entrypoint").EntryOptions} EntryOptions */ /** @typedef {import("./Module")} Module */@@ -583,3 +584,23 @@ 					entrypoint = /** @type {Entrypoint} */ (cgi.chunkGroup);-					// TODO merge entryOptions+					// Fill in options the existing entrypoint hasn't set yet. We never+					// overwrite: blocks that dedupe to one entrypoint (e.g. several+					// workers pointing at the same module) legitimately carry distinct+					// values such as `runtime`, so the first block to create the+					// entrypoint wins and later ones only contribute missing keys.+					// `name` is excluded: it is the entrypoint's identity, fixed at+					// creation (and used to key namedChunkGroups), so back-filling it+					// from a block that deduped in via its module would leave+					// `entrypoint.name` out of sync and make module codegen+					// order-dependent, which breaks persistent caching.+					const existingOptions = entrypoint.options;+					for (const key_ of Object.keys(entryOptions)) {+						const key =+							/** @type {keyof EntryOptions} */+							(key_);+						if (key === "name") continue;+						if (entryOptions[key] === undefined) continue;+						if (existingOptions[key] !== undefined) continue;+						/** @type {EntryOptions[keyof EntryOptions]} */+						(existingOptions[key]) = entryOptions[key];+					} 					entrypoint.addOrigin(@@ -1292,3 +1313,4 @@ 		if (-			// TODO is this needed?+			// Blocks with nested blocks must stay connected — skipping orphans the+			// nested block's chunk group from this block's chunk group parent. 			!blocksWithNestedBlocks.has(block) &&
lib/cache/getLazyHashedEtag.js +9 lines
--- +++ @@ -27,3 +27,3 @@ 	constructor(obj, hashFunction = DEFAULTS.HASH_FUNCTION) {-		/** @type {HashableObject} */+		/** @type {HashableObject | undefined} */ 		this._obj = obj;@@ -42,4 +42,11 @@ 			const hash = createHash(this._hashFunction);-			this._obj.updateHash(hash);+			/** @type {HashableObject} */+			(this._obj).updateHash(hash); 			this._hash = hash.digest("base64");+			// Drop the captured object once the hash is memoized. The hash is+			// never reset, so we never need `_obj` again — and many callers+			// (e.g. `SourceMapDevToolPlugin`, `RealContentHashPlugin`) capture+			// a heavy `CachedSource` here that would otherwise stay reachable+			// through this etag for the lifetime of the compilation cache.+			this._obj = undefined; 		}
lib/dependencies/HarmonyExportInitFragment.js +8 lines
--- +++ @@ -163,5 +163,2 @@ 	getContent({ runtimeTemplate, runtimeRequirements }) {-		runtimeRequirements.add(RuntimeGlobals.exports);-		runtimeRequirements.add(RuntimeGlobals.definePropertyGetters);- 		const unusedPart =@@ -186,8 +183,10 @@ 		}-		const definePart =-			this.exportMap.size > 0-				? `/* harmony export */ ${RuntimeGlobals.definePropertyGetters}(${-						this.exportsArgument-					}, {${definitions.join(",")}\n/* harmony export */ });\n`-				: "";+		let definePart = "";+		if (this.exportMap.size > 0) {+			runtimeRequirements.add(RuntimeGlobals.exports);+			runtimeRequirements.add(RuntimeGlobals.definePropertyGetters);+			definePart = `/* harmony export */ ${RuntimeGlobals.definePropertyGetters}(${+				this.exportsArgument+			}, {${definitions.join(",")}\n/* harmony export */ });\n`;+		} 		return `${definePart}${unusedPart}`;
lib/dependencies/HtmlInlineScriptDependency.js +3 lines
--- +++ @@ -6,4 +6,4 @@ +const HtmlGenerator = require("../html/HtmlGenerator"); const makeSerializable = require("../util/makeSerializable");-const CssUrlDependency = require("./CssUrlDependency"); const ModuleDependency = require("./ModuleDependency");@@ -103,15 +103,4 @@ 			const chunk = /** @type {Chunk} */ (entrypoint.getEntrypointChunk());-			const outputOptions = runtimeTemplate.outputOptions;-			const filenameTemplate =-				chunk.filenameTemplate ||-				(chunk.canBeInitial()-					? outputOptions.filename-					: outputOptions.chunkFilename);--			const filename = compilation.getPath(filenameTemplate, {-				chunk,-				contentHashType: "javascript"-			});--			url = `${CssUrlDependency.PUBLIC_PATH_AUTO}${filename}`;+			// Defer chunk-URL substitution to renderManifest — chunk hashes aren't ready yet.+			url = HtmlGenerator.makeChunkUrlSentinel(chunk, "javascript"); 		}
lib/dependencies/HtmlInlineStyleDependency.js +17 lines
--- +++ @@ -12,2 +12,3 @@ /** @typedef {import("../CodeGenerationResults")} CodeGenerationResults */+/** @typedef {import("../Dependency").UpdateHashContext} UpdateHashContext */ /** @typedef {import("../Dependency")} Dependency */@@ -15,2 +16,3 @@ /** @typedef {import("../Module")} Module */+/** @typedef {import("../Module").BuildInfo} BuildInfo */ /** @typedef {import("../javascript/JavascriptParser").Range} Range */@@ -18,2 +20,3 @@ /** @typedef {import("../serialization/ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */+/** @typedef {import("../util/Hash")} Hash */ /** @typedef {import("../util/runtime").RuntimeSpec} RuntimeSpec */@@ -45,2 +48,16 @@ 		return "html-style";+	}++	/**+	 * Updates the hash with the data contributed by this instance.+	 * @param {Hash} hash hash to be updated+	 * @param {UpdateHashContext} context context+	 * @returns {void}+	 */+	updateHash(hash, context) {+		// Recurse so the inline CSS's transitive deps (e.g. `url(asset)`) propagate up.+		const { chunkGraph } = context;+		const module = chunkGraph.moduleGraph.getModule(this);+		if (!module) return;+		module.updateHash(hash, context); 	}
lib/dependencies/HtmlScriptSrcDependency.js +6 lines
--- +++ @@ -11,4 +11,4 @@ } = require("../ModuleSourceTypeConstants");+const HtmlGenerator = require("../html/HtmlGenerator"); const makeSerializable = require("../util/makeSerializable");-const CssUrlDependency = require("./CssUrlDependency"); const ModuleDependency = require("./ModuleDependency");@@ -98,35 +98,2 @@ /**- * @param {Chunk} chunk a chunk- * @param {import("../Compilation")} compilation compilation- * @param {"javascript" | "css"} contentHashType which content hash to plug into the filename template- * @returns {string} chunk filename path (no public-path prefix)- */-const getChunkFilename = (chunk, compilation, contentHashType) => {-	const outputOptions = compilation.outputOptions;-	let filenameTemplate;-	if (contentHashType === "css") {-		// For a CSS-typed chunk, use the same template the CSS pipeline-		// will use when it actually emits the `.css` file, so the `<link-		// rel="stylesheet" href>` URL we write into the HTML matches the-		// asset on disk.-		filenameTemplate =-			require("../css/CssModulesPlugin").getChunkFilenameTemplate(-				chunk,-				outputOptions-			);-	} else {-		filenameTemplate =-			chunk.filenameTemplate ||-			(chunk.canBeInitial()-				? outputOptions.filename-				: outputOptions.chunkFilename);-	}--	return compilation.getPath(filenameTemplate, {-		chunk,-		contentHashType-	});-};--/**  * @param {Entrypoint} entrypoint entrypoint@@ -412,11 +379,9 @@ -		// Rewrite the originating tag's src/href to the entry chunk's-		// primary asset for that element kind: `.css` for-		// `<link rel="stylesheet">`, `.js` for everything else.+		// Rewrite src/href to a chunk-URL sentinel (resolved by renderManifest):+		// `.css` for `<link rel="stylesheet">`, `.js` for everything else. 		const entryContentHashType = isStylesheet ? "css" : "javascript";-		const entryUrl = `${CssUrlDependency.PUBLIC_PATH_AUTO}${getChunkFilename(+		const entryUrl = HtmlGenerator.makeChunkUrlSentinel( 			entryChunk,-			compilation, 			entryContentHashType-		)}`;+		); 		source.replace(dep.range[0], dep.range[1] - 1, entryUrl);@@ -448,7 +413,3 @@ 		const buildSibling = (chunk, kind) => {-			const url = `${CssUrlDependency.PUBLIC_PATH_AUTO}${getChunkFilename(-				chunk,-				compilation,-				kind-			)}`;+			const url = HtmlGenerator.makeChunkUrlSentinel(chunk, kind); 			if (kind === "css" && !isStylesheet) {
lib/dependencies/HtmlSourceDependency.js +18 lines
--- +++ @@ -15,2 +15,3 @@ /** @typedef {import("../CodeGenerationResults")} CodeGenerationResults */+/** @typedef {import("../Dependency").UpdateHashContext} UpdateHashContext */ /** @typedef {import("../Dependency")} Dependency */@@ -18,2 +19,3 @@ /** @typedef {import("../Module")} Module */+/** @typedef {import("../Module").BuildInfo} BuildInfo */ /** @typedef {import("../Module").CodeGenerationResult} CodeGenerationResult */@@ -23,2 +25,3 @@ /** @typedef {import("../serialization/ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */+/** @typedef {import("../util/Hash")} Hash */ /** @typedef {import("../util/runtime").RuntimeSpec} RuntimeSpec */@@ -55,2 +58,17 @@ 		return getIgnoredRawDataUrlModule();+	}++	/**+	 * Updates the hash with the data contributed by this instance.+	 * @param {Hash} hash hash to be updated+	 * @param {UpdateHashContext} context context+	 * @returns {void}+	 */+	updateHash(hash, context) {+		// Fold in the asset's hash so the HTML invalidates when the embedded URL changes.+		const { chunkGraph } = context;+		const module = chunkGraph.moduleGraph.getModule(this);+		if (!module) return;+		const { hash: buildHash } = /** @type {BuildInfo} */ (module.buildInfo);+		if (buildHash) hash.update(buildHash); 	}
lib/dependencies/WorkerPlugin.js +18 lines
--- +++ @@ -351,6 +351,20 @@ 								} else {-									Object.assign(-										entryOptions,-										importOptions.webpackEntryOptions-									);+									// `webpackEntryOptions` is user input from a magic+									// comment, so copy only safe own keys to avoid+									// prototype pollution via `__proto__`/`constructor`/+									// `prototype`.+									const userEntryOptions = importOptions.webpackEntryOptions;+									for (const key of Object.keys(userEntryOptions)) {+										if (+											key === "__proto__" ||+											key === "constructor" ||+											key === "prototype"+										) {+											continue;+										}+										/** @type {EXPECTED_ANY} */+										(entryOptions)[key] = /** @type {EXPECTED_ANY} */ (+											userEntryOptions+										)[key];+									} 								}
lib/hmr/LazyCompilationPlugin.js +104 lines
--- +++ @@ -20,2 +20,3 @@ const CommonJsRequireDependency = require("../dependencies/CommonJsRequireDependency");+const { resolveByProperty } = require("../util/cleverMerge"); const { registerNotSerializable } = require("../util/serialization");@@ -48,2 +49,92 @@ /**+ * Library wrappers of these types pass external modules as closure arguments+ * (e.g. `__WEBPACK_EXTERNAL_MODULE_react__`) baked into the entry chunk at+ * render time. When `lazyCompilation` activates a proxy for the first time,+ * any external dependency the lazily-built module pulls in lands in a hot+ * update chunk that lives outside the original wrapper closure, so the+ * factory body can't resolve its closure identifier and throws at runtime.+ * Reserving the externals up front (during the inactive build) folds them+ * into the initial wrapper, so the closure identifiers are already defined+ * when the activation update arrives.+ */+const CLOSURE_LIBRARY_TYPES = new Set([+	"umd",+	"umd2",+	"amd",+	"amd-require",+	"system"+]);++/**+ * `enabledLibraryTypes` covers both the global `output.library.type` and any+ * per-entry `entry.<name>.library.type`, so a UMD/AMD/System wrapper attached+ * to an individual entry is still detected.+ * @param {import("../../declarations/WebpackOptions").OutputNormalized} output normalized output option+ * @returns {boolean} true when at least one library wrapper passes externals as closure arguments+ */+const hasClosureLibrary = (output) => {+	const enabled = output.enabledLibraryTypes;+	if (enabled) {+		for (const type of enabled) {+			if (CLOSURE_LIBRARY_TYPES.has(type)) return true;+		}+	}+	if (output.library && output.library.type) {+		return CLOSURE_LIBRARY_TYPES.has(output.library.type);+	}+	return false;+};++/**+ * Collects request strings from statically-enumerable externals (string,+ * object, and arrays of those). Function and RegExp forms are skipped because+ * their effective request set isn't knowable until something asks for it.+ *+ * Layer resolution mirrors `ExternalModuleFactoryPlugin.resolveLayer`: the+ * effective map for the proxy's layer is computed via the same+ * `resolveByProperty(..., "byLayer", layer)` helper that the externals system+ * uses, so `byLayer.default` fallback and function-form `byLayer` entries are+ * honored the same way.+ *+ * Entries whose effective value is `false` are skipped — `false` explicitly+ * disables externalization for that request, and reserving it would force the+ * real module into the entry chunk.+ * @param {import("../../declarations/WebpackOptions").Externals | undefined} externals normalized externals option+ * @param {string | null} layer issuer layer for which to resolve `byLayer`+ * @returns {Set<string>} requests to reserve in the entry chunk+ */+const collectStaticExternalRequests = (externals, layer) => {+	/** @type {Set<string>} */+	const requests = new Set();+	if (!externals) return requests;+	/** @param {import("../../declarations/WebpackOptions").ExternalItem} item one item */+	const visit = (item) => {+		if (typeof item === "string") {+			requests.add(item);+			return;+		}+		if (!item || typeof item !== "object" || item instanceof RegExp) return;+		const resolved = /** @type {Record<string, unknown>} */ (+			resolveByProperty(+				/** @type {Record<string, unknown>} */ (item),+				"byLayer",+				layer+			)+		);+		for (const [request, value] of Object.entries(resolved)) {+			// `false` explicitly opts the request out of externalization; reserving+			// it would pull the actual module into the entry chunk.+			if (value === false) continue;+			requests.add(request);+		}+	};+	if (Array.isArray(externals)) {+		for (const item of externals) visit(item);+	} else {+		visit(externals);+	}+	return requests;+};++/**  * Defines the backend api type used by this module.@@ -215,2 +306,15 @@ 			this.addBlock(block);+		} else if (hasClosureLibrary(compilation.options.output)) {+			// Reserve statically-declared externals as dependencies of the inactive+			// proxy so the initial entry chunk's library wrapper already exposes+			// their closure identifiers (e.g. `__WEBPACK_EXTERNAL_MODULE_react__`).+			// Once the proxy activates and the lazily-built module references those+			// externals, the identifiers resolve normally instead of throwing.+			const requests = collectStaticExternalRequests(+				options.externals,+				this.layer+			);+			for (const request of requests) {+				this.addDependency(new CommonJsRequireDependency(request));+			} 		}
lib/html/HtmlGenerator.js +81 lines
--- +++ @@ -19,2 +19,4 @@ /** @typedef {import("../../declarations/WebpackOptions").HtmlGeneratorOptions} HtmlGeneratorOptions */+/** @typedef {import("../Chunk")} Chunk */+/** @typedef {import("../Compilation")} Compilation */ /** @typedef {import("../Compilation").DependencyConstructor} DependencyConstructor */@@ -41,3 +43,72 @@ +/** @type {WeakMap<Compilation, Map<string, Chunk>>} */+const chunksByIdCache = new WeakMap();+ class HtmlGenerator extends Generator {+	/**+	 * Emit a sentinel for a chunk URL that can't be resolved at code-gen time+	 * (chunk hashes aren't computed yet); `resolveChunkUrlSentinels` swaps it+	 * for `${PUBLIC_PATH_AUTO}<chunkFilename>` once they are.+	 * @param {Chunk} chunk chunk+	 * @param {"javascript" | "css"} contentHashType which chunk content hash slot the resolved URL should reference+	 * @returns {string} sentinel+	 */+	static makeChunkUrlSentinel(chunk, contentHashType) {+		const hexId = Buffer.from(String(chunk.id), "utf8").toString("hex");+		return `__WEBPACK_HTML_CHUNK_URL__${hexId}__${contentHashType}__END__`;+	}++	/**+	 * Replace every `makeChunkUrlSentinel` sentinel in `content` with+	 * `${PUBLIC_PATH_AUTO}<chunkFilename>`. Must run after+	 * `Compilation#createHash()` so `[contenthash]` resolves.+	 * @param {string} content content+	 * @param {Compilation} compilation compilation+	 * @returns {string} resolved content+	 */+	static resolveChunkUrlSentinels(content, compilation) {+		if (!content.includes("__WEBPACK_HTML_CHUNK_URL__")) return content;+		const outputOptions = compilation.outputOptions;+		let chunksById = chunksByIdCache.get(compilation);+		if (chunksById === undefined) {+			chunksById = new Map();+			for (const chunk of compilation.chunks) {+				chunksById.set(String(chunk.id), chunk);+			}+			chunksByIdCache.set(compilation, chunksById);+		}+		return content.replace(+			/__WEBPACK_HTML_CHUNK_URL__([0-9a-f]+)__([a-z]+)__END__/g,+			(_, hexId, contentHashType) => {+				const chunkId = Buffer.from(hexId, "hex").toString("utf8");+				const chunk = chunksById.get(chunkId);+				if (!chunk) return "data:,";+				let filenameTemplate;+				if (contentHashType === "css") {+					const CssModulesPlugin = require("../css/CssModulesPlugin");++					filenameTemplate = CssModulesPlugin.getChunkFilenameTemplate(+						chunk,+						outputOptions+					);+				} else {+					filenameTemplate =+						chunk.filenameTemplate ||+						(chunk.canBeInitial()+							? outputOptions.filename+							: outputOptions.chunkFilename);+				}+				const filename = compilation.getPath(+					/** @type {import("../TemplatedPathPlugin").TemplatePath} */+					(filenameTemplate),+					{+						chunk,+						contentHashType+					}+				);+				return `${CssUrlDependency.PUBLIC_PATH_AUTO}${filename}`;+			}+		);+	}+ 	/**@@ -270,2 +341,3 @@ 		if (undoPath === undefined) {+			// HTML output — leave sentinels and `[webpack/auto]` for renderManifest. 			return /** @type {string} */ (source.source());@@ -273,21 +345,7 @@ -		const moduleSourceContent = source.source();-		const generatedSource = new ReplaceSource(source);--		const autoPlaceholder = CssUrlDependency.PUBLIC_PATH_AUTO;-		const autoPlaceholderLen = autoPlaceholder.length;-		for (-			let idx = moduleSourceContent.indexOf(autoPlaceholder);-			idx !== -1;-			idx = moduleSourceContent.indexOf(-				autoPlaceholder,-				idx + autoPlaceholderLen-			)-		) {-			generatedSource.replace(idx, idx + autoPlaceholderLen - 1, undoPath);-		}--		// TODO handle `[fullhash]`--		return /** @type {string} */ (generatedSource.source());+		// JS-export path — resolve `[webpack/auto]` inline; chunk-URL sentinels+		// stay for `HtmlModulesPlugin`'s `JavascriptModulesPlugin.render` tap.+		let content = /** @type {string} */ (source.source());+		content = content.split(CssUrlDependency.PUBLIC_PATH_AUTO).join(undoPath);+		return content; 	}@@ -308,5 +366,3 @@ 		if (generateContext.type === HTML_TYPE) {-			// Preserve `[webpack/auto]` placeholders here — the plugin's-			// `renderManifest` hook knows the final `.html` filename and-			// resolves them to an undo path relative to that location.+			// Preserve `[webpack/auto]`; renderManifest resolves it once `.html` filename is known. 			return new RawSource(@@ -316,4 +372,3 @@ -		// JS export: the rewritten HTML is a string the consumer reads at-		// runtime, so resolve placeholders to root-relative URLs.+		// JS export: resolve `[webpack/auto]` to root-relative URLs. 		const generated = this._renderHtml(module, generateContext, "");@@ -348,6 +403,3 @@ 		if (generateContext.type === HTML_TYPE) {-			// The error message can contain arbitrary text (file paths, user-			// input, dep request strings). Strip `<`, `>`, and `--` runs so a-			// crafted message can't close the comment with `-->` (or open a-			// fake nested comment) and inject HTML into the extracted page.+			// Strip `<`, `>`, `--` runs from `error.message` so it can't escape the comment. 			const safe = String(error.message)@@ -367,7 +419,3 @@ 		hash.update("html");-		// Hash the *effective* extraction state, not just the raw option,-		// so the module hash flips when a module becomes (or stops being)-		// a compilation entry under the `extract: undefined` default — the-		// generator's source-type set changes with it, so any cached-		// HTML-type codegen result must be invalidated.+		// Hash effective extraction state — source-type set changes when this flips. 		if (this._shouldExtract(updateHashContext.module)) {
lib/html/HtmlModulesPlugin.js +87 lines
--- +++ @@ -48,2 +48,28 @@ 	/**+	 * `output.hashFunction`/`hashSalt`/`hashDigest`/`hashDigestLength`+	 * digest of `content`, with `nonNumericOnlyHash` applied — webpack's+	 * standard `[contenthash]` recipe.+	 * @param {string | Buffer} content content to hash+	 * @param {import("../../declarations/WebpackOptions").Output} outputOptions output options+	 * @returns {string} content hash+	 */+	static computeContentHash(content, outputOptions) {+		const createHash = require("../util/createHash");+		const nonNumericOnlyHash = require("../util/nonNumericOnlyHash");++		const hash = createHash(+			/** @type {import("../../declarations/WebpackOptions").HashFunction} */+			(outputOptions.hashFunction)+		);+		if (outputOptions.hashSalt) hash.update(outputOptions.hashSalt);+		hash.update(content);+		return nonNumericOnlyHash(+			/** @type {string} */ (+				hash.digest(/** @type {string} */ (outputOptions.hashDigest))+			),+			/** @type {number} */ (outputOptions.hashDigestLength)+		);+	}++	/** 	 * Applies the plugin by registering its hooks on the compiler.@@ -53,2 +79,7 @@ 	apply(compiler) {+		// Per-chunk `RawSource` reused across builds when bytes are unchanged:+		// keeping identity stable avoids invalidating `RealContentHashPlugin|analyse`.+		/** @type {Map<string, { content: string, source: import("webpack-sources").RawSource }>} */+		const sentinelResolvedSourceCache = new Map();+ 		// `<script src>` and `<link rel="modulepreload">` references collected@@ -298,4 +329,2 @@ 				} = require("../util/identifier");-				const createHash = require("../util/createHash");-				const nonNumericOnlyHash = require("../util/nonNumericOnlyHash"); 				const CssUrlDependency = require("../dependencies/CssUrlDependency");@@ -344,13 +373,11 @@ 							);-							const hashInput = createHash(outputOptions.hashFunction);-							if (outputOptions.hashSalt) {-								hashInput.update(outputOptions.hashSalt);-							}-							hashInput.update(placeholderContent);-							const fullContentHash = /** @type {string} */ (-								hashInput.digest(outputOptions.hashDigest)-							);-							const contentHash = nonNumericOnlyHash(-								fullContentHash,-								outputOptions.hashDigestLength+							// Resolve sentinels *before* hashing so the HTML's `[contenthash]`+							// invalidates with the referenced chunks' filenames.+							const resolvedContent = HtmlGenerator.resolveChunkUrlSentinels(+								placeholderContent,+								compilation+							);+							const contentHash = HtmlModulesPlugin.computeContentHash(+								resolvedContent,+								outputOptions 							);@@ -384,3 +411,3 @@ 							);-							const finalContent = placeholderContent+							const finalContent = resolvedContent 								.split(autoPlaceholder)@@ -397,12 +424,5 @@ 							// another variant's URL.-							const finalHash = createHash(outputOptions.hashFunction);-							if (outputOptions.hashSalt) {-								finalHash.update(outputOptions.hashSalt);-							}-							finalHash.update(finalContent);-							const finalContentHash = nonNumericOnlyHash(-								/** @type {string} */ (-									finalHash.digest(outputOptions.hashDigest)-								),-								outputOptions.hashDigestLength+							const finalContentHash = HtmlModulesPlugin.computeContentHash(+								finalContent,+								outputOptions 							);@@ -423,2 +443,45 @@ 				);++				// Resolve sentinels at JS chunk render time so later passes+				// (SourceMapDevToolPlugin, size optimizers, RealContentHash) see resolved bytes.+				const JavascriptModulesPlugin = require("../javascript/JavascriptModulesPlugin");++				const jsHooks =+					JavascriptModulesPlugin.getCompilationHooks(compilation);+				jsHooks.render.tap(PLUGIN_NAME, (source, renderContext) => {+					const raw = source.source();+					if (typeof raw !== "string") return source;+					if (!raw.includes("__WEBPACK_HTML_CHUNK_URL__")) return source;+					const resolved = HtmlGenerator.resolveChunkUrlSentinels(+						raw,+						compilation+					)+						.split(autoPlaceholder)+						.join("");+					if (resolved === raw) return source;+					const chunkId = String(renderContext.chunk.id);+					const prior = sentinelResolvedSourceCache.get(chunkId);+					if (prior !== undefined && prior.content === resolved) {+						return prior.source;+					}+					const newSource = new RawSource(resolved);+					sentinelResolvedSourceCache.set(chunkId, {+						content: resolved,+						source: newSource+					});+					return newSource;+				});++				// Prune cache entries for chunks no longer in the graph so a+				// long watch session can't accumulate stale entries.+				compilation.hooks.afterSeal.tap(PLUGIN_NAME, () => {+					if (sentinelResolvedSourceCache.size === 0) return;+					const live = new Set();+					for (const chunk of compilation.chunks) {+						live.add(String(chunk.id));+					}+					for (const id of sentinelResolvedSourceCache.keys()) {+						if (!live.has(id)) sentinelResolvedSourceCache.delete(id);+					}+				}); 			}
lib/javascript/JavascriptParser.js +1 lines
--- +++ @@ -129,3 +129,3 @@ -// TODO remove cast when @types/estree has been updated to import assertions+// TODO remove cast when @types/estree has been updated to import phases /** @typedef {import("estree").ImportExpression & { phase?: "defer" | "source" }} ImportExpression */
lib/library/ModuleLibraryPlugin.js +30 lines
--- +++ @@ -113,8 +113,7 @@ 			// `onDemandExportsGeneration` and only re-emits it when the-			// module is wrapped in an IIFE/factory. When a single concatenated-			// entry is inlined directly, the stashed source — and the+			// module is wrapped in an IIFE/factory. When the entry is+			// inlined directly, the stashed source — and the 			// `definePropertyGetters` / `requireScope` runtime helpers it 			// pulled in — never make it into the output. Drop those helpers-			// from the chunk's set in that simple shape so the bundle stays-			// clean.+			// from the chunk's set so the bundle stays clean. 			compilation.hooks.additionalChunkRuntimeRequirements.tap(@@ -123,10 +122,2 @@ 					if (!set.has(RuntimeGlobals.definePropertyGetters)) return;--					// Only handle the simple "single concatenated entry"-					// shape. Anything else (additional modules, multiple-					// entries, sibling runtime chunks, or chunk-level-					// requirements that disable inline startup) forces the-					// module through factory/IIFE rendering, which re-emits-					// the source.-					if (chunkGraph.getNumberOfChunkModules(chunk) !== 1) return; 					if (chunkGraph.getNumberOfEntryModules(chunk) !== 1) return;@@ -142,4 +133,2 @@ 					}-					// Anyone tapping `inlineInRuntimeBailout` may force factory-					// rendering at render time, so conservatively bail out. 					if (javascriptHooks.inlineInRuntimeBailout.isUsed()) return;@@ -155,10 +144,2 @@ 					}-					// If the generated source references any-					// `__webpack_require__.<helper>` (the on-demand `.d(...)`-					// is stashed, but `.r(__webpack_exports__)` from the ESM-					// compat flag, namespace objects, deferred externals, ...-					// stay in the result) the helpers and the require scope-					// they live in are still needed. The dot in the substring-					// avoids matching the bare `"__webpack_require__"` string-					// literals that some test fixtures include. 					const codeGenResult = codeGenerationResults.get(@@ -176,5 +157,30 @@ +					// Check whether any other module in the chunk still needs+					// the helpers we want to remove.+					let otherNeedsDefine = false;+					let otherNeedsExports = false;+					let otherNeedsRequireScope = false;+					for (const m of chunkGraph.getChunkModulesIterable(chunk)) {+						if (m === module) continue;+						const requirements = chunkGraph.getModuleRuntimeRequirements(+							m,+							chunk.runtime+						);+						if (!requirements) continue;+						if (requirements.has(RuntimeGlobals.definePropertyGetters)) {+							otherNeedsDefine = true;+						}+						if (requirements.has(RuntimeGlobals.exports)) {+							otherNeedsExports = true;+						}+						if (requirements.has(RuntimeGlobals.requireScope)) {+							otherNeedsRequireScope = true;+						}+						if (otherNeedsDefine) break;+					}++					if (otherNeedsDefine) return; 					set.delete(RuntimeGlobals.definePropertyGetters);-					set.delete(RuntimeGlobals.exports);-					set.delete(RuntimeGlobals.requireScope);+					if (!otherNeedsExports) set.delete(RuntimeGlobals.exports);+					if (!otherNeedsRequireScope) set.delete(RuntimeGlobals.requireScope); 				}
lib/node/NodeWatchFileSystem.js +37 lines
--- +++ @@ -84,2 +84,37 @@ 		};+		const directoriesSet =+			directories instanceof Set ? directories : new Set(directories);++		// Watchpack reports a watched directory (a context dependency) in+		// `changes` whenever its contents change, alongside the individual+		// file events. The default `fs.purge(dir)` matches cache keys by+		// prefix, so it would wipe the stat cache of every file inside the+		// directory even though only file-level events actually invalidate+		// file stats. For directories we explicitly watch, purge only the+		// directory's own entry (`{ exact: true }`, enhanced-resolve >=+		// 5.22.0); file-level events in the same aggregated batch still+		// handle file stats and the parent readdir invalidation.+		/**+		 * @param {Changes | null | undefined} changes changes set+		 * @param {Removals | null | undefined} removals removals set+		 */+		const purgeChanges = (changes, removals) => {+			const fs = this.inputFileSystem;+			if (!fs || !fs.purge) return;+			if (changes) {+				for (const item of changes) {+					if (directoriesSet.has(item)) {+						fs.purge(item, { exact: true });+					} else {+						fs.purge(item);+					}+				}+			}+			if (removals) {+				for (const item of removals) {+					fs.purge(item);+				}+			}+		};+ 		this.watcher.once(@@ -96,11 +131,3 @@ -				const fs = this.inputFileSystem;-				if (fs && fs.purge) {-					for (const item of changes) {-						fs.purge(item);-					}-					for (const item of removals) {-						fs.purge(item);-					}-				}+				purgeChanges(changes, removals); 				const { fileTimeInfoEntries, contextTimeInfoEntries } = fetchTimeInfo();@@ -174,15 +201,3 @@ 				const changes = this.watcher && this.watcher.aggregatedChanges;-				const fs = this.inputFileSystem;-				if (fs && fs.purge) {-					if (removals) {-						for (const item of removals) {-							fs.purge(item);-						}-					}-					if (changes) {-						for (const item of changes) {-							fs.purge(item);-						}-					}-				}+				purgeChanges(changes, removals); 				const { fileTimeInfoEntries, contextTimeInfoEntries } = fetchTimeInfo();
lib/optimize/ConcatenatedModule.js +3 lines
--- +++ @@ -2319,4 +2319,5 @@ 				case "external":-					hash.update(`${chunkGraph.getModuleId(info.module)}`);-					// TODO runtimeCondition+					hash.update(+						`${chunkGraph.getModuleId(info.module)}|${runtimeConditionToString(info.runtimeCondition)}|${info.nonDeferAccess ? "1" : "0"}|${chunkGraph.moduleGraph.isDeferred(info.module) ? "1" : "0"}`+					); 					break;
lib/util/fs.js +6 lines
--- +++ @@ -310,3 +310,8 @@  * Defines the purge type used by this module.- * @typedef {(value?: string | string[] | Set<string>) => void} Purge+ *+ * `options.exact` (supported by enhanced-resolve's `CachedInputFileSystem`+ * from v5.22.0): when true, only entries whose key exactly matches `value`+ * are invalidated; cached entries for descendants are preserved. Default+ * is false (legacy prefix-match behavior).+ * @typedef {(value?: string | string[] | Set<string>, options?: { exact?: boolean }) => void} Purge  */
package.json +3 lines
--- +++ @@ -2,3 +2,3 @@   "name": "webpack",-  "version": "5.107.1",+  "version": "5.107.2",   "description": "Packs ECMAScript/CommonJs/AMD modules for the browser. Allows you to split your codebase into multiple bundles, which can be loaded on demand. Supports loaders to preprocess files, i.e. json, jsx, es7, css, less, ... and your custom stuff.",@@ -99,3 +99,3 @@     "chrome-trace-event": "^1.0.2",-    "enhanced-resolve": "^5.21.4",+    "enhanced-resolve": "^5.22.0",     "es-module-lexer": "^2.1.0",@@ -112,3 +112,3 @@     "watchpack": "^2.5.1",-    "webpack-sources": "^3.4.1"+    "webpack-sources": "^3.5.0"   },
types.d.ts +117 lines
--- +++ @@ -2887,2 +2887,18 @@ 	keep: SyncBailHook<[string], boolean | void>;+}+declare interface ClearCacheOptions {+	/**+	 * drop cached source maps (default `true`)+	 */+	maps?: boolean;++	/**+	 * drop cached source/buffer copies (default `true`)+	 */+	source?: boolean;++	/**+	 * drop the parsed object form of cached source maps on `SourceMapSource` instances (default `false` — re-parsing JSON is significantly more expensive than `toString`). Only takes effect when a serialized form (buffer or string) is also retained, so the data remains recoverable.+	 */+	parsedMap?: boolean; }@@ -4040,2 +4056,23 @@ }+declare interface CompiledAliasOptions {+	/**+	 * declaration-ordered list+	 */+	all: CompiledAliasOption[];++	/**+	 * bucketed by first char code+	 */+	byFirstChar: Map<number, CompiledAliasOption[]>;++	/**+	 * true when an empty-prefix wildcard is present+	 */+	hasAnyFirstChar: boolean;++	/**+	 * true when the bucket fast-path should be used at resolve time+	 */+	useBuckets: boolean;+} declare class Compiler {@@ -9660,3 +9697,6 @@ 	readJsonSync?: (pathOrFileDescriptor: PathOrFileDescriptorFs) => JsonObjectFs;-	purge?: (value?: string | string[] | Set<string>) => void;+	purge?: (+		value?: string | string[] | Set<string>,+		options?: { exact?: boolean }+	) => void; 	join?: (path1: string, path2: string) => string;@@ -16658,7 +16698,51 @@ 	version: number;++	/**+	 * Extracts and parses the options of the current loader.+	 * Parses string options as JSON or a query string.+	 * Extracts and parses the options of the current loader.+	 * Parses string options as JSON or a query string, and optionally validates them against a provided schema.+	 */++	/**+	 * Extracts and parses the options of the current loader.+	 * Parses string options as JSON or a query string.+	 */ 	getOptions(): OptionsType;++	/**+	 * Extracts and parses the options of the current loader.+	 * Parses string options as JSON or a query string.+	 * Extracts and parses the options of the current loader.+	 * Parses string options as JSON or a query string, and optionally validates them against a provided schema.+	 */++	/**+	 * Extracts and parses the options of the current loader.+	 * Parses string options as JSON or a query string, and optionally validates them against a provided schema.+	 */ 	getOptions(schema: Parameters<typeof validateFunction>[0]): OptionsType;-	emitWarning(warning: Error): void;-	emitError(error: Error): void;++	/**+	 * Emits a warning for this module.+	 * The warning will be displayed to the user during compilation.+	 */+	emitWarning(warning: string | Error): void;++	/**+	 * Emits an error for this module.+	 * The error will be displayed to the user and typically causes the compilation to fail.+	 */+	emitError(error: string | Error): void;++	/**+	 * Gets a logger instance scoped to this loader and module.+	 * Useful for emitting debug or compilation information in a structured way.+	 */ 	getLogger(name?: string): WebpackLogger;++	/**+	 * Resolves a module request (e.g., a relative path or module name) to an absolute file path.+	 * It uses Webpack's internal resolver, taking into account configured aliases and extensions.+	 */ 	resolve(@@ -16672,2 +16756,7 @@ 	): void;++	/**+	 * Creates a resolve function with specific options.+	 * The returned function can be used as a Promise-based resolver or a callback-based resolver.+	 */ 	getResolve(options?: ResolveOptionsWithDependencyType): {@@ -16684,2 +16773,7 @@ 	};++	/**+	 * Emits a new file (asset) to the compilation output directory.+	 * This allows loaders to generate additional files alongside the main module output.+	 */ 	emitFile(@@ -18759,3 +18853,3 @@ 		logger: WebpackLogger,-		progressBar:+		progressBar?: 			| false@@ -22472,2 +22566,15 @@ 	updateHash(hash: HashLike): void;++	/**+	 * Release cached data held by this source. clearCache is a memory+	 * hint: it never affects correctness or output, only how expensive+	 * the next read is. Subclasses override; the base is a no-op so+	 * every Source supports the call. Composite sources always recurse+	 * into wrapped sources. When the same child is reachable via several+	 * parents (e.g. modules shared across webpack chunks), pass a shared+	 * `visited` WeakSet so each subtree is walked at most once.+	 * Not safe to call concurrently with source/map/sourceAndMap/+	 * streamChunks/updateHash on the same instance.+	 */+	clearCache(options?: ClearCacheOptions, visited?: WeakSet<Source>): void; }@@ -22519,2 +22626,7 @@ 	updateHash?: (hash: HashLike) => void;++	/**+	 * clear cache+	 */+	clearCache?: (options?: ClearCacheOptions, visited?: WeakSet<Source>) => void; }@@ -23937,3 +24049,3 @@ 	 */-	alias: CompiledAliasOption[];+	alias: CompiledAliasOptions; 
@babel/core npm
7.29.7 6d ago nominal
critical-tier BURST ×2
latest 7.29.7 versions 227 maintainers 4 critical-tier (snapshotted)
7.27.1
7.27.3
7.27.4
7.27.7
7.28.0
7.28.3
7.28.4
7.28.5
7.28.6
7.29.0
7.29.6
7.29.7
BURST
2 releases in 33m: 7.22.18, 7.22.19
info · registry-verified · 2023-09-14 · 2y ago
BURST
2 releases in 22m: 7.29.6, 7.29.7 · ACTIVE
info · registry-verified · 2026-05-25 · 6d ago
release diff 7.29.6 → 7.29.7
+0 added · -0 removed · ~2 modified
lib/index.js +1 lines
--- +++ @@ -213,3 +213,3 @@ var _parse = require("./parse.js");-const version = exports.version = "7.29.6";+const version = exports.version = "7.29.7"; const resolvePlugin = (name, dirname) => resolvers.resolvePlugin(name, dirname, false).filepath;
package.json +16 lines
--- +++ @@ -2,3 +2,3 @@   "name": "@babel/core",-  "version": "7.29.6",+  "version": "7.29.7",   "description": "Babel compiler core.",@@ -50,11 +50,11 @@   "dependencies": {-    "@babel/code-frame": "^7.29.0",-    "@babel/generator": "^7.29.6",-    "@babel/helper-compilation-targets": "^7.28.6",-    "@babel/helper-module-transforms": "^7.28.6",-    "@babel/helpers": "^7.29.2",-    "@babel/parser": "^7.29.3",-    "@babel/template": "^7.28.6",-    "@babel/traverse": "^7.29.0",-    "@babel/types": "^7.29.0",+    "@babel/code-frame": "^7.29.7",+    "@babel/generator": "^7.29.7",+    "@babel/helper-compilation-targets": "^7.29.7",+    "@babel/helper-module-transforms": "^7.29.7",+    "@babel/helpers": "^7.29.7",+    "@babel/parser": "^7.29.7",+    "@babel/template": "^7.29.7",+    "@babel/traverse": "^7.29.7",+    "@babel/types": "^7.29.7",     "@jridgewell/remapping": "^2.3.5",@@ -67,8 +67,8 @@   "devDependencies": {-    "@babel/helper-transform-fixture-test-runner": "^7.28.6",-    "@babel/plugin-syntax-flow": "^7.28.6",-    "@babel/plugin-transform-flow-strip-types": "^7.27.1",-    "@babel/plugin-transform-modules-commonjs": "^7.28.6",-    "@babel/preset-env": "^7.29.5",-    "@babel/preset-typescript": "^7.28.5",+    "@babel/helper-transform-fixture-test-runner": "^7.29.7",+    "@babel/plugin-syntax-flow": "^7.29.7",+    "@babel/plugin-transform-flow-strip-types": "^7.29.7",+    "@babel/plugin-transform-modules-commonjs": "^7.29.7",+    "@babel/preset-env": "^7.29.7",+    "@babel/preset-typescript": "^7.29.7",     "@jridgewell/trace-mapping": "^0.3.28",
@babel/preset-env npm
7.29.7 6d ago nominal
no findings
latest 7.29.7 versions 209 maintainers 4
7.26.9
7.27.1
7.27.2
7.28.0
7.28.3
7.28.5
7.28.6
7.29.0
7.29.2
7.29.3
7.29.5
7.29.7
CLEAN
no findings — nominal
release diff 7.29.5 → 7.29.7
+0 added · -0 removed · ~1 modified
package.json +67 lines
--- +++ @@ -2,3 +2,3 @@   "name": "@babel/preset-env",-  "version": "7.29.5",+  "version": "7.29.7",   "description": "A Babel preset for each environment.",@@ -18,67 +18,67 @@   "dependencies": {-    "@babel/compat-data": "^7.29.3",-    "@babel/helper-compilation-targets": "^7.28.6",-    "@babel/helper-plugin-utils": "^7.28.6",-    "@babel/helper-validator-option": "^7.27.1",-    "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.28.5",-    "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.27.1",-    "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.27.1",-    "@babel/plugin-bugfix-safari-rest-destructuring-rhs-array": "^7.29.3",-    "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.27.1",-    "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.28.6",+    "@babel/compat-data": "^7.29.7",+    "@babel/helper-compilation-targets": "^7.29.7",+    "@babel/helper-plugin-utils": "^7.29.7",+    "@babel/helper-validator-option": "^7.29.7",+    "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.29.7",+    "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.29.7",+    "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.29.7",+    "@babel/plugin-bugfix-safari-rest-destructuring-rhs-array": "^7.29.7",+    "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.29.7",+    "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.29.7",     "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2",-    "@babel/plugin-syntax-import-assertions": "^7.28.6",-    "@babel/plugin-syntax-import-attributes": "^7.28.6",+    "@babel/plugin-syntax-import-assertions": "^7.29.7",+    "@babel/plugin-syntax-import-attributes": "^7.29.7",     "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6",-    "@babel/plugin-transform-arrow-functions": "^7.27.1",-    "@babel/plugin-transform-async-generator-functions": "^7.29.0",-    "@babel/plugin-transform-async-to-generator": "^7.28.6",-    "@babel/plugin-transform-block-scoped-functions": "^7.27.1",-    "@babel/plugin-transform-block-scoping": "^7.28.6",-    "@babel/plugin-transform-class-properties": "^7.28.6",-    "@babel/plugin-transform-class-static-block": "^7.28.6",-    "@babel/plugin-transform-classes": "^7.28.6",-    "@babel/plugin-transform-computed-properties": "^7.28.6",-    "@babel/plugin-transform-destructuring": "^7.28.5",-    "@babel/plugin-transform-dotall-regex": "^7.28.6",-    "@babel/plugin-transform-duplicate-keys": "^7.27.1",-    "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.29.0",-    "@babel/plugin-transform-dynamic-import": "^7.27.1",-    "@babel/plugin-transform-explicit-resource-management": "^7.28.6",-    "@babel/plugin-transform-exponentiation-operator": "^7.28.6",-    "@babel/plugin-transform-export-namespace-from": "^7.27.1",-    "@babel/plugin-transform-for-of": "^7.27.1",-    "@babel/plugin-transform-function-name": "^7.27.1",-    "@babel/plugin-transform-json-strings": "^7.28.6",-    "@babel/plugin-transform-literals": "^7.27.1",-    "@babel/plugin-transform-logical-assignment-operators": "^7.28.6",-    "@babel/plugin-transform-member-expression-literals": "^7.27.1",-    "@babel/plugin-transform-modules-amd": "^7.27.1",-    "@babel/plugin-transform-modules-commonjs": "^7.28.6",-    "@babel/plugin-transform-modules-systemjs": "^7.29.4",-    "@babel/plugin-transform-modules-umd": "^7.27.1",-    "@babel/plugin-transform-named-capturing-groups-regex": "^7.29.0",-    "@babel/plugin-transform-new-target": "^7.27.1",-    "@babel/plugin-transform-nullish-coalescing-operator": "^7.28.6",-    "@babel/plugin-transform-numeric-separator": "^7.28.6",-    "@babel/plugin-transform-object-rest-spread": "^7.28.6",-    "@babel/plugin-transform-object-super": "^7.27.1",-    "@babel/plugin-transform-optional-catch-binding": "^7.28.6",-    "@babel/plugin-transform-optional-chaining": "^7.28.6",-    "@babel/plugin-transform-parameters": "^7.27.7",-    "@babel/plugin-transform-private-methods": "^7.28.6",-    "@babel/plugin-transform-private-property-in-object": "^7.28.6",-    "@babel/plugin-transform-property-literals": "^7.27.1",-    "@babel/plugin-transform-regenerator": "^7.29.0",-    "@babel/plugin-transform-regexp-modifiers": "^7.28.6",-    "@babel/plugin-transform-reserved-words": "^7.27.1",-    "@babel/plugin-transform-shorthand-properties": "^7.27.1",-    "@babel/plugin-transform-spread": "^7.28.6",-    "@babel/plugin-transform-sticky-regex": "^7.27.1",-    "@babel/plugin-transform-template-literals": "^7.27.1",-    "@babel/plugin-transform-typeof-symbol": "^7.27.1",-    "@babel/plugin-transform-unicode-escapes": "^7.27.1",-    "@babel/plugin-transform-unicode-property-regex": "^7.28.6",-    "@babel/plugin-transform-unicode-regex": "^7.27.1",-    "@babel/plugin-transform-unicode-sets-regex": "^7.28.6",+    "@babel/plugin-transform-arrow-functions": "^7.29.7",+    "@babel/plugin-transform-async-generator-functions": "^7.29.7",+    "@babel/plugin-transform-async-to-generator": "^7.29.7",+    "@babel/plugin-transform-block-scoped-functions": "^7.29.7",+    "@babel/plugin-transform-block-scoping": "^7.29.7",+    "@babel/plugin-transform-class-properties": "^7.29.7",+    "@babel/plugin-transform-class-static-block": "^7.29.7",+    "@babel/plugin-transform-classes": "^7.29.7",+    "@babel/plugin-transform-computed-properties": "^7.29.7",+    "@babel/plugin-transform-destructuring": "^7.29.7",+    "@babel/plugin-transform-dotall-regex": "^7.29.7",+    "@babel/plugin-transform-duplicate-keys": "^7.29.7",+    "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.29.7",+    "@babel/plugin-transform-dynamic-import": "^7.29.7",+    "@babel/plugin-transform-explicit-resource-management": "^7.29.7",+    "@babel/plugin-transform-exponentiation-operator": "^7.29.7",+    "@babel/plugin-transform-export-namespace-from": "^7.29.7",+    "@babel/plugin-transform-for-of": "^7.29.7",+    "@babel/plugin-transform-function-name": "^7.29.7",+    "@babel/plugin-transform-json-strings": "^7.29.7",+    "@babel/plugin-transform-literals": "^7.29.7",+    "@babel/plugin-transform-logical-assignment-operators": "^7.29.7",+    "@babel/plugin-transform-member-expression-literals": "^7.29.7",+    "@babel/plugin-transform-modules-amd": "^7.29.7",+    "@babel/plugin-transform-modules-commonjs": "^7.29.7",+    "@babel/plugin-transform-modules-systemjs": "^7.29.7",+    "@babel/plugin-transform-modules-umd": "^7.29.7",+    "@babel/plugin-transform-named-capturing-groups-regex": "^7.29.7",+    "@babel/plugin-transform-new-target": "^7.29.7",+    "@babel/plugin-transform-nullish-coalescing-operator": "^7.29.7",+    "@babel/plugin-transform-numeric-separator": "^7.29.7",+    "@babel/plugin-transform-object-rest-spread": "^7.29.7",+    "@babel/plugin-transform-object-super": "^7.29.7",+    "@babel/plugin-transform-optional-catch-binding": "^7.29.7",+    "@babel/plugin-transform-optional-chaining": "^7.29.7",+    "@babel/plugin-transform-parameters": "^7.29.7",+    "@babel/plugin-transform-private-methods": "^7.29.7",+    "@babel/plugin-transform-private-property-in-object": "^7.29.7",+    "@babel/plugin-transform-property-literals": "^7.29.7",+    "@babel/plugin-transform-regenerator": "^7.29.7",+    "@babel/plugin-transform-regexp-modifiers": "^7.29.7",+    "@babel/plugin-transform-reserved-words": "^7.29.7",+    "@babel/plugin-transform-shorthand-properties": "^7.29.7",+    "@babel/plugin-transform-spread": "^7.29.7",+    "@babel/plugin-transform-sticky-regex": "^7.29.7",+    "@babel/plugin-transform-template-literals": "^7.29.7",+    "@babel/plugin-transform-typeof-symbol": "^7.29.7",+    "@babel/plugin-transform-unicode-escapes": "^7.29.7",+    "@babel/plugin-transform-unicode-property-regex": "^7.29.7",+    "@babel/plugin-transform-unicode-regex": "^7.29.7",+    "@babel/plugin-transform-unicode-sets-regex": "^7.29.7",     "@babel/preset-modules": "0.1.6-no-external-plugins",@@ -94,6 +94,6 @@   "devDependencies": {-    "@babel/core": "^7.29.0",+    "@babel/core": "^7.29.7",     "@babel/core-7.12": "npm:@babel/[email protected]",-    "@babel/helper-plugin-test-runner": "^7.27.1",-    "@babel/traverse": "^7.29.0"+    "@babel/helper-plugin-test-runner": "^7.29.7",+    "@babel/traverse": "^7.29.7"   },
@types/jest npm
30.0.0 11mo ago nominal
BURST ×12
latest 30.0.0 versions 210 maintainers 1
16.0.12
29.5.7
29.5.8
16.0.13
29.5.9
16.0.14
29.5.10
29.5.11
29.5.12
29.5.13
29.5.14
30.0.0
BURST
2 releases in 0m: 18.0.0, 16.0.6
info · registry-verified · 2017-01-30 · 9y ago
BURST
2 releases in 4m: 16.0.8, 21.1.10
info · registry-verified · 2017-12-28 · 8y ago
BURST
2 releases in 6m: 23.3.14, 24.0.0
info · registry-verified · 2019-02-05 · 7y ago
BURST
2 releases in 38m: 24.0.7, 24.0.8
info · registry-verified · 2019-02-25 · 7y ago
BURST
2 releases in 0m: 24.0.14, 16.0.9
info · registry-verified · 2019-06-13 · 6y ago
BURST
2 releases in 26m: 25.2.0, 25.2.1
info · registry-verified · 2020-04-03 · 6y ago
BURST
2 releases in 13m: 26.0.11, 26.0.12
info · registry-verified · 2020-08-31 · 5y ago
BURST
2 releases in 0m: 26.0.24, 16.0.10
info · registry-verified · 2021-07-06 · 4y ago
BURST
2 releases in 0m: 29.5.5, 16.0.11
info · registry-verified · 2023-09-15 · 2y ago
BURST
2 releases in 0m: 29.5.6, 16.0.12
info · registry-verified · 2023-10-18 · 2y ago
BURST
2 releases in 0m: 29.5.8, 16.0.13
info · registry-verified · 2023-11-07 · 2y ago
BURST
2 releases in 0m: 29.5.9, 16.0.14
info · registry-verified · 2023-11-21 · 2y ago
release diff 29.5.14 → 30.0.0
+0 added · -0 removed · ~3 modified
index.d.ts +73 lines
--- +++ @@ -115,2 +115,37 @@     /**+     * Advances all timers by `msToRun` milliseconds. All pending macro-tasks that have been+     * queued by `setTimeout()`, `setInterval()` and `setImmediate()`, and would be executed+     * within this time frame will be executed.+     */+    function advanceTimersByTime(msToRun: number): void;+    /**+     * Asynchronous equivalent of `jest.advanceTimersByTime()`. It also yields to the event loop,+     * allowing any scheduled promise callbacks to execute _before_ running the timers.+     *+     * @remarks+     * Not available when using legacy fake timers implementation.+     */+    function advanceTimersByTimeAsync(msToRun: number): Promise<void>;+    /**+     * Advances all timers by the needed milliseconds to execute callbacks currently scheduled with `requestAnimationFrame`.+     * `advanceTimersToNextFrame()` is a helpful way to execute code that is scheduled using `requestAnimationFrame`.+     *+     * @remarks+     * Not available when using legacy fake timers implementation.+     */+    function advanceTimersToNextFrame(): void;+    /**+     * Advances all timers by the needed milliseconds so that only the next timeouts/intervals will run.+     * Optionally, you can provide steps, so it will run steps amount of next timeouts/intervals.+     */+    function advanceTimersToNextTimer(step?: number): void;+    /**+     * Asynchronous equivalent of `jest.advanceTimersToNextTimer()`. It also yields to the event loop,+     * allowing any scheduled promise callbacks to execute _before_ running the timers.+     *+     * @remarks+     * Not available when using legacy fake timers implementation.+     */+    function advanceTimersToNextTimerAsync(steps?: number): Promise<void>;+    /**      * Disables automatic mocking in the module loader.@@ -217,8 +252,2 @@     /**-     * (renamed to `createMockFromModule` in Jest 26.0.0+)-     * Use the automatic mocking system to generate a mocked version of the given module.-     */-    // eslint-disable-next-line @definitelytyped/no-unnecessary-generics-    function genMockFromModule<T>(moduleName: string): T;-    /**      * Returns `true` if test environment has been torn down.@@ -253,2 +282,12 @@     /**+     * Registers a callback function that is invoked whenever a mock is generated for a module.+     * This callback is passed the module path and the newly created mock object, and must return+     * the (potentially modified) mock object.+     *+     * If multiple callbacks are registered, they will be called in the order they were added.+     * Each callback receives the result of the previous callback as the `moduleMock` parameter,+     * making it possible to apply sequential transformations.+     */+    function onGenerateMock<T>(cb: (modulePath: string, moduleMock: T) => T): typeof jest;+    /**      * Returns the actual module instead of a mock, bypassing all checks on@@ -283,3 +322,6 @@      */-    function retryTimes(numRetries: number, options?: { logErrorsBeforeRetry?: boolean }): typeof jest;+    function retryTimes(+        numRetries: number,+        options?: { logErrorsBeforeRetry?: boolean; waitBeforeRetry?: number; retryImmediately?: boolean },+    ): typeof jest;     /**@@ -330,28 +372,7 @@     /**-     * Advances all timers by `msToRun` milliseconds. All pending macro-tasks that have been-     * queued by `setTimeout()`, `setInterval()` and `setImmediate()`, and would be executed-     * within this time frame will be executed.-     */-    function advanceTimersByTime(msToRun: number): void;-    /**-     * Asynchronous equivalent of `jest.advanceTimersByTime()`. It also yields to the event loop,-     * allowing any scheduled promise callbacks to execute _before_ running the timers.-     *-     * @remarks-     * Not available when using legacy fake timers implementation.-     */-    function advanceTimersByTimeAsync(msToRun: number): Promise<void>;-    /**-     * Advances all timers by the needed milliseconds so that only the next timeouts/intervals will run.-     * Optionally, you can provide steps, so it will run steps amount of next timeouts/intervals.-     */-    function advanceTimersToNextTimer(step?: number): void;-    /**-     * Asynchronous equivalent of `jest.advanceTimersToNextTimer()`. It also yields to the event loop,-     * allowing any scheduled promise callbacks to execute _before_ running the timers.-     *-     * @remarks-     * Not available when using legacy fake timers implementation.-     */-    function advanceTimersToNextTimerAsync(steps?: number): Promise<void>;+     * Indicates that the module system should never return a mocked version of+     * the specified module when it is being imported (e.g. that it should always+     * return the real module).+     */+    function unstable_unmockModule(moduleName: string): typeof jest;     /**@@ -653,2 +674,8 @@         /**+         * Validate every element of an array against a condition or type It is the+         * inverse of `expect.arrayOf`.+         */+        // eslint-disable-next-line @definitelytyped/no-unnecessary-generics+        arrayOf<E = any>(arr: E): any;+        /**          * `expect.not.objectContaining(object)` matches any received object@@ -691,3 +718,3 @@         /**-         * Matches anything but null or undefined. You can use it inside `toEqual` or `toBeCalledWith` instead+         * Matches anything but null or undefined. You can use it inside `toEqual` or `toHaveBeenCalledWith` instead          * of a literal value. For example, if you want to check that a mock function is called with a@@ -700,3 +727,3 @@          *   [1].map(x => mock(x));-         *   expect(mock).toBeCalledWith(expect.anything());+         *   expect(mock).toHaveBeenCalledWith(expect.anything());          * });@@ -706,3 +733,3 @@          * Matches anything that was created with the given constructor.-         * You can use it inside `toEqual` or `toBeCalledWith` instead of a literal value.+         * You can use it inside `toEqual` or `toHaveBeenCalledWith` instead of a literal value.          *@@ -717,3 +744,3 @@          *   randocall(mock);-         *   expect(mock).toBeCalledWith(expect.any(Number));+         *   expect(mock).toHaveBeenCalledWith(expect.any(Number));          * });@@ -723,3 +750,3 @@          * Matches any array made up entirely of elements in the provided array.-         * You can use it inside `toEqual` or `toBeCalledWith` instead of a literal value.+         * You can use it inside `toEqual` or `toHaveBeenCalledWith` instead of a literal value.          *@@ -729,2 +756,7 @@         arrayContaining<E = any>(arr: readonly E[]): any;+        /**+         * Validate every element of an array against a condition or type+         */+        // eslint-disable-next-line @definitelytyped/no-unnecessary-generics+        arrayOf<E = any>(arr: E): any;         /**@@ -802,13 +834,4 @@         /**-         * Ensures the last call to a mock function was provided specific args.-         *-         * Optionally, you can provide a type for the expected arguments via a generic.-         * Note that the type must be either an array or a tuple.-         *-         * @deprecated in favor of `toHaveBeenLastCalledWith`-         */-        // eslint-disable-next-line @definitelytyped/no-unnecessary-generics-        lastCalledWith<E extends any[]>(...args: E): R;-        /**-         * Ensure that the last call to a mock function has returned a specified value.+         * Checks that a value is what you expect. It uses `Object.is` to check strict equality.+         * Don't use `toBe` with floating-point numbers.          *@@ -816,33 +839,2 @@          * This is particularly useful for ensuring expected objects have the right structure.-         *-         * @deprecated in favor of `toHaveLastReturnedWith`-         */-        // eslint-disable-next-line @definitelytyped/no-unnecessary-generics-        lastReturnedWith<E = any>(expected?: E): R;-        /**-         * Ensure that a mock function is called with specific arguments on an Nth call.-         *-         * Optionally, you can provide a type for the expected arguments via a generic.-         * Note that the type must be either an array or a tuple.-         *-         * @deprecated in favor of `toHaveBeenNthCalledWith`-         */-        // eslint-disable-next-line @definitelytyped/no-unnecessary-generics-        nthCalledWith<E extends any[]>(nthCall: number, ...params: E): R;-        /**-         * Ensure that the nth call to a mock function has returned a specified value.-         *-         * Optionally, you can provide a type for the expected value via a generic.-         * This is particularly useful for ensuring expected objects have the right structure.-         *-         * @deprecated in favor of `toHaveNthReturnedWith`-         */-        // eslint-disable-next-line @definitelytyped/no-unnecessary-generics-        nthReturnedWith<E = any>(n: number, expected?: E): R;-        /**-         * Checks that a value is what you expect. It uses `Object.is` to check strict equality.-         * Don't use `toBe` with floating-point numbers.-         *-         * Optionally, you can provide a type for the expected value via a generic.-         * This is particularly useful for ensuring expected objects have the right structure.          */@@ -850,24 +842,2 @@         toBe<E = any>(expected: E): R;-        /**-         * Ensures that a mock function is called.-         *-         * @deprecated in favor of `toHaveBeenCalled`-         */-        toBeCalled(): R;-        /**-         * Ensures that a mock function is called an exact number of times.-         *-         * @deprecated in favor of `toHaveBeenCalledTimes`-         */-        toBeCalledTimes(expected: number): R;-        /**-         * Ensure that a mock function is called with specific arguments.-         *-         * Optionally, you can provide a type for the expected arguments via a generic.-         * Note that the type must be either an array or a tuple.-         *-         * @deprecated in favor of `toHaveBeenCalledWith`-         */-        // eslint-disable-next-line @definitelytyped/no-unnecessary-generics-        toBeCalledWith<E extends any[]>(...args: E): R;         /**@@ -1101,15 +1071,3 @@         /**-         * Ensure that a mock function has returned (as opposed to thrown) at least once.-         *-         * @deprecated in favor of `toHaveReturned`-         */-        toReturn(): R;-        /**-         * Ensure that a mock function has returned (as opposed to thrown) a specified number of times.-         *-         * @deprecated in favor of `toHaveReturnedTimes`-         */-        toReturnTimes(count: number): R;-        /**-         * Ensure that a mock function has returned a specified value at least once.+         * Use to test that objects have the same types as well as structure.          *@@ -1117,12 +1075,2 @@          * This is particularly useful for ensuring expected objects have the right structure.-         *-         * @deprecated in favor of `toHaveReturnedWith`-         */-        // eslint-disable-next-line @definitelytyped/no-unnecessary-generics-        toReturnWith<E = any>(value?: E): R;-        /**-         * Use to test that objects have the same types as well as structure.-         *-         * Optionally, you can provide a type for the expected value via a generic.-         * This is particularly useful for ensuring expected objects have the right structure.
… 10 more lines (truncated)
package.json +5 lines
--- +++ @@ -2,3 +2,3 @@     "name": "@types/jest",-    "version": "29.5.14",+    "version": "30.0.0",     "description": "TypeScript definitions for jest",@@ -131,7 +131,2 @@             "url": "https://github.com/domdomegg"-        },-        {-            "name": "Tom Mrazauskas",-            "githubUsername": "mrazauskas",-            "url": "https://github.com/mrazauskas"         }@@ -140,8 +135,2 @@     "types": "index.d.ts",-    "exports": {-        ".": {-            "types": "./index.d.ts"-        },-        "./package.json": "./package.json"-    },     "repository": {@@ -153,8 +142,8 @@     "dependencies": {-        "expect": "^29.0.0",-        "pretty-format": "^29.0.0"+        "expect": "^30.0.0",+        "pretty-format": "^30.0.0"     },     "peerDependencies": {},-    "typesPublisherContentHash": "03b921cd51b4ea0ab99ff3733f9e799bed833eccc13adaa2aaeb088345807f4d",-    "typeScriptVersion": "4.8"+    "typesPublisherContentHash": "0fa4b32f7923c817b941e83858439e9ac13f522d9363e704f6140143388fc42e",+    "typeScriptVersion": "5.1" }
@types/node npm
25.9.1 11d ago nominal
critical-tier BURST ×551
latest 25.9.1 versions 2336 maintainers 1 critical-tier (snapshotted)
25.6.1
25.6.2
24.12.3
22.19.18
20.19.40
25.7.0
24.12.4
22.19.19
20.19.41
25.8.0
25.9.0
25.9.1
BURST
2 releases in 4m: 6.0.44, 6.0.45
info · registry-verified · 2016-10-06 · 9y ago
BURST
2 releases in 0m: 4.2.0, 0.12.0
info · registry-verified · 2017-01-10 · 9y ago
BURST
2 releases in 0m: 7.0.0, 6.0.60
info · registry-verified · 2017-01-11 · 9y ago
BURST
2 releases in 8m: 6.0.61, 7.0.2
info · registry-verified · 2017-01-23 · 9y ago
BURST
2 releases in 0m: 4.2.1, 6.0.62
info · registry-verified · 2017-01-25 · 9y ago
BURST
3 releases in 0m: 0.12.1, 4.2.3, 6.0.64
info · registry-verified · 2017-02-28 · 9y ago
BURST
2 releases in 6m: 6.0.65, 7.0.7
info · registry-verified · 2017-03-09 · 9y ago
BURST
5 releases in 47m: 4.2.4, 0.12.2, 6.0.66, 7.0.9, 7.0.10
info · registry-verified · 2017-03-22 · 9y ago
BURST
2 releases in 8m: 6.0.68, 7.0.12
info · registry-verified · 2017-03-27 · 9y ago
BURST
3 releases in 1m: 4.2.5, 0.12.3, 6.0.69
info · registry-verified · 2017-04-17 · 9y ago
BURST
4 releases in 3m: 0.12.4, 4.2.6, 6.0.70, 7.0.13
info · registry-verified · 2017-04-18 · 9y ago
BURST
3 releases in 41m: 4.2.7, 6.0.72, 7.0.16
info · registry-verified · 2017-05-03 · 9y ago
BURST
2 releases in 12m: 7.0.17, 7.0.18
info · registry-verified · 2017-05-05 · 9y ago
BURST
2 releases in 0m: 4.2.8, 6.0.73
info · registry-verified · 2017-05-05 · 9y ago
BURST
3 releases in 21m: 7.0.19, 7.0.20, 7.0.21
info · registry-verified · 2017-05-19 · 9y ago
BURST
2 releases in 23m: 6.0.74, 7.0.23
info · registry-verified · 2017-06-01 · 9y ago
BURST
2 releases in 0m: 7.0.24, 6.0.75
info · registry-verified · 2017-06-02 · 9y ago
BURST
4 releases in 39m: 4.2.9, 6.0.76, 7.0.25, 7.0.26
info · registry-verified · 2017-06-02 · 9y ago
BURST
4 releases in 2m: 0.12.5, 4.2.10, 6.0.77, 7.0.27
info · registry-verified · 2017-06-02 · 9y ago
BURST
4 releases in 0m: 0.12.6, 7.0.28, 4.2.11, 6.0.78
info · registry-verified · 2017-06-06 · 8y ago
BURST
2 releases in 0m: 7.0.32, 8.0.0
info · registry-verified · 2017-06-19 · 8y ago
BURST
4 releases in 36m: 6.0.79, 7.0.33, 4.2.12, 8.0.6
info · registry-verified · 2017-06-29 · 8y ago
BURST
3 releases in 2m: 7.0.34, 8.0.10, 6.0.80
info · registry-verified · 2017-07-10 · 8y ago
BURST
3 releases in 1m: 4.2.13, 7.0.35, 8.0.11
info · registry-verified · 2017-07-12 · 8y ago
BURST
3 releases in 1m: 6.0.82, 7.0.36, 8.0.12
info · registry-verified · 2017-07-13 · 8y ago
BURST
4 releases in 1m: 6.0.83, 7.0.37, 8.0.13, 4.2.14
info · registry-verified · 2017-07-14 · 8y ago
BURST
5 releases in 1m: 4.2.15, 0.12.7, 6.0.84, 8.0.14, 7.0.38
info · registry-verified · 2017-07-17 · 8y ago
BURST
5 releases in 6m: 0.12.8, 4.2.16, 6.0.85, 7.0.39, 8.0.15
info · registry-verified · 2017-07-22 · 8y ago
BURST
7 releases in 51m: 4.2.17, 6.0.86, 7.0.40, 8.0.21, 4.2.18, 7.0.41, 8.0.22
info · registry-verified · 2017-08-14 · 8y ago
BURST
5 releases in 2m: 6.0.87, 0.12.9, 4.2.19, 8.0.23, 7.0.42
info · registry-verified · 2017-08-16 · 8y ago
BURST
5 releases in 2m: 6.0.88, 8.0.25, 0.12.10, 7.0.43, 4.2.20
info · registry-verified · 2017-08-24 · 8y ago
BURST
2 releases in 10m: 8.0.35, 8.0.36
info · registry-verified · 2017-10-16 · 8y ago
BURST
2 releases in 21m: 7.0.44, 8.0.37
info · registry-verified · 2017-10-16 · 8y ago
BURST
3 releases in 34m: 8.0.38, 8.0.39, 8.0.40
info · registry-verified · 2017-10-16 · 8y ago
BURST
3 releases in 60m: 8.0.42, 8.0.43, 8.0.44
info · registry-verified · 2017-10-17 · 8y ago
BURST
5 releases in 10m: 0.12.11, 6.0.90, 4.2.21, 8.0.45, 7.0.45
info · registry-verified · 2017-10-18 · 8y ago
BURST
4 releases in 28m: 6.0.91, 4.2.22, 8.0.52, 7.0.47
info · registry-verified · 2017-11-14 · 8y ago
BURST
2 releases in 11m: 7.0.48, 8.0.53
info · registry-verified · 2017-11-15 · 8y ago
BURST
2 releases in 1m: 4.0.31, 8.0.56
info · registry-verified · 2017-12-06 · 8y ago
BURST
4 releases in 2m: 6.0.93, 4.0.32, 7.0.49, 8.0.58
info · registry-verified · 2017-12-11 · 8y ago
BURST
5 releases in 36m: 0.12.12, 7.0.50, 8.5.1, 6.0.94, 4.0.33
info · registry-verified · 2017-12-13 · 8y ago
BURST
5 releases in 3m: 0.12.13, 8.5.2, 4.0.34, 7.0.51, 6.0.95
info · registry-verified · 2017-12-20 · 8y ago
BURST
2 releases in 36m: 8.5.3, 8.5.4
info · registry-verified · 2018-01-03 · 8y ago
BURST
2 releases in 30m: 7.0.52, 4.0.35
info · registry-verified · 2018-01-05 · 8y ago
BURST
2 releases in 0m: 8.5.6, 6.0.96
info · registry-verified · 2018-01-05 · 8y ago
BURST
2 releases in 45m: 8.5.8, 9.3.0
info · registry-verified · 2018-01-08 · 8y ago
BURST
4 releases in 3m: 6.0.97, 8.5.10, 9.4.1, 7.0.53
info · registry-verified · 2018-02-06 · 8y ago
BURST
3 releases in 30m: 8.9.0, 9.4.2, 6.0.98
info · registry-verified · 2018-02-07 · 8y ago
BURST
3 releases in 1m: 9.4.3, 6.0.99, 8.9.1
info · registry-verified · 2018-02-08 · 8y ago
BURST
2 releases in 4m: 7.0.54, 4.0.36
info · registry-verified · 2018-02-09 · 8y ago
BURST
3 releases in 0m: 9.4.4, 6.0.100, 8.9.2
info · registry-verified · 2018-02-09 · 8y ago
BURST
2 releases in 0m: 9.4.5, 8.9.3
info · registry-verified · 2018-02-10 · 8y ago
BURST
6 releases in 2m: 4.0.37, 7.0.55, 0.12.15, 8.9.4, 6.0.101, 9.4.6
info · registry-verified · 2018-02-13 · 8y ago
BURST
4 releases in 34m: 6.0.102, 7.0.56, 9.4.7, 8.9.5
info · registry-verified · 2018-03-08 · 8y ago
BURST
2 releases in 2m: 4.0.38, 8.10.0
info · registry-verified · 2018-03-22 · 8y ago
BURST
3 releases in 1m: 6.0.103, 7.0.57, 9.6.0
info · registry-verified · 2018-03-22 · 8y ago
BURST
3 releases in 45m: 7.0.58, 9.6.1, 8.10.1
info · registry-verified · 2018-03-28 · 8y ago
BURST
3 releases in 55m: 4.0.39, 6.0.104, 0.12.16
info · registry-verified · 2018-04-03 · 8y ago
BURST
3 releases in 22m: 7.0.59, 9.6.2, 8.10.2
info · registry-verified · 2018-04-03 · 8y ago
BURST
3 releases in 29m: 8.10.5, 8.10.6, 9.6.3
info · registry-verified · 2018-04-10 · 8y ago
BURST
5 releases in 34m: 7.0.61, 9.6.5, 8.10.8, 4.0.40, 6.0.106
info · registry-verified · 2018-04-13 · 8y ago
BURST
2 releases in 0m: 10.0.0, 9.6.7
info · registry-verified · 2018-04-26 · 8y ago
BURST
2 releases in 51m: 7.0.62, 6.0.107
info · registry-verified · 2018-04-30 · 8y ago
BURST
2 releases in 25m: 4.0.41, 9.6.8
info · registry-verified · 2018-04-30 · 8y ago
BURST
2 releases in 0m: 10.0.3, 9.6.9
info · registry-verified · 2018-05-02 · 8y ago
BURST
4 releases in 59m: 0.12.17, 7.0.63, 9.6.10, 4.0.42
info · registry-verified · 2018-05-03 · 8y ago
BURST
2 releases in 27m: 6.0.108, 8.10.12
info · registry-verified · 2018-05-03 · 8y ago
BURST
2 releases in 1m: 9.6.12, 10.0.4
info · registry-verified · 2018-05-04 · 8y ago
BURST
5 releases in 3m: 9.6.13, 6.0.109, 10.0.5, 8.10.13, 7.0.64
info · registry-verified · 2018-05-08 · 8y ago
BURST
2 releases in 3m: 9.6.14, 10.0.6
info · registry-verified · 2018-05-08 · 8y ago
BURST
3 releases in 1m: 9.6.15, 10.0.8, 8.10.14
info · registry-verified · 2018-05-10 · 8y ago
BURST
3 releases in 0m: 10.0.9, 9.6.16, 8.10.15
info · registry-verified · 2018-05-14 · 8y ago
BURST
3 releases in 2m: 8.10.16, 9.6.17, 10.1.1
info · registry-verified · 2018-05-17 · 8y ago
BURST
7 releases in 2m: 7.0.65, 0.12.18, 8.10.17, 6.0.111, 4.0.43, 9.6.18, 10.1.2
info · registry-verified · 2018-05-18 · 8y ago
BURST
2 releases in 2m: 9.6.19, 10.1.4
info · registry-verified · 2018-05-30 · 8y ago
BURST
4 releases in 2m: 6.0.112, 8.10.18, 9.6.20, 10.3.0
info · registry-verified · 2018-05-31 · 8y ago
BURST
3 releases in 56m: 8.10.19, 9.6.21, 10.3.2
info · registry-verified · 2018-06-07 · 7y ago
BURST
5 releases in 2m: 4.0.44, 6.0.113, 7.0.66, 8.10.20, 10.3.3
info · registry-verified · 2018-06-13 · 7y ago
BURST
7 releases in 5m: 0.12.19, 4.0.45, 6.0.114, 8.10.21, 7.0.67, 9.6.23, 10.5.2
info · registry-verified · 2018-07-06 · 7y ago
BURST
3 releases in 0m: 8.10.22, 9.6.24, 10.5.4
info · registry-verified · 2018-07-28 · 7y ago
BURST
5 releases in 2m: 6.0.115, 7.0.68, 8.10.23, 9.6.25, 10.5.5
info · registry-verified · 2018-08-01 · 7y ago
BURST
6 releases in 6m: 0.12.20, 4.0.46, 6.0.116, 7.0.69, 8.10.24, 10.5.7
info · registry-verified · 2018-08-06 · 7y ago
BURST
3 releases in 0m: 8.10.25, 9.6.27, 10.5.8
info · registry-verified · 2018-08-11 · 7y ago
BURST
3 releases in 1m: 8.10.26, 9.6.28, 10.7.1
info · registry-verified · 2018-08-15 · 7y ago
BURST
2 releases in 23m: 10.7.2, 10.9.0
info · registry-verified · 2018-08-23 · 7y ago
BURST
3 releases in 0m: 8.10.27, 9.6.29, 10.9.1
info · registry-verified · 2018-08-24 · 7y ago
BURST
3 releases in 0m: 8.10.28, 9.6.30, 10.9.2
info · registry-verified · 2018-08-25 · 7y ago
BURST
6 releases in 0m: 4.0.47, 6.0.117, 7.0.70, 8.10.29, 9.6.31, 10.9.4
info · registry-verified · 2018-08-30 · 7y ago
BURST
2 releases in 0m: 8.10.30, 10.10.2
info · registry-verified · 2018-09-21 · 7y ago
BURST
2 releases in 0m: 9.6.32, 10.10.3
info · registry-verified · 2018-09-22 · 7y ago
BURST
8 releases in 59m: 8.10.33, 9.6.33, 10.11.4, 4.0.48, 6.0.118, 7.0.71, 8.10.34, 9.6.34
info · registry-verified · 2018-10-03 · 7y ago
BURST
2 releases in 0m: 8.10.35, 10.11.5
info · registry-verified · 2018-10-08 · 7y ago
BURST
7 releases in 1m: 0.12.21, 4.9.0, 6.14.0, 7.10.0, 8.10.36, 9.6.35, 10.11.6
info · registry-verified · 2018-10-09 · 7y ago
BURST
7 releases in 1m: 0.12.22, 4.9.1, 6.14.1, 7.10.1, 8.10.37, 9.6.36, 10.12.2
info · registry-verified · 2018-11-01 · 7y ago
BURST
2 releases in 0m: 9.6.37, 10.12.6
info · registry-verified · 2018-11-12 · 7y ago
BURST
2 releases in 3m: 6.14.2, 7.10.2
info · registry-verified · 2018-11-15 · 7y ago
BURST
3 releases in 19m: 8.10.38, 9.6.38, 10.12.8
info · registry-verified · 2018-11-15 · 7y ago
BURST
2 releases in 31m: 9.6.39, 10.12.9
info · registry-verified · 2018-11-15 · 7y ago
BURST
2 releases in 17m: 9.6.40, 10.12.11
info · registry-verified · 2018-11-29 · 7y ago
BURST
4 releases in 35m: 10.12.16, 8.10.39, 9.6.41, 10.12.17
info · registry-verified · 2018-12-18 · 7y ago
BURST
6 releases in 5m: 10.12.24, 9.6.42, 8.10.40, 7.10.3, 6.14.3, 4.9.2
info · registry-verified · 2019-02-08 · 7y ago
BURST
2 releases in 1m: 11.9.0, 10.12.25
info · registry-verified · 2019-02-12 · 7y ago
BURST
2 releases in 1m: 11.9.3, 10.12.26
info · registry-verified · 2019-02-12 · 7y ago
BURST
2 releases in 1m: 11.9.5, 10.12.27
info · registry-verified · 2019-02-22 · 7y ago
BURST
15 releases in 40m: 11.10.1, 10.12.28, 9.6.43, 8.10.41, 7.10.4, 6.14.4, 4.9.3, 0.12.23, 11.10.2, 11.10.3, 11.10.4, 10.12.29, 9.6.44, 8.10.42, 7.10.5
info · registry-verified · 2019-03-02 · 7y ago
BURST
4 releases in 1m: 11.10.5, 10.12.30, 9.6.45, 8.10.43
info · registry-verified · 2019-03-06 · 7y ago
BURST
2 releases in 5m: 11.10.6, 11.11.0
info · registry-verified · 2019-03-08 · 7y ago
BURST
2 releases in 13m: 11.11.2, 10.14.0
info · registry-verified · 2019-03-12 · 7y ago
BURST
4 releases in 1m: 11.11.3, 10.14.1, 9.6.46, 8.10.44
info · registry-verified · 2019-03-12 · 7y ago
BURST
2 releases in 1m: 11.11.5, 10.14.2
info · registry-verified · 2019-03-21 · 7y ago
BURST
4 releases in 4m: 11.11.6, 10.14.3, 9.6.47, 8.10.45
info · registry-verified · 2019-03-22 · 7y ago
BURST
2 releases in 1m: 11.11.7, 10.14.4
info · registry-verified · 2019-03-25 · 7y ago
BURST
3 releases in 15m: 11.12.3, 11.12.4, 11.13.0
info · registry-verified · 2019-04-01 · 7y ago
BURST
2 releases in 19m: 11.13.3, 11.13.4
info · registry-verified · 2019-04-10 · 7y ago
BURST
4 releases in 4m: 11.13.6, 10.14.5, 8.10.46, 6.14.5
info · registry-verified · 2019-04-19 · 7y ago
BURST
3 releases in 1m: 11.13.8, 10.14.6, 8.10.47
info · registry-verified · 2019-04-26 · 7y ago
BURST
4 releases in 1m: 9.6.48, 8.10.48, 7.10.6, 6.14.6
info · registry-verified · 2019-04-29 · 7y ago
BURST
2 releases in 1m: 12.0.0, 11.13.10
info · registry-verified · 2019-05-03 · 7y ago
BURST
2 releases in 0m: 11.13.11, 10.14.7
info · registry-verified · 2019-05-17 · 7y ago
BURST
2 releases in 1m: 12.0.3, 11.13.12
info · registry-verified · 2019-05-28 · 7y ago
BURST
5 releases in 2m: 12.0.4, 11.13.13, 10.14.8, 9.6.49, 8.10.49
info · registry-verified · 2019-05-30 · 7y ago
BURST
3 releases in 1m: 12.0.8, 11.13.14, 10.14.9
info · registry-verified · 2019-06-11 · 6y ago
BURST
4 releases in 5m: 12.0.9, 12.0.10, 11.13.15, 10.14.10
info · registry-verified · 2019-06-21 · 6y ago
BURST
7 releases in 42m: 12.0.11, 11.13.16, 10.14.11, 8.10.50, 12.0.12, 11.13.17, 10.14.12
info · registry-verified · 2019-07-03 · 6y ago
BURST
8 releases in 38m: 12.6.7, 11.13.18, 10.14.13, 9.6.50, 8.10.51, 7.10.7, 6.14.7, 12.6.8
info · registry-verified · 2019-07-17 · 6y ago
BURST
3 releases in 9m: 12.7.1, 11.13.19, 10.14.15
info · registry-verified · 2019-08-07 · 6y ago
BURST
3 releases in 0m: 10.14.16, 9.6.51, 8.10.52
info · registry-verified · 2019-08-20 · 6y ago
BURST
4 releases in 1m: 12.7.3, 11.13.20, 10.14.17, 8.10.53
info · registry-verified · 2019-08-30 · 6y ago
BURST
4 releases in 1m: 12.7.5, 10.14.18, 9.6.52, 8.10.54
info · registry-verified · 2019-09-11 · 6y ago
BURST
3 releases in 1m: 12.7.6, 11.13.21, 10.14.19
info · registry-verified · 2019-09-24 · 6y ago
BURST
3 releases in 1m: 12.7.10, 11.13.22, 10.14.20
info · registry-verified · 2019-10-03 · 6y ago
BURST
2 releases in 1m: 12.7.12, 10.14.21
info · registry-verified · 2019-10-08 · 6y ago
BURST
3 releases in 1m: 12.11.1, 10.14.22, 8.10.55
info · registry-verified · 2019-10-15 · 6y ago
BURST
3 releases in 37m: 12.11.3, 12.11.4, 12.11.5
info · registry-verified · 2019-10-22 · 6y ago
BURST
2 releases in 1m: 12.11.6, 11.13.23
info · registry-verified · 2019-10-23 · 6y ago
BURST
9 releases in 7m: 12.11.7, 11.15.0, 10.17.0, 9.6.53, 8.10.56, 7.10.8, 6.14.8, 4.9.4, 0.12.24
info · registry-verified · 2019-10-24 · 6y ago
BURST
12 releases in 29m: 12.12.2, 11.15.1, 10.17.1, 9.6.54, 8.10.57, 7.10.9, 6.14.9, 12.12.3, 11.15.2, 10.17.2, 9.6.55, 8.10.58
info · registry-verified · 2019-10-30 · 6y ago
BURST
2 releases in 1m: 12.12.4, 10.17.3
info · registry-verified · 2019-11-01 · 6y ago
BURST
2 releases in 1m: 12.12.6, 10.17.4
info · registry-verified · 2019-11-05 · 6y ago
BURST
3 releases in 1m: 12.12.7, 10.17.5, 8.10.59
info · registry-verified · 2019-11-08 · 6y ago
BURST
2 releases in 33m: 12.12.10, 12.12.11
info · registry-verified · 2019-11-19 · 6y ago
BURST
4 releases in 53m: 12.12.13, 11.15.3, 10.17.6, 12.12.14
info · registry-verified · 2019-11-25 · 6y ago
BURST
2 releases in 1m: 12.12.15, 10.17.7
info · registry-verified · 2019-12-09 · 6y ago
BURST
2 releases in 1m: 12.12.16, 10.17.8
info · registry-verified · 2019-12-09 · 6y ago
BURST
2 releases in 1m: 12.12.17, 10.17.9
info · registry-verified · 2019-12-10 · 6y ago
BURST
2 releases in 1m: 12.12.19, 10.17.10
info · registry-verified · 2019-12-17 · 6y ago
BURST
2 releases in 1m: 12.12.20, 10.17.11
info · registry-verified · 2019-12-17 · 6y ago
BURST
3 releases in 5m: 13.1.0, 12.12.22, 10.17.12
info · registry-verified · 2019-12-23 · 6y ago
BURST
2 releases in 1m: 13.1.1, 10.17.13
info · registry-verified · 2019-12-26 · 6y ago
BURST
4 releases in 6m: 13.1.3, 13.1.4, 12.12.24, 11.15.4
info · registry-verified · 2020-01-03 · 6y ago
BURST
2 releases in 1m: 13.1.8, 12.12.25
info · registry-verified · 2020-01-17 · 6y ago
BURST
4 releases in 2m: 13.5.1, 12.12.26, 11.15.5, 10.17.14
info · registry-verified · 2020-01-28 · 6y ago
BURST
4 releases in 2m: 13.7.1, 12.12.27, 11.15.6, 10.17.15
info · registry-verified · 2020-02-11 · 6y ago
BURST
5 releases in 11m: 13.7.3, 13.7.4, 12.12.28, 11.15.7, 10.17.16
info · registry-verified · 2020-02-19 · 6y ago
BURST
3 releases in 1m: 13.7.7, 12.12.29, 10.17.17
info · registry-verified · 2020-02-28 · 6y ago
BURST
2 releases in 5m: 13.9.1, 12.12.30
info · registry-verified · 2020-03-13 · 6y ago
BURST
2 releases in 34m: 13.9.4, 12.12.31
info · registry-verified · 2020-03-25 · 6y ago
BURST
3 releases in 1m: 13.9.5, 12.12.32, 11.15.8
info · registry-verified · 2020-03-27 · 6y ago
BURST
3 releases in 1m: 13.9.6, 12.12.33, 11.15.9
info · registry-verified · 2020-03-30 · 6y ago
BURST
4 releases in 29m: 13.9.7, 12.12.34, 10.17.18, 13.9.8
info · registry-verified · 2020-03-30 · 6y ago
BURST
4 releases in 1m: 13.11.1, 12.12.35, 11.15.10, 10.17.19
info · registry-verified · 2020-04-08 · 6y ago
BURST
3 releases in 1m: 8.10.60, 7.10.10, 6.14.10
info · registry-verified · 2020-04-13 · 6y ago
BURST
4 releases in 2m: 13.13.0, 12.12.36, 11.15.11, 10.17.20
info · registry-verified · 2020-04-17 · 6y ago
BURST
4 releases in 2m: 13.13.2, 12.12.37, 11.15.12, 10.17.21
info · registry-verified · 2020-04-22 · 6y ago
BURST
2 releases in 1m: 13.13.5, 12.12.38
info · registry-verified · 2020-05-05 · 6y ago
BURST
4 releases in 39m: 14.0.0, 13.13.6, 14.0.1, 12.12.39
info · registry-verified · 2020-05-12 · 6y ago
BURST
10 releases in 48m: 14.0.2, 10.17.22, 14.0.3, 12.12.40, 11.15.13, 10.17.23, 9.6.56, 8.10.61, 7.10.11, 13.13.7
info · registry-verified · 2020-05-19 · 6y ago
BURST
5 releases in 2m: 14.0.4, 13.13.8, 12.12.41, 11.15.14, 10.17.24
info · registry-verified · 2020-05-19 · 6y ago
BURST
3 releases in 1m: 14.0.5, 13.13.9, 12.12.42
info · registry-verified · 2020-05-21 · 6y ago
BURST
4 releases in 57m: 14.0.7, 14.0.8, 12.12.43, 14.0.9
info · registry-verified · 2020-06-01 · 5y ago
BURST
3 releases in 1m: 14.0.11, 13.13.10, 12.12.44
info · registry-verified · 2020-06-04 · 5y ago
BURST
5 releases in 2m: 14.0.12, 13.13.11, 12.12.45, 11.15.15, 10.17.25
info · registry-verified · 2020-06-08 · 5y ago
BURST
5 releases in 2m: 14.0.13, 13.13.12, 12.12.47, 11.15.16, 10.17.26
info · registry-verified · 2020-06-09 · 5y ago
BURST
7 releases in 14m: 14.0.15, 14.0.16, 13.13.13, 14.0.17, 12.12.48, 11.15.17, 14.0.18
info · registry-verified · 2020-07-06 · 5y ago
BURST
5 releases in 2m: 14.0.21, 13.13.14, 12.12.49, 11.15.18, 10.17.27
info · registry-verified · 2020-07-10 · 5y ago
BURST
2 releases in 1m: 14.0.24, 12.12.51
info · registry-verified · 2020-07-20 · 5y ago
BURST
7 releases in 3m: 14.0.25, 13.13.15, 12.12.52, 11.15.19, 10.17.28, 9.6.57, 8.10.62
info · registry-verified · 2020-07-23 · 5y ago
BURST
2 releases in 0m: 12.12.53, 11.15.20
info · registry-verified · 2020-07-24 · 5y ago
BURST
9 releases in 4m: 14.6.3, 13.13.16, 12.12.55, 11.15.21, 10.17.29, 9.6.58, 8.10.63, 7.10.12, 6.14.11
info · registry-verified · 2020-09-02 · 5y ago
BURST
4 releases in 1m: 13.13.17, 12.12.56, 11.15.22, 10.17.30
info · registry-verified · 2020-09-08 · 5y ago
BURST
5 releases in 2m: 14.10.0, 13.13.18, 12.12.57, 11.15.23, 10.17.31
info · registry-verified · 2020-09-10 · 5y ago
BURST
5 releases in 2m: 14.10.1, 13.13.19, 12.12.58, 11.15.24, 10.17.32
info · registry-verified · 2020-09-11 · 5y ago
BURST
6 releases in 49m: 10.17.33, 14.10.2, 13.13.20, 12.12.59, 11.15.25, 10.17.34
info · registry-verified · 2020-09-15 · 5y ago
BURST
9 releases in 4m: 14.10.3, 13.13.21, 12.12.60, 11.15.26, 10.17.35, 9.6.59, 8.10.64, 7.10.13, 6.14.12
info · registry-verified · 2020-09-16 · 5y ago
BURST
2 releases in 0m: 12.12.61, 11.15.27
info · registry-verified · 2020-09-16 · 5y ago
BURST
3 releases in 35m: 14.11.0, 12.12.62, 14.11.1
info · registry-verified · 2020-09-17 · 5y ago
BURST
5 releases in 2m: 14.11.4, 13.13.22, 12.12.63, 11.15.28, 10.17.36
info · registry-verified · 2020-10-06 · 5y ago
BURST
5 releases in 2m: 14.11.5, 13.13.23, 12.12.64, 11.15.29, 10.17.37
info · registry-verified · 2020-10-06 · 5y ago
BURST
5 releases in 2m: 14.11.6, 13.13.24, 12.12.65, 11.15.30, 10.17.38
info · registry-verified · 2020-10-08 · 5y ago
BURST
2 releases in 1m: 14.11.7, 12.12.66
info · registry-verified · 2020-10-08 · 5y ago
BURST
5 releases in 2m: 14.11.8, 13.13.25, 12.12.67, 11.15.31, 10.17.39
info · registry-verified · 2020-10-09 · 5y ago
BURST
11 releases in 4m: 14.11.9, 13.13.26, 12.12.68, 11.15.32, 10.17.40, 9.6.60, 8.10.65, 7.10.14, 6.14.13, 4.9.5, 0.12.25
info · registry-verified · 2020-10-16 · 5y ago
BURST
3 releases in 1m: 14.14.0, 13.13.27, 12.12.69
info · registry-verified · 2020-10-20 · 5y ago
BURST
3 releases in 1m: 14.14.1, 12.12.70, 10.17.41
info · registry-verified · 2020-10-21 · 5y ago
BURST
5 releases in 2m: 14.14.2, 13.13.28, 12.19.0, 11.15.33, 10.17.42
info · registry-verified · 2020-10-21 · 5y ago
BURST
6 releases in 10m: 14.14.4, 14.14.5, 13.13.29, 12.19.2, 11.15.34, 10.17.43
info · registry-verified · 2020-10-26 · 5y ago
BURST
7 releases in 3m: 14.14.6, 13.13.30, 12.19.3, 11.15.35, 10.17.44, 9.6.61, 8.10.66
info · registry-verified · 2020-10-28 · 5y ago
BURST
2 releases in 1m: 14.14.7, 12.19.4
info · registry-verified · 2020-11-09 · 5y ago
BURST
5 releases in 2m: 14.14.8, 13.13.31, 12.19.5, 11.15.36, 10.17.45
info · registry-verified · 2020-11-17 · 5y ago
BURST
5 releases in 2m: 14.14.9, 13.13.32, 12.19.6, 11.15.37, 10.17.46
info · registry-verified · 2020-11-19 · 5y ago
BURST
5 releases in 2m: 14.14.10, 13.13.33, 12.19.7, 11.15.38, 10.17.47
info · registry-verified · 2020-11-25 · 5y ago
BURST
4 releases in 1m: 13.13.34, 12.19.8, 11.15.39, 10.17.48
info · registry-verified · 2020-11-30 · 5y ago
BURST
2 releases in 1m: 14.14.11, 13.13.35
info · registry-verified · 2020-12-08 · 5y ago
BURST
5 releases in 2m: 14.14.13, 13.13.36, 12.19.9, 11.15.40, 10.17.49
info · registry-verified · 2020-12-12 · 5y ago
BURST
9 releases in 13m: 14.14.15, 13.13.37, 12.19.10, 11.15.41, 14.14.16, 13.13.38, 12.19.11, 11.15.42, 10.17.50
info · registry-verified · 2020-12-23 · 5y ago
BURST
2 releases in 33m: 14.14.18, 14.14.19
info · registry-verified · 2021-01-01 · 5y ago
BURST
4 releases in 2m: 14.14.20, 13.13.39, 12.19.12, 11.15.43
info · registry-verified · 2021-01-04 · 5y ago
BURST
5 releases in 2m: 14.14.21, 13.13.40, 12.19.14, 11.15.44, 10.17.51
info · registry-verified · 2021-01-14 · 5y ago
BURST
3 releases in 50m: 14.14.23, 13.13.41, 14.14.24
info · registry-verified · 2021-02-03 · 5y ago
BURST
2 releases in 1m: 14.14.25, 12.19.16
info · registry-verified · 2021-02-04 · 5y ago
BURST
2 releases in 1m: 14.14.27, 12.20.0
info · registry-verified · 2021-02-12 · 5y ago
BURST
5 releases in 2m: 14.14.28, 13.13.42, 12.20.1, 11.15.45, 10.17.52
info · registry-verified · 2021-02-14 · 5y ago
BURST
5 releases in 2m: 14.14.29, 13.13.43, 12.20.2, 11.15.46, 10.17.53
info · registry-verified · 2021-02-18 · 5y ago
BURST
3 releases in 1m: 14.14.30, 13.13.44, 12.20.3
info · registry-verified · 2021-02-19 · 5y ago
BURST
5 releases in 2m: 14.14.31, 13.13.45, 12.20.4, 11.15.47, 10.17.54
info · registry-verified · 2021-02-19 · 5y ago
BURST
2 releases in 0m: 11.15.48, 10.17.55
info · registry-verified · 2021-03-07 · 5y ago
BURST
3 releases in 2m: 14.14.33, 13.13.46, 12.20.5
info · registry-verified · 2021-03-09 · 5y ago
BURST
4 releases in 2m: 14.14.35, 13.13.47, 12.20.6, 11.15.49
info · registry-verified · 2021-03-15 · 5y ago
BURST
5 releases in 2m: 14.14.37, 13.13.48, 12.20.7, 11.15.50, 10.17.56
info · registry-verified · 2021-03-27 · 5y ago
BURST
6 releases in 32m: 14.14.38, 14.14.39, 13.13.49, 12.20.8, 11.15.51, 10.17.57
info · registry-verified · 2021-04-14 · 5y ago
BURST
5 releases in 2m: 14.14.41, 13.13.50, 12.20.9, 11.15.52, 10.17.58
info · registry-verified · 2021-04-15 · 5y ago
BURST
2 releases in 1m: 15.0.0, 14.14.42
info · registry-verified · 2021-04-26 · 5y ago
BURST
6 releases in 2m: 15.0.1, 14.14.43, 13.13.51, 12.20.11, 11.15.53, 10.17.59
info · registry-verified · 2021-04-27 · 5y ago
BURST
3 releases in 1m: 15.0.2, 14.14.44, 12.20.12
info · registry-verified · 2021-05-04 · 5y ago
BURST
6 releases in 2m: 15.0.3, 14.14.45, 13.13.52, 12.20.13, 11.15.54, 10.17.60
info · registry-verified · 2021-05-12 · 5y ago
BURST
2 releases in 1m: 15.6.1, 14.17.1
info · registry-verified · 2021-05-25 · 5y ago
BURST
3 releases in 1m: 15.6.2, 14.17.2, 12.20.14
info · registry-verified · 2021-06-02 · 4y ago
BURST
3 releases in 1m: 15.12.2, 14.17.3, 12.20.15
info · registry-verified · 2021-06-07 · 4y ago
BURST
2 releases in 1m: 16.0.0, 15.14.1
info · registry-verified · 2021-07-03 · 4y ago
BURST
3 releases in 1m: 16.0.1, 14.17.5, 12.20.16
info · registry-verified · 2021-07-07 · 4y ago
BURST
2 releases in 1m: 16.3.1, 15.14.2
info · registry-verified · 2021-07-09 · 4y ago
BURST
4 releases in 1m: 16.4.2, 15.14.3, 14.17.6, 12.20.17
info · registry-verified · 2021-07-24 · 4y ago
BURST
2 releases in 1m: 16.4.6, 15.14.4
info · registry-verified · 2021-07-28 · 4y ago
BURST
4 releases in 1m: 16.4.10, 15.14.5, 14.17.7, 12.20.18
info · registry-verified · 2021-08-01 · 4y ago
BURST
3 releases in 1m: 16.4.11, 15.14.6, 14.17.8
info · registry-verified · 2021-08-04 · 4y ago
BURST
4 releases in 2m: 16.4.12, 15.14.7, 14.17.9, 12.20.19
info · registry-verified · 2021-08-04 · 4y ago
BURST
3 releases in 1m: 16.6.2, 15.14.8, 14.17.10
info · registry-verified · 2021-08-18 · 4y ago
BURST
4 releases in 1m: 16.7.1, 15.14.9, 14.17.11, 12.20.20
info · registry-verified · 2021-08-21 · 4y ago
BURST
3 releases in 1m: 16.7.2, 14.17.12, 12.20.21
info · registry-verified · 2021-08-26 · 4y ago
BURST
3 releases in 1m: 16.7.9, 14.17.13, 12.20.22
info · registry-verified · 2021-08-31 · 4y ago
BURST
3 releases in 1m: 16.7.10, 14.17.14, 12.20.23
info · registry-verified · 2021-08-31 · 4y ago
BURST
3 releases in 1m: 16.7.13, 14.17.15, 12.20.24
info · registry-verified · 2021-09-07 · 4y ago
BURST
2 releases in 0m: 14.17.16, 12.20.25
info · registry-verified · 2021-09-14 · 4y ago
BURST
2 releases in 1m: 16.9.2, 14.17.17
info · registry-verified · 2021-09-16 · 4y ago
BURST
4 releases in 29m: 16.9.5, 14.17.18, 12.20.26, 16.9.6
info · registry-verified · 2021-09-21 · 4y ago
BURST
3 releases in 1m: 16.10.1, 14.17.19, 12.20.27
info · registry-verified · 2021-09-25 · 4y ago
BURST
2 releases in 1m: 16.10.2, 14.17.20
info · registry-verified · 2021-09-29 · 4y ago
BURST
3 releases in 1m: 16.10.3, 14.17.21, 12.20.28
info · registry-verified · 2021-10-05 · 4y ago
BURST
3 releases in 1m: 16.10.4, 14.17.22, 12.20.29
info · registry-verified · 2021-10-12 · 4y ago
BURST
4 releases in 60m: 16.10.6, 14.17.23, 12.20.30, 16.10.7
info · registry-verified · 2021-10-13 · 4y ago
BURST
3 releases in 60m: 14.17.24, 12.20.31, 16.10.8
info · registry-verified · 2021-10-13 · 4y ago
BURST
2 releases in 0m: 14.17.25, 12.20.32
info · registry-verified · 2021-10-13 · 4y ago
BURST
3 releases in 1m: 16.10.9, 14.17.26, 12.20.33
info · registry-verified · 2021-10-13 · 4y ago
BURST
2 releases in 1m: 16.11.0, 14.17.27
info · registry-verified · 2021-10-14 · 4y ago
BURST
2 releases in 1m: 16.11.3, 14.17.28
info · registry-verified · 2021-10-22 · 4y ago
BURST
3 releases in 1m: 16.11.4, 14.17.29, 12.20.34
info · registry-verified · 2021-10-22 · 4y ago
BURST
3 releases in 1m: 16.11.5, 14.17.30, 12.20.35
info · registry-verified · 2021-10-25 · 4y ago
BURST
3 releases in 1m: 16.11.6, 14.17.32, 12.20.36
info · registry-verified · 2021-10-25 · 4y ago
BURST
3 releases in 1m: 16.11.7, 14.17.33, 12.20.37
info · registry-verified · 2021-11-08 · 4y ago
BURST
2 releases in 1m: 16.11.8, 14.17.34
info · registry-verified · 2021-11-18 · 4y ago
BURST
2 releases in 1m: 17.0.0, 16.11.14
info · registry-verified · 2021-12-15 · 4y ago
BURST
4 releases in 2m: 17.0.2, 16.11.15, 14.18.2, 12.20.38
info · registry-verified · 2021-12-20 · 4y ago
BURST
2 releases in 1m: 17.0.3, 16.11.16
info · registry-verified · 2021-12-23 · 4y ago
BURST
2 releases in 1m: 17.0.4, 16.11.17
info · registry-verified · 2021-12-23 · 4y ago
BURST
3 releases in 1m: 17.0.5, 14.18.3, 12.20.39
info · registry-verified · 2021-12-26 · 4y ago
BURST
3 releases in 1m: 17.0.6, 14.18.4, 12.20.40
info · registry-verified · 2022-01-01 · 4y ago
BURST
2 releases in 1m: 17.0.7, 16.11.18
info · registry-verified · 2022-01-03 · 4y ago
BURST
4 releases in 2m: 17.0.8, 16.11.19, 14.18.5, 12.20.41
info · registry-verified · 2022-01-04 · 4y ago
BURST
4 releases in 2m: 17.0.9, 16.11.20, 14.18.6, 12.20.42
info · registry-verified · 2022-01-17 · 4y ago
BURST
3 releases in 1m: 17.0.10, 16.11.21, 14.18.8
info · registry-verified · 2022-01-18 · 4y ago
BURST
4 releases in 1m: 17.0.14, 16.11.22, 14.18.10, 12.20.43
info · registry-verified · 2022-02-01 · 4y ago
BURST
4 releases in 2m: 17.0.17, 16.11.23, 14.18.11, 12.20.44
info · registry-verified · 2022-02-10 · 4y ago
BURST
4 releases in 2m: 17.0.18, 16.11.25, 14.18.12, 12.20.46
info · registry-verified · 2022-02-14 · 4y ago
BURST
4 releases in 1m: 17.0.24, 16.11.27, 14.18.13, 12.20.48
info · registry-verified · 2022-04-14 · 4y ago
BURST
4 releases in 1m: 17.0.26, 16.11.28, 14.18.14, 12.20.49
info · registry-verified · 2022-04-24 · 4y ago
BURST
3 releases in 1m: 17.0.27, 16.11.29, 14.18.15
info · registry-verified · 2022-04-25 · 4y ago
BURST
2 releases in 1m: 17.0.28, 16.11.30
info · registry-verified · 2022-04-26 · 4y ago
BURST
4 releases in 1m: 17.0.29, 16.11.31, 14.18.16, 12.20.50
info · registry-verified · 2022-04-26 · 4y ago
BURST
2 releases in 1m: 17.0.30, 16.11.32
info · registry-verified · 2022-04-28 · 4y ago
BURST
2 releases in 1m: 17.0.31, 16.11.33
info · registry-verified · 2022-05-01 · 4y ago
BURST
4 releases in 1m: 17.0.32, 16.11.34, 14.18.17, 12.20.51
info · registry-verified · 2022-05-10 · 4y ago
BURST
4 releases in 1m: 17.0.33, 16.11.35, 14.18.18, 12.20.52
info · registry-verified · 2022-05-12 · 4y ago
BURST
2 releases in 1m: 17.0.34, 16.11.36
info · registry-verified · 2022-05-16 · 4y ago
BURST
4 releases in 1m: 17.0.37, 16.11.37, 14.18.19, 12.20.53
info · registry-verified · 2022-05-31 · 4y ago
BURST
4 releases in 1m: 17.0.38, 16.11.38, 14.18.20, 12.20.54
info · registry-verified · 2022-05-31 · 4y ago
BURST
4 releases in 1m: 17.0.41, 16.11.39, 14.18.21, 12.20.55
info · registry-verified · 2022-06-07 · 3y ago
BURST
2 releases in 1m: 17.0.43, 16.11.40
info · registry-verified · 2022-06-14 · 3y ago
BURST
2 releases in 1m: 17.0.44, 16.11.41
info · registry-verified · 2022-06-15 · 3y ago
BURST
2 releases in 1m: 18.0.0, 17.0.45
info · registry-verified · 2022-06-15 · 3y ago
BURST
2 releases in 1m: 18.0.1, 16.11.43
info · registry-verified · 2022-07-03 · 3y ago
BURST
3 releases in 1m: 18.0.4, 16.11.44, 14.18.22
info · registry-verified · 2022-07-13 · 3y ago
BURST
2 releases in 1m: 18.0.5, 16.11.45
info · registry-verified · 2022-07-15 · 3y ago
BURST
2 releases in 1m: 18.6.2, 16.11.46
info · registry-verified · 2022-07-28 · 3y ago
BURST
3 releases in 1m: 18.6.3, 16.11.47, 14.18.23
info · registry-verified · 2022-07-30 · 3y ago
BURST
2 releases in 30m: 18.7.0, 18.7.1
info · registry-verified · 2022-08-10 · 3y ago
BURST
2 releases in 1m: 18.7.2, 16.11.48
info · registry-verified · 2022-08-12 · 3y ago
BURST
3 releases in 1m: 18.7.5, 16.11.49, 14.18.24
info · registry-verified · 2022-08-15 · 3y ago
BURST
2 releases in 1m: 18.7.7, 16.11.50
info · registry-verified · 2022-08-19 · 3y ago
BURST
2 releases in 1m: 18.7.8, 16.11.51
info · registry-verified · 2022-08-19 · 3y ago
BURST
3 releases in 1m: 18.7.9, 16.11.52, 14.18.25
info · registry-verified · 2022-08-21 · 3y ago
BURST
2 releases in 1m: 18.7.10, 16.11.53
info · registry-verified · 2022-08-22 · 3y ago
BURST
3 releases in 1m: 18.7.11, 16.11.54, 14.18.26
info · registry-verified · 2022-08-23 · 3y ago
BURST
2 releases in 1m: 18.7.12, 16.11.56
info · registry-verified · 2022-08-24 · 3y ago
BURST
3 releases in 1m: 18.7.15, 16.11.57, 14.18.27
info · registry-verified · 2022-09-05 · 3y ago
BURST
3 releases in 1m: 18.7.16, 16.11.58, 14.18.28
info · registry-verified · 2022-09-07 · 3y ago
BURST
3 releases in 1m: 18.7.18, 16.11.59, 14.18.29
info · registry-verified · 2022-09-13 · 3y ago
BURST
3 releases in 1m: 18.7.19, 16.11.60, 14.18.30
info · registry-verified · 2022-09-23 · 3y ago
BURST
2 releases in 1m: 18.7.22, 16.11.61
info · registry-verified · 2022-09-26 · 3y ago
BURST
3 releases in 1m: 18.7.23, 16.11.62, 14.18.31
info · registry-verified · 2022-09-26 · 3y ago
BURST
2 releases in 1m: 18.8.0, 16.11.63
info · registry-verified · 2022-10-02 · 3y ago
BURST
2 releases in 1m: 18.8.1, 16.11.64
info · registry-verified · 2022-10-03 · 3y ago
BURST
3 releases in 1m: 18.8.4, 16.11.65, 14.18.32
info · registry-verified · 2022-10-10 · 3y ago
BURST
3 releases in 60m: 18.11.1, 16.11.67, 18.11.2
info · registry-verified · 2022-10-18 · 3y ago
BURST
2 releases in 1m: 18.11.4, 16.18.0
info · registry-verified · 2022-10-23 · 3y ago
BURST
2 releases in 1m: 18.11.6, 16.18.1
info · registry-verified · 2022-10-26 · 3y ago
BURST
3 releases in 1m: 18.11.7, 16.18.2, 14.18.33
info · registry-verified · 2022-10-26 · 3y ago
BURST
2 releases in 1m: 18.11.8, 16.18.3
info · registry-verified · 2022-10-30 · 3y ago
BURST
3 releases in 1m: 18.11.10, 16.18.4, 14.18.34
info · registry-verified · 2022-11-30 · 3y ago
BURST
3 releases in 31m: 16.18.5, 18.11.11, 16.18.6
info · registry-verified · 2022-12-05 · 3y ago
BURST
2 releases in 1m: 18.11.12, 16.18.7
info · registry-verified · 2022-12-08 · 3y ago
BURST
2 releases in 1m: 18.11.13, 16.18.8
info · registry-verified · 2022-12-10 · 3y ago
BURST
2 releases in 1m: 18.11.15, 16.18.9
info · registry-verified · 2022-12-13 · 3y ago
BURST
3 releases in 2m: 18.11.16, 16.18.10, 14.18.35
info · registry-verified · 2022-12-16 · 3y ago
BURST
3 releases in 1m: 18.11.18, 16.18.11, 14.18.36
info · registry-verified · 2022-12-26 · 3y ago
BURST
2 releases in 1m: 18.11.19, 16.18.12
info · registry-verified · 2023-02-04 · 3y ago
BURST
2 releases in 1m: 18.14.2, 16.18.13
info · registry-verified · 2023-02-26 · 3y ago
BURST
3 releases in 1m: 18.14.3, 16.18.14, 14.18.37
info · registry-verified · 2023-03-02 · 3y ago
BURST
2 releases in 1m: 18.15.2, 16.18.15
info · registry-verified · 2023-03-13 · 3y ago
BURST
3 releases in 1m: 18.15.3, 16.18.16, 14.18.38
info · registry-verified · 2023-03-14 · 3y ago
BURST
6 releases in 31m: 18.15.4, 16.18.17, 14.18.39, 18.15.5, 16.18.18, 14.18.40
info · registry-verified · 2023-03-20 · 3y ago
BURST
2 releases in 1m: 18.15.6, 16.18.19
info · registry-verified · 2023-03-23 · 3y ago
BURST
2 releases in 1m: 18.15.8, 16.18.20
info · registry-verified · 2023-03-24 · 3y ago
BURST
3 releases in 1m: 18.15.10, 16.18.21, 14.18.41
info · registry-verified · 2023-03-25 · 3y ago
BURST
3 releases in 1m: 18.15.11, 16.18.22, 14.18.42
info · registry-verified · 2023-03-28 · 3y ago
BURST
2 releases in 1m: 18.15.12, 16.18.24
info · registry-verified · 2023-04-19 · 3y ago
BURST
3 releases in 1m: 18.16.1, 16.18.25, 14.18.43
info · registry-verified · 2023-04-25 · 3y ago
BURST
2 releases in 1m: 20.0.0, 18.16.4
info · registry-verified · 2023-05-05 · 3y ago
BURST
4 releases in 1m: 20.1.0, 18.16.5, 16.18.26, 14.18.45
info · registry-verified · 2023-05-05 · 3y ago
BURST
4 releases in 1m: 20.1.1, 18.16.6, 16.18.27, 14.18.46
info · registry-verified · 2023-05-08 · 3y ago
BURST
3 releases in 2m: 20.1.2, 18.16.7, 16.18.28
info · registry-verified · 2023-05-10 · 3y ago
BURST
3 releases in 1m: 20.1.3, 18.16.8, 16.18.29
info · registry-verified · 2023-05-11 · 3y ago
BURST
4 releases in 1m: 20.1.4, 18.16.9, 16.18.30, 14.18.47
info · registry-verified · 2023-05-13 · 3y ago
BURST
2 releases in 1m: 20.1.5, 18.16.10
info · registry-verified · 2023-05-16 · 3y ago
BURST
2 releases in 2m: 20.1.6, 18.16.11
info · registry-verified · 2023-05-16 · 3y ago
BURST
3 releases in 1m: 20.1.7, 18.16.12, 16.18.31
info · registry-verified · 2023-05-16 · 3y ago
BURST
2 releases in 2m: 20.2.1, 18.16.13
info · registry-verified · 2023-05-18 · 3y ago
BURST
3 releases in 1m: 20.2.2, 18.16.14, 16.18.32
info · registry-verified · 2023-05-21 · 3y ago
BURST
4 releases in 2m: 20.2.4, 18.16.15, 16.18.33, 14.18.48
info · registry-verified · 2023-05-25 · 3y ago
BURST
3 releases in 1m: 20.2.5, 18.16.16, 16.18.34
info · registry-verified · 2023-05-26 · 3y ago
BURST
4 releases in 1m: 20.2.6, 18.16.17, 16.18.35, 14.18.49
info · registry-verified · 2023-06-10 · 2y ago
BURST
4 releases in 2m: 20.3.1, 18.16.18, 16.18.36, 14.18.51
info · registry-verified · 2023-06-13 · 2y ago
BURST
2 releases in 0m: 16.18.37, 14.18.52
info · registry-verified · 2023-06-26 · 2y ago
BURST
4 releases in 1m: 20.3.3, 18.16.19, 16.18.38, 14.18.53
info · registry-verified · 2023-06-30 · 2y ago
BURST
4 releases in 1m: 20.4.3, 18.16.20, 16.18.39, 14.18.54
info · registry-verified · 2023-07-21 · 2y ago
BURST
2 releases in 1m: 20.4.4, 18.17.0
info · registry-verified · 2023-07-22 · 2y ago
BURST
2 releases in 2m: 20.4.5, 18.17.1
info · registry-verified · 2023-07-25 · 2y ago
BURST
2 releases in 2m: 20.4.7, 18.17.2
info · registry-verified · 2023-08-04 · 2y ago
BURST
2 releases in 1m: 20.4.8, 18.17.3
info · registry-verified · 2023-08-05 · 2y ago
BURST
3 releases in 1m: 20.4.9, 18.17.4, 16.18.40
info · registry-verified · 2023-08-08 · 2y ago
BURST
2 releases in 2m: 20.4.10, 18.17.5
info · registry-verified · 2023-08-11 · 2y ago
BURST
2 releases in 30m: 18.17.6, 20.5.1
info · registry-verified · 2023-08-18 · 2y ago
BURST
3 releases in 2m: 20.5.2, 18.17.7, 16.18.42
info · registry-verified · 2023-08-22 · 2y ago
BURST
4 releases in 2m: 20.5.3, 18.17.8, 16.18.43, 14.18.55
info · registry-verified · 2023-08-22 · 2y ago
BURST
4 releases in 6m: 20.5.4, 18.17.9, 16.18.44, 14.18.56
info · registry-verified · 2023-08-23 · 2y ago
BURST
6 releases in 31m: 20.5.5, 18.17.10, 16.18.45, 20.5.6, 18.17.11, 16.18.46
info · registry-verified · 2023-08-24 · 2y ago
BURST
2 releases in 1m: 20.5.7, 18.17.12
info · registry-verified · 2023-08-28 · 2y ago
BURST
4 releases in 1m: 20.5.8, 18.17.13, 16.18.47, 14.18.57
info · registry-verified · 2023-09-01 · 2y ago
BURST
4 releases in 2m: 20.5.9, 18.17.14, 16.18.48, 14.18.58
info · registry-verified · 2023-09-02 · 2y ago
BURST
2 releases in 0m: 16.18.49, 14.18.59
info · registry-verified · 2023-09-08 · 2y ago
BURST
3 releases in 1m: 20.6.0, 18.17.15, 16.18.50
info · registry-verified · 2023-09-08 · 2y ago
BURST
4 releases in 1m: 20.6.1, 18.17.16, 16.18.51, 14.18.60
info · registry-verified · 2023-09-15 · 2y ago
BURST
4 releases in 1m: 20.6.2, 18.17.17, 16.18.52, 14.18.61
info · registry-verified · 2023-09-16 · 2y ago
BURST
4 releases in 2m: 20.6.3, 18.17.18, 16.18.53, 14.18.62
info · registry-verified · 2023-09-20 · 2y ago
BURST
4 releases in 1m: 20.6.4, 18.17.19, 16.18.54, 14.18.63
info · registry-verified · 2023-09-23 · 2y ago
BURST
2 releases in 1m: 20.7.0, 18.18.0
info · registry-verified · 2023-09-25 · 2y ago
BURST
3 releases in 1m: 20.7.2, 18.18.1, 16.18.55
info · registry-verified · 2023-09-29 · 2y ago
BURST
3 releases in 2m: 20.8.1, 18.18.2, 16.18.56
info · registry-verified · 2023-10-02 · 2y ago
BURST
3 releases in 2m: 20.8.2, 18.18.3, 16.18.57
info · registry-verified · 2023-10-02 · 2y ago
BURST
3 releases in 1m: 20.8.3, 18.18.4, 16.18.58
info · registry-verified · 2023-10-06 · 2y ago
BURST
2 releases in 1m: 20.8.5, 18.18.5
info · registry-verified · 2023-10-12 · 2y ago
BURST
3 releases in 1m: 20.8.7, 18.18.6, 16.18.59
info · registry-verified · 2023-10-18 · 2y ago
BURST
2 releases in 2m: 20.8.9, 18.18.7
info · registry-verified · 2023-10-25 · 2y ago
BURST
3 releases in 1m: 20.8.10, 18.18.8, 16.18.60
info · registry-verified · 2023-10-31 · 2y ago
BURST
3 releases in 1m: 20.9.0, 18.18.9, 16.18.61
info · registry-verified · 2023-11-07 · 2y ago
BURST
3 releases in 1m: 20.9.2, 18.18.10, 16.18.62
info · registry-verified · 2023-11-18 · 2y ago
BURST
3 releases in 1m: 20.9.3, 18.18.11, 16.18.63
info · registry-verified · 2023-11-21 · 2y ago
BURST
3 releases in 1m: 20.9.4, 18.18.12, 16.18.64
info · registry-verified · 2023-11-22 · 2y ago
BURST
3 releases in 1m: 20.9.5, 18.18.13, 16.18.65
info · registry-verified · 2023-11-23 · 2y ago
BURST
3 releases in 1m: 20.10.1, 18.18.14, 16.18.66
info · registry-verified · 2023-11-29 · 2y ago
BURST
2 releases in 1m: 20.10.2, 18.19.1
info · registry-verified · 2023-12-01 · 2y ago
BURST
3 releases in 1m: 20.10.3, 18.19.2, 16.18.67
info · registry-verified · 2023-12-03 · 2y ago
BURST
3 releases in 2m: 20.10.4, 18.19.3, 16.18.68
info · registry-verified · 2023-12-07 · 2y ago
BURST
3 releases in 2m: 20.10.6, 18.19.4, 16.18.69
info · registry-verified · 2023-12-30 · 2y ago
BURST
3 releases in 1m: 20.10.7, 18.19.5, 16.18.70
info · registry-verified · 2024-01-07 · 2y ago
BURST
2 releases in 5m: 20.10.8, 18.19.6
info · registry-verified · 2024-01-09 · 2y ago
BURST
3 releases in 2m: 20.11.1, 18.19.7, 16.18.71
info · registry-verified · 2024-01-15 · 2y ago
BURST
2 releases in 1m: 20.11.5, 18.19.8
info · registry-verified · 2024-01-17 · 2y ago
BURST
3 releases in 1m: 20.11.6, 18.19.9, 16.18.75
info · registry-verified · 2024-01-24 · 2y ago
BURST
3 releases in 1m: 20.11.7, 18.19.10, 16.18.76
info · registry-verified · 2024-01-26 · 2y ago
BURST
3 releases in 1m: 20.11.12, 18.19.11, 16.18.77
info · registry-verified · 2024-01-30 · 2y ago
BURST
3 releases in 2m: 20.11.14, 18.19.12, 16.18.78
info · registry-verified · 2024-01-31 · 2y ago
BURST
2 releases in 1m: 20.11.15, 18.19.13
info · registry-verified · 2024-02-01 · 2y ago
BURST
3 releases in 1m: 20.11.16, 18.19.14, 16.18.79
info · registry-verified · 2024-02-01 · 2y ago
BURST
3 releases in 2m: 20.11.17, 18.19.15, 16.18.80
info · registry-verified · 2024-02-08 · 2y ago
BURST
3 releases in 2m: 20.11.18, 18.19.16, 16.18.81
info · registry-verified · 2024-02-15 · 2y ago
BURST
3 releases in 2m: 20.11.19, 18.19.17, 16.18.82
info · registry-verified · 2024-02-15 · 2y ago
BURST
3 releases in 2m: 20.11.20, 18.19.18, 16.18.83
info · registry-verified · 2024-02-22 · 2y ago
BURST
3 releases in 2m: 20.11.21, 18.19.19, 16.18.84
info · registry-verified · 2024-02-27 · 2y ago
BURST
3 releases in 2m: 20.11.22, 18.19.20, 16.18.85
info · registry-verified · 2024-02-28 · 2y ago
BURST
3 releases in 2m: 20.11.23, 18.19.21, 16.18.86
info · registry-verified · 2024-02-29 · 2y ago
BURST
3 releases in 2m: 20.11.25, 18.19.22, 16.18.87
info · registry-verified · 2024-03-06 · 2y ago
BURST
3 releases in 2m: 20.11.26, 18.19.23, 16.18.88
info · registry-verified · 2024-03-11 · 2y ago
BURST
3 releases in 2m: 20.11.27, 18.19.24, 16.18.89
info · registry-verified · 2024-03-13 · 2y ago
BURST
3 releases in 2m: 20.11.29, 18.19.25, 16.18.90
info · registry-verified · 2024-03-18 · 2y ago
BURST
3 releases in 2m: 20.11.30, 18.19.26, 16.18.91
info · registry-verified · 2024-03-19 · 2y ago
BURST
7 releases in 60m: 20.12.0, 18.19.27, 16.18.92, 20.12.1, 18.19.28, 16.18.93, 20.12.2
info · registry-verified · 2024-03-30 · 2y ago
BURST
3 releases in 2m: 20.12.3, 18.19.29, 16.18.94
info · registry-verified · 2024-04-02 · 2y ago
BURST
3 releases in 1m: 20.12.5, 18.19.30, 16.18.95
info · registry-verified · 2024-04-05 · 2y ago
BURST
3 releases in 2m: 20.12.6, 18.19.31, 16.18.96
info · registry-verified · 2024-04-09 · 2y ago
BURST
3 releases in 2m: 20.12.10, 18.19.32, 16.18.97
info · registry-verified · 2024-05-06 · 2y ago
BURST
2 releases in 2m: 20.12.11, 18.19.33
info · registry-verified · 2024-05-08 · 2y ago
BURST
2 releases in 36m: 20.12.14, 20.13.0
info · registry-verified · 2024-05-31 · 1y ago
BURST
3 releases in 2m: 20.14.1, 18.19.34, 16.18.98
info · registry-verified · 2024-06-03 · 1y ago
BURST
2 releases in 0m: 20.14.3, 18.19.35
info · registry-verified · 2024-06-17 · 1y ago
BURST
3 releases in 0m: 20.14.4, 18.19.36, 16.18.99
info · registry-verified · 2024-06-17 · 1y ago
BURST
3 releases in 1m: 20.14.6, 18.19.37, 16.18.100
info · registry-verified · 2024-06-19 · 1y ago
BURST
3 releases in 1m: 20.14.7, 18.19.38, 16.18.101
info · registry-verified · 2024-06-20 · 1y ago
BURST
2 releases in 0m: 20.14.8, 18.19.39
info · registry-verified · 2024-06-22 · 1y ago
BURST
3 releases in 1m: 20.14.11, 18.19.40, 16.18.102
info · registry-verified · 2024-07-16 · 1y ago
BURST
2 releases in 0m: 18.19.41, 16.18.103
info · registry-verified · 2024-07-18 · 1y ago
BURST
3 releases in 0m: 20.14.12, 18.19.42, 16.18.104
info · registry-verified · 2024-07-23 · 1y ago
BURST
2 releases in 0m: 22.0.0, 20.14.13
info · registry-verified · 2024-07-28 · 1y ago
BURST
3 releases in 0m: 22.0.3, 20.14.14, 18.19.43
info · registry-verified · 2024-08-02 · 1y ago
BURST
4 releases in 1m: 22.2.0, 20.14.15, 18.19.44, 16.18.105
info · registry-verified · 2024-08-09 · 1y ago
BURST
2 releases in 0m: 22.4.0, 20.15.0
info · registry-verified · 2024-08-16 · 1y ago
BURST
3 releases in 0m: 22.4.1, 20.16.1, 18.19.45
info · registry-verified · 2024-08-19 · 1y ago
BURST
2 releases in 0m: 18.19.46, 16.18.106
info · registry-verified · 2024-08-26 · 1y ago
BURST
3 releases in 0m: 22.5.1, 20.16.2, 18.19.47
info · registry-verified · 2024-08-28 · 1y ago
BURST
3 releases in 1m: 22.5.2, 20.16.3, 18.19.48
info · registry-verified · 2024-09-01 · 1y ago
BURST
4 releases in 1m: 22.5.3, 20.16.4, 18.19.49, 16.18.107
info · registry-verified · 2024-09-04 · 1y ago
BURST
4 releases in 1m: 22.5.4, 20.16.5, 18.19.50, 16.18.108
info · registry-verified · 2024-09-04 · 1y ago
BURST
2 releases in 0m: 22.6.1, 20.16.6
info · registry-verified · 2024-09-23 · 1y ago
BURST
5 releases in 26m: 22.6.2, 20.16.7, 18.19.51, 16.18.109, 22.7.0
info · registry-verified · 2024-09-25 · 1y ago
BURST
4 releases in 1m: 22.7.1, 20.16.8, 18.19.52, 16.18.110
info · registry-verified · 2024-09-25 · 1y ago
BURST
4 releases in 1m: 22.7.2, 20.16.9, 18.19.53, 16.18.111
info · registry-verified · 2024-09-25 · 1y ago
BURST
4 releases in 1m: 22.7.4, 20.16.10, 18.19.54, 16.18.112
info · registry-verified · 2024-09-27 · 1y ago
BURST
4 releases in 1m: 22.7.5, 20.16.11, 18.19.55, 16.18.113
info · registry-verified · 2024-10-07 · 1y ago
BURST
4 releases in 1m: 22.7.6, 20.16.12, 18.19.56, 16.18.114
info · registry-verified · 2024-10-16 · 1y ago
BURST
3 releases in 1m: 22.7.7, 20.16.13, 18.19.57
info · registry-verified · 2024-10-19 · 1y ago
BURST
3 releases in 1m: 22.7.8, 20.16.14, 18.19.58
info · registry-verified · 2024-10-22 · 1y ago
BURST
4 releases in 1m: 22.7.9, 20.16.15, 18.19.59, 16.18.115
info · registry-verified · 2024-10-23 · 1y ago
BURST
2 releases in 0m: 22.8.0, 20.17.1
info · registry-verified · 2024-10-25 · 1y ago
BURST
3 releases in 1m: 22.8.2, 20.17.2, 18.19.60
info · registry-verified · 2024-10-28 · 1y ago
BURST
5 releases in 25m: 22.8.3, 22.8.4, 20.17.3, 18.19.61, 16.18.116
info · registry-verified · 2024-10-29 · 1y ago
BURST
4 releases in 1m: 22.8.5, 20.17.4, 18.19.62, 16.18.117
info · registry-verified · 2024-10-31 · 1y ago
BURST
4 releases in 1m: 22.8.6, 20.17.5, 18.19.63, 16.18.118
info · registry-verified · 2024-10-31 · 1y ago
BURST
4 releases in 1m: 22.8.7, 20.17.6, 18.19.64, 16.18.119
info · registry-verified · 2024-11-03 · 1y ago
BURST
3 releases in 1m: 22.9.3, 20.17.7, 18.19.65
info · registry-verified · 2024-11-23 · 1y ago
BURST
4 releases in 1m: 22.9.4, 20.17.8, 18.19.66, 16.18.120
info · registry-verified · 2024-11-25 · 1y ago
BURST
4 releases in 1m: 22.10.1, 20.17.9, 18.19.67, 16.18.121
info · registry-verified · 2024-11-28 · 1y ago
BURST
4 releases in 1m: 22.10.2, 20.17.10, 18.19.68, 16.18.122
info · registry-verified · 2024-12-11 · 1y ago
BURST
4 releases in 1m: 22.10.3, 20.17.11, 18.19.69, 16.18.123
info · registry-verified · 2025-01-01 · 1y ago
BURST
2 releases in 0m: 20.17.12, 18.19.70
info · registry-verified · 2025-01-06 · 1y ago
BURST
4 releases in 1m: 22.10.7, 20.17.14, 18.19.71, 16.18.124
info · registry-verified · 2025-01-16 · 1y ago
BURST
4 releases in 1m: 22.10.8, 20.17.15, 18.19.73, 16.18.125
info · registry-verified · 2025-01-23 · 1y ago
BURST
3 releases in 1m: 22.10.9, 20.17.16, 18.19.74
info · registry-verified · 2025-01-23 · 1y ago
BURST
4 releases in 1m: 22.13.1, 20.17.17, 18.19.75, 16.18.126
info · registry-verified · 2025-02-04 · 1y ago
BURST
2 releases in 0m: 22.13.2, 20.17.18
info · registry-verified · 2025-02-13 · 1y ago
BURST
4 releases in 33m: 22.13.3, 22.13.4, 20.17.19, 18.19.76
info · registry-verified · 2025-02-13 · 1y ago
BURST
4 releases in 60m: 22.13.6, 20.17.20, 18.19.77, 22.13.7
info · registry-verified · 2025-02-28 · 1y ago
BURST
2 releases in 0m: 20.17.21, 18.19.78
info · registry-verified · 2025-02-28 · 1y ago
BURST
2 releases in 0m: 22.13.8, 20.17.22
info · registry-verified · 2025-03-01 · 1y ago
BURST
3 releases in 1m: 22.13.9, 20.17.23, 18.19.79
info · registry-verified · 2025-03-03 · 1y ago
BURST
3 releases in 1m: 22.13.10, 20.17.24, 18.19.80
info · registry-verified · 2025-03-08 · 1y ago
BURST
3 releases in 1m: 22.13.11, 20.17.25, 18.19.81
info · registry-verified · 2025-03-21 · 1y ago
BURST
3 releases in 1m: 22.13.12, 20.17.26, 18.19.82
info · registry-verified · 2025-03-24 · 1y ago
BURST
3 releases in 1m: 22.13.13, 20.17.27, 18.19.83
info · registry-verified · 2025-03-24 · 1y ago
BURST
3 releases in 1m: 22.13.14, 20.17.28, 18.19.84
info · registry-verified · 2025-03-27 · 1y ago
BURST
3 releases in 1m: 22.13.15, 20.17.29, 18.19.85
info · registry-verified · 2025-04-01 · 1y ago
BURST
3 releases in 0m: 22.13.17, 20.17.30, 18.19.86
info · registry-verified · 2025-04-01 · 1y ago
BURST
3 releases in 0m: 22.15.2, 20.17.31, 18.19.87
info · registry-verified · 2025-04-25 · 1y ago
BURST
2 releases in 0m: 22.15.3, 20.17.32
info · registry-verified · 2025-04-28 · 1y ago
BURST
6 releases in 30m: 22.15.4, 20.17.33, 18.19.88, 22.15.5, 20.17.34, 18.19.89
info · registry-verified · 2025-05-05 · 1y ago
BURST
9 releases in 59m: 22.15.6, 20.17.35, 18.19.90, 22.15.7, 20.17.36, 18.19.91, 22.15.8, 20.17.37, 18.19.92
info · registry-verified · 2025-05-05 · 1y ago
BURST
3 releases in 1m: 22.15.9, 20.17.38, 18.19.93
info · registry-verified · 2025-05-05 · 1y ago
BURST
6 releases in 45m: 22.15.10, 20.17.39, 18.19.94, 22.15.11, 20.17.40, 18.19.95
info · registry-verified · 2025-05-06 · 1y ago
BURST
3 releases in 0m: 22.15.12, 20.17.41, 18.19.96
info · registry-verified · 2025-05-06 · 1y ago
BURST
2 releases in 0m: 22.15.13, 20.17.42
info · registry-verified · 2025-05-06 · 1y ago
BURST
3 releases in 1m: 22.15.14, 20.17.43, 18.19.97
info · registry-verified · 2025-05-06 · 1y ago
BURST
3 releases in 1m: 22.15.15, 20.17.44, 18.19.98
info · registry-verified · 2025-05-07 · 1y ago
BURST
3 releases in 0m: 22.15.16, 20.17.45, 18.19.99
info · registry-verified · 2025-05-08 · 1y ago
BURST
3 releases in 0m: 22.15.17, 20.17.46, 18.19.100
info · registry-verified · 2025-05-08 · 1y ago
BURST
2 releases in 0m: 22.15.18, 20.17.47
info · registry-verified · 2025-05-14 · 1y ago
BURST
3 releases in 0m: 22.15.19, 20.17.48, 18.19.101
info · registry-verified · 2025-05-19 · 1y ago
BURST
3 releases in 0m: 22.15.20, 20.17.49, 18.19.102
info · registry-verified · 2025-05-20 · 1y ago
BURST
3 releases in 0m: 22.15.21, 20.17.50, 18.19.103
info · registry-verified · 2025-05-20 · 1y ago
BURST
3 releases in 0m: 22.15.22, 20.17.51, 18.19.104
info · registry-verified · 2025-05-27 · 1y ago
BURST
3 releases in 1m: 22.15.24, 20.17.52, 18.19.105
info · registry-verified · 2025-05-28 · 1y ago
BURST
6 releases in 26m: 22.15.25, 20.17.53, 18.19.106, 22.15.26, 20.17.54, 18.19.107
info · registry-verified · 2025-05-29 · 1y ago
BURST
3 releases in 0m: 22.15.27, 20.17.55, 18.19.108
info · registry-verified · 2025-05-30 · 1y ago
BURST
3 releases in 0m: 22.15.28, 20.17.56, 18.19.109
info · registry-verified · 2025-05-30 · 1y ago
BURST
3 releases in 0m: 22.15.29, 20.17.57, 18.19.110
info · registry-verified · 2025-05-30 · 1y ago
BURST
3 releases in 1m: 22.15.30, 20.17.58, 18.19.111
info · registry-verified · 2025-06-05 · 11mo ago
BURST
2 releases in 0m: 24.0.0, 22.15.31
info · registry-verified · 2025-06-10 · 11mo ago
BURST
2 releases in 0m: 24.0.2, 22.15.32
info · registry-verified · 2025-06-16 · 11mo ago
BURST
3 releases in 1m: 24.0.3, 20.19.1, 18.19.112
info · registry-verified · 2025-06-16 · 11mo ago
BURST
2 releases in 0m: 24.0.4, 22.15.33
info · registry-verified · 2025-06-24 · 11mo ago
BURST
4 releases in 0m: 24.0.7, 22.15.34, 20.19.2, 18.19.113
info · registry-verified · 2025-06-28 · 11mo ago
BURST
4 releases in 1m: 24.0.9, 22.15.35, 20.19.3, 18.19.114
info · registry-verified · 2025-07-01 · 11mo ago
BURST
4 releases in 0m: 24.0.10, 22.16.0, 20.19.4, 18.19.115
info · registry-verified · 2025-07-01 · 11mo ago
BURST
4 releases in 0m: 24.0.11, 22.16.1, 20.19.5, 18.19.116
info · registry-verified · 2025-07-08 · 10mo ago
BURST
4 releases in 1m: 24.0.12, 22.16.2, 20.19.6, 18.19.117
info · registry-verified · 2025-07-09 · 10mo ago
BURST
4 releases in 0m: 24.0.13, 22.16.3, 20.19.7, 18.19.118
info · registry-verified · 2025-07-10 · 10mo ago
BURST
4 releases in 0m: 24.0.14, 22.16.4, 20.19.8, 18.19.119
info · registry-verified · 2025-07-15 · 10mo ago
BURST
4 releases in 0m: 24.0.15, 22.16.5, 20.19.9, 18.19.120
info · registry-verified · 2025-07-19 · 10mo ago
BURST
4 releases in 1m: 24.2.1, 22.17.1, 20.19.10, 18.19.122
info · registry-verified · 2025-08-08 · 9mo ago
BURST
4 releases in 0m: 24.3.0, 22.17.2, 20.19.11, 18.19.123
info · registry-verified · 2025-08-15 · 9mo ago
BURST
4 releases in 0m: 24.3.1, 22.18.1, 20.19.13, 18.19.124
info · registry-verified · 2025-09-04 · 8mo ago
BURST
2 releases in 0m: 24.3.2, 22.18.2
info · registry-verified · 2025-09-12 · 8mo ago
BURST
3 releases in 0m: 24.3.3, 22.18.3, 20.19.14
info · registry-verified · 2025-09-13 · 8mo ago
BURST
4 releases in 1m: 24.5.0, 22.18.4, 20.19.15, 18.19.125
info · registry-verified · 2025-09-15 · 8mo ago
BURST
4 releases in 0m: 24.5.1, 22.18.5, 20.19.16, 18.19.126
info · registry-verified · 2025-09-16 · 8mo ago
BURST
4 releases in 0m: 24.5.2, 22.18.6, 20.19.17, 18.19.127
info · registry-verified · 2025-09-18 · 8mo ago
BURST
4 releases in 0m: 24.6.0, 22.18.7, 20.19.18, 18.19.128
info · registry-verified · 2025-09-29 · 8mo ago
BURST
4 releases in 0m: 24.6.1, 22.18.8, 20.19.19, 18.19.129
info · registry-verified · 2025-09-30 · 8mo ago
BURST
4 releases in 0m: 24.7.1, 22.18.9, 20.19.20, 18.19.130
info · registry-verified · 2025-10-09 · 7mo ago
BURST
3 releases in 0m: 24.7.2, 22.18.10, 20.19.21
info · registry-verified · 2025-10-11 · 7mo ago
BURST
3 releases in 0m: 24.8.1, 22.18.11, 20.19.22
info · registry-verified · 2025-10-17 · 7mo ago
BURST
3 releases in 0m: 24.9.1, 22.18.12, 20.19.23
info · registry-verified · 2025-10-21 · 7mo ago
BURST
3 releases in 0m: 24.9.2, 22.18.13, 20.19.24
info · registry-verified · 2025-10-28 · 7mo ago
BURST
2 releases in 0m: 24.10.0, 22.19.0
info · registry-verified · 2025-11-03 · 6mo ago
BURST
3 releases in 0m: 24.10.1, 22.19.1, 20.19.25
info · registry-verified · 2025-11-11 · 6mo ago
BURST
3 releases in 0m: 24.10.2, 22.19.2, 20.19.26
info · registry-verified · 2025-12-08 · 5mo ago
BURST
2 releases in 0m: 25.0.0, 24.10.3
info · registry-verified · 2025-12-10 · 5mo ago
BURST
4 releases in 0m: 25.0.2, 24.10.4, 22.19.3, 20.19.27
info · registry-verified · 2025-12-14 · 5mo ago
BURST
7 releases in 43m: 25.0.4, 24.10.5, 22.19.4, 20.19.28, 25.0.5, 24.10.6, 22.19.5
info · registry-verified · 2026-01-10 · 4mo ago
BURST
2 releases in 0m: 25.0.6, 24.10.7
info · registry-verified · 2026-01-10 · 4mo ago
BURST
4 releases in 1m: 25.0.8, 24.10.8, 22.19.6, 20.19.29
info · registry-verified · 2026-01-13 · 4mo ago
BURST
4 releases in 33m: 25.0.9, 24.10.9, 22.19.7, 20.19.30
info · registry-verified · 2026-01-15 · 4mo ago
BURST
3 releases in 0m: 24.10.10, 22.19.8, 20.19.31
info · registry-verified · 2026-02-03 · 3mo ago
BURST
4 releases in 0m: 25.2.1, 24.10.11, 22.19.9, 20.19.32
info · registry-verified · 2026-02-05 · 3mo ago
BURST
4 releases in 1m: 25.2.2, 24.10.12, 22.19.10, 20.19.33
info · registry-verified · 2026-02-08 · 3mo ago
BURST
3 releases in 0m: 25.2.3, 24.10.13, 22.19.11
info · registry-verified · 2026-02-10 · 3mo ago
BURST
4 releases in 1m: 25.3.1, 24.10.14, 22.19.12, 20.19.34
info · registry-verified · 2026-02-26 · 3mo ago
BURST
4 releases in 1m: 25.3.2, 24.10.15, 22.19.13, 20.19.35
info · registry-verified · 2026-02-26 · 3mo ago
BURST
4 releases in 1m: 25.3.4, 24.11.1, 22.19.14, 20.19.36
info · registry-verified · 2026-03-05 · 2mo ago
BURST
4 releases in 1m: 25.3.5, 24.11.2, 22.19.15, 20.19.37
info · registry-verified · 2026-03-06 · 2mo ago
BURST
4 releases in 0m: 25.5.1, 24.12.1, 22.19.16, 20.19.38
info · registry-verified · 2026-04-03 · 1mo ago
BURST
4 releases in 0m: 25.5.2, 24.12.2, 22.19.17, 20.19.39
info · registry-verified · 2026-04-03 · 1mo ago
BURST
4 releases in 0m: 25.6.2, 24.12.3, 22.19.18, 20.19.40 · ACTIVE
info · registry-verified · 2026-05-07 · 23d ago
BURST
3 releases in 0m: 24.12.4, 22.19.19, 20.19.41 · ACTIVE
info · registry-verified · 2026-05-11 · 19d ago
release diff 25.9.0 → 25.9.1
+0 added · -0 removed · ~3 modified
package.json +2 lines
--- +++ @@ -2,3 +2,3 @@     "name": "@types/node",-    "version": "25.9.0",+    "version": "25.9.1",     "description": "TypeScript definitions for node",@@ -152,3 +152,3 @@     "peerDependencies": {},-    "typesPublisherContentHash": "2c46dd4d6ce51acbd418cda854101b97987beaea870ba7b8c1a22436b4a0a28c",+    "typesPublisherContentHash": "2546f5f588e15fc9aa202a3005dab2859d006fd48a8448107741e5ce184e9098",     "typeScriptVersion": "5.3"
stream/iter.d.ts +4 lines
--- +++ @@ -113,3 +113,6 @@     interface StatelessTransformFn {-        (chunks: Uint8Array[] | null, options: TransformCallbackOptions): TransformResult | null;+        (+            chunks: Uint8Array[] | null,+            options: TransformCallbackOptions,+        ): Promise<TransformResult | null> | TransformResult | null;     }
@types/react npm
19.2.15 11d ago nominal
BURST ×107
latest 19.2.15 versions 700 maintainers 1
19.2.12
18.3.28
17.0.91
16.14.69
15.7.36
19.2.13
19.2.14
19.2.15
18.3.29
17.0.92
16.14.70
15.7.37
BURST
2 releases in 28m: 15.0.19, 15.0.20
info · registry-verified · 2017-03-24 · 9y ago
BURST
2 releases in 0m: 16.0.0, 15.6.1
info · registry-verified · 2017-08-01 · 8y ago
BURST
2 releases in 0m: 16.0.6, 15.6.3
info · registry-verified · 2017-09-25 · 8y ago
BURST
2 releases in 6m: 15.6.4, 16.0.7
info · registry-verified · 2017-09-25 · 8y ago
BURST
2 releases in 0m: 16.0.17, 15.6.5
info · registry-verified · 2017-10-22 · 8y ago
BURST
2 releases in 0m: 16.0.23, 15.6.7
info · registry-verified · 2017-11-15 · 8y ago
BURST
2 releases in 23m: 15.6.9, 16.0.30
info · registry-verified · 2017-12-13 · 8y ago
BURST
2 releases in 0m: 16.0.34, 15.6.11
info · registry-verified · 2018-01-03 · 8y ago
BURST
2 releases in 1m: 15.6.12, 16.0.35
info · registry-verified · 2018-01-24 · 8y ago
BURST
2 releases in 0m: 16.0.37, 15.6.13
info · registry-verified · 2018-02-12 · 8y ago
BURST
2 releases in 1m: 15.6.14, 16.0.38
info · registry-verified · 2018-02-13 · 8y ago
BURST
2 releases in 0m: 16.1.0, 15.6.15
info · registry-verified · 2018-03-27 · 8y ago
BURST
2 releases in 10m: 15.6.16, 16.3.15
info · registry-verified · 2018-05-31 · 8y ago
BURST
2 releases in 12m: 15.6.17, 16.4.1
info · registry-verified · 2018-06-20 · 7y ago
BURST
2 releases in 0m: 15.6.18, 16.4.4
info · registry-verified · 2018-06-28 · 7y ago
BURST
2 releases in 0m: 15.6.19, 16.4.8
info · registry-verified · 2018-08-06 · 7y ago
BURST
2 releases in 40m: 16.7.0, 16.7.1
info · registry-verified · 2018-11-09 · 7y ago
BURST
2 releases in 0m: 15.6.20, 16.7.3
info · registry-verified · 2018-11-11 · 7y ago
BURST
2 releases in 2m: 15.6.21, 16.7.8
info · registry-verified · 2018-11-28 · 7y ago
BURST
2 releases in 0m: 16.8.3, 15.6.22
info · registry-verified · 2019-02-13 · 7y ago
BURST
2 releases in 0m: 16.8.14, 15.6.24
info · registry-verified · 2019-04-19 · 7y ago
BURST
2 releases in 0m: 16.8.19, 15.6.25
info · registry-verified · 2019-05-28 · 7y ago
BURST
2 releases in 0m: 16.8.20, 15.6.26
info · registry-verified · 2019-06-13 · 6y ago
BURST
2 releases in 0m: 16.8.24, 15.6.27
info · registry-verified · 2019-07-31 · 6y ago
BURST
3 releases in 42m: 16.9.8, 15.6.28, 16.9.9
info · registry-verified · 2019-10-16 · 6y ago
BURST
2 releases in 37m: 16.9.28, 16.9.29
info · registry-verified · 2020-03-31 · 6y ago
BURST
2 releases in 46m: 16.9.40, 16.9.41
info · registry-verified · 2020-06-24 · 5y ago
BURST
2 releases in 0m: 16.9.51, 15.6.30
info · registry-verified · 2020-10-05 · 5y ago
BURST
2 releases in 0m: 16.9.55, 15.6.31
info · registry-verified · 2020-10-28 · 5y ago
BURST
2 releases in 1m: 16.14.0, 15.7.0
info · registry-verified · 2020-11-20 · 5y ago
BURST
2 releases in 0m: 17.0.0, 16.14.1
info · registry-verified · 2020-11-20 · 5y ago
BURST
2 releases in 0m: 17.0.1, 16.14.3
info · registry-verified · 2021-02-02 · 5y ago
BURST
2 releases in 0m: 17.0.2, 16.14.4
info · registry-verified · 2021-02-12 · 5y ago
BURST
2 releases in 0m: 17.0.3, 16.14.5
info · registry-verified · 2021-03-07 · 5y ago
BURST
2 releases in 0m: 17.0.5, 16.14.6
info · registry-verified · 2021-05-04 · 5y ago
BURST
2 releases in 0m: 17.0.8, 16.14.8
info · registry-verified · 2021-05-26 · 5y ago
BURST
2 releases in 0m: 17.0.12, 16.14.9
info · registry-verified · 2021-07-01 · 4y ago
BURST
3 releases in 0m: 17.0.13, 16.14.10, 15.7.1
info · registry-verified · 2021-07-01 · 4y ago
BURST
3 releases in 0m: 17.0.14, 16.14.11, 15.7.2
info · registry-verified · 2021-07-07 · 4y ago
BURST
3 releases in 1m: 17.0.16, 16.14.12, 15.7.3
info · registry-verified · 2021-08-06 · 4y ago
BURST
2 releases in 0m: 17.0.17, 16.14.13
info · registry-verified · 2021-08-11 · 4y ago
BURST
2 releases in 0m: 17.0.19, 16.14.14
info · registry-verified · 2021-08-19 · 4y ago
BURST
2 releases in 0m: 17.0.20, 16.14.15
info · registry-verified · 2021-09-05 · 4y ago
BURST
2 releases in 33m: 17.0.23, 17.0.24
info · registry-verified · 2021-09-21 · 4y ago
BURST
2 releases in 0m: 17.0.25, 15.7.4
info · registry-verified · 2021-09-29 · 4y ago
BURST
2 releases in 0m: 17.0.27, 16.14.16
info · registry-verified · 2021-10-03 · 4y ago
BURST
3 releases in 0m: 17.0.29, 16.14.17, 15.7.5
info · registry-verified · 2021-10-12 · 4y ago
BURST
2 releases in 0m: 17.0.31, 16.14.18
info · registry-verified · 2021-10-21 · 4y ago
BURST
2 releases in 0m: 16.14.19, 15.7.6
info · registry-verified · 2021-10-23 · 4y ago
BURST
2 releases in 0m: 17.0.33, 16.14.20
info · registry-verified · 2021-10-25 · 4y ago
BURST
2 releases in 0m: 17.0.35, 16.14.21
info · registry-verified · 2021-11-15 · 4y ago
BURST
2 releases in 0m: 17.0.39, 16.14.23
info · registry-verified · 2022-02-03 · 4y ago
BURST
3 releases in 0m: 17.0.40, 16.14.24, 15.7.7
info · registry-verified · 2022-03-10 · 4y ago
BURST
2 releases in 0m: 18.0.0, 17.0.44
info · registry-verified · 2022-04-07 · 4y ago
BURST
2 releases in 0m: 18.0.5, 16.14.25
info · registry-verified · 2022-04-14 · 4y ago
BURST
3 releases in 1m: 18.0.9, 17.0.45, 16.14.26
info · registry-verified · 2022-05-06 · 4y ago
BURST
3 releases in 0m: 18.0.13, 17.0.46, 16.14.27
info · registry-verified · 2022-06-16 · 3y ago
BURST
3 releases in 0m: 18.0.14, 17.0.47, 16.14.28
info · registry-verified · 2022-06-16 · 3y ago
BURST
3 releases in 0m: 17.0.48, 16.14.29, 15.7.8
info · registry-verified · 2022-07-27 · 3y ago
BURST
3 releases in 0m: 18.0.16, 16.14.30, 15.7.9
info · registry-verified · 2022-08-07 · 3y ago
BURST
3 releases in 0m: 18.0.18, 17.0.49, 16.14.31
info · registry-verified · 2022-08-30 · 3y ago
BURST
4 releases in 0m: 18.0.20, 17.0.50, 16.14.32, 15.7.10
info · registry-verified · 2022-09-13 · 3y ago
BURST
3 releases in 1m: 18.0.23, 17.0.51, 16.14.33
info · registry-verified · 2022-10-25 · 3y ago
BURST
4 releases in 1m: 18.0.24, 17.0.52, 16.14.34, 15.7.11
info · registry-verified · 2022-10-27 · 3y ago
BURST
4 releases in 1m: 18.0.27, 17.0.53, 16.14.35, 15.7.12
info · registry-verified · 2023-01-18 · 3y ago
BURST
4 releases in 0m: 18.0.30, 17.0.54, 16.14.36, 15.7.13
info · registry-verified · 2023-03-27 · 3y ago
BURST
3 releases in 0m: 18.0.31, 17.0.55, 16.14.37
info · registry-verified · 2023-03-28 · 3y ago
BURST
4 releases in 2m: 18.0.33, 17.0.56, 16.14.38, 15.7.14
info · registry-verified · 2023-04-03 · 3y ago
BURST
3 releases in 1m: 18.0.34, 17.0.57, 16.14.39
info · registry-verified · 2023-04-10 · 3y ago
BURST
4 releases in 0m: 18.0.35, 17.0.58, 16.14.40, 15.7.16
info · registry-verified · 2023-04-12 · 3y ago
BURST
2 releases in 30m: 18.0.36, 18.0.37
info · registry-verified · 2023-04-17 · 3y ago
BURST
4 releases in 0m: 18.2.6, 17.0.59, 16.14.41, 15.7.17
info · registry-verified · 2023-05-06 · 3y ago
BURST
3 releases in 0m: 17.0.60, 16.14.42, 15.7.18
info · registry-verified · 2023-05-25 · 3y ago
BURST
4 releases in 0m: 18.2.10, 17.0.61, 16.14.43, 15.7.19
info · registry-verified · 2023-06-10 · 2y ago
BURST
4 releases in 1m: 18.2.19, 17.0.63, 16.14.44, 15.7.20
info · registry-verified · 2023-08-08 · 2y ago
BURST
4 releases in 0m: 18.2.20, 17.0.64, 16.14.45, 15.7.21
info · registry-verified · 2023-08-09 · 2y ago
BURST
4 releases in 1m: 18.2.21, 17.0.65, 16.14.46, 15.7.22
info · registry-verified · 2023-08-22 · 2y ago
BURST
4 releases in 1m: 18.2.23, 17.0.66, 16.14.47, 15.7.23
info · registry-verified · 2023-09-26 · 2y ago
BURST
3 releases in 0m: 18.2.24, 17.0.67, 16.14.48
info · registry-verified · 2023-10-01 · 2y ago
BURST
4 releases in 0m: 18.2.28, 17.0.68, 16.14.49, 15.7.24
info · registry-verified · 2023-10-10 · 2y ago
BURST
4 releases in 0m: 18.2.29, 17.0.69, 16.14.50, 15.7.25
info · registry-verified · 2023-10-18 · 2y ago
BURST
4 releases in 1m: 18.2.37, 17.0.70, 16.14.51, 15.7.26
info · registry-verified · 2023-11-07 · 2y ago
BURST
4 releases in 0m: 18.2.38, 17.0.71, 16.14.52, 15.7.27
info · registry-verified · 2023-11-21 · 2y ago
BURST
3 releases in 1m: 18.2.44, 17.0.72, 16.14.53
info · registry-verified · 2023-12-12 · 2y ago
BURST
4 releases in 2m: 18.2.45, 17.0.73, 16.14.54, 15.7.28
info · registry-verified · 2023-12-13 · 2y ago
BURST
3 releases in 0m: 18.2.46, 17.0.74, 16.14.55
info · registry-verified · 2023-12-28 · 2y ago
BURST
4 releases in 1m: 18.2.48, 17.0.75, 16.14.56, 15.7.29
info · registry-verified · 2024-01-15 · 2y ago
BURST
4 releases in 1m: 18.2.59, 17.0.76, 16.14.57, 15.7.30
info · registry-verified · 2024-02-26 · 2y ago
BURST
3 releases in 0m: 18.2.66, 17.0.77, 16.14.58
info · registry-verified · 2024-03-14 · 2y ago
BURST
3 releases in 29m: 18.2.67, 17.0.79, 16.14.59
info · registry-verified · 2024-03-18 · 2y ago
BURST
3 releases in 0m: 18.2.71, 17.0.80, 16.14.60
info · registry-verified · 2024-03-26 · 2y ago
BURST
3 releases in 0m: 18.3.6, 17.0.81, 16.14.61
info · registry-verified · 2024-09-16 · 1y ago
BURST
2 releases in 0m: 18.3.7, 17.0.82
info · registry-verified · 2024-09-17 · 1y ago
BURST
3 releases in 0m: 18.3.10, 17.0.83, 16.14.62
info · registry-verified · 2024-09-27 · 1y ago
BURST
2 releases in 0m: 19.0.0, 18.3.14
info · registry-verified · 2024-12-05 · 1y ago
BURST
5 releases in 0m: 19.0.12, 18.3.19, 17.0.84, 16.14.63, 15.7.31
info · registry-verified · 2025-03-19 · 1y ago
BURST
3 releases in 54m: 19.0.13, 19.0.14, 19.1.0
info · registry-verified · 2025-04-02 · 1y ago
BURST
2 releases in 0m: 19.1.3, 18.3.21
info · registry-verified · 2025-05-06 · 1y ago
BURST
4 releases in 0m: 19.1.5, 18.3.22, 17.0.86, 16.14.64
info · registry-verified · 2025-05-21 · 1y ago
BURST
4 releases in 0m: 19.1.6, 18.3.23, 17.0.87, 16.14.65
info · registry-verified · 2025-05-27 · 1y ago
BURST
5 releases in 0m: 19.1.11, 18.3.24, 17.0.88, 16.14.66, 15.7.32
info · registry-verified · 2025-08-22 · 9mo ago
BURST
2 releases in 8m: 15.7.33, 15.7.34
info · registry-verified · 2025-08-22 · 9mo ago
BURST
2 releases in 0m: 19.1.16, 18.3.25
info · registry-verified · 2025-09-30 · 8mo ago
BURST
4 releases in 0m: 19.2.1, 18.3.26, 17.0.89, 16.14.67
info · registry-verified · 2025-10-06 · 7mo ago
BURST
4 releases in 0m: 19.2.6, 18.3.27, 17.0.90, 16.14.68
info · registry-verified · 2025-11-18 · 6mo ago
BURST
6 releases in 27m: 19.2.12, 18.3.28, 17.0.91, 16.14.69, 15.7.36, 19.2.13
info · registry-verified · 2026-02-05 · 3mo ago
BURST
5 releases in 0m: 19.2.15, 18.3.29, 17.0.92, 16.14.70, 15.7.37 · ACTIVE
info · registry-verified · 2026-05-19 · 11d ago
release diff 16.14.70 → 15.7.37
+0 added · -1 removed · ~5 modified
index.d.ts +1959 lines
--- +++ @@ -1,10 +1,38 @@-// NOTE: Users of the `experimental` builds of React should add a reference-// to 'react/experimental' in their project. See experimental.d.ts's top comment-// for reference and documentation on how exactly to do it.--/// <reference path="global.d.ts" />--import * as CSS from "csstype";-import * as PropTypes from "prop-types";-import { Interaction as SchedulerInteraction } from "scheduler/tracing";+/*+Known Problems & Workarounds++1. The type of cloneElement is incorrect.+cloneElement(element, props) should accept props object with a subset of properties on element.props.+React attributes, such as key and ref, should also be accepted in props, but should not exist on element.props.+The "correct" way to model this, then, is with:++declare function cloneElement<P extends Q, Q>(+    element: ReactElement<P>,+    props?: Q & Attributes,+    ...children: ReactNode[]): ReactElement<P>;++However, type inference for Q defaults to {} when intersected with another type.+(https://github.com/Microsoft/TypeScript/pull/5738#issuecomment-181904905)+And since any object is assignable to {}, we would lose the type safety of the P extends Q constraint.+Therefore, the type of props is left as Q, which should work for most cases.+If you need to call cloneElement with key or ref, you'll need a type cast:++interface ButtonProps {+    label: string;+    isDisabled?: boolean;+}+var element: React.CElement<ButtonProps, Button>;++React.cloneElement(element, { label: "label" });++// cloning with optional props requires a cast+React.cloneElement(element, <{ isDisabled?: boolean }>{ isDisabled: true });++// cloning with key or ref requires a cast+React.cloneElement(element, <React.ClassAttributes<Button>>{ ref: button => button.reset() });+React.cloneElement(element, <{ isDisabled?: boolean } & React.Attributes>{+    key: "disabledButton",+    isDisabled: true+});+*/ @@ -15,3 +43,2 @@ type NativeFocusEvent = FocusEvent;-type NativeInputEvent = InputEvent; type NativeKeyboardEvent = KeyboardEvent;@@ -19,3 +46,2 @@ type NativeTouchEvent = TouchEvent;-type NativePointerEvent = PointerEvent; type NativeTransitionEvent = TransitionEvent;@@ -23,8 +49,3 @@ type NativeWheelEvent = WheelEvent;-type Booleanish = boolean | "true" | "false"; type CrossOrigin = "anonymous" | "use-credentials" | "" | undefined;--declare const UNDEFINED_VOID_ONLY: unique symbol;-// Destructors are only allowed to return void.-type Destructor = () => void | { [UNDEFINED_VOID_ONLY]: never }; @@ -39,7 +60,3 @@ -    type ElementType<P = any> =-        | {-            [K in keyof JSX.IntrinsicElements]: P extends JSX.IntrinsicElements[K] ? K : never;-        }[keyof JSX.IntrinsicElements]-        | ComponentType<P>;+    type ElementType<P = any> = string | ComponentType<P>;     /**@@ -48,85 +65,25 @@     type ReactType<P = any> = ElementType<P>;-    type ComponentType<P = {}> = ComponentClass<P> | FunctionComponent<P>;--    type JSXElementConstructor<P> =-        | ((props: P) => ReactElement<any, any> | null)-        | (new(props: P) => Component<any, any>);--    interface RefObject<T> {-        readonly current: T | null;-    }-    type RefCallback<T> = { bivarianceHack(instance: T | null): void }["bivarianceHack"];-    type Ref<T> = RefCallback<T> | RefObject<T> | null;-    type LegacyRef<T> = string | Ref<T>;-    /**-     * Gets the instance type for a React element. The instance will be different for various component types:-     *-     * - React class components will be the class instance. So if you had `class Foo extends React.Component<{}> {}`-     *   and used `React.ElementRef<typeof Foo>` then the type would be the instance of `Foo`.-     * - React stateless functional components do not have a backing instance and so `React.ElementRef<typeof Bar>`-     *   (when `Bar` is `function Bar() {}`) will give you the `undefined` type.-     * - JSX intrinsics like `div` will give you their DOM instance. For `React.ElementRef<'div'>` that would be-     *   `HTMLDivElement`. For `React.ElementRef<'input'>` that would be `HTMLInputElement`.-     * - React stateless functional components that forward a `ref` will give you the `ElementRef` of the forwarded-     *   to component.-     *-     * `C` must be the type _of_ a React component so you need to use typeof as in `React.ElementRef<typeof MyComponent>`.-     *-     * @todo In Flow, this works a little different with forwarded refs and the `AbstractComponent` that-     *       `React.forwardRef()` returns.-     */-    type ElementRef<-        C extends-            | ForwardRefExoticComponent<any>-            | { new(props: any): Component<any> }-            | ((props: any, context?: any) => ReactElement | null)-            | keyof JSX.IntrinsicElements,-    > =-        // need to check first if `ref` is a valid prop for [email protected]-        // otherwise it will infer `{}` instead of `never`-        "ref" extends keyof ComponentPropsWithRef<C> ? NonNullable<ComponentPropsWithRef<C>["ref"]> extends Ref<-                infer Instance-            > ? Instance-            : never-            : never;--    type ComponentState = any;+    type ComponentType<P = {}> = ComponentClass<P> | StatelessComponent<P>;      type Key = string | number;--    /**-     * @internal You shouldn't need to use this type since you never see these attributes-     * inside your component or have to validate them.-     */+    type Ref<T> = string | { bivarianceHack(instance: T | null): any }["bivarianceHack"];++    // eslint-disable-next-line @typescript-eslint/consistent-type-definitions+    type ComponentState = {};+     interface Attributes {-        key?: Key | null | undefined;-    }-    interface RefAttributes<T> extends Attributes {+        key?: Key | undefined;+    }+    interface ClassAttributes<T> extends Attributes {         ref?: Ref<T> | undefined;     }-    interface ClassAttributes<T> extends Attributes {-        ref?: LegacyRef<T> | undefined;-    }--    interface ReactElement<-        P = any,-        T extends string | JSXElementConstructor<any> = string | JSXElementConstructor<any>,-    > {-        type: T;++    interface ReactElement<P = any> {+        type: string | ComponentClass<P> | SFC<P>;         props: P;-        key: string | null;-    }--    interface ReactComponentElement<-        T extends keyof JSX.IntrinsicElements | JSXElementConstructor<any>,-        P = Pick<ComponentProps<T>, Exclude<keyof ComponentProps<T>, "key" | "ref">>,-    > extends ReactElement<P, Exclude<T, number>> {}--    /**-     * @deprecated Please use `FunctionComponentElement`-     */-    type SFCElement<P> = FunctionComponentElement<P>;--    interface FunctionComponentElement<P> extends ReactElement<P, FunctionComponent<P>> {-        ref?: ("ref" extends keyof P ? P extends { ref?: infer R | undefined } ? R : never : never) | undefined;+        key: Key | null;+    }++    interface SFCElement<P> extends ReactElement<P> {+        type: SFC<P>;     }@@ -134,4 +91,5 @@     type CElement<P, T extends Component<P, ComponentState>> = ComponentElement<P, T>;-    interface ComponentElement<P, T extends Component<P, ComponentState>> extends ReactElement<P, ComponentClass<P>> {-        ref?: LegacyRef<T> | undefined;+    interface ComponentElement<P, T extends Component<P, ComponentState>> extends ReactElement<P> {+        type: ComponentClass<P>;+        ref?: Ref<T> | undefined;     }@@ -141,6 +99,5 @@     // string fallback for custom web-components-    interface DOMElement<P extends HTMLAttributes<T> | SVGAttributes<T>, T extends Element>-        extends ReactElement<P, string>-    {-        ref: LegacyRef<T>;+    interface DOMElement<P extends HTMLAttributes<T> | SVGAttributes<T>, T extends Element> extends ReactElement<P> {+        type: string;+        ref: Ref<T>;     }@@ -148,3 +105,2 @@     // ReactHTML for ReactHTMLElement-    // eslint-disable-next-line @typescript-eslint/no-empty-interface     interface ReactHTMLElement<T extends HTMLElement> extends DetailedReactHTMLElement<AllHTMLAttributes<T>, T> {}@@ -160,4 +116,19 @@ -    interface ReactPortal extends ReactElement {-        children: ReactNode;+    interface WebViewHTMLAttributes<T> extends HTMLAttributes<T> {+        allowFullScreen?: boolean | undefined;+        allowpopups?: boolean | undefined;+        autosize?: boolean | undefined;+        blinkfeatures?: string | undefined;+        disableblinkfeatures?: string | undefined;+        disableguestresize?: boolean | undefined;+        disablewebsecurity?: boolean | undefined;+        guestinstance?: string | undefined;+        httpreferrer?: string | undefined;+        nodeintegration?: boolean | undefined;+        partition?: string | undefined;+        plugins?: boolean | undefined;+        preload?: string | undefined;+        src?: string | undefined;+        useragent?: string | undefined;+        webpreferences?: string | undefined;     }@@ -170,11 +141,3 @@ -    /**-     * @deprecated Please use `FunctionComponentFactory`-     */-    type SFCFactory<P> = FunctionComponentFactory<P>;--    type FunctionComponentFactory<P> = (-        props?: Attributes & P,-        ...children: ReactNode[]-    ) => FunctionComponentElement<P>;+    type SFCFactory<P> = (props?: Attributes & P, ...children: ReactNode[]) => SFCElement<P>; @@ -193,3 +156,2 @@ -    // eslint-disable-next-line @typescript-eslint/no-empty-interface     interface HTMLFactory<T extends HTMLElement> extends DetailedHTMLFactory<AllHTMLAttributes<T>, T> {}@@ -209,2 +171,3 @@     // React Nodes+    // http://facebook.github.io/react/docs/glossary.html     // ----------------------------------------------------------------------@@ -216,3 +179,3 @@     type ReactFragment = {} | ReactNodeArray;-    type ReactNode = ReactChild | ReactFragment | ReactPortal | boolean | null | undefined;+    type ReactNode = ReactChild | ReactFragment | boolean | null | undefined; @@ -221,2 +184,4 @@
… 3568 more lines (truncated)
jsx-dev-runtime.d.ts +0 lines
--- +++ @@ -2,3 +2,2 @@ import * as React from "./";-export { Fragment } from "./"; 
jsx-runtime.d.ts +0 lines
--- +++ @@ -2,3 +2,2 @@ import * as React from "./";-export { Fragment } from "./"; 
package.json +6 lines
--- +++ @@ -2,3 +2,3 @@     "name": "@types/react",-    "version": "16.14.70",+    "version": "15.7.37",     "description": "TypeScript definitions for react",@@ -45,55 +45,5 @@         {-            "name": "Josh Rutherford",-            "githubUsername": "theruther4d",-            "url": "https://github.com/theruther4d"-        },-        {-            "name": "Guilherme Hübner",-            "githubUsername": "guilhermehubner",-            "url": "https://github.com/guilhermehubner"-        },-        {-            "name": "Ferdy Budhidharma",-            "githubUsername": "ferdaber",-            "url": "https://github.com/ferdaber"-        },-        {-            "name": "Johann Rakotoharisoa",-            "githubUsername": "jrakotoharisoa",-            "url": "https://github.com/jrakotoharisoa"-        },-        {-            "name": "Olivier Pascal",-            "githubUsername": "pascaloliv",-            "url": "https://github.com/pascaloliv"-        },-        {-            "name": "Martin Hochel",-            "githubUsername": "hotell",-            "url": "https://github.com/hotell"-        },-        {-            "name": "Frank Li",-            "githubUsername": "franklixuefei",-            "url": "https://github.com/franklixuefei"-        },-        {-            "name": "Jessica Franco",-            "githubUsername": "Jessidhia",-            "url": "https://github.com/Jessidhia"-        },-        {-            "name": "Saransh Kataria",-            "githubUsername": "saranshkataria",-            "url": "https://github.com/saranshkataria"-        },-        {-            "name": "Kanitkorn Sujautra",-            "githubUsername": "lukyth",-            "url": "https://github.com/lukyth"-        },-        {-            "name": "Sebastian Silbermann",-            "githubUsername": "eps1lon",-            "url": "https://github.com/eps1lon"+            "name": "Stéphane Goetz",+            "githubUsername": "onigoetz",+            "url": "https://github.com/onigoetz"         },@@ -103,32 +53,2 @@             "url": "https://github.com/zieka"-        },-        {-            "name": "Cong Zhang",-            "githubUsername": "dancerphil",-            "url": "https://github.com/dancerphil"-        },-        {-            "name": "Dimitri Mitropoulos",-            "githubUsername": "dimitropoulos",-            "url": "https://github.com/dimitropoulos"-        },-        {-            "name": "JongChan Choi",-            "githubUsername": "disjukr",-            "url": "https://github.com/disjukr"-        },-        {-            "name": "Victor Magalhães",-            "githubUsername": "vhfmag",-            "url": "https://github.com/vhfmag"-        },-        {-            "name": "Dale Tan",-            "githubUsername": "hellatan",-            "url": "https://github.com/hellatan"-        },-        {-            "name": "Priyanshu Rav",-            "githubUsername": "priyanshurav",-            "url": "https://github.com/priyanshurav"         }@@ -161,9 +81,5 @@     "scripts": {},-    "dependencies": {-        "@types/prop-types": "*",-        "@types/scheduler": "^0.16",-        "csstype": "^3.2.2"-    },+    "dependencies": {},     "peerDependencies": {},-    "typesPublisherContentHash": "b21ad45867dfb24776f7888fa853ef6f6d50271bc5bc28ebf16be65379d6c2f7",+    "typesPublisherContentHash": "7a68adb3408fc8b07f96b6f032a6ba4840a4fc6c024de2f94c559de91a392467",     "typeScriptVersion": "5.3"
babel-loader npm
10.1.1 2mo ago nominal
critical-tier BURST ×6
latest 10.1.1 versions 84 maintainers 4 critical-tier (snapshotted)
9.1.0
8.3.0
9.1.1
9.1.2
9.1.3
8.4.0
9.2.0
8.4.1
9.2.1
10.0.0
10.1.0
10.1.1
BURST
2 releases in 59m: 5.2.1, 5.2.2
info · registry-verified · 2015-06-25 · 10y ago
BURST
2 releases in 8m: 5.4.1, 5.4.2
info · registry-verified · 2016-07-25 · 9y ago
BURST
2 releases in 26m: 9.1.0, 8.3.0
info · registry-verified · 2022-11-03 · 3y ago
BURST
2 releases in 5m: 9.1.1, 9.1.2
info · registry-verified · 2023-01-04 · 3y ago
BURST
2 releases in 1m: 8.4.0, 9.2.0
info · registry-verified · 2024-09-16 · 1y ago
BURST
2 releases in 3m: 8.4.1, 9.2.1
info · registry-verified · 2024-09-16 · 1y ago
release diff 10.1.0 → 10.1.1
+1 added · -0 removed · ~2 modified
lib/cache.js +1 lines
--- +++ @@ -10,3 +10,2 @@  */-const nodeModule = require("node:module"); const os = require("os");@@ -54,10 +53,2 @@ const gzip = promisify(zlib.gzip);-const findRootPackageJSON = () => {-  if (nodeModule.findPackageJSON) {-    return nodeModule.findPackageJSON("..", __filename);-  } else {-    // todo: remove this fallback when dropping support for Node.js < 22.14-    return findUpSync("package.json");-  }-}; @@ -272,3 +263,3 @@   }-  const rootPkgJSONPath = findRootPackageJSON();+  const rootPkgJSONPath = findUpSync("package.json");   if (rootPkgJSONPath) {
package.json +1 lines
--- +++ @@ -2,3 +2,3 @@   "name": "babel-loader",-  "version": "10.1.0",+  "version": "10.1.1",   "description": "babel module loader for webpack",
chai npm
6.2.2 5mo ago nominal
BURST ×7
latest 6.2.2 versions 110 maintainers 1
5.2.1
5.2.2
5.3.0
5.3.1
5.3.2
6.0.0
6.0.1
5.3.3
6.1.0
6.2.0
6.2.1
6.2.2
BURST
2 releases in 23m: 0.1.5, 0.1.6
info · registry-verified · 2012-01-02 · 14y ago
BURST
2 releases in 7m: 0.2.2, 0.2.3
info · registry-verified · 2012-02-02 · 14y ago
BURST
2 releases in 35m: 0.3.0, 0.3.1
info · registry-verified · 2012-02-07 · 14y ago
BURST
2 releases in 4m: 4.3.2, 4.3.3
info · registry-verified · 2021-03-03 · 5y ago
BURST
2 releases in 1m: 5.0.2, 5.0.3
info · registry-verified · 2024-01-25 · 2y ago
BURST
3 releases in 9m: 5.2.2, 5.3.0, 5.3.1
info · registry-verified · 2025-08-18 · 9mo ago
BURST
2 releases in 29m: 6.0.1, 5.3.3
info · registry-verified · 2025-08-22 · 9mo ago
release diff 6.2.1 → 6.2.2
+0 added · -0 removed · ~2 modified
index.js +3 lines
--- +++ @@ -699,4 +699,4 @@ var symbolsSupported = typeof Symbol === "function" && typeof Symbol.for === "function";-var chaiInspect = symbolsSupported ? Symbol.for("chai/inspect") : "@@chai/inspect";-var nodeInspect = Symbol.for("nodejs.util.inspect.custom");+var chaiInspect = symbolsSupported ? /* @__PURE__ */ Symbol.for("chai/inspect") : "@@chai/inspect";+var nodeInspect = /* @__PURE__ */ Symbol.for("nodejs.util.inspect.custom"); var constructorMap = /* @__PURE__ */ new WeakMap();@@ -2960,3 +2960,3 @@   new Assertion(expected, flagMsg, ssfi, true).is.numeric;-  const abs = /* @__PURE__ */ __name((x) => x < 0n ? -x : x, "abs");+  const abs = /* @__PURE__ */ __name((x) => x < 0 ? -x : x, "abs");   const strip = /* @__PURE__ */ __name((number) => parseFloat(parseFloat(number).toPrecision(12)), "strip");@@ -4172,246 +4172 @@ };-/*!- * Chai - flag utility- * Copyright(c) 2012-2014 Jake Luer <[email protected]>- * MIT Licensed- */-/*!- * Chai - test utility- * Copyright(c) 2012-2014 Jake Luer <[email protected]>- * MIT Licensed- */-/*!- * Chai - expectTypes utility- * Copyright(c) 2012-2014 Jake Luer <[email protected]>- * MIT Licensed- */-/*!- * Chai - getActual utility- * Copyright(c) 2012-2014 Jake Luer <[email protected]>- * MIT Licensed- */-/*!- * Chai - message composition utility- * Copyright(c) 2012-2014 Jake Luer <[email protected]>- * MIT Licensed- */-/*!- * Chai - transferFlags utility- * Copyright(c) 2012-2014 Jake Luer <[email protected]>- * MIT Licensed- */-/*!- * chai- * http://chaijs.com- * Copyright(c) 2011-2014 Jake Luer <[email protected]>- * MIT Licensed- */-/*!- * Chai - events utility- * Copyright(c) 2011-2016 Jake Luer <[email protected]>- * MIT Licensed- */-/*!- * Chai - isProxyEnabled helper- * Copyright(c) 2012-2014 Jake Luer <[email protected]>- * MIT Licensed- */-/*!- * Chai - addProperty utility- * Copyright(c) 2012-2014 Jake Luer <[email protected]>- * MIT Licensed- */-/*!- * Chai - addLengthGuard utility- * Copyright(c) 2012-2014 Jake Luer <[email protected]>- * MIT Licensed- */-/*!- * Chai - getProperties utility- * Copyright(c) 2012-2014 Jake Luer <[email protected]>- * MIT Licensed- */-/*!- * Chai - proxify utility- * Copyright(c) 2012-2014 Jake Luer <[email protected]>- * MIT Licensed- */-/*!- * Chai - addMethod utility- * Copyright(c) 2012-2014 Jake Luer <[email protected]>- * MIT Licensed- */-/*!- * Chai - overwriteProperty utility- * Copyright(c) 2012-2014 Jake Luer <[email protected]>- * MIT Licensed- */-/*!- * Chai - overwriteMethod utility- * Copyright(c) 2012-2014 Jake Luer <[email protected]>- * MIT Licensed- */-/*!- * Chai - addChainingMethod utility- * Copyright(c) 2012-2014 Jake Luer <[email protected]>- * MIT Licensed- */-/*!- * Chai - overwriteChainableMethod utility- * Copyright(c) 2012-2014 Jake Luer <[email protected]>- * MIT Licensed- */-/*!- * Chai - compareByInspect utility- * Copyright(c) 2011-2016 Jake Luer <[email protected]>- * MIT Licensed- */-/*!- * Chai - getOwnEnumerablePropertySymbols utility- * Copyright(c) 2011-2016 Jake Luer <[email protected]>- * MIT Licensed- */-/*!- * Chai - getOwnEnumerableProperties utility- * Copyright(c) 2011-2016 Jake Luer <[email protected]>- * MIT Licensed- */-/*!- * Chai - isNaN utility- * Copyright(c) 2012-2015 Sakthipriyan Vairamani <[email protected]>- * MIT Licensed- */-/*!- * chai- * Copyright(c) 2011 Jake Luer <[email protected]>- * MIT Licensed- */-/*!- * chai- * Copyright(c) 2011-2014 Jake Luer <[email protected]>- * MIT Licensed- */-/*! Bundled license information:--deep-eql/index.js:-  (*!-   * deep-eql-   * Copyright(c) 2013 Jake Luer <[email protected]>-   * MIT Licensed-   *)-  (*!-   * Check to see if the MemoizeMap has recorded a result of the two operands-   *-   * @param {Mixed} leftHandOperand-   * @param {Mixed} rightHandOperand-   * @param {MemoizeMap} memoizeMap-   * @returns {Boolean|null} result-  *)-  (*!-   * Set the result of the equality into the MemoizeMap-   *-   * @param {Mixed} leftHandOperand-   * @param {Mixed} rightHandOperand-   * @param {MemoizeMap} memoizeMap-   * @param {Boolean} result-  *)-  (*!-   * Primary Export-   *)-  (*!-   * The main logic of the `deepEqual` function.-   *-   * @param {Mixed} leftHandOperand-   * @param {Mixed} rightHandOperand-   * @param {Object} [options] (optional) Additional options-   * @param {Array} [options.comparator] (optional) Override default algorithm, determining custom equality.-   * @param {Array} [options.memoize] (optional) Provide a custom memoization object which will cache the results of-      complex objects for a speed boost. By passing `false` you can disable memoization, but this will cause circular-      references to blow the stack.-   * @return {Boolean} equal match-  *)-  (*!-   * Compare two Regular Expressions for equality.-   *-   * @param {RegExp} leftHandOperand-   * @param {RegExp} rightHandOperand-   * @return {Boolean} result-   *)-  (*!-   * Compare two Sets/Maps for equality. Faster than other equality functions.-   *-   * @param {Set} leftHandOperand-   * @param {Set} rightHandOperand-   * @param {Object} [options] (Optional)-   * @return {Boolean} result-   *)-  (*!-   * Simple equality for flat iterable objects such as Arrays, TypedArrays or Node.js buffers.-   *-   * @param {Iterable} leftHandOperand-   * @param {Iterable} rightHandOperand-   * @param {Object} [options] (Optional)-   * @return {Boolean} result-   *)-  (*!-   * Simple equality for generator objects such as those returned by generator functions.-   *-   * @param {Iterable} leftHandOperand-   * @param {Iterable} rightHandOperand-   * @param {Object} [options] (Optional)-   * @return {Boolean} result-   *)-  (*!-   * Determine if the given object has an @@iterator function.-   *-   * @param {Object} target-   * @return {Boolean} `true` if the object has an @@iterator function.-   *)-  (*!-   * Gets all iterator entries from the given Object. If the Object has no @@iterator function, returns an empty array.-   * This will consume the iterator - which could have side effects depending on the @@iterator implementation.-   *-   * @param {Object} target-   * @returns {Array} an array of entries from the @@iterator function-   *)-  (*!-   * Gets all entries from a Generator. This will consume the generator - which could have side effects.-   *-   * @param {Generator} target-   * @returns {Array} an array of entries from the Generator.-   *)-  (*!-   * Gets all own and inherited enumerable keys from a target.-   *-   * @param {Object} target-   * @returns {Array} an array of own and inherited enumerable keys from the target.-   *)-  (*!-   * Determines if two objects have matching values, given a set of keys. Defers to deepEqual for the equality check of-   * each key. If any value of the given key is not equal, the function will return false (early).-   *-   * @param {Mixed} leftHandOperand-   * @param {Mixed} rightHandOperand-   * @param {Array} keys An array of keys to compare the values of leftHandOperand and rightHandOperand against-   * @param {Object} [options] (Optional)-   * @return {Boolean} result-   *)-  (*!-   * Recursively check the equality of two Objects. Once basic sameness has been established it will defer to `deepEqual`-   * for each enumerable key in the object.-   *-   * @param {Mixed} leftHandOperand-   * @param {Mixed} rightHandOperand-   * @param {Object} [options] (Optional)-   * @return {Boolean} result
… 11 more lines (truncated)
package.json +2 lines
--- +++ @@ -24,3 +24,3 @@   ],-  "version": "6.2.1",+  "version": "6.2.2",   "repository": {@@ -34,3 +34,3 @@   "scripts": {-    "build": "esbuild --bundle --format=esm --target=es2021 --keep-names --outfile=index.js lib/chai.js",+    "build": "esbuild --bundle --format=esm --target=es2021 --keep-names --legal-comments=none --outfile=index.js lib/chai.js",     "prebuild": "npm run clean",
jest npm
30.4.2 22d ago nominal
critical-tier BURST ×8
latest 30.4.2 versions 380 maintainers 5 critical-tier (snapshotted)
30.0.3
30.0.4
30.0.5
30.1.0
30.1.1
30.1.2
30.1.3
30.2.0
30.3.0
30.4.0
30.4.1
30.4.2
BURST
2 releases in 1m: 0.0.7, 0.0.61
info · registry-verified · 2012-03-05 · 14y ago
BURST
2 releases in 19m: 0.0.86, 0.0.87
info · registry-verified · 2012-04-30 · 14y ago
BURST
2 releases in 4m: 0.0.90, 0.0.91
info · registry-verified · 2012-05-06 · 14y ago
BURST
2 releases in 7m: 12.1.0, 12.1.1
info · registry-verified · 2016-05-20 · 10y ago
BURST
3 releases in 36m: 13.1.2, 13.1.3, 13.2.0
info · registry-verified · 2016-07-07 · 9y ago
BURST
2 releases in 13m: 13.2.1, 13.2.2
info · registry-verified · 2016-07-07 · 9y ago
BURST
2 releases in 7m: 20.0.2, 20.0.3
info · registry-verified · 2017-05-17 · 9y ago
BURST
2 releases in 28m: 29.1.0, 29.1.1
info · registry-verified · 2022-09-28 · 3y ago
release diff 30.4.1 → 30.4.2
+0 added · -0 removed · ~1 modified
package.json +4 lines
--- +++ @@ -3,3 +3,3 @@   "description": "Delightful JavaScript Testing.",-  "version": "30.4.1",+  "version": "30.4.2",   "main": "./build/index.js",@@ -17,6 +17,6 @@   "dependencies": {-    "@jest/core": "30.4.1",+    "@jest/core": "30.4.2",     "@jest/types": "30.4.1",     "import-local": "^3.2.0",-    "jest-cli": "30.4.1"+    "jest-cli": "30.4.2"   },@@ -70,3 +70,3 @@   },-  "gitHead": "b3b4a09ed3005369dacc7466d1d2122797283785"+  "gitHead": "746f2a0f57c56e3bba555280f0587d40f3db95c0" }
lodash npm
4.18.1 1mo ago nominal
BURST ×4
latest 4.18.1 versions 117 maintainers 1
4.17.13
4.17.14
4.17.15
4.17.16
4.17.17
4.17.18
4.17.19
4.17.20
4.17.21
4.17.23
4.18.0
4.18.1
BURST
6 releases in 30m: 0.9.0, 0.9.1, 0.9.2, 0.10.0, 1.0.0, 1.0.1
info · registry-verified · 2013-08-31 · 12y ago
BURST
6 releases in 2m: 1.1.0, 1.1.1, 1.2.0, 1.2.1, 1.3.0, 1.3.1
info · registry-verified · 2013-09-04 · 12y ago
BURST
2 releases in 49m: 4.8.0, 4.8.1
info · registry-verified · 2016-04-04 · 10y ago
BURST
2 releases in 23m: 4.17.9, 4.17.10
info · registry-verified · 2018-04-24 · 8y ago
release diff 4.18.0 → 4.18.1
+0 added · -0 removed · ~9 modified
_baseUnset.js +0 lines
--- +++ @@ -25,3 +25,2 @@   // https://github.com/lodash/lodash/security/advisories/GHSA-f23m-r3pf-42rh-  // https://github.com/lodash/lodash/security/advisories/GHSA-w36w-cm3g-pc62   var index = -1,
core.js +2 lines
--- +++ @@ -3,3 +3,3 @@  * Lodash (Custom Build) <https://lodash.com/>- * Build: `lodash core -o ./core.js`+ * Build: `lodash core --repo lodash/lodash#4.18.1 -o ./core.js`  * Copyright OpenJS Foundation and other contributors <https://openjsf.org/>@@ -15,3 +15,3 @@   /** Used as the semantic version number. */-  var VERSION = '4.18.0';+  var VERSION = '4.18.1'; 
fromPairs.js +2 lines
--- +++ @@ -1 +1,3 @@+var baseAssignValue = require('./_baseAssignValue');+ /**
lodash.js +1 lines
--- +++ @@ -14,3 +14,3 @@   /** Used as the semantic version number. */-  var VERSION = '4.18.0';+  var VERSION = '4.18.1'; @@ -4381,3 +4381,2 @@       // https://github.com/lodash/lodash/security/advisories/GHSA-f23m-r3pf-42rh-      // https://github.com/lodash/lodash/security/advisories/GHSA-w36w-cm3g-pc62       var index = -1,
package.json +4 lines
--- +++ @@ -2,3 +2,3 @@   "name": "lodash",-  "version": "4.18.0",+  "version": "4.18.1",   "description": "Lodash modular utilities.",@@ -15,3 +15,5 @@   ],-  "scripts": { "test": "echo \"See https://travis-ci.org/lodash-archive/lodash-cli for testing details.\"" }+  "scripts": {+    "test": "echo \"See https://travis-ci.org/lodash-archive/lodash-cli for testing details.\""+  } }
template.js +3 lines
--- +++ @@ -1,2 +1,4 @@-var attempt = require('./attempt'),+var arrayEach = require('./_arrayEach'),+    assignWith = require('./assignWith'),+    attempt = require('./attempt'),     baseValues = require('./_baseValues'),
prettier npm
3.8.3 1mo ago nominal
critical-tier BURST ×7
latest 3.8.3 versions 186 maintainers 11 critical-tier (snapshotted)
3.6.0
3.6.1
3.6.2
3.7.0
3.7.1
3.7.2
3.7.3
3.7.4
3.8.0
3.8.1
3.8.2
3.8.3
BURST
2 releases in 46m: 0.0.1, 0.0.2
info · registry-verified · 2017-01-10 · 9y ago
BURST
2 releases in 15m: 0.14.0, 0.14.1
info · registry-verified · 2017-01-30 · 9y ago
BURST
3 releases in 48m: 1.0.0, 1.0.1, 1.0.2
info · registry-verified · 2017-04-13 · 9y ago
BURST
2 releases in 58m: 1.2.0, 1.2.1
info · registry-verified · 2017-04-19 · 9y ago
BURST
2 releases in 50m: 1.4.3, 1.4.4
info · registry-verified · 2017-06-07 · 8y ago
BURST
2 releases in 19m: 1.10.0, 1.10.1
info · registry-verified · 2018-01-10 · 8y ago
BURST
2 releases in 9m: 1.13.1, 1.13.2
info · registry-verified · 2018-05-29 · 8y ago
release diff 3.8.2 → 3.8.3
+0 added · -0 removed · ~8 modified
index.cjs +1 lines
--- +++ @@ -650,3 +650,3 @@   "src/main/version.evaluate.js"() {-    version_evaluate_default = "3.8.2";+    version_evaluate_default = "3.8.3";   }
index.mjs +1 lines
--- +++ @@ -18463,3 +18463,3 @@ // src/main/version.evaluate.js-var version_evaluate_default = "3.8.2";+var version_evaluate_default = "3.8.3"; 
internal/experimental-cli.mjs +1 lines
--- +++ @@ -2149,3 +2149,3 @@     ];-    PRETTIER_VERSION = "3.8.2";+    PRETTIER_VERSION = "3.8.3";   }
package.json +1 lines
--- +++ @@ -2,3 +2,3 @@   "name": "prettier",-  "version": "3.8.2",+  "version": "3.8.3",   "description": "Prettier is an opinionated code formatter",
plugins/postcss.js +1 lines
--- +++ @@ -57,3 +57,3 @@ -`:"")+Gn(s)};var cc=new Set(["red","green","blue","alpha","a","rgb","hue","h","saturation","s","lightness","l","whiteness","w","blackness","b","tint","shade","blend","blenda","contrast","hsl","hsla","hwb","hwba"]);function jn(t){return t.findAncestor(e=>e.type==="css-decl")?.prop?.toLowerCase()}var fc=new Set(["initial","inherit","unset","revert"]);function Hn(t){return fc.has(t.toLowerCase())}function Kn(t,e){return t.findAncestor(r=>r.type==="css-atrule")?.name?.toLowerCase().endsWith("keyframes")&&["from","to"].includes(e.toLowerCase())}function Ie(t){return t.includes("$")||t.includes("@")||t.includes("#")||t.startsWith("%")||t.startsWith("--")||t.startsWith(":--")||t.includes("(")&&t.includes(")")?t:t.toLowerCase()}function qe(t,e){return t.findAncestor(r=>r.type==="value-func")?.value?.toLowerCase()===e}function Qn(t){return t.hasAncestor(e=>{if(e.type!=="css-rule")return!1;let s=e.raws?.selector;return s&&(s.startsWith(":import")||s.startsWith(":export"))})}function we(t,e){let s=Array.isArray(e)?e:[e],r=t.findAncestor(n=>n.type==="css-atrule");return r&&s.includes(r.name.toLowerCase())}function Xn(t){let{node:e}=t;return e.groups[0]?.value==="url"&&e.groups.length===2&&t.findAncestor(s=>s.type==="css-atrule")?.name==="import"}function Jn(t){return t.type==="value-func"&&t.value.toLowerCase()==="url"}function Zn(t){return t.type==="value-func"&&t.value.toLowerCase()==="var"}function ei(t){let{selector:e}=t;return e?typeof e=="string"&&/^@.+:.*$/u.test(e)||e.value&&/^@.+:.*$/u.test(e.value):!1}function ti(t){return t.type==="value-word"&&["from","through","end"].includes(t.value)}function ri(t){return t.type==="value-word"&&["and","or","not"].includes(t.value)}function si(t){return t.type==="value-word"&&t.value==="in"}function Dt(t){return t.type==="value-operator"&&t.value==="*"}function ve(t){return t?.type==="value-operator"&&t.value==="/"}function J(t){return t.type==="value-operator"&&t.value==="+"}function xe(t){return t.type==="value-operator"&&t.value==="-"}function pc(t){return t.type==="value-operator"&&t.value==="%"}function Mt(t){return Dt(t)||ve(t)||J(t)||xe(t)||pc(t)}function ni(t){return t.type==="value-word"&&["==","!="].includes(t.value)}function ii(t){return t.type==="value-word"&&["<",">","<=",">="].includes(t.value)}function Je(t,e){return e.parser==="scss"&&t.type==="css-atrule"&&["if","else","for","each","while"].includes(t.name)}function es(t){return t.raws?.params&&/^\(\s*\)$/u.test(t.raws.params)}function Bt(t){return t.name.startsWith("prettier-placeholder")}function oi(t){return t.prop.startsWith("@prettier-placeholder")}function ai(t,e){return t.value==="$$"&&t.type==="value-func"&&e?.type==="value-word"&&!e.raws.before}function ui(t){return t.value?.type==="value-root"&&t.value.group?.type==="value-value"&&t.prop.toLowerCase()==="composes"}function li(t){return t.value?.group?.group?.type==="value-paren_group"&&t.value.group.group.open!==null&&t.value.group.group.close!==null}function Z(t){return t?.raws?.before===""}function Ut(t){return t.type==="value-comma_group"&&t.groups?.[1]?.type==="value-colon"}function Zr(t){return t.type==="value-paren_group"&&t.groups?.[0]&&Ut(t.groups[0])}function ts(t,e){if(e.parser!=="scss")return!1;let{node:s}=t;if(s.groups.length===0)return!1;let r=t.grandparent;return!Zr(s)&&!(r&&Zr(r))?!1:!!(t.findAncestor(i=>i.type==="css-decl")?.prop?.startsWith("$")||Zr(r)||r.type==="value-func")}function Ze(t){return t.type==="value-comment"&&t.inline}function Ft(t){return t.type==="value-word"&&t.value==="#"}function rs(t){return t.type==="value-word"&&t.value==="{"}function $t(t){return t.type==="value-word"&&t.value==="}"}function et(t){return["value-word","value-atword"].includes(t.type)}function Wt(t){return t?.type==="value-colon"}function ci(t,e){if(!Ut(e))return!1;let{groups:s}=e,r=s.indexOf(t);return r===-1?!1:Wt(s[r+1])}function fi(t){return t.value&&["not","and","or"].includes(t.value.toLowerCase())}function pi(t){return t.type!=="value-func"?!1:cc.has(t.value.toLowerCase())}function Le(t){return/\/\//u.test(t.split(/[\n\r]/u).pop())}function tt(t){return t?.type==="value-atword"&&t.value.startsWith("prettier-placeholder-")}function hi(t,e){if(t.open?.value!=="("||t.close?.value!==")"||t.groups.some(s=>s.type!=="value-comma_group"))return!1;if(e.type==="value-comma_group"){let s=e.groups.indexOf(t)-1,r=e.groups[s];if(r?.type==="value-word"&&r.value==="with")return!0}return!1}function rt(t){return t.type==="value-paren_group"&&t.open?.value==="("&&t.close?.value===")"}function hc(t,e,s){let{node:r}=t,n=t.parent,i=t.grandparent,o=jn(t),u=o&&n.type==="value-value"&&(o==="grid"||o.startsWith("grid-template")),a=t.findAncestor(p=>p.type==="css-atrule"),l=a&&Je(a,e),f=r.groups.some(p=>Ze(p)),h=t.map(s,"groups"),c=[""],g=qe(t,"url"),b=!1,d=!1;for(let p=0;p<r.groups.length;++p){let m=r.groups[p-1],y=r.groups[p],v=r.groups[p+1],O=r.groups[p+2];if(Ze(y)&&!v){c.push([c.pop(),cn([" ",h[p]])]);continue}if(c.push([c.pop(),h[p]]),g){(v&&J(v)||J(y))&&c.push([c.pop()," "]);continue}if(we(t,"forward")&&y.type==="value-word"&&y.value&&m!==void 0&&m.type==="value-word"&&m.value==="as"&&v.type==="value-operator"&&v.value==="*"||we(t,"utility")&&y.type==="value-word"&&v&&v.type==="value-operator"&&v.value==="*"||!v||y.type==="value-word"&&tt(v)&&R(y)===P(v))continue;if(y.type==="value-string"&&y.quoted){let k=y.value.lastIndexOf("#{"),N=y.value.lastIndexOf("}");k!==-1&&N!==-1?b=k>N:k!==-1?b=!0:N!==-1&&(b=!1)}if(b||Wt(y)||Wt(v)||y.type==="value-atword"&&(y.value===""||y.value.endsWith("["))||v.type==="value-word"&&v.value.startsWith("]")||y.value==="~"||e.parser==="less"&&(v?.type==="value-word"&&v.value==="["||y.type==="value-word"&&y.value==="["&&(v?.type==="value-atword"||v?.type==="value-word")||y.type==="value-word"&&y.value==="]["&&v?.type==="value-word")||y.type!=="value-string"&&y.value&&y.value.includes("\\")&&v&&v.type!=="value-comment"||m?.value&&m.value.indexOf("\\")===m.value.length-1&&y.type==="value-operator"&&y.value==="/"||y.value==="\\"||ai(y,v)||Ft(y)||rs(y)||$t(v)||rs(v)&&Z(v)||$t(y)&&Z(v)||y.value==="--"&&Ft(v))continue;let q=Mt(y),H=Mt(v);if((q&&Ft(v)||H&&$t(y))&&Z(v)||!m&&ve(y)||qe(t,"calc")&&(J(y)||J(v)||xe(y)||xe(v))&&Z(v))continue;let ne=(J(y)||xe(y))&&p===0&&(v.type==="value-number"||v.isHex)&&i&&pi(i)&&!Z(v);if(e.parser==="scss"&&q&&y.value==="-"&&v.type==="value-func"&&R(y)!==P(v)){c.push([c.pop()," "]);continue}let W=O?.type==="value-func"||O&&et(O)||y.type==="value-func"||et(y),A=v.type==="value-func"||et(v)||m?.type==="value-func"||m&&et(m);if(!(!(Dt(v)||Dt(y))&&!qe(t,"calc")&&!ne&&(ve(v)&&!W||ve(y)&&!A||J(v)&&!W||J(y)&&!A||xe(v)||xe(y))&&(Z(v)||q&&(!m||m&&Mt(m))))&&!((e.parser==="scss"||e.parser==="less")&&q&&y.value==="-"&&rt(v)&&R(y)===P(v.open)&&v.open.value==="(")){if(Ze(y)){if(n.type==="value-paren_group"){c.push(le(T),"");continue}c.push(T,"");continue}if(l&&(ni(v)||ii(v)||ri(v)||si(y)||ti(y))){c.push([c.pop()," "]);continue}if(a&&a.name.toLowerCase()==="namespace"){c.push([c.pop()," "]);continue}if(u){y.source&&v.source&&y.source.start.line!==v.source.start.line?(c.push(T,""),d=!0):c.push([c.pop()," "]);continue}if(!(o&&(o==="font"||o.startsWith("--"))&&(ve(v)&&Z(v)&&di(y)||ve(y)&&Z(y)&&di(m)))){if(H){c.push([c.pop()," "]);continue}if(v?.value!=="..."&&!(tt(y)&&tt(v)&&R(y)===P(v))){if(tt(y)&&rt(v)&&R(y)===P(v.open)){c.push(M,"");continue}if(y.value==="with"&&rt(v)){c=[[Pe(c)," "]];continue}if(!(y.value?.endsWith("#")&&v.value==="{"&&rt(v.group))&&!(Ze(v)&&!O)){if(!a&&y.type==="value-comment"&&!y.inline&&r.groups.slice(0,p).every(k=>k.type==="value-comment")){c.push(le(C),"");continue}c.push(C,"")}}}}}return f&&c.push([c.pop(),Ne]),d&&c.unshift("",T),l?D(L(c)):Xn(t)?D(Pe(c)):D(L(Pe(c)))}function di(t){if(t?.type==="value-number")return!0;if(t?.type!=="value-func")return!1;let e=t.value.toLowerCase();return e==="var"||e==="calc"||e==="min"||e==="max"||e==="clamp"||e.startsWith("--")}var mi=hc;function dc(t){return t.length===1?t:t.toLowerCase().replace(/^([+-]?[\d.]+e)(?:\+|(-))?0*(?=\d)/u,"$1$2").replace(/^([+-]?[\d.]+)e[+-]?0+$/u,"$1").replace(/^([+-])?\./u,"$10.").replace(/(\.\d+?)0+(?=e|$)/u,"$1").replace(/\.(?=e|$)/u,"")}var yi=dc;var Gt=new Map([["em","em"],["rem","rem"],["ex","ex"],["rex","rex"],["cap","cap"],["rcap","rcap"],["ch","ch"],["rch","rch"],["ic","ic"],["ric","ric"],["lh","lh"],["rlh","rlh"],["vw","vw"],["svw","svw"],["lvw","lvw"],["dvw","dvw"],["vh","vh"],["svh","svh"],["lvh","lvh"],["dvh","dvh"],["vi","vi"],["svi","svi"],["lvi","lvi"],["dvi","dvi"],["vb","vb"],["svb","svb"],["lvb","lvb"],["dvb","dvb"],["vmin","vmin"],["svmin","svmin"],["lvmin","lvmin"],["dvmin","dvmin"],["vmax","vmax"],["svmax","svmax"],["lvmax","lvmax"],["dvmax","dvmax"],["cm","cm"],["mm","mm"],["q","Q"],["in","in"],["pt","pt"],["pc","pc"],["px","px"],["deg","deg"],["grad","grad"],["rad","rad"],["turn","turn"],["s","s"],["ms","ms"],["hz","Hz"],["khz","kHz"],["dpi","dpi"],["dpcm","dpcm"],["dppx","dppx"],["x","x"],["cqw","cqw"],["cqh","cqh"],["cqi","cqi"],["cqb","cqb"],["cqmin","cqmin"],["cqmax","cqmax"],["fr","fr"]]);function ss(t){let e=t.toLowerCase();return Gt.has(e)?Gt.get(e):t}var gi=/(["'])(?:(?!\1)[^\\]|\\.)*\1/gsu,mc=/(?:\d*\.\d+|\d+\.?)(?:e[+-]?\d+)?/giu,yc=/[a-z]+/giu,gc=/[$@]?[_a-z\u0080-\uFFFF][\w\u0080-\uFFFF-]*/giu,wc=new RegExp(gi.source+`|(${gc.source})?(${mc.source})(${yc.source})?`,"giu");function V(t,e){return E(0,t,gi,s=>Pt(s,e))}function wi(t,e){let s=e.singleQuote?"'":'"',r="",n=t.match(/^(?<value>.+?)\s+(?<flag>[a-zA-Z])$/u);return n&&({value:t,flag:r}=n.groups),(t.includes('"')||t.includes("'")?t:s+t+s)+(r?` ${r}`:"")}function _e(t){return E(0,t,wc,(e,s,r,n,i)=>!r&&n&&(i??(i=""),i=i.toLowerCase(),!i||i==="n"||Gt.has(i))?ns(n)+(i?ss(i):""):e)}function ns(t){return yi(t).replace(/\.0(?=$|e)/u,"")}function vi(t){return t.trailingComma==="es5"||t.trailingComma==="all"}var xi=t=>t===`+`:"")+Gn(s)};var cc=new Set(["red","green","blue","alpha","a","rgb","hue","h","saturation","s","lightness","l","whiteness","w","blackness","b","tint","shade","blend","blenda","contrast","hsl","hsla","hwb","hwba"]);function jn(t){return t.findAncestor(e=>e.type==="css-decl")?.prop?.toLowerCase()}var fc=new Set(["initial","inherit","unset","revert"]);function Hn(t){return fc.has(t.toLowerCase())}function Kn(t,e){return t.findAncestor(r=>r.type==="css-atrule")?.name?.toLowerCase().endsWith("keyframes")&&["from","to"].includes(e.toLowerCase())}function Ie(t){return t.includes("$")||t.includes("@")||t.includes("#")||t.startsWith("%")||t.startsWith("--")||t.startsWith(":--")||t.includes("(")&&t.includes(")")?t:t.toLowerCase()}function qe(t,e){return t.findAncestor(r=>r.type==="value-func")?.value?.toLowerCase()===e}function Qn(t){return t.hasAncestor(e=>{if(e.type!=="css-rule")return!1;let s=e.raws?.selector;return s&&(s.startsWith(":import")||s.startsWith(":export"))})}function we(t,e){let s=Array.isArray(e)?e:[e],r=t.findAncestor(n=>n.type==="css-atrule");return r&&s.includes(r.name.toLowerCase())}function Xn(t){let{node:e}=t;return e.groups[0]?.value==="url"&&e.groups.length===2&&t.findAncestor(s=>s.type==="css-atrule")?.name==="import"}function Jn(t){return t.type==="value-func"&&t.value.toLowerCase()==="url"}function Zn(t){return t.type==="value-func"&&t.value.toLowerCase()==="var"}function ei(t){let{selector:e}=t;return e?typeof e=="string"&&/^@.+:.*$/u.test(e)||e.value&&/^@.+:.*$/u.test(e.value):!1}function ti(t){return t.type==="value-word"&&["from","through","end"].includes(t.value)}function ri(t){return t.type==="value-word"&&["and","or","not"].includes(t.value)}function si(t){return t.type==="value-word"&&t.value==="in"}function Dt(t){return t.type==="value-operator"&&t.value==="*"}function ve(t){return t?.type==="value-operator"&&t.value==="/"}function J(t){return t.type==="value-operator"&&t.value==="+"}function xe(t){return t.type==="value-operator"&&t.value==="-"}function pc(t){return t.type==="value-operator"&&t.value==="%"}function Mt(t){return Dt(t)||ve(t)||J(t)||xe(t)||pc(t)}function ni(t){return t.type==="value-word"&&["==","!="].includes(t.value)}function ii(t){return t.type==="value-word"&&["<",">","<=",">="].includes(t.value)}function Je(t,e){return e.parser==="scss"&&t.type==="css-atrule"&&["if","else","for","each","while"].includes(t.name)}function es(t){return t.raws?.params&&/^\(\s*\)$/u.test(t.raws.params)}function Bt(t){return t.name.startsWith("prettier-placeholder")}function oi(t){return t.prop.startsWith("@prettier-placeholder")}function ai(t,e){return t.value==="$$"&&t.type==="value-func"&&e?.type==="value-word"&&!e.raws.before}function ui(t){return t.value?.type==="value-root"&&t.value.group?.type==="value-value"&&t.prop.toLowerCase()==="composes"}function li(t){return t.value?.group?.group?.type==="value-paren_group"&&t.value.group.group.open!==null&&t.value.group.group.close!==null}function Z(t){return t?.raws?.before===""}function Ut(t){return t.type==="value-comma_group"&&t.groups?.[1]?.type==="value-colon"}function Zr(t){return t.type==="value-paren_group"&&t.groups?.[0]&&Ut(t.groups[0])}function ts(t,e){if(e.parser!=="scss")return!1;let{node:s}=t;if(s.groups.length===0)return!1;let r=t.parent;if(r&&r.type==="value-func"&&r.value==="if")return!1;let n=t.grandparent;return!Zr(s)&&!(n&&Zr(n))?!1:!!(t.findAncestor(o=>o.type==="css-decl")?.prop?.startsWith("$")||Zr(n)||n.type==="value-func")}function Ze(t){return t.type==="value-comment"&&t.inline}function Ft(t){return t.type==="value-word"&&t.value==="#"}function rs(t){return t.type==="value-word"&&t.value==="{"}function $t(t){return t.type==="value-word"&&t.value==="}"}function et(t){return["value-word","value-atword"].includes(t.type)}function Wt(t){return t?.type==="value-colon"}function ci(t,e){if(!Ut(e))return!1;let{groups:s}=e,r=s.indexOf(t);return r===-1?!1:Wt(s[r+1])}function fi(t){return t.value&&["not","and","or"].includes(t.value.toLowerCase())}function pi(t){return t.type!=="value-func"?!1:cc.has(t.value.toLowerCase())}function Le(t){return/\/\//u.test(t.split(/[\n\r]/u).pop())}function tt(t){return t?.type==="value-atword"&&t.value.startsWith("prettier-placeholder-")}function hi(t,e){if(t.open?.value!=="("||t.close?.value!==")"||t.groups.some(s=>s.type!=="value-comma_group"))return!1;if(e.type==="value-comma_group"){let s=e.groups.indexOf(t)-1,r=e.groups[s];if(r?.type==="value-word"&&r.value==="with")return!0}return!1}function rt(t){return t.type==="value-paren_group"&&t.open?.value==="("&&t.close?.value===")"}function hc(t,e,s){let{node:r}=t,n=t.parent,i=t.grandparent,o=jn(t),u=o&&n.type==="value-value"&&(o==="grid"||o.startsWith("grid-template")),a=t.findAncestor(p=>p.type==="css-atrule"),l=a&&Je(a,e),f=r.groups.some(p=>Ze(p)),h=t.map(s,"groups"),c=[""],g=qe(t,"url"),b=!1,d=!1;for(let p=0;p<r.groups.length;++p){let m=r.groups[p-1],y=r.groups[p],v=r.groups[p+1],O=r.groups[p+2];if(Ze(y)&&!v){c.push([c.pop(),cn([" ",h[p]])]);continue}if(c.push([c.pop(),h[p]]),g){(v&&J(v)||J(y))&&c.push([c.pop()," "]);continue}if(we(t,"forward")&&y.type==="value-word"&&y.value&&m!==void 0&&m.type==="value-word"&&m.value==="as"&&v.type==="value-operator"&&v.value==="*"||we(t,"utility")&&y.type==="value-word"&&v&&v.type==="value-operator"&&v.value==="*"||!v||y.type==="value-word"&&tt(v)&&R(y)===P(v))continue;if(y.type==="value-string"&&y.quoted){let k=y.value.lastIndexOf("#{"),N=y.value.lastIndexOf("}");k!==-1&&N!==-1?b=k>N:k!==-1?b=!0:N!==-1&&(b=!1)}if(b||Wt(y)||Wt(v)||y.type==="value-atword"&&(y.value===""||y.value.endsWith("["))||v.type==="value-word"&&v.value.startsWith("]")||y.value==="~"||e.parser==="less"&&(v?.type==="value-word"&&v.value==="["||y.type==="value-word"&&y.value==="["&&(v?.type==="value-atword"||v?.type==="value-word")||y.type==="value-word"&&y.value==="]["&&v?.type==="value-word")||y.type!=="value-string"&&y.value&&y.value.includes("\\")&&v&&v.type!=="value-comment"||m?.value&&m.value.indexOf("\\")===m.value.length-1&&y.type==="value-operator"&&y.value==="/"||y.value==="\\"||ai(y,v)||Ft(y)||rs(y)||$t(v)||rs(v)&&Z(v)||$t(y)&&Z(v)||y.value==="--"&&Ft(v))continue;let q=Mt(y),H=Mt(v);if((q&&Ft(v)||H&&$t(y))&&Z(v)||!m&&ve(y)||qe(t,"calc")&&(J(y)||J(v)||xe(y)||xe(v))&&Z(v))continue;let ne=(J(y)||xe(y))&&p===0&&(v.type==="value-number"||v.isHex)&&i&&pi(i)&&!Z(v);if(e.parser==="scss"&&q&&y.value==="-"&&v.type==="value-func"&&R(y)!==P(v)){c.push([c.pop()," "]);continue}let W=O?.type==="value-func"||O&&et(O)||y.type==="value-func"||et(y),A=v.type==="value-func"||et(v)||m?.type==="value-func"||m&&et(m);if(!(!(Dt(v)||Dt(y))&&!qe(t,"calc")&&!ne&&(ve(v)&&!W||ve(y)&&!A||J(v)&&!W||J(y)&&!A||xe(v)||xe(y))&&(Z(v)||q&&(!m||m&&Mt(m))))&&!((e.parser==="scss"||e.parser==="less")&&q&&y.value==="-"&&rt(v)&&R(y)===P(v.open)&&v.open.value==="(")){if(Ze(y)){if(n.type==="value-paren_group"){c.push(le(T),"");continue}c.push(T,"");continue}if(l&&(ni(v)||ii(v)||ri(v)||si(y)||ti(y))){c.push([c.pop()," "]);continue}if(a&&a.name.toLowerCase()==="namespace"){c.push([c.pop()," "]);continue}if(u){y.source&&v.source&&y.source.start.line!==v.source.start.line?(c.push(T,""),d=!0):c.push([c.pop()," "]);continue}if(!(o&&(o==="font"||o.startsWith("--"))&&(ve(v)&&Z(v)&&di(y)||ve(y)&&Z(y)&&di(m)))){if(H){c.push([c.pop()," "]);continue}if(v?.value!=="..."&&!(tt(y)&&tt(v)&&R(y)===P(v))){if(tt(y)&&rt(v)&&R(y)===P(v.open)){c.push(M,"");continue}if(y.value==="with"&&rt(v)){c=[[Pe(c)," "]];continue}if(!(y.value?.endsWith("#")&&v.value==="{"&&rt(v.group))&&!(Ze(v)&&!O)){if(!a&&y.type==="value-comment"&&!y.inline&&r.groups.slice(0,p).every(k=>k.type==="value-comment")){c.push(le(C),"");continue}c.push(C,"")}}}}}return f&&c.push([c.pop(),Ne]),d&&c.unshift("",T),l?D(L(c)):Xn(t)?D(Pe(c)):D(L(Pe(c)))}function di(t){if(t?.type==="value-number")return!0;if(t?.type!=="value-func")return!1;let e=t.value.toLowerCase();return e==="var"||e==="calc"||e==="min"||e==="max"||e==="clamp"||e.startsWith("--")}var mi=hc;function dc(t){return t.length===1?t:t.toLowerCase().replace(/^([+-]?[\d.]+e)(?:\+|(-))?0*(?=\d)/u,"$1$2").replace(/^([+-]?[\d.]+)e[+-]?0+$/u,"$1").replace(/^([+-])?\./u,"$10.").replace(/(\.\d+?)0+(?=e|$)/u,"$1").replace(/\.(?=e|$)/u,"")}var yi=dc;var Gt=new Map([["em","em"],["rem","rem"],["ex","ex"],["rex","rex"],["cap","cap"],["rcap","rcap"],["ch","ch"],["rch","rch"],["ic","ic"],["ric","ric"],["lh","lh"],["rlh","rlh"],["vw","vw"],["svw","svw"],["lvw","lvw"],["dvw","dvw"],["vh","vh"],["svh","svh"],["lvh","lvh"],["dvh","dvh"],["vi","vi"],["svi","svi"],["lvi","lvi"],["dvi","dvi"],["vb","vb"],["svb","svb"],["lvb","lvb"],["dvb","dvb"],["vmin","vmin"],["svmin","svmin"],["lvmin","lvmin"],["dvmin","dvmin"],["vmax","vmax"],["svmax","svmax"],["lvmax","lvmax"],["dvmax","dvmax"],["cm","cm"],["mm","mm"],["q","Q"],["in","in"],["pt","pt"],["pc","pc"],["px","px"],["deg","deg"],["grad","grad"],["rad","rad"],["turn","turn"],["s","s"],["ms","ms"],["hz","Hz"],["khz","kHz"],["dpi","dpi"],["dpcm","dpcm"],["dppx","dppx"],["x","x"],["cqw","cqw"],["cqh","cqh"],["cqi","cqi"],["cqb","cqb"],["cqmin","cqmin"],["cqmax","cqmax"],["fr","fr"]]);function ss(t){let e=t.toLowerCase();return Gt.has(e)?Gt.get(e):t}var gi=/(["'])(?:(?!\1)[^\\]|\\.)*\1/gsu,mc=/(?:\d*\.\d+|\d+\.?)(?:e[+-]?\d+)?/giu,yc=/[a-z]+/giu,gc=/[$@]?[_a-z\u0080-\uFFFF][\w\u0080-\uFFFF-]*/giu,wc=new RegExp(gi.source+`|(${gc.source})?(${mc.source})(${yc.source})?`,"giu");function V(t,e){return E(0,t,gi,s=>Pt(s,e))}function wi(t,e){let s=e.singleQuote?"'":'"',r="",n=t.match(/^(?<value>.+?)\s+(?<flag>[a-zA-Z])$/u);return n&&({value:t,flag:r}=n.groups),(t.includes('"')||t.includes("'")?t:s+t+s)+(r?` ${r}`:"")}function _e(t){return E(0,t,wc,(e,s,r,n,i)=>!r&&n&&(i??(i=""),i=i.toLowerCase(),!i||i==="n"||Gt.has(i))?ns(n)+(i?ss(i):""):e)}function ns(t){return yi(t).replace(/\.0(?=$|e)/u,"")}function vi(t){return t.trailingComma==="es5"||t.trailingComma==="all"}var xi=t=>t===` `||t==="\r"||t==="\u2028"||t==="\u2029";function vc(t,e,s){let r=!!s?.backwards;if(e===!1)return!1;let n=t.charAt(e);if(r){if(t.charAt(e-1)==="\r"&&n===`
plugins/postcss.mjs +1 lines
--- +++ @@ -57,3 +57,3 @@ -`:"")+Wn(s)};var cc=new Set(["red","green","blue","alpha","a","rgb","hue","h","saturation","s","lightness","l","whiteness","w","blackness","b","tint","shade","blend","blenda","contrast","hsl","hsla","hwb","hwba"]);function zn(t){return t.findAncestor(e=>e.type==="css-decl")?.prop?.toLowerCase()}var fc=new Set(["initial","inherit","unset","revert"]);function jn(t){return fc.has(t.toLowerCase())}function Hn(t,e){return t.findAncestor(r=>r.type==="css-atrule")?.name?.toLowerCase().endsWith("keyframes")&&["from","to"].includes(e.toLowerCase())}function Ie(t){return t.includes("$")||t.includes("@")||t.includes("#")||t.startsWith("%")||t.startsWith("--")||t.startsWith(":--")||t.includes("(")&&t.includes(")")?t:t.toLowerCase()}function qe(t,e){return t.findAncestor(r=>r.type==="value-func")?.value?.toLowerCase()===e}function Kn(t){return t.hasAncestor(e=>{if(e.type!=="css-rule")return!1;let s=e.raws?.selector;return s&&(s.startsWith(":import")||s.startsWith(":export"))})}function we(t,e){let s=Array.isArray(e)?e:[e],r=t.findAncestor(n=>n.type==="css-atrule");return r&&s.includes(r.name.toLowerCase())}function Qn(t){let{node:e}=t;return e.groups[0]?.value==="url"&&e.groups.length===2&&t.findAncestor(s=>s.type==="css-atrule")?.name==="import"}function Xn(t){return t.type==="value-func"&&t.value.toLowerCase()==="url"}function Jn(t){return t.type==="value-func"&&t.value.toLowerCase()==="var"}function Zn(t){let{selector:e}=t;return e?typeof e=="string"&&/^@.+:.*$/u.test(e)||e.value&&/^@.+:.*$/u.test(e.value):!1}function ei(t){return t.type==="value-word"&&["from","through","end"].includes(t.value)}function ti(t){return t.type==="value-word"&&["and","or","not"].includes(t.value)}function ri(t){return t.type==="value-word"&&t.value==="in"}function Lt(t){return t.type==="value-operator"&&t.value==="*"}function ve(t){return t?.type==="value-operator"&&t.value==="/"}function J(t){return t.type==="value-operator"&&t.value==="+"}function xe(t){return t.type==="value-operator"&&t.value==="-"}function pc(t){return t.type==="value-operator"&&t.value==="%"}function Dt(t){return Lt(t)||ve(t)||J(t)||xe(t)||pc(t)}function si(t){return t.type==="value-word"&&["==","!="].includes(t.value)}function ni(t){return t.type==="value-word"&&["<",">","<=",">="].includes(t.value)}function Je(t,e){return e.parser==="scss"&&t.type==="css-atrule"&&["if","else","for","each","while"].includes(t.name)}function es(t){return t.raws?.params&&/^\(\s*\)$/u.test(t.raws.params)}function Mt(t){return t.name.startsWith("prettier-placeholder")}function ii(t){return t.prop.startsWith("@prettier-placeholder")}function oi(t,e){return t.value==="$$"&&t.type==="value-func"&&e?.type==="value-word"&&!e.raws.before}function ai(t){return t.value?.type==="value-root"&&t.value.group?.type==="value-value"&&t.prop.toLowerCase()==="composes"}function ui(t){return t.value?.group?.group?.type==="value-paren_group"&&t.value.group.group.open!==null&&t.value.group.group.close!==null}function Z(t){return t?.raws?.before===""}function Bt(t){return t.type==="value-comma_group"&&t.groups?.[1]?.type==="value-colon"}function Zr(t){return t.type==="value-paren_group"&&t.groups?.[0]&&Bt(t.groups[0])}function ts(t,e){if(e.parser!=="scss")return!1;let{node:s}=t;if(s.groups.length===0)return!1;let r=t.grandparent;return!Zr(s)&&!(r&&Zr(r))?!1:!!(t.findAncestor(i=>i.type==="css-decl")?.prop?.startsWith("$")||Zr(r)||r.type==="value-func")}function Ze(t){return t.type==="value-comment"&&t.inline}function Ut(t){return t.type==="value-word"&&t.value==="#"}function rs(t){return t.type==="value-word"&&t.value==="{"}function Ft(t){return t.type==="value-word"&&t.value==="}"}function et(t){return["value-word","value-atword"].includes(t.type)}function $t(t){return t?.type==="value-colon"}function li(t,e){if(!Bt(e))return!1;let{groups:s}=e,r=s.indexOf(t);return r===-1?!1:$t(s[r+1])}function ci(t){return t.value&&["not","and","or"].includes(t.value.toLowerCase())}function fi(t){return t.type!=="value-func"?!1:cc.has(t.value.toLowerCase())}function Le(t){return/\/\//u.test(t.split(/[\n\r]/u).pop())}function tt(t){return t?.type==="value-atword"&&t.value.startsWith("prettier-placeholder-")}function pi(t,e){if(t.open?.value!=="("||t.close?.value!==")"||t.groups.some(s=>s.type!=="value-comma_group"))return!1;if(e.type==="value-comma_group"){let s=e.groups.indexOf(t)-1,r=e.groups[s];if(r?.type==="value-word"&&r.value==="with")return!0}return!1}function rt(t){return t.type==="value-paren_group"&&t.open?.value==="("&&t.close?.value===")"}function hc(t,e,s){let{node:r}=t,n=t.parent,i=t.grandparent,o=zn(t),u=o&&n.type==="value-value"&&(o==="grid"||o.startsWith("grid-template")),a=t.findAncestor(p=>p.type==="css-atrule"),l=a&&Je(a,e),f=r.groups.some(p=>Ze(p)),h=t.map(s,"groups"),c=[""],g=qe(t,"url"),b=!1,d=!1;for(let p=0;p<r.groups.length;++p){let m=r.groups[p-1],y=r.groups[p],v=r.groups[p+1],O=r.groups[p+2];if(Ze(y)&&!v){c.push([c.pop(),ln([" ",h[p]])]);continue}if(c.push([c.pop(),h[p]]),g){(v&&J(v)||J(y))&&c.push([c.pop()," "]);continue}if(we(t,"forward")&&y.type==="value-word"&&y.value&&m!==void 0&&m.type==="value-word"&&m.value==="as"&&v.type==="value-operator"&&v.value==="*"||we(t,"utility")&&y.type==="value-word"&&v&&v.type==="value-operator"&&v.value==="*"||!v||y.type==="value-word"&&tt(v)&&R(y)===P(v))continue;if(y.type==="value-string"&&y.quoted){let k=y.value.lastIndexOf("#{"),N=y.value.lastIndexOf("}");k!==-1&&N!==-1?b=k>N:k!==-1?b=!0:N!==-1&&(b=!1)}if(b||$t(y)||$t(v)||y.type==="value-atword"&&(y.value===""||y.value.endsWith("["))||v.type==="value-word"&&v.value.startsWith("]")||y.value==="~"||e.parser==="less"&&(v?.type==="value-word"&&v.value==="["||y.type==="value-word"&&y.value==="["&&(v?.type==="value-atword"||v?.type==="value-word")||y.type==="value-word"&&y.value==="]["&&v?.type==="value-word")||y.type!=="value-string"&&y.value&&y.value.includes("\\")&&v&&v.type!=="value-comment"||m?.value&&m.value.indexOf("\\")===m.value.length-1&&y.type==="value-operator"&&y.value==="/"||y.value==="\\"||oi(y,v)||Ut(y)||rs(y)||Ft(v)||rs(v)&&Z(v)||Ft(y)&&Z(v)||y.value==="--"&&Ut(v))continue;let q=Dt(y),H=Dt(v);if((q&&Ut(v)||H&&Ft(y))&&Z(v)||!m&&ve(y)||qe(t,"calc")&&(J(y)||J(v)||xe(y)||xe(v))&&Z(v))continue;let ne=(J(y)||xe(y))&&p===0&&(v.type==="value-number"||v.isHex)&&i&&fi(i)&&!Z(v);if(e.parser==="scss"&&q&&y.value==="-"&&v.type==="value-func"&&R(y)!==P(v)){c.push([c.pop()," "]);continue}let W=O?.type==="value-func"||O&&et(O)||y.type==="value-func"||et(y),A=v.type==="value-func"||et(v)||m?.type==="value-func"||m&&et(m);if(!(!(Lt(v)||Lt(y))&&!qe(t,"calc")&&!ne&&(ve(v)&&!W||ve(y)&&!A||J(v)&&!W||J(y)&&!A||xe(v)||xe(y))&&(Z(v)||q&&(!m||m&&Dt(m))))&&!((e.parser==="scss"||e.parser==="less")&&q&&y.value==="-"&&rt(v)&&R(y)===P(v.open)&&v.open.value==="(")){if(Ze(y)){if(n.type==="value-paren_group"){c.push(le(T),"");continue}c.push(T,"");continue}if(l&&(si(v)||ni(v)||ti(v)||ri(y)||ei(y))){c.push([c.pop()," "]);continue}if(a&&a.name.toLowerCase()==="namespace"){c.push([c.pop()," "]);continue}if(u){y.source&&v.source&&y.source.start.line!==v.source.start.line?(c.push(T,""),d=!0):c.push([c.pop()," "]);continue}if(!(o&&(o==="font"||o.startsWith("--"))&&(ve(v)&&Z(v)&&hi(y)||ve(y)&&Z(y)&&hi(m)))){if(H){c.push([c.pop()," "]);continue}if(v?.value!=="..."&&!(tt(y)&&tt(v)&&R(y)===P(v))){if(tt(y)&&rt(v)&&R(y)===P(v.open)){c.push(M,"");continue}if(y.value==="with"&&rt(v)){c=[[Pe(c)," "]];continue}if(!(y.value?.endsWith("#")&&v.value==="{"&&rt(v.group))&&!(Ze(v)&&!O)){if(!a&&y.type==="value-comment"&&!y.inline&&r.groups.slice(0,p).every(k=>k.type==="value-comment")){c.push(le(C),"");continue}c.push(C,"")}}}}}return f&&c.push([c.pop(),Ne]),d&&c.unshift("",T),l?D(L(c)):Qn(t)?D(Pe(c)):D(L(Pe(c)))}function hi(t){if(t?.type==="value-number")return!0;if(t?.type!=="value-func")return!1;let e=t.value.toLowerCase();return e==="var"||e==="calc"||e==="min"||e==="max"||e==="clamp"||e.startsWith("--")}var di=hc;function dc(t){return t.length===1?t:t.toLowerCase().replace(/^([+-]?[\d.]+e)(?:\+|(-))?0*(?=\d)/u,"$1$2").replace(/^([+-]?[\d.]+)e[+-]?0+$/u,"$1").replace(/^([+-])?\./u,"$10.").replace(/(\.\d+?)0+(?=e|$)/u,"$1").replace(/\.(?=e|$)/u,"")}var mi=dc;var Wt=new Map([["em","em"],["rem","rem"],["ex","ex"],["rex","rex"],["cap","cap"],["rcap","rcap"],["ch","ch"],["rch","rch"],["ic","ic"],["ric","ric"],["lh","lh"],["rlh","rlh"],["vw","vw"],["svw","svw"],["lvw","lvw"],["dvw","dvw"],["vh","vh"],["svh","svh"],["lvh","lvh"],["dvh","dvh"],["vi","vi"],["svi","svi"],["lvi","lvi"],["dvi","dvi"],["vb","vb"],["svb","svb"],["lvb","lvb"],["dvb","dvb"],["vmin","vmin"],["svmin","svmin"],["lvmin","lvmin"],["dvmin","dvmin"],["vmax","vmax"],["svmax","svmax"],["lvmax","lvmax"],["dvmax","dvmax"],["cm","cm"],["mm","mm"],["q","Q"],["in","in"],["pt","pt"],["pc","pc"],["px","px"],["deg","deg"],["grad","grad"],["rad","rad"],["turn","turn"],["s","s"],["ms","ms"],["hz","Hz"],["khz","kHz"],["dpi","dpi"],["dpcm","dpcm"],["dppx","dppx"],["x","x"],["cqw","cqw"],["cqh","cqh"],["cqi","cqi"],["cqb","cqb"],["cqmin","cqmin"],["cqmax","cqmax"],["fr","fr"]]);function ss(t){let e=t.toLowerCase();return Wt.has(e)?Wt.get(e):t}var yi=/(["'])(?:(?!\1)[^\\]|\\.)*\1/gsu,mc=/(?:\d*\.\d+|\d+\.?)(?:e[+-]?\d+)?/giu,yc=/[a-z]+/giu,gc=/[$@]?[_a-z\u0080-\uFFFF][\w\u0080-\uFFFF-]*/giu,wc=new RegExp(yi.source+`|(${gc.source})?(${mc.source})(${yc.source})?`,"giu");function V(t,e){return E(0,t,yi,s=>Nt(s,e))}function gi(t,e){let s=e.singleQuote?"'":'"',r="",n=t.match(/^(?<value>.+?)\s+(?<flag>[a-zA-Z])$/u);return n&&({value:t,flag:r}=n.groups),(t.includes('"')||t.includes("'")?t:s+t+s)+(r?` ${r}`:"")}function _e(t){return E(0,t,wc,(e,s,r,n,i)=>!r&&n&&(i??(i=""),i=i.toLowerCase(),!i||i==="n"||Wt.has(i))?ns(n)+(i?ss(i):""):e)}function ns(t){return mi(t).replace(/\.0(?=$|e)/u,"")}function wi(t){return t.trailingComma==="es5"||t.trailingComma==="all"}var vi=t=>t===`+`:"")+Wn(s)};var cc=new Set(["red","green","blue","alpha","a","rgb","hue","h","saturation","s","lightness","l","whiteness","w","blackness","b","tint","shade","blend","blenda","contrast","hsl","hsla","hwb","hwba"]);function zn(t){return t.findAncestor(e=>e.type==="css-decl")?.prop?.toLowerCase()}var fc=new Set(["initial","inherit","unset","revert"]);function jn(t){return fc.has(t.toLowerCase())}function Hn(t,e){return t.findAncestor(r=>r.type==="css-atrule")?.name?.toLowerCase().endsWith("keyframes")&&["from","to"].includes(e.toLowerCase())}function Ie(t){return t.includes("$")||t.includes("@")||t.includes("#")||t.startsWith("%")||t.startsWith("--")||t.startsWith(":--")||t.includes("(")&&t.includes(")")?t:t.toLowerCase()}function qe(t,e){return t.findAncestor(r=>r.type==="value-func")?.value?.toLowerCase()===e}function Kn(t){return t.hasAncestor(e=>{if(e.type!=="css-rule")return!1;let s=e.raws?.selector;return s&&(s.startsWith(":import")||s.startsWith(":export"))})}function we(t,e){let s=Array.isArray(e)?e:[e],r=t.findAncestor(n=>n.type==="css-atrule");return r&&s.includes(r.name.toLowerCase())}function Qn(t){let{node:e}=t;return e.groups[0]?.value==="url"&&e.groups.length===2&&t.findAncestor(s=>s.type==="css-atrule")?.name==="import"}function Xn(t){return t.type==="value-func"&&t.value.toLowerCase()==="url"}function Jn(t){return t.type==="value-func"&&t.value.toLowerCase()==="var"}function Zn(t){let{selector:e}=t;return e?typeof e=="string"&&/^@.+:.*$/u.test(e)||e.value&&/^@.+:.*$/u.test(e.value):!1}function ei(t){return t.type==="value-word"&&["from","through","end"].includes(t.value)}function ti(t){return t.type==="value-word"&&["and","or","not"].includes(t.value)}function ri(t){return t.type==="value-word"&&t.value==="in"}function Lt(t){return t.type==="value-operator"&&t.value==="*"}function ve(t){return t?.type==="value-operator"&&t.value==="/"}function J(t){return t.type==="value-operator"&&t.value==="+"}function xe(t){return t.type==="value-operator"&&t.value==="-"}function pc(t){return t.type==="value-operator"&&t.value==="%"}function Dt(t){return Lt(t)||ve(t)||J(t)||xe(t)||pc(t)}function si(t){return t.type==="value-word"&&["==","!="].includes(t.value)}function ni(t){return t.type==="value-word"&&["<",">","<=",">="].includes(t.value)}function Je(t,e){return e.parser==="scss"&&t.type==="css-atrule"&&["if","else","for","each","while"].includes(t.name)}function es(t){return t.raws?.params&&/^\(\s*\)$/u.test(t.raws.params)}function Mt(t){return t.name.startsWith("prettier-placeholder")}function ii(t){return t.prop.startsWith("@prettier-placeholder")}function oi(t,e){return t.value==="$$"&&t.type==="value-func"&&e?.type==="value-word"&&!e.raws.before}function ai(t){return t.value?.type==="value-root"&&t.value.group?.type==="value-value"&&t.prop.toLowerCase()==="composes"}function ui(t){return t.value?.group?.group?.type==="value-paren_group"&&t.value.group.group.open!==null&&t.value.group.group.close!==null}function Z(t){return t?.raws?.before===""}function Bt(t){return t.type==="value-comma_group"&&t.groups?.[1]?.type==="value-colon"}function Zr(t){return t.type==="value-paren_group"&&t.groups?.[0]&&Bt(t.groups[0])}function ts(t,e){if(e.parser!=="scss")return!1;let{node:s}=t;if(s.groups.length===0)return!1;let r=t.parent;if(r&&r.type==="value-func"&&r.value==="if")return!1;let n=t.grandparent;return!Zr(s)&&!(n&&Zr(n))?!1:!!(t.findAncestor(o=>o.type==="css-decl")?.prop?.startsWith("$")||Zr(n)||n.type==="value-func")}function Ze(t){return t.type==="value-comment"&&t.inline}function Ut(t){return t.type==="value-word"&&t.value==="#"}function rs(t){return t.type==="value-word"&&t.value==="{"}function Ft(t){return t.type==="value-word"&&t.value==="}"}function et(t){return["value-word","value-atword"].includes(t.type)}function $t(t){return t?.type==="value-colon"}function li(t,e){if(!Bt(e))return!1;let{groups:s}=e,r=s.indexOf(t);return r===-1?!1:$t(s[r+1])}function ci(t){return t.value&&["not","and","or"].includes(t.value.toLowerCase())}function fi(t){return t.type!=="value-func"?!1:cc.has(t.value.toLowerCase())}function Le(t){return/\/\//u.test(t.split(/[\n\r]/u).pop())}function tt(t){return t?.type==="value-atword"&&t.value.startsWith("prettier-placeholder-")}function pi(t,e){if(t.open?.value!=="("||t.close?.value!==")"||t.groups.some(s=>s.type!=="value-comma_group"))return!1;if(e.type==="value-comma_group"){let s=e.groups.indexOf(t)-1,r=e.groups[s];if(r?.type==="value-word"&&r.value==="with")return!0}return!1}function rt(t){return t.type==="value-paren_group"&&t.open?.value==="("&&t.close?.value===")"}function hc(t,e,s){let{node:r}=t,n=t.parent,i=t.grandparent,o=zn(t),u=o&&n.type==="value-value"&&(o==="grid"||o.startsWith("grid-template")),a=t.findAncestor(p=>p.type==="css-atrule"),l=a&&Je(a,e),f=r.groups.some(p=>Ze(p)),h=t.map(s,"groups"),c=[""],g=qe(t,"url"),b=!1,d=!1;for(let p=0;p<r.groups.length;++p){let m=r.groups[p-1],y=r.groups[p],v=r.groups[p+1],O=r.groups[p+2];if(Ze(y)&&!v){c.push([c.pop(),ln([" ",h[p]])]);continue}if(c.push([c.pop(),h[p]]),g){(v&&J(v)||J(y))&&c.push([c.pop()," "]);continue}if(we(t,"forward")&&y.type==="value-word"&&y.value&&m!==void 0&&m.type==="value-word"&&m.value==="as"&&v.type==="value-operator"&&v.value==="*"||we(t,"utility")&&y.type==="value-word"&&v&&v.type==="value-operator"&&v.value==="*"||!v||y.type==="value-word"&&tt(v)&&R(y)===P(v))continue;if(y.type==="value-string"&&y.quoted){let k=y.value.lastIndexOf("#{"),N=y.value.lastIndexOf("}");k!==-1&&N!==-1?b=k>N:k!==-1?b=!0:N!==-1&&(b=!1)}if(b||$t(y)||$t(v)||y.type==="value-atword"&&(y.value===""||y.value.endsWith("["))||v.type==="value-word"&&v.value.startsWith("]")||y.value==="~"||e.parser==="less"&&(v?.type==="value-word"&&v.value==="["||y.type==="value-word"&&y.value==="["&&(v?.type==="value-atword"||v?.type==="value-word")||y.type==="value-word"&&y.value==="]["&&v?.type==="value-word")||y.type!=="value-string"&&y.value&&y.value.includes("\\")&&v&&v.type!=="value-comment"||m?.value&&m.value.indexOf("\\")===m.value.length-1&&y.type==="value-operator"&&y.value==="/"||y.value==="\\"||oi(y,v)||Ut(y)||rs(y)||Ft(v)||rs(v)&&Z(v)||Ft(y)&&Z(v)||y.value==="--"&&Ut(v))continue;let q=Dt(y),H=Dt(v);if((q&&Ut(v)||H&&Ft(y))&&Z(v)||!m&&ve(y)||qe(t,"calc")&&(J(y)||J(v)||xe(y)||xe(v))&&Z(v))continue;let ne=(J(y)||xe(y))&&p===0&&(v.type==="value-number"||v.isHex)&&i&&fi(i)&&!Z(v);if(e.parser==="scss"&&q&&y.value==="-"&&v.type==="value-func"&&R(y)!==P(v)){c.push([c.pop()," "]);continue}let W=O?.type==="value-func"||O&&et(O)||y.type==="value-func"||et(y),A=v.type==="value-func"||et(v)||m?.type==="value-func"||m&&et(m);if(!(!(Lt(v)||Lt(y))&&!qe(t,"calc")&&!ne&&(ve(v)&&!W||ve(y)&&!A||J(v)&&!W||J(y)&&!A||xe(v)||xe(y))&&(Z(v)||q&&(!m||m&&Dt(m))))&&!((e.parser==="scss"||e.parser==="less")&&q&&y.value==="-"&&rt(v)&&R(y)===P(v.open)&&v.open.value==="(")){if(Ze(y)){if(n.type==="value-paren_group"){c.push(le(T),"");continue}c.push(T,"");continue}if(l&&(si(v)||ni(v)||ti(v)||ri(y)||ei(y))){c.push([c.pop()," "]);continue}if(a&&a.name.toLowerCase()==="namespace"){c.push([c.pop()," "]);continue}if(u){y.source&&v.source&&y.source.start.line!==v.source.start.line?(c.push(T,""),d=!0):c.push([c.pop()," "]);continue}if(!(o&&(o==="font"||o.startsWith("--"))&&(ve(v)&&Z(v)&&hi(y)||ve(y)&&Z(y)&&hi(m)))){if(H){c.push([c.pop()," "]);continue}if(v?.value!=="..."&&!(tt(y)&&tt(v)&&R(y)===P(v))){if(tt(y)&&rt(v)&&R(y)===P(v.open)){c.push(M,"");continue}if(y.value==="with"&&rt(v)){c=[[Pe(c)," "]];continue}if(!(y.value?.endsWith("#")&&v.value==="{"&&rt(v.group))&&!(Ze(v)&&!O)){if(!a&&y.type==="value-comment"&&!y.inline&&r.groups.slice(0,p).every(k=>k.type==="value-comment")){c.push(le(C),"");continue}c.push(C,"")}}}}}return f&&c.push([c.pop(),Ne]),d&&c.unshift("",T),l?D(L(c)):Qn(t)?D(Pe(c)):D(L(Pe(c)))}function hi(t){if(t?.type==="value-number")return!0;if(t?.type!=="value-func")return!1;let e=t.value.toLowerCase();return e==="var"||e==="calc"||e==="min"||e==="max"||e==="clamp"||e.startsWith("--")}var di=hc;function dc(t){return t.length===1?t:t.toLowerCase().replace(/^([+-]?[\d.]+e)(?:\+|(-))?0*(?=\d)/u,"$1$2").replace(/^([+-]?[\d.]+)e[+-]?0+$/u,"$1").replace(/^([+-])?\./u,"$10.").replace(/(\.\d+?)0+(?=e|$)/u,"$1").replace(/\.(?=e|$)/u,"")}var mi=dc;var Wt=new Map([["em","em"],["rem","rem"],["ex","ex"],["rex","rex"],["cap","cap"],["rcap","rcap"],["ch","ch"],["rch","rch"],["ic","ic"],["ric","ric"],["lh","lh"],["rlh","rlh"],["vw","vw"],["svw","svw"],["lvw","lvw"],["dvw","dvw"],["vh","vh"],["svh","svh"],["lvh","lvh"],["dvh","dvh"],["vi","vi"],["svi","svi"],["lvi","lvi"],["dvi","dvi"],["vb","vb"],["svb","svb"],["lvb","lvb"],["dvb","dvb"],["vmin","vmin"],["svmin","svmin"],["lvmin","lvmin"],["dvmin","dvmin"],["vmax","vmax"],["svmax","svmax"],["lvmax","lvmax"],["dvmax","dvmax"],["cm","cm"],["mm","mm"],["q","Q"],["in","in"],["pt","pt"],["pc","pc"],["px","px"],["deg","deg"],["grad","grad"],["rad","rad"],["turn","turn"],["s","s"],["ms","ms"],["hz","Hz"],["khz","kHz"],["dpi","dpi"],["dpcm","dpcm"],["dppx","dppx"],["x","x"],["cqw","cqw"],["cqh","cqh"],["cqi","cqi"],["cqb","cqb"],["cqmin","cqmin"],["cqmax","cqmax"],["fr","fr"]]);function ss(t){let e=t.toLowerCase();return Wt.has(e)?Wt.get(e):t}var yi=/(["'])(?:(?!\1)[^\\]|\\.)*\1/gsu,mc=/(?:\d*\.\d+|\d+\.?)(?:e[+-]?\d+)?/giu,yc=/[a-z]+/giu,gc=/[$@]?[_a-z\u0080-\uFFFF][\w\u0080-\uFFFF-]*/giu,wc=new RegExp(yi.source+`|(${gc.source})?(${mc.source})(${yc.source})?`,"giu");function V(t,e){return E(0,t,yi,s=>Nt(s,e))}function gi(t,e){let s=e.singleQuote?"'":'"',r="",n=t.match(/^(?<value>.+?)\s+(?<flag>[a-zA-Z])$/u);return n&&({value:t,flag:r}=n.groups),(t.includes('"')||t.includes("'")?t:s+t+s)+(r?` ${r}`:"")}function _e(t){return E(0,t,wc,(e,s,r,n,i)=>!r&&n&&(i??(i=""),i=i.toLowerCase(),!i||i==="n"||Wt.has(i))?ns(n)+(i?ss(i):""):e)}function ns(t){return mi(t).replace(/\.0(?=$|e)/u,"")}function wi(t){return t.trailingComma==="es5"||t.trailingComma==="all"}var vi=t=>t===` `||t==="\r"||t==="\u2028"||t==="\u2029";function vc(t,e,s){let r=!!s?.backwards;if(e===!1)return!1;let n=t.charAt(e);if(r){if(t.charAt(e-1)==="\r"&&n===`
standalone.js +1 lines
--- +++ @@ -26,3 +26,3 @@ `,p)}return{formatted:c,cursorOffset:d,comments:f.comments}}function Nu(e,t,u){return typeof t!="number"||Number.isNaN(t)||t<0||t>e.length?u:t}function Sn(e,t){let{cursorOffset:u,rangeStart:r,rangeEnd:o}=t;return u=Nu(e,u,-1),r=Nu(e,r,0),o=Nu(e,o,e.length),{...t,cursorOffset:u,rangeStart:r,rangeEnd:o}}function In(e,t){let{cursorOffset:u,rangeStart:r,rangeEnd:o,endOfLine:n}=Sn(e,t),a=e.charAt(0)===On;if(a&&(e=e.slice(1),u--,r--,o--),n==="auto"&&(n=ju(e)),e.includes("\r")){let s=i=>$t(e.slice(0,Math.max(i,0)),`\r-`);u-=s(u),r-=s(r),o-=s(o),e=Uu(e)}return{hasBOM:a,text:e,options:Sn(e,{...t,cursorOffset:u,rangeStart:r,rangeEnd:o,endOfLine:n})}}async function wn(e,t){let u=await We(t);return!u.hasPragma||u.hasPragma(e)}async function ja(e,t){return(await We(t)).hasIgnorePragma?.(e)}async function Su(e,t){let{hasBOM:u,text:r,options:o}=In(e,await se(t));if(o.rangeStart>=o.rangeEnd&&r!==""||o.requirePragma&&!await wn(r,o)||o.checkIgnorePragma&&await ja(r,o))return{formatted:e,cursorOffset:t.cursorOffset,comments:[]};let n;return o.rangeStart>0||o.rangeEnd<r.length?n=await Ya(r,o):(!o.requirePragma&&o.insertPragma&&o.printer.insertPragma&&!await wn(r,o)&&(r=o.printer.insertPragma(r)),n=await Pn(r,o)),u&&(n.formatted=On+n.formatted,n.cursorOffset>=0&&n.cursorOffset++),n}async function kn(e,t,u){let{text:r,options:o}=In(e,await se(t)),n=await Fe(r,o);return u&&(u.preprocessForPrint&&(n.ast=await xu(n.ast,o)),u.massage&&(n.ast=bn(n.ast,o))),n}async function vn(e,t){t=await se(t);let u=await Ge(e,t);return Ce(u,t)}async function Rn(e,t){let u=Dr(e),{formatted:r}=await Su(u,{...t,parser:"__js_expression"});return r}async function Ln(e,t){t=await se(t);let{ast:u}=await Fe(e,t);return t.cursorOffset>=0&&(t={...t,...Bu(u,t)}),Ge(u,t)}async function Mn(e,t){return Ce(e,await se(t))}var wu={};Yt(wu,{builders:()=>Wa,printer:()=>$a,utils:()=>Va});var Wa={join:Ie,line:rt,softline:ar,hardline:V,literalline:Ze,group:Kt,conditionalGroup:ur,fill:tr,lineSuffix:ve,lineSuffixBoundary:ir,cursor:ee,breakParent:ce,ifBreak:rr,trim:sr,indent:ae,indentIfBreak:nr,align:De,addAlignmentToDoc:ut,markAsRoot:tt,dedentToRoot:Zu,dedent:er,hardlineWithoutBreakParent:ke,literallineWithoutBreakParent:Gt,label:or,concat:e=>e},$a={printDocToString:Ce},Va={willBreak:Gu,traverseDoc:we,findInDoc:qe,mapDoc:Pe,removeLines:Ju,stripTrailingHardline:Qe,replaceEndOfLine:Hu,canBreak:Xu};var Yn="3.8.2";var Pu={};Yt(Pu,{addDanglingComment:()=>ue,addLeadingComment:()=>fe,addTrailingComment:()=>le,getAlignmentSize:()=>he,getIndentSize:()=>jn,getMaxContinuousCount:()=>Un,getNextNonSpaceNonCommentCharacter:()=>Wn,getNextNonSpaceNonCommentCharacterIndex:()=>ni,getPreferredQuote:()=>Kn,getStringWidth:()=>Re,hasNewline:()=>z,hasNewlineInRange:()=>Gn,hasSpaces:()=>zn,isNextLineEmpty:()=>Di,isNextLineEmptyAfterIndex:()=>vt,isPreviousLineEmpty:()=>ai,makeString:()=>si,skip:()=>ye,skipEverythingButNewLine:()=>at,skipInlineComment:()=>xe,skipNewline:()=>K,skipSpaces:()=>Y,skipToLineEnd:()=>ot,skipTrailingComment:()=>Be,skipWhitespace:()=>mr});function Ka(e,t){if(t===!1)return!1;if(e.charAt(t)==="/"&&e.charAt(t+1)==="*"){for(let u=t+2;u<e.length;++u)if(e.charAt(u)==="*"&&e.charAt(u+1)==="/")return u+2}return t}var xe=Ka;function Ga(e,t){return t===!1?!1:e.charAt(t)==="/"&&e.charAt(t+1)==="/"?at(e,t):t}var Be=Ga;function za(e,t){let u=null,r=t;for(;r!==u;)u=r,r=Y(e,r),r=xe(e,r),r=Be(e,r),r=K(e,r);return r}var ze=za;function Ja(e,t){let u=null,r=t;for(;r!==u;)u=r,r=ot(e,r),r=xe(e,r),r=Y(e,r);return r=Be(e,r),r=K(e,r),r!==!1&&z(e,r)}var vt=Ja;function Ha(e,t){let u=e.lastIndexOf(`+`);u-=s(u),r-=s(r),o-=s(o),e=Uu(e)}return{hasBOM:a,text:e,options:Sn(e,{...t,cursorOffset:u,rangeStart:r,rangeEnd:o,endOfLine:n})}}async function wn(e,t){let u=await We(t);return!u.hasPragma||u.hasPragma(e)}async function ja(e,t){return(await We(t)).hasIgnorePragma?.(e)}async function Su(e,t){let{hasBOM:u,text:r,options:o}=In(e,await se(t));if(o.rangeStart>=o.rangeEnd&&r!==""||o.requirePragma&&!await wn(r,o)||o.checkIgnorePragma&&await ja(r,o))return{formatted:e,cursorOffset:t.cursorOffset,comments:[]};let n;return o.rangeStart>0||o.rangeEnd<r.length?n=await Ya(r,o):(!o.requirePragma&&o.insertPragma&&o.printer.insertPragma&&!await wn(r,o)&&(r=o.printer.insertPragma(r)),n=await Pn(r,o)),u&&(n.formatted=On+n.formatted,n.cursorOffset>=0&&n.cursorOffset++),n}async function kn(e,t,u){let{text:r,options:o}=In(e,await se(t)),n=await Fe(r,o);return u&&(u.preprocessForPrint&&(n.ast=await xu(n.ast,o)),u.massage&&(n.ast=bn(n.ast,o))),n}async function vn(e,t){t=await se(t);let u=await Ge(e,t);return Ce(u,t)}async function Rn(e,t){let u=Dr(e),{formatted:r}=await Su(u,{...t,parser:"__js_expression"});return r}async function Ln(e,t){t=await se(t);let{ast:u}=await Fe(e,t);return t.cursorOffset>=0&&(t={...t,...Bu(u,t)}),Ge(u,t)}async function Mn(e,t){return Ce(e,await se(t))}var wu={};Yt(wu,{builders:()=>Wa,printer:()=>$a,utils:()=>Va});var Wa={join:Ie,line:rt,softline:ar,hardline:V,literalline:Ze,group:Kt,conditionalGroup:ur,fill:tr,lineSuffix:ve,lineSuffixBoundary:ir,cursor:ee,breakParent:ce,ifBreak:rr,trim:sr,indent:ae,indentIfBreak:nr,align:De,addAlignmentToDoc:ut,markAsRoot:tt,dedentToRoot:Zu,dedent:er,hardlineWithoutBreakParent:ke,literallineWithoutBreakParent:Gt,label:or,concat:e=>e},$a={printDocToString:Ce},Va={willBreak:Gu,traverseDoc:we,findInDoc:qe,mapDoc:Pe,removeLines:Ju,stripTrailingHardline:Qe,replaceEndOfLine:Hu,canBreak:Xu};var Yn="3.8.3";var Pu={};Yt(Pu,{addDanglingComment:()=>ue,addLeadingComment:()=>fe,addTrailingComment:()=>le,getAlignmentSize:()=>he,getIndentSize:()=>jn,getMaxContinuousCount:()=>Un,getNextNonSpaceNonCommentCharacter:()=>Wn,getNextNonSpaceNonCommentCharacterIndex:()=>ni,getPreferredQuote:()=>Kn,getStringWidth:()=>Re,hasNewline:()=>z,hasNewlineInRange:()=>Gn,hasSpaces:()=>zn,isNextLineEmpty:()=>Di,isNextLineEmptyAfterIndex:()=>vt,isPreviousLineEmpty:()=>ai,makeString:()=>si,skip:()=>ye,skipEverythingButNewLine:()=>at,skipInlineComment:()=>xe,skipNewline:()=>K,skipSpaces:()=>Y,skipToLineEnd:()=>ot,skipTrailingComment:()=>Be,skipWhitespace:()=>mr});function Ka(e,t){if(t===!1)return!1;if(e.charAt(t)==="/"&&e.charAt(t+1)==="*"){for(let u=t+2;u<e.length;++u)if(e.charAt(u)==="*"&&e.charAt(u+1)==="/")return u+2}return t}var xe=Ka;function Ga(e,t){return t===!1?!1:e.charAt(t)==="/"&&e.charAt(t+1)==="/"?at(e,t):t}var Be=Ga;function za(e,t){let u=null,r=t;for(;r!==u;)u=r,r=Y(e,r),r=xe(e,r),r=Be(e,r),r=K(e,r);return r}var ze=za;function Ja(e,t){let u=null,r=t;for(;r!==u;)u=r,r=ot(e,r),r=xe(e,r),r=Y(e,r);return r=Be(e,r),r=K(e,r),r!==!1&&z(e,r)}var vt=Ja;function Ha(e,t){let u=e.lastIndexOf(` `);return u===-1?0:he(e.slice(u+1).match(/^[\t ]*/u)[0],t)}var jn=Ha;function Ou(e){if(typeof e!="string")throw new TypeError("Expected a string");return e.replace(/[|\\{}()[\]^$+*?.]/g,"\\$&").replace(/-/g,"\\x2d")}function Xa(e,t){let u=e.matchAll(new RegExp(`(?:${Ou(t)})+`,"gu"));return u.reduce||(u=[...u]),u.reduce((r,[o])=>Math.max(r,o.length),0)/t.length}var Un=Xa;function qa(e,t){let u=ze(e,t);return u===!1?"":e.charAt(u)}var Wn=qa;var $n=Object.freeze({character:"'",codePoint:39}),Vn=Object.freeze({character:'"',codePoint:34}),Qa=Object.freeze({preferred:$n,alternate:Vn}),Za=Object.freeze({preferred:Vn,alternate:$n});function ei(e,t){let{preferred:u,alternate:r}=t===!0||t==="'"?Qa:Za,{length:o}=e,n=0,a=0;for(let s=0;s<o;s++){let i=e.charCodeAt(s);i===u.codePoint?n++:i===r.codePoint&&a++}return(n>a?r:u).character}var Kn=ei;function ti(e,t,u){for(let r=t;r<u;++r)if(e.charAt(r)===`
standalone.mjs +1 lines
--- +++ @@ -26,3 +26,3 @@ `,p)}return{formatted:c,cursorOffset:d,comments:f.comments}}function Nu(e,t,u){return typeof t!="number"||Number.isNaN(t)||t<0||t>e.length?u:t}function Nn(e,t){let{cursorOffset:u,rangeStart:r,rangeEnd:o}=t;return u=Nu(e,u,-1),r=Nu(e,r,0),o=Nu(e,o,e.length),{...t,cursorOffset:u,rangeStart:r,rangeEnd:o}}function Pn(e,t){let{cursorOffset:u,rangeStart:r,rangeEnd:o,endOfLine:n}=Nn(e,t),a=e.charAt(0)===wn;if(a&&(e=e.slice(1),u--,r--,o--),n==="auto"&&(n=Yu(e)),e.includes("\r")){let s=i=>$t(e.slice(0,Math.max(i,0)),`\r-`);u-=s(u),r-=s(r),o-=s(o),e=ju(e)}return{hasBOM:a,text:e,options:Nn(e,{...t,cursorOffset:u,rangeStart:r,rangeEnd:o,endOfLine:n})}}async function Sn(e,t){let u=await We(t);return!u.hasPragma||u.hasPragma(e)}async function ja(e,t){return(await We(t)).hasIgnorePragma?.(e)}async function Su(e,t){let{hasBOM:u,text:r,options:o}=Pn(e,await se(t));if(o.rangeStart>=o.rangeEnd&&r!==""||o.requirePragma&&!await Sn(r,o)||o.checkIgnorePragma&&await ja(r,o))return{formatted:e,cursorOffset:t.cursorOffset,comments:[]};let n;return o.rangeStart>0||o.rangeEnd<r.length?n=await Ya(r,o):(!o.requirePragma&&o.insertPragma&&o.printer.insertPragma&&!await Sn(r,o)&&(r=o.printer.insertPragma(r)),n=await On(r,o)),u&&(n.formatted=wn+n.formatted,n.cursorOffset>=0&&n.cursorOffset++),n}async function In(e,t,u){let{text:r,options:o}=Pn(e,await se(t)),n=await Fe(r,o);return u&&(u.preprocessForPrint&&(n.ast=await xu(n.ast,o)),u.massage&&(n.ast=yn(n.ast,o))),n}async function kn(e,t){t=await se(t);let u=await Ge(e,t);return Ce(u,t)}async function vn(e,t){let u=sr(e),{formatted:r}=await Su(u,{...t,parser:"__js_expression"});return r}async function Rn(e,t){t=await se(t);let{ast:u}=await Fe(e,t);return t.cursorOffset>=0&&(t={...t,...Bu(u,t)}),Ge(u,t)}async function Ln(e,t){return Ce(e,await se(t))}var wu={};Yt(wu,{builders:()=>Wa,printer:()=>$a,utils:()=>Va});var Wa={join:Ie,line:ut,softline:or,hardline:V,literalline:Qe,group:Kt,conditionalGroup:tr,fill:er,lineSuffix:ve,lineSuffixBoundary:ar,cursor:ee,breakParent:ce,ifBreak:ur,trim:ir,indent:ae,indentIfBreak:rr,align:De,addAlignmentToDoc:tt,markAsRoot:et,dedentToRoot:Qu,dedent:Zu,hardlineWithoutBreakParent:ke,literallineWithoutBreakParent:Gt,label:nr,concat:e=>e},$a={printDocToString:Ce},Va={willBreak:Ku,traverseDoc:we,findInDoc:Xe,mapDoc:Pe,removeLines:zu,stripTrailingHardline:qe,replaceEndOfLine:Ju,canBreak:Hu};var Mn="3.8.2";var Pu={};Yt(Pu,{addDanglingComment:()=>ue,addLeadingComment:()=>fe,addTrailingComment:()=>le,getAlignmentSize:()=>he,getIndentSize:()=>Yn,getMaxContinuousCount:()=>jn,getNextNonSpaceNonCommentCharacter:()=>Un,getNextNonSpaceNonCommentCharacterIndex:()=>ni,getPreferredQuote:()=>Vn,getStringWidth:()=>Re,hasNewline:()=>z,hasNewlineInRange:()=>Kn,hasSpaces:()=>Gn,isNextLineEmpty:()=>Di,isNextLineEmptyAfterIndex:()=>kt,isPreviousLineEmpty:()=>ai,makeString:()=>si,skip:()=>ye,skipEverythingButNewLine:()=>ot,skipInlineComment:()=>xe,skipNewline:()=>K,skipSpaces:()=>Y,skipToLineEnd:()=>nt,skipTrailingComment:()=>Be,skipWhitespace:()=>Fr});function Ka(e,t){if(t===!1)return!1;if(e.charAt(t)==="/"&&e.charAt(t+1)==="*"){for(let u=t+2;u<e.length;++u)if(e.charAt(u)==="*"&&e.charAt(u+1)==="/")return u+2}return t}var xe=Ka;function Ga(e,t){return t===!1?!1:e.charAt(t)==="/"&&e.charAt(t+1)==="/"?ot(e,t):t}var Be=Ga;function za(e,t){let u=null,r=t;for(;r!==u;)u=r,r=Y(e,r),r=xe(e,r),r=Be(e,r),r=K(e,r);return r}var ze=za;function Ja(e,t){let u=null,r=t;for(;r!==u;)u=r,r=nt(e,r),r=xe(e,r),r=Y(e,r);return r=Be(e,r),r=K(e,r),r!==!1&&z(e,r)}var kt=Ja;function Ha(e,t){let u=e.lastIndexOf(`+`);u-=s(u),r-=s(r),o-=s(o),e=ju(e)}return{hasBOM:a,text:e,options:Nn(e,{...t,cursorOffset:u,rangeStart:r,rangeEnd:o,endOfLine:n})}}async function Sn(e,t){let u=await We(t);return!u.hasPragma||u.hasPragma(e)}async function ja(e,t){return(await We(t)).hasIgnorePragma?.(e)}async function Su(e,t){let{hasBOM:u,text:r,options:o}=Pn(e,await se(t));if(o.rangeStart>=o.rangeEnd&&r!==""||o.requirePragma&&!await Sn(r,o)||o.checkIgnorePragma&&await ja(r,o))return{formatted:e,cursorOffset:t.cursorOffset,comments:[]};let n;return o.rangeStart>0||o.rangeEnd<r.length?n=await Ya(r,o):(!o.requirePragma&&o.insertPragma&&o.printer.insertPragma&&!await Sn(r,o)&&(r=o.printer.insertPragma(r)),n=await On(r,o)),u&&(n.formatted=wn+n.formatted,n.cursorOffset>=0&&n.cursorOffset++),n}async function In(e,t,u){let{text:r,options:o}=Pn(e,await se(t)),n=await Fe(r,o);return u&&(u.preprocessForPrint&&(n.ast=await xu(n.ast,o)),u.massage&&(n.ast=yn(n.ast,o))),n}async function kn(e,t){t=await se(t);let u=await Ge(e,t);return Ce(u,t)}async function vn(e,t){let u=sr(e),{formatted:r}=await Su(u,{...t,parser:"__js_expression"});return r}async function Rn(e,t){t=await se(t);let{ast:u}=await Fe(e,t);return t.cursorOffset>=0&&(t={...t,...Bu(u,t)}),Ge(u,t)}async function Ln(e,t){return Ce(e,await se(t))}var wu={};Yt(wu,{builders:()=>Wa,printer:()=>$a,utils:()=>Va});var Wa={join:Ie,line:ut,softline:or,hardline:V,literalline:Qe,group:Kt,conditionalGroup:tr,fill:er,lineSuffix:ve,lineSuffixBoundary:ar,cursor:ee,breakParent:ce,ifBreak:ur,trim:ir,indent:ae,indentIfBreak:rr,align:De,addAlignmentToDoc:tt,markAsRoot:et,dedentToRoot:Qu,dedent:Zu,hardlineWithoutBreakParent:ke,literallineWithoutBreakParent:Gt,label:nr,concat:e=>e},$a={printDocToString:Ce},Va={willBreak:Ku,traverseDoc:we,findInDoc:Xe,mapDoc:Pe,removeLines:zu,stripTrailingHardline:qe,replaceEndOfLine:Ju,canBreak:Hu};var Mn="3.8.3";var Pu={};Yt(Pu,{addDanglingComment:()=>ue,addLeadingComment:()=>fe,addTrailingComment:()=>le,getAlignmentSize:()=>he,getIndentSize:()=>Yn,getMaxContinuousCount:()=>jn,getNextNonSpaceNonCommentCharacter:()=>Un,getNextNonSpaceNonCommentCharacterIndex:()=>ni,getPreferredQuote:()=>Vn,getStringWidth:()=>Re,hasNewline:()=>z,hasNewlineInRange:()=>Kn,hasSpaces:()=>Gn,isNextLineEmpty:()=>Di,isNextLineEmptyAfterIndex:()=>kt,isPreviousLineEmpty:()=>ai,makeString:()=>si,skip:()=>ye,skipEverythingButNewLine:()=>ot,skipInlineComment:()=>xe,skipNewline:()=>K,skipSpaces:()=>Y,skipToLineEnd:()=>nt,skipTrailingComment:()=>Be,skipWhitespace:()=>Fr});function Ka(e,t){if(t===!1)return!1;if(e.charAt(t)==="/"&&e.charAt(t+1)==="*"){for(let u=t+2;u<e.length;++u)if(e.charAt(u)==="*"&&e.charAt(u+1)==="/")return u+2}return t}var xe=Ka;function Ga(e,t){return t===!1?!1:e.charAt(t)==="/"&&e.charAt(t+1)==="/"?ot(e,t):t}var Be=Ga;function za(e,t){let u=null,r=t;for(;r!==u;)u=r,r=Y(e,r),r=xe(e,r),r=Be(e,r),r=K(e,r);return r}var ze=za;function Ja(e,t){let u=null,r=t;for(;r!==u;)u=r,r=nt(e,r),r=xe(e,r),r=Y(e,r);return r=Be(e,r),r=K(e,r),r!==!1&&z(e,r)}var kt=Ja;function Ha(e,t){let u=e.lastIndexOf(` `);return u===-1?0:he(e.slice(u+1).match(/^[\t ]*/u)[0],t)}var Yn=Ha;function Ou(e){if(typeof e!="string")throw new TypeError("Expected a string");return e.replace(/[|\\{}()[\]^$+*?.]/g,"\\$&").replace(/-/g,"\\x2d")}function Xa(e,t){let u=e.matchAll(new RegExp(`(?:${Ou(t)})+`,"gu"));return u.reduce||(u=[...u]),u.reduce((r,[o])=>Math.max(r,o.length),0)/t.length}var jn=Xa;function qa(e,t){let u=ze(e,t);return u===!1?"":e.charAt(u)}var Un=qa;var Wn=Object.freeze({character:"'",codePoint:39}),$n=Object.freeze({character:'"',codePoint:34}),Qa=Object.freeze({preferred:Wn,alternate:$n}),Za=Object.freeze({preferred:$n,alternate:Wn});function ei(e,t){let{preferred:u,alternate:r}=t===!0||t==="'"?Qa:Za,{length:o}=e,n=0,a=0;for(let s=0;s<o;s++){let i=e.charCodeAt(s);i===u.codePoint?n++:i===r.codePoint&&a++}return(n>a?r:u).character}var Vn=ei;function ti(e,t,u){for(let r=t;r<u;++r)if(e.charAt(r)===`
react npm
19.2.6 25d ago nominal
critical-tier BURST ×9
latest 19.2.6 versions 2812 maintainers 2 critical-tier (snapshotted)
19.2.3
19.1.4
19.0.3
19.2.4
19.1.5
19.0.4
19.2.5
19.1.6
19.0.5
19.2.6
19.1.7
19.0.6
BURST
2 releases in 37m: 0.2.0, 0.2.1
info · registry-verified · 2012-01-10 · 14y ago
BURST
2 releases in 40m: 0.14.4, 0.14.5
info · registry-verified · 2015-12-29 · 10y ago
BURST
3 releases in 26m: 0.14.10, 15.7.0, 16.14.0
info · registry-verified · 2020-10-14 · 5y ago
BURST
3 releases in 5m: 19.2.1, 19.1.2, 19.0.1
info · registry-verified · 2025-12-03 · 5mo ago
BURST
3 releases in 3m: 19.2.2, 19.1.3, 19.0.2
info · registry-verified · 2025-12-11 · 5mo ago
BURST
3 releases in 1m: 19.2.3, 19.1.4, 19.0.3
info · registry-verified · 2025-12-11 · 5mo ago
BURST
3 releases in 2m: 19.2.4, 19.1.5, 19.0.4
info · registry-verified · 2026-01-26 · 4mo ago
BURST
3 releases in 1m: 19.2.5, 19.1.6, 19.0.5
info · registry-verified · 2026-04-08 · 1mo ago
BURST
3 releases in 1m: 19.2.6, 19.1.7, 19.0.6 · ACTIVE
info · registry-verified · 2026-05-06 · 25d ago
release diff 19.1.7 → 19.0.6
+0 added · -0 removed · ~9 modified
cjs/react-jsx-dev-runtime.development.js +421 lines
--- +++ @@ -16,3 +16,3 @@       if ("function" === typeof type)-        return type.$$typeof === REACT_CLIENT_REFERENCE+        return type.$$typeof === REACT_CLIENT_REFERENCE$2           ? null@@ -23,2 +23,4 @@           return "Fragment";+        case REACT_PORTAL_TYPE:+          return "Portal";         case REACT_PROFILER_TYPE:@@ -31,4 +33,2 @@           return "SuspenseList";-        case REACT_ACTIVITY_TYPE:-          return "Activity";       }@@ -42,4 +42,2 @@         ) {-          case REACT_PORTAL_TYPE:-            return "Portal";           case REACT_CONTEXT_TYPE:@@ -98,16 +96,251 @@     }-    function getTaskName(type) {-      if (type === REACT_FRAGMENT_TYPE) return "<>";-      if (-        "object" === typeof type &&-        null !== type &&-        type.$$typeof === REACT_LAZY_TYPE-      )-        return "<...>";+    function disabledLog() {}+    function disableLogs() {+      if (0 === disabledDepth) {+        prevLog = console.log;+        prevInfo = console.info;+        prevWarn = console.warn;+        prevError = console.error;+        prevGroup = console.group;+        prevGroupCollapsed = console.groupCollapsed;+        prevGroupEnd = console.groupEnd;+        var props = {+          configurable: !0,+          enumerable: !0,+          value: disabledLog,+          writable: !0+        };+        Object.defineProperties(console, {+          info: props,+          log: props,+          warn: props,+          error: props,+          group: props,+          groupCollapsed: props,+          groupEnd: props+        });+      }+      disabledDepth++;+    }+    function reenableLogs() {+      disabledDepth--;+      if (0 === disabledDepth) {+        var props = { configurable: !0, enumerable: !0, writable: !0 };+        Object.defineProperties(console, {+          log: assign({}, props, { value: prevLog }),+          info: assign({}, props, { value: prevInfo }),+          warn: assign({}, props, { value: prevWarn }),+          error: assign({}, props, { value: prevError }),+          group: assign({}, props, { value: prevGroup }),+          groupCollapsed: assign({}, props, { value: prevGroupCollapsed }),+          groupEnd: assign({}, props, { value: prevGroupEnd })+        });+      }+      0 > disabledDepth &&+        console.error(+          "disabledDepth fell below zero. This is a bug in React. Please file an issue."+        );+    }+    function describeBuiltInComponentFrame(name) {+      if (void 0 === prefix)+        try {+          throw Error();+        } catch (x) {+          var match = x.stack.trim().match(/\n( *(at )?)/);+          prefix = (match && match[1]) || "";+          suffix =+            -1 < x.stack.indexOf("\n    at")+              ? " (<anonymous>)"+              : -1 < x.stack.indexOf("@")+                ? "@unknown:0:0"+                : "";+        }+      return "\n" + prefix + name + suffix;+    }+    function describeNativeComponentFrame(fn, construct) {+      if (!fn || reentry) return "";+      var frame = componentFrameCache.get(fn);+      if (void 0 !== frame) return frame;+      reentry = !0;+      frame = Error.prepareStackTrace;+      Error.prepareStackTrace = void 0;+      var previousDispatcher = null;+      previousDispatcher = ReactSharedInternals.H;+      ReactSharedInternals.H = null;+      disableLogs();       try {-        var name = getComponentNameFromType(type);-        return name ? "<" + name + ">" : "<...>";-      } catch (x) {-        return "<...>";-      }+        var RunInRootFrame = {+          DetermineComponentFrameRoot: function () {+            try {+              if (construct) {+                var Fake = function () {+                  throw Error();+                };+                Object.defineProperty(Fake.prototype, "props", {+                  set: function () {+                    throw Error();+                  }+                });+                if ("object" === typeof Reflect && Reflect.construct) {+                  try {+                    Reflect.construct(Fake, []);+                  } catch (x) {+                    var control = x;+                  }+                  Reflect.construct(fn, [], Fake);+                } else {+                  try {+                    Fake.call();+                  } catch (x$0) {+                    control = x$0;+                  }+                  fn.call(Fake.prototype);+                }+              } else {+                try {+                  throw Error();+                } catch (x$1) {+                  control = x$1;+                }+                (Fake = fn()) &&+                  "function" === typeof Fake.catch &&+                  Fake.catch(function () {});+              }+            } catch (sample) {+              if (sample && control && "string" === typeof sample.stack)+                return [sample.stack, control.stack];+            }+            return [null, null];+          }+        };+        RunInRootFrame.DetermineComponentFrameRoot.displayName =+          "DetermineComponentFrameRoot";+        var namePropDescriptor = Object.getOwnPropertyDescriptor(+          RunInRootFrame.DetermineComponentFrameRoot,+          "name"+        );+        namePropDescriptor &&+          namePropDescriptor.configurable &&+          Object.defineProperty(+            RunInRootFrame.DetermineComponentFrameRoot,+            "name",+            { value: "DetermineComponentFrameRoot" }+          );+        var _RunInRootFrame$Deter =+            RunInRootFrame.DetermineComponentFrameRoot(),+          sampleStack = _RunInRootFrame$Deter[0],+          controlStack = _RunInRootFrame$Deter[1];+        if (sampleStack && controlStack) {+          var sampleLines = sampleStack.split("\n"),+            controlLines = controlStack.split("\n");+          for (+            _RunInRootFrame$Deter = namePropDescriptor = 0;+            namePropDescriptor < sampleLines.length &&+            !sampleLines[namePropDescriptor].includes(+              "DetermineComponentFrameRoot"+            );++          )+            namePropDescriptor++;+          for (+            ;+            _RunInRootFrame$Deter < controlLines.length &&+            !controlLines[_RunInRootFrame$Deter].includes(+              "DetermineComponentFrameRoot"+            );++          )+            _RunInRootFrame$Deter++;+          if (+            namePropDescriptor === sampleLines.length ||+            _RunInRootFrame$Deter === controlLines.length+          )+            for (+              namePropDescriptor = sampleLines.length - 1,+                _RunInRootFrame$Deter = controlLines.length - 1;+              1 <= namePropDescriptor &&+              0 <= _RunInRootFrame$Deter &&+              sampleLines[namePropDescriptor] !==+                controlLines[_RunInRootFrame$Deter];++            )+              _RunInRootFrame$Deter--;+          for (+            ;+            1 <= namePropDescriptor && 0 <= _RunInRootFrame$Deter;+            namePropDescriptor--, _RunInRootFrame$Deter--+          )+            if (+              sampleLines[namePropDescriptor] !==+              controlLines[_RunInRootFrame$Deter]+            ) {+              if (1 !== namePropDescriptor || 1 !== _RunInRootFrame$Deter) {+                do+                  if (+                    (namePropDescriptor--,+                    _RunInRootFrame$Deter--,+                    0 > _RunInRootFrame$Deter ||+                      sampleLines[namePropDescriptor] !==+                        controlLines[_RunInRootFrame$Deter])+                  ) {+                    var _frame =+                      "\n" ++                      sampleLines[namePropDescriptor].replace(+                        " at new ",+                        " at "+                      );+                    fn.displayName &&+                      _frame.includes("<anonymous>") &&+                      (_frame = _frame.replace("<anonymous>", fn.displayName));+                    "function" === typeof fn &&+                      componentFrameCache.set(fn, _frame);+                    return _frame;+                  }+                while (1 <= namePropDescriptor && 0 <= _RunInRootFrame$Deter);+              }+              break;+            }+        }+      } finally {+        (reentry = !1),+          (ReactSharedInternals.H = previousDispatcher),+          reenableLogs(),+          (Error.prepareStackTrace = frame);+      }
… 328 more lines (truncated)
cjs/react-jsx-dev-runtime.react-server.development.js +423 lines
--- +++ @@ -16,3 +16,3 @@       if ("function" === typeof type)-        return type.$$typeof === REACT_CLIENT_REFERENCE+        return type.$$typeof === REACT_CLIENT_REFERENCE$2           ? null@@ -23,2 +23,4 @@           return "Fragment";+        case REACT_PORTAL_TYPE:+          return "Portal";         case REACT_PROFILER_TYPE:@@ -31,4 +33,2 @@           return "SuspenseList";-        case REACT_ACTIVITY_TYPE:-          return "Activity";       }@@ -42,4 +42,2 @@         ) {-          case REACT_PORTAL_TYPE:-            return "Portal";           case REACT_CONTEXT_TYPE:@@ -98,16 +96,251 @@     }-    function getTaskName(type) {-      if (type === REACT_FRAGMENT_TYPE) return "<>";-      if (-        "object" === typeof type &&-        null !== type &&-        type.$$typeof === REACT_LAZY_TYPE-      )-        return "<...>";+    function disabledLog() {}+    function disableLogs() {+      if (0 === disabledDepth) {+        prevLog = console.log;+        prevInfo = console.info;+        prevWarn = console.warn;+        prevError = console.error;+        prevGroup = console.group;+        prevGroupCollapsed = console.groupCollapsed;+        prevGroupEnd = console.groupEnd;+        var props = {+          configurable: !0,+          enumerable: !0,+          value: disabledLog,+          writable: !0+        };+        Object.defineProperties(console, {+          info: props,+          log: props,+          warn: props,+          error: props,+          group: props,+          groupCollapsed: props,+          groupEnd: props+        });+      }+      disabledDepth++;+    }+    function reenableLogs() {+      disabledDepth--;+      if (0 === disabledDepth) {+        var props = { configurable: !0, enumerable: !0, writable: !0 };+        Object.defineProperties(console, {+          log: assign({}, props, { value: prevLog }),+          info: assign({}, props, { value: prevInfo }),+          warn: assign({}, props, { value: prevWarn }),+          error: assign({}, props, { value: prevError }),+          group: assign({}, props, { value: prevGroup }),+          groupCollapsed: assign({}, props, { value: prevGroupCollapsed }),+          groupEnd: assign({}, props, { value: prevGroupEnd })+        });+      }+      0 > disabledDepth &&+        console.error(+          "disabledDepth fell below zero. This is a bug in React. Please file an issue."+        );+    }+    function describeBuiltInComponentFrame(name) {+      if (void 0 === prefix)+        try {+          throw Error();+        } catch (x) {+          var match = x.stack.trim().match(/\n( *(at )?)/);+          prefix = (match && match[1]) || "";+          suffix =+            -1 < x.stack.indexOf("\n    at")+              ? " (<anonymous>)"+              : -1 < x.stack.indexOf("@")+                ? "@unknown:0:0"+                : "";+        }+      return "\n" + prefix + name + suffix;+    }+    function describeNativeComponentFrame(fn, construct) {+      if (!fn || reentry) return "";+      var frame = componentFrameCache.get(fn);+      if (void 0 !== frame) return frame;+      reentry = !0;+      frame = Error.prepareStackTrace;+      Error.prepareStackTrace = void 0;+      var previousDispatcher = null;+      previousDispatcher = ReactSharedInternalsServer.H;+      ReactSharedInternalsServer.H = null;+      disableLogs();       try {-        var name = getComponentNameFromType(type);-        return name ? "<" + name + ">" : "<...>";-      } catch (x) {-        return "<...>";-      }+        var RunInRootFrame = {+          DetermineComponentFrameRoot: function () {+            try {+              if (construct) {+                var Fake = function () {+                  throw Error();+                };+                Object.defineProperty(Fake.prototype, "props", {+                  set: function () {+                    throw Error();+                  }+                });+                if ("object" === typeof Reflect && Reflect.construct) {+                  try {+                    Reflect.construct(Fake, []);+                  } catch (x) {+                    var control = x;+                  }+                  Reflect.construct(fn, [], Fake);+                } else {+                  try {+                    Fake.call();+                  } catch (x$0) {+                    control = x$0;+                  }+                  fn.call(Fake.prototype);+                }+              } else {+                try {+                  throw Error();+                } catch (x$1) {+                  control = x$1;+                }+                (Fake = fn()) &&+                  "function" === typeof Fake.catch &&+                  Fake.catch(function () {});+              }+            } catch (sample) {+              if (sample && control && "string" === typeof sample.stack)+                return [sample.stack, control.stack];+            }+            return [null, null];+          }+        };+        RunInRootFrame.DetermineComponentFrameRoot.displayName =+          "DetermineComponentFrameRoot";+        var namePropDescriptor = Object.getOwnPropertyDescriptor(+          RunInRootFrame.DetermineComponentFrameRoot,+          "name"+        );+        namePropDescriptor &&+          namePropDescriptor.configurable &&+          Object.defineProperty(+            RunInRootFrame.DetermineComponentFrameRoot,+            "name",+            { value: "DetermineComponentFrameRoot" }+          );+        var _RunInRootFrame$Deter =+            RunInRootFrame.DetermineComponentFrameRoot(),+          sampleStack = _RunInRootFrame$Deter[0],+          controlStack = _RunInRootFrame$Deter[1];+        if (sampleStack && controlStack) {+          var sampleLines = sampleStack.split("\n"),+            controlLines = controlStack.split("\n");+          for (+            _RunInRootFrame$Deter = namePropDescriptor = 0;+            namePropDescriptor < sampleLines.length &&+            !sampleLines[namePropDescriptor].includes(+              "DetermineComponentFrameRoot"+            );++          )+            namePropDescriptor++;+          for (+            ;+            _RunInRootFrame$Deter < controlLines.length &&+            !controlLines[_RunInRootFrame$Deter].includes(+              "DetermineComponentFrameRoot"+            );++          )+            _RunInRootFrame$Deter++;+          if (+            namePropDescriptor === sampleLines.length ||+            _RunInRootFrame$Deter === controlLines.length+          )+            for (+              namePropDescriptor = sampleLines.length - 1,+                _RunInRootFrame$Deter = controlLines.length - 1;+              1 <= namePropDescriptor &&+              0 <= _RunInRootFrame$Deter &&+              sampleLines[namePropDescriptor] !==+                controlLines[_RunInRootFrame$Deter];++            )+              _RunInRootFrame$Deter--;+          for (+            ;+            1 <= namePropDescriptor && 0 <= _RunInRootFrame$Deter;+            namePropDescriptor--, _RunInRootFrame$Deter--+          )+            if (+              sampleLines[namePropDescriptor] !==+              controlLines[_RunInRootFrame$Deter]+            ) {+              if (1 !== namePropDescriptor || 1 !== _RunInRootFrame$Deter) {+                do+                  if (+                    (namePropDescriptor--,+                    _RunInRootFrame$Deter--,+                    0 > _RunInRootFrame$Deter ||+                      sampleLines[namePropDescriptor] !==+                        controlLines[_RunInRootFrame$Deter])+                  ) {+                    var _frame =+                      "\n" ++                      sampleLines[namePropDescriptor].replace(+                        " at new ",+                        " at "+                      );+                    fn.displayName &&+                      _frame.includes("<anonymous>") &&+                      (_frame = _frame.replace("<anonymous>", fn.displayName));+                    "function" === typeof fn &&+                      componentFrameCache.set(fn, _frame);+                    return _frame;+                  }+                while (1 <= namePropDescriptor && 0 <= _RunInRootFrame$Deter);+              }+              break;+            }+        }+      } finally {+        (reentry = !1),+          (ReactSharedInternalsServer.H = previousDispatcher),+          reenableLogs(),+          (Error.prepareStackTrace = frame);+      }
… 362 more lines (truncated)
cjs/react-jsx-runtime.development.js +422 lines
--- +++ @@ -16,3 +16,3 @@       if ("function" === typeof type)-        return type.$$typeof === REACT_CLIENT_REFERENCE+        return type.$$typeof === REACT_CLIENT_REFERENCE$2           ? null@@ -23,2 +23,4 @@           return "Fragment";+        case REACT_PORTAL_TYPE:+          return "Portal";         case REACT_PROFILER_TYPE:@@ -31,4 +33,2 @@           return "SuspenseList";-        case REACT_ACTIVITY_TYPE:-          return "Activity";       }@@ -42,4 +42,2 @@         ) {-          case REACT_PORTAL_TYPE:-            return "Portal";           case REACT_CONTEXT_TYPE:@@ -98,16 +96,251 @@     }-    function getTaskName(type) {-      if (type === REACT_FRAGMENT_TYPE) return "<>";-      if (-        "object" === typeof type &&-        null !== type &&-        type.$$typeof === REACT_LAZY_TYPE-      )-        return "<...>";+    function disabledLog() {}+    function disableLogs() {+      if (0 === disabledDepth) {+        prevLog = console.log;+        prevInfo = console.info;+        prevWarn = console.warn;+        prevError = console.error;+        prevGroup = console.group;+        prevGroupCollapsed = console.groupCollapsed;+        prevGroupEnd = console.groupEnd;+        var props = {+          configurable: !0,+          enumerable: !0,+          value: disabledLog,+          writable: !0+        };+        Object.defineProperties(console, {+          info: props,+          log: props,+          warn: props,+          error: props,+          group: props,+          groupCollapsed: props,+          groupEnd: props+        });+      }+      disabledDepth++;+    }+    function reenableLogs() {+      disabledDepth--;+      if (0 === disabledDepth) {+        var props = { configurable: !0, enumerable: !0, writable: !0 };+        Object.defineProperties(console, {+          log: assign({}, props, { value: prevLog }),+          info: assign({}, props, { value: prevInfo }),+          warn: assign({}, props, { value: prevWarn }),+          error: assign({}, props, { value: prevError }),+          group: assign({}, props, { value: prevGroup }),+          groupCollapsed: assign({}, props, { value: prevGroupCollapsed }),+          groupEnd: assign({}, props, { value: prevGroupEnd })+        });+      }+      0 > disabledDepth &&+        console.error(+          "disabledDepth fell below zero. This is a bug in React. Please file an issue."+        );+    }+    function describeBuiltInComponentFrame(name) {+      if (void 0 === prefix)+        try {+          throw Error();+        } catch (x) {+          var match = x.stack.trim().match(/\n( *(at )?)/);+          prefix = (match && match[1]) || "";+          suffix =+            -1 < x.stack.indexOf("\n    at")+              ? " (<anonymous>)"+              : -1 < x.stack.indexOf("@")+                ? "@unknown:0:0"+                : "";+        }+      return "\n" + prefix + name + suffix;+    }+    function describeNativeComponentFrame(fn, construct) {+      if (!fn || reentry) return "";+      var frame = componentFrameCache.get(fn);+      if (void 0 !== frame) return frame;+      reentry = !0;+      frame = Error.prepareStackTrace;+      Error.prepareStackTrace = void 0;+      var previousDispatcher = null;+      previousDispatcher = ReactSharedInternals.H;+      ReactSharedInternals.H = null;+      disableLogs();       try {-        var name = getComponentNameFromType(type);-        return name ? "<" + name + ">" : "<...>";-      } catch (x) {-        return "<...>";-      }+        var RunInRootFrame = {+          DetermineComponentFrameRoot: function () {+            try {+              if (construct) {+                var Fake = function () {+                  throw Error();+                };+                Object.defineProperty(Fake.prototype, "props", {+                  set: function () {+                    throw Error();+                  }+                });+                if ("object" === typeof Reflect && Reflect.construct) {+                  try {+                    Reflect.construct(Fake, []);+                  } catch (x) {+                    var control = x;+                  }+                  Reflect.construct(fn, [], Fake);+                } else {+                  try {+                    Fake.call();+                  } catch (x$0) {+                    control = x$0;+                  }+                  fn.call(Fake.prototype);+                }+              } else {+                try {+                  throw Error();+                } catch (x$1) {+                  control = x$1;+                }+                (Fake = fn()) &&+                  "function" === typeof Fake.catch &&+                  Fake.catch(function () {});+              }+            } catch (sample) {+              if (sample && control && "string" === typeof sample.stack)+                return [sample.stack, control.stack];+            }+            return [null, null];+          }+        };+        RunInRootFrame.DetermineComponentFrameRoot.displayName =+          "DetermineComponentFrameRoot";+        var namePropDescriptor = Object.getOwnPropertyDescriptor(+          RunInRootFrame.DetermineComponentFrameRoot,+          "name"+        );+        namePropDescriptor &&+          namePropDescriptor.configurable &&+          Object.defineProperty(+            RunInRootFrame.DetermineComponentFrameRoot,+            "name",+            { value: "DetermineComponentFrameRoot" }+          );+        var _RunInRootFrame$Deter =+            RunInRootFrame.DetermineComponentFrameRoot(),+          sampleStack = _RunInRootFrame$Deter[0],+          controlStack = _RunInRootFrame$Deter[1];+        if (sampleStack && controlStack) {+          var sampleLines = sampleStack.split("\n"),+            controlLines = controlStack.split("\n");+          for (+            _RunInRootFrame$Deter = namePropDescriptor = 0;+            namePropDescriptor < sampleLines.length &&+            !sampleLines[namePropDescriptor].includes(+              "DetermineComponentFrameRoot"+            );++          )+            namePropDescriptor++;+          for (+            ;+            _RunInRootFrame$Deter < controlLines.length &&+            !controlLines[_RunInRootFrame$Deter].includes(+              "DetermineComponentFrameRoot"+            );++          )+            _RunInRootFrame$Deter++;+          if (+            namePropDescriptor === sampleLines.length ||+            _RunInRootFrame$Deter === controlLines.length+          )+            for (+              namePropDescriptor = sampleLines.length - 1,+                _RunInRootFrame$Deter = controlLines.length - 1;+              1 <= namePropDescriptor &&+              0 <= _RunInRootFrame$Deter &&+              sampleLines[namePropDescriptor] !==+                controlLines[_RunInRootFrame$Deter];++            )+              _RunInRootFrame$Deter--;+          for (+            ;+            1 <= namePropDescriptor && 0 <= _RunInRootFrame$Deter;+            namePropDescriptor--, _RunInRootFrame$Deter--+          )+            if (+              sampleLines[namePropDescriptor] !==+              controlLines[_RunInRootFrame$Deter]+            ) {+              if (1 !== namePropDescriptor || 1 !== _RunInRootFrame$Deter) {+                do+                  if (+                    (namePropDescriptor--,+                    _RunInRootFrame$Deter--,+                    0 > _RunInRootFrame$Deter ||+                      sampleLines[namePropDescriptor] !==+                        controlLines[_RunInRootFrame$Deter])+                  ) {+                    var _frame =+                      "\n" ++                      sampleLines[namePropDescriptor].replace(+                        " at new ",+                        " at "+                      );+                    fn.displayName &&+                      _frame.includes("<anonymous>") &&+                      (_frame = _frame.replace("<anonymous>", fn.displayName));+                    "function" === typeof fn &&+                      componentFrameCache.set(fn, _frame);+                    return _frame;+                  }+                while (1 <= namePropDescriptor && 0 <= _RunInRootFrame$Deter);+              }+              break;+            }+        }+      } finally {+        (reentry = !1),+          (ReactSharedInternals.H = previousDispatcher),+          reenableLogs(),+          (Error.prepareStackTrace = frame);+      }
… 344 more lines (truncated)
cjs/react-jsx-runtime.react-server.development.js +423 lines
--- +++ @@ -16,3 +16,3 @@       if ("function" === typeof type)-        return type.$$typeof === REACT_CLIENT_REFERENCE+        return type.$$typeof === REACT_CLIENT_REFERENCE$2           ? null@@ -23,2 +23,4 @@           return "Fragment";+        case REACT_PORTAL_TYPE:+          return "Portal";         case REACT_PROFILER_TYPE:@@ -31,4 +33,2 @@           return "SuspenseList";-        case REACT_ACTIVITY_TYPE:-          return "Activity";       }@@ -42,4 +42,2 @@         ) {-          case REACT_PORTAL_TYPE:-            return "Portal";           case REACT_CONTEXT_TYPE:@@ -98,16 +96,251 @@     }-    function getTaskName(type) {-      if (type === REACT_FRAGMENT_TYPE) return "<>";-      if (-        "object" === typeof type &&-        null !== type &&-        type.$$typeof === REACT_LAZY_TYPE-      )-        return "<...>";+    function disabledLog() {}+    function disableLogs() {+      if (0 === disabledDepth) {+        prevLog = console.log;+        prevInfo = console.info;+        prevWarn = console.warn;+        prevError = console.error;+        prevGroup = console.group;+        prevGroupCollapsed = console.groupCollapsed;+        prevGroupEnd = console.groupEnd;+        var props = {+          configurable: !0,+          enumerable: !0,+          value: disabledLog,+          writable: !0+        };+        Object.defineProperties(console, {+          info: props,+          log: props,+          warn: props,+          error: props,+          group: props,+          groupCollapsed: props,+          groupEnd: props+        });+      }+      disabledDepth++;+    }+    function reenableLogs() {+      disabledDepth--;+      if (0 === disabledDepth) {+        var props = { configurable: !0, enumerable: !0, writable: !0 };+        Object.defineProperties(console, {+          log: assign({}, props, { value: prevLog }),+          info: assign({}, props, { value: prevInfo }),+          warn: assign({}, props, { value: prevWarn }),+          error: assign({}, props, { value: prevError }),+          group: assign({}, props, { value: prevGroup }),+          groupCollapsed: assign({}, props, { value: prevGroupCollapsed }),+          groupEnd: assign({}, props, { value: prevGroupEnd })+        });+      }+      0 > disabledDepth &&+        console.error(+          "disabledDepth fell below zero. This is a bug in React. Please file an issue."+        );+    }+    function describeBuiltInComponentFrame(name) {+      if (void 0 === prefix)+        try {+          throw Error();+        } catch (x) {+          var match = x.stack.trim().match(/\n( *(at )?)/);+          prefix = (match && match[1]) || "";+          suffix =+            -1 < x.stack.indexOf("\n    at")+              ? " (<anonymous>)"+              : -1 < x.stack.indexOf("@")+                ? "@unknown:0:0"+                : "";+        }+      return "\n" + prefix + name + suffix;+    }+    function describeNativeComponentFrame(fn, construct) {+      if (!fn || reentry) return "";+      var frame = componentFrameCache.get(fn);+      if (void 0 !== frame) return frame;+      reentry = !0;+      frame = Error.prepareStackTrace;+      Error.prepareStackTrace = void 0;+      var previousDispatcher = null;+      previousDispatcher = ReactSharedInternalsServer.H;+      ReactSharedInternalsServer.H = null;+      disableLogs();       try {-        var name = getComponentNameFromType(type);-        return name ? "<" + name + ">" : "<...>";-      } catch (x) {-        return "<...>";-      }+        var RunInRootFrame = {+          DetermineComponentFrameRoot: function () {+            try {+              if (construct) {+                var Fake = function () {+                  throw Error();+                };+                Object.defineProperty(Fake.prototype, "props", {+                  set: function () {+                    throw Error();+                  }+                });+                if ("object" === typeof Reflect && Reflect.construct) {+                  try {+                    Reflect.construct(Fake, []);+                  } catch (x) {+                    var control = x;+                  }+                  Reflect.construct(fn, [], Fake);+                } else {+                  try {+                    Fake.call();+                  } catch (x$0) {+                    control = x$0;+                  }+                  fn.call(Fake.prototype);+                }+              } else {+                try {+                  throw Error();+                } catch (x$1) {+                  control = x$1;+                }+                (Fake = fn()) &&+                  "function" === typeof Fake.catch &&+                  Fake.catch(function () {});+              }+            } catch (sample) {+              if (sample && control && "string" === typeof sample.stack)+                return [sample.stack, control.stack];+            }+            return [null, null];+          }+        };+        RunInRootFrame.DetermineComponentFrameRoot.displayName =+          "DetermineComponentFrameRoot";+        var namePropDescriptor = Object.getOwnPropertyDescriptor(+          RunInRootFrame.DetermineComponentFrameRoot,+          "name"+        );+        namePropDescriptor &&+          namePropDescriptor.configurable &&+          Object.defineProperty(+            RunInRootFrame.DetermineComponentFrameRoot,+            "name",+            { value: "DetermineComponentFrameRoot" }+          );+        var _RunInRootFrame$Deter =+            RunInRootFrame.DetermineComponentFrameRoot(),+          sampleStack = _RunInRootFrame$Deter[0],+          controlStack = _RunInRootFrame$Deter[1];+        if (sampleStack && controlStack) {+          var sampleLines = sampleStack.split("\n"),+            controlLines = controlStack.split("\n");+          for (+            _RunInRootFrame$Deter = namePropDescriptor = 0;+            namePropDescriptor < sampleLines.length &&+            !sampleLines[namePropDescriptor].includes(+              "DetermineComponentFrameRoot"+            );++          )+            namePropDescriptor++;+          for (+            ;+            _RunInRootFrame$Deter < controlLines.length &&+            !controlLines[_RunInRootFrame$Deter].includes(+              "DetermineComponentFrameRoot"+            );++          )+            _RunInRootFrame$Deter++;+          if (+            namePropDescriptor === sampleLines.length ||+            _RunInRootFrame$Deter === controlLines.length+          )+            for (+              namePropDescriptor = sampleLines.length - 1,+                _RunInRootFrame$Deter = controlLines.length - 1;+              1 <= namePropDescriptor &&+              0 <= _RunInRootFrame$Deter &&+              sampleLines[namePropDescriptor] !==+                controlLines[_RunInRootFrame$Deter];++            )+              _RunInRootFrame$Deter--;+          for (+            ;+            1 <= namePropDescriptor && 0 <= _RunInRootFrame$Deter;+            namePropDescriptor--, _RunInRootFrame$Deter--+          )+            if (+              sampleLines[namePropDescriptor] !==+              controlLines[_RunInRootFrame$Deter]+            ) {+              if (1 !== namePropDescriptor || 1 !== _RunInRootFrame$Deter) {+                do+                  if (+                    (namePropDescriptor--,+                    _RunInRootFrame$Deter--,+                    0 > _RunInRootFrame$Deter ||+                      sampleLines[namePropDescriptor] !==+                        controlLines[_RunInRootFrame$Deter])+                  ) {+                    var _frame =+                      "\n" ++                      sampleLines[namePropDescriptor].replace(+                        " at new ",+                        " at "+                      );+                    fn.displayName &&+                      _frame.includes("<anonymous>") &&+                      (_frame = _frame.replace("<anonymous>", fn.displayName));+                    "function" === typeof fn &&+                      componentFrameCache.set(fn, _frame);+                    return _frame;+                  }+                while (1 <= namePropDescriptor && 0 <= _RunInRootFrame$Deter);+              }+              break;+            }+        }+      } finally {+        (reentry = !1),+          (ReactSharedInternalsServer.H = previousDispatcher),+          reenableLogs(),+          (Error.prepareStackTrace = frame);+      }
… 362 more lines (truncated)
cjs/react.development.js +412 lines
--- +++ @@ -89,3 +89,3 @@       if ("function" === typeof type)-        return type.$$typeof === REACT_CLIENT_REFERENCE+        return type.$$typeof === REACT_CLIENT_REFERENCE$2           ? null@@ -96,2 +96,4 @@           return "Fragment";+        case REACT_PORTAL_TYPE:+          return "Portal";         case REACT_PROFILER_TYPE:@@ -104,4 +106,2 @@           return "SuspenseList";-        case REACT_ACTIVITY_TYPE:-          return "Activity";       }@@ -115,4 +115,2 @@         ) {-          case REACT_PORTAL_TYPE:-            return "Portal";           case REACT_CONTEXT_TYPE:@@ -144,16 +142,272 @@     }-    function getTaskName(type) {-      if (type === REACT_FRAGMENT_TYPE) return "<>";-      if (-        "object" === typeof type &&-        null !== type &&-        type.$$typeof === REACT_LAZY_TYPE-      )-        return "<...>";+    function isValidElementType(type) {+      return "string" === typeof type ||+        "function" === typeof type ||+        type === REACT_FRAGMENT_TYPE ||+        type === REACT_PROFILER_TYPE ||+        type === REACT_STRICT_MODE_TYPE ||+        type === REACT_SUSPENSE_TYPE ||+        type === REACT_SUSPENSE_LIST_TYPE ||+        type === REACT_OFFSCREEN_TYPE ||+        ("object" === typeof type &&+          null !== type &&+          (type.$$typeof === REACT_LAZY_TYPE ||+            type.$$typeof === REACT_MEMO_TYPE ||+            type.$$typeof === REACT_CONTEXT_TYPE ||+            type.$$typeof === REACT_CONSUMER_TYPE ||+            type.$$typeof === REACT_FORWARD_REF_TYPE ||+            type.$$typeof === REACT_CLIENT_REFERENCE$1 ||+            void 0 !== type.getModuleId))+        ? !0+        : !1;+    }+    function disabledLog() {}+    function disableLogs() {+      if (0 === disabledDepth) {+        prevLog = console.log;+        prevInfo = console.info;+        prevWarn = console.warn;+        prevError = console.error;+        prevGroup = console.group;+        prevGroupCollapsed = console.groupCollapsed;+        prevGroupEnd = console.groupEnd;+        var props = {+          configurable: !0,+          enumerable: !0,+          value: disabledLog,+          writable: !0+        };+        Object.defineProperties(console, {+          info: props,+          log: props,+          warn: props,+          error: props,+          group: props,+          groupCollapsed: props,+          groupEnd: props+        });+      }+      disabledDepth++;+    }+    function reenableLogs() {+      disabledDepth--;+      if (0 === disabledDepth) {+        var props = { configurable: !0, enumerable: !0, writable: !0 };+        Object.defineProperties(console, {+          log: assign({}, props, { value: prevLog }),+          info: assign({}, props, { value: prevInfo }),+          warn: assign({}, props, { value: prevWarn }),+          error: assign({}, props, { value: prevError }),+          group: assign({}, props, { value: prevGroup }),+          groupCollapsed: assign({}, props, { value: prevGroupCollapsed }),+          groupEnd: assign({}, props, { value: prevGroupEnd })+        });+      }+      0 > disabledDepth &&+        console.error(+          "disabledDepth fell below zero. This is a bug in React. Please file an issue."+        );+    }+    function describeBuiltInComponentFrame(name) {+      if (void 0 === prefix)+        try {+          throw Error();+        } catch (x) {+          var match = x.stack.trim().match(/\n( *(at )?)/);+          prefix = (match && match[1]) || "";+          suffix =+            -1 < x.stack.indexOf("\n    at")+              ? " (<anonymous>)"+              : -1 < x.stack.indexOf("@")+                ? "@unknown:0:0"+                : "";+        }+      return "\n" + prefix + name + suffix;+    }+    function describeNativeComponentFrame(fn, construct) {+      if (!fn || reentry) return "";+      var frame = componentFrameCache.get(fn);+      if (void 0 !== frame) return frame;+      reentry = !0;+      frame = Error.prepareStackTrace;+      Error.prepareStackTrace = void 0;+      var previousDispatcher = null;+      previousDispatcher = ReactSharedInternals.H;+      ReactSharedInternals.H = null;+      disableLogs();       try {-        var name = getComponentNameFromType(type);-        return name ? "<" + name + ">" : "<...>";-      } catch (x) {-        return "<...>";-      }+        var RunInRootFrame = {+          DetermineComponentFrameRoot: function () {+            try {+              if (construct) {+                var Fake = function () {+                  throw Error();+                };+                Object.defineProperty(Fake.prototype, "props", {+                  set: function () {+                    throw Error();+                  }+                });+                if ("object" === typeof Reflect && Reflect.construct) {+                  try {+                    Reflect.construct(Fake, []);+                  } catch (x) {+                    var control = x;+                  }+                  Reflect.construct(fn, [], Fake);+                } else {+                  try {+                    Fake.call();+                  } catch (x$0) {+                    control = x$0;+                  }+                  fn.call(Fake.prototype);+                }+              } else {+                try {+                  throw Error();+                } catch (x$1) {+                  control = x$1;+                }+                (Fake = fn()) &&+                  "function" === typeof Fake.catch &&+                  Fake.catch(function () {});+              }+            } catch (sample) {+              if (sample && control && "string" === typeof sample.stack)+                return [sample.stack, control.stack];+            }+            return [null, null];+          }+        };+        RunInRootFrame.DetermineComponentFrameRoot.displayName =+          "DetermineComponentFrameRoot";+        var namePropDescriptor = Object.getOwnPropertyDescriptor(+          RunInRootFrame.DetermineComponentFrameRoot,+          "name"+        );+        namePropDescriptor &&+          namePropDescriptor.configurable &&+          Object.defineProperty(+            RunInRootFrame.DetermineComponentFrameRoot,+            "name",+            { value: "DetermineComponentFrameRoot" }+          );+        var _RunInRootFrame$Deter =+            RunInRootFrame.DetermineComponentFrameRoot(),+          sampleStack = _RunInRootFrame$Deter[0],+          controlStack = _RunInRootFrame$Deter[1];+        if (sampleStack && controlStack) {+          var sampleLines = sampleStack.split("\n"),+            controlLines = controlStack.split("\n");+          for (+            _RunInRootFrame$Deter = namePropDescriptor = 0;+            namePropDescriptor < sampleLines.length &&+            !sampleLines[namePropDescriptor].includes(+              "DetermineComponentFrameRoot"+            );++          )+            namePropDescriptor++;+          for (+            ;+            _RunInRootFrame$Deter < controlLines.length &&+            !controlLines[_RunInRootFrame$Deter].includes(+              "DetermineComponentFrameRoot"+            );++          )+            _RunInRootFrame$Deter++;+          if (+            namePropDescriptor === sampleLines.length ||+            _RunInRootFrame$Deter === controlLines.length+          )+            for (+              namePropDescriptor = sampleLines.length - 1,+                _RunInRootFrame$Deter = controlLines.length - 1;+              1 <= namePropDescriptor &&+              0 <= _RunInRootFrame$Deter &&+              sampleLines[namePropDescriptor] !==+                controlLines[_RunInRootFrame$Deter];++            )+              _RunInRootFrame$Deter--;+          for (+            ;+            1 <= namePropDescriptor && 0 <= _RunInRootFrame$Deter;+            namePropDescriptor--, _RunInRootFrame$Deter--+          )+            if (+              sampleLines[namePropDescriptor] !==+              controlLines[_RunInRootFrame$Deter]+            ) {+              if (1 !== namePropDescriptor || 1 !== _RunInRootFrame$Deter) {+                do+                  if (+                    (namePropDescriptor--,+                    _RunInRootFrame$Deter--,+                    0 > _RunInRootFrame$Deter ||+                      sampleLines[namePropDescriptor] !==+                        controlLines[_RunInRootFrame$Deter])+                  ) {+                    var _frame =+                      "\n" ++                      sampleLines[namePropDescriptor].replace(
… 390 more lines (truncated)
cjs/react.production.js +6 lines
--- +++ @@ -74,3 +74,3 @@ var isArrayImpl = Array.isArray,-  ReactSharedInternals = { H: null, A: null, T: null, S: null, V: null },+  ReactSharedInternals = { H: null, A: null, T: null, S: null },   hasOwnProperty = Object.prototype.hasOwnProperty;@@ -359,7 +359,4 @@   ReactSharedInternals;-exports.__COMPILER_RUNTIME = {-  __proto__: null,-  c: function (size) {-    return ReactSharedInternals.H.useMemoCache(size);-  }+exports.act = function () {+  throw Error("act(...) is not supported in production builds of React."); };@@ -496,9 +493,4 @@ };-exports.useEffect = function (create, createDeps, update) {-  var dispatcher = ReactSharedInternals.H;-  if ("function" === typeof update)-    throw Error(-      "useEffect CRUD overload is not enabled in this build of React."-    );-  return dispatcher.useEffect(create, createDeps);+exports.useEffect = function (create, deps) {+  return ReactSharedInternals.H.useEffect(create, deps); };@@ -545,2 +537,2 @@ };-exports.version = "19.1.7";+exports.version = "19.0.6";
cjs/react.react-server.development.js +406 lines
--- +++ @@ -51,3 +51,3 @@       if ("function" === typeof type)-        return type.$$typeof === REACT_CLIENT_REFERENCE+        return type.$$typeof === REACT_CLIENT_REFERENCE$2           ? null@@ -58,2 +58,4 @@           return "Fragment";+        case REACT_PORTAL_TYPE:+          return "Portal";         case REACT_PROFILER_TYPE:@@ -66,4 +68,2 @@           return "SuspenseList";-        case REACT_ACTIVITY_TYPE:-          return "Activity";       }@@ -77,4 +77,2 @@         ) {-          case REACT_PORTAL_TYPE:-            return "Portal";           case REACT_CONTEXT_TYPE:@@ -106,16 +104,272 @@     }-    function getTaskName(type) {-      if (type === REACT_FRAGMENT_TYPE) return "<>";-      if (-        "object" === typeof type &&-        null !== type &&-        type.$$typeof === REACT_LAZY_TYPE-      )-        return "<...>";+    function isValidElementType(type) {+      return "string" === typeof type ||+        "function" === typeof type ||+        type === REACT_FRAGMENT_TYPE ||+        type === REACT_PROFILER_TYPE ||+        type === REACT_STRICT_MODE_TYPE ||+        type === REACT_SUSPENSE_TYPE ||+        type === REACT_SUSPENSE_LIST_TYPE ||+        type === REACT_OFFSCREEN_TYPE ||+        ("object" === typeof type &&+          null !== type &&+          (type.$$typeof === REACT_LAZY_TYPE ||+            type.$$typeof === REACT_MEMO_TYPE ||+            type.$$typeof === REACT_CONTEXT_TYPE ||+            type.$$typeof === REACT_CONSUMER_TYPE ||+            type.$$typeof === REACT_FORWARD_REF_TYPE ||+            type.$$typeof === REACT_CLIENT_REFERENCE$1 ||+            void 0 !== type.getModuleId))+        ? !0+        : !1;+    }+    function disabledLog() {}+    function disableLogs() {+      if (0 === disabledDepth) {+        prevLog = console.log;+        prevInfo = console.info;+        prevWarn = console.warn;+        prevError = console.error;+        prevGroup = console.group;+        prevGroupCollapsed = console.groupCollapsed;+        prevGroupEnd = console.groupEnd;+        var props = {+          configurable: !0,+          enumerable: !0,+          value: disabledLog,+          writable: !0+        };+        Object.defineProperties(console, {+          info: props,+          log: props,+          warn: props,+          error: props,+          group: props,+          groupCollapsed: props,+          groupEnd: props+        });+      }+      disabledDepth++;+    }+    function reenableLogs() {+      disabledDepth--;+      if (0 === disabledDepth) {+        var props = { configurable: !0, enumerable: !0, writable: !0 };+        Object.defineProperties(console, {+          log: assign({}, props, { value: prevLog }),+          info: assign({}, props, { value: prevInfo }),+          warn: assign({}, props, { value: prevWarn }),+          error: assign({}, props, { value: prevError }),+          group: assign({}, props, { value: prevGroup }),+          groupCollapsed: assign({}, props, { value: prevGroupCollapsed }),+          groupEnd: assign({}, props, { value: prevGroupEnd })+        });+      }+      0 > disabledDepth &&+        console.error(+          "disabledDepth fell below zero. This is a bug in React. Please file an issue."+        );+    }+    function describeBuiltInComponentFrame(name) {+      if (void 0 === prefix)+        try {+          throw Error();+        } catch (x) {+          var match = x.stack.trim().match(/\n( *(at )?)/);+          prefix = (match && match[1]) || "";+          suffix =+            -1 < x.stack.indexOf("\n    at")+              ? " (<anonymous>)"+              : -1 < x.stack.indexOf("@")+                ? "@unknown:0:0"+                : "";+        }+      return "\n" + prefix + name + suffix;+    }+    function describeNativeComponentFrame(fn, construct) {+      if (!fn || reentry) return "";+      var frame = componentFrameCache.get(fn);+      if (void 0 !== frame) return frame;+      reentry = !0;+      frame = Error.prepareStackTrace;+      Error.prepareStackTrace = void 0;+      var previousDispatcher = null;+      previousDispatcher = ReactSharedInternals.H;+      ReactSharedInternals.H = null;+      disableLogs();       try {-        var name = getComponentNameFromType(type);-        return name ? "<" + name + ">" : "<...>";-      } catch (x) {-        return "<...>";-      }+        var RunInRootFrame = {+          DetermineComponentFrameRoot: function () {+            try {+              if (construct) {+                var Fake = function () {+                  throw Error();+                };+                Object.defineProperty(Fake.prototype, "props", {+                  set: function () {+                    throw Error();+                  }+                });+                if ("object" === typeof Reflect && Reflect.construct) {+                  try {+                    Reflect.construct(Fake, []);+                  } catch (x) {+                    var control = x;+                  }+                  Reflect.construct(fn, [], Fake);+                } else {+                  try {+                    Fake.call();+                  } catch (x$0) {+                    control = x$0;+                  }+                  fn.call(Fake.prototype);+                }+              } else {+                try {+                  throw Error();+                } catch (x$1) {+                  control = x$1;+                }+                (Fake = fn()) &&+                  "function" === typeof Fake.catch &&+                  Fake.catch(function () {});+              }+            } catch (sample) {+              if (sample && control && "string" === typeof sample.stack)+                return [sample.stack, control.stack];+            }+            return [null, null];+          }+        };+        RunInRootFrame.DetermineComponentFrameRoot.displayName =+          "DetermineComponentFrameRoot";+        var namePropDescriptor = Object.getOwnPropertyDescriptor(+          RunInRootFrame.DetermineComponentFrameRoot,+          "name"+        );+        namePropDescriptor &&+          namePropDescriptor.configurable &&+          Object.defineProperty(+            RunInRootFrame.DetermineComponentFrameRoot,+            "name",+            { value: "DetermineComponentFrameRoot" }+          );+        var _RunInRootFrame$Deter =+            RunInRootFrame.DetermineComponentFrameRoot(),+          sampleStack = _RunInRootFrame$Deter[0],+          controlStack = _RunInRootFrame$Deter[1];+        if (sampleStack && controlStack) {+          var sampleLines = sampleStack.split("\n"),+            controlLines = controlStack.split("\n");+          for (+            _RunInRootFrame$Deter = namePropDescriptor = 0;+            namePropDescriptor < sampleLines.length &&+            !sampleLines[namePropDescriptor].includes(+              "DetermineComponentFrameRoot"+            );++          )+            namePropDescriptor++;+          for (+            ;+            _RunInRootFrame$Deter < controlLines.length &&+            !controlLines[_RunInRootFrame$Deter].includes(+              "DetermineComponentFrameRoot"+            );++          )+            _RunInRootFrame$Deter++;+          if (+            namePropDescriptor === sampleLines.length ||+            _RunInRootFrame$Deter === controlLines.length+          )+            for (+              namePropDescriptor = sampleLines.length - 1,+                _RunInRootFrame$Deter = controlLines.length - 1;+              1 <= namePropDescriptor &&+              0 <= _RunInRootFrame$Deter &&+              sampleLines[namePropDescriptor] !==+                controlLines[_RunInRootFrame$Deter];++            )+              _RunInRootFrame$Deter--;+          for (+            ;+            1 <= namePropDescriptor && 0 <= _RunInRootFrame$Deter;+            namePropDescriptor--, _RunInRootFrame$Deter--+          )+            if (+              sampleLines[namePropDescriptor] !==+              controlLines[_RunInRootFrame$Deter]+            ) {+              if (1 !== namePropDescriptor || 1 !== _RunInRootFrame$Deter) {+                do+                  if (+                    (namePropDescriptor--,+                    _RunInRootFrame$Deter--,+                    0 > _RunInRootFrame$Deter ||+                      sampleLines[namePropDescriptor] !==+                        controlLines[_RunInRootFrame$Deter])+                  ) {+                    var _frame =+                      "\n" ++                      sampleLines[namePropDescriptor].replace(
… 338 more lines (truncated)
cjs/react.react-server.production.js +1 lines
--- +++ @@ -342,5 +342,2 @@ };-exports.captureOwnerStack = function () {-  return null;-}; exports.cloneElement = function (element, config, children) {@@ -428,2 +425,2 @@ };-exports.version = "19.1.7";+exports.version = "19.0.6";
package.json +1 lines
--- +++ @@ -6,3 +6,3 @@   ],-  "version": "19.1.7",+  "version": "19.0.6",   "homepage": "https://react.dev/",
react-dom npm
19.2.6 25d ago nominal
critical-tier BURST ×9
latest 19.2.6 versions 2767 maintainers 2 critical-tier (snapshotted)
19.2.3
19.1.4
19.0.3
19.2.4
19.1.5
19.0.4
19.2.5
19.1.6
19.0.5
19.2.6
19.1.7
19.0.6
BURST
2 releases in 40m: 0.14.4, 0.14.5
info · registry-verified · 2015-12-29 · 10y ago
BURST
5 releases in 14m: 16.0.1, 16.1.2, 16.2.1, 16.3.3, 16.4.2
info · registry-verified · 2018-08-01 · 7y ago
BURST
3 releases in 25m: 0.14.10, 15.7.0, 16.14.0
info · registry-verified · 2020-10-14 · 5y ago
BURST
3 releases in 5m: 19.2.1, 19.1.2, 19.0.1
info · registry-verified · 2025-12-03 · 5mo ago
BURST
3 releases in 3m: 19.2.2, 19.1.3, 19.0.2
info · registry-verified · 2025-12-11 · 5mo ago
BURST
3 releases in 1m: 19.2.3, 19.1.4, 19.0.3
info · registry-verified · 2025-12-11 · 5mo ago
BURST
3 releases in 2m: 19.2.4, 19.1.5, 19.0.4
info · registry-verified · 2026-01-26 · 4mo ago
BURST
3 releases in 1m: 19.2.5, 19.1.6, 19.0.5
info · registry-verified · 2026-04-08 · 1mo ago
BURST
3 releases in 1m: 19.2.6, 19.1.7, 19.0.6 · ACTIVE
info · registry-verified · 2026-05-06 · 25d ago
release diff 19.1.7 → 19.0.6
+0 added · -0 removed · ~21 modified
cjs/react-dom-client.development.js +7700 lines
--- +++ @@ -75,3 +75,5 @@     }-    function warnForMissingKey() {}+    function createFiber(tag, pendingProps, key, mode) {+      return new FiberNode(tag, pendingProps, key, mode);+    }     function warnInvalidHookAccess() {@@ -87,2 +89,3 @@     function noop$2() {}+    function warnForMissingKey() {}     function setToSortedString(set) {@@ -94,9 +97,5 @@     }-    function createFiber(tag, pendingProps, key, mode) {-      return new FiberNode(tag, pendingProps, key, mode);-    }     function scheduleRoot(root, element) {       root.context === emptyContextObject &&-        (updateContainerImpl(root.current, 2, element, root, null, null),-        flushSyncWork$1());+        (updateContainerSync(element, root, null, null), flushSyncWork$1());     }@@ -106,3 +105,3 @@         update = update.updatedFamilies;-        flushPendingEffects();+        flushPassiveEffects();         scheduleFibersWithFamiliesRecursively(@@ -123,116 +122,2 @@       );-    }-    function getNearestMountedFiber(fiber) {-      var node = fiber,-        nearestMounted = fiber;-      if (fiber.alternate) for (; node.return; ) node = node.return;-      else {-        fiber = node;-        do-          (node = fiber),-            0 !== (node.flags & 4098) && (nearestMounted = node.return),-            (fiber = node.return);-        while (fiber);-      }-      return 3 === node.tag ? nearestMounted : null;-    }-    function getSuspenseInstanceFromFiber(fiber) {-      if (13 === fiber.tag) {-        var suspenseState = fiber.memoizedState;-        null === suspenseState &&-          ((fiber = fiber.alternate),-          null !== fiber && (suspenseState = fiber.memoizedState));-        if (null !== suspenseState) return suspenseState.dehydrated;-      }-      return null;-    }-    function assertIsMounted(fiber) {-      if (getNearestMountedFiber(fiber) !== fiber)-        throw Error("Unable to find node on an unmounted component.");-    }-    function findCurrentFiberUsingSlowPath(fiber) {-      var alternate = fiber.alternate;-      if (!alternate) {-        alternate = getNearestMountedFiber(fiber);-        if (null === alternate)-          throw Error("Unable to find node on an unmounted component.");-        return alternate !== fiber ? null : fiber;-      }-      for (var a = fiber, b = alternate; ; ) {-        var parentA = a.return;-        if (null === parentA) break;-        var parentB = parentA.alternate;-        if (null === parentB) {-          b = parentA.return;-          if (null !== b) {-            a = b;-            continue;-          }-          break;-        }-        if (parentA.child === parentB.child) {-          for (parentB = parentA.child; parentB; ) {-            if (parentB === a) return assertIsMounted(parentA), fiber;-            if (parentB === b) return assertIsMounted(parentA), alternate;-            parentB = parentB.sibling;-          }-          throw Error("Unable to find node on an unmounted component.");-        }-        if (a.return !== b.return) (a = parentA), (b = parentB);-        else {-          for (var didFindChild = !1, _child = parentA.child; _child; ) {-            if (_child === a) {-              didFindChild = !0;-              a = parentA;-              b = parentB;-              break;-            }-            if (_child === b) {-              didFindChild = !0;-              b = parentA;-              a = parentB;-              break;-            }-            _child = _child.sibling;-          }-          if (!didFindChild) {-            for (_child = parentB.child; _child; ) {-              if (_child === a) {-                didFindChild = !0;-                a = parentB;-                b = parentA;-                break;-              }-              if (_child === b) {-                didFindChild = !0;-                b = parentB;-                a = parentA;-                break;-              }-              _child = _child.sibling;-            }-            if (!didFindChild)-              throw Error(-                "Child was not found in either parent set. This indicates a bug in React related to the return pointer. Please file an issue."-              );-          }-        }-        if (a.alternate !== b)-          throw Error(-            "Return fibers should always be each others' alternates. This error is likely caused by a bug in React. Please file an issue."-          );-      }-      if (3 !== a.tag)-        throw Error("Unable to find node on an unmounted component.");-      return a.stateNode.current === a ? fiber : alternate;-    }-    function findCurrentHostFiberImpl(node) {-      var tag = node.tag;-      if (5 === tag || 26 === tag || 27 === tag || 6 === tag) return node;-      for (node = node.child; null !== node; ) {-        tag = findCurrentHostFiberImpl(node);-        if (null !== tag) return tag;-        node = node.sibling;-      }-      return null;     }@@ -256,2 +141,4 @@           return "Fragment";+        case REACT_PORTAL_TYPE:+          return "Portal";         case REACT_PROFILER_TYPE:@@ -264,4 +151,2 @@           return "SuspenseList";-        case REACT_ACTIVITY_TYPE:-          return "Activity";       }@@ -275,4 +160,2 @@         ) {-          case REACT_PORTAL_TYPE:-            return "Portal";           case REACT_CONTEXT_TYPE:@@ -314,4 +197,2 @@       switch (fiber.tag) {-        case 31:-          return "Activity";         case 24:@@ -376,777 +257,2 @@       return null;-    }-    function createCursor(defaultValue) {-      return { current: defaultValue };-    }-    function pop(cursor, fiber) {-      0 > index$jscomp$0-        ? console.error("Unexpected pop.")-        : (fiber !== fiberStack[index$jscomp$0] &&-            console.error("Unexpected Fiber popped."),-          (cursor.current = valueStack[index$jscomp$0]),-          (valueStack[index$jscomp$0] = null),-          (fiberStack[index$jscomp$0] = null),-          index$jscomp$0--);-    }-    function push(cursor, value, fiber) {-      index$jscomp$0++;-      valueStack[index$jscomp$0] = cursor.current;-      fiberStack[index$jscomp$0] = fiber;-      cursor.current = value;-    }-    function requiredContext(c) {-      null === c &&-        console.error(-          "Expected host context to exist. This error is likely caused by a bug in React. Please file an issue."-        );-      return c;-    }-    function pushHostContainer(fiber, nextRootInstance) {-      push(rootInstanceStackCursor, nextRootInstance, fiber);-      push(contextFiberStackCursor, fiber, fiber);-      push(contextStackCursor, null, fiber);-      var nextRootContext = nextRootInstance.nodeType;-      switch (nextRootContext) {-        case 9:-        case 11:-          nextRootContext = 9 === nextRootContext ? "#document" : "#fragment";-          nextRootInstance = (nextRootInstance =-            nextRootInstance.documentElement)-            ? (nextRootInstance = nextRootInstance.namespaceURI)-              ? getOwnHostContext(nextRootInstance)-              : HostContextNamespaceNone-            : HostContextNamespaceNone;-          break;-        default:-          if (-            ((nextRootContext = nextRootInstance.tagName),-            (nextRootInstance = nextRootInstance.namespaceURI))-          )-            (nextRootInstance = getOwnHostContext(nextRootInstance)),-              (nextRootInstance = getChildHostContextProd(-                nextRootInstance,-                nextRootContext-              ));-          else-            switch (nextRootContext) {-              case "svg":-                nextRootInstance = HostContextNamespaceSvg;-                break;-              case "math":-                nextRootInstance = HostContextNamespaceMath;-                break;-              default:-                nextRootInstance = HostContextNamespaceNone;-            }-      }-      nextRootContext = nextRootContext.toLowerCase();-      nextRootContext = updatedAncestorInfoDev(null, nextRootContext);-      nextRootContext = {-        context: nextRootInstance,-        ancestorInfo: nextRootContext-      };-      pop(contextStackCursor, fiber);-      push(contextStackCursor, nextRootContext, fiber);-    }-    function popHostContainer(fiber) {-      pop(contextStackCursor, fiber);-      pop(contextFiberStackCursor, fiber);-      pop(rootInstanceStackCursor, fiber);-    }-    function getHostContext() {-      return requiredContext(contextStackCursor.current);-    }
… 16555 more lines (truncated)
cjs/react-dom-client.production.js +5524 lines
--- +++ @@ -38,110 +38,3 @@ }-function getNearestMountedFiber(fiber) {-  var node = fiber,-    nearestMounted = fiber;-  if (fiber.alternate) for (; node.return; ) node = node.return;-  else {-    fiber = node;-    do-      (node = fiber),-        0 !== (node.flags & 4098) && (nearestMounted = node.return),-        (fiber = node.return);-    while (fiber);-  }-  return 3 === node.tag ? nearestMounted : null;-}-function getSuspenseInstanceFromFiber(fiber) {-  if (13 === fiber.tag) {-    var suspenseState = fiber.memoizedState;-    null === suspenseState &&-      ((fiber = fiber.alternate),-      null !== fiber && (suspenseState = fiber.memoizedState));-    if (null !== suspenseState) return suspenseState.dehydrated;-  }-  return null;-}-function assertIsMounted(fiber) {-  if (getNearestMountedFiber(fiber) !== fiber)-    throw Error(formatProdErrorMessage(188));-}-function findCurrentFiberUsingSlowPath(fiber) {-  var alternate = fiber.alternate;-  if (!alternate) {-    alternate = getNearestMountedFiber(fiber);-    if (null === alternate) throw Error(formatProdErrorMessage(188));-    return alternate !== fiber ? null : fiber;-  }-  for (var a = fiber, b = alternate; ; ) {-    var parentA = a.return;-    if (null === parentA) break;-    var parentB = parentA.alternate;-    if (null === parentB) {-      b = parentA.return;-      if (null !== b) {-        a = b;-        continue;-      }-      break;-    }-    if (parentA.child === parentB.child) {-      for (parentB = parentA.child; parentB; ) {-        if (parentB === a) return assertIsMounted(parentA), fiber;-        if (parentB === b) return assertIsMounted(parentA), alternate;-        parentB = parentB.sibling;-      }-      throw Error(formatProdErrorMessage(188));-    }-    if (a.return !== b.return) (a = parentA), (b = parentB);-    else {-      for (var didFindChild = !1, child$0 = parentA.child; child$0; ) {-        if (child$0 === a) {-          didFindChild = !0;-          a = parentA;-          b = parentB;-          break;-        }-        if (child$0 === b) {-          didFindChild = !0;-          b = parentA;-          a = parentB;-          break;-        }-        child$0 = child$0.sibling;-      }-      if (!didFindChild) {-        for (child$0 = parentB.child; child$0; ) {-          if (child$0 === a) {-            didFindChild = !0;-            a = parentB;-            b = parentA;-            break;-          }-          if (child$0 === b) {-            didFindChild = !0;-            b = parentB;-            a = parentA;-            break;-          }-          child$0 = child$0.sibling;-        }-        if (!didFindChild) throw Error(formatProdErrorMessage(189));-      }-    }-    if (a.alternate !== b) throw Error(formatProdErrorMessage(190));-  }-  if (3 !== a.tag) throw Error(formatProdErrorMessage(188));-  return a.stateNode.current === a ? fiber : alternate;-}-function findCurrentHostFiberImpl(node) {-  var tag = node.tag;-  if (5 === tag || 26 === tag || 27 === tag || 6 === tag) return node;-  for (node = node.child; null !== node; ) {-    tag = findCurrentHostFiberImpl(node);-    if (null !== tag) return tag;-    node = node.sibling;-  }-  return null;-}-var assign = Object.assign,-  REACT_LEGACY_ELEMENT_TYPE = Symbol.for("react.element"),+var REACT_LEGACY_ELEMENT_TYPE = Symbol.for("react.element"),   REACT_ELEMENT_TYPE = Symbol.for("react.transitional.element"),@@ -160,8 +53,8 @@ Symbol.for("react.scope");-var REACT_ACTIVITY_TYPE = Symbol.for("react.activity");+Symbol.for("react.debug_trace_mode");+var REACT_OFFSCREEN_TYPE = Symbol.for("react.offscreen"); Symbol.for("react.legacy_hidden"); Symbol.for("react.tracing_marker");-var REACT_MEMO_CACHE_SENTINEL = Symbol.for("react.memo_cache_sentinel");-Symbol.for("react.view_transition");-var MAYBE_ITERATOR_SYMBOL = Symbol.iterator;+var REACT_MEMO_CACHE_SENTINEL = Symbol.for("react.memo_cache_sentinel"),+  MAYBE_ITERATOR_SYMBOL = Symbol.iterator; function getIteratorFn(maybeIterable) {@@ -184,2 +77,4 @@       return "Fragment";+    case REACT_PORTAL_TYPE:+      return "Portal";     case REACT_PROFILER_TYPE:@@ -192,4 +87,2 @@       return "SuspenseList";-    case REACT_ACTIVITY_TYPE:-      return "Activity";   }@@ -197,4 +90,2 @@     switch (type.$$typeof) {-      case REACT_PORTAL_TYPE:-        return "Portal";       case REACT_CONTEXT_TYPE:@@ -226,568 +117,7 @@ }-var isArrayImpl = Array.isArray,-  ReactSharedInternals =+var ReactSharedInternals =     React.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,-  ReactDOMSharedInternals =-    ReactDOM.__DOM_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,-  sharedNotPendingObject = {-    pending: !1,-    data: null,-    method: null,-    action: null-  },-  valueStack = [],-  index = -1;-function createCursor(defaultValue) {-  return { current: defaultValue };-}-function pop(cursor) {-  0 > index ||-    ((cursor.current = valueStack[index]), (valueStack[index] = null), index--);-}-function push(cursor, value) {-  index++;-  valueStack[index] = cursor.current;-  cursor.current = value;-}-var contextStackCursor = createCursor(null),-  contextFiberStackCursor = createCursor(null),-  rootInstanceStackCursor = createCursor(null),-  hostTransitionProviderCursor = createCursor(null);-function pushHostContainer(fiber, nextRootInstance) {-  push(rootInstanceStackCursor, nextRootInstance);-  push(contextFiberStackCursor, fiber);-  push(contextStackCursor, null);-  switch (nextRootInstance.nodeType) {-    case 9:-    case 11:-      fiber = (fiber = nextRootInstance.documentElement)-        ? (fiber = fiber.namespaceURI)-          ? getOwnHostContext(fiber)-          : 0-        : 0;-      break;-    default:-      if (-        ((fiber = nextRootInstance.tagName),-        (nextRootInstance = nextRootInstance.namespaceURI))-      )-        (nextRootInstance = getOwnHostContext(nextRootInstance)),-          (fiber = getChildHostContextProd(nextRootInstance, fiber));-      else-        switch (fiber) {-          case "svg":-            fiber = 1;-            break;-          case "math":-            fiber = 2;-            break;-          default:-            fiber = 0;-        }-  }-  pop(contextStackCursor);-  push(contextStackCursor, fiber);-}-function popHostContainer() {-  pop(contextStackCursor);-  pop(contextFiberStackCursor);-  pop(rootInstanceStackCursor);-}-function pushHostContext(fiber) {-  null !== fiber.memoizedState && push(hostTransitionProviderCursor, fiber);-  var context = contextStackCursor.current;-  var JSCompiler_inline_result = getChildHostContextProd(context, fiber.type);-  context !== JSCompiler_inline_result &&-    (push(contextFiberStackCursor, fiber),-    push(contextStackCursor, JSCompiler_inline_result));-}-function popHostContext(fiber) {-  contextFiberStackCursor.current === fiber &&-    (pop(contextStackCursor), pop(contextFiberStackCursor));-  hostTransitionProviderCursor.current === fiber &&-    (pop(hostTransitionProviderCursor),-    (HostTransitionContext._currentValue = sharedNotPendingObject));-}-var hasOwnProperty = Object.prototype.hasOwnProperty,-  scheduleCallback$3 = Scheduler.unstable_scheduleCallback,-  cancelCallback$1 = Scheduler.unstable_cancelCallback,-  shouldYield = Scheduler.unstable_shouldYield,-  requestPaint = Scheduler.unstable_requestPaint,-  now = Scheduler.unstable_now,-  getCurrentPriorityLevel = Scheduler.unstable_getCurrentPriorityLevel,-  ImmediatePriority = Scheduler.unstable_ImmediatePriority,-  UserBlockingPriority = Scheduler.unstable_UserBlockingPriority,-  NormalPriority$1 = Scheduler.unstable_NormalPriority,-  LowPriority = Scheduler.unstable_LowPriority,-  IdlePriority = Scheduler.unstable_IdlePriority,-  log$1 = Scheduler.log,-  unstable_setDisableYieldValue = Scheduler.unstable_setDisableYieldValue,-  rendererID = null,-  injectedHook = null;-function setIsStrictModeForDevtools(newIsStrictMode) {-  "function" === typeof log$1 && unstable_setDisableYieldValue(newIsStrictMode);-  if (injectedHook && "function" === typeof injectedHook.setStrictMode)-    try {-      injectedHook.setStrictMode(rendererID, newIsStrictMode);
… 11729 more lines (truncated)
cjs/react-dom-profiling.development.js +7708 lines
--- +++ @@ -75,3 +75,5 @@     }-    function warnForMissingKey() {}+    function createFiber(tag, pendingProps, key, mode) {+      return new FiberNode(tag, pendingProps, key, mode);+    }     function warnInvalidHookAccess() {@@ -87,2 +89,3 @@     function noop$3() {}+    function warnForMissingKey() {}     function setToSortedString(set) {@@ -94,9 +97,5 @@     }-    function createFiber(tag, pendingProps, key, mode) {-      return new FiberNode(tag, pendingProps, key, mode);-    }     function scheduleRoot(root, element) {       root.context === emptyContextObject &&-        (updateContainerImpl(root.current, 2, element, root, null, null),-        flushSyncWork$1());+        (updateContainerSync(element, root, null, null), flushSyncWork$1());     }@@ -106,3 +105,3 @@         update = update.updatedFamilies;-        flushPendingEffects();+        flushPassiveEffects();         scheduleFibersWithFamiliesRecursively(@@ -123,116 +122,2 @@       );-    }-    function getNearestMountedFiber(fiber) {-      var node = fiber,-        nearestMounted = fiber;-      if (fiber.alternate) for (; node.return; ) node = node.return;-      else {-        fiber = node;-        do-          (node = fiber),-            0 !== (node.flags & 4098) && (nearestMounted = node.return),-            (fiber = node.return);-        while (fiber);-      }-      return 3 === node.tag ? nearestMounted : null;-    }-    function getSuspenseInstanceFromFiber(fiber) {-      if (13 === fiber.tag) {-        var suspenseState = fiber.memoizedState;-        null === suspenseState &&-          ((fiber = fiber.alternate),-          null !== fiber && (suspenseState = fiber.memoizedState));-        if (null !== suspenseState) return suspenseState.dehydrated;-      }-      return null;-    }-    function assertIsMounted(fiber) {-      if (getNearestMountedFiber(fiber) !== fiber)-        throw Error("Unable to find node on an unmounted component.");-    }-    function findCurrentFiberUsingSlowPath(fiber) {-      var alternate = fiber.alternate;-      if (!alternate) {-        alternate = getNearestMountedFiber(fiber);-        if (null === alternate)-          throw Error("Unable to find node on an unmounted component.");-        return alternate !== fiber ? null : fiber;-      }-      for (var a = fiber, b = alternate; ; ) {-        var parentA = a.return;-        if (null === parentA) break;-        var parentB = parentA.alternate;-        if (null === parentB) {-          b = parentA.return;-          if (null !== b) {-            a = b;-            continue;-          }-          break;-        }-        if (parentA.child === parentB.child) {-          for (parentB = parentA.child; parentB; ) {-            if (parentB === a) return assertIsMounted(parentA), fiber;-            if (parentB === b) return assertIsMounted(parentA), alternate;-            parentB = parentB.sibling;-          }-          throw Error("Unable to find node on an unmounted component.");-        }-        if (a.return !== b.return) (a = parentA), (b = parentB);-        else {-          for (var didFindChild = !1, _child = parentA.child; _child; ) {-            if (_child === a) {-              didFindChild = !0;-              a = parentA;-              b = parentB;-              break;-            }-            if (_child === b) {-              didFindChild = !0;-              b = parentA;-              a = parentB;-              break;-            }-            _child = _child.sibling;-          }-          if (!didFindChild) {-            for (_child = parentB.child; _child; ) {-              if (_child === a) {-                didFindChild = !0;-                a = parentB;-                b = parentA;-                break;-              }-              if (_child === b) {-                didFindChild = !0;-                b = parentB;-                a = parentA;-                break;-              }-              _child = _child.sibling;-            }-            if (!didFindChild)-              throw Error(-                "Child was not found in either parent set. This indicates a bug in React related to the return pointer. Please file an issue."-              );-          }-        }-        if (a.alternate !== b)-          throw Error(-            "Return fibers should always be each others' alternates. This error is likely caused by a bug in React. Please file an issue."-          );-      }-      if (3 !== a.tag)-        throw Error("Unable to find node on an unmounted component.");-      return a.stateNode.current === a ? fiber : alternate;-    }-    function findCurrentHostFiberImpl(node) {-      var tag = node.tag;-      if (5 === tag || 26 === tag || 27 === tag || 6 === tag) return node;-      for (node = node.child; null !== node; ) {-        tag = findCurrentHostFiberImpl(node);-        if (null !== tag) return tag;-        node = node.sibling;-      }-      return null;     }@@ -256,2 +141,4 @@           return "Fragment";+        case REACT_PORTAL_TYPE:+          return "Portal";         case REACT_PROFILER_TYPE:@@ -264,4 +151,2 @@           return "SuspenseList";-        case REACT_ACTIVITY_TYPE:-          return "Activity";       }@@ -275,4 +160,2 @@         ) {-          case REACT_PORTAL_TYPE:-            return "Portal";           case REACT_CONTEXT_TYPE:@@ -314,4 +197,2 @@       switch (fiber.tag) {-        case 31:-          return "Activity";         case 24:@@ -376,785 +257,2 @@       return null;-    }-    function resolveDispatcher() {-      var dispatcher = ReactSharedInternals.H;-      null === dispatcher &&-        console.error(-          "Invalid hook call. Hooks can only be called inside of the body of a function component. This could happen for one of the following reasons:\n1. You might have mismatching versions of React and the renderer (such as React DOM)\n2. You might be breaking the Rules of Hooks\n3. You might have more than one copy of React in the same app\nSee https://react.dev/link/invalid-hook-call for tips about how to debug and fix this problem."-        );-      return dispatcher;-    }-    function createCursor(defaultValue) {-      return { current: defaultValue };-    }-    function pop(cursor, fiber) {-      0 > index$jscomp$0-        ? console.error("Unexpected pop.")-        : (fiber !== fiberStack[index$jscomp$0] &&-            console.error("Unexpected Fiber popped."),-          (cursor.current = valueStack[index$jscomp$0]),-          (valueStack[index$jscomp$0] = null),-          (fiberStack[index$jscomp$0] = null),-          index$jscomp$0--);-    }-    function push(cursor, value, fiber) {-      index$jscomp$0++;-      valueStack[index$jscomp$0] = cursor.current;-      fiberStack[index$jscomp$0] = fiber;-      cursor.current = value;-    }-    function requiredContext(c) {-      null === c &&-        console.error(-          "Expected host context to exist. This error is likely caused by a bug in React. Please file an issue."-        );-      return c;-    }-    function pushHostContainer(fiber, nextRootInstance) {-      push(rootInstanceStackCursor, nextRootInstance, fiber);-      push(contextFiberStackCursor, fiber, fiber);-      push(contextStackCursor, null, fiber);-      var nextRootContext = nextRootInstance.nodeType;-      switch (nextRootContext) {-        case 9:-        case 11:-          nextRootContext = 9 === nextRootContext ? "#document" : "#fragment";-          nextRootInstance = (nextRootInstance =-            nextRootInstance.documentElement)-            ? (nextRootInstance = nextRootInstance.namespaceURI)-              ? getOwnHostContext(nextRootInstance)-              : HostContextNamespaceNone-            : HostContextNamespaceNone;-          break;-        default:-          if (-            ((nextRootContext = nextRootInstance.tagName),-            (nextRootInstance = nextRootInstance.namespaceURI))-          )-            (nextRootInstance = getOwnHostContext(nextRootInstance)),-              (nextRootInstance = getChildHostContextProd(-                nextRootInstance,-                nextRootContext-              ));-          else-            switch (nextRootContext) {-              case "svg":-                nextRootInstance = HostContextNamespaceSvg;-                break;-              case "math":-                nextRootInstance = HostContextNamespaceMath;-                break;-              default:-                nextRootInstance = HostContextNamespaceNone;-            }-      }-      nextRootContext = nextRootContext.toLowerCase();-      nextRootContext = updatedAncestorInfoDev(null, nextRootContext);-      nextRootContext = {-        context: nextRootInstance,-        ancestorInfo: nextRootContext-      };-      pop(contextStackCursor, fiber);-      push(contextStackCursor, nextRootContext, fiber);-    }
… 16571 more lines (truncated)
cjs/react-dom-profiling.profiling.js +5990 lines
--- +++ @@ -42,110 +42,3 @@ }-function getNearestMountedFiber(fiber) {-  var node = fiber,-    nearestMounted = fiber;-  if (fiber.alternate) for (; node.return; ) node = node.return;-  else {-    fiber = node;-    do-      (node = fiber),-        0 !== (node.flags & 4098) && (nearestMounted = node.return),-        (fiber = node.return);-    while (fiber);-  }-  return 3 === node.tag ? nearestMounted : null;-}-function getSuspenseInstanceFromFiber(fiber) {-  if (13 === fiber.tag) {-    var suspenseState = fiber.memoizedState;-    null === suspenseState &&-      ((fiber = fiber.alternate),-      null !== fiber && (suspenseState = fiber.memoizedState));-    if (null !== suspenseState) return suspenseState.dehydrated;-  }-  return null;-}-function assertIsMounted(fiber) {-  if (getNearestMountedFiber(fiber) !== fiber)-    throw Error(formatProdErrorMessage(188));-}-function findCurrentFiberUsingSlowPath(fiber) {-  var alternate = fiber.alternate;-  if (!alternate) {-    alternate = getNearestMountedFiber(fiber);-    if (null === alternate) throw Error(formatProdErrorMessage(188));-    return alternate !== fiber ? null : fiber;-  }-  for (var a = fiber, b = alternate; ; ) {-    var parentA = a.return;-    if (null === parentA) break;-    var parentB = parentA.alternate;-    if (null === parentB) {-      b = parentA.return;-      if (null !== b) {-        a = b;-        continue;-      }-      break;-    }-    if (parentA.child === parentB.child) {-      for (parentB = parentA.child; parentB; ) {-        if (parentB === a) return assertIsMounted(parentA), fiber;-        if (parentB === b) return assertIsMounted(parentA), alternate;-        parentB = parentB.sibling;-      }-      throw Error(formatProdErrorMessage(188));-    }-    if (a.return !== b.return) (a = parentA), (b = parentB);-    else {-      for (var didFindChild = !1, child$0 = parentA.child; child$0; ) {-        if (child$0 === a) {-          didFindChild = !0;-          a = parentA;-          b = parentB;-          break;-        }-        if (child$0 === b) {-          didFindChild = !0;-          b = parentA;-          a = parentB;-          break;-        }-        child$0 = child$0.sibling;-      }-      if (!didFindChild) {-        for (child$0 = parentB.child; child$0; ) {-          if (child$0 === a) {-            didFindChild = !0;-            a = parentB;-            b = parentA;-            break;-          }-          if (child$0 === b) {-            didFindChild = !0;-            b = parentB;-            a = parentA;-            break;-          }-          child$0 = child$0.sibling;-        }-        if (!didFindChild) throw Error(formatProdErrorMessage(189));-      }-    }-    if (a.alternate !== b) throw Error(formatProdErrorMessage(190));-  }-  if (3 !== a.tag) throw Error(formatProdErrorMessage(188));-  return a.stateNode.current === a ? fiber : alternate;-}-function findCurrentHostFiberImpl(node) {-  var tag = node.tag;-  if (5 === tag || 26 === tag || 27 === tag || 6 === tag) return node;-  for (node = node.child; null !== node; ) {-    tag = findCurrentHostFiberImpl(node);-    if (null !== tag) return tag;-    node = node.sibling;-  }-  return null;-}-var assign = Object.assign,-  REACT_LEGACY_ELEMENT_TYPE = Symbol.for("react.element"),+var REACT_LEGACY_ELEMENT_TYPE = Symbol.for("react.element"),   REACT_ELEMENT_TYPE = Symbol.for("react.transitional.element"),@@ -164,8 +57,8 @@ Symbol.for("react.scope");-var REACT_ACTIVITY_TYPE = Symbol.for("react.activity");+Symbol.for("react.debug_trace_mode");+var REACT_OFFSCREEN_TYPE = Symbol.for("react.offscreen"); Symbol.for("react.legacy_hidden"); Symbol.for("react.tracing_marker");-var REACT_MEMO_CACHE_SENTINEL = Symbol.for("react.memo_cache_sentinel");-Symbol.for("react.view_transition");-var MAYBE_ITERATOR_SYMBOL = Symbol.iterator;+var REACT_MEMO_CACHE_SENTINEL = Symbol.for("react.memo_cache_sentinel"),+  MAYBE_ITERATOR_SYMBOL = Symbol.iterator; function getIteratorFn(maybeIterable) {@@ -188,2 +81,4 @@       return "Fragment";+    case REACT_PORTAL_TYPE:+      return "Portal";     case REACT_PROFILER_TYPE:@@ -196,4 +91,2 @@       return "SuspenseList";-    case REACT_ACTIVITY_TYPE:-      return "Activity";   }@@ -201,4 +94,2 @@     switch (type.$$typeof) {-      case REACT_PORTAL_TYPE:-        return "Portal";       case REACT_CONTEXT_TYPE:@@ -230,646 +121,7 @@ }-var isArrayImpl = Array.isArray,-  ReactSharedInternals =+var ReactSharedInternals =     React.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,-  ReactDOMSharedInternals =-    ReactDOM.__DOM_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,-  sharedNotPendingObject = {-    pending: !1,-    data: null,-    method: null,-    action: null-  },-  valueStack = [],-  index = -1;-function createCursor(defaultValue) {-  return { current: defaultValue };-}-function pop(cursor) {-  0 > index ||-    ((cursor.current = valueStack[index]), (valueStack[index] = null), index--);-}-function push(cursor, value) {-  index++;-  valueStack[index] = cursor.current;-  cursor.current = value;-}-var contextStackCursor = createCursor(null),-  contextFiberStackCursor = createCursor(null),-  rootInstanceStackCursor = createCursor(null),-  hostTransitionProviderCursor = createCursor(null);-function pushHostContainer(fiber, nextRootInstance) {-  push(rootInstanceStackCursor, nextRootInstance);-  push(contextFiberStackCursor, fiber);-  push(contextStackCursor, null);-  switch (nextRootInstance.nodeType) {-    case 9:-    case 11:-      fiber = (fiber = nextRootInstance.documentElement)-        ? (fiber = fiber.namespaceURI)-          ? getOwnHostContext(fiber)-          : 0-        : 0;-      break;-    default:-      if (-        ((fiber = nextRootInstance.tagName),-        (nextRootInstance = nextRootInstance.namespaceURI))-      )-        (nextRootInstance = getOwnHostContext(nextRootInstance)),-          (fiber = getChildHostContextProd(nextRootInstance, fiber));-      else-        switch (fiber) {-          case "svg":-            fiber = 1;-            break;-          case "math":-            fiber = 2;-            break;-          default:-            fiber = 0;-        }-  }-  pop(contextStackCursor);-  push(contextStackCursor, fiber);-}-function popHostContainer() {-  pop(contextStackCursor);-  pop(contextFiberStackCursor);-  pop(rootInstanceStackCursor);-}-function pushHostContext(fiber) {-  null !== fiber.memoizedState && push(hostTransitionProviderCursor, fiber);-  var context = contextStackCursor.current;-  var JSCompiler_inline_result = getChildHostContextProd(context, fiber.type);-  context !== JSCompiler_inline_result &&-    (push(contextFiberStackCursor, fiber),-    push(contextStackCursor, JSCompiler_inline_result));-}-function popHostContext(fiber) {-  contextFiberStackCursor.current === fiber &&-    (pop(contextStackCursor), pop(contextFiberStackCursor));-  hostTransitionProviderCursor.current === fiber &&-    (pop(hostTransitionProviderCursor),-    (HostTransitionContext._currentValue = sharedNotPendingObject));-}-var hasOwnProperty = Object.prototype.hasOwnProperty,-  scheduleCallback$3 = Scheduler.unstable_scheduleCallback,-  cancelCallback$1 = Scheduler.unstable_cancelCallback,-  shouldYield = Scheduler.unstable_shouldYield,-  requestPaint = Scheduler.unstable_requestPaint,-  now$1 = Scheduler.unstable_now,-  getCurrentPriorityLevel = Scheduler.unstable_getCurrentPriorityLevel,-  ImmediatePriority = Scheduler.unstable_ImmediatePriority,-  UserBlockingPriority = Scheduler.unstable_UserBlockingPriority,-  NormalPriority$1 = Scheduler.unstable_NormalPriority,-  LowPriority = Scheduler.unstable_LowPriority,-  IdlePriority = Scheduler.unstable_IdlePriority,-  log$1 = Scheduler.log,-  unstable_setDisableYieldValue = Scheduler.unstable_setDisableYieldValue,-  rendererID = null,-  injectedHook = null,-  injectedProfilingHooks = null,-  isDevToolsPresent = "undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__;-function setIsStrictModeForDevtools(newIsStrictMode) {-  "function" === typeof log$1 && unstable_setDisableYieldValue(newIsStrictMode);-  if (injectedHook && "function" === typeof injectedHook.setStrictMode)
… 12683 more lines (truncated)
cjs/react-dom-server-legacy.browser.development.js +521 lines
--- +++ @@ -760,10 +760,2 @@     }-    function createPreambleState() {-      return {-        htmlChunks: null,-        headChunks: null,-        bodyChunks: null,-        contribution: NoContribution-      };-    }     function createFormatContext(insertionMode, selectedValue, tagScope) {@@ -827,22 +819,12 @@           );-        case "head":-          if (parentContext.insertionMode < HTML_MODE)-            return createFormatContext(-              HTML_HEAD_MODE,-              null,-              parentContext.tagScope-            );-          break;-        case "html":-          if (parentContext.insertionMode === ROOT_HTML_MODE)-            return createFormatContext(-              HTML_HTML_MODE,-              null,-              parentContext.tagScope-            );       }-      return parentContext.insertionMode >= HTML_TABLE_MODE ||-        parentContext.insertionMode < HTML_MODE+      return parentContext.insertionMode >= HTML_TABLE_MODE         ? createFormatContext(HTML_MODE, null, parentContext.tagScope)-        : parentContext;+        : parentContext.insertionMode === ROOT_HTML_MODE+          ? "html" === type+            ? createFormatContext(HTML_HTML_MODE, null, parentContext.tagScope)+            : createFormatContext(HTML_MODE, null, parentContext.tagScope)+          : parentContext.insertionMode === HTML_HTML_MODE+            ? createFormatContext(HTML_MODE, null, parentContext.tagScope)+            : parentContext;     }@@ -1474,25 +1456,2 @@     }-    function pushStartSingletonElement(target, props, tag) {-      target.push(startChunkForTag(tag));-      var innerHTML = (tag = null),-        propKey;-      for (propKey in props)-        if (hasOwnProperty.call(props, propKey)) {-          var propValue = props[propKey];-          if (null != propValue)-            switch (propKey) {-              case "children":-                tag = propValue;-                break;-              case "dangerouslySetInnerHTML":-                innerHTML = propValue;-                break;-              default:-                pushAttribute(target, propKey, propValue);-            }-        }-      target.push(endOfStartTag);-      pushInnerHTML(target, innerHTML, tag);-      return tag;-    }     function pushStartGenericElement(target, props, tag) {@@ -1537,3 +1496,2 @@       renderState,-      preambleState,       hoistableState,@@ -2173,3 +2131,3 @@               ? console.error(-                  "React expects the `children` prop of <title> tags to be a string, number, bigint, or object with a novel `toString` method but found an Array with length %s instead. Browsers treat all child Nodes of <title> tags as Text content and React expects to be able to convert `children` of <title> tags to a single string value which is why Arrays of length greater than 1 are not supported. When using JSX it can be common to combine text nodes and value nodes. For example: <title>hello {nameOfUser}</title>. While not immediately apparent, `children` in this case is an Array with length 2. If your `children` prop is using this form try rewriting it using a template string: <title>{`hello ${nameOfUser}`}</title>.",+                  "React expects the `children` prop of <title> tags to be a string, number, bigint, or object with a novel `toString` method but found an Array with length %s instead. Browsers treat all child Nodes of <title> tags as Text content and React expects to be able to convert `children` of <title> tags to a single string value which is why Arrays of length greater than 1 are not supported. When using JSX it can be commong to combine text nodes and value nodes. For example: <title>hello {nameOfUser}</title>. While not immediately apparent, `children` in this case is an Array with length 2. If your `children` prop is using this form try rewriting it using a template string: <title>{`hello ${nameOfUser}`}</title>.",                   children$jscomp$6.length@@ -2632,3 +2590,2 @@               0 < headers.remainingCapacity &&-              "string" !== typeof props.srcSet &&               ("high" === props.fetchPriority ||@@ -2693,9 +2650,9 @@         case "head":-          if (formatContext.insertionMode < HTML_MODE) {-            var preamble = preambleState || renderState.preamble;-            if (preamble.headChunks)-              throw Error("The `<head>` tag may only be rendered once.");-            preamble.headChunks = [];-            var JSCompiler_inline_result$jscomp$9 = pushStartSingletonElement(-              preamble.headChunks,+          if (+            formatContext.insertionMode < HTML_MODE &&+            null === renderState.headChunks+          ) {+            renderState.headChunks = [];+            var JSCompiler_inline_result$jscomp$9 = pushStartGenericElement(+              renderState.headChunks,               props,@@ -2710,12 +2667,12 @@           return JSCompiler_inline_result$jscomp$9;-        case "body":-          if (formatContext.insertionMode < HTML_MODE) {-            var preamble$jscomp$0 = preambleState || renderState.preamble;-            if (preamble$jscomp$0.bodyChunks)-              throw Error("The `<body>` tag may only be rendered once.");-            preamble$jscomp$0.bodyChunks = [];-            var JSCompiler_inline_result$jscomp$10 = pushStartSingletonElement(-              preamble$jscomp$0.bodyChunks,+        case "html":+          if (+            formatContext.insertionMode === ROOT_HTML_MODE &&+            null === renderState.htmlChunks+          ) {+            renderState.htmlChunks = [doctypeChunk];+            var JSCompiler_inline_result$jscomp$10 = pushStartGenericElement(+              renderState.htmlChunks,               props,-              "body"+              "html"             );@@ -2725,23 +2682,5 @@               props,-              "body"+              "html"             );           return JSCompiler_inline_result$jscomp$10;-        case "html":-          if (formatContext.insertionMode === ROOT_HTML_MODE) {-            var preamble$jscomp$1 = preambleState || renderState.preamble;-            if (preamble$jscomp$1.htmlChunks)-              throw Error("The `<html>` tag may only be rendered once.");-            preamble$jscomp$1.htmlChunks = [doctypeChunk];-            var JSCompiler_inline_result$jscomp$11 = pushStartSingletonElement(-              preamble$jscomp$1.htmlChunks,-              props,-              "html"-            );-          } else-            JSCompiler_inline_result$jscomp$11 = pushStartGenericElement(-              target$jscomp$0,-              props,-              "html"-            );-          return JSCompiler_inline_result$jscomp$11;         default:@@ -2812,17 +2751,2 @@     }-    function hoistPreambleState(renderState, preambleState) {-      renderState = renderState.preamble;-      null === renderState.htmlChunks &&-        preambleState.htmlChunks &&-        ((renderState.htmlChunks = preambleState.htmlChunks),-        (preambleState.contribution |= 1));-      null === renderState.headChunks &&-        preambleState.headChunks &&-        ((renderState.headChunks = preambleState.headChunks),-        (preambleState.contribution |= 4));-      null === renderState.bodyChunks &&-        preambleState.bodyChunks &&-        ((renderState.bodyChunks = preambleState.bodyChunks),-        (preambleState.contribution |= 2));-    }     function writeBootstrap(destination, renderState) {@@ -2846,9 +2770,2 @@     }-    function writePreambleContribution(destination, preambleState) {-      preambleState = preambleState.contribution;-      preambleState !== NoContribution &&-        (destination.push(boundaryPreambleContributionChunkStart),-        destination.push("" + preambleState),-        destination.push(boundaryPreambleContributionChunkEnd));-    }     function writeStartSegment(destination, renderState, formatContext, id) {@@ -2857,3 +2774,2 @@         case HTML_HTML_MODE:-        case HTML_HEAD_MODE:         case HTML_MODE:@@ -2922,3 +2838,2 @@         case HTML_HTML_MODE:-        case HTML_HEAD_MODE:         case HTML_MODE:@@ -3316,3 +3231,4 @@         startInlineScript: "<script>",-        preamble: createPreambleState(),+        htmlChunks: null,+        headChunks: null,         externalRuntimeScript: null,@@ -3446,3 +3362,4 @@         startInlineScript: idPrefix.startInlineScript,-        preamble: idPrefix.preamble,+        htmlChunks: idPrefix.htmlChunks,+        headChunks: idPrefix.headChunks,         externalRuntimeScript: idPrefix.externalRuntimeScript,@@ -3497,2 +3414,4 @@           return "Fragment";+        case REACT_PORTAL_TYPE:+          return "Portal";         case REACT_PROFILER_TYPE:@@ -3505,4 +3424,2 @@           return "SuspenseList";-        case REACT_ACTIVITY_TYPE:-          return "Activity";       }@@ -3516,4 +3433,2 @@         ) {-          case REACT_PORTAL_TYPE:-            return "Portal";           case REACT_CONTEXT_TYPE:@@ -4188,23 +4103,2 @@     }-    function formatOwnerStack(error) {-      var prevPrepareStackTrace = Error.prepareStackTrace;-      Error.prepareStackTrace = void 0;-      error = error.stack;-      Error.prepareStackTrace = prevPrepareStackTrace;-      error.startsWith("Error: react-stack-top-frame\n") &&-        (error = error.slice(29));-      prevPrepareStackTrace = error.indexOf("\n");-      -1 !== prevPrepareStackTrace &&-        (error = error.slice(prevPrepareStackTrace + 1));-      prevPrepareStackTrace = error.indexOf("react_stack_bottom_frame");-      -1 !== prevPrepareStackTrace &&-        (prevPrepareStackTrace = error.lastIndexOf(-          "\n",-          prevPrepareStackTrace-        ));-      if (-1 !== prevPrepareStackTrace)-        error = error.slice(0, prevPrepareStackTrace);-      else return "";-      return error;-    }     function describeComponentStackByType(type) {@@ -4213,3 +4107,3 @@         return type.prototype && type.prototype.isReactComponent-          ? describeNativeComponentFrame(type, !0)+          ? ((type = describeNativeComponentFrame(type, !0)), type)           : describeNativeComponentFrame(type, !1);@@ -4248,2 +4142,14 @@     }+    function getStackByComponentStackNode(componentStack) {+      try {+        var info = "";+        do+          (info += describeComponentStackByType(componentStack.type)),+            (componentStack = componentStack.parent);+        while (componentStack);+        return info;+      } catch (x) {
… 1719 more lines (truncated)
cjs/react-dom-server-legacy.browser.production.js +256 lines
--- +++ @@ -66,6 +66,6 @@   REACT_SCOPE_TYPE = Symbol.for("react.scope"),-  REACT_ACTIVITY_TYPE = Symbol.for("react.activity"),+  REACT_DEBUG_TRACING_MODE_TYPE = Symbol.for("react.debug_trace_mode"),+  REACT_OFFSCREEN_TYPE = Symbol.for("react.offscreen"),   REACT_LEGACY_HIDDEN_TYPE = Symbol.for("react.legacy_hidden"),   REACT_MEMO_CACHE_SENTINEL = Symbol.for("react.memo_cache_sentinel"),-  REACT_VIEW_TRANSITION_TYPE = Symbol.for("react.view_transition"),   MAYBE_ITERATOR_SYMBOL = Symbol.iterator,@@ -331,10 +331,2 @@ }-function createPreambleState() {-  return {-    htmlChunks: null,-    headChunks: null,-    bodyChunks: null,-    contribution: 0-  };-} function createFormatContext(insertionMode, selectedValue, tagScope) {@@ -357,3 +349,3 @@     case "svg":-      return createFormatContext(4, null, parentContext.tagScope);+      return createFormatContext(3, null, parentContext.tagScope);     case "picture":@@ -361,3 +353,3 @@     case "math":-      return createFormatContext(5, null, parentContext.tagScope);+      return createFormatContext(4, null, parentContext.tagScope);     case "foreignObject":@@ -365,3 +357,3 @@     case "table":-      return createFormatContext(6, null, parentContext.tagScope);+      return createFormatContext(5, null, parentContext.tagScope);     case "thead":@@ -369,18 +361,17 @@     case "tfoot":+      return createFormatContext(6, null, parentContext.tagScope);+    case "colgroup":+      return createFormatContext(8, null, parentContext.tagScope);+    case "tr":       return createFormatContext(7, null, parentContext.tagScope);-    case "colgroup":-      return createFormatContext(9, null, parentContext.tagScope);-    case "tr":-      return createFormatContext(8, null, parentContext.tagScope);-    case "head":-      if (2 > parentContext.insertionMode)-        return createFormatContext(3, null, parentContext.tagScope);-      break;-    case "html":-      if (0 === parentContext.insertionMode)-        return createFormatContext(1, null, parentContext.tagScope);   }-  return 6 <= parentContext.insertionMode || 2 > parentContext.insertionMode+  return 5 <= parentContext.insertionMode     ? createFormatContext(2, null, parentContext.tagScope)-    : parentContext;+    : 0 === parentContext.insertionMode+      ? "html" === type+        ? createFormatContext(1, null, parentContext.tagScope)+        : createFormatContext(2, null, parentContext.tagScope)+      : 1 === parentContext.insertionMode+        ? createFormatContext(2, null, parentContext.tagScope)+        : parentContext; }@@ -792,25 +783,2 @@ }-function pushStartSingletonElement(target, props, tag) {-  target.push(startChunkForTag(tag));-  var innerHTML = (tag = null),-    propKey;-  for (propKey in props)-    if (hasOwnProperty.call(props, propKey)) {-      var propValue = props[propKey];-      if (null != propValue)-        switch (propKey) {-          case "children":-            tag = propValue;-            break;-          case "dangerouslySetInnerHTML":-            innerHTML = propValue;-            break;-          default:-            pushAttribute(target, propKey, propValue);-        }-    }-  target.push(">");-  pushInnerHTML(target, innerHTML, tag);-  return tag;-} function pushStartGenericElement(target, props, tag) {@@ -858,3 +826,2 @@   renderState,-  preambleState,   hoistableState,@@ -1329,3 +1296,3 @@       if (-        4 === formatContext.insertionMode ||+        3 === formatContext.insertionMode ||         formatContext.tagScope & 1 ||@@ -1348,3 +1315,3 @@       if (-        4 === formatContext.insertionMode ||+        3 === formatContext.insertionMode ||         formatContext.tagScope & 1 ||@@ -1430,3 +1397,3 @@         props.onError ||-        4 === formatContext.insertionMode ||+        3 === formatContext.insertionMode ||         formatContext.tagScope & 1 ||@@ -1471,3 +1438,3 @@       if (-        4 === formatContext.insertionMode ||+        3 === formatContext.insertionMode ||         formatContext.tagScope & 1 ||@@ -1574,3 +1541,3 @@       if (-        4 === formatContext.insertionMode ||+        3 === formatContext.insertionMode ||         formatContext.tagScope & 1 ||@@ -1688,3 +1655,2 @@           0 < headers.remainingCapacity &&-          "string" !== typeof props.srcSet &&           ("high" === props.fetchPriority ||@@ -1748,9 +1714,6 @@     case "head":-      if (2 > formatContext.insertionMode) {-        var preamble = preambleState || renderState.preamble;-        if (preamble.headChunks)-          throw Error(formatProdErrorMessage(545, "`<head>`"));-        preamble.headChunks = [];-        var JSCompiler_inline_result$jscomp$9 = pushStartSingletonElement(-          preamble.headChunks,+      if (2 > formatContext.insertionMode && null === renderState.headChunks) {+        renderState.headChunks = [];+        var JSCompiler_inline_result$jscomp$9 = pushStartGenericElement(+          renderState.headChunks,           props,@@ -1765,12 +1728,12 @@       return JSCompiler_inline_result$jscomp$9;-    case "body":-      if (2 > formatContext.insertionMode) {-        var preamble$jscomp$0 = preambleState || renderState.preamble;-        if (preamble$jscomp$0.bodyChunks)-          throw Error(formatProdErrorMessage(545, "`<body>`"));-        preamble$jscomp$0.bodyChunks = [];-        var JSCompiler_inline_result$jscomp$10 = pushStartSingletonElement(-          preamble$jscomp$0.bodyChunks,+    case "html":+      if (+        0 === formatContext.insertionMode &&+        null === renderState.htmlChunks+      ) {+        renderState.htmlChunks = [""];+        var JSCompiler_inline_result$jscomp$10 = pushStartGenericElement(+          renderState.htmlChunks,           props,-          "body"+          "html"         );@@ -1780,23 +1743,5 @@           props,-          "body"+          "html"         );       return JSCompiler_inline_result$jscomp$10;-    case "html":-      if (0 === formatContext.insertionMode) {-        var preamble$jscomp$1 = preambleState || renderState.preamble;-        if (preamble$jscomp$1.htmlChunks)-          throw Error(formatProdErrorMessage(545, "`<html>`"));-        preamble$jscomp$1.htmlChunks = [""];-        var JSCompiler_inline_result$jscomp$11 = pushStartSingletonElement(-          preamble$jscomp$1.htmlChunks,-          props,-          "html"-        );-      } else-        JSCompiler_inline_result$jscomp$11 = pushStartGenericElement(-          target$jscomp$0,-          props,-          "html"-        );-      return JSCompiler_inline_result$jscomp$11;     default:@@ -1861,17 +1806,2 @@ }-function hoistPreambleState(renderState, preambleState) {-  renderState = renderState.preamble;-  null === renderState.htmlChunks &&-    preambleState.htmlChunks &&-    ((renderState.htmlChunks = preambleState.htmlChunks),-    (preambleState.contribution |= 1));-  null === renderState.headChunks &&-    preambleState.headChunks &&-    ((renderState.headChunks = preambleState.headChunks),-    (preambleState.contribution |= 4));-  null === renderState.bodyChunks &&-    preambleState.bodyChunks &&-    ((renderState.bodyChunks = preambleState.bodyChunks),-    (preambleState.contribution |= 2));-} function writeBootstrap(destination, renderState) {@@ -1892,9 +1822,2 @@ }-function writePreambleContribution(destination, preambleState) {-  preambleState = preambleState.contribution;-  0 !== preambleState &&-    (destination.push("\x3c!--"),-    destination.push("" + preambleState),-    destination.push("--\x3e"));-} function writeStartSegment(destination, renderState, formatContext, id) {@@ -1903,3 +1826,2 @@     case 1:-    case 3:     case 2:@@ -1912,3 +1834,3 @@       );-    case 4:+    case 3:       return (@@ -1920,3 +1842,3 @@       );-    case 5:+    case 4:       return (@@ -1928,3 +1850,3 @@       );-    case 6:+    case 5:       return (@@ -1936,3 +1858,3 @@       );-    case 7:+    case 6:       return (@@ -1944,3 +1866,3 @@       );-    case 8:+    case 7:       return (@@ -1952,3 +1874,3 @@       );-    case 9:+    case 8:       return (
… 825 more lines (truncated)
cjs/react-dom-server-legacy.node.development.js +521 lines
--- +++ @@ -760,10 +760,2 @@     }-    function createPreambleState() {-      return {-        htmlChunks: null,-        headChunks: null,-        bodyChunks: null,-        contribution: NoContribution-      };-    }     function createFormatContext(insertionMode, selectedValue, tagScope) {@@ -827,22 +819,12 @@           );-        case "head":-          if (parentContext.insertionMode < HTML_MODE)-            return createFormatContext(-              HTML_HEAD_MODE,-              null,-              parentContext.tagScope-            );-          break;-        case "html":-          if (parentContext.insertionMode === ROOT_HTML_MODE)-            return createFormatContext(-              HTML_HTML_MODE,-              null,-              parentContext.tagScope-            );       }-      return parentContext.insertionMode >= HTML_TABLE_MODE ||-        parentContext.insertionMode < HTML_MODE+      return parentContext.insertionMode >= HTML_TABLE_MODE         ? createFormatContext(HTML_MODE, null, parentContext.tagScope)-        : parentContext;+        : parentContext.insertionMode === ROOT_HTML_MODE+          ? "html" === type+            ? createFormatContext(HTML_HTML_MODE, null, parentContext.tagScope)+            : createFormatContext(HTML_MODE, null, parentContext.tagScope)+          : parentContext.insertionMode === HTML_HTML_MODE+            ? createFormatContext(HTML_MODE, null, parentContext.tagScope)+            : parentContext;     }@@ -1474,25 +1456,2 @@     }-    function pushStartSingletonElement(target, props, tag) {-      target.push(startChunkForTag(tag));-      var innerHTML = (tag = null),-        propKey;-      for (propKey in props)-        if (hasOwnProperty.call(props, propKey)) {-          var propValue = props[propKey];-          if (null != propValue)-            switch (propKey) {-              case "children":-                tag = propValue;-                break;-              case "dangerouslySetInnerHTML":-                innerHTML = propValue;-                break;-              default:-                pushAttribute(target, propKey, propValue);-            }-        }-      target.push(endOfStartTag);-      pushInnerHTML(target, innerHTML, tag);-      return tag;-    }     function pushStartGenericElement(target, props, tag) {@@ -1537,3 +1496,2 @@       renderState,-      preambleState,       hoistableState,@@ -2173,3 +2131,3 @@               ? console.error(-                  "React expects the `children` prop of <title> tags to be a string, number, bigint, or object with a novel `toString` method but found an Array with length %s instead. Browsers treat all child Nodes of <title> tags as Text content and React expects to be able to convert `children` of <title> tags to a single string value which is why Arrays of length greater than 1 are not supported. When using JSX it can be common to combine text nodes and value nodes. For example: <title>hello {nameOfUser}</title>. While not immediately apparent, `children` in this case is an Array with length 2. If your `children` prop is using this form try rewriting it using a template string: <title>{`hello ${nameOfUser}`}</title>.",+                  "React expects the `children` prop of <title> tags to be a string, number, bigint, or object with a novel `toString` method but found an Array with length %s instead. Browsers treat all child Nodes of <title> tags as Text content and React expects to be able to convert `children` of <title> tags to a single string value which is why Arrays of length greater than 1 are not supported. When using JSX it can be commong to combine text nodes and value nodes. For example: <title>hello {nameOfUser}</title>. While not immediately apparent, `children` in this case is an Array with length 2. If your `children` prop is using this form try rewriting it using a template string: <title>{`hello ${nameOfUser}`}</title>.",                   children$jscomp$6.length@@ -2632,3 +2590,2 @@               0 < headers.remainingCapacity &&-              "string" !== typeof props.srcSet &&               ("high" === props.fetchPriority ||@@ -2693,9 +2650,9 @@         case "head":-          if (formatContext.insertionMode < HTML_MODE) {-            var preamble = preambleState || renderState.preamble;-            if (preamble.headChunks)-              throw Error("The `<head>` tag may only be rendered once.");-            preamble.headChunks = [];-            var JSCompiler_inline_result$jscomp$9 = pushStartSingletonElement(-              preamble.headChunks,+          if (+            formatContext.insertionMode < HTML_MODE &&+            null === renderState.headChunks+          ) {+            renderState.headChunks = [];+            var JSCompiler_inline_result$jscomp$9 = pushStartGenericElement(+              renderState.headChunks,               props,@@ -2710,12 +2667,12 @@           return JSCompiler_inline_result$jscomp$9;-        case "body":-          if (formatContext.insertionMode < HTML_MODE) {-            var preamble$jscomp$0 = preambleState || renderState.preamble;-            if (preamble$jscomp$0.bodyChunks)-              throw Error("The `<body>` tag may only be rendered once.");-            preamble$jscomp$0.bodyChunks = [];-            var JSCompiler_inline_result$jscomp$10 = pushStartSingletonElement(-              preamble$jscomp$0.bodyChunks,+        case "html":+          if (+            formatContext.insertionMode === ROOT_HTML_MODE &&+            null === renderState.htmlChunks+          ) {+            renderState.htmlChunks = [doctypeChunk];+            var JSCompiler_inline_result$jscomp$10 = pushStartGenericElement(+              renderState.htmlChunks,               props,-              "body"+              "html"             );@@ -2725,23 +2682,5 @@               props,-              "body"+              "html"             );           return JSCompiler_inline_result$jscomp$10;-        case "html":-          if (formatContext.insertionMode === ROOT_HTML_MODE) {-            var preamble$jscomp$1 = preambleState || renderState.preamble;-            if (preamble$jscomp$1.htmlChunks)-              throw Error("The `<html>` tag may only be rendered once.");-            preamble$jscomp$1.htmlChunks = [doctypeChunk];-            var JSCompiler_inline_result$jscomp$11 = pushStartSingletonElement(-              preamble$jscomp$1.htmlChunks,-              props,-              "html"-            );-          } else-            JSCompiler_inline_result$jscomp$11 = pushStartGenericElement(-              target$jscomp$0,-              props,-              "html"-            );-          return JSCompiler_inline_result$jscomp$11;         default:@@ -2812,17 +2751,2 @@     }-    function hoistPreambleState(renderState, preambleState) {-      renderState = renderState.preamble;-      null === renderState.htmlChunks &&-        preambleState.htmlChunks &&-        ((renderState.htmlChunks = preambleState.htmlChunks),-        (preambleState.contribution |= 1));-      null === renderState.headChunks &&-        preambleState.headChunks &&-        ((renderState.headChunks = preambleState.headChunks),-        (preambleState.contribution |= 4));-      null === renderState.bodyChunks &&-        preambleState.bodyChunks &&-        ((renderState.bodyChunks = preambleState.bodyChunks),-        (preambleState.contribution |= 2));-    }     function writeBootstrap(destination, renderState) {@@ -2846,9 +2770,2 @@     }-    function writePreambleContribution(destination, preambleState) {-      preambleState = preambleState.contribution;-      preambleState !== NoContribution &&-        (destination.push(boundaryPreambleContributionChunkStart),-        destination.push("" + preambleState),-        destination.push(boundaryPreambleContributionChunkEnd));-    }     function writeStartSegment(destination, renderState, formatContext, id) {@@ -2857,3 +2774,2 @@         case HTML_HTML_MODE:-        case HTML_HEAD_MODE:         case HTML_MODE:@@ -2922,3 +2838,2 @@         case HTML_HTML_MODE:-        case HTML_HEAD_MODE:         case HTML_MODE:@@ -3316,3 +3231,4 @@         startInlineScript: "<script>",-        preamble: createPreambleState(),+        htmlChunks: null,+        headChunks: null,         externalRuntimeScript: null,@@ -3446,3 +3362,4 @@         startInlineScript: idPrefix.startInlineScript,-        preamble: idPrefix.preamble,+        htmlChunks: idPrefix.htmlChunks,+        headChunks: idPrefix.headChunks,         externalRuntimeScript: idPrefix.externalRuntimeScript,@@ -3497,2 +3414,4 @@           return "Fragment";+        case REACT_PORTAL_TYPE:+          return "Portal";         case REACT_PROFILER_TYPE:@@ -3505,4 +3424,2 @@           return "SuspenseList";-        case REACT_ACTIVITY_TYPE:-          return "Activity";       }@@ -3516,4 +3433,2 @@         ) {-          case REACT_PORTAL_TYPE:-            return "Portal";           case REACT_CONTEXT_TYPE:@@ -4188,23 +4103,2 @@     }-    function formatOwnerStack(error) {-      var prevPrepareStackTrace = Error.prepareStackTrace;-      Error.prepareStackTrace = void 0;-      error = error.stack;-      Error.prepareStackTrace = prevPrepareStackTrace;-      error.startsWith("Error: react-stack-top-frame\n") &&-        (error = error.slice(29));-      prevPrepareStackTrace = error.indexOf("\n");-      -1 !== prevPrepareStackTrace &&-        (error = error.slice(prevPrepareStackTrace + 1));-      prevPrepareStackTrace = error.indexOf("react_stack_bottom_frame");-      -1 !== prevPrepareStackTrace &&-        (prevPrepareStackTrace = error.lastIndexOf(-          "\n",-          prevPrepareStackTrace-        ));-      if (-1 !== prevPrepareStackTrace)-        error = error.slice(0, prevPrepareStackTrace);-      else return "";-      return error;-    }     function describeComponentStackByType(type) {@@ -4213,3 +4107,3 @@         return type.prototype && type.prototype.isReactComponent-          ? describeNativeComponentFrame(type, !0)+          ? ((type = describeNativeComponentFrame(type, !0)), type)           : describeNativeComponentFrame(type, !1);@@ -4248,2 +4142,14 @@     }+    function getStackByComponentStackNode(componentStack) {+      try {+        var info = "";+        do+          (info += describeComponentStackByType(componentStack.type)),+            (componentStack = componentStack.parent);+        while (componentStack);+        return info;+      } catch (x) {
… 1719 more lines (truncated)
cjs/react-dom-server-legacy.node.production.js +263 lines
--- +++ @@ -51,6 +51,6 @@   REACT_SCOPE_TYPE = Symbol.for("react.scope"),-  REACT_ACTIVITY_TYPE = Symbol.for("react.activity"),+  REACT_DEBUG_TRACING_MODE_TYPE = Symbol.for("react.debug_trace_mode"),+  REACT_OFFSCREEN_TYPE = Symbol.for("react.offscreen"),   REACT_LEGACY_HIDDEN_TYPE = Symbol.for("react.legacy_hidden"),   REACT_MEMO_CACHE_SENTINEL = Symbol.for("react.memo_cache_sentinel"),-  REACT_VIEW_TRANSITION_TYPE = Symbol.for("react.view_transition"),   MAYBE_ITERATOR_SYMBOL = Symbol.iterator,@@ -316,10 +316,2 @@ }-function createPreambleState() {-  return {-    htmlChunks: null,-    headChunks: null,-    bodyChunks: null,-    contribution: 0-  };-} function createFormatContext(insertionMode, selectedValue, tagScope) {@@ -342,3 +334,3 @@     case "svg":-      return createFormatContext(4, null, parentContext.tagScope);+      return createFormatContext(3, null, parentContext.tagScope);     case "picture":@@ -346,3 +338,3 @@     case "math":-      return createFormatContext(5, null, parentContext.tagScope);+      return createFormatContext(4, null, parentContext.tagScope);     case "foreignObject":@@ -350,3 +342,3 @@     case "table":-      return createFormatContext(6, null, parentContext.tagScope);+      return createFormatContext(5, null, parentContext.tagScope);     case "thead":@@ -354,18 +346,17 @@     case "tfoot":+      return createFormatContext(6, null, parentContext.tagScope);+    case "colgroup":+      return createFormatContext(8, null, parentContext.tagScope);+    case "tr":       return createFormatContext(7, null, parentContext.tagScope);-    case "colgroup":-      return createFormatContext(9, null, parentContext.tagScope);-    case "tr":-      return createFormatContext(8, null, parentContext.tagScope);-    case "head":-      if (2 > parentContext.insertionMode)-        return createFormatContext(3, null, parentContext.tagScope);-      break;-    case "html":-      if (0 === parentContext.insertionMode)-        return createFormatContext(1, null, parentContext.tagScope);   }-  return 6 <= parentContext.insertionMode || 2 > parentContext.insertionMode+  return 5 <= parentContext.insertionMode     ? createFormatContext(2, null, parentContext.tagScope)-    : parentContext;+    : 0 === parentContext.insertionMode+      ? "html" === type+        ? createFormatContext(1, null, parentContext.tagScope)+        : createFormatContext(2, null, parentContext.tagScope)+      : 1 === parentContext.insertionMode+        ? createFormatContext(2, null, parentContext.tagScope)+        : parentContext; }@@ -793,25 +784,2 @@ }-function pushStartSingletonElement(target, props, tag) {-  target.push(startChunkForTag(tag));-  var innerHTML = (tag = null),-    propKey;-  for (propKey in props)-    if (hasOwnProperty.call(props, propKey)) {-      var propValue = props[propKey];-      if (null != propValue)-        switch (propKey) {-          case "children":-            tag = propValue;-            break;-          case "dangerouslySetInnerHTML":-            innerHTML = propValue;-            break;-          default:-            pushAttribute(target, propKey, propValue);-        }-    }-  target.push(">");-  pushInnerHTML(target, innerHTML, tag);-  return tag;-} function pushStartGenericElement(target, props, tag) {@@ -858,3 +826,2 @@   renderState,-  preambleState,   hoistableState,@@ -1338,3 +1305,3 @@       if (-        4 === formatContext.insertionMode ||+        3 === formatContext.insertionMode ||         formatContext.tagScope & 1 ||@@ -1357,3 +1324,3 @@       if (-        4 === formatContext.insertionMode ||+        3 === formatContext.insertionMode ||         formatContext.tagScope & 1 ||@@ -1439,3 +1406,3 @@         props.onError ||-        4 === formatContext.insertionMode ||+        3 === formatContext.insertionMode ||         formatContext.tagScope & 1 ||@@ -1480,3 +1447,3 @@       if (-        4 === formatContext.insertionMode ||+        3 === formatContext.insertionMode ||         formatContext.tagScope & 1 ||@@ -1583,3 +1550,3 @@       if (-        4 === formatContext.insertionMode ||+        3 === formatContext.insertionMode ||         formatContext.tagScope & 1 ||@@ -1702,3 +1669,2 @@           0 < headers.remainingCapacity &&-          "string" !== typeof props.srcSet &&           ("high" === props.fetchPriority ||@@ -1762,9 +1728,6 @@     case "head":-      if (2 > formatContext.insertionMode) {-        var preamble = preambleState || renderState.preamble;-        if (preamble.headChunks)-          throw Error("The `<head>` tag may only be rendered once.");-        preamble.headChunks = [];-        var JSCompiler_inline_result$jscomp$9 = pushStartSingletonElement(-          preamble.headChunks,+      if (2 > formatContext.insertionMode && null === renderState.headChunks) {+        renderState.headChunks = [];+        var JSCompiler_inline_result$jscomp$9 = pushStartGenericElement(+          renderState.headChunks,           props,@@ -1779,12 +1742,12 @@       return JSCompiler_inline_result$jscomp$9;-    case "body":-      if (2 > formatContext.insertionMode) {-        var preamble$jscomp$0 = preambleState || renderState.preamble;-        if (preamble$jscomp$0.bodyChunks)-          throw Error("The `<body>` tag may only be rendered once.");-        preamble$jscomp$0.bodyChunks = [];-        var JSCompiler_inline_result$jscomp$10 = pushStartSingletonElement(-          preamble$jscomp$0.bodyChunks,+    case "html":+      if (+        0 === formatContext.insertionMode &&+        null === renderState.htmlChunks+      ) {+        renderState.htmlChunks = [""];+        var JSCompiler_inline_result$jscomp$10 = pushStartGenericElement(+          renderState.htmlChunks,           props,-          "body"+          "html"         );@@ -1794,23 +1757,5 @@           props,-          "body"+          "html"         );       return JSCompiler_inline_result$jscomp$10;-    case "html":-      if (0 === formatContext.insertionMode) {-        var preamble$jscomp$1 = preambleState || renderState.preamble;-        if (preamble$jscomp$1.htmlChunks)-          throw Error("The `<html>` tag may only be rendered once.");-        preamble$jscomp$1.htmlChunks = [""];-        var JSCompiler_inline_result$jscomp$11 = pushStartSingletonElement(-          preamble$jscomp$1.htmlChunks,-          props,-          "html"-        );-      } else-        JSCompiler_inline_result$jscomp$11 = pushStartGenericElement(-          target$jscomp$0,-          props,-          "html"-        );-      return JSCompiler_inline_result$jscomp$11;     default:@@ -1875,17 +1820,2 @@ }-function hoistPreambleState(renderState, preambleState) {-  renderState = renderState.preamble;-  null === renderState.htmlChunks &&-    preambleState.htmlChunks &&-    ((renderState.htmlChunks = preambleState.htmlChunks),-    (preambleState.contribution |= 1));-  null === renderState.headChunks &&-    preambleState.headChunks &&-    ((renderState.headChunks = preambleState.headChunks),-    (preambleState.contribution |= 4));-  null === renderState.bodyChunks &&-    preambleState.bodyChunks &&-    ((renderState.bodyChunks = preambleState.bodyChunks),-    (preambleState.contribution |= 2));-} function writeBootstrap(destination, renderState) {@@ -1909,9 +1839,2 @@ }-function writePreambleContribution(destination, preambleState) {-  preambleState = preambleState.contribution;-  0 !== preambleState &&-    (destination.push("\x3c!--"),-    destination.push("" + preambleState),-    destination.push("--\x3e"));-} function writeStartSegment(destination, renderState, formatContext, id) {@@ -1920,3 +1843,2 @@     case 1:-    case 3:     case 2:@@ -1929,3 +1851,3 @@       );-    case 4:+    case 3:       return (@@ -1937,3 +1859,3 @@       );-    case 5:+    case 4:       return (@@ -1945,3 +1867,3 @@       );-    case 6:+    case 5:       return (@@ -1953,3 +1875,3 @@       );-    case 7:+    case 6:       return (@@ -1961,3 +1883,3 @@       );-    case 8:+    case 7:       return (@@ -1969,3 +1891,3 @@       );-    case 9:+    case 8:       return (
… 844 more lines (truncated)
cjs/react-dom-server.browser.development.js +527 lines
--- +++ @@ -856,3 +856,4 @@         startInlineScript: inlineScriptWithNonce,-        preamble: createPreambleState(),+        htmlChunks: null,+        headChunks: null,         externalRuntimeScript: null,@@ -1022,10 +1023,2 @@     }-    function createPreambleState() {-      return {-        htmlChunks: null,-        headChunks: null,-        bodyChunks: null,-        contribution: NoContribution-      };-    }     function createFormatContext(insertionMode, selectedValue, tagScope) {@@ -1100,22 +1093,12 @@           );-        case "head":-          if (parentContext.insertionMode < HTML_MODE)-            return createFormatContext(-              HTML_HEAD_MODE,-              null,-              parentContext.tagScope-            );-          break;-        case "html":-          if (parentContext.insertionMode === ROOT_HTML_MODE)-            return createFormatContext(-              HTML_HTML_MODE,-              null,-              parentContext.tagScope-            );       }-      return parentContext.insertionMode >= HTML_TABLE_MODE ||-        parentContext.insertionMode < HTML_MODE+      return parentContext.insertionMode >= HTML_TABLE_MODE         ? createFormatContext(HTML_MODE, null, parentContext.tagScope)-        : parentContext;+        : parentContext.insertionMode === ROOT_HTML_MODE+          ? "html" === type+            ? createFormatContext(HTML_HTML_MODE, null, parentContext.tagScope)+            : createFormatContext(HTML_MODE, null, parentContext.tagScope)+          : parentContext.insertionMode === HTML_HTML_MODE+            ? createFormatContext(HTML_MODE, null, parentContext.tagScope)+            : parentContext;     }@@ -1770,25 +1753,2 @@     }-    function pushStartSingletonElement(target, props, tag) {-      target.push(startChunkForTag(tag));-      var innerHTML = (tag = null),-        propKey;-      for (propKey in props)-        if (hasOwnProperty.call(props, propKey)) {-          var propValue = props[propKey];-          if (null != propValue)-            switch (propKey) {-              case "children":-                tag = propValue;-                break;-              case "dangerouslySetInnerHTML":-                innerHTML = propValue;-                break;-              default:-                pushAttribute(target, propKey, propValue);-            }-        }-      target.push(endOfStartTag);-      pushInnerHTML(target, innerHTML, tag);-      return tag;-    }     function pushStartGenericElement(target, props, tag) {@@ -1833,3 +1793,2 @@       renderState,-      preambleState,       hoistableState,@@ -2477,3 +2436,3 @@               ? console.error(-                  "React expects the `children` prop of <title> tags to be a string, number, bigint, or object with a novel `toString` method but found an Array with length %s instead. Browsers treat all child Nodes of <title> tags as Text content and React expects to be able to convert `children` of <title> tags to a single string value which is why Arrays of length greater than 1 are not supported. When using JSX it can be common to combine text nodes and value nodes. For example: <title>hello {nameOfUser}</title>. While not immediately apparent, `children` in this case is an Array with length 2. If your `children` prop is using this form try rewriting it using a template string: <title>{`hello ${nameOfUser}`}</title>.",+                  "React expects the `children` prop of <title> tags to be a string, number, bigint, or object with a novel `toString` method but found an Array with length %s instead. Browsers treat all child Nodes of <title> tags as Text content and React expects to be able to convert `children` of <title> tags to a single string value which is why Arrays of length greater than 1 are not supported. When using JSX it can be commong to combine text nodes and value nodes. For example: <title>hello {nameOfUser}</title>. While not immediately apparent, `children` in this case is an Array with length 2. If your `children` prop is using this form try rewriting it using a template string: <title>{`hello ${nameOfUser}`}</title>.",                   children$jscomp$6.length@@ -2942,3 +2901,2 @@               0 < headers.remainingCapacity &&-              "string" !== typeof props.srcSet &&               ("high" === props.fetchPriority ||@@ -3003,9 +2961,9 @@         case "head":-          if (formatContext.insertionMode < HTML_MODE) {-            var preamble = preambleState || renderState.preamble;-            if (preamble.headChunks)-              throw Error("The `<head>` tag may only be rendered once.");-            preamble.headChunks = [];-            var JSCompiler_inline_result$jscomp$9 = pushStartSingletonElement(-              preamble.headChunks,+          if (+            formatContext.insertionMode < HTML_MODE &&+            null === renderState.headChunks+          ) {+            renderState.headChunks = [];+            var JSCompiler_inline_result$jscomp$9 = pushStartGenericElement(+              renderState.headChunks,               props,@@ -3020,12 +2978,12 @@           return JSCompiler_inline_result$jscomp$9;-        case "body":-          if (formatContext.insertionMode < HTML_MODE) {-            var preamble$jscomp$0 = preambleState || renderState.preamble;-            if (preamble$jscomp$0.bodyChunks)-              throw Error("The `<body>` tag may only be rendered once.");-            preamble$jscomp$0.bodyChunks = [];-            var JSCompiler_inline_result$jscomp$10 = pushStartSingletonElement(-              preamble$jscomp$0.bodyChunks,+        case "html":+          if (+            formatContext.insertionMode === ROOT_HTML_MODE &&+            null === renderState.htmlChunks+          ) {+            renderState.htmlChunks = [doctypeChunk];+            var JSCompiler_inline_result$jscomp$10 = pushStartGenericElement(+              renderState.htmlChunks,               props,-              "body"+              "html"             );@@ -3035,23 +2993,5 @@               props,-              "body"+              "html"             );           return JSCompiler_inline_result$jscomp$10;-        case "html":-          if (formatContext.insertionMode === ROOT_HTML_MODE) {-            var preamble$jscomp$1 = preambleState || renderState.preamble;-            if (preamble$jscomp$1.htmlChunks)-              throw Error("The `<html>` tag may only be rendered once.");-            preamble$jscomp$1.htmlChunks = [doctypeChunk];-            var JSCompiler_inline_result$jscomp$11 = pushStartSingletonElement(-              preamble$jscomp$1.htmlChunks,-              props,-              "html"-            );-          } else-            JSCompiler_inline_result$jscomp$11 = pushStartGenericElement(-              target$jscomp$0,-              props,-              "html"-            );-          return JSCompiler_inline_result$jscomp$11;         default:@@ -3125,17 +3065,2 @@     }-    function hoistPreambleState(renderState, preambleState) {-      renderState = renderState.preamble;-      null === renderState.htmlChunks &&-        preambleState.htmlChunks &&-        ((renderState.htmlChunks = preambleState.htmlChunks),-        (preambleState.contribution |= 1));-      null === renderState.headChunks &&-        preambleState.headChunks &&-        ((renderState.headChunks = preambleState.headChunks),-        (preambleState.contribution |= 4));-      null === renderState.bodyChunks &&-        preambleState.bodyChunks &&-        ((renderState.bodyChunks = preambleState.bodyChunks),-        (preambleState.contribution |= 2));-    }     function writeBootstrap(destination, renderState) {@@ -3160,9 +3085,2 @@     }-    function writePreambleContribution(destination, preambleState) {-      preambleState = preambleState.contribution;-      preambleState !== NoContribution &&-        (writeChunk(destination, boundaryPreambleContributionChunkStart),-        writeChunk(destination, stringToChunk("" + preambleState)),-        writeChunk(destination, boundaryPreambleContributionChunkEnd));-    }     function writeStartSegment(destination, renderState, formatContext, id) {@@ -3171,3 +3089,2 @@         case HTML_HTML_MODE:-        case HTML_HEAD_MODE:         case HTML_MODE:@@ -3229,3 +3146,2 @@         case HTML_HTML_MODE:-        case HTML_HEAD_MODE:         case HTML_MODE:@@ -3636,2 +3552,4 @@           return "Fragment";+        case REACT_PORTAL_TYPE:+          return "Portal";         case REACT_PROFILER_TYPE:@@ -3644,4 +3562,2 @@           return "SuspenseList";-        case REACT_ACTIVITY_TYPE:-          return "Activity";       }@@ -3655,4 +3571,2 @@         ) {-          case REACT_PORTAL_TYPE:-            return "Portal";           case REACT_CONTEXT_TYPE:@@ -4327,23 +4241,2 @@     }-    function formatOwnerStack(error) {-      var prevPrepareStackTrace = Error.prepareStackTrace;-      Error.prepareStackTrace = void 0;-      error = error.stack;-      Error.prepareStackTrace = prevPrepareStackTrace;-      error.startsWith("Error: react-stack-top-frame\n") &&-        (error = error.slice(29));-      prevPrepareStackTrace = error.indexOf("\n");-      -1 !== prevPrepareStackTrace &&-        (error = error.slice(prevPrepareStackTrace + 1));-      prevPrepareStackTrace = error.indexOf("react_stack_bottom_frame");-      -1 !== prevPrepareStackTrace &&-        (prevPrepareStackTrace = error.lastIndexOf(-          "\n",-          prevPrepareStackTrace-        ));-      if (-1 !== prevPrepareStackTrace)-        error = error.slice(0, prevPrepareStackTrace);-      else return "";-      return error;-    }     function describeComponentStackByType(type) {@@ -4352,3 +4245,3 @@         return type.prototype && type.prototype.isReactComponent-          ? describeNativeComponentFrame(type, !0)+          ? ((type = describeNativeComponentFrame(type, !0)), type)           : describeNativeComponentFrame(type, !1);@@ -4387,2 +4280,14 @@     }+    function getStackByComponentStackNode(componentStack) {+      try {+        var info = "";+        do+          (info += describeComponentStackByType(componentStack.type)),+            (componentStack = componentStack.parent);+        while (componentStack);+        return info;+      } catch (x) {+        return "\nError generating stack: " + x.message + "\n" + x.stack;+      }+    }     function defaultErrorHandler(error) {@@ -4443,3 +4348,3 @@       this.pendingRootTasks = this.allPendingTasks = this.nextSegmentId = 0;
… 1741 more lines (truncated)
cjs/react-dom-server.browser.production.js +248 lines
--- +++ @@ -66,6 +66,6 @@   REACT_SCOPE_TYPE = Symbol.for("react.scope"),-  REACT_ACTIVITY_TYPE = Symbol.for("react.activity"),+  REACT_DEBUG_TRACING_MODE_TYPE = Symbol.for("react.debug_trace_mode"),+  REACT_OFFSCREEN_TYPE = Symbol.for("react.offscreen"),   REACT_LEGACY_HIDDEN_TYPE = Symbol.for("react.legacy_hidden"),   REACT_MEMO_CACHE_SENTINEL = Symbol.for("react.memo_cache_sentinel"),-  REACT_VIEW_TRANSITION_TYPE = Symbol.for("react.view_transition"),   MAYBE_ITERATOR_SYMBOL = Symbol.iterator,@@ -440,3 +440,4 @@     startInlineScript: inlineScriptWithNonce,-    preamble: createPreambleState(),+    htmlChunks: null,+    headChunks: null,     externalRuntimeScript: null,@@ -607,10 +608,2 @@ }-function createPreambleState() {-  return {-    htmlChunks: null,-    headChunks: null,-    bodyChunks: null,-    contribution: 0-  };-} function createFormatContext(insertionMode, selectedValue, tagScope) {@@ -625,5 +618,5 @@     "http://www.w3.org/2000/svg" === namespaceURI-      ? 4+      ? 3       : "http://www.w3.org/1998/Math/MathML" === namespaceURI-        ? 5+        ? 4         : 0,@@ -644,3 +637,3 @@     case "svg":-      return createFormatContext(4, null, parentContext.tagScope);+      return createFormatContext(3, null, parentContext.tagScope);     case "picture":@@ -648,3 +641,3 @@     case "math":-      return createFormatContext(5, null, parentContext.tagScope);+      return createFormatContext(4, null, parentContext.tagScope);     case "foreignObject":@@ -652,3 +645,3 @@     case "table":-      return createFormatContext(6, null, parentContext.tagScope);+      return createFormatContext(5, null, parentContext.tagScope);     case "thead":@@ -656,18 +649,17 @@     case "tfoot":+      return createFormatContext(6, null, parentContext.tagScope);+    case "colgroup":+      return createFormatContext(8, null, parentContext.tagScope);+    case "tr":       return createFormatContext(7, null, parentContext.tagScope);-    case "colgroup":-      return createFormatContext(9, null, parentContext.tagScope);-    case "tr":-      return createFormatContext(8, null, parentContext.tagScope);-    case "head":-      if (2 > parentContext.insertionMode)-        return createFormatContext(3, null, parentContext.tagScope);-      break;-    case "html":-      if (0 === parentContext.insertionMode)-        return createFormatContext(1, null, parentContext.tagScope);   }-  return 6 <= parentContext.insertionMode || 2 > parentContext.insertionMode+  return 5 <= parentContext.insertionMode     ? createFormatContext(2, null, parentContext.tagScope)-    : parentContext;+    : 0 === parentContext.insertionMode+      ? "html" === type+        ? createFormatContext(1, null, parentContext.tagScope)+        : createFormatContext(2, null, parentContext.tagScope)+      : 1 === parentContext.insertionMode+        ? createFormatContext(2, null, parentContext.tagScope)+        : parentContext; }@@ -1181,25 +1173,2 @@ }-function pushStartSingletonElement(target, props, tag) {-  target.push(startChunkForTag(tag));-  var innerHTML = (tag = null),-    propKey;-  for (propKey in props)-    if (hasOwnProperty.call(props, propKey)) {-      var propValue = props[propKey];-      if (null != propValue)-        switch (propKey) {-          case "children":-            tag = propValue;-            break;-          case "dangerouslySetInnerHTML":-            innerHTML = propValue;-            break;-          default:-            pushAttribute(target, propKey, propValue);-        }-    }-  target.push(endOfStartTag);-  pushInnerHTML(target, innerHTML, tag);-  return tag;-} function pushStartGenericElement(target, props, tag) {@@ -1249,3 +1218,2 @@   renderState,-  preambleState,   hoistableState,@@ -1728,3 +1696,3 @@       if (-        4 === formatContext.insertionMode ||+        3 === formatContext.insertionMode ||         formatContext.tagScope & 1 ||@@ -1747,3 +1715,3 @@       if (-        4 === formatContext.insertionMode ||+        3 === formatContext.insertionMode ||         formatContext.tagScope & 1 ||@@ -1829,3 +1797,3 @@         props.onError ||-        4 === formatContext.insertionMode ||+        3 === formatContext.insertionMode ||         formatContext.tagScope & 1 ||@@ -1870,3 +1838,3 @@       if (-        4 === formatContext.insertionMode ||+        3 === formatContext.insertionMode ||         formatContext.tagScope & 1 ||@@ -1979,3 +1947,3 @@       if (-        4 === formatContext.insertionMode ||+        3 === formatContext.insertionMode ||         formatContext.tagScope & 1 ||@@ -2093,3 +2061,2 @@           0 < headers.remainingCapacity &&-          "string" !== typeof props.srcSet &&           ("high" === props.fetchPriority ||@@ -2153,9 +2120,6 @@     case "head":-      if (2 > formatContext.insertionMode) {-        var preamble = preambleState || renderState.preamble;-        if (preamble.headChunks)-          throw Error(formatProdErrorMessage(545, "`<head>`"));-        preamble.headChunks = [];-        var JSCompiler_inline_result$jscomp$9 = pushStartSingletonElement(-          preamble.headChunks,+      if (2 > formatContext.insertionMode && null === renderState.headChunks) {+        renderState.headChunks = [];+        var JSCompiler_inline_result$jscomp$9 = pushStartGenericElement(+          renderState.headChunks,           props,@@ -2170,12 +2134,12 @@       return JSCompiler_inline_result$jscomp$9;-    case "body":-      if (2 > formatContext.insertionMode) {-        var preamble$jscomp$0 = preambleState || renderState.preamble;-        if (preamble$jscomp$0.bodyChunks)-          throw Error(formatProdErrorMessage(545, "`<body>`"));-        preamble$jscomp$0.bodyChunks = [];-        var JSCompiler_inline_result$jscomp$10 = pushStartSingletonElement(-          preamble$jscomp$0.bodyChunks,+    case "html":+      if (+        0 === formatContext.insertionMode &&+        null === renderState.htmlChunks+      ) {+        renderState.htmlChunks = [doctypeChunk];+        var JSCompiler_inline_result$jscomp$10 = pushStartGenericElement(+          renderState.htmlChunks,           props,-          "body"+          "html"         );@@ -2185,23 +2149,5 @@           props,-          "body"+          "html"         );       return JSCompiler_inline_result$jscomp$10;-    case "html":-      if (0 === formatContext.insertionMode) {-        var preamble$jscomp$1 = preambleState || renderState.preamble;-        if (preamble$jscomp$1.htmlChunks)-          throw Error(formatProdErrorMessage(545, "`<html>`"));-        preamble$jscomp$1.htmlChunks = [doctypeChunk];-        var JSCompiler_inline_result$jscomp$11 = pushStartSingletonElement(-          preamble$jscomp$1.htmlChunks,-          props,-          "html"-        );-      } else-        JSCompiler_inline_result$jscomp$11 = pushStartGenericElement(-          target$jscomp$0,-          props,-          "html"-        );-      return JSCompiler_inline_result$jscomp$11;     default:@@ -2268,17 +2214,2 @@ }-function hoistPreambleState(renderState, preambleState) {-  renderState = renderState.preamble;-  null === renderState.htmlChunks &&-    preambleState.htmlChunks &&-    ((renderState.htmlChunks = preambleState.htmlChunks),-    (preambleState.contribution |= 1));-  null === renderState.headChunks &&-    preambleState.headChunks &&-    ((renderState.headChunks = preambleState.headChunks),-    (preambleState.contribution |= 4));-  null === renderState.bodyChunks &&-    preambleState.bodyChunks &&-    ((renderState.bodyChunks = preambleState.bodyChunks),-    (preambleState.contribution |= 2));-} function writeBootstrap(destination, renderState) {@@ -2319,12 +2250,2 @@   return writeChunkAndReturn(destination, startPendingSuspenseBoundary2);-}-var boundaryPreambleContributionChunkStart =-    stringToPrecomputedChunk("\x3c!--"),-  boundaryPreambleContributionChunkEnd = stringToPrecomputedChunk("--\x3e");-function writePreambleContribution(destination, preambleState) {-  preambleState = preambleState.contribution;-  0 !== preambleState &&-    (writeChunk(destination, boundaryPreambleContributionChunkStart),-    writeChunk(destination, stringToChunk("" + preambleState)),-    writeChunk(destination, boundaryPreambleContributionChunkEnd)); }@@ -2361,3 +2282,2 @@     case 1:-    case 3:     case 2:@@ -2369,3 +2289,3 @@       );-    case 4:+    case 3:       return (@@ -2376,3 +2296,3 @@       );-    case 5:+    case 4:       return (@@ -2383,3 +2303,3 @@       );-    case 6:
… 812 more lines (truncated)
cjs/react-dom-server.bun.development.js +615 lines
--- +++ @@ -27,6 +27,6 @@   REACT_SCOPE_TYPE = Symbol.for("react.scope"),-  REACT_ACTIVITY_TYPE = Symbol.for("react.activity"),+  REACT_DEBUG_TRACING_MODE_TYPE = Symbol.for("react.debug_trace_mode"),+  REACT_OFFSCREEN_TYPE = Symbol.for("react.offscreen"),   REACT_LEGACY_HIDDEN_TYPE = Symbol.for("react.legacy_hidden"),   REACT_MEMO_CACHE_SENTINEL = Symbol.for("react.memo_cache_sentinel"),-  REACT_VIEW_TRANSITION_TYPE = Symbol.for("react.view_transition"),   MAYBE_ITERATOR_SYMBOL = Symbol.iterator,@@ -1423,12 +1423,3 @@     );-  importMap = onHeaders-    ? {-        preconnects: "",-        fontPreloads: "",-        highImagePreloads: "",-        remainingCapacity:-          2 + ("number" === typeof maxHeadersLength ? maxHeadersLength : 2e3)-      }-    : null;-  onHeaders = {+  importMap = {     placeholderPrefix: idPrefix + "P:",@@ -1437,3 +1428,4 @@     startInlineScript: inlineScriptWithNonce,-    preamble: createPreambleState(),+    htmlChunks: null,+    headChunks: null,     externalRuntimeScript: null,@@ -1442,3 +1434,11 @@     onHeaders: onHeaders,-    headers: importMap,+    headers: onHeaders+      ? {+          preconnects: "",+          fontPreloads: "",+          highImagePreloads: "",+          remainingCapacity:+            2 + ("number" === typeof maxHeadersLength ? maxHeadersLength : 2e3)+        }+      : null,     resets: {@@ -1471,4 +1471,4 @@   if (void 0 !== bootstrapScripts)-    for (importMap = 0; importMap < bootstrapScripts.length; importMap++) {-      maxHeadersLength = bootstrapScripts[importMap];+    for (onHeaders = 0; onHeaders < bootstrapScripts.length; onHeaders++) {+      maxHeadersLength = bootstrapScripts[onHeaders];       bootstrapScriptContent = idPrefix = void 0;@@ -1496,3 +1496,3 @@         resumableState,-        onHeaders,+        importMap,         inlineScriptWithNonce,@@ -1524,3 +1524,3 @@     )-      (importMap = bootstrapModules[bootstrapScripts]),+      (onHeaders = bootstrapModules[bootstrapScripts]),         (idPrefix = inlineScriptWithNonce = void 0),@@ -1531,13 +1531,13 @@         }),-        "string" === typeof importMap-          ? (bootstrapScriptContent.href = maxHeadersLength = importMap)-          : ((bootstrapScriptContent.href = maxHeadersLength = importMap.src),+        "string" === typeof onHeaders+          ? (bootstrapScriptContent.href = maxHeadersLength = onHeaders)+          : ((bootstrapScriptContent.href = maxHeadersLength = onHeaders.src),             (bootstrapScriptContent.integrity = idPrefix =-              "string" === typeof importMap.integrity-                ? importMap.integrity+              "string" === typeof onHeaders.integrity+                ? onHeaders.integrity                 : void 0),             (bootstrapScriptContent.crossOrigin = inlineScriptWithNonce =-              "string" === typeof importMap || null == importMap.crossOrigin+              "string" === typeof onHeaders || null == onHeaders.crossOrigin                 ? void 0-                : "use-credentials" === importMap.crossOrigin+                : "use-credentials" === onHeaders.crossOrigin                   ? "use-credentials"@@ -1546,3 +1546,3 @@           resumableState,-          onHeaders,+          importMap,           maxHeadersLength,@@ -1567,3 +1567,3 @@         externalRuntimeConfig.push('" async="">\x3c/script>');-  return onHeaders;+  return importMap; }@@ -1596,11 +1596,2 @@ }-var NoContribution = 0;-function createPreambleState() {-  return {-    htmlChunks: null,-    headChunks: null,-    bodyChunks: null,-    contribution: NoContribution-  };-} var ROOT_HTML_MODE = 0,@@ -1608,9 +1599,8 @@   HTML_MODE = 2,-  HTML_HEAD_MODE = 3,-  SVG_MODE = 4,-  MATHML_MODE = 5,-  HTML_TABLE_MODE = 6,-  HTML_TABLE_BODY_MODE = 7,-  HTML_TABLE_ROW_MODE = 8,-  HTML_COLGROUP_MODE = 9;+  SVG_MODE = 3,+  MATHML_MODE = 4,+  HTML_TABLE_MODE = 5,+  HTML_TABLE_BODY_MODE = 6,+  HTML_TABLE_ROW_MODE = 7,+  HTML_COLGROUP_MODE = 8; function createFormatContext(insertionMode, selectedValue, tagScope) {@@ -1673,22 +1663,12 @@       );-    case "head":-      if (parentContext.insertionMode < HTML_MODE)-        return createFormatContext(-          HTML_HEAD_MODE,-          null,-          parentContext.tagScope-        );-      break;-    case "html":-      if (parentContext.insertionMode === ROOT_HTML_MODE)-        return createFormatContext(-          HTML_HTML_MODE,-          null,-          parentContext.tagScope-        );   }-  return parentContext.insertionMode >= HTML_TABLE_MODE ||-    parentContext.insertionMode < HTML_MODE+  return parentContext.insertionMode >= HTML_TABLE_MODE     ? createFormatContext(HTML_MODE, null, parentContext.tagScope)-    : parentContext;+    : parentContext.insertionMode === ROOT_HTML_MODE+      ? "html" === type+        ? createFormatContext(HTML_HTML_MODE, null, parentContext.tagScope)+        : createFormatContext(HTML_MODE, null, parentContext.tagScope)+      : parentContext.insertionMode === HTML_HTML_MODE+        ? createFormatContext(HTML_MODE, null, parentContext.tagScope)+        : parentContext; }@@ -2344,25 +2324,2 @@ }-function pushStartSingletonElement(target, props, tag) {-  target.push(startChunkForTag(tag));-  var innerHTML = (tag = null),-    propKey;-  for (propKey in props)-    if (hasOwnProperty.call(props, propKey)) {-      var propValue = props[propKey];-      if (null != propValue)-        switch (propKey) {-          case "children":-            tag = propValue;-            break;-          case "dangerouslySetInnerHTML":-            innerHTML = propValue;-            break;-          default:-            pushAttribute(target, propKey, propValue);-        }-    }-  target.push(endOfStartTag);-  pushInnerHTML(target, innerHTML, tag);-  return tag;-} function pushStartGenericElement(target, props, tag) {@@ -2409,3 +2366,2 @@   renderState,-  preambleState,   hoistableState,@@ -3042,3 +2998,3 @@           ? console.error(-              "React expects the `children` prop of <title> tags to be a string, number, bigint, or object with a novel `toString` method but found an Array with length %s instead. Browsers treat all child Nodes of <title> tags as Text content and React expects to be able to convert `children` of <title> tags to a single string value which is why Arrays of length greater than 1 are not supported. When using JSX it can be common to combine text nodes and value nodes. For example: <title>hello {nameOfUser}</title>. While not immediately apparent, `children` in this case is an Array with length 2. If your `children` prop is using this form try rewriting it using a template string: <title>{`hello ${nameOfUser}`}</title>.",+              "React expects the `children` prop of <title> tags to be a string, number, bigint, or object with a novel `toString` method but found an Array with length %s instead. Browsers treat all child Nodes of <title> tags as Text content and React expects to be able to convert `children` of <title> tags to a single string value which is why Arrays of length greater than 1 are not supported. When using JSX it can be commong to combine text nodes and value nodes. For example: <title>hello {nameOfUser}</title>. While not immediately apparent, `children` in this case is an Array with length 2. If your `children` prop is using this form try rewriting it using a template string: <title>{`hello ${nameOfUser}`}</title>.",               children$jscomp$6.length@@ -3485,3 +3441,2 @@           0 < headers.remainingCapacity &&-          "string" !== typeof props.srcSet &&           ("high" === props.fetchPriority ||@@ -3545,9 +3500,9 @@     case "head":-      if (formatContext.insertionMode < HTML_MODE) {-        var preamble = preambleState || renderState.preamble;-        if (preamble.headChunks)-          throw Error("The `<head>` tag may only be rendered once.");-        preamble.headChunks = [];-        var JSCompiler_inline_result$jscomp$9 = pushStartSingletonElement(-          preamble.headChunks,+      if (+        formatContext.insertionMode < HTML_MODE &&+        null === renderState.headChunks+      ) {+        renderState.headChunks = [];+        var JSCompiler_inline_result$jscomp$9 = pushStartGenericElement(+          renderState.headChunks,           props,@@ -3562,12 +3517,12 @@       return JSCompiler_inline_result$jscomp$9;-    case "body":-      if (formatContext.insertionMode < HTML_MODE) {-        var preamble$jscomp$0 = preambleState || renderState.preamble;-        if (preamble$jscomp$0.bodyChunks)-          throw Error("The `<body>` tag may only be rendered once.");-        preamble$jscomp$0.bodyChunks = [];-        var JSCompiler_inline_result$jscomp$10 = pushStartSingletonElement(-          preamble$jscomp$0.bodyChunks,+    case "html":+      if (+        formatContext.insertionMode === ROOT_HTML_MODE &&+        null === renderState.htmlChunks+      ) {+        renderState.htmlChunks = ["<!DOCTYPE html>"];+        var JSCompiler_inline_result$jscomp$10 = pushStartGenericElement(+          renderState.htmlChunks,           props,-          "body"+          "html"         );@@ -3577,23 +3532,5 @@           props,-          "body"+          "html"         );       return JSCompiler_inline_result$jscomp$10;-    case "html":-      if (formatContext.insertionMode === ROOT_HTML_MODE) {-        var preamble$jscomp$1 = preambleState || renderState.preamble;-        if (preamble$jscomp$1.htmlChunks)-          throw Error("The `<html>` tag may only be rendered once.");-        preamble$jscomp$1.htmlChunks = ["<!DOCTYPE html>"];-        var JSCompiler_inline_result$jscomp$11 = pushStartSingletonElement(-          preamble$jscomp$1.htmlChunks,-          props,-          "html"-        );-      } else-        JSCompiler_inline_result$jscomp$11 = pushStartGenericElement(-          target$jscomp$0,-          props,
… 1902 more lines (truncated)
cjs/react-dom-server.bun.production.js +277 lines
--- +++ @@ -27,6 +27,6 @@   REACT_SCOPE_TYPE = Symbol.for("react.scope"),-  REACT_ACTIVITY_TYPE = Symbol.for("react.activity"),+  REACT_DEBUG_TRACING_MODE_TYPE = Symbol.for("react.debug_trace_mode"),+  REACT_OFFSCREEN_TYPE = Symbol.for("react.offscreen"),   REACT_LEGACY_HIDDEN_TYPE = Symbol.for("react.legacy_hidden"),   REACT_MEMO_CACHE_SENTINEL = Symbol.for("react.memo_cache_sentinel"),-  REACT_VIEW_TRANSITION_TYPE = Symbol.for("react.view_transition"),   MAYBE_ITERATOR_SYMBOL = Symbol.iterator,@@ -254,12 +254,3 @@     bootstrapScriptContent.push("\x3c/script>"));-  importMap = onHeaders-    ? {-        preconnects: "",-        fontPreloads: "",-        highImagePreloads: "",-        remainingCapacity:-          2 + ("number" === typeof maxHeadersLength ? maxHeadersLength : 2e3)-      }-    : null;-  onHeaders = {+  importMap = {     placeholderPrefix: idPrefix + "P:",@@ -268,3 +259,4 @@     startInlineScript: inlineScriptWithNonce,-    preamble: createPreambleState(),+    htmlChunks: null,+    headChunks: null,     externalRuntimeScript: null,@@ -273,3 +265,11 @@     onHeaders: onHeaders,-    headers: importMap,+    headers: onHeaders+      ? {+          preconnects: "",+          fontPreloads: "",+          highImagePreloads: "",+          remainingCapacity:+            2 + ("number" === typeof maxHeadersLength ? maxHeadersLength : 2e3)+        }+      : null,     resets: {@@ -302,4 +302,4 @@   if (void 0 !== bootstrapScripts)-    for (importMap = 0; importMap < bootstrapScripts.length; importMap++) {-      var scriptConfig = bootstrapScripts[importMap];+    for (onHeaders = 0; onHeaders < bootstrapScripts.length; onHeaders++) {+      var scriptConfig = bootstrapScripts[onHeaders];       idPrefix = inlineScriptWithNonce = void 0;@@ -330,3 +330,3 @@       pushLinkImpl(scriptConfig, bootstrapScriptContent);-      onHeaders.bootstrapScripts.add(scriptConfig);+      importMap.bootstrapScripts.add(scriptConfig);       externalRuntimeConfig.push(@@ -363,4 +363,4 @@         "string" === typeof bootstrapScriptContent-          ? (idPrefix.href = importMap = bootstrapScriptContent)-          : ((idPrefix.href = importMap = bootstrapScriptContent.src),+          ? (idPrefix.href = onHeaders = bootstrapScriptContent)+          : ((idPrefix.href = onHeaders = bootstrapScriptContent.src),             (idPrefix.integrity = inlineScriptWithNonce =@@ -377,3 +377,3 @@         (bootstrapScriptContent = resumableState),-        (scriptConfig = importMap),+        (scriptConfig = onHeaders),         (bootstrapScriptContent.scriptResources[scriptConfig] = null),@@ -382,6 +382,6 @@         pushLinkImpl(bootstrapScriptContent, idPrefix),-        onHeaders.bootstrapScripts.add(bootstrapScriptContent),+        importMap.bootstrapScripts.add(bootstrapScriptContent),         externalRuntimeConfig.push(           '<script type="module" src="',-          escapeTextForBrowser(importMap)+          escapeTextForBrowser(onHeaders)         ),@@ -400,3 +400,3 @@         externalRuntimeConfig.push('" async="">\x3c/script>');-  return onHeaders;+  return importMap; }@@ -429,10 +429,2 @@ }-function createPreambleState() {-  return {-    htmlChunks: null,-    headChunks: null,-    bodyChunks: null,-    contribution: 0-  };-} function createFormatContext(insertionMode, selectedValue, tagScope) {@@ -447,5 +439,5 @@     "http://www.w3.org/2000/svg" === namespaceURI-      ? 4+      ? 3       : "http://www.w3.org/1998/Math/MathML" === namespaceURI-        ? 5+        ? 4         : 0,@@ -466,3 +458,3 @@     case "svg":-      return createFormatContext(4, null, parentContext.tagScope);+      return createFormatContext(3, null, parentContext.tagScope);     case "picture":@@ -470,3 +462,3 @@     case "math":-      return createFormatContext(5, null, parentContext.tagScope);+      return createFormatContext(4, null, parentContext.tagScope);     case "foreignObject":@@ -474,3 +466,3 @@     case "table":-      return createFormatContext(6, null, parentContext.tagScope);+      return createFormatContext(5, null, parentContext.tagScope);     case "thead":@@ -478,18 +470,17 @@     case "tfoot":+      return createFormatContext(6, null, parentContext.tagScope);+    case "colgroup":+      return createFormatContext(8, null, parentContext.tagScope);+    case "tr":       return createFormatContext(7, null, parentContext.tagScope);-    case "colgroup":-      return createFormatContext(9, null, parentContext.tagScope);-    case "tr":-      return createFormatContext(8, null, parentContext.tagScope);-    case "head":-      if (2 > parentContext.insertionMode)-        return createFormatContext(3, null, parentContext.tagScope);-      break;-    case "html":-      if (0 === parentContext.insertionMode)-        return createFormatContext(1, null, parentContext.tagScope);   }-  return 6 <= parentContext.insertionMode || 2 > parentContext.insertionMode+  return 5 <= parentContext.insertionMode     ? createFormatContext(2, null, parentContext.tagScope)-    : parentContext;+    : 0 === parentContext.insertionMode+      ? "html" === type+        ? createFormatContext(1, null, parentContext.tagScope)+        : createFormatContext(2, null, parentContext.tagScope)+      : 1 === parentContext.insertionMode+        ? createFormatContext(2, null, parentContext.tagScope)+        : parentContext; }@@ -923,25 +914,2 @@ }-function pushStartSingletonElement(target, props, tag) {-  target.push(startChunkForTag(tag));-  var innerHTML = (tag = null),-    propKey;-  for (propKey in props)-    if (hasOwnProperty.call(props, propKey)) {-      var propValue = props[propKey];-      if (null != propValue)-        switch (propKey) {-          case "children":-            tag = propValue;-            break;-          case "dangerouslySetInnerHTML":-            innerHTML = propValue;-            break;-          default:-            pushAttribute(target, propKey, propValue);-        }-    }-  target.push(">");-  pushInnerHTML(target, innerHTML, tag);-  return tag;-} function pushStartGenericElement(target, props, tag) {@@ -988,3 +956,2 @@   renderState,-  preambleState,   hoistableState,@@ -1468,3 +1435,3 @@       if (-        4 === formatContext.insertionMode ||+        3 === formatContext.insertionMode ||         formatContext.tagScope & 1 ||@@ -1487,3 +1454,3 @@       if (-        4 === formatContext.insertionMode ||+        3 === formatContext.insertionMode ||         formatContext.tagScope & 1 ||@@ -1569,3 +1536,3 @@         props.onError ||-        4 === formatContext.insertionMode ||+        3 === formatContext.insertionMode ||         formatContext.tagScope & 1 ||@@ -1610,3 +1577,3 @@       if (-        4 === formatContext.insertionMode ||+        3 === formatContext.insertionMode ||         formatContext.tagScope & 1 ||@@ -1713,3 +1680,3 @@       if (-        4 === formatContext.insertionMode ||+        3 === formatContext.insertionMode ||         formatContext.tagScope & 1 ||@@ -1832,3 +1799,2 @@           0 < headers.remainingCapacity &&-          "string" !== typeof props.srcSet &&           ("high" === props.fetchPriority ||@@ -1892,9 +1858,6 @@     case "head":-      if (2 > formatContext.insertionMode) {-        var preamble = preambleState || renderState.preamble;-        if (preamble.headChunks)-          throw Error("The `<head>` tag may only be rendered once.");-        preamble.headChunks = [];-        var JSCompiler_inline_result$jscomp$9 = pushStartSingletonElement(-          preamble.headChunks,+      if (2 > formatContext.insertionMode && null === renderState.headChunks) {+        renderState.headChunks = [];+        var JSCompiler_inline_result$jscomp$9 = pushStartGenericElement(+          renderState.headChunks,           props,@@ -1909,12 +1872,12 @@       return JSCompiler_inline_result$jscomp$9;-    case "body":-      if (2 > formatContext.insertionMode) {-        var preamble$jscomp$0 = preambleState || renderState.preamble;-        if (preamble$jscomp$0.bodyChunks)-          throw Error("The `<body>` tag may only be rendered once.");-        preamble$jscomp$0.bodyChunks = [];-        var JSCompiler_inline_result$jscomp$10 = pushStartSingletonElement(-          preamble$jscomp$0.bodyChunks,+    case "html":+      if (+        0 === formatContext.insertionMode &&+        null === renderState.htmlChunks+      ) {+        renderState.htmlChunks = ["<!DOCTYPE html>"];+        var JSCompiler_inline_result$jscomp$10 = pushStartGenericElement(+          renderState.htmlChunks,           props,-          "body"+          "html"         );@@ -1924,23 +1887,5 @@           props,-          "body"+          "html"         );       return JSCompiler_inline_result$jscomp$10;-    case "html":-      if (0 === formatContext.insertionMode) {
… 900 more lines (truncated)
cjs/react-dom-server.edge.development.js +527 lines
--- +++ @@ -852,3 +852,4 @@         startInlineScript: inlineScriptWithNonce,-        preamble: createPreambleState(),+        htmlChunks: null,+        headChunks: null,         externalRuntimeScript: null,@@ -1018,10 +1019,2 @@     }-    function createPreambleState() {-      return {-        htmlChunks: null,-        headChunks: null,-        bodyChunks: null,-        contribution: NoContribution-      };-    }     function createFormatContext(insertionMode, selectedValue, tagScope) {@@ -1096,22 +1089,12 @@           );-        case "head":-          if (parentContext.insertionMode < HTML_MODE)-            return createFormatContext(-              HTML_HEAD_MODE,-              null,-              parentContext.tagScope-            );-          break;-        case "html":-          if (parentContext.insertionMode === ROOT_HTML_MODE)-            return createFormatContext(-              HTML_HTML_MODE,-              null,-              parentContext.tagScope-            );       }-      return parentContext.insertionMode >= HTML_TABLE_MODE ||-        parentContext.insertionMode < HTML_MODE+      return parentContext.insertionMode >= HTML_TABLE_MODE         ? createFormatContext(HTML_MODE, null, parentContext.tagScope)-        : parentContext;+        : parentContext.insertionMode === ROOT_HTML_MODE+          ? "html" === type+            ? createFormatContext(HTML_HTML_MODE, null, parentContext.tagScope)+            : createFormatContext(HTML_MODE, null, parentContext.tagScope)+          : parentContext.insertionMode === HTML_HTML_MODE+            ? createFormatContext(HTML_MODE, null, parentContext.tagScope)+            : parentContext;     }@@ -1766,25 +1749,2 @@     }-    function pushStartSingletonElement(target, props, tag) {-      target.push(startChunkForTag(tag));-      var innerHTML = (tag = null),-        propKey;-      for (propKey in props)-        if (hasOwnProperty.call(props, propKey)) {-          var propValue = props[propKey];-          if (null != propValue)-            switch (propKey) {-              case "children":-                tag = propValue;-                break;-              case "dangerouslySetInnerHTML":-                innerHTML = propValue;-                break;-              default:-                pushAttribute(target, propKey, propValue);-            }-        }-      target.push(endOfStartTag);-      pushInnerHTML(target, innerHTML, tag);-      return tag;-    }     function pushStartGenericElement(target, props, tag) {@@ -1829,3 +1789,2 @@       renderState,-      preambleState,       hoistableState,@@ -2473,3 +2432,3 @@               ? console.error(-                  "React expects the `children` prop of <title> tags to be a string, number, bigint, or object with a novel `toString` method but found an Array with length %s instead. Browsers treat all child Nodes of <title> tags as Text content and React expects to be able to convert `children` of <title> tags to a single string value which is why Arrays of length greater than 1 are not supported. When using JSX it can be common to combine text nodes and value nodes. For example: <title>hello {nameOfUser}</title>. While not immediately apparent, `children` in this case is an Array with length 2. If your `children` prop is using this form try rewriting it using a template string: <title>{`hello ${nameOfUser}`}</title>.",+                  "React expects the `children` prop of <title> tags to be a string, number, bigint, or object with a novel `toString` method but found an Array with length %s instead. Browsers treat all child Nodes of <title> tags as Text content and React expects to be able to convert `children` of <title> tags to a single string value which is why Arrays of length greater than 1 are not supported. When using JSX it can be commong to combine text nodes and value nodes. For example: <title>hello {nameOfUser}</title>. While not immediately apparent, `children` in this case is an Array with length 2. If your `children` prop is using this form try rewriting it using a template string: <title>{`hello ${nameOfUser}`}</title>.",                   children$jscomp$6.length@@ -2938,3 +2897,2 @@               0 < headers.remainingCapacity &&-              "string" !== typeof props.srcSet &&               ("high" === props.fetchPriority ||@@ -2999,9 +2957,9 @@         case "head":-          if (formatContext.insertionMode < HTML_MODE) {-            var preamble = preambleState || renderState.preamble;-            if (preamble.headChunks)-              throw Error("The `<head>` tag may only be rendered once.");-            preamble.headChunks = [];-            var JSCompiler_inline_result$jscomp$9 = pushStartSingletonElement(-              preamble.headChunks,+          if (+            formatContext.insertionMode < HTML_MODE &&+            null === renderState.headChunks+          ) {+            renderState.headChunks = [];+            var JSCompiler_inline_result$jscomp$9 = pushStartGenericElement(+              renderState.headChunks,               props,@@ -3016,12 +2974,12 @@           return JSCompiler_inline_result$jscomp$9;-        case "body":-          if (formatContext.insertionMode < HTML_MODE) {-            var preamble$jscomp$0 = preambleState || renderState.preamble;-            if (preamble$jscomp$0.bodyChunks)-              throw Error("The `<body>` tag may only be rendered once.");-            preamble$jscomp$0.bodyChunks = [];-            var JSCompiler_inline_result$jscomp$10 = pushStartSingletonElement(-              preamble$jscomp$0.bodyChunks,+        case "html":+          if (+            formatContext.insertionMode === ROOT_HTML_MODE &&+            null === renderState.htmlChunks+          ) {+            renderState.htmlChunks = [doctypeChunk];+            var JSCompiler_inline_result$jscomp$10 = pushStartGenericElement(+              renderState.htmlChunks,               props,-              "body"+              "html"             );@@ -3031,23 +2989,5 @@               props,-              "body"+              "html"             );           return JSCompiler_inline_result$jscomp$10;-        case "html":-          if (formatContext.insertionMode === ROOT_HTML_MODE) {-            var preamble$jscomp$1 = preambleState || renderState.preamble;-            if (preamble$jscomp$1.htmlChunks)-              throw Error("The `<html>` tag may only be rendered once.");-            preamble$jscomp$1.htmlChunks = [doctypeChunk];-            var JSCompiler_inline_result$jscomp$11 = pushStartSingletonElement(-              preamble$jscomp$1.htmlChunks,-              props,-              "html"-            );-          } else-            JSCompiler_inline_result$jscomp$11 = pushStartGenericElement(-              target$jscomp$0,-              props,-              "html"-            );-          return JSCompiler_inline_result$jscomp$11;         default:@@ -3121,17 +3061,2 @@     }-    function hoistPreambleState(renderState, preambleState) {-      renderState = renderState.preamble;-      null === renderState.htmlChunks &&-        preambleState.htmlChunks &&-        ((renderState.htmlChunks = preambleState.htmlChunks),-        (preambleState.contribution |= 1));-      null === renderState.headChunks &&-        preambleState.headChunks &&-        ((renderState.headChunks = preambleState.headChunks),-        (preambleState.contribution |= 4));-      null === renderState.bodyChunks &&-        preambleState.bodyChunks &&-        ((renderState.bodyChunks = preambleState.bodyChunks),-        (preambleState.contribution |= 2));-    }     function writeBootstrap(destination, renderState) {@@ -3156,9 +3081,2 @@     }-    function writePreambleContribution(destination, preambleState) {-      preambleState = preambleState.contribution;-      preambleState !== NoContribution &&-        (writeChunk(destination, boundaryPreambleContributionChunkStart),-        writeChunk(destination, stringToChunk("" + preambleState)),-        writeChunk(destination, boundaryPreambleContributionChunkEnd));-    }     function writeStartSegment(destination, renderState, formatContext, id) {@@ -3167,3 +3085,2 @@         case HTML_HTML_MODE:-        case HTML_HEAD_MODE:         case HTML_MODE:@@ -3225,3 +3142,2 @@         case HTML_HTML_MODE:-        case HTML_HEAD_MODE:         case HTML_MODE:@@ -3632,2 +3548,4 @@           return "Fragment";+        case REACT_PORTAL_TYPE:+          return "Portal";         case REACT_PROFILER_TYPE:@@ -3640,4 +3558,2 @@           return "SuspenseList";-        case REACT_ACTIVITY_TYPE:-          return "Activity";       }@@ -3651,4 +3567,2 @@         ) {-          case REACT_PORTAL_TYPE:-            return "Portal";           case REACT_CONTEXT_TYPE:@@ -4329,23 +4243,2 @@     }-    function formatOwnerStack(error) {-      var prevPrepareStackTrace = Error.prepareStackTrace;-      Error.prepareStackTrace = prepareStackTrace;-      error = error.stack;-      Error.prepareStackTrace = prevPrepareStackTrace;-      error.startsWith("Error: react-stack-top-frame\n") &&-        (error = error.slice(29));-      prevPrepareStackTrace = error.indexOf("\n");-      -1 !== prevPrepareStackTrace &&-        (error = error.slice(prevPrepareStackTrace + 1));-      prevPrepareStackTrace = error.indexOf("react_stack_bottom_frame");-      -1 !== prevPrepareStackTrace &&-        (prevPrepareStackTrace = error.lastIndexOf(-          "\n",-          prevPrepareStackTrace-        ));-      if (-1 !== prevPrepareStackTrace)-        error = error.slice(0, prevPrepareStackTrace);-      else return "";-      return error;-    }     function describeComponentStackByType(type) {@@ -4354,3 +4247,3 @@         return type.prototype && type.prototype.isReactComponent-          ? describeNativeComponentFrame(type, !0)+          ? ((type = describeNativeComponentFrame(type, !0)), type)           : describeNativeComponentFrame(type, !1);@@ -4389,2 +4282,14 @@     }+    function getStackByComponentStackNode(componentStack) {+      try {+        var info = "";+        do+          (info += describeComponentStackByType(componentStack.type)),+            (componentStack = componentStack.parent);+        while (componentStack);+        return info;+      } catch (x) {+        return "\nError generating stack: " + x.message + "\n" + x.stack;+      }+    }     function defaultErrorHandler(error) {@@ -4445,3 +4350,3 @@       this.pendingRootTasks = this.allPendingTasks = this.nextSegmentId = 0;
… 1741 more lines (truncated)
cjs/react-dom-server.edge.production.js +258 lines
--- +++ @@ -51,6 +51,6 @@   REACT_SCOPE_TYPE = Symbol.for("react.scope"),-  REACT_ACTIVITY_TYPE = Symbol.for("react.activity"),+  REACT_DEBUG_TRACING_MODE_TYPE = Symbol.for("react.debug_trace_mode"),+  REACT_OFFSCREEN_TYPE = Symbol.for("react.offscreen"),   REACT_LEGACY_HIDDEN_TYPE = Symbol.for("react.legacy_hidden"),   REACT_MEMO_CACHE_SENTINEL = Symbol.for("react.memo_cache_sentinel"),-  REACT_VIEW_TRANSITION_TYPE = Symbol.for("react.view_transition"),   MAYBE_ITERATOR_SYMBOL = Symbol.iterator,@@ -415,3 +415,4 @@     startInlineScript: inlineScriptWithNonce,-    preamble: createPreambleState(),+    htmlChunks: null,+    headChunks: null,     externalRuntimeScript: null,@@ -582,10 +583,2 @@ }-function createPreambleState() {-  return {-    htmlChunks: null,-    headChunks: null,-    bodyChunks: null,-    contribution: 0-  };-} function createFormatContext(insertionMode, selectedValue, tagScope) {@@ -600,5 +593,5 @@     "http://www.w3.org/2000/svg" === namespaceURI-      ? 4+      ? 3       : "http://www.w3.org/1998/Math/MathML" === namespaceURI-        ? 5+        ? 4         : 0,@@ -619,3 +612,3 @@     case "svg":-      return createFormatContext(4, null, parentContext.tagScope);+      return createFormatContext(3, null, parentContext.tagScope);     case "picture":@@ -623,3 +616,3 @@     case "math":-      return createFormatContext(5, null, parentContext.tagScope);+      return createFormatContext(4, null, parentContext.tagScope);     case "foreignObject":@@ -627,3 +620,3 @@     case "table":-      return createFormatContext(6, null, parentContext.tagScope);+      return createFormatContext(5, null, parentContext.tagScope);     case "thead":@@ -631,18 +624,17 @@     case "tfoot":+      return createFormatContext(6, null, parentContext.tagScope);+    case "colgroup":+      return createFormatContext(8, null, parentContext.tagScope);+    case "tr":       return createFormatContext(7, null, parentContext.tagScope);-    case "colgroup":-      return createFormatContext(9, null, parentContext.tagScope);-    case "tr":-      return createFormatContext(8, null, parentContext.tagScope);-    case "head":-      if (2 > parentContext.insertionMode)-        return createFormatContext(3, null, parentContext.tagScope);-      break;-    case "html":-      if (0 === parentContext.insertionMode)-        return createFormatContext(1, null, parentContext.tagScope);   }-  return 6 <= parentContext.insertionMode || 2 > parentContext.insertionMode+  return 5 <= parentContext.insertionMode     ? createFormatContext(2, null, parentContext.tagScope)-    : parentContext;+    : 0 === parentContext.insertionMode+      ? "html" === type+        ? createFormatContext(1, null, parentContext.tagScope)+        : createFormatContext(2, null, parentContext.tagScope)+      : 1 === parentContext.insertionMode+        ? createFormatContext(2, null, parentContext.tagScope)+        : parentContext; }@@ -1172,25 +1164,2 @@ }-function pushStartSingletonElement(target, props, tag) {-  target.push(startChunkForTag(tag));-  var innerHTML = (tag = null),-    propKey;-  for (propKey in props)-    if (hasOwnProperty.call(props, propKey)) {-      var propValue = props[propKey];-      if (null != propValue)-        switch (propKey) {-          case "children":-            tag = propValue;-            break;-          case "dangerouslySetInnerHTML":-            innerHTML = propValue;-            break;-          default:-            pushAttribute(target, propKey, propValue);-        }-    }-  target.push(endOfStartTag);-  pushInnerHTML(target, innerHTML, tag);-  return tag;-} function pushStartGenericElement(target, props, tag) {@@ -1239,3 +1208,2 @@   renderState,-  preambleState,   hoistableState,@@ -1727,3 +1695,3 @@       if (-        4 === formatContext.insertionMode ||+        3 === formatContext.insertionMode ||         formatContext.tagScope & 1 ||@@ -1746,3 +1714,3 @@       if (-        4 === formatContext.insertionMode ||+        3 === formatContext.insertionMode ||         formatContext.tagScope & 1 ||@@ -1828,3 +1796,3 @@         props.onError ||-        4 === formatContext.insertionMode ||+        3 === formatContext.insertionMode ||         formatContext.tagScope & 1 ||@@ -1869,3 +1837,3 @@       if (-        4 === formatContext.insertionMode ||+        3 === formatContext.insertionMode ||         formatContext.tagScope & 1 ||@@ -1978,3 +1946,3 @@       if (-        4 === formatContext.insertionMode ||+        3 === formatContext.insertionMode ||         formatContext.tagScope & 1 ||@@ -2097,3 +2065,2 @@           0 < headers.remainingCapacity &&-          "string" !== typeof props.srcSet &&           ("high" === props.fetchPriority ||@@ -2157,9 +2124,6 @@     case "head":-      if (2 > formatContext.insertionMode) {-        var preamble = preambleState || renderState.preamble;-        if (preamble.headChunks)-          throw Error("The `<head>` tag may only be rendered once.");-        preamble.headChunks = [];-        var JSCompiler_inline_result$jscomp$9 = pushStartSingletonElement(-          preamble.headChunks,+      if (2 > formatContext.insertionMode && null === renderState.headChunks) {+        renderState.headChunks = [];+        var JSCompiler_inline_result$jscomp$9 = pushStartGenericElement(+          renderState.headChunks,           props,@@ -2174,12 +2138,12 @@       return JSCompiler_inline_result$jscomp$9;-    case "body":-      if (2 > formatContext.insertionMode) {-        var preamble$jscomp$0 = preambleState || renderState.preamble;-        if (preamble$jscomp$0.bodyChunks)-          throw Error("The `<body>` tag may only be rendered once.");-        preamble$jscomp$0.bodyChunks = [];-        var JSCompiler_inline_result$jscomp$10 = pushStartSingletonElement(-          preamble$jscomp$0.bodyChunks,+    case "html":+      if (+        0 === formatContext.insertionMode &&+        null === renderState.htmlChunks+      ) {+        renderState.htmlChunks = [doctypeChunk];+        var JSCompiler_inline_result$jscomp$10 = pushStartGenericElement(+          renderState.htmlChunks,           props,-          "body"+          "html"         );@@ -2189,23 +2153,5 @@           props,-          "body"+          "html"         );       return JSCompiler_inline_result$jscomp$10;-    case "html":-      if (0 === formatContext.insertionMode) {-        var preamble$jscomp$1 = preambleState || renderState.preamble;-        if (preamble$jscomp$1.htmlChunks)-          throw Error("The `<html>` tag may only be rendered once.");-        preamble$jscomp$1.htmlChunks = [doctypeChunk];-        var JSCompiler_inline_result$jscomp$11 = pushStartSingletonElement(-          preamble$jscomp$1.htmlChunks,-          props,-          "html"-        );-      } else-        JSCompiler_inline_result$jscomp$11 = pushStartGenericElement(-          target$jscomp$0,-          props,-          "html"-        );-      return JSCompiler_inline_result$jscomp$11;     default:@@ -2272,17 +2218,2 @@ }-function hoistPreambleState(renderState, preambleState) {-  renderState = renderState.preamble;-  null === renderState.htmlChunks &&-    preambleState.htmlChunks &&-    ((renderState.htmlChunks = preambleState.htmlChunks),-    (preambleState.contribution |= 1));-  null === renderState.headChunks &&-    preambleState.headChunks &&-    ((renderState.headChunks = preambleState.headChunks),-    (preambleState.contribution |= 4));-  null === renderState.bodyChunks &&-    preambleState.bodyChunks &&-    ((renderState.bodyChunks = preambleState.bodyChunks),-    (preambleState.contribution |= 2));-} function writeBootstrap(destination, renderState) {@@ -2326,12 +2257,2 @@   return writeChunkAndReturn(destination, startPendingSuspenseBoundary2);-}-var boundaryPreambleContributionChunkStart =-    stringToPrecomputedChunk("\x3c!--"),-  boundaryPreambleContributionChunkEnd = stringToPrecomputedChunk("--\x3e");-function writePreambleContribution(destination, preambleState) {-  preambleState = preambleState.contribution;-  0 !== preambleState &&-    (writeChunk(destination, boundaryPreambleContributionChunkStart),-    writeChunk(destination, stringToChunk("" + preambleState)),-    writeChunk(destination, boundaryPreambleContributionChunkEnd)); }@@ -2368,3 +2289,2 @@     case 1:-    case 3:     case 2:@@ -2376,3 +2296,3 @@       );-    case 4:+    case 3:       return (@@ -2383,3 +2303,3 @@       );-    case 5:+    case 4:       return (@@ -2390,3 +2310,3 @@       );-    case 6:
… 837 more lines (truncated)
cjs/react-dom-server.node.development.js +527 lines
--- +++ @@ -794,3 +794,4 @@         startInlineScript: inlineScriptWithNonce,-        preamble: createPreambleState(),+        htmlChunks: null,+        headChunks: null,         externalRuntimeScript: null,@@ -960,10 +961,2 @@     }-    function createPreambleState() {-      return {-        htmlChunks: null,-        headChunks: null,-        bodyChunks: null,-        contribution: NoContribution-      };-    }     function createFormatContext(insertionMode, selectedValue, tagScope) {@@ -1038,22 +1031,12 @@           );-        case "head":-          if (parentContext.insertionMode < HTML_MODE)-            return createFormatContext(-              HTML_HEAD_MODE,-              null,-              parentContext.tagScope-            );-          break;-        case "html":-          if (parentContext.insertionMode === ROOT_HTML_MODE)-            return createFormatContext(-              HTML_HTML_MODE,-              null,-              parentContext.tagScope-            );       }-      return parentContext.insertionMode >= HTML_TABLE_MODE ||-        parentContext.insertionMode < HTML_MODE+      return parentContext.insertionMode >= HTML_TABLE_MODE         ? createFormatContext(HTML_MODE, null, parentContext.tagScope)-        : parentContext;+        : parentContext.insertionMode === ROOT_HTML_MODE+          ? "html" === type+            ? createFormatContext(HTML_HTML_MODE, null, parentContext.tagScope)+            : createFormatContext(HTML_MODE, null, parentContext.tagScope)+          : parentContext.insertionMode === HTML_HTML_MODE+            ? createFormatContext(HTML_MODE, null, parentContext.tagScope)+            : parentContext;     }@@ -1693,25 +1676,2 @@     }-    function pushStartSingletonElement(target, props, tag) {-      target.push(startChunkForTag(tag));-      var innerHTML = (tag = null),-        propKey;-      for (propKey in props)-        if (hasOwnProperty.call(props, propKey)) {-          var propValue = props[propKey];-          if (null != propValue)-            switch (propKey) {-              case "children":-                tag = propValue;-                break;-              case "dangerouslySetInnerHTML":-                innerHTML = propValue;-                break;-              default:-                pushAttribute(target, propKey, propValue);-            }-        }-      target.push(endOfStartTag);-      pushInnerHTML(target, innerHTML, tag);-      return tag;-    }     function pushStartGenericElement(target, props, tag) {@@ -1756,3 +1716,2 @@       renderState,-      preambleState,       hoistableState,@@ -2392,3 +2351,3 @@               ? console.error(-                  "React expects the `children` prop of <title> tags to be a string, number, bigint, or object with a novel `toString` method but found an Array with length %s instead. Browsers treat all child Nodes of <title> tags as Text content and React expects to be able to convert `children` of <title> tags to a single string value which is why Arrays of length greater than 1 are not supported. When using JSX it can be common to combine text nodes and value nodes. For example: <title>hello {nameOfUser}</title>. While not immediately apparent, `children` in this case is an Array with length 2. If your `children` prop is using this form try rewriting it using a template string: <title>{`hello ${nameOfUser}`}</title>.",+                  "React expects the `children` prop of <title> tags to be a string, number, bigint, or object with a novel `toString` method but found an Array with length %s instead. Browsers treat all child Nodes of <title> tags as Text content and React expects to be able to convert `children` of <title> tags to a single string value which is why Arrays of length greater than 1 are not supported. When using JSX it can be commong to combine text nodes and value nodes. For example: <title>hello {nameOfUser}</title>. While not immediately apparent, `children` in this case is an Array with length 2. If your `children` prop is using this form try rewriting it using a template string: <title>{`hello ${nameOfUser}`}</title>.",                   children$jscomp$6.length@@ -2851,3 +2810,2 @@               0 < headers.remainingCapacity &&-              "string" !== typeof props.srcSet &&               ("high" === props.fetchPriority ||@@ -2912,9 +2870,9 @@         case "head":-          if (formatContext.insertionMode < HTML_MODE) {-            var preamble = preambleState || renderState.preamble;-            if (preamble.headChunks)-              throw Error("The `<head>` tag may only be rendered once.");-            preamble.headChunks = [];-            var JSCompiler_inline_result$jscomp$9 = pushStartSingletonElement(-              preamble.headChunks,+          if (+            formatContext.insertionMode < HTML_MODE &&+            null === renderState.headChunks+          ) {+            renderState.headChunks = [];+            var JSCompiler_inline_result$jscomp$9 = pushStartGenericElement(+              renderState.headChunks,               props,@@ -2929,12 +2887,12 @@           return JSCompiler_inline_result$jscomp$9;-        case "body":-          if (formatContext.insertionMode < HTML_MODE) {-            var preamble$jscomp$0 = preambleState || renderState.preamble;-            if (preamble$jscomp$0.bodyChunks)-              throw Error("The `<body>` tag may only be rendered once.");-            preamble$jscomp$0.bodyChunks = [];-            var JSCompiler_inline_result$jscomp$10 = pushStartSingletonElement(-              preamble$jscomp$0.bodyChunks,+        case "html":+          if (+            formatContext.insertionMode === ROOT_HTML_MODE &&+            null === renderState.htmlChunks+          ) {+            renderState.htmlChunks = [doctypeChunk];+            var JSCompiler_inline_result$jscomp$10 = pushStartGenericElement(+              renderState.htmlChunks,               props,-              "body"+              "html"             );@@ -2944,23 +2902,5 @@               props,-              "body"+              "html"             );           return JSCompiler_inline_result$jscomp$10;-        case "html":-          if (formatContext.insertionMode === ROOT_HTML_MODE) {-            var preamble$jscomp$1 = preambleState || renderState.preamble;-            if (preamble$jscomp$1.htmlChunks)-              throw Error("The `<html>` tag may only be rendered once.");-            preamble$jscomp$1.htmlChunks = [doctypeChunk];-            var JSCompiler_inline_result$jscomp$11 = pushStartSingletonElement(-              preamble$jscomp$1.htmlChunks,-              props,-              "html"-            );-          } else-            JSCompiler_inline_result$jscomp$11 = pushStartGenericElement(-              target$jscomp$0,-              props,-              "html"-            );-          return JSCompiler_inline_result$jscomp$11;         default:@@ -3032,17 +2972,2 @@     }-    function hoistPreambleState(renderState, preambleState) {-      renderState = renderState.preamble;-      null === renderState.htmlChunks &&-        preambleState.htmlChunks &&-        ((renderState.htmlChunks = preambleState.htmlChunks),-        (preambleState.contribution |= 1));-      null === renderState.headChunks &&-        preambleState.headChunks &&-        ((renderState.headChunks = preambleState.headChunks),-        (preambleState.contribution |= 4));-      null === renderState.bodyChunks &&-        preambleState.bodyChunks &&-        ((renderState.bodyChunks = preambleState.bodyChunks),-        (preambleState.contribution |= 2));-    }     function writeBootstrap(destination, renderState) {@@ -3067,9 +2992,2 @@     }-    function writePreambleContribution(destination, preambleState) {-      preambleState = preambleState.contribution;-      preambleState !== NoContribution &&-        (writeChunk(destination, boundaryPreambleContributionChunkStart),-        writeChunk(destination, "" + preambleState),-        writeChunk(destination, boundaryPreambleContributionChunkEnd));-    }     function writeStartSegment(destination, renderState, formatContext, id) {@@ -3078,3 +2996,2 @@         case HTML_HTML_MODE:-        case HTML_HEAD_MODE:         case HTML_MODE:@@ -3136,3 +3053,2 @@         case HTML_HTML_MODE:-        case HTML_HEAD_MODE:         case HTML_MODE:@@ -3538,2 +3454,4 @@           return "Fragment";+        case REACT_PORTAL_TYPE:+          return "Portal";         case REACT_PROFILER_TYPE:@@ -3546,4 +3464,2 @@           return "SuspenseList";-        case REACT_ACTIVITY_TYPE:-          return "Activity";       }@@ -3557,4 +3473,2 @@         ) {-          case REACT_PORTAL_TYPE:-            return "Portal";           case REACT_CONTEXT_TYPE:@@ -4232,23 +4146,2 @@     }-    function formatOwnerStack(error) {-      var prevPrepareStackTrace = Error.prepareStackTrace;-      Error.prepareStackTrace = prepareStackTrace;-      error = error.stack;-      Error.prepareStackTrace = prevPrepareStackTrace;-      error.startsWith("Error: react-stack-top-frame\n") &&-        (error = error.slice(29));-      prevPrepareStackTrace = error.indexOf("\n");-      -1 !== prevPrepareStackTrace &&-        (error = error.slice(prevPrepareStackTrace + 1));-      prevPrepareStackTrace = error.indexOf("react_stack_bottom_frame");-      -1 !== prevPrepareStackTrace &&-        (prevPrepareStackTrace = error.lastIndexOf(-          "\n",-          prevPrepareStackTrace-        ));-      if (-1 !== prevPrepareStackTrace)-        error = error.slice(0, prevPrepareStackTrace);-      else return "";-      return error;-    }     function describeComponentStackByType(type) {@@ -4257,3 +4150,3 @@         return type.prototype && type.prototype.isReactComponent-          ? describeNativeComponentFrame(type, !0)+          ? ((type = describeNativeComponentFrame(type, !0)), type)           : describeNativeComponentFrame(type, !1);@@ -4292,2 +4185,14 @@     }+    function getStackByComponentStackNode(componentStack) {+      try {+        var info = "";+        do+          (info += describeComponentStackByType(componentStack.type)),+            (componentStack = componentStack.parent);+        while (componentStack);+        return info;+      } catch (x) {+        return "\nError generating stack: " + x.message + "\n" + x.stack;+      }+    }     function defaultErrorHandler(error) {@@ -4348,3 +4253,3 @@       this.pendingRootTasks = this.allPendingTasks = this.nextSegmentId = 0;
… 1739 more lines (truncated)
cjs/react-dom-server.node.production.js +258 lines
--- +++ @@ -31,6 +31,6 @@   REACT_SCOPE_TYPE = Symbol.for("react.scope"),-  REACT_ACTIVITY_TYPE = Symbol.for("react.activity"),+  REACT_DEBUG_TRACING_MODE_TYPE = Symbol.for("react.debug_trace_mode"),+  REACT_OFFSCREEN_TYPE = Symbol.for("react.offscreen"),   REACT_LEGACY_HIDDEN_TYPE = Symbol.for("react.legacy_hidden"),   REACT_MEMO_CACHE_SENTINEL = Symbol.for("react.memo_cache_sentinel"),-  REACT_VIEW_TRANSITION_TYPE = Symbol.for("react.view_transition"),   MAYBE_ITERATOR_SYMBOL = Symbol.iterator,@@ -363,3 +363,4 @@     startInlineScript: inlineScriptWithNonce,-    preamble: createPreambleState(),+    htmlChunks: null,+    headChunks: null,     externalRuntimeScript: null,@@ -524,10 +525,2 @@ }-function createPreambleState() {-  return {-    htmlChunks: null,-    headChunks: null,-    bodyChunks: null,-    contribution: 0-  };-} function createFormatContext(insertionMode, selectedValue, tagScope) {@@ -542,5 +535,5 @@     "http://www.w3.org/2000/svg" === namespaceURI-      ? 4+      ? 3       : "http://www.w3.org/1998/Math/MathML" === namespaceURI-        ? 5+        ? 4         : 0,@@ -561,3 +554,3 @@     case "svg":-      return createFormatContext(4, null, parentContext.tagScope);+      return createFormatContext(3, null, parentContext.tagScope);     case "picture":@@ -565,3 +558,3 @@     case "math":-      return createFormatContext(5, null, parentContext.tagScope);+      return createFormatContext(4, null, parentContext.tagScope);     case "foreignObject":@@ -569,3 +562,3 @@     case "table":-      return createFormatContext(6, null, parentContext.tagScope);+      return createFormatContext(5, null, parentContext.tagScope);     case "thead":@@ -573,18 +566,17 @@     case "tfoot":+      return createFormatContext(6, null, parentContext.tagScope);+    case "colgroup":+      return createFormatContext(8, null, parentContext.tagScope);+    case "tr":       return createFormatContext(7, null, parentContext.tagScope);-    case "colgroup":-      return createFormatContext(9, null, parentContext.tagScope);-    case "tr":-      return createFormatContext(8, null, parentContext.tagScope);-    case "head":-      if (2 > parentContext.insertionMode)-        return createFormatContext(3, null, parentContext.tagScope);-      break;-    case "html":-      if (0 === parentContext.insertionMode)-        return createFormatContext(1, null, parentContext.tagScope);   }-  return 6 <= parentContext.insertionMode || 2 > parentContext.insertionMode+  return 5 <= parentContext.insertionMode     ? createFormatContext(2, null, parentContext.tagScope)-    : parentContext;+    : 0 === parentContext.insertionMode+      ? "html" === type+        ? createFormatContext(1, null, parentContext.tagScope)+        : createFormatContext(2, null, parentContext.tagScope)+      : 1 === parentContext.insertionMode+        ? createFormatContext(2, null, parentContext.tagScope)+        : parentContext; }@@ -1098,25 +1090,2 @@ }-function pushStartSingletonElement(target, props, tag) {-  target.push(startChunkForTag(tag));-  var innerHTML = (tag = null),-    propKey;-  for (propKey in props)-    if (hasOwnProperty.call(props, propKey)) {-      var propValue = props[propKey];-      if (null != propValue)-        switch (propKey) {-          case "children":-            tag = propValue;-            break;-          case "dangerouslySetInnerHTML":-            innerHTML = propValue;-            break;-          default:-            pushAttribute(target, propKey, propValue);-        }-    }-  target.push(endOfStartTag);-  pushInnerHTML(target, innerHTML, tag);-  return tag;-} function pushStartGenericElement(target, props, tag) {@@ -1165,3 +1134,2 @@   renderState,-  preambleState,   hoistableState,@@ -1645,3 +1613,3 @@       if (-        4 === formatContext.insertionMode ||+        3 === formatContext.insertionMode ||         formatContext.tagScope & 1 ||@@ -1664,3 +1632,3 @@       if (-        4 === formatContext.insertionMode ||+        3 === formatContext.insertionMode ||         formatContext.tagScope & 1 ||@@ -1746,3 +1714,3 @@         props.onError ||-        4 === formatContext.insertionMode ||+        3 === formatContext.insertionMode ||         formatContext.tagScope & 1 ||@@ -1787,3 +1755,3 @@       if (-        4 === formatContext.insertionMode ||+        3 === formatContext.insertionMode ||         formatContext.tagScope & 1 ||@@ -1890,3 +1858,3 @@       if (-        4 === formatContext.insertionMode ||+        3 === formatContext.insertionMode ||         formatContext.tagScope & 1 ||@@ -2009,3 +1977,2 @@           0 < headers.remainingCapacity &&-          "string" !== typeof props.srcSet &&           ("high" === props.fetchPriority ||@@ -2069,9 +2036,6 @@     case "head":-      if (2 > formatContext.insertionMode) {-        var preamble = preambleState || renderState.preamble;-        if (preamble.headChunks)-          throw Error("The `<head>` tag may only be rendered once.");-        preamble.headChunks = [];-        var JSCompiler_inline_result$jscomp$9 = pushStartSingletonElement(-          preamble.headChunks,+      if (2 > formatContext.insertionMode && null === renderState.headChunks) {+        renderState.headChunks = [];+        var JSCompiler_inline_result$jscomp$9 = pushStartGenericElement(+          renderState.headChunks,           props,@@ -2086,12 +2050,12 @@       return JSCompiler_inline_result$jscomp$9;-    case "body":-      if (2 > formatContext.insertionMode) {-        var preamble$jscomp$0 = preambleState || renderState.preamble;-        if (preamble$jscomp$0.bodyChunks)-          throw Error("The `<body>` tag may only be rendered once.");-        preamble$jscomp$0.bodyChunks = [];-        var JSCompiler_inline_result$jscomp$10 = pushStartSingletonElement(-          preamble$jscomp$0.bodyChunks,+    case "html":+      if (+        0 === formatContext.insertionMode &&+        null === renderState.htmlChunks+      ) {+        renderState.htmlChunks = [doctypeChunk];+        var JSCompiler_inline_result$jscomp$10 = pushStartGenericElement(+          renderState.htmlChunks,           props,-          "body"+          "html"         );@@ -2101,23 +2065,5 @@           props,-          "body"+          "html"         );       return JSCompiler_inline_result$jscomp$10;-    case "html":-      if (0 === formatContext.insertionMode) {-        var preamble$jscomp$1 = preambleState || renderState.preamble;-        if (preamble$jscomp$1.htmlChunks)-          throw Error("The `<html>` tag may only be rendered once.");-        preamble$jscomp$1.htmlChunks = [doctypeChunk];-        var JSCompiler_inline_result$jscomp$11 = pushStartSingletonElement(-          preamble$jscomp$1.htmlChunks,-          props,-          "html"-        );-      } else-        JSCompiler_inline_result$jscomp$11 = pushStartGenericElement(-          target$jscomp$0,-          props,-          "html"-        );-      return JSCompiler_inline_result$jscomp$11;     default:@@ -2184,17 +2130,2 @@ }-function hoistPreambleState(renderState, preambleState) {-  renderState = renderState.preamble;-  null === renderState.htmlChunks &&-    preambleState.htmlChunks &&-    ((renderState.htmlChunks = preambleState.htmlChunks),-    (preambleState.contribution |= 1));-  null === renderState.headChunks &&-    preambleState.headChunks &&-    ((renderState.headChunks = preambleState.headChunks),-    (preambleState.contribution |= 4));-  null === renderState.bodyChunks &&-    preambleState.bodyChunks &&-    ((renderState.bodyChunks = preambleState.bodyChunks),-    (preambleState.contribution |= 2));-} function writeBootstrap(destination, renderState) {@@ -2238,12 +2169,2 @@   return writeChunkAndReturn(destination, startPendingSuspenseBoundary2);-}-var boundaryPreambleContributionChunkStart =-    stringToPrecomputedChunk("\x3c!--"),-  boundaryPreambleContributionChunkEnd = stringToPrecomputedChunk("--\x3e");-function writePreambleContribution(destination, preambleState) {-  preambleState = preambleState.contribution;-  0 !== preambleState &&-    (writeChunk(destination, boundaryPreambleContributionChunkStart),-    writeChunk(destination, "" + preambleState),-    writeChunk(destination, boundaryPreambleContributionChunkEnd)); }@@ -2280,3 +2201,2 @@     case 1:-    case 3:     case 2:@@ -2288,3 +2208,3 @@       );-    case 4:+    case 3:       return (@@ -2295,3 +2215,3 @@       );-    case 5:+    case 4:       return (@@ -2302,3 +2222,3 @@       );-    case 6:
… 837 more lines (truncated)
cjs/react-dom.development.js +1 lines
--- +++ @@ -418,3 +418,3 @@     };-    exports.version = "19.1.7";+    exports.version = "19.0.6";     "undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ &&
cjs/react-dom.production.js +1 lines
--- +++ @@ -209,2 +209,2 @@ };-exports.version = "19.1.7";+exports.version = "19.0.6";
cjs/react-dom.react-server.development.js +1 lines
--- +++ @@ -338,3 +338,3 @@     };-    exports.version = "19.1.7";+    exports.version = "19.0.6";   })();
cjs/react-dom.react-server.production.js +1 lines
--- +++ @@ -151,2 +151,2 @@ };-exports.version = "19.1.7";+exports.version = "19.0.6";
package.json +3 lines
--- +++ @@ -2,3 +2,3 @@   "name": "react-dom",-  "version": "19.1.7",+  "version": "19.0.6",   "description": "React package for working with the DOM.",@@ -19,6 +19,6 @@   "dependencies": {-    "scheduler": "^0.26.0"+    "scheduler": "^0.25.0"   },   "peerDependencies": {-    "react": "^19.1.7"+    "react": "^19.0.6"   },
rollup npm
4.60.4 16d ago nominal
BURST ×38
latest 4.60.4 versions 934 maintainers 5
4.57.0
4.57.1
4.58.0
2.80.0
3.30.0
4.59.0
4.59.1
4.60.0
4.60.1
4.60.2
4.60.3
4.60.4
BURST
2 releases in 9m: 0.2.0, 0.2.1
info · registry-verified · 2015-05-17 · 11y ago
BURST
3 releases in 34m: 0.6.0, 0.6.1, 0.6.2
info · registry-verified · 2015-05-26 · 11y ago
BURST
2 releases in 5m: 0.6.3, 0.6.4
info · registry-verified · 2015-05-26 · 11y ago
BURST
2 releases in 53m: 0.7.4, 0.7.5
info · registry-verified · 2015-06-06 · 10y ago
BURST
2 releases in 41m: 0.9.0, 0.9.1
info · registry-verified · 2015-07-10 · 10y ago
BURST
3 releases in 39m: 0.17.1, 0.17.2, 0.17.3
info · registry-verified · 2015-09-30 · 10y ago
BURST
2 releases in 29m: 0.23.0, 0.23.1
info · registry-verified · 2015-12-30 · 10y ago
BURST
2 releases in 3m: 0.34.6, 0.34.7
info · registry-verified · 2016-08-07 · 9y ago
BURST
2 releases in 5m: 0.35.1, 0.35.2
info · registry-verified · 2016-09-10 · 9y ago
BURST
2 releases in 16m: 0.35.5, 0.35.6
info · registry-verified · 2016-09-10 · 9y ago
BURST
2 releases in 43m: 0.36.2, 0.36.3
info · registry-verified · 2016-10-09 · 9y ago
BURST
2 releases in 57m: 0.39.1, 0.39.2
info · registry-verified · 2016-12-30 · 9y ago
BURST
2 releases in 30m: 0.44.0, 0.45.0
info · registry-verified · 2017-07-10 · 8y ago
BURST
2 releases in 10m: 0.47.1, 0.47.2
info · registry-verified · 2017-08-12 · 8y ago
BURST
2 releases in 54m: 0.47.3, 0.47.4
info · registry-verified · 2017-08-13 · 8y ago
BURST
2 releases in 41m: 0.48.1, 0.48.2
info · registry-verified · 2017-08-20 · 8y ago
BURST
2 releases in 8m: 0.51.4, 0.51.5
info · registry-verified · 2017-11-11 · 8y ago
BURST
2 releases in 45m: 0.60.3, 0.60.4
info · registry-verified · 2018-06-13 · 7y ago
BURST
2 releases in 54m: 0.60.6, 0.60.7
info · registry-verified · 2018-06-14 · 7y ago
BURST
2 releases in 4m: 0.63.1, 0.63.2
info · registry-verified · 2018-07-18 · 7y ago
BURST
2 releases in 48m: 0.67.2, 0.67.3
info · registry-verified · 2018-11-17 · 7y ago
BURST
2 releases in 26m: 1.2.5, 1.3.0
info · registry-verified · 2019-02-26 · 7y ago
BURST
2 releases in 44m: 1.4.2, 1.5.0
info · registry-verified · 2019-03-07 · 7y ago
BURST
2 releases in 39m: 1.7.1, 1.7.2
info · registry-verified · 2019-03-24 · 7y ago
BURST
2 releases in 38m: 1.9.2, 1.9.3
info · registry-verified · 2019-04-10 · 7y ago
BURST
2 releases in 59m: 1.19.0, 1.19.1
info · registry-verified · 2019-08-05 · 6y ago
BURST
2 releases in 37m: 1.26.1, 1.26.2
info · registry-verified · 2019-10-31 · 6y ago
BURST
2 releases in 34m: 2.3.5, 2.4.0
info · registry-verified · 2020-04-09 · 6y ago
BURST
2 releases in 10m: 2.5.0, 2.6.0
info · registry-verified · 2020-04-10 · 6y ago
BURST
2 releases in 57m: 2.7.4, 2.7.5
info · registry-verified · 2020-04-29 · 6y ago
BURST
2 releases in 34m: 2.10.6, 2.10.7
info · registry-verified · 2020-05-22 · 6y ago
BURST
2 releases in 29m: 2.11.1, 2.11.2
info · registry-verified · 2020-05-28 · 6y ago
BURST
2 releases in 48m: 2.26.1, 2.26.2
info · registry-verified · 2020-08-16 · 5y ago
BURST
2 releases in 38m: 2.52.5, 2.52.6
info · registry-verified · 2021-07-01 · 4y ago
BURST
2 releases in 15m: 2.58.2, 2.58.3
info · registry-verified · 2021-10-25 · 4y ago
BURST
2 releases in 48m: 2.75.2, 2.75.3
info · registry-verified · 2022-05-29 · 4y ago
BURST
2 releases in 19m: 4.22.4, 3.29.5
info · registry-verified · 2024-09-21 · 1y ago
BURST
2 releases in 34m: 2.80.0, 3.30.0
info · registry-verified · 2026-02-22 · 3mo ago
release diff 4.60.3 → 4.60.4
+0 added · -0 removed · ~19 modified
dist/es/getLogFilter.js +2 lines
--- +++ @@ -2,4 +2,4 @@   @license-	Rollup.js v4.60.3-	Mon, 04 May 2026 15:33:41 GMT - commit b47bdabeccbb7aa1b1d4117f2f4a781a9f6de297+	Rollup.js v4.60.4+	Thu, 14 May 2026 17:52:21 GMT - commit d311a84b0bb4d4a6f50d19ffd2c29cca28660c88 
dist/es/parseAst.js +2 lines
--- +++ @@ -2,4 +2,4 @@   @license-	Rollup.js v4.60.3-	Mon, 04 May 2026 15:33:41 GMT - commit b47bdabeccbb7aa1b1d4117f2f4a781a9f6de297+	Rollup.js v4.60.4+	Thu, 14 May 2026 17:52:21 GMT - commit d311a84b0bb4d4a6f50d19ffd2c29cca28660c88 
dist/es/rollup.js +2 lines
--- +++ @@ -2,4 +2,4 @@   @license-	Rollup.js v4.60.3-	Mon, 04 May 2026 15:33:41 GMT - commit b47bdabeccbb7aa1b1d4117f2f4a781a9f6de297+	Rollup.js v4.60.4+	Thu, 14 May 2026 17:52:21 GMT - commit d311a84b0bb4d4a6f50d19ffd2c29cca28660c88 
dist/es/shared/node-entry.js +5 lines
--- +++ @@ -2,4 +2,4 @@   @license-	Rollup.js v4.60.3-	Mon, 04 May 2026 15:33:41 GMT - commit b47bdabeccbb7aa1b1d4117f2f4a781a9f6de297+	Rollup.js v4.60.4+	Thu, 14 May 2026 17:52:21 GMT - commit d311a84b0bb4d4a6f50d19ffd2c29cca28660c88 @@ -29,3 +29,3 @@ -var version = "4.60.3";+var version = "4.60.4"; @@ -18345,3 +18345,4 @@     let nameIndex = 0;-    for (const variable of exports) {+    const sortedExports = [...exports].sort((a, b) => a.name < b.name ? -1 : a.name > b.name ? 1 : 0);+    for (const variable of sortedExports) {         let [exportName] = variable.name;
dist/es/shared/parseAst.js +2 lines
--- +++ @@ -2,4 +2,4 @@   @license-	Rollup.js v4.60.3-	Mon, 04 May 2026 15:33:41 GMT - commit b47bdabeccbb7aa1b1d4117f2f4a781a9f6de297+	Rollup.js v4.60.4+	Thu, 14 May 2026 17:52:21 GMT - commit d311a84b0bb4d4a6f50d19ffd2c29cca28660c88 
dist/es/shared/watch.js +2 lines
--- +++ @@ -2,4 +2,4 @@   @license-	Rollup.js v4.60.3-	Mon, 04 May 2026 15:33:41 GMT - commit b47bdabeccbb7aa1b1d4117f2f4a781a9f6de297+	Rollup.js v4.60.4+	Thu, 14 May 2026 17:52:21 GMT - commit d311a84b0bb4d4a6f50d19ffd2c29cca28660c88 
dist/getLogFilter.js +2 lines
--- +++ @@ -2,4 +2,4 @@   @license-	Rollup.js v4.60.3-	Mon, 04 May 2026 15:33:41 GMT - commit b47bdabeccbb7aa1b1d4117f2f4a781a9f6de297+	Rollup.js v4.60.4+	Thu, 14 May 2026 17:52:21 GMT - commit d311a84b0bb4d4a6f50d19ffd2c29cca28660c88 
dist/loadConfigFile.js +2 lines
--- +++ @@ -2,4 +2,4 @@   @license-	Rollup.js v4.60.3-	Mon, 04 May 2026 15:33:41 GMT - commit b47bdabeccbb7aa1b1d4117f2f4a781a9f6de297+	Rollup.js v4.60.4+	Thu, 14 May 2026 17:52:21 GMT - commit d311a84b0bb4d4a6f50d19ffd2c29cca28660c88 
dist/parseAst.js +2 lines
--- +++ @@ -2,4 +2,4 @@   @license-	Rollup.js v4.60.3-	Mon, 04 May 2026 15:33:41 GMT - commit b47bdabeccbb7aa1b1d4117f2f4a781a9f6de297+	Rollup.js v4.60.4+	Thu, 14 May 2026 17:52:21 GMT - commit d311a84b0bb4d4a6f50d19ffd2c29cca28660c88 
dist/rollup.js +2 lines
--- +++ @@ -2,4 +2,4 @@   @license-	Rollup.js v4.60.3-	Mon, 04 May 2026 15:33:41 GMT - commit b47bdabeccbb7aa1b1d4117f2f4a781a9f6de297+	Rollup.js v4.60.4+	Thu, 14 May 2026 17:52:21 GMT - commit d311a84b0bb4d4a6f50d19ffd2c29cca28660c88 
dist/shared/fsevents-importer.js +2 lines
--- +++ @@ -2,4 +2,4 @@   @license-	Rollup.js v4.60.3-	Mon, 04 May 2026 15:33:41 GMT - commit b47bdabeccbb7aa1b1d4117f2f4a781a9f6de297+	Rollup.js v4.60.4+	Thu, 14 May 2026 17:52:21 GMT - commit d311a84b0bb4d4a6f50d19ffd2c29cca28660c88 
dist/shared/index.js +2 lines
--- +++ @@ -2,4 +2,4 @@   @license-	Rollup.js v4.60.3-	Mon, 04 May 2026 15:33:41 GMT - commit b47bdabeccbb7aa1b1d4117f2f4a781a9f6de297+	Rollup.js v4.60.4+	Thu, 14 May 2026 17:52:21 GMT - commit d311a84b0bb4d4a6f50d19ffd2c29cca28660c88 
dist/shared/loadConfigFile.js +2 lines
--- +++ @@ -2,4 +2,4 @@   @license-	Rollup.js v4.60.3-	Mon, 04 May 2026 15:33:41 GMT - commit b47bdabeccbb7aa1b1d4117f2f4a781a9f6de297+	Rollup.js v4.60.4+	Thu, 14 May 2026 17:52:21 GMT - commit d311a84b0bb4d4a6f50d19ffd2c29cca28660c88 
dist/shared/parseAst.js +2 lines
--- +++ @@ -2,4 +2,4 @@   @license-	Rollup.js v4.60.3-	Mon, 04 May 2026 15:33:41 GMT - commit b47bdabeccbb7aa1b1d4117f2f4a781a9f6de297+	Rollup.js v4.60.4+	Thu, 14 May 2026 17:52:21 GMT - commit d311a84b0bb4d4a6f50d19ffd2c29cca28660c88 
dist/shared/rollup.js +5 lines
--- +++ @@ -2,4 +2,4 @@   @license-	Rollup.js v4.60.3-	Mon, 04 May 2026 15:33:41 GMT - commit b47bdabeccbb7aa1b1d4117f2f4a781a9f6de297+	Rollup.js v4.60.4+	Thu, 14 May 2026 17:52:21 GMT - commit d311a84b0bb4d4a6f50d19ffd2c29cca28660c88 @@ -44,3 +44,3 @@ -var version = "4.60.3";+var version = "4.60.4"; @@ -19948,3 +19948,4 @@     let nameIndex = 0;-    for (const variable of exports) {+    const sortedExports = [...exports].sort((a, b) => a.name < b.name ? -1 : a.name > b.name ? 1 : 0);+    for (const variable of sortedExports) {         let [exportName] = variable.name;
dist/shared/watch-cli.js +2 lines
--- +++ @@ -2,4 +2,4 @@   @license-	Rollup.js v4.60.3-	Mon, 04 May 2026 15:33:41 GMT - commit b47bdabeccbb7aa1b1d4117f2f4a781a9f6de297+	Rollup.js v4.60.4+	Thu, 14 May 2026 17:52:21 GMT - commit d311a84b0bb4d4a6f50d19ffd2c29cca28660c88 
dist/shared/watch.js +2 lines
--- +++ @@ -2,4 +2,4 @@   @license-	Rollup.js v4.60.3-	Mon, 04 May 2026 15:33:41 GMT - commit b47bdabeccbb7aa1b1d4117f2f4a781a9f6de297+	Rollup.js v4.60.4+	Thu, 14 May 2026 17:52:21 GMT - commit d311a84b0bb4d4a6f50d19ffd2c29cca28660c88 
package.json +38 lines
--- +++ @@ -2,3 +2,3 @@   "name": "rollup",-  "version": "4.60.3",+  "version": "4.60.4",   "description": "Next-generation ES module bundler",@@ -116,27 +116,27 @@     "fsevents": "~2.3.2",-    "@rollup/rollup-darwin-arm64": "4.60.3",-    "@rollup/rollup-android-arm64": "4.60.3",-    "@rollup/rollup-win32-arm64-msvc": "4.60.3",-    "@rollup/rollup-freebsd-arm64": "4.60.3",-    "@rollup/rollup-linux-arm64-gnu": "4.60.3",-    "@rollup/rollup-linux-arm64-musl": "4.60.3",-    "@rollup/rollup-android-arm-eabi": "4.60.3",-    "@rollup/rollup-linux-arm-gnueabihf": "4.60.3",-    "@rollup/rollup-linux-arm-musleabihf": "4.60.3",-    "@rollup/rollup-win32-ia32-msvc": "4.60.3",-    "@rollup/rollup-linux-loong64-gnu": "4.60.3",-    "@rollup/rollup-linux-loong64-musl": "4.60.3",-    "@rollup/rollup-linux-riscv64-gnu": "4.60.3",-    "@rollup/rollup-linux-riscv64-musl": "4.60.3",-    "@rollup/rollup-linux-ppc64-gnu": "4.60.3",-    "@rollup/rollup-linux-ppc64-musl": "4.60.3",-    "@rollup/rollup-linux-s390x-gnu": "4.60.3",-    "@rollup/rollup-darwin-x64": "4.60.3",-    "@rollup/rollup-win32-x64-gnu": "4.60.3",-    "@rollup/rollup-win32-x64-msvc": "4.60.3",-    "@rollup/rollup-freebsd-x64": "4.60.3",-    "@rollup/rollup-linux-x64-gnu": "4.60.3",-    "@rollup/rollup-linux-x64-musl": "4.60.3",-    "@rollup/rollup-openbsd-x64": "4.60.3",-    "@rollup/rollup-openharmony-arm64": "4.60.3"+    "@rollup/rollup-darwin-arm64": "4.60.4",+    "@rollup/rollup-android-arm64": "4.60.4",+    "@rollup/rollup-win32-arm64-msvc": "4.60.4",+    "@rollup/rollup-freebsd-arm64": "4.60.4",+    "@rollup/rollup-linux-arm64-gnu": "4.60.4",+    "@rollup/rollup-linux-arm64-musl": "4.60.4",+    "@rollup/rollup-android-arm-eabi": "4.60.4",+    "@rollup/rollup-linux-arm-gnueabihf": "4.60.4",+    "@rollup/rollup-linux-arm-musleabihf": "4.60.4",+    "@rollup/rollup-win32-ia32-msvc": "4.60.4",+    "@rollup/rollup-linux-loong64-gnu": "4.60.4",+    "@rollup/rollup-linux-loong64-musl": "4.60.4",+    "@rollup/rollup-linux-riscv64-gnu": "4.60.4",+    "@rollup/rollup-linux-riscv64-musl": "4.60.4",+    "@rollup/rollup-linux-ppc64-gnu": "4.60.4",+    "@rollup/rollup-linux-ppc64-musl": "4.60.4",+    "@rollup/rollup-linux-s390x-gnu": "4.60.4",+    "@rollup/rollup-darwin-x64": "4.60.4",+    "@rollup/rollup-win32-x64-gnu": "4.60.4",+    "@rollup/rollup-win32-x64-msvc": "4.60.4",+    "@rollup/rollup-freebsd-x64": "4.60.4",+    "@rollup/rollup-linux-x64-gnu": "4.60.4",+    "@rollup/rollup-linux-x64-musl": "4.60.4",+    "@rollup/rollup-openbsd-x64": "4.60.4",+    "@rollup/rollup-openharmony-arm64": "4.60.4"   },@@ -160,3 +160,3 @@     "@jridgewell/sourcemap-codec": "^1.5.5",-    "@mermaid-js/mermaid-cli": "^11.12.0",+    "@mermaid-js/mermaid-cli": "^11.14.0",     "@napi-rs/cli": "3.4.1",@@ -177,3 +177,3 @@     "@types/yargs-parser": "^21.0.3",-    "@vue/language-server": "^3.2.7",+    "@vue/language-server": "^3.2.8",     "acorn": "^8.16.0",@@ -190,3 +190,3 @@     "es6-shim": "^0.35.8",-    "eslint": "^10.2.1",+    "eslint": "^10.3.0",     "eslint-config-prettier": "^10.1.8",@@ -199,3 +199,3 @@     "github-api": "^3.4.0",-    "globals": "^17.5.0",+    "globals": "^17.6.0",     "husky": "^9.1.7",@@ -218,6 +218,6 @@     "pretty-ms": "^9.3.0",-    "react": "^18.3.1",-    "react-dom": "^18.3.1",+    "react": "^19.2.5",+    "react-dom": "^19.2.5",     "requirejs": "^2.3.8",-    "rollup": "^4.60.2",+    "rollup": "^4.60.3",     "rollup-plugin-license": "^3.7.1",@@ -232,3 +232,3 @@     "typescript": "^5.9.3",-    "typescript-eslint": "^8.59.1",+    "typescript-eslint": "^8.59.2",     "vite": "^7.3.2",@@ -237,4 +237,4 @@     "vue-eslint-parser": "^10.4.0",-    "vue-tsc": "^3.2.7",-    "wasm-pack": "^0.14.0",+    "vue-tsc": "^3.2.8",+    "wasm-pack": "^0.13.1",     "yargs-parser": "^21.1.1"@@ -242,3 +242,3 @@   "overrides": {-    "axios": "^1.15.2",+    "axios": "^1.16.0",     "esbuild": ">0.24.2",@@ -246,3 +246,3 @@     "path-scurry": {-      "lru-cache": "^11.3.5"+      "lru-cache": ">=11.0.0"     },
webpack-cli npm
7.0.3 4d ago nominal
BURST ×8
latest 7.0.3 versions 129 maintainers 6
5.0.2
5.1.0
5.1.1
5.1.2
5.1.3
5.1.4
6.0.0
6.0.1
7.0.0
7.0.1
7.0.2
7.0.3
BURST
5 releases in 41m: 1.3.4, 1.3.5, 1.3.7, 1.3.8, 1.3.9
info · registry-verified · 2017-10-05 · 8y ago
BURST
2 releases in 47m: 1.4.1, 1.4.2
info · registry-verified · 2017-10-22 · 8y ago
BURST
2 releases in 30m: 1.4.3, 1.4.4
info · registry-verified · 2017-10-26 · 8y ago
BURST
2 releases in 25m: 1.4.7, 1.4.8
info · registry-verified · 2017-12-06 · 8y ago
BURST
2 releases in 32m: 1.5.1, 1.5.2
info · registry-verified · 2017-12-09 · 8y ago
BURST
2 releases in 4m: 2.0.3, 2.0.4
info · registry-verified · 2018-01-14 · 8y ago
BURST
2 releases in 24m: 2.1.1, 2.1.2
info · registry-verified · 2018-04-30 · 8y ago
BURST
2 releases in 54m: 3.2.2, 3.2.3
info · registry-verified · 2019-02-05 · 7y ago
release diff 7.0.2 → 7.0.3
+0 added · -0 removed · ~4 modified
bin/cli.js +9 lines · 1 flagged
--- +++ @@ -4,3 +4,11 @@ -const importLocal = require("import-local");+// Prefer the local installation of `webpack-cli` when one exists. Run this+// before requiring the (heavier) CLI implementation: a delegated run then never+// loads it, and `WEBPACK_CLI_SKIP_IMPORT_LOCAL` skips loading `import-local` too.+if (!process.env.WEBPACK_CLI_SKIP_IMPORT_LOCAL && require("import-local")(__filename)) {+  return;+}++process.title = "webpack";+ const WebpackCLI = require("../lib/webpack-cli").default;@@ -18,11 +26,2 @@ -if (-  !process.env.WEBPACK_CLI_SKIP_IMPORT_LOCAL && // Prefer the local installation of `webpack-cli`-  importLocal(__filename)-) {-  return;-}--process.title = "webpack";- // eslint-disable-next-line unicorn/prefer-top-level-await
lib/webpack-cli.d.ts +3 lines
--- +++ @@ -109,5 +109,7 @@ type Options = KnownOptions & RecordAny;+export declare function distance(first: string, second: string): number; declare class WebpackCLI {     #private;-    colors: Colors;+    get colors(): Colors;+    set colors(value: Colors);     logger: Logger;
lib/webpack-cli.js +364 lines
--- +++ @@ -5,2 +5,3 @@ Object.defineProperty(exports, "__esModule", { value: true });+exports.distance = distance; const node_fs_1 = __importDefault(require("node:fs"));@@ -10,3 +11,2 @@ const commander_1 = require("commander");-const fastest_levenshtein_1 = require("fastest-levenshtein"); const WEBPACK_PACKAGE_IS_CUSTOM = Boolean(process.env.WEBPACK_PACKAGE);@@ -26,2 +26,141 @@ const DEFAULT_WEBPACK_PACKAGES = ["webpack", "loader"];+// Options that get a single-character alias derived from their name.+const FLAGS_WITH_ALIAS = new Set(["devtool", "output-path", "target", "watch", "extends"]);+// Keys the CLI sets on the parsed options itself (never webpack arguments), so+// they don't need to be forwarded to webpack's `processArguments`.+const INTERNAL_OPTION_KEYS = new Set(["webpack", "argv", "isWatchingLikeCommand"]);+// Levenshtein distance via Myers' bit-parallel algorithm, used only for "did you+// mean" suggestions. Inspired by fastest-levenshtein (MIT,+// https://github.com/ka-weihe/fastest-levenshtein).+//+// The 256 KB buffer is allocated lazily on first use: suggestions only run on+// error paths, so a normal build never pays for it.+let levenshteinPeq;+function myers32(a, b, peq) {+    const n = a.length;+    const m = b.length;+    const lst = 1 << (n - 1);+    let pv = -1;+    let mv = 0;+    let sc = n;+    let i = n;+    while (i--) {+        peq[a.charCodeAt(i)] |= 1 << i;+    }+    for (i = 0; i < m; i++) {+        let eq = peq[b.charCodeAt(i)];+        const xv = eq | mv;+        eq |= ((eq & pv) + pv) ^ pv;+        mv |= ~(eq | pv);+        pv &= eq;+        if (mv & lst) {+            sc++;+        }+        if (pv & lst) {+            sc--;+        }+        mv = (mv << 1) | 1;+        pv = (pv << 1) | ~(xv | mv);+        mv &= xv;+    }+    i = n;+    while (i--) {+        peq[a.charCodeAt(i)] = 0;+    }+    return sc;+}+function myersX(longer, shorter, peq) {+    const n = shorter.length;+    const m = longer.length;+    const mhc = [];+    const phc = [];+    const horizontalSize = Math.ceil(n / 32);+    const verticalSize = Math.ceil(m / 32);+    for (let i = 0; i < horizontalSize; i++) {+        phc[i] = -1;+        mhc[i] = 0;+    }+    let j = 0;+    for (; j < verticalSize - 1; j++) {+        let mv = 0;+        let pv = -1;+        const start = j * 32;+        const verticalLen = Math.min(32, m) + start;+        for (let k = start; k < verticalLen; k++) {+            peq[longer.charCodeAt(k)] |= 1 << k;+        }+        for (let i = 0; i < n; i++) {+            const eq = peq[shorter.charCodeAt(i)];+            const pb = (phc[(i / 32) | 0] >>> i) & 1;+            const mb = (mhc[(i / 32) | 0] >>> i) & 1;+            const xv = eq | mv;+            const xh = ((((eq | mb) & pv) + pv) ^ pv) | eq | mb;+            let ph = mv | ~(xh | pv);+            let mh = pv & xh;+            if ((ph >>> 31) ^ pb) {+                phc[(i / 32) | 0] ^= 1 << i;+            }+            if ((mh >>> 31) ^ mb) {+                mhc[(i / 32) | 0] ^= 1 << i;+            }+            ph = (ph << 1) | pb;+            mh = (mh << 1) | mb;+            pv = mh | ~(xv | ph);+            mv = ph & xv;+        }+        for (let k = start; k < verticalLen; k++) {+            peq[longer.charCodeAt(k)] = 0;+        }+    }+    let mv = 0;+    let pv = -1;+    const start = j * 32;+    const verticalLen = Math.min(32, m - start) + start;+    for (let k = start; k < verticalLen; k++) {+        peq[longer.charCodeAt(k)] |= 1 << k;+    }+    let score = m;+    for (let i = 0; i < n; i++) {+        const eq = peq[shorter.charCodeAt(i)];+        const pb = (phc[(i / 32) | 0] >>> i) & 1;+        const mb = (mhc[(i / 32) | 0] >>> i) & 1;+        const xv = eq | mv;+        const xh = ((((eq | mb) & pv) + pv) ^ pv) | eq | mb;+        let ph = mv | ~(xh | pv);+        let mh = pv & xh;+        score += (ph >>> (m - 1)) & 1;+        score -= (mh >>> (m - 1)) & 1;+        if ((ph >>> 31) ^ pb) {+            phc[(i / 32) | 0] ^= 1 << i;+        }+        if ((mh >>> 31) ^ mb) {+            mhc[(i / 32) | 0] ^= 1 << i;+        }+        ph = (ph << 1) | pb;+        mh = (mh << 1) | mb;+        pv = mh | ~(xv | ph);+        mv = ph & xv;+    }+    for (let k = start; k < verticalLen; k++) {+        peq[longer.charCodeAt(k)] = 0;+    }+    return score;+}+// Levenshtein edit distance between two strings, used for "did you mean"+// suggestions. Exported only so it can be unit-tested directly; the CLI uses it+// through the private `WebpackCLI.#distance`.+function distance(first, second) {+    let a = first;+    let b = second;+    if (a.length < b.length) {+        const tmp = b;+        b = a;+        a = tmp;+    }+    if (b.length === 0) {+        return a.length;+    }+    levenshteinPeq ??= new Uint32Array(0x10000);+    return a.length <= 32 ? myers32(a, b, levenshteinPeq) : myersX(a, b, levenshteinPeq);+} class ConfigurationLoadingError extends Error {@@ -37,8 +176,18 @@ class WebpackCLI {-    colors;+    #colors;+    // Created lazily because `#createColors` loads the (large) webpack package,+    // which commands like `version`/`info` don't otherwise need.+    get colors() {+        return (this.#colors ??= this.#createColors());+    }+    set colors(value) {+        this.#colors = value;+    }     logger;     #isColorSupportChanged;+    // Flag tokens of the current invocation, used to register only the options+    // actually present (instead of all ~850) when setting up a command.+    #argvForParsing;     program;     constructor() {-        this.colors = this.#createColors();         this.logger = this.getLogger();@@ -88,2 +237,6 @@         return str.replaceAll(/([a-z0-9])([A-Z])/g, "$1-$2").toLowerCase();+    }+    // Levenshtein edit distance between two strings, for "did you mean" suggestions.+    static #distance(first, second) {+        return distance(first, second);     }@@ -322,17 +475,37 @@         if (options.options) {-            let commandOptions;-            if (forHelp &&-                !allDependenciesInstalled &&-                options.dependencies &&-                options.dependencies.length > 0) {-                commandOptions = [];-            }-            else if (typeof options.options === "function") {-                commandOptions = await options.options(command);-            }-            else {-                commandOptions = options.options;-            }-            for (const option of commandOptions) {-                this.makeOption(command, option);+            // Register every option for help, otherwise only the ones present in argv.+            const neededOptions = forHelp ? undefined : this.#neededOptionNames();+            // With no option flags in argv (e.g. a plain `webpack build`), nothing+            // needs to be registered and no unknown-option suggestions are possible,+            // so skip building the (large) option list entirely. This avoids the+            // schema-to-arguments walk on the most common invocation.+            if (!neededOptions || neededOptions.size > 0) {+                let commandOptions;+                if (forHelp &&+                    !allDependenciesInstalled &&+                    options.dependencies &&+                    options.dependencies.length > 0) {+                    commandOptions = [];+                }+                else if (typeof options.options === "function") {+                    commandOptions = await options.options(command);+                }+                else {+                    commandOptions = options.options;+                }+                // Keep all option names (including `no-` negated forms) for "did you mean" suggestions, since not every option is registered below.+                const allOptionNames = [];+                for (const option of commandOptions) {+                    allOptionNames.push(option.name);+                    if (this.#optionSupportsNegation(option)) {+                        allOptionNames.push(`no-${option.name}`);+                    }+                }+                command.allOptionNames = allOptionNames;+                for (const option of commandOptions) {+                    if (neededOptions && !this.#isOptionNeeded(option, neededOptions)) {+                        continue;+                    }+                    this.makeOption(command, option);+                }             }@@ -341,2 +514,54 @@         return command;+    }+    #neededOptionNames() {+        const argv = this.#argvForParsing;+        if (!argv) {+            return undefined;+        }+        const names = new Set();+        for (const token of argv) {+            // Must start with `-` to name an option.+            if (token.length < 2 || token.charCodeAt(0) !== 45) {+                continue;+            }+            if (token.charCodeAt(1) === 45) {+                // Long option: `--name` or `--name=value`.+                let name = token.slice(2);
… 256 more lines (truncated)
package.json +2 lines
--- +++ @@ -2,3 +2,3 @@   "name": "webpack-cli",-  "version": "7.0.2",+  "version": "7.0.3",   "description": "CLI for webpack & friends",@@ -33,3 +33,3 @@   "dependencies": {-    "@discoveryjs/json-ext": "^1.0.0",+    "@discoveryjs/json-ext": "^1.1.0",     "commander": "^14.0.3",@@ -37,3 +37,2 @@     "envinfo": "^7.14.0",-    "fastest-levenshtein": "^1.0.12",     "import-local": "^3.0.2",
pypi — by downloads
anyio pypi
4.13.0 2mo ago incident on record
YANKBURST ×2
latest 4.13.0 versions 67 maintainers 1
4.5.1
4.6.1
4.5.2
4.6.2
4.7.0
4.8.0
4.9.0
4.10.0
4.11.0
4.12.0
4.12.1
4.13.0
YANK
4.6.2 marked yanked (still downloadable)
high · registry-verified · 2024-10-13 · 1y ago
BURST
2 releases in 5m: 4.5.1, 4.6.1
info · registry-verified · 2024-10-13 · 1y ago
BURST
2 releases in 3m: 4.5.2, 4.6.2
info · registry-verified · 2024-10-13 · 1y ago
release diff 4.12.1 → 4.13.0
+1 added · -0 removed · ~36 modified
src/anyio/abc/_sockets.py +5 lines · 1 flagged
--- +++ @@ -4,3 +4,2 @@ import socket-import sys from abc import abstractmethod@@ -11,3 +10,3 @@ from socket import AddressFamily-from typing import Any, TypeVar, Union+from typing import Any, TypeAlias, TypeVar @@ -22,10 +21,5 @@ -if sys.version_info >= (3, 10):-    from typing import TypeAlias-else:-    from typing_extensions import TypeAlias--IPAddressType: TypeAlias = Union[str, IPv4Address, IPv6Address]+IPAddressType: TypeAlias = str | IPv4Address | IPv6Address IPSockAddrType: TypeAlias = tuple[str, int]-SockAddrType: TypeAlias = Union[IPSockAddrType, str]+SockAddrType: TypeAlias = IPSockAddrType | str UDPPacketType: TypeAlias = tuple[bytes, IPSockAddrType]@@ -168,4 +162,4 @@         if self._raw_socket.family in (AddressFamily.AF_INET, AddressFamily.AF_INET6):-            attributes[SocketAttribute.local_port] = (-                lambda: self._raw_socket.getsockname()[1]+            attributes[SocketAttribute.local_port] = lambda: (+                self._raw_socket.getsockname()[1]             )
tests/test_sockets.py +52 lines · 4 flagged
--- +++ @@ -10,2 +10,3 @@ import socket+import struct import sys@@ -555,2 +556,53 @@ +    async def test_receive_exception_cause_preserved(+        self, family: AnyIPAddressFamily, request: FixtureRequest+    ) -> None:+        """+        Test that when connection_lost is called with an exception, the resulting+        BrokenResourceError has the original exception as its __cause__.++        Regression test for https://github.com/agronholm/anyio/issues/1055.+        """+        server_sock = socket.create_server(("localhost", 0), family=family)+        request.addfinalizer(server_sock.close)+        server_sock.settimeout(1)+        server_addr = server_sock.getsockname()[:2]++        async with await connect_tcp(*server_addr) as stream:+            client_sock, _ = server_sock.accept()+            client_sock.setsockopt(+                socket.SOL_SOCKET, socket.SO_LINGER, struct.pack("ii", 1, 0)+            )+            client_sock.close()+            with pytest.raises(BrokenResourceError) as exc_info:+                await stream.receive()++            assert exc_info.value.__cause__ is not None++    async def test_send_exception_cause_preserved(+        self, family: AnyIPAddressFamily, request: FixtureRequest+    ) -> None:+        """+        Test that when connection_lost is called with an exception, the resulting+        BrokenResourceError from send() has the original exception as its __cause__.++        Regression test for https://github.com/agronholm/anyio/issues/1055.+        """+        server_sock = socket.create_server(("localhost", 0), family=family)+        request.addfinalizer(server_sock.close)+        server_sock.settimeout(1)+        server_addr = server_sock.getsockname()[:2]++        async with await connect_tcp(*server_addr) as stream:+            client_sock, _ = server_sock.accept()+            client_sock.setsockopt(+                socket.SOL_SOCKET, socket.SO_LINGER, struct.pack("ii", 1, 0)+            )+            client_sock.close()+            with pytest.raises(BrokenResourceError) as exc_info:+                for _ in range(1000):+                    await stream.send(b"foo")++            assert exc_info.value.__cause__ is not None+     async def test_connect_tcp_with_tls(
pyproject.toml +7 lines
--- +++ @@ -20,3 +20,2 @@     "Programming Language :: Python :: 3",-    "Programming Language :: Python :: 3.9",     "Programming Language :: Python :: 3.10",@@ -27,3 +26,3 @@ ]-requires-python = ">= 3.9"+requires-python = ">= 3.10" dependencies = [@@ -42,6 +41,3 @@ [project.optional-dependencies]-trio = [-    "trio >= 0.32.0; python_version >= '3.10'",-    "trio >= 0.31.0; python_version < '3.10'",-]+trio = ["trio >= 0.32.0"] @@ -54,9 +50,8 @@     "coverage[toml] >= 7",-    "exceptiongroup >= 1.2.0",     "hypothesis >= 4.18.2",     "psutil >= 5.9",-    "pytest >= 7.0",+    "pytest >= 8.4",     "pytest-mock >= 3.14",     "trustme >= 1.0.0",-    "truststore >= 0.9.1; python_version >= '3.10'",+    "truststore >= 0.9.1",     """\@@ -107,2 +102,3 @@ "tests/test_tempfile.py" = ["ASYNC230"]+"tests/*.py" = ["ASYNC240"] @@ -113,3 +109,3 @@ warn_return_any = false-disallow_untyped_decorators = false+files = ["src", "tests"] @@ -124,4 +120,2 @@     "ignore:unclosed transport <_ProactorSocketTransport.*:ResourceWarning",-    # Workaround for Python 3.9.7 (see https://bugs.python.org/issue45097)-    "ignore:The loop argument is deprecated since Python 3\\.8, and scheduled for removal in Python 3\\.10\\.:DeprecationWarning:asyncio", ]@@ -146,3 +140,3 @@ [tool.tox]-env_list = ["pre-commit", "py39", "py310", "py311", "py312", "py313", "py314", "pypy3", "only_asyncio"]+env_list = ["pre-commit", "py310", "py311", "py312", "py313", "py314", "pypy3", "only_asyncio"] skip_missing_interpreters = true
src/anyio/_backends/_asyncio.py +40 lines
--- +++ @@ -55,3 +55,3 @@     Any,-    Optional,+    ParamSpec,     TypeVar,@@ -80,3 +80,2 @@     WouldBlock,-    iterate_exceptions, )@@ -111,7 +110,2 @@ -if sys.version_info >= (3, 10):-    from typing import ParamSpec-else:-    from typing_extensions import ParamSpec- if sys.version_info >= (3, 11):@@ -500,13 +494,35 @@                 # Update cancelled_caught and check for exceptions we must not swallow-                cannot_swallow_exc_val = False-                if exc_val is not None:-                    for exc in iterate_exceptions(exc_val):-                        if isinstance(exc, CancelledError) and is_anyio_cancellation(-                            exc-                        ):-                            self._cancelled_caught = True-                        else:-                            cannot_swallow_exc_val = True--                return self._cancelled_caught and not cannot_swallow_exc_val+                if isinstance(exc_val, BaseExceptionGroup):+                    cancelleds_caught, remaining = exc_val.split(+                        lambda exc: (+                            isinstance(exc, CancelledError)+                            and is_anyio_cancellation(exc)+                        )+                    )++                    if cancelleds_caught is None:+                        return False++                    self._cancelled_caught = True++                    if remaining is None:+                        return True++                    context = remaining.__context__+                    try:+                        # Preserve __cause__ and __suppress_context__ by avoiding `raise+                        # ... from ...`+                        raise remaining+                    finally:+                        # Preserve __context__+                        remaining.__context__ = context+                        del context+                else:+                    if isinstance(exc_val, CancelledError) and is_anyio_cancellation(+                        exc_val+                    ):+                        self._cancelled_caught = True+                        return True+                    else:+                        return False             else:@@ -930,3 +946,3 @@ -_Retval_Queue_Type = tuple[Optional[T_Retval], Optional[BaseException]]+_Retval_Queue_Type = tuple[T_Retval | None, BaseException | None] @@ -1141,3 +1157,3 @@     for process in workers.copy():-        if process.returncode is None:+        if process.returncode is not None:             continue@@ -1194,4 +1210,3 @@         if exc:-            self.exception = BrokenResourceError()-            self.exception.__cause__ = exc+            self.exception = exc @@ -1279,3 +1294,3 @@                 elif self._protocol.exception:-                    raise self._protocol.exception from None+                    raise BrokenResourceError from self._protocol.exception                 else:@@ -1302,3 +1317,3 @@             elif self._protocol.exception is not None:-                raise self._protocol.exception+                raise BrokenResourceError from self._protocol.exception @@ -2245,2 +2260,3 @@         func: Callable[P, Awaitable[T_Retval]],+        /,         *args: P.args,
src/anyio/_backends/_trio.py +2 lines
--- +++ @@ -32,2 +32,3 @@     NoReturn,+    ParamSpec,     TypeVar,@@ -86,7 +87,2 @@ -if sys.version_info >= (3, 10):-    from typing import ParamSpec-else:-    from typing_extensions import ParamSpec- if sys.version_info >= (3, 11):@@ -889,2 +885,3 @@         func: Callable[P, Awaitable[T_Retval]],+        /,         *args: P.args,
src/anyio/_core/_fileio.py +12 lines
--- +++ @@ -303,2 +303,7 @@ +    if sys.version_info >= (3, 15):++        def __vfspath__(self) -> str:+            return self._path.__vfspath__()+     def __str__(self) -> str:@@ -563,4 +568,6 @@ -    def is_reserved(self) -> bool:-        return self._path.is_reserved()+    if sys.version_info < (3, 15):++        def is_reserved(self) -> bool:+            return self._path.is_reserved() @@ -786,10 +793,5 @@     ) -> int:-        # Path.write_text() does not support the "newline" parameter before Python 3.10-        def sync_write_text() -> int:-            with self._path.open(-                "w", encoding=encoding, errors=errors, newline=newline-            ) as fp:-                return fp.write(data)--        return await to_thread.run_sync(sync_write_text)+        return await to_thread.run_sync(+            self._path.write_text, data, encoding, errors, newline+        ) 
src/anyio/_core/_subprocesses.py +2 lines
--- +++ @@ -2,3 +2,2 @@ -import sys from collections.abc import AsyncIterable, Iterable, Mapping, Sequence@@ -7,3 +6,3 @@ from subprocess import PIPE, CalledProcessError, CompletedProcess-from typing import IO, Any, Union, cast+from typing import IO, Any, TypeAlias, cast @@ -13,8 +12,3 @@ -if sys.version_info >= (3, 10):-    from typing import TypeAlias-else:-    from typing_extensions import TypeAlias--StrOrBytesPath: TypeAlias = Union[str, bytes, "PathLike[str]", "PathLike[bytes]"]+StrOrBytesPath: TypeAlias = str | bytes | PathLike[str] | PathLike[bytes] 
src/anyio/_core/_synchronization.py +4 lines
--- +++ @@ -337,2 +337,6 @@                 self._waiters.remove(event)+            elif self._waiters:+                # This task was notified by could not act on it, so pass+                # it on to the next task+                self._waiters.popleft().set() 
src/anyio/_core/_tempfile.py +1 lines
--- +++ @@ -465,3 +465,2 @@     :param ignore_cleanup_errors: Whether to ignore errors during cleanup-        (Python 3.10+).     :param delete: Whether to delete the directory upon closing (Python 3.12+).@@ -491,6 +490,4 @@             "dir": self.dir,+            "ignore_cleanup_errors": self.ignore_cleanup_errors,         }-        if sys.version_info >= (3, 10):-            params["ignore_cleanup_errors"] = self.ignore_cleanup_errors-         if sys.version_info >= (3, 12):
src/anyio/abc/_eventloop.py +2 lines
--- +++ @@ -14,4 +14,4 @@     Any,+    TypeAlias,     TypeVar,-    Union,     overload,@@ -23,7 +23,2 @@     from typing_extensions import TypeVarTuple, Unpack--if sys.version_info >= (3, 10):-    from typing import TypeAlias-else:-    from typing_extensions import TypeAlias @@ -51,3 +46,3 @@ PosArgsT = TypeVarTuple("PosArgsT")-StrOrBytesPath: TypeAlias = Union[str, bytes, "PathLike[str]", "PathLike[bytes]"]+StrOrBytesPath: TypeAlias = str | bytes | PathLike[str] | PathLike[bytes] 
src/anyio/abc/_streams.py +14 lines
--- +++ @@ -2,6 +2,5 @@ -import sys from abc import ABCMeta, abstractmethod from collections.abc import Callable-from typing import Any, Generic, TypeVar, Union+from typing import Any, Generic, TypeAlias, TypeVar @@ -11,7 +10,2 @@ from ._tasks import TaskGroup--if sys.version_info >= (3, 10):-    from typing import TypeAlias-else:-    from typing_extensions import TypeAlias @@ -180,17 +174,17 @@ #: Type alias for all unreliable bytes-oriented receive streams.-AnyUnreliableByteReceiveStream: TypeAlias = Union[-    UnreliableObjectReceiveStream[bytes], ByteReceiveStream-]+AnyUnreliableByteReceiveStream: TypeAlias = (+    UnreliableObjectReceiveStream[bytes] | ByteReceiveStream+) #: Type alias for all unreliable bytes-oriented send streams.-AnyUnreliableByteSendStream: TypeAlias = Union[-    UnreliableObjectSendStream[bytes], ByteSendStream-]+AnyUnreliableByteSendStream: TypeAlias = (+    UnreliableObjectSendStream[bytes] | ByteSendStream+) #: Type alias for all unreliable bytes-oriented streams.-AnyUnreliableByteStream: TypeAlias = Union[UnreliableObjectStream[bytes], ByteStream]+AnyUnreliableByteStream: TypeAlias = UnreliableObjectStream[bytes] | ByteStream #: Type alias for all bytes-oriented receive streams.-AnyByteReceiveStream: TypeAlias = Union[ObjectReceiveStream[bytes], ByteReceiveStream]+AnyByteReceiveStream: TypeAlias = ObjectReceiveStream[bytes] | ByteReceiveStream #: Type alias for all bytes-oriented send streams.-AnyByteSendStream: TypeAlias = Union[ObjectSendStream[bytes], ByteSendStream]+AnyByteSendStream: TypeAlias = ObjectSendStream[bytes] | ByteSendStream #: Type alias for all bytes-oriented streams.-AnyByteStream: TypeAlias = Union[ObjectStream[bytes], ByteStream]+AnyByteStream: TypeAlias = ObjectStream[bytes] | ByteStream @@ -236,4 +230,4 @@ #: Type alias for all connectables returning bytestreams or bytes-oriented object streams-AnyByteStreamConnectable: TypeAlias = Union[-    ObjectStreamConnectable[bytes], ByteStreamConnectable-]+AnyByteStreamConnectable: TypeAlias = (+    ObjectStreamConnectable[bytes] | ByteStreamConnectable+)
src/anyio/functools.py +52 lines
--- +++ @@ -36,2 +36,3 @@ +from ._core._eventloop import current_time from ._core._synchronization import Lock@@ -50,3 +51,7 @@         AsyncLRUCacheWrapper[Any, Any],-        OrderedDict[Hashable, tuple[_InitialMissingType, Lock] | tuple[Any, None]],+        OrderedDict[+            Hashable,+            tuple[_InitialMissingType, Lock, float | None]+            | tuple[Any, None, float | None],+        ],     ]@@ -67,2 +72,3 @@     currsize: int+    ttl: int | None @@ -73,2 +79,3 @@     always_checkpoint: bool+    ttl: int | None @@ -104,2 +111,3 @@         always_checkpoint: bool,+        ttl: int | None,     ):@@ -112,2 +120,3 @@         self._always_checkpoint = always_checkpoint+        self._ttl = ttl         update_wrapper(self, func)@@ -115,3 +124,5 @@     def cache_info(self) -> AsyncCacheInfo:-        return AsyncCacheInfo(self._hits, self._misses, self._maxsize, self._currsize)+        return AsyncCacheInfo(+            self._hits, self._misses, self._maxsize, self._currsize, self._ttl+        ) @@ -122,2 +133,3 @@             "always_checkpoint": self._always_checkpoint,+            "ttl": self._ttl,         }@@ -160,19 +172,29 @@         try:-            cached_value, lock = cache_entry[key]+            cached_value, lock, expires_at = cache_entry[key]         except KeyError:             # We're the first task to call this function-            cached_value, lock = (+            cached_value, lock, expires_at = (                 initial_missing,                 Lock(fast_acquire=not self._always_checkpoint),+                None,             )-            cache_entry[key] = cached_value, lock+            cache_entry[key] = cached_value, lock, expires_at          if lock is None:-            # The value was already cached-            self._hits += 1-            cache_entry.move_to_end(key)-            if self._always_checkpoint:-                await checkpoint()--            return cast(T, cached_value)+            if expires_at is not None and current_time() >= expires_at:+                self._currsize -= 1+                cached_value, lock, expires_at = (+                    initial_missing,+                    Lock(fast_acquire=not self._always_checkpoint),+                    None,+                )+                cache_entry[key] = cached_value, lock, expires_at+            else:+                # The value was already cached+                self._hits += 1+                cache_entry.move_to_end(key)+                if self._always_checkpoint:+                    await checkpoint()++                return cast(T, cached_value) @@ -188,3 +210,6 @@                 value = await self.__wrapped__(*args, **kwargs)-                cache_entry[key] = value, None+                expires_at = (+                    current_time() + self._ttl if self._ttl is not None else None+                )+                cache_entry[key] = value, None, expires_at             else:@@ -206,3 +231,5 @@ class _LRUCacheWrapper(Generic[T]):-    def __init__(self, maxsize: int | None, typed: bool, always_checkpoint: bool):+    def __init__(+        self, maxsize: int | None, typed: bool, always_checkpoint: bool, ttl: int | None+    ):         self._maxsize = maxsize@@ -210,2 +237,3 @@         self._always_checkpoint = always_checkpoint+        self._ttl = ttl @@ -226,3 +254,3 @@             return AsyncLRUCacheWrapper(-                f, self._maxsize, self._typed, self._always_checkpoint+                f, self._maxsize, self._typed, self._always_checkpoint, self._ttl             )@@ -256,3 +284,7 @@ def lru_cache(-    *, maxsize: int | None = ..., typed: bool = ..., always_checkpoint: bool = ...+    *,+    maxsize: int | None = ...,+    typed: bool = ...,+    always_checkpoint: bool = ...,+    ttl: int | None = ..., ) -> _LRUCacheWrapper[Any]: ...@@ -277,2 +309,3 @@     always_checkpoint: bool = False,+    ttl: int | None = None, ) -> (@@ -288,2 +321,3 @@         guaranteed to yield control to the event loop at least once+    :param ttl: time in seconds after which to invalidate cache entries @@ -293,3 +327,3 @@     if func is None:-        return _LRUCacheWrapper[Any](maxsize, typed, always_checkpoint)+        return _LRUCacheWrapper[Any](maxsize, typed, always_checkpoint, ttl) @@ -298,3 +332,3 @@ -    return _LRUCacheWrapper[T](maxsize, typed, always_checkpoint)(func)+    return _LRUCacheWrapper[T](maxsize, typed, always_checkpoint, ttl)(func) 
src/anyio/pytest_plugin.py +62 lines
--- +++ @@ -2,2 +2,3 @@ +import dataclasses import socket@@ -10,4 +11,6 @@ import pytest-from _pytest.fixtures import SubRequest+from _pytest.fixtures import FuncFixtureInfo, SubRequest from _pytest.outcomes import Exit+from _pytest.python import CallSpec2+from _pytest.scope import Scope @@ -165,2 +168,60 @@ +def pytest_collection_finish(session: pytest.Session) -> None:+    for i, item in reversed(list(enumerate(session.items))):+        if (+            isinstance(item, pytest.Function)+            and iscoroutinefunction(item.function)+            and item.get_closest_marker("anyio") is not None+            and "anyio_backend" not in item.fixturenames+        ):+            new_items = []+            try:+                cs_fields = {f.name for f in dataclasses.fields(CallSpec2)}+            except TypeError:+                cs_fields = set()++            for param_index, backend in enumerate(get_available_backends()):+                if "_arg2scope" in cs_fields:  # pytest >= 8+                    callspec = CallSpec2(+                        params={"anyio_backend": backend},+                        indices={"anyio_backend": param_index},+                        _arg2scope={"anyio_backend": Scope.Module},+                        _idlist=[backend],+                        marks=[],+                    )+                else:  # pytest 7.x+                    callspec = CallSpec2(  # type: ignore[call-arg]+                        funcargs={},+                        params={"anyio_backend": backend},+                        indices={"anyio_backend": param_index},+                        arg2scope={"anyio_backend": Scope.Module},+                        idlist=[backend],+                        marks=[],+                    )++                fi = item._fixtureinfo+                new_names_closure = list(fi.names_closure)+                if "anyio_backend" not in new_names_closure:+                    new_names_closure.append("anyio_backend")++                new_fixtureinfo = FuncFixtureInfo(+                    argnames=fi.argnames,+                    initialnames=fi.initialnames,+                    names_closure=new_names_closure,+                    name2fixturedefs=fi.name2fixturedefs,+                )+                new_item = pytest.Function.from_parent(+                    item.parent,+                    name=f"{item.originalname}[{backend}]",+                    callspec=callspec,+                    callobj=item.obj,+                    fixtureinfo=new_fixtureinfo,+                    keywords=item.keywords,+                    originalname=item.originalname,+                )+                new_items.append(new_item)++            session.items[i : i + 1] = new_items++ @pytest.hookimpl(tryfirst=True)
src/anyio/streams/file.py +5 lines
--- +++ @@ -12,3 +12,3 @@ from pathlib import Path-from typing import Any, BinaryIO, cast+from typing import IO, Any @@ -27,3 +27,3 @@     #: the open file descriptor-    file: BinaryIO = typed_attribute()+    file: IO[bytes] = typed_attribute()     #: the path of the file on the file system, if available (file must be a real file)@@ -35,3 +35,3 @@ class _BaseFileStream:-    def __init__(self, file: BinaryIO):+    def __init__(self, file: IO[bytes]):         self._file = file@@ -78,3 +78,3 @@         file = await to_thread.run_sync(Path(path).open, "rb")-        return cls(cast(BinaryIO, file))+        return cls(file) @@ -145,3 +145,3 @@         file = await to_thread.run_sync(Path(path).open, mode)-        return cls(cast(BinaryIO, file))+        return cls(file) 
src/anyio/streams/tls.py +6 lines
--- +++ @@ -17,3 +17,3 @@ from ssl import SSLContext-from typing import Any, TypeVar+from typing import Any, TypeAlias, TypeVar @@ -35,7 +35,2 @@ )--if sys.version_info >= (3, 10):-    from typing import TypeAlias-else:-    from typing_extensions import TypeAlias @@ -281,5 +276,7 @@             TLSAttribute.server_side: lambda: self._ssl_object.server_side,-            TLSAttribute.shared_ciphers: lambda: self._ssl_object.shared_ciphers()-            if self._ssl_object.server_side-            else None,+            TLSAttribute.shared_ciphers: lambda: (+                self._ssl_object.shared_ciphers()+                if self._ssl_object.server_side+                else None+            ),             TLSAttribute.standard_compatible: lambda: self.standard_compatible,
src/anyio/to_thread.py +3 lines
--- +++ @@ -34,5 +34,5 @@ -    If the ``cancellable`` option is enabled and the task waiting for its completion is-    cancelled, the thread will still run its course but its return value (or any raised-    exception) will be ignored.+    If the ``abandon_on_cancel`` option is enabled and the task waiting for its+    completion is cancelled, the thread will still run its course but its+    return value (or any raised exception) will be ignored. 
tests/conftest.py +0 lines
--- +++ @@ -154,9 +154,3 @@ -    if sys.version_info < (3, 10):-        asyncio.set_event_loop(loop)-     yield loop--    if sys.version_info < (3, 10):-        asyncio.set_event_loop(None) 
tests/test_debugging.py +2 lines
--- +++ @@ -95,3 +95,3 @@     ]-    for task, expected_name in zip(task_infos, expected_names):+    for task, expected_name in zip(task_infos, expected_names, strict=True):         assert task.parent_id == host_task.id@@ -120,3 +120,3 @@ -    @asyncio.coroutine  # type: ignore[attr-defined]+    @asyncio.coroutine  # type: ignore[attr-defined, untyped-decorator]     def generator_part() -> Generator[object, BaseException, None]:
tests/test_fileio.py +4 lines
--- +++ @@ -303,2 +303,6 @@ +    @pytest.mark.skipif(+        sys.version_info >= (3, 15),+        reason="is_reserved() was removed in Python 3.15",+    )     @pytest.mark.filterwarnings("ignore::DeprecationWarning")
tests/test_functools.py +81 lines
--- +++ @@ -14,2 +14,4 @@     get_cancelled_exc_class,+    move_on_after,+    sleep,     wait_all_tasks_blocked,@@ -61,3 +63,3 @@     def test_cache_parameters(self) -> None:-        @lru_cache(maxsize=10, typed=True)+        @lru_cache(maxsize=10, typed=True, ttl=3)         async def func(x: int) -> int:@@ -69,2 +71,3 @@             "always_checkpoint": False,+            "ttl": 3,         }@@ -112,3 +115,3 @@         statistics = func.cache_info()-        assert statistics == (3, 2, 128, 2)+        assert statistics == (3, 2, 128, 2, None)         assert statistics.hits == 3@@ -119,3 +122,3 @@         func.cache_clear()-        assert func.cache_info() == (0, 0, 128, 0)+        assert func.cache_info() == (0, 0, 128, 0, None) @@ -282,2 +285,3 @@             "typed": False,+            "ttl": None,         }@@ -331,2 +335,76 @@ +    async def test_ttl_cache_hit(self) -> None:+        called = False++        @lru_cache(ttl=1)+        async def func() -> float:+            nonlocal called+            previous = called+            called = True+            await checkpoint()+            return previous++        assert not await func()+        # Should be a cache hit+        assert not await func()++        statistics = func.cache_info()+        assert statistics.hits == 1+        assert statistics.misses == 1+        assert statistics.currsize == 1+        assert statistics.ttl == 1++    async def test_ttl_expiration_evicts(self) -> None:+        called = False++        @lru_cache(ttl=1)+        async def func() -> bool:+            nonlocal called+            previous = called+            called = True+            await checkpoint()+            return previous++        # returns False+        assert not await func()+        # Should be a hit+        assert not await func()+        await sleep(1)+        # Should be a miss now+        assert await func()++        statistics = func.cache_info()+        assert statistics.hits == 1+        assert statistics.misses == 2+        assert statistics.currsize == 1+        assert statistics.ttl == 1++    @pytest.mark.parametrize("checkpoint", [False, True])+    async def test_ttl_contested_lock(self, checkpoint: bool) -> None:+        call_count = 0++        @lru_cache(ttl=1, always_checkpoint=checkpoint)+        async def sleeper(time: float) -> None:+            nonlocal call_count+            call_count += 1+            await sleep(time)++        async with create_task_group() as tg:+            for _ in range(100):+                tg.start_soon(sleeper, 0.1)++        assert call_count == 1++    @pytest.mark.parametrize("checkpoint", [False, True])+    async def test_ttl_sequential(self, checkpoint: bool) -> None:+        @lru_cache(ttl=1, always_checkpoint=checkpoint)+        async def sleeper(time: float) -> None:+            await sleep(time)++        with move_on_after(1) as scope:+            for _ in range(100):+                await sleeper(0.1)++        assert not scope.cancelled_caught+ 
tests/test_pytest_plugin.py +49 lines
--- +++ @@ -678 +678,50 @@                 sock.bind((addr, free_udp_port))+++def test_programmatic_anyio_mark(testdir: Pytester) -> None:+    """Test that the anyio marker added programmatically via pytest_collection_modifyitems+    causes the test to be run (regression test for issue #422)."""+    testdir.makeconftest(+        """+        import inspect+        import pytest+++        def pytest_collection_modifyitems(session, config, items):+            for item in items:+                if (+                    isinstance(item, pytest.Function)+                    and inspect.iscoroutinefunction(item.function)+                ):+                    item.add_marker(pytest.mark.anyio)+        """+    )+    testdir.makepyfile(+        """+        async def test_programmatically_marked():+            pass+        """+    )++    result = testdir.runpytest(*pytest_args)+    result.assert_outcomes(passed=len(get_available_backends()))+++def test_func_as_parametrize_param_name(testdir: Pytester) -> None:+    """+    Test that "func" can be used as a parameter name in+    `pytest.mark.parametrize` when using the pytest plugin.+    """+    testdir.makepyfile(+        """+        import pytest++        @pytest.mark.parametrize("func", [1])+        @pytest.mark.anyio+        async def test_func_as_parametrize_param_name(func: int) -> None:+            pass+        """+    )++    result = testdir.runpytest(*pytest_args)+    result.assert_outcomes(passed=len(get_available_backends()))
tests/test_synchronization.py +19 lines
--- +++ @@ -4,2 +4,3 @@ import sys+from contextlib import AbstractContextManager from typing import Any@@ -402,2 +403,20 @@ +    async def test_notification_handover_on_cancel(self) -> None:+        condition = Condition()++        async def acquirer(scope: AbstractContextManager[CancelScope]) -> None:+            with scope:+                async with condition:+                    await condition.wait()++        async with create_task_group() as tg:+            scope1 = CancelScope()+            scope2 = fail_after(3)+            tg.start_soon(acquirer, scope1)+            tg.start_soon(acquirer, scope2)+            await wait_all_tasks_blocked()+            async with condition:+                scope1.cancel()+                condition.notify(1)+     async def test_wait_no_lock(self) -> None:
tests/test_taskgroups.py +87 lines
--- +++ @@ -13,3 +13,2 @@ import pytest-from exceptiongroup import catch from pytest import FixtureRequest, MonkeyPatch@@ -1066,4 +1065,4 @@ -async def test_exception_group_filtering() -> None:-    """Test that CancelledErrors are filtered out of nested exception groups."""+async def test_nested_task_group_filtering() -> None:+    """Test that CancelledErrors are filtered out of nested exception groups from task groups.""" @@ -1090,2 +1089,82 @@     assert str(exc.value.exceptions[1].exceptions[0]) == "child task failed"+++async def test_exception_group_filtering() -> None:+    """+    Test that CancelledErrors are filtered out of exception groups containing other exceptions.++    See also test_reraise_cancelled_in_excgroup.+    """++    body_exc = RuntimeError()++    def check_body_exc(exc: RuntimeError, /) -> bool:+        return exc is body_exc++    with pytest.RaisesGroup(+        pytest.RaisesExc(RuntimeError, check=check_body_exc)+    ) as exc_info:+        with CancelScope() as cs:+            cs.cancel()+            try:+                raise body_exc+            except BaseException as exc:+                exceptions = [exc]++                try:+                    await checkpoint()+                except BaseException as exc2:+                    exceptions.append(exc2)+                else:+                    pytest.fail("Did not raise a cancellation exception")++                try:+                    original_group = BaseExceptionGroup("", exceptions)+                    raise original_group+                finally:+                    # Prevent reference cycles.+                    del exceptions++    assert exc_info.value.__cause__ == original_group.__cause__+    assert exc_info.value.__context__ == original_group.__context__+++async def test_nested_exception_group_filtering() -> None:+    """+    Test that CancelledErrors are filtered out of nested exception groups containing other exceptions.+    """++    body_exc = RuntimeError()++    def check_body_exc(exc: RuntimeError, /) -> bool:+        return exc is body_exc++    with pytest.RaisesGroup(+        pytest.RaisesGroup(pytest.RaisesExc(RuntimeError, check=check_body_exc))+    ) as exc_info:+        with CancelScope() as cs:+            cs.cancel()+            try:+                raise body_exc+            except BaseException as exc:+                exceptions = [exc]++                try:+                    await checkpoint()+                except BaseException as exc2:+                    exceptions.append(exc2)+                else:+                    pytest.fail("Did not raise a cancellation exception")++                try:+                    original_group = BaseExceptionGroup(+                        "", (BaseExceptionGroup("", exceptions),)+                    )+                    raise original_group+                finally:+                    # Prevent reference cycles.+                    del exceptions++    assert exc_info.value.__cause__ == original_group.__cause__+    assert exc_info.value.__context__ == original_group.__context__ @@ -1132,3 +1211,3 @@ -    @asyncio.coroutine  # type: ignore[attr-defined]+    @asyncio.coroutine  # type: ignore[attr-defined, untyped-decorator]     def generator_part() -> Generator[object, BaseException, None]:@@ -1153,3 +1232,3 @@ -    @asyncio.coroutine  # type: ignore[attr-defined]+    @asyncio.coroutine  # type: ignore[attr-defined, untyped-decorator]     def corofunc() -> Generator[Any, Any, None]:@@ -1552,9 +1631,8 @@ async def test_reraise_cancelled_in_excgroup() -> None:-    def handler(excgrp: BaseExceptionGroup) -> None:-        raise-     with CancelScope() as scope:         scope.cancel()-        with catch({get_cancelled_exc_class(): handler}):+        try:             await anyio.sleep_forever()+        except get_cancelled_exc_class() as exc:+            raise BaseExceptionGroup("", [exc]) from None 
tests/test_typedattr.py +2 lines
--- +++ @@ -2,4 +2,4 @@ -from collections.abc import Mapping-from typing import Any, Callable+from collections.abc import Callable, Mapping+from typing import Any 
attrs pypi
26.1.0 2mo ago incident on record
YANK
latest 26.1.0 versions 36 maintainers 1
22.1.0
22.2.0
23.1.0
23.2.0
24.1.0
24.2.0
24.3.0
25.1.0
25.2.0
25.3.0
25.4.0
26.1.0
YANK
21.1.0 marked yanked (still downloadable)
high · registry-verified · 2021-05-06 · 5y ago
release diff 25.4.0 → 26.1.0
+3 added · -2 removed · ~44 modified
bench/test_benchmarks.py +58 lines
--- +++ @@ -5,2 +5,5 @@ from __future__ import annotations++import functools+import time @@ -174 +177,56 @@         at(c)+++class TestCachedProperties:+    @attrs.define+    class Slotted:+        x: int = 0++        @functools.cached_property+        def cached(self):+            time.sleep(0.1)+            return 42++    @attrs.define(slots=False)+    class Unslotted:+        x: int = 0++        @functools.cached_property+        def cached(self):+            time.sleep(0.1)+            return 42++    def test_first_access(self):+        """+        Benchmark first access to a cached property (computation + storage).+        """+        for _ in range(ROUNDS):+            c = self.Slotted(42)+            _ = c.cached++    def test_repeated_access(self):+        """+        Benchmark repeated access to a cached property (should use stored+        value).+        """+        c = self.Slotted(42)+        _ = c.cached  # Prime the cache++        for _ in range(ROUNDS):+            _ = c.cached++    def test_create_cached_property_class(self):+        """+        Benchmark creating a class with a cached property+        """+        for _ in range(ROUNDS):++            @attrs.define+            class LocalC:+                x: int+                y: str+                z: dict[str, int]++                @functools.cached_property+                def cached(self):+                    return 42
pyproject.toml +10 lines
--- +++ @@ -131,2 +131,7 @@ [[tool.sponcon.sponsors]]+title = "Kraken Tech"+url = "https://kraken.tech/"+img = "Kraken.svg"++[[tool.sponcon.sponsors]] title = "Privacy Solutions"@@ -139,2 +144,7 @@ img = "FilePreviews.svg"++[[tool.sponcon.sponsors]]+title = "TestMu AI"+url = "https://www.testmuai.com/?utm_medium=sponsor&utm_source=structlog"+img = "TestMu-AI.svg" 
src/attr/_make.py +62 lines
--- +++ @@ -465,2 +465,11 @@ +    # Resolve default field alias before executing field_transformer, so that+    # the transformer receives fully populated Attribute objects with usable+    # alias values.+    for a in attrs:+        if not a.alias:+            # Evolve is very slow, so we hold our nose and do it dirty.+            _OBJ_SETATTR.__get__(a)("alias", _default_init_alias_for(a.name))+            _OBJ_SETATTR.__get__(a)("alias_is_default", True)+     if field_transformer is not None:@@ -482,9 +491,8 @@ -    # Resolve default field alias after executing field_transformer.-    # This allows field_transformer to differentiate between explicit vs-    # default aliases and supply their own defaults.+    # Resolve default field alias for any new attributes that the+    # field_transformer may have added without setting an alias.     for a in attrs:         if not a.alias:-            # Evolve is very slow, so we hold our nose and do it dirty.             _OBJ_SETATTR.__get__(a)("alias", _default_init_alias_for(a.name))+            _OBJ_SETATTR.__get__(a)("alias_is_default", True) @@ -571,3 +579,3 @@     """-    if isinstance(self, BaseException) and name in ("__notes__",):+    if isinstance(self, BaseException) and name == "__notes__":         BaseException.__delattr__(self, name)@@ -1098,5 +1106,3 @@     def add_replace(self):-        self._cls_dict["__replace__"] = self._add_method_dunders(-            lambda self, **changes: evolve(self, **changes)-        )+        self._cls_dict["__replace__"] = self._add_method_dunders(evolve)         return self@@ -1886,3 +1892,3 @@     """-    Return the tuple of *attrs* attributes for a class.+    Return the tuple of *attrs* attributes for a class or instance. @@ -1892,6 +1898,6 @@     Args:-        cls (type): Class to introspect.+        cls (type): Class or instance to introspect.      Raises:-        TypeError: If *cls* is not a class.+        TypeError: If *cls* is neither a class nor an *attrs* instance. @@ -1906,2 +1912,3 @@     .. versionchanged:: 23.1.0 Add support for generic classes.+    .. versionchanged:: 26.1.0 Add support for instances.     """@@ -1910,4 +1917,8 @@     if generic_base is None and not isinstance(cls, type):-        msg = "Passed object must be a class."-        raise TypeError(msg)+        type_ = type(cls)+        if getattr(type_, "__attrs_attrs__", None) is None:+            msg = "Passed object must be a class or attrs instance."+            raise TypeError(msg)++        return fields(type_) @@ -2018,3 +2029,3 @@         if a.on_setattr is not None:-            if frozen is True:+            if frozen is True and a.on_setattr is not setters.NO_OP:                 msg = "Frozen classes can't use on_setattr."@@ -2431,2 +2442,4 @@       any explicit overrides and default private-attribute-name handling.+    - ``alias_is_default`` (`bool`): Whether the ``alias`` was automatically+      generated (``True``) or explicitly provided by the user (``False``).     - ``inherited`` (`bool`): Whether or not that attribute has been inherited@@ -2456,2 +2469,3 @@     .. versionadded:: 22.2.0 *alias*+    .. versionadded:: 26.1.0 *alias_is_default* @@ -2480,2 +2494,3 @@         "alias",+        "alias_is_default",     )@@ -2502,2 +2517,3 @@         alias=None,+        alias_is_default=None,     ):@@ -2536,2 +2552,6 @@         bound_setattr("alias", alias)+        bound_setattr(+            "alias_is_default",+            alias is None if alias_is_default is None else alias_is_default,+        ) @@ -2571,2 +2591,3 @@             ca.alias,+            ca.alias is None,         )@@ -2588,2 +2609,16 @@         new._setattrs(changes.items())++        if "alias" in changes and "alias_is_default" not in changes:+            # Explicit alias provided -- no longer the default.+            _OBJ_SETATTR.__get__(new)("alias_is_default", False)+        elif (+            "name" in changes+            and "alias" not in changes+            # Don't auto-generate alias if the user picked picked the old one.+            and self.alias_is_default+        ):+            # Name changed, alias was auto-generated -- update it.+            _OBJ_SETATTR.__get__(new)(+                "alias", _default_init_alias_for(new.name)+            ) @@ -2605,2 +2640,13 @@         """+        if len(state) < len(self.__slots__):+            # Pre-26.1.0 pickle without alias_is_default -- infer it+            # heuristically.+            state_dict = dict(zip(self.__slots__, state))+            alias_is_default = state_dict.get(+                "alias"+            ) is None or state_dict.get("alias") == _default_init_alias_for(+                state_dict["name"]+            )+            state = (*state, alias_is_default)+         self._setattrs(zip(self.__slots__, state))@@ -2628,3 +2674,3 @@         validator=None,-        repr=True,+        repr=(name != "alias_is_default"),         cmp=None,@@ -3089,5 +3135,3 @@         else:-            self.__call__ = lambda value, instance, field: self.converter(-                value, instance, field-            )+            self.__call__ = self.converter 
src/attr/exceptions.py +4 lines
--- +++ @@ -3,4 +3,2 @@ from __future__ import annotations--from typing import ClassVar @@ -18,4 +16,6 @@ -    msg = "can't set attribute"-    args: ClassVar[tuple[str]] = [msg]+    def __init__(self):+        msg = "can't set attribute"+        super().__init__(msg)+        self.msg = msg 
src/attr/validators.py +4 lines
--- +++ @@ -81,3 +81,5 @@     .. versionadded:: 21.3.0-    """+    .. versionchanged:: 26.1.0 The contextmanager is nestable.+    """+    prev = get_run_validators()     set_run_validators(False)@@ -86,3 +88,3 @@     finally:-        set_run_validators(True)+        set_run_validators(prev) 
tests/test_functional.py +14 lines
--- +++ @@ -132,2 +132,3 @@                 inherited=False,+                alias_is_default=True,             ),@@ -145,2 +146,3 @@                 inherited=False,+                alias_is_default=True,             ),@@ -203,2 +205,3 @@                 inherited=False,+                alias_is_default=True,             ),@@ -216,2 +219,3 @@                 inherited=False,+                alias_is_default=True,             ),@@ -262,9 +266,16 @@ -        with pytest.raises(FrozenInstanceError) as e:+        with pytest.raises(+            FrozenInstanceError, match="can't set attribute"+        ) as e:             frozen.x = 2 -        with pytest.raises(FrozenInstanceError) as e:+        assert e.value.msg == e.value.args[0] == "can't set attribute"+        assert 1 == frozen.x++        with pytest.raises(+            FrozenInstanceError, match="can't set attribute"+        ) as e:             del frozen.x -        assert e.value.args[0] == "can't set attribute"+        assert e.value.msg == e.value.args[0] == "can't set attribute"         assert 1 == frozen.x
tests/test_hooks.py +145 lines
--- +++ @@ -180,3 +180,3 @@             "metadata=mappingproxy({'field_order': 1}), type='int', converter=None, "-            "kw_only=False, inherited=False, on_setattr=None, alias=None)",+            "kw_only=False, inherited=False, on_setattr=None, alias='x')",         ) == e.value.args@@ -234,2 +234,146 @@         assert ["x"] == [a.name for a in attr.fields(Base)]++    def test_hook_alias_available(self):+        """+        The field_transformer receives attributes with default aliases+        already resolved, not None.++        Regression test for #1479.+        """+        seen = []++        def hook(cls, attribs):+            seen[:] = [(a.name, a.alias, a.alias_is_default) for a in attribs]+            return attribs++        @attr.s(auto_attribs=True, field_transformer=hook)+        class C:+            _private: int+            _explicit: int = attr.ib(alias="_explicit")+            public: int++        assert [+            ("_private", "private", True),+            ("_explicit", "_explicit", False),+            ("public", "public", True),+        ] == seen++    def test_hook_evolve_name_updates_auto_alias(self):+        """+        When a field_transformer evolves a field's name, the alias is+        automatically updated if it was auto-generated.++        Regression test for #1479.+        """++        def hook(cls, attribs):+            return [a.evolve(name="renamed") for a in attribs]++        @attr.s(auto_attribs=True, field_transformer=hook)+        class C:+            _original: int++        f = attr.fields(C).renamed++        assert "renamed" == f.alias+        assert f.alias_is_default is True++    def test_hook_evolve_name_keeps_explicit_alias(self):+        """+        When a field_transformer evolves a field's name but the field had+        an explicit alias, the alias is preserved.++        Regression test for #1479.+        """++        def hook(cls, attribs):+            return [a.evolve(name="renamed") for a in attribs]++        @attr.s(auto_attribs=True, field_transformer=hook)+        class C:+            original: int = attr.ib(alias="my_alias")++        f = attr.fields(C).renamed++        assert "my_alias" == f.alias+        assert f.alias_is_default is False++    def test_hook_new_field_without_alias(self):+        """+        When a field_transformer adds a brand-new field without setting an+        alias, the post-transformer alias resolution fills it in.++        Regression test for #1479.+        """++        def hook(cls, attribs):+            return [+                *list(attribs),+                attr.Attribute(+                    name="_extra",+                    default=0,+                    validator=None,+                    repr=True,+                    cmp=None,+                    hash=None,+                    init=True,+                    metadata={},+                    type=int,+                    converter=None,+                    kw_only=False,+                    eq=True,+                    eq_key=None,+                    order=True,+                    order_key=None,+                    on_setattr=None,+                    alias=None,+                    inherited=False,+                ),+            ]++        @attr.s(auto_attribs=True, field_transformer=hook)+        class C:+            x: int++        f = attr.fields(C)._extra++        assert "extra" == f.alias+        assert f.alias_is_default is True++    def test_hook_explicit_alias_matching_default(self):+        """+        When a user explicitly sets an alias that happens to equal the+        auto-generated default, alias_is_default is still False.++        Regression test for #1479.+        """++        @attr.s(auto_attribs=True)+        class C:+            _private: int = attr.ib(alias="private")++        f = attr.fields(C)._private++        assert "private" == f.alias+        assert f.alias_is_default is False++    def test_hook_evolve_alias_sets_not_default(self):+        """+        When a field_transformer uses evolve() to set an explicit alias,+        alias_is_default becomes False.++        Regression test for #1479.+        """++        def hook(cls, attribs):+            return [a.evolve(alias="custom") for a in attribs]++        @attr.s(auto_attribs=True, field_transformer=hook)+        class C:+            x: int++        f = attr.fields(C).x++        assert "custom" == f.alias+        assert f.alias_is_default is False 
tests/test_make.py +113 lines
--- +++ @@ -11,3 +11,5 @@ import itertools+import pickle import sys+import types import unicodedata@@ -118,5 +120,3 @@ -    @pytest.mark.parametrize(-        "wrap", [lambda v: v, lambda v: [v], lambda v: and_(v)]-    )+    @pytest.mark.parametrize("wrap", [lambda v: v, lambda v: [v], and_])     def test_validator_decorator(self, wrap):@@ -247,3 +247,3 @@             "metadata=mappingproxy({}), type=None, converter=None, "-            "kw_only=False, inherited=False, on_setattr=None, alias=None)",+            "kw_only=False, inherited=False, on_setattr=None, alias='y')",         ) == e.value.args@@ -1552,8 +1552,15 @@         """-        Raises `TypeError` on non-classes.-        """-        with pytest.raises(TypeError) as e:-            fields(C())--        assert "Passed object must be a class." == e.value.args[0]+        Returns the class fields for *attrs* instances too.+        """+        assert fields(C()) is fields(C)++    def test_handler_non_attrs_instance(self):+        """+        Raises `TypeError` on non-*attrs* instances.+        """+        with pytest.raises(+            TypeError,+            match=r"Passed object must be a class or attrs instance\.",+        ):+            fields(object()) @@ -1777,5 +1784,3 @@         """-        C = make_class(-            "C", {"x": attr.ib(converter=lambda v: int(v))}, frozen=True-        )+        C = make_class("C", {"x": attr.ib(converter=int)}, frozen=True)         C("1")@@ -2391,2 +2396,97 @@ +    def test_alias_is_default(self):+        """+        alias_is_default is True for auto-generated aliases and False for+        explicitly provided ones -- even if the explicit value matches the+        auto-generated default.+        """++        @attrs.define+        class C:+            auto: int+            _private_auto: int+            explicit: int = attrs.field(alias="custom")+            _matches_default: int = attrs.field(alias="matches_default")++        fields = attr.fields_dict(C)++        assert fields["auto"].alias_is_default is True+        assert fields["_private_auto"].alias_is_default is True+        assert fields["explicit"].alias_is_default is False+        assert fields["_matches_default"].alias_is_default is False++    def test_alias_is_default_pickle_roundtrip(self):+        """+        alias_is_default survives pickle round-tripping.+        """++        @attrs.define+        class C:+            auto: int+            explicit: int = attrs.field(alias="custom")++        fields = attr.fields(C)++        for a in fields:+            restored = pickle.loads(pickle.dumps(a))++            assert a.alias == restored.alias+            assert a.alias_is_default == restored.alias_is_default++    X = (+        b"\x80\x05\x95_\x00\x00\x00\x00\x00\x00\x00\x8c\nattr._make\x94\x8c\tAttrib"+        b"ute\x94\x93\x94)\x81\x94(\x8c\x01x\x94h\x00\x8c\x08_Nothing\x94\x93"+        b"\x94K\x01\x85\x94R\x94N\x88\x88N\x88NN\x88}\x94\x8c\x08builtins\x94"+        b"\x8c\x03int\x94\x93\x94N\x89\x89Nh\x04t\x94b."+    )+    Y = (+        b"\x80\x05\x95b\x00\x00\x00\x00\x00\x00\x00\x8c\nattr._make\x94\x8c\tAttrib"+        b"ute\x94\x93\x94)\x81\x94(\x8c\x02_y\x94h\x00\x8c\x08_Nothing\x94"+        b"\x93\x94K\x01\x85\x94R\x94N\x88\x88N\x88NN\x88}\x94\x8c\x08builtins"+        b"\x94\x8c\x03int\x94\x93\x94N\x89\x89N\x8c\x01y\x94t\x94b."+    )+    Z = (+        b"\x80\x05\x95c\x00\x00\x00\x00\x00\x00\x00\x8c\nattr._make\x94\x8c\tAttrib"+        b"ute\x94\x93\x94)\x81\x94(\x8c\x01z\x94h\x00\x8c\x08_Nothing\x94\x93"+        b"\x94K\x01\x85\x94R\x94N\x88\x88N\x88NN\x88}\x94\x8c\x08builtins\x94"+        b"\x8c\x03int\x94\x93\x94N\x89\x89N\x8c\x03_z_\x94t\x94b."+    )++    @pytest.mark.parametrize(+        ("pickle_data", "name", "alias", "alias_is_default"),+        [+            (X, "x", "x", True),+            (Y, "_y", "y", True),+            (Z, "z", "_z_", False),+        ],+    )+    def test_can_unpickle_25_3_attributes(+        self, pickle_data, name, alias, alias_is_default+    ):+        """+        Can unpickle attributes created in 25.3.+        """++        assert Attribute(+            name=name,+            alias=alias,+            alias_is_default=alias_is_default,+            default=attrs.NOTHING,+            validator=None,+            repr=True,+            cmp=None,+            eq=True,+            eq_key=None,+            order=True,+            order_key=None,+            hash=None,+            init=True,+            metadata=types.MappingProxyType({}),+            type=int,+            converter=None,+            kw_only=False,+            inherited=False,+            on_setattr=None,+        ) == pickle.loads(pickle_data)+ 
tests/test_pyright.py +1 lines
--- +++ @@ -53,3 +53,3 @@             '"(self: DefineConverter, with_converter: str | Buffer | '-            'SupportsInt | SupportsIndex | SupportsTrunc) -> None"',+            'SupportsInt | SupportsIndex) -> None"',         ),
tests/test_setattr.py +10 lines
--- +++ @@ -223,2 +223,12 @@ +    @pytest.mark.parametrize("nop", [None, setters.NO_OP])+    def test_frozen_on_setattr_nops(self, nop):+        """+        on_setattr on frozen classes can be used for None and NO_OP.+        """++        @attr.s(frozen=True)+        class C:+            x = attr.ib(on_setattr=nop)+     def test_setattr_reset_if_no_custom_setattr(self, slots):
tests/test_validators.py +24 lines
--- +++ @@ -7,2 +7,3 @@ import re+import sys @@ -99,2 +100,18 @@ +    def test_disabled_ctx_nested(self):+        """+        Nested contextmanagers restore correct state.+        """+        assert _config._run_validators is True++        with validator_module.disabled():+            assert _config._run_validators is False++            with validator_module.disabled():+                assert _config._run_validators is False++            assert _config._run_validators is False++        assert _config._run_validators is True+ @@ -229,6 +246,9 @@ -        assert (-            "'func' must be one of None, fullmatch, match, search."-            == ei.value.args[0]-        )+        if sys.version_info >= (3, 15):+            errmsg = (+                "'func' must be one of None, fullmatch, prefixmatch, search."+            )+        else:+            errmsg = "'func' must be one of None, fullmatch, match, search."+        assert errmsg == ei.value.args[0] 
tests/utils.py +1 lines
--- +++ @@ -66,2 +66,3 @@         alias=_default_init_alias_for(name),+        alias_is_default=True,     )
typing-examples/baseline.py +9 lines
--- +++ @@ -94,2 +94,11 @@     num: int = attrs.field(validator=attrs.validators.ge(0))++[email protected]+class ValidatedOptionalOverTuple:+    num: int | None = attrs.field(+        validator=attrs.validators.optional(+            (attrs.validators.instance_of(int), attrs.validators.ge(0))  # ty:ignore [invalid-argument-type]+        )+    ) 
certifi pypi
2026.5.20 11d ago incident on record
critical-tier YANKBURST ×4
latest 2026.5.20 versions 74 maintainers 1 critical-tier (snapshotted)
2025.1.31
2025.4.26
2025.6.15
2025.7.9
2025.7.14
2025.8.3
2025.10.5
2025.11.12
2026.1.4
2026.2.25
2026.4.22
2026.5.20
YANK
2022.5.18 marked yanked (still downloadable)
high · registry-verified · 2022-05-18 · 4y ago
BURST
3 releases in 21m: 0.0.2, 0.0.3, 0.0.4
info · registry-verified · 2011-12-28 · 14y ago
BURST
2 releases in 2m: 0.0.5, 0.0.6
info · registry-verified · 2011-12-28 · 14y ago
BURST
2 releases in 39m: 2015.9.6, 2015.9.6.1
info · registry-verified · 2015-09-06 · 10y ago
BURST
2 releases in 4m: 2017.7.27, 2017.7.27.1
info · registry-verified · 2017-07-27 · 8y ago
release diff 2026.4.22 → 2026.5.20
+0 added · -0 removed · ~4 modified
certifi/__init__.py +1 lines
--- +++ @@ -3,2 +3,2 @@ __all__ = ["contents", "where"]-__version__ = "2026.04.22"+__version__ = "2026.05.20"
cffi pypi
2.0.0 8mo ago incident on record
YANKBURST ×3INSTALL-EXEC
latest 2.0.0 versions 78 maintainers 1
1.14.1
1.14.2
1.14.3
1.14.4
1.14.5
1.14.6
1.15.0
1.15.1
1.16.0
1.17.0
1.17.1
2.0.0
YANK
1.0.2 marked yanked (still downloadable)
high · registry-verified · 2015-05-25 · 11y ago
BURST
2 releases in 20m: 0.8.4, 0.8.5
info · registry-verified · 2014-07-05 · 11y ago
BURST
2 releases in 41m: 1.4.0, 1.4.1
info · registry-verified · 2015-12-17 · 10y ago
BURST
2 releases in 21m: 1.9.0, 1.9.1
info · registry-verified · 2016-11-12 · 9y ago
INSTALL-EXEC
setup.py in sdist uses subprocess/exec (runs at pip install)
warn · snapshot-derived
release diff 1.17.1 → 2.0.0
+0 added · -0 removed · ~76 modified
+24 more files not shown
testing/cffi0/test_zintegration.py +16 lines · 2 flagged
--- +++ @@ -2,2 +2,3 @@ import subprocess+import sysconfig import textwrap@@ -25,14 +26,13 @@ -        # Python 3.12 venv/virtualenv no longer include setuptools and wheel by default, which-        # breaks a number of these tests; ensure it's always present for 3.12+-        if sys.version_info >= (3, 12):-            subprocess.check_call([-                os.path.join(tmpdir, 'bin/python'),-                '-m',-                'pip',-                'install',-                'setuptools',-                'wheel',-                '--upgrade'-            ])+        # Newer venv/virtualenv no longer include setuptools and wheel by default, which+        # breaks a number of these tests; ensure they're always present+        subprocess.check_call([+            os.path.join(tmpdir, 'bin/python'),+            '-m',+            'pip',+            'install',+            'setuptools',+            'wheel',+            '--upgrade'+        ]) @@ -100,3 +100,3 @@         # subsequent runs will succeed because this test doesn't properly clean up the build- use pip for now.-        subprocess.check_call((vp, '-m', 'pip', 'install', '.'), env=env)+        subprocess.check_call((vp, '-m', 'pip', 'install', '.', '--no-build-isolation'), env=env)         subprocess.check_call((vp, str(python_f)), env=env)@@ -120,2 +120,3 @@ [email protected]_unsafe(reason="very slow in parallel") class TestZIntegration(object):@@ -181,3 +182,4 @@         orig_version = setuptools.__version__-        expecting_limited_api = not hasattr(sys, 'gettotalrefcount')+        # free-threaded Python does not yet support limited API+        expecting_limited_api = not hasattr(sys, 'gettotalrefcount') and not sysconfig.get_config_var("Py_GIL_DISABLED")         try:
demo/_curses.py +5 lines
--- +++ @@ -6,2 +6,7 @@ from _curses_cffi import ffi, lib++try:+    unicode+except NameError:+    unicode = str 
demo/api.py +1 lines
--- +++ @@ -48,3 +48,3 @@     def add1(n):-        print n+        print(n)         return n + 1
demo/bsdopendirtype.py +1 lines
--- +++ @@ -1 +1,2 @@+import os from _bsdopendirtype import ffi, lib
demo/btrfs-snap.py +2 lines
--- +++ @@ -5,2 +5,3 @@ """+from __future__ import print_function @@ -49,3 +50,3 @@ except IOError as e:-    print e+    print(e)     sys.exit(1)
demo/extern_python_varargs.py +5 lines
--- +++ @@ -1 +1,2 @@+from __future__ import print_function import cffi@@ -48,6 +49,6 @@         z = lib.fetch_int(va)-        print (x, y, z)+        print(x, y, z)     elif n == 1:         ptr = lib.fetch_ptr(va)-        print 'ptr to:', ffi.cast("int *", ptr)[0]+        print('ptr to:', ffi.cast("int *", ptr)[0])     elif n == 2:@@ -55,3 +56,3 @@         y = lib.fetch_double(va)-        print (x, y)+        print(x, y)     else:@@ -60,2 +61,2 @@ -print lib.my_algo(10)+print(lib.my_algo(10))
demo/fastcsv.py +2 lines
--- +++ @@ -1 +1,2 @@+from __future__ import print_function import csv@@ -265,2 +266,2 @@         for row in reader:-            print row+            print(row)
demo/gmp.py +4 lines
--- +++ @@ -1 +1,2 @@+from __future__ import print_function import sys@@ -10,3 +11,3 @@ except ImportError:-    print 'run gmp_build first, then make sure the shared object is on sys.path'+    print('run gmp_build first, then make sure the shared object is on sys.path')     sys.exit(1)@@ -24,3 +25,3 @@ if len(sys.argv) < 3:-    print 'call as %s bigint1, bigint2' % sys.argv[0]+    print('call as %s bigint1, bigint2' % sys.argv[0])     sys.exit(2)@@ -32,2 +33,2 @@ s = lib.mpz_get_str(ffi.NULL, 10, a)-print ffi.string(s)+print(ffi.string(s))
demo/manual2.py +8 lines
--- +++ @@ -1 +1,2 @@+from __future__ import print_function import _cffi_backend@@ -21,12 +22,12 @@ -print lib.stdout+print(lib.stdout) -print ffi.new("struct point_s *")-print ffi.offsetof("struct point_s", "x")-print ffi.offsetof("struct point_s", "y")-print ffi.new("struct point_s[CC]")+print(ffi.new("struct point_s *"))+print(ffi.offsetof("struct point_s", "x"))+print(ffi.offsetof("struct point_s", "y"))+print(ffi.new("struct point_s[CC]")) assert ffi.sizeof("struct point_s[CC]") == 2 * ffi.sizeof("struct point_s") -print ffi.cast("enum myenum_e", 2)-print ffi.cast("myint_t", -2)+print(ffi.cast("enum myenum_e", 2))+print(ffi.cast("myint_t", -2)) assert ffi.typeof("myint_t") == ffi.typeof("int")
demo/pwuid.py +2 lines
--- +++ @@ -1 +1,2 @@+from __future__ import print_function import sys, os@@ -6,2 +7,2 @@ -print ffi.string(lib.getpwuid(0).pw_name)+print(ffi.string(lib.getpwuid(0).pw_name))
demo/pyobj.py +3 lines
--- +++ @@ -1 +1,2 @@+from __future__ import print_function @@ -118,6 +119,6 @@     with Ref([10, 20, 30, 40]) as p_list:-        print lib.sum_integers(p_list)+        print(lib.sum_integers(p_list))         with Ref(5) as p_initial:             result = discard(lib.sum_objects(p_list, p_initial))-            print result+            print(result) 
demo/readdir.py +4 lines
--- +++ @@ -1 +1,2 @@+from __future__ import print_function # A Linux-only demo@@ -12,3 +13,3 @@ def walk(basefd, path):-    print '{', path+    print('{', path)     dirfd = lib.openat(basefd, path, 0)@@ -27,3 +28,3 @@         name = ffi.string(dirent.d_name)-        print '%3d %s' % (dirent.d_type, name)+        print('%3d %s' % (dirent.d_type, name))         if dirent.d_type == 4 and name != '.' and name != '..':@@ -31,3 +32,3 @@     lib.closedir(dir)-    print '}'+    print('}') 
demo/readdir2.py +4 lines
--- +++ @@ -1 +1,2 @@+from __future__ import print_function # A Linux-only demo, using set_source() instead of hard-coding the exact layouts@@ -12,3 +13,3 @@ def walk(basefd, path):-    print '{', path+    print('{', path)     dirfd = lib.openat(basefd, path, 0)@@ -27,3 +28,3 @@         name = ffi.string(dirent.d_name)-        print '%3d %s' % (dirent.d_type, name)+        print('%3d %s' % (dirent.d_type, name))         if dirent.d_type == lib.DT_DIR and name != '.' and name != '..':@@ -31,3 +32,3 @@     lib.closedir(dir)-    print '}'+    print('}') 
demo/readdir_ctypes.py +4 lines
--- +++ @@ -1 +1,2 @@+from __future__ import print_function # A Linux-only demo@@ -46,3 +47,3 @@ def walk(basefd, path):-    print '{', path+    print('{', path)     dirfd = openat(basefd, path, 0)@@ -61,3 +62,3 @@         name = dirent.d_name-        print '%3d %s' % (dirent.d_type, name)+        print('%3d %s' % (dirent.d_type, name))         if dirent.d_type == 4 and name != '.' and name != '..':@@ -65,3 +66,3 @@     closedir(dir)-    print '}'+    print('}') 
demo/recopendirtype.py +1 lines
--- +++ @@ -1 +1,2 @@+import os from _recopendirtype import ffi, lib
demo/winclipboard.py +2 lines
--- +++ @@ -1 +1,2 @@+from __future__ import print_function __author__ = "Israel Fruchter <[email protected]>"@@ -10,3 +11,3 @@ except ImportError:-    print 'run winclipboard_build first, then make sure the shared object is on sys.path'+    print('run winclipboard_build first, then make sure the shared object is on sys.path')     sys.exit(1)
doc/source/conf.py +3 lines
--- +++ @@ -40,3 +40,3 @@ project = u'CFFI'-copyright = u'2012-2018, Armin Rigo, Maciej Fijalkowski'+copyright = u'2012-2025, Armin Rigo, Maciej Fijalkowski' @@ -47,5 +47,5 @@ # The short X.Y version.-version = '1.17'+version = '2.0' # The full version, including alpha/beta/rc tags.-release = '1.17.1'+release = '2.0.0' 
pyproject.toml +44 lines
--- +++ @@ -7 +7,45 @@ build-backend = "setuptools.build_meta"++[project]+name = "cffi"+version = "2.0.0"+dependencies = [+    "pycparser; implementation_name != 'PyPy'",+]+requires-python = ">=3.9"++description = "Foreign Function Interface for Python calling C code."+readme = {file = "README.md", content-type = "text/markdown"}+license = "MIT"+classifiers = [+    "Programming Language :: Python",+    "Programming Language :: Python :: 3",+    "Programming Language :: Python :: 3.9",+    "Programming Language :: Python :: 3.10",+    "Programming Language :: Python :: 3.11",+    "Programming Language :: Python :: 3.12",+    "Programming Language :: Python :: 3.13",+    "Programming Language :: Python :: 3.14",+    "Programming Language :: Python :: Free Threading :: 2 - Beta",+    "Programming Language :: Python :: Implementation :: CPython",+]+authors = [+    {name = "Armin Rigo"},+    {name = "Maciej Fijalkowski"},+]+maintainers = [+    {name = "Matt Davis"},+    {name = "Matt Clay"},+    {name = "Matti Picus"},+]++[project.entry-points."distutils.setup_keywords"]+cffi_modules = "cffi.setuptools_ext:cffi_modules"++[project.urls]+Documentation = "https://cffi.readthedocs.io/"+Changelog = "https://cffi.readthedocs.io/en/latest/whatsnew.html"+Downloads = "https://github.com/python-cffi/cffi/releases"+Contact = "https://groups.google.com/forum/#!forum/python-cffi"+"Source Code" = "https://github.com/python-cffi/cffi"+"Issue Tracker" = "https://github.com/python-cffi/cffi/issues"
setup.cfg +0 lines
--- +++ @@ -1,12 +1 @@-[metadata]-license_file = LICENSE-license_files = LICENSE-project_urls = -	Documentation = http://cffi.readthedocs.org/-	Source Code = https://github.com/python-cffi/cffi-	Issue Tracker = https://github.com/python-cffi/cffi/issues-	Changelog = https://cffi.readthedocs.io/en/latest/whatsnew.html-	Downloads = https://github.com/python-cffi/cffi/releases-	Contact = https://groups.google.com/forum/#!forum/python-cffi- [egg_info]
setup.py +7 lines
--- +++ @@ -1,2 +1,2 @@-import sys, os, platform+import sys, sysconfig, os, platform import subprocess@@ -18,2 +18,8 @@ +FREE_THREADED_BUILD = bool(sysconfig.get_config_var('Py_GIL_DISABLED'))++if FREE_THREADED_BUILD and sys.version_info < (3, 14):+    raise RuntimeError("CFFI does not support the free-threaded build of CPython 3.13. "+                       "Upgrade to free-threaded 3.14 or newer to use CFFI with the "+                       "free-threaded build.") @@ -178,23 +184,3 @@ -    install_requires = []-    if cpython:-        install_requires.append('pycparser')-     setup(-        name='cffi',-        description='Foreign Function Interface for Python calling C code.',-        long_description="""-CFFI-====--Foreign Function Interface for Python calling C code.-Please see the `Documentation <http://cffi.readthedocs.org/>`_.--Contact----------`Mailing list <https://groups.google.com/forum/#!forum/python-cffi>`_-""",-        version='1.17.1',-        python_requires='>=3.8',         packages=['cffi'] if cpython else [],@@ -205,8 +191,2 @@         zip_safe=False,--        url='http://cffi.readthedocs.org',-        author='Armin Rigo, Maciej Fijalkowski',-        author_email='[email protected]',--        license='MIT', @@ -224,24 +204,2 @@         )] if cpython else [],--        install_requires=install_requires,--        entry_points = {-            "distutils.setup_keywords": [-                "cffi_modules = cffi.setuptools_ext:cffi_modules",-            ],-        },--        classifiers=[-            'Programming Language :: Python',-            'Programming Language :: Python :: 3',-            'Programming Language :: Python :: 3.8',-            'Programming Language :: Python :: 3.9',-            'Programming Language :: Python :: 3.10',-            'Programming Language :: Python :: 3.11',-            'Programming Language :: Python :: 3.12',-            'Programming Language :: Python :: 3.13',-            'Programming Language :: Python :: Implementation :: CPython',-            'Programming Language :: Python :: Implementation :: PyPy',-            'License :: OSI Approved :: MIT License',-        ],     )
src/c/test_c.py +27 lines
--- +++ @@ -65,5 +65,5 @@ import sys-assert __version__ == "1.17.1", ("This test_c.py file is for testing a version"-                                 " of cffi that differs from the one that we"-                                 " get from 'import _cffi_backend'")+assert __version__ == "2.0.0", ("This test_c.py file is for testing a version"+                                     " of cffi that differs from the one that we"+                                     " get from 'import _cffi_backend'") if sys.version_info < (3,):@@ -249,3 +249,3 @@     for name in ["float", "double"]:-        p = new_primitive_type(name + " _Complex")+        p = new_primitive_type("_cffi_" + name + "_complex_t")         assert bool(cast(p, 0)) is False@@ -1092,2 +1092,3 @@ [email protected]_unsafe(reason="_testfunc6 uses global state") def test_call_function_6():@@ -1248,3 +1249,3 @@     BFloat = new_primitive_type("float")-    BFloatComplex = new_primitive_type("float _Complex")+    BFloatComplex = new_primitive_type("_cffi_float_complex_t")     BFunc3 = new_function_type((BFloat, BFloat), BFloatComplex, False)@@ -1262,3 +1263,3 @@     BDouble = new_primitive_type("double")-    BDoubleComplex = new_primitive_type("double _Complex")+    BDoubleComplex = new_primitive_type("_cffi_double_complex_t")     BFunc3 = new_function_type((BDouble, BDouble), BDoubleComplex, False)@@ -1344,2 +1345,3 @@ [email protected]_unsafe(reason="writes to global state") def test_write_variable():@@ -1378,2 +1380,3 @@ [email protected]_unsafe("mocks sys.unraiseablehook") def test_callback_exception():@@ -2165,3 +2168,3 @@     newp(BStructPtr, [cast(BFunc, 0)])-    newp(BStructPtr, [cast(BCharP, 0)])+    pytest.raises(TypeError, newp, BStructPtr, [cast(BCharP, 0)])     pytest.raises(TypeError, newp, BStructPtr, [cast(BIntP, 0)])@@ -3287,2 +3290,3 @@ def test_new_handle_cycle():+    import gc     import _weakref@@ -3295,5 +3299,5 @@     del o-    for i in range(3):-        if wr() is not None:-            import gc; gc.collect()+    # free-threading requires more iterations to clear weakref+    while wr() is not None:+        gc.collect()     assert wr() is None@@ -4230,4 +4234,2 @@     import warnings-    assert __version__.startswith("1."), (-        "the warning will be an error if we ever release cffi 2.x")     BCharP = new_pointer_type(new_primitive_type("char"))@@ -4240,24 +4242,13 @@     z4 = cast(BUCharP, 0)-    with warnings.catch_warnings(record=True) as w:-        warnings.simplefilter("always")-        newp(new_pointer_type(BIntP), z1)    # warn-        assert len(w) == 1-        newp(new_pointer_type(BVoidP), z1)   # fine-        assert len(w) == 1-        newp(new_pointer_type(BCharP), z2)   # warn-        assert len(w) == 2-        newp(new_pointer_type(BVoidP), z2)   # fine-        assert len(w) == 2-        newp(new_pointer_type(BCharP), z3)   # fine-        assert len(w) == 2-        newp(new_pointer_type(BIntP), z3)    # fine-        assert len(w) == 2-        newp(new_pointer_type(BCharP), z4)   # fine (ignore signedness here)-        assert len(w) == 2-        newp(new_pointer_type(BUCharP), z1)  # fine (ignore signedness here)-        assert len(w) == 2-        newp(new_pointer_type(BUCharP), z3)  # fine-        assert len(w) == 2-    # check that the warnings are associated with lines in this file-    assert w[1].lineno == w[0].lineno + 4+    with pytest.raises(TypeError) as e1:+        newp(new_pointer_type(BIntP), z1)+    newp(new_pointer_type(BVoidP), z1)   # fine+    with pytest.raises(TypeError) as e2:+        newp(new_pointer_type(BCharP), z2)+    newp(new_pointer_type(BVoidP), z2)   # fine+    newp(new_pointer_type(BCharP), z3)   # fine+    newp(new_pointer_type(BIntP), z3)    # fine+    newp(new_pointer_type(BCharP), z4)   # fine (ignore signedness here)+    newp(new_pointer_type(BUCharP), z1)  # fine (ignore signedness here)+    newp(new_pointer_type(BUCharP), z3)  # fine @@ -4538,5 +4529,5 @@     for name in ['short', 'int', 'long', 'long long', 'float', 'double',-                 'float _Complex', 'double _Complex']:+                 '_cffi_float_complex_t', '_cffi_double_complex_t']:         p = new_primitive_type(name)-        if name.endswith(' _Complex'):+        if name.endswith('_complex_t'):             num = cast(p, 1.23 - 4.56j)
src/cffi/__init__.py +2 lines
--- +++ @@ -7,4 +7,4 @@ -__version__ = "1.17.1"-__version_info__ = (1, 17, 1)+__version__ = "2.0.0"+__version_info__ = (2, 0, 0) 
src/cffi/cparser.py +1 lines
--- +++ @@ -61,3 +61,3 @@     # tree.  The issue only occurs if there are several stars in-    # sequence with no parenthesis inbetween, just possibly qualifiers.+    # sequence with no parenthesis in between, just possibly qualifiers.     # Attempt to fix it by adding some parentheses in the source: each
src/cffi/recompiler.py +5 lines
--- +++ @@ -1,2 +1,2 @@-import os, sys, io+import io, os, sys, sysconfig from . import ffiplatform, model@@ -9,5 +9,5 @@ -USE_LIMITED_API = (sys.platform != 'win32' or sys.version_info < (3, 0) or-                   sys.version_info >= (3, 5))-+USE_LIMITED_API = ((sys.platform != 'win32' or sys.version_info < (3, 0) or+                   sys.version_info >= (3, 5)) and+                   not sysconfig.get_config_var("Py_GIL_DISABLED"))  # free-threaded doesn't yet support limited API @@ -955,3 +955,3 @@                 elif named_ptr is not None:-                    offset = '((char *)&((%s)4096)->%s) - (char *)4096' % (+                    offset = '(size_t)(((char *)&((%s)4096)->%s) - (char *)4096)' % (                         named_ptr.name, fldname)
src/cffi/setuptools_ext.py +13 lines
--- +++ @@ -2,2 +2,3 @@ import sys+import sysconfig @@ -89,2 +90,3 @@     """+    from cffi._shimmed_dist_utils import log     from cffi import recompiler@@ -103,2 +105,13 @@             kwds['py_limited_api'] = True++    if sysconfig.get_config_var("Py_GIL_DISABLED"):+        if kwds.get('py_limited_api'):+            log.info("Ignoring py_limited_api=True for free-threaded build.")++        kwds['py_limited_api'] = False++    if kwds.get('py_limited_api') is False:+        # avoid setting Py_LIMITED_API if py_limited_api=False+        # which _cffi_include.h does unless _CFFI_NO_LIMITED_API is defined+        kwds.setdefault("define_macros", []).append(("_CFFI_NO_LIMITED_API", None))     return kwds
click pypi
8.4.1 9d ago incident on record
YANKBURST
latest 8.4.1 versions 63 maintainers 1
8.1.6
8.1.7
8.1.8
8.2.0
8.2.1
8.2.2
8.3.0
8.3.1
8.3.2
8.3.3
8.4.0
8.4.1
YANK
8.2.2 marked yanked (still downloadable)
high · registry-verified · 2025-08-02 · 10mo ago
BURST
2 releases in 5m: 0.5, 0.5.1
info · registry-verified · 2014-05-06 · 12y ago
release diff 8.4.0 → 8.4.1
+2 added · -2 removed · ~24 modified
pyproject.toml +7 lines
--- +++ @@ -2,3 +2,3 @@ name = "click"-version = "8.4.0"+version = "8.4.1" description = "Composable command line interface toolkit"@@ -142,3 +142,8 @@     "W",  # pycodestyle warning-]+    "ICN", #flake8-import-conventions (ICN)+]++[tool.ruff.lint.flake8-import-conventions.aliases]+# Declare the default aliases.+typing = "t" 
src/click/_compat.py +1 lines
--- +++ @@ -14,2 +14,3 @@ WIN = sys.platform.startswith("win")+MAC = sys.platform == "darwin" auto_wrap_for_ansi: t.Callable[[t.TextIO], t.TextIO] | None = None
src/click/_termui_impl.py +23 lines
--- +++ @@ -608,2 +608,17 @@ +class _SkipClose:+    def __init__(self, stream: t.IO[t.Any]) -> None:+        self.stream = stream++    def __getattr__(self, name: str) -> t.Any:+        return getattr(self.stream, name)++    @property+    def buffer(self) -> t.BinaryIO:+        return _SkipClose(self.stream.buffer)  # type: ignore[attr-defined, return-value]++    def close(self) -> None:+        pass++ @contextlib.contextmanager@@ -612,7 +627,12 @@ ) -> t.Iterator[tuple[t.TextIO, str, bool]]:-    """Simply print unformatted text.  This is the ultimate fallback."""+    """Simply print unformatted text. This is the ultimate fallback. Don't close the+    output stream in this case, since it's coming from elsewhere rather than our+    internal helpers.+    """     encoding = get_best_encoding(stream)+     if color is None:         color = False-    yield stream, encoding, color++    yield _SkipClose(stream), encoding, color  # type: ignore[misc] @@ -761,3 +781,3 @@             url = _unquote_file(url)-            args = ["explorer", f"/select,{url}"]+            args = ["explorer", "/select,", url]             try:
src/click/core.py +13 lines
--- +++ @@ -2611,2 +2611,7 @@ +            # Record the source before processing so eager callbacks and type+            # conversion can inspect it. Restored after arbitration if this+            # option loses a feature-switch group.+            ctx.set_parameter_source(self.name, source)+             # Display a deprecation warning if necessary.@@ -2656,3 +2661,2 @@         if is_winner:-            ctx.set_parameter_source(self.name, source)             if self.expose_value:@@ -2660,6 +2664,9 @@                 ctx._param_default_explicit[self.name] = self._default_explicit-        elif existing_source is None:-            # Nothing has claimed the slot yet. Record at least our source so downstream-            # lookups don't return ``None``.-            ctx.set_parameter_source(self.name, source)+        elif existing_source is not None:+            # Lost arbitration; restore the winning option's source.+            ctx.set_parameter_source(self.name, existing_source)+        # else: ctx.params[self.name] was populated by code that bypassed+        # handle_parse_result (from another option's callback for example). Keep+        # the provisional source recorded before process_value so downstream+        # lookups don't return ``None``. @@ -2753,3 +2760,3 @@ -    .. versionchanged:: 8.4+    .. versionchanged:: 8.4.0         Non-basic ``flag_value`` types (not ``str``, ``int``, ``float``, or
src/click/exceptions.py +4 lines
--- +++ @@ -251,3 +251,6 @@ class NoSuchCommand(UsageError):-    """Raised if Click attempted to handle a command that does not exist."""+    """Raised if Click attempted to handle a command that does not exist.++    .. versionadded:: 8.4.0+    """ 
src/click/formatting.py +1 lines
--- +++ @@ -55,3 +55,3 @@ -    .. versionchanged:: 8.4+    .. versionchanged:: 8.4.0         Width is measured in visible characters. ANSI escape sequences in
src/click/shell_completion.py +4 lines
--- +++ @@ -45,4 +45,5 @@ +    # Write bytes, otherwise Windows text stdout translates LF to CRLF and breaks.     if instruction == "source":-        echo(comp.source())+        echo(comp.source().encode(), nl=False)         return 0@@ -50,3 +51,3 @@     if instruction == "complete":-        echo(comp.complete())+        echo(comp.complete().encode())         return 0@@ -424,3 +425,3 @@         """-        .. versionchanged:: 8.4+        .. versionchanged:: 8.4.0             Escape newlines in value and help to fix completion errors with
src/click/termui.py +1 lines
--- +++ @@ -307,3 +307,3 @@ -    .. versionadded:: 8.2+    .. versionadded:: 8.4.0 
src/click/types.py +12 lines
--- +++ @@ -52,2 +52,8 @@         input.++    .. versionchanged:: 8.4.0+        Now a generic abstract base class. Parameterize with the+        converted value type (``ParamType[int]`` for an integer-returning+        type) so that :meth:`convert` and downstream consumers carry the+        narrowed return type.     """@@ -266,2 +272,7 @@ +    .. versionchanged:: 8.4.0+        Now generic in the choice value type. Parameterize with the type of+        the choice values (``Choice[HashType]`` for an enum, ``Choice[str]``+        for plain strings) to enable type-checked consumers.+     .. versionchanged:: 8.2.0@@ -410,4 +421,3 @@ -        str_choices = map(str, self.choices)-+        str_choices = [self.normalize_choice(choice, ctx) for choice in self.choices]         if self.case_sensitive:
src/click/utils.py +8 lines
--- +++ @@ -234,3 +234,3 @@ def echo(-    message: t.Any | None = None,+    message: object = None,     file: t.IO[t.Any] | None = None,@@ -289,10 +289,11 @@ -    # Convert non bytes/text into the native string type.-    if message is not None and not isinstance(message, (str, bytes, bytearray)):-        out: str | bytes | bytearray | None = str(message)-    else:-        out = message+    match message:+        case str() | bytes() | bytearray():+            out = message+        case None:+            out = ""+        case _:+            out = str(message)      if nl:-        out = out or ""         if isinstance(out, str):@@ -312,3 +313,2 @@         binary_file = _find_binary_writer(file)-         if binary_file is not None:
tests/test_defaults.py +150 lines
--- +++ @@ -1 +1,3 @@+import os+ import pytest@@ -5,2 +7,3 @@ from click._utils import UNSET+from click.core import ParameterSource @@ -265,2 +268,149 @@     assert f"source={expected_source}" in result.output+++def test_parameter_source_during_paramtype_convert(runner):+    """``get_parameter_source()`` is available during ``ParamType.convert``.++    Uses the reproducer from https://github.com/pallets/click/issues/3458.+    """++    class Source(click.ParamType):+        name = "source"++        def convert(self, value, param, ctx):+            return {+                "value": value,+                "source": ctx.get_parameter_source(param.name),+            }++    @click.command()+    @click.option("--default", type=Source(), default="/tmp/file")+    @click.option("--nodefault", type=Source())+    def cli(default, nodefault):+        click.echo(f"default: {default}")+        click.echo(f"nodefault: {nodefault}")++    result = runner.invoke(cli, [])+    assert not result.exception+    assert "default: {'value': '/tmp/file', 'source': " in result.output+    assert "'source': None}" not in result.output.split("default:")[1].split("\n")[0]+    assert (+        result.output == "default: {'value': '/tmp/file', 'source': "+        f"{ParameterSource.DEFAULT!r}}}\nnodefault: None\n"+    )++    result = runner.invoke(cli, ["--default", "cli", "--nodefault", "also"])+    assert not result.exception+    assert (+        "default: {'value': 'cli', 'source': "+        f"{ParameterSource.COMMANDLINE!r}}}" in result.output+    )+    assert (+        "nodefault: {'value': 'also', 'source': "+        f"{ParameterSource.COMMANDLINE!r}}}" in result.output+    )+++def test_parameter_source_during_eager_callback(runner):+    """``get_parameter_source()`` is available during eager callbacks.++    Regression test for https://github.com/pallets/click/issues/3458.+    """++    def eager_cb(ctx, param, value):+        source = ctx.get_parameter_source(param.name)+        click.echo(f"callback source={source.name if source else None}")++    @click.command()+    @click.option(+        "--flag/--no-flag",+        default=False,+        is_eager=True,+        callback=eager_cb,+        expose_value=False,+    )+    def cli():+        source = click.get_current_context().get_parameter_source("flag")+        click.echo(f"final source={source.name}")++    result = runner.invoke(cli, [])+    assert not result.exception+    assert "callback source=DEFAULT" in result.output+    assert "final source=DEFAULT" in result.output++    result = runner.invoke(cli, ["--flag"])+    assert not result.exception+    assert "callback source=COMMANDLINE" in result.output+    assert "final source=COMMANDLINE" in result.output+++def test_flask_debug_env_not_stomped_by_default_flag(runner, monkeypatch):+    """Eager callback must not overwrite env when the flag used its default.++    Covers the Flask ``_set_debug`` pattern (pallets/flask#6025). Regression test+    for https://github.com/pallets/click/issues/3458.+    """++    monkeypatch.delenv("APP_DEBUG", raising=False)++    def set_debug(ctx, param, value):+        source = ctx.get_parameter_source(param.name)+        if source is not None and source in (+            ParameterSource.DEFAULT,+            ParameterSource.DEFAULT_MAP,+        ):+            return None+        os.environ["APP_DEBUG"] = "1" if value else "0"+        return value++    @click.command()+    @click.option(+        "--debug/--no-debug",+        default=False,+        is_eager=True,+        expose_value=False,+        callback=set_debug,+    )+    def cli():+        click.echo(f"APP_DEBUG={os.environ.get('APP_DEBUG', '')}")++    monkeypatch.setenv("APP_DEBUG", "1")+    result = runner.invoke(cli, [])+    assert result.exit_code == 0+    assert result.output.strip() == "APP_DEBUG=1"++    result = runner.invoke(cli, ["--debug"])+    assert result.exit_code == 0+    assert result.output.strip() == "APP_DEBUG=1"++    result = runner.invoke(cli, ["--no-debug"])+    assert result.exit_code == 0+    assert result.output.strip() == "APP_DEBUG=0"+++def test_parameter_source_on_parse_result_bypass(runner):+    """A losing option keeps its provisional source when ``ctx.params[name]``+    is populated by code that bypassed ``handle_parse_result``.++    This replicate the pattern documented in the "Parameter Modifications" section+    of ``docs/advanced.md``. This test highlight the current behavior of+    ``get_parameter_source()`` but is not intended as a contract enforcement.+    """++    def hijack(ctx, param, value):+        ctx.params["target"] = "hijacked"+        return value++    @click.command()+    @click.option("--hijacker", is_eager=True, callback=hijack, expose_value=False)+    @click.option("--target", default="default_value")+    @click.pass_context+    def cli(ctx, target):+        source = ctx.get_parameter_source("target")+        click.echo(f"value={target} source={source.name if source else 'None'}")++    result = runner.invoke(cli, ["--hijacker", "anything"])+    assert result.exit_code == 0, result.output+    assert "value=hijacked" in result.output+    assert "source=DEFAULT" in result.output 
tests/test_options.py +62 lines
--- +++ @@ -2898,2 +2898,64 @@ @pytest.mark.parametrize(+    ("opts", "args", "invoke_kwargs", "expected_value", "expected_source"),+    [+        # https://github.com/pallets/click/issues/3458+        pytest.param(+            [+                ("--without-xyz", {"flag_value": False}),+                ("--with-xyz", {"flag_value": True, "default": True}),+            ],+            [],+            {},+            True,+            "DEFAULT",+            id="explicit-default-wins",+        ),+        pytest.param(+            [+                ("--without-xyz", {"flag_value": False}),+                ("--with-xyz", {"flag_value": True, "default": True}),+            ],+            ["--without-xyz"],+            {},+            False,+            "COMMANDLINE",+            id="cmdline-wins",+        ),+        pytest.param(+            [+                ("--without-xyz", {"flag_value": False}),+                ("--with-xyz", {"flag_value": True, "default": True}),+            ],+            ["--without-xyz"],+            {"default_map": {"enable_xyz": True}},+            False,+            "COMMANDLINE",+            id="loser-default-map-restores-winner-source",+        ),+    ],+)+def test_bool_flag_group_parameter_source(+    runner, opts, args, invoke_kwargs, expected_value, expected_source+):+    """``get_parameter_source()`` stays correct for feature-switch groups.++    Regression test for https://github.com/pallets/click/issues/3458.+    """++    @click.command()+    @click.pass_context+    def cli(ctx, enable_xyz):+        source = ctx.get_parameter_source("enable_xyz")+        click.echo(f"value={enable_xyz!r} source={source.name}")++    for opt_name, opt_kwargs in opts:+        cli = click.option(opt_name, "enable_xyz", **opt_kwargs)(cli)++    result = runner.invoke(cli, args, **invoke_kwargs)+    assert result.exit_code == 0, result.output+    assert f"value={expected_value!r}" in result.output+    assert f"source={expected_source}" in result.output++[email protected](     ("opts", "args", "expected"),
tests/test_shell_completion.py +18 lines
--- +++ @@ -1 +1,2 @@+import io import textwrap@@ -13,2 +14,3 @@ from click.shell_completion import CompletionItem+from click.shell_completion import shell_complete from click.shell_completion import ShellComplete@@ -372,2 +374,16 @@ +def test_source_uses_lf_line_endings(monkeypatch):+    stdout = io.BytesIO()+    stream = io.TextIOWrapper(stdout, encoding="utf-8", newline="\r\n")+    monkeypatch.setattr("click.utils._default_text_stdout", lambda: stream)++    cli = Group("cli", commands=[Command("a"), Command("b")])+    assert shell_complete(cli, {}, "cli", "_CLI_COMPLETE", "zsh_source") == 0++    stream.flush()+    output = stdout.getvalue()+    assert b"\r\n" not in output+    assert b"\n" in output++ @pytest.mark.parametrize(@@ -459,3 +475,4 @@ [email protected](("value", "expect"), [(False, ["Au", "al"]), (True, ["al"])])+# case_sensitive=False normalizes values to lowercase, matching remains case insensitive[email protected](("value", "expect"), [(False, ["au", "al"]), (True, ["al"])]) def test_choice_case_sensitive(value, expect):
tests/test_termui.py +4 lines
--- +++ @@ -800,11 +800,5 @@ -    created = []--    def make_stringio():-        stream = io.StringIO()-        created.append(stream)-        return stream-+    stream = io.StringIO()     monkeypatch.setattr(sys, "stdout", None)-    monkeypatch.setattr(click._termui_impl, "StringIO", make_stringio)+    monkeypatch.setattr(click._termui_impl, "StringIO", lambda: stream)     monkeypatch.setattr(click._termui_impl, "isatty", lambda _: False)@@ -814,6 +808,6 @@     with click.get_pager_file(color=False) as pager:-        assert pager is created[0]         pager.write(styled_text) -    assert created[0].getvalue() == styled_text+    assert not stream.closed+    assert stream.getvalue() == styled_text 
tests/test_testing.py +11 lines
--- +++ @@ -256,2 +256,13 @@     assert result.output == ""+++def test_with_echo_via_pager():+    @click.command()+    def cli():+        click.echo_via_pager("Hello, Click!")++    runner = CliRunner()+    result = runner.invoke(cli)+    assert not result.exception+    assert result.output == "Hello, Click!\n" 
tests/test_utils.py +10 lines
--- +++ @@ -10,2 +10,3 @@ from functools import partial+from io import BytesIO from io import StringIO@@ -17,2 +18,3 @@ import click.utils+from click._compat import MAC from click._compat import WIN@@ -97,2 +99,6 @@     assert f.getvalue() == "hello\n"++    b = BytesIO()+    click.echo(b"", b)+    assert b.getvalue() == b"\n" @@ -311,2 +317,6 @@ @pytest.mark.skipif(WIN, reason="Different behavior on windows.")[email protected](+    MAC and sys.version_info >= (3, 13) and not sys._is_gil_enabled(),+    reason="Generator exception tests are flaky in Python 3.14t on macOS.",+) @pytest.mark.parametrize(
cryptography pypi
48.0.0 26d ago incident on record
critical-tier YANK ×3BURST ×2
latest 48.0.0 versions 155 maintainers 1 critical-tier (snapshotted)
45.0.6
45.0.7
46.0.0
46.0.1
46.0.2
46.0.3
46.0.4
46.0.5
46.0.6
46.0.7
47.0.0
48.0.0
YANK
37.0.3 marked yanked (still downloadable)
high · registry-verified · 2022-06-21 · 3y ago
YANK
38.0.2 marked yanked (still downloadable)
high · registry-verified · 2022-10-11 · 3y ago
YANK
45.0.0 marked yanked (still downloadable)
high · registry-verified · 2025-05-17 · 1y ago
BURST
2 releases in 46m: 2.4, 2.4.1
info · registry-verified · 2018-11-12 · 7y ago
BURST
2 releases in 53m: 45.0.0, 45.0.1
info · registry-verified · 2025-05-17 · 1y ago
release diff 47.0.0 → 48.0.0
+2 added · -0 removed · ~59 modified
+5 more files not shown
tests/test_meta.py +7 lines · 2 flagged
--- +++ @@ -8,3 +8,4 @@ import sys-import typing++import pytest @@ -13,3 +14,3 @@ -def find_all_modules() -> typing.List[str]:+def find_all_modules() -> list[str]:     return sorted(@@ -23,3 +24,4 @@ -def test_no_circular_imports(subtests):[email protected]("module", find_all_modules())+def test_no_circular_imports(module):     env = os.environ.copy()@@ -34,5 +36,3 @@ -    for module in find_all_modules():-        with subtests.test():-            argv = [sys.executable, "-c", f"__import__({module!r})"]-            subprocess.check_call(argv, env=env)+    argv = [sys.executable, "-c", f"__import__({module!r})"]+    subprocess.check_call(argv, env=env)
Cargo.toml +3 lines
--- +++ @@ -25,3 +25,3 @@ base64 = "0.22"-cc = "1.2.60"+cc = "1.2.61" cfg-if = "1"@@ -29,4 +29,4 @@ foreign-types-shared = "0.1"-openssl = "0.10.77"-openssl-sys = "0.9.111"+openssl = "0.10.79"+openssl-sys = "0.9.115" pem = { version = "3", default-features = false }
noxfile.py +17 lines
--- +++ @@ -83,5 +83,6 @@ -    # TODO: update to use `pip install --group` after py3.8 is removed-    pyproject_data = load_pyproject_toml()-    install(session, *nox.project.dependency_groups(pyproject_data, *groups))+    install(+        session,+        *itertools.chain.from_iterable(("--group", g) for g in groups),+    ) @@ -122,4 +123,2 @@ def docs(session: nox.Session) -> None:-    # TODO: update to use `pip install --group` after py3.8 is removed-    pyproject_data = load_pyproject_toml()     install(session, ".[ssh]")@@ -127,5 +126,8 @@         session,-        *nox.project.dependency_groups(-            pyproject_data, "docs", "docstest", "sdist"-        ),+        "--group",+        "docs",+        "--group",+        "docstest",+        "--group",+        "sdist",     )@@ -192,7 +194,3 @@ def docs_linkcheck(session: nox.Session) -> None:-    # TODO: update to use `pip install --group` after py3.8 is removed-    pyproject_data = load_pyproject_toml()-    install(-        session, ".", *nox.project.dependency_groups(pyproject_data, "docs")-    )+    install(session, ".", "--group", "docs") @@ -207,3 +205,2 @@     # but not install us.-    # TODO: update to use `pip install --group` after py3.8 is removed     pyproject_data = load_pyproject_toml()@@ -214,5 +211,8 @@         *pyproject_data["project"]["optional-dependencies"]["ssh"],-        *nox.project.dependency_groups(-            pyproject_data, "pep8test", "test", "nox"-        ),+        "--group",+        "pep8test",+        "--group",+        "test",+        "--group",+        "nox",     )
pyproject.toml +8 lines
--- +++ @@ -7,4 +7,3 @@     # Must be kept in sync with `project.dependencies`-    "cffi>=1.14; platform_python_implementation != 'PyPy' and python_version == '3.8'",-    "cffi>=2.0.0; platform_python_implementation != 'PyPy' and python_version >= '3.9'",+    "cffi>=2.0.0; platform_python_implementation != 'PyPy'",     # Used by cffi (which import distutils, and in Python 3.12, distutils has@@ -18,3 +17,3 @@ name = "cryptography"-version = "47.0.0"+version = "48.0.0" authors = [@@ -38,3 +37,2 @@     "Programming Language :: Python :: 3 :: Only",-    "Programming Language :: Python :: 3.8",     "Programming Language :: Python :: 3.9",@@ -50,7 +48,6 @@ ]-requires-python = ">=3.8,!=3.9.0,!=3.9.1"+requires-python = ">=3.9,!=3.9.0,!=3.9.1" dependencies = [     # Must be kept in sync with `build-system.requires`-    "cffi>=1.14; platform_python_implementation != 'PyPy' and python_version == '3.8'",-    "cffi>=2.0.0; platform_python_implementation != 'PyPy' and python_version >= '3.9'",+    "cffi>=2.0.0; platform_python_implementation != 'PyPy'",     # Must be kept in sync with ./.github/requirements/build-requirements.{in,txt}@@ -80,3 +77,3 @@ test = [-    "cryptography_vectors==47.0.0",+    "cryptography_vectors==48.0.0",     "pytest >=7.4.0",@@ -205,2 +202,4 @@     ".gitignore",-]+    "AGENTS.md",+    "CLAUDE.md",+]
src/_cffi_src/openssl/x509v3.py +13 lines
--- +++ @@ -6,2 +6,4 @@ +import os+ INCLUDES = """@@ -10,10 +12,12 @@ -TYPES = """+USE_CONST_X509 = bool(os.environ.get("USE_CONST_X509"))++TYPES = f""" typedef ... CONF; -typedef struct {-    X509 *issuer_cert;-    X509 *subject_cert;+typedef struct {{+    {"const X509" if USE_CONST_X509 else "X509"} *issuer_cert;+    {"const X509" if USE_CONST_X509 else "X509"} *subject_cert;     ...;-} X509V3_CTX;+}} X509V3_CTX; @@ -26,12 +30,11 @@ /* Only include the one union element used by pyOpenSSL. */-typedef struct {+typedef struct {{     int type;-    union {+    union {{         ASN1_IA5STRING *ia5;   /* rfc822Name, dNSName, */                                /*   uniformResourceIdentifier */-    } d;+    }} d;     ...;-} GENERAL_NAME;+}} GENERAL_NAME; """- 
src/cryptography/__about__.py +1 lines
--- +++ @@ -12,3 +12,3 @@ -__version__ = "47.0.0"+__version__ = "48.0.0" 
src/cryptography/__init__.py +0 lines
--- +++ @@ -6,6 +6,2 @@ -import sys-import warnings--from cryptography import utils from cryptography.__about__ import __author__, __copyright__, __version__@@ -17,10 +13 @@ ]--if sys.version_info[:2] == (3, 8):-    warnings.warn(-        "Python 3.8 is no longer supported by the Python core team "-        "and support for it is deprecated in cryptography. The next "-        "release of cryptography will remove support for Python 3.8.",-        utils.CryptographyDeprecationWarning,-        stacklevel=2,-    )
src/cryptography/hazmat/asn1/asn1.py +21 lines
--- +++ @@ -16,22 +16,6 @@     LiteralString = typing_extensions.LiteralString--    # We use the `include_extras` parameter of `get_type_hints`, which was-    # added in Python 3.9. This can be replaced by the `typing` version-    # once the min version is >= 3.9-    if sys.version_info < (3, 9):-        get_type_hints = typing_extensions.get_type_hints-        get_type_args = typing_extensions.get_args-        get_type_origin = typing_extensions.get_origin-        Annotated = typing_extensions.Annotated-    else:-        get_type_hints = typing.get_type_hints-        get_type_args = typing.get_args-        get_type_origin = typing.get_origin-        Annotated = typing.Annotated else:-    get_type_hints = typing.get_type_hints-    get_type_args = typing.get_args-    get_type_origin = typing.get_origin-    Annotated = typing.Annotated     LiteralString = typing.LiteralString++from cryptography.hazmat.bindings._rust import declarative_asn1 @@ -41,4 +25,2 @@     NoneType = types.NoneType  # type: ignore[nonetype-type]--from cryptography.hazmat.bindings._rust import declarative_asn1 @@ -85,3 +67,3 @@     )-    return get_type_origin(field_type) in union_types+    return typing.get_origin(field_type) in union_types @@ -128,5 +110,5 @@     # from it if it exists.-    if get_type_origin(field_type) is Annotated:+    if typing.get_origin(field_type) is typing.Annotated:         annotation = _extract_annotation(field_type.__metadata__, field_name)-        field_type, *_ = get_type_args(field_type)+        field_type, *_ = typing.get_args(field_type)     else:@@ -135,3 +117,3 @@     if annotation.size is not None and (-        get_type_origin(field_type) not in (builtins.list, SetOf)+        typing.get_origin(field_type) not in (builtins.list, SetOf)         and field_type@@ -175,3 +157,3 @@     elif _is_union(field_type):-        union_args = get_type_args(field_type)+        union_args = typing.get_args(field_type)         if len(union_args) == 2 and NoneType in union_args:@@ -249,10 +231,10 @@ -    elif get_type_origin(field_type) is builtins.list:+    elif typing.get_origin(field_type) is builtins.list:         inner_type = _normalize_field_type(-            get_type_args(field_type)[0], field_name+            typing.get_args(field_type)[0], field_name         )         rust_field_type = declarative_asn1.Type.SequenceOf(inner_type)-    elif get_type_origin(field_type) is SetOf:+    elif typing.get_origin(field_type) is SetOf:         inner_type = _normalize_field_type(-            get_type_args(field_type)[0], field_name+            typing.get_args(field_type)[0], field_name         )@@ -270,9 +252,9 @@ ) -> declarative_asn1.Variant:-    is_annotated = get_type_origin(t) is Annotated-    inner_type = get_type_args(t)[0] if is_annotated else t+    is_annotated = typing.get_origin(t) is typing.Annotated+    inner_type = typing.get_args(t)[0] if is_annotated else t      # Check if this is a Variant[T, Tag] type-    if get_type_origin(inner_type) is Variant:-        value_type, tag_literal = get_type_args(inner_type)-        if get_type_origin(tag_literal) is not typing.Literal:+    if typing.get_origin(inner_type) is Variant:+        value_type, tag_literal = typing.get_args(inner_type)+        if typing.get_origin(tag_literal) is not typing.Literal:             raise TypeError(@@ -282,3 +264,3 @@             )-        tag_name = get_type_args(tag_literal)[0]+        tag_name = typing.get_args(tag_literal)[0] @@ -324,3 +306,3 @@ def _register_asn1_sequence(cls: type[U]) -> None:-    raw_fields = get_type_hints(cls, include_extras=True)+    raw_fields = typing.get_type_hints(cls, include_extras=True)     root = declarative_asn1.Type.Sequence(cls, _annotate_fields(raw_fields))@@ -331,3 +313,3 @@ def _register_asn1_set(cls: type[U]) -> None:-    raw_fields = get_type_hints(cls, include_extras=True)+    raw_fields = typing.get_type_hints(cls, include_extras=True)     root = declarative_asn1.Type.Set(cls, _annotate_fields(raw_fields))@@ -339,6 +321,4 @@ # for `dataclass_transform` that conditionally points to `typing` or-# `typing_extensions` depending on the Python version (like we do for-# `get_type_hints`).-# We work around it by making the whole decorated class conditional on the-# Python version.+# `typing_extensions` depending on the Python version. We work around it by+# making the whole decorated class conditional on the Python version. if sys.version_info < (3, 11):
src/cryptography/hazmat/backends/openssl/backend.py +2 lines
--- +++ @@ -278,2 +278,3 @@             or rust_openssl.CRYPTOGRAPHY_IS_BORINGSSL+            or rust_openssl.CRYPTOGRAPHY_OPENSSL_350_OR_GREATER         )@@ -284,2 +285,3 @@             or rust_openssl.CRYPTOGRAPHY_IS_BORINGSSL+            or rust_openssl.CRYPTOGRAPHY_OPENSSL_350_OR_GREATER         )
src/cryptography/hazmat/primitives/asymmetric/rsa.py +2 lines
--- +++ @@ -9,3 +9,3 @@ import typing-from math import gcd+from math import gcd, lcm @@ -239,9 +239,5 @@     # than necessary. (lambda_n always divides phi_n)-    #-    # TODO: Replace with lcm(p - 1, q - 1) once the minimum-    # supported Python version is >= 3.9.     if e <= 1 or p <= 1 or q <= 1:         raise ValueError("Values can't be <= 1")-    lambda_n = (p - 1) * (q - 1) // gcd(p - 1, q - 1)-    return _modinv(e, lambda_n)+    return _modinv(e, lcm(p - 1, q - 1)) 
src/cryptography/hazmat/primitives/serialization/pkcs7.py +1 lines
--- +++ @@ -42,3 +42,3 @@ ContentEncryptionAlgorithm = typing.Union[-    typing.Type[algorithms.AES128], typing.Type[algorithms.AES256]+    type[algorithms.AES128], type[algorithms.AES256] ]
src/cryptography/utils.py +1 lines
--- +++ @@ -35,6 +35,3 @@ # (and do things like take a `len()`).-if sys.version_info >= (3, 9):-    Buffer = typing.Union[bytes, bytearray, memoryview]-else:-    Buffer = typing.ByteString+Buffer = typing.Union[bytes, bytearray, memoryview] 
src/cryptography/x509/name.py +1 lines
--- +++ @@ -306,3 +306,3 @@             self._attributes = typing.cast(-                typing.List[RelativeDistinguishedName], attributes+                list[RelativeDistinguishedName], attributes             )
src/rust/cryptography-key-parsing/Cargo.toml +1 lines
--- +++ @@ -20,2 +20,2 @@ [lints.rust]-unexpected_cfgs = { level = "warn", check-cfg = ['cfg(CRYPTOGRAPHY_IS_LIBRESSL)', 'cfg(CRYPTOGRAPHY_IS_BORINGSSL)', 'cfg(CRYPTOGRAPHY_OSSLCONF, values("OPENSSL_NO_RC2", "OPENSSL_NO_RC4"))', 'cfg(CRYPTOGRAPHY_IS_AWSLC)'] }+unexpected_cfgs = { level = "warn", check-cfg = ['cfg(CRYPTOGRAPHY_IS_LIBRESSL)', 'cfg(CRYPTOGRAPHY_IS_BORINGSSL)', 'cfg(CRYPTOGRAPHY_OPENSSL_350_OR_GREATER)', 'cfg(CRYPTOGRAPHY_OSSLCONF, values("OPENSSL_NO_RC2", "OPENSSL_NO_RC4"))', 'cfg(CRYPTOGRAPHY_IS_AWSLC)'] }
src/rust/cryptography-openssl/Cargo.toml +1 lines
--- +++ @@ -17,2 +17,2 @@ [lints.rust]-unexpected_cfgs = { level = "warn", check-cfg = ['cfg(CRYPTOGRAPHY_OPENSSL_320_OR_GREATER)', 'cfg(CRYPTOGRAPHY_IS_LIBRESSL)', 'cfg(CRYPTOGRAPHY_IS_BORINGSSL)', 'cfg(CRYPTOGRAPHY_IS_AWSLC)'] }+unexpected_cfgs = { level = "warn", check-cfg = ['cfg(CRYPTOGRAPHY_OPENSSL_320_OR_GREATER)', 'cfg(CRYPTOGRAPHY_OPENSSL_350_OR_GREATER)', 'cfg(CRYPTOGRAPHY_IS_LIBRESSL)', 'cfg(CRYPTOGRAPHY_IS_BORINGSSL)', 'cfg(CRYPTOGRAPHY_IS_AWSLC)'] }
tests/hazmat/asn1/test_api.py +2 lines
--- +++ @@ -8,9 +8,5 @@ import typing+from typing import Annotated  import pytest--if sys.version_info < (3, 9):-    from typing_extensions import Annotated-else:-    from typing import Annotated @@ -380,3 +376,3 @@ -        my_list: typing.List[int] = list()+        my_list: list[int] = list()         choice = declarative_asn1.Type.Choice(my_list)
tests/hazmat/asn1/test_serialization.py +13 lines
--- +++ @@ -9,9 +9,5 @@ import typing+from typing import Annotated  import pytest--if sys.version_info < (3, 9):-    from typing_extensions import Annotated-else:-    from typing import Annotated @@ -27,3 +23,3 @@ # compare them with their expected values.-def _comparable_dataclass(cls: typing.Type[U]) -> typing.Type[U]:+def _comparable_dataclass(cls: type[U]) -> type[U]:     if sys.version_info >= (3, 10):@@ -49,3 +45,3 @@ def assert_roundtrips(-    test_cases: typing.List[typing.Tuple[U, bytes]],+    test_cases: list[tuple[U, bytes]], ) -> None:@@ -394,3 +390,3 @@         class Example:-            a: typing.List[int]+            a: list[int] @@ -415,3 +411,3 @@         class Example:-            a: typing.List[MyType]+            a: list[MyType] @@ -545,3 +541,3 @@             f: typing.Union[asn1.GeneralizedTime, None]-            g: typing.Union[typing.List[int], None]+            g: typing.Union[list[int], None]             g2: typing.Union[asn1.SetOf[int], None]@@ -619,3 +615,3 @@             ]-            f: Annotated[typing.List[int], asn1.Default([1])]+            f: Annotated[list[int], asn1.Default([1])]             g: Annotated[@@ -1142,3 +1138,3 @@         class Example:-            a: Annotated[typing.List[int], asn1.Size(min=1, max=4)]+            a: Annotated[list[int], asn1.Size(min=1, max=4)] @@ -1157,3 +1153,3 @@         class Example:-            a: Annotated[typing.List[int], asn1.Size(min=1, max=None)]+            a: Annotated[list[int], asn1.Size(min=1, max=None)] @@ -1172,3 +1168,3 @@         class Example:-            a: Annotated[typing.List[int], asn1.Size.exact(4)]+            a: Annotated[list[int], asn1.Size.exact(4)] @@ -1187,3 +1183,3 @@         class Example:-            a: Annotated[typing.List[int], asn1.Size(min=1, max=2)]+            a: Annotated[list[int], asn1.Size(min=1, max=2)] @@ -1207,3 +1203,3 @@         class Example:-            a: Annotated[typing.List[int], asn1.Size(min=5, max=6)]+            a: Annotated[list[int], asn1.Size(min=5, max=6)] @@ -1227,3 +1223,3 @@         class Example:-            a: Annotated[typing.List[int], asn1.Size.exact(5)]+            a: Annotated[list[int], asn1.Size.exact(5)] 
tests/hazmat/primitives/test_argon2.py +23 lines
--- +++ @@ -8,3 +8,3 @@ import os-from typing import List, Tuple+import sys @@ -26,3 +26,3 @@ -vectors: List[Tuple[type, dict]] = []+vectors: list[tuple[type, dict]] = [] for clazz in variants:@@ -143,2 +143,23 @@ +    @pytest.mark.skipif(+        sys.platform == "darwin",+        reason=(+            "macOS overcommits the 4 TiB virtual reservation, then the "+            "subsequent memset triggers an OOM-kill before MemoryError "+            "can be raised."+        ),+    )+    def test_argon2_malloc_failure(self, clazz, backend):+        # memory_cost is in KiB, so 2**32 - 1 KiB is ~4 TiB. This should+        # fail to allocate on any reasonable system.+        argon2 = clazz(+            salt=b"salt" * 2,+            length=32,+            iterations=1,+            lanes=1,+            memory_cost=2**32 - 1,+        )+        with pytest.raises(MemoryError):+            argon2.derive(b"password")+     def test_already_finalized(self, clazz, backend):
tests/hazmat/primitives/test_dsa.py +1 lines
--- +++ @@ -31,3 +31,3 @@ -_ALGORITHMS_DICT: typing.Dict[str, hashes.HashAlgorithm] = {+_ALGORITHMS_DICT: dict[str, hashes.HashAlgorithm] = {     "SHA1": hashes.SHA1(),
tests/hazmat/primitives/test_ec.py +1 lines
--- +++ @@ -9,3 +9,2 @@ import textwrap-import typing from binascii import hexlify@@ -40,3 +39,3 @@ -_HASH_TYPES: typing.Dict[str, typing.Type[hashes.HashAlgorithm]] = {+_HASH_TYPES: dict[str, type[hashes.HashAlgorithm]] = {     "SHA-1": hashes.SHA1,
tests/hazmat/primitives/test_pkcs7.py +11 lines
--- +++ @@ -372,3 +372,3 @@         cert, key = _load_cert_key()-        options: typing.List[pkcs7.PKCS7Options] = []+        options: list[pkcs7.PKCS7Options] = []         builder = (@@ -406,3 +406,3 @@         )-        options: typing.List[pkcs7.PKCS7Options] = []+        options: list[pkcs7.PKCS7Options] = []         sig = builder.sign(serialization.Encoding.DER, options)@@ -440,3 +440,3 @@         cert, key = _load_cert_key()-        options: typing.List[pkcs7.PKCS7Options] = []+        options: list[pkcs7.PKCS7Options] = []         builder = (@@ -467,3 +467,3 @@         )-        options: typing.List[pkcs7.PKCS7Options] = []+        options: list[pkcs7.PKCS7Options] = []         sig_no_binary = builder.sign(serialization.Encoding.DER, options)@@ -501,3 +501,3 @@ -        options: typing.List[pkcs7.PKCS7Options] = []+        options: list[pkcs7.PKCS7Options] = []         sig_binary = builder.sign(serialization.Encoding.DER, options)@@ -657,3 +657,3 @@ -        options: typing.List[pkcs7.PKCS7Options] = []+        options: list[pkcs7.PKCS7Options] = []         sig = builder.sign(serialization.Encoding.DER, options)@@ -698,3 +698,3 @@         )-        options: typing.List[pkcs7.PKCS7Options] = []+        options: list[pkcs7.PKCS7Options] = []         sig = builder.sign(serialization.Encoding.DER, options)@@ -785,3 +785,3 @@         )-        options: typing.List[pkcs7.PKCS7Options] = []+        options: list[pkcs7.PKCS7Options] = []         sig = builder.sign(serialization.Encoding.DER, options)@@ -821,3 +821,3 @@         )-        options: typing.List[pkcs7.PKCS7Options] = []+        options: list[pkcs7.PKCS7Options] = []         sig = builder.sign(serialization.Encoding.DER, options)@@ -856,3 +856,3 @@         )-        options: typing.List[pkcs7.PKCS7Options] = []+        options: list[pkcs7.PKCS7Options] = []         sig = builder.sign(serialization.Encoding.DER, options)@@ -879,3 +879,3 @@         )-        options: typing.List[pkcs7.PKCS7Options] = []+        options: list[pkcs7.PKCS7Options] = []         sig = builder.sign(serialization.Encoding.DER, options)
tests/hazmat/primitives/test_x963_vectors.py +1 lines
--- +++ @@ -27,3 +27,3 @@     _algorithms_dict: typing.ClassVar[-        typing.Dict[str, typing.Type[hashes.HashAlgorithm]]+        dict[str, type[hashes.HashAlgorithm]]     ] = {
tests/hazmat/primitives/utils.py +2 lines
--- +++ @@ -7,3 +7,2 @@ import os-import typing @@ -394,5 +393,3 @@ def _kbkdf_hmac_counter_mode_test(backend, prf, ctr_loc, brk_loc, params):-    supported_hash_algorithms: typing.Dict[-        str, typing.Type[hashes.HashAlgorithm]-    ] = {+    supported_hash_algorithms: dict[str, type[hashes.HashAlgorithm]] = {         "hmac_sha1": hashes.SHA1,@@ -427,5 +424,3 @@ def _kbkdf_cmac_counter_mode_test(backend, prf, ctr_loc, brk_loc, params):-    supported_cipher_algorithms: typing.Dict[-        str, typing.Type[BlockCipherAlgorithm]-    ] = {+    supported_cipher_algorithms: dict[str, type[BlockCipherAlgorithm]] = {         "cmac_aes128": algorithms.AES,
tests/test_cryptography_utils.py +2 lines
--- +++ @@ -20,3 +20,3 @@ -        accesses: typing.List[typing.Optional[T]] = []+        accesses: list[typing.Optional[T]] = [] @@ -42,3 +42,3 @@ -        accesses: typing.List[typing.Optional[T]] = []+        accesses: list[typing.Optional[T]] = []         t = T()
tests/utils.py +1 lines
--- +++ @@ -994,3 +994,3 @@     path = os.path.join(wycheproof, subdir, test_file)-    with open(path) as f:+    with open(path, encoding="utf-8") as f:         data = json.load(f)
fsspec pypi
2026.4.0 1mo ago incident on record
YANK ×3BURST ×2
latest 2026.4.0 versions 99 maintainers 1
2025.3.1
2025.3.2
2025.5.0
2025.5.1
2025.7.0
2025.9.0
2025.10.0
2025.12.0
2026.1.0
2026.2.0
2026.3.0
2026.4.0
YANK
2022.8.0 marked yanked (still downloadable)
high · registry-verified · 2022-08-30 · 3y ago
YANK
2022.8.1 marked yanked (still downloadable)
high · registry-verified · 2022-08-31 · 3y ago
YANK
2025.3.1 marked yanked (still downloadable)
high · registry-verified · 2025-03-30 · 1y ago
BURST
2 releases in 4m: 0.1.0, 0.1.1
info · registry-verified · 2019-01-02 · 7y ago
BURST
2 releases in 41m: 0.3.1, 0.3.2
info · registry-verified · 2019-07-17 · 6y ago
release diff 2026.3.0 → 2026.4.0
+0 added · -1 removed · ~12 modified
fsspec/_version.py +2 lines
--- +++ @@ -20,4 +20,4 @@ -__version__ = version = '2026.3.0'-__version_tuple__ = version_tuple = (2026, 3, 0)+__version__ = version = '2026.4.0'+__version_tuple__ = version_tuple = (2026, 4, 0) 
fsspec/asyn.py +27 lines
--- +++ @@ -265,5 +265,18 @@         done, pending = await asyncio.wait(pending, return_when=asyncio.FIRST_COMPLETED)+        first_exc = None         while done:-            result, k = await done.pop()-            results[k] = result+            task = done.pop()+            try:+                result, k = await task+                results[k] = result+            except Exception as exc:+                if first_exc is None:+                    first_exc = exc++        if first_exc is not None:+            for task in pending:+                task.cancel()+            if pending:+                await asyncio.gather(*pending, return_exceptions=True)+            raise first_exc @@ -797,4 +810,10 @@         elif "/" in path[:min_idx]:+            first_wildcard_idx = min_idx             min_idx = path[:min_idx].rindex("/")-            root = path[: min_idx + 1]+            root = path[+                : min_idx + 1+            ]  # everything up to the last / before the first wildcard+            prefix = path[+                min_idx + 1 : first_wildcard_idx+            ]  # stem between last "/" and first wildcard             depth = path[min_idx + 1 :].count("/") + 1@@ -802,2 +821,3 @@             root = ""+            prefix = path[:min_idx]  # stem up to the first wildcard             depth = path[min_idx + 1 :].count("/") + 1@@ -812,2 +832,6 @@ +        # Pass the filename stem as prefix= so backends that support it such as+        # gcsfs, s3fs and adlfs can filter server-side up to the first wildcard.+        if prefix:+            kwargs["prefix"] = prefix         allpaths = await self._find(
fsspec/implementations/cached.py +46 lines
--- +++ @@ -476,5 +476,8 @@             # it calls `_open`, but is actually in superclass-            return lambda *args, **kw: getattr(type(self), item).__get__(self)(-                *args, **kw-            )+            if hasattr(type(self), item):+                return lambda *args, **kw: getattr(type(self), item).__get__(self)(+                    *args, **kw+                )+            # method is in the whitelist but not defined on this subclass;+            # fall through to delegate to the wrapped filesystem below         if item in ["__reduce_ex__"]:@@ -746,2 +749,42 @@ +    async def _cat_file(self, path, start=None, end=None, **kwargs):+        logger.debug("async cat_file %s", path)+        path = self._strip_protocol(path)+        sha = self._mapper(path)+        fn = self._check_file(path)++        if not fn:+            fn = os.path.join(self.storage[-1], sha)+            await self.fs._get_file(path, fn, **kwargs)++        with open(fn, "rb") as f:  # noqa ASYNC230+            if start:+                f.seek(start)+            size = -1 if end is None else end - f.tell()+            return f.read(size)++    async def _cat_ranges(+        self, paths, starts, ends, max_gap=None, on_error="return", **kwargs+    ):+        logger.debug("async cat ranges %s", paths)+        lpaths = []+        rset = set()+        download = []+        rpaths = []+        for p in paths:+            fn = self._check_file(p)+            if fn is None and p not in rset:+                sha = self._mapper(p)+                fn = os.path.join(self.storage[-1], sha)+                download.append(fn)+                rset.add(p)+                rpaths.append(p)+            lpaths.append(fn)+        if download:+            await self.fs._get(rpaths, download, on_error=on_error)++        return LocalFileSystem().cat_ranges(+            lpaths, starts, ends, max_gap=max_gap, on_error=on_error, **kwargs+        )+ @@ -850,42 +893,2 @@ -    async def _cat_file(self, path, start=None, end=None, **kwargs):-        logger.debug("async cat_file %s", path)-        path = self._strip_protocol(path)-        sha = self._mapper(path)-        fn = self._check_file(path)--        if not fn:-            fn = os.path.join(self.storage[-1], sha)-            await self.fs._get_file(path, fn, **kwargs)--        with open(fn, "rb") as f:  # noqa ASYNC230-            if start:-                f.seek(start)-            size = -1 if end is None else end - f.tell()-            return f.read(size)--    async def _cat_ranges(-        self, paths, starts, ends, max_gap=None, on_error="return", **kwargs-    ):-        logger.debug("async cat ranges %s", paths)-        lpaths = []-        rset = set()-        download = []-        rpaths = []-        for p in paths:-            fn = self._check_file(p)-            if fn is None and p not in rset:-                sha = self._mapper(p)-                fn = os.path.join(self.storage[-1], sha)-                download.append(fn)-                rset.add(p)-                rpaths.append(p)-            lpaths.append(fn)-        if download:-            await self.fs._get(rpaths, download, on_error=on_error)--        return LocalFileSystem().cat_ranges(-            lpaths, starts, ends, max_gap=max_gap, on_error=on_error, **kwargs-        )-     def cat_ranges(
fsspec/implementations/dirfs.py +15 lines
--- +++ @@ -99,2 +99,5 @@ +    def delete(self, path, recursive=False, maxdepth=None):+        return self.fs.delete(self._join(path), recursive=recursive, maxdepth=maxdepth)+     async def _cp_file(self, path1, path2, **kwargs):@@ -139,2 +142,14 @@ +    def write_text(+        self, path, value, encoding=None, errors=None, newline=None, **kwargs+    ):+        return self.fs.write_text(+            self._join(path),+            value,+            encoding=encoding,+            errors=errors,+            newline=newline,+            **kwargs,+        )+     async def _cat_file(self, path, *args, **kwargs):
fsspec/implementations/http.py +6 lines
--- +++ @@ -43,2 +43,5 @@     HTML href tags will be used.++    URLs are passed unfiltered to aiohttp, so all addresses are accessible. Where URLs are+    supplied by a user, the calling application may wish to filter to prevent scanning.     """@@ -562,3 +565,5 @@ -        async with session.put(url, data=value, headers=headers, **kwargs) as r:+        async with session.put(+            self.encode_url(url), data=value, headers=headers, **kwargs+        ) as r:             r.raise_for_status()
fsspec/implementations/local.py +8 lines
--- +++ @@ -206,4 +206,5 @@     def unstrip_protocol(self, name):+        protocol = self.protocol if isinstance(self.protocol, str) else self.protocol[0]         name = self._strip_protocol(name)  # normalise for local/win/...-        return f"file://{name}"+        return f"{protocol}://{name}" @@ -255,10 +256,8 @@         path = stringify_path(path)-        if path.startswith("file://"):-            path = path[7:]-        elif path.startswith("file:"):-            path = path[5:]-        elif path.startswith("local://"):-            path = path[8:]-        elif path.startswith("local:"):-            path = path[6:]+        protos = (cls.protocol,) if isinstance(cls.protocol, str) else cls.protocol+        prefixes = (protocol + sep for protocol in protos for sep in ("://", ":"))+        for prefix in prefixes:+            if path.startswith(prefix):+                path = path.removeprefix(prefix)+                break 
fsspec/implementations/tar.py +11 lines
--- +++ @@ -124 +124,12 @@         return self.tar.extractfile(path)++    def close(self):+        """Commits any write changes to the file. Done on ``del`` too."""+        self.tar.close()++    def __del__(self):+        if hasattr(self, "tar"):+            self.close()+            del self.tar+        if hasattr(self, "of") and hasattr(self.of, "__exit__"):+            self.of.__exit__(None, None, None)
fsspec/implementations/zip.py +2 lines
--- +++ @@ -80,2 +80,4 @@             del self.zip+        if hasattr(self, "of") and hasattr(self.of, "__exit__"):+            self.of.__exit__(None, None, None) 
fsspec/registry.py +5 lines
--- +++ @@ -68,3 +68,7 @@         "class": "adlfs.AzureDatalakeFileSystem",-        "err": "Install adlfs to access Azure Datalake Gen1",+        "err": (+            "Azure Data Lake Storage Gen1 is retired and no longer supported. Please "+            "install adlfs and use the `az://` protocol to access Azure Blob Storage "+            "and Azure Data Lake Storage Gen2 instead."+        ),     },
grpcio-status pypi
1.80.0 2mo ago incident on record
YANK ×9BURST ×6INSTALL-EXEC
latest 1.80.0 versions 193 maintainers 1
1.72.1
1.73.0
1.73.1
1.72.2
1.71.2
1.74.0
1.75.0
1.75.1
1.76.0
1.78.0
1.78.1
1.80.0
YANK
1.45.0 marked yanked (still downloadable)
high · registry-verified · 2022-03-23 · 4y ago
YANK
1.48.0 marked yanked (still downloadable)
high · registry-verified · 2022-07-28 · 3y ago
YANK
1.49.0 marked yanked (still downloadable)
high · registry-verified · 2022-09-15 · 3y ago
YANK
1.51.0 marked yanked (still downloadable)
high · registry-verified · 2022-11-21 · 3y ago
YANK
1.52.0 marked yanked (still downloadable)
high · registry-verified · 2023-02-06 · 3y ago
YANK
1.55.0 marked yanked (still downloadable)
high · registry-verified · 2023-05-22 · 3y ago
YANK
1.65.0 marked yanked (still downloadable)
high · registry-verified · 2024-07-11 · 1y ago
YANK
1.72.0 marked yanked (still downloadable)
high · registry-verified · 2025-04-25 · 1y ago
YANK
1.78.1 marked yanked (still downloadable)
high · registry-verified · 2026-02-20 · 3mo ago
BURST
2 releases in 33m: 1.22.1, 1.23.0
info · registry-verified · 2019-08-15 · 6y ago
BURST
4 releases in 37m: 1.46.5, 1.47.2, 1.48.2, 1.49.1
info · registry-verified · 2022-09-22 · 3y ago
BURST
2 releases in 11m: 1.53.1, 1.54.2
info · registry-verified · 2023-05-12 · 3y ago
BURST
2 releases in 2m: 1.54.3, 1.53.2
info · registry-verified · 2023-08-02 · 2y ago
BURST
5 releases in 54m: 1.64.3, 1.63.2, 1.62.3, 1.61.3, 1.60.2
info · registry-verified · 2024-08-06 · 1y ago
BURST
2 releases in 9m: 1.59.5, 1.58.3
info · registry-verified · 2024-08-06 · 1y ago
INSTALL-EXEC
setup.py in sdist uses install-hook (runs at pip install)
warn · snapshot-derived
release diff 1.78.0 → 1.80.0
+0 added · -0 removed · ~6 modified
grpc_version.py +1 lines
--- +++ @@ -16,2 +16,2 @@ -VERSION = '1.78.0'+VERSION = '1.80.0'
numpy pypi
2.4.6 12d ago incident on record
YANKBURST ×2
latest 2.4.6 versions 146 maintainers 1
2.3.1
2.3.2
2.3.3
2.3.4
2.3.5
2.4.0
2.4.1
2.4.2
2.4.3
2.4.4
2.4.5
2.4.6
YANK
2.4.0 marked yanked (still downloadable)
high · registry-verified · 2025-12-20 · 5mo ago
BURST
3 releases in 22m: 1.10.4, 1.9.3, 1.8.2
info · registry-verified · 2016-04-20 · 10y ago
BURST
15 releases in 40m: 1.7.2, 1.6.2, 1.10.3, 1.10.2, 1.10.1, 1.10.0, 1.9.2, 1.9.1, 1.9.0, 1.8.1, 1.8.0, 1.7.1, 1.7.0, 1.6.1, 1.6.0
info · registry-verified · 2016-04-20 · 10y ago
release diff 2.4.5 → 2.4.6
artifact too large or unavailable
packaging pypi
26.2 1mo ago incident on record
critical-tier YANKBURST ×3
latest 26.2 versions 53 maintainers 1 critical-tier (snapshotted)
21.3
22.0
23.0
23.1
23.2
24.0
24.1
24.2
25.0
26.0
26.1
26.2
YANK
20.6 marked yanked (still downloadable)
high · registry-verified · 2020-11-28 · 5y ago
BURST
2 releases in 9m: 20.2, 20.3
info · registry-verified · 2020-03-05 · 6y ago
BURST
2 releases in 3m: 20.6, 20.7
info · registry-verified · 2020-11-28 · 5y ago
BURST
2 releases in 5m: 21.1, 21.2
info · registry-verified · 2021-10-29 · 4y ago
release diff 26.1 → 26.2
+2 added · -0 removed · ~23 modified
pyproject.toml +3 lines
--- +++ @@ -160,4 +160,5 @@ "tests/test_*.py" = ["PYI024", "PLR", "SIM201", "T20", "S301"]-"tasks/check.py" = ["UP032", "T20"]-"tasks/check_frozen_revs.py" = ["T20", "ANN401"]+"tasks/*.py" = ["T20"]+"tasks/check.py" = ["UP032"]+"tasks/check_frozen_revs.py" = ["ANN401"] "tests/test_requirements.py" = ["UP032"]
src/packaging/__init__.py +1 lines
--- +++ @@ -8,3 +8,3 @@ -__version__ = "26.1"+__version__ = "26.2" 
src/packaging/_parser.py +28 lines
--- +++ @@ -28,2 +28,30 @@         raise NotImplementedError++    def __getstate__(self) -> str:+        # Return just the value string for compactness and stability.+        return self.value++    def _restore_value(self, value: object) -> None:+        if not isinstance(value, str):+            raise TypeError(+                f"Cannot restore {self.__class__.__name__} value from {value!r}"+            )+        self.value = value++    def __setstate__(self, state: object) -> None:+        if isinstance(state, str):+            # New format (26.2+): just the value string.+            self._restore_value(state)+            return+        if isinstance(state, tuple) and len(state) == 2:+            # Old format (packaging <= 26.0, __slots__): (None, {slot: value}).+            _, slot_dict = state+            if isinstance(slot_dict, dict) and "value" in slot_dict:+                self._restore_value(slot_dict["value"])+                return+        if isinstance(state, dict) and "value" in state:+            # Old format (packaging <= 25.0, no __slots__): plain __dict__.+            self._restore_value(state["value"])+            return+        raise TypeError(f"Cannot restore {self.__class__.__name__} from {state!r}") 
src/packaging/_structures.py +33 lines
--- +++ @@ -0,0 +1,33 @@+# This file is dual licensed under the terms of the Apache License, Version+# 2.0, and the BSD License. See the LICENSE file in the root of this repository+# for complete details.++"""Backward-compatibility shim for unpickling Version objects serialized before+packaging 26.1.++Old pickles reference ``packaging._structures.InfinityType`` and+``packaging._structures.NegativeInfinityType``.  This module provides minimal+stand-in classes so that ``pickle.loads()`` can resolve those references.+The deserialized objects are not used for comparisons — ``Version.__setstate__``+discards the stale ``_key`` cache and recomputes it from the core version fields.+"""++from __future__ import annotations+++class InfinityType:+    """Stand-in for the removed ``InfinityType`` used in old comparison keys."""++    def __repr__(self) -> str:+        return "Infinity"+++class NegativeInfinityType:+    """Stand-in for the removed ``NegativeInfinityType`` used in old comparison keys."""++    def __repr__(self) -> str:+        return "-Infinity"+++Infinity = InfinityType()+NegativeInfinity = NegativeInfinityType()
src/packaging/markers.py +39 lines
--- +++ @@ -324,2 +324,12 @@     :raises InvalidMarker: If ``marker`` cannot be parsed.++    Instances are safe to serialize with :mod:`pickle`. They use a stable+    format so the same pickle can be loaded in future packaging releases.++    .. versionchanged:: 26.2++        Added a stable pickle format. Pickles created with packaging 26.2+ can+        be unpickled with future releases.  Backward compatibility with pickles+        from packaging < 26.2 is supported but may be removed in a future+        release.     """@@ -383,2 +393,31 @@ +    def __getstate__(self) -> str:+        # Return the marker expression string for compactness and stability.+        # Internal Node objects are excluded; the string is re-parsed on load.+        return str(self)++    def __setstate__(self, state: object) -> None:+        if isinstance(state, str):+            # New format (26.2+): just the marker expression string.+            try:+                self._markers = _normalize_extra_values(_parse_marker(state))+            except ParserSyntaxError as exc:+                raise TypeError(f"Cannot restore Marker from {state!r}") from exc+            return+        if isinstance(state, dict) and "_markers" in state:+            # Old format (packaging <= 26.1, no __slots__): plain __dict__.+            markers = state["_markers"]+            if isinstance(markers, list):+                self._markers = markers+                return+        if isinstance(state, tuple) and len(state) == 2:+            # Old format (packaging <= 26.1, __slots__): (None, {slot: value}).+            _, slot_dict = state+            if isinstance(slot_dict, dict) and "_markers" in slot_dict:+                markers = slot_dict["_markers"]+                if isinstance(markers, list):+                    self._markers = markers+                    return+        raise TypeError(f"Cannot restore Marker from {state!r}")+     def __and__(self, other: Marker) -> Marker:
src/packaging/metadata.py +1 lines
--- +++ @@ -29,2 +29,3 @@ __all__ = [+    "ExceptionGroup",  # Keep this for a bit (makes mypy happy w/ 26.0 compat)     "InvalidMetadata",
src/packaging/requirements.py +34 lines
--- +++ @@ -35,2 +35,12 @@     string.++    Instances are safe to serialize with :mod:`pickle`. They use a stable+    format so the same pickle can be loaded in future packaging releases.++    .. versionchanged:: 26.2++        Added a stable pickle format. Pickles created with packaging 26.2+ can+        be unpickled with future releases.  Backward compatibility with pickles+        from packaging < 26.2 is supported but may be removed in a future+        release.     """@@ -75,2 +85,26 @@ +    def __getstate__(self) -> str:+        # Return the requirement string for compactness and stability.+        # Re-parsed on load to reconstruct all fields.+        return str(self)++    def __setstate__(self, state: object) -> None:+        if isinstance(state, str):+            # New format (26.2+): just the requirement string.+            try:+                tmp = Requirement(state)+            except InvalidRequirement as exc:+                raise TypeError(f"Cannot restore Requirement from {state!r}") from exc+            self.name = tmp.name+            self.url = tmp.url+            self.extras = tmp.extras+            self.specifier = tmp.specifier+            self.marker = tmp.marker+            return+        if isinstance(state, dict):+            # Old format (packaging <= 26.1, no __slots__): plain __dict__.+            self.__dict__.update(state)+            return+        raise TypeError(f"Cannot restore Requirement from {state!r}")+     def __str__(self) -> str:
src/packaging/specifiers.py +155 lines
--- +++ @@ -17,4 +17,15 @@ import re+import sys import typing-from typing import Any, Callable, Final, Iterable, Iterator, Sequence, TypeVar, Union+from typing import (+    TYPE_CHECKING,+    Any,+    Callable,+    Final,+    Iterable,+    Iterator,+    Sequence,+    TypeVar,+    Union,+) @@ -22,2 +33,7 @@ from .version import InvalidVersion, Version++if sys.version_info >= (3, 10):+    from typing import TypeGuard  # pragma: no cover+elif TYPE_CHECKING:+    from typing_extensions import TypeGuard @@ -33,2 +49,15 @@     return __all__+++def _validate_spec(spec: object, /) -> TypeGuard[tuple[str, str]]:+    return (+        isinstance(spec, tuple)+        and len(spec) == 2+        and isinstance(spec[0], str)+        and isinstance(spec[1], str)+    )+++def _validate_pre(pre: object, /) -> TypeGuard[bool | None]:+    return pre is None or isinstance(pre, bool) @@ -416,2 +445,12 @@         comma-separated version specifiers (which is what package metadata contains).++    Instances are safe to serialize with :mod:`pickle`. They use a stable+    format so the same pickle can be loaded in future packaging releases.++    .. versionchanged:: 26.2++        Added a stable pickle format. Pickles created with packaging 26.2+ can+        be unpickled with future releases.  Backward compatibility with pickles+        from packaging < 26.2 is supported but may be removed in a future+        release.     """@@ -724,2 +763,42 @@ +    def __getstate__(self) -> tuple[tuple[str, str], bool | None]:+        # Return state as a 2-item tuple for compactness:+        #   ((operator, version), prereleases)+        # Cache members are excluded and will be recomputed on demand.+        return (self._spec, self._prereleases)++    def __setstate__(self, state: object) -> None:+        # Always discard cached values - they will be recomputed on demand.+        self._spec_version = None+        self._wildcard_split = None+        self._ranges = None++        if isinstance(state, tuple):+            if len(state) == 2:+                # New format (26.2+): ((operator, version), prereleases)+                spec, prereleases = state+                if _validate_spec(spec) and _validate_pre(prereleases):+                    self._spec = spec+                    self._prereleases = prereleases+                    return+            if len(state) == 2 and isinstance(state[1], dict):+                # Format (packaging 26.0-26.1): (None, {slot: value}).+                _, slot_dict = state+                spec = slot_dict.get("_spec")+                prereleases = slot_dict.get("_prereleases", "invalid")+                if _validate_spec(spec) and _validate_pre(prereleases):+                    self._spec = spec+                    self._prereleases = prereleases+                    return+        if isinstance(state, dict):+            # Old format (packaging <= 25.x, no __slots__): state is a plain dict.+            spec = state.get("_spec")+            prereleases = state.get("_prereleases", "invalid")+            if _validate_spec(spec) and _validate_pre(prereleases):+                self._spec = spec+                self._prereleases = prereleases+                return++        raise TypeError(f"Cannot restore Specifier from {state!r}")+     @property@@ -1259,2 +1338,14 @@     specifiers (``>=3.0,!=3.1``), or no specifier at all.++    Instances are safe to serialize with :mod:`pickle`. They use a stable+    format so the same pickle can be loaded in future packaging+    releases.++    .. versionchanged:: 26.2++        Added a stable pickle format. Pickles created with+        packaging 26.2+ can be unpickled with future releases.+        Backward compatibility with pickles from+        packaging < 26.2 is supported but may be removed in a future+        release.     """@@ -1348,2 +1439,65 @@         self._is_unsatisfiable = None++    def __getstate__(self) -> tuple[tuple[Specifier, ...], bool | None]:+        # Return state as a 2-item tuple for compactness:+        #   (specs, prereleases)+        # Cache members are excluded and will be recomputed on demand.+        return (self._specs, self._prereleases)++    def __setstate__(self, state: object) -> None:+        # Always discard cached values - they will be recomputed on demand.+        self._resolved_ops = None+        self._is_unsatisfiable = None++        if isinstance(state, tuple):+            if len(state) == 2:+                # New format (26.2+): (specs, prereleases)+                specs, prereleases = state+                if (+                    isinstance(specs, tuple)+                    and all(isinstance(s, Specifier) for s in specs)+                    and _validate_pre(prereleases)+                ):+                    self._specs = specs+                    self._prereleases = prereleases+                    self._canonicalized = len(specs) <= 1+                    self._has_arbitrary = any("===" in str(s) for s in specs)+                    return+            if len(state) == 2 and isinstance(state[1], dict):+                # Format (packaging 26.0-26.1): (None, {slot: value}).+                _, slot_dict = state+                specs = slot_dict.get("_specs", ())+                prereleases = slot_dict.get("_prereleases")+                # Convert frozenset to tuple (26.0 stored as frozenset)+                if isinstance(specs, frozenset):+                    specs = tuple(sorted(specs, key=str))+                if (+                    isinstance(specs, tuple)+                    and all(isinstance(s, Specifier) for s in specs)+                    and _validate_pre(prereleases)+                ):+                    self._specs = specs+                    self._prereleases = prereleases+                    self._canonicalized = len(self._specs) <= 1+                    self._has_arbitrary = any("===" in str(s) for s in self._specs)+                    return+        if isinstance(state, dict):+            # Old format (packaging <= 25.x, no __slots__): state is a plain dict.+            specs = state.get("_specs", ())+            prereleases = state.get("_prereleases")+            # Convert frozenset to tuple (26.0 stored as frozenset)+            if isinstance(specs, frozenset):+                specs = tuple(sorted(specs, key=str))+            if (+                isinstance(specs, tuple)+                and all(isinstance(s, Specifier) for s in specs)+                and _validate_pre(prereleases)+            ):+                self._specs = specs+                self._prereleases = prereleases+                self._canonicalized = len(self._specs) <= 1+                self._has_arbitrary = any("===" in str(s) for s in self._specs)+                return++        raise TypeError(f"Cannot restore SpecifierSet from {state!r}") 
src/packaging/tags.py +46 lines
--- +++ @@ -17,3 +17,2 @@     TYPE_CHECKING,-    Any,     Iterable,@@ -94,2 +93,12 @@     is also supported.++    Instances are safe to serialize with :mod:`pickle`. They use a stable+    format so the same pickle can be loaded in future packaging releases.++    .. versionchanged:: 26.2++        Added a stable pickle format. Pickles created with packaging 26.2+ can+        be unpickled with future releases.  Backward compatibility with pickles+        from packaging < 26.2 is supported but may be removed in a future+        release.     """@@ -160,8 +169,33 @@ -    def __setstate__(self, state: tuple[None, dict[str, Any]]) -> None:-        # The cached _hash is wrong when unpickling.-        _, slots = state-        for k, v in slots.items():-            setattr(self, k, v)-        self._hash = hash((self._interpreter, self._abi, self._platform))+    def __getstate__(self) -> tuple[str, str, str]:+        # Return state as a 3-item tuple: (interpreter, abi, platform).+        # Cache member _hash is excluded and will be recomputed.+        return (self._interpreter, self._abi, self._platform)++    def __setstate__(self, state: object) -> None:+        if isinstance(state, tuple):+            if len(state) == 3 and all(isinstance(s, str) for s in state):+                # New format (26.2+): (interpreter, abi, platform)+                self._interpreter, self._abi, self._platform = state+                self._hash = hash((self._interpreter, self._abi, self._platform))+                return+            if len(state) == 2 and isinstance(state[1], dict):+                # Old format (packaging <= 26.1, __slots__): (None, {slot: value}).+                _, slots = state+                try:+                    interpreter = slots["_interpreter"]+                    abi = slots["_abi"]+                    platform = slots["_platform"]+                except KeyError:+                    raise TypeError(f"Cannot restore Tag from {state!r}") from None+                if not all(+                    isinstance(value, str) for value in (interpreter, abi, platform)+                ):+                    raise TypeError(f"Cannot restore Tag from {state!r}")+                self._interpreter = interpreter.lower()+                self._abi = abi.lower()+                self._platform = platform.lower()+                self._hash = hash((self._interpreter, self._abi, self._platform))+                return+        raise TypeError(f"Cannot restore Tag from {state!r}") @@ -751,5 +785,7 @@ def _emscripten_platforms() -> Iterator[str]:-    pyemscripten_abi_version = sysconfig.get_config_var("PYEMSCRIPTEN_ABI_VERSION")-    if pyemscripten_abi_version:-        yield f"pyemscripten_{pyemscripten_abi_version}_wasm32"+    pyemscripten_platform_version = sysconfig.get_config_var(+        "PYEMSCRIPTEN_PLATFORM_VERSION"+    )+    if pyemscripten_platform_version:+        yield f"pyemscripten_{pyemscripten_platform_version}_wasm32"     yield from _generic_platforms()
src/packaging/version.py +77 lines
--- +++ @@ -360,2 +360,12 @@     part of a version.++    Instances are safe to serialize with :mod:`pickle`. They use a stable+    format so the same pickle can be loaded in future packaging releases.++    .. versionchanged:: 26.2++        Added a stable pickle format. Pickles created with packaging 26.2+ can+        be unpickled with future releases.  Backward compatibility with pickles+        from packaging < 26.2 is supported but may be removed in a future+        release.     """@@ -743,2 +753,69 @@ +    def __getstate__(+        self,+    ) -> tuple[+        int,+        tuple[int, ...],+        tuple[str, int] | None,+        tuple[str, int] | None,+        tuple[str, int] | None,+        LocalType | None,+    ]:+        # Return state as a 6-item tuple for compactness:+        #   (epoch, release, pre, post, dev, local)+        # Cache members are excluded and will be recomputed on demand+        return (+            self._epoch,+            self._release,+            self._pre,+            self._post,+            self._dev,+            self._local,+        )++    def __setstate__(self, state: object) -> None:+        # Always discard cached values — they may contain stale references+        # (e.g. packaging._structures.InfinityType from pre-26.1 pickles)+        # and will be recomputed on demand from the core fields above.+        self._key_cache = None+        self._hash_cache = None++        if isinstance(state, tuple):+            if len(state) == 6:+                # New format (26.2+): (epoch, release, pre, post, dev, local)+                (+                    self._epoch,+                    self._release,+                    self._pre,+                    self._post,+                    self._dev,+                    self._local,+                ) = state+                return+            if len(state) == 2:+                # Format (packaging 26.0-26.1): (None, {slot: value}).+                _, slot_dict = state+                if isinstance(slot_dict, dict):+                    self._epoch = slot_dict["_epoch"]+                    self._release = slot_dict["_release"]+                    self._pre = slot_dict.get("_pre")+                    self._post = slot_dict.get("_post")+                    self._dev = slot_dict.get("_dev")+                    self._local = slot_dict.get("_local")+                    return+        if isinstance(state, dict):+            # Old format (packaging <= 25.x, no __slots__): state is a plain+            # dict with "_version" (_Version NamedTuple) and "_key" entries.+            version_nt = state.get("_version")+            if version_nt is not None:+                self._epoch = version_nt.epoch+                self._release = version_nt.release+                self._pre = version_nt.pre+                self._post = version_nt.post+                self._dev = version_nt.dev+                self._local = version_nt.local+                return++        raise TypeError(f"Cannot restore Version from {state!r}")+     @property
tests/test_markers.py +156 lines
--- +++ @@ -8,2 +8,3 @@ import os+import pickle import platform@@ -15,3 +16,3 @@ -from packaging._parser import Node+from packaging._parser import Node, Op, Value, Variable from packaging.markers import (@@ -566 +567,155 @@     assert m.evaluate(env) is True++[email protected](+    "marker_str",+    [+        'python_version >= "3.8"',+        'python_version >= "3.8" and os_name == "posix"',+        'python_version >= "3.8" or platform_system == "Windows"',+        'extra == "security"',+    ],+)+def test_pickle_marker_roundtrip(marker_str: str) -> None:+    # Make sure equality and str() work between a pickle/unpickle round trip.+    m = Marker(marker_str)+    loaded = pickle.loads(pickle.dumps(m))+    assert loaded == m+    assert str(loaded) == str(m)+++def test_pickle_marker_setstate_rejects_invalid_state() -> None:+    # Cover the TypeError branches in __setstate__ for invalid input.+    m = Marker.__new__(Marker)+    with pytest.raises(TypeError, match="Cannot restore Marker"):+        m.__setstate__(12345)+    with pytest.raises(TypeError, match="Cannot restore Marker"):+        m.__setstate__((1, 2, 3))  # Wrong tuple length+++# Pickle bytes generated with packaging==26.1, Python 3.13.1, pickle protocol 2.+# Format: __slots__ (no __getstate__), state is (None, {slot: value}).+_PACKAGING_26_1_PICKLE_MARKER_PYTHON_VERSION_GE_3_8 = (+    b"\x80\x02cpackaging.markers\nMarker\nq\x00)\x81q\x01N}q\x02X\x08\x00"+    b"\x00\x00_markersq\x03]q\x04cpackaging._parser\nVariable\nq\x05)\x81"+    b"q\x06N}q\x07X\x05\x00\x00\x00valueq\x08X\x0e\x00\x00\x00python_vers"+    b"ionq\ts\x86q\nbcpackaging._parser\nOp\nq\x0b)\x81q\x0cN}q\rh\x08X\x02"+    b"\x00\x00\x00>=q\x0es\x86q\x0fbcpackaging._parser\nValue\nq\x10)\x81q"+    b"\x11N}q\x12h\x08X\x03\x00\x00\x003.8q\x13s\x86q\x14b\x87q\x15as\x86"+    b"q\x16b."+)+++# Pickle bytes generated with packaging==26.0, Python 3.13.1, pickle protocol 2.+# Format: __slots__ (no __getstate__), state is plain __dict__.+_PACKAGING_26_0_PICKLE_MARKER_PYTHON_VERSION_GE_3_8 = (+    b"\x80\x02cpackaging.markers\nMarker\nq\x00)\x81q\x01}q\x02X\x08\x00\x00"+    b"\x00_markersq\x03]q\x04cpackaging._parser\nVariable\nq\x05)\x81q\x06N}"+    b"q\x07X\x05\x00\x00\x00valueq\x08X\x0e\x00\x00\x00python_versionq\ts\x86"+    b"q\nbcpackaging._parser\nOp\nq\x0b)\x81q\x0cN}q\rh\x08X\x02\x00\x00"+    b"\x00>=q\x0es\x86q\x0fbcpackaging._parser\nValue\nq\x10)\x81q\x11N}q\x12"+    b"h\x08X\x03\x00\x00\x003.8q\x13s\x86q\x14b\x87q\x15asb."+)++# Format: __slots__ with Node objects using __dict__ format (packaging <= 25.0).+# Now loadable because Node classes have __getstate__/__setstate__.+_PACKAGING_25_0_PICKLE_MARKER_PYTHON_VERSION_GE_3_8 = (+    b"\x80\x02cpackaging.markers\nMarker\nq\x00)\x81q\x01}q\x02X\x08\x00\x00"+    b"\x00_markersq\x03]q\x04cpackaging._parser\nVariable\nq\x05)\x81q\x06}q\x07"+    b"X\x05\x00\x00\x00valueq\x08X\x0e\x00\x00\x00python_versionq\tsbcpackaging"+    b"._parser\nOp\nq\n)\x81q\x0b}q\x0ch\x08X\x02\x00\x00\x00>=q\rsbcpackaging"+    b"._parser\nValue\nq\x0e)\x81q\x0f}q\x10h\x08X\x03\x00\x00\x003.8q\x11sb\x87"+    b"q\x12asb."+)+++def test_pickle_marker_old_format_loads() -> None:+    # Verify that Marker pickles created with packaging <= 26.1 (__slots__,+    # no __getstate__) can be loaded and produce correct Marker objects.+    m = pickle.loads(_PACKAGING_26_1_PICKLE_MARKER_PYTHON_VERSION_GE_3_8)+    assert isinstance(m, Marker)+    assert str(m) == 'python_version >= "3.8"'+    assert m == Marker('python_version >= "3.8"')+++def test_pickle_marker_26_0_format_loads() -> None:+    # Verify that Marker pickles created with packaging 26.0 (plain __dict__)+    # can be loaded and produce correct Marker objects.+    m = pickle.loads(_PACKAGING_26_0_PICKLE_MARKER_PYTHON_VERSION_GE_3_8)+    assert isinstance(m, Marker)+    assert str(m) == 'python_version >= "3.8"'+    assert m == Marker('python_version >= "3.8"')+++def test_pickle_marker_25_0_format_loads() -> None:+    # Verify that Marker pickles created with packaging 25.0 (with Node __dict__)+    # can now be loaded thanks to __getstate__/__setstate__ in Node classes.+    m = pickle.loads(_PACKAGING_25_0_PICKLE_MARKER_PYTHON_VERSION_GE_3_8)+    assert isinstance(m, Marker)+    assert str(m) == 'python_version >= "3.8"'+    assert m == Marker('python_version >= "3.8"')+++def test_pickle_node_roundtrip() -> None:+    # Cover Node.__getstate__ and Node.__setstate__ with the new string format.+    for node in (Variable("python_version"), Value("3.8"), Op(">=")):+        loaded = pickle.loads(pickle.dumps(node))+        assert loaded.value == node.value+        assert str(loaded) == str(node)+++def test_pickle_node_setstate_rejects_invalid_state() -> None:+    # Cover the TypeError branch in Node.__setstate__ for invalid input.+    node = Variable.__new__(Variable)+    with pytest.raises(TypeError, match="Cannot restore Variable"):+        node.__setstate__(12345)++    node2 = Variable.__new__(Variable)+    with pytest.raises(TypeError, match="Cannot restore Variable"):+        node2.__setstate__((1, 2, 3))  # Wrong tuple length++    # Cover the legacy tuple branch where slot_dict doesn't have "value".+    node3 = Variable.__new__(Variable)+    with pytest.raises(TypeError, match="Cannot restore Variable"):+        node3.__setstate__((None, {"wrong_key": "foo"}))++    # Cover the legacy tuple branch where slot_dict has "value" but it's not a str.+    node4 = Variable.__new__(Variable)+    with pytest.raises(TypeError, match="Cannot restore Variable value from 123"):+        node4.__setstate__((None, {"value": 123}))++    # Cover the legacy dict branch where "value" exists but it's not a str.+    node5 = Value.__new__(Value)+    with pytest.raises(TypeError, match="Cannot restore Value value from 456"):+        node5.__setstate__({"value": 456})++    # Cover the legacy dict branch on Op (different subclass to ensure coverage).+    node6 = Op.__new__(Op)+    with pytest.raises(TypeError, match="Cannot restore Op value from 789"):+        node6.__setstate__({"value": 789})+++def test_pickle_marker_setstate_legacy_slot_dict_without_markers_key() -> None:+    # Cover Marker.__setstate__ legacy tuple branch where slot_dict has no "_markers".+    m = Marker.__new__(Marker)+    with pytest.raises(TypeError, match="Cannot restore Marker"):+        m.__setstate__((None, {"other_key": "value"}))+++def test_pickle_marker_setstate_rejects_invalid_markers_type() -> None:+    # Cover the dict branch where "_markers" exists but is not a list.+    m1 = Marker.__new__(Marker)+    with pytest.raises(TypeError, match="Cannot restore Marker"):+        m1.__setstate__({"_markers": "not a list"})++    # Cover the tuple branch where "_markers" exists but is not a list.+    m2 = Marker.__new__(Marker)+    with pytest.raises(TypeError, match="Cannot restore Marker"):+        m2.__setstate__((None, {"_markers": "not a list"}))+++def test_pickle_marker_setstate_rejects_invalid_marker_string() -> None:+    # Cover the string branch where parsing raises ParserSyntaxError.+    m = Marker.__new__(Marker)+    with pytest.raises(TypeError, match="Cannot restore Marker"):+        m.__setstate__("this is not a valid marker")
tests/test_requirements.py +134 lines
--- +++ @@ -5,2 +5,4 @@ from __future__ import annotations++import pickle @@ -707 +709,133 @@         assert Requirement("packaging>=21.3") != "packaging>=21.3"++[email protected](+    "req_str",+    [+        "requests",+        "requests>=2.0",+        "requests>=2.0,<3.0",+        'requests>=2.0; python_version >= "3.8"',+        "requests[security,socks]>=2.0",+        "my-pkg @ https://example.com",+        'Django>=1.4.2,!=1.5.0,!=1.5.1; python_version < "3"',+    ],+)+def test_pickle_requirement_roundtrip(req_str: str) -> None:+    # Make sure equality and str() work between a pickle/unpickle round trip.+    r = Requirement(req_str)+    loaded = pickle.loads(pickle.dumps(r))+    assert loaded == r+    assert str(loaded) == str(r)+++def test_pickle_requirement_setstate_rejects_invalid_state() -> None:+    # Cover the TypeError branches in __setstate__ for invalid input.+    r = Requirement.__new__(Requirement)+    with pytest.raises(TypeError, match="Cannot restore Requirement"):+        r.__setstate__(12345)+    with pytest.raises(TypeError, match="Cannot restore Requirement"):+        r.__setstate__((1, 2, 3))+++def test_pickle_requirement_setstate_rejects_invalid_string() -> None:+    # Cover the string branch where Requirement() raises InvalidRequirement.+    r = Requirement.__new__(Requirement)+    with pytest.raises(TypeError, match="Cannot restore Requirement"):+        r.__setstate__("this is not a valid requirement")+++# Pickle bytes generated with packaging==26.1, Python 3.13.1, pickle protocol 2.+# Format: plain __dict__ (no __getstate__). Contains nested SpecifierSet and+# Marker objects also pickled in their old format.+_PACKAGING_26_1_PICKLE_REQUESTS_GE_2_0_WITH_MARKER = (+    b"\x80\x02cpackaging.requirements\nRequirement\nq\x00)\x81q\x01}q\x02("+    b"X\x04\x00\x00\x00nameq\x03X\x08\x00\x00\x00requestsq\x04X\x03\x00"+    b"\x00\x00urlq\x05NX\x06\x00\x00\x00extrasq\x06c__builtin__\nset\nq\x07"+    b"]q\x08\x85q\tRq\nX\t\x00\x00\x00specifierq\x0bcpackaging.specifiers\n"+    b"SpecifierSet\nq\x0c)\x81q\rcpackaging.specifiers\nSpecifier\nq\x0e)\x81"+    b"q\x0fX\x02\x00\x00\x00>=q\x10X\x03\x00\x00\x002.0q\x11\x86q\x12N\x86"+    b"q\x13b\x85q\x14N\x86q\x15bX\x06\x00\x00\x00markerq\x16cpackaging."+    b"markers\nMarker\nq\x17)\x81q\x18N}q\x19X\x08\x00\x00\x00_markersq\x1a"+    b"]q\x1bcpackaging._parser\nVariable\nq\x1c)\x81q\x1dN}q\x1eX\x05\x00"+    b"\x00\x00valueq\x1fX\x0e\x00\x00\x00python_versionq s\x86q!b"+    b'cpackaging._parser\nOp\nq")\x81q#N}q$h\x1fX\x02\x00\x00\x00>=q%s'+    b"\x86q&bcpackaging._parser\nValue\nq')\x81q(N}q)h\x1fX\x03\x00\x00"+    b"\x003.8q*s\x86q+b\x87q,as\x86q-bub."+)+++# Pickle bytes generated with packaging==26.0, Python 3.13.1, pickle protocol 2.+# Format: plain __dict__ (no __getstate__).+_PACKAGING_26_0_PICKLE_REQUESTS_GE_2_0 = (+    b"\x80\x02cpackaging.requirements\nRequirement\nq\x00)\x81q\x01}q\x02("+    b"X\x04\x00\x00\x00nameq\x03X\x08\x00\x00\x00requestsq\x04X\x03\x00"+    b"\x00\x00urlq\x05NX\x06\x00\x00\x00extrasq\x06c__builtin__\nset\nq\x07"+    b"]q\x08\x85q\tRq\nX\t\x00\x00\x00specifierq\x0bcpackaging.specifiers\n"+    b"SpecifierSet\nq\x0c)\x81q\rN}q\x0e(X\x0c\x00\x00\x00_prereleasesq\x0f"+    b"NX\x06\x00\x00\x00_specsq\x10c__builtin__\nfrozenset\nq\x11]q\x12cpackag"+    b"ing.specifiers\nSpecifier\nq\x13)\x81q\x14N}q\x15(h\x0fNX\x05\x00\x00"+    b"\x00_specq\x16X\x02\x00\x00\x00>=q\x17X\x03\x00\x00\x002.0q\x18\x86q"+    b"\x19X\r\x00\x00\x00_spec_versionq\x1ah\x18cpackaging.version\nVersion\n"+    b"q\x1b)\x81q\x1cN}q\x1d(X\x04\x00\x00\x00_devq\x1eNX\x06\x00\x00\x00_epo"+    b"chq\x1fK\x00X\n\x00\x00\x00_key_cacheq NX\x06\x00\x00\x00_localq!NX\x05"+    b'\x00\x00\x00_postq"NX\x04\x00\x00\x00_preq#NX\x08\x00\x00\x00_releaseq$'+    b"K\x02K\x00\x86q%u\x86q&b\x86q'u\x86q(b"+    b"a\x85q)Rq*u\x86q+bX\x06\x00\x00"+    b"\x00markerq,Nub."+)+++# Pickle bytes generated with packaging==25.0, Python 3.13.1, pickle protocol 2.+# Format: plain __dict__ (no __getstate__).+_PACKAGING_25_0_PICKLE_REQUESTS_GE_2_0 = (+    b"\x80\x02cpackaging.requirements\nRequirement\nq\x00)\x81q\x01}q\x02("+    b"X\x04\x00\x00\x00nameq\x03X\x08\x00\x00\x00requestsq\x04X\x03\x00"+    b"\x00\x00urlq\x05NX\x06\x00\x00\x00extrasq\x06c__builtin__\nset\nq\x07"+    b"]q\x08\x85q\tRq\nX\t\x00\x00\x00specifierq\x0bcpackaging.specifiers\n"+    b"SpecifierSet\nq\x0c)\x81q\r}q\x0e(X\x06\x00\x00\x00_specsq\x0fc__bui"+    b"ltin__\nfrozenset\nq\x10]q\x11cpackaging.specifiers\nSpecifier\nq\x12)\x81"+    b"q\x13}q\x14(X\x05\x00\x00\x00_specq\x15X\x02\x00\x00\x00>=q\x16X\x03\x00"+    b"\x00\x002.0q\x17\x86q\x18X\x0c\x00\x00\x00_prereleasesq\x19Nuba\x85q\x1a"+    b"Rq\x1bh\x19NubX\x06\x00\x00\x00markerq\x1cNub."+)+++def test_pickle_requirement_old_format_loads() -> None:+    # Verify that Requirement pickles created with packaging <= 26.1 (plain+    # __dict__, no __getstate__) can be loaded and produce correct objects.+    r = pickle.loads(_PACKAGING_26_1_PICKLE_REQUESTS_GE_2_0_WITH_MARKER)+    assert isinstance(r, Requirement)+    assert r.name == "requests"+    assert r.url is None+    assert r.extras == set()+    assert str(r.specifier) == ">=2.0"+    assert r.marker is not None+    assert str(r.marker) == 'python_version >= "3.8"'+    assert r == Requirement('requests>=2.0; python_version >= "3.8"')+++def test_pickle_requirement_26_0_format_loads() -> None:+    # Verify that Requirement pickles created with packaging 26.0 (plain __dict__)+    # can be loaded and produce correct objects.+    r = pickle.loads(_PACKAGING_26_0_PICKLE_REQUESTS_GE_2_0)+    assert isinstance(r, Requirement)+    assert r.name == "requests"+    assert r.url is None+    assert r.extras == set()+    assert str(r.specifier) == ">=2.0"+    assert r.marker is None+    assert r == Requirement("requests>=2.0")+++def test_pickle_requirement_25_0_format_loads() -> None:+    # Verify that Requirement pickles created with packaging 25.0 (plain __dict__)+    # can be loaded and produce correct objects.+    r = pickle.loads(_PACKAGING_25_0_PICKLE_REQUESTS_GE_2_0)+    assert isinstance(r, Requirement)+    assert r.name == "requests"+    assert r.url is None+    assert r.extras == set()+    assert str(r.specifier) == ">=2.0"+    assert r.marker is None+    assert r == Requirement("requests>=2.0")
tests/test_specifiers.py +340 lines
--- +++ @@ -8,2 +8,3 @@ import operator+import pickle import re@@ -2847 +2848,340 @@         assert repr(upper2) == "<_UpperBound None)>"++[email protected](+    ("specifier", "spec_prereleases"),+    [+        (">=1.0", None),+        ("==2.1.*", None),+        ("!=2.2.*", None),+        ("~=2.0", None),+        (">=1.0.dev1", None),+        ("<1.0.post1", None),+        (">2.0.post1", None),+        ("<=5", None),+        (">=7.9a1", None),+        ("<1.0.dev1", None),+        ("===foobar", None),+        # With prereleases override+        (">=1.0", True),+        (">=1.0", False),+    ],+)+def test_pickle_specifier_roundtrip(+    specifier: str, spec_prereleases: bool | None+) -> None:+    # Make sure equality and str() work between a pickle/unpickle round trip.+    s = Specifier(specifier, prereleases=spec_prereleases)+    # Warm up caches before pickling to ensure they are excluded from state.+    _ = s.prereleases+    _ = s._to_ranges()+    loaded = pickle.loads(pickle.dumps(s))+    assert loaded == s+    assert str(loaded) == str(s)+    assert loaded.prereleases == s.prereleases++[email protected](+    ("specifiers", "ss_prereleases"),+    [+        (">=1.0,<2.0", None),+        ("~=1.0,!=1.1", None),+        (">=1.0.dev1,<2.0", None),+        ("", None),  # Empty+        (">=1.0,<2.0,!=1.5", None),+        # With prereleases override+        (">=1.0,<2.0", True),+        (">=1.0,<2.0", False),+    ],+)+def test_pickle_specifierset_roundtrip(+    specifiers: str, ss_prereleases: bool | None+) -> None:+    # Make sure equality and str() work between a pickle/unpickle round trip.+    ss = SpecifierSet(specifiers, prereleases=ss_prereleases)+    # Warm up caches before pickling to ensure they are excluded from state.+    _ = ss.prereleases+    _ = ss.is_unsatisfiable()+    list(ss.filter(["1.5"]))+    loaded = pickle.loads(pickle.dumps(ss))+    assert loaded == ss+    assert str(loaded) == str(ss)+    assert loaded.prereleases == ss.prereleases+++def test_pickle_setstate_rejects_invalid_state() -> None:+    # Cover the TypeError branches in __setstate__ for invalid input.+    s = Specifier.__new__(Specifier)+    with pytest.raises(TypeError, match="Cannot restore Specifier"):+        s.__setstate__((1, 2, 3))  # Wrong tuple length+    with pytest.raises(TypeError, match="Cannot restore Specifier"):+        s.__setstate__(12345)  # Not a tuple or dict++    ss = SpecifierSet.__new__(SpecifierSet)+    with pytest.raises(TypeError, match="Cannot restore SpecifierSet"):+        ss.__setstate__((1, 2, 3))  # Wrong tuple length+    with pytest.raises(TypeError, match="Cannot restore SpecifierSet"):+        ss.__setstate__(12345)  # Not a tuple or dict+++def test_pickle_specifier_setstate_rejects_malformed_legacy_state() -> None:+    # Verify validation catches malformed legacy slot-dict and dict formats.+    s = Specifier.__new__(Specifier)+    # Missing _spec key (legacy slot-dict format).+    with pytest.raises(TypeError, match="Cannot restore Specifier"):+        s.__setstate__((None, {"_prereleases": None}))+    # Missing _spec key (legacy dict format).+    with pytest.raises(TypeError, match="Cannot restore Specifier"):+        s.__setstate__({"_prereleases": None})+    # _spec is not a 2-tuple of strings.+    with pytest.raises(TypeError, match="Cannot restore Specifier"):+        s.__setstate__((("bad",), None))+    with pytest.raises(TypeError, match="Cannot restore Specifier"):+        s.__setstate__((None, {"_spec": 123}))+    # _prereleases is not bool|None.+    with pytest.raises(TypeError, match="Cannot restore Specifier"):+        s.__setstate__((("==", "1.0"), "yes"))+++def test_pickle_specifierset_setstate_rejects_malformed_legacy_state() -> None:+    # Verify validation catches malformed legacy slot-dict and dict formats.+    ss = SpecifierSet.__new__(SpecifierSet)+    # _specs contains non-Specifier items (legacy slot-dict format).+    with pytest.raises(TypeError, match="Cannot restore SpecifierSet"):+        ss.__setstate__((None, {"_specs": {1, 2}, "_prereleases": None}))+    # _specs contains non-Specifier items (legacy dict format).+    with pytest.raises(TypeError, match="Cannot restore SpecifierSet"):+        ss.__setstate__({"_specs": {1, 2}, "_prereleases": None})+++def test_pickle_specifierset_setstate_on_initialized_instance() -> None:+    # Cover the branch where hasattr(self, "_specs") is True in __setstate__.+    # This happens when __setstate__ is called on an already-initialized instance.+    ss = SpecifierSet(">=1.0")+    ss.__setstate__(((Specifier(">=2.0"),), None))+    assert ss == SpecifierSet(">=2.0")+++def test_pickle_specifier_setstate_clears_cache() -> None:+    # Verify that __setstate__ resets all three cached slots to None,+    # regardless of what was cached before the call.+    s = Specifier("==1.*")+    # Warm up every cache slot.+    _ = s.prereleases  # populates _spec_version+    _ = s._get_wildcard_split("1.*")  # populates _wildcard_split+    _ = s._to_ranges()  # populates _ranges+    assert s._spec_version is not None+    assert s._wildcard_split is not None+    assert s._ranges is not None++    s.__setstate__((("==", "1.*"), None))++    assert s._spec_version is None+    assert s._wildcard_split is None+    assert s._ranges is None+++def test_pickle_specifierset_setstate_clears_cache() -> None:+    # Verify that __setstate__ resets all cached slots to None,+    # regardless of what was cached before the call.+    ss = SpecifierSet(">=1.0,<2.0")+    # Warm up every cache slot.+    ss.is_unsatisfiable()  # populates _is_unsatisfiable+    list(ss.filter(["1.5"]))  # populates _resolved_ops+    assert ss._is_unsatisfiable is not None+    assert ss._resolved_ops is not None++    ss.__setstate__(((Specifier(">=3.0"), Specifier("<4.0")), None))++    assert ss._is_unsatisfiable is None+    assert ss._resolved_ops is None+++# Pickle bytes generated with packaging==25.0, Python 3.13.13, pickle protocol 2.+# Format: plain __dict__ (no __slots__). _spec is stored as a (operator, version) tuple+# and _prereleases as a separate key.+_PACKAGING_25_0_PICKLE_GE_3_10 = (+    b"\x80\x02cpackaging.specifiers\nSpecifier\nq\x00)\x81q\x01}q\x02"+    b"(X\x05\x00\x00\x00_specq\x03X\x02\x00\x00\x00>=q\x04X\x04\x00\x00"+    b"\x003.10q\x05\x86q\x06X\x0c\x00\x00\x00_prereleasesq\x07Nub."+)++_PACKAGING_25_0_PICKLE_SS_GE_3_10_LT_4_0 = (+    b"\x80\x02cpackaging.specifiers\nSpecifierSet\nq\x00)\x81q\x01}q\x02"+    b"(X\x06\x00\x00\x00_specsq\x03c__builtin__\nfrozenset\nq\x04]q\x05"+    b"(cpackaging.specifiers\nSpecifier\nq\x06)\x81q\x07}q\x08(X\x05\x00"+    b"\x00\x00_specq\tX\x02\x00\x00\x00>=q\nX\x04\x00\x00\x003.10q\x0b"+    b"\x86q\x0cX\x0c\x00\x00\x00_prereleasesq\rNubh\x06)\x81q\x0e}q\x0f"+    b"(h\tX\x01\x00\x00\x00<q\x10X\x03\x00\x00\x004.0q\x11\x86q\x12h\r"+    b"Nube\x85q\x13Rq\x14h\rNub."+)+++def test_pickle_specifier_25_0_format_loads() -> None:+    # Verify that Specifier pickles created with packaging <= 25.x (plain __dict__)+    # can be loaded and produce correct Specifier objects.+    s = pickle.loads(_PACKAGING_25_0_PICKLE_GE_3_10)+    assert isinstance(s, Specifier)+    assert str(s) == ">=3.10"+    assert s == Specifier(">=3.10")+    assert s.operator == ">="+    assert s.version == "3.10"+    assert s.prereleases == Specifier(">=3.10").prereleases+++def test_pickle_specifierset_25_0_format_loads() -> None:+    # Verify that SpecifierSet pickles created with packaging <= 25.x (plain __dict__,+    # _specs stored as a frozenset) can be loaded and produce correct objects.+    ss = pickle.loads(_PACKAGING_25_0_PICKLE_SS_GE_3_10_LT_4_0)+    assert isinstance(ss, SpecifierSet)+    assert ss == SpecifierSet(">=3.10,<4.0")+    assert "3.10" in ss+    assert "3.12" in ss+    assert "4.0" not in ss+    assert ss.prereleases is None+++# Pickle bytes generated with packaging==26.0, Python 3.13.13, pickle protocol 2.+# Format: __slots__ (no __dict__), state is (None, {slot: value}). Includes+# _spec_version slot (a cached Version object, may be present or None).+_PACKAGING_26_0_PICKLE_GE_3_10 = (+    b"\x80\x02cpackaging.specifiers\nSpecifier\nq\x00)\x81q\x01N}q\x02"+    b"(X\x0c\x00\x00\x00_prereleasesq\x03NX\x05\x00\x00\x00_specq\x04"+    b"X\x02\x00\x00\x00>=q\x05X\x04\x00\x00\x003.10q\x06\x86q\x07X\r"+    b"\x00\x00\x00_spec_versionq\x08Nu\x86q\tb."+)++_PACKAGING_26_0_PICKLE_SS_GE_3_10_LT_4_0 = (+    b"\x80\x02cpackaging.specifiers\nSpecifierSet\nq\x00)\x81q\x01N}q\x02"+    b"(X\x0c\x00\x00\x00_prereleasesq\x03NX\x06\x00\x00\x00_specsq\x04"+    b"c__builtin__\nfrozenset\nq\x05]q\x06(cpackaging.specifiers\nSpecifier"+    b"\nq\x07)\x81q\x08N}q\t(h\x03NX\x05\x00\x00\x00_specq\nX\x02\x00"+    b"\x00\x00>=q\x0bX\x04\x00\x00\x003.10q\x0c\x86q\rX\r\x00\x00\x00"+    b"_spec_versionq\x0eh\x0ccpackaging.version\nVersion\nq\x0f)\x81q\x10"+    b"N}q\x11(X\x04\x00\x00\x00_devq\x12NX\x06\x00\x00\x00_epochq\x13K"+    b"\x00X\n\x00\x00\x00_key_cacheq\x14NX\x06\x00\x00\x00_localq\x15N"+    b"X\x05\x00\x00\x00_postq\x16NX\x04\x00\x00\x00_preq\x17NX\x08\x00"+    b"\x00\x00_releaseq\x18K\x03K\n\x86q\x19u\x86q\x1ab\x86q\x1bu\x86"+    b"q\x1cbh\x07)\x81q\x1dN}q\x1e(h\x03Nh\nX\x01\x00\x00\x00<q\x1fX"+    b'\x03\x00\x00\x004.0q \x86q!h\x0eh h\x0f)\x81q"N}q#(h\x12Nh\x13'+    b"K\x00h\x14Nh\x15Nh\x16Nh\x17Nh\x18K\x04K\x00\x86q$u\x86q%b\x86"+    b"q&u\x86q'be\x85q(Rq)u\x86q*b."+)+++def test_pickle_specifier_26_0_slots_format_loads() -> None:+    # Verify that Specifier pickles created with packaging 26.0 (__slots__,+    # state is (None, {slot_dict})) can be loaded and produce correct objects.+    s = pickle.loads(_PACKAGING_26_0_PICKLE_GE_3_10)+    assert isinstance(s, Specifier)+    assert str(s) == ">=3.10"+    assert s == Specifier(">=3.10")+    assert s.operator == ">="+    assert s.version == "3.10"+    assert s.prereleases == Specifier(">=3.10").prereleases+++def test_pickle_specifierset_26_0_slots_format_loads() -> None:+    # Verify that SpecifierSet pickles created with packaging 26.0 (__slots__,+    # state is (None, {slot_dict}), _specs stored as frozenset) can be loaded.+    ss = pickle.loads(_PACKAGING_26_0_PICKLE_SS_GE_3_10_LT_4_0)+    assert isinstance(ss, SpecifierSet)+    assert ss == SpecifierSet(">=3.10,<4.0")+    assert "3.10" in ss
… 97 more lines (truncated)
tests/test_tags.py +105 lines
--- +++ @@ -1813,3 +1813,3 @@         config = {-            "PYEMSCRIPTEN_ABI_VERSION": "2026_0",+            "PYEMSCRIPTEN_PLATFORM_VERSION": "2026_0",         }@@ -1870,2 +1870,106 @@ @pytest.mark.parametrize(+    ("interpreter", "abi", "platform"),+    [+        ("py3", "none", "any"),+        ("cp39", "cp39", "linux_x86_64"),+        ("cp312", "cp312", "win_amd64"),+        ("pp310", "pypy310_pp73", "manylinux_2_17_x86_64"),+    ],+)+def test_pickle_tag_roundtrip(interpreter: str, abi: str, platform: str) -> None:+    # Make sure equality, str(), and hash() work between a pickle/unpickle round trip.+    t = tags.Tag(interpreter, abi, platform)+    loaded = pickle.loads(pickle.dumps(t))+    assert loaded == t+    assert str(loaded) == str(t)+    assert hash(loaded) == hash(t)+++def test_pickle_tag_setstate_rejects_invalid_state() -> None:+    # Cover the TypeError branches in __setstate__ for invalid input.+    t = tags.Tag.__new__(tags.Tag)+    with pytest.raises(TypeError, match="Cannot restore Tag"):+        t.__setstate__(12345)+    with pytest.raises(TypeError, match="Cannot restore Tag"):+        t.__setstate__((1, 2, 3))  # Wrong types, not all strings+    with pytest.raises(TypeError, match="Cannot restore Tag"):+        t.__setstate__((None, {"_interpreter": "cp39", "_abi": "cp39"}))+    with pytest.raises(TypeError, match="Cannot restore Tag"):+        t.__setstate__(+            (None, {"_interpreter": 123, "_abi": "cp39", "_platform": "linux_x86_64"})+        )+    with pytest.raises(TypeError, match="Cannot restore Tag"):+        t.__setstate__((1, 2))  # len==2 but second element not a dict+    with pytest.raises(TypeError, match="Cannot restore Tag"):+        t.__setstate__((1, 2, 3, 4))  # tuple length not 2 or 3+++# Pickle bytes generated with packaging==26.1, Python 3.13.1, pickle protocol 2.+# Format: __slots__ (no __getstate__), state is (None, {slot: value}). The+# _hash slot contains a pre-computed integer that must be discarded on load.+_PACKAGING_26_1_PICKLE_TAG_CP39 = (+    b"\x80\x02cpackaging.tags\nTag\nq\x00)\x81q\x01N}q\x02(X\x04\x00\x00"+    b"\x00_abiq\x03X\x04\x00\x00\x00cp39q\x04X\x05\x00\x00\x00_hashq\x05"+    b"\x8a\x08)\xb1\xe8\x9d\x90\xf8tFX\x0c\x00\x00\x00_interpreterq\x06X"+    b"\x04\x00\x00\x00cp39q\x07X\t\x00\x00\x00_platformq\x08X\x0c\x00\x00"+    b"\x00linux_x86_64q\tu\x86q\nb."+)+++# Pickle bytes generated with packaging==26.0, Python 3.13.1, pickle protocol 2.+# Format: __slots__ (no __getstate__), state is (None, {slot: value}).+_PACKAGING_26_0_PICKLE_TAG_CP39 = (+    b"\x80\x02cpackaging.tags\nTag\nq\x00)\x81q\x01N}q\x02(X\x04\x00\x00"+    b"\x00_abiq\x03X\x04\x00\x00\x00cp39q\x04X\x05\x00\x00\x00_hashq\x05"+    b"\x8a\x08\xc1\xdb\xa0\xe5]7z\x87X\x0c\x00\x00\x00_interpreterq\x06X"+    b"\x04\x00\x00\x00cp39q\x07X\t\x00\x00\x00_platformq\x08X\x0c\x00\x00"+    b"\x00linux_x86_64q\tu\x86q\nb."+)+++# Pickle bytes generated with packaging==25.0, Python 3.13.1, pickle protocol 2.+# Format: plain __dict__ (no __slots__).+_PACKAGING_25_0_PICKLE_TAG_CP39 = (+    b"\x80\x02cpackaging.tags\nTag\nq\x00)\x81q\x01N}q\x02(X\x04\x00\x00\x00"+    b"_abiq\x03X\x04\x00\x00\x00cp39q\x04X\x05\x00\x00\x00_hashq\x05\x8a\x08"+    b"\xea\xa5X\x92\xa5\xc9\x11\x0cX\x0c\x00\x00\x00_interpreterq\x06X\x04"+    b"\x00\x00\x00cp39q\x07X\t\x00\x00\x00_platformq\x08X\x0c\x00\x00\x00"+    b"linux_x86_64q\tu\x86q\nb."+)+++def test_pickle_tag_old_format_loads() -> None:+    # Verify that Tag pickles created with packaging <= 26.1 (__slots__,+    # no __getstate__) can be loaded and produce correct Tag objects.+    t = pickle.loads(_PACKAGING_26_1_PICKLE_TAG_CP39)+    assert isinstance(t, tags.Tag)+    assert str(t) == "cp39-cp39-linux_x86_64"+    assert t == tags.Tag("cp39", "cp39", "linux_x86_64")+    assert t.interpreter == "cp39"+    assert t.abi == "cp39"+    assert t.platform == "linux_x86_64"+    assert t._hash == hash(("cp39", "cp39", "linux_x86_64"))+++def test_pickle_tag_26_0_format_loads() -> None:+    # Verify that Tag pickles created with packaging 26.0 (__slots__,+    # no __getstate__) can be loaded and produce correct Tag objects.+    t = pickle.loads(_PACKAGING_26_0_PICKLE_TAG_CP39)+    assert isinstance(t, tags.Tag)+    assert str(t) == "cp39-cp39-linux_x86_64"+    assert t == tags.Tag("cp39", "cp39", "linux_x86_64")+    assert t._hash == hash(("cp39", "cp39", "linux_x86_64"))+++def test_pickle_tag_25_0_format_loads() -> None:+    # Verify that Tag pickles created with packaging 25.0 (plain __dict__)+    # can be loaded and produce correct Tag objects.+    t = pickle.loads(_PACKAGING_25_0_PICKLE_TAG_CP39)+    assert isinstance(t, tags.Tag)+    assert str(t) == "cp39-cp39-linux_x86_64"+    assert t == tags.Tag("cp39", "cp39", "linux_x86_64")+    assert t._hash == hash(("cp39", "cp39", "linux_x86_64"))++[email protected](     ("supported", "things", "expected"),
tests/test_version.py +148 lines
--- +++ @@ -8,2 +8,3 @@ import operator+import pickle import sys@@ -14,2 +15,3 @@ +from packaging._structures import Infinity, NegativeInfinity from packaging.version import (@@ -1259 +1261,147 @@     assert v == Version(string)++[email protected](+    "version",+    [+        "1.2.3",+        "0.1.0",+        "2.0a1",+        "1.0b2",+        "3.0rc1",+        "1.0.post1",+        "1.0.dev3",+        "1!2.3.4a5.post6.dev7+zzz",+    ],+)+def test_pickle_roundtrip(version: str) -> None:+    # Make sure equality and str() work between a pickle/unpickle round trip.+    v = Version(version)+    loaded = pickle.loads(pickle.dumps(v))+    assert loaded == v+    assert str(loaded) == str(v)+++# Pickle bytes generated with packaging==25.0, Python 3.13.1, pickle protocol 2.+# These contain references to packaging._structures.InfinityType and+# NegativeInfinityType in the _key cache, which were removed in packaging 26.1.+_PACKAGING_25_0_PICKLE_V1_2_3 = (+    b"\x80\x02cpackaging.version\nVersion\nq\x00)\x81q\x01}q\x02"+    b"(X\x08\x00\x00\x00_versionq\x03cpackaging.version\n_Version\n"+    b"q\x04(K\x00K\x01K\x02K\x03\x87q\x05NNNNtq\x06\x81q\x07X\x04"+    b"\x00\x00\x00_keyq\x08(K\x00K\x01K\x02K\x03\x87q\tcpackaging._structures\n"+    b"InfinityType\nq\n)\x81q\x0bcpackaging._structures\nNegativeInfinityType\n"+    b"q\x0c)\x81q\rh\x0bh\rtq\x0eub."+)++_PACKAGING_25_0_PICKLE_V2_0A1 = (+    b"\x80\x02cpackaging.version\nVersion\nq\x00)\x81q\x01}q\x02"+    b"(X\x08\x00\x00\x00_versionq\x03cpackaging.version\n_Version\n"+    b"q\x04(K\x00K\x02K\x00\x86q\x05NX\x01\x00\x00\x00aq\x06K\x01"+    b"\x86q\x07NNtq\x08\x81q\tX\x04\x00\x00\x00_keyq\n(K\x00K\x02"+    b"\x85q\x0bh\x07cpackaging._structures\nNegativeInfinityType\n"+    b"q\x0c)\x81q\rcpackaging._structures\nInfinityType\nq\x0e)\x81"+    b"q\x0fh\rtq\x10ub."+)+++def test_pickle_old_format_loads() -> None:+    # Verify that pickles created with packaging <= 25.x can be loaded+    # and produce correct Version objects.+    v = pickle.loads(_PACKAGING_25_0_PICKLE_V1_2_3)+    assert isinstance(v, Version)+    assert str(v) == "1.2.3"+    assert v == Version("1.2.3")+    assert v < Version("2.0")+    assert v > Version("1.2.2")++    v2 = pickle.loads(_PACKAGING_25_0_PICKLE_V2_0A1)+    assert isinstance(v2, Version)+    assert str(v2) == "2.0a1"+    assert v2 == Version("2.0a1")+    assert v2 < Version("2.0")+++def test_pickle_old_format_re_pickled_is_clean() -> None:+    # Verify that loading an old pickle and re-pickling it produces+    # a clean payload that no longer references packaging._structures.+    v = pickle.loads(_PACKAGING_25_0_PICKLE_V1_2_3)+    new_data = pickle.dumps(v)+    assert b"_structures" not in new_data+    # And the re-pickled version still works.+    v2 = pickle.loads(new_data)+    assert v2 == Version("1.2.3")+    assert str(v2) == "1.2.3"+++# Pickle bytes generated with packaging==26.0, Python 3.13.1, pickle protocol 2.+# 26.0 used __slots__ (no __dict__), so the pickle state is (None, {slot: value}).+# The _key_cache slot still contains packaging._structures.InfinityType references.+_PACKAGING_26_0_PICKLE_V1_2_3 = (+    b"\x80\x02cpackaging.version\nVersion\nq\x00)\x81q\x01N}q\x02"+    b"(X\x04\x00\x00\x00_devq\x03NX\x06\x00\x00\x00_epochq\x04K\x00"+    b"X\n\x00\x00\x00_key_cacheq\x05(K\x00K\x01K\x02K\x03\x87q\x06"+    b"cpackaging._structures\nInfinityType\nq\x07)\x81q\x08cpackaging._structures\n"+    b"NegativeInfinityType\nq\t)\x81q\nh\x08h\ntq\x0bX\x06\x00\x00\x00"+    b"_localq\x0cNX\x05\x00\x00\x00_postq\rNX\x04\x00\x00\x00_preq\x0e"+    b"NX\x08\x00\x00\x00_releaseq\x0fh\x06u\x86q\x10b."+)+++def test_pickle_26_0_slots_format_loads() -> None:+    # Verify that pickles created with packaging 26.0 (__slots__, no __reduce__)+    # can be loaded and produce correct Version objects.+    v = pickle.loads(_PACKAGING_26_0_PICKLE_V1_2_3)+    assert isinstance(v, Version)+    assert str(v) == "1.2.3"+    assert v == Version("1.2.3")+    assert v < Version("2.0")+    assert v > Version("1.2.2")+++# Pickle bytes generated with packaging 26.2+ (6-tuple __getstate__ format),+# Python 3.13.1, pickle protocol 2.+_PACKAGING_26_2_TUPLE_PICKLE_V1E2_3_4A5_POST6_DEV7_ZZZ = (+    b"\x80\x02cpackaging.version\nVersion\nq\x00)\x81q\x01(K\x01K\x02K\x03"+    b"K\x04\x87q\x02X\x01\x00\x00\x00aq\x03K\x05\x86q\x04X\x04\x00\x00"+    b"\x00postq\x05K\x06\x86q\x06X\x03\x00\x00\x00devq\x07K\x07\x86q\x08"+    b"X\x03\x00\x00\x00zzzq\t\x85q\ntq\x0bb."+)+++def test_pickle_26_2_tuple_getstate_loads() -> None:+    # Verify that pickles created with packaging 26.2+ (6-tuple __getstate__)+    # can be loaded and produce correct Version objects.+    v = pickle.loads(_PACKAGING_26_2_TUPLE_PICKLE_V1E2_3_4A5_POST6_DEV7_ZZZ)+    assert isinstance(v, Version)+    assert str(v) == "1!2.3.4a5.post6.dev7+zzz"+    assert v == Version("1!2.3.4a5.post6.dev7+zzz")+    assert v.epoch == 1+    assert v.release == (2, 3, 4)+    assert v.pre == ("a", 5)+    assert v.post == 6+    assert v.dev == 7+    assert v.local == "zzz"+++def test_pickle_setstate_rejects_invalid_state() -> None:+    # Cover the TypeError branches in __setstate__ for invalid input.+    v = Version.__new__(Version)+    # dict without "_version" key+    with pytest.raises(TypeError, match="Cannot restore Version"):+        v.__setstate__({"bad_key": 123})+    # tuple with non-dict second element+    with pytest.raises(TypeError, match="Cannot restore Version"):+        v.__setstate__((None, "not_a_dict"))+    # tuple with unexpected length (not 2 or 6)+    with pytest.raises(TypeError, match="Cannot restore Version"):+        v.__setstate__((1, 2, 3))+    # completely wrong type+    with pytest.raises(TypeError, match="Cannot restore Version"):+        v.__setstate__(12345)+++def test_structures_shim_repr() -> None:+    # Cover the __repr__ methods on the backward-compatibility shim classes.+    assert repr(Infinity) == "Infinity"+    assert repr(NegativeInfinity) == "-Infinity"
pluggy pypi
1.6.0 1y ago incident on record
YANKBURST
latest 1.6.0 versions 24 maintainers 1
0.10.0
0.11.0
0.12.0
0.13.0
0.13.1
1.0.0
1.1.0
1.2.0
1.3.0
1.4.0
1.5.0
1.6.0
YANK
1.1.0 marked yanked (still downloadable)
high · registry-verified · 2023-06-19 · 2y ago
BURST
2 releases in 0m: 0.5.1, 0.5.2
info · registry-verified · 2018-04-15 · 8y ago
release diff 1.5.0 → 1.6.0
+2 added · -1 removed · ~30 modified
pyproject.toml +50 lines
--- +++ @@ -3,4 +3,4 @@   # sync with setup.py until we discard non-pep-517/518-  "setuptools>=45.0",-  "setuptools-scm[toml]>=6.2.3",+  "setuptools>=65.0",+  "setuptools-scm[toml]>=8.0", ]@@ -8,7 +8,52 @@ +[project]+name = "pluggy"+license = {text = "MIT"}+authors = [{name = "Holger Krekel", email = "[email protected]"}]+classifiers = [+  "Development Status :: 6 - Mature",+  "Intended Audience :: Developers",+  "License :: OSI Approved :: MIT License",+  "Operating System :: POSIX",+  "Operating System :: Microsoft :: Windows",+  "Operating System :: MacOS :: MacOS X",+  "Topic :: Software Development :: Testing",+  "Topic :: Software Development :: Libraries",+  "Topic :: Utilities",+  "Programming Language :: Python :: Implementation :: CPython",+  "Programming Language :: Python :: Implementation :: PyPy",+  "Programming Language :: Python :: 3",+  "Programming Language :: Python :: 3 :: Only",+  "Programming Language :: Python :: 3.9",+  "Programming Language :: Python :: 3.10",+  "Programming Language :: Python :: 3.11",+  "Programming Language :: Python :: 3.12",+  "Programming Language :: Python :: 3.13",+]+description = "plugin and hook calling mechanisms for python"+readme = {file = "README.rst", content-type = "text/x-rst"}+requires-python = ">=3.9"++dynamic = ["version"]+[project.optional-dependencies]+dev = ["pre-commit", "tox"]+testing = ["pytest", "pytest-benchmark", "coverage"]++[tool.setuptools]+packages = ["pluggy"]+package-dir =  {""="src"}+package-data = {"pluggy" = ["py.typed"]}+  [tool.ruff.lint]-select = [-    "I",  # isort+extend-select = [+  "I",  # isort+  "F","E", "W",+  "UP", "ANN", ]+extend-ignore = ["ANN401"]++[tool.ruff.lint.extend-per-file-ignores]+"testing/*.py" = ["ANN001", "ANN002", "ANN003",  "ANN201", "ANN202","ANN204" ,]+"docs/*.py" = ["ANN001", "ANN002", "ANN003",  "ANN201", "ANN202","ANN204" ,] @@ -23,3 +68,3 @@ [tool.setuptools_scm]-write_to = "src/pluggy/_version.py"+version_file = "src/pluggy/_version.py" 
scripts/release.py +6 lines
--- +++ @@ -14,3 +14,3 @@ -def create_branch(version):+def create_branch(version: str) -> Repo:     """Create a fresh branch from upstream/main"""@@ -38,3 +38,3 @@ -def pre_release(version):+def pre_release(version: str) -> None:     """Generates new docs, release announcements and creates a local tag."""@@ -49,3 +49,3 @@ -def changelog(version, write_out=False):+def changelog(version: str, write_out: bool = False) -> None:     if write_out:@@ -58,3 +58,3 @@ -def main():+def main() -> int:     init(autoreset=True)@@ -68,2 +68,4 @@         return 1+    else:+        return 0 
scripts/towncrier-draft-to-file.py +1 lines
--- +++ @@ -4,3 +4,3 @@ -def main():+def main() -> int:     """
setup.cfg +0 lines
--- +++ @@ -1,53 +1 @@-[metadata]-name = pluggy-description = plugin and hook calling mechanisms for python-long_description = file: README.rst-long_description_content_type = text/x-rst-license = MIT-platforms = unix, linux, osx, win32-author = Holger Krekel-author_email = [email protected]-url = https://github.com/pytest-dev/pluggy-classifiers = -	Development Status :: 6 - Mature-	Intended Audience :: Developers-	License :: OSI Approved :: MIT License-	Operating System :: POSIX-	Operating System :: Microsoft :: Windows-	Operating System :: MacOS :: MacOS X-	Topic :: Software Development :: Testing-	Topic :: Software Development :: Libraries-	Topic :: Utilities-	Programming Language :: Python :: Implementation :: CPython-	Programming Language :: Python :: Implementation :: PyPy-	Programming Language :: Python :: 3-	Programming Language :: Python :: 3 :: Only-	Programming Language :: Python :: 3.8-	Programming Language :: Python :: 3.9-	Programming Language :: Python :: 3.10-	Programming Language :: Python :: 3.11--[options]-packages = -	pluggy-python_requires = >=3.8-package_dir = -	=src-setup_requires = -	setuptools-scm--[options.extras_require]-dev = -	pre-commit-	tox-testing = -	pytest-	pytest-benchmark--[options.package_data]-pluggy = py.typed--[devpi:upload]-formats = sdist.tgz,bdist_wheel- [egg_info]
src/pluggy/__init__.py +1 lines
--- +++ @@ -1,8 +1 @@-try:-    from ._version import version as __version__-except ImportError:-    # broken installation, we don't even try-    # unknown only works because we do poor mans version compare-    __version__ = "unknown"- __all__ = [@@ -23,3 +16,2 @@ ]- from ._hooks import HookCaller@@ -35,2 +27,3 @@ from ._result import Result+from ._version import version as __version__ from ._warnings import PluggyTeardownRaisedWarning
src/pluggy/_callers.py +87 lines
--- +++ @@ -6,9 +6,7 @@ +from collections.abc import Generator+from collections.abc import Mapping+from collections.abc import Sequence from typing import cast-from typing import Generator-from typing import Mapping from typing import NoReturn-from typing import Sequence-from typing import Tuple-from typing import Union import warnings@@ -23,6 +21,34 @@ # Wrapping with a tuple is the fastest type-safe way I found to do it.-Teardown = Union[-    Tuple[Generator[None, Result[object], None], HookImpl],-    Generator[None, object, object],-]+Teardown = Generator[None, object, object]+++def run_old_style_hookwrapper(+    hook_impl: HookImpl, hook_name: str, args: Sequence[object]+) -> Teardown:+    """+    backward compatibility wrapper to run a old style hookwrapper as a wrapper+    """++    teardown: Teardown = cast(Teardown, hook_impl.function(*args))+    try:+        next(teardown)+    except StopIteration:+        _raise_wrapfail(teardown, "did not yield")+    try:+        res = yield+        result = Result(res, None)+    except BaseException as exc:+        result = Result(None, exc)+    try:+        teardown.send(result)+    except StopIteration:+        pass+    except BaseException as e:+        _warn_teardown_exception(hook_name, hook_impl, e)+        raise+    else:+        _raise_wrapfail(teardown, "has second yield")+    finally:+        teardown.close()+    return result.get_result() @@ -30,11 +56,8 @@ def _raise_wrapfail(-    wrap_controller: (-        Generator[None, Result[object], None] | Generator[None, object, object]-    ),+    wrap_controller: Generator[None, object, object],     msg: str, ) -> NoReturn:-    co = wrap_controller.gi_code+    co = wrap_controller.gi_code  # type: ignore[attr-defined]     raise RuntimeError(-        "wrap_controller at %r %s:%d %s"-        % (co.co_name, co.co_filename, co.co_firstlineno, msg)+        f"wrap_controller at {co.co_name!r} {co.co_filename}:{co.co_firstlineno} {msg}"     )@@ -49,3 +72,3 @@     msg += "For more information see https://pluggy.readthedocs.io/en/stable/api_reference.html#pluggy.PluggyTeardownRaisedWarning"  # noqa: E501-    warnings.warn(PluggyTeardownRaisedWarning(msg), stacklevel=5)+    warnings.warn(PluggyTeardownRaisedWarning(msg), stacklevel=6) @@ -66,3 +89,2 @@     exception = None-    only_new_style_wrappers = True     try:  # run impl and wrapper setup functions in a loop@@ -73,4 +95,5 @@                     args = [caller_kwargs[argname] for argname in hook_impl.argnames]-                except KeyError:-                    for argname in hook_impl.argnames:+                except KeyError as e:+                    # coverage bug - this is tested+                    for argname in hook_impl.argnames:  # pragma: no cover                         if argname not in caller_kwargs:@@ -78,15 +101,10 @@                                 f"hook call must provide argument {argname!r}"-                            )+                            ) from e                  if hook_impl.hookwrapper:-                    only_new_style_wrappers = False-                    try:-                        # If this cast is not valid, a type error is raised below,-                        # which is the desired response.-                        res = hook_impl.function(*args)-                        wrapper_gen = cast(Generator[None, Result[object], None], res)-                        next(wrapper_gen)  # first yield-                        teardowns.append((wrapper_gen, hook_impl))-                    except StopIteration:-                        _raise_wrapfail(wrapper_gen, "did not yield")+                    function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args)++                    next(function_gen)  # first yield+                    teardowns.append(function_gen)+                 elif hook_impl.wrapper:@@ -110,73 +128,42 @@     finally:-        # Fast path - only new-style wrappers, no Result.-        if only_new_style_wrappers:-            if firstresult:  # first result hooks return a single value-                result = results[0] if results else None-            else:-                result = results+        if firstresult:  # first result hooks return a single value+            result = results[0] if results else None+        else:+            result = results -            # run all wrapper post-yield blocks-            for teardown in reversed(teardowns):-                try:-                    if exception is not None:-                        teardown.throw(exception)  # type: ignore[union-attr]-                    else:-                        teardown.send(result)  # type: ignore[union-attr]-                    # Following is unreachable for a well behaved hook wrapper.-                    # Try to force finalizers otherwise postponed till GC action.-                    # Note: close() may raise if generator handles GeneratorExit.-                    teardown.close()  # type: ignore[union-attr]-                except StopIteration as si:-                    result = si.value-                    exception = None-                    continue-                except BaseException as e:-                    exception = e-                    continue-                _raise_wrapfail(teardown, "has second yield")  # type: ignore[arg-type]+        # run all wrapper post-yield blocks+        for teardown in reversed(teardowns):+            try:+                if exception is not None:+                    try:+                        teardown.throw(exception)+                    except RuntimeError as re:+                        # StopIteration from generator causes RuntimeError+                        # even for coroutine usage - see #544+                        if (+                            isinstance(exception, StopIteration)+                            and re.__cause__ is exception+                        ):+                            teardown.close()+                            continue+                        else:+                            raise+                else:+                    teardown.send(result)+                # Following is unreachable for a well behaved hook wrapper.+                # Try to force finalizers otherwise postponed till GC action.+                # Note: close() may raise if generator handles GeneratorExit.+                teardown.close()+            except StopIteration as si:+                result = si.value+                exception = None+                continue+            except BaseException as e:+                exception = e+                continue+            _raise_wrapfail(teardown, "has second yield") -            if exception is not None:-                raise exception.with_traceback(exception.__traceback__)-            else:-                return result--        # Slow path - need to support old-style wrappers.-        else:-            if firstresult:  # first result hooks return a single value-                outcome: Result[object | list[object]] = Result(-                    results[0] if results else None, exception-                )-            else:-                outcome = Result(results, exception)--            # run all wrapper post-yield blocks-            for teardown in reversed(teardowns):-                if isinstance(teardown, tuple):-                    try:-                        teardown[0].send(outcome)-                    except StopIteration:-                        pass-                    except BaseException as e:-                        _warn_teardown_exception(hook_name, teardown[1], e)-                        raise-                    else:-                        _raise_wrapfail(teardown[0], "has second yield")-                else:-                    try:-                        if outcome._exception is not None:-                            teardown.throw(outcome._exception)-                        else:-                            teardown.send(outcome._result)-                        # Following is unreachable for a well behaved hook wrapper.-                        # Try to force finalizers otherwise postponed till GC action.-                        # Note: close() may raise if generator handles GeneratorExit.-                        teardown.close()-                    except StopIteration as si:-                        outcome.force_result(si.value)-                        continue-                    except BaseException as e:-                        outcome.force_exception(e)-                        continue-                    _raise_wrapfail(teardown, "has second yield")--            return outcome.get_result()+    if exception is not None:+        raise exception+    else:+        return result
src/pluggy/_hooks.py +21 lines
--- +++ @@ -6,2 +6,6 @@ +from collections.abc import Generator+from collections.abc import Mapping+from collections.abc import Sequence+from collections.abc import Set import inspect@@ -9,3 +13,2 @@ from types import ModuleType-from typing import AbstractSet from typing import Any@@ -14,9 +17,4 @@ from typing import final-from typing import Generator-from typing import List-from typing import Mapping from typing import Optional from typing import overload-from typing import Sequence-from typing import Tuple from typing import TYPE_CHECKING@@ -36,3 +34,3 @@     [str, Sequence["HookImpl"], Mapping[str, object], bool],-    Union[object, List[object]],+    Union[object, list[object]], ]@@ -304,3 +302,3 @@             func = func.__init__-        except AttributeError:+        except AttributeError:  # pragma: no cover - pypy special case             return (), ()@@ -309,3 +307,3 @@             func = getattr(func, "__call__", func)-        except Exception:+        except Exception:  # pragma: no cover - pypy special case             return (), ()@@ -317,3 +315,3 @@         )-    except TypeError:+    except TypeError:  # pragma: no cover         return (), ()@@ -349,3 +347,3 @@         implicit_names: tuple[str, ...] = ("self",)-    else:+    else:  # pragma: no cover         implicit_names = ("self", "obj")@@ -378,3 +376,3 @@ -_CallHistory = List[Tuple[Mapping[str, object], Optional[Callable[[Any], None]]]]+_CallHistory = list[tuple[Mapping[str, object], Optional[Callable[[Any], None]]]] @@ -487,3 +485,4 @@                         for argname in self.spec.argnames-                        # Avoid self.spec.argnames - kwargs.keys() - doesn't preserve order.+                        # Avoid self.spec.argnames - kwargs.keys()+                        # it doesn't preserve order.                         if argname not in kwargs.keys()@@ -491,4 +490,4 @@                     warnings.warn(-                        "Argument(s) {} which are declared in the hookspec "-                        "cannot be found in this hook call".format(notincall),+                        f"Argument(s) {notincall} which are declared in the hookspec "+                        "cannot be found in this hook call",                         stacklevel=2,@@ -506,5 +505,5 @@         """-        assert (-            not self.is_historic()-        ), "Cannot directly call a historic hook - use call_historic instead."+        assert not self.is_historic(), (+            "Cannot directly call a historic hook - use call_historic instead."+        )         self._verify_all_args_are_provided(kwargs)@@ -547,5 +546,5 @@         :ref:`call_extra`."""-        assert (-            not self.is_historic()-        ), "Cannot directly call a historic hook - use call_historic instead."+        assert not self.is_historic(), (+            "Cannot directly call a historic hook - use call_historic instead."+        )         self._verify_all_args_are_provided(kwargs)@@ -610,3 +609,3 @@ -    def __init__(self, orig: HookCaller, remove_plugins: AbstractSet[_Plugin]) -> None:+    def __init__(self, orig: HookCaller, remove_plugins: Set[_Plugin]) -> None:         self._orig = orig
src/pluggy/_manager.py +33 lines
--- +++ @@ -2,2 +2,5 @@ +from collections.abc import Iterable+from collections.abc import Mapping+from collections.abc import Sequence import inspect@@ -8,5 +11,2 @@ from typing import Final-from typing import Iterable-from typing import Mapping-from typing import Sequence from typing import TYPE_CHECKING@@ -72,3 +72,3 @@ -    def __getattr__(self, attr: str, default=None):+    def __getattr__(self, attr: str, default: Any | None = None) -> Any:         return getattr(self._dist, attr, default)@@ -140,4 +140,4 @@             raise ValueError(-                "Plugin name already registered: %s=%s\n%s"-                % (plugin_name, plugin, self._name2plugin)+                "Plugin name already registered: "+                f"{plugin_name}={plugin}\n{self._name2plugin}"             )@@ -146,4 +146,4 @@             raise ValueError(-                "Plugin already registered under a different name: %s=%s\n%s"-                % (plugin_name, plugin, self._name2plugin)+                "Plugin already registered under a different name: "+                f"{plugin_name}={plugin}\n{self._name2plugin}"             )@@ -190,7 +190,7 @@             )-        except Exception:-            res = {}  # type: ignore[assignment]+        except Exception:  # pragma: no cover+            res = {}  # type: ignore[assignment] #pragma: no cover         if res is not None and not isinstance(res, dict):             # false positive-            res = None  # type:ignore[unreachable]+            res = None  # type:ignore[unreachable] #pragma: no cover         return res@@ -331,4 +331,4 @@                 hookimpl.plugin,-                "Plugin %r\nhook %r\nhistoric incompatible with yield/wrapper/hookwrapper"-                % (hookimpl.plugin_name, hook.name),+                f"Plugin {hookimpl.plugin_name!r}\nhook {hook.name!r}\n"+                "historic incompatible with yield/wrapper/hookwrapper",             )@@ -344,11 +344,6 @@                 hookimpl.plugin,-                "Plugin %r for hook %r\nhookimpl definition: %s\n"-                "Argument(s) %s are declared in the hookimpl but "-                "can not be found in the hookspec"-                % (-                    hookimpl.plugin_name,-                    hook.name,-                    _formatdef(hookimpl.function),-                    notinspec,-                ),+                f"Plugin {hookimpl.plugin_name!r} for hook {hook.name!r}\n"+                f"hookimpl definition: {_formatdef(hookimpl.function)}\n"+                f"Argument(s) {notinspec} are declared in the hookimpl but "+                "can not be found in the hookspec",             )@@ -366,6 +361,6 @@                 hookimpl.plugin,-                "Plugin %r for hook %r\nhookimpl definition: %s\n"+                f"Plugin {hookimpl.plugin_name!r} for hook {hook.name!r}\n"+                f"hookimpl definition: {_formatdef(hookimpl.function)}\n"                 "Declared as wrapper=True or hookwrapper=True "-                "but function is not a generator function"-                % (hookimpl.plugin_name, hook.name, _formatdef(hookimpl.function)),+                "but function is not a generator function",             )@@ -375,5 +370,5 @@                 hookimpl.plugin,-                "Plugin %r for hook %r\nhookimpl definition: %s\n"-                "The wrapper=True and hookwrapper=True options are mutually exclusive"-                % (hookimpl.plugin_name, hook.name, _formatdef(hookimpl.function)),+                f"Plugin {hookimpl.plugin_name!r} for hook {hook.name!r}\n"+                f"hookimpl definition: {_formatdef(hookimpl.function)}\n"+                "The wrapper=True and hookwrapper=True options are mutually exclusive",             )@@ -385,12 +380,12 @@         for name in self.hook.__dict__:-            if name[0] != "_":-                hook: HookCaller = getattr(self.hook, name)-                if not hook.has_spec():-                    for hookimpl in hook.get_hookimpls():-                        if not hookimpl.optionalhook:-                            raise PluginValidationError(-                                hookimpl.plugin,-                                "unknown hook %r in plugin %r"-                                % (name, hookimpl.plugin),-                            )+            if name[0] == "_":+                continue+            hook: HookCaller = getattr(self.hook, name)+            if not hook.has_spec():+                for hookimpl in hook.get_hookimpls():+                    if not hookimpl.optionalhook:+                        raise PluginValidationError(+                            hookimpl.plugin,+                            f"unknown hook {name!r} in plugin {hookimpl.plugin!r}",+                        ) 
src/pluggy/_result.py +9 lines
--- +++ @@ -12,4 +12,2 @@ from typing import Optional-from typing import Tuple-from typing import Type from typing import TypeVar@@ -17,3 +15,3 @@ -_ExcInfo = Tuple[Type[BaseException], BaseException, Optional[TracebackType]]+_ExcInfo = tuple[type[BaseException], BaseException, Optional[TracebackType]] ResultType = TypeVar("ResultType")@@ -30,3 +28,3 @@ -    __slots__ = ("_result", "_exception")+    __slots__ = ("_result", "_exception", "_traceback") @@ -40,2 +38,4 @@         self._exception = exception+        # Exception __traceback__ is mutable, this keeps the original.+        self._traceback = exception.__traceback__ if exception is not None else None @@ -48,3 +48,3 @@         else:-            return (type(exc), exc, exc.__traceback__)+            return (type(exc), exc, self._traceback) @@ -77,2 +77,3 @@         self._exception = None+        self._traceback = None @@ -87,2 +88,3 @@         self._exception = exception+        self._traceback = exception.__traceback__ if exception is not None else None @@ -96,2 +98,3 @@         exc = self._exception+        tb = self._traceback         if exc is None:@@ -99,3 +102,3 @@         else:-            raise exc.with_traceback(exc.__traceback__)+            raise exc.with_traceback(tb) 
src/pluggy/_tracing.py +2 lines
--- +++ @@ -6,6 +6,5 @@ +from collections.abc import Sequence from typing import Any from typing import Callable-from typing import Sequence-from typing import Tuple @@ -13,3 +12,3 @@ _Writer = Callable[[str], object]-_Processor = Callable[[Tuple[str, ...], Tuple[Any, ...]], object]+_Processor = Callable[[tuple[str, ...], tuple[Any, ...]], object] 
src/pluggy/_version.py +9 lines
--- +++ @@ -1,6 +1,11 @@-# file generated by setuptools_scm+# file generated by setuptools-scm # don't change, don't track in version control++__all__ = ["__version__", "__version_tuple__", "version", "version_tuple"]+ TYPE_CHECKING = False if TYPE_CHECKING:-    from typing import Tuple, Union+    from typing import Tuple+    from typing import Union+     VERSION_TUPLE = Tuple[Union[int, str], ...]@@ -14,3 +19,3 @@ -__version__ = version = '1.5.0'-__version_tuple__ = version_tuple = (1, 5, 0)+__version__ = version = '1.6.0'+__version_tuple__ = version_tuple = (1, 6, 0)
testing/benchmark.py +6 lines
--- +++ @@ -3,2 +3,4 @@ """++from typing import Any @@ -28,3 +30,3 @@ @pytest.fixture(params=[10, 100], ids="hooks={}".format)-def hooks(request):+def hooks(request: Any) -> list[object]:     return [hook for i in range(request.param)]@@ -33,3 +35,3 @@ @pytest.fixture(params=[10, 100], ids="wrappers={}".format)-def wrappers(request):+def wrappers(request: Any) -> list[object]:     return [wrapper for i in range(request.param)]@@ -37,3 +39,3 @@ -def test_hook_and_wrappers_speed(benchmark, hooks, wrappers):+def test_hook_and_wrappers_speed(benchmark, hooks, wrappers) -> None:     def setup():@@ -67,3 +69,3 @@ )-def test_call_hook(benchmark, plugins, wrappers, nesting):+def test_call_hook(benchmark, plugins, wrappers, nesting) -> None:     pm = PluginManager("example")
testing/conftest.py +1 lines
--- +++ @@ -16,3 +16,3 @@         def he_method1(self, arg: int) -> int:-            return arg + 1+            return arg + 1  # pragma: no cover 
testing/test_details.py +65 lines
--- +++ @@ -1,3 +1,6 @@+from importlib.metadata import distribution+ import pytest +import pluggy from pluggy import HookimplMarker@@ -22,3 +25,3 @@         def x1meth(self):-            pass+            pass  # pragma: no cover @@ -35,3 +38,3 @@         def x1meth(self):-            pass+            pass  # pragma: no cover @@ -39,3 +42,3 @@         def x1meth2(self):-            pass+            pass  # pragma: no cover @@ -43,3 +46,3 @@         def x1meth3(self):-            pass+            pass  # pragma: no cover @@ -77,3 +80,3 @@         def foo(self):-            pass+            pass  # pragma: no cover @@ -82,3 +85,3 @@         def foo(self):-            pass+            pass  # pragma: no cover @@ -138,6 +141,8 @@     class Module:-        pass+        x: DontTouchMe      module = Module()-    module.x = DontTouchMe()  # type: ignore[attr-defined]+    module.x = DontTouchMe()+    with pytest.raises(Exception, match="touch me"):+        module.x.broken @@ -156,3 +161,3 @@         def hello(self, arg1, arg2):-            pass+            pass  # pragma: no cover @@ -160,3 +165,3 @@         def herstory(self, arg1, arg2):-            pass+            pass  # pragma: no cover @@ -191 +196,51 @@     )+++def test_dist_facade_list_attributes() -> None:+    from pluggy._manager import DistFacade++    fc = DistFacade(distribution("pluggy"))+    res = dir(fc)+    assert res == sorted(res)+    assert set(res) - set(dir(fc._dist)) == {"_dist", "project_name"}+++def test_hookimpl_disallow_invalid_combination() -> None:+    decorator = hookspec(historic=True, firstresult=True)+    with pytest.raises(ValueError, match="cannot have a historic firstresult hook"):+        decorator(any)+++def test_hook_nonspec_call(pm: PluginManager) -> None:+    class Plugin:+        @hookimpl+        def a_hook(self, passed: str, missing: int) -> None:+            pass++    pm.register(Plugin())+    with pytest.raises(+        pluggy.HookCallError, match="hook call must provide argument 'missing'"+    ):+        pm.hook.a_hook(passed="a")+    pm.hook.a_hook(passed="a", missing="ok")+++def test_wrapper_runtimeerror_passtrough(pm: PluginManager) -> None:+    """+    ensure runtime-error passes trough a wrapper in case of exceptions+    """++    class Fail:+        @hookimpl+        def fail_late(self):+            raise RuntimeError("this is personal")++    class Plugin:+        @hookimpl(wrapper=True)+        def fail_late(self):+            yield++    pm.register(Plugin())+    pm.register(Fail())+    with pytest.raises(RuntimeError, match="this is personal"):+        pm.hook.fail_late()
testing/test_helpers.py +4 lines
--- +++ @@ -12,3 +12,3 @@     def f(x) -> None:-        i = 3  # noqa+        i = 3  # noqa #pragma: no cover @@ -16,3 +16,3 @@         def f(self, y) -> None:-            pass+            pass  # pragma: no cover @@ -20,3 +20,3 @@         def __call__(self, z) -> None:-            pass+            pass  # pragma: no cover @@ -98,3 +98,3 @@         def wrapper(*args, **kwargs):-            return func(*args, **kwargs)+            return func(*args, **kwargs)  # pragma: no cover 
testing/test_hookcaller.py +17 lines
--- +++ @@ -1,5 +1,4 @@+from collections.abc import Generator+from collections.abc import Sequence from typing import Callable-from typing import Generator-from typing import List-from typing import Sequence from typing import TypeVar@@ -65,3 +64,3 @@ -def funcs(hookmethods: Sequence[HookImpl]) -> List[Callable[..., object]]:+def funcs(hookmethods: Sequence[HookImpl]) -> list[Callable[..., object]]:     return [hookmethod.function for hookmethod in hookmethods]@@ -161,3 +160,3 @@     def he_method1():-        yield+        yield  # pragma: no cover @@ -165,3 +164,3 @@     def he_method1_fun():-        yield+        yield  # pragma: no cover @@ -169,3 +168,3 @@     def he_method1_middle():-        return+        return  # pragma: no cover @@ -173,3 +172,3 @@     def he_method3_fun():-        yield+        yield  # pragma: no cover @@ -177,3 +176,3 @@     def he_method3():-        yield+        yield  # pragma: no cover @@ -191,3 +190,3 @@     def he_method1():-        yield+        yield  # pragma: no cover @@ -195,3 +194,3 @@     def he_method2():-        yield+        yield  # pragma: no cover @@ -199,3 +198,3 @@     def he_method3():-        yield+        yield  # pragma: no cover @@ -209,3 +208,3 @@     def m1():-        yield+        yield  # pragma: no cover @@ -230,3 +229,3 @@     def m5():-        yield+        yield  # pragma: no cover @@ -246,3 +245,3 @@     def m8():-        yield+        yield  # pragma: no cover @@ -267,3 +266,3 @@     def m12():-        yield+        yield  # pragma: no cover @@ -408,3 +407,3 @@         def foo(self, arg: int, too, many, args) -> int:-            return arg + 1+            return arg + 1  # pragma: no cover @@ -418,3 +417,3 @@         def hello(self, arg: int) -> int:-            return arg + 1+            return arg + 1  # pragma: no cover 
testing/test_invocations.py +43 lines
--- +++ @@ -1,2 +1,3 @@-from typing import Iterator+from collections.abc import Iterator+from typing import Any @@ -135,3 +136,3 @@         def hello(self, arg):-            return arg + 1+            return arg + 1  # pragma: no cover @@ -328 +329,41 @@     assert [y for x in res for y in x] == [2, 3, 1]++[email protected](+    "kind",+    [+        pytest.param(hookimpl(wrapper=True), id="wrapper"),+        pytest.param(hookimpl(hookwrapper=True), id="legacy-wrapper"),+    ],+)+def test_wrappers_yield_twice_fails(pm: PluginManager, kind: Any) -> None:+    class Plugin:+        @kind+        def wrap(self):+            yield+            yield++    pm.register(Plugin())+    with pytest.raises(+        RuntimeError, match="wrap_controller at 'wrap'.* has second yield"+    ):+        pm.hook.wrap()++[email protected](+    "kind",+    [+        pytest.param(hookimpl(wrapper=True), id="wrapper"),+        pytest.param(hookimpl(hookwrapper=True), id="legacy-wrapper"),+    ],+)+def test_wrappers_yield_never_fails(pm: PluginManager, kind: Any) -> None:+    class Plugin:+        @kind+        def wrap(self):+            if False:+                yield  # type: ignore[unreachable]++    pm.register(Plugin())+    with pytest.raises(RuntimeError, match="wrap_controller at 'wrap'.* did not yield"):+        pm.hook.wrap()
testing/test_multicall.py +40 lines
--- +++ @@ -1,6 +1,4 @@+from collections.abc import Mapping+from collections.abc import Sequence from typing import Callable-from typing import List-from typing import Mapping-from typing import Sequence-from typing import Type from typing import Union@@ -24,3 +22,3 @@     firstresult: bool = False,-) -> Union[object, List[object]]:+) -> Union[object, list[object]]:     caller = _multicall@@ -59,3 +57,3 @@     def f(x):-        return x+        return x  # pragma: no cover @@ -252,3 +250,3 @@ @pytest.mark.parametrize("exc", [ValueError, SystemExit])-def test_hookwrapper_exception(exc: "Type[BaseException]") -> None:+def test_hookwrapper_exception(exc: type[BaseException]) -> None:     out = []@@ -322,3 +320,3 @@ @pytest.mark.parametrize("exc", [ValueError, SystemExit])-def test_wrapper_exception(exc: "Type[BaseException]") -> None:+def test_wrapper_exception(exc: type[BaseException]) -> None:     out = []@@ -335,3 +333,3 @@             out.append("m1 finish")-        return result+        return result  # pragma: no cover @@ -362,3 +360,3 @@         yield-        return 10+        return 10  # pragma: no cover @@ -388,3 +386,3 @@             yield-            out.append("m1 unreachable")+            out.append("m1 unreachable")  # pragma: no cover         except BaseException:@@ -418,2 +416,32 @@ [email protected]("has_hookwrapper", [True, False])+def test_wrapper_stopiteration_passtrough(has_hookwrapper: bool) -> None:+    out = []++    @hookimpl(wrapper=True)+    def wrap():+        out.append("wrap")+        try:+            yield+        finally:+            out.append("wrap done")++    @hookimpl(wrapper=not has_hookwrapper, hookwrapper=has_hookwrapper)+    def wrap_path2():+        yield++    @hookimpl+    def stop():+        out.append("stop")+        raise StopIteration++    with pytest.raises(StopIteration):+        try:+            MC([stop, wrap, wrap_path2], {})+        finally:+            out.append("finally")++    assert out == ["wrap", "stop", "wrap done", "finally"]++ def test_suppress_inner_wrapper_teardown_exc() -> None:@@ -433,3 +461,3 @@             yield-            out.append("m2 unreachable")+            out.append("m2 unreachable")  # pragma: no cover         except ValueError:
testing/test_pluginmanager.py +72 lines
--- +++ @@ -6,3 +6,2 @@ from typing import Any-from typing import List @@ -68,5 +67,7 @@                 return 42-            raise AttributeError()+            raise AttributeError(name)      a = A()+    a.test+     he_pm.register(a)@@ -129,3 +130,3 @@         def he_method_notexists(self):-            pass+            pass  # pragma: no cover @@ -143,3 +144,3 @@         def he_method1(self, qlwkje):-            pass+            pass  # pragma: no cover @@ -183,3 +184,3 @@         @hookimpl-        def he_method1(self): ...+        def he_method1(self): ...  # pragma: no cover @@ -202,2 +203,14 @@ +def test_unregister_blocked(pm: PluginManager) -> None:+    class Plugin:+        pass++    p = Plugin()+    pm.set_blocked("error")+    pm.register(p, "error")+    # bloked plugins can be unregistred many times atm+    pm.unregister(p, "error")+    pm.unregister(p, "error")++ def test_register_unknown_hooks(pm: PluginManager) -> None:@@ -213,4 +226,3 @@         @hookspec-        def he_method1(self, arg):-            pass+        def he_method1(self, arg): ... @@ -227,4 +239,3 @@         @hookspec(historic=True)-        def he_method1(self, arg):-            pass+        def he_method1(self, arg): ... @@ -376,3 +387,3 @@         def he_method1(self, arg):-            out.append(arg)+            out.append(arg)  # pragma: no cover @@ -393,3 +404,3 @@         def he_method1(self, arg):-            yield+            yield  # pragma: no cover @@ -428,2 +439,5 @@     pm.register(Plugin1())+    with pytest.raises(ZeroDivisionError):+        pm.hook.he_method1(arg="works")+     with pytest.raises(HookCallError):@@ -608,3 +622,3 @@ def test_add_tracefuncs(he_pm: PluginManager) -> None:-    out: List[Any] = []+    out: list[Any] = [] @@ -661,3 +675,3 @@     he_pm.register(api1())-    out: List[Any] = []+    out: list[Any] = []     he_pm.trace.root.setwriter(out.append)@@ -757 +771,46 @@         assert result == [4, 5, 3, 2, 1, 6]+++def test_check_pending_skips_underscore(pm: PluginManager) -> None:+    # todo: determine what we want to do with the namespace+    class Plugin:+        @hookimpl+        def _problem(self):+            pass++    pm.register(Plugin())+    pm.hook._problem()+    pm.check_pending()+++def test_check_pending_optionalhook(+    pm: PluginManager,+) -> None:+    class Plugin:+        @hookimpl(optionalhook=True)+        def a_hook(self, param):+            pass++    pm.register(Plugin())+    pm.hook.a_hook(param=1)+    pm.check_pending()+++def test_check_pending_nonspec_hook(+    pm: PluginManager,+) -> None:+    hookimpl = HookimplMarker("example")++    class Plugin:+        @hookimpl+        def a_hook(self, param):+            pass++    pm.register(Plugin())+    with pytest.raises(HookCallError, match="hook call must provide argument 'param'"):+        pm.hook.a_hook()++    with pytest.raises(+        PluginValidationError, match="unknown hook 'a_hook' in plugin .*"+    ):+        pm.check_pending()
testing/test_result.py +27 lines
--- +++ @@ -0,0 +1,27 @@+import traceback++from pluggy import Result+++def test_exceptions_traceback_doesnt_get_longer_and_longer() -> None:+    def bad() -> None:+        1 / 0++    result = Result.from_call(bad)++    try:+        result.get_result()+    except Exception as exc:+        tb1 = traceback.extract_tb(exc.__traceback__)++    try:+        result.get_result()+    except Exception as exc:+        tb2 = traceback.extract_tb(exc.__traceback__)++    try:+        result.get_result()+    except Exception as exc:+        tb3 = traceback.extract_tb(exc.__traceback__)++    assert len(tb1) == len(tb2) == len(tb3)
testing/test_tracer.py +1 lines
--- +++ @@ -1,3 +1 @@-from typing import List- import pytest@@ -15,3 +13,3 @@     log("hello")-    out: List[str] = []+    out: list[str] = []     rootlogger.setwriter(out.append)
protobuf pypi
7.35.0 10d ago incident on record
YANK ×3BURST ×3INSTALL-EXEC
latest 7.35.0 versions 216 maintainers 1
6.33.1
6.33.2
6.33.3
6.33.4
6.33.5
5.29.6
7.34.0
6.33.6
7.34.1
4.25.9
7.35.0
7.34.2
YANK
3.18.0 marked yanked (still downloadable)
high · registry-verified · 2021-09-15 · 4y ago
YANK
4.21.0 marked yanked (still downloadable)
high · registry-verified · 2022-05-26 · 4y ago
YANK
5.29.0 marked yanked (still downloadable)
high · registry-verified · 2024-11-27 · 1y ago
BURST
3 releases in 59m: 3.18.3, 3.19.5, 3.20.2
info · registry-verified · 2022-09-14 · 3y ago
BURST
2 releases in 53m: 3.19.6, 3.20.3
info · registry-verified · 2022-09-29 · 3y ago
BURST
2 releases in 56m: 5.28.2, 4.25.5
info · registry-verified · 2024-09-18 · 1y ago
INSTALL-EXEC
setup.py in sdist uses subprocess/exec (runs at pip install)
warn · snapshot-derived
release diff 7.35.0 → 7.34.2
+0 added · -1 removed · ~67 modified
google/protobuf/__init__.py +1 lines
--- +++ @@ -9,2 +9,2 @@ -__version__ = '7.35.0'+__version__ = '7.34.2'
google/protobuf/any_pb2.py +3 lines
--- +++ @@ -4,3 +4,3 @@ # source: google/protobuf/any.proto-# Protobuf Python Version: 7.35.0+# Protobuf Python Version: 7.34.2 """Generated protocol buffer code."""@@ -14,4 +14,4 @@     7,-    35,-    0,+    34,+    2,     '',
google/protobuf/api_pb2.py +3 lines
--- +++ @@ -4,3 +4,3 @@ # source: google/protobuf/api.proto-# Protobuf Python Version: 7.35.0+# Protobuf Python Version: 7.34.2 """Generated protocol buffer code."""@@ -14,4 +14,4 @@     7,-    35,-    0,+    34,+    2,     '',
google/protobuf/compiler/plugin_pb2.py +3 lines
--- +++ @@ -4,3 +4,3 @@ # source: google/protobuf/compiler/plugin.proto-# Protobuf Python Version: 7.35.0+# Protobuf Python Version: 7.34.2 """Generated protocol buffer code."""@@ -14,4 +14,4 @@     7,-    35,-    0,+    34,+    2,     '',
google/protobuf/descriptor_database.py +10 lines
--- +++ @@ -11,3 +11,2 @@ -from typing import Dict, Iterator, Optional import warnings@@ -26,11 +25,7 @@ -  def __init__(self) -> None:-    self._file_desc_protos_by_file: Dict[-        str, 'descriptor_pb2.FileDescriptorProto'-    ] = {}-    self._file_desc_protos_by_symbol: Dict[-        str, 'descriptor_pb2.FileDescriptorProto'-    ] = {}+  def __init__(self):+    self._file_desc_protos_by_file = {}+    self._file_desc_protos_by_symbol = {} -  def Add(self, file_desc_proto: 'descriptor_pb2.FileDescriptorProto') -> None:+  def Add(self, file_desc_proto):     """Adds the FileDescriptorProto and its types to this database.@@ -78,3 +73,3 @@ -  def FindFileByName(self, name: str) -> 'descriptor_pb2.FileDescriptorProto':+  def FindFileByName(self, name):     """Finds the file descriptor proto by file name.@@ -97,5 +92,3 @@ -  def FindFileContainingSymbol(-      self, symbol: str-  ) -> 'descriptor_pb2.FileDescriptorProto':+  def FindFileContainingSymbol(self, symbol):     """Finds the file descriptor proto containing the specified symbol.@@ -144,5 +137,3 @@ -  def FindFileContainingExtension(-      self, extendee_name: str, extension_number: int  # pylint: disable=unused-argument-  ) -> Optional['descriptor_pb2.FileDescriptorProto']:+  def FindFileContainingExtension(self, extendee_name, extension_number):     # TODO: implement this API.@@ -150,3 +141,3 @@ -  def FindAllExtensionNumbers(self, extendee_name: str) -> list[int]:  # pylint: disable=unused-argument+  def FindAllExtensionNumbers(self, extendee_name):     # TODO: implement this API.@@ -154,5 +145,3 @@ -  def _AddSymbol(-      self, name: str, file_desc_proto: 'descriptor_pb2.FileDescriptorProto'-  ) -> None:+  def _AddSymbol(self, name, file_desc_proto):     if name in self._file_desc_protos_by_symbol:@@ -166,5 +155,3 @@ -def _ExtractSymbols(-    desc_proto: 'descriptor_pb2.DescriptorProto', package: str-) -> Iterator[str]:+def _ExtractSymbols(desc_proto, package):   """Pulls out all the symbols from a descriptor proto.
google/protobuf/descriptor_pb2.py +140 lines
--- +++ @@ -4,3 +4,3 @@ # source: google/protobuf/descriptor.proto-# Protobuf Python Version: 7.35.0+# Protobuf Python Version: 7.34.2 """Generated protocol buffer code."""@@ -14,4 +14,4 @@     7,-    35,-    0,+    34,+    2,     '',@@ -34,6 +34,6 @@     create_key=_descriptor._internal_create_key,-    serialized_pb=b'\n google/protobuf/descriptor.proto\x12\x0fgoogle.protobuf\"[\n\x11\x46ileDescriptorSet\x12\x38\n\x04\x66ile\x18\x01 \x03(\x0b\x32$.google.protobuf.FileDescriptorProtoR\x04\x66ile*\x0c\x08\x80\xec\xca\xff\x01\x10\x81\xec\xca\xff\x01\"\xc5\x05\n\x13\x46ileDescriptorProto\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12\x18\n\x07package\x18\x02 \x01(\tR\x07package\x12\x1e\n\ndependency\x18\x03 \x03(\tR\ndependency\x12+\n\x11public_dependency\x18\n \x03(\x05R\x10publicDependency\x12\'\n\x0fweak_dependency\x18\x0b \x03(\x05R\x0eweakDependency\x12+\n\x11option_dependency\x18\x0f \x03(\tR\x10optionDependency\x12\x43\n\x0cmessage_type\x18\x04 \x03(\x0b\x32 .google.protobuf.DescriptorProtoR\x0bmessageType\x12\x41\n\tenum_type\x18\x05 \x03(\x0b\x32$.google.protobuf.EnumDescriptorProtoR\x08\x65numType\x12\x41\n\x07service\x18\x06 \x03(\x0b\x32\'.google.protobuf.ServiceDescriptorProtoR\x07service\x12\x43\n\textension\x18\x07 \x03(\x0b\x32%.google.protobuf.FieldDescriptorProtoR\textension\x12\x36\n\x07options\x18\x08 \x01(\x0b\x32\x1c.google.protobuf.FileOptionsR\x07options\x12I\n\x10source_code_info\x18\t \x01(\x0b\x32\x1f.google.protobuf.SourceCodeInfoR\x0esourceCodeInfo\x12\x16\n\x06syntax\x18\x0c \x01(\tR\x06syntax\x12\x32\n\x07\x65\x64ition\x18\x0e \x01(\x0e\x32\x18.google.protobuf.EditionR\x07\x65\x64ition\"\xfc\x06\n\x0f\x44\x65scriptorProto\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12;\n\x05\x66ield\x18\x02 \x03(\x0b\x32%.google.protobuf.FieldDescriptorProtoR\x05\x66ield\x12\x43\n\textension\x18\x06 \x03(\x0b\x32%.google.protobuf.FieldDescriptorProtoR\textension\x12\x41\n\x0bnested_type\x18\x03 \x03(\x0b\x32 .google.protobuf.DescriptorProtoR\nnestedType\x12\x41\n\tenum_type\x18\x04 \x03(\x0b\x32$.google.protobuf.EnumDescriptorProtoR\x08\x65numType\x12X\n\x0f\x65xtension_range\x18\x05 \x03(\x0b\x32/.google.protobuf.DescriptorProto.ExtensionRangeR\x0e\x65xtensionRange\x12\x44\n\noneof_decl\x18\x08 \x03(\x0b\x32%.google.protobuf.OneofDescriptorProtoR\toneofDecl\x12\x39\n\x07options\x18\x07 \x01(\x0b\x32\x1f.google.protobuf.MessageOptionsR\x07options\x12U\n\x0ereserved_range\x18\t \x03(\x0b\x32..google.protobuf.DescriptorProto.ReservedRangeR\rreservedRange\x12#\n\rreserved_name\x18\n \x03(\tR\x0creservedName\x12\x41\n\nvisibility\x18\x0b \x01(\x0e\x32!.google.protobuf.SymbolVisibilityR\nvisibility\x1az\n\x0e\x45xtensionRange\x12\x14\n\x05start\x18\x01 \x01(\x05R\x05start\x12\x10\n\x03\x65nd\x18\x02 \x01(\x05R\x03\x65nd\x12@\n\x07options\x18\x03 \x01(\x0b\x32&.google.protobuf.ExtensionRangeOptionsR\x07options\x1a\x37\n\rReservedRange\x12\x14\n\x05start\x18\x01 \x01(\x05R\x05start\x12\x10\n\x03\x65nd\x18\x02 \x01(\x05R\x03\x65nd\"\xd4\x04\n\x15\x45xtensionRangeOptions\x12X\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32$.google.protobuf.UninterpretedOptionR\x13uninterpretedOption\x12Y\n\x0b\x64\x65\x63laration\x18\x02 \x03(\x0b\x32\x32.google.protobuf.ExtensionRangeOptions.DeclarationB\x03\x88\x01\x02R\x0b\x64\x65\x63laration\x12\x37\n\x08\x66\x65\x61tures\x18\x32 \x01(\x0b\x32\x1b.google.protobuf.FeatureSetR\x08\x66\x65\x61tures\x12m\n\x0cverification\x18\x03 \x01(\x0e\x32\x38.google.protobuf.ExtensionRangeOptions.VerificationState:\nUNVERIFIEDB\x03\x88\x01\x02R\x0cverification\x1a\x94\x01\n\x0b\x44\x65\x63laration\x12\x16\n\x06number\x18\x01 \x01(\x05R\x06number\x12\x1b\n\tfull_name\x18\x02 \x01(\tR\x08\x66ullName\x12\x12\n\x04type\x18\x03 \x01(\tR\x04type\x12\x1a\n\x08reserved\x18\x05 \x01(\x08R\x08reserved\x12\x1a\n\x08repeated\x18\x06 \x01(\x08R\x08repeatedJ\x04\x08\x04\x10\x05\"4\n\x11VerificationState\x12\x0f\n\x0b\x44\x45\x43LARATION\x10\x00\x12\x0e\n\nUNVERIFIED\x10\x01*\x06\x08\xde\x07\x10\xe7\x07*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02\"\xc1\x06\n\x14\x46ieldDescriptorProto\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12\x16\n\x06number\x18\x03 \x01(\x05R\x06number\x12\x41\n\x05label\x18\x04 \x01(\x0e\x32+.google.protobuf.FieldDescriptorProto.LabelR\x05label\x12>\n\x04type\x18\x05 \x01(\x0e\x32*.google.protobuf.FieldDescriptorProto.TypeR\x04type\x12\x1b\n\ttype_name\x18\x06 \x01(\tR\x08typeName\x12\x1a\n\x08\x65xtendee\x18\x02 \x01(\tR\x08\x65xtendee\x12#\n\rdefault_value\x18\x07 \x01(\tR\x0c\x64\x65\x66\x61ultValue\x12\x1f\n\x0boneof_index\x18\t \x01(\x05R\noneofIndex\x12\x1b\n\tjson_name\x18\n \x01(\tR\x08jsonName\x12\x37\n\x07options\x18\x08 \x01(\x0b\x32\x1d.google.protobuf.FieldOptionsR\x07options\x12\'\n\x0fproto3_optional\x18\x11 \x01(\x08R\x0eproto3Optional\"\xb6\x02\n\x04Type\x12\x0f\n\x0bTYPE_DOUBLE\x10\x01\x12\x0e\n\nTYPE_FLOAT\x10\x02\x12\x0e\n\nTYPE_INT64\x10\x03\x12\x0f\n\x0bTYPE_UINT64\x10\x04\x12\x0e\n\nTYPE_INT32\x10\x05\x12\x10\n\x0cTYPE_FIXED64\x10\x06\x12\x10\n\x0cTYPE_FIXED32\x10\x07\x12\r\n\tTYPE_BOOL\x10\x08\x12\x0f\n\x0bTYPE_STRING\x10\t\x12\x0e\n\nTYPE_GROUP\x10\n\x12\x10\n\x0cTYPE_MESSAGE\x10\x0b\x12\x0e\n\nTYPE_BYTES\x10\x0c\x12\x0f\n\x0bTYPE_UINT32\x10\r\x12\r\n\tTYPE_ENUM\x10\x0e\x12\x11\n\rTYPE_SFIXED32\x10\x0f\x12\x11\n\rTYPE_SFIXED64\x10\x10\x12\x0f\n\x0bTYPE_SINT32\x10\x11\x12\x0f\n\x0bTYPE_SINT64\x10\x12\"C\n\x05Label\x12\x12\n\x0eLABEL_OPTIONAL\x10\x01\x12\x12\n\x0eLABEL_REPEATED\x10\x03\x12\x12\n\x0eLABEL_REQUIRED\x10\x02\"c\n\x14OneofDescriptorProto\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12\x37\n\x07options\x18\x02 \x01(\x0b\x32\x1d.google.protobuf.OneofOptionsR\x07options\"\xa6\x03\n\x13\x45numDescriptorProto\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12?\n\x05value\x18\x02 \x03(\x0b\x32).google.protobuf.EnumValueDescriptorProtoR\x05value\x12\x36\n\x07options\x18\x03 \x01(\x0b\x32\x1c.google.protobuf.EnumOptionsR\x07options\x12]\n\x0ereserved_range\x18\x04 \x03(\x0b\x32\x36.google.protobuf.EnumDescriptorProto.EnumReservedRangeR\rreservedRange\x12#\n\rreserved_name\x18\x05 \x03(\tR\x0creservedName\x12\x41\n\nvisibility\x18\x06 \x01(\x0e\x32!.google.protobuf.SymbolVisibilityR\nvisibility\x1a;\n\x11\x45numReservedRange\x12\x14\n\x05start\x18\x01 \x01(\x05R\x05start\x12\x10\n\x03\x65nd\x18\x02 \x01(\x05R\x03\x65nd\"\x83\x01\n\x18\x45numValueDescriptorProto\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12\x16\n\x06number\x18\x02 \x01(\x05R\x06number\x12;\n\x07options\x18\x03 \x01(\x0b\x32!.google.protobuf.EnumValueOptionsR\x07options\"\xb5\x01\n\x16ServiceDescriptorProto\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12>\n\x06method\x18\x02 \x03(\x0b\x32&.google.protobuf.MethodDescriptorProtoR\x06method\x12\x39\n\x07options\x18\x03 \x01(\x0b\x32\x1f.google.protobuf.ServiceOptionsR\x07optionsJ\x04\x08\x04\x10\x05R\x06stream\"\x89\x02\n\x15MethodDescriptorProto\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12\x1d\n\ninput_type\x18\x02 \x01(\tR\tinputType\x12\x1f\n\x0boutput_type\x18\x03 \x01(\tR\noutputType\x12\x38\n\x07options\x18\x04 \x01(\x0b\x32\x1e.google.protobuf.MethodOptionsR\x07options\x12\x30\n\x10\x63lient_streaming\x18\x05 \x01(\x08:\x05\x66\x61lseR\x0f\x63lientStreaming\x12\x30\n\x10server_streaming\x18\x06 \x01(\x08:\x05\x66\x61lseR\x0fserverStreaming\"\xfa\n\n\x0b\x46ileOptions\x12!\n\x0cjava_package\x18\x01 \x01(\tR\x0bjavaPackage\x12\x30\n\x14java_outer_classname\x18\x08 \x01(\tR\x12javaOuterClassname\x12\xf9\x01\n\x13java_multiple_files\x18\n \x01(\x08:\x05\x66\x61lseB\xc1\x01\xb2\x01\xbd\x01\x08\xe6\x07 \xe9\x07*\xb4\x01This behavior is enabled by default in editions 2024 and above. To disable it, you can set `features.(pb.java).nest_in_file_class = YES` on individual messages, enums, or services.R\x11javaMultipleFiles\x12\x44\n\x1djava_generate_equals_and_hash\x18\x14 \x01(\x08\x42\x02\x18\x01R\x19javaGenerateEqualsAndHash\x12:\n\x16java_string_check_utf8\x18\x1b \x01(\x08:\x05\x66\x61lseR\x13javaStringCheckUtf8\x12S\n\x0coptimize_for\x18\t \x01(\x0e\x32).google.protobuf.FileOptions.OptimizeMode:\x05SPEEDR\x0boptimizeFor\x12\x1d\n\ngo_package\x18\x0b \x01(\tR\tgoPackage\x12\x35\n\x13\x63\x63_generic_services\x18\x10 \x01(\x08:\x05\x66\x61lseR\x11\x63\x63GenericServices\x12\x39\n\x15java_generic_services\x18\x11 \x01(\x08:\x05\x66\x61lseR\x13javaGenericServices\x12\x35\n\x13py_generic_services\x18\x12 \x01(\x08:\x05\x66\x61lseR\x11pyGenericServices\x12%\n\ndeprecated\x18\x17 \x01(\x08:\x05\x66\x61lseR\ndeprecated\x12.\n\x10\x63\x63_enable_arenas\x18\x1f \x01(\x08:\x04trueR\x0e\x63\x63\x45nableArenas\x12*\n\x11objc_class_prefix\x18$ \x01(\tR\x0fobjcClassPrefix\x12)\n\x10\x63sharp_namespace\x18% \x01(\tR\x0f\x63sharpNamespace\x12!\n\x0cswift_prefix\x18\' \x01(\tR\x0bswiftPrefix\x12(\n\x10php_class_prefix\x18( \x01(\tR\x0ephpClassPrefix\x12#\n\rphp_namespace\x18) \x01(\tR\x0cphpNamespace\x12\x34\n\x16php_metadata_namespace\x18, \x01(\tR\x14phpMetadataNamespace\x12!\n\x0cruby_package\x18- \x01(\tR\x0brubyPackage\x12\x37\n\x08\x66\x65\x61tures\x18\x32 \x01(\x0b\x32\x1b.google.protobuf.FeatureSetR\x08\x66\x65\x61tures\x12X\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32$.google.protobuf.UninterpretedOptionR\x13uninterpretedOption\":\n\x0cOptimizeMode\x12\t\n\x05SPEED\x10\x01\x12\r\n\tCODE_SIZE\x10\x02\x12\x10\n\x0cLITE_RUNTIME\x10\x03*\x06\x08\xde\x07\x10\xe7\x07*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02J\x04\x08*\x10+J\x04\x08&\x10\'R\x14php_generic_services\"\xfc\x03\n\x0eMessageOptions\x12<\n\x17message_set_wire_format\x18\x01 \x01(\x08:\x05\x66\x61lseR\x14messageSetWireFormat\x12L\n\x1fno_standard_descriptor_accessor\x18\x02 \x01(\x08:\x05\x66\x61lseR\x1cnoStandardDescriptorAccessor\x12%\n\ndeprecated\x18\x03 \x01(\x08:\x05\x66\x61lseR\ndeprecated\x12\x1b\n\tmap_entry\x18\x07 \x01(\x08R\x08mapEntry\x12V\n&deprecated_legacy_json_field_conflicts\x18\x0b \x01(\x08\x42\x02\x18\x01R\"deprecatedLegacyJsonFieldConflicts\x12\x37\n\x08\x66\x65\x61tures\x18\x0c \x01(\x0b\x32\x1b.google.protobuf.FeatureSetR\x08\x66\x65\x61tures\x12X\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32$.google.protobuf.UninterpretedOptionR\x13uninterpretedOption*\x06\x08\xde\x07\x10\xe7\x07*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02J\x04\x08\x04\x10\x05J\x04\x08\x05\x10\x06J\x04\x08\x06\x10\x07J\x04\x08\x08\x10\tJ\x04\x08\t\x10\n\"\xce\r\n\x0c\x46ieldOptions\x12\x41\n\x05\x63type\x18\x01 \x01(\x0e\x32#.google.protobuf.FieldOptions.CType:\x06STRINGR\x05\x63type\x12\x16\n\x06packed\x18\x02 \x01(\x08R\x06packed\x12G\n\x06jstype\x18\x06 \x01(\x0e\x32$.google.protobuf.FieldOptions.JSType:\tJS_NORMALR\x06jstype\x12\x19\n\x04lazy\x18\x05 \x01(\x08:\x05\x66\x61lseR\x04lazy\x12.\n\x0funverified_lazy\x18\x0f \x01(\x08:\x05\x66\x61lseR\x0eunverifiedLazy\x12%\n\ndeprecated\x18\x03 \x01(\x08:\x05\x66\x61lseR\ndeprecated\x12\x1d\n\x04weak\x18\n \x01(\x08:\x05\x66\x61lseB\x02\x18\x01R\x04weak\x12(\n\x0c\x64\x65\x62ug_redact\x18\x10 \x01(\x08:\x05\x66\x61lseR\x0b\x64\x65\x62ugRedact\x12K\n\tretention\x18\x11 \x01(\x0e\x32-.google.protobuf.FieldOptions.OptionRetentionR\tretention\x12H\n\x07targets\x18\x13 \x03(\x0e\x32..google.protobuf.FieldOptions.OptionTargetTypeR\x07targets\x12W\n\x10\x65\x64ition_defaults\x18\x14 \x03(\x0b\x32,.google.protobuf.FieldOptions.EditionDefaultR\x0f\x65\x64itionDefaults\x12\x37\n\x08\x66\x65\x61tures\x18\x15 \x01(\x0b\x32\x1b.google.protobuf.FeatureSetR\x08\x66\x65\x61tures\x12U\n\x0f\x66\x65\x61ture_support\x18\x16 \x01(\x0b\x32,.google.protobuf.FieldOptions.FeatureSupportR\x0e\x66\x65\x61tureSupport\x12X\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32$.google.protobuf.UninterpretedOptionR\x13uninterpretedOption\x1aZ\n\x0e\x45\x64itionDefault\x12\x32\n\x07\x65\x64ition\x18\x03 \x01(\x0e\x32\x18.google.protobuf.EditionR\x07\x65\x64ition\x12\x14\n\x05value\x18\x02 \x01(\tR\x05value\x1a\xbb\x02\n\x0e\x46\x65\x61tureSupport\x12G\n\x12\x65\x64ition_introduced\x18\x01 \x01(\x0e\x32\x18.google.protobuf.EditionR\x11\x65\x64itionIntroduced\x12G\n\x12\x65\x64ition_deprecated\x18\x02 \x01(\x0e\x32\x18.google.protobuf.EditionR\x11\x65\x64itionDeprecated\x12/\n\x13\x64\x65precation_warning\x18\x03 \x01(\tR\x12\x64\x65precationWarning\x12\x41\n\x0f\x65\x64ition_removed\x18\x04 \x01(\x0e\x32\x18.google.protobuf.EditionR\x0e\x65\x64itionRemoved\x12#\n\rremoval_error\x18\x05 \x01(\tR\x0cremovalError\"/\n\x05\x43Type\x12\n\n\x06STRING\x10\x00\x12\x08\n\x04\x43ORD\x10\x01\x12\x10\n\x0cSTRING_PIECE\x10\x02\"5\n\x06JSType\x12\r\n\tJS_NORMAL\x10\x00\x12\r\n\tJS_STRING\x10\x01\x12\r\n\tJS_NUMBER\x10\x02\"U\n\x0fOptionRetention\x12\x15\n\x11RETENTION_UNKNOWN\x10\x00\x12\x15\n\x11RETENTION_RUNTIME\x10\x01\x12\x14\n\x10RETENTION_SOURCE\x10\x02\"\x8c\x02\n\x10OptionTargetType\x12\x17\n\x13TARGET_TYPE_UNKNOWN\x10\x00\x12\x14\n\x10TARGET_TYPE_FILE\x10\x01\x12\x1f\n\x1bTARGET_TYPE_EXTENSION_RANGE\x10\x02\x12\x17\n\x13TARGET_TYPE_MESSAGE\x10\x03\x12\x15\n\x11TARGET_TYPE_FIELD\x10\x04\x12\x15\n\x11TARGET_TYPE_ONEOF\x10\x05\x12\x14\n\x10TARGET_TYPE_ENUM\x10\x06\x12\x1a\n\x16TARGET_TYPE_ENUM_ENTRY\x10\x07\x12\x17\n\x13TARGET_TYPE_SERVICE\x10\x08\x12\x16\n\x12TARGET_TYPE_METHOD\x10\t*\x06\x08\xde\x07\x10\xe7\x07*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02J\x04\x08\x04\x10\x05J\x04\x08\x12\x10\x13\"\xb4\x01\n\x0cOneofOptions\x12\x37\n\x08\x66\x65\x61tures\x18\x01 \x01(\x0b\x32\x1b.google.protobuf.FeatureSetR\x08\x66\x65\x61tures\x12X\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32$.google.protobuf.UninterpretedOptionR\x13uninterpretedOption*\x06\x08\xde\x07\x10\xe7\x07*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02\"\xd9\x02\n\x0b\x45numOptions\x12\x1f\n\x0b\x61llow_alias\x18\x02 \x01(\x08R\nallowAlias\x12%\n\ndeprecated\x18\x03 \x01(\x08:\x05\x66\x61lseR\ndeprecated\x12V\n&deprecated_legacy_json_field_conflicts\x18\x06 \x01(\x08\x42\x02\x18\x01R\"deprecatedLegacyJsonFieldConflicts\x12\x37\n\x08\x66\x65\x61tures\x18\x07 \x01(\x0b\x32\x1b.google.protobuf.FeatureSetR\x08\x66\x65\x61tures\x12X\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32$.google.protobuf.UninterpretedOptionR\x13uninterpretedOption*\x06\x08\xde\x07\x10\xe7\x07*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02J\x04\x08\x05\x10\x06\"\xe0\x02\n\x10\x45numValueOptions\x12%\n\ndeprecated\x18\x01 \x01(\x08:\x05\x66\x61lseR\ndeprecated\x12\x37\n\x08\x66\x65\x61tures\x18\x02 \x01(\x0b\x32\x1b.google.protobuf.FeatureSetR\x08\x66\x65\x61tures\x12(\n\x0c\x64\x65\x62ug_redact\x18\x03 \x01(\x08:\x05\x66\x61lseR\x0b\x64\x65\x62ugRedact\x12U\n\x0f\x66\x65\x61ture_support\x18\x04 \x01(\x0b\x32,.google.protobuf.FieldOptions.FeatureSupportR\x0e\x66\x65\x61tureSupport\x12X\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32$.google.protobuf.UninterpretedOptionR\x13uninterpretedOption*\x06\x08\xde\x07\x10\xe7\x07*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02\"\xdd\x01\n\x0eServiceOptions\x12\x37\n\x08\x66\x65\x61tures\x18\" \x01(\x0b\x32\x1b.google.protobuf.FeatureSetR\x08\x66\x65\x61tures\x12%\n\ndeprecated\x18! \x01(\x08:\x05\x66\x61lseR\ndeprecated\x12X\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32$.google.protobuf.UninterpretedOptionR\x13uninterpretedOption*\x06\x08\xde\x07\x10\xe7\x07*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02\"\xa1\x03\n\rMethodOptions\x12%\n\ndeprecated\x18! \x01(\x08:\x05\x66\x61lseR\ndeprecated\x12q\n\x11idempotency_level\x18\" \x01(\x0e\x32/.google.protobuf.MethodOptions.IdempotencyLevel:\x13IDEMPOTENCY_UNKNOWNR\x10idempotencyLevel\x12\x37\n\x08\x66\x65\x61tures\x18# \x01(\x0b\x32\x1b.google.protobuf.FeatureSetR\x08\x66\x65\x61tures\x12X\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32$.google.protobuf.UninterpretedOptionR\x13uninterpretedOption\"P\n\x10IdempotencyLevel\x12\x17\n\x13IDEMPOTENCY_UNKNOWN\x10\x00\x12\x13\n\x0fNO_SIDE_EFFECTS\x10\x01\x12\x0e\n\nIDEMPOTENT\x10\x02*\x06\x08\xde\x07\x10\xe7\x07*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02\"\x9a\x03\n\x13UninterpretedOption\x12\x41\n\x04name\x18\x02 \x03(\x0b\x32-.google.protobuf.UninterpretedOption.NamePartR\x04name\x12)\n\x10identifier_value\x18\x03 \x01(\tR\x0fidentifierValue\x12,\n\x12positive_int_value\x18\x04 \x01(\x04R\x10positiveIntValue\x12,\n\x12negative_int_value\x18\x05 \x01(\x03R\x10negativeIntValue\x12!\n\x0c\x64ouble_value\x18\x06 \x01(\x01R\x0b\x64oubleValue\x12!\n\x0cstring_value\x18\x07 \x01(\x0cR\x0bstringValue\x12\'\n\x0f\x61ggregate_value\x18\x08 \x01(\tR\x0e\x61ggregateValue\x1aJ\n\x08NamePart\x12\x1b\n\tname_part\x18\x01 \x02(\tR\x08namePart\x12!\n\x0cis_extension\x18\x02 \x02(\x08R\x0bisExtension\"\xae\x0f\n\nFeatureSet\x12\x91\x01\n\x0e\x66ield_presence\x18\x01 \x01(\x0e\x32).google.protobuf.FeatureSet.FieldPresenceB?\x88\x01\x01\x98\x01\x04\x98\x01\x01\xa2\x01\r\x12\x08\x45XPLICIT\x18\x84\x07\xa2\x01\r\x12\x08IMPLICIT\x18\xe7\x07\xa2\x01\r\x12\x08\x45XPLICIT\x18\xe8\x07\xb2\x01\x03\x08\xe8\x07R\rfieldPresence\x12l\n\tenum_type\x18\x02 \x01(\x0e\x32$.google.protobuf.FeatureSet.EnumTypeB)\x88\x01\x01\x98\x01\x06\x98\x01\x01\xa2\x01\x0b\x12\x06\x43LOSED\x18\x84\x07\xa2\x01\t\x12\x04OPEN\x18\xe7\x07\xb2\x01\x03\x08\xe8\x07R\x08\x65numType\x12\x98\x01\n\x17repeated_field_encoding\x18\x03 \x01(\x0e\x32\x31.google.protobuf.FeatureSet.RepeatedFieldEncodingB-\x88\x01\x01\x98\x01\x04\x98\x01\x01\xa2\x01\r\x12\x08\x45XPANDED\x18\x84\x07\xa2\x01\x0b\x12\x06PACKED\x18\xe7\x07\xb2\x01\x03\x08\xe8\x07R\x15repeatedFieldEncoding\x12~\n\x0futf8_validation\x18\x04 \x01(\x0e\x32*.google.protobuf.FeatureSet.Utf8ValidationB)\x88\x01\x01\x98\x01\x04\x98\x01\x01\xa2\x01\t\x12\x04NONE\x18\x84\x07\xa2\x01\x0b\x12\x06VERIFY\x18\xe7\x07\xb2\x01\x03\x08\xe8\x07R\x0eutf8Validation\x12~\n\x10message_encoding\x18\x05 \x01(\x0e\x32+.google.protobuf.FeatureSet.MessageEncodingB&\x88\x01\x01\x98\x01\x04\x98\x01\x01\xa2\x01\x14\x12\x0fLENGTH_PREFIXED\x18\x84\x07\xb2\x01\x03\x08\xe8\x07R\x0fmessageEncoding\x12\x82\x01\n\x0bjson_format\x18\x06 \x01(\x0e\x32&.google.protobuf.FeatureSet.JsonFormatB9\x88\x01\x01\x98\x01\x03\x98\x01\x06\x98\x01\x01\xa2\x01\x17\x12\x12LEGACY_BEST_EFFORT\x18\x84\x07\xa2\x01\n\x12\x05\x41LLOW\x18\xe7\x07\xb2\x01\x03\x08\xe8\x07R\njsonFormat\x12\xbc\x01\n\x14\x65nforce_naming_style\x18\x07 \x01(\x0e\x32..google.protobuf.FeatureSet.EnforceNamingStyleBZ\x88\x01\x02\x98\x01\x01\x98\x01\x02\x98\x01\x03\x98\x01\x04\x98\x01\x05\x98\x01\x06\x98\x01\x07\x98\x01\x08\x98\x01\t\xa2\x01\x11\x12\x0cSTYLE_LEGACY\x18\x84\x07\xa2\x01\x0e\x12\tSTYLE2024\x18\xe9\x07\xa2\x01\x0e\x12\tSTYLE2026\x18\x8fN\xb2\x01\x03\x08\xe9\x07R\x12\x65nforceNamingStyle\x12\xb9\x01\n\x19\x64\x65\x66\x61ult_symbol_visibility\x18\x08 \x01(\x0e\x32\x45.google.protobuf.FeatureSet.VisibilityFeature.DefaultSymbolVisibilityB6\x88\x01\x02\x98\x01\x01\xa2\x01\x0f\x12\nEXPORT_ALL\x18\x84\x07\xa2\x01\x15\x12\x10\x45XPORT_TOP_LEVEL\x18\xe9\x07\xb2\x01\x03\x08\xe9\x07R\x17\x64\x65\x66\x61ultSymbolVisibility\x1a\xa1\x01\n\x11VisibilityFeature\"\x81\x01\n\x17\x44\x65\x66\x61ultSymbolVisibility\x12%\n!DEFAULT_SYMBOL_VISIBILITY_UNKNOWN\x10\x00\x12\x0e\n\nEXPORT_ALL\x10\x01\x12\x14\n\x10\x45XPORT_TOP_LEVEL\x10\x02\x12\r\n\tLOCAL_ALL\x10\x03\x12\n\n\x06STRICT\x10\x04J\x08\x08\x01\x10\x80\x80\x80\x80\x02\"\\\n\rFieldPresence\x12\x1a\n\x16\x46IELD_PRESENCE_UNKNOWN\x10\x00\x12\x0c\n\x08\x45XPLICIT\x10\x01\x12\x0c\n\x08IMPLICIT\x10\x02\x12\x13\n\x0fLEGACY_REQUIRED\x10\x03\"7\n\x08\x45numType\x12\x15\n\x11\x45NUM_TYPE_UNKNOWN\x10\x00\x12\x08\n\x04OPEN\x10\x01\x12\n\n\x06\x43LOSED\x10\x02\"V\n\x15RepeatedFieldEncoding\x12#\n\x1fREPEATED_FIELD_ENCODING_UNKNOWN\x10\x00\x12\n\n\x06PACKED\x10\x01\x12\x0c\n\x08\x45XPANDED\x10\x02\"I\n\x0eUtf8Validation\x12\x1b\n\x17UTF8_VALIDATION_UNKNOWN\x10\x00\x12\n\n\x06VERIFY\x10\x02\x12\x08\n\x04NONE\x10\x03\"\x04\x08\x01\x10\x01\"S\n\x0fMessageEncoding\x12\x1c\n\x18MESSAGE_ENCODING_UNKNOWN\x10\x00\x12\x13\n\x0fLENGTH_PREFIXED\x10\x01\x12\r\n\tDELIMITED\x10\x02\"H\n\nJsonFormat\x12\x17\n\x13JSON_FORMAT_UNKNOWN\x10\x00\x12\t\n\x05\x41LLOW\x10\x01\x12\x16\n\x12LEGACY_BEST_EFFORT\x10\x02\"f\n\x12\x45nforceNamingStyle\x12 \n\x1c\x45NFORCE_NAMING_STYLE_UNKNOWN\x10\x00\x12\r\n\tSTYLE2024\x10\x01\x12\x10\n\x0cSTYLE_LEGACY\x10\x02\x12\r\n\tSTYLE2026\x10\x03*\x06\x08\xe8\x07\x10\x8bN*\x06\x08\x8bN\x10\x90N*\x06\x08\x90N\x10\x91NJ\x06\x08\xe7\x07\x10\xe8\x07\"\xef\x03\n\x12\x46\x65\x61tureSetDefaults\x12X\n\x08\x64\x65\x66\x61ults\x18\x01 \x03(\x0b\x32<.google.protobuf.FeatureSetDefaults.FeatureSetEditionDefaultR\x08\x64\x65\x66\x61ults\x12\x41\n\x0fminimum_edition\x18\x04 \x01(\x0e\x32\x18.google.protobuf.EditionR\x0eminimumEdition\x12\x41\n\x0fmaximum_edition\x18\x05 \x01(\x0e\x32\x18.google.protobuf.EditionR\x0emaximumEdition\x1a\xf8\x01\n\x18\x46\x65\x61tureSetEditionDefault\x12\x32\n\x07\x65\x64ition\x18\x03 \x01(\x0e\x32\x18.google.protobuf.EditionR\x07\x65\x64ition\x12N\n\x14overridable_features\x18\x04 \x01(\x0b\x32\x1b.google.protobuf.FeatureSetR\x13overridableFeatures\x12\x42\n\x0e\x66ixed_features\x18\x05 \x01(\x0b\x32\x1b.google.protobuf.FeatureSetR\rfixedFeaturesJ\x04\x08\x01\x10\x02J\x04\x08\x02\x10\x03R\x08\x66\x65\x61tures\"\xb5\x02\n\x0eSourceCodeInfo\x12\x44\n\x08location\x18\x01 \x03(\x0b\x32(.google.protobuf.SourceCodeInfo.LocationR\x08location\x1a\xce\x01\n\x08Location\x12\x16\n\x04path\x18\x01 \x03(\x05\x42\x02\x10\x01R\x04path\x12\x16\n\x04span\x18\x02 \x03(\x05\x42\x02\x10\x01R\x04span\x12)\n\x10leading_comments\x18\x03 \x01(\tR\x0fleadingComments\x12+\n\x11trailing_comments\x18\x04 \x01(\tR\x10trailingComments\x12:\n\x19leading_detached_comments\x18\x06 \x03(\tR\x17leadingDetachedComments*\x0c\x08\x80\xec\xca\xff\x01\x10\x81\xec\xca\xff\x01\"\xd0\x02\n\x11GeneratedCodeInfo\x12M\n\nannotation\x18\x01 \x03(\x0b\x32-.google.protobuf.GeneratedCodeInfo.AnnotationR\nannotation\x1a\xeb\x01\n\nAnnotation\x12\x16\n\x04path\x18\x01 \x03(\x05\x42\x02\x10\x01R\x04path\x12\x1f\n\x0bsource_file\x18\x02 \x01(\tR\nsourceFile\x12\x14\n\x05\x62\x65gin\x18\x03 \x01(\x05R\x05\x62\x65gin\x12\x10\n\x03\x65nd\x18\x04 \x01(\x05R\x03\x65nd\x12R\n\x08semantic\x18\x05 \x01(\x0e\x32\x36.google.protobuf.GeneratedCodeInfo.Annotation.SemanticR\x08semantic\"(\n\x08Semantic\x12\x08\n\x04NONE\x10\x00\x12\x07\n\x03SET\x10\x01\x12\t\n\x05\x41LIAS\x10\x02*\xd1\x02\n\x07\x45\x64ition\x12\x13\n\x0f\x45\x44ITION_UNKNOWN\x10\x00\x12\x13\n\x0e\x45\x44ITION_LEGACY\x10\x84\x07\x12\x13\n\x0e\x45\x44ITION_PROTO2\x10\xe6\x07\x12\x13\n\x0e\x45\x44ITION_PROTO3\x10\xe7\x07\x12\x11\n\x0c\x45\x44ITION_2023\x10\xe8\x07\x12\x11\n\x0c\x45\x44ITION_2024\x10\xe9\x07\x12\x11\n\x0c\x45\x44ITION_2026\x10\xea\x07\x12\x15\n\x10\x45\x44ITION_UNSTABLE\x10\x8fN\x12\x17\n\x13\x45\x44ITION_1_TEST_ONLY\x10\x01\x12\x17\n\x13\x45\x44ITION_2_TEST_ONLY\x10\x02\x12\x1d\n\x17\x45\x44ITION_99997_TEST_ONLY\x10\x9d\x8d\x06\x12\x1d\n\x17\x45\x44ITION_99998_TEST_ONLY\x10\x9e\x8d\x06\x12\x1d\n\x17\x45\x44ITION_99999_TEST_ONLY\x10\x9f\x8d\x06\x12\x13\n\x0b\x45\x44ITION_MAX\x10\xff\xff\xff\xff\x07*U\n\x10SymbolVisibility\x12\x14\n\x10VISIBILITY_UNSET\x10\x00\x12\x14\n\x10VISIBILITY_LOCAL\x10\x01\x12\x15\n\x11VISIBILITY_EXPORT\x10\x02\x42~\n\x13\x63om.google.protobufB\x10\x44\x65scriptorProtosH\x01Z-google.golang.org/protobuf/types/descriptorpb\xf8\x01\x01\xa2\x02\x03GPB\xaa\x02\x1aGoogle.Protobuf.Reflection'+    serialized_pb=b'\n google/protobuf/descriptor.proto\x12\x0fgoogle.protobuf\"[\n\x11\x46ileDescriptorSet\x12\x38\n\x04\x66ile\x18\x01 \x03(\x0b\x32$.google.protobuf.FileDescriptorProtoR\x04\x66ile*\x0c\x08\x80\xec\xca\xff\x01\x10\x81\xec\xca\xff\x01\"\xc5\x05\n\x13\x46ileDescriptorProto\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12\x18\n\x07package\x18\x02 \x01(\tR\x07package\x12\x1e\n\ndependency\x18\x03 \x03(\tR\ndependency\x12+\n\x11public_dependency\x18\n \x03(\x05R\x10publicDependency\x12\'\n\x0fweak_dependency\x18\x0b \x03(\x05R\x0eweakDependency\x12+\n\x11option_dependency\x18\x0f \x03(\tR\x10optionDependency\x12\x43\n\x0cmessage_type\x18\x04 \x03(\x0b\x32 .google.protobuf.DescriptorProtoR\x0bmessageType\x12\x41\n\tenum_type\x18\x05 \x03(\x0b\x32$.google.protobuf.EnumDescriptorProtoR\x08\x65numType\x12\x41\n\x07service\x18\x06 \x03(\x0b\x32\'.google.protobuf.ServiceDescriptorProtoR\x07service\x12\x43\n\textension\x18\x07 \x03(\x0b\x32%.google.protobuf.FieldDescriptorProtoR\textension\x12\x36\n\x07options\x18\x08 \x01(\x0b\x32\x1c.google.protobuf.FileOptionsR\x07options\x12I\n\x10source_code_info\x18\t \x01(\x0b\x32\x1f.google.protobuf.SourceCodeInfoR\x0esourceCodeInfo\x12\x16\n\x06syntax\x18\x0c \x01(\tR\x06syntax\x12\x32\n\x07\x65\x64ition\x18\x0e \x01(\x0e\x32\x18.google.protobuf.EditionR\x07\x65\x64ition\"\xfc\x06\n\x0f\x44\x65scriptorProto\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12;\n\x05\x66ield\x18\x02 \x03(\x0b\x32%.google.protobuf.FieldDescriptorProtoR\x05\x66ield\x12\x43\n\textension\x18\x06 \x03(\x0b\x32%.google.protobuf.FieldDescriptorProtoR\textension\x12\x41\n\x0bnested_type\x18\x03 \x03(\x0b\x32 .google.protobuf.DescriptorProtoR\nnestedType\x12\x41\n\tenum_type\x18\x04 \x03(\x0b\x32$.google.protobuf.EnumDescriptorProtoR\x08\x65numType\x12X\n\x0f\x65xtension_range\x18\x05 \x03(\x0b\x32/.google.protobuf.DescriptorProto.ExtensionRangeR\x0e\x65xtensionRange\x12\x44\n\noneof_decl\x18\x08 \x03(\x0b\x32%.google.protobuf.OneofDescriptorProtoR\toneofDecl\x12\x39\n\x07options\x18\x07 \x01(\x0b\x32\x1f.google.protobuf.MessageOptionsR\x07options\x12U\n\x0ereserved_range\x18\t \x03(\x0b\x32..google.protobuf.DescriptorProto.ReservedRangeR\rreservedRange\x12#\n\rreserved_name\x18\n \x03(\tR\x0creservedName\x12\x41\n\nvisibility\x18\x0b \x01(\x0e\x32!.google.protobuf.SymbolVisibilityR\nvisibility\x1az\n\x0e\x45xtensionRange\x12\x14\n\x05start\x18\x01 \x01(\x05R\x05start\x12\x10\n\x03\x65nd\x18\x02 \x01(\x05R\x03\x65nd\x12@\n\x07options\x18\x03 \x01(\x0b\x32&.google.protobuf.ExtensionRangeOptionsR\x07options\x1a\x37\n\rReservedRange\x12\x14\n\x05start\x18\x01 \x01(\x05R\x05start\x12\x10\n\x03\x65nd\x18\x02 \x01(\x05R\x03\x65nd\"\xcc\x04\n\x15\x45xtensionRangeOptions\x12X\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32$.google.protobuf.UninterpretedOptionR\x13uninterpretedOption\x12Y\n\x0b\x64\x65\x63laration\x18\x02 \x03(\x0b\x32\x32.google.protobuf.ExtensionRangeOptions.DeclarationB\x03\x88\x01\x02R\x0b\x64\x65\x63laration\x12\x37\n\x08\x66\x65\x61tures\x18\x32 \x01(\x0b\x32\x1b.google.protobuf.FeatureSetR\x08\x66\x65\x61tures\x12m\n\x0cverification\x18\x03 \x01(\x0e\x32\x38.google.protobuf.ExtensionRangeOptions.VerificationState:\nUNVERIFIEDB\x03\x88\x01\x02R\x0cverification\x1a\x94\x01\n\x0b\x44\x65\x63laration\x12\x16\n\x06number\x18\x01 \x01(\x05R\x06number\x12\x1b\n\tfull_name\x18\x02 \x01(\tR\x08\x66ullName\x12\x12\n\x04type\x18\x03 \x01(\tR\x04type\x12\x1a\n\x08reserved\x18\x05 \x01(\x08R\x08reserved\x12\x1a\n\x08repeated\x18\x06 \x01(\x08R\x08repeatedJ\x04\x08\x04\x10\x05\"4\n\x11VerificationState\x12\x0f\n\x0b\x44\x45\x43LARATION\x10\x00\x12\x0e\n\nUNVERIFIED\x10\x01*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02\"\xc1\x06\n\x14\x46ieldDescriptorProto\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12\x16\n\x06number\x18\x03 \x01(\x05R\x06number\x12\x41\n\x05label\x18\x04 \x01(\x0e\x32+.google.protobuf.FieldDescriptorProto.LabelR\x05label\x12>\n\x04type\x18\x05 \x01(\x0e\x32*.google.protobuf.FieldDescriptorProto.TypeR\x04type\x12\x1b\n\ttype_name\x18\x06 \x01(\tR\x08typeName\x12\x1a\n\x08\x65xtendee\x18\x02 \x01(\tR\x08\x65xtendee\x12#\n\rdefault_value\x18\x07 \x01(\tR\x0c\x64\x65\x66\x61ultValue\x12\x1f\n\x0boneof_index\x18\t \x01(\x05R\noneofIndex\x12\x1b\n\tjson_name\x18\n \x01(\tR\x08jsonName\x12\x37\n\x07options\x18\x08 \x01(\x0b\x32\x1d.google.protobuf.FieldOptionsR\x07options\x12\'\n\x0fproto3_optional\x18\x11 \x01(\x08R\x0eproto3Optional\"\xb6\x02\n\x04Type\x12\x0f\n\x0bTYPE_DOUBLE\x10\x01\x12\x0e\n\nTYPE_FLOAT\x10\x02\x12\x0e\n\nTYPE_INT64\x10\x03\x12\x0f\n\x0bTYPE_UINT64\x10\x04\x12\x0e\n\nTYPE_INT32\x10\x05\x12\x10\n\x0cTYPE_FIXED64\x10\x06\x12\x10\n\x0cTYPE_FIXED32\x10\x07\x12\r\n\tTYPE_BOOL\x10\x08\x12\x0f\n\x0bTYPE_STRING\x10\t\x12\x0e\n\nTYPE_GROUP\x10\n\x12\x10\n\x0cTYPE_MESSAGE\x10\x0b\x12\x0e\n\nTYPE_BYTES\x10\x0c\x12\x0f\n\x0bTYPE_UINT32\x10\r\x12\r\n\tTYPE_ENUM\x10\x0e\x12\x11\n\rTYPE_SFIXED32\x10\x0f\x12\x11\n\rTYPE_SFIXED64\x10\x10\x12\x0f\n\x0bTYPE_SINT32\x10\x11\x12\x0f\n\x0bTYPE_SINT64\x10\x12\"C\n\x05Label\x12\x12\n\x0eLABEL_OPTIONAL\x10\x01\x12\x12\n\x0eLABEL_REPEATED\x10\x03\x12\x12\n\x0eLABEL_REQUIRED\x10\x02\"c\n\x14OneofDescriptorProto\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12\x37\n\x07options\x18\x02 \x01(\x0b\x32\x1d.google.protobuf.OneofOptionsR\x07options\"\xa6\x03\n\x13\x45numDescriptorProto\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12?\n\x05value\x18\x02 \x03(\x0b\x32).google.protobuf.EnumValueDescriptorProtoR\x05value\x12\x36\n\x07options\x18\x03 \x01(\x0b\x32\x1c.google.protobuf.EnumOptionsR\x07options\x12]\n\x0ereserved_range\x18\x04 \x03(\x0b\x32\x36.google.protobuf.EnumDescriptorProto.EnumReservedRangeR\rreservedRange\x12#\n\rreserved_name\x18\x05 \x03(\tR\x0creservedName\x12\x41\n\nvisibility\x18\x06 \x01(\x0e\x32!.google.protobuf.SymbolVisibilityR\nvisibility\x1a;\n\x11\x45numReservedRange\x12\x14\n\x05start\x18\x01 \x01(\x05R\x05start\x12\x10\n\x03\x65nd\x18\x02 \x01(\x05R\x03\x65nd\"\x83\x01\n\x18\x45numValueDescriptorProto\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12\x16\n\x06number\x18\x02 \x01(\x05R\x06number\x12;\n\x07options\x18\x03 \x01(\x0b\x32!.google.protobuf.EnumValueOptionsR\x07options\"\xb5\x01\n\x16ServiceDescriptorProto\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12>\n\x06method\x18\x02 \x03(\x0b\x32&.google.protobuf.MethodDescriptorProtoR\x06method\x12\x39\n\x07options\x18\x03 \x01(\x0b\x32\x1f.google.protobuf.ServiceOptionsR\x07optionsJ\x04\x08\x04\x10\x05R\x06stream\"\x89\x02\n\x15MethodDescriptorProto\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12\x1d\n\ninput_type\x18\x02 \x01(\tR\tinputType\x12\x1f\n\x0boutput_type\x18\x03 \x01(\tR\noutputType\x12\x38\n\x07options\x18\x04 \x01(\x0b\x32\x1e.google.protobuf.MethodOptionsR\x07options\x12\x30\n\x10\x63lient_streaming\x18\x05 \x01(\x08:\x05\x66\x61lseR\x0f\x63lientStreaming\x12\x30\n\x10server_streaming\x18\x06 \x01(\x08:\x05\x66\x61lseR\x0fserverStreaming\"\xf2\n\n\x0b\x46ileOptions\x12!\n\x0cjava_package\x18\x01 \x01(\tR\x0bjavaPackage\x12\x30\n\x14java_outer_classname\x18\x08 \x01(\tR\x12javaOuterClassname\x12\xf9\x01\n\x13java_multiple_files\x18\n \x01(\x08:\x05\x66\x61lseB\xc1\x01\xb2\x01\xbd\x01\x08\xe6\x07 \xe9\x07*\xb4\x01This behavior is enabled by default in editions 2024 and above. To disable it, you can set `features.(pb.java).nest_in_file_class = YES` on individual messages, enums, or services.R\x11javaMultipleFiles\x12\x44\n\x1djava_generate_equals_and_hash\x18\x14 \x01(\x08\x42\x02\x18\x01R\x19javaGenerateEqualsAndHash\x12:\n\x16java_string_check_utf8\x18\x1b \x01(\x08:\x05\x66\x61lseR\x13javaStringCheckUtf8\x12S\n\x0coptimize_for\x18\t \x01(\x0e\x32).google.protobuf.FileOptions.OptimizeMode:\x05SPEEDR\x0boptimizeFor\x12\x1d\n\ngo_package\x18\x0b \x01(\tR\tgoPackage\x12\x35\n\x13\x63\x63_generic_services\x18\x10 \x01(\x08:\x05\x66\x61lseR\x11\x63\x63GenericServices\x12\x39\n\x15java_generic_services\x18\x11 \x01(\x08:\x05\x66\x61lseR\x13javaGenericServices\x12\x35\n\x13py_generic_services\x18\x12 \x01(\x08:\x05\x66\x61lseR\x11pyGenericServices\x12%\n\ndeprecated\x18\x17 \x01(\x08:\x05\x66\x61lseR\ndeprecated\x12.\n\x10\x63\x63_enable_arenas\x18\x1f \x01(\x08:\x04trueR\x0e\x63\x63\x45nableArenas\x12*\n\x11objc_class_prefix\x18$ \x01(\tR\x0fobjcClassPrefix\x12)\n\x10\x63sharp_namespace\x18% \x01(\tR\x0f\x63sharpNamespace\x12!\n\x0cswift_prefix\x18\' \x01(\tR\x0bswiftPrefix\x12(\n\x10php_class_prefix\x18( \x01(\tR\x0ephpClassPrefix\x12#\n\rphp_namespace\x18) \x01(\tR\x0cphpNamespace\x12\x34\n\x16php_metadata_namespace\x18, \x01(\tR\x14phpMetadataNamespace\x12!\n\x0cruby_package\x18- \x01(\tR\x0brubyPackage\x12\x37\n\x08\x66\x65\x61tures\x18\x32 \x01(\x0b\x32\x1b.google.protobuf.FeatureSetR\x08\x66\x65\x61tures\x12X\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32$.google.protobuf.UninterpretedOptionR\x13uninterpretedOption\":\n\x0cOptimizeMode\x12\t\n\x05SPEED\x10\x01\x12\r\n\tCODE_SIZE\x10\x02\x12\x10\n\x0cLITE_RUNTIME\x10\x03*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02J\x04\x08*\x10+J\x04\x08&\x10\'R\x14php_generic_services\"\xf4\x03\n\x0eMessageOptions\x12<\n\x17message_set_wire_format\x18\x01 \x01(\x08:\x05\x66\x61lseR\x14messageSetWireFormat\x12L\n\x1fno_standard_descriptor_accessor\x18\x02 \x01(\x08:\x05\x66\x61lseR\x1cnoStandardDescriptorAccessor\x12%\n\ndeprecated\x18\x03 \x01(\x08:\x05\x66\x61lseR\ndeprecated\x12\x1b\n\tmap_entry\x18\x07 \x01(\x08R\x08mapEntry\x12V\n&deprecated_legacy_json_field_conflicts\x18\x0b \x01(\x08\x42\x02\x18\x01R\"deprecatedLegacyJsonFieldConflicts\x12\x37\n\x08\x66\x65\x61tures\x18\x0c \x01(\x0b\x32\x1b.google.protobuf.FeatureSetR\x08\x66\x65\x61tures\x12X\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32$.google.protobuf.UninterpretedOptionR\x13uninterpretedOption*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02J\x04\x08\x04\x10\x05J\x04\x08\x05\x10\x06J\x04\x08\x06\x10\x07J\x04\x08\x08\x10\tJ\x04\x08\t\x10\n\"\xc6\r\n\x0c\x46ieldOptions\x12\x41\n\x05\x63type\x18\x01 \x01(\x0e\x32#.google.protobuf.FieldOptions.CType:\x06STRINGR\x05\x63type\x12\x16\n\x06packed\x18\x02 \x01(\x08R\x06packed\x12G\n\x06jstype\x18\x06 \x01(\x0e\x32$.google.protobuf.FieldOptions.JSType:\tJS_NORMALR\x06jstype\x12\x19\n\x04lazy\x18\x05 \x01(\x08:\x05\x66\x61lseR\x04lazy\x12.\n\x0funverified_lazy\x18\x0f \x01(\x08:\x05\x66\x61lseR\x0eunverifiedLazy\x12%\n\ndeprecated\x18\x03 \x01(\x08:\x05\x66\x61lseR\ndeprecated\x12\x1d\n\x04weak\x18\n \x01(\x08:\x05\x66\x61lseB\x02\x18\x01R\x04weak\x12(\n\x0c\x64\x65\x62ug_redact\x18\x10 \x01(\x08:\x05\x66\x61lseR\x0b\x64\x65\x62ugRedact\x12K\n\tretention\x18\x11 \x01(\x0e\x32-.google.protobuf.FieldOptions.OptionRetentionR\tretention\x12H\n\x07targets\x18\x13 \x03(\x0e\x32..google.protobuf.FieldOptions.OptionTargetTypeR\x07targets\x12W\n\x10\x65\x64ition_defaults\x18\x14 \x03(\x0b\x32,.google.protobuf.FieldOptions.EditionDefaultR\x0f\x65\x64itionDefaults\x12\x37\n\x08\x66\x65\x61tures\x18\x15 \x01(\x0b\x32\x1b.google.protobuf.FeatureSetR\x08\x66\x65\x61tures\x12U\n\x0f\x66\x65\x61ture_support\x18\x16 \x01(\x0b\x32,.google.protobuf.FieldOptions.FeatureSupportR\x0e\x66\x65\x61tureSupport\x12X\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32$.google.protobuf.UninterpretedOptionR\x13uninterpretedOption\x1aZ\n\x0e\x45\x64itionDefault\x12\x32\n\x07\x65\x64ition\x18\x03 \x01(\x0e\x32\x18.google.protobuf.EditionR\x07\x65\x64ition\x12\x14\n\x05value\x18\x02 \x01(\tR\x05value\x1a\xbb\x02\n\x0e\x46\x65\x61tureSupport\x12G\n\x12\x65\x64ition_introduced\x18\x01 \x01(\x0e\x32\x18.google.protobuf.EditionR\x11\x65\x64itionIntroduced\x12G\n\x12\x65\x64ition_deprecated\x18\x02 \x01(\x0e\x32\x18.google.protobuf.EditionR\x11\x65\x64itionDeprecated\x12/\n\x13\x64\x65precation_warning\x18\x03 \x01(\tR\x12\x64\x65precationWarning\x12\x41\n\x0f\x65\x64ition_removed\x18\x04 \x01(\x0e\x32\x18.google.protobuf.EditionR\x0e\x65\x64itionRemoved\x12#\n\rremoval_error\x18\x05 \x01(\tR\x0cremovalError\"/\n\x05\x43Type\x12\n\n\x06STRING\x10\x00\x12\x08\n\x04\x43ORD\x10\x01\x12\x10\n\x0cSTRING_PIECE\x10\x02\"5\n\x06JSType\x12\r\n\tJS_NORMAL\x10\x00\x12\r\n\tJS_STRING\x10\x01\x12\r\n\tJS_NUMBER\x10\x02\"U\n\x0fOptionRetention\x12\x15\n\x11RETENTION_UNKNOWN\x10\x00\x12\x15\n\x11RETENTION_RUNTIME\x10\x01\x12\x14\n\x10RETENTION_SOURCE\x10\x02\"\x8c\x02\n\x10OptionTargetType\x12\x17\n\x13TARGET_TYPE_UNKNOWN\x10\x00\x12\x14\n\x10TARGET_TYPE_FILE\x10\x01\x12\x1f\n\x1bTARGET_TYPE_EXTENSION_RANGE\x10\x02\x12\x17\n\x13TARGET_TYPE_MESSAGE\x10\x03\x12\x15\n\x11TARGET_TYPE_FIELD\x10\x04\x12\x15\n\x11TARGET_TYPE_ONEOF\x10\x05\x12\x14\n\x10TARGET_TYPE_ENUM\x10\x06\x12\x1a\n\x16TARGET_TYPE_ENUM_ENTRY\x10\x07\x12\x17\n\x13TARGET_TYPE_SERVICE\x10\x08\x12\x16\n\x12TARGET_TYPE_METHOD\x10\t*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02J\x04\x08\x04\x10\x05J\x04\x08\x12\x10\x13\"\xac\x01\n\x0cOneofOptions\x12\x37\n\x08\x66\x65\x61tures\x18\x01 \x01(\x0b\x32\x1b.google.protobuf.FeatureSetR\x08\x66\x65\x61tures\x12X\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32$.google.protobuf.UninterpretedOptionR\x13uninterpretedOption*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02\"\xd1\x02\n\x0b\x45numOptions\x12\x1f\n\x0b\x61llow_alias\x18\x02 \x01(\x08R\nallowAlias\x12%\n\ndeprecated\x18\x03 \x01(\x08:\x05\x66\x61lseR\ndeprecated\x12V\n&deprecated_legacy_json_field_conflicts\x18\x06 \x01(\x08\x42\x02\x18\x01R\"deprecatedLegacyJsonFieldConflicts\x12\x37\n\x08\x66\x65\x61tures\x18\x07 \x01(\x0b\x32\x1b.google.protobuf.FeatureSetR\x08\x66\x65\x61tures\x12X\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32$.google.protobuf.UninterpretedOptionR\x13uninterpretedOption*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02J\x04\x08\x05\x10\x06\"\xd8\x02\n\x10\x45numValueOptions\x12%\n\ndeprecated\x18\x01 \x01(\x08:\x05\x66\x61lseR\ndeprecated\x12\x37\n\x08\x66\x65\x61tures\x18\x02 \x01(\x0b\x32\x1b.google.protobuf.FeatureSetR\x08\x66\x65\x61tures\x12(\n\x0c\x64\x65\x62ug_redact\x18\x03 \x01(\x08:\x05\x66\x61lseR\x0b\x64\x65\x62ugRedact\x12U\n\x0f\x66\x65\x61ture_support\x18\x04 \x01(\x0b\x32,.google.protobuf.FieldOptions.FeatureSupportR\x0e\x66\x65\x61tureSupport\x12X\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32$.google.protobuf.UninterpretedOptionR\x13uninterpretedOption*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02\"\xd5\x01\n\x0eServiceOptions\x12\x37\n\x08\x66\x65\x61tures\x18\" \x01(\x0b\x32\x1b.google.protobuf.FeatureSetR\x08\x66\x65\x61tures\x12%\n\ndeprecated\x18! \x01(\x08:\x05\x66\x61lseR\ndeprecated\x12X\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32$.google.protobuf.UninterpretedOptionR\x13uninterpretedOption*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02\"\x99\x03\n\rMethodOptions\x12%\n\ndeprecated\x18! \x01(\x08:\x05\x66\x61lseR\ndeprecated\x12q\n\x11idempotency_level\x18\" \x01(\x0e\x32/.google.protobuf.MethodOptions.IdempotencyLevel:\x13IDEMPOTENCY_UNKNOWNR\x10idempotencyLevel\x12\x37\n\x08\x66\x65\x61tures\x18# \x01(\x0b\x32\x1b.google.protobuf.FeatureSetR\x08\x66\x65\x61tures\x12X\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32$.google.protobuf.UninterpretedOptionR\x13uninterpretedOption\"P\n\x10IdempotencyLevel\x12\x17\n\x13IDEMPOTENCY_UNKNOWN\x10\x00\x12\x13\n\x0fNO_SIDE_EFFECTS\x10\x01\x12\x0e\n\nIDEMPOTENT\x10\x02*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02\"\x9a\x03\n\x13UninterpretedOption\x12\x41\n\x04name\x18\x02 \x03(\x0b\x32-.google.protobuf.UninterpretedOption.NamePartR\x04name\x12)\n\x10identifier_value\x18\x03 \x01(\tR\x0fidentifierValue\x12,\n\x12positive_int_value\x18\x04 \x01(\x04R\x10positiveIntValue\x12,\n\x12negative_int_value\x18\x05 \x01(\x03R\x10negativeIntValue\x12!\n\x0c\x64ouble_value\x18\x06 \x01(\x01R\x0b\x64oubleValue\x12!\n\x0cstring_value\x18\x07 \x01(\x0cR\x0bstringValue\x12\'\n\x0f\x61ggregate_value\x18\x08 \x01(\tR\x0e\x61ggregateValue\x1aJ\n\x08NamePart\x12\x1b\n\tname_part\x18\x01 \x02(\tR\x08namePart\x12!\n\x0cis_extension\x18\x02 \x02(\x08R\x0bisExtension\"\x8e\x0f\n\nFeatureSet\x12\x91\x01\n\x0e\x66ield_presence\x18\x01 \x01(\x0e\x32).google.protobuf.FeatureSet.FieldPresenceB?\x88\x01\x01\x98\x01\x04\x98\x01\x01\xa2\x01\r\x12\x08\x45XPLICIT\x18\x84\x07\xa2\x01\r\x12\x08IMPLICIT\x18\xe7\x07\xa2\x01\r\x12\x08\x45XPLICIT\x18\xe8\x07\xb2\x01\x03\x08\xe8\x07R\rfieldPresence\x12l\n\tenum_type\x18\x02 \x01(\x0e\x32$.google.protobuf.FeatureSet.EnumTypeB)\x88\x01\x01\x98\x01\x06\x98\x01\x01\xa2\x01\x0b\x12\x06\x43LOSED\x18\x84\x07\xa2\x01\t\x12\x04OPEN\x18\xe7\x07\xb2\x01\x03\x08\xe8\x07R\x08\x65numType\x12\x98\x01\n\x17repeated_field_encoding\x18\x03 \x01(\x0e\x32\x31.google.protobuf.FeatureSet.RepeatedFieldEncodingB-\x88\x01\x01\x98\x01\x04\x98\x01\x01\xa2\x01\r\x12\x08\x45XPANDED\x18\x84\x07\xa2\x01\x0b\x12\x06PACKED\x18\xe7\x07\xb2\x01\x03\x08\xe8\x07R\x15repeatedFieldEncoding\x12~\n\x0futf8_validation\x18\x04 \x01(\x0e\x32*.google.protobuf.FeatureSet.Utf8ValidationB)\x88\x01\x01\x98\x01\x04\x98\x01\x01\xa2\x01\t\x12\x04NONE\x18\x84\x07\xa2\x01\x0b\x12\x06VERIFY\x18\xe7\x07\xb2\x01\x03\x08\xe8\x07R\x0eutf8Validation\x12~\n\x10message_encoding\x18\x05 \x01(\x0e\x32+.google.protobuf.FeatureSet.MessageEncodingB&\x88\x01\x01\x98\x01\x04\x98\x01\x01\xa2\x01\x14\x12\x0fLENGTH_PREFIXED\x18\x84\x07\xb2\x01\x03\x08\xe8\x07R\x0fmessageEncoding\x12\x82\x01\n\x0bjson_format\x18\x06 \x01(\x0e\x32&.google.protobuf.FeatureSet.JsonFormatB9\x88\x01\x01\x98\x01\x03\x98\x01\x06\x98\x01\x01\xa2\x01\x17\x12\x12LEGACY_BEST_EFFORT\x18\x84\x07\xa2\x01\n\x12\x05\x41LLOW\x18\xe7\x07\xb2\x01\x03\x08\xe8\x07R\njsonFormat\x12\xab\x01\n\x14\x65nforce_naming_style\x18\x07 \x01(\x0e\x32..google.protobuf.FeatureSet.EnforceNamingStyleBI\x88\x01\x02\x98\x01\x01\x98\x01\x02\x98\x01\x03\x98\x01\x04\x98\x01\x05\x98\x01\x06\x98\x01\x07\x98\x01\x08\x98\x01\t\xa2\x01\x11\x12\x0cSTYLE_LEGACY\x18\x84\x07\xa2\x01\x0e\x12\tSTYLE2024\x18\xe9\x07\xb2\x01\x03\x08\xe9\x07R\x12\x65nforceNamingStyle\x12\xb9\x01\n\x19\x64\x65\x66\x61ult_symbol_visibility\x18\x08 \x01(\x0e\x32\x45.google.protobuf.FeatureSet.VisibilityFeature.DefaultSymbolVisibilityB6\x88\x01\x02\x98\x01\x01\xa2\x01\x0f\x12\nEXPORT_ALL\x18\x84\x07\xa2\x01\x15\x12\x10\x45XPORT_TOP_LEVEL\x18\xe9\x07\xb2\x01\x03\x08\xe9\x07R\x17\x64\x65\x66\x61ultSymbolVisibility\x1a\xa1\x01\n\x11VisibilityFeature\"\x81\x01\n\x17\x44\x65\x66\x61ultSymbolVisibility\x12%\n!DEFAULT_SYMBOL_VISIBILITY_UNKNOWN\x10\x00\x12\x0e\n\nEXPORT_ALL\x10\x01\x12\x14\n\x10\x45XPORT_TOP_LEVEL\x10\x02\x12\r\n\tLOCAL_ALL\x10\x03\x12\n\n\x06STRICT\x10\x04J\x08\x08\x01\x10\x80\x80\x80\x80\x02\"\\\n\rFieldPresence\x12\x1a\n\x16\x46IELD_PRESENCE_UNKNOWN\x10\x00\x12\x0c\n\x08\x45XPLICIT\x10\x01\x12\x0c\n\x08IMPLICIT\x10\x02\x12\x13\n\x0fLEGACY_REQUIRED\x10\x03\"7\n\x08\x45numType\x12\x15\n\x11\x45NUM_TYPE_UNKNOWN\x10\x00\x12\x08\n\x04OPEN\x10\x01\x12\n\n\x06\x43LOSED\x10\x02\"V\n\x15RepeatedFieldEncoding\x12#\n\x1fREPEATED_FIELD_ENCODING_UNKNOWN\x10\x00\x12\n\n\x06PACKED\x10\x01\x12\x0c\n\x08\x45XPANDED\x10\x02\"I\n\x0eUtf8Validation\x12\x1b\n\x17UTF8_VALIDATION_UNKNOWN\x10\x00\x12\n\n\x06VERIFY\x10\x02\x12\x08\n\x04NONE\x10\x03\"\x04\x08\x01\x10\x01\"S\n\x0fMessageEncoding\x12\x1c\n\x18MESSAGE_ENCODING_UNKNOWN\x10\x00\x12\x13\n\x0fLENGTH_PREFIXED\x10\x01\x12\r\n\tDELIMITED\x10\x02\"H\n\nJsonFormat\x12\x17\n\x13JSON_FORMAT_UNKNOWN\x10\x00\x12\t\n\x05\x41LLOW\x10\x01\x12\x16\n\x12LEGACY_BEST_EFFORT\x10\x02\"W\n\x12\x45nforceNamingStyle\x12 \n\x1c\x45NFORCE_NAMING_STYLE_UNKNOWN\x10\x00\x12\r\n\tSTYLE2024\x10\x01\x12\x10\n\x0cSTYLE_LEGACY\x10\x02*\x06\x08\xe8\x07\x10\x8bN*\x06\x08\x8bN\x10\x90N*\x06\x08\x90N\x10\x91NJ\x06\x08\xe7\x07\x10\xe8\x07\"\xef\x03\n\x12\x46\x65\x61tureSetDefaults\x12X\n\x08\x64\x65\x66\x61ults\x18\x01 \x03(\x0b\x32<.google.protobuf.FeatureSetDefaults.FeatureSetEditionDefaultR\x08\x64\x65\x66\x61ults\x12\x41\n\x0fminimum_edition\x18\x04 \x01(\x0e\x32\x18.google.protobuf.EditionR\x0eminimumEdition\x12\x41\n\x0fmaximum_edition\x18\x05 \x01(\x0e\x32\x18.google.protobuf.EditionR\x0emaximumEdition\x1a\xf8\x01\n\x18\x46\x65\x61tureSetEditionDefault\x12\x32\n\x07\x65\x64ition\x18\x03 \x01(\x0e\x32\x18.google.protobuf.EditionR\x07\x65\x64ition\x12N\n\x14overridable_features\x18\x04 \x01(\x0b\x32\x1b.google.protobuf.FeatureSetR\x13overridableFeatures\x12\x42\n\x0e\x66ixed_features\x18\x05 \x01(\x0b\x32\x1b.google.protobuf.FeatureSetR\rfixedFeaturesJ\x04\x08\x01\x10\x02J\x04\x08\x02\x10\x03R\x08\x66\x65\x61tures\"\xb5\x02\n\x0eSourceCodeInfo\x12\x44\n\x08location\x18\x01 \x03(\x0b\x32(.google.protobuf.SourceCodeInfo.LocationR\x08location\x1a\xce\x01\n\x08Location\x12\x16\n\x04path\x18\x01 \x03(\x05\x42\x02\x10\x01R\x04path\x12\x16\n\x04span\x18\x02 \x03(\x05\x42\x02\x10\x01R\x04span\x12)\n\x10leading_comments\x18\x03 \x01(\tR\x0fleadingComments\x12+\n\x11trailing_comments\x18\x04 \x01(\tR\x10trailingComments\x12:\n\x19leading_detached_comments\x18\x06 \x03(\tR\x17leadingDetachedComments*\x0c\x08\x80\xec\xca\xff\x01\x10\x81\xec\xca\xff\x01\"\xd0\x02\n\x11GeneratedCodeInfo\x12M\n\nannotation\x18\x01 \x03(\x0b\x32-.google.protobuf.GeneratedCodeInfo.AnnotationR\nannotation\x1a\xeb\x01\n\nAnnotation\x12\x16\n\x04path\x18\x01 \x03(\x05\x42\x02\x10\x01R\x04path\x12\x1f\n\x0bsource_file\x18\x02 \x01(\tR\nsourceFile\x12\x14\n\x05\x62\x65gin\x18\x03 \x01(\x05R\x05\x62\x65gin\x12\x10\n\x03\x65nd\x18\x04 \x01(\x05R\x03\x65nd\x12R\n\x08semantic\x18\x05 \x01(\x0e\x32\x36.google.protobuf.GeneratedCodeInfo.Annotation.SemanticR\x08semantic\"(\n\x08Semantic\x12\x08\n\x04NONE\x10\x00\x12\x07\n\x03SET\x10\x01\x12\t\n\x05\x41LIAS\x10\x02*\xbe\x02\n\x07\x45\x64ition\x12\x13\n\x0f\x45\x44ITION_UNKNOWN\x10\x00\x12\x13\n\x0e\x45\x44ITION_LEGACY\x10\x84\x07\x12\x13\n\x0e\x45\x44ITION_PROTO2\x10\xe6\x07\x12\x13\n\x0e\x45\x44ITION_PROTO3\x10\xe7\x07\x12\x11\n\x0c\x45\x44ITION_2023\x10\xe8\x07\x12\x11\n\x0c\x45\x44ITION_2024\x10\xe9\x07\x12\x15\n\x10\x45\x44ITION_UNSTABLE\x10\x8fN\x12\x17\n\x13\x45\x44ITION_1_TEST_ONLY\x10\x01\x12\x17\n\x13\x45\x44ITION_2_TEST_ONLY\x10\x02\x12\x1d\n\x17\x45\x44ITION_99997_TEST_ONLY\x10\x9d\x8d\x06\x12\x1d\n\x17\x45\x44ITION_99998_TEST_ONLY\x10\x9e\x8d\x06\x12\x1d\n\x17\x45\x44ITION_99999_TEST_ONLY\x10\x9f\x8d\x06\x12\x13\n\x0b\x45\x44ITION_MAX\x10\xff\xff\xff\xff\x07*U\n\x10SymbolVisibility\x12\x14\n\x10VISIBILITY_UNSET\x10\x00\x12\x14\n\x10VISIBILITY_LOCAL\x10\x01\x12\x15\n\x11VISIBILITY_EXPORT\x10\x02\x42~\n\x13\x63om.google.protobufB\x10\x44\x65scriptorProtosH\x01Z-google.golang.org/protobuf/types/descriptorpb\xf8\x01\x01\xa2\x02\x03GPB\xaa\x02\x1aGoogle.Protobuf.Reflection'   ) else:-  DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n google/protobuf/descriptor.proto\x12\x0fgoogle.protobuf\"[\n\x11\x46ileDescriptorSet\x12\x38\n\x04\x66ile\x18\x01 \x03(\x0b\x32$.google.protobuf.FileDescriptorProtoR\x04\x66ile*\x0c\x08\x80\xec\xca\xff\x01\x10\x81\xec\xca\xff\x01\"\xc5\x05\n\x13\x46ileDescriptorProto\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12\x18\n\x07package\x18\x02 \x01(\tR\x07package\x12\x1e\n\ndependency\x18\x03 \x03(\tR\ndependency\x12+\n\x11public_dependency\x18\n \x03(\x05R\x10publicDependency\x12\'\n\x0fweak_dependency\x18\x0b \x03(\x05R\x0eweakDependency\x12+\n\x11option_dependency\x18\x0f \x03(\tR\x10optionDependency\x12\x43\n\x0cmessage_type\x18\x04 \x03(\x0b\x32 .google.protobuf.DescriptorProtoR\x0bmessageType\x12\x41\n\tenum_type\x18\x05 \x03(\x0b\x32$.google.protobuf.EnumDescriptorProtoR\x08\x65numType\x12\x41\n\x07service\x18\x06 \x03(\x0b\x32\'.google.protobuf.ServiceDescriptorProtoR\x07service\x12\x43\n\textension\x18\x07 \x03(\x0b\x32%.google.protobuf.FieldDescriptorProtoR\textension\x12\x36\n\x07options\x18\x08 \x01(\x0b\x32\x1c.google.protobuf.FileOptionsR\x07options\x12I\n\x10source_code_info\x18\t \x01(\x0b\x32\x1f.google.protobuf.SourceCodeInfoR\x0esourceCodeInfo\x12\x16\n\x06syntax\x18\x0c \x01(\tR\x06syntax\x12\x32\n\x07\x65\x64ition\x18\x0e \x01(\x0e\x32\x18.google.protobuf.EditionR\x07\x65\x64ition\"\xfc\x06\n\x0f\x44\x65scriptorProto\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12;\n\x05\x66ield\x18\x02 \x03(\x0b\x32%.google.protobuf.FieldDescriptorProtoR\x05\x66ield\x12\x43\n\textension\x18\x06 \x03(\x0b\x32%.google.protobuf.FieldDescriptorProtoR\textension\x12\x41\n\x0bnested_type\x18\x03 \x03(\x0b\x32 .google.protobuf.DescriptorProtoR\nnestedType\x12\x41\n\tenum_type\x18\x04 \x03(\x0b\x32$.google.protobuf.EnumDescriptorProtoR\x08\x65numType\x12X\n\x0f\x65xtension_range\x18\x05 \x03(\x0b\x32/.google.protobuf.DescriptorProto.ExtensionRangeR\x0e\x65xtensionRange\x12\x44\n\noneof_decl\x18\x08 \x03(\x0b\x32%.google.protobuf.OneofDescriptorProtoR\toneofDecl\x12\x39\n\x07options\x18\x07 \x01(\x0b\x32\x1f.google.protobuf.MessageOptionsR\x07options\x12U\n\x0ereserved_range\x18\t \x03(\x0b\x32..google.protobuf.DescriptorProto.ReservedRangeR\rreservedRange\x12#\n\rreserved_name\x18\n \x03(\tR\x0creservedName\x12\x41\n\nvisibility\x18\x0b \x01(\x0e\x32!.google.protobuf.SymbolVisibilityR\nvisibility\x1az\n\x0e\x45xtensionRange\x12\x14\n\x05start\x18\x01 \x01(\x05R\x05start\x12\x10\n\x03\x65nd\x18\x02 \x01(\x05R\x03\x65nd\x12@\n\x07options\x18\x03 \x01(\x0b\x32&.google.protobuf.ExtensionRangeOptionsR\x07options\x1a\x37\n\rReservedRange\x12\x14\n\x05start\x18\x01 \x01(\x05R\x05start\x12\x10\n\x03\x65nd\x18\x02 \x01(\x05R\x03\x65nd\"\xd4\x04\n\x15\x45xtensionRangeOptions\x12X\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32$.google.protobuf.UninterpretedOptionR\x13uninterpretedOption\x12Y\n\x0b\x64\x65\x63laration\x18\x02 \x03(\x0b\x32\x32.google.protobuf.ExtensionRangeOptions.DeclarationB\x03\x88\x01\x02R\x0b\x64\x65\x63laration\x12\x37\n\x08\x66\x65\x61tures\x18\x32 \x01(\x0b\x32\x1b.google.protobuf.FeatureSetR\x08\x66\x65\x61tures\x12m\n\x0cverification\x18\x03 \x01(\x0e\x32\x38.google.protobuf.ExtensionRangeOptions.VerificationState:\nUNVERIFIEDB\x03\x88\x01\x02R\x0cverification\x1a\x94\x01\n\x0b\x44\x65\x63laration\x12\x16\n\x06number\x18\x01 \x01(\x05R\x06number\x12\x1b\n\tfull_name\x18\x02 \x01(\tR\x08\x66ullName\x12\x12\n\x04type\x18\x03 \x01(\tR\x04type\x12\x1a\n\x08reserved\x18\x05 \x01(\x08R\x08reserved\x12\x1a\n\x08repeated\x18\x06 \x01(\x08R\x08repeatedJ\x04\x08\x04\x10\x05\"4\n\x11VerificationState\x12\x0f\n\x0b\x44\x45\x43LARATION\x10\x00\x12\x0e\n\nUNVERIFIED\x10\x01*\x06\x08\xde\x07\x10\xe7\x07*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02\"\xc1\x06\n\x14\x46ieldDescriptorProto\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12\x16\n\x06number\x18\x03 \x01(\x05R\x06number\x12\x41\n\x05label\x18\x04 \x01(\x0e\x32+.google.protobuf.FieldDescriptorProto.LabelR\x05label\x12>\n\x04type\x18\x05 \x01(\x0e\x32*.google.protobuf.FieldDescriptorProto.TypeR\x04type\x12\x1b\n\ttype_name\x18\x06 \x01(\tR\x08typeName\x12\x1a\n\x08\x65xtendee\x18\x02 \x01(\tR\x08\x65xtendee\x12#\n\rdefault_value\x18\x07 \x01(\tR\x0c\x64\x65\x66\x61ultValue\x12\x1f\n\x0boneof_index\x18\t \x01(\x05R\noneofIndex\x12\x1b\n\tjson_name\x18\n \x01(\tR\x08jsonName\x12\x37\n\x07options\x18\x08 \x01(\x0b\x32\x1d.google.protobuf.FieldOptionsR\x07options\x12\'\n\x0fproto3_optional\x18\x11 \x01(\x08R\x0eproto3Optional\"\xb6\x02\n\x04Type\x12\x0f\n\x0bTYPE_DOUBLE\x10\x01\x12\x0e\n\nTYPE_FLOAT\x10\x02\x12\x0e\n\nTYPE_INT64\x10\x03\x12\x0f\n\x0bTYPE_UINT64\x10\x04\x12\x0e\n\nTYPE_INT32\x10\x05\x12\x10\n\x0cTYPE_FIXED64\x10\x06\x12\x10\n\x0cTYPE_FIXED32\x10\x07\x12\r\n\tTYPE_BOOL\x10\x08\x12\x0f\n\x0bTYPE_STRING\x10\t\x12\x0e\n\nTYPE_GROUP\x10\n\x12\x10\n\x0cTYPE_MESSAGE\x10\x0b\x12\x0e\n\nTYPE_BYTES\x10\x0c\x12\x0f\n\x0bTYPE_UINT32\x10\r\x12\r\n\tTYPE_ENUM\x10\x0e\x12\x11\n\rTYPE_SFIXED32\x10\x0f\x12\x11\n\rTYPE_SFIXED64\x10\x10\x12\x0f\n\x0bTYPE_SINT32\x10\x11\x12\x0f\n\x0bTYPE_SINT64\x10\x12\"C\n\x05Label\x12\x12\n\x0eLABEL_OPTIONAL\x10\x01\x12\x12\n\x0eLABEL_REPEATED\x10\x03\x12\x12\n\x0eLABEL_REQUIRED\x10\x02\"c\n\x14OneofDescriptorProto\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12\x37\n\x07options\x18\x02 \x01(\x0b\x32\x1d.google.protobuf.OneofOptionsR\x07options\"\xa6\x03\n\x13\x45numDescriptorProto\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12?\n\x05value\x18\x02 \x03(\x0b\x32).google.protobuf.EnumValueDescriptorProtoR\x05value\x12\x36\n\x07options\x18\x03 \x01(\x0b\x32\x1c.google.protobuf.EnumOptionsR\x07options\x12]\n\x0ereserved_range\x18\x04 \x03(\x0b\x32\x36.google.protobuf.EnumDescriptorProto.EnumReservedRangeR\rreservedRange\x12#\n\rreserved_name\x18\x05 \x03(\tR\x0creservedName\x12\x41\n\nvisibility\x18\x06 \x01(\x0e\x32!.google.protobuf.SymbolVisibilityR\nvisibility\x1a;\n\x11\x45numReservedRange\x12\x14\n\x05start\x18\x01 \x01(\x05R\x05start\x12\x10\n\x03\x65nd\x18\x02 \x01(\x05R\x03\x65nd\"\x83\x01\n\x18\x45numValueDescriptorProto\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12\x16\n\x06number\x18\x02 \x01(\x05R\x06number\x12;\n\x07options\x18\x03 \x01(\x0b\x32!.google.protobuf.EnumValueOptionsR\x07options\"\xb5\x01\n\x16ServiceDescriptorProto\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12>\n\x06method\x18\x02 \x03(\x0b\x32&.google.protobuf.MethodDescriptorProtoR\x06method\x12\x39\n\x07options\x18\x03 \x01(\x0b\x32\x1f.google.protobuf.ServiceOptionsR\x07optionsJ\x04\x08\x04\x10\x05R\x06stream\"\x89\x02\n\x15MethodDescriptorProto\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12\x1d\n\ninput_type\x18\x02 \x01(\tR\tinputType\x12\x1f\n\x0boutput_type\x18\x03 \x01(\tR\noutputType\x12\x38\n\x07options\x18\x04 \x01(\x0b\x32\x1e.google.protobuf.MethodOptionsR\x07options\x12\x30\n\x10\x63lient_streaming\x18\x05 \x01(\x08:\x05\x66\x61lseR\x0f\x63lientStreaming\x12\x30\n\x10server_streaming\x18\x06 \x01(\x08:\x05\x66\x61lseR\x0fserverStreaming\"\xfa\n\n\x0b\x46ileOptions\x12!\n\x0cjava_package\x18\x01 \x01(\tR\x0bjavaPackage\x12\x30\n\x14java_outer_classname\x18\x08 \x01(\tR\x12javaOuterClassname\x12\xf9\x01\n\x13java_multiple_files\x18\n \x01(\x08:\x05\x66\x61lseB\xc1\x01\xb2\x01\xbd\x01\x08\xe6\x07 \xe9\x07*\xb4\x01This behavior is enabled by default in editions 2024 and above. To disable it, you can set `features.(pb.java).nest_in_file_class = YES` on individual messages, enums, or services.R\x11javaMultipleFiles\x12\x44\n\x1djava_generate_equals_and_hash\x18\x14 \x01(\x08\x42\x02\x18\x01R\x19javaGenerateEqualsAndHash\x12:\n\x16java_string_check_utf8\x18\x1b \x01(\x08:\x05\x66\x61lseR\x13javaStringCheckUtf8\x12S\n\x0coptimize_for\x18\t \x01(\x0e\x32).google.protobuf.FileOptions.OptimizeMode:\x05SPEEDR\x0boptimizeFor\x12\x1d\n\ngo_package\x18\x0b \x01(\tR\tgoPackage\x12\x35\n\x13\x63\x63_generic_services\x18\x10 \x01(\x08:\x05\x66\x61lseR\x11\x63\x63GenericServices\x12\x39\n\x15java_generic_services\x18\x11 \x01(\x08:\x05\x66\x61lseR\x13javaGenericServices\x12\x35\n\x13py_generic_services\x18\x12 \x01(\x08:\x05\x66\x61lseR\x11pyGenericServices\x12%\n\ndeprecated\x18\x17 \x01(\x08:\x05\x66\x61lseR\ndeprecated\x12.\n\x10\x63\x63_enable_arenas\x18\x1f \x01(\x08:\x04trueR\x0e\x63\x63\x45nableArenas\x12*\n\x11objc_class_prefix\x18$ \x01(\tR\x0fobjcClassPrefix\x12)\n\x10\x63sharp_namespace\x18% \x01(\tR\x0f\x63sharpNamespace\x12!\n\x0cswift_prefix\x18\' \x01(\tR\x0bswiftPrefix\x12(\n\x10php_class_prefix\x18( \x01(\tR\x0ephpClassPrefix\x12#\n\rphp_namespace\x18) \x01(\tR\x0cphpNamespace\x12\x34\n\x16php_metadata_namespace\x18, \x01(\tR\x14phpMetadataNamespace\x12!\n\x0cruby_package\x18- \x01(\tR\x0brubyPackage\x12\x37\n\x08\x66\x65\x61tures\x18\x32 \x01(\x0b\x32\x1b.google.protobuf.FeatureSetR\x08\x66\x65\x61tures\x12X\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32$.google.protobuf.UninterpretedOptionR\x13uninterpretedOption\":\n\x0cOptimizeMode\x12\t\n\x05SPEED\x10\x01\x12\r\n\tCODE_SIZE\x10\x02\x12\x10\n\x0cLITE_RUNTIME\x10\x03*\x06\x08\xde\x07\x10\xe7\x07*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02J\x04\x08*\x10+J\x04\x08&\x10\'R\x14php_generic_services\"\xfc\x03\n\x0eMessageOptions\x12<\n\x17message_set_wire_format\x18\x01 \x01(\x08:\x05\x66\x61lseR\x14messageSetWireFormat\x12L\n\x1fno_standard_descriptor_accessor\x18\x02 \x01(\x08:\x05\x66\x61lseR\x1cnoStandardDescriptorAccessor\x12%\n\ndeprecated\x18\x03 \x01(\x08:\x05\x66\x61lseR\ndeprecated\x12\x1b\n\tmap_entry\x18\x07 \x01(\x08R\x08mapEntry\x12V\n&deprecated_legacy_json_field_conflicts\x18\x0b \x01(\x08\x42\x02\x18\x01R\"deprecatedLegacyJsonFieldConflicts\x12\x37\n\x08\x66\x65\x61tures\x18\x0c \x01(\x0b\x32\x1b.google.protobuf.FeatureSetR\x08\x66\x65\x61tures\x12X\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32$.google.protobuf.UninterpretedOptionR\x13uninterpretedOption*\x06\x08\xde\x07\x10\xe7\x07*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02J\x04\x08\x04\x10\x05J\x04\x08\x05\x10\x06J\x04\x08\x06\x10\x07J\x04\x08\x08\x10\tJ\x04\x08\t\x10\n\"\xce\r\n\x0c\x46ieldOptions\x12\x41\n\x05\x63type\x18\x01 \x01(\x0e\x32#.google.protobuf.FieldOptions.CType:\x06STRINGR\x05\x63type\x12\x16\n\x06packed\x18\x02 \x01(\x08R\x06packed\x12G\n\x06jstype\x18\x06 \x01(\x0e\x32$.google.protobuf.FieldOptions.JSType:\tJS_NORMALR\x06jstype\x12\x19\n\x04lazy\x18\x05 \x01(\x08:\x05\x66\x61lseR\x04lazy\x12.\n\x0funverified_lazy\x18\x0f \x01(\x08:\x05\x66\x61lseR\x0eunverifiedLazy\x12%\n\ndeprecated\x18\x03 \x01(\x08:\x05\x66\x61lseR\ndeprecated\x12\x1d\n\x04weak\x18\n \x01(\x08:\x05\x66\x61lseB\x02\x18\x01R\x04weak\x12(\n\x0c\x64\x65\x62ug_redact\x18\x10 \x01(\x08:\x05\x66\x61lseR\x0b\x64\x65\x62ugRedact\x12K\n\tretention\x18\x11 \x01(\x0e\x32-.google.protobuf.FieldOptions.OptionRetentionR\tretention\x12H\n\x07targets\x18\x13 \x03(\x0e\x32..google.protobuf.FieldOptions.OptionTargetTypeR\x07targets\x12W\n\x10\x65\x64ition_defaults\x18\x14 \x03(\x0b\x32,.google.protobuf.FieldOptions.EditionDefaultR\x0f\x65\x64itionDefaults\x12\x37\n\x08\x66\x65\x61tures\x18\x15 \x01(\x0b\x32\x1b.google.protobuf.FeatureSetR\x08\x66\x65\x61tures\x12U\n\x0f\x66\x65\x61ture_support\x18\x16 \x01(\x0b\x32,.google.protobuf.FieldOptions.FeatureSupportR\x0e\x66\x65\x61tureSupport\x12X\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32$.google.protobuf.UninterpretedOptionR\x13uninterpretedOption\x1aZ\n\x0e\x45\x64itionDefault\x12\x32\n\x07\x65\x64ition\x18\x03 \x01(\x0e\x32\x18.google.protobuf.EditionR\x07\x65\x64ition\x12\x14\n\x05value\x18\x02 \x01(\tR\x05value\x1a\xbb\x02\n\x0e\x46\x65\x61tureSupport\x12G\n\x12\x65\x64ition_introduced\x18\x01 \x01(\x0e\x32\x18.google.protobuf.EditionR\x11\x65\x64itionIntroduced\x12G\n\x12\x65\x64ition_deprecated\x18\x02 \x01(\x0e\x32\x18.google.protobuf.EditionR\x11\x65\x64itionDeprecated\x12/\n\x13\x64\x65precation_warning\x18\x03 \x01(\tR\x12\x64\x65precationWarning\x12\x41\n\x0f\x65\x64ition_removed\x18\x04 \x01(\x0e\x32\x18.google.protobuf.EditionR\x0e\x65\x64itionRemoved\x12#\n\rremoval_error\x18\x05 \x01(\tR\x0cremovalError\"/\n\x05\x43Type\x12\n\n\x06STRING\x10\x00\x12\x08\n\x04\x43ORD\x10\x01\x12\x10\n\x0cSTRING_PIECE\x10\x02\"5\n\x06JSType\x12\r\n\tJS_NORMAL\x10\x00\x12\r\n\tJS_STRING\x10\x01\x12\r\n\tJS_NUMBER\x10\x02\"U\n\x0fOptionRetention\x12\x15\n\x11RETENTION_UNKNOWN\x10\x00\x12\x15\n\x11RETENTION_RUNTIME\x10\x01\x12\x14\n\x10RETENTION_SOURCE\x10\x02\"\x8c\x02\n\x10OptionTargetType\x12\x17\n\x13TARGET_TYPE_UNKNOWN\x10\x00\x12\x14\n\x10TARGET_TYPE_FILE\x10\x01\x12\x1f\n\x1bTARGET_TYPE_EXTENSION_RANGE\x10\x02\x12\x17\n\x13TARGET_TYPE_MESSAGE\x10\x03\x12\x15\n\x11TARGET_TYPE_FIELD\x10\x04\x12\x15\n\x11TARGET_TYPE_ONEOF\x10\x05\x12\x14\n\x10TARGET_TYPE_ENUM\x10\x06\x12\x1a\n\x16TARGET_TYPE_ENUM_ENTRY\x10\x07\x12\x17\n\x13TARGET_TYPE_SERVICE\x10\x08\x12\x16\n\x12TARGET_TYPE_METHOD\x10\t*\x06\x08\xde\x07\x10\xe7\x07*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02J\x04\x08\x04\x10\x05J\x04\x08\x12\x10\x13\"\xb4\x01\n\x0cOneofOptions\x12\x37\n\x08\x66\x65\x61tures\x18\x01 \x01(\x0b\x32\x1b.google.protobuf.FeatureSetR\x08\x66\x65\x61tures\x12X\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32$.google.protobuf.UninterpretedOptionR\x13uninterpretedOption*\x06\x08\xde\x07\x10\xe7\x07*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02\"\xd9\x02\n\x0b\x45numOptions\x12\x1f\n\x0b\x61llow_alias\x18\x02 \x01(\x08R\nallowAlias\x12%\n\ndeprecated\x18\x03 \x01(\x08:\x05\x66\x61lseR\ndeprecated\x12V\n&deprecated_legacy_json_field_conflicts\x18\x06 \x01(\x08\x42\x02\x18\x01R\"deprecatedLegacyJsonFieldConflicts\x12\x37\n\x08\x66\x65\x61tures\x18\x07 \x01(\x0b\x32\x1b.google.protobuf.FeatureSetR\x08\x66\x65\x61tures\x12X\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32$.google.protobuf.UninterpretedOptionR\x13uninterpretedOption*\x06\x08\xde\x07\x10\xe7\x07*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02J\x04\x08\x05\x10\x06\"\xe0\x02\n\x10\x45numValueOptions\x12%\n\ndeprecated\x18\x01 \x01(\x08:\x05\x66\x61lseR\ndeprecated\x12\x37\n\x08\x66\x65\x61tures\x18\x02 \x01(\x0b\x32\x1b.google.protobuf.FeatureSetR\x08\x66\x65\x61tures\x12(\n\x0c\x64\x65\x62ug_redact\x18\x03 \x01(\x08:\x05\x66\x61lseR\x0b\x64\x65\x62ugRedact\x12U\n\x0f\x66\x65\x61ture_support\x18\x04 \x01(\x0b\x32,.google.protobuf.FieldOptions.FeatureSupportR\x0e\x66\x65\x61tureSupport\x12X\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32$.google.protobuf.UninterpretedOptionR\x13uninterpretedOption*\x06\x08\xde\x07\x10\xe7\x07*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02\"\xdd\x01\n\x0eServiceOptions\x12\x37\n\x08\x66\x65\x61tures\x18\" \x01(\x0b\x32\x1b.google.protobuf.FeatureSetR\x08\x66\x65\x61tures\x12%\n\ndeprecated\x18! \x01(\x08:\x05\x66\x61lseR\ndeprecated\x12X\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32$.google.protobuf.UninterpretedOptionR\x13uninterpretedOption*\x06\x08\xde\x07\x10\xe7\x07*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02\"\xa1\x03\n\rMethodOptions\x12%\n\ndeprecated\x18! \x01(\x08:\x05\x66\x61lseR\ndeprecated\x12q\n\x11idempotency_level\x18\" \x01(\x0e\x32/.google.protobuf.MethodOptions.IdempotencyLevel:\x13IDEMPOTENCY_UNKNOWNR\x10idempotencyLevel\x12\x37\n\x08\x66\x65\x61tures\x18# \x01(\x0b\x32\x1b.google.protobuf.FeatureSetR\x08\x66\x65\x61tures\x12X\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32$.google.protobuf.UninterpretedOptionR\x13uninterpretedOption\"P\n\x10IdempotencyLevel\x12\x17\n\x13IDEMPOTENCY_UNKNOWN\x10\x00\x12\x13\n\x0fNO_SIDE_EFFECTS\x10\x01\x12\x0e\n\nIDEMPOTENT\x10\x02*\x06\x08\xde\x07\x10\xe7\x07*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02\"\x9a\x03\n\x13UninterpretedOption\x12\x41\n\x04name\x18\x02 \x03(\x0b\x32-.google.protobuf.UninterpretedOption.NamePartR\x04name\x12)\n\x10identifier_value\x18\x03 \x01(\tR\x0fidentifierValue\x12,\n\x12positive_int_value\x18\x04 \x01(\x04R\x10positiveIntValue\x12,\n\x12negative_int_value\x18\x05 \x01(\x03R\x10negativeIntValue\x12!\n\x0c\x64ouble_value\x18\x06 \x01(\x01R\x0b\x64oubleValue\x12!\n\x0cstring_value\x18\x07 \x01(\x0cR\x0bstringValue\x12\'\n\x0f\x61ggregate_value\x18\x08 \x01(\tR\x0e\x61ggregateValue\x1aJ\n\x08NamePart\x12\x1b\n\tname_part\x18\x01 \x02(\tR\x08namePart\x12!\n\x0cis_extension\x18\x02 \x02(\x08R\x0bisExtension\"\xae\x0f\n\nFeatureSet\x12\x91\x01\n\x0e\x66ield_presence\x18\x01 \x01(\x0e\x32).google.protobuf.FeatureSet.FieldPresenceB?\x88\x01\x01\x98\x01\x04\x98\x01\x01\xa2\x01\r\x12\x08\x45XPLICIT\x18\x84\x07\xa2\x01\r\x12\x08IMPLICIT\x18\xe7\x07\xa2\x01\r\x12\x08\x45XPLICIT\x18\xe8\x07\xb2\x01\x03\x08\xe8\x07R\rfieldPresence\x12l\n\tenum_type\x18\x02 \x01(\x0e\x32$.google.protobuf.FeatureSet.EnumTypeB)\x88\x01\x01\x98\x01\x06\x98\x01\x01\xa2\x01\x0b\x12\x06\x43LOSED\x18\x84\x07\xa2\x01\t\x12\x04OPEN\x18\xe7\x07\xb2\x01\x03\x08\xe8\x07R\x08\x65numType\x12\x98\x01\n\x17repeated_field_encoding\x18\x03 \x01(\x0e\x32\x31.google.protobuf.FeatureSet.RepeatedFieldEncodingB-\x88\x01\x01\x98\x01\x04\x98\x01\x01\xa2\x01\r\x12\x08\x45XPANDED\x18\x84\x07\xa2\x01\x0b\x12\x06PACKED\x18\xe7\x07\xb2\x01\x03\x08\xe8\x07R\x15repeatedFieldEncoding\x12~\n\x0futf8_validation\x18\x04 \x01(\x0e\x32*.google.protobuf.FeatureSet.Utf8ValidationB)\x88\x01\x01\x98\x01\x04\x98\x01\x01\xa2\x01\t\x12\x04NONE\x18\x84\x07\xa2\x01\x0b\x12\x06VERIFY\x18\xe7\x07\xb2\x01\x03\x08\xe8\x07R\x0eutf8Validation\x12~\n\x10message_encoding\x18\x05 \x01(\x0e\x32+.google.protobuf.FeatureSet.MessageEncodingB&\x88\x01\x01\x98\x01\x04\x98\x01\x01\xa2\x01\x14\x12\x0fLENGTH_PREFIXED\x18\x84\x07\xb2\x01\x03\x08\xe8\x07R\x0fmessageEncoding\x12\x82\x01\n\x0bjson_format\x18\x06 \x01(\x0e\x32&.google.protobuf.FeatureSet.JsonFormatB9\x88\x01\x01\x98\x01\x03\x98\x01\x06\x98\x01\x01\xa2\x01\x17\x12\x12LEGACY_BEST_EFFORT\x18\x84\x07\xa2\x01\n\x12\x05\x41LLOW\x18\xe7\x07\xb2\x01\x03\x08\xe8\x07R\njsonFormat\x12\xbc\x01\n\x14\x65nforce_naming_style\x18\x07 \x01(\x0e\x32..google.protobuf.FeatureSet.EnforceNamingStyleBZ\x88\x01\x02\x98\x01\x01\x98\x01\x02\x98\x01\x03\x98\x01\x04\x98\x01\x05\x98\x01\x06\x98\x01\x07\x98\x01\x08\x98\x01\t\xa2\x01\x11\x12\x0cSTYLE_LEGACY\x18\x84\x07\xa2\x01\x0e\x12\tSTYLE2024\x18\xe9\x07\xa2\x01\x0e\x12\tSTYLE2026\x18\x8fN\xb2\x01\x03\x08\xe9\x07R\x12\x65nforceNamingStyle\x12\xb9\x01\n\x19\x64\x65\x66\x61ult_symbol_visibility\x18\x08 \x01(\x0e\x32\x45.google.protobuf.FeatureSet.VisibilityFeature.DefaultSymbolVisibilityB6\x88\x01\x02\x98\x01\x01\xa2\x01\x0f\x12\nEXPORT_ALL\x18\x84\x07\xa2\x01\x15\x12\x10\x45XPORT_TOP_LEVEL\x18\xe9\x07\xb2\x01\x03\x08\xe9\x07R\x17\x64\x65\x66\x61ultSymbolVisibility\x1a\xa1\x01\n\x11VisibilityFeature\"\x81\x01\n\x17\x44\x65\x66\x61ultSymbolVisibility\x12%\n!DEFAULT_SYMBOL_VISIBILITY_UNKNOWN\x10\x00\x12\x0e\n\nEXPORT_ALL\x10\x01\x12\x14\n\x10\x45XPORT_TOP_LEVEL\x10\x02\x12\r\n\tLOCAL_ALL\x10\x03\x12\n\n\x06STRICT\x10\x04J\x08\x08\x01\x10\x80\x80\x80\x80\x02\"\\\n\rFieldPresence\x12\x1a\n\x16\x46IELD_PRESENCE_UNKNOWN\x10\x00\x12\x0c\n\x08\x45XPLICIT\x10\x01\x12\x0c\n\x08IMPLICIT\x10\x02\x12\x13\n\x0fLEGACY_REQUIRED\x10\x03\"7\n\x08\x45numType\x12\x15\n\x11\x45NUM_TYPE_UNKNOWN\x10\x00\x12\x08\n\x04OPEN\x10\x01\x12\n\n\x06\x43LOSED\x10\x02\"V\n\x15RepeatedFieldEncoding\x12#\n\x1fREPEATED_FIELD_ENCODING_UNKNOWN\x10\x00\x12\n\n\x06PACKED\x10\x01\x12\x0c\n\x08\x45XPANDED\x10\x02\"I\n\x0eUtf8Validation\x12\x1b\n\x17UTF8_VALIDATION_UNKNOWN\x10\x00\x12\n\n\x06VERIFY\x10\x02\x12\x08\n\x04NONE\x10\x03\"\x04\x08\x01\x10\x01\"S\n\x0fMessageEncoding\x12\x1c\n\x18MESSAGE_ENCODING_UNKNOWN\x10\x00\x12\x13\n\x0fLENGTH_PREFIXED\x10\x01\x12\r\n\tDELIMITED\x10\x02\"H\n\nJsonFormat\x12\x17\n\x13JSON_FORMAT_UNKNOWN\x10\x00\x12\t\n\x05\x41LLOW\x10\x01\x12\x16\n\x12LEGACY_BEST_EFFORT\x10\x02\"f\n\x12\x45nforceNamingStyle\x12 \n\x1c\x45NFORCE_NAMING_STYLE_UNKNOWN\x10\x00\x12\r\n\tSTYLE2024\x10\x01\x12\x10\n\x0cSTYLE_LEGACY\x10\x02\x12\r\n\tSTYLE2026\x10\x03*\x06\x08\xe8\x07\x10\x8bN*\x06\x08\x8bN\x10\x90N*\x06\x08\x90N\x10\x91NJ\x06\x08\xe7\x07\x10\xe8\x07\"\xef\x03\n\x12\x46\x65\x61tureSetDefaults\x12X\n\x08\x64\x65\x66\x61ults\x18\x01 \x03(\x0b\x32<.google.protobuf.FeatureSetDefaults.FeatureSetEditionDefaultR\x08\x64\x65\x66\x61ults\x12\x41\n\x0fminimum_edition\x18\x04 \x01(\x0e\x32\x18.google.protobuf.EditionR\x0eminimumEdition\x12\x41\n\x0fmaximum_edition\x18\x05 \x01(\x0e\x32\x18.google.protobuf.EditionR\x0emaximumEdition\x1a\xf8\x01\n\x18\x46\x65\x61tureSetEditionDefault\x12\x32\n\x07\x65\x64ition\x18\x03 \x01(\x0e\x32\x18.google.protobuf.EditionR\x07\x65\x64ition\x12N\n\x14overridable_features\x18\x04 \x01(\x0b\x32\x1b.google.protobuf.FeatureSetR\x13overridableFeatures\x12\x42\n\x0e\x66ixed_features\x18\x05 \x01(\x0b\x32\x1b.google.protobuf.FeatureSetR\rfixedFeaturesJ\x04\x08\x01\x10\x02J\x04\x08\x02\x10\x03R\x08\x66\x65\x61tures\"\xb5\x02\n\x0eSourceCodeInfo\x12\x44\n\x08location\x18\x01 \x03(\x0b\x32(.google.protobuf.SourceCodeInfo.LocationR\x08location\x1a\xce\x01\n\x08Location\x12\x16\n\x04path\x18\x01 \x03(\x05\x42\x02\x10\x01R\x04path\x12\x16\n\x04span\x18\x02 \x03(\x05\x42\x02\x10\x01R\x04span\x12)\n\x10leading_comments\x18\x03 \x01(\tR\x0fleadingComments\x12+\n\x11trailing_comments\x18\x04 \x01(\tR\x10trailingComments\x12:\n\x19leading_detached_comments\x18\x06 \x03(\tR\x17leadingDetachedComments*\x0c\x08\x80\xec\xca\xff\x01\x10\x81\xec\xca\xff\x01\"\xd0\x02\n\x11GeneratedCodeInfo\x12M\n\nannotation\x18\x01 \x03(\x0b\x32-.google.protobuf.GeneratedCodeInfo.AnnotationR\nannotation\x1a\xeb\x01\n\nAnnotation\x12\x16\n\x04path\x18\x01 \x03(\x05\x42\x02\x10\x01R\x04path\x12\x1f\n\x0bsource_file\x18\x02 \x01(\tR\nsourceFile\x12\x14\n\x05\x62\x65gin\x18\x03 \x01(\x05R\x05\x62\x65gin\x12\x10\n\x03\x65nd\x18\x04 \x01(\x05R\x03\x65nd\x12R\n\x08semantic\x18\x05 \x01(\x0e\x32\x36.google.protobuf.GeneratedCodeInfo.Annotation.SemanticR\x08semantic\"(\n\x08Semantic\x12\x08\n\x04NONE\x10\x00\x12\x07\n\x03SET\x10\x01\x12\t\n\x05\x41LIAS\x10\x02*\xd1\x02\n\x07\x45\x64ition\x12\x13\n\x0f\x45\x44ITION_UNKNOWN\x10\x00\x12\x13\n\x0e\x45\x44ITION_LEGACY\x10\x84\x07\x12\x13\n\x0e\x45\x44ITION_PROTO2\x10\xe6\x07\x12\x13\n\x0e\x45\x44ITION_PROTO3\x10\xe7\x07\x12\x11\n\x0c\x45\x44ITION_2023\x10\xe8\x07\x12\x11\n\x0c\x45\x44ITION_2024\x10\xe9\x07\x12\x11\n\x0c\x45\x44ITION_2026\x10\xea\x07\x12\x15\n\x10\x45\x44ITION_UNSTABLE\x10\x8fN\x12\x17\n\x13\x45\x44ITION_1_TEST_ONLY\x10\x01\x12\x17\n\x13\x45\x44ITION_2_TEST_ONLY\x10\x02\x12\x1d\n\x17\x45\x44ITION_99997_TEST_ONLY\x10\x9d\x8d\x06\x12\x1d\n\x17\x45\x44ITION_99998_TEST_ONLY\x10\x9e\x8d\x06\x12\x1d\n\x17\x45\x44ITION_99999_TEST_ONLY\x10\x9f\x8d\x06\x12\x13\n\x0b\x45\x44ITION_MAX\x10\xff\xff\xff\xff\x07*U\n\x10SymbolVisibility\x12\x14\n\x10VISIBILITY_UNSET\x10\x00\x12\x14\n\x10VISIBILITY_LOCAL\x10\x01\x12\x15\n\x11VISIBILITY_EXPORT\x10\x02\x42~\n\x13\x63om.google.protobufB\x10\x44\x65scriptorProtosH\x01Z-google.golang.org/protobuf/types/descriptorpb\xf8\x01\x01\xa2\x02\x03GPB\xaa\x02\x1aGoogle.Protobuf.Reflection')+  DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n google/protobuf/descriptor.proto\x12\x0fgoogle.protobuf\"[\n\x11\x46ileDescriptorSet\x12\x38\n\x04\x66ile\x18\x01 \x03(\x0b\x32$.google.protobuf.FileDescriptorProtoR\x04\x66ile*\x0c\x08\x80\xec\xca\xff\x01\x10\x81\xec\xca\xff\x01\"\xc5\x05\n\x13\x46ileDescriptorProto\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12\x18\n\x07package\x18\x02 \x01(\tR\x07package\x12\x1e\n\ndependency\x18\x03 \x03(\tR\ndependency\x12+\n\x11public_dependency\x18\n \x03(\x05R\x10publicDependency\x12\'\n\x0fweak_dependency\x18\x0b \x03(\x05R\x0eweakDependency\x12+\n\x11option_dependency\x18\x0f \x03(\tR\x10optionDependency\x12\x43\n\x0cmessage_type\x18\x04 \x03(\x0b\x32 .google.protobuf.DescriptorProtoR\x0bmessageType\x12\x41\n\tenum_type\x18\x05 \x03(\x0b\x32$.google.protobuf.EnumDescriptorProtoR\x08\x65numType\x12\x41\n\x07service\x18\x06 \x03(\x0b\x32\'.google.protobuf.ServiceDescriptorProtoR\x07service\x12\x43\n\textension\x18\x07 \x03(\x0b\x32%.google.protobuf.FieldDescriptorProtoR\textension\x12\x36\n\x07options\x18\x08 \x01(\x0b\x32\x1c.google.protobuf.FileOptionsR\x07options\x12I\n\x10source_code_info\x18\t \x01(\x0b\x32\x1f.google.protobuf.SourceCodeInfoR\x0esourceCodeInfo\x12\x16\n\x06syntax\x18\x0c \x01(\tR\x06syntax\x12\x32\n\x07\x65\x64ition\x18\x0e \x01(\x0e\x32\x18.google.protobuf.EditionR\x07\x65\x64ition\"\xfc\x06\n\x0f\x44\x65scriptorProto\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12;\n\x05\x66ield\x18\x02 \x03(\x0b\x32%.google.protobuf.FieldDescriptorProtoR\x05\x66ield\x12\x43\n\textension\x18\x06 \x03(\x0b\x32%.google.protobuf.FieldDescriptorProtoR\textension\x12\x41\n\x0bnested_type\x18\x03 \x03(\x0b\x32 .google.protobuf.DescriptorProtoR\nnestedType\x12\x41\n\tenum_type\x18\x04 \x03(\x0b\x32$.google.protobuf.EnumDescriptorProtoR\x08\x65numType\x12X\n\x0f\x65xtension_range\x18\x05 \x03(\x0b\x32/.google.protobuf.DescriptorProto.ExtensionRangeR\x0e\x65xtensionRange\x12\x44\n\noneof_decl\x18\x08 \x03(\x0b\x32%.google.protobuf.OneofDescriptorProtoR\toneofDecl\x12\x39\n\x07options\x18\x07 \x01(\x0b\x32\x1f.google.protobuf.MessageOptionsR\x07options\x12U\n\x0ereserved_range\x18\t \x03(\x0b\x32..google.protobuf.DescriptorProto.ReservedRangeR\rreservedRange\x12#\n\rreserved_name\x18\n \x03(\tR\x0creservedName\x12\x41\n\nvisibility\x18\x0b \x01(\x0e\x32!.google.protobuf.SymbolVisibilityR\nvisibility\x1az\n\x0e\x45xtensionRange\x12\x14\n\x05start\x18\x01 \x01(\x05R\x05start\x12\x10\n\x03\x65nd\x18\x02 \x01(\x05R\x03\x65nd\x12@\n\x07options\x18\x03 \x01(\x0b\x32&.google.protobuf.ExtensionRangeOptionsR\x07options\x1a\x37\n\rReservedRange\x12\x14\n\x05start\x18\x01 \x01(\x05R\x05start\x12\x10\n\x03\x65nd\x18\x02 \x01(\x05R\x03\x65nd\"\xcc\x04\n\x15\x45xtensionRangeOptions\x12X\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32$.google.protobuf.UninterpretedOptionR\x13uninterpretedOption\x12Y\n\x0b\x64\x65\x63laration\x18\x02 \x03(\x0b\x32\x32.google.protobuf.ExtensionRangeOptions.DeclarationB\x03\x88\x01\x02R\x0b\x64\x65\x63laration\x12\x37\n\x08\x66\x65\x61tures\x18\x32 \x01(\x0b\x32\x1b.google.protobuf.FeatureSetR\x08\x66\x65\x61tures\x12m\n\x0cverification\x18\x03 \x01(\x0e\x32\x38.google.protobuf.ExtensionRangeOptions.VerificationState:\nUNVERIFIEDB\x03\x88\x01\x02R\x0cverification\x1a\x94\x01\n\x0b\x44\x65\x63laration\x12\x16\n\x06number\x18\x01 \x01(\x05R\x06number\x12\x1b\n\tfull_name\x18\x02 \x01(\tR\x08\x66ullName\x12\x12\n\x04type\x18\x03 \x01(\tR\x04type\x12\x1a\n\x08reserved\x18\x05 \x01(\x08R\x08reserved\x12\x1a\n\x08repeated\x18\x06 \x01(\x08R\x08repeatedJ\x04\x08\x04\x10\x05\"4\n\x11VerificationState\x12\x0f\n\x0b\x44\x45\x43LARATION\x10\x00\x12\x0e\n\nUNVERIFIED\x10\x01*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02\"\xc1\x06\n\x14\x46ieldDescriptorProto\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12\x16\n\x06number\x18\x03 \x01(\x05R\x06number\x12\x41\n\x05label\x18\x04 \x01(\x0e\x32+.google.protobuf.FieldDescriptorProto.LabelR\x05label\x12>\n\x04type\x18\x05 \x01(\x0e\x32*.google.protobuf.FieldDescriptorProto.TypeR\x04type\x12\x1b\n\ttype_name\x18\x06 \x01(\tR\x08typeName\x12\x1a\n\x08\x65xtendee\x18\x02 \x01(\tR\x08\x65xtendee\x12#\n\rdefault_value\x18\x07 \x01(\tR\x0c\x64\x65\x66\x61ultValue\x12\x1f\n\x0boneof_index\x18\t \x01(\x05R\noneofIndex\x12\x1b\n\tjson_name\x18\n \x01(\tR\x08jsonName\x12\x37\n\x07options\x18\x08 \x01(\x0b\x32\x1d.google.protobuf.FieldOptionsR\x07options\x12\'\n\x0fproto3_optional\x18\x11 \x01(\x08R\x0eproto3Optional\"\xb6\x02\n\x04Type\x12\x0f\n\x0bTYPE_DOUBLE\x10\x01\x12\x0e\n\nTYPE_FLOAT\x10\x02\x12\x0e\n\nTYPE_INT64\x10\x03\x12\x0f\n\x0bTYPE_UINT64\x10\x04\x12\x0e\n\nTYPE_INT32\x10\x05\x12\x10\n\x0cTYPE_FIXED64\x10\x06\x12\x10\n\x0cTYPE_FIXED32\x10\x07\x12\r\n\tTYPE_BOOL\x10\x08\x12\x0f\n\x0bTYPE_STRING\x10\t\x12\x0e\n\nTYPE_GROUP\x10\n\x12\x10\n\x0cTYPE_MESSAGE\x10\x0b\x12\x0e\n\nTYPE_BYTES\x10\x0c\x12\x0f\n\x0bTYPE_UINT32\x10\r\x12\r\n\tTYPE_ENUM\x10\x0e\x12\x11\n\rTYPE_SFIXED32\x10\x0f\x12\x11\n\rTYPE_SFIXED64\x10\x10\x12\x0f\n\x0bTYPE_SINT32\x10\x11\x12\x0f\n\x0bTYPE_SINT64\x10\x12\"C\n\x05Label\x12\x12\n\x0eLABEL_OPTIONAL\x10\x01\x12\x12\n\x0eLABEL_REPEATED\x10\x03\x12\x12\n\x0eLABEL_REQUIRED\x10\x02\"c\n\x14OneofDescriptorProto\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12\x37\n\x07options\x18\x02 \x01(\x0b\x32\x1d.google.protobuf.OneofOptionsR\x07options\"\xa6\x03\n\x13\x45numDescriptorProto\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12?\n\x05value\x18\x02 \x03(\x0b\x32).google.protobuf.EnumValueDescriptorProtoR\x05value\x12\x36\n\x07options\x18\x03 \x01(\x0b\x32\x1c.google.protobuf.EnumOptionsR\x07options\x12]\n\x0ereserved_range\x18\x04 \x03(\x0b\x32\x36.google.protobuf.EnumDescriptorProto.EnumReservedRangeR\rreservedRange\x12#\n\rreserved_name\x18\x05 \x03(\tR\x0creservedName\x12\x41\n\nvisibility\x18\x06 \x01(\x0e\x32!.google.protobuf.SymbolVisibilityR\nvisibility\x1a;\n\x11\x45numReservedRange\x12\x14\n\x05start\x18\x01 \x01(\x05R\x05start\x12\x10\n\x03\x65nd\x18\x02 \x01(\x05R\x03\x65nd\"\x83\x01\n\x18\x45numValueDescriptorProto\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12\x16\n\x06number\x18\x02 \x01(\x05R\x06number\x12;\n\x07options\x18\x03 \x01(\x0b\x32!.google.protobuf.EnumValueOptionsR\x07options\"\xb5\x01\n\x16ServiceDescriptorProto\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12>\n\x06method\x18\x02 \x03(\x0b\x32&.google.protobuf.MethodDescriptorProtoR\x06method\x12\x39\n\x07options\x18\x03 \x01(\x0b\x32\x1f.google.protobuf.ServiceOptionsR\x07optionsJ\x04\x08\x04\x10\x05R\x06stream\"\x89\x02\n\x15MethodDescriptorProto\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12\x1d\n\ninput_type\x18\x02 \x01(\tR\tinputType\x12\x1f\n\x0boutput_type\x18\x03 \x01(\tR\noutputType\x12\x38\n\x07options\x18\x04 \x01(\x0b\x32\x1e.google.protobuf.MethodOptionsR\x07options\x12\x30\n\x10\x63lient_streaming\x18\x05 \x01(\x08:\x05\x66\x61lseR\x0f\x63lientStreaming\x12\x30\n\x10server_streaming\x18\x06 \x01(\x08:\x05\x66\x61lseR\x0fserverStreaming\"\xf2\n\n\x0b\x46ileOptions\x12!\n\x0cjava_package\x18\x01 \x01(\tR\x0bjavaPackage\x12\x30\n\x14java_outer_classname\x18\x08 \x01(\tR\x12javaOuterClassname\x12\xf9\x01\n\x13java_multiple_files\x18\n \x01(\x08:\x05\x66\x61lseB\xc1\x01\xb2\x01\xbd\x01\x08\xe6\x07 \xe9\x07*\xb4\x01This behavior is enabled by default in editions 2024 and above. To disable it, you can set `features.(pb.java).nest_in_file_class = YES` on individual messages, enums, or services.R\x11javaMultipleFiles\x12\x44\n\x1djava_generate_equals_and_hash\x18\x14 \x01(\x08\x42\x02\x18\x01R\x19javaGenerateEqualsAndHash\x12:\n\x16java_string_check_utf8\x18\x1b \x01(\x08:\x05\x66\x61lseR\x13javaStringCheckUtf8\x12S\n\x0coptimize_for\x18\t \x01(\x0e\x32).google.protobuf.FileOptions.OptimizeMode:\x05SPEEDR\x0boptimizeFor\x12\x1d\n\ngo_package\x18\x0b \x01(\tR\tgoPackage\x12\x35\n\x13\x63\x63_generic_services\x18\x10 \x01(\x08:\x05\x66\x61lseR\x11\x63\x63GenericServices\x12\x39\n\x15java_generic_services\x18\x11 \x01(\x08:\x05\x66\x61lseR\x13javaGenericServices\x12\x35\n\x13py_generic_services\x18\x12 \x01(\x08:\x05\x66\x61lseR\x11pyGenericServices\x12%\n\ndeprecated\x18\x17 \x01(\x08:\x05\x66\x61lseR\ndeprecated\x12.\n\x10\x63\x63_enable_arenas\x18\x1f \x01(\x08:\x04trueR\x0e\x63\x63\x45nableArenas\x12*\n\x11objc_class_prefix\x18$ \x01(\tR\x0fobjcClassPrefix\x12)\n\x10\x63sharp_namespace\x18% \x01(\tR\x0f\x63sharpNamespace\x12!\n\x0cswift_prefix\x18\' \x01(\tR\x0bswiftPrefix\x12(\n\x10php_class_prefix\x18( \x01(\tR\x0ephpClassPrefix\x12#\n\rphp_namespace\x18) \x01(\tR\x0cphpNamespace\x12\x34\n\x16php_metadata_namespace\x18, \x01(\tR\x14phpMetadataNamespace\x12!\n\x0cruby_package\x18- \x01(\tR\x0brubyPackage\x12\x37\n\x08\x66\x65\x61tures\x18\x32 \x01(\x0b\x32\x1b.google.protobuf.FeatureSetR\x08\x66\x65\x61tures\x12X\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32$.google.protobuf.UninterpretedOptionR\x13uninterpretedOption\":\n\x0cOptimizeMode\x12\t\n\x05SPEED\x10\x01\x12\r\n\tCODE_SIZE\x10\x02\x12\x10\n\x0cLITE_RUNTIME\x10\x03*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02J\x04\x08*\x10+J\x04\x08&\x10\'R\x14php_generic_services\"\xf4\x03\n\x0eMessageOptions\x12<\n\x17message_set_wire_format\x18\x01 \x01(\x08:\x05\x66\x61lseR\x14messageSetWireFormat\x12L\n\x1fno_standard_descriptor_accessor\x18\x02 \x01(\x08:\x05\x66\x61lseR\x1cnoStandardDescriptorAccessor\x12%\n\ndeprecated\x18\x03 \x01(\x08:\x05\x66\x61lseR\ndeprecated\x12\x1b\n\tmap_entry\x18\x07 \x01(\x08R\x08mapEntry\x12V\n&deprecated_legacy_json_field_conflicts\x18\x0b \x01(\x08\x42\x02\x18\x01R\"deprecatedLegacyJsonFieldConflicts\x12\x37\n\x08\x66\x65\x61tures\x18\x0c \x01(\x0b\x32\x1b.google.protobuf.FeatureSetR\x08\x66\x65\x61tures\x12X\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32$.google.protobuf.UninterpretedOptionR\x13uninterpretedOption*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02J\x04\x08\x04\x10\x05J\x04\x08\x05\x10\x06J\x04\x08\x06\x10\x07J\x04\x08\x08\x10\tJ\x04\x08\t\x10\n\"\xc6\r\n\x0c\x46ieldOptions\x12\x41\n\x05\x63type\x18\x01 \x01(\x0e\x32#.google.protobuf.FieldOptions.CType:\x06STRINGR\x05\x63type\x12\x16\n\x06packed\x18\x02 \x01(\x08R\x06packed\x12G\n\x06jstype\x18\x06 \x01(\x0e\x32$.google.protobuf.FieldOptions.JSType:\tJS_NORMALR\x06jstype\x12\x19\n\x04lazy\x18\x05 \x01(\x08:\x05\x66\x61lseR\x04lazy\x12.\n\x0funverified_lazy\x18\x0f \x01(\x08:\x05\x66\x61lseR\x0eunverifiedLazy\x12%\n\ndeprecated\x18\x03 \x01(\x08:\x05\x66\x61lseR\ndeprecated\x12\x1d\n\x04weak\x18\n \x01(\x08:\x05\x66\x61lseB\x02\x18\x01R\x04weak\x12(\n\x0c\x64\x65\x62ug_redact\x18\x10 \x01(\x08:\x05\x66\x61lseR\x0b\x64\x65\x62ugRedact\x12K\n\tretention\x18\x11 \x01(\x0e\x32-.google.protobuf.FieldOptions.OptionRetentionR\tretention\x12H\n\x07targets\x18\x13 \x03(\x0e\x32..google.protobuf.FieldOptions.OptionTargetTypeR\x07targets\x12W\n\x10\x65\x64ition_defaults\x18\x14 \x03(\x0b\x32,.google.protobuf.FieldOptions.EditionDefaultR\x0f\x65\x64itionDefaults\x12\x37\n\x08\x66\x65\x61tures\x18\x15 \x01(\x0b\x32\x1b.google.protobuf.FeatureSetR\x08\x66\x65\x61tures\x12U\n\x0f\x66\x65\x61ture_support\x18\x16 \x01(\x0b\x32,.google.protobuf.FieldOptions.FeatureSupportR\x0e\x66\x65\x61tureSupport\x12X\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32$.google.protobuf.UninterpretedOptionR\x13uninterpretedOption\x1aZ\n\x0e\x45\x64itionDefault\x12\x32\n\x07\x65\x64ition\x18\x03 \x01(\x0e\x32\x18.google.protobuf.EditionR\x07\x65\x64ition\x12\x14\n\x05value\x18\x02 \x01(\tR\x05value\x1a\xbb\x02\n\x0e\x46\x65\x61tureSupport\x12G\n\x12\x65\x64ition_introduced\x18\x01 \x01(\x0e\x32\x18.google.protobuf.EditionR\x11\x65\x64itionIntroduced\x12G\n\x12\x65\x64ition_deprecated\x18\x02 \x01(\x0e\x32\x18.google.protobuf.EditionR\x11\x65\x64itionDeprecated\x12/\n\x13\x64\x65precation_warning\x18\x03 \x01(\tR\x12\x64\x65precationWarning\x12\x41\n\x0f\x65\x64ition_removed\x18\x04 \x01(\x0e\x32\x18.google.protobuf.EditionR\x0e\x65\x64itionRemoved\x12#\n\rremoval_error\x18\x05 \x01(\tR\x0cremovalError\"/\n\x05\x43Type\x12\n\n\x06STRING\x10\x00\x12\x08\n\x04\x43ORD\x10\x01\x12\x10\n\x0cSTRING_PIECE\x10\x02\"5\n\x06JSType\x12\r\n\tJS_NORMAL\x10\x00\x12\r\n\tJS_STRING\x10\x01\x12\r\n\tJS_NUMBER\x10\x02\"U\n\x0fOptionRetention\x12\x15\n\x11RETENTION_UNKNOWN\x10\x00\x12\x15\n\x11RETENTION_RUNTIME\x10\x01\x12\x14\n\x10RETENTION_SOURCE\x10\x02\"\x8c\x02\n\x10OptionTargetType\x12\x17\n\x13TARGET_TYPE_UNKNOWN\x10\x00\x12\x14\n\x10TARGET_TYPE_FILE\x10\x01\x12\x1f\n\x1bTARGET_TYPE_EXTENSION_RANGE\x10\x02\x12\x17\n\x13TARGET_TYPE_MESSAGE\x10\x03\x12\x15\n\x11TARGET_TYPE_FIELD\x10\x04\x12\x15\n\x11TARGET_TYPE_ONEOF\x10\x05\x12\x14\n\x10TARGET_TYPE_ENUM\x10\x06\x12\x1a\n\x16TARGET_TYPE_ENUM_ENTRY\x10\x07\x12\x17\n\x13TARGET_TYPE_SERVICE\x10\x08\x12\x16\n\x12TARGET_TYPE_METHOD\x10\t*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02J\x04\x08\x04\x10\x05J\x04\x08\x12\x10\x13\"\xac\x01\n\x0cOneofOptions\x12\x37\n\x08\x66\x65\x61tures\x18\x01 \x01(\x0b\x32\x1b.google.protobuf.FeatureSetR\x08\x66\x65\x61tures\x12X\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32$.google.protobuf.UninterpretedOptionR\x13uninterpretedOption*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02\"\xd1\x02\n\x0b\x45numOptions\x12\x1f\n\x0b\x61llow_alias\x18\x02 \x01(\x08R\nallowAlias\x12%\n\ndeprecated\x18\x03 \x01(\x08:\x05\x66\x61lseR\ndeprecated\x12V\n&deprecated_legacy_json_field_conflicts\x18\x06 \x01(\x08\x42\x02\x18\x01R\"deprecatedLegacyJsonFieldConflicts\x12\x37\n\x08\x66\x65\x61tures\x18\x07 \x01(\x0b\x32\x1b.google.protobuf.FeatureSetR\x08\x66\x65\x61tures\x12X\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32$.google.protobuf.UninterpretedOptionR\x13uninterpretedOption*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02J\x04\x08\x05\x10\x06\"\xd8\x02\n\x10\x45numValueOptions\x12%\n\ndeprecated\x18\x01 \x01(\x08:\x05\x66\x61lseR\ndeprecated\x12\x37\n\x08\x66\x65\x61tures\x18\x02 \x01(\x0b\x32\x1b.google.protobuf.FeatureSetR\x08\x66\x65\x61tures\x12(\n\x0c\x64\x65\x62ug_redact\x18\x03 \x01(\x08:\x05\x66\x61lseR\x0b\x64\x65\x62ugRedact\x12U\n\x0f\x66\x65\x61ture_support\x18\x04 \x01(\x0b\x32,.google.protobuf.FieldOptions.FeatureSupportR\x0e\x66\x65\x61tureSupport\x12X\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32$.google.protobuf.UninterpretedOptionR\x13uninterpretedOption*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02\"\xd5\x01\n\x0eServiceOptions\x12\x37\n\x08\x66\x65\x61tures\x18\" \x01(\x0b\x32\x1b.google.protobuf.FeatureSetR\x08\x66\x65\x61tures\x12%\n\ndeprecated\x18! \x01(\x08:\x05\x66\x61lseR\ndeprecated\x12X\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32$.google.protobuf.UninterpretedOptionR\x13uninterpretedOption*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02\"\x99\x03\n\rMethodOptions\x12%\n\ndeprecated\x18! \x01(\x08:\x05\x66\x61lseR\ndeprecated\x12q\n\x11idempotency_level\x18\" \x01(\x0e\x32/.google.protobuf.MethodOptions.IdempotencyLevel:\x13IDEMPOTENCY_UNKNOWNR\x10idempotencyLevel\x12\x37\n\x08\x66\x65\x61tures\x18# \x01(\x0b\x32\x1b.google.protobuf.FeatureSetR\x08\x66\x65\x61tures\x12X\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32$.google.protobuf.UninterpretedOptionR\x13uninterpretedOption\"P\n\x10IdempotencyLevel\x12\x17\n\x13IDEMPOTENCY_UNKNOWN\x10\x00\x12\x13\n\x0fNO_SIDE_EFFECTS\x10\x01\x12\x0e\n\nIDEMPOTENT\x10\x02*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02\"\x9a\x03\n\x13UninterpretedOption\x12\x41\n\x04name\x18\x02 \x03(\x0b\x32-.google.protobuf.UninterpretedOption.NamePartR\x04name\x12)\n\x10identifier_value\x18\x03 \x01(\tR\x0fidentifierValue\x12,\n\x12positive_int_value\x18\x04 \x01(\x04R\x10positiveIntValue\x12,\n\x12negative_int_value\x18\x05 \x01(\x03R\x10negativeIntValue\x12!\n\x0c\x64ouble_value\x18\x06 \x01(\x01R\x0b\x64oubleValue\x12!\n\x0cstring_value\x18\x07 \x01(\x0cR\x0bstringValue\x12\'\n\x0f\x61ggregate_value\x18\x08 \x01(\tR\x0e\x61ggregateValue\x1aJ\n\x08NamePart\x12\x1b\n\tname_part\x18\x01 \x02(\tR\x08namePart\x12!\n\x0cis_extension\x18\x02 \x02(\x08R\x0bisExtension\"\x8e\x0f\n\nFeatureSet\x12\x91\x01\n\x0e\x66ield_presence\x18\x01 \x01(\x0e\x32).google.protobuf.FeatureSet.FieldPresenceB?\x88\x01\x01\x98\x01\x04\x98\x01\x01\xa2\x01\r\x12\x08\x45XPLICIT\x18\x84\x07\xa2\x01\r\x12\x08IMPLICIT\x18\xe7\x07\xa2\x01\r\x12\x08\x45XPLICIT\x18\xe8\x07\xb2\x01\x03\x08\xe8\x07R\rfieldPresence\x12l\n\tenum_type\x18\x02 \x01(\x0e\x32$.google.protobuf.FeatureSet.EnumTypeB)\x88\x01\x01\x98\x01\x06\x98\x01\x01\xa2\x01\x0b\x12\x06\x43LOSED\x18\x84\x07\xa2\x01\t\x12\x04OPEN\x18\xe7\x07\xb2\x01\x03\x08\xe8\x07R\x08\x65numType\x12\x98\x01\n\x17repeated_field_encoding\x18\x03 \x01(\x0e\x32\x31.google.protobuf.FeatureSet.RepeatedFieldEncodingB-\x88\x01\x01\x98\x01\x04\x98\x01\x01\xa2\x01\r\x12\x08\x45XPANDED\x18\x84\x07\xa2\x01\x0b\x12\x06PACKED\x18\xe7\x07\xb2\x01\x03\x08\xe8\x07R\x15repeatedFieldEncoding\x12~\n\x0futf8_validation\x18\x04 \x01(\x0e\x32*.google.protobuf.FeatureSet.Utf8ValidationB)\x88\x01\x01\x98\x01\x04\x98\x01\x01\xa2\x01\t\x12\x04NONE\x18\x84\x07\xa2\x01\x0b\x12\x06VERIFY\x18\xe7\x07\xb2\x01\x03\x08\xe8\x07R\x0eutf8Validation\x12~\n\x10message_encoding\x18\x05 \x01(\x0e\x32+.google.protobuf.FeatureSet.MessageEncodingB&\x88\x01\x01\x98\x01\x04\x98\x01\x01\xa2\x01\x14\x12\x0fLENGTH_PREFIXED\x18\x84\x07\xb2\x01\x03\x08\xe8\x07R\x0fmessageEncoding\x12\x82\x01\n\x0bjson_format\x18\x06 \x01(\x0e\x32&.google.protobuf.FeatureSet.JsonFormatB9\x88\x01\x01\x98\x01\x03\x98\x01\x06\x98\x01\x01\xa2\x01\x17\x12\x12LEGACY_BEST_EFFORT\x18\x84\x07\xa2\x01\n\x12\x05\x41LLOW\x18\xe7\x07\xb2\x01\x03\x08\xe8\x07R\njsonFormat\x12\xab\x01\n\x14\x65nforce_naming_style\x18\x07 \x01(\x0e\x32..google.protobuf.FeatureSet.EnforceNamingStyleBI\x88\x01\x02\x98\x01\x01\x98\x01\x02\x98\x01\x03\x98\x01\x04\x98\x01\x05\x98\x01\x06\x98\x01\x07\x98\x01\x08\x98\x01\t\xa2\x01\x11\x12\x0cSTYLE_LEGACY\x18\x84\x07\xa2\x01\x0e\x12\tSTYLE2024\x18\xe9\x07\xb2\x01\x03\x08\xe9\x07R\x12\x65nforceNamingStyle\x12\xb9\x01\n\x19\x64\x65\x66\x61ult_symbol_visibility\x18\x08 \x01(\x0e\x32\x45.google.protobuf.FeatureSet.VisibilityFeature.DefaultSymbolVisibilityB6\x88\x01\x02\x98\x01\x01\xa2\x01\x0f\x12\nEXPORT_ALL\x18\x84\x07\xa2\x01\x15\x12\x10\x45XPORT_TOP_LEVEL\x18\xe9\x07\xb2\x01\x03\x08\xe9\x07R\x17\x64\x65\x66\x61ultSymbolVisibility\x1a\xa1\x01\n\x11VisibilityFeature\"\x81\x01\n\x17\x44\x65\x66\x61ultSymbolVisibility\x12%\n!DEFAULT_SYMBOL_VISIBILITY_UNKNOWN\x10\x00\x12\x0e\n\nEXPORT_ALL\x10\x01\x12\x14\n\x10\x45XPORT_TOP_LEVEL\x10\x02\x12\r\n\tLOCAL_ALL\x10\x03\x12\n\n\x06STRICT\x10\x04J\x08\x08\x01\x10\x80\x80\x80\x80\x02\"\\\n\rFieldPresence\x12\x1a\n\x16\x46IELD_PRESENCE_UNKNOWN\x10\x00\x12\x0c\n\x08\x45XPLICIT\x10\x01\x12\x0c\n\x08IMPLICIT\x10\x02\x12\x13\n\x0fLEGACY_REQUIRED\x10\x03\"7\n\x08\x45numType\x12\x15\n\x11\x45NUM_TYPE_UNKNOWN\x10\x00\x12\x08\n\x04OPEN\x10\x01\x12\n\n\x06\x43LOSED\x10\x02\"V\n\x15RepeatedFieldEncoding\x12#\n\x1fREPEATED_FIELD_ENCODING_UNKNOWN\x10\x00\x12\n\n\x06PACKED\x10\x01\x12\x0c\n\x08\x45XPANDED\x10\x02\"I\n\x0eUtf8Validation\x12\x1b\n\x17UTF8_VALIDATION_UNKNOWN\x10\x00\x12\n\n\x06VERIFY\x10\x02\x12\x08\n\x04NONE\x10\x03\"\x04\x08\x01\x10\x01\"S\n\x0fMessageEncoding\x12\x1c\n\x18MESSAGE_ENCODING_UNKNOWN\x10\x00\x12\x13\n\x0fLENGTH_PREFIXED\x10\x01\x12\r\n\tDELIMITED\x10\x02\"H\n\nJsonFormat\x12\x17\n\x13JSON_FORMAT_UNKNOWN\x10\x00\x12\t\n\x05\x41LLOW\x10\x01\x12\x16\n\x12LEGACY_BEST_EFFORT\x10\x02\"W\n\x12\x45nforceNamingStyle\x12 \n\x1c\x45NFORCE_NAMING_STYLE_UNKNOWN\x10\x00\x12\r\n\tSTYLE2024\x10\x01\x12\x10\n\x0cSTYLE_LEGACY\x10\x02*\x06\x08\xe8\x07\x10\x8bN*\x06\x08\x8bN\x10\x90N*\x06\x08\x90N\x10\x91NJ\x06\x08\xe7\x07\x10\xe8\x07\"\xef\x03\n\x12\x46\x65\x61tureSetDefaults\x12X\n\x08\x64\x65\x66\x61ults\x18\x01 \x03(\x0b\x32<.google.protobuf.FeatureSetDefaults.FeatureSetEditionDefaultR\x08\x64\x65\x66\x61ults\x12\x41\n\x0fminimum_edition\x18\x04 \x01(\x0e\x32\x18.google.protobuf.EditionR\x0eminimumEdition\x12\x41\n\x0fmaximum_edition\x18\x05 \x01(\x0e\x32\x18.google.protobuf.EditionR\x0emaximumEdition\x1a\xf8\x01\n\x18\x46\x65\x61tureSetEditionDefault\x12\x32\n\x07\x65\x64ition\x18\x03 \x01(\x0e\x32\x18.google.protobuf.EditionR\x07\x65\x64ition\x12N\n\x14overridable_features\x18\x04 \x01(\x0b\x32\x1b.google.protobuf.FeatureSetR\x13overridableFeatures\x12\x42\n\x0e\x66ixed_features\x18\x05 \x01(\x0b\x32\x1b.google.protobuf.FeatureSetR\rfixedFeaturesJ\x04\x08\x01\x10\x02J\x04\x08\x02\x10\x03R\x08\x66\x65\x61tures\"\xb5\x02\n\x0eSourceCodeInfo\x12\x44\n\x08location\x18\x01 \x03(\x0b\x32(.google.protobuf.SourceCodeInfo.LocationR\x08location\x1a\xce\x01\n\x08Location\x12\x16\n\x04path\x18\x01 \x03(\x05\x42\x02\x10\x01R\x04path\x12\x16\n\x04span\x18\x02 \x03(\x05\x42\x02\x10\x01R\x04span\x12)\n\x10leading_comments\x18\x03 \x01(\tR\x0fleadingComments\x12+\n\x11trailing_comments\x18\x04 \x01(\tR\x10trailingComments\x12:\n\x19leading_detached_comments\x18\x06 \x03(\tR\x17leadingDetachedComments*\x0c\x08\x80\xec\xca\xff\x01\x10\x81\xec\xca\xff\x01\"\xd0\x02\n\x11GeneratedCodeInfo\x12M\n\nannotation\x18\x01 \x03(\x0b\x32-.google.protobuf.GeneratedCodeInfo.AnnotationR\nannotation\x1a\xeb\x01\n\nAnnotation\x12\x16\n\x04path\x18\x01 \x03(\x05\x42\x02\x10\x01R\x04path\x12\x1f\n\x0bsource_file\x18\x02 \x01(\tR\nsourceFile\x12\x14\n\x05\x62\x65gin\x18\x03 \x01(\x05R\x05\x62\x65gin\x12\x10\n\x03\x65nd\x18\x04 \x01(\x05R\x03\x65nd\x12R\n\x08semantic\x18\x05 \x01(\x0e\x32\x36.google.protobuf.GeneratedCodeInfo.Annotation.SemanticR\x08semantic\"(\n\x08Semantic\x12\x08\n\x04NONE\x10\x00\x12\x07\n\x03SET\x10\x01\x12\t\n\x05\x41LIAS\x10\x02*\xbe\x02\n\x07\x45\x64ition\x12\x13\n\x0f\x45\x44ITION_UNKNOWN\x10\x00\x12\x13\n\x0e\x45\x44ITION_LEGACY\x10\x84\x07\x12\x13\n\x0e\x45\x44ITION_PROTO2\x10\xe6\x07\x12\x13\n\x0e\x45\x44ITION_PROTO3\x10\xe7\x07\x12\x11\n\x0c\x45\x44ITION_2023\x10\xe8\x07\x12\x11\n\x0c\x45\x44ITION_2024\x10\xe9\x07\x12\x15\n\x10\x45\x44ITION_UNSTABLE\x10\x8fN\x12\x17\n\x13\x45\x44ITION_1_TEST_ONLY\x10\x01\x12\x17\n\x13\x45\x44ITION_2_TEST_ONLY\x10\x02\x12\x1d\n\x17\x45\x44ITION_99997_TEST_ONLY\x10\x9d\x8d\x06\x12\x1d\n\x17\x45\x44ITION_99998_TEST_ONLY\x10\x9e\x8d\x06\x12\x1d\n\x17\x45\x44ITION_99999_TEST_ONLY\x10\x9f\x8d\x06\x12\x13\n\x0b\x45\x44ITION_MAX\x10\xff\xff\xff\xff\x07*U\n\x10SymbolVisibility\x12\x14\n\x10VISIBILITY_UNSET\x10\x00\x12\x14\n\x10VISIBILITY_LOCAL\x10\x01\x12\x15\n\x11VISIBILITY_EXPORT\x10\x02\x42~\n\x13\x63om.google.protobufB\x10\x44\x65scriptorProtosH\x01Z-google.golang.org/protobuf/types/descriptorpb\xf8\x01\x01\xa2\x02\x03GPB\xaa\x02\x1aGoogle.Protobuf.Reflection') @@ -79,38 +79,33 @@       _descriptor.EnumValueDescriptor(-        name='EDITION_2026', index=6, number=1002,-        serialized_options=None,-        type=None,-        create_key=_descriptor._internal_create_key),-      _descriptor.EnumValueDescriptor(-        name='EDITION_UNSTABLE', index=7, number=9999,-        serialized_options=None,-        type=None,-        create_key=_descriptor._internal_create_key),-      _descriptor.EnumValueDescriptor(-        name='EDITION_1_TEST_ONLY', index=8, number=1,-        serialized_options=None,-        type=None,-        create_key=_descriptor._internal_create_key),-      _descriptor.EnumValueDescriptor(-        name='EDITION_2_TEST_ONLY', index=9, number=2,-        serialized_options=None,-        type=None,-        create_key=_descriptor._internal_create_key),-      _descriptor.EnumValueDescriptor(-        name='EDITION_99997_TEST_ONLY', index=10, number=99997,-        serialized_options=None,-        type=None,-        create_key=_descriptor._internal_create_key),-      _descriptor.EnumValueDescriptor(-        name='EDITION_99998_TEST_ONLY', index=11, number=99998,-        serialized_options=None,-        type=None,-        create_key=_descriptor._internal_create_key),-      _descriptor.EnumValueDescriptor(-        name='EDITION_99999_TEST_ONLY', index=12, number=99999,-        serialized_options=None,-        type=None,-        create_key=_descriptor._internal_create_key),-      _descriptor.EnumValueDescriptor(-        name='EDITION_MAX', index=13, number=2147483647,+        name='EDITION_UNSTABLE', index=6, number=9999,+        serialized_options=None,+        type=None,+        create_key=_descriptor._internal_create_key),+      _descriptor.EnumValueDescriptor(+        name='EDITION_1_TEST_ONLY', index=7, number=1,+        serialized_options=None,+        type=None,+        create_key=_descriptor._internal_create_key),+      _descriptor.EnumValueDescriptor(+        name='EDITION_2_TEST_ONLY', index=8, number=2,+        serialized_options=None,+        type=None,+        create_key=_descriptor._internal_create_key),+      _descriptor.EnumValueDescriptor(+        name='EDITION_99997_TEST_ONLY', index=9, number=99997,+        serialized_options=None,+        type=None,+        create_key=_descriptor._internal_create_key),+      _descriptor.EnumValueDescriptor(+        name='EDITION_99998_TEST_ONLY', index=10, number=99998,+        serialized_options=None,+        type=None,+        create_key=_descriptor._internal_create_key),+      _descriptor.EnumValueDescriptor(+        name='EDITION_99999_TEST_ONLY', index=11, number=99999,+        serialized_options=None,+        type=None,+        create_key=_descriptor._internal_create_key),+      _descriptor.EnumValueDescriptor(+        name='EDITION_MAX', index=12, number=2147483647,         serialized_options=None,@@ -742,7 +737,2 @@         create_key=_descriptor._internal_create_key),-      _descriptor.EnumValueDescriptor(-        name='STYLE2026', index=3, number=3,-        serialized_options=None,-        type=None,-        create_key=_descriptor._internal_create_key),     ],@@ -1208,3 +1198,3 @@     is_extendable=True,-    extension_ranges=[(990, 999), (1000, 536870912), ],+    extension_ranges=[(1000, 536870912), ],     oneofs=[@@ -1764,3 +1754,3 @@     is_extendable=True,-    extension_ranges=[(990, 999), (1000, 536870912), ],+    extension_ranges=[(1000, 536870912), ],     oneofs=[@@ -1835,3 +1825,3 @@     is_extendable=True,-    extension_ranges=[(990, 999), (1000, 536870912), ],+    extension_ranges=[(1000, 536870912), ],     oneofs=[@@ -2050,3 +2040,3 @@     is_extendable=True,-    extension_ranges=[(990, 999), (1000, 536870912), ],+    extension_ranges=[(1000, 536870912), ],     oneofs=[@@ -2086,3 +2076,3 @@     is_extendable=True,-    extension_ranges=[(990, 999), (1000, 536870912), ],+    extension_ranges=[(1000, 536870912), ],     oneofs=[@@ -2143,3 +2133,3 @@     is_extendable=True,-    extension_ranges=[(990, 999), (1000, 536870912), ],+    extension_ranges=[(1000, 536870912), ],     oneofs=[@@ -2200,3 +2190,3 @@     is_extendable=True,-    extension_ranges=[(990, 999), (1000, 536870912), ],+    extension_ranges=[(1000, 536870912), ],     oneofs=[@@ -2243,3 +2233,3 @@     is_extendable=True,-    extension_ranges=[(990, 999), (1000, 536870912), ],+    extension_ranges=[(1000, 536870912), ],     oneofs=[@@ -2294,3 +2284,3 @@     is_extendable=True,-    extension_ranges=[(990, 999), (1000, 536870912), ],+    extension_ranges=[(1000, 536870912), ],     oneofs=[@@ -2484,3 +2474,3 @@         is_extension=False, extension_scope=None,-        serialized_options=b'\210\001\002\230\001\001\230\001\002\230\001\003\230\001\004\230\001\005\230\001\006\230\001\007\230\001\010\230\001\t\242\001\021\022\014STYLE_LEGACY\030\204\007\242\001\016\022\tSTYLE2024\030\351\007\242\001\016\022\tSTYLE2026\030\217N\262\001\003\010\351\007', json_name='enforceNamingStyle', file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),+        serialized_options=b'\210\001\002\230\001\001\230\001\002\230\001\003\230\001\004\230\001\005\230\001\006\230\001\007\230\001\010\230\001\t\242\001\021\022\014STYLE_LEGACY\030\204\007\242\001\016\022\tSTYLE2024\030\351\007\262\001\003\010\351\007', json_name='enforceNamingStyle', file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),       _descriptor.FieldDescriptor(@@ -3210,3 +3200,2 @@   _FEATURESET_ENFORCENAMINGSTYLE.values[2]._features = _ResolvedFeatures(field_presence=_FEATURESET_FIELDPRESENCE.values_by_name["EXPLICIT"].number,enum_type=_FEATURESET_ENUMTYPE.values_by_name["CLOSED"].number,repeated_field_encoding=_FEATURESET_REPEATEDFIELDENCODING.values_by_name["EXPANDED"].number,utf8_validation=_FEATURESET_UTF8VALIDATION.values_by_name["NONE"].number,message_encoding=_FEATURESET_MESSAGEENCODING.values_by_name["LENGTH_PREFIXED"].number,json_format=_FEATURESET_JSONFORMAT.values_by_name["LEGACY_BEST_EFFORT"].number)-  _FEATURESET_ENFORCENAMINGSTYLE.values[3]._features = _ResolvedFeatures(field_presence=_FEATURESET_FIELDPRESENCE.values_by_name["EXPLICIT"].number,enum_type=_FEATURESET_ENUMTYPE.values_by_name["CLOSED"].number,repeated_field_encoding=_FEATURESET_REPEATEDFIELDENCODING.values_by_name["EXPANDED"].number,utf8_validation=_FEATURESET_UTF8VALIDATION.values_by_name["NONE"].number,message_encoding=_FEATURESET_MESSAGEENCODING.values_by_name["LENGTH_PREFIXED"].number,json_format=_FEATURESET_JSONFORMAT.values_by_name["LEGACY_BEST_EFFORT"].number)   _FEATURESET_VISIBILITYFEATURE_DEFAULTSYMBOLVISIBILITY._features = _ResolvedFeatures(field_presence=_FEATURESET_FIELDPRESENCE.values_by_name["EXPLICIT"].number,enum_type=_FEATURESET_ENUMTYPE.values_by_name["CLOSED"].number,repeated_field_encoding=_FEATURESET_REPEATEDFIELDENCODING.values_by_name["EXPANDED"].number,utf8_validation=_FEATURESET_UTF8VALIDATION.values_by_name["NONE"].number,message_encoding=_FEATURESET_MESSAGEENCODING.values_by_name["LENGTH_PREFIXED"].number,json_format=_FEATURESET_JSONFORMAT.values_by_name["LEGACY_BEST_EFFORT"].number)@@ -3235,3 +3224,2 @@   _EDITION.values[12]._features = _ResolvedFeatures(field_presence=_FEATURESET_FIELDPRESENCE.values_by_name["EXPLICIT"].number,enum_type=_FEATURESET_ENUMTYPE.values_by_name["CLOSED"].number,repeated_field_encoding=_FEATURESET_REPEATEDFIELDENCODING.values_by_name["EXPANDED"].number,utf8_validation=_FEATURESET_UTF8VALIDATION.values_by_name["NONE"].number,message_encoding=_FEATURESET_MESSAGEENCODING.values_by_name["LENGTH_PREFIXED"].number,json_format=_FEATURESET_JSONFORMAT.values_by_name["LEGACY_BEST_EFFORT"].number)-  _EDITION.values[13]._features = _ResolvedFeatures(field_presence=_FEATURESET_FIELDPRESENCE.values_by_name["EXPLICIT"].number,enum_type=_FEATURESET_ENUMTYPE.values_by_name["CLOSED"].number,repeated_field_encoding=_FEATURESET_REPEATEDFIELDENCODING.values_by_name["EXPANDED"].number,utf8_validation=_FEATURESET_UTF8VALIDATION.values_by_name["NONE"].number,message_encoding=_FEATURESET_MESSAGEENCODING.values_by_name["LENGTH_PREFIXED"].number,json_format=_FEATURESET_JSONFORMAT.values_by_name["LEGACY_BEST_EFFORT"].number)   _SYMBOLVISIBILITY._features = _ResolvedFeatures(field_presence=_FEATURESET_FIELDPRESENCE.values_by_name["EXPLICIT"].number,enum_type=_FEATURESET_ENUMTYPE.values_by_name["CLOSED"].number,repeated_field_encoding=_FEATURESET_REPEATEDFIELDENCODING.values_by_name["EXPANDED"].number,utf8_validation=_FEATURESET_UTF8VALIDATION.values_by_name["NONE"].number,message_encoding=_FEATURESET_MESSAGEENCODING.values_by_name["LENGTH_PREFIXED"].number,json_format=_FEATURESET_JSONFORMAT.values_by_name["LEGACY_BEST_EFFORT"].number)@@ -3273,3 +3261,3 @@   _globals['_FEATURESET'].fields_by_name['enforce_naming_style']._loaded_options = None-  _globals['_FEATURESET'].fields_by_name['enforce_naming_style']._serialized_options = b'\210\001\002\230\001\001\230\001\002\230\001\003\230\001\004\230\001\005\230\001\006\230\001\007\230\001\010\230\001\t\242\001\021\022\014STYLE_LEGACY\030\204\007\242\001\016\022\tSTYLE2024\030\351\007\242\001\016\022\tSTYLE2026\030\217N\262\001\003\010\351\007'+  _globals['_FEATURESET'].fields_by_name['enforce_naming_style']._serialized_options = b'\210\001\002\230\001\001\230\001\002\230\001\003\230\001\004\230\001\005\230\001\006\230\001\007\230\001\010\230\001\t\242\001\021\022\014STYLE_LEGACY\030\204\007\242\001\016\022\tSTYLE2024\030\351\007\262\001\003\010\351\007'   _globals['_FEATURESET'].fields_by_name['default_symbol_visibility']._loaded_options = None@@ -3282,6 +3270,6 @@   _globals['_GENERATEDCODEINFO_ANNOTATION'].fields_by_name['path']._serialized_options = b'\020\001'-  _globals['_EDITION']._serialized_start=13023-  _globals['_EDITION']._serialized_end=13360-  _globals['_SYMBOLVISIBILITY']._serialized_start=13362-  _globals['_SYMBOLVISIBILITY']._serialized_end=13447+  _globals['_EDITION']._serialized_start=12919+  _globals['_EDITION']._serialized_end=13237+  _globals['_SYMBOLVISIBILITY']._serialized_start=13239+  _globals['_SYMBOLVISIBILITY']._serialized_end=13324   _globals['_FILEDESCRIPTORSET']._serialized_start=53@@ -3297,3 +3285,3 @@   _globals['_EXTENSIONRANGEOPTIONS']._serialized_start=1754-  _globals['_EXTENSIONRANGEOPTIONS']._serialized_end=2350+  _globals['_EXTENSIONRANGEOPTIONS']._serialized_end=2342   _globals['_EXTENSIONRANGEOPTIONS_DECLARATION']._serialized_start=2129@@ -3302,90 +3290,90 @@   _globals['_EXTENSIONRANGEOPTIONS_VERIFICATIONSTATE']._serialized_end=2331-  _globals['_FIELDDESCRIPTORPROTO']._serialized_start=2353-  _globals['_FIELDDESCRIPTORPROTO']._serialized_end=3186-  _globals['_FIELDDESCRIPTORPROTO_TYPE']._serialized_start=2807-  _globals['_FIELDDESCRIPTORPROTO_TYPE']._serialized_end=3117-  _globals['_FIELDDESCRIPTORPROTO_LABEL']._serialized_start=3119-  _globals['_FIELDDESCRIPTORPROTO_LABEL']._serialized_end=3186-  _globals['_ONEOFDESCRIPTORPROTO']._serialized_start=3188-  _globals['_ONEOFDESCRIPTORPROTO']._serialized_end=3287-  _globals['_ENUMDESCRIPTORPROTO']._serialized_start=3290-  _globals['_ENUMDESCRIPTORPROTO']._serialized_end=3712-  _globals['_ENUMDESCRIPTORPROTO_ENUMRESERVEDRANGE']._serialized_start=3653-  _globals['_ENUMDESCRIPTORPROTO_ENUMRESERVEDRANGE']._serialized_end=3712-  _globals['_ENUMVALUEDESCRIPTORPROTO']._serialized_start=3715-  _globals['_ENUMVALUEDESCRIPTORPROTO']._serialized_end=3846-  _globals['_SERVICEDESCRIPTORPROTO']._serialized_start=3849-  _globals['_SERVICEDESCRIPTORPROTO']._serialized_end=4030-  _globals['_METHODDESCRIPTORPROTO']._serialized_start=4033-  _globals['_METHODDESCRIPTORPROTO']._serialized_end=4298-  _globals['_FILEOPTIONS']._serialized_start=4301-  _globals['_FILEOPTIONS']._serialized_end=5703-  _globals['_FILEOPTIONS_OPTIMIZEMODE']._serialized_start=5592-  _globals['_FILEOPTIONS_OPTIMIZEMODE']._serialized_end=5650-  _globals['_MESSAGEOPTIONS']._serialized_start=5706-  _globals['_MESSAGEOPTIONS']._serialized_end=6214-  _globals['_FIELDOPTIONS']._serialized_start=6217-  _globals['_FIELDOPTIONS']._serialized_end=7959-  _globals['_FIELDOPTIONS_EDITIONDEFAULT']._serialized_start=7058-  _globals['_FIELDOPTIONS_EDITIONDEFAULT']._serialized_end=7148-  _globals['_FIELDOPTIONS_FEATURESUPPORT']._serialized_start=7151-  _globals['_FIELDOPTIONS_FEATURESUPPORT']._serialized_end=7466-  _globals['_FIELDOPTIONS_CTYPE']._serialized_start=7468-  _globals['_FIELDOPTIONS_CTYPE']._serialized_end=7515-  _globals['_FIELDOPTIONS_JSTYPE']._serialized_start=7517-  _globals['_FIELDOPTIONS_JSTYPE']._serialized_end=7570-  _globals['_FIELDOPTIONS_OPTIONRETENTION']._serialized_start=7572-  _globals['_FIELDOPTIONS_OPTIONRETENTION']._serialized_end=7657-  _globals['_FIELDOPTIONS_OPTIONTARGETTYPE']._serialized_start=7660-  _globals['_FIELDOPTIONS_OPTIONTARGETTYPE']._serialized_end=7928-  _globals['_ONEOFOPTIONS']._serialized_start=7962-  _globals['_ONEOFOPTIONS']._serialized_end=8142-  _globals['_ENUMOPTIONS']._serialized_start=8145-  _globals['_ENUMOPTIONS']._serialized_end=8490-  _globals['_ENUMVALUEOPTIONS']._serialized_start=8493-  _globals['_ENUMVALUEOPTIONS']._serialized_end=8845-  _globals['_SERVICEOPTIONS']._serialized_start=8848-  _globals['_SERVICEOPTIONS']._serialized_end=9069-  _globals['_METHODOPTIONS']._serialized_start=9072-  _globals['_METHODOPTIONS']._serialized_end=9489-  _globals['_METHODOPTIONS_IDEMPOTENCYLEVEL']._serialized_start=9390-  _globals['_METHODOPTIONS_IDEMPOTENCYLEVEL']._serialized_end=9470-  _globals['_UNINTERPRETEDOPTION']._serialized_start=9492-  _globals['_UNINTERPRETEDOPTION']._serialized_end=9902-  _globals['_UNINTERPRETEDOPTION_NAMEPART']._serialized_start=9828-  _globals['_UNINTERPRETEDOPTION_NAMEPART']._serialized_end=9902-  _globals['_FEATURESET']._serialized_start=9905-  _globals['_FEATURESET']._serialized_end=11871-  _globals['_FEATURESET_VISIBILITYFEATURE']._serialized_start=11101-  _globals['_FEATURESET_VISIBILITYFEATURE']._serialized_end=11262-  _globals['_FEATURESET_VISIBILITYFEATURE_DEFAULTSYMBOLVISIBILITY']._serialized_start=11123-  _globals['_FEATURESET_VISIBILITYFEATURE_DEFAULTSYMBOLVISIBILITY']._serialized_end=11252-  _globals['_FEATURESET_FIELDPRESENCE']._serialized_start=11264-  _globals['_FEATURESET_FIELDPRESENCE']._serialized_end=11356-  _globals['_FEATURESET_ENUMTYPE']._serialized_start=11358-  _globals['_FEATURESET_ENUMTYPE']._serialized_end=11413-  _globals['_FEATURESET_REPEATEDFIELDENCODING']._serialized_start=11415-  _globals['_FEATURESET_REPEATEDFIELDENCODING']._serialized_end=11501-  _globals['_FEATURESET_UTF8VALIDATION']._serialized_start=11503-  _globals['_FEATURESET_UTF8VALIDATION']._serialized_end=11576
… 109 more lines (truncated)
google/protobuf/duration_pb2.py +3 lines
--- +++ @@ -4,3 +4,3 @@ # source: google/protobuf/duration.proto-# Protobuf Python Version: 7.35.0+# Protobuf Python Version: 7.34.2 """Generated protocol buffer code."""@@ -14,4 +14,4 @@     7,-    35,-    0,+    34,+    2,     '',
google/protobuf/empty_pb2.py +3 lines
--- +++ @@ -4,3 +4,3 @@ # source: google/protobuf/empty.proto-# Protobuf Python Version: 7.35.0+# Protobuf Python Version: 7.34.2 """Generated protocol buffer code."""@@ -14,4 +14,4 @@     7,-    35,-    0,+    34,+    2,     '',
google/protobuf/field_mask_pb2.py +3 lines
--- +++ @@ -4,3 +4,3 @@ # source: google/protobuf/field_mask.proto-# Protobuf Python Version: 7.35.0+# Protobuf Python Version: 7.34.2 """Generated protocol buffer code."""@@ -14,4 +14,4 @@     7,-    35,-    0,+    34,+    2,     '',
google/protobuf/internal/field_mask.py +46 lines
--- +++ @@ -239,12 +239,5 @@       self.AddPath(prefix)-      return-    stack = [(prefix, node)]-    while stack:-      current_prefix, current_node = stack.pop()-      if not current_node:-        self.AddPath(current_prefix)-        continue-      for name in current_node:-        child_path = current_prefix + '.' + name-        stack.append((child_path, current_node[name]))+    for name in node:+      child_path = prefix + '.' + name+      self.AddLeafNodes(child_path, node[name]) @@ -271,41 +264,37 @@   """Merge all fields specified by a sub-tree from source to destination."""-  stack = [(node, source, destination)]-  while stack:-    current_node, current_source, current_destination = stack.pop()-    source_descriptor = current_source.DESCRIPTOR-    for name in current_node:-      child = current_node[name]-      field = source_descriptor.fields_by_name[name]-      if field is None:-        raise ValueError('Error: Can\'t find field {0} in message {1}.'.format(-            name, source_descriptor.full_name))-      if child:-        # Sub-paths are only allowed for singular message fields.-        if (field.is_repeated or-            field.cpp_type != FieldDescriptor.CPPTYPE_MESSAGE):-          raise ValueError('Error: Field {0} in message {1} is not a singular '-                           'message field and cannot have sub-fields.'.format(-                               name, source_descriptor.full_name))-        if current_source.HasField(name):-          stack.append(-              (child, getattr(current_source, name),-               getattr(current_destination, name)))-        continue-      if field.is_repeated:-        if replace_repeated:-          current_destination.ClearField(_StrConvert(name))-        repeated_source = getattr(current_source, name)-        repeated_destination = getattr(current_destination, name)-        repeated_destination.MergeFrom(repeated_source)+  source_descriptor = source.DESCRIPTOR+  for name in node:+    child = node[name]+    field = source_descriptor.fields_by_name[name]+    if field is None:+      raise ValueError('Error: Can\'t find field {0} in message {1}.'.format(+          name, source_descriptor.full_name))+    if child:+      # Sub-paths are only allowed for singular message fields.+      if (field.is_repeated or+          field.cpp_type != FieldDescriptor.CPPTYPE_MESSAGE):+        raise ValueError('Error: Field {0} in message {1} is not a singular '+                         'message field and cannot have sub-fields.'.format(+                             name, source_descriptor.full_name))+      if source.HasField(name):+        _MergeMessage(+            child, getattr(source, name), getattr(destination, name),+            replace_message, replace_repeated)+      continue+    if field.is_repeated:+      if replace_repeated:+        destination.ClearField(_StrConvert(name))+      repeated_source = getattr(source, name)+      repeated_destination = getattr(destination, name)+      repeated_destination.MergeFrom(repeated_source)+    else:+      if field.cpp_type == FieldDescriptor.CPPTYPE_MESSAGE:+        if replace_message:+          destination.ClearField(_StrConvert(name))+        if source.HasField(name):+          getattr(destination, name).MergeFrom(getattr(source, name))+      elif not field.has_presence or source.HasField(name):+        setattr(destination, name, getattr(source, name))       else:-        if field.cpp_type == FieldDescriptor.CPPTYPE_MESSAGE:-          if replace_message:-            current_destination.ClearField(_StrConvert(name))-          if current_source.HasField(name):-            getattr(current_destination, name).MergeFrom(-                getattr(current_source, name))-        elif not field.has_presence or current_source.HasField(name):-          setattr(current_destination, name, getattr(current_source, name))-        else:-          current_destination.ClearField(_StrConvert(name))+        destination.ClearField(_StrConvert(name)) @@ -314,13 +303,10 @@   """Adds the field paths descended from node to field_mask."""-  stack = [(node, prefix)]-  while stack:-    current_node, current_prefix = stack.pop()-    if not current_node and current_prefix:-      field_mask.paths.append(current_prefix)-      continue-    for name in sorted(current_node, reverse=True):-      if current_prefix:-        child_path = current_prefix + '.' + name-      else:-        child_path = name-      stack.append((current_node[name], child_path))+  if not node and prefix:+    field_mask.paths.append(prefix)+    return+  for name in sorted(node):+    if prefix:+      child_path = prefix + '.' + name+    else:+      child_path = name+    _AddFieldPaths(node[name], child_path, field_mask)
google/protobuf/internal/python_edition_defaults.py +1 lines
--- +++ @@ -4,2 +4,2 @@ """-_PROTOBUF_INTERNAL_PYTHON_EDITION_DEFAULTS = b"\n\027\030\204\007\"\000*\020\010\001\020\002\030\002 \003(\0010\0028\002@\001\n\027\030\347\007\"\000*\020\010\002\020\001\030\001 \002(\0010\0018\002@\001\n\027\030\350\007\"\014\010\001\020\001\030\001 \002(\0010\001*\0048\002@\001\n\027\030\351\007\"\020\010\001\020\001\030\001 \002(\0010\0018\001@\002*\000\n\027\030\217N\"\020\010\001\020\001\030\001 \002(\0010\0018\003@\002*\000 \346\007(\351\007"+_PROTOBUF_INTERNAL_PYTHON_EDITION_DEFAULTS = b"\n\027\030\204\007\"\000*\020\010\001\020\002\030\002 \003(\0010\0028\002@\001\n\027\030\347\007\"\000*\020\010\002\020\001\030\001 \002(\0010\0018\002@\001\n\027\030\350\007\"\014\010\001\020\001\030\001 \002(\0010\001*\0048\002@\001\n\027\030\351\007\"\020\010\001\020\001\030\001 \002(\0010\0018\001@\002*\000 \346\007(\351\007"
google/protobuf/json_format.py +7 lines
--- +++ @@ -88,4 +88,2 @@     always_print_fields_with_no_presence=False,-    *,-    unquote_int64_if_possible=False, ):@@ -111,5 +109,2 @@       False, Unicode strings are returned unchanged.-    unquote_int64_if_possible: If True, unquote int64 fields for values that-      are safe to emit as numbers (all values smaller than 2^53 and a sparse-      set of values that are larger). @@ -123,3 +118,2 @@       always_print_fields_with_no_presence,-      unquote_int64_if_possible=unquote_int64_if_possible,   )@@ -134,4 +128,2 @@     descriptor_pool=None,-    *,-    unquote_int64_if_possible=False, ):@@ -153,5 +145,2 @@       default.-    unquote_int64_if_possible: If True, unquote int64 fields for values that-      are safe to emit as numbers (all values smaller than 2^53 and a sparse-      set of values that are larger). @@ -165,3 +154,2 @@       always_print_fields_with_no_presence,-      unquote_int64_if_possible=unquote_int64_if_possible,   )@@ -188,4 +176,2 @@       always_print_fields_with_no_presence=False,-      *,-      unquote_int64_if_possible=False,   ):@@ -197,3 +183,2 @@     self.descriptor_pool = descriptor_pool-    self.unquote_int64_if_possible = unquote_int64_if_possible @@ -311,6 +296,3 @@     elif field.cpp_type in _INT64_TYPES:-      if self.unquote_int64_if_possible and float(value) == value:-        return value-      else:-        return str(value)+      return str(value)     elif field.cpp_type in _FLOAT_TYPES:@@ -526,6 +508,2 @@     """-    # Increment recursion depth at message entry. The max_recursion_depth limit-    # is exclusive: a depth value equal to max_recursion_depth will trigger an-    # error. For example, with max_recursion_depth=5, nesting up to depth 4 is-    # allowed, but attempting depth 5 raises ParseError.     self.recursion_depth += 1@@ -750,7 +728,8 @@     elif full_name in _WKTJSONMETHODS:-      # For well-known types (including nested Any), use ConvertMessage-      # to ensure recursion depth is properly tracked-      self.ConvertMessage(-          value['value'], sub_message, '{0}.value'.format(path)-      )+      methodcaller(+          _WKTJSONMETHODS[full_name][1],+          value['value'],+          sub_message,+          '{0}.value'.format(path),+      )(self)     else:
google/protobuf/runtime_version.py +2 lines
--- +++ @@ -30,4 +30,4 @@ OSS_MAJOR = 7-OSS_MINOR = 35-OSS_PATCH = 0+OSS_MINOR = 34+OSS_PATCH = 2 OSS_SUFFIX = ''
google/protobuf/source_context_pb2.py +3 lines
--- +++ @@ -4,3 +4,3 @@ # source: google/protobuf/source_context.proto-# Protobuf Python Version: 7.35.0+# Protobuf Python Version: 7.34.2 """Generated protocol buffer code."""@@ -14,4 +14,4 @@     7,-    35,-    0,+    34,+    2,     '',
google/protobuf/struct_pb2.py +3 lines
--- +++ @@ -4,3 +4,3 @@ # source: google/protobuf/struct.proto-# Protobuf Python Version: 7.35.0+# Protobuf Python Version: 7.34.2 """Generated protocol buffer code."""@@ -14,4 +14,4 @@     7,-    35,-    0,+    34,+    2,     '',
google/protobuf/text_format.py +18 lines
--- +++ @@ -635,4 +635,3 @@           descriptor_pool=None,-          allow_unknown_field=False,-          max_recursion_depth=None):+          allow_unknown_field=False):   """Parses a text representation of a protocol message into a message.@@ -674,5 +673,2 @@       errors (e.g. spelling error on field name)-    max_recursion_depth: Optional maximum recursion depth of a text proto-      message to be deserialized. Text proto messages over this depth will-      fail to parse. ``None`` keeps the historical unbounded behavior. @@ -689,4 +685,3 @@                     descriptor_pool=descriptor_pool,-                    allow_unknown_field=allow_unknown_field,-                    max_recursion_depth=max_recursion_depth)+                    allow_unknown_field=allow_unknown_field) @@ -698,4 +693,3 @@           descriptor_pool=None,-          allow_unknown_field=False,-          max_recursion_depth=None):+          allow_unknown_field=False):   """Parses a text representation of a protocol message into a message.@@ -716,5 +710,2 @@       errors (e.g. spelling error on field name)-    max_recursion_depth: Optional maximum recursion depth of a text proto-      message to be deserialized. Text proto messages over this depth will-      fail to parse. ``None`` keeps the historical unbounded behavior. @@ -732,4 +723,3 @@       descriptor_pool=descriptor_pool,-      allow_unknown_field=allow_unknown_field,-      max_recursion_depth=max_recursion_depth)+      allow_unknown_field=allow_unknown_field) @@ -741,4 +731,3 @@                descriptor_pool=None,-               allow_unknown_field=False,-               max_recursion_depth=None):+               allow_unknown_field=False):   """Parses a text representation of a protocol message into a message.@@ -757,5 +746,2 @@       errors (e.g. spelling error on field name)-    max_recursion_depth: Optional maximum recursion depth of a text proto-      message to be deserialized. Text proto messages over this depth will-      fail to parse. ``None`` keeps the historical unbounded behavior. @@ -770,4 +756,3 @@                    descriptor_pool=descriptor_pool,-                   allow_unknown_field=allow_unknown_field,-                   max_recursion_depth=max_recursion_depth)+                   allow_unknown_field=allow_unknown_field)   return parser.ParseLines(lines, message)@@ -780,4 +765,3 @@                descriptor_pool=None,-               allow_unknown_field=False,-               max_recursion_depth=None):+               allow_unknown_field=False):   """Parses a text representation of a protocol message into a message.@@ -796,5 +780,2 @@       errors (e.g. spelling error on field name)-    max_recursion_depth: Optional maximum recursion depth of a text proto-      message to be deserialized. Text proto messages over this depth will-      fail to parse. ``None`` keeps the historical unbounded behavior. @@ -809,4 +790,3 @@                    descriptor_pool=descriptor_pool,-                   allow_unknown_field=allow_unknown_field,-                   max_recursion_depth=max_recursion_depth)+                   allow_unknown_field=allow_unknown_field)   return parser.MergeLines(lines, message)@@ -821,4 +801,3 @@                descriptor_pool=None,-               allow_unknown_field=False,-               max_recursion_depth=None):+               allow_unknown_field=False):     self.allow_unknown_extension = allow_unknown_extension@@ -827,4 +806,2 @@     self.allow_unknown_field = allow_unknown_field-    self.max_recursion_depth = max_recursion_depth-    self.recursion_depth = 0 @@ -862,34 +839,4 @@       self.root_type = message.DESCRIPTOR.full_name-    self.recursion_depth += 1-    if (-        self.max_recursion_depth is not None-        and self.recursion_depth > self.max_recursion_depth-    ):-      raise ParseError(-          'Message too deep. Max recursion depth is {0}'.format(-              self.max_recursion_depth-          )-      )     while not tokenizer.AtEnd():       self._MergeField(tokenizer, message)-    self.recursion_depth -= 1--  def _MergeMessage(self, tokenizer, message, end_token):-    self.recursion_depth += 1-    if (-        self.max_recursion_depth is not None-        and self.recursion_depth > self.max_recursion_depth-    ):-      raise ParseError(-          'Message too deep. Max recursion depth is {0}'.format(-              self.max_recursion_depth-          )-      )-    while not tokenizer.TryConsume(end_token):-      if tokenizer.AtEnd():-        raise tokenizer.ParseErrorPreviousToken(-            'Expected "%s".' % (end_token,)-        )-      self._MergeField(tokenizer, message)-    self.recursion_depth -= 1 @@ -928,5 +875,7 @@                          packed_type_name)-      self._MergeMessage(-          tokenizer, expanded_any_sub_message, expanded_any_end_token-      )+      while not tokenizer.TryConsume(expanded_any_end_token):+        if tokenizer.AtEnd():+          raise tokenizer.ParseErrorPreviousToken('Expected "%s".' %+                                                  (expanded_any_end_token,))+        self._MergeField(tokenizer, expanded_any_sub_message)       deterministic = False@@ -1148,3 +1097,6 @@ -    self._MergeMessage(tokenizer, sub_message, end_token)+    while not tokenizer.TryConsume(end_token):+      if tokenizer.AtEnd():+        raise tokenizer.ParseErrorPreviousToken('Expected "%s".' % (end_token,))+      self._MergeField(tokenizer, sub_message) 
google/protobuf/timestamp_pb2.py +3 lines
--- +++ @@ -4,3 +4,3 @@ # source: google/protobuf/timestamp.proto-# Protobuf Python Version: 7.35.0+# Protobuf Python Version: 7.34.2 """Generated protocol buffer code."""@@ -14,4 +14,4 @@     7,-    35,-    0,+    34,+    2,     '',
google/protobuf/type_pb2.py +3 lines
--- +++ @@ -4,3 +4,3 @@ # source: google/protobuf/type.proto-# Protobuf Python Version: 7.35.0+# Protobuf Python Version: 7.34.2 """Generated protocol buffer code."""@@ -14,4 +14,4 @@     7,-    35,-    0,+    34,+    2,     '',
google/protobuf/wrappers_pb2.py +3 lines
--- +++ @@ -4,3 +4,3 @@ # source: google/protobuf/wrappers.proto-# Protobuf Python Version: 7.35.0+# Protobuf Python Version: 7.34.2 """Generated protocol buffer code."""@@ -14,4 +14,4 @@     7,-    35,-    0,+    34,+    2,     '',
pydantic pypi
2.13.4 25d ago incident on record
YANK ×2BURST ×4
latest 2.13.4 versions 203 maintainers 1
2.12.1
2.12.2
2.12.3
2.12.4
2.12.5
1.10.25
1.10.26
2.13.0
2.13.1
2.13.2
2.13.3
2.13.4
YANK
1.10.3 marked yanked (still downloadable)
high · registry-verified · 2022-12-29 · 3y ago
YANK
2.12.1 marked yanked (still downloadable)
high · registry-verified · 2025-10-13 · 7mo ago
BURST
2 releases in 50m: 0.2, 0.2.1
info · registry-verified · 2017-06-07 · 8y ago
BURST
3 releases in 56m: 1.6.2, 1.7.4, 1.8.2
info · registry-verified · 2021-05-11 · 5y ago
BURST
2 releases in 4m: 1.10.11, 2.0.1
info · registry-verified · 2023-07-04 · 2y ago
BURST
2 releases in 59m: 2.11.8, 1.10.23
info · registry-verified · 2025-09-13 · 8mo ago
release diff 2.13.3 → 2.13.4
+0 added · -0 removed · ~10 modified
pydantic/_internal/_generate_schema.py +12 lines
--- +++ @@ -842,4 +842,13 @@                 if cls.__pydantic_root_model__:-                    # FIXME: should the common field metadata be used here?-                    inner_schema, _ = self._common_field_schema('root', fields['root'], decorators)+                    inner_schema, metadata = self._common_field_schema('root', fields['root'], decorators)+                    if cls.__doc__ and metadata.get('pydantic_js_updates', {}).get('description'):+                        # This is a bit of a leaky abstraction, but as the model docstring takes priority+                        # over the root field's description, we need to override it here. This can't be done+                        # in the JSON Schema generation logic because the metadata's `pydantic_js_updates` are+                        # applied last, and overrides any value previously set (so the description set from the+                        # docstring in `GenerateJsonSchema._update_class_schema()` is overridden):+                        update_core_metadata(+                            metadata, pydantic_js_updates={'description': inspect.cleandoc(cls.__doc__)}+                        )+                     inner_schema = apply_model_validators(inner_schema, model_validators, 'inner')@@ -854,2 +863,3 @@                         ref=model_ref,+                        metadata=metadata,                     )
pydantic/json_schema.py +0 lines
--- +++ @@ -1638,3 +1638,2 @@         from .main import BaseModel-        from .root_model import RootModel @@ -1666,4 +1665,2 @@             json_schema.setdefault('description', inspect.cleandoc(docstring))-        elif issubclass(cls, RootModel) and (root_description := cls.__pydantic_fields__['root'].description):-            json_schema.setdefault('description', root_description) 
pydantic/version.py +2 lines
--- +++ @@ -10,3 +10,3 @@ -VERSION = '2.13.3'+VERSION = '2.13.4' """The version of Pydantic.@@ -21,3 +21,3 @@ # Keep this in sync with the version constraint in the `pyproject.toml` dependencies:-_COMPATIBLE_PYDANTIC_CORE_VERSION = '2.46.3'+_COMPATIBLE_PYDANTIC_CORE_VERSION = '2.46.4' 
pyproject.toml +1 lines
--- +++ @@ -49,3 +49,3 @@     # Keep this in sync with the version in the `check_pydantic_core_version()` function:-    'pydantic-core==2.46.3',+    'pydantic-core==2.46.4',     'typing-inspection>=0.4.2',
tests/test_json_schema.py +32 lines
--- +++ @@ -5393,2 +5393,34 @@ +def test_root_model_annotated_root_type_parameterized() -> None:+    """https://github.com/pydantic/pydantic/issues/13123"""++    MyType = Annotated[str, Field(examples=['hello'], description='desc', deprecated=True)]++    class MyModel(RootModel[MyType]):+        pass++    assert MyModel.model_json_schema() == {+        'deprecated': True,+        'description': 'desc',+        'examples': ['hello'],+        'title': 'MyModel',+        'type': 'string',+    }+++def test_root_model_annotated_root_type() -> None:+    """https://github.com/pydantic/pydantic/issues/13123"""++    class MyModel(RootModel):+        root: Annotated[str, Field(examples=['hello'], description='desc', deprecated=True)]++    assert MyModel.model_json_schema() == {+        'deprecated': True,+        'description': 'desc',+        'examples': ['hello'],+        'title': 'MyModel',+        'type': 'string',+    }++ def test_type_adapter_json_schemas_title_description():
tests/test_main.py +1 lines
--- +++ @@ -2012,7 +2012,3 @@ def test_class_kwargs_custom_config():-    if platform.python_implementation() == 'PyPy':-        msg = r"__init_subclass__\(\) got an unexpected keyword argument 'some_config'"-    else:-        msg = r'__init_subclass__\(\) takes no keyword arguments'-    with pytest.raises(TypeError, match=msg):+    with pytest.raises(TypeError, match=r'__init_subclass__\(\) takes no keyword arguments'): 
tests/test_missing_sentinel.py +6 lines
--- +++ @@ -4,2 +4,3 @@ import pytest+import typing_extensions from annotated_types import Ge@@ -55,3 +56,7 @@ [email protected](reason="PEP 661 sentinels aren't picklable yet in the experimental typing-extensions implementation")[email protected](+    # Unreleased typing-extensions has the final sentinel implementation with pickle support:+    condition=not hasattr(typing_extensions, 'sentinel'),+    reason="PEP 661 sentinels aren't picklable yet in the experimental typing-extensions implementation",+) def test_missing_sentinel_pickle() -> None:
tests/test_pickle.py +25 lines
--- +++ @@ -8,3 +8,3 @@ from textwrap import dedent-from typing import Optional+from typing import TYPE_CHECKING, Optional @@ -17,6 +17,14 @@ -try:+IS_PYPY = sys.implementation.name == 'pypy' and sys.version_info >= (3, 11)++if TYPE_CHECKING:     import cloudpickle-except ImportError:-    cloudpickle = None+else:+    if not IS_PYPY:+        try:+            import cloudpickle+        except ImportError:+            cloudpickle = None+    else:+        cloudpickle = None @@ -24,6 +32,12 @@ -pytestmark = pytest.mark.skipif(cloudpickle is None, reason='cloudpickle is not installed')-+pytestmark = pytest.mark.skipif(+    cloudpickle is None,+    reason='cloudpickle is not installed, or tests are running with PyPy (https://github.com/cloudpipe/cloudpickle/issues/592).',+)++# Note: this xfail marker was used when cloudpickle was partially compatible with PyPy. Since PyPy 7.3.22, it isn't compatible+# at all (importing it fails), so all tests are skipped as per the module's `pytestmark`. We keep the xfail marker if this ever+# changes: cloudpickle_pypy_xfail = pytest.mark.xfail(-    condition=sys.implementation.name == 'pypy' and sys.version_info >= (3, 11),+    condition=IS_PYPY,     reason='Cloudpickle issue: - possibly https://github.com/cloudpipe/cloudpickle/issues/557',@@ -101,3 +115,6 @@         (ImportableModel, True),-        # Locally-defined model can only be pickled with cloudpickle.+        # Locally-defined model can only be pickle+        # # Note: this xfail marker was used when cloudpickle was partially compatible with PyPy. Since PyPy 7.3.22, it is completelyisn't compatible+        # # at all (importing it fails), so all tests are skipped as per the module's `pytestmark`. We keep the xfail marker if this ever+        # # changes:d with cloudpickle.         pytest.param(model_factory(), True, marks=cloudpickle_pypy_xfail),
pydantic-core pypi
2.47.0 9d ago incident on record
YANK ×3BURST
latest 2.47.0 versions 156 maintainers 1
2.41.4
2.41.5
2.42.0
2.43.0
2.44.0
2.45.0
2.46.0
2.46.1
2.46.2
2.46.3
2.46.4
2.47.0
YANK
2.41.3 marked yanked (still downloadable)
high · registry-verified · 2025-10-13 · 7mo ago
YANK
2.43.0 marked yanked (still downloadable)
high · registry-verified · 2026-03-27 · 2mo ago
YANK
2.44.0 marked yanked (still downloadable)
high · registry-verified · 2026-03-27 · 2mo ago
BURST
2 releases in 44m: 2.6.2, 2.6.3
info · registry-verified · 2023-08-23 · 2y ago
release diff 2.46.4 → 2.47.0
+0 added · -1 removed · ~59 modified
+16 more files not shown
Cargo.toml +1 lines
--- +++ @@ -2,3 +2,3 @@ name = "pydantic-core"-version = "2.46.4"+version = "2.47.0" edition = "2024"
pyproject.toml +4 lines
--- +++ @@ -1,3 +1,3 @@ [build-system]-requires = ['maturin>=1.10,<2']+requires = ['maturin>=1.13.3,<2'] build-backend = 'maturin'@@ -7,3 +7,3 @@ description = "Core functionality for Pydantic validation and serialization"-requires-python = '>=3.9'+requires-python = '>=3.10' license = 'MIT'@@ -23,3 +23,2 @@     'Programming Language :: Python :: 3 :: Only',-    'Programming Language :: Python :: 3.9',     'Programming Language :: Python :: 3.10',@@ -98,3 +97,3 @@ line-length = 120-target-version = 'py39'+target-version = 'py310' @@ -118,8 +117,3 @@ log_format = '%(name)s %(levelname)s: %(message)s'-filterwarnings = [-    'error',-    # Python 3.9 and below allowed truncation of float to integers in some-    # cases, by not making this an error we can test for this behaviour-    'ignore:(.+)Implicit conversion to integers using __int__ is deprecated',-]+filterwarnings = ['error'] timeout = 30
python/pydantic_core/core_schema.py +122 lines
--- +++ @@ -9,3 +9,3 @@ import warnings-from collections.abc import Generator, Hashable, Mapping+from collections.abc import Callable, Generator, Hashable, Mapping from datetime import date, datetime, time, timedelta@@ -13,3 +13,3 @@ from re import Pattern-from typing import TYPE_CHECKING, Any, Callable, Literal, Union+from typing import TYPE_CHECKING, Any, Literal @@ -23,3 +23,5 @@ if sys.version_info < (3, 11):-    from typing_extensions import Protocol, Required, TypeAlias+    from typing import TypeAlias++    from typing_extensions import Protocol, Required else:@@ -39,3 +41,3 @@ -ExtraBehavior = Literal['allow', 'forbid', 'ignore']+ExtraBehavior: TypeAlias = Literal['allow', 'forbid', 'ignore'] @@ -119,3 +121,3 @@     regex_engine: Literal['rust-regex', 'python-re']  # default: 'rust-regex'-    cache_strings: Union[bool, Literal['all', 'keys', 'none']]  # default: 'True'+    cache_strings: bool | Literal['all', 'keys', 'none']  # default: 'True'     validate_by_alias: bool  # default: True@@ -243,3 +245,3 @@ -ExpectedSerializationTypes = Literal[+ExpectedSerializationTypes: TypeAlias = Literal[     'none',@@ -284,17 +286,17 @@ # (input_value: Any, /) -> Any-GeneralPlainNoInfoSerializerFunction = Callable[[Any], Any]+GeneralPlainNoInfoSerializerFunction: TypeAlias = Callable[[Any], Any] # (input_value: Any, info: FieldSerializationInfo, /) -> Any-GeneralPlainInfoSerializerFunction = Callable[[Any, SerializationInfo[Any]], Any]+GeneralPlainInfoSerializerFunction: TypeAlias = Callable[[Any, SerializationInfo[Any]], Any] # (model: Any, input_value: Any, /) -> Any-FieldPlainNoInfoSerializerFunction = Callable[[Any, Any], Any]+FieldPlainNoInfoSerializerFunction: TypeAlias = Callable[[Any, Any], Any] # (model: Any, input_value: Any, info: FieldSerializationInfo, /) -> Any-FieldPlainInfoSerializerFunction = Callable[[Any, Any, FieldSerializationInfo[Any]], Any]-SerializerFunction = Union[-    GeneralPlainNoInfoSerializerFunction,-    GeneralPlainInfoSerializerFunction,-    FieldPlainNoInfoSerializerFunction,-    FieldPlainInfoSerializerFunction,-]--WhenUsed = Literal['always', 'unless-none', 'json', 'json-unless-none']+FieldPlainInfoSerializerFunction: TypeAlias = Callable[[Any, Any, FieldSerializationInfo[Any]], Any]+SerializerFunction: TypeAlias = (+    GeneralPlainNoInfoSerializerFunction+    | GeneralPlainInfoSerializerFunction+    | FieldPlainNoInfoSerializerFunction+    | FieldPlainInfoSerializerFunction+)++WhenUsed: TypeAlias = Literal['always', 'unless-none', 'json', 'json-unless-none'] """@@ -355,15 +357,19 @@ # (input_value: Any, serializer: SerializerFunctionWrapHandler, /) -> Any-GeneralWrapNoInfoSerializerFunction = Callable[[Any, SerializerFunctionWrapHandler], Any]+GeneralWrapNoInfoSerializerFunction: TypeAlias = Callable[[Any, SerializerFunctionWrapHandler], Any] # (input_value: Any, serializer: SerializerFunctionWrapHandler, info: SerializationInfo, /) -> Any-GeneralWrapInfoSerializerFunction = Callable[[Any, SerializerFunctionWrapHandler, SerializationInfo[Any]], Any]+GeneralWrapInfoSerializerFunction: TypeAlias = Callable[+    [Any, SerializerFunctionWrapHandler, SerializationInfo[Any]], Any+] # (model: Any, input_value: Any, serializer: SerializerFunctionWrapHandler, /) -> Any-FieldWrapNoInfoSerializerFunction = Callable[[Any, Any, SerializerFunctionWrapHandler], Any]+FieldWrapNoInfoSerializerFunction: TypeAlias = Callable[[Any, Any, SerializerFunctionWrapHandler], Any] # (model: Any, input_value: Any, serializer: SerializerFunctionWrapHandler, info: FieldSerializationInfo, /) -> Any-FieldWrapInfoSerializerFunction = Callable[[Any, Any, SerializerFunctionWrapHandler, FieldSerializationInfo[Any]], Any]-WrapSerializerFunction = Union[-    GeneralWrapNoInfoSerializerFunction,-    GeneralWrapInfoSerializerFunction,-    FieldWrapNoInfoSerializerFunction,-    FieldWrapInfoSerializerFunction,+FieldWrapInfoSerializerFunction: TypeAlias = Callable[+    [Any, Any, SerializerFunctionWrapHandler, FieldSerializationInfo[Any]], Any ]+WrapSerializerFunction: TypeAlias = (+    GeneralWrapNoInfoSerializerFunction+    | GeneralWrapInfoSerializerFunction+    | FieldWrapNoInfoSerializerFunction+    | FieldWrapInfoSerializerFunction+) @@ -471,10 +477,10 @@ -SerSchema = Union[-    SimpleSerSchema,-    PlainSerializerFunctionSerSchema,-    WrapSerializerFunctionSerSchema,-    FormatSerSchema,-    ToStringSerSchema,-    ModelSerSchema,-]+SerSchema: TypeAlias = (+    SimpleSerSchema+    | PlainSerializerFunctionSerSchema+    | WrapSerializerFunctionSerSchema+    | FormatSerSchema+    | ToStringSerSchema+    | ModelSerSchema+) @@ -874,3 +880,3 @@     type: Required[Literal['str']]-    pattern: Union[str, Pattern[str]]+    pattern: str | Pattern[str]     max_length: int@@ -1074,3 +1080,3 @@     gt: time-    tz_constraint: Union[Literal['aware', 'naive'], int]+    tz_constraint: Literal['aware', 'naive'] | int     microseconds_precision: Literal['truncate', 'error']@@ -1141,3 +1147,3 @@     now_op: Literal['past', 'future']-    tz_constraint: Union[Literal['aware', 'naive'], int]+    tz_constraint: Literal['aware', 'naive'] | int     # defaults to current local utc offset from `time.localtime().tm_gmtoff`@@ -1544,3 +1550,3 @@ -IncExSeqOrElseSerSchema = Union[IncExSeqSerSchema, SerSchema]+IncExSeqOrElseSerSchema: TypeAlias = IncExSeqSerSchema | SerSchema @@ -1937,3 +1943,3 @@ -IncExDict = set[Union[int, str]]+IncExDict: TypeAlias = set[int | str] @@ -1950,3 +1956,3 @@ -IncExDictOrElseSerSchema = Union[IncExDictSerSchema, SerSchema]+IncExDictOrElseSerSchema: TypeAlias = IncExDictSerSchema | SerSchema @@ -2017,3 +2023,3 @@ # (input_value: Any, /) -> Any-NoInfoValidatorFunction = Callable[[Any], Any]+NoInfoValidatorFunction: TypeAlias = Callable[[Any], Any] @@ -2026,3 +2032,3 @@ # (input_value: Any, info: ValidationInfo, /) -> Any-WithInfoValidatorFunction = Callable[[Any, ValidationInfo[Any]], Any]+WithInfoValidatorFunction: TypeAlias = Callable[[Any, ValidationInfo[Any]], Any] @@ -2035,3 +2041,3 @@ -ValidationFunction = Union[NoInfoValidatorFunctionSchema, WithInfoValidatorFunctionSchema]+ValidationFunction: TypeAlias = NoInfoValidatorFunctionSchema | WithInfoValidatorFunctionSchema @@ -2264,3 +2270,3 @@ # (input_value: Any, validator: ValidatorFunctionWrapHandler, /) -> Any-NoInfoWrapValidatorFunction = Callable[[Any, ValidatorFunctionWrapHandler], Any]+NoInfoWrapValidatorFunction: TypeAlias = Callable[[Any, ValidatorFunctionWrapHandler], Any] @@ -2273,3 +2279,3 @@ # (input_value: Any, validator: ValidatorFunctionWrapHandler, info: ValidationInfo, /) -> Any-WithInfoWrapValidatorFunction = Callable[[Any, ValidatorFunctionWrapHandler, ValidationInfo[Any]], Any]+WithInfoWrapValidatorFunction: TypeAlias = Callable[[Any, ValidatorFunctionWrapHandler, ValidationInfo[Any]], Any] @@ -2282,3 +2288,3 @@ -WrapValidatorFunction = Union[NoInfoWrapValidatorFunctionSchema, WithInfoWrapValidatorFunctionSchema]+WrapValidatorFunction: TypeAlias = NoInfoWrapValidatorFunctionSchema | WithInfoWrapValidatorFunctionSchema @@ -2505,3 +2511,3 @@     default: Any-    default_factory: Union[Callable[[], Any], Callable[[dict[str, Any]], Any]]+    default_factory: Callable[[], Any] | Callable[[dict[str, Any]], Any]     default_factory_takes_data: bool@@ -2519,3 +2525,3 @@     default: Any = PydanticUndefined,-    default_factory: Union[Callable[[], Any], Callable[[dict[str, Any]], Any], None] = None,+    default_factory: Callable[[], Any] | Callable[[dict[str, Any]], Any] | None = None,     default_factory_takes_data: bool | None = None,@@ -2613,3 +2619,3 @@     type: Required[Literal['union']]-    choices: Required[list[Union[CoreSchema, tuple[CoreSchema, str]]]]+    choices: Required[list[CoreSchema | tuple[CoreSchema, str]]]     # default true, whether to automatically collapse unions with one element to the inner validator@@ -2618,3 +2624,3 @@     custom_error_message: str-    custom_error_context: dict[str, Union[str, int, float]]+    custom_error_context: dict[str, str | int | float]     mode: Literal['smart', 'left_to_right']  # default: 'smart'@@ -2680,6 +2686,6 @@     choices: Required[dict[Hashable, CoreSchema]]-    discriminator: Required[Union[str, list[Union[str, int]], list[list[Union[str, int]]], Callable[[Any], Hashable]]]+    discriminator: Required[str | list[str | int] | list[list[str | int]] | Callable[[Any], Hashable]]     custom_error_type: str     custom_error_message: str-    custom_error_context: dict[str, Union[str, int, float]]+    custom_error_context: dict[str, str | int | float]     strict: bool@@ -2941,3 +2947,3 @@     required: bool-    validation_alias: Union[str, list[Union[str, int]], list[list[Union[str, int]]]]+    validation_alias: str | list[str | int] | list[list[str | int]]     serialization_alias: str@@ -3072,3 +3078,3 @@     schema: Required[CoreSchema]-    validation_alias: Union[str, list[Union[str, int]], list[list[Union[str, int]]]]+    validation_alias: str | list[str | int] | list[list[str | int]]     serialization_alias: str@@ -3303,3 +3309,3 @@     frozen: bool  # default: False-    validation_alias: Union[str, list[Union[str, int]], list[list[Union[str, int]]]]+    validation_alias: str | list[str | int] | list[list[str | int]]     serialization_alias: str@@ -3511,3 +3517,3 @@     mode: Literal['positional_only', 'positional_or_keyword', 'keyword_only']  # default positional_or_keyword-    alias: Union[str, list[Union[str, int]], list[list[Union[str, int]]]]+    alias: str | list[str | int] | list[list[str | int]] @@ -3627,3 +3633,3 @@     ]  # default positional_or_keyword-    alias: Union[str, list[Union[str, int]], list[list[Union[str, int]]]]+    alias: str | list[str | int] | list[list[str | int]] @@ -3800,3 +3806,3 @@     custom_error_message: str-    custom_error_context: dict[str, Union[str, int, float]]+    custom_error_context: dict[str, str | int | float]     ref: str@@ -4121,56 +4127,56 @@ if not MYPY:-    CoreSchema = Union[-        InvalidSchema,-        AnySchema,-        NoneSchema,-        BoolSchema,-        IntSchema,-        FloatSchema,-        DecimalSchema,-        StringSchema,-        BytesSchema,-        DateSchema,-        TimeSchema,-        DatetimeSchema,-        TimedeltaSchema,-        LiteralSchema,-        MissingSentinelSchema,-        EnumSchema,
… 107 more lines (truncated)
src/self_schema.py +6852 lines
--- +++ @@ -1,2 +1,6853 @@ # this file is auto-generated by generate_self_schema.py, DO NOT edit manually-self_schema = {'type': 'definitions', 'schema': {'type': 'definition-ref', 'schema_ref': 'root-schema'}, 'definitions': [{'type': 'tagged-union', 'choices': {'invalid': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['invalid']}, 'required': True}, 'ref': {'schema': {'type': 'str'}, 'required': False}, 'metadata': {'schema': {'type': 'dict', 'keys_schema': {'type': 'str'}, 'values_schema': {'type': 'any'}}, 'required': False}, 'serialization': {'schema': {'type': 'definition-ref', 'schema_ref': 'ser-schema'}, 'required': False}}, 'extra_behavior': 'forbid'}, 'any': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['any']}, 'required': True}, 'ref': {'schema': {'type': 'str'}, 'required': False}, 'metadata': {'schema': {'type': 'dict', 'keys_schema': {'type': 'str'}, 'values_schema': {'type': 'any'}}, 'required': False}, 'serialization': {'schema': {'type': 'definition-ref', 'schema_ref': 'ser-schema'}, 'required': False}}, 'extra_behavior': 'forbid'}, 'none': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none']}, 'required': True}, 'ref': {'schema': {'type': 'str'}, 'required': False}, 'metadata': {'schema': {'type': 'dict', 'keys_schema': {'type': 'str'}, 'values_schema': {'type': 'any'}}, 'required': False}, 'serialization': {'schema': {'type': 'definition-ref', 'schema_ref': 'ser-schema'}, 'required': False}}, 'extra_behavior': 'forbid'}, 'bool': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['bool']}, 'required': True}, 'strict': {'schema': {'type': 'bool'}, 'required': False}, 'ref': {'schema': {'type': 'str'}, 'required': False}, 'metadata': {'schema': {'type': 'dict', 'keys_schema': {'type': 'str'}, 'values_schema': {'type': 'any'}}, 'required': False}, 'serialization': {'schema': {'type': 'definition-ref', 'schema_ref': 'ser-schema'}, 'required': False}}, 'extra_behavior': 'forbid'}, 'int': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['int']}, 'required': True}, 'multiple_of': {'schema': {'type': 'int'}, 'required': False}, 'le': {'schema': {'type': 'int'}, 'required': False}, 'ge': {'schema': {'type': 'int'}, 'required': False}, 'lt': {'schema': {'type': 'int'}, 'required': False}, 'gt': {'schema': {'type': 'int'}, 'required': False}, 'strict': {'schema': {'type': 'bool'}, 'required': False}, 'ref': {'schema': {'type': 'str'}, 'required': False}, 'metadata': {'schema': {'type': 'dict', 'keys_schema': {'type': 'str'}, 'values_schema': {'type': 'any'}}, 'required': False}, 'serialization': {'schema': {'type': 'definition-ref', 'schema_ref': 'ser-schema'}, 'required': False}}, 'extra_behavior': 'forbid'}, 'float': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['float']}, 'required': True}, 'allow_inf_nan': {'schema': {'type': 'bool'}, 'required': False}, 'multiple_of': {'schema': {'type': 'float'}, 'required': False}, 'le': {'schema': {'type': 'float'}, 'required': False}, 'ge': {'schema': {'type': 'float'}, 'required': False}, 'lt': {'schema': {'type': 'float'}, 'required': False}, 'gt': {'schema': {'type': 'float'}, 'required': False}, 'strict': {'schema': {'type': 'bool'}, 'required': False}, 'ref': {'schema': {'type': 'str'}, 'required': False}, 'metadata': {'schema': {'type': 'dict', 'keys_schema': {'type': 'str'}, 'values_schema': {'type': 'any'}}, 'required': False}, 'serialization': {'schema': {'type': 'definition-ref', 'schema_ref': 'ser-schema'}, 'required': False}}, 'extra_behavior': 'forbid'}, 'decimal': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['decimal']}, 'required': True}, 'allow_inf_nan': {'schema': {'type': 'bool'}, 'required': False}, 'multiple_of': {'schema': {'type': 'decimal'}, 'required': False}, 'le': {'schema': {'type': 'decimal'}, 'required': False}, 'ge': {'schema': {'type': 'decimal'}, 'required': False}, 'lt': {'schema': {'type': 'decimal'}, 'required': False}, 'gt': {'schema': {'type': 'decimal'}, 'required': False}, 'max_digits': {'schema': {'type': 'int'}, 'required': False}, 'decimal_places': {'schema': {'type': 'int'}, 'required': False}, 'strict': {'schema': {'type': 'bool'}, 'required': False}, 'ref': {'schema': {'type': 'str'}, 'required': False}, 'metadata': {'schema': {'type': 'dict', 'keys_schema': {'type': 'str'}, 'values_schema': {'type': 'any'}}, 'required': False}, 'serialization': {'schema': {'type': 'definition-ref', 'schema_ref': 'ser-schema'}, 'required': False}}, 'extra_behavior': 'forbid'}, 'str': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['str']}, 'required': True}, 'pattern': {'schema': {'type': 'union', 'choices': [{'type': 'str'}, {'type': 'any'}]}, 'required': False}, 'max_length': {'schema': {'type': 'int'}, 'required': False}, 'min_length': {'schema': {'type': 'int'}, 'required': False}, 'strip_whitespace': {'schema': {'type': 'bool'}, 'required': False}, 'to_lower': {'schema': {'type': 'bool'}, 'required': False}, 'to_upper': {'schema': {'type': 'bool'}, 'required': False}, 'regex_engine': {'schema': {'type': 'literal', 'expected': ['rust-regex', 'python-re']}, 'required': False}, 'strict': {'schema': {'type': 'bool'}, 'required': False}, 'coerce_numbers_to_str': {'schema': {'type': 'bool'}, 'required': False}, 'ref': {'schema': {'type': 'str'}, 'required': False}, 'metadata': {'schema': {'type': 'dict', 'keys_schema': {'type': 'str'}, 'values_schema': {'type': 'any'}}, 'required': False}, 'serialization': {'schema': {'type': 'definition-ref', 'schema_ref': 'ser-schema'}, 'required': False}}, 'extra_behavior': 'forbid'}, 'bytes': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['bytes']}, 'required': True}, 'max_length': {'schema': {'type': 'int'}, 'required': False}, 'min_length': {'schema': {'type': 'int'}, 'required': False}, 'strict': {'schema': {'type': 'bool'}, 'required': False}, 'ref': {'schema': {'type': 'str'}, 'required': False}, 'metadata': {'schema': {'type': 'dict', 'keys_schema': {'type': 'str'}, 'values_schema': {'type': 'any'}}, 'required': False}, 'serialization': {'schema': {'type': 'definition-ref', 'schema_ref': 'ser-schema'}, 'required': False}}, 'extra_behavior': 'forbid'}, 'date': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['date']}, 'required': True}, 'strict': {'schema': {'type': 'bool'}, 'required': False}, 'le': {'schema': {'type': 'date'}, 'required': False}, 'ge': {'schema': {'type': 'date'}, 'required': False}, 'lt': {'schema': {'type': 'date'}, 'required': False}, 'gt': {'schema': {'type': 'date'}, 'required': False}, 'now_op': {'schema': {'type': 'literal', 'expected': ['past', 'future']}, 'required': False}, 'now_utc_offset': {'schema': {'type': 'int', 'gt': -86400, 'lt': 86400}, 'required': False}, 'ref': {'schema': {'type': 'str'}, 'required': False}, 'metadata': {'schema': {'type': 'dict', 'keys_schema': {'type': 'str'}, 'values_schema': {'type': 'any'}}, 'required': False}, 'serialization': {'schema': {'type': 'definition-ref', 'schema_ref': 'ser-schema'}, 'required': False}}, 'extra_behavior': 'forbid'}, 'time': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['time']}, 'required': True}, 'strict': {'schema': {'type': 'bool'}, 'required': False}, 'le': {'schema': {'type': 'time'}, 'required': False}, 'ge': {'schema': {'type': 'time'}, 'required': False}, 'lt': {'schema': {'type': 'time'}, 'required': False}, 'gt': {'schema': {'type': 'time'}, 'required': False}, 'tz_constraint': {'schema': {'type': 'union', 'choices': [{'type': 'literal', 'expected': ['aware', 'naive']}, {'type': 'int'}]}, 'required': False}, 'microseconds_precision': {'schema': {'type': 'literal', 'expected': ['truncate', 'error']}, 'required': False}, 'ref': {'schema': {'type': 'str'}, 'required': False}, 'metadata': {'schema': {'type': 'dict', 'keys_schema': {'type': 'str'}, 'values_schema': {'type': 'any'}}, 'required': False}, 'serialization': {'schema': {'type': 'definition-ref', 'schema_ref': 'ser-schema'}, 'required': False}}, 'extra_behavior': 'forbid'}, 'datetime': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['datetime']}, 'required': True}, 'strict': {'schema': {'type': 'bool'}, 'required': False}, 'le': {'schema': {'type': 'datetime'}, 'required': False}, 'ge': {'schema': {'type': 'datetime'}, 'required': False}, 'lt': {'schema': {'type': 'datetime'}, 'required': False}, 'gt': {'schema': {'type': 'datetime'}, 'required': False}, 'now_op': {'schema': {'type': 'literal', 'expected': ['past', 'future']}, 'required': False}, 'tz_constraint': {'schema': {'type': 'union', 'choices': [{'type': 'literal', 'expected': ['aware', 'naive']}, {'type': 'int'}]}, 'required': False}, 'now_utc_offset': {'schema': {'type': 'int', 'gt': -86400, 'lt': 86400}, 'required': False}, 'microseconds_precision': {'schema': {'type': 'literal', 'expected': ['truncate', 'error']}, 'required': False}, 'ref': {'schema': {'type': 'str'}, 'required': False}, 'metadata': {'schema': {'type': 'dict', 'keys_schema': {'type': 'str'}, 'values_schema': {'type': 'any'}}, 'required': False}, 'serialization': {'schema': {'type': 'definition-ref', 'schema_ref': 'ser-schema'}, 'required': False}}, 'extra_behavior': 'forbid'}, 'timedelta': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['timedelta']}, 'required': True}, 'strict': {'schema': {'type': 'bool'}, 'required': False}, 'le': {'schema': {'type': 'timedelta'}, 'required': False}, 'ge': {'schema': {'type': 'timedelta'}, 'required': False}, 'lt': {'schema': {'type': 'timedelta'}, 'required': False}, 'gt': {'schema': {'type': 'timedelta'}, 'required': False}, 'microseconds_precision': {'schema': {'type': 'literal', 'expected': ['truncate', 'error']}, 'required': False}, 'ref': {'schema': {'type': 'str'}, 'required': False}, 'metadata': {'schema': {'type': 'dict', 'keys_schema': {'type': 'str'}, 'values_schema': {'type': 'any'}}, 'required': False}, 'serialization': {'schema': {'type': 'definition-ref', 'schema_ref': 'ser-schema'}, 'required': False}}, 'extra_behavior': 'forbid'}, 'literal': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['literal']}, 'required': True}, 'expected': {'schema': {'type': 'list', 'items_schema': {'type': 'any'}}, 'required': True}, 'ref': {'schema': {'type': 'str'}, 'required': False}, 'metadata': {'schema': {'type': 'dict', 'keys_schema': {'type': 'str'}, 'values_schema': {'type': 'any'}}, 'required': False}, 'serialization': {'schema': {'type': 'definition-ref', 'schema_ref': 'ser-schema'}, 'required': False}}, 'extra_behavior': 'forbid'}, 'enum': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['enum']}, 'required': True}, 'cls': {'schema': {'type': 'any'}, 'required': True}, 'members': {'schema': {'type': 'list', 'items_schema': {'type': 'any'}}, 'required': True}, 'sub_type': {'schema': {'type': 'literal', 'expected': ['str', 'int', 'float']}, 'required': False}, 'missing': {'schema': {'type': 'callable'}, 'required': False}, 'strict': {'schema': {'type': 'bool'}, 'required': False}, 'ref': {'schema': {'type': 'str'}, 'required': False}, 'metadata': {'schema': {'type': 'dict', 'keys_schema': {'type': 'str'}, 'values_schema': {'type': 'any'}}, 'required': False}, 'serialization': {'schema': {'type': 'definition-ref', 'schema_ref': 'ser-schema'}, 'required': False}}, 'extra_behavior': 'forbid'}, 'is-instance': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['is-instance']}, 'required': True}, 'cls': {'schema': {'type': 'any'}, 'required': True}, 'cls_repr': {'schema': {'type': 'str'}, 'required': False}, 'ref': {'schema': {'type': 'str'}, 'required': False}, 'metadata': {'schema': {'type': 'dict', 'keys_schema': {'type': 'str'}, 'values_schema': {'type': 'any'}}, 'required': False}, 'serialization': {'schema': {'type': 'definition-ref', 'schema_ref': 'ser-schema'}, 'required': False}}, 'extra_behavior': 'forbid'}, 'is-subclass': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['is-subclass']}, 'required': True}, 'cls': {'schema': {'type': 'any'}, 'required': True}, 'cls_repr': {'schema': {'type': 'str'}, 'required': False}, 'ref': {'schema': {'type': 'str'}, 'required': False}, 'metadata': {'schema': {'type': 'dict', 'keys_schema': {'type': 'str'}, 'values_schema': {'type': 'any'}}, 'required': False}, 'serialization': {'schema': {'type': 'definition-ref', 'schema_ref': 'ser-schema'}, 'required': False}}, 'extra_behavior': 'forbid'}, 'callable': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['callable']}, 'required': True}, 'ref': {'schema': {'type': 'str'}, 'required': False}, 'metadata': {'schema': {'type': 'dict', 'keys_schema': {'type': 'str'}, 'values_schema': {'type': 'any'}}, 'required': False}, 'serialization': {'schema': {'type': 'definition-ref', 'schema_ref': 'ser-schema'}, 'required': False}}, 'extra_behavior': 'forbid'}, 'list': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['list']}, 'required': True}, 'items_schema': {'schema': {'type': 'definition-ref', 'schema_ref': 'root-schema'}, 'required': False}, 'min_length': {'schema': {'type': 'int'}, 'required': False}, 'max_length': {'schema': {'type': 'int'}, 'required': False}, 'fail_fast': {'schema': {'type': 'bool'}, 'required': False}, 'strict': {'schema': {'type': 'bool'}, 'required': False}, 'ref': {'schema': {'type': 'str'}, 'required': False}, 'metadata': {'schema': {'type': 'dict', 'keys_schema': {'type': 'str'}, 'values_schema': {'type': 'any'}}, 'required': False}, 'serialization': {'schema': {'type': 'tagged-union', 'discriminator': 'type', 'choices': {'include-exclude-sequence': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['include-exclude-sequence']}, 'required': True}, 'include': {'schema': {'type': 'set', 'items_schema': {'type': 'int'}}, 'required': False}, 'exclude': {'schema': {'type': 'set', 'items_schema': {'type': 'int'}}, 'required': False}}, 'extra_behavior': 'forbid'}, 'none': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'int': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'bool': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'float': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'str': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'bytes': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'bytearray': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'list': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'tuple': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'set': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'frozenset': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'generator': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'dict': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'datetime': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'date': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'time': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'timedelta': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'url': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'multi-host-url': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'json': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'uuid': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'any': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'function-plain': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['function-plain']}, 'required': True}, 'function': {'schema': {'type': 'union', 'choices': [{'type': 'callable'}, {'type': 'callable'}, {'type': 'callable'}, {'type': 'callable'}]}, 'required': True}, 'is_field_serializer': {'schema': {'type': 'bool'}, 'required': False}, 'info_arg': {'schema': {'type': 'bool'}, 'required': False}, 'return_schema': {'schema': {'type': 'definition-ref', 'schema_ref': 'root-schema'}, 'required': False}, 'when_used': {'schema': {'type': 'literal', 'expected': ['always', 'unless-none', 'json', 'json-unless-none']}, 'required': False}}, 'extra_behavior': 'forbid'}, 'function-wrap': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['function-wrap']}, 'required': True}, 'function': {'schema': {'type': 'union', 'choices': [{'type': 'callable'}, {'type': 'callable'}, {'type': 'callable'}, {'type': 'callable'}]}, 'required': True}, 'is_field_serializer': {'schema': {'type': 'bool'}, 'required': False}, 'info_arg': {'schema': {'type': 'bool'}, 'required': False}, 'schema': {'schema': {'type': 'definition-ref', 'schema_ref': 'root-schema'}, 'required': False}, 'return_schema': {'schema': {'type': 'definition-ref', 'schema_ref': 'root-schema'}, 'required': False}, 'when_used': {'schema': {'type': 'literal', 'expected': ['always', 'unless-none', 'json', 'json-unless-none']}, 'required': False}}, 'extra_behavior': 'forbid'}, 'format': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['format']}, 'required': True}, 'formatting_string': {'schema': {'type': 'str'}, 'required': True}, 'when_used': {'schema': {'type': 'literal', 'expected': ['always', 'unless-none', 'json', 'json-unless-none']}, 'required': False}}, 'extra_behavior': 'forbid'}, 'to-string': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['to-string']}, 'required': True}, 'when_used': {'schema': {'type': 'literal', 'expected': ['always', 'unless-none', 'json', 'json-unless-none']}, 'required': False}}, 'extra_behavior': 'forbid'}, 'model': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['model']}, 'required': True}, 'cls': {'schema': {'type': 'any'}, 'required': True}, 'schema': {'schema': {'type': 'definition-ref', 'schema_ref': 'root-schema'}, 'required': True}}, 'extra_behavior': 'forbid'}}}, 'required': False}}, 'extra_behavior': 'forbid'}, 'tuple': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['tuple']}, 'required': True}, 'items_schema': {'schema': {'type': 'list', 'items_schema': {'type': 'definition-ref', 'schema_ref': 'root-schema'}}, 'required': True}, 'variadic_item_index': {'schema': {'type': 'int'}, 'required': False}, 'min_length': {'schema': {'type': 'int'}, 'required': False}, 'max_length': {'schema': {'type': 'int'}, 'required': False}, 'fail_fast': {'schema': {'type': 'bool'}, 'required': False}, 'strict': {'schema': {'type': 'bool'}, 'required': False}, 'ref': {'schema': {'type': 'str'}, 'required': False}, 'metadata': {'schema': {'type': 'dict', 'keys_schema': {'type': 'str'}, 'values_schema': {'type': 'any'}}, 'required': False}, 'serialization': {'schema': {'type': 'tagged-union', 'discriminator': 'type', 'choices': {'include-exclude-sequence': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['include-exclude-sequence']}, 'required': True}, 'include': {'schema': {'type': 'set', 'items_schema': {'type': 'int'}}, 'required': False}, 'exclude': {'schema': {'type': 'set', 'items_schema': {'type': 'int'}}, 'required': False}}, 'extra_behavior': 'forbid'}, 'none': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'int': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'bool': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'float': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'str': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'bytes': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'bytearray': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'list': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'tuple': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'set': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'frozenset': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'generator': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'dict': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'datetime': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'date': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'time': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'timedelta': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'url': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'multi-host-url': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'json': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'uuid': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'any': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'function-plain': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['function-plain']}, 'required': True}, 'function': {'schema': {'type': 'union', 'choices': [{'type': 'callable'}, {'type': 'callable'}, {'type': 'callable'}, {'type': 'callable'}]}, 'required': True}, 'is_field_serializer': {'schema': {'type': 'bool'}, 'required': False}, 'info_arg': {'schema': {'type': 'bool'}, 'required': False}, 'return_schema': {'schema': {'type': 'definition-ref', 'schema_ref': 'root-schema'}, 'required': False}, 'when_used': {'schema': {'type': 'literal', 'expected': ['always', 'unless-none', 'json', 'json-unless-none']}, 'required': False}}, 'extra_behavior': 'forbid'}, 'function-wrap': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['function-wrap']}, 'required': True}, 'function': {'schema': {'type': 'union', 'choices': [{'type': 'callable'}, {'type': 'callable'}, {'type': 'callable'}, {'type': 'callable'}]}, 'required': True}, 'is_field_serializer': {'schema': {'type': 'bool'}, 'required': False}, 'info_arg': {'schema': {'type': 'bool'}, 'required': False}, 'schema': {'schema': {'type': 'definition-ref', 'schema_ref': 'root-schema'}, 'required': False}, 'return_schema': {'schema': {'type': 'definition-ref', 'schema_ref': 'root-schema'}, 'required': False}, 'when_used': {'schema': {'type': 'literal', 'expected': ['always', 'unless-none', 'json', 'json-unless-none']}, 'required': False}}, 'extra_behavior': 'forbid'}, 'format': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['format']}, 'required': True}, 'formatting_string': {'schema': {'type': 'str'}, 'required': True}, 'when_used': {'schema': {'type': 'literal', 'expected': ['always', 'unless-none', 'json', 'json-unless-none']}, 'required': False}}, 'extra_behavior': 'forbid'}, 'to-string': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['to-string']}, 'required': True}, 'when_used': {'schema': {'type': 'literal', 'expected': ['always', 'unless-none', 'json', 'json-unless-none']}, 'required': False}}, 'extra_behavior': 'forbid'}, 'model': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['model']}, 'required': True}, 'cls': {'schema': {'type': 'any'}, 'required': True}, 'schema': {'schema': {'type': 'definition-ref', 'schema_ref': 'root-schema'}, 'required': True}}, 'extra_behavior': 'forbid'}}}, 'required': False}}, 'extra_behavior': 'forbid'}, 'set': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['set']}, 'required': True}, 'items_schema': {'schema': {'type': 'definition-ref', 'schema_ref': 'root-schema'}, 'required': False}, 'min_length': {'schema': {'type': 'int'}, 'required': False}, 'max_length': {'schema': {'type': 'int'}, 'required': False}, 'fail_fast': {'schema': {'type': 'bool'}, 'required': False}, 'strict': {'schema': {'type': 'bool'}, 'required': False}, 'ref': {'schema': {'type': 'str'}, 'required': False}, 'metadata': {'schema': {'type': 'dict', 'keys_schema': {'type': 'str'}, 'values_schema': {'type': 'any'}}, 'required': False}, 'serialization': {'schema': {'type': 'definition-ref', 'schema_ref': 'ser-schema'}, 'required': False}}, 'extra_behavior': 'forbid'}, 'frozenset': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['frozenset']}, 'required': True}, 'items_schema': {'schema': {'type': 'definition-ref', 'schema_ref': 'root-schema'}, 'required': False}, 'min_length': {'schema': {'type': 'int'}, 'required': False}, 'max_length': {'schema': {'type': 'int'}, 'required': False}, 'fail_fast': {'schema': {'type': 'bool'}, 'required': False}, 'strict': {'schema': {'type': 'bool'}, 'required': False}, 'ref': {'schema': {'type': 'str'}, 'required': False}, 'metadata': {'schema': {'type': 'dict', 'keys_schema': {'type': 'str'}, 'values_schema': {'type': 'any'}}, 'required': False}, 'serialization': {'schema': {'type': 'definition-ref', 'schema_ref': 'ser-schema'}, 'required': False}}, 'extra_behavior': 'forbid'}, 'generator': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['generator']}, 'required': True}, 'items_schema': {'schema': {'type': 'definition-ref', 'schema_ref': 'root-schema'}, 'required': False}, 'min_length': {'schema': {'type': 'int'}, 'required': False}, 'max_length': {'schema': {'type': 'int'}, 'required': False}, 'ref': {'schema': {'type': 'str'}, 'required': False}, 'metadata': {'schema': {'type': 'dict', 'keys_schema': {'type': 'str'}, 'values_schema': {'type': 'any'}}, 'required': False}, 'serialization': {'schema': {'type': 'tagged-union', 'discriminator': 'type', 'choices': {'include-exclude-sequence': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['include-exclude-sequence']}, 'required': True}, 'include': {'schema': {'type': 'set', 'items_schema': {'type': 'int'}}, 'required': False}, 'exclude': {'schema': {'type': 'set', 'items_schema': {'type': 'int'}}, 'required': False}}, 'extra_behavior': 'forbid'}, 'none': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'int': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'bool': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'float': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'str': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'bytes': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'bytearray': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'list': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'tuple': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'set': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'frozenset': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'generator': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'dict': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'datetime': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'date': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'time': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'timedelta': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'url': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'multi-host-url': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'json': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'uuid': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'any': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'function-plain': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['function-plain']}, 'required': True}, 'function': {'schema': {'type': 'union', 'choices': [{'type': 'callable'}, {'type': 'callable'}, {'type': 'callable'}, {'type': 'callable'}]}, 'required': True}, 'is_field_serializer': {'schema': {'type': 'bool'}, 'required': False}, 'info_arg': {'schema': {'type': 'bool'}, 'required': False}, 'return_schema': {'schema': {'type': 'definition-ref', 'schema_ref': 'root-schema'}, 'required': False}, 'when_used': {'schema': {'type': 'literal', 'expected': ['always', 'unless-none', 'json', 'json-unless-none']}, 'required': False}}, 'extra_behavior': 'forbid'}, 'function-wrap': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['function-wrap']}, 'required': True}, 'function': {'schema': {'type': 'union', 'choices': [{'type': 'callable'}, {'type': 'callable'}, {'type': 'callable'}, {'type': 'callable'}]}, 'required': True}, 'is_field_serializer': {'schema': {'type': 'bool'}, 'required': False}, 'info_arg': {'schema': {'type': 'bool'}, 'required': False}, 'schema': {'schema': {'type': 'definition-ref', 'schema_ref': 'root-schema'}, 'required': False}, 'return_schema': {'schema': {'type': 'definition-ref', 'schema_ref': 'root-schema'}, 'required': False}, 'when_used': {'schema': {'type': 'literal', 'expected': ['always', 'unless-none', 'json', 'json-unless-none']}, 'required': False}}, 'extra_behavior': 'forbid'}, 'format': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['format']}, 'required': True}, 'formatting_string': {'schema': {'type': 'str'}, 'required': True}, 'when_used': {'schema': {'type': 'literal', 'expected': ['always', 'unless-none', 'json', 'json-unless-none']}, 'required': False}}, 'extra_behavior': 'forbid'}, 'to-string': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['to-string']}, 'required': True}, 'when_used': {'schema': {'type': 'literal', 'expected': ['always', 'unless-none', 'json', 'json-unless-none']}, 'required': False}}, 'extra_behavior': 'forbid'}, 'model': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['model']}, 'required': True}, 'cls': {'schema': {'type': 'any'}, 'required': True}, 'schema': {'schema': {'type': 'definition-ref', 'schema_ref': 'root-schema'}, 'required': True}}, 'extra_behavior': 'forbid'}}}, 'required': False}}, 'extra_behavior': 'forbid'}, 'dict': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['dict']}, 'required': True}, 'keys_schema': {'schema': {'type': 'definition-ref', 'schema_ref': 'root-schema'}, 'required': False}, 'values_schema': {'schema': {'type': 'definition-ref', 'schema_ref': 'root-schema'}, 'required': False}, 'min_length': {'schema': {'type': 'int'}, 'required': False}, 'max_length': {'schema': {'type': 'int'}, 'required': False}, 'strict': {'schema': {'type': 'bool'}, 'required': False}, 'ref': {'schema': {'type': 'str'}, 'required': False}, 'metadata': {'schema': {'type': 'dict', 'keys_schema': {'type': 'str'}, 'values_schema': {'type': 'any'}}, 'required': False}, 'serialization': {'schema': {'type': 'tagged-union', 'discriminator': 'type', 'choices': {'include-exclude-dict': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['include-exclude-dict']}, 'required': True}, 'include': {'schema': {'type': 'set', 'items_schema': {'type': 'union', 'choices': [{'type': 'int'}, {'type': 'str'}]}}, 'required': False}, 'exclude': {'schema': {'type': 'set', 'items_schema': {'type': 'union', 'choices': [{'type': 'int'}, {'type': 'str'}]}}, 'required': False}}, 'extra_behavior': 'forbid'}, 'none': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'int': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'bool': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'float': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'str': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'bytes': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'bytearray': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'list': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'tuple': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'set': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'frozenset': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'generator': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'dict': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'datetime': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'date': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'time': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'timedelta': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'url': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'multi-host-url': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'json': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'uuid': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'any': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'function-plain': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['function-plain']}, 'required': True}, 'function': {'schema': {'type': 'union', 'choices': [{'type': 'callable'}, {'type': 'callable'}, {'type': 'callable'}, {'type': 'callable'}]}, 'required': True}, 'is_field_serializer': {'schema': {'type': 'bool'}, 'required': False}, 'info_arg': {'schema': {'type': 'bool'}, 'required': False}, 'return_schema': {'schema': {'type': 'definition-ref', 'schema_ref': 'root-schema'}, 'required': False}, 'when_used': {'schema': {'type': 'literal', 'expected': ['always', 'unless-none', 'json', 'json-unless-none']}, 'required': False}}, 'extra_behavior': 'forbid'}, 'function-wrap': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['function-wrap']}, 'required': True}, 'function': {'schema': {'type': 'union', 'choices': [{'type': 'callable'}, {'type': 'callable'}, {'type': 'callable'}, {'type': 'callable'}]}, 'required': True}, 'is_field_serializer': {'schema': {'type': 'bool'}, 'required': False}, 'info_arg': {'schema': {'type': 'bool'}, 'required': False}, 'schema': {'schema': {'type': 'definition-ref', 'schema_ref': 'root-schema'}, 'required': False}, 'return_schema': {'schema': {'type': 'definition-ref', 'schema_ref': 'root-schema'}, 'required': False}, 'when_used': {'schema': {'type': 'literal', 'expected': ['always', 'unless-none', 'json', 'json-unless-none']}, 'required': False}}, 'extra_behavior': 'forbid'}, 'format': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['format']}, 'required': True}, 'formatting_string': {'schema': {'type': 'str'}, 'required': True}, 'when_used': {'schema': {'type': 'literal', 'expected': ['always', 'unless-none', 'json', 'json-unless-none']}, 'required': False}}, 'extra_behavior': 'forbid'}, 'to-string': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['to-string']}, 'required': True}, 'when_used': {'schema': {'type': 'literal', 'expected': ['always', 'unless-none', 'json', 'json-unless-none']}, 'required': False}}, 'extra_behavior': 'forbid'}, 'model': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['model']}, 'required': True}, 'cls': {'schema': {'type': 'any'}, 'required': True}, 'schema': {'schema': {'type': 'definition-ref', 'schema_ref': 'root-schema'}, 'required': True}}, 'extra_behavior': 'forbid'}}}, 'required': False}}, 'extra_behavior': 'forbid'}, 'function-after': {'type': 'typed-dict', 'fields': {'function': {'schema': {'type': 'union', 'choices': [{'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['no-info']}, 'required': True}, 'function': {'schema': {'type': 'callable'}, 'required': True}}, 'extra_behavior': 'forbid'}, {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['with-info']}, 'required': True}, 'function': {'schema': {'type': 'callable'}, 'required': True}, 'field_name': {'schema': {'type': 'str'}, 'required': False}}, 'extra_behavior': 'forbid'}]}, 'required': True}, 'schema': {'schema': {'type': 'definition-ref', 'schema_ref': 'root-schema'}, 'required': True}, 'ref': {'schema': {'type': 'str'}, 'required': False}, 'metadata': {'schema': {'type': 'dict', 'keys_schema': {'type': 'str'}, 'values_schema': {'type': 'any'}}, 'required': False}, 'serialization': {'schema': {'type': 'definition-ref', 'schema_ref': 'ser-schema'}, 'required': False}, 'type': {'schema': {'type': 'literal', 'expected': ['function-after']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'function-before': {'type': 'typed-dict', 'fields': {'function': {'schema': {'type': 'union', 'choices': [{'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['no-info']}, 'required': True}, 'function': {'schema': {'type': 'callable'}, 'required': True}}, 'extra_behavior': 'forbid'}, {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['with-info']}, 'required': True}, 'function': {'schema': {'type': 'callable'}, 'required': True}, 'field_name': {'schema': {'type': 'str'}, 'required': False}}, 'extra_behavior': 'forbid'}]}, 'required': True}, 'schema': {'schema': {'type': 'definition-ref', 'schema_ref': 'root-schema'}, 'required': True}, 'ref': {'schema': {'type': 'str'}, 'required': False}, 'metadata': {'schema': {'type': 'dict', 'keys_schema': {'type': 'str'}, 'values_schema': {'type': 'any'}}, 'required': False}, 'serialization': {'schema': {'type': 'definition-ref', 'schema_ref': 'ser-schema'}, 'required': False}, 'type': {'schema': {'type': 'literal', 'expected': ['function-before']}, 'required': True}, 'json_schema_input_schema': {'schema': {'type': 'definition-ref', 'schema_ref': 'root-schema'}, 'required': False}}, 'extra_behavior': 'forbid'}, 'function-wrap': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['function-wrap']}, 'required': True}, 'function': {'schema': {'type': 'union', 'choices': [{'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['no-info']}, 'required': True}, 'function': {'schema': {'type': 'callable'}, 'required': True}}, 'extra_behavior': 'forbid'}, {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['with-info']}, 'required': True}, 'function': {'schema': {'type': 'callable'}, 'required': True}, 'field_name': {'schema': {'type': 'str'}, 'required': False}}, 'extra_behavior': 'forbid'}]}, 'required': True}, 'schema': {'schema': {'type': 'definition-ref', 'schema_ref': 'root-schema'}, 'required': True}, 'ref': {'schema': {'type': 'str'}, 'required': False}, 'json_schema_input_schema': {'schema': {'type': 'definition-ref', 'schema_ref': 'root-schema'}, 'required': False}, 'metadata': {'schema': {'type': 'dict', 'keys_schema': {'type': 'str'}, 'values_schema': {'type': 'any'}}, 'required': False}, 'serialization': {'schema': {'type': 'definition-ref', 'schema_ref': 'ser-schema'}, 'required': False}}, 'extra_behavior': 'forbid'}, 'function-plain': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['function-plain']}, 'required': True}, 'function': {'schema': {'type': 'union', 'choices': [{'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['no-info']}, 'required': True}, 'function': {'schema': {'type': 'callable'}, 'required': True}}, 'extra_behavior': 'forbid'}, {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['with-info']}, 'required': True}, 'function': {'schema': {'type': 'callable'}, 'required': True}, 'field_name': {'schema': {'type': 'str'}, 'required': False}}, 'extra_behavior': 'forbid'}]}, 'required': True}, 'ref': {'schema': {'type': 'str'}, 'required': False}, 'json_schema_input_schema': {'schema': {'type': 'definition-ref', 'schema_ref': 'root-schema'}, 'required': False}, 'metadata': {'schema': {'type': 'dict', 'keys_schema': {'type': 'str'}, 'values_schema': {'type': 'any'}}, 'required': False}, 'serialization': {'schema': {'type': 'definition-ref', 'schema_ref': 'ser-schema'}, 'required': False}}, 'extra_behavior': 'forbid'}, 'default': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['default']}, 'required': True}, 'schema': {'schema': {'type': 'definition-ref', 'schema_ref': 'root-schema'}, 'required': True}, 'default': {'schema': {'type': 'any'}, 'required': False}, 'default_factory': {'schema': {'type': 'union', 'choices': [{'type': 'callable'}, {'type': 'callable'}]}, 'required': False}, 'default_factory_takes_data': {'schema': {'type': 'bool'}, 'required': False}, 'on_error': {'schema': {'type': 'literal', 'expected': ['raise', 'omit', 'default']}, 'required': False}, 'validate_default': {'schema': {'type': 'bool'}, 'required': False}, 'strict': {'schema': {'type': 'bool'}, 'required': False}, 'ref': {'schema': {'type': 'str'}, 'required': False}, 'metadata': {'schema': {'type': 'dict', 'keys_schema': {'type': 'str'}, 'values_schema': {'type': 'any'}}, 'required': False}, 'serialization': {'schema': {'type': 'definition-ref', 'schema_ref': 'ser-schema'}, 'required': False}}, 'extra_behavior': 'forbid'}, 'nullable': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['nullable']}, 'required': True}, 'schema': {'schema': {'type': 'definition-ref', 'schema_ref': 'root-schema'}, 'required': True}, 'strict': {'schema': {'type': 'bool'}, 'required': False}, 'ref': {'schema': {'type': 'str'}, 'required': False}, 'metadata': {'schema': {'type': 'dict', 'keys_schema': {'type': 'str'}, 'values_schema': {'type': 'any'}}, 'required': False}, 'serialization': {'schema': {'type': 'definition-ref', 'schema_ref': 'ser-schema'}, 'required': False}}, 'extra_behavior': 'forbid'}, 'union': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['union']}, 'required': True}, 'choices': {'schema': {'type': 'list', 'items_schema': {'type': 'union', 'choices': [{'type': 'definition-ref', 'schema_ref': 'root-schema'}, {'type': 'tuple', 'items_schema': [{'type': 'definition-ref', 'schema_ref': 'root-schema'}, {'type': 'str'}]}]}}, 'required': True}, 'auto_collapse': {'schema': {'type': 'bool'}, 'required': False}, 'custom_error_type': {'schema': {'type': 'str'}, 'required': False}, 'custom_error_message': {'schema': {'type': 'str'}, 'required': False}, 'custom_error_context': {'schema': {'type': 'dict', 'keys_schema': {'type': 'str'}, 'values_schema': {'type': 'union', 'choices': [{'type': 'str'}, {'type': 'int'}, {'type': 'float'}]}}, 'required': False}, 'mode': {'schema': {'type': 'literal', 'expected': ['smart', 'left_to_right']}, 'required': False}, 'strict': {'schema': {'type': 'bool'}, 'required': False}, 'ref': {'schema': {'type': 'str'}, 'required': False}, 'metadata': {'schema': {'type': 'dict', 'keys_schema': {'type': 'str'}, 'values_schema': {'type': 'any'}}, 'required': False}, 'serialization': {'schema': {'type': 'definition-ref', 'schema_ref': 'ser-schema'}, 'required': False}}, 'extra_behavior': 'forbid'}, 'tagged-union': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['tagged-union']}, 'required': True}, 'choices': {'schema': {'type': 'dict', 'keys_schema': {'type': 'any'}, 'values_schema': {'type': 'definition-ref', 'schema_ref': 'root-schema'}}, 'required': True}, 'discriminator': {'schema': {'type': 'union', 'choices': [{'type': 'str'}, {'type': 'list', 'items_schema': {'type': 'union', 'choices': [{'type': 'str'}, {'type': 'int'}]}}, {'type': 'list', 'items_schema': {'type': 'list', 'items_schema': {'type': 'union', 'choices': [{'type': 'str'}, {'type': 'int'}]}}}, {'type': 'callable'}]}, 'required': True}, 'custom_error_type': {'schema': {'type': 'str'}, 'required': False}, 'custom_error_message': {'schema': {'type': 'str'}, 'required': False}, 'custom_error_context': {'schema': {'type': 'dict', 'keys_schema': {'type': 'str'}, 'values_schema': {'type': 'union', 'choices': [{'type': 'str'}, {'type': 'int'}, {'type': 'float'}]}}, 'required': False}, 'strict': {'schema': {'type': 'bool'}, 'required': False}, 'from_attributes': {'schema': {'type': 'bool'}, 'required': False}, 'ref': {'schema': {'type': 'str'}, 'required': False}, 'metadata': {'schema': {'type': 'dict', 'keys_schema': {'type': 'str'}, 'values_schema': {'type': 'any'}}, 'required': False}, 'serialization': {'schema': {'type': 'definition-ref', 'schema_ref': 'ser-schema'}, 'required': False}}, 'extra_behavior': 'forbid'}, 'chain': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['chain']}, 'required': True}, 'steps': {'schema': {'type': 'list', 'items_schema': {'type': 'definition-ref', 'schema_ref': 'root-schema'}}, 'required': True}, 'ref': {'schema': {'type': 'str'}, 'required': False}, 'metadata': {'schema': {'type': 'dict', 'keys_schema': {'type': 'str'}, 'values_schema': {'type': 'any'}}, 'required': False}, 'serialization': {'schema': {'type': 'definition-ref', 'schema_ref': 'ser-schema'}, 'required': False}}, 'extra_behavior': 'forbid'}, 'lax-or-strict': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['lax-or-strict']}, 'required': True}, 'lax_schema': {'schema': {'type': 'definition-ref', 'schema_ref': 'root-schema'}, 'required': True}, 'strict_schema': {'schema': {'type': 'definition-ref', 'schema_ref': 'root-schema'}, 'required': True}, 'strict': {'schema': {'type': 'bool'}, 'required': False}, 'ref': {'schema': {'type': 'str'}, 'required': False}, 'metadata': {'schema': {'type': 'dict', 'keys_schema': {'type': 'str'}, 'values_schema': {'type': 'any'}}, 'required': False}, 'serialization': {'schema': {'type': 'definition-ref', 'schema_ref': 'ser-schema'}, 'required': False}}, 'extra_behavior': 'forbid'}, 'json-or-python': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['json-or-python']}, 'required': True}, 'json_schema': {'schema': {'type': 'definition-ref', 'schema_ref': 'root-schema'}, 'required': True}, 'python_schema': {'schema': {'type': 'definition-ref', 'schema_ref': 'root-schema'}, 'required': True}, 'ref': {'schema': {'type': 'str'}, 'required': False}, 'metadata': {'schema': {'type': 'dict', 'keys_schema': {'type': 'str'}, 'values_schema': {'type': 'any'}}, 'required': False}, 'serialization': {'schema': {'type': 'definition-ref', 'schema_ref': 'ser-schema'}, 'required': False}}, 'extra_behavior': 'forbid'}, 'typed-dict': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['typed-dict']}, 'required': True}, 'fields': {'schema': {'type': 'dict', 'keys_schema': {'type': 'str'}, 'values_schema': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['typed-dict-field']}, 'required': True}, 'schema': {'schema': {'type': 'definition-ref', 'schema_ref': 'root-schema'}, 'required': True}, 'required': {'schema': {'type': 'bool'}, 'required': False}, 'validation_alias': {'schema': {'type': 'union', 'choices': [{'type': 'str'}, {'type': 'list', 'items_schema': {'type': 'union', 'choices': [{'type': 'str'}, {'type': 'int'}]}}, {'type': 'list', 'items_schema': {'type': 'list', 'items_schema': {'type': 'union', 'choices': [{'type': 'str'}, {'type': 'int'}]}}}]}, 'required': False}, 'serialization_alias': {'schema': {'type': 'str'}, 'required': False}, 'serialization_exclude': {'schema': {'type': 'bool'}, 'required': False}, 'metadata': {'schema': {'type': 'dict', 'keys_schema': {'type': 'str'}, 'values_schema': {'type': 'any'}}, 'required': False}}, 'extra_behavior': 'forbid'}}, 'required': True}, 'cls': {'schema': {'type': 'any'}, 'required': False}, 'cls_name': {'schema': {'type': 'str'}, 'required': False}, 'computed_fields': {'schema': {'type': 'list', 'items_schema': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['computed-field']}, 'required': True}, 'property_name': {'schema': {'type': 'str'}, 'required': True}, 'return_schema': {'schema': {'type': 'definition-ref', 'schema_ref': 'root-schema'}, 'required': True}, 'alias': {'schema': {'type': 'str'}, 'required': False}, 'metadata': {'schema': {'type': 'dict', 'keys_schema': {'type': 'str'}, 'values_schema': {'type': 'any'}}, 'required': False}}, 'extra_behavior': 'forbid'}}, 'required': False}, 'strict': {'schema': {'type': 'bool'}, 'required': False}, 'extras_schema': {'schema': {'type': 'definition-ref', 'schema_ref': 'root-schema'}, 'required': False}, 'extra_behavior': {'schema': {'type': 'literal', 'expected': ['allow', 'forbid', 'ignore']}, 'required': False}, 'total': {'schema': {'type': 'bool'}, 'required': False}, 'ref': {'schema': {'type': 'str'}, 'required': False}, 'metadata': {'schema': {'type': 'dict', 'keys_schema': {'type': 'str'}, 'values_schema': {'type': 'any'}}, 'required': False}, 'serialization': {'schema': {'type': 'definition-ref', 'schema_ref': 'ser-schema'}, 'required': False}, 'config': {'schema': {'type': 'typed-dict', 'fields': {'title': {'schema': {'type': 'str'}, 'required': False}, 'strict': {'schema': {'type': 'bool'}, 'required': False}, 'extra_fields_behavior': {'schema': {'type': 'literal', 'expected': ['allow', 'forbid', 'ignore']}, 'required': False}, 'typed_dict_total': {'schema': {'type': 'bool'}, 'required': False}, 'from_attributes': {'schema': {'type': 'bool'}, 'required': False}, 'loc_by_alias': {'schema': {'type': 'bool'}, 'required': False}, 'revalidate_instances': {'schema': {'type': 'literal', 'expected': ['always', 'never', 'subclass-instances']}, 'required': False}, 'validate_default': {'schema': {'type': 'bool'}, 'required': False}, 'str_max_length': {'schema': {'type': 'int'}, 'required': False}, 'str_min_length': {'schema': {'type': 'int'}, 'required': False}, 'str_strip_whitespace': {'schema': {'type': 'bool'}, 'required': False}, 'str_to_lower': {'schema': {'type': 'bool'}, 'required': False}, 'str_to_upper': {'schema': {'type': 'bool'}, 'required': False}, 'allow_inf_nan': {'schema': {'type': 'bool'}, 'required': False}, 'ser_json_timedelta': {'schema': {'type': 'literal', 'expected': ['iso8601', 'float']}, 'required': False}, 'ser_json_bytes': {'schema': {'type': 'literal', 'expected': ['utf8', 'base64', 'hex']}, 'required': False}, 'ser_json_inf_nan': {'schema': {'type': 'literal', 'expected': ['null', 'constants', 'strings']}, 'required': False}, 'val_json_bytes': {'schema': {'type': 'literal', 'expected': ['utf8', 'base64', 'hex']}, 'required': False}, 'hide_input_in_errors': {'schema': {'type': 'bool'}, 'required': False}, 'validation_error_cause': {'schema': {'type': 'bool'}, 'required': False}, 'coerce_numbers_to_str': {'schema': {'type': 'bool'}, 'required': False}, 'regex_engine': {'schema': {'type': 'literal', 'expected': ['rust-regex', 'python-re']}, 'required': False}, 'cache_strings': {'schema': {'type': 'union', 'choices': [{'type': 'bool'}, {'type': 'literal', 'expected': ['all', 'keys', 'none']}]}, 'required': False}, 'validate_by_alias': {'schema': {'type': 'bool'}, 'required': False}, 'validate_by_name': {'schema': {'type': 'bool'}, 'required': False}, 'serialize_by_alias': {'schema': {'type': 'bool'}, 'required': False}}, 'extra_behavior': 'forbid'}, 'required': False}}, 'extra_behavior': 'forbid'}, 'model-fields': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['model-fields']}, 'required': True}, 'fields': {'schema': {'type': 'dict', 'keys_schema': {'type': 'str'}, 'values_schema': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['model-field']}, 'required': True}, 'schema': {'schema': {'type': 'definition-ref', 'schema_ref': 'root-schema'}, 'required': True}, 'validation_alias': {'schema': {'type': 'union', 'choices': [{'type': 'str'}, {'type': 'list', 'items_schema': {'type': 'union', 'choices': [{'type': 'str'}, {'type': 'int'}]}}, {'type': 'list', 'items_schema': {'type': 'list', 'items_schema': {'type': 'union', 'choices': [{'type': 'str'}, {'type': 'int'}]}}}]}, 'required': False}, 'serialization_alias': {'schema': {'type': 'str'}, 'required': False}, 'serialization_exclude': {'schema': {'type': 'bool'}, 'required': False}, 'frozen': {'schema': {'type': 'bool'}, 'required': False}, 'metadata': {'schema': {'type': 'dict', 'keys_schema': {'type': 'str'}, 'values_schema': {'type': 'any'}}, 'required': False}}, 'extra_behavior': 'forbid'}}, 'required': True}, 'model_name': {'schema': {'type': 'str'}, 'required': False}, 'computed_fields': {'schema': {'type': 'list', 'items_schema': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['computed-field']}, 'required': True}, 'property_name': {'schema': {'type': 'str'}, 'required': True}, 'return_schema': {'schema': {'type': 'definition-ref', 'schema_ref': 'root-schema'}, 'required': True}, 'alias': {'schema': {'type': 'str'}, 'required': False}, 'metadata': {'schema': {'type': 'dict', 'keys_schema': {'type': 'str'}, 'values_schema': {'type': 'any'}}, 'required': False}}, 'extra_behavior': 'forbid'}}, 'required': False}, 'strict': {'schema': {'type': 'bool'}, 'required': False}, 'extras_schema': {'schema': {'type': 'definition-ref', 'schema_ref': 'root-schema'}, 'required': False}, 'extras_keys_schema': {'schema': {'type': 'definition-ref', 'schema_ref': 'root-schema'}, 'required': False}, 'extra_behavior': {'schema': {'type': 'literal', 'expected': ['allow', 'forbid', 'ignore']}, 'required': False}, 'from_attributes': {'schema': {'type': 'bool'}, 'required': False}, 'ref': {'schema': {'type': 'str'}, 'required': False}, 'metadata': {'schema': {'type': 'dict', 'keys_schema': {'type': 'str'}, 'values_schema': {'type': 'any'}}, 'required': False}, 'serialization': {'schema': {'type': 'definition-ref', 'schema_ref': 'ser-schema'}, 'required': False}}, 'extra_behavior': 'forbid'}, 'model': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['model']}, 'required': True}, 'cls': {'schema': {'type': 'any'}, 'required': True}, 'generic_origin': {'schema': {'type': 'any'}, 'required': False}, 'schema': {'schema': {'type': 'definition-ref', 'schema_ref': 'root-schema'}, 'required': True}, 'custom_init': {'schema': {'type': 'bool'}, 'required': False}, 'root_model': {'schema': {'type': 'bool'}, 'required': False}, 'post_init': {'schema': {'type': 'str'}, 'required': False}, 'revalidate_instances': {'schema': {'type': 'literal', 'expected': ['always', 'never', 'subclass-instances']}, 'required': False}, 'strict': {'schema': {'type': 'bool'}, 'required': False}, 'frozen': {'schema': {'type': 'bool'}, 'required': False}, 'extra_behavior': {'schema': {'type': 'literal', 'expected': ['allow', 'forbid', 'ignore']}, 'required': False}, 'config': {'schema': {'type': 'typed-dict', 'fields': {'title': {'schema': {'type': 'str'}, 'required': False}, 'strict': {'schema': {'type': 'bool'}, 'required': False}, 'extra_fields_behavior': {'schema': {'type': 'literal', 'expected': ['allow', 'forbid', 'ignore']}, 'required': False}, 'typed_dict_total': {'schema': {'type': 'bool'}, 'required': False}, 'from_attributes': {'schema': {'type': 'bool'}, 'required': False}, 'loc_by_alias': {'schema': {'type': 'bool'}, 'required': False}, 'revalidate_instances': {'schema': {'type': 'literal', 'expected': ['always', 'never', 'subclass-instances']}, 'required': False}, 'validate_default': {'schema': {'type': 'bool'}, 'required': False}, 'str_max_length': {'schema': {'type': 'int'}, 'required': False}, 'str_min_length': {'schema': {'type': 'int'}, 'required': False}, 'str_strip_whitespace': {'schema': {'type': 'bool'}, 'required': False}, 'str_to_lower': {'schema': {'type': 'bool'}, 'required': False}, 'str_to_upper': {'schema': {'type': 'bool'}, 'required': False}, 'allow_inf_nan': {'schema': {'type': 'bool'}, 'required': False}, 'ser_json_timedelta': {'schema': {'type': 'literal', 'expected': ['iso8601', 'float']}, 'required': False}, 'ser_json_bytes': {'schema': {'type': 'literal', 'expected': ['utf8', 'base64', 'hex']}, 'required': False}, 'ser_json_inf_nan': {'schema': {'type': 'literal', 'expected': ['null', 'constants', 'strings']}, 'required': False}, 'val_json_bytes': {'schema': {'type': 'literal', 'expected': ['utf8', 'base64', 'hex']}, 'required': False}, 'hide_input_in_errors': {'schema': {'type': 'bool'}, 'required': False}, 'validation_error_cause': {'schema': {'type': 'bool'}, 'required': False}, 'coerce_numbers_to_str': {'schema': {'type': 'bool'}, 'required': False}, 'regex_engine': {'schema': {'type': 'literal', 'expected': ['rust-regex', 'python-re']}, 'required': False}, 'cache_strings': {'schema': {'type': 'union', 'choices': [{'type': 'bool'}, {'type': 'literal', 'expected': ['all', 'keys', 'none']}]}, 'required': False}, 'validate_by_alias': {'schema': {'type': 'bool'}, 'required': False}, 'validate_by_name': {'schema': {'type': 'bool'}, 'required': False}, 'serialize_by_alias': {'schema': {'type': 'bool'}, 'required': False}}, 'extra_behavior': 'forbid'}, 'required': False}, 'ref': {'schema': {'type': 'str'}, 'required': False}, 'metadata': {'schema': {'type': 'dict', 'keys_schema': {'type': 'str'}, 'values_schema': {'type': 'any'}}, 'required': False}, 'serialization': {'schema': {'type': 'definition-ref', 'schema_ref': 'ser-schema'}, 'required': False}}, 'extra_behavior': 'forbid'}, 'dataclass-args': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['dataclass-args']}, 'required': True}, 'dataclass_name': {'schema': {'type': 'str'}, 'required': True}, 'fields': {'schema': {'type': 'list', 'items_schema': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['dataclass-field']}, 'required': True}, 'name': {'schema': {'type': 'str'}, 'required': True}, 'schema': {'schema': {'type': 'definition-ref', 'schema_ref': 'root-schema'}, 'required': True}, 'kw_only': {'schema': {'type': 'bool'}, 'required': False}, 'init': {'schema': {'type': 'bool'}, 'required': False}, 'init_only': {'schema': {'type': 'bool'}, 'required': False}, 'frozen': {'schema': {'type': 'bool'}, 'required': False}, 'validation_alias': {'schema': {'type': 'union', 'choices': [{'type': 'str'}, {'type': 'list', 'items_schema': {'type': 'union', 'choices': [{'type': 'str'}, {'type': 'int'}]}}, {'type': 'list', 'items_schema': {'type': 'list', 'items_schema': {'type': 'union', 'choices': [{'type': 'str'}, {'type': 'int'}]}}}]}, 'required': False}, 'serialization_alias': {'schema': {'type': 'str'}, 'required': False}, 'serialization_exclude': {'schema': {'type': 'bool'}, 'required': False}, 'metadata': {'schema': {'type': 'dict', 'keys_schema': {'type': 'str'}, 'values_schema': {'type': 'any'}}, 'required': False}}, 'extra_behavior': 'forbid'}}, 'required': True}, 'computed_fields': {'schema': {'type': 'list', 'items_schema': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['computed-field']}, 'required': True}, 'property_name': {'schema': {'type': 'str'}, 'required': True}, 'return_schema': {'schema': {'type': 'definition-ref', 'schema_ref': 'root-schema'}, 'required': True}, 'alias': {'schema': {'type': 'str'}, 'required': False}, 'metadata': {'schema': {'type': 'dict', 'keys_schema': {'type': 'str'}, 'values_schema': {'type': 'any'}}, 'required': False}}, 'extra_behavior': 'forbid'}}, 'required': False}, 'collect_init_only': {'schema': {'type': 'bool'}, 'required': False}, 'ref': {'schema': {'type': 'str'}, 'required': False}, 'metadata': {'schema': {'type': 'dict', 'keys_schema': {'type': 'str'}, 'values_schema': {'type': 'any'}}, 'required': False}, 'serialization': {'schema': {'type': 'definition-ref', 'schema_ref': 'ser-schema'}, 'required': False}, 'extra_behavior': {'schema': {'type': 'literal', 'expected': ['allow', 'forbid', 'ignore']}, 'required': False}}, 'extra_behavior': 'forbid'}, 'dataclass': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['dataclass']}, 'required': True}, 'cls': {'schema': {'type': 'any'}, 'required': True}, 'generic_origin': {'schema': {'type': 'any'}, 'required': False}, 'schema': {'schema': {'type': 'definition-ref', 'schema_ref': 'root-schema'}, 'required': True}, 'fields': {'schema': {'type': 'list', 'items_schema': {'type': 'str'}}, 'required': True}, 'cls_name': {'schema': {'type': 'str'}, 'required': False}, 'post_init': {'schema': {'type': 'bool'}, 'required': False}, 'revalidate_instances': {'schema': {'type': 'literal', 'expected': ['always', 'never', 'subclass-instances']}, 'required': False}, 'strict': {'schema': {'type': 'bool'}, 'required': False}, 'frozen': {'schema': {'type': 'bool'}, 'required': False}, 'ref': {'schema': {'type': 'str'}, 'required': False}, 'metadata': {'schema': {'type': 'dict', 'keys_schema': {'type': 'str'}, 'values_schema': {'type': 'any'}}, 'required': False}, 'serialization': {'schema': {'type': 'definition-ref', 'schema_ref': 'ser-schema'}, 'required': False}, 'slots': {'schema': {'type': 'bool'}, 'required': False}, 'config': {'schema': {'type': 'typed-dict', 'fields': {'title': {'schema': {'type': 'str'}, 'required': False}, 'strict': {'schema': {'type': 'bool'}, 'required': False}, 'extra_fields_behavior': {'schema': {'type': 'literal', 'expected': ['allow', 'forbid', 'ignore']}, 'required': False}, 'typed_dict_total': {'schema': {'type': 'bool'}, 'required': False}, 'from_attributes': {'schema': {'type': 'bool'}, 'required': False}, 'loc_by_alias': {'schema': {'type': 'bool'}, 'required': False}, 'revalidate_instances': {'schema': {'type': 'literal', 'expected': ['always', 'never', 'subclass-instances']}, 'required': False}, 'validate_default': {'schema': {'type': 'bool'}, 'required': False}, 'str_max_length': {'schema': {'type': 'int'}, 'required': False}, 'str_min_length': {'schema': {'type': 'int'}, 'required': False}, 'str_strip_whitespace': {'schema': {'type': 'bool'}, 'required': False}, 'str_to_lower': {'schema': {'type': 'bool'}, 'required': False}, 'str_to_upper': {'schema': {'type': 'bool'}, 'required': False}, 'allow_inf_nan': {'schema': {'type': 'bool'}, 'required': False}, 'ser_json_timedelta': {'schema': {'type': 'literal', 'expected': ['iso8601', 'float']}, 'required': False}, 'ser_json_bytes': {'schema': {'type': 'literal', 'expected': ['utf8', 'base64', 'hex']}, 'required': False}, 'ser_json_inf_nan': {'schema': {'type': 'literal', 'expected': ['null', 'constants', 'strings']}, 'required': False}, 'val_json_bytes': {'schema': {'type': 'literal', 'expected': ['utf8', 'base64', 'hex']}, 'required': False}, 'hide_input_in_errors': {'schema': {'type': 'bool'}, 'required': False}, 'validation_error_cause': {'schema': {'type': 'bool'}, 'required': False}, 'coerce_numbers_to_str': {'schema': {'type': 'bool'}, 'required': False}, 'regex_engine': {'schema': {'type': 'literal', 'expected': ['rust-regex', 'python-re']}, 'required': False}, 'cache_strings': {'schema': {'type': 'union', 'choices': [{'type': 'bool'}, {'type': 'literal', 'expected': ['all', 'keys', 'none']}]}, 'required': False}, 'validate_by_alias': {'schema': {'type': 'bool'}, 'required': False}, 'validate_by_name': {'schema': {'type': 'bool'}, 'required': False}, 'serialize_by_alias': {'schema': {'type': 'bool'}, 'required': False}}, 'extra_behavior': 'forbid'}, 'required': False}}, 'extra_behavior': 'forbid'}, 'arguments': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['arguments']}, 'required': True}, 'arguments_schema': {'schema': {'type': 'list', 'items_schema': {'type': 'typed-dict', 'fields': {'name': {'schema': {'type': 'str'}, 'required': True}, 'schema': {'schema': {'type': 'definition-ref', 'schema_ref': 'root-schema'}, 'required': True}, 'mode': {'schema': {'type': 'literal', 'expected': ['positional_only', 'positional_or_keyword', 'keyword_only']}, 'required': False}, 'alias': {'schema': {'type': 'union', 'choices': [{'type': 'str'}, {'type': 'list', 'items_schema': {'type': 'union', 'choices': [{'type': 'str'}, {'type': 'int'}]}}, {'type': 'list', 'items_schema': {'type': 'list', 'items_schema': {'type': 'union', 'choices': [{'type': 'str'}, {'type': 'int'}]}}}]}, 'required': False}}, 'extra_behavior': 'forbid'}}, 'required': True}, 'validate_by_name': {'schema': {'type': 'bool'}, 'required': False}, 'validate_by_alias': {'schema': {'type': 'bool'}, 'required': False}, 'var_args_schema': {'schema': {'type': 'definition-ref', 'schema_ref': 'root-schema'}, 'required': False}, 'var_kwargs_mode': {'schema': {'type': 'literal', 'expected': ['uniform', 'unpacked-typed-dict']}, 'required': False}, 'var_kwargs_schema': {'schema': {'type': 'definition-ref', 'schema_ref': 'root-schema'}, 'required': False}, 'ref': {'schema': {'type': 'str'}, 'required': False}, 'metadata': {'schema': {'type': 'dict', 'keys_schema': {'type': 'str'}, 'values_schema': {'type': 'any'}}, 'required': False}, 'serialization': {'schema': {'type': 'definition-ref', 'schema_ref': 'ser-schema'}, 'required': False}}, 'extra_behavior': 'forbid'}, 'arguments-v3': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['arguments-v3']}, 'required': True}, 'arguments_schema': {'schema': {'type': 'list', 'items_schema': {'type': 'typed-dict', 'fields': {'name': {'schema': {'type': 'str'}, 'required': True}, 'schema': {'schema': {'type': 'definition-ref', 'schema_ref': 'root-schema'}, 'required': True}, 'mode': {'schema': {'type': 'literal', 'expected': ['positional_only', 'positional_or_keyword', 'keyword_only', 'var_args', 'var_kwargs_uniform', 'var_kwargs_unpacked_typed_dict']}, 'required': False}, 'alias': {'schema': {'type': 'union', 'choices': [{'type': 'str'}, {'type': 'list', 'items_schema': {'type': 'union', 'choices': [{'type': 'str'}, {'type': 'int'}]}}, {'type': 'list', 'items_schema': {'type': 'list', 'items_schema': {'type': 'union', 'choices': [{'type': 'str'}, {'type': 'int'}]}}}]}, 'required': False}}, 'extra_behavior': 'forbid'}}, 'required': True}, 'validate_by_name': {'schema': {'type': 'bool'}, 'required': False}, 'validate_by_alias': {'schema': {'type': 'bool'}, 'required': False}, 'extra_behavior': {'schema': {'type': 'literal', 'expected': ['forbid', 'ignore']}, 'required': False}, 'ref': {'schema': {'type': 'str'}, 'required': False}, 'metadata': {'schema': {'type': 'dict', 'keys_schema': {'type': 'str'}, 'values_schema': {'type': 'any'}}, 'required': False}, 'serialization': {'schema': {'type': 'definition-ref', 'schema_ref': 'ser-schema'}, 'required': False}}, 'extra_behavior': 'forbid'}, 'call': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['call']}, 'required': True}, 'arguments_schema': {'schema': {'type': 'definition-ref', 'schema_ref': 'root-schema'}, 'required': True}, 'function': {'schema': {'type': 'callable'}, 'required': True}, 'function_name': {'schema': {'type': 'str'}, 'required': False}, 'return_schema': {'schema': {'type': 'definition-ref', 'schema_ref': 'root-schema'}, 'required': False}, 'ref': {'schema': {'type': 'str'}, 'required': False}, 'metadata': {'schema': {'type': 'dict', 'keys_schema': {'type': 'str'}, 'values_schema': {'type': 'any'}}, 'required': False}, 'serialization': {'schema': {'type': 'definition-ref', 'schema_ref': 'ser-schema'}, 'required': False}}, 'extra_behavior': 'forbid'}, 'custom-error': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['custom-error']}, 'required': True}, 'schema': {'schema': {'type': 'definition-ref', 'schema_ref': 'root-schema'}, 'required': True}, 'custom_error_type': {'schema': {'type': 'str'}, 'required': True}, 'custom_error_message': {'schema': {'type': 'str'}, 'required': False}, 'custom_error_context': {'schema': {'type': 'dict', 'keys_schema': {'type': 'str'}, 'values_schema': {'type': 'union', 'choices': [{'type': 'str'}, {'type': 'int'}, {'type': 'float'}]}}, 'required': False}, 'ref': {'schema': {'type': 'str'}, 'required': False}, 'metadata': {'schema': {'type': 'dict', 'keys_schema': {'type': 'str'}, 'values_schema': {'type': 'any'}}, 'required': False}, 'serialization': {'schema': {'type': 'definition-ref', 'schema_ref': 'ser-schema'}, 'required': False}}, 'extra_behavior': 'forbid'}, 'json': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['json']}, 'required': True}, 'schema': {'schema': {'type': 'definition-ref', 'schema_ref': 'root-schema'}, 'required': False}, 'ref': {'schema': {'type': 'str'}, 'required': False}, 'metadata': {'schema': {'type': 'dict', 'keys_schema': {'type': 'str'}, 'values_schema': {'type': 'any'}}, 'required': False}, 'serialization': {'schema': {'type': 'definition-ref', 'schema_ref': 'ser-schema'}, 'required': False}}, 'extra_behavior': 'forbid'}, 'url': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['url']}, 'required': True}, 'max_length': {'schema': {'type': 'int'}, 'required': False}, 'allowed_schemes': {'schema': {'type': 'list', 'items_schema': {'type': 'str'}}, 'required': False}, 'host_required': {'schema': {'type': 'bool'}, 'required': False}, 'default_host': {'schema': {'type': 'str'}, 'required': False}, 'default_port': {'schema': {'type': 'int'}, 'required': False}, 'default_path': {'schema': {'type': 'str'}, 'required': False}, 'strict': {'schema': {'type': 'bool'}, 'required': False}, 'ref': {'schema': {'type': 'str'}, 'required': False}, 'metadata': {'schema': {'type': 'dict', 'keys_schema': {'type': 'str'}, 'values_schema': {'type': 'any'}}, 'required': False}, 'serialization': {'schema': {'type': 'definition-ref', 'schema_ref': 'ser-schema'}, 'required': False}}, 'extra_behavior': 'forbid'}, 'multi-host-url': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['multi-host-url']}, 'required': True}, 'max_length': {'schema': {'type': 'int'}, 'required': False}, 'allowed_schemes': {'schema': {'type': 'list', 'items_schema': {'type': 'str'}}, 'required': False}, 'host_required': {'schema': {'type': 'bool'}, 'required': False}, 'default_host': {'schema': {'type': 'str'}, 'required': False}, 'default_port': {'schema': {'type': 'int'}, 'required': False}, 'default_path': {'schema': {'type': 'str'}, 'required': False}, 'strict': {'schema': {'type': 'bool'}, 'required': False}, 'ref': {'schema': {'type': 'str'}, 'required': False}, 'metadata': {'schema': {'type': 'dict', 'keys_schema': {'type': 'str'}, 'values_schema': {'type': 'any'}}, 'required': False}, 'serialization': {'schema': {'type': 'definition-ref', 'schema_ref': 'ser-schema'}, 'required': False}}, 'extra_behavior': 'forbid'}, 'definitions': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['definitions']}, 'required': True}, 'schema': {'schema': {'type': 'definition-ref', 'schema_ref': 'root-schema'}, 'required': True}, 'definitions': {'schema': {'type': 'list', 'items_schema': {'type': 'definition-ref', 'schema_ref': 'root-schema'}}, 'required': True}, 'metadata': {'schema': {'type': 'dict', 'keys_schema': {'type': 'str'}, 'values_schema': {'type': 'any'}}, 'required': False}, 'serialization': {'schema': {'type': 'definition-ref', 'schema_ref': 'ser-schema'}, 'required': False}}, 'extra_behavior': 'forbid'}, 'definition-ref': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['definition-ref']}, 'required': True}, 'schema_ref': {'schema': {'type': 'str'}, 'required': True}, 'ref': {'schema': {'type': 'str'}, 'required': False}, 'metadata': {'schema': {'type': 'dict', 'keys_schema': {'type': 'str'}, 'values_schema': {'type': 'any'}}, 'required': False}, 'serialization': {'schema': {'type': 'definition-ref', 'schema_ref': 'ser-schema'}, 'required': False}}, 'extra_behavior': 'forbid'}, 'uuid': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['uuid']}, 'required': True}, 'version': {'schema': {'type': 'literal', 'expected': [1, 3, 4, 5, 7]}, 'required': False}, 'strict': {'schema': {'type': 'bool'}, 'required': False}, 'ref': {'schema': {'type': 'str'}, 'required': False}, 'metadata': {'schema': {'type': 'dict', 'keys_schema': {'type': 'str'}, 'values_schema': {'type': 'any'}}, 'required': False}, 'serialization': {'schema': {'type': 'definition-ref', 'schema_ref': 'ser-schema'}, 'required': False}}, 'extra_behavior': 'forbid'}, 'complex': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['complex']}, 'required': True}, 'strict': {'schema': {'type': 'bool'}, 'required': False}, 'ref': {'schema': {'type': 'str'}, 'required': False}, 'metadata': {'schema': {'type': 'dict', 'keys_schema': {'type': 'str'}, 'values_schema': {'type': 'any'}}, 'required': False}, 'serialization': {'schema': {'type': 'definition-ref', 'schema_ref': 'ser-schema'}, 'required': False}}, 'extra_behavior': 'forbid'}}, 'discriminator': 'type', 'ref': 'root-schema'}, {'type': 'tagged-union', 'discriminator': 'type', 'choices': {'none': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'int': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'bool': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'float': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'str': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'bytes': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'bytearray': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'list': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'tuple': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'set': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'frozenset': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'generator': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'dict': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'datetime': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'date': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'time': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'timedelta': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'url': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'multi-host-url': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'json': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'uuid': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'any': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['none', 'int', 'bool', 'float', 'str', 'bytes', 'bytearray', 'list', 'tuple', 'set', 'frozenset', 'generator', 'dict', 'datetime', 'date', 'time', 'timedelta', 'url', 'multi-host-url', 'json', 'uuid', 'any']}, 'required': True}}, 'extra_behavior': 'forbid'}, 'function-plain': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['function-plain']}, 'required': True}, 'function': {'schema': {'type': 'union', 'choices': [{'type': 'callable'}, {'type': 'callable'}, {'type': 'callable'}, {'type': 'callable'}]}, 'required': True}, 'is_field_serializer': {'schema': {'type': 'bool'}, 'required': False}, 'info_arg': {'schema': {'type': 'bool'}, 'required': False}, 'return_schema': {'schema': {'type': 'definition-ref', 'schema_ref': 'root-schema'}, 'required': False}, 'when_used': {'schema': {'type': 'literal', 'expected': ['always', 'unless-none', 'json', 'json-unless-none']}, 'required': False}}, 'extra_behavior': 'forbid'}, 'function-wrap': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['function-wrap']}, 'required': True}, 'function': {'schema': {'type': 'union', 'choices': [{'type': 'callable'}, {'type': 'callable'}, {'type': 'callable'}, {'type': 'callable'}]}, 'required': True}, 'is_field_serializer': {'schema': {'type': 'bool'}, 'required': False}, 'info_arg': {'schema': {'type': 'bool'}, 'required': False}, 'schema': {'schema': {'type': 'definition-ref', 'schema_ref': 'root-schema'}, 'required': False}, 'return_schema': {'schema': {'type': 'definition-ref', 'schema_ref': 'root-schema'}, 'required': False}, 'when_used': {'schema': {'type': 'literal', 'expected': ['always', 'unless-none', 'json', 'json-unless-none']}, 'required': False}}, 'extra_behavior': 'forbid'}, 'format': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['format']}, 'required': True}, 'formatting_string': {'schema': {'type': 'str'}, 'required': True}, 'when_used': {'schema': {'type': 'literal', 'expected': ['always', 'unless-none', 'json', 'json-unless-none']}, 'required': False}}, 'extra_behavior': 'forbid'}, 'to-string': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['to-string']}, 'required': True}, 'when_used': {'schema': {'type': 'literal', 'expected': ['always', 'unless-none', 'json', 'json-unless-none']}, 'required': False}}, 'extra_behavior': 'forbid'}, 'model': {'type': 'typed-dict', 'fields': {'type': {'schema': {'type': 'literal', 'expected': ['model']}, 'required': True}, 'cls': {'schema': {'type': 'any'}, 'required': True}, 'schema': {'schema': {'type': 'definition-ref', 'schema_ref': 'root-schema'}, 'required': True}}, 'extra_behavior': 'forbid'}}, 'ref': 'ser-schema'}]}+self_schema = {+    'type': 'definitions',+    'schema': {'type': 'definition-ref', 'schema_ref': 'root-schema'},+    'definitions': [+        {+            'type': 'tagged-union',+            'choices': {+                'invalid': {+                    'type': 'typed-dict',+                    'fields': {+                        'type': {'schema': {'type': 'literal', 'expected': ['invalid']}, 'required': True},+                        'ref': {'schema': {'type': 'str'}, 'required': False},+                        'metadata': {+                            'schema': {+                                'type': 'dict',+                                'keys_schema': {'type': 'str'},+                                'values_schema': {'type': 'any'},+                            },+                            'required': False,+                        },+                        'serialization': {+                            'schema': {'type': 'definition-ref', 'schema_ref': 'ser-schema'},+                            'required': False,+                        },+                    },+                    'extra_behavior': 'forbid',+                },+                'any': {+                    'type': 'typed-dict',+                    'fields': {+                        'type': {'schema': {'type': 'literal', 'expected': ['any']}, 'required': True},+                        'ref': {'schema': {'type': 'str'}, 'required': False},+                        'metadata': {+                            'schema': {+                                'type': 'dict',+                                'keys_schema': {'type': 'str'},+                                'values_schema': {'type': 'any'},+                            },+                            'required': False,+                        },+                        'serialization': {+                            'schema': {'type': 'definition-ref', 'schema_ref': 'ser-schema'},+                            'required': False,+                        },+                    },+                    'extra_behavior': 'forbid',+                },+                'none': {+                    'type': 'typed-dict',+                    'fields': {+                        'type': {'schema': {'type': 'literal', 'expected': ['none']}, 'required': True},+                        'ref': {'schema': {'type': 'str'}, 'required': False},+                        'metadata': {+                            'schema': {+                                'type': 'dict',+                                'keys_schema': {'type': 'str'},+                                'values_schema': {'type': 'any'},+                            },+                            'required': False,+                        },+                        'serialization': {+                            'schema': {'type': 'definition-ref', 'schema_ref': 'ser-schema'},+                            'required': False,+                        },+                    },+                    'extra_behavior': 'forbid',+                },+                'bool': {+                    'type': 'typed-dict',+                    'fields': {+                        'type': {'schema': {'type': 'literal', 'expected': ['bool']}, 'required': True},+                        'strict': {'schema': {'type': 'bool'}, 'required': False},+                        'ref': {'schema': {'type': 'str'}, 'required': False},+                        'metadata': {+                            'schema': {+                                'type': 'dict',+                                'keys_schema': {'type': 'str'},+                                'values_schema': {'type': 'any'},+                            },+                            'required': False,+                        },+                        'serialization': {+                            'schema': {'type': 'definition-ref', 'schema_ref': 'ser-schema'},+                            'required': False,+                        },+                    },+                    'extra_behavior': 'forbid',+                },+                'int': {+                    'type': 'typed-dict',+                    'fields': {+                        'type': {'schema': {'type': 'literal', 'expected': ['int']}, 'required': True},+                        'multiple_of': {'schema': {'type': 'int'}, 'required': False},+                        'le': {'schema': {'type': 'int'}, 'required': False},+                        'ge': {'schema': {'type': 'int'}, 'required': False},+                        'lt': {'schema': {'type': 'int'}, 'required': False},+                        'gt': {'schema': {'type': 'int'}, 'required': False},+                        'strict': {'schema': {'type': 'bool'}, 'required': False},+                        'ref': {'schema': {'type': 'str'}, 'required': False},+                        'metadata': {+                            'schema': {+                                'type': 'dict',+                                'keys_schema': {'type': 'str'},+                                'values_schema': {'type': 'any'},+                            },+                            'required': False,+                        },+                        'serialization': {+                            'schema': {'type': 'definition-ref', 'schema_ref': 'ser-schema'},+                            'required': False,+                        },+                    },+                    'extra_behavior': 'forbid',+                },+                'float': {+                    'type': 'typed-dict',+                    'fields': {+                        'type': {'schema': {'type': 'literal', 'expected': ['float']}, 'required': True},+                        'allow_inf_nan': {'schema': {'type': 'bool'}, 'required': False},+                        'multiple_of': {'schema': {'type': 'float'}, 'required': False},+                        'le': {'schema': {'type': 'float'}, 'required': False},+                        'ge': {'schema': {'type': 'float'}, 'required': False},+                        'lt': {'schema': {'type': 'float'}, 'required': False},+                        'gt': {'schema': {'type': 'float'}, 'required': False},+                        'strict': {'schema': {'type': 'bool'}, 'required': False},+                        'ref': {'schema': {'type': 'str'}, 'required': False},+                        'metadata': {+                            'schema': {+                                'type': 'dict',+                                'keys_schema': {'type': 'str'},+                                'values_schema': {'type': 'any'},+                            },+                            'required': False,+                        },+                        'serialization': {+                            'schema': {'type': 'definition-ref', 'schema_ref': 'ser-schema'},+                            'required': False,+                        },+                    },+                    'extra_behavior': 'forbid',+                },+                'decimal': {+                    'type': 'typed-dict',+                    'fields': {+                        'type': {'schema': {'type': 'literal', 'expected': ['decimal']}, 'required': True},+                        'allow_inf_nan': {'schema': {'type': 'bool'}, 'required': False},+                        'multiple_of': {'schema': {'type': 'decimal'}, 'required': False},+                        'le': {'schema': {'type': 'decimal'}, 'required': False},+                        'ge': {'schema': {'type': 'decimal'}, 'required': False},+                        'lt': {'schema': {'type': 'decimal'}, 'required': False},+                        'gt': {'schema': {'type': 'decimal'}, 'required': False},+                        'max_digits': {'schema': {'type': 'int'}, 'required': False},+                        'decimal_places': {'schema': {'type': 'int'}, 'required': False},+                        'strict': {'schema': {'type': 'bool'}, 'required': False},+                        'ref': {'schema': {'type': 'str'}, 'required': False},+                        'metadata': {+                            'schema': {+                                'type': 'dict',+                                'keys_schema': {'type': 'str'},+                                'values_schema': {'type': 'any'},+                            },+                            'required': False,+                        },+                        'serialization': {+                            'schema': {'type': 'definition-ref', 'schema_ref': 'ser-schema'},+                            'required': False,+                        },+                    },+                    'extra_behavior': 'forbid',+                },+                'str': {+                    'type': 'typed-dict',+                    'fields': {+                        'type': {'schema': {'type': 'literal', 'expected': ['str']}, 'required': True},+                        'pattern': {+                            'schema': {'type': 'union', 'choices': [{'type': 'str'}, {'type': 'any'}]},+                            'required': False,+                        },+                        'max_length': {'schema': {'type': 'int'}, 'required': False},+                        'min_length': {'schema': {'type': 'int'}, 'required': False},+                        'strip_whitespace': {'schema': {'type': 'bool'}, 'required': False},+                        'to_lower': {'schema': {'type': 'bool'}, 'required': False},+                        'to_upper': {'schema': {'type': 'bool'}, 'required': False},+                        'regex_engine': {+                            'schema': {'type': 'literal', 'expected': ['rust-regex', 'python-re']},+                            'required': False,+                        },+                        'strict': {'schema': {'type': 'bool'}, 'required': False},+                        'coerce_numbers_to_str': {'schema': {'type': 'bool'}, 'required': False},+                        'ref': {'schema': {'type': 'str'}, 'required': False},+                        'metadata': {+                            'schema': {+                                'type': 'dict',+                                'keys_schema': {'type': 'str'},+                                'values_schema': {'type': 'any'},+                            },+                            'required': False,+                        },+                        'serialization': {+                            'schema': {'type': 'definition-ref', 'schema_ref': 'ser-schema'},+                            'required': False,+                        },+                    },+                    'extra_behavior': 'forbid',+                },+                'bytes': {+                    'type': 'typed-dict',+                    'fields': {+                        'type': {'schema': {'type': 'literal', 'expected': ['bytes']}, 'required': True},+                        'max_length': {'schema': {'type': 'int'}, 'required': False},+                        'min_length': {'schema': {'type': 'int'}, 'required': False},+                        'strict': {'schema': {'type': 'bool'}, 'required': False},+                        'ref': {'schema': {'type': 'str'}, 'required': False},+                        'metadata': {+                            'schema': {+                                'type': 'dict',+                                'keys_schema': {'type': 'str'},+                                'values_schema': {'type': 'any'},+                            },+                            'required': False,+                        },+                        'serialization': {+                            'schema': {'type': 'definition-ref', 'schema_ref': 'ser-schema'},+                            'required': False,+                        },+                    },+                    'extra_behavior': 'forbid',+                },+                'date': {+                    'type': 'typed-dict',+                    'fields': {+                        'type': {'schema': {'type': 'literal', 'expected': ['date']}, 'required': True},+                        'strict': {'schema': {'type': 'bool'}, 'required': False},+                        'le': {'schema': {'type': 'date'}, 'required': False},+                        'ge': {'schema': {'type': 'date'}, 'required': False},+                        'lt': {'schema': {'type': 'date'}, 'required': False},+                        'gt': {'schema': {'type': 'date'}, 'required': False},+                        'now_op': {'schema': {'type': 'literal', 'expected': ['past', 'future']}, 'required': False},+                        'now_utc_offset': {'schema': {'type': 'int', 'gt': -86400, 'lt': 86400}, 'required': False},+                        'ref': {'schema': {'type': 'str'}, 'required': False},+                        'metadata': {+                            'schema': {+                                'type': 'dict',+                                'keys_schema': {'type': 'str'},+                                'values_schema': {'type': 'any'},
… 6607 more lines (truncated)
tests/benchmarks/test_nested_benchmark.py +1 lines
--- +++ @@ -4,3 +4,3 @@ -from typing import Callable+from collections.abc import Callable 
tests/conftest.py +2 lines
--- +++ @@ -9,2 +9,3 @@ import sys+from collections.abc import Callable from dataclasses import dataclass@@ -12,3 +13,3 @@ from time import sleep, time-from typing import Any, Callable, Literal+from typing import Any, Literal 
tests/serializers/test_any.py +0 lines
--- +++ @@ -546,3 +546,2 @@ [email protected](sys.version_info < (3, 10), reason='slots are only supported for dataclasses in Python >= 3.10') def test_dataclass_slots(any_serializer):@@ -566,3 +565,2 @@ [email protected](sys.version_info < (3, 10), reason='slots are only supported for dataclasses in Python >= 3.10') def test_dataclass_slots_init_vars(any_serializer):@@ -580,3 +578,2 @@ [email protected](sys.version_info < (3, 10), reason='slots are only supported for dataclasses in Python > 3.10') def test_slots_mixed(any_serializer):
tests/serializers/test_bytes.py +5 lines
--- +++ @@ -90,3 +90,7 @@     'input_value,expected_json',-    [(BytesSubclass(b'foo'), 'foo'), (BytesMixin(b'foo'), 'foo'), (BytesEnum.foo, 'foo-value')],+    [+        pytest.param(BytesSubclass(b'foo'), 'foo', id='BytesSubclass'),+        pytest.param(BytesMixin(b'foo'), 'foo', id='BytesMixin'),+        pytest.param(BytesEnum.foo, 'foo-value', id='BytesEnum'),+    ], )
tests/serializers/test_complex.py +0 lines
--- +++ @@ -21,3 +21,2 @@         (complex(2, float('nan')), '2+NaNj'),-        (complex(2, float('-nan')), '2+NaNj'),     ],
tests/serializers/test_dataclasses.py +0 lines
--- +++ @@ -3,3 +3,2 @@ import platform-import sys from typing import ClassVar@@ -140,3 +139,2 @@ [email protected](sys.version_info < (3, 10), reason='slots are only supported for dataclasses in Python > 3.10') def test_slots_mixed():
tests/serializers/test_literal.py +2 lines
--- +++ @@ -2,3 +2,3 @@ from enum import Enum-from typing import Literal, Union+from typing import Literal @@ -96,3 +96,3 @@     class Yard:-        pet: Union[Dog, Cat]+        pet: Dog | Cat 
tests/serializers/test_model_root.py +3 lines
--- +++ @@ -4,3 +4,3 @@ from pathlib import Path-from typing import Any, Union+from typing import Any @@ -156,3 +156,3 @@         class Model(RootModel):-            root: list[Union[BModel, RModel]]+            root: list[BModel | RModel] @@ -163,3 +163,3 @@         class Model(RootModel):-            root: list[Union[RModel, BModel]]+            root: list[RModel | BModel] 
tests/serializers/test_serialize_as_any.py +2 lines
--- +++ @@ -1,3 +1,4 @@+from collections.abc import Callable from dataclasses import dataclass-from typing import Callable, Optional+from typing import Optional 
tests/serializers/test_simple.py +2 lines
--- +++ @@ -34,3 +34,3 @@     [-        ('int', 1, 1, b'1'),+        pytest.param('int', 1, 1, b'1', id='int-1_int-1_int-1_bytes'),         ('int', int(_BIG_NUMBER_BYTES), int(_BIG_NUMBER_BYTES), _BIG_NUMBER_BYTES),@@ -42,3 +42,3 @@         ('int', IntSubClass(42), IntSubClass(42), b'42'),-        ('int', MyIntEnum.one, MyIntEnum.one, b'1'),+        pytest.param('int', MyIntEnum.one, MyIntEnum.one, b'1', id='int-MyIntEnum.one_int-MyIntEnum.one_int-1_bytes'),         ('float', FloatSubClass(42), FloatSubClass(42), b'42.0'),
tests/serializers/test_string.py +12 lines
--- +++ @@ -44,8 +44,9 @@         ('\U0001d120', '"\\ud834\\udd20"'),-        ('\u03b1\u03a9', '"\\u03b1\\u03a9"'),+        pytest.param('\u03b1\u03a9', '"\\u03b1\\u03a9"', id='\\u03b1\\u03a9'),         ("`1~!@#$%^&*()_+-={':[,]}|;.</>?", '"`1~!@#$%^&*()_+-={\':[,]}|;.</>?"'),-        ('\x08\x0c\n\r\t', '"\\b\\f\\n\\r\\t"'),-        ('\u0123\u4567\u89ab\ucdef\uabcd\uef4a', '"\\u0123\\u4567\\u89ab\\ucdef\\uabcd\\uef4a"'),-        ('\N{GREEK SMALL LETTER ALPHA}\N{GREEK CAPITAL LETTER OMEGA}', '"\\u03b1\\u03a9"'),-        ('\U0001d120', '"\\ud834\\udd20"'),+        pytest.param(+            '\N{GREEK SMALL LETTER ALPHA}\N{GREEK CAPITAL LETTER OMEGA}',+            '"\\u03b1\\u03a9"',+            id='\\N{GREEK SMALL LETTER ALPHA}\\N{GREEK CAPITAL LETTER OMEGA}',+        ),     ],@@ -169,3 +170,8 @@ @pytest.mark.parametrize(-    'input_value,expected', [(StrSubclass('foo'), 'foo'), (StrMixin('foo'), 'foo'), (StrEnum.foo, 'foo-value')]+    'input_value,expected',+    [+        pytest.param(StrSubclass('foo'), 'foo', id='StrSubclass'),+        pytest.param(StrMixin('foo'), 'foo', id='StrMixin'),+        pytest.param(StrEnum.foo, 'foo-value', id='StrEnum'),+    ], )
tests/serializers/test_union.py +3 lines
--- +++ @@ -7,3 +7,3 @@ from decimal import Decimal-from typing import Any, ClassVar, Literal, Union+from typing import Any, ClassVar, Literal @@ -380,4 +380,4 @@     class Model(BaseModel):-        value: Union[Literal[False], str]-        value_types_reversed: Union[str, Literal[False]]+        value: Literal[False] | str+        value_types_reversed: str | Literal[False] 
tests/test_custom_errors.py +2 lines
--- +++ @@ -1,2 +1,2 @@-from typing import Any, Optional+from typing import Any from unittest import TestCase@@ -133,3 +133,3 @@         def __new__(-            cls, error_type: LiteralString, my_custom_setting: str, context: Optional[dict[str, Any]] = None+            cls, error_type: LiteralString, my_custom_setting: str, context: dict[str, Any] | None = None         ) -> Self:
tests/test_docstrings.py +3 lines
--- +++ @@ -5,5 +5,5 @@ -try:+if sys.platform != 'emscripten':     from pytest_examples import CodeExample, EvalExample, find_examples-except ImportError:+else:     # pytest_examples is not installed on emscripten@@ -11,3 +11,3 @@ -    def find_examples(*_directories):+    def find_examples(*args, **kwargs):         return []
tests/test_errors.py +6 lines
--- +++ @@ -7,3 +7,3 @@ from decimal import Decimal-from typing import Any, Optional+from typing import Any @@ -203,3 +203,3 @@ @pytest.mark.parametrize('ctx', [None, {}])-def test_pydantic_error_type_raise_custom_no_ctx(ctx: Optional[dict]):+def test_pydantic_error_type_raise_custom_no_ctx(ctx: dict | None):     def f(input_value, info):@@ -239,3 +239,3 @@ @pytest.mark.parametrize('ctx', [None, {}])-def test_pydantic_custom_error_type_raise_custom_no_ctx(ctx: Optional[dict]):+def test_pydantic_custom_error_type_raise_custom_no_ctx(ctx: dict | None):     def f(input_value, info):@@ -542,3 +542,5 @@         literal = ''.join(f'\n    {e!r},' for e in error_types)-        print(f'python code (end of python/pydantic_core/core_schema.py):\n\nErrorType = Literal[{literal}\n]')+        print(+            f'python code (end of python/pydantic_core/core_schema.py):\n\nErrorType: TypeAlias = Literal[{literal}\n]'+        )         pytest.fail('core_schema.ErrorType needs to be updated')@@ -1127,6 +1129,2 @@ [email protected](-    sys.version_info < (3, 9) and sys.implementation.name == 'pypy',-    reason='PyPy before 3.9 cannot pickle this correctly',-) def test_validation_error_pickle() -> None:
tests/test_json.py +8 lines
--- +++ @@ -32,3 +32,10 @@ [email protected]('input_value', ['[1, 2, 3]', b'[1, 2, 3]', bytearray(b'[1, 2, 3]')])[email protected](+    'input_value',+    [+        pytest.param('[1, 2, 3]', id='[1, 2, 3]_list'),+        pytest.param(b'[1, 2, 3]', id='[1, 2, 3]_bytes'),+        pytest.param(bytearray(b'[1, 2, 3]'), id='[1, 2, 3]_bytearray'),+    ],+) def test_input_types(input_value):
tests/test_misc.py +2 lines
--- +++ @@ -5,3 +5,3 @@ import pytest-from typing_extensions import (+from typing_extensions import (  # noqa: UP035 (for `get_args` and `get_origin`)     get_args,@@ -202,3 +202,3 @@         print(-            f'python code (near end of python/pydantic_core/core_schema.py):\n\nCoreSchemaType = Literal[{literal}\n]'+            f'python code (near end of python/pydantic_core/core_schema.py):\n\nCoreSchemaType: TypeAlias = Literal[{literal}\n]'         )
tests/test_prebuilt.py +1 lines
--- +++ @@ -1,3 +1 @@-from typing import Union- from pydantic_core import SchemaSerializer, SchemaValidator, core_schema@@ -59,3 +57,3 @@ -    def serialize_inner(v: InnerModel, serializer) -> Union[dict[str, str], str]:+    def serialize_inner(v: InnerModel, serializer) -> dict[str, str] | str:         v.x = v.x + ' modified'
tests/test_schema_functions.py +1 lines
--- +++ @@ -6,3 +6,3 @@ import pytest-from typing_extensions import get_args, get_type_hints+from typing_extensions import get_args, get_type_hints  # noqa: UP035 from typing_inspection.introspection import UNKNOWN, AnnotationSource, inspect_annotation
tests/test_strict.py +10 lines
--- +++ @@ -15,10 +15,10 @@     [-        (False, False, 123, 123),-        (False, False, '123', 123),-        (None, False, 123, 123),-        (None, False, '123', 123),+        pytest.param(False, False, 123, 123, id='False-False-123_int-123_int'),+        pytest.param(False, False, '123', 123, id='False-False-123_str-123_int'),+        pytest.param(None, False, 123, 123, id='None-False-123_int-123_int'),+        pytest.param(None, False, '123', 123, id='None-False-123_str-123_int'),         (True, False, 123, 123),         (True, False, '123', Err('Input should be a valid integer [type=int_type')),-        (False, True, 123, 123),-        (False, True, '123', 123),+        pytest.param(False, True, 123, 123, id='False-True-123_int-123_int'),+        pytest.param(False, True, '123', 123, id='False-True-123_str-123_int'),         (None, True, 123, 123),@@ -27,6 +27,6 @@         (True, True, '123', Err('Input should be a valid integer [type=int_type')),-        (False, None, 123, 123),-        (False, None, '123', 123),-        (None, None, 123, 123),-        (None, None, '123', 123),+        pytest.param(False, None, 123, 123, id='False-None-123_int-123_int'),+        pytest.param(False, None, '123', 123, id='False-None-123_str-123_int'),+        pytest.param(None, None, 123, 123, id='None-None-123_int-123_int'),+        pytest.param(None, None, '123', 123, id='None-None-123_str-123_int'),         (True, None, 123, 123),
tests/test_typing.py +2 lines
--- +++ @@ -2,4 +2,5 @@ +from collections.abc import Callable from datetime import date, datetime, time-from typing import Any, Callable+from typing import Any 
requests pypi
2.34.2 16d ago incident on record
critical-tier YANK ×2BURST ×8
latest 2.34.2 versions 163 maintainers 1 critical-tier (snapshotted)
2.31.0
2.32.0
2.32.1
2.32.2
2.32.3
2.32.4
2.32.5
2.33.0
2.33.1
2.34.0
2.34.1
2.34.2
YANK
2.32.0 marked yanked (still downloadable)
high · registry-verified · 2024-05-20 · 2y ago
YANK
2.32.1 marked yanked (still downloadable)
high · registry-verified · 2024-05-20 · 2y ago
BURST
2 releases in 48m: 0.6.3, 0.6.4
info · registry-verified · 2011-10-14 · 14y ago
BURST
2 releases in 21m: 0.7.1, 0.7.2
info · registry-verified · 2011-10-23 · 14y ago
BURST
3 releases in 56m: 0.8.8, 0.8.9, 0.9.0
info · registry-verified · 2011-12-28 · 14y ago
BURST
2 releases in 11m: 1.0.1, 1.0.2
info · registry-verified · 2012-12-17 · 13y ago
BURST
2 releases in 2m: 2.0.0, 2.0.1
info · registry-verified · 2013-11-15 · 12y ago
BURST
2 releases in 15m: 2.9.2, 2.10.0
info · registry-verified · 2016-04-29 · 10y ago
BURST
2 releases in 20m: 2.17.2, 2.17.3
info · registry-verified · 2017-05-29 · 9y ago
BURST
2 releases in 0m: 2.24.0, 2.23.0
info · registry-verified · 2020-06-17 · 5y ago
release diff 2.34.1 → 2.34.2
+0 added · -0 removed · ~6 modified
src/requests/__version__.py +2 lines
--- +++ @@ -7,4 +7,4 @@ __url__ = "https://requests.readthedocs.io"-__version__ = "2.34.1"-__build__ = 0x023401+__version__ = "2.34.2"+__build__ = 0x023402 __author__ = "Kenneth Reitz"
src/requests/_types.py +1 lines
--- +++ @@ -111,3 +111,3 @@ -    HeadersType: TypeAlias = MutableMapping[str, str | bytes] | None+    HeadersType: TypeAlias = Mapping[str, str | bytes] | None 
src/requests/models.py +1 lines
--- +++ @@ -85,3 +85,2 @@ if TYPE_CHECKING:-    from collections.abc import MutableMapping     from http.cookiejar import CookieJar@@ -313,3 +312,3 @@     url: _t.UriType | None-    headers: MutableMapping[str, str | bytes]+    headers: Mapping[str, str | bytes]     files: _t.FilesType
s3transfer pypi
0.18.0 2d ago incident on record
YANKINSTALL-EXEC
latest 0.18.0 versions 60 maintainers 1
0.11.4
0.11.5
0.12.0
0.13.0
0.13.1
0.14.0
0.15.0
0.16.0
0.16.1
0.17.0
0.17.1
0.18.0
YANK
0.8.1 marked yanked (still downloadable)
high · registry-verified · 2023-11-28 · 2y ago
INSTALL-EXEC
setup.py in sdist uses subprocess/exec (runs at pip install)
warn · snapshot-derived
release diff 0.17.1 → 0.18.0
+0 added · -0 removed · ~5 modified
s3transfer/__init__.py +1 lines
--- +++ @@ -147,3 +147,3 @@ __author__ = 'Amazon Web Services'-__version__ = '0.17.1'+__version__ = '0.18.0' 
s3transfer/copies.py +47 lines
--- +++ @@ -74,2 +74,13 @@ +    # Metadata fields to preserve for multipart copies.+    PRESERVED_METADATA_FIELDS = [+        'CacheControl',+        'ContentDisposition',+        'ContentEncoding',+        'ContentLanguage',+        'ContentType',+        'Expires',+        'Metadata',+    ]+     COMPLETE_MULTIPART_ARGS = [@@ -103,2 +114,3 @@         """+        preserved_metadata = {}         if (@@ -137,2 +149,3 @@             transfer_future.meta.provide_object_etag(response.get('ETag'))+            preserved_metadata = self._extract_preserved_metadata(response) @@ -146,3 +159,8 @@             self._submit_multipart_request(-                client, config, osutil, request_executor, transfer_future+                client,+                config,+                osutil,+                request_executor,+                transfer_future,+                preserved_metadata,             )@@ -176,5 +194,14 @@     def _submit_multipart_request(-        self, client, config, osutil, request_executor, transfer_future+        self,+        client,+        config,+        osutil,+        request_executor,+        transfer_future,+        preserved_metadata=None,     ):         call_args = transfer_future.meta.call_args+        merged_extra_args = self._merge_preserved_metadata(+            call_args.extra_args, preserved_metadata or {}+        ) @@ -183,3 +210,3 @@         create_multipart_extra_args = {}-        for param, val in call_args.extra_args.items():+        for param, val in merged_extra_args.items():             if param not in self.CREATE_MULTIPART_ARGS_BLACKLIST:@@ -287,2 +314,19 @@ +    def _extract_preserved_metadata(self, head_object_response):+        preserved = {}+        for field in self.PRESERVED_METADATA_FIELDS:+            if field in head_object_response:+                preserved[field] = head_object_response[field]+        return preserved++    def _merge_preserved_metadata(self, extra_args, preserved_metadata):+        if not preserved_metadata:+            return extra_args+        if extra_args.get('MetadataDirective') == 'REPLACE':+            return extra_args+        merged = dict(extra_args)+        for field, value in preserved_metadata.items():+            merged[field] = value+        return merged+     def _get_head_object_request_from_copy_source(self, copy_source):
tests/functional/test_copy.py +79 lines
--- +++ @@ -13,2 +13,3 @@ import copy+import datetime @@ -454,2 +455,17 @@ +    def add_head_object_response_with_metadata(self, head_metadata):+        service_response = {+            'ContentLength': len(self.content),+            'ETag': self.etag,+        }+        service_response.update(head_metadata)+        self.stubber.add_response(+            'head_object',+            service_response=service_response,+            expected_params={+                'Bucket': 'mysourcebucket',+                'Key': 'mysourcekey',+            },+        )+     def _get_expected_params(self):@@ -715,2 +731,65 @@ +    def test_multipart_copy_preserves_source_metadata(self):+        head_metadata = {+            'CacheControl': 'no-cache',+            'ContentDisposition': 'attachment; filename="x.json"',+            'ContentEncoding': 'gzip',+            'ContentLanguage': 'en-US',+            'ContentType': 'application/json',+            'Expires': datetime.datetime(+                2030, 1, 1, tzinfo=datetime.timezone.utc+            ),+            'Metadata': {'foo': 'bar'},+        }+        self.add_head_object_response_with_metadata(head_metadata)++        _, add_copy_kwargs = self._get_expected_params()+        add_copy_kwargs['expected_create_mpu_params'].update(head_metadata)+        self.add_successful_copy_responses(**add_copy_kwargs)++        future = self.manager.copy(**self.create_call_kwargs())+        future.result()+        self.stubber.assert_no_pending_responses()++    def test_multipart_copy_caller_metadata_ignored_when_preserving(self):+        head_metadata = {+            'ContentType': 'application/octet-stream',+            'CacheControl': 'no-cache',+            'Metadata': {'foo': 'bar'},+        }+        self.add_head_object_response_with_metadata(head_metadata)++        _, add_copy_kwargs = self._get_expected_params()+        add_copy_kwargs['expected_create_mpu_params'].update(head_metadata)+        self.add_successful_copy_responses(**add_copy_kwargs)++        call_kwargs = self.create_call_kwargs()+        call_kwargs['extra_args'] = {'ContentType': 'application/json'}+        future = self.manager.copy(**call_kwargs)+        future.result()+        self.stubber.assert_no_pending_responses()++    def test_multipart_copy_metadata_directive_replace_opts_out(self):+        head_metadata = {+            'ContentType': 'application/octet-stream',+            'CacheControl': 'no-cache',+            'Metadata': {'foo': 'bar'},+        }+        self.add_head_object_response_with_metadata(head_metadata)++        _, add_copy_kwargs = self._get_expected_params()+        add_copy_kwargs['expected_create_mpu_params']['ContentType'] = (+            'application/json'+        )+        self.add_successful_copy_responses(**add_copy_kwargs)++        call_kwargs = self.create_call_kwargs()+        call_kwargs['extra_args'] = {+            'ContentType': 'application/json',+            'MetadataDirective': 'REPLACE',+        }+        future = self.manager.copy(**call_kwargs)+        future.result()+        self.stubber.assert_no_pending_responses()+     def test_copy_fails_if_etag_validation_fails(self):
setuptools pypi
82.0.1 2mo ago incident on record
critical-tier YANK ×9BURST ×35INSTALL-EXEC
latest 82.0.1 versions 623 maintainers 1 critical-tier (snapshotted)
80.6.0
80.7.0
80.7.1
80.8.0
80.9.0
75.3.3
80.10.1
80.10.2
81.0.0
75.3.4
82.0.0
82.0.1
YANK
59.1.0 marked yanked (still downloadable)
high · registry-verified · 2021-11-15 · 4y ago
YANK
60.3.0 marked yanked (still downloadable)
high · registry-verified · 2022-01-06 · 4y ago
YANK
69.3.0 marked yanked (still downloadable)
high · registry-verified · 2024-04-12 · 2y ago
YANK
69.4.0 marked yanked (still downloadable)
high · registry-verified · 2024-04-12 · 2y ago
YANK
71.0.1 marked yanked (still downloadable)
high · registry-verified · 2024-07-18 · 1y ago
YANK
72.0.0 marked yanked (still downloadable)
high · registry-verified · 2024-07-29 · 1y ago
YANK
75.9.0 marked yanked (still downloadable)
high · registry-verified · 2025-03-09 · 1y ago
YANK
80.3.0 marked yanked (still downloadable)
high · registry-verified · 2025-05-03 · 1y ago
YANK
80.7.0 marked yanked (still downloadable)
high · registry-verified · 2025-05-14 · 1y ago
BURST
2 releases in 21m: 0.9.2, 0.9.3
info · registry-verified · 2013-07-15 · 12y ago
BURST
2 releases in 3m: 1.1.2, 1.1.3
info · registry-verified · 2013-09-06 · 12y ago
BURST
4 releases in 3m: 3.1, 3.0, 3.0.1, 3.0.2
info · registry-verified · 2014-03-08 · 12y ago
BURST
2 releases in 15m: 3.5.2, 3.6
info · registry-verified · 2014-05-07 · 12y ago
BURST
2 releases in 17m: 3.7, 3.8
info · registry-verified · 2014-06-01 · 12y ago
BURST
2 releases in 0m: 4.0, 4.0.1
info · registry-verified · 2014-06-15 · 11y ago
BURST
2 releases in 28m: 8.1, 8.2
info · registry-verified · 2014-12-18 · 11y ago
BURST
2 releases in 59m: 12.0, 12.0.1
info · registry-verified · 2015-01-16 · 11y ago
BURST
2 releases in 14m: 12.0.2, 12.0.3
info · registry-verified · 2015-01-19 · 11y ago
BURST
2 releases in 26m: 20.8.0, 20.8.1
info · registry-verified · 2016-04-15 · 10y ago
BURST
2 releases in 8m: 22.0.1, 22.0.2
info · registry-verified · 2016-06-03 · 9y ago
BURST
2 releases in 25m: 22.0.4, 22.0.5
info · registry-verified · 2016-06-03 · 9y ago
BURST
2 releases in 9m: 24.1.1, 24.2.0
info · registry-verified · 2016-07-20 · 9y ago
BURST
2 releases in 2m: 25.0.0, 24.3.1
info · registry-verified · 2016-07-23 · 9y ago
BURST
2 releases in 52m: 25.1.5, 25.1.6
info · registry-verified · 2016-08-05 · 9y ago
BURST
2 releases in 11m: 25.3.0, 25.4.0
info · registry-verified · 2016-08-19 · 9y ago
BURST
2 releases in 41m: 27.0.0, 27.1.0
info · registry-verified · 2016-09-09 · 9y ago
BURST
2 releases in 10m: 28.8.1, 29.0.1
info · registry-verified · 2016-11-27 · 9y ago
BURST
2 releases in 23m: 30.2.1, 30.3.0
info · registry-verified · 2016-12-08 · 9y ago
BURST
2 releases in 19m: 36.6.1, 36.7.0
info · registry-verified · 2017-11-10 · 8y ago
BURST
2 releases in 48m: 38.0.0, 38.1.0
info · registry-verified · 2017-11-25 · 8y ago
BURST
2 releases in 7m: 38.6.1, 38.7.0
info · registry-verified · 2018-03-17 · 8y ago
BURST
2 releases in 16m: 40.1.1, 40.2.0
info · registry-verified · 2018-08-21 · 7y ago
BURST
2 releases in 5m: 41.3.0, 41.4.0
info · registry-verified · 2019-10-07 · 6y ago
BURST
3 releases in 19m: 44.1.0, 46.1.0, 46.1.1
info · registry-verified · 2020-03-21 · 6y ago
BURST
2 releases in 27m: 47.0.0, 47.1.0
info · registry-verified · 2020-05-28 · 6y ago
BURST
2 releases in 16m: 44.1.1, 47.1.1
info · registry-verified · 2020-05-29 · 6y ago
BURST
2 releases in 44m: 54.1.3, 54.2.0
info · registry-verified · 2021-03-22 · 5y ago
BURST
2 releases in 12m: 58.5.0, 58.5.1
info · registry-verified · 2021-11-03 · 4y ago
BURST
2 releases in 1m: 60.4.0, 60.5.0
info · registry-verified · 2022-01-08 · 4y ago
BURST
3 releases in 4m: 69.3.1, 69.4.1, 69.5.0
info · registry-verified · 2024-04-13 · 2y ago
BURST
2 releases in 51m: 74.1.3, 75.0.0
info · registry-verified · 2024-09-15 · 1y ago
BURST
2 releases in 8m: 75.3.1, 75.3.2
info · registry-verified · 2025-03-11 · 1y ago
BURST
2 releases in 19m: 80.6.0, 80.7.0
info · registry-verified · 2025-05-14 · 1y ago
BURST
2 releases in 56m: 75.3.4, 82.0.0
info · registry-verified · 2026-02-08 · 3mo ago
INSTALL-EXEC
setup.py in sdist uses install-hook, obfuscation (runs at pip install)
warn · snapshot-derived
release diff 82.0.0 → 82.0.1
+3 added · -2 removed · ~27 modified
+6 more files not shown
conftest.py +0 lines
--- +++ @@ -34,3 +34,2 @@     '_distutils_hack',-    'pkg_resources/tests/data',     'setuptools/_vendor',
docs/conf.py +3 lines
--- +++ @@ -148,2 +148,3 @@     "userguide/commands": "/deprecated/commands.html",+    "pkg_resources": "/deprecated/pkg_resources.html", }@@ -240,4 +241,4 @@ intersphinx_mapping.update({-    'pip': ('https://pip.pypa.io/en/latest', None),-    'build': ('https://build.pypa.io/en/latest', None),+    'pip': ('https://pip.pypa.io/en/stable', None),+    'build': ('https://build.pypa.io/en/stable', None),     'PyPUG': ('https://packaging.python.org/en/latest', None),
pyproject.toml +2 lines
--- +++ @@ -12,3 +12,3 @@ name = "setuptools"-version = "82.0.0"+version = "82.0.1" authors = [@@ -16,3 +16,3 @@ ]-description = "Easily download, build, install, upgrade, and uninstall Python packages"+description = "Most extensible Python build backend with support for C/C++ extension modules" readme = "README.rst"@@ -103,5 +103,2 @@ 	"wheel>=0.43.0",--	# pkg_resources-	"platformdirs >= 4.2.2", # Made ctypes optional (see #4461) 
setuptools/config/_apply_pyprojecttoml.py +9 lines
--- +++ @@ -270,4 +270,12 @@     args = ({k.replace("-", "_"): v for k, v in x.items()} for x in val)-    new = [Extension(**kw) for kw in args]+    new = (Extension(**_adjust_ext_attrs(kw)) for kw in args)     return [*existing, *new]+++def _adjust_ext_attrs(attrs: dict) -> dict:+    # https://github.com/pypa/setuptools/issues/4810+    # In TOML there is no differentiation between tuples and lists,+    # and distutils requires tuples...+    attrs["define_macros"] = list(map(tuple, attrs.get("define_macros") or []))+    return attrs 
setuptools/config/_validate_pyproject/error_reporting.py +13 lines
--- +++ @@ -1 +1,3 @@+from __future__ import annotations+ import io@@ -8,3 +10,3 @@ from textwrap import indent, wrap-from typing import Any, Dict, Generator, Iterator, List, Optional, Sequence, Union+from typing import Any, Generator, Iterator, Sequence @@ -38,3 +40,3 @@ _CAMEL_CASE_SPLITTER = re.compile(r"\W+|([A-Z][^A-Z\W]*)")-_IDENTIFIER = re.compile(r"^[\w_]+$", re.I)+_IDENTIFIER = re.compile(r"^[\w_]+$", re.IGNORECASE) @@ -75,3 +77,3 @@     @classmethod-    def _from_jsonschema(cls, ex: JsonSchemaValueException) -> "Self":+    def _from_jsonschema(cls, ex: JsonSchemaValueException) -> Self:         formatter = _ErrorFormatting(ex)@@ -175,4 +177,4 @@ -    def __init__(self, jargon: Optional[Dict[str, str]] = None):-        self.jargon: Dict[str, str] = jargon or {}+    def __init__(self, jargon: dict[str, str] | None = None):+        self.jargon: dict[str, str] = jargon or {}         # Clarify confusing terms@@ -209,3 +211,3 @@ -    def _jargon(self, term: Union[str, List[str]]) -> Union[str, List[str]]:+    def _jargon(self, term: str | list[str]) -> str | list[str]:         if isinstance(term, list):@@ -216,3 +218,3 @@         self,-        schema: Union[dict, List[dict]],+        schema: dict | list[dict],         prefix: str = "",@@ -263,4 +265,4 @@     def _filter_unecessary(-        self, schema: Dict[str, Any], path: Sequence[str]-    ) -> Dict[str, Any]:+        self, schema: dict[str, Any], path: Sequence[str]+    ) -> dict[str, Any]:         return {@@ -271,3 +273,3 @@ -    def _handle_simple_dict(self, value: dict, path: Sequence[str]) -> Optional[str]:+    def _handle_simple_dict(self, value: dict, path: Sequence[str]) -> str | None:         inline = any(p in value for p in self._guess_inline_defs)@@ -330,3 +332,3 @@ -def _separate_terms(word: str) -> List[str]:+def _separate_terms(word: str) -> list[str]:     """
setuptools/config/_validate_pyproject/extra_validations.py +73 lines
--- +++ @@ -5,4 +5,6 @@ +import collections+import itertools from inspect import cleandoc-from typing import Mapping, TypeVar+from typing import Generator, Iterable, Mapping, TypeVar @@ -21,4 +23,3 @@     _URL = (-        "https://packaging.python.org/en/latest/specifications/"-        "pyproject-toml/#dynamic"+        "https://packaging.python.org/en/latest/specifications/pyproject-toml/#dynamic"     )@@ -31,2 +32,20 @@     _URL = "https://peps.python.org/pep-0735/"+++class ImportNameCollision(ValidationError):+    _DESC = """According to PEP 794:++    All import-names and import-namespaces items must be unique.+    """+    __doc__ = _DESC+    _URL = "https://peps.python.org/pep-0794/"+++class ImportNameMissing(ValidationError):+    _DESC = """According to PEP 794:++    An import name must have all parents listed.+    """+    __doc__ = _DESC+    _URL = "https://peps.python.org/pep-0794/" @@ -81,2 +100,52 @@ -EXTRA_VALIDATIONS = (validate_project_dynamic, validate_include_depenency)+def _remove_private(items: Iterable[str]) -> Generator[str, None, None]:+    for item in items:+        yield item.partition(";")[0].rstrip()+++def validate_import_name_issues(pyproject: T) -> T:+    project = pyproject.get("project", {})+    import_names = collections.Counter(_remove_private(project.get("import-names", [])))+    import_namespaces = collections.Counter(+        _remove_private(project.get("import-namespaces", []))+    )++    duplicated = [k for k, v in (import_names + import_namespaces).items() if v > 1]++    if duplicated:+        raise ImportNameCollision(+            message="Duplicated names are not allowed in import-names/import-namespaces",+            value=duplicated,+            name="data.project.importnames(paces)",+            definition={+                "description": cleandoc(ImportNameCollision._DESC),+                "see": ImportNameCollision._URL,+            },+            rule="PEP 794",+        )++    names = frozenset(import_names + import_namespaces)+    for name in names:+        for parent in itertools.accumulate(+            name.split(".")[:-1], lambda a, b: f"{a}.{b}"+        ):+            if parent not in names:+                raise ImportNameMissing(+                    message="All parents of an import name must also be listed in import-namespace/import-names",+                    value=name,+                    name="data.project.importnames(paces)",+                    definition={+                        "description": cleandoc(ImportNameMissing._DESC),+                        "see": ImportNameMissing._URL,+                    },+                    rule="PEP 794",+                )++    return pyproject+++EXTRA_VALIDATIONS = (+    validate_project_dynamic,+    validate_include_depenency,+    validate_import_name_issues,+)
setuptools/config/_validate_pyproject/fastjsonschema_validations.py +75 lines
--- +++ @@ -12,3 +12,3 @@ -VERSION = "2.20.0"+VERSION = "2.21.2" from decimal import Decimal@@ -34,3 +34,3 @@     if not isinstance(data, (dict)):-        raise JsonSchemaValueException("" + (name_prefix or "data") + " must be object", value=data, name="" + (name_prefix or "data") + "", definition={'$schema': 'http://json-schema.org/draft-07/schema#', '$id': 'https://packaging.python.org/en/latest/specifications/declaring-build-dependencies/', 'title': 'Data structure for ``pyproject.toml`` files', '$$description': ['File format containing build-time configurations for the Python ecosystem. ', ':pep:`517` initially defined a build-system independent format for source trees', 'which was complemented by :pep:`518` to provide a way of specifying dependencies ', 'for building Python projects.', 'Please notice the ``project`` table (as initially defined in  :pep:`621`) is not included', 'in this schema and should be considered separately.'], 'type': 'object', 'additionalProperties': False, 'properties': {'build-system': {'type': 'object', 'description': 'Table used to store build-related data', 'additionalProperties': False, 'properties': {'requires': {'type': 'array', '$$description': ['List of dependencies in the :pep:`508` format required to execute the build', 'system. Please notice that the resulting dependency graph', '**MUST NOT contain cycles**'], 'items': {'type': 'string'}}, 'build-backend': {'type': 'string', 'description': 'Python object that will be used to perform the build according to :pep:`517`', 'format': 'pep517-backend-reference'}, 'backend-path': {'type': 'array', '$$description': ['List of directories to be prepended to ``sys.path`` when loading the', 'back-end, and running its hooks'], 'items': {'type': 'string', '$comment': 'Should be a path (TODO: enforce it with format?)'}}}, 'required': ['requires']}, 'project': {'$schema': 'http://json-schema.org/draft-07/schema#', '$id': 'https://packaging.python.org/en/latest/specifications/pyproject-toml/', 'title': 'Package metadata stored in the ``project`` table', '$$description': ['Data structure for the **project** table inside ``pyproject.toml``', '(as initially defined in :pep:`621`)'], 'type': 'object', 'properties': {'name': {'type': 'string', 'description': 'The name (primary identifier) of the project. MUST be statically defined.', 'format': 'pep508-identifier'}, 'version': {'type': 'string', 'description': 'The version of the project as supported by :pep:`440`.', 'format': 'pep440'}, 'description': {'type': 'string', '$$description': ['The `summary description of the project', '<https://packaging.python.org/specifications/core-metadata/#summary>`_']}, 'readme': {'$$description': ['`Full/detailed description of the project in the form of a README', '<https://peps.python.org/pep-0621/#readme>`_', "with meaning similar to the one defined in `core metadata's Description", '<https://packaging.python.org/specifications/core-metadata/#description>`_'], 'oneOf': [{'type': 'string', '$$description': ['Relative path to a text file (UTF-8) containing the full description', 'of the project. If the file path ends in case-insensitive ``.md`` or', '``.rst`` suffixes, then the content-type is respectively', '``text/markdown`` or ``text/x-rst``']}, {'type': 'object', 'allOf': [{'anyOf': [{'properties': {'file': {'type': 'string', '$$description': ['Relative path to a text file containing the full description', 'of the project.']}}, 'required': ['file']}, {'properties': {'text': {'type': 'string', 'description': 'Full text describing the project.'}}, 'required': ['text']}]}, {'properties': {'content-type': {'type': 'string', '$$description': ['Content-type (:rfc:`1341`) of the full description', '(e.g. ``text/markdown``). The ``charset`` parameter is assumed', 'UTF-8 when not present.'], '$comment': 'TODO: add regex pattern or format?'}}, 'required': ['content-type']}]}]}, 'requires-python': {'type': 'string', 'format': 'pep508-versionspec', '$$description': ['`The Python version requirements of the project', '<https://packaging.python.org/specifications/core-metadata/#requires-python>`_.']}, 'license': {'description': '`Project license <https://peps.python.org/pep-0621/#license>`_.', 'oneOf': [{'type': 'string', 'description': 'An SPDX license identifier', 'format': 'SPDX'}, {'type': 'object', 'properties': {'file': {'type': 'string', '$$description': ['Relative path to the file (UTF-8) which contains the license for the', 'project.']}}, 'required': ['file']}, {'type': 'object', 'properties': {'text': {'type': 'string', '$$description': ['The license of the project whose meaning is that of the', '`License field from the core metadata', '<https://packaging.python.org/specifications/core-metadata/#license>`_.']}}, 'required': ['text']}]}, 'license-files': {'description': 'Paths or globs to paths of license files', 'type': 'array', 'items': {'type': 'string'}}, 'authors': {'type': 'array', 'items': {'$ref': '#/definitions/author'}, '$$description': ["The people or organizations considered to be the 'authors' of the project.", 'The exact meaning is open to interpretation (e.g. original or primary authors,', 'current maintainers, or owners of the package).']}, 'maintainers': {'type': 'array', 'items': {'$ref': '#/definitions/author'}, '$$description': ["The people or organizations considered to be the 'maintainers' of the project.", 'Similarly to ``authors``, the exact meaning is open to interpretation.']}, 'keywords': {'type': 'array', 'items': {'type': 'string'}, 'description': 'List of keywords to assist searching for the distribution in a larger catalog.'}, 'classifiers': {'type': 'array', 'items': {'type': 'string', 'format': 'trove-classifier', 'description': '`PyPI classifier <https://pypi.org/classifiers/>`_.'}, '$$description': ['`Trove classifiers <https://pypi.org/classifiers/>`_', 'which apply to the project.']}, 'urls': {'type': 'object', 'description': 'URLs associated with the project in the form ``label => value``.', 'additionalProperties': False, 'patternProperties': {'^.+$': {'type': 'string', 'format': 'url'}}}, 'scripts': {'$ref': '#/definitions/entry-point-group', '$$description': ['Instruct the installer to create command-line wrappers for the given', '`entry points <https://packaging.python.org/specifications/entry-points/>`_.']}, 'gui-scripts': {'$ref': '#/definitions/entry-point-group', '$$description': ['Instruct the installer to create GUI wrappers for the given', '`entry points <https://packaging.python.org/specifications/entry-points/>`_.', 'The difference between ``scripts`` and ``gui-scripts`` is only relevant in', 'Windows.']}, 'entry-points': {'$$description': ['Instruct the installer to expose the given modules/functions via', '``entry-point`` discovery mechanism (useful for plugins).', 'More information available in the `Python packaging guide', '<https://packaging.python.org/specifications/entry-points/>`_.'], 'propertyNames': {'format': 'python-entrypoint-group'}, 'additionalProperties': False, 'patternProperties': {'^.+$': {'$ref': '#/definitions/entry-point-group'}}}, 'dependencies': {'type': 'array', 'description': 'Project (mandatory) dependencies.', 'items': {'$ref': '#/definitions/dependency'}}, 'optional-dependencies': {'type': 'object', 'description': 'Optional dependency for the project', 'propertyNames': {'format': 'pep508-identifier'}, 'additionalProperties': False, 'patternProperties': {'^.+$': {'type': 'array', 'items': {'$ref': '#/definitions/dependency'}}}}, 'dynamic': {'type': 'array', '$$description': ['Specifies which fields are intentionally unspecified and expected to be', 'dynamically provided by build tools'], 'items': {'enum': ['version', 'description', 'readme', 'requires-python', 'license', 'license-files', 'authors', 'maintainers', 'keywords', 'classifiers', 'urls', 'scripts', 'gui-scripts', 'entry-points', 'dependencies', 'optional-dependencies']}}}, 'required': ['name'], 'additionalProperties': False, 'allOf': [{'if': {'not': {'required': ['dynamic'], 'properties': {'dynamic': {'contains': {'const': 'version'}, '$$description': ['version is listed in ``dynamic``']}}}, '$$comment': ['According to :pep:`621`:', '    If the core metadata specification lists a field as "Required", then', '    the metadata MUST specify the field statically or list it in dynamic', 'In turn, `core metadata`_ defines:', '    The required fields are: Metadata-Version, Name, Version.', '    All the other fields are optional.', 'Since ``Metadata-Version`` is defined by the build back-end, ``name`` and', '``version`` are the only mandatory information in ``pyproject.toml``.', '.. _core metadata: https://packaging.python.org/specifications/core-metadata/']}, 'then': {'required': ['version'], '$$description': ['version should be statically defined in the ``version`` field']}}, {'if': {'required': ['license-files']}, 'then': {'properties': {'license': {'type': 'string'}}}}], 'definitions': {'author': {'$id': '#/definitions/author', 'title': 'Author or Maintainer', '$comment': 'https://peps.python.org/pep-0621/#authors-maintainers', 'type': 'object', 'additionalProperties': False, 'properties': {'name': {'type': 'string', '$$description': ['MUST be a valid email name, i.e. whatever can be put as a name, before an', 'email, in :rfc:`822`.']}, 'email': {'type': 'string', 'format': 'idn-email', 'description': 'MUST be a valid email address'}}}, 'entry-point-group': {'$id': '#/definitions/entry-point-group', 'title': 'Entry-points', 'type': 'object', '$$description': ['Entry-points are grouped together to indicate what sort of capabilities they', 'provide.', 'See the `packaging guides', '<https://packaging.python.org/specifications/entry-points/>`_', 'and `setuptools docs', '<https://setuptools.pypa.io/en/latest/userguide/entry_point.html>`_', 'for more information.'], 'propertyNames': {'format': 'python-entrypoint-name'}, 'additionalProperties': False, 'patternProperties': {'^.+$': {'type': 'string', '$$description': ['Reference to a Python object. It is either in the form', '``importable.module``, or ``importable.module:object.attr``.'], 'format': 'python-entrypoint-reference', '$comment': 'https://packaging.python.org/specifications/entry-points/'}}}, 'dependency': {'$id': '#/definitions/dependency', 'title': 'Dependency', 'type': 'string', 'description': 'Project dependency specification according to PEP 508', 'format': 'pep508'}}}, 'tool': {'type': 'object', 'properties': {'distutils': {'$schema': 'http://json-schema.org/draft-07/schema#', '$id': 'https://setuptools.pypa.io/en/latest/deprecated/distutils/configfile.html', 'title': '``tool.distutils`` table', '$$description': ['**EXPERIMENTAL** (NOT OFFICIALLY SUPPORTED): Use ``tool.distutils``', 'subtables to configure arguments for ``distutils`` commands.', 'Originally, ``distutils`` allowed developers to configure arguments for', '``setup.py`` commands via `distutils configuration files', '<https://setuptools.pypa.io/en/latest/deprecated/distutils/configfile.html>`_.', 'See also `the old Python docs <https://docs.python.org/3.11/install/>_`.'], 'type': 'object', 'properties': {'global': {'type': 'object', 'description': 'Global options applied to all ``distutils`` commands'}}, 'patternProperties': {'.+': {'type': 'object'}}, '$comment': 'TODO: Is there a practical way of making this schema more specific?'}, 'setuptools': {'$schema': 'http://json-schema.org/draft-07/schema#', '$id': 'https://setuptools.pypa.io/en/latest/userguide/pyproject_config.html', 'title': '``tool.setuptools`` table', '$$description': ['``setuptools``-specific configurations that can be set by users that require', 'customization.', 'These configurations are completely optional and probably can be skipped when', 'creating simple packages. They are equivalent to some of the `Keywords', '<https://setuptools.pypa.io/en/latest/references/keywords.html>`_', 'used by the ``setup.py`` file, and can be set via the ``tool.setuptools`` table.', 'It considers only ``setuptools`` `parameters', '<https://setuptools.pypa.io/en/latest/userguide/pyproject_config.html#setuptools-specific-configuration>`_', 'that are not covered by :pep:`621`; and intentionally excludes ``dependency_links``', 'and ``setup_requires`` (incompatible with modern workflows/standards).'], 'type': 'object', 'additionalProperties': False, 'properties': {'platforms': {'type': 'array', 'items': {'type': 'string'}}, 'provides': {'$$description': ['Package and virtual package names contained within this package', '**(not supported by pip)**'], 'type': 'array', 'items': {'type': 'string', 'format': 'pep508-identifier'}}, 'obsoletes': {'$$description': ['Packages which this package renders obsolete', '**(not supported by pip)**'], 'type': 'array', 'items': {'type': 'string', 'format': 'pep508-identifier'}}, 'zip-safe': {'$$description': ['Whether the project can be safely installed and run from a zip file.', '**OBSOLETE**: only relevant for ``pkg_resources``, ``easy_install`` and', '``setup.py install`` in the context of ``eggs`` (**DEPRECATED**).'], 'type': 'boolean'}, 'script-files': {'$$description': ['Legacy way of defining scripts (entry-points are preferred).', 'Equivalent to the ``script`` keyword in ``setup.py``', '(it was renamed to avoid confusion with entry-point based ``project.scripts``', 'defined in :pep:`621`).', '**DISCOURAGED**: generic script wrappers are tricky and may not work properly.', 'Whenever possible, please use ``project.scripts`` instead.'], 'type': 'array', 'items': {'type': 'string'}, '$comment': 'TODO: is this field deprecated/should be removed?'}, 'eager-resources': {'$$description': ['Resources that should be extracted together, if any of them is needed,', 'or if any C extensions included in the project are imported.', '**OBSOLETE**: only relevant for ``pkg_resources``, ``easy_install`` and', '``setup.py install`` in the context of ``eggs`` (**DEPRECATED**).'], 'type': 'array', 'items': {'type': 'string'}}, 'packages': {'$$description': ['Packages that should be included in the distribution.', 'It can be given either as a list of package identifiers', 'or as a ``dict``-like structure with a single key ``find``', 'which corresponds to a dynamic call to', '``setuptools.config.expand.find_packages`` function.', 'The ``find`` key is associated with a nested ``dict``-like structure that can', 'contain ``where``, ``include``, ``exclude`` and ``namespaces`` keys,', 'mimicking the keyword arguments of the associated function.'], 'oneOf': [{'title': 'Array of Python package identifiers', 'type': 'array', 'items': {'$ref': '#/definitions/package-name'}}, {'$ref': '#/definitions/find-directive'}]}, 'package-dir': {'$$description': [':class:`dict`-like structure mapping from package names to directories where their', 'code can be found.', 'The empty string (as key) means that all packages are contained inside', 'the given directory will be included in the distribution.'], 'type': 'object', 'additionalProperties': False, 'propertyNames': {'anyOf': [{'const': ''}, {'$ref': '#/definitions/package-name'}]}, 'patternProperties': {'^.*$': {'type': 'string'}}}, 'package-data': {'$$description': ['Mapping from package names to lists of glob patterns.', 'Usually this option is not needed when using ``include-package-data = true``', 'For more information on how to include data files, check ``setuptools`` `docs', '<https://setuptools.pypa.io/en/latest/userguide/datafiles.html>`_.'], 'type': 'object', 'additionalProperties': False, 'propertyNames': {'anyOf': [{'type': 'string', 'format': 'python-module-name'}, {'const': '*'}]}, 'patternProperties': {'^.*$': {'type': 'array', 'items': {'type': 'string'}}}}, 'include-package-data': {'$$description': ['Automatically include any data files inside the package directories', 'that are specified by ``MANIFEST.in``', 'For more information on how to include data files, check ``setuptools`` `docs', '<https://setuptools.pypa.io/en/latest/userguide/datafiles.html>`_.'], 'type': 'boolean'}, 'exclude-package-data': {'$$description': ['Mapping from package names to lists of glob patterns that should be excluded', 'For more information on how to include data files, check ``setuptools`` `docs', '<https://setuptools.pypa.io/en/latest/userguide/datafiles.html>`_.'], 'type': 'object', 'additionalProperties': False, 'propertyNames': {'anyOf': [{'type': 'string', 'format': 'python-module-name'}, {'const': '*'}]}, 'patternProperties': {'^.*$': {'type': 'array', 'items': {'type': 'string'}}}}, 'namespace-packages': {'type': 'array', 'items': {'type': 'string', 'format': 'python-module-name-relaxed'}, '$comment': 'https://setuptools.pypa.io/en/latest/userguide/package_discovery.html', 'description': '**DEPRECATED**: use implicit namespaces instead (:pep:`420`).'}, 'py-modules': {'description': 'Modules that setuptools will manipulate', 'type': 'array', 'items': {'type': 'string', 'format': 'python-module-name-relaxed'}, '$comment': 'TODO: clarify the relationship with ``packages``'}, 'ext-modules': {'description': 'Extension modules to be compiled by setuptools', 'type': 'array', 'items': {'$ref': '#/definitions/ext-module'}}, 'data-files': {'$$description': ['``dict``-like structure where each key represents a directory and', 'the value is a list of glob patterns that should be installed in them.', '**DISCOURAGED**: please notice this might not work as expected with wheels.', 'Whenever possible, consider using data files inside the package directories', '(or create a new namespace package that only contains data files).', 'See `data files support', '<https://setuptools.pypa.io/en/latest/userguide/datafiles.html>`_.'], 'type': 'object', 'patternProperties': {'^.*$': {'type': 'array', 'items': {'type': 'string'}}}}, 'cmdclass': {'$$description': ['Mapping of distutils-style command names to ``setuptools.Command`` subclasses', 'which in turn should be represented by strings with a qualified class name', '(i.e., "dotted" form with module), e.g.::\n\n', '    cmdclass = {mycmd = "pkg.subpkg.module.CommandClass"}\n\n', 'The command class should be a directly defined at the top-level of the', 'containing module (no class nesting).'], 'type': 'object', 'patternProperties': {'^.*$': {'type': 'string', 'format': 'python-qualified-identifier'}}}, 'license-files': {'type': 'array', 'items': {'type': 'string'}, '$$description': ['**PROVISIONAL**: list of glob patterns for all license files being distributed.', '(likely to become standard with :pep:`639`).', "By default: ``['LICEN[CS]E*', 'COPYING*', 'NOTICE*', 'AUTHORS*']``"], '$comment': 'TODO: revise if PEP 639 is accepted. Probably ``project.license-files``?'}, 'dynamic': {'type': 'object', 'description': 'Instructions for loading :pep:`621`-related metadata dynamically', 'additionalProperties': False, 'properties': {'version': {'$$description': ['A version dynamically loaded via either the ``attr:`` or ``file:``', 'directives. Please make sure the given file or attribute respects :pep:`440`.', 'Also ensure to set ``project.dynamic`` accordingly.'], 'oneOf': [{'$ref': '#/definitions/attr-directive'}, {'$ref': '#/definitions/file-directive'}]}, 'classifiers': {'$ref': '#/definitions/file-directive'}, 'description': {'$ref': '#/definitions/file-directive'}, 'entry-points': {'$ref': '#/definitions/file-directive'}, 'dependencies': {'$ref': '#/definitions/file-directive-for-dependencies'}, 'optional-dependencies': {'type': 'object', 'propertyNames': {'type': 'string', 'format': 'pep508-identifier'}, 'additionalProperties': False, 'patternProperties': {'.+': {'$ref': '#/definitions/file-directive-for-dependencies'}}}, 'readme': {'type': 'object', 'anyOf': [{'$ref': '#/definitions/file-directive'}, {'type': 'object', 'properties': {'content-type': {'type': 'string'}, 'file': {'$ref': '#/definitions/file-directive/properties/file'}}, 'additionalProperties': False}], 'required': ['file']}}}}, 'definitions': {'package-name': {'$id': '#/definitions/package-name', 'title': 'Valid package name', 'description': 'Valid package name (importable or :pep:`561`).', 'type': 'string', 'anyOf': [{'type': 'string', 'format': 'python-module-name-relaxed'}, {'type': 'string', 'format': 'pep561-stub-name'}]}, 'ext-module': {'$id': '#/definitions/ext-module', 'title': 'Extension module', 'description': 'Parameters to construct a :class:`setuptools.Extension` object', 'type': 'object', 'required': ['name', 'sources'], 'additionalProperties': False, 'properties': {'name': {'type': 'string', 'format': 'python-module-name-relaxed'}, 'sources': {'type': 'array', 'items': {'type': 'string'}}, 'include-dirs': {'type': 'array', 'items': {'type': 'string'}}, 'define-macros': {'type': 'array', 'items': {'type': 'array', 'items': [{'description': 'macro name', 'type': 'string'}, {'description': 'macro value', 'oneOf': [{'type': 'string'}, {'type': 'null'}]}], 'additionalItems': False}}, 'undef-macros': {'type': 'array', 'items': {'type': 'string'}}, 'library-dirs': {'type': 'array', 'items': {'type': 'string'}}, 'libraries': {'type': 'array', 'items': {'type': 'string'}}, 'runtime-library-dirs': {'type': 'array', 'items': {'type': 'string'}}, 'extra-objects': {'type': 'array', 'items': {'type': 'string'}}, 'extra-compile-args': {'type': 'array', 'items': {'type': 'string'}}, 'extra-link-args': {'type': 'array', 'items': {'type': 'string'}}, 'export-symbols': {'type': 'array', 'items': {'type': 'string'}}, 'swig-opts': {'type': 'array', 'items': {'type': 'string'}}, 'depends': {'type': 'array', 'items': {'type': 'string'}}, 'language': {'type': 'string'}, 'optional': {'type': 'boolean'}, 'py-limited-api': {'type': 'boolean'}}}, 'file-directive': {'$id': '#/definitions/file-directive', 'title': "'file:' directive", 'description': 'Value is read from a file (or list of files and then concatenated)', 'type': 'object', 'additionalProperties': False, 'properties': {'file': {'oneOf': [{'type': 'string'}, {'type': 'array', 'items': {'type': 'string'}}]}}, 'required': ['file']}, 'file-directive-for-dependencies': {'title': "'file:' directive for dependencies", 'allOf': [{'$$description': ['**BETA**: subset of the ``requirements.txt`` format', 'without ``pip`` flags and options', '(one :pep:`508`-compliant string per line,', 'lines that are blank or start with ``#`` are excluded).', 'See `dynamic metadata', '<https://setuptools.pypa.io/en/latest/userguide/pyproject_config.html#dynamic-metadata>`_.']}, {'$ref': '#/definitions/file-directive'}]}, 'attr-directive': {'title': "'attr:' directive", '$id': '#/definitions/attr-directive', '$$description': ['Value is read from a module attribute. Supports callables and iterables;', 'unsupported types are cast via ``str()``'], 'type': 'object', 'additionalProperties': False, 'properties': {'attr': {'type': 'string', 'format': 'python-qualified-identifier'}}, 'required': ['attr']}, 'find-directive': {'$id': '#/definitions/find-directive', 'title': "'find:' directive", 'type': 'object', 'additionalProperties': False, 'properties': {'find': {'type': 'object', '$$description': ['Dynamic `package discovery', '<https://setuptools.pypa.io/en/latest/userguide/package_discovery.html>`_.'], 'additionalProperties': False, 'properties': {'where': {'description': 'Directories to be searched for packages (Unix-style relative path)', 'type': 'array', 'items': {'type': 'string'}}, 'exclude': {'type': 'array', '$$description': ['Exclude packages that match the values listed in this field.', "Can container shell-style wildcards (e.g. ``'pkg.*'``)"], 'items': {'type': 'string'}}, 'include': {'type': 'array', '$$description': ['Restrict the found packages to just the ones listed in this field.', "Can container shell-style wildcards (e.g. ``'pkg.*'``)"], 'items': {'type': 'string'}}, 'namespaces': {'type': 'boolean', '$$description': ['When ``True``, directories without a ``__init__.py`` file will also', 'be scanned for :pep:`420`-style implicit namespaces']}}}}}}}}}, 'dependency-groups': {'type': 'object', 'description': 'Dependency groups following PEP 735', 'additionalProperties': False, 'patternProperties': {'^([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9._-]*[a-zA-Z0-9])$': {'type': 'array', 'items': {'oneOf': [{'type': 'string', 'description': 'Python package specifiers following PEP 508', 'format': 'pep508'}, {'type': 'object', 'additionalProperties': False, 'properties': {'include-group': {'description': 'Another dependency group to include in this one', 'type': 'string', 'pattern': '^([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9._-]*[a-zA-Z0-9])$'}}}]}}}}}, 'project': {'$schema': 'http://json-schema.org/draft-07/schema#', '$id': 'https://packaging.python.org/en/latest/specifications/pyproject-toml/', 'title': 'Package metadata stored in the ``project`` table', '$$description': ['Data structure for the **project** table inside ``pyproject.toml``', '(as initially defined in :pep:`621`)'], 'type': 'object', 'properties': {'name': {'type': 'string', 'description': 'The name (primary identifier) of the project. MUST be statically defined.', 'format': 'pep508-identifier'}, 'version': {'type': 'string', 'description': 'The version of the project as supported by :pep:`440`.', 'format': 'pep440'}, 'description': {'type': 'string', '$$description': ['The `summary description of the project', '<https://packaging.python.org/specifications/core-metadata/#summary>`_']}, 'readme': {'$$description': ['`Full/detailed description of the project in the form of a README', '<https://peps.python.org/pep-0621/#readme>`_', "with meaning similar to the one defined in `core metadata's Description", '<https://packaging.python.org/specifications/core-metadata/#description>`_'], 'oneOf': [{'type': 'string', '$$description': ['Relative path to a text file (UTF-8) containing the full description', 'of the project. If the file path ends in case-insensitive ``.md`` or', '``.rst`` suffixes, then the content-type is respectively', '``text/markdown`` or ``text/x-rst``']}, {'type': 'object', 'allOf': [{'anyOf': [{'properties': {'file': {'type': 'string', '$$description': ['Relative path to a text file containing the full description', 'of the project.']}}, 'required': ['file']}, {'properties': {'text': {'type': 'string', 'description': 'Full text describing the project.'}}, 'required': ['text']}]}, {'properties': {'content-type': {'type': 'string', '$$description': ['Content-type (:rfc:`1341`) of the full description', '(e.g. ``text/markdown``). The ``charset`` parameter is assumed', 'UTF-8 when not present.'], '$comment': 'TODO: add regex pattern or format?'}}, 'required': ['content-type']}]}]}, 'requires-python': {'type': 'string', 'format': 'pep508-versionspec', '$$description': ['`The Python version requirements of the project', '<https://packaging.python.org/specifications/core-metadata/#requires-python>`_.']}, 'license': {'description': '`Project license <https://peps.python.org/pep-0621/#license>`_.', 'oneOf': [{'type': 'string', 'description': 'An SPDX license identifier', 'format': 'SPDX'}, {'type': 'object', 'properties': {'file': {'type': 'string', '$$description': ['Relative path to the file (UTF-8) which contains the license for the', 'project.']}}, 'required': ['file']}, {'type': 'object', 'properties': {'text': {'type': 'string', '$$description': ['The license of the project whose meaning is that of the', '`License field from the core metadata', '<https://packaging.python.org/specifications/core-metadata/#license>`_.']}}, 'required': ['text']}]}, 'license-files': {'description': 'Paths or globs to paths of license files', 'type': 'array', 'items': {'type': 'string'}}, 'authors': {'type': 'array', 'items': {'$ref': '#/definitions/author'}, '$$description': ["The people or organizations considered to be the 'authors' of the project.", 'The exact meaning is open to interpretation (e.g. original or primary authors,', 'current maintainers, or owners of the package).']}, 'maintainers': {'type': 'array', 'items': {'$ref': '#/definitions/author'}, '$$description': ["The people or organizations considered to be the 'maintainers' of the project.", 'Similarly to ``authors``, the exact meaning is open to interpretation.']}, 'keywords': {'type': 'array', 'items': {'type': 'string'}, 'description': 'List of keywords to assist searching for the distribution in a larger catalog.'}, 'classifiers': {'type': 'array', 'items': {'type': 'string', 'format': 'trove-classifier', 'description': '`PyPI classifier <https://pypi.org/classifiers/>`_.'}, '$$description': ['`Trove classifiers <https://pypi.org/classifiers/>`_', 'which apply to the project.']}, 'urls': {'type': 'object', 'description': 'URLs associated with the project in the form ``label => value``.', 'additionalProperties': False, 'patternProperties': {'^.+$': {'type': 'string', 'format': 'url'}}}, 'scripts': {'$ref': '#/definitions/entry-point-group', '$$description': ['Instruct the installer to create command-line wrappers for the given', '`entry points <https://packaging.python.org/specifications/entry-points/>`_.']}, 'gui-scripts': {'$ref': '#/definitions/entry-point-group', '$$description': ['Instruct the installer to create GUI wrappers for the given', '`entry points <https://packaging.python.org/specifications/entry-points/>`_.', 'The difference between ``scripts`` and ``gui-scripts`` is only relevant in', 'Windows.']}, 'entry-points': {'$$description': ['Instruct the installer to expose the given modules/functions via', '``entry-point`` discovery mechanism (useful for plugins).', 'More information available in the `Python packaging guide', '<https://packaging.python.org/specifications/entry-points/>`_.'], 'propertyNames': {'format': 'python-entrypoint-group'}, 'additionalProperties': False, 'patternProperties': {'^.+$': {'$ref': '#/definitions/entry-point-group'}}}, 'dependencies': {'type': 'array', 'description': 'Project (mandatory) dependencies.', 'items': {'$ref': '#/definitions/dependency'}}, 'optional-dependencies': {'type': 'object', 'description': 'Optional dependency for the project', 'propertyNames': {'format': 'pep508-identifier'}, 'additionalProperties': False, 'patternProperties': {'^.+$': {'type': 'array', 'items': {'$ref': '#/definitions/dependency'}}}}, 'dynamic': {'type': 'array', '$$description': ['Specifies which fields are intentionally unspecified and expected to be', 'dynamically provided by build tools'], 'items': {'enum': ['version', 'description', 'readme', 'requires-python', 'license', 'license-files', 'authors', 'maintainers', 'keywords', 'classifiers', 'urls', 'scripts', 'gui-scripts', 'entry-points', 'dependencies', 'optional-dependencies']}}}, 'required': ['name'], 'additionalProperties': False, 'allOf': [{'if': {'not': {'required': ['dynamic'], 'properties': {'dynamic': {'contains': {'const': 'version'}, '$$description': ['version is listed in ``dynamic``']}}}, '$$comment': ['According to :pep:`621`:', '    If the core metadata specification lists a field as "Required", then', '    the metadata MUST specify the field statically or list it in dynamic', 'In turn, `core metadata`_ defines:', '    The required fields are: Metadata-Version, Name, Version.', '    All the other fields are optional.', 'Since ``Metadata-Version`` is defined by the build back-end, ``name`` and', '``version`` are the only mandatory information in ``pyproject.toml``.', '.. _core metadata: https://packaging.python.org/specifications/core-metadata/']}, 'then': {'required': ['version'], '$$description': ['version should be statically defined in the ``version`` field']}}, {'if': {'required': ['license-files']}, 'then': {'properties': {'license': {'type': 'string'}}}}], 'definitions': {'author': {'$id': '#/definitions/author', 'title': 'Author or Maintainer', '$comment': 'https://peps.python.org/pep-0621/#authors-maintainers', 'type': 'object', 'additionalProperties': False, 'properties': {'name': {'type': 'string', '$$description': ['MUST be a valid email name, i.e. whatever can be put as a name, before an', 'email, in :rfc:`822`.']}, 'email': {'type': 'string', 'format': 'idn-email', 'description': 'MUST be a valid email address'}}}, 'entry-point-group': {'$id': '#/definitions/entry-point-group', 'title': 'Entry-points', 'type': 'object', '$$description': ['Entry-points are grouped together to indicate what sort of capabilities they', 'provide.', 'See the `packaging guides', '<https://packaging.python.org/specifications/entry-points/>`_', 'and `setuptools docs', '<https://setuptools.pypa.io/en/latest/userguide/entry_point.html>`_', 'for more information.'], 'propertyNames': {'format': 'python-entrypoint-name'}, 'additionalProperties': False, 'patternProperties': {'^.+$': {'type': 'string', '$$description': ['Reference to a Python object. It is either in the form', '``importable.module``, or ``importable.module:object.attr``.'], 'format': 'python-entrypoint-reference', '$comment': 'https://packaging.python.org/specifications/entry-points/'}}}, 'dependency': {'$id': '#/definitions/dependency', 'title': 'Dependency', 'type': 'string', 'description': 'Project dependency specification according to PEP 508', 'format': 'pep508'}}}}, rule='type')+        raise JsonSchemaValueException("" + (name_prefix or "data") + " must be object", value=data, name="" + (name_prefix or "data") + "", definition={'$schema': 'http://json-schema.org/draft-07/schema#', '$id': 'https://packaging.python.org/en/latest/specifications/declaring-build-dependencies/', 'title': 'Data structure for ``pyproject.toml`` files', '$$description': ['File format containing build-time configurations for the Python ecosystem. ', ':pep:`517` initially defined a build-system independent format for source trees', 'which was complemented by :pep:`518` to provide a way of specifying dependencies ', 'for building Python projects.', 'Please notice the ``project`` table (as initially defined in  :pep:`621`) is not included', 'in this schema and should be considered separately.'], 'type': 'object', 'additionalProperties': False, 'properties': {'build-system': {'type': 'object', 'description': 'Table used to store build-related data', 'additionalProperties': False, 'properties': {'requires': {'type': 'array', '$$description': ['List of dependencies in the :pep:`508` format required to execute the build', 'system. Please notice that the resulting dependency graph', '**MUST NOT contain cycles**'], 'items': {'type': 'string'}}, 'build-backend': {'type': 'string', 'description': 'Python object that will be used to perform the build according to :pep:`517`', 'format': 'pep517-backend-reference'}, 'backend-path': {'type': 'array', '$$description': ['List of directories to be prepended to ``sys.path`` when loading the', 'back-end, and running its hooks'], 'items': {'type': 'string', '$comment': 'Should be a path (TODO: enforce it with format?)'}}}, 'required': ['requires']}, 'project': {'$schema': 'http://json-schema.org/draft-07/schema#', '$id': 'https://packaging.python.org/en/latest/specifications/pyproject-toml/', 'title': 'Package metadata stored in the ``project`` table', '$$description': ['Data structure for the **project** table inside ``pyproject.toml``', '(as initially defined in :pep:`621`)'], 'type': 'object', 'properties': {'name': {'type': 'string', 'description': 'The name (primary identifier) of the project. MUST be statically defined.', 'format': 'pep508-identifier'}, 'version': {'type': 'string', 'description': 'The version of the project as supported by :pep:`440`.', 'format': 'pep440'}, 'description': {'type': 'string', '$$description': ['The `summary description of the project', '<https://packaging.python.org/specifications/core-metadata/#summary>`_']}, 'readme': {'$$description': ['`Full/detailed description of the project in the form of a README', '<https://peps.python.org/pep-0621/#readme>`_', "with meaning similar to the one defined in `core metadata's Description", '<https://packaging.python.org/specifications/core-metadata/#description>`_'], 'oneOf': [{'type': 'string', '$$description': ['Relative path to a text file (UTF-8) containing the full description', 'of the project. If the file path ends in case-insensitive ``.md`` or', '``.rst`` suffixes, then the content-type is respectively', '``text/markdown`` or ``text/x-rst``']}, {'type': 'object', 'allOf': [{'anyOf': [{'properties': {'file': {'type': 'string', '$$description': ['Relative path to a text file containing the full description', 'of the project.']}}, 'required': ['file']}, {'properties': {'text': {'type': 'string', 'description': 'Full text describing the project.'}}, 'required': ['text']}]}, {'properties': {'content-type': {'type': 'string', '$$description': ['Content-type (:rfc:`1341`) of the full description', '(e.g. ``text/markdown``). The ``charset`` parameter is assumed', 'UTF-8 when not present.'], '$comment': 'TODO: add regex pattern or format?'}}, 'required': ['content-type']}]}]}, 'requires-python': {'type': 'string', 'format': 'pep508-versionspec', '$$description': ['`The Python version requirements of the project', '<https://packaging.python.org/specifications/core-metadata/#requires-python>`_.']}, 'license': {'description': '`Project license <https://peps.python.org/pep-0621/#license>`_.', 'oneOf': [{'type': 'string', 'description': 'An SPDX license identifier', 'format': 'SPDX'}, {'type': 'object', 'properties': {'file': {'type': 'string', '$$description': ['Relative path to the file (UTF-8) which contains the license for the', 'project.']}}, 'required': ['file']}, {'type': 'object', 'properties': {'text': {'type': 'string', '$$description': ['The license of the project whose meaning is that of the', '`License field from the core metadata', '<https://packaging.python.org/specifications/core-metadata/#license>`_.']}}, 'required': ['text']}]}, 'license-files': {'description': 'Paths or globs to paths of license files', 'type': 'array', 'items': {'type': 'string'}}, 'authors': {'type': 'array', 'items': {'$ref': '#/definitions/author'}, '$$description': ["The people or organizations considered to be the 'authors' of the project.", 'The exact meaning is open to interpretation (e.g. original or primary authors,', 'current maintainers, or owners of the package).']}, 'maintainers': {'type': 'array', 'items': {'$ref': '#/definitions/author'}, '$$description': ["The people or organizations considered to be the 'maintainers' of the project.", 'Similarly to ``authors``, the exact meaning is open to interpretation.']}, 'keywords': {'type': 'array', 'items': {'type': 'string'}, 'description': 'List of keywords to assist searching for the distribution in a larger catalog.'}, 'classifiers': {'type': 'array', 'items': {'type': 'string', 'format': 'trove-classifier', 'description': '`PyPI classifier <https://pypi.org/classifiers/>`_.'}, '$$description': ['`Trove classifiers <https://pypi.org/classifiers/>`_', 'which apply to the project.']}, 'urls': {'type': 'object', 'description': 'URLs associated with the project in the form ``label => value``.', 'additionalProperties': False, 'patternProperties': {'^.+$': {'type': 'string', 'format': 'url'}}}, 'scripts': {'$ref': '#/definitions/entry-point-group', '$$description': ['Instruct the installer to create command-line wrappers for the given', '`entry points <https://packaging.python.org/specifications/entry-points/>`_.']}, 'gui-scripts': {'$ref': '#/definitions/entry-point-group', '$$description': ['Instruct the installer to create GUI wrappers for the given', '`entry points <https://packaging.python.org/specifications/entry-points/>`_.', 'The difference between ``scripts`` and ``gui-scripts`` is only relevant in', 'Windows.']}, 'entry-points': {'$$description': ['Instruct the installer to expose the given modules/functions via', '``entry-point`` discovery mechanism (useful for plugins).', 'More information available in the `Python packaging guide', '<https://packaging.python.org/specifications/entry-points/>`_.'], 'propertyNames': {'format': 'python-entrypoint-group'}, 'additionalProperties': False, 'patternProperties': {'^.+$': {'$ref': '#/definitions/entry-point-group'}}}, 'dependencies': {'type': 'array', 'description': 'Project (mandatory) dependencies.', 'items': {'$ref': '#/definitions/dependency'}}, 'optional-dependencies': {'type': 'object', 'description': 'Optional dependency for the project', 'propertyNames': {'format': 'pep508-identifier'}, 'additionalProperties': False, 'patternProperties': {'^.+$': {'type': 'array', 'items': {'$ref': '#/definitions/dependency'}}}}, 'import-names': {'description': 'Lists import names which a project, when installed, would exclusively provide.', 'type': 'array', 'items': {'type': 'string', 'format': 'import-name'}}, 'import-namespaces': {'description': 'Lists import names that, when installed, would be provided by the project, but not exclusively.', 'type': 'array', 'items': {'type': 'string', 'format': 'import-name'}}, 'dynamic': {'type': 'array', '$$description': ['Specifies which fields are intentionally unspecified and expected to be', 'dynamically provided by build tools'], 'items': {'enum': ['version', 'description', 'readme', 'requires-python', 'license', 'license-files', 'authors', 'maintainers', 'keywords', 'classifiers', 'urls', 'scripts', 'gui-scripts', 'entry-points', 'dependencies', 'optional-dependencies', 'import-names', 'import-namespaces']}}}, 'required': ['name'], 'additionalProperties': False, 'allOf': [{'if': {'not': {'required': ['dynamic'], 'properties': {'dynamic': {'contains': {'const': 'version'}, '$$description': ['version is listed in ``dynamic``']}}}, '$$comment': ['According to :pep:`621`:', '    If the core metadata specification lists a field as "Required", then', '    the metadata MUST specify the field statically or list it in dynamic', 'In turn, `core metadata`_ defines:', '    The required fields are: Metadata-Version, Name, Version.', '    All the other fields are optional.', 'Since ``Metadata-Version`` is defined by the build back-end, ``name`` and', '``version`` are the only mandatory information in ``pyproject.toml``.', '.. _core metadata: https://packaging.python.org/specifications/core-metadata/']}, 'then': {'required': ['version'], '$$description': ['version should be statically defined in the ``version`` field']}}, {'if': {'required': ['license-files']}, 'then': {'properties': {'license': {'type': 'string'}}}}], 'definitions': {'author': {'$id': '#/definitions/author', 'title': 'Author or Maintainer', '$comment': 'https://peps.python.org/pep-0621/#authors-maintainers', 'type': 'object', 'additionalProperties': False, 'properties': {'name': {'type': 'string', '$$description': ['MUST be a valid email name, i.e. whatever can be put as a name, before an', 'email, in :rfc:`822`.']}, 'email': {'type': 'string', 'format': 'idn-email', 'description': 'MUST be a valid email address'}}, 'anyOf': [{'required': ['name']}, {'required': ['email']}]}, 'entry-point-group': {'$id': '#/definitions/entry-point-group', 'title': 'Entry-points', 'type': 'object', '$$description': ['Entry-points are grouped together to indicate what sort of capabilities they', 'provide.', 'See the `packaging guides', '<https://packaging.python.org/specifications/entry-points/>`_', 'and `setuptools docs', '<https://setuptools.pypa.io/en/latest/userguide/entry_point.html>`_', 'for more information.'], 'propertyNames': {'format': 'python-entrypoint-name'}, 'additionalProperties': False, 'patternProperties': {'^.+$': {'type': 'string', '$$description': ['Reference to a Python object. It is either in the form', '``importable.module``, or ``importable.module:object.attr``.'], 'format': 'python-entrypoint-reference', '$comment': 'https://packaging.python.org/specifications/entry-points/'}}}, 'dependency': {'$id': '#/definitions/dependency', 'title': 'Dependency', 'type': 'string', 'description': 'Project dependency specification according to PEP 508', 'format': 'pep508'}}}, 'tool': {'type': 'object', 'properties': {'distutils': {'$schema': 'http://json-schema.org/draft-07/schema#', '$id': 'https://setuptools.pypa.io/en/latest/deprecated/distutils/configfile.html', 'title': '``tool.distutils`` table', '$$description': ['**EXPERIMENTAL** (NOT OFFICIALLY SUPPORTED): Use ``tool.distutils``', 'subtables to configure arguments for ``distutils`` commands.', 'Originally, ``distutils`` allowed developers to configure arguments for', '``setup.py`` commands via `distutils configuration files', '<https://setuptools.pypa.io/en/latest/deprecated/distutils/configfile.html>`_.', 'See also `the old Python docs <https://docs.python.org/3.11/install/>_`.'], 'type': 'object', 'properties': {'global': {'type': 'object', 'description': 'Global options applied to all ``distutils`` commands'}}, 'patternProperties': {'.+': {'type': 'object'}}, '$comment': 'TODO: Is there a practical way of making this schema more specific?'}, 'setuptools': {'$schema': 'http://json-schema.org/draft-07/schema#', '$id': 'https://setuptools.pypa.io/en/latest/userguide/pyproject_config.html', 'title': '``tool.setuptools`` table', '$$description': ['``setuptools``-specific configurations that can be set by users that require', 'customization.', 'These configurations are completely optional and probably can be skipped when', 'creating simple packages. They are equivalent to some of the `Keywords', '<https://setuptools.pypa.io/en/latest/references/keywords.html>`_', 'used by the ``setup.py`` file, and can be set via the ``tool.setuptools`` table.', 'It considers only ``setuptools`` `parameters', '<https://setuptools.pypa.io/en/latest/userguide/pyproject_config.html#setuptools-specific-configuration>`_', 'that are not covered by :pep:`621`; and intentionally excludes ``dependency_links``', 'and ``setup_requires`` (incompatible with modern workflows/standards).'], 'type': 'object', 'additionalProperties': False, 'properties': {'platforms': {'type': 'array', 'items': {'type': 'string'}}, 'provides': {'$$description': ['Package and virtual package names contained within this package', '**(not supported by pip)**'], 'type': 'array', 'items': {'type': 'string', 'format': 'pep508-identifier'}}, 'obsoletes': {'$$description': ['Packages which this package renders obsolete', '**(not supported by pip)**'], 'type': 'array', 'items': {'type': 'string', 'format': 'pep508-identifier'}}, 'zip-safe': {'$$description': ['Whether the project can be safely installed and run from a zip file.', '**OBSOLETE**: only relevant for ``pkg_resources``, ``easy_install`` and', '``setup.py install`` in the context of ``eggs`` (**DEPRECATED**).'], 'type': 'boolean'}, 'script-files': {'$$description': ['Legacy way of defining scripts (entry-points are preferred).', 'Equivalent to the ``script`` keyword in ``setup.py``', '(it was renamed to avoid confusion with entry-point based ``project.scripts``', 'defined in :pep:`621`).', '**DISCOURAGED**: generic script wrappers are tricky and may not work properly.', 'Whenever possible, please use ``project.scripts`` instead.'], 'type': 'array', 'items': {'type': 'string'}, '$comment': 'TODO: is this field deprecated/should be removed?'}, 'eager-resources': {'$$description': ['Resources that should be extracted together, if any of them is needed,', 'or if any C extensions included in the project are imported.', '**OBSOLETE**: only relevant for ``pkg_resources``, ``easy_install`` and', '``setup.py install`` in the context of ``eggs`` (**DEPRECATED**).'], 'type': 'array', 'items': {'type': 'string'}}, 'packages': {'$$description': ['Packages that should be included in the distribution.', 'It can be given either as a list of package identifiers', 'or as a ``dict``-like structure with a single key ``find``', 'which corresponds to a dynamic call to', '``setuptools.config.expand.find_packages`` function.', 'The ``find`` key is associated with a nested ``dict``-like structure that can', 'contain ``where``, ``include``, ``exclude`` and ``namespaces`` keys,', 'mimicking the keyword arguments of the associated function.'], 'oneOf': [{'title': 'Array of Python package identifiers', 'type': 'array', 'items': {'$ref': '#/definitions/package-name'}}, {'$ref': '#/definitions/find-directive'}]}, 'package-dir': {'$$description': [':class:`dict`-like structure mapping from package names to directories where their', 'code can be found.', 'The empty string (as key) means that all packages are contained inside', 'the given directory will be included in the distribution.'], 'type': 'object', 'additionalProperties': False, 'propertyNames': {'anyOf': [{'const': ''}, {'$ref': '#/definitions/package-name'}]}, 'patternProperties': {'^.*$': {'type': 'string'}}}, 'package-data': {'$$description': ['Mapping from package names to lists of glob patterns.', 'Usually this option is not needed when using ``include-package-data = true``', 'For more information on how to include data files, check ``setuptools`` `docs', '<https://setuptools.pypa.io/en/latest/userguide/datafiles.html>`_.'], 'type': 'object', 'additionalProperties': False, 'propertyNames': {'anyOf': [{'$ref': '#/definitions/package-name'}, {'const': '*'}]}, 'patternProperties': {'^.*$': {'type': 'array', 'items': {'type': 'string'}}}}, 'include-package-data': {'$$description': ['Automatically include any data files inside the package directories', 'that are specified by ``MANIFEST.in``', 'For more information on how to include data files, check ``setuptools`` `docs', '<https://setuptools.pypa.io/en/latest/userguide/datafiles.html>`_.'], 'type': 'boolean'}, 'exclude-package-data': {'$$description': ['Mapping from package names to lists of glob patterns that should be excluded', 'For more information on how to include data files, check ``setuptools`` `docs', '<https://setuptools.pypa.io/en/latest/userguide/datafiles.html>`_.'], 'type': 'object', 'additionalProperties': False, 'propertyNames': {'anyOf': [{'$ref': '#/definitions/package-name'}, {'const': '*'}]}, 'patternProperties': {'^.*$': {'type': 'array', 'items': {'type': 'string'}}}}, 'namespace-packages': {'type': 'array', 'items': {'type': 'string', 'format': 'python-module-name-relaxed'}, '$comment': 'https://setuptools.pypa.io/en/latest/userguide/package_discovery.html', 'description': '**DEPRECATED**: use implicit namespaces instead (:pep:`420`).'}, 'py-modules': {'description': 'Modules that setuptools will manipulate', 'type': 'array', 'items': {'type': 'string', 'format': 'python-module-name-relaxed'}, '$comment': 'TODO: clarify the relationship with ``packages``'}, 'ext-modules': {'description': 'Extension modules to be compiled by setuptools', 'type': 'array', 'items': {'$ref': '#/definitions/ext-module'}}, 'data-files': {'$$description': ['``dict``-like structure where each key represents a directory and', 'the value is a list of glob patterns that should be installed in them.', '**DISCOURAGED**: please notice this might not work as expected with wheels.', 'Whenever possible, consider using data files inside the package directories', '(or create a new namespace package that only contains data files).', 'See `data files support', '<https://setuptools.pypa.io/en/latest/userguide/datafiles.html>`_.'], 'type': 'object', 'patternProperties': {'^.*$': {'type': 'array', 'items': {'type': 'string'}}}}, 'cmdclass': {'$$description': ['Mapping of distutils-style command names to ``setuptools.Command`` subclasses', 'which in turn should be represented by strings with a qualified class name', '(i.e., "dotted" form with module), e.g.::\n\n', '    cmdclass = {mycmd = "pkg.subpkg.module.CommandClass"}\n\n', 'The command class should be a directly defined at the top-level of the', 'containing module (no class nesting).'], 'type': 'object', 'patternProperties': {'^.*$': {'type': 'string', 'format': 'python-qualified-identifier'}}}, 'license-files': {'type': 'array', 'items': {'type': 'string'}, '$$description': ['**PROVISIONAL**: list of glob patterns for all license files being distributed.', '(likely to become standard with :pep:`639`).', "By default: ``['LICEN[CS]E*', 'COPYING*', 'NOTICE*', 'AUTHORS*']``"], '$comment': 'TODO: revise if PEP 639 is accepted. Probably ``project.license-files``?'}, 'dynamic': {'type': 'object', 'description': 'Instructions for loading :pep:`621`-related metadata dynamically', 'additionalProperties': False, 'properties': {'version': {'$$description': ['A version dynamically loaded via either the ``attr:`` or ``file:``', 'directives. Please make sure the given file or attribute respects :pep:`440`.', 'Also ensure to set ``project.dynamic`` accordingly.'], 'oneOf': [{'$ref': '#/definitions/attr-directive'}, {'$ref': '#/definitions/file-directive'}]}, 'classifiers': {'$ref': '#/definitions/file-directive'}, 'description': {'$ref': '#/definitions/file-directive'}, 'entry-points': {'$ref': '#/definitions/file-directive'}, 'dependencies': {'$ref': '#/definitions/file-directive-for-dependencies'}, 'optional-dependencies': {'type': 'object', 'propertyNames': {'type': 'string', 'format': 'pep508-identifier'}, 'additionalProperties': False, 'patternProperties': {'.+': {'$ref': '#/definitions/file-directive-for-dependencies'}}}, 'readme': {'type': 'object', 'anyOf': [{'$ref': '#/definitions/file-directive'}, {'type': 'object', 'properties': {'content-type': {'type': 'string'}, 'file': {'$ref': '#/definitions/file-directive/properties/file'}}, 'additionalProperties': False}], 'required': ['file']}}}}, 'definitions': {'package-name': {'$id': '#/definitions/package-name', 'title': 'Valid package name', 'description': 'Valid package name (importable or :pep:`561`).', 'type': 'string', 'anyOf': [{'type': 'string', 'format': 'python-module-name-relaxed'}, {'type': 'string', 'format': 'pep561-stub-name'}]}, 'ext-module': {'$id': '#/definitions/ext-module', 'title': 'Extension module', 'description': 'Parameters to construct a :class:`setuptools.Extension` object', 'type': 'object', 'required': ['name', 'sources'], 'additionalProperties': False, 'properties': {'name': {'type': 'string', 'format': 'python-module-name-relaxed'}, 'sources': {'type': 'array', 'items': {'type': 'string'}}, 'include-dirs': {'type': 'array', 'items': {'type': 'string'}}, 'define-macros': {'type': 'array', 'items': {'type': 'array', 'items': [{'description': 'macro name', 'type': 'string'}, {'description': 'macro value', 'oneOf': [{'type': 'string'}, {'type': 'null'}]}], 'additionalItems': False}}, 'undef-macros': {'type': 'array', 'items': {'type': 'string'}}, 'library-dirs': {'type': 'array', 'items': {'type': 'string'}}, 'libraries': {'type': 'array', 'items': {'type': 'string'}}, 'runtime-library-dirs': {'type': 'array', 'items': {'type': 'string'}}, 'extra-objects': {'type': 'array', 'items': {'type': 'string'}}, 'extra-compile-args': {'type': 'array', 'items': {'type': 'string'}}, 'extra-link-args': {'type': 'array', 'items': {'type': 'string'}}, 'export-symbols': {'type': 'array', 'items': {'type': 'string'}}, 'swig-opts': {'type': 'array', 'items': {'type': 'string'}}, 'depends': {'type': 'array', 'items': {'type': 'string'}}, 'language': {'type': 'string'}, 'optional': {'type': 'boolean'}, 'py-limited-api': {'type': 'boolean'}}}, 'file-directive': {'$id': '#/definitions/file-directive', 'title': "'file:' directive", 'description': 'Value is read from a file (or list of files and then concatenated)', 'type': 'object', 'additionalProperties': False, 'properties': {'file': {'oneOf': [{'type': 'string'}, {'type': 'array', 'items': {'type': 'string'}}]}}, 'required': ['file']}, 'file-directive-for-dependencies': {'title': "'file:' directive for dependencies", 'allOf': [{'$$description': ['**BETA**: subset of the ``requirements.txt`` format', 'without ``pip`` flags and options', '(one :pep:`508`-compliant string per line,', 'lines that are blank or start with ``#`` are excluded).', 'See `dynamic metadata', '<https://setuptools.pypa.io/en/latest/userguide/pyproject_config.html#dynamic-metadata>`_.']}, {'$ref': '#/definitions/file-directive'}]}, 'attr-directive': {'title': "'attr:' directive", '$id': '#/definitions/attr-directive', '$$description': ['Value is read from a module attribute. Supports callables and iterables;', 'unsupported types are cast via ``str()``'], 'type': 'object', 'additionalProperties': False, 'properties': {'attr': {'type': 'string', 'format': 'python-qualified-identifier'}}, 'required': ['attr']}, 'find-directive': {'$id': '#/definitions/find-directive', 'title': "'find:' directive", 'type': 'object', 'additionalProperties': False, 'properties': {'find': {'type': 'object', '$$description': ['Dynamic `package discovery', '<https://setuptools.pypa.io/en/latest/userguide/package_discovery.html>`_.'], 'additionalProperties': False, 'properties': {'where': {'description': 'Directories to be searched for packages (Unix-style relative path)', 'type': 'array', 'items': {'type': 'string'}}, 'exclude': {'type': 'array', '$$description': ['Exclude packages that match the values listed in this field.', "Can container shell-style wildcards (e.g. ``'pkg.*'``)"], 'items': {'type': 'string'}}, 'include': {'type': 'array', '$$description': ['Restrict the found packages to just the ones listed in this field.', "Can container shell-style wildcards (e.g. ``'pkg.*'``)"], 'items': {'type': 'string'}}, 'namespaces': {'type': 'boolean', '$$description': ['When ``True``, directories without a ``__init__.py`` file will also', 'be scanned for :pep:`420`-style implicit namespaces']}}}}}}}}}, 'dependency-groups': {'type': 'object', 'description': 'Dependency groups following PEP 735', 'additionalProperties': False, 'patternProperties': {'^([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9._-]*[a-zA-Z0-9])$': {'type': 'array', 'items': {'oneOf': [{'type': 'string', 'description': 'Python package specifiers following PEP 508', 'format': 'pep508'}, {'type': 'object', 'additionalProperties': False, 'properties': {'include-group': {'description': 'Another dependency group to include in this one', 'type': 'string', 'pattern': '^([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9._-]*[a-zA-Z0-9])$'}}}]}}}}}, 'project': {'$schema': 'http://json-schema.org/draft-07/schema#', '$id': 'https://packaging.python.org/en/latest/specifications/pyproject-toml/', 'title': 'Package metadata stored in the ``project`` table', '$$description': ['Data structure for the **project** table inside ``pyproject.toml``', '(as initially defined in :pep:`621`)'], 'type': 'object', 'properties': {'name': {'type': 'string', 'description': 'The name (primary identifier) of the project. MUST be statically defined.', 'format': 'pep508-identifier'}, 'version': {'type': 'string', 'description': 'The version of the project as supported by :pep:`440`.', 'format': 'pep440'}, 'description': {'type': 'string', '$$description': ['The `summary description of the project', '<https://packaging.python.org/specifications/core-metadata/#summary>`_']}, 'readme': {'$$description': ['`Full/detailed description of the project in the form of a README', '<https://peps.python.org/pep-0621/#readme>`_', "with meaning similar to the one defined in `core metadata's Description", '<https://packaging.python.org/specifications/core-metadata/#description>`_'], 'oneOf': [{'type': 'string', '$$description': ['Relative path to a text file (UTF-8) containing the full description', 'of the project. If the file path ends in case-insensitive ``.md`` or', '``.rst`` suffixes, then the content-type is respectively', '``text/markdown`` or ``text/x-rst``']}, {'type': 'object', 'allOf': [{'anyOf': [{'properties': {'file': {'type': 'string', '$$description': ['Relative path to a text file containing the full description', 'of the project.']}}, 'required': ['file']}, {'properties': {'text': {'type': 'string', 'description': 'Full text describing the project.'}}, 'required': ['text']}]}, {'properties': {'content-type': {'type': 'string', '$$description': ['Content-type (:rfc:`1341`) of the full description', '(e.g. ``text/markdown``). The ``charset`` parameter is assumed', 'UTF-8 when not present.'], '$comment': 'TODO: add regex pattern or format?'}}, 'required': ['content-type']}]}]}, 'requires-python': {'type': 'string', 'format': 'pep508-versionspec', '$$description': ['`The Python version requirements of the project', '<https://packaging.python.org/specifications/core-metadata/#requires-python>`_.']}, 'license': {'description': '`Project license <https://peps.python.org/pep-0621/#license>`_.', 'oneOf': [{'type': 'string', 'description': 'An SPDX license identifier', 'format': 'SPDX'}, {'type': 'object', 'properties': {'file': {'type': 'string', '$$description': ['Relative path to the file (UTF-8) which contains the license for the', 'project.']}}, 'required': ['file']}, {'type': 'object', 'properties': {'text': {'type': 'string', '$$description': ['The license of the project whose meaning is that of the', '`License field from the core metadata', '<https://packaging.python.org/specifications/core-metadata/#license>`_.']}}, 'required': ['text']}]}, 'license-files': {'description': 'Paths or globs to paths of license files', 'type': 'array', 'items': {'type': 'string'}}, 'authors': {'type': 'array', 'items': {'$ref': '#/definitions/author'}, '$$description': ["The people or organizations considered to be the 'authors' of the project.", 'The exact meaning is open to interpretation (e.g. original or primary authors,', 'current maintainers, or owners of the package).']}, 'maintainers': {'type': 'array', 'items': {'$ref': '#/definitions/author'}, '$$description': ["The people or organizations considered to be the 'maintainers' of the project.", 'Similarly to ``authors``, the exact meaning is open to interpretation.']}, 'keywords': {'type': 'array', 'items': {'type': 'string'}, 'description': 'List of keywords to assist searching for the distribution in a larger catalog.'}, 'classifiers': {'type': 'array', 'items': {'type': 'string', 'format': 'trove-classifier', 'description': '`PyPI classifier <https://pypi.org/classifiers/>`_.'}, '$$description': ['`Trove classifiers <https://pypi.org/classifiers/>`_', 'which apply to the project.']}, 'urls': {'type': 'object', 'description': 'URLs associated with the project in the form ``label => value``.', 'additionalProperties': False, 'patternProperties': {'^.+$': {'type': 'string', 'format': 'url'}}}, 'scripts': {'$ref': '#/definitions/entry-point-group', '$$description': ['Instruct the installer to create command-line wrappers for the given', '`entry points <https://packaging.python.org/specifications/entry-points/>`_.']}, 'gui-scripts': {'$ref': '#/definitions/entry-point-group', '$$description': ['Instruct the installer to create GUI wrappers for the given', '`entry points <https://packaging.python.org/specifications/entry-points/>`_.', 'The difference between ``scripts`` and ``gui-scripts`` is only relevant in', 'Windows.']}, 'entry-points': {'$$description': ['Instruct the installer to expose the given modules/functions via', '``entry-point`` discovery mechanism (useful for plugins).', 'More information available in the `Python packaging guide', '<https://packaging.python.org/specifications/entry-points/>`_.'], 'propertyNames': {'format': 'python-entrypoint-group'}, 'additionalProperties': False, 'patternProperties': {'^.+$': {'$ref': '#/definitions/entry-point-group'}}}, 'dependencies': {'type': 'array', 'description': 'Project (mandatory) dependencies.', 'items': {'$ref': '#/definitions/dependency'}}, 'optional-dependencies': {'type': 'object', 'description': 'Optional dependency for the project', 'propertyNames': {'format': 'pep508-identifier'}, 'additionalProperties': False, 'patternProperties': {'^.+$': {'type': 'array', 'items': {'$ref': '#/definitions/dependency'}}}}, 'import-names': {'description': 'Lists import names which a project, when installed, would exclusively provide.', 'type': 'array', 'items': {'type': 'string', 'format': 'import-name'}}, 'import-namespaces': {'description': 'Lists import names that, when installed, would be provided by the project, but not exclusively.', 'type': 'array', 'items': {'type': 'string', 'format': 'import-name'}}, 'dynamic': {'type': 'array', '$$description': ['Specifies which fields are intentionally unspecified and expected to be', 'dynamically provided by build tools'], 'items': {'enum': ['version', 'description', 'readme', 'requires-python', 'license', 'license-files', 'authors', 'maintainers', 'keywords', 'classifiers', 'urls', 'scripts', 'gui-scripts', 'entry-points', 'dependencies', 'optional-dependencies', 'import-names', 'import-namespaces']}}}, 'required': ['name'], 'additionalProperties': False, 'allOf': [{'if': {'not': {'required': ['dynamic'], 'properties': {'dynamic': {'contains': {'const': 'version'}, '$$description': ['version is listed in ``dynamic``']}}}, '$$comment': ['According to :pep:`621`:', '    If the core metadata specification lists a field as "Required", then', '    the metadata MUST specify the field statically or list it in dynamic', 'In turn, `core metadata`_ defines:', '    The required fields are: Metadata-Version, Name, Version.', '    All the other fields are optional.', 'Since ``Metadata-Version`` is defined by the build back-end, ``name`` and', '``version`` are the only mandatory information in ``pyproject.toml``.', '.. _core metadata: https://packaging.python.org/specifications/core-metadata/']}, 'then': {'required': ['version'], '$$description': ['version should be statically defined in the ``version`` field']}}, {'if': {'required': ['license-files']}, 'then': {'properties': {'license': {'type': 'string'}}}}], 'definitions': {'author': {'$id': '#/definitions/author', 'title': 'Author or Maintainer', '$comment': 'https://peps.python.org/pep-0621/#authors-maintainers', 'type': 'object', 'additionalProperties': False, 'properties': {'name': {'type': 'string', '$$description': ['MUST be a valid email name, i.e. whatever can be put as a name, before an', 'email, in :rfc:`822`.']}, 'email': {'type': 'string', 'format': 'idn-email', 'description': 'MUST be a valid email address'}}, 'anyOf': [{'required': ['name']}, {'required': ['email']}]}, 'entry-point-group': {'$id': '#/definitions/entry-point-group', 'title': 'Entry-points', 'type': 'object', '$$description': ['Entry-points are grouped together to indicate what sort of capabilities they', 'provide.', 'See the `packaging guides', '<https://packaging.python.org/specifications/entry-points/>`_', 'and `setuptools docs', '<https://setuptools.pypa.io/en/latest/userguide/entry_point.html>`_', 'for more information.'], 'propertyNames': {'format': 'python-entrypoint-name'}, 'additionalProperties': False, 'patternProperties': {'^.+$': {'type': 'string', '$$description': ['Reference to a Python object. It is either in the form', '``importable.module``, or ``importable.module:object.attr``.'], 'format': 'python-entrypoint-reference', '$comment': 'https://packaging.python.org/specifications/entry-points/'}}}, 'dependency': {'$id': '#/definitions/dependency', 'title': 'Dependency', 'type': 'string', 'description': 'Project dependency specification according to PEP 508', 'format': 'pep508'}}}}, rule='type')     data_is_dict = isinstance(data, dict)@@ -89,3 +89,3 @@             if not isinstance(data__tool, (dict)):-                raise JsonSchemaValueException("" + (name_prefix or "data") + ".tool must be object", value=data__tool, name="" + (name_prefix or "data") + ".tool", definition={'type': 'object', 'properties': {'distutils': {'$schema': 'http://json-schema.org/draft-07/schema#', '$id': 'https://setuptools.pypa.io/en/latest/deprecated/distutils/configfile.html', 'title': '``tool.distutils`` table', '$$description': ['**EXPERIMENTAL** (NOT OFFICIALLY SUPPORTED): Use ``tool.distutils``', 'subtables to configure arguments for ``distutils`` commands.', 'Originally, ``distutils`` allowed developers to configure arguments for', '``setup.py`` commands via `distutils configuration files', '<https://setuptools.pypa.io/en/latest/deprecated/distutils/configfile.html>`_.', 'See also `the old Python docs <https://docs.python.org/3.11/install/>_`.'], 'type': 'object', 'properties': {'global': {'type': 'object', 'description': 'Global options applied to all ``distutils`` commands'}}, 'patternProperties': {'.+': {'type': 'object'}}, '$comment': 'TODO: Is there a practical way of making this schema more specific?'}, 'setuptools': {'$schema': 'http://json-schema.org/draft-07/schema#', '$id': 'https://setuptools.pypa.io/en/latest/userguide/pyproject_config.html', 'title': '``tool.setuptools`` table', '$$description': ['``setuptools``-specific configurations that can be set by users that require', 'customization.', 'These configurations are completely optional and probably can be skipped when', 'creating simple packages. They are equivalent to some of the `Keywords', '<https://setuptools.pypa.io/en/latest/references/keywords.html>`_', 'used by the ``setup.py`` file, and can be set via the ``tool.setuptools`` table.', 'It considers only ``setuptools`` `parameters', '<https://setuptools.pypa.io/en/latest/userguide/pyproject_config.html#setuptools-specific-configuration>`_', 'that are not covered by :pep:`621`; and intentionally excludes ``dependency_links``', 'and ``setup_requires`` (incompatible with modern workflows/standards).'], 'type': 'object', 'additionalProperties': False, 'properties': {'platforms': {'type': 'array', 'items': {'type': 'string'}}, 'provides': {'$$description': ['Package and virtual package names contained within this package', '**(not supported by pip)**'], 'type': 'array', 'items': {'type': 'string', 'format': 'pep508-identifier'}}, 'obsoletes': {'$$description': ['Packages which this package renders obsolete', '**(not supported by pip)**'], 'type': 'array', 'items': {'type': 'string', 'format': 'pep508-identifier'}}, 'zip-safe': {'$$description': ['Whether the project can be safely installed and run from a zip file.', '**OBSOLETE**: only relevant for ``pkg_resources``, ``easy_install`` and', '``setup.py install`` in the context of ``eggs`` (**DEPRECATED**).'], 'type': 'boolean'}, 'script-files': {'$$description': ['Legacy way of defining scripts (entry-points are preferred).', 'Equivalent to the ``script`` keyword in ``setup.py``', '(it was renamed to avoid confusion with entry-point based ``project.scripts``', 'defined in :pep:`621`).', '**DISCOURAGED**: generic script wrappers are tricky and may not work properly.', 'Whenever possible, please use ``project.scripts`` instead.'], 'type': 'array', 'items': {'type': 'string'}, '$comment': 'TODO: is this field deprecated/should be removed?'}, 'eager-resources': {'$$description': ['Resources that should be extracted together, if any of them is needed,', 'or if any C extensions included in the project are imported.', '**OBSOLETE**: only relevant for ``pkg_resources``, ``easy_install`` and', '``setup.py install`` in the context of ``eggs`` (**DEPRECATED**).'], 'type': 'array', 'items': {'type': 'string'}}, 'packages': {'$$description': ['Packages that should be included in the distribution.', 'It can be given either as a list of package identifiers', 'or as a ``dict``-like structure with a single key ``find``', 'which corresponds to a dynamic call to', '``setuptools.config.expand.find_packages`` function.', 'The ``find`` key is associated with a nested ``dict``-like structure that can', 'contain ``where``, ``include``, ``exclude`` and ``namespaces`` keys,', 'mimicking the keyword arguments of the associated function.'], 'oneOf': [{'title': 'Array of Python package identifiers', 'type': 'array', 'items': {'$ref': '#/definitions/package-name'}}, {'$ref': '#/definitions/find-directive'}]}, 'package-dir': {'$$description': [':class:`dict`-like structure mapping from package names to directories where their', 'code can be found.', 'The empty string (as key) means that all packages are contained inside', 'the given directory will be included in the distribution.'], 'type': 'object', 'additionalProperties': False, 'propertyNames': {'anyOf': [{'const': ''}, {'$ref': '#/definitions/package-name'}]}, 'patternProperties': {'^.*$': {'type': 'string'}}}, 'package-data': {'$$description': ['Mapping from package names to lists of glob patterns.', 'Usually this option is not needed when using ``include-package-data = true``', 'For more information on how to include data files, check ``setuptools`` `docs', '<https://setuptools.pypa.io/en/latest/userguide/datafiles.html>`_.'], 'type': 'object', 'additionalProperties': False, 'propertyNames': {'anyOf': [{'type': 'string', 'format': 'python-module-name'}, {'const': '*'}]}, 'patternProperties': {'^.*$': {'type': 'array', 'items': {'type': 'string'}}}}, 'include-package-data': {'$$description': ['Automatically include any data files inside the package directories', 'that are specified by ``MANIFEST.in``', 'For more information on how to include data files, check ``setuptools`` `docs', '<https://setuptools.pypa.io/en/latest/userguide/datafiles.html>`_.'], 'type': 'boolean'}, 'exclude-package-data': {'$$description': ['Mapping from package names to lists of glob patterns that should be excluded', 'For more information on how to include data files, check ``setuptools`` `docs', '<https://setuptools.pypa.io/en/latest/userguide/datafiles.html>`_.'], 'type': 'object', 'additionalProperties': False, 'propertyNames': {'anyOf': [{'type': 'string', 'format': 'python-module-name'}, {'const': '*'}]}, 'patternProperties': {'^.*$': {'type': 'array', 'items': {'type': 'string'}}}}, 'namespace-packages': {'type': 'array', 'items': {'type': 'string', 'format': 'python-module-name-relaxed'}, '$comment': 'https://setuptools.pypa.io/en/latest/userguide/package_discovery.html', 'description': '**DEPRECATED**: use implicit namespaces instead (:pep:`420`).'}, 'py-modules': {'description': 'Modules that setuptools will manipulate', 'type': 'array', 'items': {'type': 'string', 'format': 'python-module-name-relaxed'}, '$comment': 'TODO: clarify the relationship with ``packages``'}, 'ext-modules': {'description': 'Extension modules to be compiled by setuptools', 'type': 'array', 'items': {'$ref': '#/definitions/ext-module'}}, 'data-files': {'$$description': ['``dict``-like structure where each key represents a directory and', 'the value is a list of glob patterns that should be installed in them.', '**DISCOURAGED**: please notice this might not work as expected with wheels.', 'Whenever possible, consider using data files inside the package directories', '(or create a new namespace package that only contains data files).', 'See `data files support', '<https://setuptools.pypa.io/en/latest/userguide/datafiles.html>`_.'], 'type': 'object', 'patternProperties': {'^.*$': {'type': 'array', 'items': {'type': 'string'}}}}, 'cmdclass': {'$$description': ['Mapping of distutils-style command names to ``setuptools.Command`` subclasses', 'which in turn should be represented by strings with a qualified class name', '(i.e., "dotted" form with module), e.g.::\n\n', '    cmdclass = {mycmd = "pkg.subpkg.module.CommandClass"}\n\n', 'The command class should be a directly defined at the top-level of the', 'containing module (no class nesting).'], 'type': 'object', 'patternProperties': {'^.*$': {'type': 'string', 'format': 'python-qualified-identifier'}}}, 'license-files': {'type': 'array', 'items': {'type': 'string'}, '$$description': ['**PROVISIONAL**: list of glob patterns for all license files being distributed.', '(likely to become standard with :pep:`639`).', "By default: ``['LICEN[CS]E*', 'COPYING*', 'NOTICE*', 'AUTHORS*']``"], '$comment': 'TODO: revise if PEP 639 is accepted. Probably ``project.license-files``?'}, 'dynamic': {'type': 'object', 'description': 'Instructions for loading :pep:`621`-related metadata dynamically', 'additionalProperties': False, 'properties': {'version': {'$$description': ['A version dynamically loaded via either the ``attr:`` or ``file:``', 'directives. Please make sure the given file or attribute respects :pep:`440`.', 'Also ensure to set ``project.dynamic`` accordingly.'], 'oneOf': [{'$ref': '#/definitions/attr-directive'}, {'$ref': '#/definitions/file-directive'}]}, 'classifiers': {'$ref': '#/definitions/file-directive'}, 'description': {'$ref': '#/definitions/file-directive'}, 'entry-points': {'$ref': '#/definitions/file-directive'}, 'dependencies': {'$ref': '#/definitions/file-directive-for-dependencies'}, 'optional-dependencies': {'type': 'object', 'propertyNames': {'type': 'string', 'format': 'pep508-identifier'}, 'additionalProperties': False, 'patternProperties': {'.+': {'$ref': '#/definitions/file-directive-for-dependencies'}}}, 'readme': {'type': 'object', 'anyOf': [{'$ref': '#/definitions/file-directive'}, {'type': 'object', 'properties': {'content-type': {'type': 'string'}, 'file': {'$ref': '#/definitions/file-directive/properties/file'}}, 'additionalProperties': False}], 'required': ['file']}}}}, 'definitions': {'package-name': {'$id': '#/definitions/package-name', 'title': 'Valid package name', 'description': 'Valid package name (importable or :pep:`561`).', 'type': 'string', 'anyOf': [{'type': 'string', 'format': 'python-module-name-relaxed'}, {'type': 'string', 'format': 'pep561-stub-name'}]}, 'ext-module': {'$id': '#/definitions/ext-module', 'title': 'Extension module', 'description': 'Parameters to construct a :class:`setuptools.Extension` object', 'type': 'object', 'required': ['name', 'sources'], 'additionalProperties': False, 'properties': {'name': {'type': 'string', 'format': 'python-module-name-relaxed'}, 'sources': {'type': 'array', 'items': {'type': 'string'}}, 'include-dirs': {'type': 'array', 'items': {'type': 'string'}}, 'define-macros': {'type': 'array', 'items': {'type': 'array', 'items': [{'description': 'macro name', 'type': 'string'}, {'description': 'macro value', 'oneOf': [{'type': 'string'}, {'type': 'null'}]}], 'additionalItems': False}}, 'undef-macros': {'type': 'array', 'items': {'type': 'string'}}, 'library-dirs': {'type': 'array', 'items': {'type': 'string'}}, 'libraries': {'type': 'array', 'items': {'type': 'string'}}, 'runtime-library-dirs': {'type': 'array', 'items': {'type': 'string'}}, 'extra-objects': {'type': 'array', 'items': {'type': 'string'}}, 'extra-compile-args': {'type': 'array', 'items': {'type': 'string'}}, 'extra-link-args': {'type': 'array', 'items': {'type': 'string'}}, 'export-symbols': {'type': 'array', 'items': {'type': 'string'}}, 'swig-opts': {'type': 'array', 'items': {'type': 'string'}}, 'depends': {'type': 'array', 'items': {'type': 'string'}}, 'language': {'type': 'string'}, 'optional': {'type': 'boolean'}, 'py-limited-api': {'type': 'boolean'}}}, 'file-directive': {'$id': '#/definitions/file-directive', 'title': "'file:' directive", 'description': 'Value is read from a file (or list of files and then concatenated)', 'type': 'object', 'additionalProperties': False, 'properties': {'file': {'oneOf': [{'type': 'string'}, {'type': 'array', 'items': {'type': 'string'}}]}}, 'required': ['file']}, 'file-directive-for-dependencies': {'title': "'file:' directive for dependencies", 'allOf': [{'$$description': ['**BETA**: subset of the ``requirements.txt`` format', 'without ``pip`` flags and options', '(one :pep:`508`-compliant string per line,', 'lines that are blank or start with ``#`` are excluded).', 'See `dynamic metadata', '<https://setuptools.pypa.io/en/latest/userguide/pyproject_config.html#dynamic-metadata>`_.']}, {'$ref': '#/definitions/file-directive'}]}, 'attr-directive': {'title': "'attr:' directive", '$id': '#/definitions/attr-directive', '$$description': ['Value is read from a module attribute. Supports callables and iterables;', 'unsupported types are cast via ``str()``'], 'type': 'object', 'additionalProperties': False, 'properties': {'attr': {'type': 'string', 'format': 'python-qualified-identifier'}}, 'required': ['attr']}, 'find-directive': {'$id': '#/definitions/find-directive', 'title': "'find:' directive", 'type': 'object', 'additionalProperties': False, 'properties': {'find': {'type': 'object', '$$description': ['Dynamic `package discovery', '<https://setuptools.pypa.io/en/latest/userguide/package_discovery.html>`_.'], 'additionalProperties': False, 'properties': {'where': {'description': 'Directories to be searched for packages (Unix-style relative path)', 'type': 'array', 'items': {'type': 'string'}}, 'exclude': {'type': 'array', '$$description': ['Exclude packages that match the values listed in this field.', "Can container shell-style wildcards (e.g. ``'pkg.*'``)"], 'items': {'type': 'string'}}, 'include': {'type': 'array', '$$description': ['Restrict the found packages to just the ones listed in this field.', "Can container shell-style wildcards (e.g. ``'pkg.*'``)"], 'items': {'type': 'string'}}, 'namespaces': {'type': 'boolean', '$$description': ['When ``True``, directories without a ``__init__.py`` file will also', 'be scanned for :pep:`420`-style implicit namespaces']}}}}}}}}}, rule='type')+                raise JsonSchemaValueException("" + (name_prefix or "data") + ".tool must be object", value=data__tool, name="" + (name_prefix or "data") + ".tool", definition={'type': 'object', 'properties': {'distutils': {'$schema': 'http://json-schema.org/draft-07/schema#', '$id': 'https://setuptools.pypa.io/en/latest/deprecated/distutils/configfile.html', 'title': '``tool.distutils`` table', '$$description': ['**EXPERIMENTAL** (NOT OFFICIALLY SUPPORTED): Use ``tool.distutils``', 'subtables to configure arguments for ``distutils`` commands.', 'Originally, ``distutils`` allowed developers to configure arguments for', '``setup.py`` commands via `distutils configuration files', '<https://setuptools.pypa.io/en/latest/deprecated/distutils/configfile.html>`_.', 'See also `the old Python docs <https://docs.python.org/3.11/install/>_`.'], 'type': 'object', 'properties': {'global': {'type': 'object', 'description': 'Global options applied to all ``distutils`` commands'}}, 'patternProperties': {'.+': {'type': 'object'}}, '$comment': 'TODO: Is there a practical way of making this schema more specific?'}, 'setuptools': {'$schema': 'http://json-schema.org/draft-07/schema#', '$id': 'https://setuptools.pypa.io/en/latest/userguide/pyproject_config.html', 'title': '``tool.setuptools`` table', '$$description': ['``setuptools``-specific configurations that can be set by users that require', 'customization.', 'These configurations are completely optional and probably can be skipped when', 'creating simple packages. They are equivalent to some of the `Keywords', '<https://setuptools.pypa.io/en/latest/references/keywords.html>`_', 'used by the ``setup.py`` file, and can be set via the ``tool.setuptools`` table.', 'It considers only ``setuptools`` `parameters', '<https://setuptools.pypa.io/en/latest/userguide/pyproject_config.html#setuptools-specific-configuration>`_', 'that are not covered by :pep:`621`; and intentionally excludes ``dependency_links``', 'and ``setup_requires`` (incompatible with modern workflows/standards).'], 'type': 'object', 'additionalProperties': False, 'properties': {'platforms': {'type': 'array', 'items': {'type': 'string'}}, 'provides': {'$$description': ['Package and virtual package names contained within this package', '**(not supported by pip)**'], 'type': 'array', 'items': {'type': 'string', 'format': 'pep508-identifier'}}, 'obsoletes': {'$$description': ['Packages which this package renders obsolete', '**(not supported by pip)**'], 'type': 'array', 'items': {'type': 'string', 'format': 'pep508-identifier'}}, 'zip-safe': {'$$description': ['Whether the project can be safely installed and run from a zip file.', '**OBSOLETE**: only relevant for ``pkg_resources``, ``easy_install`` and', '``setup.py install`` in the context of ``eggs`` (**DEPRECATED**).'], 'type': 'boolean'}, 'script-files': {'$$description': ['Legacy way of defining scripts (entry-points are preferred).', 'Equivalent to the ``script`` keyword in ``setup.py``', '(it was renamed to avoid confusion with entry-point based ``project.scripts``', 'defined in :pep:`621`).', '**DISCOURAGED**: generic script wrappers are tricky and may not work properly.', 'Whenever possible, please use ``project.scripts`` instead.'], 'type': 'array', 'items': {'type': 'string'}, '$comment': 'TODO: is this field deprecated/should be removed?'}, 'eager-resources': {'$$description': ['Resources that should be extracted together, if any of them is needed,', 'or if any C extensions included in the project are imported.', '**OBSOLETE**: only relevant for ``pkg_resources``, ``easy_install`` and', '``setup.py install`` in the context of ``eggs`` (**DEPRECATED**).'], 'type': 'array', 'items': {'type': 'string'}}, 'packages': {'$$description': ['Packages that should be included in the distribution.', 'It can be given either as a list of package identifiers', 'or as a ``dict``-like structure with a single key ``find``', 'which corresponds to a dynamic call to', '``setuptools.config.expand.find_packages`` function.', 'The ``find`` key is associated with a nested ``dict``-like structure that can', 'contain ``where``, ``include``, ``exclude`` and ``namespaces`` keys,', 'mimicking the keyword arguments of the associated function.'], 'oneOf': [{'title': 'Array of Python package identifiers', 'type': 'array', 'items': {'$ref': '#/definitions/package-name'}}, {'$ref': '#/definitions/find-directive'}]}, 'package-dir': {'$$description': [':class:`dict`-like structure mapping from package names to directories where their', 'code can be found.', 'The empty string (as key) means that all packages are contained inside', 'the given directory will be included in the distribution.'], 'type': 'object', 'additionalProperties': False, 'propertyNames': {'anyOf': [{'const': ''}, {'$ref': '#/definitions/package-name'}]}, 'patternProperties': {'^.*$': {'type': 'string'}}}, 'package-data': {'$$description': ['Mapping from package names to lists of glob patterns.', 'Usually this option is not needed when using ``include-package-data = true``', 'For more information on how to include data files, check ``setuptools`` `docs', '<https://setuptools.pypa.io/en/latest/userguide/datafiles.html>`_.'], 'type': 'object', 'additionalProperties': False, 'propertyNames': {'anyOf': [{'$ref': '#/definitions/package-name'}, {'const': '*'}]}, 'patternProperties': {'^.*$': {'type': 'array', 'items': {'type': 'string'}}}}, 'include-package-data': {'$$description': ['Automatically include any data files inside the package directories', 'that are specified by ``MANIFEST.in``', 'For more information on how to include data files, check ``setuptools`` `docs', '<https://setuptools.pypa.io/en/latest/userguide/datafiles.html>`_.'], 'type': 'boolean'}, 'exclude-package-data': {'$$description': ['Mapping from package names to lists of glob patterns that should be excluded', 'For more information on how to include data files, check ``setuptools`` `docs', '<https://setuptools.pypa.io/en/latest/userguide/datafiles.html>`_.'], 'type': 'object', 'additionalProperties': False, 'propertyNames': {'anyOf': [{'$ref': '#/definitions/package-name'}, {'const': '*'}]}, 'patternProperties': {'^.*$': {'type': 'array', 'items': {'type': 'string'}}}}, 'namespace-packages': {'type': 'array', 'items': {'type': 'string', 'format': 'python-module-name-relaxed'}, '$comment': 'https://setuptools.pypa.io/en/latest/userguide/package_discovery.html', 'description': '**DEPRECATED**: use implicit namespaces instead (:pep:`420`).'}, 'py-modules': {'description': 'Modules that setuptools will manipulate', 'type': 'array', 'items': {'type': 'string', 'format': 'python-module-name-relaxed'}, '$comment': 'TODO: clarify the relationship with ``packages``'}, 'ext-modules': {'description': 'Extension modules to be compiled by setuptools', 'type': 'array', 'items': {'$ref': '#/definitions/ext-module'}}, 'data-files': {'$$description': ['``dict``-like structure where each key represents a directory and', 'the value is a list of glob patterns that should be installed in them.', '**DISCOURAGED**: please notice this might not work as expected with wheels.', 'Whenever possible, consider using data files inside the package directories', '(or create a new namespace package that only contains data files).', 'See `data files support', '<https://setuptools.pypa.io/en/latest/userguide/datafiles.html>`_.'], 'type': 'object', 'patternProperties': {'^.*$': {'type': 'array', 'items': {'type': 'string'}}}}, 'cmdclass': {'$$description': ['Mapping of distutils-style command names to ``setuptools.Command`` subclasses', 'which in turn should be represented by strings with a qualified class name', '(i.e., "dotted" form with module), e.g.::\n\n', '    cmdclass = {mycmd = "pkg.subpkg.module.CommandClass"}\n\n', 'The command class should be a directly defined at the top-level of the', 'containing module (no class nesting).'], 'type': 'object', 'patternProperties': {'^.*$': {'type': 'string', 'format': 'python-qualified-identifier'}}}, 'license-files': {'type': 'array', 'items': {'type': 'string'}, '$$description': ['**PROVISIONAL**: list of glob patterns for all license files being distributed.', '(likely to become standard with :pep:`639`).', "By default: ``['LICEN[CS]E*', 'COPYING*', 'NOTICE*', 'AUTHORS*']``"], '$comment': 'TODO: revise if PEP 639 is accepted. Probably ``project.license-files``?'}, 'dynamic': {'type': 'object', 'description': 'Instructions for loading :pep:`621`-related metadata dynamically', 'additionalProperties': False, 'properties': {'version': {'$$description': ['A version dynamically loaded via either the ``attr:`` or ``file:``', 'directives. Please make sure the given file or attribute respects :pep:`440`.', 'Also ensure to set ``project.dynamic`` accordingly.'], 'oneOf': [{'$ref': '#/definitions/attr-directive'}, {'$ref': '#/definitions/file-directive'}]}, 'classifiers': {'$ref': '#/definitions/file-directive'}, 'description': {'$ref': '#/definitions/file-directive'}, 'entry-points': {'$ref': '#/definitions/file-directive'}, 'dependencies': {'$ref': '#/definitions/file-directive-for-dependencies'}, 'optional-dependencies': {'type': 'object', 'propertyNames': {'type': 'string', 'format': 'pep508-identifier'}, 'additionalProperties': False, 'patternProperties': {'.+': {'$ref': '#/definitions/file-directive-for-dependencies'}}}, 'readme': {'type': 'object', 'anyOf': [{'$ref': '#/definitions/file-directive'}, {'type': 'object', 'properties': {'content-type': {'type': 'string'}, 'file': {'$ref': '#/definitions/file-directive/properties/file'}}, 'additionalProperties': False}], 'required': ['file']}}}}, 'definitions': {'package-name': {'$id': '#/definitions/package-name', 'title': 'Valid package name', 'description': 'Valid package name (importable or :pep:`561`).', 'type': 'string', 'anyOf': [{'type': 'string', 'format': 'python-module-name-relaxed'}, {'type': 'string', 'format': 'pep561-stub-name'}]}, 'ext-module': {'$id': '#/definitions/ext-module', 'title': 'Extension module', 'description': 'Parameters to construct a :class:`setuptools.Extension` object', 'type': 'object', 'required': ['name', 'sources'], 'additionalProperties': False, 'properties': {'name': {'type': 'string', 'format': 'python-module-name-relaxed'}, 'sources': {'type': 'array', 'items': {'type': 'string'}}, 'include-dirs': {'type': 'array', 'items': {'type': 'string'}}, 'define-macros': {'type': 'array', 'items': {'type': 'array', 'items': [{'description': 'macro name', 'type': 'string'}, {'description': 'macro value', 'oneOf': [{'type': 'string'}, {'type': 'null'}]}], 'additionalItems': False}}, 'undef-macros': {'type': 'array', 'items': {'type': 'string'}}, 'library-dirs': {'type': 'array', 'items': {'type': 'string'}}, 'libraries': {'type': 'array', 'items': {'type': 'string'}}, 'runtime-library-dirs': {'type': 'array', 'items': {'type': 'string'}}, 'extra-objects': {'type': 'array', 'items': {'type': 'string'}}, 'extra-compile-args': {'type': 'array', 'items': {'type': 'string'}}, 'extra-link-args': {'type': 'array', 'items': {'type': 'string'}}, 'export-symbols': {'type': 'array', 'items': {'type': 'string'}}, 'swig-opts': {'type': 'array', 'items': {'type': 'string'}}, 'depends': {'type': 'array', 'items': {'type': 'string'}}, 'language': {'type': 'string'}, 'optional': {'type': 'boolean'}, 'py-limited-api': {'type': 'boolean'}}}, 'file-directive': {'$id': '#/definitions/file-directive', 'title': "'file:' directive", 'description': 'Value is read from a file (or list of files and then concatenated)', 'type': 'object', 'additionalProperties': False, 'properties': {'file': {'oneOf': [{'type': 'string'}, {'type': 'array', 'items': {'type': 'string'}}]}}, 'required': ['file']}, 'file-directive-for-dependencies': {'title': "'file:' directive for dependencies", 'allOf': [{'$$description': ['**BETA**: subset of the ``requirements.txt`` format', 'without ``pip`` flags and options', '(one :pep:`508`-compliant string per line,', 'lines that are blank or start with ``#`` are excluded).', 'See `dynamic metadata', '<https://setuptools.pypa.io/en/latest/userguide/pyproject_config.html#dynamic-metadata>`_.']}, {'$ref': '#/definitions/file-directive'}]}, 'attr-directive': {'title': "'attr:' directive", '$id': '#/definitions/attr-directive', '$$description': ['Value is read from a module attribute. Supports callables and iterables;', 'unsupported types are cast via ``str()``'], 'type': 'object', 'additionalProperties': False, 'properties': {'attr': {'type': 'string', 'format': 'python-qualified-identifier'}}, 'required': ['attr']}, 'find-directive': {'$id': '#/definitions/find-directive', 'title': "'find:' directive", 'type': 'object', 'additionalProperties': False, 'properties': {'find': {'type': 'object', '$$description': ['Dynamic `package discovery', '<https://setuptools.pypa.io/en/latest/userguide/package_discovery.html>`_.'], 'additionalProperties': False, 'properties': {'where': {'description': 'Directories to be searched for packages (Unix-style relative path)', 'type': 'array', 'items': {'type': 'string'}}, 'exclude': {'type': 'array', '$$description': ['Exclude packages that match the values listed in this field.', "Can container shell-style wildcards (e.g. ``'pkg.*'``)"], 'items': {'type': 'string'}}, 'include': {'type': 'array', '$$description': ['Restrict the found packages to just the ones listed in this field.', "Can container shell-style wildcards (e.g. ``'pkg.*'``)"], 'items': {'type': 'string'}}, 'namespaces': {'type': 'boolean', '$$description': ['When ``True``, directories without a ``__init__.py`` file will also', 'be scanned for :pep:`420`-style implicit namespaces']}}}}}}}}}, rule='type')             data__tool_is_dict = isinstance(data__tool, dict)@@ -153,3 +153,3 @@         if data_keys:-            raise JsonSchemaValueException("" + (name_prefix or "data") + " must not contain "+str(data_keys)+" properties", value=data, name="" + (name_prefix or "data") + "", definition={'$schema': 'http://json-schema.org/draft-07/schema#', '$id': 'https://packaging.python.org/en/latest/specifications/declaring-build-dependencies/', 'title': 'Data structure for ``pyproject.toml`` files', '$$description': ['File format containing build-time configurations for the Python ecosystem. ', ':pep:`517` initially defined a build-system independent format for source trees', 'which was complemented by :pep:`518` to provide a way of specifying dependencies ', 'for building Python projects.', 'Please notice the ``project`` table (as initially defined in  :pep:`621`) is not included', 'in this schema and should be considered separately.'], 'type': 'object', 'additionalProperties': False, 'properties': {'build-system': {'type': 'object', 'description': 'Table used to store build-related data', 'additionalProperties': False, 'properties': {'requires': {'type': 'array', '$$description': ['List of dependencies in the :pep:`508` format required to execute the build', 'system. Please notice that the resulting dependency graph', '**MUST NOT contain cycles**'], 'items': {'type': 'string'}}, 'build-backend': {'type': 'string', 'description': 'Python object that will be used to perform the build according to :pep:`517`', 'format': 'pep517-backend-reference'}, 'backend-path': {'type': 'array', '$$description': ['List of directories to be prepended to ``sys.path`` when loading the', 'back-end, and running its hooks'], 'items': {'type': 'string', '$comment': 'Should be a path (TODO: enforce it with format?)'}}}, 'required': ['requires']}, 'project': {'$schema': 'http://json-schema.org/draft-07/schema#', '$id': 'https://packaging.python.org/en/latest/specifications/pyproject-toml/', 'title': 'Package metadata stored in the ``project`` table', '$$description': ['Data structure for the **project** table inside ``pyproject.toml``', '(as initially defined in :pep:`621`)'], 'type': 'object', 'properties': {'name': {'type': 'string', 'description': 'The name (primary identifier) of the project. MUST be statically defined.', 'format': 'pep508-identifier'}, 'version': {'type': 'string', 'description': 'The version of the project as supported by :pep:`440`.', 'format': 'pep440'}, 'description': {'type': 'string', '$$description': ['The `summary description of the project', '<https://packaging.python.org/specifications/core-metadata/#summary>`_']}, 'readme': {'$$description': ['`Full/detailed description of the project in the form of a README', '<https://peps.python.org/pep-0621/#readme>`_', "with meaning similar to the one defined in `core metadata's Description", '<https://packaging.python.org/specifications/core-metadata/#description>`_'], 'oneOf': [{'type': 'string', '$$description': ['Relative path to a text file (UTF-8) containing the full description', 'of the project. If the file path ends in case-insensitive ``.md`` or', '``.rst`` suffixes, then the content-type is respectively', '``text/markdown`` or ``text/x-rst``']}, {'type': 'object', 'allOf': [{'anyOf': [{'properties': {'file': {'type': 'string', '$$description': ['Relative path to a text file containing the full description', 'of the project.']}}, 'required': ['file']}, {'properties': {'text': {'type': 'string', 'description': 'Full text describing the project.'}}, 'required': ['text']}]}, {'properties': {'content-type': {'type': 'string', '$$description': ['Content-type (:rfc:`1341`) of the full description', '(e.g. ``text/markdown``). The ``charset`` parameter is assumed', 'UTF-8 when not present.'], '$comment': 'TODO: add regex pattern or format?'}}, 'required': ['content-type']}]}]}, 'requires-python': {'type': 'string', 'format': 'pep508-versionspec', '$$description': ['`The Python version requirements of the project', '<https://packaging.python.org/specifications/core-metadata/#requires-python>`_.']}, 'license': {'description': '`Project license <https://peps.python.org/pep-0621/#license>`_.', 'oneOf': [{'type': 'string', 'description': 'An SPDX license identifier', 'format': 'SPDX'}, {'type': 'object', 'properties': {'file': {'type': 'string', '$$description': ['Relative path to the file (UTF-8) which contains the license for the', 'project.']}}, 'required': ['file']}, {'type': 'object', 'properties': {'text': {'type': 'string', '$$description': ['The license of the project whose meaning is that of the', '`License field from the core metadata', '<https://packaging.python.org/specifications/core-metadata/#license>`_.']}}, 'required': ['text']}]}, 'license-files': {'description': 'Paths or globs to paths of license files', 'type': 'array', 'items': {'type': 'string'}}, 'authors': {'type': 'array', 'items': {'$ref': '#/definitions/author'}, '$$description': ["The people or organizations considered to be the 'authors' of the project.", 'The exact meaning is open to interpretation (e.g. original or primary authors,', 'current maintainers, or owners of the package).']}, 'maintainers': {'type': 'array', 'items': {'$ref': '#/definitions/author'}, '$$description': ["The people or organizations considered to be the 'maintainers' of the project.", 'Similarly to ``authors``, the exact meaning is open to interpretation.']}, 'keywords': {'type': 'array', 'items': {'type': 'string'}, 'description': 'List of keywords to assist searching for the distribution in a larger catalog.'}, 'classifiers': {'type': 'array', 'items': {'type': 'string', 'format': 'trove-classifier', 'description': '`PyPI classifier <https://pypi.org/classifiers/>`_.'}, '$$description': ['`Trove classifiers <https://pypi.org/classifiers/>`_', 'which apply to the project.']}, 'urls': {'type': 'object', 'description': 'URLs associated with the project in the form ``label => value``.', 'additionalProperties': False, 'patternProperties': {'^.+$': {'type': 'string', 'format': 'url'}}}, 'scripts': {'$ref': '#/definitions/entry-point-group', '$$description': ['Instruct the installer to create command-line wrappers for the given', '`entry points <https://packaging.python.org/specifications/entry-points/>`_.']}, 'gui-scripts': {'$ref': '#/definitions/entry-point-group', '$$description': ['Instruct the installer to create GUI wrappers for the given', '`entry points <https://packaging.python.org/specifications/entry-points/>`_.', 'The difference between ``scripts`` and ``gui-scripts`` is only relevant in', 'Windows.']}, 'entry-points': {'$$description': ['Instruct the installer to expose the given modules/functions via', '``entry-point`` discovery mechanism (useful for plugins).', 'More information available in the `Python packaging guide', '<https://packaging.python.org/specifications/entry-points/>`_.'], 'propertyNames': {'format': 'python-entrypoint-group'}, 'additionalProperties': False, 'patternProperties': {'^.+$': {'$ref': '#/definitions/entry-point-group'}}}, 'dependencies': {'type': 'array', 'description': 'Project (mandatory) dependencies.', 'items': {'$ref': '#/definitions/dependency'}}, 'optional-dependencies': {'type': 'object', 'description': 'Optional dependency for the project', 'propertyNames': {'format': 'pep508-identifier'}, 'additionalProperties': False, 'patternProperties': {'^.+$': {'type': 'array', 'items': {'$ref': '#/definitions/dependency'}}}}, 'dynamic': {'type': 'array', '$$description': ['Specifies which fields are intentionally unspecified and expected to be', 'dynamically provided by build tools'], 'items': {'enum': ['version', 'description', 'readme', 'requires-python', 'license', 'license-files', 'authors', 'maintainers', 'keywords', 'classifiers', 'urls', 'scripts', 'gui-scripts', 'entry-points', 'dependencies', 'optional-dependencies']}}}, 'required': ['name'], 'additionalProperties': False, 'allOf': [{'if': {'not': {'required': ['dynamic'], 'properties': {'dynamic': {'contains': {'const': 'version'}, '$$description': ['version is listed in ``dynamic``']}}}, '$$comment': ['According to :pep:`621`:', '    If the core metadata specification lists a field as "Required", then', '    the metadata MUST specify the field statically or list it in dynamic', 'In turn, `core metadata`_ defines:', '    The required fields are: Metadata-Version, Name, Version.', '    All the other fields are optional.', 'Since ``Metadata-Version`` is defined by the build back-end, ``name`` and', '``version`` are the only mandatory information in ``pyproject.toml``.', '.. _core metadata: https://packaging.python.org/specifications/core-metadata/']}, 'then': {'required': ['version'], '$$description': ['version should be statically defined in the ``version`` field']}}, {'if': {'required': ['license-files']}, 'then': {'properties': {'license': {'type': 'string'}}}}], 'definitions': {'author': {'$id': '#/definitions/author', 'title': 'Author or Maintainer', '$comment': 'https://peps.python.org/pep-0621/#authors-maintainers', 'type': 'object', 'additionalProperties': False, 'properties': {'name': {'type': 'string', '$$description': ['MUST be a valid email name, i.e. whatever can be put as a name, before an', 'email, in :rfc:`822`.']}, 'email': {'type': 'string', 'format': 'idn-email', 'description': 'MUST be a valid email address'}}}, 'entry-point-group': {'$id': '#/definitions/entry-point-group', 'title': 'Entry-points', 'type': 'object', '$$description': ['Entry-points are grouped together to indicate what sort of capabilities they', 'provide.', 'See the `packaging guides', '<https://packaging.python.org/specifications/entry-points/>`_', 'and `setuptools docs', '<https://setuptools.pypa.io/en/latest/userguide/entry_point.html>`_', 'for more information.'], 'propertyNames': {'format': 'python-entrypoint-name'}, 'additionalProperties': False, 'patternProperties': {'^.+$': {'type': 'string', '$$description': ['Reference to a Python object. It is either in the form', '``importable.module``, or ``importable.module:object.attr``.'], 'format': 'python-entrypoint-reference', '$comment': 'https://packaging.python.org/specifications/entry-points/'}}}, 'dependency': {'$id': '#/definitions/dependency', 'title': 'Dependency', 'type': 'string', 'description': 'Project dependency specification according to PEP 508', 'format': 'pep508'}}}, 'tool': {'type': 'object', 'properties': {'distutils': {'$schema': 'http://json-schema.org/draft-07/schema#', '$id': 'https://setuptools.pypa.io/en/latest/deprecated/distutils/configfile.html', 'title': '``tool.distutils`` table', '$$description': ['**EXPERIMENTAL** (NOT OFFICIALLY SUPPORTED): Use ``tool.distutils``', 'subtables to configure arguments for ``distutils`` commands.', 'Originally, ``distutils`` allowed developers to configure arguments for', '``setup.py`` commands via `distutils configuration files', '<https://setuptools.pypa.io/en/latest/deprecated/distutils/configfile.html>`_.', 'See also `the old Python docs <https://docs.python.org/3.11/install/>_`.'], 'type': 'object', 'properties': {'global': {'type': 'object', 'description': 'Global options applied to all ``distutils`` commands'}}, 'patternProperties': {'.+': {'type': 'object'}}, '$comment': 'TODO: Is there a practical way of making this schema more specific?'}, 'setuptools': {'$schema': 'http://json-schema.org/draft-07/schema#', '$id': 'https://setuptools.pypa.io/en/latest/userguide/pyproject_config.html', 'title': '``tool.setuptools`` table', '$$description': ['``setuptools``-specific configurations that can be set by users that require', 'customization.', 'These configurations are completely optional and probably can be skipped when', 'creating simple packages. They are equivalent to some of the `Keywords', '<https://setuptools.pypa.io/en/latest/references/keywords.html>`_', 'used by the ``setup.py`` file, and can be set via the ``tool.setuptools`` table.', 'It considers only ``setuptools`` `parameters', '<https://setuptools.pypa.io/en/latest/userguide/pyproject_config.html#setuptools-specific-configuration>`_', 'that are not covered by :pep:`621`; and intentionally excludes ``dependency_links``', 'and ``setup_requires`` (incompatible with modern workflows/standards).'], 'type': 'object', 'additionalProperties': False, 'properties': {'platforms': {'type': 'array', 'items': {'type': 'string'}}, 'provides': {'$$description': ['Package and virtual package names contained within this package', '**(not supported by pip)**'], 'type': 'array', 'items': {'type': 'string', 'format': 'pep508-identifier'}}, 'obsoletes': {'$$description': ['Packages which this package renders obsolete', '**(not supported by pip)**'], 'type': 'array', 'items': {'type': 'string', 'format': 'pep508-identifier'}}, 'zip-safe': {'$$description': ['Whether the project can be safely installed and run from a zip file.', '**OBSOLETE**: only relevant for ``pkg_resources``, ``easy_install`` and', '``setup.py install`` in the context of ``eggs`` (**DEPRECATED**).'], 'type': 'boolean'}, 'script-files': {'$$description': ['Legacy way of defining scripts (entry-points are preferred).', 'Equivalent to the ``script`` keyword in ``setup.py``', '(it was renamed to avoid confusion with entry-point based ``project.scripts``', 'defined in :pep:`621`).', '**DISCOURAGED**: generic script wrappers are tricky and may not work properly.', 'Whenever possible, please use ``project.scripts`` instead.'], 'type': 'array', 'items': {'type': 'string'}, '$comment': 'TODO: is this field deprecated/should be removed?'}, 'eager-resources': {'$$description': ['Resources that should be extracted together, if any of them is needed,', 'or if any C extensions included in the project are imported.', '**OBSOLETE**: only relevant for ``pkg_resources``, ``easy_install`` and', '``setup.py install`` in the context of ``eggs`` (**DEPRECATED**).'], 'type': 'array', 'items': {'type': 'string'}}, 'packages': {'$$description': ['Packages that should be included in the distribution.', 'It can be given either as a list of package identifiers', 'or as a ``dict``-like structure with a single key ``find``', 'which corresponds to a dynamic call to', '``setuptools.config.expand.find_packages`` function.', 'The ``find`` key is associated with a nested ``dict``-like structure that can', 'contain ``where``, ``include``, ``exclude`` and ``namespaces`` keys,', 'mimicking the keyword arguments of the associated function.'], 'oneOf': [{'title': 'Array of Python package identifiers', 'type': 'array', 'items': {'$ref': '#/definitions/package-name'}}, {'$ref': '#/definitions/find-directive'}]}, 'package-dir': {'$$description': [':class:`dict`-like structure mapping from package names to directories where their', 'code can be found.', 'The empty string (as key) means that all packages are contained inside', 'the given directory will be included in the distribution.'], 'type': 'object', 'additionalProperties': False, 'propertyNames': {'anyOf': [{'const': ''}, {'$ref': '#/definitions/package-name'}]}, 'patternProperties': {'^.*$': {'type': 'string'}}}, 'package-data': {'$$description': ['Mapping from package names to lists of glob patterns.', 'Usually this option is not needed when using ``include-package-data = true``', 'For more information on how to include data files, check ``setuptools`` `docs', '<https://setuptools.pypa.io/en/latest/userguide/datafiles.html>`_.'], 'type': 'object', 'additionalProperties': False, 'propertyNames': {'anyOf': [{'type': 'string', 'format': 'python-module-name'}, {'const': '*'}]}, 'patternProperties': {'^.*$': {'type': 'array', 'items': {'type': 'string'}}}}, 'include-package-data': {'$$description': ['Automatically include any data files inside the package directories', 'that are specified by ``MANIFEST.in``', 'For more information on how to include data files, check ``setuptools`` `docs', '<https://setuptools.pypa.io/en/latest/userguide/datafiles.html>`_.'], 'type': 'boolean'}, 'exclude-package-data': {'$$description': ['Mapping from package names to lists of glob patterns that should be excluded', 'For more information on how to include data files, check ``setuptools`` `docs', '<https://setuptools.pypa.io/en/latest/userguide/datafiles.html>`_.'], 'type': 'object', 'additionalProperties': False, 'propertyNames': {'anyOf': [{'type': 'string', 'format': 'python-module-name'}, {'const': '*'}]}, 'patternProperties': {'^.*$': {'type': 'array', 'items': {'type': 'string'}}}}, 'namespace-packages': {'type': 'array', 'items': {'type': 'string', 'format': 'python-module-name-relaxed'}, '$comment': 'https://setuptools.pypa.io/en/latest/userguide/package_discovery.html', 'description': '**DEPRECATED**: use implicit namespaces instead (:pep:`420`).'}, 'py-modules': {'description': 'Modules that setuptools will manipulate', 'type': 'array', 'items': {'type': 'string', 'format': 'python-module-name-relaxed'}, '$comment': 'TODO: clarify the relationship with ``packages``'}, 'ext-modules': {'description': 'Extension modules to be compiled by setuptools', 'type': 'array', 'items': {'$ref': '#/definitions/ext-module'}}, 'data-files': {'$$description': ['``dict``-like structure where each key represents a directory and', 'the value is a list of glob patterns that should be installed in them.', '**DISCOURAGED**: please notice this might not work as expected with wheels.', 'Whenever possible, consider using data files inside the package directories', '(or create a new namespace package that only contains data files).', 'See `data files support', '<https://setuptools.pypa.io/en/latest/userguide/datafiles.html>`_.'], 'type': 'object', 'patternProperties': {'^.*$': {'type': 'array', 'items': {'type': 'string'}}}}, 'cmdclass': {'$$description': ['Mapping of distutils-style command names to ``setuptools.Command`` subclasses', 'which in turn should be represented by strings with a qualified class name', '(i.e., "dotted" form with module), e.g.::\n\n', '    cmdclass = {mycmd = "pkg.subpkg.module.CommandClass"}\n\n', 'The command class should be a directly defined at the top-level of the', 'containing module (no class nesting).'], 'type': 'object', 'patternProperties': {'^.*$': {'type': 'string', 'format': 'python-qualified-identifier'}}}, 'license-files': {'type': 'array', 'items': {'type': 'string'}, '$$description': ['**PROVISIONAL**: list of glob patterns for all license files being distributed.', '(likely to become standard with :pep:`639`).', "By default: ``['LICEN[CS]E*', 'COPYING*', 'NOTICE*', 'AUTHORS*']``"], '$comment': 'TODO: revise if PEP 639 is accepted. Probably ``project.license-files``?'}, 'dynamic': {'type': 'object', 'description': 'Instructions for loading :pep:`621`-related metadata dynamically', 'additionalProperties': False, 'properties': {'version': {'$$description': ['A version dynamically loaded via either the ``attr:`` or ``file:``', 'directives. Please make sure the given file or attribute respects :pep:`440`.', 'Also ensure to set ``project.dynamic`` accordingly.'], 'oneOf': [{'$ref': '#/definitions/attr-directive'}, {'$ref': '#/definitions/file-directive'}]}, 'classifiers': {'$ref': '#/definitions/file-directive'}, 'description': {'$ref': '#/definitions/file-directive'}, 'entry-points': {'$ref': '#/definitions/file-directive'}, 'dependencies': {'$ref': '#/definitions/file-directive-for-dependencies'}, 'optional-dependencies': {'type': 'object', 'propertyNames': {'type': 'string', 'format': 'pep508-identifier'}, 'additionalProperties': False, 'patternProperties': {'.+': {'$ref': '#/definitions/file-directive-for-dependencies'}}}, 'readme': {'type': 'object', 'anyOf': [{'$ref': '#/definitions/file-directive'}, {'type': 'object', 'properties': {'content-type': {'type': 'string'}, 'file': {'$ref': '#/definitions/file-directive/properties/file'}}, 'additionalProperties': False}], 'required': ['file']}}}}, 'definitions': {'package-name': {'$id': '#/definitions/package-name', 'title': 'Valid package name', 'description': 'Valid package name (importable or :pep:`561`).', 'type': 'string', 'anyOf': [{'type': 'string', 'format': 'python-module-name-relaxed'}, {'type': 'string', 'format': 'pep561-stub-name'}]}, 'ext-module': {'$id': '#/definitions/ext-module', 'title': 'Extension module', 'description': 'Parameters to construct a :class:`setuptools.Extension` object', 'type': 'object', 'required': ['name', 'sources'], 'additionalProperties': False, 'properties': {'name': {'type': 'string', 'format': 'python-module-name-relaxed'}, 'sources': {'type': 'array', 'items': {'type': 'string'}}, 'include-dirs': {'type': 'array', 'items': {'type': 'string'}}, 'define-macros': {'type': 'array', 'items': {'type': 'array', 'items': [{'description': 'macro name', 'type': 'string'}, {'description': 'macro value', 'oneOf': [{'type': 'string'}, {'type': 'null'}]}], 'additionalItems': False}}, 'undef-macros': {'type': 'array', 'items': {'type': 'string'}}, 'library-dirs': {'type': 'array', 'items': {'type': 'string'}}, 'libraries': {'type': 'array', 'items': {'type': 'string'}}, 'runtime-library-dirs': {'type': 'array', 'items': {'type': 'string'}}, 'extra-objects': {'type': 'array', 'items': {'type': 'string'}}, 'extra-compile-args': {'type': 'array', 'items': {'type': 'string'}}, 'extra-link-args': {'type': 'array', 'items': {'type': 'string'}}, 'export-symbols': {'type': 'array', 'items': {'type': 'string'}}, 'swig-opts': {'type': 'array', 'items': {'type': 'string'}}, 'depends': {'type': 'array', 'items': {'type': 'string'}}, 'language': {'type': 'string'}, 'optional': {'type': 'boolean'}, 'py-limited-api': {'type': 'boolean'}}}, 'file-directive': {'$id': '#/definitions/file-directive', 'title': "'file:' directive", 'description': 'Value is read from a file (or list of files and then concatenated)', 'type': 'object', 'additionalProperties': False, 'properties': {'file': {'oneOf': [{'type': 'string'}, {'type': 'array', 'items': {'type': 'string'}}]}}, 'required': ['file']}, 'file-directive-for-dependencies': {'title': "'file:' directive for dependencies", 'allOf': [{'$$description': ['**BETA**: subset of the ``requirements.txt`` format', 'without ``pip`` flags and options', '(one :pep:`508`-compliant string per line,', 'lines that are blank or start with ``#`` are excluded).', 'See `dynamic metadata', '<https://setuptools.pypa.io/en/latest/userguide/pyproject_config.html#dynamic-metadata>`_.']}, {'$ref': '#/definitions/file-directive'}]}, 'attr-directive': {'title': "'attr:' directive", '$id': '#/definitions/attr-directive', '$$description': ['Value is read from a module attribute. Supports callables and iterables;', 'unsupported types are cast via ``str()``'], 'type': 'object', 'additionalProperties': False, 'properties': {'attr': {'type': 'string', 'format': 'python-qualified-identifier'}}, 'required': ['attr']}, 'find-directive': {'$id': '#/definitions/find-directive', 'title': "'find:' directive", 'type': 'object', 'additionalProperties': False, 'properties': {'find': {'type': 'object', '$$description': ['Dynamic `package discovery', '<https://setuptools.pypa.io/en/latest/userguide/package_discovery.html>`_.'], 'additionalProperties': False, 'properties': {'where': {'description': 'Directories to be searched for packages (Unix-style relative path)', 'type': 'array', 'items': {'type': 'string'}}, 'exclude': {'type': 'array', '$$description': ['Exclude packages that match the values listed in this field.', "Can container shell-style wildcards (e.g. ``'pkg.*'``)"], 'items': {'type': 'string'}}, 'include': {'type': 'array', '$$description': ['Restrict the found packages to just the ones listed in this field.', "Can container shell-style wildcards (e.g. ``'pkg.*'``)"], 'items': {'type': 'string'}}, 'namespaces': {'type': 'boolean', '$$description': ['When ``True``, directories without a ``__init__.py`` file will also', 'be scanned for :pep:`420`-style implicit namespaces']}}}}}}}}}, 'dependency-groups': {'type': 'object', 'description': 'Dependency groups following PEP 735', 'additionalProperties': False, 'patternProperties': {'^([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9._-]*[a-zA-Z0-9])$': {'type': 'array', 'items': {'oneOf': [{'type': 'string', 'description': 'Python package specifiers following PEP 508', 'format': 'pep508'}, {'type': 'object', 'additionalProperties': False, 'properties': {'include-group': {'description': 'Another dependency group to include in this one', 'type': 'string', 'pattern': '^([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9._-]*[a-zA-Z0-9])$'}}}]}}}}}, 'project': {'$schema': 'http://json-schema.org/draft-07/schema#', '$id': 'https://packaging.python.org/en/latest/specifications/pyproject-toml/', 'title': 'Package metadata stored in the ``project`` table', '$$description': ['Data structure for the **project** table inside ``pyproject.toml``', '(as initially defined in :pep:`621`)'], 'type': 'object', 'properties': {'name': {'type': 'string', 'description': 'The name (primary identifier) of the project. MUST be statically defined.', 'format': 'pep508-identifier'}, 'version': {'type': 'string', 'description': 'The version of the project as supported by :pep:`440`.', 'format': 'pep440'}, 'description': {'type': 'string', '$$description': ['The `summary description of the project', '<https://packaging.python.org/specifications/core-metadata/#summary>`_']}, 'readme': {'$$description': ['`Full/detailed description of the project in the form of a README', '<https://peps.python.org/pep-0621/#readme>`_', "with meaning similar to the one defined in `core metadata's Description", '<https://packaging.python.org/specifications/core-metadata/#description>`_'], 'oneOf': [{'type': 'string', '$$description': ['Relative path to a text file (UTF-8) containing the full description', 'of the project. If the file path ends in case-insensitive ``.md`` or', '``.rst`` suffixes, then the content-type is respectively', '``text/markdown`` or ``text/x-rst``']}, {'type': 'object', 'allOf': [{'anyOf': [{'properties': {'file': {'type': 'string', '$$description': ['Relative path to a text file containing the full description', 'of the project.']}}, 'required': ['file']}, {'properties': {'text': {'type': 'string', 'description': 'Full text describing the project.'}}, 'required': ['text']}]}, {'properties': {'content-type': {'type': 'string', '$$description': ['Content-type (:rfc:`1341`) of the full description', '(e.g. ``text/markdown``). The ``charset`` parameter is assumed', 'UTF-8 when not present.'], '$comment': 'TODO: add regex pattern or format?'}}, 'required': ['content-type']}]}]}, 'requires-python': {'type': 'string', 'format': 'pep508-versionspec', '$$description': ['`The Python version requirements of the project', '<https://packaging.python.org/specifications/core-metadata/#requires-python>`_.']}, 'license': {'description': '`Project license <https://peps.python.org/pep-0621/#license>`_.', 'oneOf': [{'type': 'string', 'description': 'An SPDX license identifier', 'format': 'SPDX'}, {'type': 'object', 'properties': {'file': {'type': 'string', '$$description': ['Relative path to the file (UTF-8) which contains the license for the', 'project.']}}, 'required': ['file']}, {'type': 'object', 'properties': {'text': {'type': 'string', '$$description': ['The license of the project whose meaning is that of the', '`License field from the core metadata', '<https://packaging.python.org/specifications/core-metadata/#license>`_.']}}, 'required': ['text']}]}, 'license-files': {'description': 'Paths or globs to paths of license files', 'type': 'array', 'items': {'type': 'string'}}, 'authors': {'type': 'array', 'items': {'$ref': '#/definitions/author'}, '$$description': ["The people or organizations considered to be the 'authors' of the project.", 'The exact meaning is open to interpretation (e.g. original or primary authors,', 'current maintainers, or owners of the package).']}, 'maintainers': {'type': 'array', 'items': {'$ref': '#/definitions/author'}, '$$description': ["The people or organizations considered to be the 'maintainers' of the project.", 'Similarly to ``authors``, the exact meaning is open to interpretation.']}, 'keywords': {'type': 'array', 'items': {'type': 'string'}, 'description': 'List of keywords to assist searching for the distribution in a larger catalog.'}, 'classifiers': {'type': 'array', 'items': {'type': 'string', 'format': 'trove-classifier', 'description': '`PyPI classifier <https://pypi.org/classifiers/>`_.'}, '$$description': ['`Trove classifiers <https://pypi.org/classifiers/>`_', 'which apply to the project.']}, 'urls': {'type': 'object', 'description': 'URLs associated with the project in the form ``label => value``.', 'additionalProperties': False, 'patternProperties': {'^.+$': {'type': 'string', 'format': 'url'}}}, 'scripts': {'$ref': '#/definitions/entry-point-group', '$$description': ['Instruct the installer to create command-line wrappers for the given', '`entry points <https://packaging.python.org/specifications/entry-points/>`_.']}, 'gui-scripts': {'$ref': '#/definitions/entry-point-group', '$$description': ['Instruct the installer to create GUI wrappers for the given', '`entry points <https://packaging.python.org/specifications/entry-points/>`_.', 'The difference between ``scripts`` and ``gui-scripts`` is only relevant in', 'Windows.']}, 'entry-points': {'$$description': ['Instruct the installer to expose the given modules/functions via', '``entry-point`` discovery mechanism (useful for plugins).', 'More information available in the `Python packaging guide', '<https://packaging.python.org/specifications/entry-points/>`_.'], 'propertyNames': {'format': 'python-entrypoint-group'}, 'additionalProperties': False, 'patternProperties': {'^.+$': {'$ref': '#/definitions/entry-point-group'}}}, 'dependencies': {'type': 'array', 'description': 'Project (mandatory) dependencies.', 'items': {'$ref': '#/definitions/dependency'}}, 'optional-dependencies': {'type': 'object', 'description': 'Optional dependency for the project', 'propertyNames': {'format': 'pep508-identifier'}, 'additionalProperties': False, 'patternProperties': {'^.+$': {'type': 'array', 'items': {'$ref': '#/definitions/dependency'}}}}, 'dynamic': {'type': 'array', '$$description': ['Specifies which fields are intentionally unspecified and expected to be', 'dynamically provided by build tools'], 'items': {'enum': ['version', 'description', 'readme', 'requires-python', 'license', 'license-files', 'authors', 'maintainers', 'keywords', 'classifiers', 'urls', 'scripts', 'gui-scripts', 'entry-points', 'dependencies', 'optional-dependencies']}}}, 'required': ['name'], 'additionalProperties': False, 'allOf': [{'if': {'not': {'required': ['dynamic'], 'properties': {'dynamic': {'contains': {'const': 'version'}, '$$description': ['version is listed in ``dynamic``']}}}, '$$comment': ['According to :pep:`621`:', '    If the core metadata specification lists a field as "Required", then', '    the metadata MUST specify the field statically or list it in dynamic', 'In turn, `core metadata`_ defines:', '    The required fields are: Metadata-Version, Name, Version.', '    All the other fields are optional.', 'Since ``Metadata-Version`` is defined by the build back-end, ``name`` and', '``version`` are the only mandatory information in ``pyproject.toml``.', '.. _core metadata: https://packaging.python.org/specifications/core-metadata/']}, 'then': {'required': ['version'], '$$description': ['version should be statically defined in the ``version`` field']}}, {'if': {'required': ['license-files']}, 'then': {'properties': {'license': {'type': 'string'}}}}], 'definitions': {'author': {'$id': '#/definitions/author', 'title': 'Author or Maintainer', '$comment': 'https://peps.python.org/pep-0621/#authors-maintainers', 'type': 'object', 'additionalProperties': False, 'properties': {'name': {'type': 'string', '$$description': ['MUST be a valid email name, i.e. whatever can be put as a name, before an', 'email, in :rfc:`822`.']}, 'email': {'type': 'string', 'format': 'idn-email', 'description': 'MUST be a valid email address'}}}, 'entry-point-group': {'$id': '#/definitions/entry-point-group', 'title': 'Entry-points', 'type': 'object', '$$description': ['Entry-points are grouped together to indicate what sort of capabilities they', 'provide.', 'See the `packaging guides', '<https://packaging.python.org/specifications/entry-points/>`_', 'and `setuptools docs', '<https://setuptools.pypa.io/en/latest/userguide/entry_point.html>`_', 'for more information.'], 'propertyNames': {'format': 'python-entrypoint-name'}, 'additionalProperties': False, 'patternProperties': {'^.+$': {'type': 'string', '$$description': ['Reference to a Python object. It is either in the form', '``importable.module``, or ``importable.module:object.attr``.'], 'format': 'python-entrypoint-reference', '$comment': 'https://packaging.python.org/specifications/entry-points/'}}}, 'dependency': {'$id': '#/definitions/dependency', 'title': 'Dependency', 'type': 'string', 'description': 'Project dependency specification according to PEP 508', 'format': 'pep508'}}}}, rule='additionalProperties')+            raise JsonSchemaValueException("" + (name_prefix or "data") + " must not contain "+str(data_keys)+" properties", value=data, name="" + (name_prefix or "data") + "", definition={'$schema': 'http://json-schema.org/draft-07/schema#', '$id': 'https://packaging.python.org/en/latest/specifications/declaring-build-dependencies/', 'title': 'Data structure for ``pyproject.toml`` files', '$$description': ['File format containing build-time configurations for the Python ecosystem. ', ':pep:`517` initially defined a build-system independent format for source trees', 'which was complemented by :pep:`518` to provide a way of specifying dependencies ', 'for building Python projects.', 'Please notice the ``project`` table (as initially defined in  :pep:`621`) is not included', 'in this schema and should be considered separately.'], 'type': 'object', 'additionalProperties': False, 'properties': {'build-system': {'type': 'object', 'description': 'Table used to store build-related data', 'additionalProperties': False, 'properties': {'requires': {'type': 'array', '$$description': ['List of dependencies in the :pep:`508` format required to execute the build', 'system. Please notice that the resulting dependency graph', '**MUST NOT contain cycles**'], 'items': {'type': 'string'}}, 'build-backend': {'type': 'string', 'description': 'Python object that will be used to perform the build according to :pep:`517`', 'format': 'pep517-backend-reference'}, 'backend-path': {'type': 'array', '$$description': ['List of directories to be prepended to ``sys.path`` when loading the', 'back-end, and running its hooks'], 'items': {'type': 'string', '$comment': 'Should be a path (TODO: enforce it with format?)'}}}, 'required': ['requires']}, 'project': {'$schema': 'http://json-schema.org/draft-07/schema#', '$id': 'https://packaging.python.org/en/latest/specifications/pyproject-toml/', 'title': 'Package metadata stored in the ``project`` table', '$$description': ['Data structure for the **project** table inside ``pyproject.toml``', '(as initially defined in :pep:`621`)'], 'type': 'object', 'properties': {'name': {'type': 'string', 'description': 'The name (primary identifier) of the project. MUST be statically defined.', 'format': 'pep508-identifier'}, 'version': {'type': 'string', 'description': 'The version of the project as supported by :pep:`440`.', 'format': 'pep440'}, 'description': {'type': 'string', '$$description': ['The `summary description of the project', '<https://packaging.python.org/specifications/core-metadata/#summary>`_']}, 'readme': {'$$description': ['`Full/detailed description of the project in the form of a README', '<https://peps.python.org/pep-0621/#readme>`_', "with meaning similar to the one defined in `core metadata's Description", '<https://packaging.python.org/specifications/core-metadata/#description>`_'], 'oneOf': [{'type': 'string', '$$description': ['Relative path to a text file (UTF-8) containing the full description', 'of the project. If the file path ends in case-insensitive ``.md`` or', '``.rst`` suffixes, then the content-type is respectively', '``text/markdown`` or ``text/x-rst``']}, {'type': 'object', 'allOf': [{'anyOf': [{'properties': {'file': {'type': 'string', '$$description': ['Relative path to a text file containing the full description', 'of the project.']}}, 'required': ['file']}, {'properties': {'text': {'type': 'string', 'description': 'Full text describing the project.'}}, 'required': ['text']}]}, {'properties': {'content-type': {'type': 'string', '$$description': ['Content-type (:rfc:`1341`) of the full description', '(e.g. ``text/markdown``). The ``charset`` parameter is assumed', 'UTF-8 when not present.'], '$comment': 'TODO: add regex pattern or format?'}}, 'required': ['content-type']}]}]}, 'requires-python': {'type': 'string', 'format': 'pep508-versionspec', '$$description': ['`The Python version requirements of the project', '<https://packaging.python.org/specifications/core-metadata/#requires-python>`_.']}, 'license': {'description': '`Project license <https://peps.python.org/pep-0621/#license>`_.', 'oneOf': [{'type': 'string', 'description': 'An SPDX license identifier', 'format': 'SPDX'}, {'type': 'object', 'properties': {'file': {'type': 'string', '$$description': ['Relative path to the file (UTF-8) which contains the license for the', 'project.']}}, 'required': ['file']}, {'type': 'object', 'properties': {'text': {'type': 'string', '$$description': ['The license of the project whose meaning is that of the', '`License field from the core metadata', '<https://packaging.python.org/specifications/core-metadata/#license>`_.']}}, 'required': ['text']}]}, 'license-files': {'description': 'Paths or globs to paths of license files', 'type': 'array', 'items': {'type': 'string'}}, 'authors': {'type': 'array', 'items': {'$ref': '#/definitions/author'}, '$$description': ["The people or organizations considered to be the 'authors' of the project.", 'The exact meaning is open to interpretation (e.g. original or primary authors,', 'current maintainers, or owners of the package).']}, 'maintainers': {'type': 'array', 'items': {'$ref': '#/definitions/author'}, '$$description': ["The people or organizations considered to be the 'maintainers' of the project.", 'Similarly to ``authors``, the exact meaning is open to interpretation.']}, 'keywords': {'type': 'array', 'items': {'type': 'string'}, 'description': 'List of keywords to assist searching for the distribution in a larger catalog.'}, 'classifiers': {'type': 'array', 'items': {'type': 'string', 'format': 'trove-classifier', 'description': '`PyPI classifier <https://pypi.org/classifiers/>`_.'}, '$$description': ['`Trove classifiers <https://pypi.org/classifiers/>`_', 'which apply to the project.']}, 'urls': {'type': 'object', 'description': 'URLs associated with the project in the form ``label => value``.', 'additionalProperties': False, 'patternProperties': {'^.+$': {'type': 'string', 'format': 'url'}}}, 'scripts': {'$ref': '#/definitions/entry-point-group', '$$description': ['Instruct the installer to create command-line wrappers for the given', '`entry points <https://packaging.python.org/specifications/entry-points/>`_.']}, 'gui-scripts': {'$ref': '#/definitions/entry-point-group', '$$description': ['Instruct the installer to create GUI wrappers for the given', '`entry points <https://packaging.python.org/specifications/entry-points/>`_.', 'The difference between ``scripts`` and ``gui-scripts`` is only relevant in', 'Windows.']}, 'entry-points': {'$$description': ['Instruct the installer to expose the given modules/functions via', '``entry-point`` discovery mechanism (useful for plugins).', 'More information available in the `Python packaging guide', '<https://packaging.python.org/specifications/entry-points/>`_.'], 'propertyNames': {'format': 'python-entrypoint-group'}, 'additionalProperties': False, 'patternProperties': {'^.+$': {'$ref': '#/definitions/entry-point-group'}}}, 'dependencies': {'type': 'array', 'description': 'Project (mandatory) dependencies.', 'items': {'$ref': '#/definitions/dependency'}}, 'optional-dependencies': {'type': 'object', 'description': 'Optional dependency for the project', 'propertyNames': {'format': 'pep508-identifier'}, 'additionalProperties': False, 'patternProperties': {'^.+$': {'type': 'array', 'items': {'$ref': '#/definitions/dependency'}}}}, 'import-names': {'description': 'Lists import names which a project, when installed, would exclusively provide.', 'type': 'array', 'items': {'type': 'string', 'format': 'import-name'}}, 'import-namespaces': {'description': 'Lists import names that, when installed, would be provided by the project, but not exclusively.', 'type': 'array', 'items': {'type': 'string', 'format': 'import-name'}}, 'dynamic': {'type': 'array', '$$description': ['Specifies which fields are intentionally unspecified and expected to be', 'dynamically provided by build tools'], 'items': {'enum': ['version', 'description', 'readme', 'requires-python', 'license', 'license-files', 'authors', 'maintainers', 'keywords', 'classifiers', 'urls', 'scripts', 'gui-scripts', 'entry-points', 'dependencies', 'optional-dependencies', 'import-names', 'import-namespaces']}}}, 'required': ['name'], 'additionalProperties': False, 'allOf': [{'if': {'not': {'required': ['dynamic'], 'properties': {'dynamic': {'contains': {'const': 'version'}, '$$description': ['version is listed in ``dynamic``']}}}, '$$comment': ['According to :pep:`621`:', '    If the core metadata specification lists a field as "Required", then', '    the metadata MUST specify the field statically or list it in dynamic', 'In turn, `core metadata`_ defines:', '    The required fields are: Metadata-Version, Name, Version.', '    All the other fields are optional.', 'Since ``Metadata-Version`` is defined by the build back-end, ``name`` and', '``version`` are the only mandatory information in ``pyproject.toml``.', '.. _core metadata: https://packaging.python.org/specifications/core-metadata/']}, 'then': {'required': ['version'], '$$description': ['version should be statically defined in the ``version`` field']}}, {'if': {'required': ['license-files']}, 'then': {'properties': {'license': {'type': 'string'}}}}], 'definitions': {'author': {'$id': '#/definitions/author', 'title': 'Author or Maintainer', '$comment': 'https://peps.python.org/pep-0621/#authors-maintainers', 'type': 'object', 'additionalProperties': False, 'properties': {'name': {'type': 'string', '$$description': ['MUST be a valid email name, i.e. whatever can be put as a name, before an', 'email, in :rfc:`822`.']}, 'email': {'type': 'string', 'format': 'idn-email', 'description': 'MUST be a valid email address'}}, 'anyOf': [{'required': ['name']}, {'required': ['email']}]}, 'entry-point-group': {'$id': '#/definitions/entry-point-group', 'title': 'Entry-points', 'type': 'object', '$$description': ['Entry-points are grouped together to indicate what sort of capabilities they', 'provide.', 'See the `packaging guides', '<https://packaging.python.org/specifications/entry-points/>`_', 'and `setuptools docs', '<https://setuptools.pypa.io/en/latest/userguide/entry_point.html>`_', 'for more information.'], 'propertyNames': {'format': 'python-entrypoint-name'}, 'additionalProperties': False, 'patternProperties': {'^.+$': {'type': 'string', '$$description': ['Reference to a Python object. It is either in the form', '``importable.module``, or ``importable.module:object.attr``.'], 'format': 'python-entrypoint-reference', '$comment': 'https://packaging.python.org/specifications/entry-points/'}}}, 'dependency': {'$id': '#/definitions/dependency', 'title': 'Dependency', 'type': 'string', 'description': 'Project dependency specification according to PEP 508', 'format': 'pep508'}}}, 'tool': {'type': 'object', 'properties': {'distutils': {'$schema': 'http://json-schema.org/draft-07/schema#', '$id': 'https://setuptools.pypa.io/en/latest/deprecated/distutils/configfile.html', 'title': '``tool.distutils`` table', '$$description': ['**EXPERIMENTAL** (NOT OFFICIALLY SUPPORTED): Use ``tool.distutils``', 'subtables to configure arguments for ``distutils`` commands.', 'Originally, ``distutils`` allowed developers to configure arguments for', '``setup.py`` commands via `distutils configuration files', '<https://setuptools.pypa.io/en/latest/deprecated/distutils/configfile.html>`_.', 'See also `the old Python docs <https://docs.python.org/3.11/install/>_`.'], 'type': 'object', 'properties': {'global': {'type': 'object', 'description': 'Global options applied to all ``distutils`` commands'}}, 'patternProperties': {'.+': {'type': 'object'}}, '$comment': 'TODO: Is there a practical way of making this schema more specific?'}, 'setuptools': {'$schema': 'http://json-schema.org/draft-07/schema#', '$id': 'https://setuptools.pypa.io/en/latest/userguide/pyproject_config.html', 'title': '``tool.setuptools`` table', '$$description': ['``setuptools``-specific configurations that can be set by users that require', 'customization.', 'These configurations are completely optional and probably can be skipped when', 'creating simple packages. They are equivalent to some of the `Keywords', '<https://setuptools.pypa.io/en/latest/references/keywords.html>`_', 'used by the ``setup.py`` file, and can be set via the ``tool.setuptools`` table.', 'It considers only ``setuptools`` `parameters', '<https://setuptools.pypa.io/en/latest/userguide/pyproject_config.html#setuptools-specific-configuration>`_', 'that are not covered by :pep:`621`; and intentionally excludes ``dependency_links``', 'and ``setup_requires`` (incompatible with modern workflows/standards).'], 'type': 'object', 'additionalProperties': False, 'properties': {'platforms': {'type': 'array', 'items': {'type': 'string'}}, 'provides': {'$$description': ['Package and virtual package names contained within this package', '**(not supported by pip)**'], 'type': 'array', 'items': {'type': 'string', 'format': 'pep508-identifier'}}, 'obsoletes': {'$$description': ['Packages which this package renders obsolete', '**(not supported by pip)**'], 'type': 'array', 'items': {'type': 'string', 'format': 'pep508-identifier'}}, 'zip-safe': {'$$description': ['Whether the project can be safely installed and run from a zip file.', '**OBSOLETE**: only relevant for ``pkg_resources``, ``easy_install`` and', '``setup.py install`` in the context of ``eggs`` (**DEPRECATED**).'], 'type': 'boolean'}, 'script-files': {'$$description': ['Legacy way of defining scripts (entry-points are preferred).', 'Equivalent to the ``script`` keyword in ``setup.py``', '(it was renamed to avoid confusion with entry-point based ``project.scripts``', 'defined in :pep:`621`).', '**DISCOURAGED**: generic script wrappers are tricky and may not work properly.', 'Whenever possible, please use ``project.scripts`` instead.'], 'type': 'array', 'items': {'type': 'string'}, '$comment': 'TODO: is this field deprecated/should be removed?'}, 'eager-resources': {'$$description': ['Resources that should be extracted together, if any of them is needed,', 'or if any C extensions included in the project are imported.', '**OBSOLETE**: only relevant for ``pkg_resources``, ``easy_install`` and', '``setup.py install`` in the context of ``eggs`` (**DEPRECATED**).'], 'type': 'array', 'items': {'type': 'string'}}, 'packages': {'$$description': ['Packages that should be included in the distribution.', 'It can be given either as a list of package identifiers', 'or as a ``dict``-like structure with a single key ``find``', 'which corresponds to a dynamic call to', '``setuptools.config.expand.find_packages`` function.', 'The ``find`` key is associated with a nested ``dict``-like structure that can', 'contain ``where``, ``include``, ``exclude`` and ``namespaces`` keys,', 'mimicking the keyword arguments of the associated function.'], 'oneOf': [{'title': 'Array of Python package identifiers', 'type': 'array', 'items': {'$ref': '#/definitions/package-name'}}, {'$ref': '#/definitions/find-directive'}]}, 'package-dir': {'$$description': [':class:`dict`-like structure mapping from package names to directories where their', 'code can be found.', 'The empty string (as key) means that all packages are contained inside', 'the given directory will be included in the distribution.'], 'type': 'object', 'additionalProperties': False, 'propertyNames': {'anyOf': [{'const': ''}, {'$ref': '#/definitions/package-name'}]}, 'patternProperties': {'^.*$': {'type': 'string'}}}, 'package-data': {'$$description': ['Mapping from package names to lists of glob patterns.', 'Usually this option is not needed when using ``include-package-data = true``', 'For more information on how to include data files, check ``setuptools`` `docs', '<https://setuptools.pypa.io/en/latest/userguide/datafiles.html>`_.'], 'type': 'object', 'additionalProperties': False, 'propertyNames': {'anyOf': [{'$ref': '#/definitions/package-name'}, {'const': '*'}]}, 'patternProperties': {'^.*$': {'type': 'array', 'items': {'type': 'string'}}}}, 'include-package-data': {'$$description': ['Automatically include any data files inside the package directories', 'that are specified by ``MANIFEST.in``', 'For more information on how to include data files, check ``setuptools`` `docs', '<https://setuptools.pypa.io/en/latest/userguide/datafiles.html>`_.'], 'type': 'boolean'}, 'exclude-package-data': {'$$description': ['Mapping from package names to lists of glob patterns that should be excluded', 'For more information on how to include data files, check ``setuptools`` `docs', '<https://setuptools.pypa.io/en/latest/userguide/datafiles.html>`_.'], 'type': 'object', 'additionalProperties': False, 'propertyNames': {'anyOf': [{'$ref': '#/definitions/package-name'}, {'const': '*'}]}, 'patternProperties': {'^.*$': {'type': 'array', 'items': {'type': 'string'}}}}, 'namespace-packages': {'type': 'array', 'items': {'type': 'string', 'format': 'python-module-name-relaxed'}, '$comment': 'https://setuptools.pypa.io/en/latest/userguide/package_discovery.html', 'description': '**DEPRECATED**: use implicit namespaces instead (:pep:`420`).'}, 'py-modules': {'description': 'Modules that setuptools will manipulate', 'type': 'array', 'items': {'type': 'string', 'format': 'python-module-name-relaxed'}, '$comment': 'TODO: clarify the relationship with ``packages``'}, 'ext-modules': {'description': 'Extension modules to be compiled by setuptools', 'type': 'array', 'items': {'$ref': '#/definitions/ext-module'}}, 'data-files': {'$$description': ['``dict``-like structure where each key represents a directory and', 'the value is a list of glob patterns that should be installed in them.', '**DISCOURAGED**: please notice this might not work as expected with wheels.', 'Whenever possible, consider using data files inside the package directories', '(or create a new namespace package that only contains data files).', 'See `data files support', '<https://setuptools.pypa.io/en/latest/userguide/datafiles.html>`_.'], 'type': 'object', 'patternProperties': {'^.*$': {'type': 'array', 'items': {'type': 'string'}}}}, 'cmdclass': {'$$description': ['Mapping of distutils-style command names to ``setuptools.Command`` subclasses', 'which in turn should be represented by strings with a qualified class name', '(i.e., "dotted" form with module), e.g.::\n\n', '    cmdclass = {mycmd = "pkg.subpkg.module.CommandClass"}\n\n', 'The command class should be a directly defined at the top-level of the', 'containing module (no class nesting).'], 'type': 'object', 'patternProperties': {'^.*$': {'type': 'string', 'format': 'python-qualified-identifier'}}}, 'license-files': {'type': 'array', 'items': {'type': 'string'}, '$$description': ['**PROVISIONAL**: list of glob patterns for all license files being distributed.', '(likely to become standard with :pep:`639`).', "By default: ``['LICEN[CS]E*', 'COPYING*', 'NOTICE*', 'AUTHORS*']``"], '$comment': 'TODO: revise if PEP 639 is accepted. Probably ``project.license-files``?'}, 'dynamic': {'type': 'object', 'description': 'Instructions for loading :pep:`621`-related metadata dynamically', 'additionalProperties': False, 'properties': {'version': {'$$description': ['A version dynamically loaded via either the ``attr:`` or ``file:``', 'directives. Please make sure the given file or attribute respects :pep:`440`.', 'Also ensure to set ``project.dynamic`` accordingly.'], 'oneOf': [{'$ref': '#/definitions/attr-directive'}, {'$ref': '#/definitions/file-directive'}]}, 'classifiers': {'$ref': '#/definitions/file-directive'}, 'description': {'$ref': '#/definitions/file-directive'}, 'entry-points': {'$ref': '#/definitions/file-directive'}, 'dependencies': {'$ref': '#/definitions/file-directive-for-dependencies'}, 'optional-dependencies': {'type': 'object', 'propertyNames': {'type': 'string', 'format': 'pep508-identifier'}, 'additionalProperties': False, 'patternProperties': {'.+': {'$ref': '#/definitions/file-directive-for-dependencies'}}}, 'readme': {'type': 'object', 'anyOf': [{'$ref': '#/definitions/file-directive'}, {'type': 'object', 'properties': {'content-type': {'type': 'string'}, 'file': {'$ref': '#/definitions/file-directive/properties/file'}}, 'additionalProperties': False}], 'required': ['file']}}}}, 'definitions': {'package-name': {'$id': '#/definitions/package-name', 'title': 'Valid package name', 'description': 'Valid package name (importable or :pep:`561`).', 'type': 'string', 'anyOf': [{'type': 'string', 'format': 'python-module-name-relaxed'}, {'type': 'string', 'format': 'pep561-stub-name'}]}, 'ext-module': {'$id': '#/definitions/ext-module', 'title': 'Extension module', 'description': 'Parameters to construct a :class:`setuptools.Extension` object', 'type': 'object', 'required': ['name', 'sources'], 'additionalProperties': False, 'properties': {'name': {'type': 'string', 'format': 'python-module-name-relaxed'}, 'sources': {'type': 'array', 'items': {'type': 'string'}}, 'include-dirs': {'type': 'array', 'items': {'type': 'string'}}, 'define-macros': {'type': 'array', 'items': {'type': 'array', 'items': [{'description': 'macro name', 'type': 'string'}, {'description': 'macro value', 'oneOf': [{'type': 'string'}, {'type': 'null'}]}], 'additionalItems': False}}, 'undef-macros': {'type': 'array', 'items': {'type': 'string'}}, 'library-dirs': {'type': 'array', 'items': {'type': 'string'}}, 'libraries': {'type': 'array', 'items': {'type': 'string'}}, 'runtime-library-dirs': {'type': 'array', 'items': {'type': 'string'}}, 'extra-objects': {'type': 'array', 'items': {'type': 'string'}}, 'extra-compile-args': {'type': 'array', 'items': {'type': 'string'}}, 'extra-link-args': {'type': 'array', 'items': {'type': 'string'}}, 'export-symbols': {'type': 'array', 'items': {'type': 'string'}}, 'swig-opts': {'type': 'array', 'items': {'type': 'string'}}, 'depends': {'type': 'array', 'items': {'type': 'string'}}, 'language': {'type': 'string'}, 'optional': {'type': 'boolean'}, 'py-limited-api': {'type': 'boolean'}}}, 'file-directive': {'$id': '#/definitions/file-directive', 'title': "'file:' directive", 'description': 'Value is read from a file (or list of files and then concatenated)', 'type': 'object', 'additionalProperties': False, 'properties': {'file': {'oneOf': [{'type': 'string'}, {'type': 'array', 'items': {'type': 'string'}}]}}, 'required': ['file']}, 'file-directive-for-dependencies': {'title': "'file:' directive for dependencies", 'allOf': [{'$$description': ['**BETA**: subset of the ``requirements.txt`` format', 'without ``pip`` flags and options', '(one :pep:`508`-compliant string per line,', 'lines that are blank or start with ``#`` are excluded).', 'See `dynamic metadata', '<https://setuptools.pypa.io/en/latest/userguide/pyproject_config.html#dynamic-metadata>`_.']}, {'$ref': '#/definitions/file-directive'}]}, 'attr-directive': {'title': "'attr:' directive", '$id': '#/definitions/attr-directive', '$$description': ['Value is read from a module attribute. Supports callables and iterables;', 'unsupported types are cast via ``str()``'], 'type': 'object', 'additionalProperties': False, 'properties': {'attr': {'type': 'string', 'format': 'python-qualified-identifier'}}, 'required': ['attr']}, 'find-directive': {'$id': '#/definitions/find-directive', 'title': "'find:' directive", 'type': 'object', 'additionalProperties': False, 'properties': {'find': {'type': 'object', '$$description': ['Dynamic `package discovery', '<https://setuptools.pypa.io/en/latest/userguide/package_discovery.html>`_.'], 'additionalProperties': False, 'properties': {'where': {'description': 'Directories to be searched for packages (Unix-style relative path)', 'type': 'array', 'items': {'type': 'string'}}, 'exclude': {'type': 'array', '$$description': ['Exclude packages that match the values listed in this field.', "Can container shell-style wildcards (e.g. ``'pkg.*'``)"], 'items': {'type': 'string'}}, 'include': {'type': 'array', '$$description': ['Restrict the found packages to just the ones listed in this field.', "Can container shell-style wildcards (e.g. ``'pkg.*'``)"], 'items': {'type': 'string'}}, 'namespaces': {'type': 'boolean', '$$description': ['When ``True``, directories without a ``__init__.py`` file will also', 'be scanned for :pep:`420`-style implicit namespaces']}}}}}}}}}, 'dependency-groups': {'type': 'object', 'description': 'Dependency groups following PEP 735', 'additionalProperties': False, 'patternProperties': {'^([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9._-]*[a-zA-Z0-9])$': {'type': 'array', 'items': {'oneOf': [{'type': 'string', 'description': 'Python package specifiers following PEP 508', 'format': 'pep508'}, {'type': 'object', 'additionalProperties': False, 'properties': {'include-group': {'description': 'Another dependency group to include in this one', 'type': 'string', 'pattern': '^([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9._-]*[a-zA-Z0-9])$'}}}]}}}}}, 'project': {'$schema': 'http://json-schema.org/draft-07/schema#', '$id': 'https://packaging.python.org/en/latest/specifications/pyproject-toml/', 'title': 'Package metadata stored in the ``project`` table', '$$description': ['Data structure for the **project** table inside ``pyproject.toml``', '(as initially defined in :pep:`621`)'], 'type': 'object', 'properties': {'name': {'type': 'string', 'description': 'The name (primary identifier) of the project. MUST be statically defined.', 'format': 'pep508-identifier'}, 'version': {'type': 'string', 'description': 'The version of the project as supported by :pep:`440`.', 'format': 'pep440'}, 'description': {'type': 'string', '$$description': ['The `summary description of the project', '<https://packaging.python.org/specifications/core-metadata/#summary>`_']}, 'readme': {'$$description': ['`Full/detailed description of the project in the form of a README', '<https://peps.python.org/pep-0621/#readme>`_', "with meaning similar to the one defined in `core metadata's Description", '<https://packaging.python.org/specifications/core-metadata/#description>`_'], 'oneOf': [{'type': 'string', '$$description': ['Relative path to a text file (UTF-8) containing the full description', 'of the project. If the file path ends in case-insensitive ``.md`` or', '``.rst`` suffixes, then the content-type is respectively', '``text/markdown`` or ``text/x-rst``']}, {'type': 'object', 'allOf': [{'anyOf': [{'properties': {'file': {'type': 'string', '$$description': ['Relative path to a text file containing the full description', 'of the project.']}}, 'required': ['file']}, {'properties': {'text': {'type': 'string', 'description': 'Full text describing the project.'}}, 'required': ['text']}]}, {'properties': {'content-type': {'type': 'string', '$$description': ['Content-type (:rfc:`1341`) of the full description', '(e.g. ``text/markdown``). The ``charset`` parameter is assumed', 'UTF-8 when not present.'], '$comment': 'TODO: add regex pattern or format?'}}, 'required': ['content-type']}]}]}, 'requires-python': {'type': 'string', 'format': 'pep508-versionspec', '$$description': ['`The Python version requirements of the project', '<https://packaging.python.org/specifications/core-metadata/#requires-python>`_.']}, 'license': {'description': '`Project license <https://peps.python.org/pep-0621/#license>`_.', 'oneOf': [{'type': 'string', 'description': 'An SPDX license identifier', 'format': 'SPDX'}, {'type': 'object', 'properties': {'file': {'type': 'string', '$$description': ['Relative path to the file (UTF-8) which contains the license for the', 'project.']}}, 'required': ['file']}, {'type': 'object', 'properties': {'text': {'type': 'string', '$$description': ['The license of the project whose meaning is that of the', '`License field from the core metadata', '<https://packaging.python.org/specifications/core-metadata/#license>`_.']}}, 'required': ['text']}]}, 'license-files': {'description': 'Paths or globs to paths of license files', 'type': 'array', 'items': {'type': 'string'}}, 'authors': {'type': 'array', 'items': {'$ref': '#/definitions/author'}, '$$description': ["The people or organizations considered to be the 'authors' of the project.", 'The exact meaning is open to interpretation (e.g. original or primary authors,', 'current maintainers, or owners of the package).']}, 'maintainers': {'type': 'array', 'items': {'$ref': '#/definitions/author'}, '$$description': ["The people or organizations considered to be the 'maintainers' of the project.", 'Similarly to ``authors``, the exact meaning is open to interpretation.']}, 'keywords': {'type': 'array', 'items': {'type': 'string'}, 'description': 'List of keywords to assist searching for the distribution in a larger catalog.'}, 'classifiers': {'type': 'array', 'items': {'type': 'string', 'format': 'trove-classifier', 'description': '`PyPI classifier <https://pypi.org/classifiers/>`_.'}, '$$description': ['`Trove classifiers <https://pypi.org/classifiers/>`_', 'which apply to the project.']}, 'urls': {'type': 'object', 'description': 'URLs associated with the project in the form ``label => value``.', 'additionalProperties': False, 'patternProperties': {'^.+$': {'type': 'string', 'format': 'url'}}}, 'scripts': {'$ref': '#/definitions/entry-point-group', '$$description': ['Instruct the installer to create command-line wrappers for the given', '`entry points <https://packaging.python.org/specifications/entry-points/>`_.']}, 'gui-scripts': {'$ref': '#/definitions/entry-point-group', '$$description': ['Instruct the installer to create GUI wrappers for the given', '`entry points <https://packaging.python.org/specifications/entry-points/>`_.', 'The difference between ``scripts`` and ``gui-scripts`` is only relevant in', 'Windows.']}, 'entry-points': {'$$description': ['Instruct the installer to expose the given modules/functions via', '``entry-point`` discovery mechanism (useful for plugins).', 'More information available in the `Python packaging guide', '<https://packaging.python.org/specifications/entry-points/>`_.'], 'propertyNames': {'format': 'python-entrypoint-group'}, 'additionalProperties': False, 'patternProperties': {'^.+$': {'$ref': '#/definitions/entry-point-group'}}}, 'dependencies': {'type': 'array', 'description': 'Project (mandatory) dependencies.', 'items': {'$ref': '#/definitions/dependency'}}, 'optional-dependencies': {'type': 'object', 'description': 'Optional dependency for the project', 'propertyNames': {'format': 'pep508-identifier'}, 'additionalProperties': False, 'patternProperties': {'^.+$': {'type': 'array', 'items': {'$ref': '#/definitions/dependency'}}}}, 'import-names': {'description': 'Lists import names which a project, when installed, would exclusively provide.', 'type': 'array', 'items': {'type': 'string', 'format': 'import-name'}}, 'import-namespaces': {'description': 'Lists import names that, when installed, would be provided by the project, but not exclusively.', 'type': 'array', 'items': {'type': 'string', 'format': 'import-name'}}, 'dynamic': {'type': 'array', '$$description': ['Specifies which fields are intentionally unspecified and expected to be', 'dynamically provided by build tools'], 'items': {'enum': ['version', 'description', 'readme', 'requires-python', 'license', 'license-files', 'authors', 'maintainers', 'keywords', 'classifiers', 'urls', 'scripts', 'gui-scripts', 'entry-points', 'dependencies', 'optional-dependencies', 'import-names', 'import-namespaces']}}}, 'required': ['name'], 'additionalProperties': False, 'allOf': [{'if': {'not': {'required': ['dynamic'], 'properties': {'dynamic': {'contains': {'const': 'version'}, '$$description': ['version is listed in ``dynamic``']}}}, '$$comment': ['According to :pep:`621`:', '    If the core metadata specification lists a field as "Required", then', '    the metadata MUST specify the field statically or list it in dynamic', 'In turn, `core metadata`_ defines:', '    The required fields are: Metadata-Version, Name, Version.', '    All the other fields are optional.', 'Since ``Metadata-Version`` is defined by the build back-end, ``name`` and', '``version`` are the only mandatory information in ``pyproject.toml``.', '.. _core metadata: https://packaging.python.org/specifications/core-metadata/']}, 'then': {'required': ['version'], '$$description': ['version should be statically defined in the ``version`` field']}}, {'if': {'required': ['license-files']}, 'then': {'properties': {'license': {'type': 'string'}}}}], 'definitions': {'author': {'$id': '#/definitions/author', 'title': 'Author or Maintainer', '$comment': 'https://peps.python.org/pep-0621/#authors-maintainers', 'type': 'object', 'additionalProperties': False, 'properties': {'name': {'type': 'string', '$$description': ['MUST be a valid email name, i.e. whatever can be put as a name, before an', 'email, in :rfc:`822`.']}, 'email': {'type': 'string', 'format': 'idn-email', 'description': 'MUST be a valid email address'}}, 'anyOf': [{'required': ['name']}, {'required': ['email']}]}, 'entry-point-group': {'$id': '#/definitions/entry-point-group', 'title': 'Entry-points', 'type': 'object', '$$description': ['Entry-points are grouped together to indicate what sort of capabilities they', 'provide.', 'See the `packaging guides', '<https://packaging.python.org/specifications/entry-points/>`_', 'and `setuptools docs', '<https://setuptools.pypa.io/en/latest/userguide/entry_point.html>`_', 'for more information.'], 'propertyNames': {'format': 'python-entrypoint-name'}, 'additionalProperties': False, 'patternProperties': {'^.+$': {'type': 'string', '$$description': ['Reference to a Python object. It is either in the form', '``importable.module``, or ``importable.module:object.attr``.'], 'format': 'python-entrypoint-reference', '$comment': 'https://packaging.python.org/specifications/entry-points/'}}}, 'dependency': {'$id': '#/definitions/dependency', 'title': 'Dependency', 'type': 'string', 'description': 'Project dependency specification according to PEP 508', 'format': 'pep508'}}}}, rule='additionalProperties')     return data@@ -158,3 +158,3 @@     if not isinstance(data, (dict)):-        raise JsonSchemaValueException("" + (name_prefix or "data") + " must be object", value=data, name="" + (name_prefix or "data") + "", definition={'$schema': 'http://json-schema.org/draft-07/schema#', '$id': 'https://setuptools.pypa.io/en/latest/userguide/pyproject_config.html', 'title': '``tool.setuptools`` table', '$$description': ['``setuptools``-specific configurations that can be set by users that require', 'customization.', 'These configurations are completely optional and probably can be skipped when', 'creating simple packages. They are equivalent to some of the `Keywords', '<https://setuptools.pypa.io/en/latest/references/keywords.html>`_', 'used by the ``setup.py`` file, and can be set via the ``tool.setuptools`` table.', 'It considers only ``setuptools`` `parameters', '<https://setuptools.pypa.io/en/latest/userguide/pyproject_config.html#setuptools-specific-configuration>`_', 'that are not covered by :pep:`621`; and intentionally excludes ``dependency_links``', 'and ``setup_requires`` (incompatible with modern workflows/standards).'], 'type': 'object', 'additionalProperties': False, 'properties': {'platforms': {'type': 'array', 'items': {'type': 'string'}}, 'provides': {'$$description': ['Package and virtual package names contained within this package', '**(not supported by pip)**'], 'type': 'array', 'items': {'type': 'string', 'format': 'pep508-identifier'}}, 'obsoletes': {'$$description': ['Packages which this package renders obsolete', '**(not supported by pip)**'], 'type': 'array', 'items': {'type': 'string', 'format': 'pep508-identifier'}}, 'zip-safe': {'$$description': ['Whether the project can be safely installed and run from a zip file.', '**OBSOLETE**: only relevant for ``pkg_resources``, ``easy_install`` and', '``setup.py install`` in the context of ``eggs`` (**DEPRECATED**).'], 'type': 'boolean'}, 'script-files': {'$$description': ['Legacy way of defining scripts (entry-points are preferred).', 'Equivalent to the ``script`` keyword in ``setup.py``', '(it was renamed to avoid confusion with entry-point based ``project.scripts``', 'defined in :pep:`621`).', '**DISCOURAGED**: generic script wrappers are tricky and may not work properly.', 'Whenever possible, please use ``project.scripts`` instead.'], 'type': 'array', 'items': {'type': 'string'}, '$comment': 'TODO: is this field deprecated/should be removed?'}, 'eager-resources': {'$$description': ['Resources that should be extracted together, if any of them is needed,', 'or if any C extensions included in the project are imported.', '**OBSOLETE**: only relevant for ``pkg_resources``, ``easy_install`` and', '``setup.py install`` in the context of ``eggs`` (**DEPRECATED**).'], 'type': 'array', 'items': {'type': 'string'}}, 'packages': {'$$description': ['Packages that should be included in the distribution.', 'It can be given either as a list of package identifiers', 'or as a ``dict``-like structure with a single key ``find``', 'which corresponds to a dynamic call to', '``setuptools.config.expand.find_packages`` function.', 'The ``find`` key is associated with a nested ``dict``-like structure that can', 'contain ``where``, ``include``, ``exclude`` and ``namespaces`` keys,', 'mimicking the keyword arguments of the associated function.'], 'oneOf': [{'title': 'Array of Python package identifiers', 'type': 'array', 'items': {'$id': '#/definitions/package-name', 'title': 'Valid package name', 'description': 'Valid package name (importable or :pep:`561`).', 'type': 'string', 'anyOf': [{'type': 'string', 'format': 'python-module-name-relaxed'}, {'type': 'string', 'format': 'pep561-stub-name'}]}}, {'$id': '#/definitions/find-directive', 'title': "'find:' directive", 'type': 'object', 'additionalProperties': False, 'properties': {'find': {'type': 'object', '$$description': ['Dynamic `package discovery', '<https://setuptools.pypa.io/en/latest/userguide/package_discovery.html>`_.'], 'additionalProperties': False, 'properties': {'where': {'description': 'Directories to be searched for packages (Unix-style relative path)', 'type': 'array', 'items': {'type': 'string'}}, 'exclude': {'type': 'array', '$$description': ['Exclude packages that match the values listed in this field.', "Can container shell-style wildcards (e.g. ``'pkg.*'``)"], 'items': {'type': 'string'}}, 'include': {'type': 'array', '$$description': ['Restrict the found packages to just the ones listed in this field.', "Can container shell-style wildcards (e.g. ``'pkg.*'``)"], 'items': {'type': 'string'}}, 'namespaces': {'type': 'boolean', '$$description': ['When ``True``, directories without a ``__init__.py`` file will also', 'be scanned for :pep:`420`-style implicit namespaces']}}}}}]}, 'package-dir': {'$$description': [':class:`dict`-like structure mapping from package names to directories where their', 'code can be found.', 'The empty string (as key) means that all packages are contained inside', 'the given directory will be included in the distribution.'], 'type': 'object', 'additionalProperties': False, 'propertyNames': {'anyOf': [{'const': ''}, {'$id': '#/definitions/package-name', 'title': 'Valid package name', 'description': 'Valid package name (importable or :pep:`561`).', 'type': 'string', 'anyOf': [{'type': 'string', 'format': 'python-module-name-relaxed'}, {'type': 'string', 'format': 'pep561-stub-name'}]}]}, 'patternProperties': {'^.*$': {'type': 'string'}}}, 'package-data': {'$$description': ['Mapping from package names to lists of glob patterns.', 'Usually this option is not needed when using ``include-package-data = true``', 'For more information on how to include data files, check ``setuptools`` `docs', '<https://setuptools.pypa.io/en/latest/userguide/datafiles.html>`_.'], 'type': 'object', 'additionalProperties': False, 'propertyNames': {'anyOf': [{'type': 'string', 'format': 'python-module-name'}, {'const': '*'}]}, 'patternProperties': {'^.*$': {'type': 'array', 'items': {'type': 'string'}}}}, 'include-package-data': {'$$description': ['Automatically include any data files inside the package directories', 'that are specified by ``MANIFEST.in``', 'For more information on how to include data files, check ``setuptools`` `docs', '<https://setuptools.pypa.io/en/latest/userguide/datafiles.html>`_.'], 'type': 'boolean'}, 'exclude-package-data': {'$$description': ['Mapping from package names to lists of glob patterns that should be excluded', 'For more information on how to include data files, check ``setuptools`` `docs', '<https://setuptools.pypa.io/en/latest/userguide/datafiles.html>`_.'], 'type': 'object', 'additionalProperties': False, 'propertyNames': {'anyOf': [{'type': 'string', 'format': 'python-module-name'}, {'const': '*'}]}, 'patternProperties': {'^.*$': {'type': 'array', 'items': {'type': 'string'}}}}, 'namespace-packages': {'type': 'array', 'items': {'type': 'string', 'format': 'python-module-name-relaxed'}, '$comment': 'https://setuptools.pypa.io/en/latest/userguide/package_discovery.html', 'description': '**DEPRECATED**: use implicit namespaces instead (:pep:`420`).'}, 'py-modules': {'description': 'Modules that setuptools will manipulate', 'type': 'array', 'items': {'type': 'string', 'format': 'python-module-name-relaxed'}, '$comment': 'TODO: clarify the relationship with ``packages``'}, 'ext-modules': {'description': 'Extension modules to be compiled by setuptools', 'type': 'array', 'items': {'$id': '#/definitions/ext-module', 'title': 'Extension module', 'description': 'Parameters to construct a :class:`setuptools.Extension` object', 'type': 'object', 'required': ['name', 'sources'], 'additionalProperties': False, 'properties': {'name': {'type': 'string', 'format': 'python-module-name-relaxed'}, 'sources': {'type': 'array', 'items': {'type': 'string'}}, 'include-dirs': {'type': 'array', 'items': {'type': 'string'}}, 'define-macros': {'type': 'array', 'items': {'type': 'array', 'items': [{'description': 'macro name', 'type': 'string'}, {'description': 'macro value', 'oneOf': [{'type': 'string'}, {'type': 'null'}]}], 'additionalItems': False}}, 'undef-macros': {'type': 'array', 'items': {'type': 'string'}}, 'library-dirs': {'type': 'array', 'items': {'type': 'string'}}, 'libraries': {'type': 'array', 'items': {'type': 'string'}}, 'runtime-library-dirs': {'type': 'array', 'items': {'type': 'string'}}, 'extra-objects': {'type': 'array', 'items': {'type': 'string'}}, 'extra-compile-args': {'type': 'array', 'items': {'type': 'string'}}, 'extra-link-args': {'type': 'array', 'items': {'type': 'string'}}, 'export-symbols': {'type': 'array', 'items': {'type': 'string'}}, 'swig-opts': {'type': 'array', 'items': {'type': 'string'}}, 'depends': {'type': 'array', 'items': {'type': 'string'}}, 'language': {'type': 'string'}, 'optional': {'type': 'boolean'}, 'py-limited-api': {'type': 'boolean'}}}}, 'data-files': {'$$description': ['``dict``-like structure where each key represents a directory and', 'the value is a list of glob patterns that should be installed in them.', '**DISCOURAGED**: please notice this might not work as expected with wheels.', 'Whenever possible, consider using data files inside the package directories', '(or create a new namespace package that only contains data files).', 'See `data files support', '<https://setuptools.pypa.io/en/latest/userguide/datafiles.html>`_.'], 'type': 'object', 'patternProperties': {'^.*$': {'type': 'array', 'items': {'type': 'string'}}}}, 'cmdclass': {'$$description': ['Mapping of distutils-style command names to ``setuptools.Command`` subclasses', 'which in turn should be represented by strings with a qualified class name', '(i.e., "dotted" form with module), e.g.::\n\n', '    cmdclass = {mycmd = "pkg.subpkg.module.CommandClass"}\n\n', 'The command class should be a directly defined at the top-level of the', 'containing module (no class nesting).'], 'type': 'object', 'patternProperties': {'^.*$': {'type': 'string', 'format': 'python-qualified-identifier'}}}, 'license-files': {'type': 'array', 'items': {'type': 'string'}, '$$description': ['**PROVISIONAL**: list of glob patterns for all license files being distributed.', '(likely to become standard with :pep:`639`).', "By default: ``['LICEN[CS]E*', 'COPYING*', 'NOTICE*', 'AUTHORS*']``"], '$comment': 'TODO: revise if PEP 639 is accepted. Probably ``project.license-files``?'}, 'dynamic': {'type': 'object', 'description': 'Instructions for loading :pep:`621`-related metadata dynamically', 'additionalProperties': False, 'properties': {'version': {'$$description': ['A version dynamically loaded via either the ``attr:`` or ``file:``', 'directives. Please make sure the given file or attribute respects :pep:`440`.', 'Also ensure to set ``project.dynamic`` accordingly.'], 'oneOf': [{'title': "'attr:' directive", '$id': '#/definitions/attr-directive', '$$description': ['Value is read from a module attribute. Supports callables and iterables;', 'unsupported types are cast via ``str()``'], 'type': 'object', 'additionalProperties': False, 'properties': {'attr': {'type': 'string', 'format': 'python-qualified-identifier'}}, 'required': ['attr']}, {'$id': '#/definitions/file-directive', 'title': "'file:' directive", 'description': 'Value is read from a file (or list of files and then concatenated)', 'type': 'object', 'additionalProperties': False, 'properties': {'file': {'oneOf': [{'type': 'string'}, {'type': 'array', 'items': {'type': 'string'}}]}}, 'required': ['file']}]}, 'classifiers': {'$id': '#/definitions/file-directive', 'title': "'file:' directive", 'description': 'Value is read from a file (or list of files and then concatenated)', 'type': 'object', 'additionalProperties': False, 'properties': {'file': {'oneOf': [{'type': 'string'}, {'type': 'array', 'items': {'type': 'string'}}]}}, 'required': ['file']}, 'description': {'$id': '#/definitions/file-directive', 'title': "'file:' directive", 'description': 'Value is read from a file (or list of files and then concatenated)', 'type': 'object', 'additionalProperties': False, 'properties': {'file': {'oneOf': [{'type': 'string'}, {'type': 'array', 'items': {'type': 'string'}}]}}, 'required': ['file']}, 'entry-points': {'$id': '#/definitions/file-directive', 'title': "'file:' directive", 'description': 'Value is read from a file (or list of files and then concatenated)', 'type': 'object', 'additionalProperties': False, 'properties': {'file': {'oneOf': [{'type': 'string'}, {'type': 'array', 'items': {'type': 'string'}}]}}, 'required': ['file']}, 'dependencies': {'title': "'file:' directive for dependencies", 'allOf': [{'$$description': ['**BETA**: subset of the ``requirements.txt`` format', 'without ``pip`` flags and options', '(one :pep:`508`-compliant string per line,', 'lines that are blank or start with ``#`` are excluded).', 'See `dynamic metadata', '<https://setuptools.pypa.io/en/latest/userguide/pyproject_config.html#dynamic-metadata>`_.']}, {'$ref': '#/definitions/file-directive'}]}, 'optional-dependencies': {'type': 'object', 'propertyNames': {'type': 'string', 'format': 'pep508-identifier'}, 'additionalProperties': False, 'patternProperties': {'.+': {'title': "'file:' directive for dependencies", 'allOf': [{'$$description': ['**BETA**: subset of the ``requirements.txt`` format', 'without ``pip`` flags and options', '(one :pep:`508`-compliant string per line,', 'lines that are blank or start with ``#`` are excluded).', 'See `dynamic metadata', '<https://setuptools.pypa.io/en/latest/userguide/pyproject_config.html#dynamic-metadata>`_.']}, {'$ref': '#/definitions/file-directive'}]}}}, 'readme': {'type': 'object', 'anyOf': [{'$id': '#/definitions/file-directive', 'title': "'file:' directive", 'description': 'Value is read from a file (or list of files and then concatenated)', 'type': 'object', 'additionalProperties': False, 'properties': {'file': {'oneOf': [{'type': 'string'}, {'type': 'array', 'items': {'type': 'string'}}]}}, 'required': ['file']}, {'type': 'object', 'properties': {'content-type': {'type': 'string'}, 'file': {'oneOf': [{'type': 'string'}, {'type': 'array', 'items': {'type': 'string'}}]}}, 'additionalProperties': False}], 'required': ['file']}}}}, 'definitions': {'package-name': {'$id': '#/definitions/package-name', 'title': 'Valid package name', 'description': 'Valid package name (importable or :pep:`561`).', 'type': 'string', 'anyOf': [{'type': 'string', 'format': 'python-module-name-relaxed'}, {'type': 'string', 'format': 'pep561-stub-name'}]}, 'ext-module': {'$id': '#/definitions/ext-module', 'title': 'Extension module', 'description': 'Parameters to construct a :class:`setuptools.Extension` object', 'type': 'object', 'required': ['name', 'sources'], 'additionalProperties': False, 'properties': {'name': {'type': 'string', 'format': 'python-module-name-relaxed'}, 'sources': {'type': 'array', 'items': {'type': 'string'}}, 'include-dirs': {'type': 'array', 'items': {'type': 'string'}}, 'define-macros': {'type': 'array', 'items': {'type': 'array', 'items': [{'description': 'macro name', 'type': 'string'}, {'description': 'macro value', 'oneOf': [{'type': 'string'}, {'type': 'null'}]}], 'additionalItems': False}}, 'undef-macros': {'type': 'array', 'items': {'type': 'string'}}, 'library-dirs': {'type': 'array', 'items': {'type': 'string'}}, 'libraries': {'type': 'array', 'items': {'type': 'string'}}, 'runtime-library-dirs': {'type': 'array', 'items': {'type': 'string'}}, 'extra-objects': {'type': 'array', 'items': {'type': 'string'}}, 'extra-compile-args': {'type': 'array', 'items': {'type': 'string'}}, 'extra-link-args': {'type': 'array', 'items': {'type': 'string'}}, 'export-symbols': {'type': 'array', 'items': {'type': 'string'}}, 'swig-opts': {'type': 'array', 'items': {'type': 'string'}}, 'depends': {'type': 'array', 'items': {'type': 'string'}}, 'language': {'type': 'string'}, 'optional': {'type': 'boolean'}, 'py-limited-api': {'type': 'boolean'}}}, 'file-directive': {'$id': '#/definitions/file-directive', 'title': "'file:' directive", 'description': 'Value is read from a file (or list of files and then concatenated)', 'type': 'object', 'additionalProperties': False, 'properties': {'file': {'oneOf': [{'type': 'string'}, {'type': 'array', 'items': {'type': 'string'}}]}}, 'required': ['file']}, 'file-directive-for-dependencies': {'title': "'file:' directive for dependencies", 'allOf': [{'$$description': ['**BETA**: subset of the ``requirements.txt`` format', 'without ``pip`` flags and options', '(one :pep:`508`-compliant string per line,', 'lines that are blank or start with ``#`` are excluded).', 'See `dynamic metadata', '<https://setuptools.pypa.io/en/latest/userguide/pyproject_config.html#dynamic-metadata>`_.']}, {'$id': '#/definitions/file-directive', 'title': "'file:' directive", 'description': 'Value is read from a file (or list of files and then concatenated)', 'type': 'object', 'additionalProperties': False, 'properties': {'file': {'oneOf': [{'type': 'string'}, {'type': 'array', 'items': {'type': 'string'}}]}}, 'required': ['file']}]}, 'attr-directive': {'title': "'attr:' directive", '$id': '#/definitions/attr-directive', '$$description': ['Value is read from a module attribute. Supports callables and iterables;', 'unsupported types are cast via ``str()``'], 'type': 'object', 'additionalProperties': False, 'properties': {'attr': {'type': 'string', 'format': 'python-qualified-identifier'}}, 'required': ['attr']}, 'find-directive': {'$id': '#/definitions/find-directive', 'title': "'find:' directive", 'type': 'object', 'additionalProperties': False, 'properties': {'find': {'type': 'object', '$$description': ['Dynamic `package discovery', '<https://setuptools.pypa.io/en/latest/userguide/package_discovery.html>`_.'], 'additionalProperties': False, 'properties': {'where': {'description': 'Directories to be searched for packages (Unix-style relative path)', 'type': 'array', 'items': {'type': 'string'}}, 'exclude': {'type': 'array', '$$description': ['Exclude packages that match the values listed in this field.', "Can container shell-style wildcards (e.g. ``'pkg.*'``)"], 'items': {'type': 'string'}}, 'include': {'type': 'array', '$$description': ['Restrict the found packages to just the ones listed in this field.', "Can container shell-style wildcards (e.g. ``'pkg.*'``)"], 'items': {'type': 'string'}}, 'namespaces': {'type': 'boolean', '$$description': ['When ``True``, directories without a ``__init__.py`` file will also', 'be scanned for :pep:`420`-style implicit namespaces']}}}}}}}, rule='type')+        raise JsonSchemaValueException("" + (name_prefix or "data") + " must be object", value=data, name="" + (name_prefix or "data") + "", definition={'$schema': 'http://json-schema.org/draft-07/schema#', '$id': 'https://setuptools.pypa.io/en/latest/userguide/pyproject_config.html', 'title': '``tool.setuptools`` table', '$$description': ['``setuptools``-specific configurations that can be set by users that require', 'customization.', 'These configurations are completely optional and probably can be skipped when', 'creating simple packages. They are equivalent to some of the `Keywords', '<https://setuptools.pypa.io/en/latest/references/keywords.html>`_', 'used by the ``setup.py`` file, and can be set via the ``tool.setuptools`` table.', 'It considers only ``setuptools`` `parameters', '<https://setuptools.pypa.io/en/latest/userguide/pyproject_config.html#setuptools-specific-configuration>`_', 'that are not covered by :pep:`621`; and intentionally excludes ``dependency_links``', 'and ``setup_requires`` (incompatible with modern workflows/standards).'], 'type': 'object', 'additionalProperties': False, 'properties': {'platforms': {'type': 'array', 'items': {'type': 'string'}}, 'provides': {'$$description': ['Package and virtual package names contained within this package', '**(not supported by pip)**'], 'type': 'array', 'items': {'type': 'string', 'format': 'pep508-identifier'}}, 'obsoletes': {'$$description': ['Packages which this package renders obsolete', '**(not supported by pip)**'], 'type': 'array', 'items': {'type': 'string', 'format': 'pep508-identifier'}}, 'zip-safe': {'$$description': ['Whether the project can be safely installed and run from a zip file.', '**OBSOLETE**: only relevant for ``pkg_resources``, ``easy_install`` and', '``setup.py install`` in the context of ``eggs`` (**DEPRECATED**).'], 'type': 'boolean'}, 'script-files': {'$$description': ['Legacy way of defining scripts (entry-points are preferred).', 'Equivalent to the ``script`` keyword in ``setup.py``', '(it was renamed to avoid confusion with entry-point based ``project.scripts``', 'defined in :pep:`621`).', '**DISCOURAGED**: generic script wrappers are tricky and may not work properly.', 'Whenever possible, please use ``project.scripts`` instead.'], 'type': 'array', 'items': {'type': 'string'}, '$comment': 'TODO: is this field deprecated/should be removed?'}, 'eager-resources': {'$$description': ['Resources that should be extracted together, if any of them is needed,', 'or if any C extensions included in the project are imported.', '**OBSOLETE**: only relevant for ``pkg_resources``, ``easy_install`` and', '``setup.py install`` in the context of ``eggs`` (**DEPRECATED**).'], 'type': 'array', 'items': {'type': 'string'}}, 'packages': {'$$description': ['Packages that should be included in the distribution.', 'It can be given either as a list of package identifiers', 'or as a ``dict``-like structure with a single key ``find``', 'which corresponds to a dynamic call to', '``setuptools.config.expand.find_packages`` function.', 'The ``find`` key is associated with a nested ``dict``-like structure that can', 'contain ``where``, ``include``, ``exclude`` and ``namespaces`` keys,', 'mimicking the keyword arguments of the associated function.'], 'oneOf': [{'title': 'Array of Python package identifiers', 'type': 'array', 'items': {'$id': '#/definitions/package-name', 'title': 'Valid package name', 'description': 'Valid package name (importable or :pep:`561`).', 'type': 'string', 'anyOf': [{'type': 'string', 'format': 'python-module-name-relaxed'}, {'type': 'string', 'format': 'pep561-stub-name'}]}}, {'$id': '#/definitions/find-directive', 'title': "'find:' directive", 'type': 'object', 'additionalProperties': False, 'properties': {'find': {'type': 'object', '$$description': ['Dynamic `package discovery', '<https://setuptools.pypa.io/en/latest/userguide/package_discovery.html>`_.'], 'additionalProperties': False, 'properties': {'where': {'description': 'Directories to be searched for packages (Unix-style relative path)', 'type': 'array', 'items': {'type': 'string'}}, 'exclude': {'type': 'array', '$$description': ['Exclude packages that match the values listed in this field.', "Can container shell-style wildcards (e.g. ``'pkg.*'``)"], 'items': {'type': 'string'}}, 'include': {'type': 'array', '$$description': ['Restrict the found packages to just the ones listed in this field.', "Can container shell-style wildcards (e.g. ``'pkg.*'``)"], 'items': {'type': 'string'}}, 'namespaces': {'type': 'boolean', '$$description': ['When ``True``, directories without a ``__init__.py`` file will also', 'be scanned for :pep:`420`-style implicit namespaces']}}}}}]}, 'package-dir': {'$$description': [':class:`dict`-like structure mapping from package names to directories where their', 'code can be found.', 'The empty string (as key) means that all packages are contained inside', 'the given directory will be included in the distribution.'], 'type': 'object', 'additionalProperties': False, 'propertyNames': {'anyOf': [{'const': ''}, {'$id': '#/definitions/package-name', 'title': 'Valid package name', 'description': 'Valid package name (importable or :pep:`561`).', 'type': 'string', 'anyOf': [{'type': 'string', 'format': 'python-module-name-relaxed'}, {'type': 'string', 'format': 'pep561-stub-name'}]}]}, 'patternProperties': {'^.*$': {'type': 'string'}}}, 'package-data': {'$$description': ['Mapping from package names to lists of glob patterns.', 'Usually this option is not needed when using ``include-package-data = true``', 'For more information on how to include data files, check ``setuptools`` `docs', '<https://setuptools.pypa.io/en/latest/userguide/datafiles.html>`_.'], 'type': 'object', 'additionalProperties': False, 'propertyNames': {'anyOf': [{'$id': '#/definitions/package-name', 'title': 'Valid package name', 'description': 'Valid package name (importable or :pep:`561`).', 'type': 'string', 'anyOf': [{'type': 'string', 'format': 'python-module-name-relaxed'}, {'type': 'string', 'format': 'pep561-stub-name'}]}, {'const': '*'}]}, 'patternProperties': {'^.*$': {'type': 'array', 'items': {'type': 'string'}}}}, 'include-package-data': {'$$description': ['Automatically include any data files inside the package directories', 'that are specified by ``MANIFEST.in``', 'For more information on how to include data files, check ``setuptools`` `docs', '<https://setuptools.pypa.io/en/latest/userguide/datafiles.html>`_.'], 'type': 'boolean'}, 'exclude-package-data': {'$$description': ['Mapping from package names to lists of glob patterns that should be excluded', 'For more information on how to include data files, check ``setuptools`` `docs', '<https://setuptools.pypa.io/en/latest/userguide/datafiles.html>`_.'], 'type': 'object', 'additionalProperties': False, 'propertyNames': {'anyOf': [{'$id': '#/definitions/package-name', 'title': 'Valid package name', 'description': 'Valid package name (importable or :pep:`561`).', 'type': 'string', 'anyOf': [{'type': 'string', 'format': 'python-module-name-relaxed'}, {'type': 'string', 'format': 'pep561-stub-name'}]}, {'const': '*'}]}, 'patternProperties': {'^.*$': {'type': 'array', 'items': {'type': 'string'}}}}, 'namespace-packages': {'type': 'array', 'items': {'type': 'string', 'format': 'python-module-name-relaxed'}, '$comment': 'https://setuptools.pypa.io/en/latest/userguide/package_discovery.html', 'description': '**DEPRECATED**: use implicit namespaces instead (:pep:`420`).'}, 'py-modules': {'description': 'Modules that setuptools will manipulate', 'type': 'array', 'items': {'type': 'string', 'format': 'python-module-name-relaxed'}, '$comment': 'TODO: clarify the relationship with ``packages``'}, 'ext-modules': {'description': 'Extension modules to be compiled by setuptools', 'type': 'array', 'items': {'$id': '#/definitions/ext-module', 'title': 'Extension module', 'description': 'Parameters to construct a :class:`setuptools.Extension` object', 'type': 'object', 'required': ['name', 'sources'], 'additionalProperties': False, 'properties': {'name': {'type': 'string', 'format': 'python-module-name-relaxed'}, 'sources': {'type': 'array', 'items': {'type': 'string'}}, 'include-dirs': {'type': 'array', 'items': {'type': 'string'}}, 'define-macros': {'type': 'array', 'items': {'type': 'array', 'items': [{'description': 'macro name', 'type': 'string'}, {'description': 'macro value', 'oneOf': [{'type': 'string'}, {'type': 'null'}]}], 'additionalItems': False}}, 'undef-macros': {'type': 'array', 'items': {'type': 'string'}}, 'library-dirs': {'type': 'array', 'items': {'type': 'string'}}, 'libraries': {'type': 'array', 'items': {'type': 'string'}}, 'runtime-library-dirs': {'type': 'array', 'items': {'type': 'string'}}, 'extra-objects': {'type': 'array', 'items': {'type': 'string'}}, 'extra-compile-args': {'type': 'array', 'items': {'type': 'string'}}, 'extra-link-args': {'type': 'array', 'items': {'type': 'string'}}, 'export-symbols': {'type': 'array', 'items': {'type': 'string'}}, 'swig-opts': {'type': 'array', 'items': {'type': 'string'}}, 'depends': {'type': 'array', 'items': {'type': 'string'}}, 'language': {'type': 'string'}, 'optional': {'type': 'boolean'}, 'py-limited-api': {'type': 'boolean'}}}}, 'data-files': {'$$description': ['``dict``-like structure where each key represents a directory and', 'the value is a list of glob patterns that should be installed in them.', '**DISCOURAGED**: please notice this might not work as expected with wheels.', 'Whenever possible, consider using data files inside the package directories', '(or create a new namespace package that only contains data files).', 'See `data files support', '<https://setuptools.pypa.io/en/latest/userguide/datafiles.html>`_.'], 'type': 'object', 'patternProperties': {'^.*$': {'type': 'array', 'items': {'type': 'string'}}}}, 'cmdclass': {'$$description': ['Mapping of distutils-style command names to ``setuptools.Command`` subclasses', 'which in turn should be represented by strings with a qualified class name', '(i.e., "dotted" form with module), e.g.::\n\n', '    cmdclass = {mycmd = "pkg.subpkg.module.CommandClass"}\n\n', 'The command class should be a directly defined at the top-level of the', 'containing module (no class nesting).'], 'type': 'object', 'patternProperties': {'^.*$': {'type': 'string', 'format': 'python-qualified-identifier'}}}, 'license-files': {'type': 'array', 'items': {'type': 'string'}, '$$description': ['**PROVISIONAL**: list of glob patterns for all license files being distributed.', '(likely to become standard with :pep:`639`).', "By default: ``['LICEN[CS]E*', 'COPYING*', 'NOTICE*', 'AUTHORS*']``"], '$comment': 'TODO: revise if PEP 639 is accepted. Probably ``project.license-files``?'}, 'dynamic': {'type': 'object', 'description': 'Instructions for loading :pep:`621`-related metadata dynamically', 'additionalProperties': False, 'properties': {'version': {'$$description': ['A version dynamically loaded via either the ``attr:`` or ``file:``', 'directives. Please make sure the given file or attribute respects :pep:`440`.', 'Also ensure to set ``project.dynamic`` accordingly.'], 'oneOf': [{'title': "'attr:' directive", '$id': '#/definitions/attr-directive', '$$description': ['Value is read from a module attribute. Supports callables and iterables;', 'unsupported types are cast via ``str()``'], 'type': 'object', 'additionalProperties': False, 'properties': {'attr': {'type': 'string', 'format': 'python-qualified-identifier'}}, 'required': ['attr']}, {'$id': '#/definitions/file-directive', 'title': "'file:' directive", 'description': 'Value is read from a file (or list of files and then concatenated)', 'type': 'object', 'additionalProperties': False, 'properties': {'file': {'oneOf': [{'type': 'string'}, {'type': 'array', 'items': {'type': 'string'}}]}}, 'required': ['file']}]}, 'classifiers': {'$id': '#/definitions/file-directive', 'title': "'file:' directive", 'description': 'Value is read from a file (or list of files and then concatenated)', 'type': 'object', 'additionalProperties': False, 'properties': {'file': {'oneOf': [{'type': 'string'}, {'type': 'array', 'items': {'type': 'string'}}]}}, 'required': ['file']}, 'description': {'$id': '#/definitions/file-directive', 'title': "'file:' directive", 'description': 'Value is read from a file (or list of files and then concatenated)', 'type': 'object', 'additionalProperties': False, 'properties': {'file': {'oneOf': [{'type': 'string'}, {'type': 'array', 'items': {'type': 'string'}}]}}, 'required': ['file']}, 'entry-points': {'$id': '#/definitions/file-directive', 'title': "'file:' directive", 'description': 'Value is read from a file (or list of files and then concatenated)', 'type': 'object', 'additionalProperties': False, 'properties': {'file': {'oneOf': [{'type': 'string'}, {'type': 'array', 'items': {'type': 'string'}}]}}, 'required': ['file']}, 'dependencies': {'title': "'file:' directive for dependencies", 'allOf': [{'$$description': ['**BETA**: subset of the ``requirements.txt`` format', 'without ``pip`` flags and options', '(one :pep:`508`-compliant string per line,', 'lines that are blank or start with ``#`` are excluded).', 'See `dynamic metadata', '<https://setuptools.pypa.io/en/latest/userguide/pyproject_config.html#dynamic-metadata>`_.']}, {'$ref': '#/definitions/file-directive'}]}, 'optional-dependencies': {'type': 'object', 'propertyNames': {'type': 'string', 'format': 'pep508-identifier'}, 'additionalProperties': False, 'patternProperties': {'.+': {'title': "'file:' directive for dependencies", 'allOf': [{'$$description': ['**BETA**: subset of the ``requirements.txt`` format', 'without ``pip`` flags and options', '(one :pep:`508`-compliant string per line,', 'lines that are blank or start with ``#`` are excluded).', 'See `dynamic metadata', '<https://setuptools.pypa.io/en/latest/userguide/pyproject_config.html#dynamic-metadata>`_.']}, {'$ref': '#/definitions/file-directive'}]}}}, 'readme': {'type': 'object', 'anyOf': [{'$id': '#/definitions/file-directive', 'title': "'file:' directive", 'description': 'Value is read from a file (or list of files and then concatenated)', 'type': 'object', 'additionalProperties': False, 'properties': {'file': {'oneOf': [{'type': 'string'}, {'type': 'array', 'items': {'type': 'string'}}]}}, 'required': ['file']}, {'type': 'object', 'properties': {'content-type': {'type': 'string'}, 'file': {'oneOf': [{'type': 'string'}, {'type': 'array', 'items': {'type': 'string'}}]}}, 'additionalProperties': False}], 'required': ['file']}}}}, 'definitions': {'package-name': {'$id': '#/definitions/package-name', 'title': 'Valid package name', 'description': 'Valid package name (importable or :pep:`561`).', 'type': 'string', 'anyOf': [{'type': 'string', 'format': 'python-module-name-relaxed'}, {'type': 'string', 'format': 'pep561-stub-name'}]}, 'ext-module': {'$id': '#/definitions/ext-module', 'title': 'Extension module', 'description': 'Parameters to construct a :class:`setuptools.Extension` object', 'type': 'object', 'required': ['name', 'sources'], 'additionalProperties': False, 'properties': {'name': {'type': 'string', 'format': 'python-module-name-relaxed'}, 'sources': {'type': 'array', 'items': {'type': 'string'}}, 'include-dirs': {'type': 'array', 'items': {'type': 'string'}}, 'define-macros': {'type': 'array', 'items': {'type': 'array', 'items': [{'description': 'macro name', 'type': 'string'}, {'description': 'macro value', 'oneOf': [{'type': 'string'}, {'type': 'null'}]}], 'additionalItems': False}}, 'undef-macros': {'type': 'array', 'items': {'type': 'string'}}, 'library-dirs': {'type': 'array', 'items': {'type': 'string'}}, 'libraries': {'type': 'array', 'items': {'type': 'string'}}, 'runtime-library-dirs': {'type': 'array', 'items': {'type': 'string'}}, 'extra-objects': {'type': 'array', 'items': {'type': 'string'}}, 'extra-compile-args': {'type': 'array', 'items': {'type': 'string'}}, 'extra-link-args': {'type': 'array', 'items': {'type': 'string'}}, 'export-symbols': {'type': 'array', 'items': {'type': 'string'}}, 'swig-opts': {'type': 'array', 'items': {'type': 'string'}}, 'depends': {'type': 'array', 'items': {'type': 'string'}}, 'language': {'type': 'string'}, 'optional': {'type': 'boolean'}, 'py-limited-api': {'type': 'boolean'}}}, 'file-directive': {'$id': '#/definitions/file-directive', 'title': "'file:' directive", 'description': 'Value is read from a file (or list of files and then concatenated)', 'type': 'object', 'additionalProperties': False, 'properties': {'file': {'oneOf': [{'type': 'string'}, {'type': 'array', 'items': {'type': 'string'}}]}}, 'required': ['file']}, 'file-directive-for-dependencies': {'title': "'file:' directive for dependencies", 'allOf': [{'$$description': ['**BETA**: subset of the ``requirements.txt`` format', 'without ``pip`` flags and options', '(one :pep:`508`-compliant string per line,', 'lines that are blank or start with ``#`` are excluded).', 'See `dynamic metadata', '<https://setuptools.pypa.io/en/latest/userguide/pyproject_config.html#dynamic-metadata>`_.']}, {'$id': '#/definitions/file-directive', 'title': "'file:' directive", 'description': 'Value is read from a file (or list of files and then concatenated)', 'type': 'object', 'additionalProperties': False, 'properties': {'file': {'oneOf': [{'type': 'string'}, {'type': 'array', 'items': {'type': 'string'}}]}}, 'required': ['file']}]}, 'attr-directive': {'title': "'attr:' directive", '$id': '#/definitions/attr-directive', '$$description': ['Value is read from a module attribute. Supports callables and iterables;', 'unsupported types are cast via ``str()``'], 'type': 'object', 'additionalProperties': False, 'properties': {'attr': {'type': 'string', 'format': 'python-qualified-identifier'}}, 'required': ['attr']}, 'find-directive': {'$id': '#/definitions/find-directive', 'title': "'find:' directive", 'type': 'object', 'additionalProperties': False, 'properties': {'find': {'type': 'object', '$$description': ['Dynamic `package discovery', '<https://setuptools.pypa.io/en/latest/userguide/package_discovery.html>`_.'], 'additionalProperties': False, 'properties': {'where': {'description': 'Directories to be searched for packages (Unix-style relative path)', 'type': 'array', 'items': {'type': 'string'}}, 'exclude': {'type': 'array', '$$description': ['Exclude packages that match the values listed in this field.', "Can container shell-style wildcards (e.g. ``'pkg.*'``)"], 'items': {'type': 'string'}}, 'include': {'type': 'array', '$$description': ['Restrict the found packages to just the ones listed in this field.', "Can container shell-style wildcards (e.g. ``'pkg.*'``)"], 'items': {'type': 'string'}}, 'namespaces': {'type': 'boolean', '$$description': ['When ``True``, directories without a ``__init__.py`` file will also', 'be scanned for :pep:`420`-style implicit namespaces']}}}}}}}, rule='type')     data_is_dict = isinstance(data, dict)@@ -293,3 +293,3 @@             if not isinstance(data__packagedata, (dict)):-                raise JsonSchemaValueException("" + (name_prefix or "data") + ".package-data must be object", value=data__packagedata, name="" + (name_prefix or "data") + ".package-data", definition={'$$description': ['Mapping from package names to lists of glob patterns.', 'Usually this option is not needed when using ``include-package-data = true``', 'For more information on how to include data files, check ``setuptools`` `docs', '<https://setuptools.pypa.io/en/latest/userguide/datafiles.html>`_.'], 'type': 'object', 'additionalProperties': False, 'propertyNames': {'anyOf': [{'type': 'string', 'format': 'python-module-name'}, {'const': '*'}]}, 'patternProperties': {'^.*$': {'type': 'array', 'items': {'type': 'string'}}}}, rule='type')+                raise JsonSchemaValueException("" + (name_prefix or "data") + ".package-data must be object", value=data__packagedata, name="" + (name_prefix or "data") + ".package-data", definition={'$$description': ['Mapping from package names to lists of glob patterns.', 'Usually this option is not needed when using ``include-package-data = true``', 'For more information on how to include data files, check ``setuptools`` `docs', '<https://setuptools.pypa.io/en/latest/userguide/datafiles.html>`_.'], 'type': 'object', 'additionalProperties': False, 'propertyNames': {'anyOf': [{'$id': '#/definitions/package-name', 'title': 'Valid package name', 'description': 'Valid package name (importable or :pep:`561`).', 'type': 'string', 'anyOf': [{'type': 'string', 'format': 'python-module-name-relaxed'}, {'type': 'string', 'format': 'pep561-stub-name'}]}, {'const': '*'}]}, 'patternProperties': {'^.*$': {'type': 'array', 'items': {'type': 'string'}}}}, rule='type')             data__packagedata_is_dict = isinstance(data__packagedata, dict)@@ -310,3 +310,3 @@                 if data__packagedata_keys:-                    raise JsonSchemaValueException("" + (name_prefix or "data") + ".package-data must not contain "+str(data__packagedata_keys)+" properties", value=data__packagedata, name="" + (name_prefix or "data") + ".package-data", definition={'$$description': ['Mapping from package names to lists of glob patterns.', 'Usually this option is not needed when using ``include-package-data = true``', 'For more information on how to include data files, check ``setuptools`` `docs', '<https://setuptools.pypa.io/en/latest/userguide/datafiles.html>`_.'], 'type': 'object', 'additionalProperties': False, 'propertyNames': {'anyOf': [{'type': 'string', 'format': 'python-module-name'}, {'const': '*'}]}, 'patternProperties': {'^.*$': {'type': 'array', 'items': {'type': 'string'}}}}, rule='additionalProperties')+                    raise JsonSchemaValueException("" + (name_prefix or "data") + ".package-data must not contain "+str(data__packagedata_keys)+" properties", value=data__packagedata, name="" + (name_prefix or "data") + ".package-data", definition={'$$description': ['Mapping from package names to lists of glob patterns.', 'Usually this option is not needed when using ``include-package-data = true``', 'For more information on how to include data files, check ``setuptools`` `docs', '<https://setuptools.pypa.io/en/latest/userguide/datafiles.html>`_.'], 'type': 'object', 'additionalProperties': False, 'propertyNames': {'anyOf': [{'$id': '#/definitions/package-name', 'title': 'Valid package name', 'description': 'Valid package name (importable or :pep:`561`).', 'type': 'string', 'anyOf': [{'type': 'string', 'format': 'python-module-name-relaxed'}, {'type': 'string', 'format': 'pep561-stub-name'}]}, {'const': '*'}]}, 'patternProperties': {'^.*$': {'type': 'array', 'items': {'type': 'string'}}}}, rule='additionalProperties')                 data__packagedata_len = len(data__packagedata)@@ -319,7 +319,3 @@                                 try:-                                    if not isinstance(data__packagedata_key, (str)):-                                        raise JsonSchemaValueException("" + (name_prefix or "data") + ".package-data must be string", value=data__packagedata_key, name="" + (name_prefix or "data") + ".package-data", definition={'type': 'string', 'format': 'python-module-name'}, rule='type')-                                    if isinstance(data__packagedata_key, str):-                                        if not custom_formats["python-module-name"](data__packagedata_key):-                                            raise JsonSchemaValueException("" + (name_prefix or "data") + ".package-data must be python-module-name", value=data__packagedata_key, name="" + (name_prefix or "data") + ".package-data", definition={'type': 'string', 'format': 'python-module-name'}, rule='format')+                                    validate_https___setuptools_pypa_io_en_latest_userguide_pyproject_config_html__definitions_package_name(data__packagedata_key, custom_formats, (name_prefix or "data") + ".package-data")                                     data__packagedata_key_any_of_count4 += 1@@ -333,3 +329,3 @@                             if not data__packagedata_key_any_of_count4:-                                raise JsonSchemaValueException("" + (name_prefix or "data") + ".package-data cannot be validated by any definition", value=data__packagedata_key, name="" + (name_prefix or "data") + ".package-data", definition={'anyOf': [{'type': 'string', 'format': 'python-module-name'}, {'const': '*'}]}, rule='anyOf')+                                raise JsonSchemaValueException("" + (name_prefix or "data") + ".package-data cannot be validated by any definition", value=data__packagedata_key, name="" + (name_prefix or "data") + ".package-data", definition={'anyOf': [{'$id': '#/definitions/package-name', 'title': 'Valid package name', 'description': 'Valid package name (importable or :pep:`561`).', 'type': 'string', 'anyOf': [{'type': 'string', 'format': 'python-module-name-relaxed'}, {'type': 'string', 'format': 'pep561-stub-name'}]}, {'const': '*'}]}, rule='anyOf')                         except JsonSchemaValueException:@@ -337,3 +333,3 @@                     if not data__packagedata_property_names:-                        raise JsonSchemaValueException("" + (name_prefix or "data") + ".package-data must be named by propertyName definition", value=data__packagedata, name="" + (name_prefix or "data") + ".package-data", definition={'$$description': ['Mapping from package names to lists of glob patterns.', 'Usually this option is not needed when using ``include-package-data = true``', 'For more information on how to include data files, check ``setuptools`` `docs', '<https://setuptools.pypa.io/en/latest/userguide/datafiles.html>`_.'], 'type': 'object', 'additionalProperties': False, 'propertyNames': {'anyOf': [{'type': 'string', 'format': 'python-module-name'}, {'const': '*'}]}, 'patternProperties': {'^.*$': {'type': 'array', 'items': {'type': 'string'}}}}, rule='propertyNames')+                        raise JsonSchemaValueException("" + (name_prefix or "data") + ".package-data must be named by propertyName definition", value=data__packagedata, name="" + (name_prefix or "data") + ".package-data", definition={'$$description': ['Mapping from package names to lists of glob patterns.', 'Usually this option is not needed when using ``include-package-data = true``', 'For more information on how to include data files, check ``setuptools`` `docs', '<https://setuptools.pypa.io/en/latest/userguide/datafiles.html>`_.'], 'type': 'object', 'additionalProperties': False, 'propertyNames': {'anyOf': [{'$id': '#/definitions/package-name', 'title': 'Valid package name', 'description': 'Valid package name (importable or :pep:`561`).', 'type': 'string', 'anyOf': [{'type': 'string', 'format': 'python-module-name-relaxed'}, {'type': 'string', 'format': 'pep561-stub-name'}]}, {'const': '*'}]}, 'patternProperties': {'^.*$': {'type': 'array', 'items': {'type': 'string'}}}}, rule='propertyNames')         if "include-package-data" in data_keys:@@ -347,3 +343,3 @@             if not isinstance(data__excludepackagedata, (dict)):-                raise JsonSchemaValueException("" + (name_prefix or "data") + ".exclude-package-data must be object", value=data__excludepackagedata, name="" + (name_prefix or "data") + ".exclude-package-data", definition={'$$description': ['Mapping from package names to lists of glob patterns that should be excluded', 'For more information on how to include data files, check ``setuptools`` `docs', '<https://setuptools.pypa.io/en/latest/userguide/datafiles.html>`_.'], 'type': 'object', 'additionalProperties': False, 'propertyNames': {'anyOf': [{'type': 'string', 'format': 'python-module-name'}, {'const': '*'}]}, 'patternProperties': {'^.*$': {'type': 'array', 'items': {'type': 'string'}}}}, rule='type')+                raise JsonSchemaValueException("" + (name_prefix or "data") + ".exclude-package-data must be object", value=data__excludepackagedata, name="" + (name_prefix or "data") + ".exclude-package-data", definition={'$$description': ['Mapping from package names to lists of glob patterns that should be excluded', 'For more information on how to include data files, check ``setuptools`` `docs', '<https://setuptools.pypa.io/en/latest/userguide/datafiles.html>`_.'], 'type': 'object', 'additionalProperties': False, 'propertyNames': {'anyOf': [{'$id': '#/definitions/package-name', 'title': 'Valid package name', 'description': 'Valid package name (importable or :pep:`561`).', 'type': 'string', 'anyOf': [{'type': 'string', 'format': 'python-module-name-relaxed'}, {'type': 'string', 'format': 'pep561-stub-name'}]}, {'const': '*'}]}, 'patternProperties': {'^.*$': {'type': 'array', 'items': {'type': 'string'}}}}, rule='type')             data__excludepackagedata_is_dict = isinstance(data__excludepackagedata, dict)@@ -364,3 +360,3 @@                 if data__excludepackagedata_keys:-                    raise JsonSchemaValueException("" + (name_prefix or "data") + ".exclude-package-data must not contain "+str(data__excludepackagedata_keys)+" properties", value=data__excludepackagedata, name="" + (name_prefix or "data") + ".exclude-package-data", definition={'$$description': ['Mapping from package names to lists of glob patterns that should be excluded', 'For more information on how to include data files, check ``setuptools`` `docs', '<https://setuptools.pypa.io/en/latest/userguide/datafiles.html>`_.'], 'type': 'object', 'additionalProperties': False, 'propertyNames': {'anyOf': [{'type': 'string', 'format': 'python-module-name'}, {'const': '*'}]}, 'patternProperties': {'^.*$': {'type': 'array', 'items': {'type': 'string'}}}}, rule='additionalProperties')+                    raise JsonSchemaValueException("" + (name_prefix or "data") + ".exclude-package-data must not contain "+str(data__excludepackagedata_keys)+" properties", value=data__excludepackagedata, name="" + (name_prefix or "data") + ".exclude-package-data", definition={'$$description': ['Mapping from package names to lists of glob patterns that should be excluded', 'For more information on how to include data files, check ``setuptools`` `docs', '<https://setuptools.pypa.io/en/latest/userguide/datafiles.html>`_.'], 'type': 'object', 'additionalProperties': False, 'propertyNames': {'anyOf': [{'$id': '#/definitions/package-name', 'title': 'Valid package name', 'description': 'Valid package name (importable or :pep:`561`).', 'type': 'string', 'anyOf': [{'type': 'string', 'format': 'python-module-name-relaxed'}, {'type': 'string', 'format': 'pep561-stub-name'}]}, {'const': '*'}]}, 'patternProperties': {'^.*$': {'type': 'array', 'items': {'type': 'string'}}}}, rule='additionalProperties')                 data__excludepackagedata_len = len(data__excludepackagedata)@@ -373,7 +369,3 @@                                 try:-                                    if not isinstance(data__excludepackagedata_key, (str)):-                                        raise JsonSchemaValueException("" + (name_prefix or "data") + ".exclude-package-data must be string", value=data__excludepackagedata_key, name="" + (name_prefix or "data") + ".exclude-package-data", definition={'type': 'string', 'format': 'python-module-name'}, rule='type')-                                    if isinstance(data__excludepackagedata_key, str):-                                        if not custom_formats["python-module-name"](data__excludepackagedata_key):-                                            raise JsonSchemaValueException("" + (name_prefix or "data") + ".exclude-package-data must be python-module-name", value=data__excludepackagedata_key, name="" + (name_prefix or "data") + ".exclude-package-data", definition={'type': 'string', 'format': 'python-module-name'}, rule='format')+                                    validate_https___setuptools_pypa_io_en_latest_userguide_pyproject_config_html__definitions_package_name(data__excludepackagedata_key, custom_formats, (name_prefix or "data") + ".exclude-package-data")                                     data__excludepackagedata_key_any_of_count5 += 1@@ -387,3 +379,3 @@                             if not data__excludepackagedata_key_any_of_count5:-                                raise JsonSchemaValueException("" + (name_prefix or "data") + ".exclude-package-data cannot be validated by any definition", value=data__excludepackagedata_key, name="" + (name_prefix or "data") + ".exclude-package-data", definition={'anyOf': [{'type': 'string', 'format': 'python-module-name'}, {'const': '*'}]}, rule='anyOf')+                                raise JsonSchemaValueException("" + (name_prefix or "data") + ".exclude-package-data cannot be validated by any definition", value=data__excludepackagedata_key, name="" + (name_prefix or "data") + ".exclude-package-data", definition={'anyOf': [{'$id': '#/definitions/package-name', 'title': 'Valid package name', 'description': 'Valid package name (importable or :pep:`561`).', 'type': 'string', 'anyOf': [{'type': 'string', 'format': 'python-module-name-relaxed'}, {'type': 'string', 'format': 'pep561-stub-name'}]}, {'const': '*'}]}, rule='anyOf')                         except JsonSchemaValueException:@@ -391,3 +383,3 @@                     if not data__excludepackagedata_property_names:-                        raise JsonSchemaValueException("" + (name_prefix or "data") + ".exclude-package-data must be named by propertyName definition", value=data__excludepackagedata, name="" + (name_prefix or "data") + ".exclude-package-data", definition={'$$description': ['Mapping from package names to lists of glob patterns that should be excluded', 'For more information on how to include data files, check ``setuptools`` `docs', '<https://setuptools.pypa.io/en/latest/userguide/datafiles.html>`_.'], 'type': 'object', 'additionalProperties': False, 'propertyNames': {'anyOf': [{'type': 'string', 'format': 'python-module-name'}, {'const': '*'}]}, 'patternProperties': {'^.*$': {'type': 'array', 'items': {'type': 'string'}}}}, rule='propertyNames')+                        raise JsonSchemaValueException("" + (name_prefix or "data") + ".exclude-package-data must be named by propertyName definition", value=data__excludepackagedata, name="" + (name_prefix or "data") + ".exclude-package-data", definition={'$$description': ['Mapping from package names to lists of glob patterns that should be excluded', 'For more information on how to include data files, check ``setuptools`` `docs', '<https://setuptools.pypa.io/en/latest/userguide/datafiles.html>`_.'], 'type': 'object', 'additionalProperties': False, 'propertyNames': {'anyOf': [{'$id': '#/definitions/package-name', 'title': 'Valid package name', 'description': 'Valid package name (importable or :pep:`561`).', 'type': 'string', 'anyOf': [{'type': 'string', 'format': 'python-module-name-relaxed'}, {'type': 'string', 'format': 'pep561-stub-name'}]}, {'const': '*'}]}, 'patternProperties': {'^.*$': {'type': 'array', 'items': {'type': 'string'}}}}, rule='propertyNames')         if "namespace-packages" in data_keys:@@ -588,3 +580,3 @@         if data_keys:-            raise JsonSchemaValueException("" + (name_prefix or "data") + " must not contain "+str(data_keys)+" properties", value=data, name="" + (name_prefix or "data") + "", definition={'$schema': 'http://json-schema.org/draft-07/schema#', '$id': 'https://setuptools.pypa.io/en/latest/userguide/pyproject_config.html', 'title': '``tool.setuptools`` table', '$$description': ['``setuptools``-specific configurations that can be set by users that require', 'customization.', 'These configurations are completely optional and probably can be skipped when', 'creating simple packages. They are equivalent to some of the `Keywords', '<https://setuptools.pypa.io/en/latest/references/keywords.html>`_', 'used by the ``setup.py`` file, and can be set via the ``tool.setuptools`` table.', 'It considers only ``setuptools`` `parameters', '<https://setuptools.pypa.io/en/latest/userguide/pyproject_config.html#setuptools-specific-configuration>`_', 'that are not covered by :pep:`621`; and intentionally excludes ``dependency_links``', 'and ``setup_requires`` (incompatible with modern workflows/standards).'], 'type': 'object', 'additionalProperties': False, 'properties': {'platforms': {'type': 'array', 'items': {'type': 'string'}}, 'provides': {'$$description': ['Package and virtual package names contained within this package', '**(not supported by pip)**'], 'type': 'array', 'items': {'type': 'string', 'format': 'pep508-identifier'}}, 'obsoletes': {'$$description': ['Packages which this package renders obsolete', '**(not supported by pip)**'], 'type': 'array', 'items': {'type': 'string', 'format': 'pep508-identifier'}}, 'zip-safe': {'$$description': ['Whether the project can be safely installed and run from a zip file.', '**OBSOLETE**: only relevant for ``pkg_resources``, ``easy_install`` and', '``setup.py install`` in the context of ``eggs`` (**DEPRECATED**).'], 'type': 'boolean'}, 'script-files': {'$$description': ['Legacy way of defining scripts (entry-points are preferred).', 'Equivalent to the ``script`` keyword in ``setup.py``', '(it was renamed to avoid confusion with entry-point based ``project.scripts``', 'defined in :pep:`621`).', '**DISCOURAGED**: generic script wrappers are tricky and may not work properly.', 'Whenever possible, please use ``project.scripts`` instead.'], 'type': 'array', 'items': {'type': 'string'}, '$comment': 'TODO: is this field deprecated/should be removed?'}, 'eager-resources': {'$$description': ['Resources that should be extracted together, if any of them is needed,', 'or if any C extensions included in the project are imported.', '**OBSOLETE**: only relevant for ``pkg_resources``, ``easy_install`` and', '``setup.py install`` in the context of ``eggs`` (**DEPRECATED**).'], 'type': 'array', 'items': {'type': 'string'}}, 'packages': {'$$description': ['Packages that should be included in the distribution.', 'It can be given either as a list of package identifiers', 'or as a ``dict``-like structure with a single key ``find``', 'which corresponds to a dynamic call to', '``setuptools.config.expand.find_packages`` function.', 'The ``find`` key is associated with a nested ``dict``-like structure that can', 'contain ``where``, ``include``, ``exclude`` and ``namespaces`` keys,', 'mimicking the keyword arguments of the associated function.'], 'oneOf': [{'title': 'Array of Python package identifiers', 'type': 'array', 'items': {'$id': '#/definitions/package-name', 'title': 'Valid package name', 'description': 'Valid package name (importable or :pep:`561`).', 'type': 'string', 'anyOf': [{'type': 'string', 'format': 'python-module-name-relaxed'}, {'type': 'string', 'format': 'pep561-stub-name'}]}}, {'$id': '#/definitions/find-directive', 'title': "'find:' directive", 'type': 'object', 'additionalProperties': False, 'properties': {'find': {'type': 'object', '$$description': ['Dynamic `package discovery', '<https://setuptools.pypa.io/en/latest/userguide/package_discovery.html>`_.'], 'additionalProperties': False, 'properties': {'where': {'description': 'Directories to be searched for packages (Unix-style relative path)', 'type': 'array', 'items': {'type': 'string'}}, 'exclude': {'type': 'array', '$$description': ['Exclude packages that match the values listed in this field.', "Can container shell-style wildcards (e.g. ``'pkg.*'``)"], 'items': {'type': 'string'}}, 'include': {'type': 'array', '$$description': ['Restrict the found packages to just the ones listed in this field.', "Can container shell-style wildcards (e.g. ``'pkg.*'``)"], 'items': {'type': 'string'}}, 'namespaces': {'type': 'boolean', '$$description': ['When ``True``, directories without a ``__init__.py`` file will also', 'be scanned for :pep:`420`-style implicit namespaces']}}}}}]}, 'package-dir': {'$$description': [':class:`dict`-like structure mapping from package names to directories where their', 'code can be found.', 'The empty string (as key) means that all packages are contained inside', 'the given directory will be included in the distribution.'], 'type': 'object', 'additionalProperties': False, 'propertyNames': {'anyOf': [{'const': ''}, {'$id': '#/definitions/package-name', 'title': 'Valid package name', 'description': 'Valid package name (importable or :pep:`561`).', 'type': 'string', 'anyOf': [{'type': 'string', 'format': 'python-module-name-relaxed'}, {'type': 'string', 'format': 'pep561-stub-name'}]}]}, 'patternProperties': {'^.*$': {'type': 'string'}}}, 'package-data': {'$$description': ['Mapping from package names to lists of glob patterns.', 'Usually this option is not needed when using ``include-package-data = true``', 'For more information on how to include data files, check ``setuptools`` `docs', '<https://setuptools.pypa.io/en/latest/userguide/datafiles.html>`_.'], 'type': 'object', 'additionalProperties': False, 'propertyNames': {'anyOf': [{'type': 'string', 'format': 'python-module-name'}, {'const': '*'}]}, 'patternProperties': {'^.*$': {'type': 'array', 'items': {'type': 'string'}}}}, 'include-package-data': {'$$description': ['Automatically include any data files inside the package directories', 'that are specified by ``MANIFEST.in``', 'For more information on how to include data files, check ``setuptools`` `docs', '<https://setuptools.pypa.io/en/latest/userguide/datafiles.html>`_.'], 'type': 'boolean'}, 'exclude-package-data': {'$$description': ['Mapping from package names to lists of glob patterns that should be excluded', 'For more information on how to include data files, check ``setuptools`` `docs', '<https://setuptools.pypa.io/en/latest/userguide/datafiles.html>`_.'], 'type': 'object', 'additionalProperties': False, 'propertyNames': {'anyOf': [{'type': 'string', 'format': 'python-module-name'}, {'const': '*'}]}, 'patternProperties': {'^.*$': {'type': 'array', 'items': {'type': 'string'}}}}, 'namespace-packages': {'type': 'array', 'items': {'type': 'string', 'format': 'python-module-name-relaxed'}, '$comment': 'https://setuptools.pypa.io/en/latest/userguide/package_discovery.html', 'description': '**DEPRECATED**: use implicit namespaces instead (:pep:`420`).'}, 'py-modules': {'description': 'Modules that setuptools will manipulate', 'type': 'array', 'items': {'type': 'string', 'format': 'python-module-name-relaxed'}, '$comment': 'TODO: clarify the relationship with ``packages``'}, 'ext-modules': {'description': 'Extension modules to be compiled by setuptools', 'type': 'array', 'items': {'$id': '#/definitions/ext-module', 'title': 'Extension module', 'description': 'Parameters to construct a :class:`setuptools.Extension` object', 'type': 'object', 'required': ['name', 'sources'], 'additionalProperties': False, 'properties': {'name': {'type': 'string', 'format': 'python-module-name-relaxed'}, 'sources': {'type': 'array', 'items': {'type': 'string'}}, 'include-dirs': {'type': 'array', 'items': {'type': 'string'}}, 'define-macros': {'type': 'array', 'items': {'type': 'array', 'items': [{'description': 'macro name', 'type': 'string'}, {'description': 'macro value', 'oneOf': [{'type': 'string'}, {'type': 'null'}]}], 'additionalItems': False}}, 'undef-macros': {'type': 'array', 'items': {'type': 'string'}}, 'library-dirs': {'type': 'array', 'items': {'type': 'string'}}, 'libraries': {'type': 'array', 'items': {'type': 'string'}}, 'runtime-library-dirs': {'type': 'array', 'items': {'type': 'string'}}, 'extra-objects': {'type': 'array', 'items': {'type': 'string'}}, 'extra-compile-args': {'type': 'array', 'items': {'type': 'string'}}, 'extra-link-args': {'type': 'array', 'items': {'type': 'string'}}, 'export-symbols': {'type': 'array', 'items': {'type': 'string'}}, 'swig-opts': {'type': 'array', 'items': {'type': 'string'}}, 'depends': {'type': 'array', 'items': {'type': 'string'}}, 'language': {'type': 'string'}, 'optional': {'type': 'boolean'}, 'py-limited-api': {'type': 'boolean'}}}}, 'data-files': {'$$description': ['``dict``-like structure where each key represents a directory and', 'the value is a list of glob patterns that should be installed in them.', '**DISCOURAGED**: please notice this might not work as expected with wheels.', 'Whenever possible, consider using data files inside the package directories', '(or create a new namespace package that only contains data files).', 'See `data files support', '<https://setuptools.pypa.io/en/latest/userguide/datafiles.html>`_.'], 'type': 'object', 'patternProperties': {'^.*$': {'type': 'array', 'items': {'type': 'string'}}}}, 'cmdclass': {'$$description': ['Mapping of distutils-style command names to ``setuptools.Command`` subclasses', 'which in turn should be represented by strings with a qualified class name', '(i.e., "dotted" form with module), e.g.::\n\n', '    cmdclass = {mycmd = "pkg.subpkg.module.CommandClass"}\n\n', 'The command class should be a directly defined at the top-level of the', 'containing module (no class nesting).'], 'type': 'object', 'patternProperties': {'^.*$': {'type': 'string', 'format': 'python-qualified-identifier'}}}, 'license-files': {'type': 'array', 'items': {'type': 'string'}, '$$description': ['**PROVISIONAL**: list of glob patterns for all license files being distributed.', '(likely to become standard with :pep:`639`).', "By default: ``['LICEN[CS]E*', 'COPYING*', 'NOTICE*', 'AUTHORS*']``"], '$comment': 'TODO: revise if PEP 639 is accepted. Probably ``project.license-files``?'}, 'dynamic': {'type': 'object', 'description': 'Instructions for loading :pep:`621`-related metadata dynamically', 'additionalProperties': False, 'properties': {'version': {'$$description': ['A version dynamically loaded via either the ``attr:`` or ``file:``', 'directives. Please make sure the given file or attribute respects :pep:`440`.', 'Also ensure to set ``project.dynamic`` accordingly.'], 'oneOf': [{'title': "'attr:' directive", '$id': '#/definitions/attr-directive', '$$description': ['Value is read from a module attribute. Supports callables and iterables;', 'unsupported types are cast via ``str()``'], 'type': 'object', 'additionalProperties': False, 'properties': {'attr': {'type': 'string', 'format': 'python-qualified-identifier'}}, 'required': ['attr']}, {'$id': '#/definitions/file-directive', 'title': "'file:' directive", 'description': 'Value is read from a file (or list of files and then concatenated)', 'type': 'object', 'additionalProperties': False, 'properties': {'file': {'oneOf': [{'type': 'string'}, {'type': 'array', 'items': {'type': 'string'}}]}}, 'required': ['file']}]}, 'classifiers': {'$id': '#/definitions/file-directive', 'title': "'file:' directive", 'description': 'Value is read from a file (or list of files and then concatenated)', 'type': 'object', 'additionalProperties': False, 'properties': {'file': {'oneOf': [{'type': 'string'}, {'type': 'array', 'items': {'type': 'string'}}]}}, 'required': ['file']}, 'description': {'$id': '#/definitions/file-directive', 'title': "'file:' directive", 'description': 'Value is read from a file (or list of files and then concatenated)', 'type': 'object', 'additionalProperties': False, 'properties': {'file': {'oneOf': [{'type': 'string'}, {'type': 'array', 'items': {'type': 'string'}}]}}, 'required': ['file']}, 'entry-points': {'$id': '#/definitions/file-directive', 'title': "'file:' directive", 'description': 'Value is read from a file (or list of files and then concatenated)', 'type': 'object', 'additionalProperties': False, 'properties': {'file': {'oneOf': [{'type': 'string'}, {'type': 'array', 'items': {'type': 'string'}}]}}, 'required': ['file']}, 'dependencies': {'title': "'file:' directive for dependencies", 'allOf': [{'$$description': ['**BETA**: subset of the ``requirements.txt`` format', 'without ``pip`` flags and options', '(one :pep:`508`-compliant string per line,', 'lines that are blank or start with ``#`` are excluded).', 'See `dynamic metadata', '<https://setuptools.pypa.io/en/latest/userguide/pyproject_config.html#dynamic-metadata>`_.']}, {'$ref': '#/definitions/file-directive'}]}, 'optional-dependencies': {'type': 'object', 'propertyNames': {'type': 'string', 'format': 'pep508-identifier'}, 'additionalProperties': False, 'patternProperties': {'.+': {'title': "'file:' directive for dependencies", 'allOf': [{'$$description': ['**BETA**: subset of the ``requirements.txt`` format', 'without ``pip`` flags and options', '(one :pep:`508`-compliant string per line,', 'lines that are blank or start with ``#`` are excluded).', 'See `dynamic metadata', '<https://setuptools.pypa.io/en/latest/userguide/pyproject_config.html#dynamic-metadata>`_.']}, {'$ref': '#/definitions/file-directive'}]}}}, 'readme': {'type': 'object', 'anyOf': [{'$id': '#/definitions/file-directive', 'title': "'file:' directive", 'description': 'Value is read from a file (or list of files and then concatenated)', 'type': 'object', 'additionalProperties': False, 'properties': {'file': {'oneOf': [{'type': 'string'}, {'type': 'array', 'items': {'type': 'string'}}]}}, 'required': ['file']}, {'type': 'object', 'properties': {'content-type': {'type': 'string'}, 'file': {'oneOf': [{'type': 'string'}, {'type': 'array', 'items': {'type': 'string'}}]}}, 'additionalProperties': False}], 'required': ['file']}}}}, 'definitions': {'package-name': {'$id': '#/definitions/package-name', 'title': 'Valid package name', 'description': 'Valid package name (importable or :pep:`561`).', 'type': 'string', 'anyOf': [{'type': 'string', 'format': 'python-module-name-relaxed'}, {'type': 'string', 'format': 'pep561-stub-name'}]}, 'ext-module': {'$id': '#/definitions/ext-module', 'title': 'Extension module', 'description': 'Parameters to construct a :class:`setuptools.Extension` object', 'type': 'object', 'required': ['name', 'sources'], 'additionalProperties': False, 'properties': {'name': {'type': 'string', 'format': 'python-module-name-relaxed'}, 'sources': {'type': 'array', 'items': {'type': 'string'}}, 'include-dirs': {'type': 'array', 'items': {'type': 'string'}}, 'define-macros': {'type': 'array', 'items': {'type': 'array', 'items': [{'description': 'macro name', 'type': 'string'}, {'description': 'macro value', 'oneOf': [{'type': 'string'}, {'type': 'null'}]}], 'additionalItems': False}}, 'undef-macros': {'type': 'array', 'items': {'type': 'string'}}, 'library-dirs': {'type': 'array', 'items': {'type': 'string'}}, 'libraries': {'type': 'array', 'items': {'type': 'string'}}, 'runtime-library-dirs': {'type': 'array', 'items': {'type': 'string'}}, 'extra-objects': {'type': 'array', 'items': {'type': 'string'}}, 'extra-compile-args': {'type': 'array', 'items': {'type': 'string'}}, 'extra-link-args': {'type': 'array', 'items': {'type': 'string'}}, 'export-symbols': {'type': 'array', 'items': {'type': 'string'}}, 'swig-opts': {'type': 'array', 'items': {'type': 'string'}}, 'depends': {'type': 'array', 'items': {'type': 'string'}}, 'language': {'type': 'string'}, 'optional': {'type': 'boolean'}, 'py-limited-api': {'type': 'boolean'}}}, 'file-directive': {'$id': '#/definitions/file-directive', 'title': "'file:' directive", 'description': 'Value is read from a file (or list of files and then concatenated)', 'type': 'object', 'additionalProperties': False, 'properties': {'file': {'oneOf': [{'type': 'string'}, {'type': 'array', 'items': {'type': 'string'}}]}}, 'required': ['file']}, 'file-directive-for-dependencies': {'title': "'file:' directive for dependencies", 'allOf': [{'$$description': ['**BETA**: subset of the ``requirements.txt`` format', 'without ``pip`` flags and options', '(one :pep:`508`-compliant string per line,', 'lines that are blank or start with ``#`` are excluded).', 'See `dynamic metadata', '<https://setuptools.pypa.io/en/latest/userguide/pyproject_config.html#dynamic-metadata>`_.']}, {'$id': '#/definitions/file-directive', 'title': "'file:' directive", 'description': 'Value is read from a file (or list of files and then concatenated)', 'type': 'object', 'additionalProperties': False, 'properties': {'file': {'oneOf': [{'type': 'string'}, {'type': 'array', 'items': {'type': 'string'}}]}}, 'required': ['file']}]}, 'attr-directive': {'title': "'attr:' directive", '$id': '#/definitions/attr-directive', '$$description': ['Value is read from a module attribute. Supports callables and iterables;', 'unsupported types are cast via ``str()``'], 'type': 'object', 'additionalProperties': False, 'properties': {'attr': {'type': 'string', 'format': 'python-qualified-identifier'}}, 'required': ['attr']}, 'find-directive': {'$id': '#/definitions/find-directive', 'title': "'find:' directive", 'type': 'object', 'additionalProperties': False, 'properties': {'find': {'type': 'object', '$$description': ['Dynamic `package discovery', '<https://setuptools.pypa.io/en/latest/userguide/package_discovery.html>`_.'], 'additionalProperties': False, 'properties': {'where': {'description': 'Directories to be searched for packages (Unix-style relative path)', 'type': 'array', 'items': {'type': 'string'}}, 'exclude': {'type': 'array', '$$description': ['Exclude packages that match the values listed in this field.', "Can container shell-style wildcards (e.g. ``'pkg.*'``)"], 'items': {'type': 'string'}}, 'include': {'type': 'array', '$$description': ['Restrict the found packages to just the ones listed in this field.', "Can container shell-style wildcards (e.g. ``'pkg.*'``)"], 'items': {'type': 'string'}}, 'namespaces': {'type': 'boolean', '$$description': ['When ``True``, directories without a ``__init__.py`` file will also', 'be scanned for :pep:`420`-style implicit namespaces']}}}}}}}, rule='additionalProperties')+            raise JsonSchemaValueException("" + (name_prefix or "data") + " must not contain "+str(data_keys)+" properties", value=data, name="" + (name_prefix or "data") + "", definition={'$schema': 'http://json-schema.org/draft-07/schema#', '$id': 'https://setuptools.pypa.io/en/latest/userguide/pyproject_config.html', 'title': '``tool.setuptools`` table', '$$description': ['``setuptools``-specific configurations that can be set by users that require', 'customization.', 'These configurations are completely optional and probably can be skipped when', 'creating simple packages. They are equivalent to some of the `Keywords', '<https://setuptools.pypa.io/en/latest/references/keywords.html>`_', 'used by the ``setup.py`` file, and can be set via the ``tool.setuptools`` table.', 'It considers only ``setuptools`` `parameters', '<https://setuptools.pypa.io/en/latest/userguide/pyproject_config.html#setuptools-specific-configuration>`_', 'that are not covered by :pep:`621`; and intentionally excludes ``dependency_links``', 'and ``setup_requires`` (incompatible with modern workflows/standards).'], 'type': 'object', 'additionalProperties': False, 'properties': {'platforms': {'type': 'array', 'items': {'type': 'string'}}, 'provides': {'$$description': ['Package and virtual package names contained within this package', '**(not supported by pip)**'], 'type': 'array', 'items': {'type': 'string', 'format': 'pep508-identifier'}}, 'obsoletes': {'$$description': ['Packages which this package renders obsolete', '**(not supported by pip)**'], 'type': 'array', 'items': {'type': 'string', 'format': 'pep508-identifier'}}, 'zip-safe': {'$$description': ['Whether the project can be safely installed and run from a zip file.', '**OBSOLETE**: only relevant for ``pkg_resources``, ``easy_install`` and', '``setup.py install`` in the context of ``eggs`` (**DEPRECATED**).'], 'type': 'boolean'}, 'script-files': {'$$description': ['Legacy way of defining scripts (entry-points are preferred).', 'Equivalent to the ``script`` keyword in ``setup.py``', '(it was renamed to avoid confusion with entry-point based ``project.scripts``', 'defined in :pep:`621`).', '**DISCOURAGED**: generic script wrappers are tricky and may not work properly.', 'Whenever possible, please use ``project.scripts`` instead.'], 'type': 'array', 'items': {'type': 'string'}, '$comment': 'TODO: is this field deprecated/should be removed?'}, 'eager-resources': {'$$description': ['Resources that should be extracted together, if any of them is needed,', 'or if any C extensions included in the project are imported.', '**OBSOLETE**: only relevant for ``pkg_resources``, ``easy_install`` and', '``setup.py install`` in the context of ``eggs`` (**DEPRECATED**).'], 'type': 'array', 'items': {'type': 'string'}}, 'packages': {'$$description': ['Packages that should be included in the distribution.', 'It can be given either as a list of package identifiers', 'or as a ``dict``-like structure with a single key ``find``', 'which corresponds to a dynamic call to', '``setuptools.config.expand.find_packages`` function.', 'The ``find`` key is associated with a nested ``dict``-like structure that can', 'contain ``where``, ``include``, ``exclude`` and ``namespaces`` keys,', 'mimicking the keyword arguments of the associated function.'], 'oneOf': [{'title': 'Array of Python package identifiers', 'type': 'array', 'items': {'$id': '#/definitions/package-name', 'title': 'Valid package name', 'description': 'Valid package name (importable or :pep:`561`).', 'type': 'string', 'anyOf': [{'type': 'string', 'format': 'python-module-name-relaxed'}, {'type': 'string', 'format': 'pep561-stub-name'}]}}, {'$id': '#/definitions/find-directive', 'title': "'find:' directive", 'type': 'object', 'additionalProperties': False, 'properties': {'find': {'type': 'object', '$$description': ['Dynamic `package discovery', '<https://setuptools.pypa.io/en/latest/userguide/package_discovery.html>`_.'], 'additionalProperties': False, 'properties': {'where': {'description': 'Directories to be searched for packages (Unix-style relative path)', 'type': 'array', 'items': {'type': 'string'}}, 'exclude': {'type': 'array', '$$description': ['Exclude packages that match the values listed in this field.', "Can container shell-style wildcards (e.g. ``'pkg.*'``)"], 'items': {'type': 'string'}}, 'include': {'type': 'array', '$$description': ['Restrict the found packages to just the ones listed in this field.', "Can container shell-style wildcards (e.g. ``'pkg.*'``)"], 'items': {'type': 'string'}}, 'namespaces': {'type': 'boolean', '$$description': ['When ``True``, directories without a ``__init__.py`` file will also', 'be scanned for :pep:`420`-style implicit namespaces']}}}}}]}, 'package-dir': {'$$description': [':class:`dict`-like structure mapping from package names to directories where their', 'code can be found.', 'The empty string (as key) means that all packages are contained inside', 'the given directory will be included in the distribution.'], 'type': 'object', 'additionalProperties': False, 'propertyNames': {'anyOf': [{'const': ''}, {'$id': '#/definitions/package-name', 'title': 'Valid package name', 'description': 'Valid package name (importable or :pep:`561`).', 'type': 'string', 'anyOf': [{'type': 'string', 'format': 'python-module-name-relaxed'}, {'type': 'string', 'format': 'pep561-stub-name'}]}]}, 'patternProperties': {'^.*$': {'type': 'string'}}}, 'package-data': {'$$description': ['Mapping from package names to lists of glob patterns.', 'Usually this option is not needed when using ``include-package-data = true``', 'For more information on how to include data files, check ``setuptools`` `docs', '<https://setuptools.pypa.io/en/latest/userguide/datafiles.html>`_.'], 'type': 'object', 'additionalProperties': False, 'propertyNames': {'anyOf': [{'$id': '#/definitions/package-name', 'title': 'Valid package name', 'description': 'Valid package name (importable or :pep:`561`).', 'type': 'string', 'anyOf': [{'type': 'string', 'format': 'python-module-name-relaxed'}, {'type': 'string', 'format': 'pep561-stub-name'}]}, {'const': '*'}]}, 'patternProperties': {'^.*$': {'type': 'array', 'items': {'type': 'string'}}}}, 'include-package-data': {'$$description': ['Automatically include any data files inside the package directories', 'that are specified by ``MANIFEST.in``', 'For more information on how to include data files, check ``setuptools`` `docs', '<https://setuptools.pypa.io/en/latest/userguide/datafiles.html>`_.'], 'type': 'boolean'}, 'exclude-package-data': {'$$description': ['Mapping from package names to lists of glob patterns that should be excluded', 'For more information on how to include data files, check ``setuptools`` `docs', '<https://setuptools.pypa.io/en/latest/userguide/datafiles.html>`_.'], 'type': 'object', 'additionalProperties': False, 'propertyNames': {'anyOf': [{'$id': '#/definitions/package-name', 'title': 'Valid package name', 'description': 'Valid package name (importable or :pep:`561`).', 'type': 'string', 'anyOf': [{'type': 'string', 'format': 'python-module-name-relaxed'}, {'type': 'string', 'format': 'pep561-stub-name'}]}, {'const': '*'}]}, 'patternProperties': {'^.*$': {'type': 'array', 'items': {'type': 'string'}}}}, 'namespace-packages': {'type': 'array', 'items': {'type': 'string', 'format': 'python-module-name-relaxed'}, '$comment': 'https://setuptools.pypa.io/en/latest/userguide/package_discovery.html', 'description': '**DEPRECATED**: use implicit namespaces instead (:pep:`420`).'}, 'py-modules': {'description': 'Modules that setuptools will manipulate', 'type': 'array', 'items': {'type': 'string', 'format': 'python-module-name-relaxed'}, '$comment': 'TODO: clarify the relationship with ``packages``'}, 'ext-modules': {'description': 'Extension modules to be compiled by setuptools', 'type': 'array', 'items': {'$id': '#/definitions/ext-module', 'title': 'Extension module', 'description': 'Parameters to construct a :class:`setuptools.Extension` object', 'type': 'object', 'required': ['name', 'sources'], 'additionalProperties': False, 'properties': {'name': {'type': 'string', 'format': 'python-module-name-relaxed'}, 'sources': {'type': 'array', 'items': {'type': 'string'}}, 'include-dirs': {'type': 'array', 'items': {'type': 'string'}}, 'define-macros': {'type': 'array', 'items': {'type': 'array', 'items': [{'description': 'macro name', 'type': 'string'}, {'description': 'macro value', 'oneOf': [{'type': 'string'}, {'type': 'null'}]}], 'additionalItems': False}}, 'undef-macros': {'type': 'array', 'items': {'type': 'string'}}, 'library-dirs': {'type': 'array', 'items': {'type': 'string'}}, 'libraries': {'type': 'array', 'items': {'type': 'string'}}, 'runtime-library-dirs': {'type': 'array', 'items': {'type': 'string'}}, 'extra-objects': {'type': 'array', 'items': {'type': 'string'}}, 'extra-compile-args': {'type': 'array', 'items': {'type': 'string'}}, 'extra-link-args': {'type': 'array', 'items': {'type': 'string'}}, 'export-symbols': {'type': 'array', 'items': {'type': 'string'}}, 'swig-opts': {'type': 'array', 'items': {'type': 'string'}}, 'depends': {'type': 'array', 'items': {'type': 'string'}}, 'language': {'type': 'string'}, 'optional': {'type': 'boolean'}, 'py-limited-api': {'type': 'boolean'}}}}, 'data-files': {'$$description': ['``dict``-like structure where each key represents a directory and', 'the value is a list of glob patterns that should be installed in them.', '**DISCOURAGED**: please notice this might not work as expected with wheels.', 'Whenever possible, consider using data files inside the package directories', '(or create a new namespace package that only contains data files).', 'See `data files support', '<https://setuptools.pypa.io/en/latest/userguide/datafiles.html>`_.'], 'type': 'object', 'patternProperties': {'^.*$': {'type': 'array', 'items': {'type': 'string'}}}}, 'cmdclass': {'$$description': ['Mapping of distutils-style command names to ``setuptools.Command`` subclasses', 'which in turn should be represented by strings with a qualified class name', '(i.e., "dotted" form with module), e.g.::\n\n', '    cmdclass = {mycmd = "pkg.subpkg.module.CommandClass"}\n\n', 'The command class should be a directly defined at the top-level of the', 'containing module (no class nesting).'], 'type': 'object', 'patternProperties': {'^.*$': {'type': 'string', 'format': 'python-qualified-identifier'}}}, 'license-files': {'type': 'array', 'items': {'type': 'string'}, '$$description': ['**PROVISIONAL**: list of glob patterns for all license files being distributed.', '(likely to become standard with :pep:`639`).', "By default: ``['LICEN[CS]E*', 'COPYING*', 'NOTICE*', 'AUTHORS*']``"], '$comment': 'TODO: revise if PEP 639 is accepted. Probably ``project.license-files``?'}, 'dynamic': {'type': 'object', 'description': 'Instructions for loading :pep:`621`-related metadata dynamically', 'additionalProperties': False, 'properties': {'version': {'$$description': ['A version dynamically loaded via either the ``attr:`` or ``file:``', 'directives. Please make sure the given file or attribute respects :pep:`440`.', 'Also ensure to set ``project.dynamic`` accordingly.'], 'oneOf': [{'title': "'attr:' directive", '$id': '#/definitions/attr-directive', '$$description': ['Value is read from a module attribute. Supports callables and iterables;', 'unsupported types are cast via ``str()``'], 'type': 'object', 'additionalProperties': False, 'properties': {'attr': {'type': 'string', 'format': 'python-qualified-identifier'}}, 'required': ['attr']}, {'$id': '#/definitions/file-directive', 'title': "'file:' directive", 'description': 'Value is read from a file (or list of files and then concatenated)', 'type': 'object', 'additionalProperties': False, 'properties': {'file': {'oneOf': [{'type': 'string'}, {'type': 'array', 'items': {'type': 'string'}}]}}, 'required': ['file']}]}, 'classifiers': {'$id': '#/definitions/file-directive', 'title': "'file:' directive", 'description': 'Value is read from a file (or list of files and then concatenated)', 'type': 'object', 'additionalProperties': False, 'properties': {'file': {'oneOf': [{'type': 'string'}, {'type': 'array', 'items': {'type': 'string'}}]}}, 'required': ['file']}, 'description': {'$id': '#/definitions/file-directive', 'title': "'file:' directive", 'description': 'Value is read from a file (or list of files and then concatenated)', 'type': 'object', 'additionalProperties': False, 'properties': {'file': {'oneOf': [{'type': 'string'}, {'type': 'array', 'items': {'type': 'string'}}]}}, 'required': ['file']}, 'entry-points': {'$id': '#/definitions/file-directive', 'title': "'file:' directive", 'description': 'Value is read from a file (or list of files and then concatenated)', 'type': 'object', 'additionalProperties': False, 'properties': {'file': {'oneOf': [{'type': 'string'}, {'type': 'array', 'items': {'type': 'string'}}]}}, 'required': ['file']}, 'dependencies': {'title': "'file:' directive for dependencies", 'allOf': [{'$$description': ['**BETA**: subset of the ``requirements.txt`` format', 'without ``pip`` flags and options', '(one :pep:`508`-compliant string per line,', 'lines that are blank or start with ``#`` are excluded).', 'See `dynamic metadata', '<https://setuptools.pypa.io/en/latest/userguide/pyproject_config.html#dynamic-metadata>`_.']}, {'$ref': '#/definitions/file-directive'}]}, 'optional-dependencies': {'type': 'object', 'propertyNames': {'type': 'string', 'format': 'pep508-identifier'}, 'additionalProperties': False, 'patternProperties': {'.+': {'title': "'file:' directive for dependencies", 'allOf': [{'$$description': ['**BETA**: subset of the ``requirements.txt`` format', 'without ``pip`` flags and options', '(one :pep:`508`-compliant string per line,', 'lines that are blank or start with ``#`` are excluded).', 'See `dynamic metadata', '<https://setuptools.pypa.io/en/latest/userguide/pyproject_config.html#dynamic-metadata>`_.']}, {'$ref': '#/definitions/file-directive'}]}}}, 'readme': {'type': 'object', 'anyOf': [{'$id': '#/definitions/file-directive', 'title': "'file:' directive", 'description': 'Value is read from a file (or list of files and then concatenated)', 'type': 'object', 'additionalProperties': False, 'properties': {'file': {'oneOf': [{'type': 'string'}, {'type': 'array', 'items': {'type': 'string'}}]}}, 'required': ['file']}, {'type': 'object', 'properties': {'content-type': {'type': 'string'}, 'file': {'oneOf': [{'type': 'string'}, {'type': 'array', 'items': {'type': 'string'}}]}}, 'additionalProperties': False}], 'required': ['file']}}}}, 'definitions': {'package-name': {'$id': '#/definitions/package-name', 'title': 'Valid package name', 'description': 'Valid package name (importable or :pep:`561`).', 'type': 'string', 'anyOf': [{'type': 'string', 'format': 'python-module-name-relaxed'}, {'type': 'string', 'format': 'pep561-stub-name'}]}, 'ext-module': {'$id': '#/definitions/ext-module', 'title': 'Extension module', 'description': 'Parameters to construct a :class:`setuptools.Extension` object', 'type': 'object', 'required': ['name', 'sources'], 'additionalProperties': False, 'properties': {'name': {'type': 'string', 'format': 'python-module-name-relaxed'}, 'sources': {'type': 'array', 'items': {'type': 'string'}}, 'include-dirs': {'type': 'array', 'items': {'type': 'string'}}, 'define-macros': {'type': 'array', 'items': {'type': 'array', 'items': [{'description': 'macro name', 'type': 'string'}, {'description': 'macro value', 'oneOf': [{'type': 'string'}, {'type': 'null'}]}], 'additionalItems': False}}, 'undef-macros': {'type': 'array', 'items': {'type': 'string'}}, 'library-dirs': {'type': 'array', 'items': {'type': 'string'}}, 'libraries': {'type': 'array', 'items': {'type': 'string'}}, 'runtime-library-dirs': {'type': 'array', 'items': {'type': 'string'}}, 'extra-objects': {'type': 'array', 'items': {'type': 'string'}}, 'extra-compile-args': {'type': 'array', 'items': {'type': 'string'}}, 'extra-link-args': {'type': 'array', 'items': {'type': 'string'}}, 'export-symbols': {'type': 'array', 'items': {'type': 'string'}}, 'swig-opts': {'type': 'array', 'items': {'type': 'string'}}, 'depends': {'type': 'array', 'items': {'type': 'string'}}, 'language': {'type': 'string'}, 'optional': {'type': 'boolean'}, 'py-limited-api': {'type': 'boolean'}}}, 'file-directive': {'$id': '#/definitions/file-directive', 'title': "'file:' directive", 'description': 'Value is read from a file (or list of files and then concatenated)', 'type': 'object', 'additionalProperties': False, 'properties': {'file': {'oneOf': [{'type': 'string'}, {'type': 'array', 'items': {'type': 'string'}}]}}, 'required': ['file']}, 'file-directive-for-dependencies': {'title': "'file:' directive for dependencies", 'allOf': [{'$$description': ['**BETA**: subset of the ``requirements.txt`` format', 'without ``pip`` flags and options', '(one :pep:`508`-compliant string per line,', 'lines that are blank or start with ``#`` are excluded).', 'See `dynamic metadata', '<https://setuptools.pypa.io/en/latest/userguide/pyproject_config.html#dynamic-metadata>`_.']}, {'$id': '#/definitions/file-directive', 'title': "'file:' directive", 'description': 'Value is read from a file (or list of files and then concatenated)', 'type': 'object', 'additionalProperties': False, 'properties': {'file': {'oneOf': [{'type': 'string'}, {'type': 'array', 'items': {'type': 'string'}}]}}, 'required': ['file']}]}, 'attr-directive': {'title': "'attr:' directive", '$id': '#/definitions/attr-directive', '$$description': ['Value is read from a module attribute. Supports callables and iterables;', 'unsupported types are cast via ``str()``'], 'type': 'object', 'additionalProperties': False, 'properties': {'attr': {'type': 'string', 'format': 'python-qualified-identifier'}}, 'required': ['attr']}, 'find-directive': {'$id': '#/definitions/find-directive', 'title': "'find:' directive", 'type': 'object', 'additionalProperties': False, 'properties': {'find': {'type': 'object', '$$description': ['Dynamic `package discovery', '<https://setuptools.pypa.io/en/latest/userguide/package_discovery.html>`_.'], 'additionalProperties': False, 'properties': {'where': {'description': 'Directories to be searched for packages (Unix-style relative path)', 'type': 'array', 'items': {'type': 'string'}}, 'exclude': {'type': 'array', '$$description': ['Exclude packages that match the values listed in this field.', "Can container shell-style wildcards (e.g. ``'pkg.*'``)"], 'items': {'type': 'string'}}, 'include': {'type': 'array', '$$description': ['Restrict the found packages to just the ones listed in this field.', "Can container shell-style wildcards (e.g. ``'pkg.*'``)"], 'items': {'type': 'string'}}, 'namespaces': {'type': 'boolean', '$$description': ['When ``True``, directories without a ``__init__.py`` file will also', 'be scanned for :pep:`420`-style implicit namespaces']}}}}}}}, rule='additionalProperties')     return data@@ -987,3 +979,3 @@     if not isinstance(data, (dict)):-        raise JsonSchemaValueException("" + (name_prefix or "data") + " must be object", value=data, name="" + (name_prefix or "data") + "", definition={'$schema': 'http://json-schema.org/draft-07/schema#', '$id': 'https://packaging.python.org/en/latest/specifications/pyproject-toml/', 'title': 'Package metadata stored in the ``project`` table', '$$description': ['Data structure for the **project** table inside ``pyproject.toml``', '(as initially defined in :pep:`621`)'], 'type': 'object', 'properties': {'name': {'type': 'string', 'description': 'The name (primary identifier) of the project. MUST be statically defined.', 'format': 'pep508-identifier'}, 'version': {'type': 'string', 'description': 'The version of the project as supported by :pep:`440`.', 'format': 'pep440'}, 'description': {'type': 'string', '$$description': ['The `summary description of the project', '<https://packaging.python.org/specifications/core-metadata/#summary>`_']}, 'readme': {'$$description': ['`Full/detailed description of the project in the form of a README', '<https://peps.python.org/pep-0621/#readme>`_', "with meaning similar to the one defined in `core metadata's Description", '<https://packaging.python.org/specifications/core-metadata/#description>`_'], 'oneOf': [{'type': 'string', '$$description': ['Relative path to a text file (UTF-8) containing the full description', 'of the project. If the file path ends in case-insensitive ``.md`` or', '``.rst`` suffixes, then the content-type is respectively', '``text/markdown`` or ``text/x-rst``']}, {'type': 'object', 'allOf': [{'anyOf': [{'properties': {'file': {'type': 'string', '$$description': ['Relative path to a text file containing the full description', 'of the project.']}}, 'required': ['file']}, {'properties': {'text': {'type': 'string', 'description': 'Full text describing the project.'}}, 'required': ['text']}]}, {'properties': {'content-type': {'type': 'string', '$$description': ['Content-type (:rfc:`1341`) of the full description', '(e.g. ``text/markdown``). The ``charset`` parameter is assumed', 'UTF-8 when not present.'], '$comment': 'TODO: add regex pattern or format?'}}, 'required': ['content-type']}]}]}, 'requires-python': {'type': 'string', 'format': 'pep508-versionspec', '$$description': ['`The Python version requirements of the project', '<https://packaging.python.org/specifications/core-metadata/#requires-python>`_.']}, 'license': {'description': '`Project license <https://peps.python.org/pep-0621/#license>`_.', 'oneOf': [{'type': 'string', 'description': 'An SPDX license identifier', 'format': 'SPDX'}, {'type': 'object', 'properties': {'file': {'type': 'string', '$$description': ['Relative path to the file (UTF-8) which contains the license for the', 'project.']}}, 'required': ['file']}, {'type': 'object', 'properties': {'text': {'type': 'string', '$$description': ['The license of the project whose meaning is that of the', '`License field from the core metadata', '<https://packaging.python.org/specifications/core-metadata/#license>`_.']}}, 'required': ['text']}]}, 'license-files': {'description': 'Paths or globs to paths of license files', 'type': 'array', 'items': {'type': 'string'}}, 'authors': {'type': 'array', 'items': {'$id': '#/definitions/author', 'title': 'Author or Maintainer', '$comment': 'https://peps.python.org/pep-0621/#authors-maintainers', 'type': 'object', 'additionalProperties': False, 'properties': {'name': {'type': 'string', '$$description': ['MUST be a valid email name, i.e. whatever can be put as a name, before an', 'email, in :rfc:`822`.']}, 'email': {'type': 'string', 'format': 'idn-email', 'description': 'MUST be a valid email address'}}}, '$$description': ["The people or organizations considered to be the 'authors' of the project.", 'The exact meaning is open to interpretation (e.g. original or primary authors,', 'current maintainers, or owners of the package).']}, 'maintainers': {'type': 'array', 'items': {'$id': '#/definitions/author', 'title': 'Author or Maintainer', '$comment': 'https://peps.python.org/pep-0621/#authors-maintainers', 'type': 'object', 'additionalProperties': False, 'properties': {'name': {'type': 'string', '$$description': ['MUST be a valid email name, i.e. whatever can be put as a name, before an', 'email, in :rfc:`822`.']}, 'email': {'type': 'string', 'format': 'idn-email', 'description': 'MUST be a valid email address'}}}, '$$description': ["The people or organizations considered to be the 'maintainers' of the project.", 'Similarly to ``authors``, the exact meaning is open to interpretation.']}, 'keywords': {'type': 'array', 'items': {'type': 'string'}, 'description': 'List of keywords to assist searching for the distribution in a larger catalog.'}, 'classifiers': {'type': 'array', 'items': {'type': 'string', 'format': 'trove-classifier', 'description': '`PyPI classifier <https://pypi.org/classifiers/>`_.'}, '$$description': ['`Trove classifiers <https://pypi.org/classifiers/>`_', 'which apply to the project.']}, 'urls': {'type': 'object', 'description': 'URLs associated with the project in the form ``label => value``.', 'additionalProperties': False, 'patternProperties': {'^.+$': {'type': 'string', 'format': 'url'}}}, 'scripts': {'$id': '#/definitions/entry-point-group', 'title': 'Entry-points', 'type': 'object', '$$description': ['Entry-points are grouped together to indicate what sort of capabilities they', 'provide.', 'See the `packaging guides', '<https://packaging.python.org/specifications/entry-points/>`_', 'and `setuptools docs', '<https://setuptools.pypa.io/en/latest/userguide/entry_point.html>`_', 'for more information.'], 'propertyNames': {'format': 'python-entrypoint-name'}, 'additionalProperties': False, 'patternProperties': {'^.+$': {'type': 'string', '$$description': ['Reference to a Python object. It is either in the form', '``importable.module``, or ``importable.module:object.attr``.'], 'format': 'python-entrypoint-reference', '$comment': 'https://packaging.python.org/specifications/entry-points/'}}}, 'gui-scripts': {'$id': '#/definitions/entry-point-group', 'title': 'Entry-points', 'type': 'object', '$$description': ['Entry-points are grouped together to indicate what sort of capabilities they', 'provide.', 'See the `packaging guides', '<https://packaging.python.org/specifications/entry-points/>`_', 'and `setuptools docs', '<https://setuptools.pypa.io/en/latest/userguide/entry_point.html>`_', 'for more information.'], 'propertyNames': {'format': 'python-entrypoint-name'}, 'additionalProperties': False, 'patternProperties': {'^.+$': {'type': 'string', '$$description': ['Reference to a Python object. It is either in the form', '``importable.module``, or ``importable.module:object.attr``.'], 'format': 'python-entrypoint-reference', '$comment': 'https://packaging.python.org/specifications/entry-points/'}}}, 'entry-points': {'$$description': ['Instruct the installer to expose the given modules/functions via', '``entry-point`` discovery mechanism (useful for plugins).', 'More information available in the `Python packaging guide', '<https://packaging.python.org/specifications/entry-points/>`_.'], 'propertyNames': {'format': 'python-entrypoint-group'}, 'additionalProperties': False, 'patternProperties': {'^.+$': {'$id': '#/definitions/entry-point-group', 'title': 'Entry-points', 'type': 'object', '$$description': ['Entry-points are grouped together to indicate what sort of capabilities they', 'provide.', 'See the `packaging guides', '<https://packaging.python.org/specifications/entry-points/>`_', 'and `setuptools docs', '<https://setuptools.pypa.io/en/latest/userguide/entry_point.html>`_', 'for more information.'], 'propertyNames': {'format': 'python-entrypoint-name'}, 'additionalProperties': False, 'patternProperties': {'^.+$': {'type': 'string', '$$description': ['Reference to a Python object. It is either in the form', '``importable.module``, or ``importable.module:object.attr``.'], 'format': 'python-entrypoint-reference', '$comment': 'https://packaging.python.org/specifications/entry-points/'}}}}}, 'dependencies': {'type': 'array', 'description': 'Project (mandatory) dependencies.', 'items': {'$id': '#/definitions/dependency', 'title': 'Dependency', 'type': 'string', 'description': 'Project dependency specification according to PEP 508', 'format': 'pep508'}}, 'optional-dependencies': {'type': 'object', 'description': 'Optional dependency for the project', 'propertyNames': {'format': 'pep508-identifier'}, 'additionalProperties': False, 'patternProperties': {'^.+$': {'type': 'array', 'items': {'$id': '#/definitions/dependency', 'title': 'Dependency', 'type': 'string', 'description': 'Project dependency specification according to PEP 508', 'format': 'pep508'}}}}, 'dynamic': {'type': 'array', '$$description': ['Specifies which fields are intentionally unspecified and expected to be', 'dynamically provided by build tools'], 'items': {'enum': ['version', 'description', 'readme', 'requires-python', 'license', 'license-files', 'authors', 'maintainers', 'keywords', 'classifiers', 'urls', 'scripts', 'gui-scripts', 'entry-points', 'dependencies', 'optional-dependencies']}}}, 'required': ['name'], 'additionalProperties': False, 'allOf': [{'if': {'not': {'required': ['dynamic'], 'properties': {'dynamic': {'contains': {'const': 'version'}, '$$description': ['version is listed in ``dynamic``']}}}, '$$comment': ['According to :pep:`621`:', '    If the core metadata specification lists a field as "Required", then', '    the metadata MUST specify the field statically or list it in dynamic', 'In turn, `core metadata`_ defines:', '    The required fields are: Metadata-Version, Name, Version.', '    All the other fields are optional.', 'Since ``Metadata-Version`` is defined by the build back-end, ``name`` and', '``version`` are the only mandatory information in ``pyproject.toml``.', '.. _core metadata: https://packaging.python.org/specifications/core-metadata/']}, 'then': {'required': ['version'], '$$description': ['version should be statically defined in the ``version`` field']}}, {'if': {'required': ['license-files']}, 'then': {'properties': {'license': {'type': 'string'}}}}], 'definitions': {'author': {'$id': '#/definitions/author', 'title': 'Author or Maintainer', '$comment': 'https://peps.python.org/pep-0621/#authors-maintainers', 'type': 'object', 'additionalProperties': False, 'properties': {'name': {'type': 'string', '$$description': ['MUST be a valid email name, i.e. whatever can be put as a name, before an', 'email, in :rfc:`822`.']}, 'email': {'type': 'string', 'format': 'idn-email', 'description': 'MUST be a valid email address'}}}, 'entry-point-group': {'$id': '#/definitions/entry-point-group', 'title': 'Entry-points', 'type': 'object', '$$description': ['Entry-points are grouped together to indicate what sort of capabilities they', 'provide.', 'See the `packaging guides', '<https://packaging.python.org/specifications/entry-points/>`_', 'and `setuptools docs', '<https://setuptools.pypa.io/en/latest/userguide/entry_point.html>`_', 'for more information.'], 'propertyNames': {'format': 'python-entrypoint-name'}, 'additionalProperties': False, 'patternProperties': {'^.+$': {'type': 'string', '$$description': ['Reference to a Python object. It is either in the form', '``importable.module``, or ``importable.module:object.attr``.'], 'format': 'python-entrypoint-reference', '$comment': 'https://packaging.python.org/specifications/entry-points/'}}}, 'dependency': {'$id': '#/definitions/dependency', 'title': 'Dependency', 'type': 'string', 'description': 'Project dependency specification according to PEP 508', 'format': 'pep508'}}}, rule='type')+        raise JsonSchemaValueException("" + (name_prefix or "data") + " must be object", value=data, name="" + (name_prefix or "data") + "", definition={'$schema': 'http://json-schema.org/draft-07/schema#', '$id': 'https://packaging.python.org/en/latest/specifications/pyproject-toml/', 'title': 'Package metadata stored in the ``project`` table', '$$description': ['Data structure for the **project** table inside ``pyproject.toml``', '(as initially defined in :pep:`621`)'], 'type': 'object', 'properties': {'name': {'type': 'string', 'description': 'The name (primary identifier) of the project. MUST be statically defined.', 'format': 'pep508-identifier'}, 'version': {'type': 'string', 'description': 'The version of the project as supported by :pep:`440`.', 'format': 'pep440'}, 'description': {'type': 'string', '$$description': ['The `summary description of the project', '<https://packaging.python.org/specifications/core-metadata/#summary>`_']}, 'readme': {'$$description': ['`Full/detailed description of the project in the form of a README', '<https://peps.python.org/pep-0621/#readme>`_', "with meaning similar to the one defined in `core metadata's Description", '<https://packaging.python.org/specifications/core-metadata/#description>`_'], 'oneOf': [{'type': 'string', '$$description': ['Relative path to a text file (UTF-8) containing the full description', 'of the project. If the file path ends in case-insensitive ``.md`` or', '``.rst`` suffixes, then the content-type is respectively', '``text/markdown`` or ``text/x-rst``']}, {'type': 'object', 'allOf': [{'anyOf': [{'properties': {'file': {'type': 'string', '$$description': ['Relative path to a text file containing the full description', 'of the project.']}}, 'required': ['file']}, {'properties': {'text': {'type': 'string', 'description': 'Full text describing the project.'}}, 'required': ['text']}]}, {'properties': {'content-type': {'type': 'string', '$$description': ['Content-type (:rfc:`1341`) of the full description', '(e.g. ``text/markdown``). The ``charset`` parameter is assumed', 'UTF-8 when not present.'], '$comment': 'TODO: add regex pattern or format?'}}, 'required': ['content-type']}]}]}, 'requires-python': {'type': 'string', 'format': 'pep508-versionspec', '$$description': ['`The Python version requirements of the project', '<https://packaging.python.org/specifications/core-metadata/#requires-python>`_.']}, 'license': {'description': '`Project license <https://peps.python.org/pep-0621/#license>`_.', 'oneOf': [{'type': 'string', 'description': 'An SPDX license identifier', 'format': 'SPDX'}, {'type': 'object', 'properties': {'file': {'type': 'string', '$$description': ['Relative path to the file (UTF-8) which contains the license for the', 'project.']}}, 'required': ['file']}, {'type': 'object', 'properties': {'text': {'type': 'string', '$$description': ['The license of the project whose meaning is that of the', '`License field from the core metadata', '<https://packaging.python.org/specifications/core-metadata/#license>`_.']}}, 'required': ['text']}]}, 'license-files': {'description': 'Paths or globs to paths of license files', 'type': 'array', 'items': {'type': 'string'}}, 'authors': {'type': 'array', 'items': {'$id': '#/definitions/author', 'title': 'Author or Maintainer', '$comment': 'https://peps.python.org/pep-0621/#authors-maintainers', 'type': 'object', 'additionalProperties': False, 'properties': {'name': {'type': 'string', '$$description': ['MUST be a valid email name, i.e. whatever can be put as a name, before an', 'email, in :rfc:`822`.']}, 'email': {'type': 'string', 'format': 'idn-email', 'description': 'MUST be a valid email address'}}, 'anyOf': [{'required': ['name']}, {'required': ['email']}]}, '$$description': ["The people or organizations considered to be the 'authors' of the project.", 'The exact meaning is open to interpretation (e.g. original or primary authors,', 'current maintainers, or owners of the package).']}, 'maintainers': {'type': 'array', 'items': {'$id': '#/definitions/author', 'title': 'Author or Maintainer', '$comment': 'https://peps.python.org/pep-0621/#authors-maintainers', 'type': 'object', 'additionalProperties': False, 'properties': {'name': {'type': 'string', '$$description': ['MUST be a valid email name, i.e. whatever can be put as a name, before an', 'email, in :rfc:`822`.']}, 'email': {'type': 'string', 'format': 'idn-email', 'description': 'MUST be a valid email address'}}, 'anyOf': [{'required': ['name']}, {'required': ['email']}]}, '$$description': ["The people or organizations considered to be the 'maintainers' of the project.", 'Similarly to ``authors``, the exact meaning is open to interpretation.']}, 'keywords': {'type': 'array', 'items': {'type': 'string'}, 'description': 'List of keywords to assist searching for the distribution in a larger catalog.'}, 'classifiers': {'type': 'array', 'items': {'type': 'string', 'format': 'trove-classifier', 'description': '`PyPI classifier <https://pypi.org/classifiers/>`_.'}, '$$description': ['`Trove classifiers <https://pypi.org/classifiers/>`_', 'which apply to the project.']}, 'urls': {'type': 'object', 'description': 'URLs associated with the project in the form ``label => value``.', 'additionalProperties': False, 'patternProperties': {'^.+$': {'type': 'string', 'format': 'url'}}}, 'scripts': {'$id': '#/definitions/entry-point-group', 'title': 'Entry-points', 'type': 'object', '$$description': ['Entry-points are grouped together to indicate what sort of capabilities they', 'provide.', 'See the `packaging guides', '<https://packaging.python.org/specifications/entry-points/>`_', 'and `setuptools docs', '<https://setuptools.pypa.io/en/latest/userguide/entry_point.html>`_', 'for more information.'], 'propertyNames': {'format': 'python-entrypoint-name'}, 'additionalProperties': False, 'patternProperties': {'^.+$': {'type': 'string', '$$description': ['Reference to a Python object. It is either in the form', '``importable.module``, or ``importable.module:object.attr``.'], 'format': 'python-entrypoint-reference', '$comment': 'https://packaging.python.org/specifications/entry-points/'}}}, 'gui-scripts': {'$id': '#/definitions/entry-point-group', 'title': 'Entry-points', 'type': 'object', '$$description': ['Entry-points are grouped together to indicate what sort of capabilities they', 'provide.', 'See the `packaging guides', '<https://packaging.python.org/specifications/entry-points/>`_', 'and `setuptools docs', '<https://setuptools.pypa.io/en/latest/userguide/entry_point.html>`_', 'for more information.'], 'propertyNames': {'format': 'python-entrypoint-name'}, 'additionalProperties': False, 'patternProperties': {'^.+$': {'type': 'string', '$$description': ['Reference to a Python object. It is either in the form', '``importable.module``, or ``importable.module:object.attr``.'], 'format': 'python-entrypoint-reference', '$comment': 'https://packaging.python.org/specifications/entry-points/'}}}, 'entry-points': {'$$description': ['Instruct the installer to expose the given modules/functions via', '``entry-point`` discovery mechanism (useful for plugins).', 'More information available in the `Python packaging guide', '<https://packaging.python.org/specifications/entry-points/>`_.'], 'propertyNames': {'format': 'python-entrypoint-group'}, 'additionalProperties': False, 'patternProperties': {'^.+$': {'$id': '#/definitions/entry-point-group', 'title': 'Entry-points', 'type': 'object', '$$description': ['Entry-points are grouped together to indicate what sort of capabilities they', 'provide.', 'See the `packaging guides', '<https://packaging.python.org/specifications/entry-points/>`_', 'and `setuptools docs', '<https://setuptools.pypa.io/en/latest/userguide/entry_point.html>`_', 'for more information.'], 'propertyNames': {'format': 'python-entrypoint-name'}, 'additionalProperties': False, 'patternProperties': {'^.+$': {'type': 'string', '$$description': ['Reference to a Python object. It is either in the form', '``importable.module``, or ``importable.module:object.attr``.'], 'format': 'python-entrypoint-reference', '$comment': 'https://packaging.python.org/specifications/entry-points/'}}}}}, 'dependencies': {'type': 'array', 'description': 'Project (mandatory) dependencies.', 'items': {'$id': '#/definitions/dependency', 'title': 'Dependency', 'type': 'string', 'description': 'Project dependency specification according to PEP 508', 'format': 'pep508'}}, 'optional-dependencies': {'type': 'object', 'description': 'Optional dependency for the project', 'propertyNames': {'format': 'pep508-identifier'}, 'additionalProperties': False, 'patternProperties': {'^.+$': {'type': 'array', 'items': {'$id': '#/definitions/dependency', 'title': 'Dependency', 'type': 'string', 'description': 'Project dependency specification according to PEP 508', 'format': 'pep508'}}}}, 'import-names': {'description': 'Lists import names which a project, when installed, would exclusively provide.', 'type': 'array', 'items': {'type': 'string', 'format': 'import-name'}}, 'import-namespaces': {'description': 'Lists import names that, when installed, would be provided by the project, but not exclusively.', 'type': 'array', 'items': {'type': 'string', 'format': 'import-name'}}, 'dynamic': {'type': 'array', '$$description': ['Specifies which fields are intentionally unspecified and expected to be', 'dynamically provided by build tools'], 'items': {'enum': ['version', 'description', 'readme', 'requires-python', 'license', 'license-files', 'authors', 'maintainers', 'keywords', 'classifiers', 'urls', 'scripts', 'gui-scripts', 'entry-points', 'dependencies', 'optional-dependencies', 'import-names', 'import-namespaces']}}}, 'required': ['name'], 'additionalProperties': False, 'allOf': [{'if': {'not': {'required': ['dynamic'], 'properties': {'dynamic': {'contains': {'const': 'version'}, '$$description': ['version is listed in ``dynamic``']}}}, '$$comment': ['According to :pep:`621`:', '    If the core metadata specification lists a field as "Required", then', '    the metadata MUST specify the field statically or list it in dynamic', 'In turn, `core metadata`_ defines:', '    The required fields are: Metadata-Version, Name, Version.', '    All the other fields are optional.', 'Since ``Metadata-Version`` is defined by the build back-end, ``name`` and', '``version`` are the only mandatory information in ``pyproject.toml``.', '.. _core metadata: https://packaging.python.org/specifications/core-metadata/']}, 'then': {'required': ['version'], '$$description': ['version should be statically defined in the ``version`` field']}}, {'if': {'required': ['license-files']}, 'then': {'properties': {'license': {'type': 'string'}}}}], 'definitions': {'author': {'$id': '#/definitions/author', 'title': 'Author or Maintainer', '$comment': 'https://peps.python.org/pep-0621/#authors-maintainers', 'type': 'object', 'additionalProperties': False, 'properties': {'name': {'type': 'string', '$$description': ['MUST be a valid email name, i.e. whatever can be put as a name, before an', 'email, in :rfc:`822`.']}, 'email': {'type': 'string', 'format': 'idn-email', 'description': 'MUST be a valid email address'}}, 'anyOf': [{'required': ['name']}, {'required': ['email']}]}, 'entry-point-group': {'$id': '#/definitions/entry-point-group', 'title': 'Entry-points', 'type': 'object', '$$description': ['Entry-points are grouped together to indicate what sort of capabilities they', 'provide.', 'See the `packaging guides', '<https://packaging.python.org/specifications/entry-points/>`_', 'and `setuptools docs', '<https://setuptools.pypa.io/en/latest/userguide/entry_point.html>`_', 'for more information.'], 'propertyNames': {'format': 'python-entrypoint-name'}, 'additionalProperties': False, 'patternProperties': {'^.+$': {'type': 'string', '$$description': ['Reference to a Python object. It is either in the form', '``importable.module``, or ``importable.module:object.attr``.'], 'format': 'python-entrypoint-reference', '$comment': 'https://packaging.python.org/specifications/entry-points/'}}}, 'dependency': {'$id': '#/definitions/dependency', 'title': 'Dependency', 'type': 'string', 'description': 'Project dependency specification according to PEP 508', 'format': 'pep508'}}}, rule='type')     try:@@ -1043,3 +1035,3 @@         if data__missing_keys:-            raise JsonSchemaValueException("" + (name_prefix or "data") + " must contain " + (str(sorted(data__missing_keys)) + " properties"), value=data, name="" + (name_prefix or "data") + "", definition={'$schema': 'http://json-schema.org/draft-07/schema#', '$id': 'https://packaging.python.org/en/latest/specifications/pyproject-toml/', 'title': 'Package metadata stored in the ``project`` table', '$$description': ['Data structure for the **project** table inside ``pyproject.toml``', '(as initially defined in :pep:`621`)'], 'type': 'object', 'properties': {'name': {'type': 'string', 'description': 'The name (primary identifier) of the project. MUST be statically defined.', 'format': 'pep508-identifier'}, 'version': {'type': 'string', 'description': 'The version of the project as supported by :pep:`440`.', 'format': 'pep440'}, 'description': {'type': 'string', '$$description': ['The `summary description of the project', '<https://packaging.python.org/specifications/core-metadata/#summary>`_']}, 'readme': {'$$description': ['`Full/detailed description of the project in the form of a README', '<https://peps.python.org/pep-0621/#readme>`_', "with meaning similar to the one defined in `core metadata's Description", '<https://packaging.python.org/specifications/core-metadata/#description>`_'], 'oneOf': [{'type': 'string', '$$description': ['Relative path to a text file (UTF-8) containing the full description', 'of the project. If the file path ends in case-insensitive ``.md`` or', '``.rst`` suffixes, then the content-type is respectively', '``text/markdown`` or ``text/x-rst``']}, {'type': 'object', 'allOf': [{'anyOf': [{'properties': {'file': {'type': 'string', '$$description': ['Relative path to a text file containing the full description', 'of the project.']}}, 'required': ['file']}, {'properties': {'text': {'type': 'string', 'description': 'Full text describing the project.'}}, 'required': ['text']}]}, {'properties': {'content-type': {'type': 'string', '$$description': ['Content-type (:rfc:`1341`) of the full description', '(e.g. ``text/markdown``). The ``charset`` parameter is assumed', 'UTF-8 when not present.'], '$comment': 'TODO: add regex pattern or format?'}}, 'required': ['content-type']}]}]}, 'requires-python': {'type': 'string', 'format': 'pep508-versionspec', '$$description': ['`The Python version requirements of the project', '<https://packaging.python.org/specifications/core-metadata/#requires-python>`_.']}, 'license': {'description': '`Project license <https://peps.python.org/pep-0621/#license>`_.', 'oneOf': [{'type': 'string', 'description': 'An SPDX license identifier', 'format': 'SPDX'}, {'type': 'object', 'properties': {'file': {'type': 'string', '$$description': ['Relative path to the file (UTF-8) which contains the license for the', 'project.']}}, 'required': ['file']}, {'type': 'object', 'properties': {'text': {'type': 'string', '$$description': ['The license of the project whose meaning is that of the', '`License field from the core metadata', '<https://packaging.python.org/specifications/core-metadata/#license>`_.']}}, 'required': ['text']}]}, 'license-files': {'description': 'Paths or globs to paths of license files', 'type': 'array', 'items': {'type': 'string'}}, 'authors': {'type': 'array', 'items': {'$id': '#/definitions/author', 'title': 'Author or Maintainer', '$comment': 'https://peps.python.org/pep-0621/#authors-maintainers', 'type': 'object', 'additionalProperties': False, 'properties': {'name': {'type': 'string', '$$description': ['MUST be a valid email name, i.e. whatever can be put as a name, before an', 'email, in :rfc:`822`.']}, 'email': {'type': 'string', 'format': 'idn-email', 'description': 'MUST be a valid email address'}}}, '$$description': ["The people or organizations considered to be the 'authors' of the project.", 'The exact meaning is open to interpretation (e.g. original or primary authors,', 'current maintainers, or owners of the package).']}, 'maintainers': {'type': 'array', 'items': {'$id': '#/definitions/author', 'title': 'Author or Maintainer', '$comment': 'https://peps.python.org/pep-0621/#authors-maintainers', 'type': 'object', 'additionalProperties': False, 'properties': {'name': {'type': 'string', '$$description': ['MUST be a valid email name, i.e. whatever can be put as a name, before an', 'email, in :rfc:`822`.']}, 'email': {'type': 'string', 'format': 'idn-email', 'description': 'MUST be a valid email address'}}}, '$$description': ["The people or organizations considered to be the 'maintainers' of the project.", 'Similarly to ``authors``, the exact meaning is open to interpretation.']}, 'keywords': {'type': 'array', 'items': {'type': 'string'}, 'description': 'List of keywords to assist searching for the distribution in a larger catalog.'}, 'classifiers': {'type': 'array', 'items': {'type': 'string', 'format': 'trove-classifier', 'description': '`PyPI classifier <https://pypi.org/classifiers/>`_.'}, '$$description': ['`Trove classifiers <https://pypi.org/classifiers/>`_', 'which apply to the project.']}, 'urls': {'type': 'object', 'description': 'URLs associated with the project in the form ``label => value``.', 'additionalProperties': False, 'patternProperties': {'^.+$': {'type': 'string', 'format': 'url'}}}, 'scripts': {'$id': '#/definitions/entry-point-group', 'title': 'Entry-points', 'type': 'object', '$$description': ['Entry-points are grouped together to indicate what sort of capabilities they', 'provide.', 'See the `packaging guides', '<https://packaging.python.org/specifications/entry-points/>`_', 'and `setuptools docs', '<https://setuptools.pypa.io/en/latest/userguide/entry_point.html>`_', 'for more information.'], 'propertyNames': {'format': 'python-entrypoint-name'}, 'additionalProperties': False, 'patternProperties': {'^.+$': {'type': 'string', '$$description': ['Reference to a Python object. It is either in the form', '``importable.module``, or ``importable.module:object.attr``.'], 'format': 'python-entrypoint-reference', '$comment': 'https://packaging.python.org/specifications/entry-points/'}}}, 'gui-scripts': {'$id': '#/definitions/entry-point-group', 'title': 'Entry-points', 'type': 'object', '$$description': ['Entry-points are grouped together to indicate what sort of capabilities they', 'provide.', 'See the `packaging guides', '<https://packaging.python.org/specifications/entry-points/>`_', 'and `setuptools docs', '<https://setuptools.pypa.io/en/latest/userguide/entry_point.html>`_', 'for more information.'], 'propertyNames': {'format': 'python-entrypoint-name'}, 'additionalProperties': False, 'patternProperties': {'^.+$': {'type': 'string', '$$description': ['Reference to a Python object. It is either in the form', '``importable.module``, or ``importable.module:object.attr``.'], 'format': 'python-entrypoint-reference', '$comment': 'https://packaging.python.org/specifications/entry-points/'}}}, 'entry-points': {'$$description': ['Instruct the installer to expose the given modules/functions via', '``entry-point`` discovery mechanism (useful for plugins).', 'More information available in the `Python packaging guide', '<https://packaging.python.org/specifications/entry-points/>`_.'], 'propertyNames': {'format': 'python-entrypoint-group'}, 'additionalProperties': False, 'patternProperties': {'^.+$': {'$id': '#/definitions/entry-point-group', 'title': 'Entry-points', 'type': 'object', '$$description': ['Entry-points are grouped together to indicate what sort of capabilities they', 'provide.', 'See the `packaging guides', '<https://packaging.python.org/specifications/entry-points/>`_', 'and `setuptools docs', '<https://setuptools.pypa.io/en/latest/userguide/entry_point.html>`_', 'for more information.'], 'propertyNames': {'format': 'python-entrypoint-name'}, 'additionalProperties': False, 'patternProperties': {'^.+$': {'type': 'string', '$$description': ['Reference to a Python object. It is either in the form', '``importable.module``, or ``importable.module:object.attr``.'], 'format': 'python-entrypoint-reference', '$comment': 'https://packaging.python.org/specifications/entry-points/'}}}}}, 'dependencies': {'type': 'array', 'description': 'Project (mandatory) dependencies.', 'items': {'$id': '#/definitions/dependency', 'title': 'Dependency', 'type': 'string', 'description': 'Project dependency specification according to PEP 508', 'format': 'pep508'}}, 'optional-dependencies': {'type': 'object', 'description': 'Optional dependency for the project', 'propertyNames': {'format': 'pep508-identifier'}, 'additionalProperties': False, 'patternProperties': {'^.+$': {'type': 'array', 'items': {'$id': '#/definitions/dependency', 'title': 'Dependency', 'type': 'string', 'description': 'Project dependency specification according to PEP 508', 'format': 'pep508'}}}}, 'dynamic': {'type': 'array', '$$description': ['Specifies which fields are intentionally unspecified and expected to be', 'dynamically provided by build tools'], 'items': {'enum': ['version', 'description', 'readme', 'requires-python', 'license', 'license-files', 'authors', 'maintainers', 'keywords', 'classifiers', 'urls', 'scripts', 'gui-scripts', 'entry-points', 'dependencies', 'optional-dependencies']}}}, 'required': ['name'], 'additionalProperties': False, 'allOf': [{'if': {'not': {'required': ['dynamic'], 'properties': {'dynamic': {'contains': {'const': 'version'}, '$$description': ['version is listed in ``dynamic``']}}}, '$$comment': ['According to :pep:`621`:', '    If the core metadata specification lists a field as "Required", then', '    the metadata MUST specify the field statically or list it in dynamic', 'In turn, `core metadata`_ defines:', '    The required fields are: Metadata-Version, Name, Version.', '    All the other fields are optional.', 'Since ``Metadata-Version`` is defined by the build back-end, ``name`` and', '``version`` are the only mandatory information in ``pyproject.toml``.', '.. _core metadata: https://packaging.python.org/specifications/core-metadata/']}, 'then': {'required': ['version'], '$$description': ['version should be statically defined in the ``version`` field']}}, {'if': {'required': ['license-files']}, 'then': {'properties': {'license': {'type': 'string'}}}}], 'definitions': {'author': {'$id': '#/definitions/author', 'title': 'Author or Maintainer', '$comment': 'https://peps.python.org/pep-0621/#authors-maintainers', 'type': 'object', 'additionalProperties': False, 'properties': {'name': {'type': 'string', '$$description': ['MUST be a valid email name, i.e. whatever can be put as a name, before an', 'email, in :rfc:`822`.']}, 'email': {'type': 'string', 'format': 'idn-email', 'description': 'MUST be a valid email address'}}}, 'entry-point-group': {'$id': '#/definitions/entry-point-group', 'title': 'Entry-points', 'type': 'object', '$$description': ['Entry-points are grouped together to indicate what sort of capabilities they', 'provide.', 'See the `packaging guides', '<https://packaging.python.org/specifications/entry-points/>`_', 'and `setuptools docs', '<https://setuptools.pypa.io/en/latest/userguide/entry_point.html>`_', 'for more information.'], 'propertyNames': {'format': 'python-entrypoint-name'}, 'additionalProperties': False, 'patternProperties': {'^.+$': {'type': 'string', '$$description': ['Reference to a Python object. It is either in the form', '``importable.module``, or ``importable.module:object.attr``.'], 'format': 'python-entrypoint-reference', '$comment': 'https://packaging.python.org/specifications/entry-points/'}}}, 'dependency': {'$id': '#/definitions/dependency', 'title': 'Dependency', 'type': 'string', 'description': 'Project dependency specification according to PEP 508', 'format': 'pep508'}}}, rule='required')+            raise JsonSchemaValueException("" + (name_prefix or "data") + " must contain " + (str(sorted(data__missing_keys)) + " properties"), value=data, name="" + (name_prefix or "data") + "", definition={'$schema': 'http://json-schema.org/draft-07/schema#', '$id': 'https://packaging.python.org/en/latest/specifications/pyproject-toml/', 'title': 'Package metadata stored in the ``project`` table', '$$description': ['Data structure for the **project** table inside ``pyproject.toml``', '(as initially defined in :pep:`621`)'], 'type': 'object', 'properties': {'name': {'type': 'string', 'description': 'The name (primary identifier) of the project. MUST be statically defined.', 'format': 'pep508-identifier'}, 'version': {'type': 'string', 'description': 'The version of the project as supported by :pep:`440`.', 'format': 'pep440'}, 'description': {'type': 'string', '$$description': ['The `summary description of the project', '<https://packaging.python.org/specifications/core-metadata/#summary>`_']}, 'readme': {'$$description': ['`Full/detailed description of the project in the form of a README', '<https://peps.python.org/pep-0621/#readme>`_', "with meaning similar to the one defined in `core metadata's Description", '<https://packaging.python.org/specifications/core-metadata/#description>`_'], 'oneOf': [{'type': 'string', '$$description': ['Relative path to a text file (UTF-8) containing the full description', 'of the project. If the file path ends in case-insensitive ``.md`` or', '``.rst`` suffixes, then the content-type is respectively', '``text/markdown`` or ``text/x-rst``']}, {'type': 'object', 'allOf': [{'anyOf': [{'properties': {'file': {'type': 'string', '$$description': ['Relative path to a text file containing the full description', 'of the project.']}}, 'required': ['file']}, {'properties': {'text': {'type': 'string', 'description': 'Full text describing the project.'}}, 'required': ['text']}]}, {'properties': {'content-type': {'type': 'string', '$$description': ['Content-type (:rfc:`1341`) of the full description', '(e.g. ``text/markdown``). The ``charset`` parameter is assumed', 'UTF-8 when not present.'], '$comment': 'TODO: add regex pattern or format?'}}, 'required': ['content-type']}]}]}, 'requires-python': {'type': 'string', 'format': 'pep508-versionspec', '$$description': ['`The Python version requirements of the project', '<https://packaging.python.org/specifications/core-metadata/#requires-python>`_.']}, 'license': {'description': '`Project license <https://peps.python.org/pep-0621/#license>`_.', 'oneOf': [{'type': 'string', 'description': 'An SPDX license identifier', 'format': 'SPDX'}, {'type': 'object', 'properties': {'file': {'type': 'string', '$$description': ['Relative path to the file (UTF-8) which contains the license for the', 'project.']}}, 'required': ['file']}, {'type': 'object', 'properties': {'text': {'type': 'string', '$$description': ['The license of the project whose meaning is that of the', '`License field from the core metadata', '<https://packaging.python.org/specifications/core-metadata/#license>`_.']}}, 'required': ['text']}]}, 'license-files': {'description': 'Paths or globs to paths of license files', 'type': 'array', 'items': {'type': 'string'}}, 'authors': {'type': 'array', 'items': {'$id': '#/definitions/author', 'title': 'Author or Maintainer', '$comment': 'https://peps.python.org/pep-0621/#authors-maintainers', 'type': 'object', 'additionalProperties': False, 'properties': {'name': {'type': 'string', '$$description': ['MUST be a valid email name, i.e. whatever can be put as a name, before an', 'email, in :rfc:`822`.']}, 'email': {'type': 'string', 'format': 'idn-email', 'description': 'MUST be a valid email address'}}, 'anyOf': [{'required': ['name']}, {'required': ['email']}]}, '$$description': ["The people or organizations considered to be the 'authors' of the project.", 'The exact meaning is open to interpretation (e.g. original or primary authors,', 'current maintainers, or owners of the package).']}, 'maintainers': {'type': 'array', 'items': {'$id': '#/definitions/author', 'title': 'Author or Maintainer', '$comment': 'https://peps.python.org/pep-0621/#authors-maintainers', 'type': 'object', 'additionalProperties': False, 'properties': {'name': {'type': 'string', '$$description': ['MUST be a valid email name, i.e. whatever can be put as a name, before an', 'email, in :rfc:`822`.']}, 'email': {'type': 'string', 'format': 'idn-email', 'description': 'MUST be a valid email address'}}, 'anyOf': [{'required': ['name']}, {'required': ['email']}]}, '$$description': ["The people or organizations considered to be the 'maintainers' of the project.", 'Similarly to ``authors``, the exact meaning is open to interpretation.']}, 'keywords': {'type': 'array', 'items': {'type': 'string'}, 'description': 'List of keywords to assist searching for the distribution in a larger catalog.'}, 'classifiers': {'type': 'array', 'items': {'type': 'string', 'format': 'trove-classifier', 'description': '`PyPI classifier <https://pypi.org/classifiers/>`_.'}, '$$description': ['`Trove classifiers <https://pypi.org/classifiers/>`_', 'which apply to the project.']}, 'urls': {'type': 'object', 'description': 'URLs associated with the project in the form ``label => value``.', 'additionalProperties': False, 'patternProperties': {'^.+$': {'type': 'string', 'format': 'url'}}}, 'scripts': {'$id': '#/definitions/entry-point-group', 'title': 'Entry-points', 'type': 'object', '$$description': ['Entry-points are grouped together to indicate what sort of capabilities they', 'provide.', 'See the `packaging guides', '<https://packaging.python.org/specifications/entry-points/>`_', 'and `setuptools docs', '<https://setuptools.pypa.io/en/latest/userguide/entry_point.html>`_', 'for more information.'], 'propertyNames': {'format': 'python-entrypoint-name'}, 'additionalProperties': False, 'patternProperties': {'^.+$': {'type': 'string', '$$description': ['Reference to a Python object. It is either in the form', '``importable.module``, or ``importable.module:object.attr``.'], 'format': 'python-entrypoint-reference', '$comment': 'https://packaging.python.org/specifications/entry-points/'}}}, 'gui-scripts': {'$id': '#/definitions/entry-point-group', 'title': 'Entry-points', 'type': 'object', '$$description': ['Entry-points are grouped together to indicate what sort of capabilities they', 'provide.', 'See the `packaging guides', '<https://packaging.python.org/specifications/entry-points/>`_', 'and `setuptools docs', '<https://setuptools.pypa.io/en/latest/userguide/entry_point.html>`_', 'for more information.'], 'propertyNames': {'format': 'python-entrypoint-name'}, 'additionalProperties': False, 'patternProperties': {'^.+$': {'type': 'string', '$$description': ['Reference to a Python object. It is either in the form', '``importable.module``, or ``importable.module:object.attr``.'], 'format': 'python-entrypoint-reference', '$comment': 'https://packaging.python.org/specifications/entry-points/'}}}, 'entry-points': {'$$description': ['Instruct the installer to expose the given modules/functions via', '``entry-point`` discovery mechanism (useful for plugins).', 'More information available in the `Python packaging guide', '<https://packaging.python.org/specifications/entry-points/>`_.'], 'propertyNames': {'format': 'python-entrypoint-group'}, 'additionalProperties': False, 'patternProperties': {'^.+$': {'$id': '#/definitions/entry-point-group', 'title': 'Entry-points', 'type': 'object', '$$description': ['Entry-points are grouped together to indicate what sort of capabilities they', 'provide.', 'See the `packaging guides', '<https://packaging.python.org/specifications/entry-points/>`_', 'and `setuptools docs', '<https://setuptools.pypa.io/en/latest/userguide/entry_point.html>`_', 'for more information.'], 'propertyNames': {'format': 'python-entrypoint-name'}, 'additionalProperties': False, 'patternProperties': {'^.+$': {'type': 'string', '$$description': ['Reference to a Python object. It is either in the form', '``importable.module``, or ``importable.module:object.attr``.'], 'format': 'python-entrypoint-reference', '$comment': 'https://packaging.python.org/specifications/entry-points/'}}}}}, 'dependencies': {'type': 'array', 'description': 'Project (mandatory) dependencies.', 'items': {'$id': '#/definitions/dependency', 'title': 'Dependency', 'type': 'string', 'description': 'Project dependency specification according to PEP 508', 'format': 'pep508'}}, 'optional-dependencies': {'type': 'object', 'description': 'Optional dependency for the project', 'propertyNames': {'format': 'pep508-identifier'}, 'additionalProperties': False, 'patternProperties': {'^.+$': {'type': 'array', 'items': {'$id': '#/definitions/dependency', 'title': 'Dependency', 'type': 'string', 'description': 'Project dependency specification according to PEP 508', 'format': 'pep508'}}}}, 'import-names': {'description': 'Lists import names which a project, when installed, would exclusively provide.', 'type': 'array', 'items': {'type': 'string', 'format': 'import-name'}}, 'import-namespaces': {'description': 'Lists import names that, when installed, would be provided by the project, but not exclusively.', 'type': 'array', 'items': {'type': 'string', 'format': 'import-name'}}, 'dynamic': {'type': 'array', '$$description': ['Specifies which fields are intentionally unspecified and expected to be', 'dynamically provided by build tools'], 'items': {'enum': ['version', 'description', 'readme', 'requires-python', 'license', 'license-files', 'authors', 'maintainers', 'keywords', 'classifiers', 'urls', 'scripts', 'gui-scripts', 'entry-points', 'dependencies', 'optional-dependencies', 'import-names', 'import-namespaces']}}}, 'required': ['name'], 'additionalProperties': False, 'allOf': [{'if': {'not': {'required': ['dynamic'], 'properties': {'dynamic': {'contains': {'const': 'version'}, '$$description': ['version is listed in ``dynamic``']}}}, '$$comment': ['According to :pep:`621`:', '    If the core metadata specification lists a field as "Required", then', '    the metadata MUST specify the field statically or list it in dynamic', 'In turn, `core metadata`_ defines:', '    The required fields are: Metadata-Version, Name, Version.', '    All the other fields are optional.', 'Since ``Metadata-Version`` is defined by the build back-end, ``name`` and', '``version`` are the only mandatory information in ``pyproject.toml``.', '.. _core metadata: https://packaging.python.org/specifications/core-metadata/']}, 'then': {'required': ['version'], '$$description': ['version should be statically defined in the ``version`` field']}}, {'if': {'required': ['license-files']}, 'then': {'properties': {'license': {'type': 'string'}}}}], 'definitions': {'author': {'$id': '#/definitions/author', 'title': 'Author or Maintainer', '$comment': 'https://peps.python.org/pep-0621/#authors-maintainers', 'type': 'object', 'additionalProperties': False, 'properties': {'name': {'type': 'string', '$$description': ['MUST be a valid email name, i.e. whatever can be put as a name, before an', 'email, in :rfc:`822`.']}, 'email': {'type': 'string', 'format': 'idn-email', 'description': 'MUST be a valid email address'}}, 'anyOf': [{'required': ['name']}, {'required': ['email']}]}, 'entry-point-group': {'$id': '#/definitions/entry-point-group', 'title': 'Entry-points', 'type': 'object', '$$description': ['Entry-points are grouped together to indicate what sort of capabilities they', 'provide.', 'See the `packaging guides', '<https://packaging.python.org/specifications/entry-points/>`_', 'and `setuptools docs', '<https://setuptools.pypa.io/en/latest/userguide/entry_point.html>`_', 'for more information.'], 'propertyNames': {'format': 'python-entrypoint-name'}, 'additionalProperties': False, 'patternProperties': {'^.+$': {'type': 'string', '$$description': ['Reference to a Python object. It is either in the form', '``importable.module``, or ``importable.module:object.attr``.'], 'format': 'python-entrypoint-reference', '$comment': 'https://packaging.python.org/specifications/entry-points/'}}}, 'dependency': {'$id': '#/definitions/dependency', 'title': 'Dependency', 'type': 'string', 'description': 'Project dependency specification according to PEP 508', 'format': 'pep508'}}}, rule='required')         data_keys = set(data.keys())@@ -1200,3 +1192,3 @@             if not isinstance(data__authors, (list, tuple)):-                raise JsonSchemaValueException("" + (name_prefix or "data") + ".authors must be array", value=data__authors, name="" + (name_prefix or "data") + ".authors", definition={'type': 'array', 'items': {'$id': '#/definitions/author', 'title': 'Author or Maintainer', '$comment': 'https://peps.python.org/pep-0621/#authors-maintainers', 'type': 'object', 'additionalProperties': False, 'properties': {'name': {'type': 'string', '$$description': ['MUST be a valid email name, i.e. whatever can be put as a name, before an', 'email, in :rfc:`822`.']}, 'email': {'type': 'string', 'format': 'idn-email', 'description': 'MUST be a valid email address'}}}, '$$description': ["The people or organizations considered to be the 'authors' of the project.", 'The exact meaning is open to interpretation (e.g. original or primary authors,', 'current maintainers, or owners of the package).']}, rule='type')+                raise JsonSchemaValueException("" + (name_prefix or "data") + ".authors must be array", value=data__authors, name="" + (name_prefix or "data") + ".authors", definition={'type': 'array', 'items': {'$id': '#/definitions/author', 'title': 'Author or Maintainer', '$comment': 'https://peps.python.org/pep-0621/#authors-maintainers', 'type': 'object', 'additionalProperties': False, 'properties': {'name': {'type': 'string', '$$description': ['MUST be a valid email name, i.e. whatever can be put as a name, before an', 'email, in :rfc:`822`.']}, 'email': {'type': 'string', 'format': 'idn-email', 'description': 'MUST be a valid email address'}}, 'anyOf': [{'required': ['name']}, {'required': ['email']}]}, '$$description': ["The people or organizations considered to be the 'authors' of the project.", 'The exact meaning is open to interpretation (e.g. original or primary authors,', 'current maintainers, or owners of the package).']}, rule='type')             data__authors_is_list = isinstance(data__authors, (list, tuple))@@ -1210,3 +1202,3 @@             if not isinstance(data__maintainers, (list, tuple)):-                raise JsonSchemaValueException("" + (name_prefix or "data") + ".maintainers must be array", value=data__maintainers, name="" + (name_prefix or "data") + ".maintainers", definition={'type': 'array', 'items': {'$id': '#/definitions/author', 'title': 'Author or Maintainer', '$comment': 'https://peps.python.org/pep-0621/#authors-maintainers', 'type': 'object', 'additionalProperties': False, 'properties': {'name': {'type': 'string', '$$description': ['MUST be a valid email name, i.e. whatever can be put as a name, before an', 'email, in :rfc:`822`.']}, 'email': {'type': 'string', 'format': 'idn-email', 'description': 'MUST be a valid email address'}}}, '$$description': ["The people or organizations considered to be the 'maintainers' of the project.", 'Similarly to ``authors``, the exact meaning is open to interpretation.']}, rule='type')+                raise JsonSchemaValueException("" + (name_prefix or "data") + ".maintainers must be array", value=data__maintainers, name="" + (name_prefix or "data") + ".maintainers", definition={'type': 'array', 'items': {'$id': '#/definitions/author', 'title': 'Author or Maintainer', '$comment': 'https://peps.python.org/pep-0621/#authors-maintainers', 'type': 'object', 'additionalProperties': False, 'properties': {'name': {'type': 'string', '$$description': ['MUST be a valid email name, i.e. whatever can be put as a name, before an', 'email, in :rfc:`822`.']}, 'email': {'type': 'string', 'format': 'idn-email', 'description': 'MUST be a valid email address'}}, 'anyOf': [{'required': ['name']}, {'required': ['email']}]}, '$$description': ["The people or organizations considered to be the 'maintainers' of the project.", 'Similarly to ``authors``, the exact meaning is open to interpretation.']}, rule='type')             data__maintainers_is_list = isinstance(data__maintainers, (list, tuple))@@ -1336,2 +1328,30 @@                         raise JsonSchemaValueException("" + (name_prefix or "data") + ".optional-dependencies must be named by propertyName definition", value=data__optionaldependencies, name="" + (name_prefix or "data") + ".optional-dependencies", definition={'type': 'object', 'description': 'Optional dependency for the project', 'propertyNames': {'format': 'pep508-identifier'}, 'additionalProperties': False, 'patternProperties': {'^.+$': {'type': 'array', 'items': {'$id': '#/definitions/dependency', 'title': 'Dependency', 'type': 'string', 'description': 'Project dependency specification according to PEP 508', 'format': 'pep508'}}}}, rule='propertyNames')+        if "import-names" in data_keys:+            data_keys.remove("import-names")+            data__importnames = data["import-names"]+            if not isinstance(data__importnames, (list, tuple)):+                raise JsonSchemaValueException("" + (name_prefix or "data") + ".import-names must be array", value=data__importnames, name="" + (name_prefix or "data") + ".import-names", definition={'description': 'Lists import names which a project, when installed, would exclusively provide.', 'type': 'array', 'items': {'type': 'string', 'format': 'import-name'}}, rule='type')+            data__importnames_is_list = isinstance(data__importnames, (list, tuple))+            if data__importnames_is_list:+                data__importnames_len = len(data__importnames)+                for data__importnames_x, data__importnames_item in enumerate(data__importnames):+                    if not isinstance(data__importnames_item, (str)):+                        raise JsonSchemaValueException("" + (name_prefix or "data") + ".import-names[{data__importnames_x}]".format(**locals()) + " must be string", value=data__importnames_item, name="" + (name_prefix or "data") + ".import-names[{data__importnames_x}]".format(**locals()) + "", definition={'type': 'string', 'format': 'import-name'}, rule='type')+                    if isinstance(data__importnames_item, str):+                        if not custom_formats["import-name"](data__importnames_item):+                            raise JsonSchemaValueException("" + (name_prefix or "data") + ".import-names[{data__importnames_x}]".format(**locals()) + " must be import-name", value=data__importnames_item, name="" + (name_prefix or "data") + ".import-names[{data__importnames_x}]".format(**locals()) + "", definition={'type': 'string', 'format': 'import-name'}, rule='format')+        if "import-namespaces" in data_keys:+            data_keys.remove("import-namespaces")+            data__importnamespaces = data["import-namespaces"]+            if not isinstance(data__importnamespaces, (list, tuple)):+                raise JsonSchemaValueException("" + (name_prefix or "data") + ".import-namespaces must be array", value=data__importnamespaces, name="" + (name_prefix or "data") + ".import-namespaces", definition={'description': 'Lists import names that, when installed, would be provided by the project, but not exclusively.', 'type': 'array', 'items': {'type': 'string', 'format': 'import-name'}}, rule='type')+            data__importnamespaces_is_list = isinstance(data__importnamespaces, (list, tuple))+            if data__importnamespaces_is_list:+                data__importnamespaces_len = len(data__importnamespaces)+                for data__importnamespaces_x, data__importnamespaces_item in enumerate(data__importnamespaces):+                    if not isinstance(data__importnamespaces_item, (str)):+                        raise JsonSchemaValueException("" + (name_prefix or "data") + ".import-namespaces[{data__importnamespaces_x}]".format(**locals()) + " must be string", value=data__importnamespaces_item, name="" + (name_prefix or "data") + ".import-namespaces[{data__importnamespaces_x}]".format(**locals()) + "", definition={'type': 'string', 'format': 'import-name'}, rule='type')+                    if isinstance(data__importnamespaces_item, str):+                        if not custom_formats["import-name"](data__importnamespaces_item):+                            raise JsonSchemaValueException("" + (name_prefix or "data") + ".import-namespaces[{data__importnamespaces_x}]".format(**locals()) + " must be import-name", value=data__importnamespaces_item, name="" + (name_prefix or "data") + ".import-namespaces[{data__importnamespaces_x}]".format(**locals()) + "", definition={'type': 'string', 'format': 'import-name'}, rule='format')         if "dynamic" in data_keys:@@ -1340,3 +1360,3 @@             if not isinstance(data__dynamic, (list, tuple)):-                raise JsonSchemaValueException("" + (name_prefix or "data") + ".dynamic must be array", value=data__dynamic, name="" + (name_prefix or "data") + ".dynamic", definition={'type': 'array', '$$description': ['Specifies which fields are intentionally unspecified and expected to be', 'dynamically provided by build tools'], 'items': {'enum': ['version', 'description', 'readme', 'requires-python', 'license', 'license-files', 'authors', 'maintainers', 'keywords', 'classifiers', 'urls', 'scripts', 'gui-scripts', 'entry-points', 'dependencies', 'optional-dependencies']}}, rule='type')+                raise JsonSchemaValueException("" + (name_prefix or "data") + ".dynamic must be array", value=data__dynamic, name="" + (name_prefix or "data") + ".dynamic", definition={'type': 'array', '$$description': ['Specifies which fields are intentionally unspecified and expected to be', 'dynamically provided by build tools'], 'items': {'enum': ['version', 'description', 'readme', 'requires-python', 'license', 'license-files', 'authors', 'maintainers', 'keywords', 'classifiers', 'urls', 'scripts', 'gui-scripts', 'entry-points', 'dependencies', 'optional-dependencies', 'import-names', 'import-namespaces']}}, rule='type')             data__dynamic_is_list = isinstance(data__dynamic, (list, tuple))@@ -1345,6 +1365,6 @@                 for data__dynamic_x, data__dynamic_item in enumerate(data__dynamic):-                    if data__dynamic_item not in ['version', 'description', 'readme', 'requires-python', 'license', 'license-files', 'authors', 'maintainers', 'keywords', 'classifiers', 'urls', 'scripts', 'gui-scripts', 'entry-points', 'dependencies', 'optional-dependencies']:-                        raise JsonSchemaValueException("" + (name_prefix or "data") + ".dynamic[{data__dynamic_x}]".format(**locals()) + " must be one of ['version', 'description', 'readme', 'requires-python', 'license', 'license-files', 'authors', 'maintainers', 'keywords', 'classifiers', 'urls', 'scripts', 'gui-scripts', 'entry-points', 'dependencies', 'optional-dependencies']", value=data__dynamic_item, name="" + (name_prefix or "data") + ".dynamic[{data__dynamic_x}]".format(**locals()) + "", definition={'enum': ['version', 'description', 'readme', 'requires-python', 'license', 'license-files', 'authors', 'maintainers', 'keywords', 'classifiers', 'urls', 'scripts', 'gui-scripts', 'entry-points', 'dependencies', 'optional-dependencies']}, rule='enum')+                    if data__dynamic_item not in ['version', 'description', 'readme', 'requires-python', 'license', 'license-files', 'authors', 'maintainers', 'keywords', 'classifiers', 'urls', 'scripts', 'gui-scripts', 'entry-points', 'dependencies', 'optional-dependencies', 'import-names', 'import-namespaces']:+                        raise JsonSchemaValueException("" + (name_prefix or "data") + ".dynamic[{data__dynamic_x}]".format(**locals()) + " must be one of ['version', 'description', 'readme', 'requires-python', 'license', 'license-files', 'authors', 'maintainers', 'keywords', 'classifiers', 'urls', 'scripts', 'gui-scripts', 'entry-points', 'dependencies', 'optional-dependencies', 'import-names', 'import-namespaces']", value=data__dynamic_item, name="" + (name_prefix or "data") + ".dynamic[{data__dynamic_x}]".format(**locals()) + "", definition={'enum': ['version', 'description', 'readme', 'requires-python', 'license', 'license-files', 'authors', 'maintainers', 'keywords', 'classifiers', 'urls', 'scripts', 'gui-scripts', 'entry-points', 'dependencies', 'optional-dependencies', 'import-names', 'import-namespaces']}, rule='enum')         if data_keys:-            raise JsonSchemaValueException("" + (name_prefix or "data") + " must not contain "+str(data_keys)+" properties", value=data, name="" + (name_prefix or "data") + "", definition={'$schema': 'http://json-schema.org/draft-07/schema#', '$id': 'https://packaging.python.org/en/latest/specifications/pyproject-toml/', 'title': 'Package metadata stored in the ``project`` table', '$$description': ['Data structure for the **project** table inside ``pyproject.toml``', '(as initially defined in :pep:`621`)'], 'type': 'object', 'properties': {'name': {'type': 'string', 'description': 'The name (primary identifier) of the project. MUST be statically defined.', 'format': 'pep508-identifier'}, 'version': {'type': 'string', 'description': 'The version of the project as supported by :pep:`440`.', 'format': 'pep440'}, 'description': {'type': 'string', '$$description': ['The `summary description of the project', '<https://packaging.python.org/specifications/core-metadata/#summary>`_']}, 'readme': {'$$description': ['`Full/detailed description of the project in the form of a README', '<https://peps.python.org/pep-0621/#readme>`_', "with meaning similar to the one defined in `core metadata's Description", '<https://packaging.python.org/specifications/core-metadata/#description>`_'], 'oneOf': [{'type': 'string', '$$description': ['Relative path to a text file (UTF-8) containing the full description', 'of the project. If the file path ends in case-insensitive ``.md`` or', '``.rst`` suffixes, then the content-type is respectively', '``text/markdown`` or ``text/x-rst``']}, {'type': 'object', 'allOf': [{'anyOf': [{'properties': {'file': {'type': 'string', '$$description': ['Relative path to a text file containing the full description', 'of the project.']}}, 'required': ['file']}, {'properties': {'text': {'type': 'string', 'description': 'Full text describing the project.'}}, 'required': ['text']}]}, {'properties': {'content-type': {'type': 'string', '$$description': ['Content-type (:rfc:`1341`) of the full description', '(e.g. ``text/markdown``). The ``charset`` parameter is assumed', 'UTF-8 when not present.'], '$comment': 'TODO: add regex pattern or format?'}}, 'required': ['content-type']}]}]}, 'requires-python': {'type': 'string', 'format': 'pep508-versionspec', '$$description': ['`The Python version requirements of the project', '<https://packaging.python.org/specifications/core-metadata/#requires-python>`_.']}, 'license': {'description': '`Project license <https://peps.python.org/pep-0621/#license>`_.', 'oneOf': [{'type': 'string', 'description': 'An SPDX license identifier', 'format': 'SPDX'}, {'type': 'object', 'properties': {'file': {'type': 'string', '$$description': ['Relative path to the file (UTF-8) which contains the license for the', 'project.']}}, 'required': ['file']}, {'type': 'object', 'properties': {'text': {'type': 'string', '$$description': ['The license of the project whose meaning is that of the', '`License field from the core metadata', '<https://packaging.python.org/specifications/core-metadata/#license>`_.']}}, 'required': ['text']}]}, 'license-files': {'description': 'Paths or globs to paths of license files', 'type': 'array', 'items': {'type': 'string'}}, 'authors': {'type': 'array', 'items': {'$id': '#/definitions/author', 'title': 'Author or Maintainer', '$comment': 'https://peps.python.org/pep-0621/#authors-maintainers', 'type': 'object', 'additionalProperties': False, 'properties': {'name': {'type': 'string', '$$description': ['MUST be a valid email name, i.e. whatever can be put as a name, before an', 'email, in :rfc:`822`.']}, 'email': {'type': 'string', 'format': 'idn-email', 'description': 'MUST be a valid email address'}}}, '$$description': ["The people or organizations considered to be the 'authors' of the project.", 'The exact meaning is open to interpretation (e.g. original or primary authors,', 'current maintainers, or owners of the package).']}, 'maintainers': {'type': 'array', 'items': {'$id': '#/definitions/author', 'title': 'Author or Maintainer', '$comment': 'https://peps.python.org/pep-0621/#authors-maintainers', 'type': 'object', 'additionalProperties': False, 'properties': {'name': {'type': 'string', '$$description': ['MUST be a valid email name, i.e. whatever can be put as a name, before an', 'email, in :rfc:`822`.']}, 'email': {'type': 'string', 'format': 'idn-email', 'description': 'MUST be a valid email address'}}}, '$$description': ["The people or organizations considered to be the 'maintainers' of the project.", 'Similarly to ``authors``, the exact meaning is open to interpretation.']}, 'keywords': {'type': 'array', 'items': {'type': 'string'}, 'description': 'List of keywords to assist searching for the distribution in a larger catalog.'}, 'classifiers': {'type': 'array', 'items': {'type': 'string', 'format': 'trove-classifier', 'description': '`PyPI classifier <https://pypi.org/classifiers/>`_.'}, '$$description': ['`Trove classifiers <https://pypi.org/classifiers/>`_', 'which apply to the project.']}, 'urls': {'type': 'object', 'description': 'URLs associated with the project in the form ``label => value``.', 'additionalProperties': False, 'patternProperties': {'^.+$': {'type': 'string', 'format': 'url'}}}, 'scripts': {'$id': '#/definitions/entry-point-group', 'title': 'Entry-points', 'type': 'object', '$$description': ['Entry-points are grouped together to indicate what sort of capabilities they', 'provide.', 'See the `packaging guides', '<https://packaging.python.org/specifications/entry-points/>`_', 'and `setuptools docs', '<https://setuptools.pypa.io/en/latest/userguide/entry_point.html>`_', 'for more information.'], 'propertyNames': {'format': 'python-entrypoint-name'}, 'additionalProperties': False, 'patternProperties': {'^.+$': {'type': 'string', '$$description': ['Reference to a Python object. It is either in the form', '``importable.module``, or ``importable.module:object.attr``.'], 'format': 'python-entrypoint-reference', '$comment': 'https://packaging.python.org/specifications/entry-points/'}}}, 'gui-scripts': {'$id': '#/definitions/entry-point-group', 'title': 'Entry-points', 'type': 'object', '$$description': ['Entry-points are grouped together to indicate what sort of capabilities they', 'provide.', 'See the `packaging guides', '<https://packaging.python.org/specifications/entry-points/>`_', 'and `setuptools docs', '<https://setuptools.pypa.io/en/latest/userguide/entry_point.html>`_', 'for more information.'], 'propertyNames': {'format': 'python-entrypoint-name'}, 'additionalProperties': False, 'patternProperties': {'^.+$': {'type': 'string', '$$description': ['Reference to a Python object. It is either in the form', '``importable.module``, or ``importable.module:object.attr``.'], 'format': 'python-entrypoint-reference', '$comment': 'https://packaging.python.org/specifications/entry-points/'}}}, 'entry-points': {'$$description': ['Instruct the installer to expose the given modules/functions via', '``entry-point`` discovery mechanism (useful for plugins).', 'More information available in the `Python packaging guide', '<https://packaging.python.org/specifications/entry-points/>`_.'], 'propertyNames': {'format': 'python-entrypoint-group'}, 'additionalProperties': False, 'patternProperties': {'^.+$': {'$id': '#/definitions/entry-point-group', 'title': 'Entry-points', 'type': 'object', '$$description': ['Entry-points are grouped together to indicate what sort of capabilities they', 'provide.', 'See the `packaging guides', '<https://packaging.python.org/specifications/entry-points/>`_', 'and `setuptools docs', '<https://setuptools.pypa.io/en/latest/userguide/entry_point.html>`_', 'for more information.'], 'propertyNames': {'format': 'python-entrypoint-name'}, 'additionalProperties': False, 'patternProperties': {'^.+$': {'type': 'string', '$$description': ['Reference to a Python object. It is either in the form', '``importable.module``, or ``importable.module:object.attr``.'], 'format': 'python-entrypoint-reference', '$comment': 'https://packaging.python.org/specifications/entry-points/'}}}}}, 'dependencies': {'type': 'array', 'description': 'Project (mandatory) dependencies.', 'items': {'$id': '#/definitions/dependency', 'title': 'Dependency', 'type': 'string', 'description': 'Project dependency specification according to PEP 508', 'format': 'pep508'}}, 'optional-dependencies': {'type': 'object', 'description': 'Optional dependency for the project', 'propertyNames': {'format': 'pep508-identifier'}, 'additionalProperties': False, 'patternProperties': {'^.+$': {'type': 'array', 'items': {'$id': '#/definitions/dependency', 'title': 'Dependency', 'type': 'string', 'description': 'Project dependency specification according to PEP 508', 'format': 'pep508'}}}}, 'dynamic': {'type': 'array', '$$description': ['Specifies which fields are intentionally unspecified and expected to be', 'dynamically provided by build tools'], 'items': {'enum': ['version', 'description', 'readme', 'requires-python', 'license', 'license-files', 'authors', 'maintainers', 'keywords', 'classifiers', 'urls', 'scripts', 'gui-scripts', 'entry-points', 'dependencies', 'optional-dependencies']}}}, 'required': ['name'], 'additionalProperties': False, 'allOf': [{'if': {'not': {'required': ['dynamic'], 'properties': {'dynamic': {'contains': {'const': 'version'}, '$$description': ['version is listed in ``dynamic``']}}}, '$$comment': ['According to :pep:`621`:', '    If the core metadata specification lists a field as "Required", then', '    the metadata MUST specify the field statically or list it in dynamic', 'In turn, `core metadata`_ defines:', '    The required fields are: Metadata-Version, Name, Version.', '    All the other fields are optional.', 'Since ``Metadata-Version`` is defined by the build back-end, ``name`` and', '``version`` are the only mandatory information in ``pyproject.toml``.', '.. _core metadata: https://packaging.python.org/specifications/core-metadata/']}, 'then': {'required': ['version'], '$$description': ['version should be statically defined in the ``version`` field']}}, {'if': {'required': ['license-files']}, 'then': {'properties': {'license': {'type': 'string'}}}}], 'definitions': {'author': {'$id': '#/definitions/author', 'title': 'Author or Maintainer', '$comment': 'https://peps.python.org/pep-0621/#authors-maintainers', 'type': 'object', 'additionalProperties': False, 'properties': {'name': {'type': 'string', '$$description': ['MUST be a valid email name, i.e. whatever can be put as a name, before an', 'email, in :rfc:`822`.']}, 'email': {'type': 'string', 'format': 'idn-email', 'description': 'MUST be a valid email address'}}}, 'entry-point-group': {'$id': '#/definitions/entry-point-group', 'title': 'Entry-points', 'type': 'object', '$$description': ['Entry-points are grouped together to indicate what sort of capabilities they', 'provide.', 'See the `packaging guides', '<https://packaging.python.org/specifications/entry-points/>`_', 'and `setuptools docs', '<https://setuptools.pypa.io/en/latest/userguide/entry_point.html>`_', 'for more information.'], 'propertyNames': {'format': 'python-entrypoint-name'}, 'additionalProperties': False, 'patternProperties': {'^.+$': {'type': 'string', '$$description': ['Reference to a Python object. It is either in the form', '``importable.module``, or ``importable.module:object.attr``.'], 'format': 'python-entrypoint-reference', '$comment': 'https://packaging.python.org/specifications/entry-points/'}}}, 'dependency': {'$id': '#/definitions/dependency', 'title': 'Dependency', 'type': 'string', 'description': 'Project dependency specification according to PEP 508', 'format': 'pep508'}}}, rule='additionalProperties')+            raise JsonSchemaValueException("" + (name_prefix or "data") + " must not contain "+str(data_keys)+" properties", value=data, name="" + (name_prefix or "data") + "", definition={'$schema': 'http://json-schema.org/draft-07/schema#', '$id': 'https://packaging.python.org/en/latest/specifications/pyproject-toml/', 'title': 'Package metadata stored in the ``project`` table', '$$description': ['Data structure for the **project** table inside ``pyproject.toml``', '(as initially defined in :pep:`621`)'], 'type': 'object', 'properties': {'name': {'type': 'string', 'description': 'The name (primary identifier) of the project. MUST be statically defined.', 'format': 'pep508-identifier'}, 'version': {'type': 'string', 'description': 'The version of the project as supported by :pep:`440`.', 'format': 'pep440'}, 'description': {'type': 'string', '$$description': ['The `summary description of the project', '<https://packaging.python.org/specifications/core-metadata/#summary>`_']}, 'readme': {'$$description': ['`Full/detailed description of the project in the form of a README', '<https://peps.python.org/pep-0621/#readme>`_', "with meaning similar to the one defined in `core metadata's Description", '<https://packaging.python.org/specifications/core-metadata/#description>`_'], 'oneOf': [{'type': 'string', '$$description': ['Relative path to a text file (UTF-8) containing the full description', 'of the project. If the file path ends in case-insensitive ``.md`` or', '``.rst`` suffixes, then the content-type is respectively', '``text/markdown`` or ``text/x-rst``']}, {'type': 'object', 'allOf': [{'anyOf': [{'properties': {'file': {'type': 'string', '$$description': ['Relative path to a text file containing the full description', 'of the project.']}}, 'required': ['file']}, {'properties': {'text': {'type': 'string', 'description': 'Full text describing the project.'}}, 'required': ['text']}]}, {'properties': {'content-type': {'type': 'string', '$$description': ['Content-type (:rfc:`1341`) of the full description', '(e.g. ``text/markdown``). The ``charset`` parameter is assumed', 'UTF-8 when not present.'], '$comment': 'TODO: add regex pattern or format?'}}, 'required': ['content-type']}]}]}, 'requires-python': {'type': 'string', 'format': 'pep508-versionspec', '$$description': ['`The Python version requirements of the project', '<https://packaging.python.org/specifications/core-metadata/#requires-python>`_.']}, 'license': {'description': '`Project license <https://peps.python.org/pep-0621/#license>`_.', 'oneOf': [{'type': 'string', 'description': 'An SPDX license identifier', 'format': 'SPDX'}, {'type': 'object', 'properties': {'file': {'type': 'string', '$$description': ['Relative path to the file (UTF-8) which contains the license for the', 'project.']}}, 'required': ['file']}, {'type': 'object', 'properties': {'text': {'type': 'string', '$$description': ['The license of the project whose meaning is that of the', '`License field from the core metadata', '<https://packaging.python.org/specifications/core-metadata/#license>`_.']}}, 'required': ['text']}]}, 'license-files': {'description': 'Paths or globs to paths of license files', 'type': 'array', 'items': {'type': 'string'}}, 'authors': {'type': 'array', 'items': {'$id': '#/definitions/author', 'title': 'Author or Maintainer', '$comment': 'https://peps.python.org/pep-0621/#authors-maintainers', 'type': 'object', 'additionalProperties': False, 'properties': {'name': {'type': 'string', '$$description': ['MUST be a valid email name, i.e. whatever can be put as a name, before an', 'email, in :rfc:`822`.']}, 'email': {'type': 'string', 'format': 'idn-email', 'description': 'MUST be a valid email address'}}, 'anyOf': [{'required': ['name']}, {'required': ['email']}]}, '$$description': ["The people or organizations considered to be the 'authors' of the project.", 'The exact meaning is open to interpretation (e.g. original or primary authors,', 'current maintainers, or owners of the package).']}, 'maintainers': {'type': 'array', 'items': {'$id': '#/definitions/author', 'title': 'Author or Maintainer', '$comment': 'https://peps.python.org/pep-0621/#authors-maintainers', 'type': 'object', 'additionalProperties': False, 'properties': {'name': {'type': 'string', '$$description': ['MUST be a valid email name, i.e. whatever can be put as a name, before an', 'email, in :rfc:`822`.']}, 'email': {'type': 'string', 'format': 'idn-email', 'description': 'MUST be a valid email address'}}, 'anyOf': [{'required': ['name']}, {'required': ['email']}]}, '$$description': ["The people or organizations considered to be the 'maintainers' of the project.", 'Similarly to ``authors``, the exact meaning is open to interpretation.']}, 'keywords': {'type': 'array', 'items': {'type': 'string'}, 'description': 'List of keywords to assist searching for the distribution in a larger catalog.'}, 'classifiers': {'type': 'array', 'items': {'type': 'string', 'format': 'trove-classifier', 'description': '`PyPI classifier <https://pypi.org/classifiers/>`_.'}, '$$description': ['`Trove classifiers <https://pypi.org/classifiers/>`_', 'which apply to the project.']}, 'urls': {'type': 'object', 'description': 'URLs associated with the project in the form ``label => value``.', 'additionalProperties': False, 'patternProperties': {'^.+$': {'type': 'string', 'format': 'url'}}}, 'scripts': {'$id': '#/definitions/entry-point-group', 'title': 'Entry-points', 'type': 'object', '$$description': ['Entry-points are grouped together to indicate what sort of capabilities they', 'provide.', 'See the `packaging guides', '<https://packaging.python.org/specifications/entry-points/>`_', 'and `setuptools docs', '<https://setuptools.pypa.io/en/latest/userguide/entry_point.html>`_', 'for more information.'], 'propertyNames': {'format': 'python-entrypoint-name'}, 'additionalProperties': False, 'patternProperties': {'^.+$': {'type': 'string', '$$description': ['Reference to a Python object. It is either in the form', '``importable.module``, or ``importable.module:object.attr``.'], 'format': 'python-entrypoint-reference', '$comment': 'https://packaging.python.org/specifications/entry-points/'}}}, 'gui-scripts': {'$id': '#/definitions/entry-point-group', 'title': 'Entry-points', 'type': 'object', '$$description': ['Entry-points are grouped together to indicate what sort of capabilities they', 'provide.', 'See the `packaging guides', '<https://packaging.python.org/specifications/entry-points/>`_', 'and `setuptools docs', '<https://setuptools.pypa.io/en/latest/userguide/entry_point.html>`_', 'for more information.'], 'propertyNames': {'format': 'python-entrypoint-name'}, 'additionalProperties': False, 'patternProperties': {'^.+$': {'type': 'string', '$$description': ['Reference to a Python object. It is either in the form', '``importable.module``, or ``importable.module:object.attr``.'], 'format': 'python-entrypoint-reference', '$comment': 'https://packaging.python.org/specifications/entry-points/'}}}, 'entry-points': {'$$description': ['Instruct the installer to expose the given modules/functions via', '``entry-point`` discovery mechanism (useful for plugins).', 'More information available in the `Python packaging guide', '<https://packaging.python.org/specifications/entry-points/>`_.'], 'propertyNames': {'format': 'python-entrypoint-group'}, 'additionalProperties': False, 'patternProperties': {'^.+$': {'$id': '#/definitions/entry-point-group', 'title': 'Entry-points', 'type': 'object', '$$description': ['Entry-points are grouped together to indicate what sort of capabilities they', 'provide.', 'See the `packaging guides', '<https://packaging.python.org/specifications/entry-points/>`_', 'and `setuptools docs', '<https://setuptools.pypa.io/en/latest/userguide/entry_point.html>`_', 'for more information.'], 'propertyNames': {'format': 'python-entrypoint-name'}, 'additionalProperties': False, 'patternProperties': {'^.+$': {'type': 'string', '$$description': ['Reference to a Python object. It is either in the form', '``importable.module``, or ``importable.module:object.attr``.'], 'format': 'python-entrypoint-reference', '$comment': 'https://packaging.python.org/specifications/entry-points/'}}}}}, 'dependencies': {'type': 'array', 'description': 'Project (mandatory) dependencies.', 'items': {'$id': '#/definitions/dependency', 'title': 'Dependency', 'type': 'string', 'description': 'Project dependency specification according to PEP 508', 'format': 'pep508'}}, 'optional-dependencies': {'type': 'object', 'description': 'Optional dependency for the project', 'propertyNames': {'format': 'pep508-identifier'}, 'additionalProperties': False, 'patternProperties': {'^.+$': {'type': 'array', 'items': {'$id': '#/definitions/dependency', 'title': 'Dependency', 'type': 'string', 'description': 'Project dependency specification according to PEP 508', 'format': 'pep508'}}}}, 'import-names': {'description': 'Lists import names which a project, when installed, would exclusively provide.', 'type': 'array', 'items': {'type': 'string', 'format': 'import-name'}}, 'import-namespaces': {'description': 'Lists import names that, when installed, would be provided by the project, but not exclusively.', 'type': 'array', 'items': {'type': 'string', 'format': 'import-name'}}, 'dynamic': {'type': 'array', '$$description': ['Specifies which fields are intentionally unspecified and expected to be', 'dynamically provided by build tools'], 'items': {'enum': ['version', 'description', 'readme', 'requires-python', 'license', 'license-files', 'authors', 'maintainers', 'keywords', 'classifiers', 'urls', 'scripts', 'gui-scripts', 'entry-points', 'dependencies', 'optional-dependencies', 'import-names', 'import-namespaces']}}}, 'required': ['name'], 'additionalProperties': False, 'allOf': [{'if': {'not': {'required': ['dynamic'], 'properties': {'dynamic': {'contains': {'const': 'version'}, '$$description': ['version is listed in ``dynamic``']}}}, '$$comment': ['According to :pep:`621`:', '    If the core metadata specification lists a field as "Required", then', '    the metadata MUST specify the field statically or list it in dynamic', 'In turn, `core metadata`_ defines:', '    The required fields are: Metadata-Version, Name, Version.', '    All the other fields are optional.', 'Since ``Metadata-Version`` is defined by the build back-end, ``name`` and', '``version`` are the only mandatory information in ``pyproject.toml``.', '.. _core metadata: https://packaging.python.org/specifications/core-metadata/']}, 'then': {'required': ['version'], '$$description': ['version should be statically defined in the ``version`` field']}}, {'if': {'required': ['license-files']}, 'then': {'properties': {'license': {'type': 'string'}}}}], 'definitions': {'author': {'$id': '#/definitions/author', 'title': 'Author or Maintainer', '$comment': 'https://peps.python.org/pep-0621/#authors-maintainers', 'type': 'object', 'additionalProperties': False, 'properties': {'name': {'type': 'string', '$$description': ['MUST be a valid email name, i.e. whatever can be put as a name, before an', 'email, in :rfc:`822`.']}, 'email': {'type': 'string', 'format': 'idn-email', 'description': 'MUST be a valid email address'}}, 'anyOf': [{'required': ['name']}, {'required': ['email']}]}, 'entry-point-group': {'$id': '#/definitions/entry-point-group', 'title': 'Entry-points', 'type': 'object', '$$description': ['Entry-points are grouped together to indicate what sort of capabilities they', 'provide.', 'See the `packaging guides', '<https://packaging.python.org/specifications/entry-points/>`_', 'and `setuptools docs', '<https://setuptools.pypa.io/en/latest/userguide/entry_point.html>`_', 'for more information.'], 'propertyNames': {'format': 'python-entrypoint-name'}, 'additionalProperties': False, 'patternProperties': {'^.+$': {'type': 'string', '$$description': ['Reference to a Python object. It is either in the form', '``importable.module``, or ``importable.module:object.attr``.'], 'format': 'python-entrypoint-reference', '$comment': 'https://packaging.python.org/specifications/entry-points/'}}}, 'dependency': {'$id': '#/definitions/dependency', 'title': 'Dependency', 'type': 'string', 'description': 'Project dependency specification according to PEP 508', 'format': 'pep508'}}}, rule='additionalProperties')     return data@@ -1392,3 +1412,24 @@     if not isinstance(data, (dict)):-        raise JsonSchemaValueException("" + (name_prefix or "data") + " must be object", value=data, name="" + (name_prefix or "data") + "", definition={'$id': '#/definitions/author', 'title': 'Author or Maintainer', '$comment': 'https://peps.python.org/pep-0621/#authors-maintainers', 'type': 'object', 'additionalProperties': False, 'properties': {'name': {'type': 'string', '$$description': ['MUST be a valid email name, i.e. whatever can be put as a name, before an', 'email, in :rfc:`822`.']}, 'email': {'type': 'string', 'format': 'idn-email', 'description': 'MUST be a valid email address'}}}, rule='type')+        raise JsonSchemaValueException("" + (name_prefix or "data") + " must be object", value=data, name="" + (name_prefix or "data") + "", definition={'$id': '#/definitions/author', 'title': 'Author or Maintainer', '$comment': 'https://peps.python.org/pep-0621/#authors-maintainers', 'type': 'object', 'additionalProperties': False, 'properties': {'name': {'type': 'string', '$$description': ['MUST be a valid email name, i.e. whatever can be put as a name, before an', 'email, in :rfc:`822`.']}, 'email': {'type': 'string', 'format': 'idn-email', 'description': 'MUST be a valid email address'}}, 'anyOf': [{'required': ['name']}, {'required': ['email']}]}, rule='type')+    data_any_of_count15 = 0+    if not data_any_of_count15:+        try:+            data_is_dict = isinstance(data, dict)+            if data_is_dict:+                data__missing_keys = set(['name']) - data.keys()+                if data__missing_keys:+                    raise JsonSchemaValueException("" + (name_prefix or "data") + " must contain " + (str(sorted(data__missing_keys)) + " properties"), value=data, name="" + (name_prefix or "data") + "", definition={'required': ['name']}, rule='required')+            data_any_of_count15 += 1+        except JsonSchemaValueException: pass+    if not data_any_of_count15:+        try:+            data_is_dict = isinstance(data, dict)+            if data_is_dict:+                data__missing_keys = set(['email']) - data.keys()+                if data__missing_keys:+                    raise JsonSchemaValueException("" + (name_prefix or "data") + " must contain " + (str(sorted(data__missing_keys)) + " properties"), value=data, name="" + (name_prefix or "data") + "", definition={'required': ['email']}, rule='required')+            data_any_of_count15 += 1+        except JsonSchemaValueException: pass+    if not data_any_of_count15:+        raise JsonSchemaValueException("" + (name_prefix or "data") + " cannot be validated by any definition", value=data, name="" + (name_prefix or "data") + "", definition={'$id': '#/definitions/author', 'title': 'Author or Maintainer', '$comment': 'https://peps.python.org/pep-0621/#authors-maintainers', 'type': 'object', 'additionalProperties': False, 'properties': {'name': {'type': 'string', '$$description': ['MUST be a valid email name, i.e. whatever can be put as a name, before an', 'email, in :rfc:`822`.']}, 'email': {'type': 'string', 'format': 'idn-email', 'description': 'MUST be a valid email address'}}, 'anyOf': [{'required': ['name']}, {'required': ['email']}]}, rule='anyOf')     data_is_dict = isinstance(data, dict)@@ -1410,3 +1451,3 @@         if data_keys:-            raise JsonSchemaValueException("" + (name_prefix or "data") + " must not contain "+str(data_keys)+" properties", value=data, name="" + (name_prefix or "data") + "", definition={'$id': '#/definitions/author', 'title': 'Author or Maintainer', '$comment': 'https://peps.python.org/pep-0621/#authors-maintainers', 'type': 'object', 'additionalProperties': False, 'properties': {'name': {'type': 'string', '$$description': ['MUST be a valid email name, i.e. whatever can be put as a name, before an', 'email, in :rfc:`822`.']}, 'email': {'type': 'string', 'format': 'idn-email', 'description': 'MUST be a valid email address'}}}, rule='additionalProperties')+            raise JsonSchemaValueException("" + (name_prefix or "data") + " must not contain "+str(data_keys)+" properties", value=data, name="" + (name_prefix or "data") + "", definition={'$id': '#/definitions/author', 'title': 'Author or Maintainer', '$comment': 'https://peps.python.org/pep-0621/#authors-maintainers', 'type': 'object', 'additionalProperties': False, 'properties': {'name': {'type': 'string', '$$description': ['MUST be a valid email name, i.e. whatever can be put as a name, before an', 'email, in :rfc:`822`.']}, 'email': {'type': 'string', 'format': 'idn-email', 'description': 'MUST be a valid email address'}}, 'anyOf': [{'required': ['name']}, {'required': ['email']}]}, rule='additionalProperties')     return data
urllib3 pypi
2.7.0 24d ago incident on record
critical-tier YANK ×4BURST ×3
latest 2.7.0 versions 108 maintainers 1 critical-tier (snapshotted)
2.2.2
1.26.19
1.26.20
2.2.3
2.3.0
2.4.0
2.5.0
2.6.0
2.6.1
2.6.2
2.6.3
2.7.0
YANK
1.25 marked yanked (still downloadable)
high · registry-verified · 2019-04-22 · 7y ago
YANK
1.25.1 marked yanked (still downloadable)
high · registry-verified · 2019-04-24 · 7y ago
YANK
2.0.0 marked yanked (still downloadable)
high · registry-verified · 2023-04-26 · 3y ago
YANK
2.0.1 marked yanked (still downloadable)
high · registry-verified · 2023-04-30 · 3y ago
BURST
2 releases in 2m: 1.9.1, 1.10
info · registry-verified · 2014-12-14 · 11y ago
BURST
2 releases in 0m: 1.26.17, 2.0.6
info · registry-verified · 2023-10-02 · 2y ago
BURST
2 releases in 0m: 2.0.7, 1.26.18
info · registry-verified · 2023-10-17 · 2y ago
release diff 2.6.3 → 2.7.0
+0 added · -0 removed · ~40 modified
+9 more files not shown
src/urllib3/connection.py +4 lines · 2 flagged
--- +++ @@ -533,4 +533,4 @@             "HTTPConnection.request_chunked() is deprecated and will be removed "-            "in urllib3 v2.1.0. Instead use HTTPConnection.request(..., chunked=True).",-            category=DeprecationWarning,+            "in urllib3 v3.0. Instead use HTTPConnection.request(..., chunked=True).",+            category=FutureWarning,             stacklevel=2,@@ -699,5 +699,5 @@             "HTTPSConnection.set_cert() is deprecated and will be removed "-            "in urllib3 v2.1.0. Instead provide the parameters to the "+            "in urllib3 v3.0. Instead provide the parameters to the "             "HTTPSConnection constructor.",-            category=DeprecationWarning,+            category=FutureWarning,             stacklevel=2,
src/urllib3/connectionpool.py +23 lines · 1 flagged
--- +++ @@ -218,4 +218,4 @@             # Enable Nagle's algorithm for proxies, to avoid packet fragmentation.-            # We cannot know if the user has added default socket options, so we cannot replace the-            # list.+            # Defaulting `socket_options` to an empty list avoids it defaulting to+            # ``HTTPConnection.default_socket_options``.             self.conn_kw.setdefault("socket_options", [])@@ -704,4 +704,11 @@         """-        parsed_url = parse_url(url)-        destination_scheme = parsed_url.scheme+        # Ensure that the URL we're connecting to is properly encoded+        if url.startswith("/"):+            # URLs starting with / are inherently schemeless.+            url = to_str(_encode_target(url))+            destination_scheme = None+        else:+            parsed_url = parse_url(url)+            destination_scheme = parsed_url.scheme+            url = to_str(parsed_url.url) @@ -719,8 +726,2 @@             raise HostChangedError(self, url, retries)--        # Ensure that the URL we're connecting to is properly encoded-        if url.startswith("/"):-            url = to_str(_encode_target(url))-        else:-            url = to_str(parsed_url.url) @@ -897,2 +898,14 @@                 headers = HTTPHeaderDict(headers)._prepare_for_method_change()++            # Strip headers marked as unsafe to forward to the redirected location.+            # Check remove_headers_on_redirect to avoid a potential network call within+            # self.is_same_host() which may use socket.gethostbyname() in the future.+            if retries.remove_headers_on_redirect and not self.is_same_host(+                redirect_location+            ):+                new_headers = headers.copy()  # type: ignore[union-attr]+                for header in headers:+                    if header.lower() in retries.remove_headers_on_redirect:+                        new_headers.pop(header, None)+                headers = new_headers 
src/urllib3/contrib/socks.py +1 lines · 1 flagged
--- +++ @@ -143,3 +143,3 @@                     )-            else:+            else:  # Defensive: see https://github.com/urllib3/urllib3/pull/3728#pullrequestreview-3816302703                 raise NewConnectionError(
src/urllib3/exceptions.py +2 lines · 1 flagged
--- +++ @@ -157,4 +157,4 @@             "The 'pool' property is deprecated and will be removed "-            "in urllib3 v2.1.0. Use 'conn' instead.",-            DeprecationWarning,+            "in urllib3 v3.0. Use 'conn' instead.",+            FutureWarning,             stacklevel=2,
src/urllib3/fields.py +14 lines · 9 flagged
--- +++ @@ -47,3 +47,3 @@     .. deprecated:: 2.0.0-        Will be removed in urllib3 v2.1.0. This is not valid for+        Will be removed in urllib3 v3.0. This is not valid for         ``multipart/form-data`` header parameters.@@ -53,6 +53,6 @@     warnings.warn(-        "'format_header_param_rfc2231' is deprecated and will be "-        "removed in urllib3 v2.1.0. This is not valid for "+        "'format_header_param_rfc2231' is insecure, deprecated and will be "+        "removed in urllib3 v3.0. This is not valid for "         "multipart/form-data header parameters.",-        DeprecationWarning,+        FutureWarning,         stacklevel=2,@@ -106,3 +106,3 @@         ``format_header_param``. The old names will be removed in-        urllib3 v2.1.0.+        urllib3 v3.0.     """@@ -120,3 +120,3 @@         Renamed to :func:`format_multipart_header_param`. Will be-        removed in urllib3 v2.1.0.+        removed in urllib3 v3.0.     """@@ -127,4 +127,4 @@         "'format_multipart_header_param'. The old name will be "-        "removed in urllib3 v2.1.0.",-        DeprecationWarning,+        "removed in urllib3 v3.0.",+        FutureWarning,         stacklevel=2,@@ -138,3 +138,3 @@         Renamed to :func:`format_multipart_header_param`. Will be-        removed in urllib3 v2.1.0.+        removed in urllib3 v3.0.     """@@ -145,4 +145,4 @@         "'format_multipart_header_param'. The old name will be "-        "removed in urllib3 v2.1.0.",-        DeprecationWarning,+        "removed in urllib3 v3.0.",+        FutureWarning,         stacklevel=2,@@ -167,3 +167,3 @@         The ``header_formatter`` parameter is deprecated and will-        be removed in urllib3 v2.1.0.+        be removed in urllib3 v3.0.     """@@ -190,4 +190,4 @@                 "The 'header_formatter' parameter is deprecated and "-                "will be removed in urllib3 v2.1.0.",-                DeprecationWarning,+                "will be removed in urllib3 v3.0.",+                FutureWarning,                 stacklevel=2,
src/urllib3/poolmanager.py +9 lines · 2 flagged
--- +++ @@ -330,4 +330,4 @@                 "The 'strict' parameter is no longer needed on Python 3+. "-                "This will raise an error in urllib3 v2.1.0.",-                DeprecationWarning,+                "This will raise an error in urllib3 v3.0.",+                FutureWarning,             )@@ -438,6 +438,6 @@                 "URLs without a scheme (ie 'https://') are deprecated and will raise an error "-                "in a future version of urllib3. To avoid this DeprecationWarning ensure all URLs "+                "in urllib3 v3.0. To avoid this FutureWarning ensure all URLs "                 "start with 'https://' or 'http://'. Read more in this issue: "                 "https://github.com/urllib3/urllib3/issues/2920",-                category=DeprecationWarning,+                category=FutureWarning,                 stacklevel=2,@@ -546,5 +546,6 @@ -        resp1 = proxy.request("GET", "https://google.com/")-        resp2 = proxy.request("GET", "https://httpbin.org/")-+        resp1 = proxy.request("GET", "http://google.com/")+        resp2 = proxy.request("GET", "http://httpbin.org/")++        # One pool was shared by both plain HTTP requests.         print(len(proxy.pools))@@ -555,2 +556,3 @@ +        # A separate pool was added for each HTTPS target.         print(len(proxy.pools))
src/urllib3/response.py +35 lines · 1 flagged
--- +++ @@ -665,3 +665,3 @@     # Compatibility methods for `io` module-    def readinto(self, b: bytearray) -> int:+    def readinto(self, b: bytearray | memoryview[int]) -> int:         temp = self.read(len(b))@@ -757,2 +757,3 @@         self._body = None+        self._uncached_read_occurred = False         self._fp: _HttplibHTTPResponse | None = None@@ -799,9 +800,10 @@         try:-            self.read(-                # Do not spend resources decoding the content unless-                # decoding has already been initiated.-                decode_content=self._has_decoded_content,-            )+            self._raw_read()         except (HTTPError, OSError, BaseSSLError, HTTPException):             pass+        if self._has_decoded_content:+            # `_raw_read` skips decompression, so we should clean up the+            # decoder to avoid keeping unnecessary data in memory.+            self._decoded_buffer = BytesQueueBuffer()+            self._decoder = None @@ -828,3 +830,3 @@         Obtain the number of bytes pulled over the wire so far. May differ from-        the amount of content returned by :meth:``urllib3.response.HTTPResponse.read``+        the amount of content returned by :meth:`HTTPResponse.read`         if bytes are encoded on the wire (e.g, compressed).@@ -910,8 +912,4 @@             except BaseSSLError as e:-                # FIXME: Is there a better way to differentiate between SSLErrors?-                if "read operation timed out" not in str(e):-                    # SSL errors related to framing/MAC get wrapped and reraised here-                    raise SSLError(e) from e--                raise ReadTimeoutError(self._pool, None, "Read timed out.") from e  # type: ignore[arg-type]+                # SSL errors related to framing/MAC get wrapped and reraised here+                raise SSLError(e) from e @@ -968,7 +966,3 @@ -        The known cases:-          * CPython < 3.9.7 because of a bug-            https://github.com/urllib3/urllib3/issues/2513#issuecomment-1152559900.-          * urllib3 injected with pyOpenSSL-backed SSL-support.-          * CPython < 3.10 only when `amt` does not fit 32-bit int.+        This happens to urllib3 injected with pyOpenSSL-backed SSL-support.         """@@ -983,3 +977,3 @@             )-        ) and (util.IS_PYOPENSSL or sys.version_info < (3, 10)):+        ) and util.IS_PYOPENSSL:             if read1:@@ -1100,3 +1094,7 @@ -            if self._decoder and self._decoder.has_unconsumed_tail:+            if (+                self._decoder+                and self._decoder.has_unconsumed_tail+                and len(self._decoded_buffer) < amt+            ):                 decoded_data = self._decode(@@ -1112,2 +1110,4 @@         data = self._raw_read(amt)+        if not cache_content:+            self._uncached_read_occurred = True @@ -1124,3 +1124,9 @@             data = self._decode(data, decode_content, flush_decoder)-            if cache_content:+            # It's possible that there is buffered decoded data after a+            # partial read.+            if decode_content and len(self._decoded_buffer) > 0:+                self._decoded_buffer.put(data)+                data = self._decoded_buffer.get_all()++            if cache_content and not self._uncached_read_occurred:                 self._body = data@@ -1212,2 +1218,3 @@         data = self._raw_read(amt, read1=True)+        self._uncached_read_occurred = True         if not decode_content or data is None:@@ -1248,2 +1255,5 @@         """+        if amt == 0:+            return+         if self.chunked and self.supports_chunked_reads():@@ -1407,3 +1417,5 @@ -            if amt and amt < 0:+            if amt == 0:+                return+            elif amt and amt < 0:                 # Negative numbers and `None` should be treated the same,@@ -1418,2 +1430,3 @@                     self._update_chunk_length()+                    self._uncached_read_occurred = True                     if self.chunk_left == 0:
src/urllib3/util/ssl_.py +11 lines · 1 flagged
--- +++ @@ -29,34 +29,4 @@ -def _is_bpo_43522_fixed(-    implementation_name: str,-    version_info: _TYPE_VERSION_INFO,-    pypy_version_info: _TYPE_VERSION_INFO | None,-) -> bool:-    """Return True for CPython 3.9.3+ or 3.10+ and PyPy 7.3.8+ where-    setting SSLContext.hostname_checks_common_name to False works.--    Outside of CPython and PyPy we don't know which implementations work-    or not so we conservatively use our hostname matching as we know that works-    on all implementations.--    https://github.com/urllib3/urllib3/issues/2192#issuecomment-821832963-    https://foss.heptapod.net/pypy/pypy/-/issues/3539-    """-    if implementation_name == "pypy":-        # https://foss.heptapod.net/pypy/pypy/-/issues/3129-        return pypy_version_info >= (7, 3, 8)  # type: ignore[operator]-    elif implementation_name == "cpython":-        major_minor = version_info[:2]-        micro = version_info[2]-        return (major_minor == (3, 9) and micro >= 3) or major_minor >= (3, 10)-    else:  # Defensive:-        return False-- def _is_has_never_check_common_name_reliable(     openssl_version: str,-    openssl_version_number: int,-    implementation_name: str,-    version_info: _TYPE_VERSION_INFO,-    pypy_version_info: _TYPE_VERSION_INFO | None, ) -> bool:@@ -65,12 +35,4 @@     is_openssl = openssl_version.startswith("OpenSSL ")-    # Before fixing OpenSSL issue #14579, the SSL_new() API was not copying hostflags-    # like X509_CHECK_FLAG_NEVER_CHECK_SUBJECT, which tripped up CPython.-    # https://github.com/openssl/openssl/issues/14579-    # This was released in OpenSSL 1.1.1l+ (>=0x101010cf)-    is_openssl_issue_14579_fixed = openssl_version_number >= 0x101010CF--    return is_openssl and (-        is_openssl_issue_14579_fixed-        or _is_bpo_43522_fixed(implementation_name, version_info, pypy_version_info)-    )++    return is_openssl @@ -100,5 +62,5 @@         OPENSSL_VERSION,-        OPENSSL_VERSION_NUMBER,         PROTOCOL_TLS,         PROTOCOL_TLS_CLIENT,+        VERIFY_X509_PARTIAL_CHAIN,         VERIFY_X509_STRICT,@@ -112,14 +74,7 @@ -    # Needed for Python 3.9 which does not define this-    VERIFY_X509_PARTIAL_CHAIN = getattr(ssl, "VERIFY_X509_PARTIAL_CHAIN", 0x80000)--    # Setting SSLContext.hostname_checks_common_name = False didn't work before CPython-    # 3.9.3, and 3.10 (but OK on PyPy) or OpenSSL 1.1.1l++    # Setting SSLContext.hostname_checks_common_name = False didn't work with+    # LibreSSL, check details in the used function.     if HAS_NEVER_CHECK_COMMON_NAME and not _is_has_never_check_common_name_reliable(         OPENSSL_VERSION,-        OPENSSL_VERSION_NUMBER,-        sys.implementation.name,-        sys.version_info,-        sys.pypy_version_info if sys.implementation.name == "pypy" else None,  # type: ignore[attr-defined]-    ):  # Defensive: for Python < 3.9.3+    ):  # Defensive:         HAS_NEVER_CHECK_COMMON_NAME = False@@ -144,3 +99,3 @@     PROTOCOL_TLS_CLIENT = 16  # type: ignore[assignment, misc]-    VERIFY_X509_PARTIAL_CHAIN = 0x80000+    VERIFY_X509_PARTIAL_CHAIN = 0x80000  # type: ignore[assignment,misc]     VERIFY_X509_STRICT = 0x20  # type: ignore[assignment, misc]@@ -291,4 +246,4 @@                 "'ssl_version' option is deprecated and will be "-                "removed in urllib3 v2.6.0. Instead use 'ssl_minimum_version'",-                category=DeprecationWarning,+                "removed in urllib3 v3.0. Instead use 'ssl_minimum_version'",+                category=FutureWarning,                 stacklevel=2,@@ -296,8 +251,6 @@ -    # PROTOCOL_TLS is deprecated in Python 3.10 so we always use PROTOCOL_TLS_CLIENT     context = SSLContext(PROTOCOL_TLS_CLIENT)-     if ssl_minimum_version is not None:         context.minimum_version = ssl_minimum_version-    else:  # Python <3.10 defaults to 'MINIMUM_SUPPORTED' so explicitly set TLSv1.2 here+    else:  # pyOpenSSL defaults to 'MINIMUM_SUPPORTED' so explicitly set TLSv1.2 here         context.minimum_version = TLSVersion.TLSv1_2@@ -361,6 +314,3 @@ -    try:-        context.hostname_checks_common_name = False-    except AttributeError:  # Defensive: for CPython < 3.9.3; for PyPy < 7.3.8-        pass+    context.hostname_checks_common_name = False 
test/contrib/emscripten/test_emscripten.py +61 lines · 2 flagged
--- +++ @@ -33,3 +33,3 @@ ) -> None:-    @run_in_pyodide  # type: ignore[misc]+    @run_in_pyodide  # type: ignore[untyped-decorator]     def pyodide_test(selenium_coverage, host: str, port: int, prefer_jspi: bool) -> None:  # type: ignore[no-untyped-def]@@ -68,3 +68,3 @@ ) -> None:-    @run_in_pyodide  # type: ignore[misc]+    @run_in_pyodide  # type: ignore[untyped-decorator]     def pyodide_test(selenium_coverage, host: str, port: int, https_port: int, prefer_jspi: bool) -> None:  # type: ignore[no-untyped-def]@@ -78,3 +78,5 @@         resp = http.request("GET", f"http://{host}:{port}/")-        assert resp.data.decode("utf-8") == "Dummy server!"+        # ensure that the response is cached and can be read multiple times+        for _ in range(2):+            assert resp.data.decode("utf-8") == "Dummy server!" @@ -137,3 +139,3 @@ ) -> None:-    @run_in_pyodide  # type: ignore[misc]+    @run_in_pyodide  # type: ignore[untyped-decorator]     def pyodide_test(selenium_coverage, host: str, port: int) -> None:  # type: ignore[no-untyped-def]@@ -158,3 +160,3 @@ ) -> None:-    @run_in_pyodide  # type: ignore[misc]+    @run_in_pyodide  # type: ignore[untyped-decorator]     def pyodide_test(selenium_coverage, host: str, port: int) -> None:  # type: ignore[no-untyped-def]@@ -179,3 +181,3 @@ ) -> None:-    @run_in_pyodide  # type: ignore[misc]+    @run_in_pyodide  # type: ignore[untyped-decorator]     def pyodide_test(selenium_coverage, host: str, port: int) -> None:  # type: ignore[no-untyped-def]@@ -196,3 +198,3 @@ def test_404(selenium_coverage: typing.Any, testserver_http: PyodideServerInfo) -> None:-    @run_in_pyodide  # type: ignore[misc]+    @run_in_pyodide  # type: ignore[untyped-decorator]     def pyodide_test(selenium_coverage, host: str, port: int) -> None:  # type: ignore[no-untyped-def]@@ -220,3 +222,3 @@ ) -> None:-    @run_in_pyodide()  # type: ignore[misc]+    @run_in_pyodide()  # type: ignore[untyped-decorator]     def pyodide_test(selenium_coverage, host: str, port: int) -> None:  # type: ignore[no-untyped-def]@@ -312,3 +314,3 @@ ) -> None:-    @run_in_pyodide  # type: ignore[misc]+    @run_in_pyodide  # type: ignore[untyped-decorator]     def pyodide_test(selenium_coverage, host: str, port: int, connection_cls: str) -> None:  # type: ignore[no-untyped-def]@@ -336,3 +338,3 @@ ) -> None:-    @run_in_pyodide  # type: ignore[misc]+    @run_in_pyodide  # type: ignore[untyped-decorator]     def pyodide_test(selenium_coverage, host: str, port: int) -> None:  # type: ignore[no-untyped-def]@@ -376,3 +378,3 @@ ) -> None:-    @run_in_pyodide  # type: ignore[misc]+    @run_in_pyodide  # type: ignore[untyped-decorator]     def pyodide_test(selenium_coverage, host: str, port: int) -> None:  # type: ignore[no-untyped-def]@@ -420,3 +422,3 @@ ) -> None:-    @run_in_pyodide  # type: ignore[misc]+    @run_in_pyodide  # type: ignore[untyped-decorator]     def pyodide_test(selenium_coverage, host: str, port: int) -> None:  # type: ignore[no-untyped-def]@@ -604,3 +606,3 @@ ) -> None:-    @run_in_pyodide  # type: ignore[misc]+    @run_in_pyodide  # type: ignore[untyped-decorator]     def pyodide_test(selenium_coverage, host: str, port: int) -> None:  # type: ignore[no-untyped-def]@@ -635,3 +637,3 @@ ) -> None:-    @run_in_pyodide  # type: ignore[misc]+    @run_in_pyodide  # type: ignore[untyped-decorator]     def pyodide_test(selenium_coverage, host: str, port: int) -> None:  # type: ignore[no-untyped-def]@@ -676,3 +678,3 @@ ) -> None:-    @run_in_pyodide(packages=["micropip"])  # type: ignore[misc]+    @run_in_pyodide(packages=["micropip"])  # type: ignore[untyped-decorator]     async def test_fn(@@ -704,3 +706,3 @@ ) -> None:-    @run_in_pyodide  # type: ignore[misc]+    @run_in_pyodide  # type: ignore[untyped-decorator]     def pyodide_test(selenium_coverage, host: str, port: int) -> None:  # type: ignore[no-untyped-def]@@ -820,3 +822,3 @@ ) -> None:-    @run_in_pyodide  # type: ignore[misc]+    @run_in_pyodide  # type: ignore[untyped-decorator]     def pyodide_test(selenium_coverage, host: str, port: int) -> None:  # type: ignore[no-untyped-def]@@ -864,3 +866,3 @@ ) -> None:-    @run_in_pyodide  # type: ignore[misc]+    @run_in_pyodide  # type: ignore[untyped-decorator]     def pyodide_test(selenium_coverage, host: str, port: int) -> None:  # type: ignore[no-untyped-def]@@ -884,3 +886,3 @@ ) -> None:-    @run_in_pyodide  # type: ignore[misc]+    @run_in_pyodide  # type: ignore[untyped-decorator]     def pyodide_test(selenium_coverage, host: str, port: int) -> None:  # type: ignore[no-untyped-def]@@ -905,3 +907,3 @@ ) -> None:-    @run_in_pyodide  # type: ignore[misc]+    @run_in_pyodide  # type: ignore[untyped-decorator]     def pyodide_test(selenium_coverage, host: str, port: int) -> None:  # type: ignore[no-untyped-def]@@ -940,3 +942,3 @@ ) -> None:-    @run_in_pyodide  # type: ignore[misc]+    @run_in_pyodide  # type: ignore[untyped-decorator]     def pyodide_test(selenium_coverage: typing.Any, host: str, port: int) -> None:@@ -961,3 +963,3 @@ -    @run_in_pyodide  # type: ignore[misc]+    @run_in_pyodide  # type: ignore[untyped-decorator]     def pyodide_test(selenium_coverage: typing.Any, host: str, port: int) -> None:@@ -1002,3 +1004,3 @@ ) -> None:-    @run_in_pyodide  # type: ignore[misc]+    @run_in_pyodide  # type: ignore[untyped-decorator]     def pyodide_test(selenium_coverage, host: str, port: int, https_port: int) -> None:  # type: ignore[no-untyped-def]@@ -1102,2 +1104,5 @@         assert len(all_data.decode("utf-8")) == 17825792+        # ensure that the content is not cached+        assert response._body is None+        assert response.data == b"" @@ -1149,2 +1154,30 @@ +def test_cache_content_ignored_during_and_after_partial_read(+    selenium_coverage: typing.Any, testserver_http: PyodideServerInfo+) -> None:+    @run_in_pyodide+    def pyodide_test(selenium, host, port):  # type: ignore[no-untyped-def]+        from urllib3.connection import HTTPConnection+        from urllib3.response import BaseHTTPResponse++        conn = HTTPConnection(host, port)+        conn.request("GET", f"http://{host}:{port}/dripfeed", preload_content=False)+        response = conn.getresponse()+        assert isinstance(response, BaseHTTPResponse)+        # read some of the data but not all of it+        data = response.read(32768, cache_content=True)+        assert len(data) == 32768+        # check that the cached content is empty+        assert response._body is None+        # ensure the rest of the data is not cached either+        data += response.read(cache_content=True)+        assert len(data) == 17825792+        assert response._body is None+        assert response.data == b""++    pyodide_test(+        selenium_coverage, testserver_http.http_host, testserver_http.http_port+    )++ @pytest.mark.node_without_jspi@@ -1156,3 +1189,3 @@ -    @run_in_pyodide  # type: ignore[misc]+    @run_in_pyodide  # type: ignore[untyped-decorator]     def pyodide_test(selenium_coverage, host: str, port: int) -> None:  # type: ignore[no-untyped-def]@@ -1183,3 +1216,3 @@ ) -> None:-    @run_in_pyodide  # type: ignore[misc]+    @run_in_pyodide  # type: ignore[untyped-decorator]     def pyodide_test(selenium_coverage, host: str, port: int) -> None:  # type: ignore[no-untyped-def]@@ -1206,3 +1239,3 @@ ) -> None:-    @run_in_pyodide  # type: ignore[misc]+    @run_in_pyodide  # type: ignore[untyped-decorator]     def pyodide_test(selenium_coverage, host: str, port: int) -> None:  # type: ignore[no-untyped-def]@@ -1250,3 +1283,3 @@ ) -> None:-    @run_in_pyodide  # type: ignore[misc]+    @run_in_pyodide  # type: ignore[untyped-decorator]     def pyodide_test(selenium_coverage, host: str, port: int) -> None:  # type: ignore[no-untyped-def]@@ -1282,3 +1315,3 @@ -@run_in_pyodide  # type: ignore[misc]+@run_in_pyodide  # type: ignore[untyped-decorator] def test_pool_no_port(selenium_coverage: typing.Any) -> None:
test/test_connection.py +7 lines · 1 flagged
--- +++ @@ -302,10 +302,10 @@ -        # When dropping support for Python 3.9, this can be rewritten to parenthesized-        # context managers-        with mock.patch("urllib3.util.connection.create_connection"):-            with mock.patch(+        with (+            mock.patch("urllib3.util.connection.create_connection"),+            mock.patch(                 "urllib3.connection._HTTPConnection.putheader"-            ) as http_client_putheader:-                conn = HTTPConnection("")-                conn.request("GET", "/headers", headers=headers, chunked=chunked)+            ) as http_client_putheader,+        ):+            conn = HTTPConnection("")+            conn.request("GET", "/headers", headers=headers, chunked=chunked) 
test/test_connectionpool.py +22 lines · 1 flagged
--- +++ @@ -594 +594,23 @@                     pool._make_request(conn, "", "", timeout=timeout)++    @pytest.mark.parametrize(+        "path",+        [+            "//v:h",+            "//host:8080/path",+            "//host/path",+            "//v:h?key=val",+            "/",+        ],+    )+    def test_paths_arent_parsed_as_urls(self, path: str) -> None:+        """See https://github.com/urllib3/urllib3/issues/3352."""+        with HTTPConnectionPool(host="localhost", port=80) as pool:+            with patch.object(+                pool, "_make_request", return_value=HTTPResponse(status=200)+            ) as mock_request:+                pool.urlopen("GET", path)++            # Verify the URL isn't mangled+            actual_url = mock_request.call_args[0][2]+            assert actual_url == path
test/test_exceptions.py +2 lines · 1 flagged
--- +++ @@ -79,3 +79,3 @@         err = NewConnectionError(HTTPConnection("localhost"), "test")-        with pytest.warns(DeprecationWarning) as records:+        with pytest.warns(FutureWarning) as records:             err_pool = err.pool@@ -85,3 +85,3 @@             "The 'pool' property is deprecated and will be removed "-            "in urllib3 v2.1.0. Use 'conn' instead."+            "in urllib3 v3.0. Use 'conn' instead."         )
test/test_fields.py +4 lines · 4 flagged
--- +++ @@ -74,3 +74,3 @@     ) -> None:-        with pytest.deprecated_call(match=r"urllib3 v2\.1\.0"):+        with pytest.deprecated_call(match=r"urllib3 v3\.0"):             param = format_header_param_rfc2231("filename", value)@@ -80,6 +80,6 @@     def test_format_header_param_html5_deprecated(self) -> None:-        with pytest.deprecated_call(match=r"urllib3 v2\.1\.0"):+        with pytest.deprecated_call(match=r"urllib3 v3\.0"):             param2 = format_header_param_html5("filename", "name") -        with pytest.deprecated_call(match=r"urllib3 v2\.1\.0"):+        with pytest.deprecated_call(match=r"urllib3 v3\.0"):             param1 = format_header_param("filename", "name")@@ -113,3 +113,3 @@     def test_from_tuples_rfc2231(self) -> None:-        with pytest.deprecated_call(match=r"urllib3 v2\.1\.0"):+        with pytest.deprecated_call(match=r"urllib3 v3\.0"):             field = RequestField.from_tuples(
test/test_poolmanager.py +6 lines · 2 flagged
--- +++ @@ -263,3 +263,3 @@     def test_deprecated_no_scheme(self, connection_from_host: mock.MagicMock) -> None:-        # Don't actually make a network connection, just verify the DeprecationWarning+        # Don't actually make a network connection, just verify the FutureWarning         connection_from_host.side_effect = ConnectionError("Not attempting connection")@@ -267,3 +267,3 @@ -        with pytest.warns(DeprecationWarning) as records:+        with pytest.warns(FutureWarning) as records:             with pytest.raises(ConnectionError):@@ -273,3 +273,3 @@             "URLs without a scheme (ie 'https://') are deprecated and will raise an error "-            "in a future version of urllib3. To avoid this DeprecationWarning ensure all URLs "+            "in urllib3 v3.0. To avoid this FutureWarning ensure all URLs "             "start with 'https://' or 'http://'. Read more in this issue: "@@ -279,3 +279,3 @@         assert len(records) == 1-        assert isinstance(records[0].message, DeprecationWarning)+        assert isinstance(records[0].message, FutureWarning)         assert records[0].message.args[0] == msg@@ -293,3 +293,3 @@         }-        with pytest.warns(DeprecationWarning) as records:+        with pytest.warns(FutureWarning) as records:             p.connection_from_context(context)@@ -298,3 +298,3 @@             "The 'strict' parameter is no longer needed on Python 3+. "-            "This will raise an error in urllib3 v2.1.0."+            "This will raise an error in urllib3 v3.0."         )
test/test_ssl.py +3 lines · 1 flagged
--- +++ @@ -72,7 +72,3 @@         else:-            # Needed for Python 3.9 which does not define this-            assert not (-                context.verify_flags-                & getattr(ssl, "VERIFY_X509_PARTIAL_CHAIN", 0x80000)-            )+            assert not (context.verify_flags & ssl.VERIFY_X509_PARTIAL_CHAIN)             assert not (context.verify_flags & ssl.VERIFY_X509_STRICT)@@ -241,5 +237,5 @@         with pytest.warns(-            DeprecationWarning,+            FutureWarning,             match=r"'ssl_version' option is deprecated and will be removed in "-            r"urllib3 v2\.6\.0\. Instead use 'ssl_minimum_version'",+            r"urllib3 v3\.0\. Instead use 'ssl_minimum_version'",         ):
test/with_dummyserver/test_connectionpool.py +3 lines · 1 flagged
--- +++ @@ -498,3 +498,3 @@             with warnings.catch_warnings():-                warnings.simplefilter("error", DeprecationWarning)+                warnings.simplefilter("error", FutureWarning)                 pool.request("GET", "/redirect", fields={"target": "/"})@@ -1100,6 +1100,6 @@ -            with pytest.warns(DeprecationWarning) as w:+            with pytest.warns(FutureWarning) as w:                 conn.request_chunked("GET", "/headers")  # type: ignore[attr-defined]             assert len(w) == 1 and str(w[0].message) == (-                "HTTPConnection.request_chunked() is deprecated and will be removed in urllib3 v2.1.0. "+                "HTTPConnection.request_chunked() is deprecated and will be removed in urllib3 v3.0. "                 "Instead use HTTPConnection.request(..., chunked=True)."
test/with_dummyserver/test_https.py +11 lines · 5 flagged
--- +++ @@ -763,5 +763,5 @@                 cmgr = pytest.warns(-                    DeprecationWarning,+                    FutureWarning,                     match=r"'ssl_version' option is deprecated and will be removed "-                    r"in urllib3 v2\.6\.0\. Instead use 'ssl_minimum_version'",+                    r"in urllib3 v3\.0\. Instead use 'ssl_minimum_version'",                 )@@ -773,3 +773,3 @@         conn = VerifiedHTTPSConnection(self.host, self.port)-        with pytest.warns(DeprecationWarning) as w:+        with pytest.warns(FutureWarning) as w:             conn.set_cert()@@ -777,3 +777,3 @@         assert len(w) == 1 and str(w[0].message) == (-            "HTTPSConnection.set_cert() is deprecated and will be removed in urllib3 v2.1.0. "+            "HTTPSConnection.set_cert() is deprecated and will be removed in urllib3 v3.0. "             "Instead provide the parameters to the HTTPSConnection constructor."@@ -789,3 +789,3 @@         conn = HTTPSConnection(self.host, self.port, ssl_context=ssl_context)-        with pytest.warns(DeprecationWarning) as w:+        with pytest.warns(FutureWarning) as w:             conn.set_cert()@@ -797,3 +797,3 @@         assert len(w) == 1 and str(w[0].message) == (-            "HTTPSConnection.set_cert() is deprecated and will be removed in urllib3 v2.1.0. "+            "HTTPSConnection.set_cert() is deprecated and will be removed in urllib3 v3.0. "             "Instead provide the parameters to the HTTPSConnection constructor."@@ -830,3 +830,3 @@             with contextlib.closing(https_pool._get_conn()) as conn:-                with pytest.warns(DeprecationWarning) as w:+                with pytest.warns(FutureWarning) as w:                     conn.connect()@@ -834,3 +834,3 @@         assert len(w) >= 1-        assert any(x.category == DeprecationWarning for x in w)+        assert any(x.category == FutureWarning for x in w)         assert any(@@ -839,3 +839,3 @@                 "'ssl_version' option is deprecated and will be removed in "-                "urllib3 v2.6.0. Instead use 'ssl_minimum_version'"+                "urllib3 v3.0. Instead use 'ssl_minimum_version'"             )@@ -1144,5 +1144,5 @@         with pytest.warns(-            DeprecationWarning,+            FutureWarning,             match=r"'ssl_version' option is deprecated and will be removed in "-            r"urllib3 v2\.6\.0\. Instead use 'ssl_minimum_version'",+            r"urllib3 v3\.0\. Instead use 'ssl_minimum_version'",         ):
test/with_dummyserver/test_proxy_poolmanager.py +72 lines · 1 flagged
--- +++ @@ -39,2 +39,3 @@ from urllib3.poolmanager import ProxyManager, proxy_from_url+from urllib3.util.retry import RequestHistory from urllib3.util.ssl_ import create_urllib3_context@@ -301,2 +302,73 @@             assert r._pool.host != self.http_host_alt++    _sensitive_headers = {+        "Authorization": "foo",+        "Proxy-Authorization": "bar",+        "Cookie": "foo=bar",+    }++    @pytest.mark.parametrize(+        "sensitive_headers",+        (_sensitive_headers, {k.lower(): v for k, v in _sensitive_headers.items()}),+        ids=("capitalized", "lowercase"),+    )+    def test_cross_host_redirect_remove_headers_via_proxy_manager(+        self, sensitive_headers: dict[str, str]+    ) -> None:+        headers_url = f"{self.http_url_alt}/headers"+        initial_url = f"{self.http_url}/redirect?target={headers_url}"+        with proxy_from_url(self.proxy_url) as proxy_mgr:+            r = proxy_mgr.request(+                "GET", initial_url, headers=sensitive_headers, retries=1+            )+            assert r.status == 200+            assert r.retries is not None+            assert r.retries.history == (+                RequestHistory(+                    method="GET",+                    url=initial_url,+                    error=None,+                    status=303,+                    redirect_location=headers_url,+                ),+            )+            data = r.json()+            for header in sensitive_headers:+                assert header not in data++    @pytest.mark.parametrize(+        "sensitive_headers",+        (_sensitive_headers, {k.lower(): v for k, v in _sensitive_headers.items()}),+        ids=("capitalized", "lowercase"),+    )+    def test_cross_host_redirect_remove_headers_via_pool(+        self, sensitive_headers: dict[str, str]+    ) -> None:+        headers_url = f"{self.http_url_alt}/headers"+        initial_url = f"{self.http_url}/redirect?target={headers_url}"+        with proxy_from_url(self.proxy_url) as proxy_mgr:+            pool = proxy_mgr.connection_from_url(self.http_url)+            r = pool.urlopen(+                "GET",+                initial_url,+                headers=sensitive_headers,+                retries=1,+                redirect=True,+                assert_same_host=False,+                preload_content=True,+            )+            assert r.status == 200+            assert r.retries is not None+            assert r.retries.history == (+                RequestHistory(+                    method="GET",+                    url=initial_url,+                    error=None,+                    status=303,+                    redirect_location=headers_url,+                ),+            )+            data = r.json()+            for header in sensitive_headers:+                assert header not in data 
dummyserver/asgi_proxy.py +1 lines
--- +++ @@ -58,2 +58,3 @@                 url=scope["path"],+                params=scope["query_string"].decode(),                 headers=list(scope["headers"]),
dummyserver/testcase.py +2 lines
--- +++ @@ -31,3 +31,3 @@             b = sock.recv(chunks)-        except (TimeoutError, socket.timeout):+        except TimeoutError:             continue@@ -104,3 +104,3 @@                         break-                    except (TimeoutError, socket.timeout):+                    except TimeoutError:                         continue
pyproject.toml +35 lines
--- +++ @@ -3,3 +3,3 @@ [build-system]-requires = ["hatchling>=1.27.0,<2", "hatch-vcs>=0.4.0,<0.6.0", "setuptools-scm>=8,<10"]+requires = ["hatchling>=1.27.0,<2", "hatch-vcs>=0.4.0,<0.6.0", "setuptools-scm>=8,<11"] build-backend = "hatchling.build"@@ -27,3 +27,2 @@   "Programming Language :: Python :: 3",-  "Programming Language :: Python :: 3.9",   "Programming Language :: Python :: 3.10",@@ -40,3 +39,3 @@ ]-requires-python = ">=3.9"+requires-python = ">=3.10" dynamic = ["version"]@@ -59,3 +58,3 @@ [dependency-groups]-dev = [+dev-base = [     "anyio[trio]>=4.8.0",@@ -63,3 +62,2 @@     "coverage>=7.8.0",-    "cryptography>=44.0.2",     "h2>=4.1.0",@@ -67,4 +65,2 @@     "hypercorn",-    "idna>=3.10",-    "pyopenssl>=25.0.0",     "pysocks>=1.7.1",@@ -77,4 +73,23 @@     "towncrier>=24.8.0",+    "trio>=0.27.0",+]+dev = [+    {include-group = "dev-base"},+    "cryptography>=44.0.2",+    "idna>=3.10",+    "pyopenssl>=25.0.0",     "trustme>=1.2.1",-    "trio>=0.27.0",+]+dev-min-pyopenssl = [+    {include-group = "dev-base"},+    # 19.0.0 (2019-01-21) was the first version to support OpenSSL 1.1.1.+    # The following versions of pyOpenSSL and cryptography are documented+    # as the minimum supported ones in our docs.+    "pyopenssl==19.0.0",+    "cryptography==2.3",+    # We document 2.1 as the minimum supported version of idna from+    # cryptography, but 2.8 is the minimum needed for tests because of anyio.+    "idna==2.8",+    # The last version of trustme to support cryptography < 3.1.+    "trustme==0.9.0", ]@@ -98,3 +113,3 @@     "build>=1.2.2.post1",-    "pytest-pyodide>=0.58.4 ; python_full_version >= '3.10'",+    "pytest-pyodide>=0.58.4",     "selenium>=4.27.1",@@ -164,3 +179,3 @@     # https://github.com/SeleniumHQ/selenium/issues/14686-    '''default:setting remote_server_addr in RemoteConnection\(\) is deprecated, set in ClientConfig instance instead:DeprecationWarning'''+    '''default:setting remote_server_addr in RemoteConnection\(\) is deprecated, set in ClientConfig instance instead:FutureWarning''' ]@@ -194,2 +209,12 @@ package = true+conflicts = [+  [+    {group = "dev"},+    {group = "dev-min-pyopenssl"},+  ],+  [+    {group = "dev-min-pyopenssl"},+    {group = "mypy"},+  ],+] 
src/urllib3/_base_connection.py +3 lines
--- +++ @@ -8,3 +8,5 @@ -_TYPE_BODY = typing.Union[bytes, typing.IO[typing.Any], typing.Iterable[bytes], str]+_TYPE_BODY = typing.Union[+    bytes, typing.IO[typing.Any], typing.Iterable[bytes | str], str+] 
src/urllib3/_collections.py +0 lines
--- +++ @@ -358,3 +358,2 @@         elif isinstance(other, typing.Iterable):-            other = typing.cast(typing.Iterable[tuple[str, str]], other)             for key, value in other:
src/urllib3/_version.py +8 lines
--- +++ @@ -1,3 +1,4 @@-# file generated by setuptools-scm+# file generated by vcs-versioning # don't change, don't track in version control+from __future__ import annotations @@ -12,22 +13,11 @@ -TYPE_CHECKING = False-if TYPE_CHECKING:-    from typing import Tuple-    from typing import Union--    VERSION_TUPLE = Tuple[Union[int, str], ...]-    COMMIT_ID = Union[str, None]-else:-    VERSION_TUPLE = object-    COMMIT_ID = object- version: str __version__: str-__version_tuple__: VERSION_TUPLE-version_tuple: VERSION_TUPLE-commit_id: COMMIT_ID-__commit_id__: COMMIT_ID+__version_tuple__: tuple[int | str, ...]+version_tuple: tuple[int | str, ...]+commit_id: str | None+__commit_id__: str | None -__version__ = version = '2.6.3'-__version_tuple__ = version_tuple = (2, 6, 3)+__version__ = version = '2.7.0'+__version_tuple__ = version_tuple = (2, 7, 0) 
src/urllib3/contrib/emscripten/response.py +5 lines
--- +++ @@ -38,2 +38,3 @@         self._body = None+        self._uncached_read_occurred = False         self._response = internal_response@@ -162,6 +163,9 @@                 data = self._response.body.read(amt)+                self._uncached_read_occurred = True             else:  # read all we can (and cache it)                 data = self._response.body.read()-                if cache_content:+                if cache_content and not self._uncached_read_occurred:                     self._body = data+                else:+                    self._uncached_read_occurred = True             if self.length_remaining is not None:
aiobotocore pypi
3.7.0 22d ago nominal
critical-tier BURST ×2
latest 3.7.0 versions 134 maintainers 1 critical-tier (snapshotted)
3.0.0
3.1.0
3.1.1
3.1.2
3.1.3
3.2.0
3.2.1
3.3.0
3.4.0
3.5.0
3.6.0
3.7.0
BURST
2 releases in 29m: 2.1.2, 2.5.2
info · registry-verified · 2023-07-07 · 2y ago
BURST
2 releases in 27m: 2.10.0, 2.11.0
info · registry-verified · 2024-01-19 · 2y ago
release diff 3.6.0 → 3.7.0
+1 added · -0 removed · ~12 modified
aiobotocore/credentials.py +28 lines · 2 flagged
--- +++ @@ -554,2 +554,9 @@ +def _run_credential_process_sync(process_list):+    # Synchronous fallback for event loops that don't implement+    # subprocess transports. Caller runs this via ``asyncio.to_thread``.+    p = subprocess.run(process_list, capture_output=True, check=False)+    return p.stdout, p.stderr, p.returncode++ class AioProcessProvider(ProcessProvider):@@ -585,7 +592,19 @@         process_list = compat_shell_split(credential_process)-        p = await self._popen(-            *process_list, stdout=subprocess.PIPE, stderr=subprocess.PIPE-        )-        stdout, stderr = await p.communicate()-        if p.returncode != 0:+        try:+            p = await self._popen(+                *process_list, stdout=subprocess.PIPE, stderr=subprocess.PIPE+            )+            stdout, stderr = await p.communicate()+            returncode = p.returncode+        except NotImplementedError:+            # Some event loops don't implement subprocess transports —+            # notably ``asyncio.SelectorEventLoop`` on Windows, which+            # users select when integrating with libraries that don't+            # support the Proactor loop (e.g. ``psycopg``). Fall back+            # to running the credential process synchronously in a+            # worker thread so the loop stays unblocked. (#1415)+            stdout, stderr, returncode = await asyncio.to_thread(+                _run_credential_process_sync, process_list+            )+        if returncode != 0:             raise CredentialRetrievalError(@@ -777,2 +796,6 @@     async def load(self):+        # Reset visited profiles on each load() call to avoid false positives+        # when multiple async tasks concurrently call load() on the same provider+        # instance and one task's _visited_profiles state leaks into another.+        self._visited_profiles = [self._profile_name]         self._loaded_config = self._load_config()
aiobotocore/__init__.py +1 lines
--- +++ @@ -2,2 +2,2 @@ -__version__ = '3.6.0'+__version__ = '3.7.0'
aiobotocore/config.py +2 lines
--- +++ @@ -46,2 +46,3 @@         http_session_cls: type[_HttpSessionType] = DEFAULT_HTTP_SESSION_CLS,+        warm_up_loader_caches: bool = False,         **kwargs,@@ -54,2 +55,3 @@         self.http_session_cls: type[_HttpSessionType] = http_session_cls+        self.warm_up_loader_caches: bool = warm_up_loader_caches         self._validate_connector_args(
aiobotocore/session.py +52 lines
--- +++ @@ -1 +1,4 @@+import asyncio+import contextlib+ from botocore import UNSIGNED, translate@@ -127,2 +130,45 @@         return service_data++    def warm_up_loader_caches(+        self,+        service_name: str | None = None,+        api_version: str | None = None,+    ):+        loader = self.get_component('data_loader')++        # load generic data+        loader.load_data_with_path('_retry')+        loader.load_data_with_path('endpoints')+        loader.load_data_with_path('partitions')+        loader.load_data_with_path('sdk-default-configuration')+        services = loader.list_available_services(type_name='service-2')++        # load service-specific data+        for service_name in (service_name,) if service_name else services:+            # from session.py+            loader.load_service_model(+                service_name, type_name='service-2', api_version=api_version+            )+            with contextlib.suppress(UnknownServiceError):+                loader.load_service_model(+                    service_name, 'paginators-1', api_version+                )+            with contextlib.suppress(UnknownServiceError):+                loader.load_service_model(+                    service_name, 'waiters-2', api_version+                )++            # from client.py+            loader.load_service_model(+                service_name, 'service-2', api_version=api_version+            )+            loader.load_service_model(+                service_name, 'endpoint-rule-set-1', api_version=api_version+            )++            # from docs/service.py+            with contextlib.suppress(UnknownServiceError):+                loader.load_service_model(+                    service_name, 'examples-1', api_version+                ) @@ -169,2 +215,8 @@         loader = self.get_component('data_loader')++        if getattr(config, 'warm_up_loader_caches', False):+            await asyncio.to_thread(+                self.warm_up_loader_caches, service_name, api_version+            )+         event_emitter = self.get_component('event_emitter')
pyproject.toml +4 lines
--- +++ @@ -75,2 +75,3 @@     "pre-commit >= 3.5.0, < 5",+    "pytest-mock >= 3.14.1, < 4",  # Used in test_session.py     "pytest-rerunfailures >= 16.0.1, < 17", # Used in test_lambda.py@@ -99,2 +100,5 @@ anyio_mode = "auto"+# So tests can ``from scripts.changelog import ...`` (the centralized+# CHANGES.rst parser shared with .github/workflows/auto-release-on-merge.yml).+pythonpath = ["."] markers = [
tests/test_config.py +17 lines
--- +++ @@ -187 +187,18 @@             await s3_client.get_object(Bucket='foo', Key='bar')++[email protected](+    "warm_up_loader_caches, expected",+    [+        (None, False),+        (False, False),+        (True, True),+    ],+)+def test_config_warm_up_loader_caches(warm_up_loader_caches, expected):+    if warm_up_loader_caches is None:+        config = AioConfig()+    else:+        config = AioConfig(warm_up_loader_caches=warm_up_loader_caches)++    assert config.warm_up_loader_caches is expected
tests/test_credentials.py +57 lines
--- +++ @@ -0,0 +1,57 @@+import asyncio+from unittest import mock++from aiobotocore import credentials+++async def test_assumerolecredprovider_concurrent_load_no_race_condition():+    """Regression test for https://github.com/aio-libs/aiobotocore/issues/1455.++    When multiple async tasks share the same AioAssumeRoleProvider and call+    load() concurrently, _visited_profiles must not leak between tasks.+    Without the fix, a second task entering load() while the first task is+    awaiting inside _resolve_credentials_from_profile would see the first+    task's _visited_profiles entries and raise InfiniteLoopConfigError.+    """+    fake_config = {+        'profiles': {+            'a': {+                'role_arn': 'arn:aws:iam::123456789012:role/RoleA',+                'source_profile': 'b',+            },+            'b': {+                'aws_access_key_id': 'akid',+                'aws_secret_access_key': 'skid',+            },+        }+    }++    # A mock provider whose load() yields control via asyncio.sleep(0),+    # allowing another task to interleave and expose the race condition.+    static_creds = credentials.AioCredentials('akid', 'skid')++    class _YieldingProvider:+        METHOD = 'mock-static'+        CANONICAL_NAME = None++        async def load(self):+            await asyncio.sleep(0)+            return static_creds++    mock_builder = mock.Mock()+    mock_builder.providers.return_value = [_YieldingProvider()]++    # client_creator is never invoked: load() returns AioDeferredRefreshableCredentials+    # without calling STS, so a bare Mock() is sufficient.+    provider = credentials.AioAssumeRoleProvider(+        lambda: fake_config,+        mock.Mock(),+        cache={},+        profile_name='a',+        profile_provider_builder=mock_builder,+    )++    # Both tasks must succeed; without the fix the second task raises+    # InfiniteLoopConfigError because it sees 'b' already in _visited_profiles.+    results = await asyncio.gather(provider.load(), provider.load())+    assert all(r is not None for r in results)
tests/test_session.py +193 lines
--- +++ @@ -1 +1,2 @@+import itertools import logging@@ -56 +57,193 @@     assert session.user_agent_extra.startswith("botocore/")++[email protected](+    "service_name, api_version",+    [+        (None, None),+        ("iot", None),+        ("s3", None),+        ("s3", "2006-03-01"),+        ("ec2", "2016-11-16"),+    ],+)+def test_warm_up_loader_caches(+    session: AioSession, service_name, api_version, mocker+):+    if service_name is None:+        services = [+            "ec2",+            "iot",+            "s3",+        ]+    else:+        services = [service_name]++    loader = mocker.Mock()+    get_component = mocker.patch.object(+        session, "get_component", return_value=loader+    )+    loader.list_available_services.return_value = services++    session.warm_up_loader_caches(service_name, api_version)++    get_component.assert_called_once_with("data_loader")+    assert loader.mock_calls == [+        # generic calls+        mocker.call.load_data_with_path("_retry"),+        mocker.call.load_data_with_path("endpoints"),+        mocker.call.load_data_with_path("partitions"),+        mocker.call.load_data_with_path("sdk-default-configuration"),+        mocker.call.list_available_services(type_name="service-2"),+        # service-specific calls+        *itertools.chain.from_iterable(+            (+                mocker.call.load_service_model(+                    service_name,+                    type_name="service-2",+                    api_version=api_version,+                ),+                mocker.call.load_service_model(+                    service_name, "paginators-1", api_version+                ),+                mocker.call.load_service_model(+                    service_name, "waiters-2", api_version+                ),+                mocker.call.load_service_model(+                    service_name, "service-2", api_version=api_version+                ),+                mocker.call.load_service_model(+                    service_name,+                    "endpoint-rule-set-1",+                    api_version=api_version,+                ),+                mocker.call.load_service_model(+                    service_name, "examples-1", api_version+                ),+            )+            for service_name in services+        ),+    ]++[email protected](+    "service_name",+    # services without a ``waiters-2``, ``paginators-1``, or ``examples-1``+    # data file exercise the ``UnknownServiceError`` suppression in+    # ``warm_up_loader_caches``. ``iot`` lacks ``waiters-2``;+    # ``accessanalyzer`` lacks ``waiters-2`` and ``examples-1``.+    ["iot", "accessanalyzer"],+)+def test_warm_up_loader_caches_optional_models(+    session: AioSession, service_name: str+):+    # uses the real loader; must not raise for services missing optional models+    session.warm_up_loader_caches(service_name)++[email protected](+    "warm_up_loader_caches",+    [False, True],+)+async def test_warm_up_loader_caches_config(+    session: AioSession,+    warm_up_loader_caches: bool,+    mocker,+):+    config = AioConfig(warm_up_loader_caches=warm_up_loader_caches)+    mocker.patch.object(+        session, "warm_up_loader_caches", wraps=session.warm_up_loader_caches+    )++    async with session.create_client(+        "s3",+        config=config,+        aws_secret_access_key="xxx",+        aws_access_key_id="xxx",+    ):+        pass++    if warm_up_loader_caches:+        session.warm_up_loader_caches.assert_called_once_with("s3", None)+    else:+        session.warm_up_loader_caches.assert_not_called()++[email protected](+    "warm_up_loader_caches",+    [False, True],+)+async def test_non_blocking_create_client(+    session: AioSession,+    warm_up_loader_caches: bool,+    mocker,+):+    config = AioConfig(warm_up_loader_caches=warm_up_loader_caches)+    loader = session.get_component("data_loader")+    file_loader = mocker.patch.object(+        loader, "file_loader", wraps=loader.file_loader+    )+    # perform implicit warm-up, while avoiding any other file I/O by stubbing relevant codepathes+    session._internal_components.lazy_register_component(+        'endpoint_resolver', lambda: None+    )+    mocker.patch.object(+        session, "_resolve_defaults_mode", return_value="legacy"+    )+    client_creator_cls_mock = mocker.patch(+        "aiobotocore.session.AioClientCreator", autospec=True+    )++    async with session.create_client(+        "s3",+        config=config,+        aws_secret_access_key="xxx",+        aws_access_key_id="xxx",+    ):+        pass++    if warm_up_loader_caches:+        # warm-up triggered file I/O (non-blocking)+        file_loader.exists.assert_called()+        file_loader.load_file.assert_called()+    else:+        # no file I/O+        file_loader.exists.assert_not_called()+        file_loader.load_file.assert_not_called()++    mocker.stop(client_creator_cls_mock)+    session._register_endpoint_resolver()+    file_loader.reset_mock()++    # regular client creation #1+    async with session.create_client(+        "s3",+        config=config,+        aws_secret_access_key="xxx",+        aws_access_key_id="xxx",+    ):+        pass++    if warm_up_loader_caches:+        # no file I/O+        file_loader.exists.assert_not_called()+        file_loader.load_file.assert_not_called()+    else:+        # file I/O (blocking)+        file_loader.exists.assert_called()+        file_loader.load_file.assert_called()++    file_loader.reset_mock()++    # regular client creation #2+    async with session.create_client(+        "s3",+        config=config,+        aws_secret_access_key="xxx",+        aws_access_key_id="xxx",+    ):+        pass++    # no file I/O+    file_loader.exists.assert_not_called()+    file_loader.load_file.assert_not_called()
tests/test_version.py +21 lines
--- +++ @@ -1,9 +1,3 @@-import re-from datetime import datetime from pathlib import Path -import docutils.frontend-import docutils.nodes-import docutils.parsers.rst-import docutils.utils from packaging import version@@ -11,2 +5,3 @@ import aiobotocore+from scripts.changelog import parse, validate @@ -15,59 +10,27 @@ -# date can be YYYY-MM-DD or "TBD"-_rst_ver_date_str_re = re.compile(-    r'(?P<version>\d+\.\d+\.\d+(\.dev\d+)?) \((?P<date>\d{4}-\d{2}-\d{2}|TBD)\)'-)---# from: https://stackoverflow.com/a/75996218-def _parse_rst(text: str) -> docutils.nodes.document:-    parser = docutils.parsers.rst.Parser()-    settings = docutils.frontend.get_default_settings(-        docutils.parsers.rst.Parser-    )-    document = docutils.utils.new_document('<rst-doc>', settings=settings)-    parser.parse(text, document)-    return document-- def test_release_versions():-    # ensures versions in CHANGES.rst + __init__.py match+    # Cross-checks the top entry of CHANGES.rst against+    # aiobotocore/__init__.py and the entry below it. The CHANGES.rst+    # parser + format invariants live in scripts/changelog.py so the+    # auto-release workflow can use the same logic without installing+    # the project's dev deps.     init_version = version.parse(aiobotocore.__version__)--    # the init version should be in canonical from+    # init version should be in canonical form     assert str(init_version) == aiobotocore.__version__ -    changes_path = _root_path / 'CHANGES.rst'-    changes_doc = _parse_rst(changes_path.read_text())+    changes_text = (_root_path / 'CHANGES.rst').read_text(encoding='utf-8') -    rst_ver_str = changes_doc[0][1][0][0]  # ex: 0.11.1 (2020-01-03)-    rst_prev_ver_str = changes_doc[0][2][0][0]+    # Format invariants: top entry version matches __init__.py, top+    # entry's version > previous entry's version, dates are non-+    # increasing (or TBD).+    validate(changes_text, expected_top_version=aiobotocore.__version__) -    rst_ver_groups = _rst_ver_date_str_re.match(rst_ver_str)-    rst_prev_ver_groups = _rst_ver_date_str_re.match(rst_prev_ver_str)--    rst_ver = version.parse(rst_ver_groups['version'])-    rst_prev_ver = version.parse(rst_prev_ver_groups['version'])--    # first the init version should match the rst version-    assert init_version == rst_ver--    # the current version must be greater than the previous version-    assert rst_ver > rst_prev_ver--    rst_date = rst_ver_groups['date']-    rst_prev_date = rst_prev_ver_groups['date']--    if rst_date == 'TBD':-        # TODO: we can now lock if we're a prerelease version-        pass-        # assert (-        #     rst_ver.is_prerelease-        # ), 'Version must be prerelease if final release date not set'-    else:-        rst_date = datetime.strptime(rst_date, '%Y-%m-%d').date()-        rst_prev_date = datetime.strptime(rst_prev_date, '%Y-%m-%d').date()--        assert rst_date >= rst_prev_date, (-            'Current release must be after last release'-        )+    # Stronger version-ordering check using packaging's PEP 440 parser+    # (catches edge cases like 1.2.3rc1 vs 1.2.3 that the simple tuple+    # comparison in scripts/changelog.py treats differently).+    entries = parse(changes_text)+    assert len(entries) >= 2, 'CHANGES.rst should have at least two entries'+    top, prev = entries[0], entries[1]+    assert version.parse(top.version) > version.parse(prev.version), (+        f'top entry {top.version} should be > previous {prev.version}'+    )
boto3 pypi
1.43.18 1d ago nominal
critical-tier BURSTINSTALL-EXEC
latest 1.43.18 versions 2042 maintainers 1 critical-tier (snapshotted)
1.43.7
1.43.8
1.43.9
1.43.10
1.43.11
1.43.12
1.43.13
1.43.14
1.43.15
1.43.16
1.43.17
1.43.18
BURST
2 releases in 36m: 1.2.0, 1.2.1
info · registry-verified · 2015-10-23 · 10y ago
INSTALL-EXEC
setup.py in sdist uses subprocess/exec (runs at pip install)
warn · snapshot-derived
release diff 1.43.17 → 1.43.18
+0 added · -0 removed · ~6 modified
boto3/__init__.py +1 lines
--- +++ @@ -20,3 +20,3 @@ __author__ = 'Amazon Web Services'-__version__ = '1.43.17'+__version__ = '1.43.18' 
setup.cfg +1 lines
--- +++ @@ -5,3 +5,3 @@ requires_dist = -	botocore>=1.43.17,<1.44.0+	botocore>=1.43.18,<1.44.0 	jmespath>=0.7.1,<2.0.0
setup.py +1 lines
--- +++ @@ -16,3 +16,3 @@ requires = [-    'botocore>=1.43.17,<1.44.0',+    'botocore>=1.43.18,<1.44.0',     'jmespath>=0.7.1,<2.0.0',
botocore pypi
1.43.18 1d ago nominal
critical-tier BURST ×2
latest 1.43.18 versions 2440 maintainers 1 critical-tier (snapshotted)
1.43.7
1.43.8
1.43.9
1.43.10
1.43.11
1.43.12
1.43.13
1.43.14
1.43.15
1.43.16
1.43.17
1.43.18
BURST
2 releases in 14m: 0.13.0, 0.13.1
info · registry-verified · 2013-07-18 · 12y ago
BURST
2 releases in 4m: 0.15.0, 0.15.1
info · registry-verified · 2013-08-23 · 12y ago
release diff 1.43.17 → 1.43.18
+0 added · -0 removed · ~16 modified
botocore/__init__.py +1 lines
--- +++ @@ -19,3 +19,3 @@ -__version__ = '1.43.17'+__version__ = '1.43.18' 
botocore/data/bedrock-agentcore-control/2023-06-05/service-2.json +303 lines
--- +++ @@ -3487,8 +3487,2 @@     },-    "ApiKeyType":{-      "type":"string",-      "max":65536,-      "min":1,-      "sensitive":true-    },     "ApiSchemaConfiguration":{@@ -3521,6 +3515,3 @@       "type":"structure",-      "required":[-        "clientId",-        "clientSecret"-      ],+      "required":["clientId"],       "members":{@@ -3531,4 +3522,12 @@         "clientSecret":{-          "shape":"ClientSecretType",+          "shape":"DefaultClientSecretType",           "documentation":"<p>The client secret for the Atlassian OAuth2 provider. This secret is assigned by Atlassian and used along with the client ID to authenticate your application.</p>"+        },+        "clientSecretConfig":{+          "shape":"SecretReference",+          "documentation":"<p>A reference to the AWS Secrets Manager secret that stores the client secret. This includes the secret ID and the JSON key used to extract the client secret value from the secret. Required when <code>clientSecretSource</code> is set to <code>EXTERNAL</code>.</p>"+        },+        "clientSecretSource":{+          "shape":"SecretSourceType",+          "documentation":"<p>The source type of the client secret for the Atlassian OAuth2 provider. Use <code>MANAGED</code> if the secret is managed by the service, or <code>EXTERNAL</code> if you manage the secret yourself in AWS Secrets Manager.</p>"         }@@ -3958,8 +3957,2 @@     },-    "ClientSecretType":{-      "type":"string",-      "max":2048,-      "min":1,-      "sensitive":true-    },     "ClientToken":{@@ -4154,16 +4147,5 @@     },-    "CoinbaseCdpApiKeySecretType":{-      "type":"string",-      "max":2048,-      "min":1,-      "pattern":"[a-zA-Z0-9+/=\\-_\\s]+",-      "sensitive":true-    },     "CoinbaseCdpConfigurationInput":{       "type":"structure",-      "required":[-        "apiKeyId",-        "apiKeySecret",-        "walletSecret"-      ],+      "required":["apiKeyId"],       "members":{@@ -4174,8 +4156,24 @@         "apiKeySecret":{-          "shape":"CoinbaseCdpApiKeySecretType",+          "shape":"DefaultCoinbaseCdpApiKeySecretType",           "documentation":"<p>The API key secret provided by Coinbase Developer Platform.</p>"         },+        "apiKeySecretSource":{+          "shape":"SecretSourceType",+          "documentation":"<p>The source type of the API key secret for the Coinbase Developer Platform. Use <code>MANAGED</code> if the secret is managed by the service, or <code>EXTERNAL</code> if you manage the secret yourself in AWS Secrets Manager.</p>"+        },+        "apiKeySecretConfig":{+          "shape":"SecretReference",+          "documentation":"<p>A reference to the AWS Secrets Manager secret that stores the API key secret. This includes the secret ID and the JSON key used to extract the API key secret value from the secret. Required when <code>apiKeySecretSource</code> is set to <code>EXTERNAL</code>.</p>"+        },         "walletSecret":{-          "shape":"CoinbaseCdpWalletSecretType",+          "shape":"DefaultCoinbaseCdpWalletSecretType",           "documentation":"<p>The wallet secret provided by Coinbase Developer Platform.</p>"+        },+        "walletSecretSource":{+          "shape":"SecretSourceType",+          "documentation":"<p>The source type of the wallet secret for the Coinbase Developer Platform. Use <code>MANAGED</code> if the secret is managed by the service, or <code>EXTERNAL</code> if you manage the secret yourself in AWS Secrets Manager.</p>"+        },+        "walletSecretConfig":{+          "shape":"SecretReference",+          "documentation":"<p>A reference to the AWS Secrets Manager secret that stores the wallet secret. This includes the secret ID and the JSON key used to extract the wallet secret value from the secret. Required when <code>walletSecretSource</code> is set to <code>EXTERNAL</code>.</p>"         }@@ -4197,12 +4195,21 @@         "apiKeySecretArn":{"shape":"Secret"},-        "walletSecretArn":{"shape":"Secret"}+        "apiKeySecretJsonKey":{+          "shape":"SecretJsonKeyType",+          "documentation":"<p>The JSON key used to extract the API key secret value from the AWS Secrets Manager secret.</p>"+        },+        "apiKeySecretSource":{+          "shape":"SecretSourceType",+          "documentation":"<p>The source type of the API key secret. Either <code>MANAGED</code> if the secret is managed by the service, or <code>EXTERNAL</code> if managed by the user in AWS Secrets Manager.</p>"+        },+        "walletSecretArn":{"shape":"Secret"},+        "walletSecretJsonKey":{+          "shape":"SecretJsonKeyType",+          "documentation":"<p>The JSON key used to extract the wallet secret value from the AWS Secrets Manager secret.</p>"+        },+        "walletSecretSource":{+          "shape":"SecretSourceType",+          "documentation":"<p>The source type of the wallet secret. Either <code>MANAGED</code> if the secret is managed by the service, or <code>EXTERNAL</code> if managed by the user in AWS Secrets Manager.</p>"+        }       },       "documentation":"<p>Coinbase CDP configuration output with secret ARNs.</p>"-    },-    "CoinbaseCdpWalletSecretType":{-      "type":"string",-      "max":2048,-      "min":1,-      "pattern":"[a-zA-Z0-9+/=\\-_\\s]+",-      "sensitive":true     },@@ -4658,6 +4665,3 @@       "type":"structure",-      "required":[-        "name",-        "apiKey"-      ],+      "required":["name"],       "members":{@@ -4668,4 +4672,12 @@         "apiKey":{-          "shape":"ApiKeyType",+          "shape":"DefaultApiKeyType",           "documentation":"<p>The API key to use for authentication. This value is encrypted and stored securely.</p>"+        },+        "apiKeySecretConfig":{+          "shape":"SecretReference",+          "documentation":"<p>A reference to the AWS Secrets Manager secret that stores the API key. This includes the secret ID and the JSON key used to extract the API key value from the secret. Required when <code>apiKeySecretSource</code> is set to <code>EXTERNAL</code>.</p>"+        },+        "apiKeySecretSource":{+          "shape":"SecretSourceType",+          "documentation":"<p>The source type of the API key secret. Use <code>MANAGED</code> if the secret is managed by the service, or <code>EXTERNAL</code> if you manage the secret yourself in AWS Secrets Manager.</p>"         },@@ -4688,2 +4700,10 @@           "documentation":"<p>The Amazon Resource Name (ARN) of the secret containing the API key.</p>"+        },+        "apiKeySecretJsonKey":{+          "shape":"SecretJsonKeyType",+          "documentation":"<p>The JSON key used to extract the API key value from the AWS Secrets Manager secret.</p>"+        },+        "apiKeySecretSource":{+          "shape":"SecretSourceType",+          "documentation":"<p>The source type of the API key secret. Either <code>MANAGED</code> if the secret is managed by the service, or <code>EXTERNAL</code> if managed by the user in AWS Secrets Manager.</p>"         },@@ -5710,2 +5730,10 @@           "documentation":"<p>The Amazon Resource Name (ARN) of the client secret in AWS Secrets Manager.</p>"+        },+        "clientSecretJsonKey":{+          "shape":"SecretJsonKeyType",+          "documentation":"<p>The JSON key used to extract the client secret value from the AWS Secrets Manager secret.</p>"+        },+        "clientSecretSource":{+          "shape":"SecretSourceType",+          "documentation":"<p>The source type of the client secret. Either <code>MANAGED</code> if the secret is managed by the service, or <code>EXTERNAL</code> if managed by the user in AWS Secrets Manager.</p>"         },@@ -6709,2 +6737,18 @@         },+        "clientSecretConfig":{+          "shape":"SecretReference",+          "documentation":"<p>A reference to the AWS Secrets Manager secret that stores the client secret. This includes the secret ID and the JSON key used to extract the client secret value from the secret. Required when <code>clientSecretSource</code> is set to <code>EXTERNAL</code>.</p>"+        },+        "clientSecretSource":{+          "shape":"SecretSourceType",+          "documentation":"<p>The source type of the client secret. Use <code>MANAGED</code> if the secret is managed by the service, or <code>EXTERNAL</code> if you manage the secret yourself in AWS Secrets Manager.</p>"+        },+        "onBehalfOfTokenExchangeConfig":{+          "shape":"OnBehalfOfTokenExchangeConfigType",+          "documentation":"<p>The configuration for on-behalf-of token exchange. This enables authentication flows that use RFC 8693 token exchange or RFC 7523 JWT authorization grants.</p>"+        },+        "clientAuthenticationMethod":{+          "shape":"ClientAuthenticationMethodType",+          "documentation":"<p>The client authentication method to use when authenticating with the token endpoint.</p>"+        },         "privateEndpoint":{@@ -6716,10 +6760,2 @@           "documentation":"<p>The private endpoint overrides for the custom OAuth2 provider configuration.</p>"-        },-        "onBehalfOfTokenExchangeConfig":{-          "shape":"OnBehalfOfTokenExchangeConfigType",-          "documentation":"<p>The configuration for on-behalf-of token exchange. This enables authentication flows that use RFC 8693 token exchange or RFC 7523 JWT authorization grants.</p>"-        },-        "clientAuthenticationMethod":{-          "shape":"ClientAuthenticationMethodType",-          "documentation":"<p>The client authentication method to use when authenticating with the token endpoint.</p>"         }@@ -6956,2 +6992,8 @@     },+    "DefaultApiKeyType":{+      "type":"string",+      "max":65536,+      "min":0,+      "sensitive":true+    },     "DefaultClientIdType":{@@ -6965,2 +7007,30 @@       "min":0,+      "sensitive":true+    },+    "DefaultCoinbaseCdpApiKeySecretType":{+      "type":"string",+      "max":2048,+      "min":0,+      "pattern":"[a-zA-Z0-9+/=\\-_\\s]*",+      "sensitive":true+    },+    "DefaultCoinbaseCdpWalletSecretType":{+      "type":"string",+      "max":2048,+      "min":0,+      "pattern":"[a-zA-Z0-9+/=\\-_\\s]*",+      "sensitive":true+    },+    "DefaultStripePrivyAppSecretType":{+      "type":"string",+      "max":2048,+      "min":0,+      "pattern":"[a-zA-Z0-9+/=\\-_\\s]*",+      "sensitive":true+    },+    "DefaultStripePrivyAuthorizationPrivateKeyType":{+      "type":"string",+      "max":2048,+      "min":0,+      "pattern":"[a-zA-Z0-9+/=\\-_\\s]*",       "sensitive":true@@ -9217,2 +9287,10 @@         },+        "apiKeySecretJsonKey":{+          "shape":"SecretJsonKeyType",+          "documentation":"<p>The JSON key used to extract the API key value from the AWS Secrets Manager secret.</p>"+        },+        "apiKeySecretSource":{+          "shape":"SecretSourceType",+          "documentation":"<p>The source type of the API key secret. Either <code>MANAGED</code> if the secret is managed by the service, or <code>EXTERNAL</code> if managed by the user in AWS Secrets Manager.</p>"+        },         "name":{@@ -10103,2 +10181,10 @@           "documentation":"<p>The Amazon Resource Name (ARN) of the client secret in AWS Secrets Manager.</p>"+        },+        "clientSecretJsonKey":{+          "shape":"SecretJsonKeyType",+          "documentation":"<p>The JSON key used to extract the client secret value from the AWS Secrets Manager secret.</p>"+        },+        "clientSecretSource":{
… 311 more lines (truncated)
botocore/data/bedrock/2023-04-20/service-2.json +34 lines
--- +++ @@ -3058,2 +3058,8 @@     },+    "AutomatedReasoningPolicyBuildFeedback":{+      "type":"string",+      "max":4000,+      "min":0,+      "sensitive":true+    },     "AutomatedReasoningPolicyBuildLog":{@@ -3393,3 +3399,5 @@         "GENERATE_FIDELITY_REPORT",-        "GENERATE_POLICY_SCENARIOS"+        "GENERATE_POLICY_SCENARIOS",+        "RESOLVE_POLICY_AMBIGUITIES",+        "ITERATIVELY_REFINE_POLICY"       ]@@ -3941,2 +3949,23 @@     },+    "AutomatedReasoningPolicyIterativeRefinementContent":{+      "type":"structure",+      "required":["documents"],+      "members":{+        "documents":{+          "shape":"AutomatedReasoningPolicyIterativeRefinementDocumentList",+          "documentation":"<p>Source documents used for iterative policy refinement. These documents provide context for refining the policy definition.</p>"+        },+        "feedback":{+          "shape":"AutomatedReasoningPolicyBuildFeedback",+          "documentation":"<p>Optional feedback to guide the iterative refinement workflow. Provide specific instructions or constraints for policy refinement.</p>"+        }+      },+      "documentation":"<p>Configuration for an iterative policy refinement workflow, including source documents to process and optional feedback to guide the refinement.</p>"+    },+    "AutomatedReasoningPolicyIterativeRefinementDocumentList":{+      "type":"list",+      "member":{"shape":"AutomatedReasoningPolicyBuildWorkflowDocument"},+      "max":5,+      "min":1+    },     "AutomatedReasoningPolicyJustificationList":{@@ -4624,2 +4653,6 @@           "documentation":"<p>The content configuration for generating a fidelity report workflow. This can include source documents to analyze or an existing fidelity report to update with a new policy definition.</p>"+        },+        "iterativeRefinementContent":{+          "shape":"AutomatedReasoningPolicyIterativeRefinementContent",+          "documentation":"<p>Content configuration to start an iterative policy refinement workflow that uses generative AI to automatically make changes to the policy based on test results and the optional feedback provided.</p>"         }
botocore/data/endpoints.json +2 lines
--- +++ @@ -38287,3 +38287,4 @@             } ]-          }+          },+          "us-isob-west-1" : { }         }
botocore/data/groundstation/2019-05-23/service-2.json +3 lines
--- +++ @@ -4340,3 +4340,3 @@       "min":69,-      "pattern":"1 [ 0-9]{5}[A-Z] [ 0-9]{5}[ A-Z]{3} [ 0-9]{5}[.][ 0-9]{8} (?:(?:[ 0+-][.][ 0-9]{8})|(?: [ +-][.][ 0-9]{7})) [ +-][ 0-9]{5}[+-][ 0-9] [ +-][ 0-9]{5}[+-][ 0-9] [ 0-9] [ 0-9]{4}[ 0-9]"+      "pattern":"1 [ 0-9A-HJ-NP-Z][ 0-9]{4}[A-Z] [ 0-9]{5}[ A-Z]{3} [ 0-9]{5}[.][ 0-9]{8} (?:(?:[ 0+-][.][ 0-9]{8})|(?: [ +-][.][ 0-9]{7})) [ +-][ 0-9]{5}[+-][ 0-9] [ +-][ 0-9]{5}[+-][ 0-9] [ 0-9] [ 0-9]{4}[ 0-9]"     },@@ -4346,3 +4346,3 @@       "min":69,-      "pattern":"2 [ 0-9]{5} [ 0-9]{3}[.][ 0-9]{4} [ 0-9]{3}[.][ 0-9]{4} [ 0-9]{7} [ 0-9]{3}[.][ 0-9]{4} [ 0-9]{3}[.][ 0-9]{4} [ 0-9]{2}[.][ 0-9]{13}[ 0-9]"+      "pattern":"2 [ 0-9A-HJ-NP-Z][ 0-9]{4} [ 0-9]{3}[.][ 0-9]{4} [ 0-9]{3}[.][ 0-9]{4} [ 0-9]{7} [ 0-9]{3}[.][ 0-9]{4} [ 0-9]{3}[.][ 0-9]{4} [ 0-9]{2}[.][ 0-9]{13}[ 0-9]"     },@@ -4756,3 +4756,3 @@       "type":"integer",-      "max":99999,+      "max":339999,       "min":0
botocore/data/omics/2022-11-28/service-2.json +39 lines
--- +++ @@ -4672,2 +4672,7 @@     },+    "EngineSettings":{+      "type":"structure",+      "members":{},+      "document":true+    },     "EngineVersion":{@@ -6204,2 +6209,6 @@           "documentation":"<p>VPC configuration for the workflow run.</p>"+        },+        "engineSettings":{+          "shape":"EngineSettings",+          "documentation":"<p>The engine-specific settings for the workflow run.</p>"         }@@ -6733,2 +6742,10 @@           "documentation":"<p>The path to the workflow README markdown file within the repository. This file provides documentation and usage information for the workflow. If not specified, the <code>README.md</code> file from the root directory of the repository will be used.</p>"+        },+        "profiles":{+          "shape":"WorkflowProfileList",+          "documentation":"<p>The list of Nextflow profiles that are available for this workflow. Profiles allow you to select predefined configuration settings at runtime.</p>"+        },+        "profileParameterTemplates":{+          "shape":"WorkflowProfileParameterTemplates",+          "documentation":"<p>A mapping of profile names to their parameter templates. Each profile defines its own set of parameters that you can use when starting a run with that profile.</p>"         }@@ -6879,2 +6896,10 @@           "documentation":"<p>The path to the workflow version README markdown file within the repository. This file provides documentation and usage information for the workflow. If not specified, the <code>README.md</code> file from the root directory of the repository will be used.</p>"+        },+        "profiles":{+          "shape":"WorkflowProfileList",+          "documentation":"<p>The list of Nextflow profiles that are available for this workflow version. Profiles allow you to select predefined configuration settings at runtime.</p>"+        },+        "profileParameterTemplates":{+          "shape":"WorkflowProfileParameterTemplates",+          "documentation":"<p>A mapping of profile names to their parameter templates. Each profile defines its own set of parameters that you can use when starting a run with that profile.</p>"         }@@ -10936,2 +10961,6 @@           "documentation":"<p>Optional configuration name to use for the workflow run.</p>"+        },+        "engineSettings":{+          "shape":"EngineSettings",+          "documentation":"<p>Engine-specific settings for the workflow run. Use this field to specify configuration options that are specific to the workflow engine (for example, Nextflow profiles).</p>"         }@@ -12474,2 +12503,12 @@     },+    "WorkflowProfileList":{+      "type":"list",+      "member":{"shape":"WorkflowProfileName"}+    },+    "WorkflowProfileName":{"type":"string"},+    "WorkflowProfileParameterTemplates":{+      "type":"map",+      "key":{"shape":"WorkflowProfileName"},+      "value":{"shape":"WorkflowParameterTemplate"}+    },     "WorkflowRequestId":{
botocore/data/quicksight/2018-04-01/paginators-1.json +6 lines
--- +++ @@ -235,2 +235,8 @@       "result_key": "FlowSummaryList"+    },+    "ListOAuthClientApplications": {+      "input_token": "NextToken",+      "output_token": "NextToken",+      "limit_key": "MaxResults",+      "result_key": "OAuthClientApplications"     }
botocore/data/quicksight/2018-04-01/paginators-1.sdk-extras.json +6 lines
--- +++ @@ -76,2 +76,8 @@       },+      "ListOAuthClientApplications": {+        "non_aggregate_keys": [+          "Status",+          "RequestId"+        ]+      },       "ListIngestions": {
botocore/data/quicksight/2018-04-01/service-2.json +503 lines
--- +++ @@ -394,2 +394,22 @@     },+    "CreateOAuthClientApplication":{+      "name":"CreateOAuthClientApplication",+      "http":{+        "method":"POST",+        "requestUri":"/accounts/{AwsAccountId}/oauth-client-applications"+      },+      "input":{"shape":"CreateOAuthClientApplicationRequest"},+      "output":{"shape":"CreateOAuthClientApplicationResponse"},+      "errors":[+        {"shape":"AccessDeniedException"},+        {"shape":"ConflictException"},+        {"shape":"InvalidParameterValueException"},+        {"shape":"LimitExceededException"},+        {"shape":"ResourceNotFoundException"},+        {"shape":"ResourceExistsException"},+        {"shape":"ThrottlingException"},+        {"shape":"InternalFailureException"}+      ],+      "documentation":"<p>Creates an OAuthClientApplication.</p>"+    },     "CreateRefreshSchedule":{@@ -947,2 +967,20 @@     },+    "DeleteOAuthClientApplication":{+      "name":"DeleteOAuthClientApplication",+      "http":{+        "method":"DELETE",+        "requestUri":"/accounts/{AwsAccountId}/oauth-client-applications/{OAuthClientApplicationId}"+      },+      "input":{"shape":"DeleteOAuthClientApplicationRequest"},+      "output":{"shape":"DeleteOAuthClientApplicationResponse"},+      "errors":[+        {"shape":"AccessDeniedException"},+        {"shape":"ConflictException"},+        {"shape":"InvalidParameterValueException"},+        {"shape":"ResourceNotFoundException"},+        {"shape":"ThrottlingException"},+        {"shape":"InternalFailureException"}+      ],+      "documentation":"<p>Deletes an OAuthClientApplication.</p>"+    },     "DeleteRefreshSchedule":{@@ -1876,2 +1914,19 @@       "documentation":"<p>Describes the current namespace.</p>"+    },+    "DescribeOAuthClientApplication":{+      "name":"DescribeOAuthClientApplication",+      "http":{+        "method":"GET",+        "requestUri":"/accounts/{AwsAccountId}/oauth-client-applications/{OAuthClientApplicationId}"+      },+      "input":{"shape":"DescribeOAuthClientApplicationRequest"},+      "output":{"shape":"DescribeOAuthClientApplicationResponse"},+      "errors":[+        {"shape":"AccessDeniedException"},+        {"shape":"InvalidParameterValueException"},+        {"shape":"ResourceNotFoundException"},+        {"shape":"ThrottlingException"},+        {"shape":"InternalFailureException"}+      ],+      "documentation":"<p>Describes an OAuthClientApplication.</p>"     },@@ -2751,2 +2806,20 @@     },+    "ListOAuthClientApplications":{+      "name":"ListOAuthClientApplications",+      "http":{+        "method":"GET",+        "requestUri":"/accounts/{AwsAccountId}/oauth-client-applications"+      },+      "input":{"shape":"ListOAuthClientApplicationsRequest"},+      "output":{"shape":"ListOAuthClientApplicationsResponse"},+      "errors":[+        {"shape":"AccessDeniedException"},+        {"shape":"InvalidParameterValueException"},+        {"shape":"ResourceNotFoundException"},+        {"shape":"ThrottlingException"},+        {"shape":"InvalidNextTokenException"},+        {"shape":"InternalFailureException"}+      ],+      "documentation":"<p>Lists all OAuthClientApplications in the current Amazon Web Services Region that belong to this Amazon Web Services account.</p>"+    },     "ListRefreshSchedules":{@@ -3988,2 +4061,21 @@       "documentation":"<p>Updates a customer managed key in a Quick Sight account.</p>"+    },+    "UpdateOAuthClientApplication":{+      "name":"UpdateOAuthClientApplication",+      "http":{+        "method":"PUT",+        "requestUri":"/accounts/{AwsAccountId}/oauth-client-applications/{OAuthClientApplicationId}"+      },+      "input":{"shape":"UpdateOAuthClientApplicationRequest"},+      "output":{"shape":"UpdateOAuthClientApplicationResponse"},+      "errors":[+        {"shape":"AccessDeniedException"},+        {"shape":"ConflictException"},+        {"shape":"InvalidParameterValueException"},+        {"shape":"LimitExceededException"},+        {"shape":"ResourceNotFoundException"},+        {"shape":"ThrottlingException"},+        {"shape":"InternalFailureException"}+      ],+      "documentation":"<p>Updates an OAuthClientApplication.</p>"     },@@ -12251,2 +12343,89 @@           "documentation":"<p>Specifies the type of your user identity directory. Currently, this supports users with an identity type of <code>QUICKSIGHT</code>.</p>"+        },+        "RequestId":{+          "shape":"String",+          "documentation":"<p>The Amazon Web Services request ID for this operation.</p>"+        },+        "Status":{+          "shape":"StatusCode",+          "documentation":"<p>The HTTP status of the request.</p>",+          "location":"statusCode"+        }+      }+    },+    "CreateOAuthClientApplicationRequest":{+      "type":"structure",+      "required":[+        "AwsAccountId",+        "OAuthClientApplicationId",+        "Name",+        "OAuthClientAuthenticationType",+        "ClientId",+        "ClientSecret",+        "OAuthTokenEndpointUrl"+      ],+      "members":{+        "AwsAccountId":{+          "shape":"AwsAccountId",+          "documentation":"<p>The Amazon Web Services account ID.</p>",+          "location":"uri",+          "locationName":"AwsAccountId"+        },+        "OAuthClientApplicationId":{+          "shape":"OAuthClientApplicationId",+          "documentation":"<p>An ID for the OAuthClientApplication that you want to create. This ID is unique per Amazon Web Services Region for each Amazon Web Services account.</p>"+        },+        "Name":{+          "shape":"ResourceName",+          "documentation":"<p>The display name for the OAuthClientApplication.</p>"+        },+        "OAuthClientAuthenticationType":{+          "shape":"OAuthClientAuthenticationType",+          "documentation":"<p>The authentication type to use for the OAuthClientApplication. This determines the OAuth 2.0 grant flow that is used when the data source connects to the identity provider. Valid values are <code>TOKEN</code>.</p>"+        },+        "ClientId":{+          "shape":"OAuthClientId",+          "documentation":"<p>The client ID of the OAuth application that is registered with the identity provider.</p>"+        },+        "ClientSecret":{+          "shape":"OAuthClientSecret",+          "documentation":"<p>The client secret of the OAuth application that is registered with the identity provider.</p>"+        },+        "OAuthTokenEndpointUrl":{+          "shape":"OAuthTokenEndpointUrl",+          "documentation":"<p>The token endpoint URL of the identity provider that is used to obtain access tokens.</p>"+        },+        "OAuthAuthorizationEndpointUrl":{+          "shape":"OAuthAuthorizationEndpointUrl",+          "documentation":"<p>The authorization endpoint URL of the identity provider that is used to obtain authorization codes.</p>"+        },+        "OAuthScopes":{+          "shape":"OAuthScopesString",+          "documentation":"<p>The OAuth scopes that are requested when the OAuthClientApplication obtains an access token from the identity provider.</p>"+        },+        "DataSourceType":{+          "shape":"DataSourceType",+          "documentation":"<p>The type of data source that the OAuthClientApplication is used with. Valid values are <code>SNOWFLAKE</code>.</p>"+        },+        "IdentityProviderVpcConnectionProperties":{"shape":"VpcConnectionProperties"},+        "Tags":{+          "shape":"TagList",+          "documentation":"<p>Contains a map of the key-value pairs for the resource tag or tags assigned to the OAuthClientApplication.</p>"+        }+      }+    },+    "CreateOAuthClientApplicationResponse":{+      "type":"structure",+      "members":{+        "Arn":{+          "shape":"Arn",+          "documentation":"<p>The Amazon Resource Name (ARN) of the OAuthClientApplication.</p>"+        },+        "OAuthClientApplicationId":{+          "shape":"OAuthClientApplicationId",+          "documentation":"<p>The ID of the OAuthClientApplication. This ID is unique per Amazon Web Services Region for each Amazon Web Services account.</p>"+        },+        "CreationStatus":{+          "shape":"ResourceStatus",+          "documentation":"<p>The status of creating the OAuthClientApplication.</p>"         },@@ -17061,2 +17240,45 @@     },+    "DeleteOAuthClientApplicationRequest":{+      "type":"structure",+      "required":[+        "AwsAccountId",+        "OAuthClientApplicationId"+      ],+      "members":{+        "AwsAccountId":{+          "shape":"AwsAccountId",+          "documentation":"<p>The Amazon Web Services account ID.</p>",+          "location":"uri",+          "locationName":"AwsAccountId"+        },+        "OAuthClientApplicationId":{+          "shape":"OAuthClientApplicationId",+          "documentation":"<p>The ID of the OAuthClientApplication that you want to delete.</p>",+          "location":"uri",+          "locationName":"OAuthClientApplicationId"+        }+      }+    },+    "DeleteOAuthClientApplicationResponse":{+      "type":"structure",+      "members":{+        "Arn":{+          "shape":"Arn",+          "documentation":"<p>The Amazon Resource Name (ARN) of the OAuthClientApplication that you deleted.</p>"+        },+        "OAuthClientApplicationId":{+          "shape":"OAuthClientApplicationId",+          "documentation":"<p>The ID of the OAuthClientApplication. This ID is unique per Amazon Web Services Region for each Amazon Web Services account.</p>"+        },+        "RequestId":{+          "shape":"String",+          "documentation":"<p>The Amazon Web Services request ID for this operation.</p>"+        },+        "Status":{+          "shape":"StatusCode",+          "documentation":"<p>The HTTP status of the request.</p>",+          "location":"statusCode"+        }+      }+    },     "DeleteRefreshScheduleRequest":{@@ -19568,2 +19790,41 @@           "documentation":"<p>The information about the namespace that you're describing. The response includes the namespace ARN, name, Amazon Web Services Region, creation status, and identity store. <code>DescribeNamespace</code> also works for namespaces that are in the process of being created. For incomplete namespaces, this API operation lists the namespace error types and messages associated with the creation process.</p>"+        },+        "RequestId":{+          "shape":"String",
… 297 more lines (truncated)
botocore/data/rds-data/2018-08-01/service-2.json +25 lines
--- +++ @@ -33,4 +33,4 @@         {"shape":"InvalidResourceStateException"},+        {"shape":"ForbiddenException"},         {"shape":"ServiceUnavailableError"},-        {"shape":"ForbiddenException"},         {"shape":"DatabaseNotFoundException"},@@ -61,4 +61,4 @@         {"shape":"InvalidResourceStateException"},+        {"shape":"ForbiddenException"},         {"shape":"ServiceUnavailableError"},-        {"shape":"ForbiddenException"},         {"shape":"DatabaseNotFoundException"},@@ -88,4 +88,4 @@         {"shape":"InvalidResourceStateException"},+        {"shape":"ForbiddenException"},         {"shape":"ServiceUnavailableError"},-        {"shape":"ForbiddenException"},         {"shape":"DatabaseNotFoundException"},@@ -138,4 +138,4 @@         {"shape":"InvalidResourceStateException"},+        {"shape":"ForbiddenException"},         {"shape":"ServiceUnavailableError"},-        {"shape":"ForbiddenException"},         {"shape":"DatabaseNotFoundException"},@@ -166,4 +166,4 @@         {"shape":"InvalidResourceStateException"},+        {"shape":"ForbiddenException"},         {"shape":"ServiceUnavailableError"},-        {"shape":"ForbiddenException"},         {"shape":"DatabaseNotFoundException"},@@ -193,3 +193,3 @@       "type":"string",-      "max":100,+      "max":570,       "min":11@@ -199,3 +199,4 @@       "member":{"shape":"ArrayValue"},-      "documentation":"<p>An array of arrays.</p> <note> <p>Some array entries can be null.</p> </note>"+      "documentation":"<p>An array of arrays. Can contain null values.</p>",+      "sparse":true     },@@ -206,3 +207,3 @@           "shape":"BooleanArray",-          "documentation":"<p>An array of Boolean values.</p>"+          "documentation":"<p>An array of Boolean values. Can contain null values.</p>"         },@@ -210,3 +211,3 @@           "shape":"LongArray",-          "documentation":"<p>An array of integers.</p>"+          "documentation":"<p>An array of integers. Can contain null values.</p>"         },@@ -214,3 +215,3 @@           "shape":"DoubleArray",-          "documentation":"<p>An array of floating-point numbers.</p>"+          "documentation":"<p>An array of floating-point numbers. Can contain null values.</p>"         },@@ -218,3 +219,3 @@           "shape":"StringArray",-          "documentation":"<p>An array of strings.</p>"+          "documentation":"<p>An array of strings. Can contain null values.</p>"         },@@ -222,3 +223,3 @@           "shape":"ArrayOfArray",-          "documentation":"<p>An array of arrays.</p>"+          "documentation":"<p>An array of arrays. Can contain null values.</p>"         }@@ -337,3 +338,4 @@       "member":{"shape":"BoxedBoolean"},-      "documentation":"<p>An array of Boolean values.</p> <note> <p>Some array entries can be null.</p> </note>"+      "documentation":"<p>An array of Boolean values. Can contain null values.</p>",+      "sparse":true     },@@ -492,4 +494,3 @@       "type":"structure",-      "members":{-      },+      "members":{},       "documentation":"<p>The writer instance in the DB cluster isn't available.</p>",@@ -514,3 +515,4 @@       "member":{"shape":"BoxedDouble"},-      "documentation":"<p>An array of floating-point numbers.</p> <note> <p>Some array entries can be null.</p> </note>"+      "documentation":"<p>An array of floating-point numbers. Can contain null values.</p>",+      "sparse":true     },@@ -572,3 +574,3 @@           "shape":"Arn",-          "documentation":"<p>The ARN of the secret that enables access to the DB cluster. Enter the database user name and password for the credentials in the secret.</p> <p>For information about creating the secret, see <a href=\"https://docs.aws.amazon.com/secretsmanager/latest/userguide/create_database_secret.html\">Create a database secret</a>.</p>"+          "documentation":"<p>The ARN of the secret that enables access to the DB cluster. Enter the database user name and password for the credentials in the secret.</p> <p>For information about creating the secret, see <a href=\"https://docs.aws.amazon.com/secretsmanager/latest/userguide/create_database_secret.html\">Create a database secret</a>.</p> <note> <p>When you use the CLI on Linux to reference a secret created in the RDS console, the ARN might include special characters like <code>rds!cluster</code>. If you enclose the ARN in double quotes, the <code>!</code> character might trigger a shell expansion error, such as <code>-bash: !cluster: event not found</code>. To avoid this, escape the exclamation mark (\\!) in the ARN or enclose the entire ARN in single quotes (') instead of double quotes.</p> <p>Alternatively, disable shell history expansion by running <code>set +H</code> before you execute the command.</p> </note>"         },@@ -714,4 +716,3 @@       "type":"structure",-      "members":{-      },+      "members":{},       "documentation":"<p>An internal error occurred.</p>",@@ -749,3 +750,4 @@       "member":{"shape":"BoxedLong"},-      "documentation":"<p>An array of integers.</p> <note> <p>Some array entries can be null.</p> </note>"+      "documentation":"<p>An array of integers. Can contain null values.</p>",+      "sparse":true     },@@ -893,4 +895,3 @@       "type":"structure",-      "members":{-      },+      "members":{},       "documentation":"<p>The service specified by the <code>resourceArn</code> parameter isn't available.</p>",@@ -976,3 +977,4 @@       "member":{"shape":"String"},-      "documentation":"<p>An array of strings.</p> <note> <p>Some array entries can be null.</p> </note>"+      "documentation":"<p>An array of strings. Can contain null values.</p>",+      "sparse":true     },
botocore/data/route53resolver/2018-04-01/paginators-1.json +6 lines
--- +++ @@ -97,2 +97,8 @@       "result_key": "OutpostResolvers"+    },+    "ListFirewallRuleTypes": {+      "input_token": "NextToken",+      "output_token": "NextToken",+      "limit_key": "MaxResults",+      "result_key": "FirewallRuleTypes"     }
botocore/data/route53resolver/2018-04-01/service-2.json +631 lines
--- +++ @@ -95,2 +95,53 @@     },+    "BatchCreateFirewallRule":{+      "name":"BatchCreateFirewallRule",+      "http":{+        "method":"POST",+        "requestUri":"/"+      },+      "input":{"shape":"BatchCreateFirewallRuleRequest"},+      "output":{"shape":"BatchCreateFirewallRuleResponse"},+      "errors":[+        {"shape":"ValidationException"},+        {"shape":"LimitExceededException"},+        {"shape":"AccessDeniedException"},+        {"shape":"InternalServiceErrorException"},+        {"shape":"ThrottlingException"}+      ],+      "documentation":"<p>Creates multiple DNS Firewall rules in the specified rule group.</p>"+    },+    "BatchDeleteFirewallRule":{+      "name":"BatchDeleteFirewallRule",+      "http":{+        "method":"POST",+        "requestUri":"/"+      },+      "input":{"shape":"BatchDeleteFirewallRuleRequest"},+      "output":{"shape":"BatchDeleteFirewallRuleResponse"},+      "errors":[+        {"shape":"ValidationException"},+        {"shape":"LimitExceededException"},+        {"shape":"AccessDeniedException"},+        {"shape":"InternalServiceErrorException"},+        {"shape":"ThrottlingException"}+      ],+      "documentation":"<p>Deletes multiple DNS Firewall rules from the specified rule group.</p>"+    },+    "BatchUpdateFirewallRule":{+      "name":"BatchUpdateFirewallRule",+      "http":{+        "method":"POST",+        "requestUri":"/"+      },+      "input":{"shape":"BatchUpdateFirewallRuleRequest"},+      "output":{"shape":"BatchUpdateFirewallRuleResponse"},+      "errors":[+        {"shape":"ValidationException"},+        {"shape":"LimitExceededException"},+        {"shape":"AccessDeniedException"},+        {"shape":"InternalServiceErrorException"},+        {"shape":"ThrottlingException"}+      ],+      "documentation":"<p>Updates multiple DNS Firewall rules in the specified rule group.</p>"+    },     "CreateFirewallDomainList":{@@ -772,2 +823,18 @@     },+    "ListFirewallRuleTypes":{+      "name":"ListFirewallRuleTypes",+      "http":{+        "method":"POST",+        "requestUri":"/"+      },+      "input":{"shape":"ListFirewallRuleTypesRequest"},+      "output":{"shape":"ListFirewallRuleTypesResponse"},+      "errors":[+        {"shape":"ValidationException"},+        {"shape":"AccessDeniedException"},+        {"shape":"InternalServiceErrorException"},+        {"shape":"ThrottlingException"}+      ],+      "documentation":"<p>Retrieves the available rule types that can be used in DNS Firewall rules.</p>"+    },     "ListFirewallRules":{@@ -1391,2 +1458,137 @@     },+    "BatchCreateFirewallRuleError":{+      "type":"structure",+      "members":{+        "FirewallRule":{+          "shape":"CreateFirewallRuleEntry",+          "documentation":"<p>The firewall rule entry that caused the error.</p>"+        },+        "Code":{+          "shape":"String",+          "documentation":"<p>The error code for the failure.</p>"+        },+        "Message":{+          "shape":"String",+          "documentation":"<p>A message that provides details about the error.</p>"+        }+      },+      "documentation":"<p>An error that occurred while creating a firewall rule in a batch operation.</p>"+    },+    "BatchCreateFirewallRuleErrors":{+      "type":"list",+      "member":{"shape":"BatchCreateFirewallRuleError"}+    },+    "BatchCreateFirewallRuleRequest":{+      "type":"structure",+      "required":["CreateFirewallRuleEntries"],+      "members":{+        "CreateFirewallRuleEntries":{+          "shape":"CreateFirewallRuleEntries",+          "documentation":"<p>The list of firewall rules to create.</p>"+        }+      }+    },+    "BatchCreateFirewallRuleResponse":{+      "type":"structure",+      "members":{+        "CreatedFirewallRules":{+          "shape":"FirewallRules",+          "documentation":"<p>The firewall rules that were successfully created by the request.</p>"+        },+        "CreateErrors":{+          "shape":"BatchCreateFirewallRuleErrors",+          "documentation":"<p>A list of errors that occurred while creating the firewall rules.</p>"+        }+      }+    },+    "BatchDeleteFirewallRuleError":{+      "type":"structure",+      "members":{+        "FirewallRule":{+          "shape":"DeleteFirewallRuleEntry",+          "documentation":"<p>The firewall rule entry that caused the error.</p>"+        },+        "Code":{+          "shape":"String",+          "documentation":"<p>The error code for the failure.</p>"+        },+        "Message":{+          "shape":"String",+          "documentation":"<p>A message that provides details about the error.</p>"+        }+      },+      "documentation":"<p>An error that occurred while deleting a firewall rule in a batch operation.</p>"+    },+    "BatchDeleteFirewallRuleErrors":{+      "type":"list",+      "member":{"shape":"BatchDeleteFirewallRuleError"}+    },+    "BatchDeleteFirewallRuleRequest":{+      "type":"structure",+      "required":["DeleteFirewallRuleEntries"],+      "members":{+        "DeleteFirewallRuleEntries":{+          "shape":"DeleteFirewallRuleEntries",+          "documentation":"<p>The list of firewall rules to delete.</p>"+        }+      }+    },+    "BatchDeleteFirewallRuleResponse":{+      "type":"structure",+      "members":{+        "DeletedFirewallRules":{+          "shape":"FirewallRules",+          "documentation":"<p>The firewall rules that were successfully deleted by the request.</p>"+        },+        "DeleteErrors":{+          "shape":"BatchDeleteFirewallRuleErrors",+          "documentation":"<p>A list of errors that occurred while deleting the firewall rules.</p>"+        }+      }+    },+    "BatchUpdateFirewallRuleError":{+      "type":"structure",+      "members":{+        "FirewallRule":{+          "shape":"UpdateFirewallRuleEntry",+          "documentation":"<p>The firewall rule entry that caused the error.</p>"+        },+        "Code":{+          "shape":"String",+          "documentation":"<p>The error code for the failure.</p>"+        },+        "Message":{+          "shape":"String",+          "documentation":"<p>A message that provides details about the error.</p>"+        }+      },+      "documentation":"<p>An error that occurred while updating a firewall rule in a batch operation.</p>"+    },+    "BatchUpdateFirewallRuleErrors":{+      "type":"list",+      "member":{"shape":"BatchUpdateFirewallRuleError"}+    },+    "BatchUpdateFirewallRuleRequest":{+      "type":"structure",+      "required":["UpdateFirewallRuleEntries"],+      "members":{+        "UpdateFirewallRuleEntries":{+          "shape":"UpdateFirewallRuleEntries",+          "documentation":"<p>The list of firewall rules to update.</p>"+        }+      }+    },+    "BatchUpdateFirewallRuleResponse":{+      "type":"structure",+      "members":{+        "UpdatedFirewallRules":{+          "shape":"FirewallRules",+          "documentation":"<p>The firewall rules that were successfully updated by the request.</p>"+        },+        "UpdateErrors":{+          "shape":"BatchUpdateFirewallRuleErrors",+          "documentation":"<p>A list of errors that occurred while updating the firewall rules.</p>"+        }+      }+    },     "BlockOverrideDnsType":{@@ -1414,2 +1616,6 @@     "Boolean":{"type":"boolean"},+    "Category":{+      "type":"string",+      "max":256+    },     "ConfidenceThreshold":{@@ -1463,35 +1669,7 @@     },-    "CreateFirewallRuleGroupRequest":{-      "type":"structure",-      "required":[-        "CreatorRequestId",-        "Name"-      ],-      "members":{-        "CreatorRequestId":{-          "shape":"CreatorRequestId",-          "documentation":"<p>A unique string defined by you to identify the request. This allows you to retry failed requests without the risk of running the operation twice. This can be any unique string, for example, a timestamp. </p>",-          "idempotencyToken":true-        },-        "Name":{-          "shape":"Name",-          "documentation":"<p>A name that lets you identify the rule group, to manage and use it.</p>"-        },-        "Tags":{-          "shape":"TagList",-          "documentation":"<p>A list of the tag keys and values that you want to associate with the rule group. </p>",-          "box":true-        }-      }-    },-    "CreateFirewallRuleGroupResponse":{-      "type":"structure",-      "members":{-        "FirewallRuleGroup":{-          "shape":"FirewallRuleGroup",
… 495 more lines (truncated)
botocore/data/sesv2/2019-09-27/service-2.json +162 lines
--- +++ @@ -282,3 +282,3 @@       ],-      "documentation":"<p>Create a tenant.</p> <p> <i>Tenants</i> are logical containers that group related SES resources together. Each tenant can have its own set of resources like email identities, configuration sets, and templates, along with reputation metrics and sending status. This helps isolate and manage email sending for different customers or business units within your Amazon SES API v2 account.</p>"+      "documentation":"<p>Create a tenant.</p> <p> <i>Tenants</i> are logical containers that group related SES resources together. Each tenant can have its own set of resources like email identities, configuration sets, and templates, along with reputation metrics and sending status. This helps isolate and manage email sending for different customers or business units within your Amazon SES API v2 account.</p> <p>You can optionally specify <code>SuppressionAttributes</code> to configure tenant-level suppression at creation time. When tenant-level suppression is enabled, Amazon SES maintains a separate suppression list for the tenant instead of using the account-level suppression list.</p>"     },@@ -468,3 +468,3 @@       ],-      "documentation":"<p>Removes an email address from the suppression list for your account.</p>"+      "documentation":"<p>Removes an email address from the suppression list for your account or for a specific tenant. To target a tenant's suppression list, specify the <code>TenantName</code> parameter. If you omit <code>TenantName</code>, the address is removed from the account-level suppression list.</p>"     },@@ -766,3 +766,3 @@       ],-      "documentation":"<p>Displays the template object (which includes the subject line, HTML part and text part) for the template you specify.</p> <p>You can execute this operation no more than once per second.</p>"+      "documentation":"<p>Displays the template object (which includes the subject line, HTML part and text part) for the template you specify.</p> <p>You can execute this operation no more than 50 times per second.</p>"     },@@ -856,3 +856,3 @@       ],-      "documentation":"<p>Retrieves information about a specific email address that's on the suppression list for your account.</p>"+      "documentation":"<p>Retrieves information about a specific email address that's on the suppression list for your account or for a specific tenant. To target a tenant's suppression list, specify the <code>TenantName</code> parameter. If you omit <code>TenantName</code>, the operation targets the account-level suppression list.</p>"     },@@ -871,3 +871,3 @@       ],-      "documentation":"<p>Get information about a specific tenant, including the tenant's name, ID, ARN, creation timestamp, tags, and sending status.</p>"+      "documentation":"<p>Get information about a specific tenant, including the tenant's name, ID, ARN, creation timestamp, tags, sending status, and suppression attributes.</p>"     },@@ -1099,5 +1099,6 @@         {"shape":"TooManyRequestsException"},-        {"shape":"InvalidNextTokenException"}-      ],-      "documentation":"<p>Retrieves a list of email addresses that are on the suppression list for your account.</p>"+        {"shape":"InvalidNextTokenException"},+        {"shape":"NotFoundException"}+      ],+      "documentation":"<p>Retrieves a list of email addresses that are on the suppression list for your account or for a specific tenant. To target a tenant's suppression list, specify the <code>TenantName</code> parameter. If you omit <code>TenantName</code>, the operation targets the account-level suppression list.</p>"     },@@ -1292,3 +1293,3 @@       ],-      "documentation":"<p>Specify the account suppression list preferences for a configuration set.</p>"+      "documentation":"<p>Specify the suppression list preferences for a configuration set. You can also use this operation to specify a <code>SuppressionScope</code> to override the suppression scope of the tenant or account for emails sent using this configuration set.</p>"     },@@ -1473,5 +1474,21 @@         {"shape":"BadRequestException"},-        {"shape":"TooManyRequestsException"}-      ],-      "documentation":"<p>Adds an email address to the suppression list for your account.</p>"+        {"shape":"TooManyRequestsException"},+        {"shape":"NotFoundException"}+      ],+      "documentation":"<p>Adds an email address to the suppression list for your account or for a specific tenant. To target a tenant's suppression list, specify the <code>TenantName</code> parameter. If you omit <code>TenantName</code>, the address is added to the account-level suppression list.</p>"+    },+    "PutTenantSuppressionAttributes":{+      "name":"PutTenantSuppressionAttributes",+      "http":{+        "method":"POST",+        "requestUri":"/v2/email/tenant/suppression"+      },+      "input":{"shape":"PutTenantSuppressionAttributesRequest"},+      "output":{"shape":"PutTenantSuppressionAttributesResponse"},+      "errors":[+        {"shape":"NotFoundException"},+        {"shape":"TooManyRequestsException"},+        {"shape":"BadRequestException"}+      ],+      "documentation":"<p>Configure the suppression list preferences for a tenant. Use this operation to enable or disable tenant-level suppression, or to change the suppressed reasons for a tenant.</p> <p>When you set the suppression scope to <code>TENANT</code>, Amazon SES maintains a separate suppression list for the tenant. When you set the scope to <code>ACCOUNT</code>, the tenant uses the account-level suppression list.</p>"     },@@ -2146,3 +2163,3 @@           "shape":"DimensionName",-          "documentation":"<p>The name of an Amazon CloudWatch dimension associated with an email sending metric. The name has to meet the following criteria:</p> <ul> <li> <p>It can only contain ASCII letters (a–z, A–Z), numbers (0–9), underscores (_), or dashes (-).</p> </li> <li> <p>It can contain no more than 256 characters.</p> </li> </ul>"+          "documentation":"<p>The name of an Amazon CloudWatch dimension associated with an email sending metric. The name has to meet the following criteria:</p> <ul> <li> <p>It can only contain ASCII letters (a–z, A–Z), numbers (0–9), underscores (_), or dashes (-).</p> </li> <li> <p>It can contain no more than 255 characters.</p> </li> </ul>"         },@@ -2154,3 +2171,3 @@           "shape":"DefaultDimensionValue",-          "documentation":"<p>The default value of the dimension that is published to Amazon CloudWatch if you don't provide the value of the dimension when you send an email. This value has to meet the following criteria:</p> <ul> <li> <p>Can only contain ASCII letters (a–z, A–Z), numbers (0–9), underscores (_), or dashes (-), at signs (@), and periods (.).</p> </li> <li> <p>It can contain no more than 256 characters.</p> </li> </ul>"+          "documentation":"<p>The default value of the dimension that is published to Amazon CloudWatch if you don't provide the value of the dimension when you send an email. This value has to meet the following criteria:</p> <ul> <li> <p>Can only contain ASCII letters (a–z, A–Z), numbers (0–9), underscores (_), or dashes (-), at signs (@), and periods (.).</p> </li> <li> <p>It can contain no more than 255 characters.</p> </li> </ul>"         }@@ -2349,3 +2366,6 @@         },-        "SuppressionOptions":{"shape":"SuppressionOptions"},+        "SuppressionOptions":{+          "shape":"SuppressionOptions",+          "documentation":"<p>An object that contains information about the suppression list preferences for the configuration set. You can optionally include a <code>SuppressionScope</code> to override the tenant or account suppression scope for emails sent using this configuration set.</p>"+        },         "VdmOptions":{@@ -2745,2 +2765,6 @@           "documentation":"<p>An array of objects that define the tags (keys and values) to associate with the tenant</p>"+        },+        "SuppressionAttributes":{+          "shape":"TenantSuppressionAttributes",+          "documentation":"<p>An object that contains information about the suppression list preferences for the tenant. Use this to configure tenant-level suppression at creation time.</p>"         }@@ -2798,3 +2822,4 @@           "documentation":"<p>The status of email sending capability for the tenant.</p>"-        }+        },+        "SuppressionAttributes":{"shape":"TenantSuppressionAttributes"}       },@@ -2939,3 +2964,3 @@       "type":"string",-      "documentation":"<p>The default value of the dimension that is published to Amazon CloudWatch if you don't provide the value of the dimension when you send an email. This value has to meet the following criteria:</p> <ul> <li> <p>It can only contain ASCII letters (a–z, A–Z), numbers (0–9), underscores (_), or dashes (-).</p> </li> <li> <p>It can contain no more than 256 characters.</p> </li> </ul>"+      "documentation":"<p>The default value of the dimension that is published to Amazon CloudWatch if you don't provide the value of the dimension when you send an email. This value has to meet the following criteria:</p> <ul> <li> <p>It can only contain ASCII letters (a–z, A–Z), numbers (0–9), underscores (_), or dashes (-).</p> </li> <li> <p>It can contain no more than 255 characters.</p> </li> </ul>"     },@@ -3155,8 +3180,14 @@           "shape":"EmailAddress",-          "documentation":"<p>The suppressed email destination to remove from the account suppression list.</p>",+          "documentation":"<p>The suppressed email destination to remove from the suppression list for your account or for the specified tenant.</p>",           "location":"uri",           "locationName":"EmailAddress"-        }-      },-      "documentation":"<p>A request to remove an email address from the suppression list for your account.</p>"+        },+        "TenantName":{+          "shape":"TenantName",+          "documentation":"<p>The name of the tenant whose suppression list you want to remove the address from. If you omit this parameter, the address is removed from the account-level suppression list.</p>",+          "location":"querystring",+          "locationName":"TenantName"+        }+      },+      "documentation":"<p>A request to remove an email address from the suppression list for your account or for a specific tenant.</p>"     },@@ -3324,3 +3355,3 @@       "type":"string",-      "documentation":"<p>The name of an Amazon CloudWatch dimension associated with an email sending metric. The name has to meet the following criteria:</p> <ul> <li> <p>It can only contain ASCII letters (a-z, A-Z), numbers (0-9), underscores (_), or dashes (-).</p> </li> <li> <p>It can contain no more than 256 characters.</p> </li> </ul>"+      "documentation":"<p>The name of an Amazon CloudWatch dimension associated with an email sending metric. The name has to meet the following criteria:</p> <ul> <li> <p>It can only contain ASCII letters (a-z, A-Z), numbers (0-9), underscores (_), or dashes (-).</p> </li> <li> <p>It can contain no more than 255 characters.</p> </li> </ul>"     },@@ -4171,3 +4202,3 @@           "shape":"SuppressionOptions",-          "documentation":"<p>An object that contains information about the suppression list preferences for your account.</p>"+          "documentation":"<p>An object that contains information about the suppression list preferences for your account or for a specific tenant.</p>"         },@@ -4929,8 +4960,14 @@           "shape":"EmailAddress",-          "documentation":"<p>The email address that's on the account suppression list.</p>",+          "documentation":"<p>The email address that's on the suppression list for your account or for the specified tenant.</p>",           "location":"uri",           "locationName":"EmailAddress"-        }-      },-      "documentation":"<p>A request to retrieve information about an email address that's on the suppression list for your account.</p>"+        },+        "TenantName":{+          "shape":"TenantName",+          "documentation":"<p>The name of the tenant whose suppression list you want to query. If you omit this parameter, the operation targets the account-level suppression list.</p>",+          "location":"querystring",+          "locationName":"TenantName"+        }+      },+      "documentation":"<p>A request to retrieve information about an email address that's on the suppression list for your account or for a specific tenant.</p>"     },@@ -5836,5 +5873,11 @@       "members":{+        "TenantName":{+          "shape":"TenantName",+          "documentation":"<p>The name of the tenant whose suppression list you want to retrieve. If you omit this parameter, the operation targets the account-level suppression list.</p>",+          "location":"querystring",+          "locationName":"TenantName"+        },         "Reasons":{           "shape":"SuppressionListReasons",-          "documentation":"<p>The factors that caused the email address to be added to .</p>",+          "documentation":"<p>The factors that caused the email address to be added to the suppression list for your account or for a specific tenant.</p>",           "location":"querystring",@@ -5867,3 +5910,3 @@       },-      "documentation":"<p>A request to obtain a list of email destinations that are on the suppression list for your account.</p>"+      "documentation":"<p>A request to obtain a list of email destinations that are on the suppression list for your account or for a specific tenant.</p>"     },@@ -5878,3 +5921,3 @@           "shape":"NextToken",-          "documentation":"<p>A token that indicates that there are additional email addresses on the suppression list for your account. To view additional suppressed addresses, issue another request to <code>ListSuppressedDestinations</code>, and pass this token in the <code>NextToken</code> parameter.</p>"+          "documentation":"<p>A token that indicates that there are additional email addresses on the suppression list for your account or for the specified tenant. To view additional suppressed addresses, issue another request to <code>ListSuppressedDestinations</code>, and pass this token in the <code>NextToken</code> parameter.</p>"         }@@ -6707,5 +6750,9 @@         },+        "SuppressionScope":{+          "shape":"SuppressionListScope",+          "documentation":"<p>The suppression scope for the configuration set. This overrides the tenant or account suppression scope for emails sent using this configuration set. Can be one of the following:</p> <ul> <li> <p> <code>TENANT</code> – Use the tenant's suppression list.</p> </li> <li> <p> <code>ACCOUNT</code> – Use the account-level suppression list.</p> </li> </ul>"+        },         "SuppressedReasons":{           "shape":"SuppressionListReasons",-          "documentation":"<p>A list that contains the reasons that email addresses are automatically added to the suppression list for your account. This list can contain any or all of the following:</p> <ul> <li> <p> <code>COMPLAINT</code> – Amazon SES adds an email address to the suppression list for your account when a message sent to that address results in a complaint.</p> </li> <li> <p> <code>BOUNCE</code> – Amazon SES adds an email address to the suppression list for your account when a message sent to that address results in a hard bounce.</p> </li> </ul>"+          "documentation":"<p>A list that contains the reasons that email addresses are automatically added to the suppression list for your account or for a specific tenant. This list can contain any or all of the following:</p> <ul> <li> <p> <code>COMPLAINT</code> – Amazon SES adds an email address to the suppression list for your account or for a specific tenant when a message sent to that address results in a complaint.</p> </li> <li> <p> <code>BOUNCE</code> – Amazon SES adds an email address to the suppression list for your account or for a specific tenant when a message sent to that address results in a hard bounce.</p> </li> </ul>"         },@@ -6716,3 +6763,3 @@       },-      "documentation":"<p>A request to change the account suppression list preferences for a specific configuration set.</p>"+      "documentation":"<p>A request to change the suppression list preferences for a specific configuration set.</p>"     },@@ -7006,3 +7053,3 @@           "shape":"EmailAddress",-          "documentation":"<p>The email address that should be added to the suppression list for your account.</p>"+          "documentation":"<p>The email address that should be added to the suppression list for your account or for the specified tenant.</p>"         },@@ -7010,6 +7057,10 @@           "shape":"SuppressionListReason",-          "documentation":"<p>The factors that should cause the email address to be added to the suppression list for your account.</p>"-        }-      },-      "documentation":"<p>A request to add an email destination to the suppression list for your account.</p>"+          "documentation":"<p>The factors that should cause the email address to be added to the suppression list for your account or for the specified tenant.</p>"+        },+        "TenantName":{+          "shape":"TenantName",+          "documentation":"<p>The name of the tenant whose suppression list you want to add the address to. If you omit this parameter, the address is added to the account-level suppression list.</p>"+        }+      },+      "documentation":"<p>A request to add an email destination to the suppression list for your account or for a specific tenant.</p>"     },@@ -7019,2 +7070,26 @@       "documentation":"<p>An HTTP 200 response if the request succeeds, or an error message if the request fails.</p>"+    },+    "PutTenantSuppressionAttributesRequest":{+      "type":"structure",+      "required":["TenantName"],+      "members":{+        "TenantName":{+          "shape":"TenantName",+          "documentation":"<p>The name of the tenant to configure suppression list preferences for.</p>"+        },+        "SuppressedReasons":{+          "shape":"SuppressionListReasons",+          "documentation":"<p>A list that contains the reasons that email addresses are automatically added to the suppression list for the tenant. This list can contain any or all of the following:</p> <ul> <li> <p> <code>COMPLAINT</code> – Amazon SES adds an email address to the suppression list when a message sent to that address results in a complaint.</p> </li> <li> <p> <code>BOUNCE</code> – Amazon SES adds an email address to the suppression list when a message sent to that address results in a hard bounce.</p> </li> </ul>"+        },+        "SuppressionScope":{+          "shape":"SuppressionListScope",+          "documentation":"<p>The suppression scope for the tenant. Specify <code>TENANT</code> to use the tenant's own suppression list, or <code>ACCOUNT</code> to use the account-level suppression list.</p> <note> <p>If you don't specify a suppression scope, the tenant defaults to <code>ACCOUNT</code> scope and uses the account-level suppression list.</p> </note>"+        }+      },+      "documentation":"<p>A request to configure the suppression list preferences for a tenant.</p>"+    },+    "PutTenantSuppressionAttributesResponse":{+      "type":"structure",+      "members":{},+      "documentation":"<p>If the action is successful, the service sends back an HTTP 200 response with an empty HTTP body.</p>"     },@@ -7652,3 +7727,3 @@           "shape":"EmailAddress",-          "documentation":"<p>The email address that is on the suppression list for your account.</p>"+          "documentation":"<p>The email address that is on the suppression list for your account or for a specific tenant.</p>"         },@@ -7656,3 +7731,3 @@           "shape":"SuppressionListReason",-          "documentation":"<p>The reason that the address was added to the suppression list for your account.</p>"+          "documentation":"<p>The reason that the address was added to the suppression list for your account or for a specific tenant.</p>"         },@@ -7664,6 +7739,10 @@           "shape":"SuppressedDestinationAttributes",-          "documentation":"<p>An optional value that can contain additional information about the reasons that the address was added to the suppression list for your account.</p>"
… 92 more lines (truncated)
docs/source/conf.py +1 lines
--- +++ @@ -61,3 +61,3 @@ # The full version, including alpha/beta/rc tags.-release = '1.43.17'+release = '1.43.18' 
charset-normalizer pypi
3.4.7 1mo ago nominal
critical-tier no findings
latest 3.4.7 versions 61 maintainers 1 critical-tier (snapshotted)
3.2.0
3.3.0
3.3.1
3.3.2
3.4.0
3.4.1
3.4.2
3.4.3
3.4.4
3.4.5
3.4.6
3.4.7
CLEAN
no findings — nominal
release diff 3.4.6 → 3.4.7
+0 added · -0 removed · ~10 modified
pyproject.toml +2 lines
--- +++ @@ -1,3 +1,3 @@ [build-system]-requires = ["setuptools>=68,<=82.0.0"]+requires = ["setuptools>=68,<82.1"] build-backend = "backend"@@ -33,2 +33,3 @@   "Programming Language :: Python :: Implementation :: PyPy",+  "Programming Language :: Python :: Free Threading :: 4 - Resilient",   "Topic :: Text Processing :: Linguistic",
src/charset_normalizer/api.py +22 lines
--- +++ @@ -359,10 +359,24 @@             else:-                decoded_payload = str(-                    (-                        sequences-                        if strip_sig_or_bom is False-                        else sequences[len(sig_payload) :]-                    ),-                    encoding=encoding_iana,-                )+                # UTF-7 BOM is encoded in modified Base64 whose byte boundary+                # can overlap with the next character. Stripping raw SIG bytes+                # before decoding may leave stray bytes that decode as garbage.+                # Decode the full sequence and remove the leading BOM char instead.+                # see https://github.com/jawah/charset_normalizer/issues/718+                # and https://github.com/jawah/charset_normalizer/issues/716+                if encoding_iana == "utf_7" and bom_or_sig_available:+                    decoded_payload = str(+                        sequences,+                        encoding=encoding_iana,+                    )+                    if decoded_payload and decoded_payload[0] == "\ufeff":+                        decoded_payload = decoded_payload[1:]+                else:+                    decoded_payload = str(+                        (+                            sequences+                            if strip_sig_or_bom is False+                            else sequences[len(sig_payload) :]+                        ),+                        encoding=encoding_iana,+                    )         except (UnicodeDecodeError, LookupError) as e:
src/charset_normalizer/constant.py +1 lines
--- +++ @@ -11,2 +11,3 @@     "utf_7": [+        b"\x2b\x2f\x76\x38\x2d",         b"\x2b\x2f\x76\x38",@@ -15,3 +16,2 @@         b"\x2b\x2f\x76\x2f",-        b"\x2b\x2f\x76\x38\x2d",     ],
src/charset_normalizer/models.py +10 lines
--- +++ @@ -77,2 +77,12 @@             self._string = str(self._payload, self._encoding, "strict")+            # UTF-7 BOM is encoded in modified Base64 whose byte boundary+            # can overlap with the next character, so raw-byte stripping+            # is unreliable. Strip the decoded BOM character instead.+            if (+                self._has_sig_or_bom+                and self._encoding == "utf_7"+                and self._string+                and self._string[0] == "\ufeff"+            ):+                self._string = self._string[1:]         return self._string
src/charset_normalizer/version.py +1 lines
--- +++ @@ -6,3 +6,3 @@ -__version__ = "3.4.6"+__version__ = "3.4.7" VERSION = __version__.split(".")
tests/test_base_detection.py +26 lines
--- +++ @@ -35,2 +35,3 @@         ("\uFEFF".encode("gb18030"), "gb18030"),+        ("\uFEFF".encode("utf-7"), "utf_7"),         (b"\xef\xbb\xbf", "utf_8"),@@ -92,2 +93,6 @@         ),+        (+            ("\uFEFF" + "🐕").encode("utf-7"),+            "utf_7",+        ),     ],@@ -102,2 +107,23 @@     assert best_guess.byte_order_mark is True, "The BOM/SIG property should return True"++[email protected](+    "content",+    [+        ".testing",+        "-testing",+        "+testing",+    ],+)+def test_utf7_sig_content_is_stripped(content):+    """UTF-7 BOM is encoded in modified Base64 whose byte boundary can overlap+    with the next character.  Verify that the SIG is cleanly removed regardless+    of the character that follows."""+    payload = ("\ufeff" + content).encode("utf-7")+    best_guess = from_bytes(payload).best()++    assert best_guess is not None+    assert best_guess.encoding == "utf_7"+    assert best_guess.byte_order_mark is True+    assert str(best_guess) == content 
h11 pypi
0.16.0 1y ago nominal
BURSTINSTALL-EXEC
latest 0.16.0 versions 14 maintainers 1
0.6.0
0.7.0
0.8.0
0.8.1
0.9.0
0.10.0
0.11.0
0.12.0
0.13.0
0.14.0
0.15.0
0.16.0
BURST
2 releases in 28m: 0.15.0, 0.16.0
info · registry-verified · 2025-04-24 · 1y ago
INSTALL-EXEC
setup.py in sdist uses subprocess/exec (runs at pip install)
warn · snapshot-derived
release diff 0.15.0 → 0.16.0
+0 added · -0 removed · ~6 modified
h11/_readers.py +13 lines
--- +++ @@ -150,6 +150,5 @@         self._bytes_in_chunk = 0-        # After reading a chunk, we have to throw away the trailing \r\n; if-        # this is >0 then we discard that many bytes before resuming regular-        # de-chunkification.-        self._bytes_to_discard = 0+        # After reading a chunk, we have to throw away the trailing \r\n.+        # This tracks the bytes that we need to match and throw away.+        self._bytes_to_discard = b""         self._reading_trailer = False@@ -162,11 +161,15 @@             return EndOfMessage(headers=list(_decode_header_lines(lines)))-        if self._bytes_to_discard > 0:-            data = buf.maybe_extract_at_most(self._bytes_to_discard)+        if self._bytes_to_discard:+            data = buf.maybe_extract_at_most(len(self._bytes_to_discard))             if data is None:                 return None-            self._bytes_to_discard -= len(data)-            if self._bytes_to_discard > 0:+            if data != self._bytes_to_discard[: len(data)]:+                raise LocalProtocolError(+                    f"malformed chunk footer: {data!r} (expected {self._bytes_to_discard!r})"+                )+            self._bytes_to_discard = self._bytes_to_discard[len(data) :]+            if self._bytes_to_discard:                 return None             # else, fall through and read some more-        assert self._bytes_to_discard == 0+        assert self._bytes_to_discard == b""         if self._bytes_in_chunk == 0:@@ -196,3 +199,3 @@         if self._bytes_in_chunk == 0:-            self._bytes_to_discard = 2+            self._bytes_to_discard = b"\r\n"             chunk_end = True
h11/_version.py +1 lines
--- +++ @@ -15,2 +15,2 @@ -__version__ = "0.15.0"+__version__ = "0.16.0"
h11/tests/test_io.py +38 lines
--- +++ @@ -354,3 +354,9 @@     buf = makebuf(data)-    assert _run_reader(thunk(), buf, do_eof) == expected+    try:+        assert _run_reader(thunk(), buf, do_eof) == expected+    except LocalProtocolError:+        if LocalProtocolError in expected:+            pass+        else:+            raise @@ -361,7 +367,13 @@     events = []-    for i in range(len(data)):-        events += _run_reader(reader, buf, False)-        buf += data[i : i + 1]-    events += _run_reader(reader, buf, do_eof)-    assert normalize_data_events(events) == expected+    try:+        for i in range(len(data)):+            events += _run_reader(reader, buf, False)+            buf += data[i : i + 1]+        events += _run_reader(reader, buf, do_eof)+        assert normalize_data_events(events) == expected+    except LocalProtocolError:+        if LocalProtocolError in expected:+            pass+        else:+            raise @@ -426,10 +438,8 @@     # refuses arbitrarily long chunk integers-    with pytest.raises(LocalProtocolError):-        # Technically this is legal HTTP/1.1, but we refuse to process chunk-        # sizes that don't fit into 20 characters of hex-        t_body_reader(ChunkedReader, b"9" * 100 + b"\r\nxxx", [Data(data=b"xxx")])+    # Technically this is legal HTTP/1.1, but we refuse to process chunk+    # sizes that don't fit into 20 characters of hex+    t_body_reader(ChunkedReader, b"9" * 100 + b"\r\nxxx", [LocalProtocolError])      # refuses garbage in the chunk count-    with pytest.raises(LocalProtocolError):-        t_body_reader(ChunkedReader, b"10\x00\r\nxxx", None)+    t_body_reader(ChunkedReader, b"10\x00\r\nxxx", [LocalProtocolError]) @@ -447,5 +457,18 @@         ChunkedReader,-        b"5   	 \r\n01234\r\n" + b"0\r\n\r\n",+        b"5   \t \r\n01234\r\n" + b"0\r\n\r\n",         [Data(data=b"01234"), EndOfMessage()],     )++    # Chunked encoding with bad chunk termination characters are refused. Originally we+    # simply dropped the 2 bytes after a chunk, instead of validating that the bytes+    # were \r\n -- so we would successfully decode the data below as b"xxxa". And+    # apparently there are other HTTP processors that ignore the chunk length and just+    # keep reading until they see \r\n, so they would decode it as b"xxx__1a". Any time+    # two HTTP processors accept the same input but interpret it differently, there's a+    # possibility of request smuggling shenanigans. So we now reject this.+    t_body_reader(ChunkedReader, b"3\r\nxxx__1a\r\n", [LocalProtocolError])++    # Confirm we check both bytes individually+    t_body_reader(ChunkedReader, b"3\r\nxxx\r_1a\r\n", [LocalProtocolError])+    t_body_reader(ChunkedReader, b"3\r\nxxx_\n1a\r\n", [LocalProtocolError]) @@ -473,4 +496,4 @@     w = ContentLengthWriter(5)-    dowrite(w, Data(data=b"123")) == b"123"-    dowrite(w, Data(data=b"45")) == b"45"+    assert dowrite(w, Data(data=b"123")) == b"123"+    assert dowrite(w, Data(data=b"45")) == b"45"     with pytest.raises(LocalProtocolError):
idna pypi
3.17 3d ago nominal
critical-tier BURST
latest 3.17 versions 40 maintainers 1 critical-tier (snapshotted)
3.6
3.7
3.8
3.9
3.10
3.11
3.12
3.13
3.14
3.15
3.16
3.17
BURST
2 releases in 23m: 0.7, 0.8
info · registry-verified · 2014-07-10 · 11y ago
release diff 3.16 → 3.17
+0 added · -0 removed · ~7 modified
idna/core.py +44 lines
--- +++ @@ -11,2 +11,3 @@ _alabel_prefix = b"xn--"+_max_input_length = 1024 _unicode_dots_re = re.compile("[\u002e\u3002\uff0e\uff61]")@@ -22,4 +23,11 @@ _bidi_ltr_valid_ending = frozenset({"L", "EN"})-_bidi_joiner_l_or_d = frozenset({ord("L"), ord("D")})-_bidi_joiner_r_or_d = frozenset({ord("R"), ord("D")})+_bidi_joiner_l_or_d = frozenset({"L", "D"})+_bidi_joiner_r_or_d = frozenset({"R", "D"})+++def _joining_type(cp: int) -> Optional[str]:+    for jt, ranges in idnadata.joining_types.items():+        if intranges_contain(cp, ranges):+            return jt+    return None @@ -106,2 +114,4 @@     """+    if len(label) > _max_input_length:+        raise IDNAError("Label too long")     # Bidi rules should only be applied if string contains RTL characters@@ -202,2 +212,4 @@     """+    if len(label) > _max_input_length:+        raise IDNAError("Label too long")     if unicodedata.normalize("NFC", label) != label:@@ -220,3 +232,6 @@         determining its combining class.-    """+    :raises IDNAError: If ``label`` exceeds the defensive input length limit.+    """+    if len(label) > _max_input_length:+        raise IDNAError("Label too long")     cp_value = ord(label[pos])@@ -229,4 +244,4 @@         for i in range(pos - 1, -1, -1):-            joining_type = idnadata.joining_types().get(ord(label[i]))-            if joining_type == ord("T"):+            joining_type = _joining_type(ord(label[i]))+            if joining_type == "T":                 continue@@ -242,4 +257,4 @@         for i in range(pos + 1, len(label)):-            joining_type = idnadata.joining_types().get(ord(label[i]))-            if joining_type == ord("T"):+            joining_type = _joining_type(ord(label[i]))+            if joining_type == "T":                 continue@@ -270,3 +285,6 @@         recognised CONTEXTO codepoint).-    """+    :raises IDNAError: If ``label`` exceeds the defensive input length limit.+    """+    if len(label) > _max_input_length:+        raise IDNAError("Label too long")     cp_value = ord(label[pos])@@ -321,2 +339,4 @@     """+    if len(label) > _max_input_length:+        raise IDNAError("Label too long")     if isinstance(label, (bytes, bytearray)):@@ -369,2 +389,4 @@     """+    if len(label) > _max_input_length:+        raise IDNAError("Label too long")     try:@@ -401,2 +423,4 @@     """+    if len(label) > _max_input_length:+        raise IDNAError("Label too long")     if not isinstance(label, (bytes, bytearray)):@@ -447,4 +471,7 @@         codepoint under the chosen rules.-    """-    from .uts46data import uts46data+    :raises IDNAError: If ``domain`` exceeds the defensive input length limit.+    """+    if len(domain) > _max_input_length:+        raise IDNAError("Domain too long")+    from .uts46data import uts46_replacements, uts46_starts, uts46_statuses @@ -454,7 +481,5 @@         code_point = ord(char)-        uts46row = uts46data[code_point if code_point < 256 else bisect.bisect_left(uts46data, (code_point, "Z")) - 1]-        status = uts46row[1]-        replacement: Optional[str] = None-        if len(uts46row) == 3:-            replacement = uts46row[2]  # ty: ignore[index-out-of-bounds]+        i = code_point if code_point < 256 else bisect.bisect_right(uts46_starts, code_point) - 1+        status = chr(uts46_statuses[i])+        replacement: Optional[str] = uts46_replacements[i] @@ -524,2 +549,4 @@             raise IDNAError("should pass a unicode string to the function rather than a byte string.") from err+    if len(s) > _max_input_length:+        raise IDNAError("Domain too long")     if uts46:@@ -582,2 +609,4 @@             raise IDNAError("Invalid ASCII in A-label") from err+    if len(s) > _max_input_length:+        raise IDNAError("Domain too long")     if uts46:
idna/idnadata.py +541 lines
--- +++ @@ -1,4 +1,2 @@ # This file is automatically generated by tools/idna-data--from functools import cache @@ -106,3010 +104,543 @@ -@cache-def joining_types() -> dict[int, int]:-    return {-        0xAD: 84,-        0x300: 84,-        0x301: 84,-        0x302: 84,-        0x303: 84,-        0x304: 84,-        0x305: 84,-        0x306: 84,-        0x307: 84,-        0x308: 84,-        0x309: 84,-        0x30A: 84,-        0x30B: 84,-        0x30C: 84,-        0x30D: 84,-        0x30E: 84,-        0x30F: 84,-        0x310: 84,-        0x311: 84,-        0x312: 84,-        0x313: 84,-        0x314: 84,-        0x315: 84,-        0x316: 84,-        0x317: 84,-        0x318: 84,-        0x319: 84,-        0x31A: 84,-        0x31B: 84,-        0x31C: 84,-        0x31D: 84,-        0x31E: 84,-        0x31F: 84,-        0x320: 84,-        0x321: 84,-        0x322: 84,-        0x323: 84,-        0x324: 84,-        0x325: 84,-        0x326: 84,-        0x327: 84,-        0x328: 84,-        0x329: 84,-        0x32A: 84,-        0x32B: 84,-        0x32C: 84,-        0x32D: 84,-        0x32E: 84,-        0x32F: 84,-        0x330: 84,-        0x331: 84,-        0x332: 84,-        0x333: 84,-        0x334: 84,-        0x335: 84,-        0x336: 84,-        0x337: 84,-        0x338: 84,-        0x339: 84,-        0x33A: 84,-        0x33B: 84,-        0x33C: 84,-        0x33D: 84,-        0x33E: 84,-        0x33F: 84,-        0x340: 84,-        0x341: 84,-        0x342: 84,-        0x343: 84,-        0x344: 84,-        0x345: 84,-        0x346: 84,-        0x347: 84,-        0x348: 84,-        0x349: 84,-        0x34A: 84,-        0x34B: 84,-        0x34C: 84,-        0x34D: 84,-        0x34E: 84,-        0x34F: 84,-        0x350: 84,-        0x351: 84,-        0x352: 84,-        0x353: 84,-        0x354: 84,-        0x355: 84,-        0x356: 84,-        0x357: 84,-        0x358: 84,-        0x359: 84,-        0x35A: 84,-        0x35B: 84,-        0x35C: 84,-        0x35D: 84,-        0x35E: 84,-        0x35F: 84,-        0x360: 84,-        0x361: 84,-        0x362: 84,-        0x363: 84,-        0x364: 84,-        0x365: 84,-        0x366: 84,-        0x367: 84,-        0x368: 84,-        0x369: 84,-        0x36A: 84,-        0x36B: 84,-        0x36C: 84,-        0x36D: 84,-        0x36E: 84,-        0x36F: 84,-        0x483: 84,-        0x484: 84,-        0x485: 84,-        0x486: 84,-        0x487: 84,-        0x488: 84,-        0x489: 84,-        0x591: 84,-        0x592: 84,-        0x593: 84,-        0x594: 84,-        0x595: 84,-        0x596: 84,-        0x597: 84,-        0x598: 84,-        0x599: 84,-        0x59A: 84,-        0x59B: 84,-        0x59C: 84,-        0x59D: 84,-        0x59E: 84,-        0x59F: 84,-        0x5A0: 84,-        0x5A1: 84,-        0x5A2: 84,-        0x5A3: 84,-        0x5A4: 84,-        0x5A5: 84,-        0x5A6: 84,-        0x5A7: 84,-        0x5A8: 84,-        0x5A9: 84,-        0x5AA: 84,-        0x5AB: 84,-        0x5AC: 84,-        0x5AD: 84,-        0x5AE: 84,-        0x5AF: 84,-        0x5B0: 84,-        0x5B1: 84,-        0x5B2: 84,-        0x5B3: 84,-        0x5B4: 84,-        0x5B5: 84,-        0x5B6: 84,-        0x5B7: 84,-        0x5B8: 84,-        0x5B9: 84,-        0x5BA: 84,-        0x5BB: 84,-        0x5BC: 84,-        0x5BD: 84,-        0x5BF: 84,-        0x5C1: 84,-        0x5C2: 84,-        0x5C4: 84,-        0x5C5: 84,-        0x5C7: 84,-        0x610: 84,-        0x611: 84,-        0x612: 84,-        0x613: 84,-        0x614: 84,-        0x615: 84,-        0x616: 84,-        0x617: 84,-        0x618: 84,-        0x619: 84,-        0x61A: 84,-        0x61C: 84,-        0x620: 68,-        0x622: 82,-        0x623: 82,-        0x624: 82,-        0x625: 82,-        0x626: 68,-        0x627: 82,-        0x628: 68,-        0x629: 82,-        0x62A: 68,-        0x62B: 68,-        0x62C: 68,-        0x62D: 68,-        0x62E: 68,-        0x62F: 82,-        0x630: 82,-        0x631: 82,-        0x632: 82,-        0x633: 68,-        0x634: 68,-        0x635: 68,-        0x636: 68,-        0x637: 68,-        0x638: 68,-        0x639: 68,-        0x63A: 68,-        0x63B: 68,-        0x63C: 68,-        0x63D: 68,-        0x63E: 68,-        0x63F: 68,-        0x640: 67,-        0x641: 68,-        0x642: 68,-        0x643: 68,-        0x644: 68,-        0x645: 68,-        0x646: 68,-        0x647: 68,-        0x648: 82,-        0x649: 68,-        0x64A: 68,-        0x64B: 84,-        0x64C: 84,-        0x64D: 84,-        0x64E: 84,-        0x64F: 84,-        0x650: 84,-        0x651: 84,-        0x652: 84,-        0x653: 84,-        0x654: 84,-        0x655: 84,-        0x656: 84,-        0x657: 84,
… 3309 more lines (truncated)
idna/package_data.py +1 lines
--- +++ @@ -1 +1 @@-__version__ = "3.16"+__version__ = "3.17"
idna/uts46data.py +16887 lines
--- +++ @@ -2,3 +2,4 @@ -from typing import Union+from array import array+from typing import Optional @@ -9,8375 +10,16887 @@ -uts46data: tuple[Union[tuple[int, str], tuple[int, str, str]], ...] = (-    (0x0, "V"),-    (0x1, "V"),-    (0x2, "V"),-    (0x3, "V"),-    (0x4, "V"),-    (0x5, "V"),-    (0x6, "V"),-    (0x7, "V"),-    (0x8, "V"),-    (0x9, "V"),-    (0xA, "V"),-    (0xB, "V"),-    (0xC, "V"),-    (0xD, "V"),-    (0xE, "V"),-    (0xF, "V"),-    (0x10, "V"),-    (0x11, "V"),-    (0x12, "V"),-    (0x13, "V"),-    (0x14, "V"),-    (0x15, "V"),-    (0x16, "V"),-    (0x17, "V"),-    (0x18, "V"),-    (0x19, "V"),-    (0x1A, "V"),-    (0x1B, "V"),-    (0x1C, "V"),-    (0x1D, "V"),-    (0x1E, "V"),-    (0x1F, "V"),-    (0x20, "V"),-    (0x21, "V"),-    (0x22, "V"),-    (0x23, "V"),-    (0x24, "V"),-    (0x25, "V"),-    (0x26, "V"),-    (0x27, "V"),-    (0x28, "V"),-    (0x29, "V"),-    (0x2A, "V"),-    (0x2B, "V"),-    (0x2C, "V"),-    (0x2D, "V"),-    (0x2E, "V"),-    (0x2F, "V"),-    (0x30, "V"),-    (0x31, "V"),-    (0x32, "V"),-    (0x33, "V"),-    (0x34, "V"),-    (0x35, "V"),-    (0x36, "V"),-    (0x37, "V"),-    (0x38, "V"),-    (0x39, "V"),-    (0x3A, "V"),-    (0x3B, "V"),-    (0x3C, "V"),-    (0x3D, "V"),-    (0x3E, "V"),-    (0x3F, "V"),-    (0x40, "V"),-    (0x41, "M", "a"),-    (0x42, "M", "b"),-    (0x43, "M", "c"),-    (0x44, "M", "d"),-    (0x45, "M", "e"),-    (0x46, "M", "f"),-    (0x47, "M", "g"),-    (0x48, "M", "h"),-    (0x49, "M", "i"),-    (0x4A, "M", "j"),-    (0x4B, "M", "k"),-    (0x4C, "M", "l"),-    (0x4D, "M", "m"),-    (0x4E, "M", "n"),-    (0x4F, "M", "o"),-    (0x50, "M", "p"),-    (0x51, "M", "q"),-    (0x52, "M", "r"),-    (0x53, "M", "s"),-    (0x54, "M", "t"),-    (0x55, "M", "u"),-    (0x56, "M", "v"),-    (0x57, "M", "w"),-    (0x58, "M", "x"),-    (0x59, "M", "y"),-    (0x5A, "M", "z"),-    (0x5B, "V"),-    (0x5C, "V"),-    (0x5D, "V"),-    (0x5E, "V"),-    (0x5F, "V"),-    (0x60, "V"),-    (0x61, "V"),-    (0x62, "V"),-    (0x63, "V"),-    (0x64, "V"),-    (0x65, "V"),-    (0x66, "V"),-    (0x67, "V"),-    (0x68, "V"),-    (0x69, "V"),-    (0x6A, "V"),-    (0x6B, "V"),-    (0x6C, "V"),-    (0x6D, "V"),-    (0x6E, "V"),-    (0x6F, "V"),-    (0x70, "V"),-    (0x71, "V"),-    (0x72, "V"),-    (0x73, "V"),-    (0x74, "V"),-    (0x75, "V"),-    (0x76, "V"),-    (0x77, "V"),-    (0x78, "V"),-    (0x79, "V"),-    (0x7A, "V"),-    (0x7B, "V"),-    (0x7C, "V"),-    (0x7D, "V"),-    (0x7E, "V"),-    (0x7F, "V"),-    (0x80, "X"),-    (0x81, "X"),-    (0x82, "X"),-    (0x83, "X"),-    (0x84, "X"),-    (0x85, "X"),-    (0x86, "X"),-    (0x87, "X"),-    (0x88, "X"),-    (0x89, "X"),-    (0x8A, "X"),-    (0x8B, "X"),-    (0x8C, "X"),-    (0x8D, "X"),-    (0x8E, "X"),-    (0x8F, "X"),-    (0x90, "X"),-    (0x91, "X"),-    (0x92, "X"),-    (0x93, "X"),-    (0x94, "X"),-    (0x95, "X"),-    (0x96, "X"),-    (0x97, "X"),-    (0x98, "X"),-    (0x99, "X"),-    (0x9A, "X"),-    (0x9B, "X"),-    (0x9C, "X"),-    (0x9D, "X"),-    (0x9E, "X"),-    (0x9F, "X"),-    (0xA0, "M", " "),-    (0xA1, "V"),-    (0xA2, "V"),-    (0xA3, "V"),-    (0xA4, "V"),-    (0xA5, "V"),-    (0xA6, "V"),-    (0xA7, "V"),-    (0xA8, "M", " ̈"),-    (0xA9, "V"),-    (0xAA, "M", "a"),-    (0xAB, "V"),-    (0xAC, "V"),-    (0xAD, "I"),-    (0xAE, "V"),-    (0xAF, "M", " ̄"),-    (0xB0, "V"),-    (0xB1, "V"),-    (0xB2, "M", "2"),-    (0xB3, "M", "3"),-    (0xB4, "M", " ́"),-    (0xB5, "M", "μ"),-    (0xB6, "V"),-    (0xB7, "V"),-    (0xB8, "M", " ̧"),-    (0xB9, "M", "1"),-    (0xBA, "M", "o"),-    (0xBB, "V"),-    (0xBC, "M", "1⁄4"),-    (0xBD, "M", "1⁄2"),-    (0xBE, "M", "3⁄4"),-    (0xBF, "V"),-    (0xC0, "M", "à"),-    (0xC1, "M", "á"),-    (0xC2, "M", "â"),-    (0xC3, "M", "ã"),-    (0xC4, "M", "ä"),-    (0xC5, "M", "å"),-    (0xC6, "M", "æ"),-    (0xC7, "M", "ç"),-    (0xC8, "M", "è"),-    (0xC9, "M", "é"),-    (0xCA, "M", "ê"),-    (0xCB, "M", "ë"),-    (0xCC, "M", "ì"),-    (0xCD, "M", "í"),-    (0xCE, "M", "î"),-    (0xCF, "M", "ï"),-    (0xD0, "M", "ð"),-    (0xD1, "M", "ñ"),-    (0xD2, "M", "ò"),-    (0xD3, "M", "ó"),-    (0xD4, "M", "ô"),-    (0xD5, "M", "õ"),-    (0xD6, "M", "ö"),-    (0xD7, "V"),-    (0xD8, "M", "ø"),-    (0xD9, "M", "ù"),-    (0xDA, "M", "ú"),-    (0xDB, "M", "û"),-    (0xDC, "M", "ü"),-    (0xDD, "M", "ý"),-    (0xDE, "M", "þ"),-    (0xDF, "D", "ss"),-    (0xE0, "V"),-    (0xE1, "V"),-    (0xE2, "V"),-    (0xE3, "V"),-    (0xE4, "V"),-    (0xE5, "V"),-    (0xE6, "V"),-    (0xE7, "V"),-    (0xE8, "V"),-    (0xE9, "V"),-    (0xEA, "V"),-    (0xEB, "V"),-    (0xEC, "V"),-    (0xED, "V"),-    (0xEE, "V"),
… 25019 more lines (truncated)
pycparser pypi
3.0 4mo ago nominal
no findings
latest 3.0 versions 24 maintainers 1
2.13
2.14
2.15
2.16
2.17
2.18
2.19
2.20
2.21
2.22
2.23
3.0
CLEAN
no findings — nominal
release diff 2.23 → 3.0
+1 added · -11 removed · ~33 modified
+4 more files not shown
setup.py +2 lines · 1 flagged
--- +++ @@ -1,67 +1,3 @@-import os, sys-try:-    from setuptools import setup-    from setuptools.command.install import install as _install-    from setuptools.command.sdist import sdist as _sdist-except ImportError:-    from distutils.core import setup-    from distutils.command.install import install as _install-    from distutils.command.sdist import sdist as _sdist+from setuptools import setup --def _run_build_tables(dir):-    from subprocess import check_call-    # This is run inside the install staging directory (that had no .pyc files)-    # We don't want to generate any.-    # https://github.com/eliben/pycparser/pull/135-    check_call([sys.executable, '-B', '_build_tables.py'],-               cwd=os.path.join(dir, 'pycparser'))---class install(_install):-    def run(self):-        _install.run(self)-        self.execute(_run_build_tables, (self.install_lib,),-                     msg="Build the lexing/parsing tables")---class sdist(_sdist):-    def make_release_tree(self, basedir, files):-        _sdist.make_release_tree(self, basedir, files)-        self.execute(_run_build_tables, (basedir,),-                     msg="Build the lexing/parsing tables")---setup(-    # metadata-    name='pycparser',-    description='C parser in Python',-    long_description="""-        pycparser is a complete parser of the C language, written in-        pure Python using the PLY parsing library.-        It parses C code into an AST and can serve as a front-end for-        C compilers or analysis tools.-    """,-    license='BSD-3-Clause',-    version='2.23',-    author='Eli Bendersky',-    maintainer='Eli Bendersky',-    author_email='[email protected]',-    url='https://github.com/eliben/pycparser',-    platforms='Cross Platform',-    classifiers = [-        'Development Status :: 5 - Production/Stable',-        'License :: OSI Approved :: BSD License',-        'Programming Language :: Python :: 3',-        'Programming Language :: Python :: 3.8',-        'Programming Language :: Python :: 3.9',-        'Programming Language :: Python :: 3.10',-        'Programming Language :: Python :: 3.11',-        'Programming Language :: Python :: 3.12',-        'Programming Language :: Python :: 3.13',-    ],-    python_requires=">=3.8",-    packages=['pycparser', 'pycparser.ply'],-    package_data={'pycparser': ['*.cfg']},-    cmdclass={'install': install, 'sdist': sdist},-)+setup()
examples/c-to-c.py +5 lines
--- +++ @@ -1,2 +1,2 @@-#------------------------------------------------------------------------------+# ------------------------------------------------------------------------------ # pycparser: c-to-c.py@@ -8,3 +8,3 @@ # License: BSD-#------------------------------------------------------------------------------+# ------------------------------------------------------------------------------ import sys@@ -13,3 +13,3 @@ # your site-packages/ with setup.py-sys.path.extend(['.', '..'])+sys.path.extend([".", ".."]) @@ -18,5 +18,4 @@ -def translate_to_c(filename):-    """ Simply use the c_generator module to emit a parsed AST.-    """+def translate_to_c(filename: str) -> None:+    """Simply use the c_generator module to emit a parsed AST."""     ast = parse_file(filename, use_cpp=True)
examples/c_json.py +71 lines
--- +++ @@ -1,2 +1,2 @@-#------------------------------------------------------------------------------+# ------------------------------------------------------------------------------ # pycparser: c_json.py@@ -35,3 +35,3 @@ #     }-#------------------------------------------------------------------------------+# ------------------------------------------------------------------------------ import json@@ -39,2 +39,3 @@ import re+from typing import Any, Callable, Dict, Optional, Set, TypeVar @@ -42,10 +43,10 @@ # your site-packages/ with setup.py-sys.path.extend(['.', '..'])+sys.path.extend([".", ".."])  from pycparser import parse_file, c_ast-from pycparser.plyparser import Coord---RE_CHILD_ARRAY = re.compile(r'(.*)\[(.*)\]')-RE_INTERNAL_ATTR = re.compile('__.*__')+from pycparser.c_parser import Coord+++RE_CHILD_ARRAY = re.compile(r"(.*)\[(.*)\]")+RE_INTERNAL_ATTR = re.compile("__.*__") @@ -56,9 +57,18 @@ -def memodict(fn):-    """ Fast memoization decorator for a function taking a single argument """-    class memodict(dict):-        def __missing__(self, key):-            ret = self[key] = fn(key)-            return ret-    return memodict().__getitem__+_T = TypeVar("_T")+_R = TypeVar("_R")+++def memodict(fn: Callable[[_T], _R]) -> Callable[[_T], _R]:+    """Fast memoization decorator for a function taking a single argument"""+    cache: Dict[_T, _R] = {}++    def memoized(arg: _T) -> _R:+        if arg in cache:+            return cache[arg]+        result = fn(arg)+        cache[arg] = result+        return result++    return memoized @@ -66,3 +76,3 @@ @memodict-def child_attrs_of(klass):+def child_attrs_of(klass: type[c_ast.Node]) -> Set[str]:     """@@ -77,10 +87,10 @@ -def to_dict(node):-    """ Recursively convert an ast into dict representation. """+def to_dict(node: c_ast.Node) -> Dict[str, Any]:+    """Recursively convert an ast into dict representation."""     klass = node.__class__ -    result = {}+    result: Dict[str, Any] = {}      # Metadata-    result['_nodetype'] = klass.__name__+    result["_nodetype"] = klass.__name__ @@ -92,5 +102,5 @@     if node.coord:-        result['coord'] = str(node.coord)+        result["coord"] = str(node.coord)     else:-        result['coord'] = None+        result["coord"] = None @@ -106,5 +116,8 @@             if array_index != len(result[array_name]):-                raise CJsonError('Internal ast error. Array {} out of order. '-                    'Expected index {}, got {}'.format(-                    array_name, len(result[array_name]), array_index))+                raise CJsonError(+                    "Internal ast error. Array {} out of order. "+                    "Expected index {}, got {}".format(+                        array_name, len(result[array_name]), array_index+                    )+                )             result[array_name].append(to_dict(child))@@ -121,4 +134,4 @@ -def to_json(node, **kwargs):-    """ Convert ast node to json string """+def to_json(node: c_ast.Node, **kwargs: Any) -> str:+    """Convert ast node to json string"""     return json.dumps(to_dict(node), **kwargs)@@ -126,4 +139,4 @@ -def file_to_dict(filename):-    """ Load C file into dict representation of ast """+def file_to_dict(filename: str) -> Dict[str, Any]:+    """Load C file into dict representation of ast"""     ast = parse_file(filename, use_cpp=True)@@ -132,4 +145,4 @@ -def file_to_json(filename, **kwargs):-    """ Load C file into json string representation of ast """+def file_to_json(filename: str, **kwargs: Any) -> str:+    """Load C file into json string representation of ast"""     ast = parse_file(filename, use_cpp=True)@@ -138,4 +151,4 @@ -def _parse_coord(coord_str):-    """ Parse coord string (file:line[:column]) into Coord object. """+def _parse_coord(coord_str: Optional[str]) -> Optional[Coord]:+    """Parse coord string (file:line[:column]) into Coord object."""     if coord_str is None:@@ -143,9 +156,11 @@ -    vals = coord_str.split(':')-    vals.extend([None] * 3)+    vals = coord_str.split(":")+    vals.extend(["", "", ""])     filename, line, column = vals[:3]-    return Coord(filename, line, column)---def _convert_to_obj(value):+    line_num = int(line) if line else 0+    column_num = int(column) if column else None+    return Coord(filename, line_num, column_num)+++def _convert_to_obj(value: Any) -> Any:     """@@ -155,15 +170,15 @@     """-    value_type = type(value)-    if value_type == dict:-        return from_dict(value)-    elif value_type == list:-        return [_convert_to_obj(item) for item in value]-    else:-        # String-        return value---def from_dict(node_dict):-    """ Recursively build an ast from dict representation """-    class_name = node_dict.pop('_nodetype')+    match value:+        case dict():+            return from_dict(value)+        case list():+            return [_convert_to_obj(item) for item in value]+        case _:+            # String+            return value+++def from_dict(node_dict: Dict[str, Any]) -> c_ast.Node:+    """Recursively build an ast from dict representation"""+    class_name = node_dict.pop("_nodetype") @@ -175,3 +190,3 @@     for key, value in node_dict.items():-        if key == 'coord':+        if key == "coord":             objs[key] = _parse_coord(value)@@ -185,4 +200,4 @@ -def from_json(ast_json):-    """ Build an ast from json string representation """+def from_json(ast_json: str) -> c_ast.Node:+    """Build an ast from json string representation"""     return from_dict(json.loads(ast_json))@@ -190,3 +205,3 @@ -#------------------------------------------------------------------------------+# ------------------------------------------------------------------------------ if __name__ == "__main__":
examples/cdecl.py +118 lines
--- +++ @@ -1,2 +1,2 @@-#-----------------------------------------------------------------+# ----------------------------------------------------------------- # pycparser: cdecl.py@@ -33,5 +33,6 @@ # License: BSD-#-----------------------------------------------------------------+# ----------------------------------------------------------------- import copy import sys+from typing import Optional @@ -39,3 +40,3 @@ # your site-packages/ with setup.py-sys.path.extend(['.', '..'])+sys.path.extend([".", ".."]) @@ -44,11 +45,13 @@ -def explain_c_declaration(c_decl, expand_struct=False, expand_typedef=False):-    """ Parses the declaration in c_decl and returns a text-        explanation as a string.--        The last external node of the string is used, to allow earlier typedefs-        for used types.--        expand_struct=True will spell out struct definitions recursively.-        expand_typedef=True will expand typedef'd types.+def explain_c_declaration(+    c_decl: str, expand_struct: bool = False, expand_typedef: bool = False+) -> str:+    """Parses the declaration in c_decl and returns a text+    explanation as a string.++    The last external node of the string is used, to allow earlier typedefs+    for used types.++    expand_struct=True will spell out struct definitions recursively.+    expand_typedef=True will expand typedef'd types.     """@@ -57,3 +60,3 @@     try:-        node = parser.parse(c_decl, filename='<stdin>')+        node = parser.parse(c_decl, filename="<stdin>")     except c_parser.ParseError:@@ -62,5 +65,3 @@ -    if (not isinstance(node, c_ast.FileAST) or-        not isinstance(node.ext[-1], c_ast.Decl)-        ):+    if not isinstance(node, c_ast.FileAST) or not isinstance(node.ext[-1], c_ast.Decl):         return "Not a valid declaration"@@ -68,5 +69,8 @@     try:-        expanded = expand_struct_typedef(node.ext[-1], node,-                                         expand_struct=expand_struct,-                                         expand_typedef=expand_typedef)+        expanded = expand_struct_typedef(+            node.ext[-1],+            node,+            expand_struct=expand_struct,+            expand_typedef=expand_typedef,+        )     except Exception as e:@@ -77,56 +81,52 @@ -def _explain_decl_node(decl_node):-    """ Receives a c_ast.Decl note and returns its explanation in-        English.+def _explain_decl_node(decl_node: c_ast.Decl) -> str:+    """Receives a c_ast.Decl note and returns its explanation in+    English.     """-    storage = ' '.join(decl_node.storage) + ' ' if decl_node.storage else ''--    return (decl_node.name +-            " is a " +-            storage +-            _explain_type(decl_node.type))---def _explain_type(decl):-    """ Recursively explains a type decl node-    """-    typ = type(decl)--    if typ == c_ast.TypeDecl:-        quals = ' '.join(decl.quals) + ' ' if decl.quals else ''-        return quals + _explain_type(decl.type)-    elif typ == c_ast.Typename or typ == c_ast.Decl:-        return _explain_type(decl.type)-    elif typ == c_ast.IdentifierType:-        return ' '.join(decl.names)-    elif typ == c_ast.PtrDecl:-        quals = ' '.join(decl.quals) + ' ' if decl.quals else ''-        return quals + 'pointer to ' + _explain_type(decl.type)-    elif typ == c_ast.ArrayDecl:-        arr = 'array'-        if decl.dim: arr += '[%s]' % decl.dim.value--        return arr + " of " + _explain_type(decl.type)--    elif typ == c_ast.FuncDecl:-        if decl.args:-            params = [_explain_type(param) for param in decl.args.params]-            args = ', '.join(params)-        else:-            args = ''--        return ('function(%s) returning ' % (args) +-                _explain_type(decl.type))--    elif typ == c_ast.Struct:-        decls = [_explain_decl_node(mem_decl) for mem_decl in decl.decls]-        members = ', '.join(decls)--        return ('struct%s ' % (' ' + decl.name if decl.name else '') +-                ('containing {%s}' % members if members else ''))---def expand_struct_typedef(cdecl, file_ast,-                          expand_struct=False,-                          expand_typedef=False):+    storage = " ".join(decl_node.storage) + " " if decl_node.storage else ""++    return decl_node.name + " is a " + storage + _explain_type(decl_node.type)+++def _explain_type(decl: c_ast.Node) -> str:+    """Recursively explains a type decl node"""+    match decl:+        case c_ast.TypeDecl():+            quals = " ".join(decl.quals) + " " if decl.quals else ""+            return quals + _explain_type(decl.type)+        case c_ast.Typename() | c_ast.Decl():+            return _explain_type(decl.type)+        case c_ast.IdentifierType():+            return " ".join(decl.names)+        case c_ast.PtrDecl():+            quals = " ".join(decl.quals) + " " if decl.quals else ""+            return quals + "pointer to " + _explain_type(decl.type)+        case c_ast.ArrayDecl():+            arr = "array"+            if decl.dim is not None:+                arr += f"[{decl.dim.value}]"+            return arr + " of " + _explain_type(decl.type)+        case c_ast.FuncDecl():+            if decl.args is not None:+                params = [_explain_type(param) for param in decl.args.params]+                args = ", ".join(params)+            else:+                args = ""+            return f"function({args}) returning " + _explain_type(decl.type)+        case c_ast.Struct():+            decls = [_explain_decl_node(mem_decl) for mem_decl in decl.decls]+            members = ", ".join(decls)+            struct_name = f" {decl.name}" if decl.name else ""+            contents = f"containing {{{members}}}" if members else ""+            return f"struct{struct_name} " + contents+        case _:+            return ""+++def expand_struct_typedef(+    cdecl: c_ast.Decl,+    file_ast: c_ast.FileAST,+    expand_struct: bool = False,+    expand_typedef: bool = False,+) -> c_ast.Decl:     """Expand struct & typedef and return a new expanded node."""@@ -137,33 +137,37 @@ -def _expand_in_place(decl, file_ast, expand_struct=False, expand_typedef=False):+def _expand_in_place(+    decl: c_ast.Node,+    file_ast: c_ast.FileAST,+    expand_struct: bool = False,+    expand_typedef: bool = False,+) -> c_ast.Node:     """Recursively expand struct & typedef in place, throw RuntimeError if-       undeclared struct or typedef are used+    undeclared struct or typedef are used     """-    typ = type(decl)--    if typ in (c_ast.Decl, c_ast.TypeDecl, c_ast.PtrDecl, c_ast.ArrayDecl):-        decl.type = _expand_in_place(decl.type, file_ast, expand_struct,-                                     expand_typedef)--    elif typ == c_ast.Struct:-        if not decl.decls:-            struct = _find_struct(decl.name, file_ast)-            if not struct:-                raise RuntimeError('using undeclared struct %s' % decl.name)-            decl.decls = struct.decls--        for i, mem_decl in enumerate(decl.decls):-            decl.decls[i] = _expand_in_place(mem_decl, file_ast, expand_struct,-                                             expand_typedef)-        if not expand_struct:-            decl.decls = []--    elif (typ == c_ast.IdentifierType and-          decl.names[0] not in ('int', 'char')):-        typedef = _find_typedef(decl.names[0], file_ast)-        if not typedef:-            raise RuntimeError('using undeclared type %s' % decl.names[0])--        if expand_typedef:-            return typedef.type+    match decl:+        case c_ast.Decl() | c_ast.TypeDecl() | c_ast.PtrDecl() | c_ast.ArrayDecl():+            decl.type = _expand_in_place(+                decl.type, file_ast, expand_struct, expand_typedef+            )+        case c_ast.Struct():+            if not decl.decls:+                struct = _find_struct(decl.name, file_ast)+                if struct is None:+                    raise RuntimeError(f"using undeclared struct {decl.name}")+                decl.decls = struct.decls++            for i, mem_decl in enumerate(decl.decls):+                decl.decls[i] = _expand_in_place(+                    mem_decl, file_ast, expand_struct, expand_typedef+                )+            if not expand_struct:+                decl.decls = []+        case c_ast.IdentifierType() if decl.names[0] not in ("int", "char"):+            typedef = _find_typedef(decl.names[0], file_ast)+            if typedef is None:+                raise RuntimeError(f"using undeclared type {decl.names[0]}")+            if expand_typedef:+                return typedef.type+        case _:+            pass @@ -172,18 +176,17 @@ -def _find_struct(name, file_ast):-    """Receives a struct name and return declared struct object in file_ast-    """+def _find_struct(name: str, file_ast: c_ast.FileAST) -> Optional[c_ast.Struct]:+    """Receives a struct name and return declared struct object in file_ast"""     for node in file_ast.ext:-        if (type(node) == c_ast.Decl and-           type(node.type) == c_ast.Struct and-           node.type.name == name):
… 25 more lines (truncated)
examples/construct_ast_from_scratch.py +23 lines
--- +++ @@ -12,3 +12,3 @@ # your site-packages/ with setup.py-sys.path.extend(['.', '..'])+sys.path.extend([".", ".."]) @@ -23,16 +23,23 @@ -def empty_main_function_ast():-    constant_zero = c_ast.Constant(type='int', value='0')+def empty_main_function_ast() -> c_ast.FuncDef:+    constant_zero = c_ast.Constant(type="int", value="0")     return_node = c_ast.Return(expr=constant_zero)     compound_node = c_ast.Compound(block_items=[return_node])-    type_decl_node = c_ast.TypeDecl(declname='main', quals=[],-                                    type=c_ast.IdentifierType(names=['int']),-                                    align=[])-    func_decl_node = c_ast.FuncDecl(args=c_ast.ParamList([]),-                                    type=type_decl_node)-    func_def_node = c_ast.Decl(name='main', quals=[], storage=[], funcspec=[],-                               type=func_decl_node, init=None,-                               bitsize=None, align=[])-    main_func_node = c_ast.FuncDef(decl=func_def_node, param_decls=None,-                                   body=compound_node)+    type_decl_node = c_ast.TypeDecl(+        declname="main", quals=[], type=c_ast.IdentifierType(names=["int"]), align=[]+    )+    func_decl_node = c_ast.FuncDecl(args=c_ast.ParamList([]), type=type_decl_node)+    func_def_node = c_ast.Decl(+        name="main",+        quals=[],+        storage=[],+        funcspec=[],+        type=func_decl_node,+        init=None,+        bitsize=None,+        align=[],+    )+    main_func_node = c_ast.FuncDef(+        decl=func_def_node, param_decls=None, body=compound_node+    ) @@ -41,3 +48,3 @@ -def generate_c_code(my_ast):+def generate_c_code(my_ast: c_ast.Node) -> str:     generator = c_generator.CGenerator()@@ -46,3 +53,3 @@ -if __name__ == '__main__':+if __name__ == "__main__":     main_function_ast = empty_main_function_ast()@@ -52,2 +59,2 @@     main_c_code = generate_c_code(main_function_ast)-    print("C code: \n%s" % main_c_code)+    print(f"C code: \n{main_c_code}")
examples/dump_ast.py +13 lines
--- +++ @@ -1,2 +1,2 @@-#-----------------------------------------------------------------+# ----------------------------------------------------------------- # pycparser: dump_ast.py@@ -7,3 +7,3 @@ # License: BSD-#-----------------------------------------------------------------+# ----------------------------------------------------------------- import argparse@@ -13,3 +13,3 @@ # your site-packages/ with setup.py-sys.path.extend(['.', '..'])+sys.path.extend([".", ".."]) @@ -18,9 +18,12 @@ if __name__ == "__main__":-    argparser = argparse.ArgumentParser('Dump AST')-    argparser.add_argument('filename',-                           default='examples/c_files/basic.c',-                           nargs='?',-                           help='name of file to parse')-    argparser.add_argument('--coord', help='show coordinates in the dump',-                           action='store_true')+    argparser = argparse.ArgumentParser("Dump AST")+    argparser.add_argument(+        "filename",+        default="examples/c_files/basic.c",+        nargs="?",+        help="name of file to parse",+    )+    argparser.add_argument(+        "--coord", help="show coordinates in the dump", action="store_true"+    )     args = argparser.parse_args()
examples/explore_ast.py +20 lines
--- +++ @@ -1,2 +1,2 @@-#-----------------------------------------------------------------+# ----------------------------------------------------------------- # pycparser: explore_ast.py@@ -13,3 +13,3 @@ # License: BSD-#-----------------------------------------------------------------+# ----------------------------------------------------------------- import sys@@ -18,3 +18,3 @@ # your site-packages/ with setup.py-sys.path.extend(['.', '..'])+sys.path.extend([".", ".."]) @@ -60,3 +60,3 @@ parser = c_parser.CParser()-ast = parser.parse(text, filename='<none>')+ast = parser.parse(text, filename="<none>") @@ -67,3 +67,3 @@ -#ast.show(showcoord=True)+# ast.show(showcoord=True) @@ -80,3 +80,3 @@ -#ast.ext[2].show()+# ast.ext[2].show() @@ -92,4 +92,4 @@ -#function_decl.type.show()-#function_decl.type.args.show()+# function_decl.type.show()+# function_decl.type.args.show() @@ -97,6 +97,6 @@ -#for param_decl in function_decl.type.args.params:-    #print('Arg name: %s' % param_decl.name)-    #print('Type:')-    #param_decl.type.show(offset=6)+# for param_decl in function_decl.type.args.params:+# print(f"Arg name: {param_decl.name}")+# print('Type:')+# param_decl.type.show(offset=6) @@ -112,4 +112,4 @@ -#for decl in function_body.block_items:-    #decl.show()+# for decl in function_body.block_items:+# decl.show() @@ -121,3 +121,3 @@ for_stmt = function_body.block_items[2]-#for_stmt.show()+# for_stmt.show() @@ -131,3 +131,3 @@ while_stmt = for_stmt.stmt.block_items[1]-#while_stmt.show()+# while_stmt.show() @@ -137,3 +137,3 @@ while_cond = while_stmt.cond-#while_cond.show()+# while_cond.show() @@ -144,5 +144,5 @@ -#print(while_cond.op)-#while_cond.left.show()-#while_cond.right.show()+# print(while_cond.op)+# while_cond.left.show()+# while_cond.right.show() 
examples/func_calls.py +12 lines
--- +++ @@ -1,2 +1,2 @@-#-----------------------------------------------------------------+# ----------------------------------------------------------------- # pycparser: func_calls.py@@ -8,3 +8,3 @@ # License: BSD-#-----------------------------------------------------------------+# ----------------------------------------------------------------- import sys@@ -13,3 +13,3 @@ # your site-packages/ with setup.py-sys.path.extend(['.', '..'])+sys.path.extend([".", ".."]) @@ -17,12 +17,13 @@ + # A visitor with some state information (the funcname it's looking for) class FuncCallVisitor(c_ast.NodeVisitor):-    def __init__(self, funcname):+    def __init__(self, funcname: str) -> None:         self.funcname = funcname -    def visit_FuncCall(self, node):-        if node.name.name == self.funcname:-            print('%s called at %s' % (self.funcname, node.name.coord))+    def visit_FuncCall(self, node: c_ast.FuncCall) -> None:+        if isinstance(node.name, c_ast.ID) and node.name.name == self.funcname:+            print(f"{self.funcname} called at {node.name.coord}")         # Visit args in case they contain more func calls.-        if node.args:+        if node.args is not None:             self.visit(node.args)@@ -30,3 +31,3 @@ -def show_func_calls(filename, funcname):+def show_func_calls(filename: str, funcname: str) -> None:     ast = parse_file(filename, use_cpp=True)@@ -41,4 +42,4 @@     else:-        filename = 'examples/c_files/basic.c'-        func = 'foo'+        filename = "examples/c_files/basic.c"+        func = "foo" 
examples/func_defs.py +9 lines
--- +++ @@ -1,2 +1,2 @@-#-----------------------------------------------------------------+# ----------------------------------------------------------------- # pycparser: func_defs.py@@ -11,3 +11,3 @@ # License: BSD-#-----------------------------------------------------------------+# ----------------------------------------------------------------- import sys@@ -16,3 +16,3 @@ # your site-packages/ with setup.py-sys.path.extend(['.', '..'])+sys.path.extend([".", ".."]) @@ -24,11 +24,10 @@ class FuncDefVisitor(c_ast.NodeVisitor):-    def visit_FuncDef(self, node):-        print('%s at %s' % (node.decl.name, node.decl.coord))+    def visit_FuncDef(self, node: c_ast.FuncDef) -> None:+        print(f"{node.decl.name} at {node.decl.coord}")  -def show_func_defs(filename):+def show_func_defs(filename: str) -> None:     # Note that cpp is used. Provide a path to your own cpp or     # make sure one exists in PATH.-    ast = parse_file(filename, use_cpp=True,-                     cpp_args=r'-Iutils/fake_libc_include')+    ast = parse_file(filename, use_cpp=True, cpp_args=r"-Iutils/fake_libc_include") @@ -40,5 +39,5 @@     if len(sys.argv) > 1:-        filename  = sys.argv[1]+        filename = sys.argv[1]     else:-        filename = 'examples/c_files/memmgr.c'+        filename = "examples/c_files/memmgr.c" 
examples/func_defs_add_param.py +20 lines
--- +++ @@ -1,2 +1,2 @@-#-----------------------------------------------------------------+# ----------------------------------------------------------------- # pycparser: func_defs_add_param.py@@ -8,5 +8,6 @@ # License: BSD-#-----------------------------------------------------------------+# ----------------------------------------------------------------- import sys-sys.path.extend(['.', '..'])++sys.path.extend([".", ".."]) @@ -24,18 +25,18 @@ class ParamAdder(c_ast.NodeVisitor):-    def visit_FuncDecl(self, node):-        ty = c_ast.TypeDecl(declname='_hidden',-                            quals=[],-                            align=[],-                            type=c_ast.IdentifierType(['int']))+    def visit_FuncDecl(self, node: c_ast.FuncDecl) -> None:+        ty = c_ast.TypeDecl(+            declname="_hidden", quals=[], align=[], type=c_ast.IdentifierType(["int"])+        )         newdecl = c_ast.Decl(-                    name='_hidden',-                    quals=[],-                    align=[],-                    storage=[],-                    funcspec=[],-                    type=ty,-                    init=None,-                    bitsize=None,-                    coord=node.coord)-        if node.args:+            name="_hidden",+            quals=[],+            align=[],+            storage=[],+            funcspec=[],+            type=ty,+            init=None,+            bitsize=None,+            coord=node.coord,+        )+        if node.args is not None:             node.args.params.append(newdecl)@@ -45,3 +46,3 @@ -if __name__ == '__main__':+if __name__ == "__main__":     parser = c_parser.CParser()
examples/rewrite_ast.py +4 lines
--- +++ @@ -1,2 +1,2 @@-#-----------------------------------------------------------------+# ----------------------------------------------------------------- # pycparser: rewrite_ast.py@@ -7,6 +7,6 @@ # License: BSD-#-----------------------------------------------------------------+# ----------------------------------------------------------------- import sys -sys.path.extend(['.', '..'])+sys.path.extend([".", ".."]) from pycparser import c_parser@@ -20,3 +20,3 @@ -if __name__ == '__main__':+if __name__ == "__main__":     parser = c_parser.CParser()
examples/serialize_ast.py +9 lines
--- +++ @@ -1,2 +1,2 @@-#-----------------------------------------------------------------+# ----------------------------------------------------------------- # pycparser: serialize_ast.py@@ -8,7 +8,8 @@ # License: BSD-#-----------------------------------------------------------------+# ----------------------------------------------------------------- import pickle import sys+import tempfile -sys.path.extend(['.', '..'])+sys.path.extend([".", ".."]) from pycparser import c_parser@@ -22,12 +23,12 @@ -if __name__ == '__main__':+if __name__ == "__main__":     parser = c_parser.CParser()     ast = parser.parse(text)-    dump_filename = 'ast.pickle'--    with open(dump_filename, 'wb') as f:+    with tempfile.NamedTemporaryFile(delete=False, suffix=".pickle") as f:+        dump_filename = f.name         pickle.dump(ast, f, protocol=pickle.HIGHEST_PROTOCOL)+        print(f"Dumped to {dump_filename}")      # Deserialize.-    with open(dump_filename, 'rb') as f:+    with open(dump_filename, "rb") as f:         ast = pickle.load(f)
examples/using_cpp_libc.py +8 lines
--- +++ @@ -1,2 +1,2 @@-#-----------------------------------------------------------------+# ----------------------------------------------------------------- # pycparser: using_cpp_libc.py@@ -8,3 +8,3 @@ # License: BSD-#-----------------------------------------------------------------+# ----------------------------------------------------------------- import sys@@ -13,3 +13,3 @@ # your site-packages/ with setup.py-sys.path.extend(['.', '..'])+sys.path.extend([".", ".."]) @@ -20,9 +20,9 @@     if len(sys.argv) > 1:-        filename  = sys.argv[1]+        filename = sys.argv[1]     else:-        filename = 'examples/c_files/year.c'+        filename = "examples/c_files/year.c" -    ast = parse_file(filename, use_cpp=True,-            cpp_path='cpp',-            cpp_args=r'-Iutils/fake_libc_include')+    ast = parse_file(+        filename, use_cpp=True, cpp_path="cpp", cpp_args=r"-Iutils/fake_libc_include"+    )     ast.show()
examples/using_gcc_E_libc.py +11 lines
--- +++ @@ -1,2 +1,2 @@-#-------------------------------------------------------------------------------+# ------------------------------------------------------------------------------- # pycparser: using_gcc_E_libc.py@@ -9,3 +9,3 @@ # License: BSD-#-------------------------------------------------------------------------------+# ------------------------------------------------------------------------------- import sys@@ -14,3 +14,3 @@ # your site-packages/ with setup.py-sys.path.extend(['.', '..'])+sys.path.extend([".", ".."]) @@ -21,9 +21,12 @@     if len(sys.argv) > 1:-        filename  = sys.argv[1]+        filename = sys.argv[1]     else:-        filename = 'examples/c_files/year.c'+        filename = "examples/c_files/year.c" -    ast = parse_file(filename, use_cpp=True,-            cpp_path='gcc',-            cpp_args=['-E', r'-Iutils/fake_libc_include'])+    ast = parse_file(+        filename,+        use_cpp=True,+        cpp_path="gcc",+        cpp_args=["-E", r"-Iutils/fake_libc_include"],+    )     ast.show()
pycparser/__init__.py +50 lines
--- +++ @@ -1,2 +1,2 @@-#-----------------------------------------------------------------+# ----------------------------------------------------------------- # pycparser: __init__.py@@ -8,5 +8,5 @@ # License: BSD-#------------------------------------------------------------------__all__ = ['c_lexer', 'c_parser', 'c_ast']-__version__ = '2.23'+# -----------------------------------------------------------------+__all__ = ["c_lexer", "c_parser", "c_ast"]+__version__ = "3.00" @@ -14,18 +14,21 @@ from subprocess import check_output-from .c_parser import CParser++from . import c_parser++CParser = c_parser.CParser  -def preprocess_file(filename, cpp_path='cpp', cpp_args=''):-    """ Preprocess a file using cpp.+def preprocess_file(filename, cpp_path="cpp", cpp_args=""):+    """Preprocess a file using cpp. -        filename:-            Name of the file you want to preprocess.+    filename:+        Name of the file you want to preprocess. -        cpp_path:-        cpp_args:-            Refer to the documentation of parse_file for the meaning of these-            arguments.+    cpp_path:+    cpp_args:+        Refer to the documentation of parse_file for the meaning of these+        arguments. -        When successful, returns the preprocessed file's contents.-        Errors from cpp will be printed out.+    When successful, returns the preprocessed file's contents.+    Errors from cpp will be printed out.     """@@ -34,3 +37,3 @@         path_list += cpp_args-    elif cpp_args != '':+    elif cpp_args != "":         path_list += [cpp_args]@@ -43,5 +46,7 @@     except OSError as e:-        raise RuntimeError("Unable to invoke 'cpp'.  " +-            'Make sure its path was passed correctly\n' +-            ('Original error: %s' % e))+        raise RuntimeError(+            "Unable to invoke 'cpp'.  "+            + "Make sure its path was passed correctly\n"+            + f"Original error: {e}"+        ) @@ -50,35 +55,36 @@ -def parse_file(filename, use_cpp=False, cpp_path='cpp', cpp_args='',-               parser=None, encoding=None):-    """ Parse a C file using pycparser.+def parse_file(+    filename, use_cpp=False, cpp_path="cpp", cpp_args="", parser=None, encoding=None+):+    """Parse a C file using pycparser. -        filename:-            Name of the file you want to parse.+    filename:+        Name of the file you want to parse. -        use_cpp:-            Set to True if you want to execute the C pre-processor-            on the file prior to parsing it.+    use_cpp:+        Set to True if you want to execute the C pre-processor+        on the file prior to parsing it. -        cpp_path:-            If use_cpp is True, this is the path to 'cpp' on your-            system. If no path is provided, it attempts to just-            execute 'cpp', so it must be in your PATH.+    cpp_path:+        If use_cpp is True, this is the path to 'cpp' on your+        system. If no path is provided, it attempts to just+        execute 'cpp', so it must be in your PATH. -        cpp_args:-            If use_cpp is True, set this to the command line arguments strings-            to cpp. Be careful with quotes - it's best to pass a raw string-            (r'') here. For example:-            r'-I../utils/fake_libc_include'-            If several arguments are required, pass a list of strings.+    cpp_args:+        If use_cpp is True, set this to the command line arguments strings+        to cpp. Be careful with quotes - it's best to pass a raw string+        (r'') here. For example:+        r'-I../utils/fake_libc_include'+        If several arguments are required, pass a list of strings. -        encoding:-            Encoding to use for the file to parse+    encoding:+        Encoding to use for the file to parse -        parser:-            Optional parser object to be used instead of the default CParser+    parser:+        Optional parser object to be used instead of the default CParser -        When successful, an AST is returned. ParseError can be-        thrown if the file doesn't parse successfully.+    When successful, an AST is returned. ParseError can be+    thrown if the file doesn't parse successfully. -        Errors from cpp will be printed out.+    Errors from cpp will be printed out.     """
pycparser/_ast_gen.py +116 lines
--- +++ @@ -1,2 +1,2 @@-#-----------------------------------------------------------------+# ----------------------------------------------------------------- # _ast_gen.py@@ -4,3 +4,6 @@ # Generates the AST Node classes from a specification given in-# a configuration file+# a configuration file. This module can also be run as a script to+# regenerate c_ast.py from _c_ast.cfg (from the repo root or the+# pycparser/ directory). Use 'make check' to reformat the generated+# file after running this script. #@@ -11,20 +14,22 @@ # License: BSD-#-----------------------------------------------------------------+# ----------------------------------------------------------------- from string import Template---class ASTCodeGenerator(object):-    def __init__(self, cfg_filename='_c_ast.cfg'):-        """ Initialize the code generator from a configuration-            file.+import os+from typing import IO+++class ASTCodeGenerator:+    def __init__(self, cfg_filename="_c_ast.cfg"):+        """Initialize the code generator from a configuration+        file.         """         self.cfg_filename = cfg_filename-        self.node_cfg = [NodeCfg(name, contents)-            for (name, contents) in self.parse_cfgfile(cfg_filename)]--    def generate(self, file=None):-        """ Generates the code into file, an open file buffer.-        """-        src = Template(_PROLOGUE_COMMENT).substitute(-            cfg_filename=self.cfg_filename)+        self.node_cfg = [+            NodeCfg(name, contents)+            for (name, contents) in self.parse_cfgfile(cfg_filename)+        ]++    def generate(self, file: IO[str]) -> None:+        """Generates the code into file, an open file buffer."""+        src = Template(_PROLOGUE_COMMENT).substitute(cfg_filename=self.cfg_filename) @@ -32,3 +37,3 @@         for node_cfg in self.node_cfg:-            src += node_cfg.generate_source() + '\n\n'+            src += node_cfg.generate_source() + "\n\n" @@ -37,4 +42,4 @@     def parse_cfgfile(self, filename):-        """ Parse the configuration file and yield pairs of-            (name, contents) for each node.+        """Parse the configuration file and yield pairs of+        (name, contents) for each node.         """@@ -43,13 +48,13 @@                 line = line.strip()-                if not line or line.startswith('#'):+                if not line or line.startswith("#"):                     continue-                colon_i = line.find(':')-                lbracket_i = line.find('[')-                rbracket_i = line.find(']')+                colon_i = line.find(":")+                lbracket_i = line.find("[")+                rbracket_i = line.find("]")                 if colon_i < 1 or lbracket_i <= colon_i or rbracket_i <= lbracket_i:-                    raise RuntimeError("Invalid line in %s:\n%s\n" % (filename, line))+                    raise RuntimeError(f"Invalid line in {filename}:\n{line}\n")                  name = line[:colon_i]-                val = line[lbracket_i + 1:rbracket_i]-                vallist = [v.strip() for v in val.split(',')] if val else []+                val = line[lbracket_i + 1 : rbracket_i]+                vallist = [v.strip() for v in val.split(",")] if val else []                 yield name, vallist@@ -57,8 +62,8 @@ -class NodeCfg(object):-    """ Node configuration.--        name: node name-        contents: a list of contents - attributes and child nodes-        See comment at the top of the configuration file for details.+class NodeCfg:+    """Node configuration.++    name: node name+    contents: a list of contents - attributes and child nodes+    See comment at the top of the configuration file for details.     """@@ -73,8 +78,8 @@         for entry in contents:-            clean_entry = entry.rstrip('*')+            clean_entry = entry.rstrip("*")             self.all_entries.append(clean_entry) -            if entry.endswith('**'):+            if entry.endswith("**"):                 self.seq_child.append(clean_entry)-            elif entry.endswith('*'):+            elif entry.endswith("*"):                 self.child.append(clean_entry)@@ -85,5 +90,5 @@         src = self._gen_init()-        src += '\n' + self._gen_children()-        src += '\n' + self._gen_iter()-        src += '\n' + self._gen_attr_names()+        src += "\n" + self._gen_children()+        src += "\n" + self._gen_iter()+        src += "\n" + self._gen_attr_names()         return src@@ -91,18 +96,18 @@     def _gen_init(self):-        src = "class %s(Node):\n" % self.name+        src = f"class {self.name}(Node):\n"          if self.all_entries:-            args = ', '.join(self.all_entries)-            slots = ', '.join("'{0}'".format(e) for e in self.all_entries)+            args = ", ".join(self.all_entries)+            slots = ", ".join(f"'{e}'" for e in self.all_entries)             slots += ", 'coord', '__weakref__'"-            arglist = '(self, %s, coord=None)' % args+            arglist = f"(self, {args}, coord=None)"         else:             slots = "'coord', '__weakref__'"-            arglist = '(self, coord=None)'--        src += "    __slots__ = (%s)\n" % slots-        src += "    def __init__%s:\n" % arglist--        for name in self.all_entries + ['coord']:-            src += "        self.%s = %s\n" % (name, name)+            arglist = "(self, coord=None)"++        src += f"    __slots__ = ({slots})\n"+        src += f"    def __init__{arglist}:\n"++        for name in self.all_entries + ["coord"]:+            src += f"        self.{name} = {name}\n" @@ -111,22 +116,18 @@     def _gen_children(self):-        src = '    def children(self):\n'+        src = "    def children(self):\n"          if self.all_entries:-            src += '        nodelist = []\n'+            src += "        nodelist = []\n"              for child in self.child:-                src += (-                    '        if self.%(child)s is not None:' +-                    ' nodelist.append(("%(child)s", self.%(child)s))\n') % (-                        dict(child=child))+                src += f"        if self.{child} is not None:\n"+                src += f'            nodelist.append(("{child}", self.{child}))\n'              for seq_child in self.seq_child:-                src += (-                    '        for i, child in enumerate(self.%(child)s or []):\n'-                    '            nodelist.append(("%(child)s[%%d]" %% i, child))\n') % (-                        dict(child=seq_child))--            src += '        return tuple(nodelist)\n'+                src += f"        for i, child in enumerate(self.{seq_child} or []):\n"+                src += f'            nodelist.append((f"{seq_child}[{{i}}]", child))\n'++            src += "        return tuple(nodelist)\n"         else:-            src += '        return ()\n'+            src += "        return ()\n" @@ -135,3 +136,3 @@     def _gen_iter(self):-        src = '    def __iter__(self):\n'+        src = "    def __iter__(self):\n" @@ -139,10 +140,8 @@             for child in self.child:-                src += (-                    '        if self.%(child)s is not None:\n' +-                    '            yield self.%(child)s\n') % (dict(child=child))+                src += f"        if self.{child} is not None:\n"+                src += f"            yield self.{child}\n"              for seq_child in self.seq_child:-                src += (-                    '        for child in (self.%(child)s or []):\n'-                    '            yield child\n') % (dict(child=seq_child))+                src += f"        for child in (self.{seq_child} or []):\n"+                src += "            yield child\n" @@ -150,10 +149,6 @@                 # Empty generator-                src += (-                    '        return\n' +-                    '        yield\n')+                src += "        return\n" + "        yield\n"         else:             # Empty generator-            src += (-                '        return\n' +-                '        yield\n')+            src += "        return\n" + "        yield\n" @@ -162,11 +157,9 @@     def _gen_attr_names(self):-        src = "    attr_names = (" + ''.join("%r, " % nm for nm in self.attr) + ')'-        return src---_PROLOGUE_COMMENT = \-r'''#-----------------------------------------------------------------+        src = "    attr_names = (" + "".join(f"{nm!r}, " for nm in self.attr) + ")"+        return src+++_PROLOGUE_COMMENT = r"""#----------------------------------------------------------------- # ** ATTENTION **-# This code was automatically generated from the file:-# $cfg_filename+# This code was automatically generated from _c_ast.cfg #@@ -184,6 +177,6 @@ -'''-+""" _PROLOGUE_CODE = r''' import sys+from typing import Any, ClassVar, IO, Optional @@ -198,3 +191,3 @@ -class Node(object):+class Node:     __slots__ = ()@@ -202,2 +195,4 @@     """
… 78 more lines (truncated)
pycparser/ast_transforms.py +82 lines
--- +++ @@ -1,2 +1,2 @@-#------------------------------------------------------------------------------+# ------------------------------------------------------------------------------ # pycparser: ast_transforms.py@@ -7,3 +7,5 @@ # License: BSD-#------------------------------------------------------------------------------+# ------------------------------------------------------------------------------++from typing import Any, List, Tuple, cast @@ -12,52 +14,52 @@ -def fix_switch_cases(switch_node):-    """ The 'case' statements in a 'switch' come out of parsing with one-        child node, so subsequent statements are just tucked to the parent-        Compound. Additionally, consecutive (fall-through) case statements-        come out messy. This is a peculiarity of the C grammar. The following:+def fix_switch_cases(switch_node: c_ast.Switch) -> c_ast.Switch:+    """The 'case' statements in a 'switch' come out of parsing with one+    child node, so subsequent statements are just tucked to the parent+    Compound. Additionally, consecutive (fall-through) case statements+    come out messy. This is a peculiarity of the C grammar. The following: -            switch (myvar) {-                case 10:-                    k = 10;-                    p = k + 1;-                    return 10;-                case 20:-                case 30:-                    return 20;-                default:-                    break;-            }+        switch (myvar) {+            case 10:+                k = 10;+                p = k + 1;+                return 10;+            case 20:+            case 30:+                return 20;+            default:+                break;+        } -        Creates this tree (pseudo-dump):+    Creates this tree (pseudo-dump): -            Switch-                ID: myvar-                Compound:-                    Case 10:-                        k = 10+        Switch+            ID: myvar+            Compound:+                Case 10:+                    k = 10+                p = k + 1+                return 10+                Case 20:+                    Case 30:+                        return 20+                Default:+                    break++    The goal of this transform is to fix this mess, turning it into the+    following:++        Switch+            ID: myvar+            Compound:+                Case 10:+                    k = 10                     p = k + 1                     return 10-                    Case 20:-                        Case 30:-                            return 20-                    Default:-                        break+                Case 20:+                Case 30:+                    return 20+                Default:+                    break -        The goal of this transform is to fix this mess, turning it into the-        following:--            Switch-                ID: myvar-                Compound:-                    Case 10:-                        k = 10-                        p = k + 1-                        return 10-                    Case 20:-                    Case 30:-                        return 20-                    Default:-                        break--        A fixed AST node is returned. The argument may be modified.+    A fixed AST node is returned. The argument may be modified.     """@@ -72,3 +74,3 @@     # The last Case/Default node-    last_case = None+    last_case: c_ast.Case | c_ast.Default | None = None @@ -77,3 +79,3 @@     # (for `switch(cond) {}`, block_items would have been None)-    for child in (switch_node.stmt.block_items or []):+    for child in switch_node.stmt.block_items or []:         if isinstance(child, (c_ast.Case, c_ast.Default)):@@ -98,18 +100,23 @@ -def _extract_nested_case(case_node, stmts_list):-    """ Recursively extract consecutive Case statements that are made nested-        by the parser and add them to the stmts_list.+def _extract_nested_case(+    case_node: c_ast.Case | c_ast.Default, stmts_list: List[c_ast.Node]+) -> None:+    """Recursively extract consecutive Case statements that are made nested+    by the parser and add them to the stmts_list.     """     if isinstance(case_node.stmts[0], (c_ast.Case, c_ast.Default)):-        stmts_list.append(case_node.stmts.pop())-        _extract_nested_case(stmts_list[-1], stmts_list)+        nested = case_node.stmts.pop()+        stmts_list.append(nested)+        _extract_nested_case(cast(Any, nested), stmts_list)  -def fix_atomic_specifiers(decl):-    """ Atomic specifiers like _Atomic(type) are unusually structured,-        conferring a qualifier upon the contained type.+def fix_atomic_specifiers(+    decl: c_ast.Decl | c_ast.Typedef,+) -> c_ast.Decl | c_ast.Typedef:+    """Atomic specifiers like _Atomic(type) are unusually structured,+    conferring a qualifier upon the contained type. -        This function fixes a decl with atomic specifiers to have a sane AST-        structure, by removing spurious Typename->TypeDecl pairs and attaching-        the _Atomic qualifier in the right place.+    This function fixes a decl with atomic specifiers to have a sane AST+    structure, by removing spurious Typename->TypeDecl pairs and attaching+    the _Atomic qualifier in the right place.     """@@ -125,3 +132,3 @@     # wrong place during construction).-    typ = decl+    typ: Any = decl     while not isinstance(typ, c_ast.TypeDecl):@@ -131,4 +138,4 @@             return decl-    if '_Atomic' in typ.quals and '_Atomic' not in decl.quals:-        decl.quals.append('_Atomic')+    if "_Atomic" in typ.quals and "_Atomic" not in decl.quals:+        decl.quals.append("_Atomic")     if typ.declname is None:@@ -139,11 +146,13 @@ -def _fix_atomic_specifiers_once(decl):-    """ Performs one 'fix' round of atomic specifiers.-        Returns (modified_decl, found) where found is True iff a fix was made.+def _fix_atomic_specifiers_once(+    decl: c_ast.Decl | c_ast.Typedef,+) -> Tuple[c_ast.Decl | c_ast.Typedef, bool]:+    """Performs one 'fix' round of atomic specifiers.+    Returns (modified_decl, found) where found is True iff a fix was made.     """-    parent = decl-    grandparent = None-    node = decl.type+    parent: Any = decl+    grandparent: Any = None+    node: Any = decl.type     while node is not None:-        if isinstance(node, c_ast.Typename) and '_Atomic' in node.quals:+        if isinstance(node, c_ast.Typename) and "_Atomic" in node.quals:             break@@ -160,5 +169,6 @@     assert isinstance(parent, c_ast.TypeDecl)-    grandparent.type = node.type-    if '_Atomic' not in node.type.quals:-        node.type.quals.append('_Atomic')+    assert grandparent is not None+    cast(Any, grandparent).type = node.type+    if "_Atomic" not in node.type.quals:+        node.type.quals.append("_Atomic")     return decl, True
pycparser/c_ast.py +493 lines
--- +++ @@ -1,5 +1,4 @@-#-----------------------------------------------------------------+# ----------------------------------------------------------------- # ** ATTENTION **-# This code was automatically generated from the file:-# _c_ast.cfg+# This code was automatically generated from _c_ast.cfg #@@ -15,3 +14,3 @@ # License: BSD-#-----------------------------------------------------------------+# ----------------------------------------------------------------- @@ -19,2 +18,4 @@ import sys+from typing import Any, ClassVar, IO, Optional+ @@ -25,3 +26,3 @@     if isinstance(obj, list):-        return '[' + (',\n '.join((_repr(e).replace('\n', '\n ') for e in obj))) + '\n]'+        return "[" + (",\n ".join((_repr(e).replace("\n", "\n ") for e in obj))) + "\n]"     else:@@ -29,3 +30,4 @@ -class Node(object):++class Node:     __slots__ = ()@@ -33,9 +35,11 @@     """+    attr_names: ClassVar[tuple[str, ...]] = ()+    coord: Optional[Any]+     def __repr__(self):-        """ Generates a python representation of the current node-        """-        result = self.__class__.__name__ + '('--        indent = ''-        separator = ''+        """Generates a python representation of the current node"""+        result = self.__class__.__name__ + "("++        indent = ""+        separator = ""         for name in self.__slots__[:-2]:@@ -43,8 +47,17 @@             result += indent-            result += name + '=' + (_repr(getattr(self, name)).replace('\n', '\n  ' + (' ' * (len(name) + len(self.__class__.__name__)))))--            separator = ','-            indent = '\n ' + (' ' * len(self.__class__.__name__))--        result += indent + ')'+            result += (+                name+                + "="+                + (+                    _repr(getattr(self, name)).replace(+                        "\n",+                        "\n  " + (" " * (len(name) + len(self.__class__.__name__))),+                    )+                )+            )++            separator = ","+            indent = "\n " + (" " * len(self.__class__.__name__))++        result += indent + ")" @@ -53,41 +66,59 @@     def children(self):-        """ A sequence of all children that are Nodes+        """A sequence of all children that are Nodes"""+        pass++    def show(+        self,+        buf: IO[str] = sys.stdout,+        offset: int = 0,+        attrnames: bool = False,+        showemptyattrs: bool = True,+        nodenames: bool = False,+        showcoord: bool = False,+        _my_node_name: Optional[str] = None,+    ):+        """Pretty print the Node and all its attributes and+        children (recursively) to a buffer.++        buf:+            Open IO buffer into which the Node is printed.++        offset:+            Initial offset (amount of leading spaces)++        attrnames:+            True if you want to see the attribute names in+            name=value pairs. False to only see the values.++        showemptyattrs:+            False if you want to suppress printing empty attributes.++        nodenames:+            True if you want to see the actual node names+            within their parents.++        showcoord:+            Do you want the coordinates of each Node to be+            displayed.         """-        pass--    def show(self, buf=sys.stdout, offset=0, attrnames=False, nodenames=False, showcoord=False, _my_node_name=None):-        """ Pretty print the Node and all its attributes and-            children (recursively) to a buffer.--            buf:-                Open IO buffer into which the Node is printed.--            offset:-                Initial offset (amount of leading spaces)--            attrnames:-                True if you want to see the attribute names in-                name=value pairs. False to only see the values.--            nodenames:-                True if you want to see the actual node names-                within their parents.--            showcoord:-                Do you want the coordinates of each Node to be-                displayed.-        """-        lead = ' ' * offset+        lead = " " * offset         if nodenames and _my_node_name is not None:-            buf.write(lead + self.__class__.__name__+ ' <' + _my_node_name + '>: ')+            buf.write(lead + self.__class__.__name__ + " <" + _my_node_name + ">: ")         else:-            buf.write(lead + self.__class__.__name__+ ': ')+            buf.write(lead + self.__class__.__name__ + ": ")          if self.attr_names:++            def is_empty(v):+                v is None or (hasattr(v, "__len__") and len(v) == 0)++            nvlist = [+                (n, getattr(self, n))+                for n in self.attr_names+                if showemptyattrs or not is_empty(getattr(self, n))+            ]             if attrnames:-                nvlist = [(n, getattr(self,n)) for n in self.attr_names]-                attrstr = ', '.join('%s=%s' % nv for nv in nvlist)+                attrstr = ", ".join(f"{name}={value}" for name, value in nvlist)             else:-                vlist = [getattr(self, n) for n in self.attr_names]-                attrstr = ', '.join('%s' % v for v in vlist)+                attrstr = ", ".join(f"{value}" for _, value in nvlist)             buf.write(attrstr)@@ -95,6 +126,6 @@         if showcoord:-            buf.write(' (at %s)' % self.coord)-        buf.write('\n')--        for (child_name, child) in self.children():+            buf.write(f" (at {self.coord})")+        buf.write("\n")++        for child_name, child in self.children():             child.show(@@ -103,39 +134,41 @@                 attrnames=attrnames,+                showemptyattrs=showemptyattrs,                 nodenames=nodenames,                 showcoord=showcoord,-                _my_node_name=child_name)---class NodeVisitor(object):-    """ A base NodeVisitor class for visiting c_ast nodes.-        Subclass it and define your own visit_XXX methods, where-        XXX is the class name you want to visit with these-        methods.--        For example:--        class ConstantVisitor(NodeVisitor):-            def __init__(self):-                self.values = []--            def visit_Constant(self, node):-                self.values.append(node.value)--        Creates a list of values of all the constant nodes-        encountered below the given node. To use it:--        cv = ConstantVisitor()-        cv.visit(node)--        Notes:--        *   generic_visit() will be called for AST nodes for which-            no visit_XXX method was defined.-        *   The children of nodes for which a visit_XXX was-            defined will not be visited - if you need this, call-            generic_visit() on the node.-            You can use:-                NodeVisitor.generic_visit(self, node)-        *   Modeled after Python's own AST visiting facilities-            (the ast module of Python 3.0)+                _my_node_name=child_name,+            )+++class NodeVisitor:+    """A base NodeVisitor class for visiting c_ast nodes.+    Subclass it and define your own visit_XXX methods, where+    XXX is the class name you want to visit with these+    methods.++    For example:++    class ConstantVisitor(NodeVisitor):+        def __init__(self):+            self.values = []++        def visit_Constant(self, node):+            self.values.append(node.value)++    Creates a list of values of all the constant nodes+    encountered below the given node. To use it:++    cv = ConstantVisitor()+    cv.visit(node)++    Notes:++    *   generic_visit() will be called for AST nodes for which+        no visit_XXX method was defined.+    *   The children of nodes for which a visit_XXX was+        defined will not be visited - if you need this, call+        generic_visit() on the node.+        You can use:+            NodeVisitor.generic_visit(self, node)
… 918 more lines (truncated)
pycparser/c_generator.py +415 lines
--- +++ @@ -1,2 +1,2 @@-#------------------------------------------------------------------------------+# ------------------------------------------------------------------------------ # pycparser: c_generator.py@@ -7,3 +7,5 @@ # License: BSD-#------------------------------------------------------------------------------+# ------------------------------------------------------------------------------+from typing import Callable, List, Optional+ from . import c_ast@@ -11,12 +13,16 @@ -class CGenerator(object):-    """ Uses the same visitor pattern as c_ast.NodeVisitor, but modified to-        return a value from each visit method, using string accumulation in-        generic_visit.+class CGenerator:+    """Uses the same visitor pattern as c_ast.NodeVisitor, but modified to+    return a value from each visit method, using string accumulation in+    generic_visit.     """-    def __init__(self, reduce_parentheses=False):-        """ Constructs C-code generator--            reduce_parentheses:-                if True, eliminates needless parentheses on binary operators++    indent_level: int+    reduce_parentheses: bool++    def __init__(self, reduce_parentheses: bool = False) -> None:+        """Constructs C-code generator++        reduce_parentheses:+            if True, eliminates needless parentheses on binary operators         """@@ -27,32 +33,32 @@ -    def _make_indent(self):-        return ' ' * self.indent_level--    def visit(self, node):-        method = 'visit_' + node.__class__.__name__+    def _make_indent(self) -> str:+        return " " * self.indent_level++    def visit(self, node: c_ast.Node) -> str:+        method = "visit_" + node.__class__.__name__         return getattr(self, method, self.generic_visit)(node) -    def generic_visit(self, node):+    def generic_visit(self, node: Optional[c_ast.Node]) -> str:         if node is None:-            return ''+            return ""         else:-            return ''.join(self.visit(c) for c_name, c in node.children())--    def visit_Constant(self, n):+            return "".join(self.visit(c) for c_name, c in node.children())++    def visit_Constant(self, n: c_ast.Constant) -> str:         return n.value -    def visit_ID(self, n):+    def visit_ID(self, n: c_ast.ID) -> str:         return n.name -    def visit_Pragma(self, n):-        ret = '#pragma'+    def visit_Pragma(self, n: c_ast.Pragma) -> str:+        ret = "#pragma"         if n.string:-            ret += ' ' + n.string+            ret += " " + n.string         return ret -    def visit_ArrayRef(self, n):+    def visit_ArrayRef(self, n: c_ast.ArrayRef) -> str:         arrref = self._parenthesize_unless_simple(n.name)-        return arrref + '[' + self.visit(n.subscript) + ']'--    def visit_StructRef(self, n):+        return arrref + "[" + self.visit(n.subscript) + "]"++    def visit_StructRef(self, n: c_ast.StructRef) -> str:         sref = self._parenthesize_unless_simple(n.name)@@ -60,19 +66,22 @@ -    def visit_FuncCall(self, n):+    def visit_FuncCall(self, n: c_ast.FuncCall) -> str:         fref = self._parenthesize_unless_simple(n.name)-        return fref + '(' + self.visit(n.args) + ')'--    def visit_UnaryOp(self, n):-        if n.op == 'sizeof':-            # Always parenthesize the argument of sizeof since it can be-            # a name.-            return 'sizeof(%s)' % self.visit(n.expr)-        else:-            operand = self._parenthesize_unless_simple(n.expr)-            if n.op == 'p++':-                return '%s++' % operand-            elif n.op == 'p--':-                return '%s--' % operand-            else:-                return '%s%s' % (n.op, operand)+        args = self.visit(n.args) if n.args is not None else ""+        return fref + "(" + args + ")"++    def visit_UnaryOp(self, n: c_ast.UnaryOp) -> str:+        match n.op:+            case "sizeof":+                # Always parenthesize the argument of sizeof since it can be+                # a name.+                return f"sizeof({self.visit(n.expr)})"+            case "p++":+                operand = self._parenthesize_unless_simple(n.expr)+                return f"{operand}++"+            case "p--":+                operand = self._parenthesize_unless_simple(n.expr)+                return f"{operand}--"+            case _:+                operand = self._parenthesize_unless_simple(n.expr)+                return f"{n.op}{operand}" @@ -82,15 +91,23 @@         # Higher numbers are stronger binding-        '||': 0,  # weakest binding-        '&&': 1,-        '|': 2,-        '^': 3,-        '&': 4,-        '==': 5, '!=': 5,-        '>': 6, '>=': 6, '<': 6, '<=': 6,-        '>>': 7, '<<': 7,-        '+': 8, '-': 8,-        '*': 9, '/': 9, '%': 9  # strongest binding+        "||": 0,  # weakest binding+        "&&": 1,+        "|": 2,+        "^": 3,+        "&": 4,+        "==": 5,+        "!=": 5,+        ">": 6,+        ">=": 6,+        "<": 6,+        "<=": 6,+        ">>": 7,+        "<<": 7,+        "+": 8,+        "-": 8,+        "*": 9,+        "/": 9,+        "%": 9,  # strongest binding     } -    def visit_BinaryOp(self, n):+    def visit_BinaryOp(self, n: c_ast.BinaryOp) -> str:         # Note: all binary operators are left-to-right associative@@ -106,5 +123,9 @@             n.left,-            lambda d: not (self._is_simple_node(d) or-                      self.reduce_parentheses and isinstance(d, c_ast.BinaryOp) and-                      self.precedence_map[d.op] >= self.precedence_map[n.op]))+            lambda d: not (+                self._is_simple_node(d)+                or self.reduce_parentheses+                and isinstance(d, c_ast.BinaryOp)+                and self.precedence_map[d.op] >= self.precedence_map[n.op]+            ),+        )         # If `n.right.op` has a stronger -but not equal- binding precedence,@@ -118,25 +139,30 @@             n.right,-            lambda d: not (self._is_simple_node(d) or-                      self.reduce_parentheses and isinstance(d, c_ast.BinaryOp) and-                      self.precedence_map[d.op] > self.precedence_map[n.op]))-        return '%s %s %s' % (lval_str, n.op, rval_str)--    def visit_Assignment(self, n):+            lambda d: not (+                self._is_simple_node(d)+                or self.reduce_parentheses+                and isinstance(d, c_ast.BinaryOp)+                and self.precedence_map[d.op] > self.precedence_map[n.op]+            ),+        )+        return f"{lval_str} {n.op} {rval_str}"++    def visit_Assignment(self, n: c_ast.Assignment) -> str:         rval_str = self._parenthesize_if(-                            n.rvalue,-                            lambda n: isinstance(n, c_ast.Assignment))-        return '%s %s %s' % (self.visit(n.lvalue), n.op, rval_str)--    def visit_IdentifierType(self, n):-        return ' '.join(n.names)--    def _visit_expr(self, n):-        if isinstance(n, c_ast.InitList):-            return '{' + self.visit(n) + '}'-        elif isinstance(n, (c_ast.ExprList, c_ast.Compound)):-            return '(' + self.visit(n) + ')'-        else:-            return self.visit(n)--    def visit_Decl(self, n, no_type=False):+            n.rvalue, lambda n: isinstance(n, c_ast.Assignment)+        )+        return f"{self.visit(n.lvalue)} {n.op} {rval_str}"++    def visit_IdentifierType(self, n: c_ast.IdentifierType) -> str:+        return " ".join(n.names)++    def _visit_expr(self, n: c_ast.Node) -> str:+        match n:+            case c_ast.InitList():+                return "{" + self.visit(n) + "}"+            case c_ast.ExprList() | c_ast.Compound():+                return "(" + self.visit(n) + ")"+            case _:+                return self.visit(n)++    def visit_Decl(self, n: c_ast.Decl, no_type: bool = False) -> str:         # no_type is used when a Decl is part of a DeclList, where the type is@@ -145,17 +171,20 @@         s = n.name if no_type else self._generate_decl(n)-        if n.bitsize: s += ' : ' + self.visit(n.bitsize)+        if n.bitsize:+            s += " : " + self.visit(n.bitsize)         if n.init:-            s += ' = ' + self._visit_expr(n.init)-        return s--    def visit_DeclList(self, n):+            s += " = " + self._visit_expr(n.init)+        return s++    def visit_DeclList(self, n: c_ast.DeclList) -> str:         s = self.visit(n.decls[0])         if len(n.decls) > 1:-            s += ', ' + ', '.join(self.visit_Decl(decl, no_type=True)-                                    for decl in n.decls[1:])-        return s-
… 641 more lines (truncated)
pycparser/c_lexer.py +691 lines
--- +++ @@ -1,2 +1,2 @@-#------------------------------------------------------------------------------+# ------------------------------------------------------------------------------ # pycparser: c_lexer.py@@ -7,36 +7,42 @@ # License: BSD-#------------------------------------------------------------------------------+# ------------------------------------------------------------------------------ import re--from .ply import lex-from .ply.lex import TOKEN---class CLexer(object):-    """ A lexer for the C language. After building it, set the-        input text with input(), and call token() to get new-        tokens.--        The public attribute filename can be set to an initial-        filename, but the lexer will update it upon #line-        directives.+from dataclasses import dataclass+from enum import Enum+from typing import Callable, Dict, List, Optional, Tuple+++@dataclass(slots=True)+class _Token:+    type: str+    value: str+    lineno: int+    column: int+++class CLexer:+    """A standalone lexer for C.++    Parameters for construction:+        error_func:+            Called with (msg, line, column) on lexing errors.+        on_lbrace_func:+            Called when an LBRACE token is produced (used for scope tracking).+        on_rbrace_func:+            Called when an RBRACE token is produced (used for scope tracking).+        type_lookup_func:+            Called with an identifier name; expected to return True if it is+            a typedef name and should be tokenized as TYPEID.++    Call input(text) to initialize lexing, and then keep calling token() to+    get the next token, until it returns None (at end of input).     """-    def __init__(self, error_func, on_lbrace_func, on_rbrace_func,-                 type_lookup_func):-        """ Create a new Lexer.--            error_func:-                An error function. Will be called with an error-                message, line and column as arguments, in case of-                an error during lexing.--            on_lbrace_func, on_rbrace_func:-                Called when an LBRACE or RBRACE is encountered-                (likely to push/pop type_lookup_func's scope)--            type_lookup_func:-                A type lookup function. Given a string, it must-                return True IFF this string is a name of a type-                that was defined with a typedef earlier.-        """++    def __init__(+        self,+        error_func: Callable[[str, int, int], None],+        on_lbrace_func: Callable[[], None],+        on_rbrace_func: Callable[[], None],+        type_lookup_func: Callable[[str], bool],+    ) -> None:         self.error_func = error_func@@ -45,525 +51,656 @@         self.type_lookup_func = type_lookup_func-        self.filename = ''--        # Keeps track of the last token returned from self.token()-        self.last_token = None--        # Allow either "# line" or "# <num>" to support GCC's-        # cpp output-        #-        self.line_pattern = re.compile(r'([ \t]*line\W)|([ \t]*\d+)')-        self.pragma_pattern = re.compile(r'[ \t]*pragma\W')--    def build(self, **kwargs):-        """ Builds the lexer from the specification. Must be-            called after the lexer object is created.--            This method exists separately, because the PLY-            manual warns against calling lex.lex inside-            __init__+        self._init_state()++    def input(self, text: str, filename: str = "") -> None:+        """Initialize the lexer to the given input text.++        filename is an optional name identifying the file from which the input+        comes. The lexer can modify it if #line directives are encountered.         """-        self.lexer = lex.lex(object=self, **kwargs)--    def reset_lineno(self):-        """ Resets the internal line number counter of the lexer.+        self._init_state()+        self._lexdata = text+        self._filename = filename++    def _init_state(self) -> None:+        self._lexdata = ""+        self._filename = ""+        self._pos = 0+        self._line_start = 0+        self._pending_tok: Optional[_Token] = None+        self._lineno = 1++    @property+    def filename(self) -> str:+        return self._filename++    def token(self) -> Optional[_Token]:+        # Lexing strategy overview:+        #+        # - We maintain a current position (self._pos), line number, and the+        #   byte offset of the current line start. The lexer is a simple loop+        #   that skips whitespace/newlines and emits one token per call.+        # - A small amount of logic is handled manually before regex matching:+        #+        #   * Preprocessor-style directives: if we see '#', we check whether+        #     it's a #line or #pragma directive and consume it inline. #line+        #     updates lineno/filename and produces no tokens. #pragma can yield+        #     both PPPRAGMA and PPPRAGMASTR, but token() returns a single token,+        #     so we stash the PPPRAGMASTR as _pending_tok to return on the next+        #     token() call. Otherwise we return PPHASH.+        #   * Newlines update lineno/line-start tracking so tokens can record+        #     accurate columns.+        #+        # - The bulk of tokens are recognized in _match_token:+        #+        #   * _regex_rules: regex patterns for identifiers, literals, and other+        #     complex tokens (including error-producing patterns). The lexer+        #     uses a combined _regex_master to scan options at the same time.+        #   * _fixed_tokens: exact string matches for operators and punctuation,+        #     resolved by longest match.+        #+        # - Error patterns call the error callback and advance minimally, which+        #   keeps lexing resilient while reporting useful diagnostics.+        text = self._lexdata+        n = len(text)++        if self._pending_tok is not None:+            tok = self._pending_tok+            self._pending_tok = None+            return tok++        while self._pos < n:+            match text[self._pos]:+                case " " | "\t":+                    self._pos += 1+                case "\n":+                    self._lineno += 1+                    self._pos += 1+                    self._line_start = self._pos+                case "#":+                    if _line_pattern.match(text, self._pos + 1):+                        self._pos += 1+                        self._handle_ppline()+                        continue+                    if _pragma_pattern.match(text, self._pos + 1):+                        self._pos += 1+                        toks = self._handle_pppragma()+                        if len(toks) > 1:+                            self._pending_tok = toks[1]+                        if len(toks) > 0:+                            return toks[0]+                        continue+                    tok = self._make_token("PPHASH", "#", self._pos)+                    self._pos += 1+                    return tok+                case _:+                    if tok := self._match_token():+                        return tok+                    else:+                        continue++    def _match_token(self) -> Optional[_Token]:+        """Match one token at the current position.++        Returns a Token on success, or None if no token could be matched and+        an error was reported. This method always advances _pos by the matched+        length, or by 1 on error/no-match.         """-        self.lexer.lineno = 1--    def input(self, text):-        self.lexer.input(text)--    def token(self):-        self.last_token = self.lexer.token()-        return self.last_token--    def find_tok_column(self, token):-        """ Find the column of the token in its line.+        text = self._lexdata+        pos = self._pos+        # We pick the longest match between:+        # - the master regex (identifiers, literals, error patterns, etc.)+        # - fixed operator/punctuator literals from the bucket for text[pos]+        #+        # The longest match is required to ensure we properly lex something+        # like ".123" (a floating-point constant) as a single entity (with+        # FLOAT_CONST), rather than a PERIOD followed by a number.+        #+        # The fixed-literal buckets are already length-sorted, so within that+        # bucket we can take the first match. However, we still compare its+        # length to the regex match because the regex may have matched a longer+        # token that should take precedence.+        best = None++        if m := _regex_master.match(text, pos):+            tok_type = m.lastgroup+            # All master-regex alternatives are named; lastgroup shouldn't be None.+            assert tok_type is not None+            value = m.group(tok_type)+            length = len(value)+            action, msg = _regex_actions[tok_type]+            best = (length, tok_type, value, action, msg)++        if bucket := _fixed_tokens_by_first.get(text[pos]):+            for entry in bucket:+                if text.startswith(entry.literal, pos):+                    length = len(entry.literal)+                    if best is None or length > best[0]:+                        best = (+                            length,+                            entry.tok_type,+                            entry.literal,+                            _RegexAction.TOKEN,+                            None,+                        )+                    break
… 1009 more lines (truncated)
pycparser/c_parser.py +2162 lines
--- +++ @@ -1,5 +1,5 @@-#------------------------------------------------------------------------------+# ------------------------------------------------------------------------------ # pycparser: c_parser.py #-# CParser class: Parser and AST builder for the C language+# Recursive-descent parser for the C language. #@@ -7,8 +7,18 @@ # License: BSD-#-------------------------------------------------------------------------------from .ply import yacc+# ------------------------------------------------------------------------------+from dataclasses import dataclass+from typing import (+    Any,+    Dict,+    List,+    Literal,+    NoReturn,+    Optional,+    Tuple,+    TypedDict,+    cast,+)  from . import c_ast-from .c_lexer import CLexer-from .plyparser import PLYParser, ParseError, parameterized, template+from .c_lexer import CLexer, _Token from .ast_transforms import fix_switch_cases, fix_atomic_specifiers@@ -16,63 +26,48 @@ -@template-class CParser(PLYParser):+@dataclass+class Coord:+    """Coordinates of a syntactic element. Consists of:+    - File name+    - Line number+    - Column number+    """++    file: str+    line: int+    column: Optional[int] = None++    def __str__(self) -> str:+        text = f"{self.file}:{self.line}"+        if self.column:+            text += f":{self.column}"+        return text+++class ParseError(Exception):+    pass+++class CParser:+    """Recursive-descent C parser.++    Usage:+        parser = CParser()+        ast = parser.parse(text, filename)++    The `lexer` parameter lets you inject a lexer class (defaults to CLexer).+    The parameters after `lexer` are accepted for backward compatibility with+    the old PLY-based parser and are otherwise unused.+    """+     def __init__(-            self,-            lex_optimize=True,-            lexer=CLexer,-            lextab='pycparser.lextab',-            yacc_optimize=True,-            yacctab='pycparser.yacctab',-            yacc_debug=False,-            taboutputdir=''):-        """ Create a new CParser.--            Some arguments for controlling the debug/optimization-            level of the parser are provided. The defaults are-            tuned for release/performance mode.-            The simple rules for using them are:-            *) When tweaking CParser/CLexer, set these to False-            *) When releasing a stable parser, set to True--            lex_optimize:-                Set to False when you're modifying the lexer.-                Otherwise, changes in the lexer won't be used, if-                some lextab.py file exists.-                When releasing with a stable lexer, set to True-                to save the re-generation of the lexer table on-                each run.--            lexer:-                Set this parameter to define the lexer to use if-                you're not using the default CLexer.--            lextab:-                Points to the lex table that's used for optimized-                mode. Only if you're modifying the lexer and want-                some tests to avoid re-generating the table, make-                this point to a local lex table file (that's been-                earlier generated with lex_optimize=True)--            yacc_optimize:-                Set to False when you're modifying the parser.-                Otherwise, changes in the parser won't be used, if-                some parsetab.py file exists.-                When releasing with a stable parser, set to True-                to save the re-generation of the parser table on-                each run.--            yacctab:-                Points to the yacc table that's used for optimized-                mode. Only if you're modifying the parser, make-                this point to a local yacc table file--            yacc_debug:-                Generate a parser.out file that explains how yacc-                built the parsing table from the grammar.--            taboutputdir:-                Set this parameter to control the location of generated-                lextab and yacctab files.-        """-        self.clex = lexer(+        self,+        lex_optimize: bool = True,+        lexer: type[CLexer] = CLexer,+        lextab: str = "pycparser.lextab",+        yacc_optimize: bool = True,+        yacctab: str = "pycparser.yacctab",+        yacc_debug: bool = False,+        taboutputdir: str = "",+    ) -> None:+        self.clex: CLexer = lexer(             error_func=self._lex_error_func,@@ -80,37 +75,4 @@             on_rbrace_func=self._lex_on_rbrace_func,-            type_lookup_func=self._lex_type_lookup_func)--        self.clex.build(-            optimize=lex_optimize,-            lextab=lextab,-            outputdir=taboutputdir)-        self.tokens = self.clex.tokens--        rules_with_opt = [-            'abstract_declarator',-            'assignment_expression',-            'declaration_list',-            'declaration_specifiers_no_type',-            'designation',-            'expression',-            'identifier_list',-            'init_declarator_list',-            'id_init_declarator_list',-            'initializer_list',-            'parameter_type_list',-            'block_item_list',-            'type_qualifier_list',-            'struct_declarator_list'-        ]--        for rule in rules_with_opt:-            self._create_opt_rule(rule)--        self.cparser = yacc.yacc(-            module=self,-            start='translation_unit_or_empty',-            debug=yacc_debug,-            optimize=yacc_optimize,-            tabmodule=yacctab,-            outputdir=taboutputdir)+            type_lookup_func=self._lex_type_lookup_func,+        ) @@ -124,35 +86,43 @@         # in this scope at all.+        self._scope_stack: List[Dict[str, bool]] = [dict()]+        self._tokens: _TokenStream = _TokenStream(self.clex)++    def parse(+        self, text: str, filename: str = "", debug: bool = False+    ) -> c_ast.FileAST:+        """Parses C code and returns an AST.++        text:+            A string containing the C source code++        filename:+            Name of the file being parsed (for meaningful+            error messages)++        debug:+            Deprecated debug flag (unused); for backwards compatibility.+        """         self._scope_stack = [dict()]--        # Keeps track of the last token given to yacc (the lookahead token)-        self._last_yielded_token = None--    def parse(self, text, filename='', debug=False):-        """ Parses C code and returns an AST.--            text:-                A string containing the C source code--            filename:-                Name of the file being parsed (for meaningful-                error messages)--            debug:-                Debug flag to YACC-        """-        self.clex.filename = filename-        self.clex.reset_lineno()-        self._scope_stack = [dict()]-        self._last_yielded_token = None-        return self.cparser.parse(-                input=text,-                lexer=self.clex,-                debug=debug)--    ######################--   PRIVATE   --######################--    def _push_scope(self):+        self.clex.input(text, filename)+        self._tokens = _TokenStream(self.clex)++        ast = self._parse_translation_unit_or_empty()+        tok = self._peek()+        if tok is not None:+            self._parse_error(f"before: {tok.value}", self._tok_coord(tok))+        return ast++    # ------------------------------------------------------------------+    # Scope and declaration helpers+    # ------------------------------------------------------------------+    def _coord(self, lineno: int, column: Optional[int] = None) -> Coord:+        return Coord(file=self.clex.filename, line=lineno, column=column)++    def _parse_error(self, msg: str, coord: Coord | str | None) -> NoReturn:+        raise ParseError(f"{coord}: {msg}")+
… 3795 more lines (truncated)
pyproject.toml +38 lines
--- +++ @@ -0,0 +1,38 @@+[build-system]+requires = ["setuptools>=69", "wheel"]+build-backend = "setuptools.build_meta"++[project]+name = "pycparser"+version = "3.00"+description = "C parser in Python"+readme = "README.rst"+license = "BSD-3-Clause"+license-files = ["LICENSE"]+requires-python = ">=3.10"+authors = [{name = "Eli Bendersky", email = "[email protected]"}]+maintainers = [{name = "Eli Bendersky", email = "[email protected]"}]+classifiers = [+  "Development Status :: 5 - Production/Stable",+  "Programming Language :: Python :: 3",+  "Programming Language :: Python :: 3.10",+  "Programming Language :: Python :: 3.11",+  "Programming Language :: Python :: 3.12",+  "Programming Language :: Python :: 3.13",+  "Programming Language :: Python :: 3.14",+]++[project.urls]+Homepage = "https://github.com/eliben/pycparser"++[tool.setuptools]+packages = ["pycparser"]++[tool.setuptools.package-data]+pycparser = ["*.cfg"]++[tool.ruff.lint]+ignore = ["F403", "F405"]++[tool.ty.src]+exclude = ["setup.py", "utils/internal/memprofiling.py"]
tests/test_c_ast.py +69 lines
--- +++ @@ -4,5 +4,5 @@ -sys.path.insert(0, '..')+sys.path.insert(0, "..") import pycparser.c_ast as c_ast-import pycparser.plyparser as plyparser+from pycparser.c_parser import Coord @@ -12,18 +12,21 @@         b1 = c_ast.BinaryOp(-            op='+',-            left=c_ast.Constant(type='int', value='6'),-            right=c_ast.ID(name='joe'))+            op="+",+            left=c_ast.Constant(type="int", value="6"),+            right=c_ast.ID(name="joe"),+        )          self.assertIsInstance(b1.left, c_ast.Constant)-        self.assertEqual(b1.left.type, 'int')-        self.assertEqual(b1.left.value, '6')+        self.assertEqual(b1.left.type, "int")+        self.assertEqual(b1.left.value, "6")          self.assertIsInstance(b1.right, c_ast.ID)-        self.assertEqual(b1.right.name, 'joe')+        self.assertEqual(b1.right.name, "joe")      def test_weakref_works_on_nodes(self):-        c1 = c_ast.Constant(type='float', value='3.14')+        c1 = c_ast.Constant(type="float", value="3.14")         wr = weakref.ref(c1)         cref = wr()-        self.assertEqual(cref.type, 'float')+        self.assertIsNotNone(cref)+        assert cref is not None+        self.assertEqual(cref.type, "float")         self.assertEqual(weakref.getweakrefcount(c1), 1)@@ -31,5 +34,7 @@     def test_weakref_works_on_coord(self):-        coord = plyparser.Coord(file='a', line=2)+        coord = Coord(file="a", line=2)         wr = weakref.ref(coord)         cref = wr()+        self.assertIsNotNone(cref)+        assert cref is not None         self.assertEqual(cref.line, 2)@@ -48,5 +53,6 @@         b1 = c_ast.BinaryOp(-            op='+',-            left=c_ast.Constant(type='int', value='6'),-            right=c_ast.ID(name='joe'))+            op="+",+            left=c_ast.Constant(type="int", value="6"),+            right=c_ast.ID(name="joe"),+        ) @@ -55,13 +61,9 @@ -        self.assertEqual(cv.values, ['6'])+        self.assertEqual(cv.values, ["6"])          b2 = c_ast.BinaryOp(-            op='*',-            left=c_ast.Constant(type='int', value='111'),-            right=b1)+            op="*", left=c_ast.Constant(type="int", value="111"), right=b1+        ) -        b3 = c_ast.BinaryOp(-            op='^',-            left=b2,-            right=b1)+        b3 = c_ast.BinaryOp(op="^", left=b2, right=b1) @@ -70,20 +72,13 @@ -        self.assertEqual(cv.values, ['111', '6', '6'])+        self.assertEqual(cv.values, ["111", "6", "6"])      def tests_list_children(self):-        c1 = c_ast.Constant(type='float', value='5.6')-        c2 = c_ast.Constant(type='char', value='t')+        c1 = c_ast.Constant(type="float", value="5.6")+        c2 = c_ast.Constant(type="char", value="t") -        b1 = c_ast.BinaryOp(-            op='+',-            left=c1,-            right=c2)+        b1 = c_ast.BinaryOp(op="+", left=c1, right=c2) -        b2 = c_ast.BinaryOp(-            op='-',-            left=b1,-            right=c2)+        b2 = c_ast.BinaryOp(op="-", left=b1, right=c2) -        comp = c_ast.Compound(-            block_items=[b1, b2, c1, c2])+        comp = c_ast.Compound(block_items=[b1, b2, c1, c2]) @@ -92,57 +87,50 @@ -        self.assertEqual(cv.values,-                         ['5.6', 't', '5.6', 't', 't', '5.6', 't'])+        self.assertEqual(cv.values, ["5.6", "t", "5.6", "t", "t", "5.6", "t"])      def test_repr(self):-        c1 = c_ast.Constant(type='float', value='5.6')-        c2 = c_ast.Constant(type='char', value='t')+        c1 = c_ast.Constant(type="float", value="5.6")+        c2 = c_ast.Constant(type="char", value="t") -        b1 = c_ast.BinaryOp(-            op='+',-            left=c1,-            right=c2)+        b1 = c_ast.BinaryOp(op="+", left=c1, right=c2) -        b2 = c_ast.BinaryOp(-            op='-',-            left=b1,-            right=c2)+        b2 = c_ast.BinaryOp(op="-", left=b1, right=c2) -        comp = c_ast.Compound(-            block_items=[b1, b2, c1, c2])+        comp = c_ast.Compound(block_items=[b1, b2, c1, c2]) -        expected = ("Compound(block_items=[BinaryOp(op='+',\n"-                    "                               left=Constant(type='float',\n"-                    "                                             value='5.6'\n"-                    "                                             ),\n"-                    "                               right=Constant(type='char',\n"-                    "                                              value='t'\n"-                    "                                              )\n"-                    "                               ),\n"-                    "                      BinaryOp(op='-',\n"-                    "                               left=BinaryOp(op='+',\n"-                    "                                             left=Constant(type='float',\n"-                    "                                                           value='5.6'\n"-                    "                                                           ),\n"-                    "                                             right=Constant(type='char',\n"-                    "                                                            value='t'\n"-                    "                                                            )\n"-                    "                                             ),\n"-                    "                               right=Constant(type='char',\n"-                    "                                              value='t'\n"-                    "                                              )\n"-                    "                               ),\n"-                    "                      Constant(type='float',\n"-                    "                               value='5.6'\n"-                    "                               ),\n"-                    "                      Constant(type='char',\n"-                    "                               value='t'\n"-                    "                               )\n"-                    "                     ]\n"-                    "         )")+        expected = (+            "Compound(block_items=[BinaryOp(op='+',\n"+            "                               left=Constant(type='float',\n"+            "                                             value='5.6'\n"+            "                                             ),\n"+            "                               right=Constant(type='char',\n"+            "                                              value='t'\n"+            "                                              )\n"+            "                               ),\n"+            "                      BinaryOp(op='-',\n"+            "                               left=BinaryOp(op='+',\n"+            "                                             left=Constant(type='float',\n"+            "                                                           value='5.6'\n"+            "                                                           ),\n"+            "                                             right=Constant(type='char',\n"+            "                                                            value='t'\n"+            "                                                            )\n"+            "                                             ),\n"+            "                               right=Constant(type='char',\n"+            "                                              value='t'\n"+            "                                              )\n"+            "                               ),\n"+            "                      Constant(type='float',\n"+            "                               value='5.6'\n"+            "                               ),\n"+            "                      Constant(type='char',\n"+            "                               value='t'\n"+            "                               )\n"+            "                     ]\n"+            "         )"+        ) -        self.assertEqual(repr(comp),-                         expected)+        self.assertEqual(repr(comp), expected)  -if __name__ == '__main__':+if __name__ == "__main__":     unittest.main()
tests/test_c_generator.py +195 lines
--- +++ @@ -5,3 +5,3 @@ # Run from the root dir-sys.path.insert(0, '.')+sys.path.insert(0, ".") @@ -10,7 +10,3 @@ -_c_parser = c_parser.CParser(-                lex_optimize=False,-                yacc_debug=True,-                yacc_optimize=False,-                yacctab='yacctab')+_c_parser = c_parser.CParser() @@ -26,3 +22,3 @@     # ast1 and ast2 are the same.-    if type(ast1) != type(ast2):+    if type(ast1) is not type(ast2):         return False@@ -67,6 +63,6 @@     def test_partial_funcdecl_generation(self):-        src = r'''+        src = r"""             void noop(void);             void *something(void *thing);-            int add(int x, int y);'''+            int add(int x, int y);"""         ast = parse_to_ast(src)@@ -75,5 +71,5 @@         self.assertEqual(len(v.stubs), 3)-        self.assertTrue(r'void noop(void)' in v.stubs)-        self.assertTrue(r'void *something(void *thing)' in v.stubs)-        self.assertTrue(r'int add(int x, int y)' in v.stubs)+        self.assertTrue(r"void noop(void)" in v.stubs)+        self.assertTrue(r"void *something(void *thing)" in v.stubs)+        self.assertTrue(r"int add(int x, int y)" in v.stubs) @@ -87,11 +83,13 @@     def _assert_ctoc_correct(self, src, *args, **kwargs):-        """ Checks that the c2c translation was correct by parsing the code-            generated by c2c for src and comparing the AST with the original-            AST.--            Additional arguments are passed to CGenerator.__init__.+        """Checks that the c2c translation was correct by parsing the code+        generated by c2c for src and comparing the AST with the original+        AST.++        Additional arguments are passed to CGenerator.__init__.         """         src2 = self._run_c_to_c(src, *args, **kwargs)-        self.assertTrue(compare_asts(parse_to_ast(src), parse_to_ast(src2)),-                        "{!r} != {!r}".format(src, src2))+        self.assertTrue(+            compare_asts(parse_to_ast(src), parse_to_ast(src2)),+            "{!r} != {!r}".format(src, src2),+        )         return src2@@ -99,26 +97,26 @@     def test_trivial_decls(self):-        self._assert_ctoc_correct('int a;')-        self._assert_ctoc_correct('int b, a;')-        self._assert_ctoc_correct('int c, b, a;')-        self._assert_ctoc_correct('auto int a;')-        self._assert_ctoc_correct('register int a;')-        self._assert_ctoc_correct('_Thread_local int a;')+        self._assert_ctoc_correct("int a;")+        self._assert_ctoc_correct("int b, a;")+        self._assert_ctoc_correct("int c, b, a;")+        self._assert_ctoc_correct("auto int a;")+        self._assert_ctoc_correct("register int a;")+        self._assert_ctoc_correct("_Thread_local int a;")      def test_complex_decls(self):-        self._assert_ctoc_correct('int** (*a)(void);')-        self._assert_ctoc_correct('int** (*a)(void*, int);')-        self._assert_ctoc_correct('int (*b)(char * restrict k, float);')-        self._assert_ctoc_correct('int (*b)(char * _Atomic k, float);')-        self._assert_ctoc_correct('int (*b)(char * _Atomic volatile k, float);')-        self._assert_ctoc_correct('int test(const char* const* arg);')-        self._assert_ctoc_correct('int test(const char** const arg);')+        self._assert_ctoc_correct("int** (*a)(void);")+        self._assert_ctoc_correct("int** (*a)(void*, int);")+        self._assert_ctoc_correct("int (*b)(char * restrict k, float);")+        self._assert_ctoc_correct("int (*b)(char * _Atomic k, float);")+        self._assert_ctoc_correct("int (*b)(char * _Atomic volatile k, float);")+        self._assert_ctoc_correct("int test(const char* const* arg);")+        self._assert_ctoc_correct("int test(const char** const arg);")      def test_alignment(self):-        self._assert_ctoc_correct('_Alignas(32) int b;')-        self._assert_ctoc_correct('int _Alignas(32) a;')-        self._assert_ctoc_correct('_Alignas(32) _Atomic(int) b;')-        self._assert_ctoc_correct('_Atomic(int) _Alignas(32) b;')-        self._assert_ctoc_correct('_Alignas(long long) int a;')-        self._assert_ctoc_correct('int _Alignas(long long) a;')-        self._assert_ctoc_correct(r'''+        self._assert_ctoc_correct("_Alignas(32) int b;")+        self._assert_ctoc_correct("int _Alignas(32) a;")+        self._assert_ctoc_correct("_Alignas(32) _Atomic(int) b;")+        self._assert_ctoc_correct("_Atomic(int) _Alignas(32) b;")+        self._assert_ctoc_correct("_Alignas(long long) int a;")+        self._assert_ctoc_correct("int _Alignas(long long) a;")+        self._assert_ctoc_correct(r"""             typedef struct node_t {@@ -127,4 +125,4 @@             } node;-            ''')-        self._assert_ctoc_correct(r'''+            """)+        self._assert_ctoc_correct(r"""             typedef struct node_t {@@ -133,6 +131,6 @@             } node;-            ''')+            """)      def test_ternary(self):-        self._assert_ctoc_correct('''+        self._assert_ctoc_correct("""             int main(void)@@ -141,6 +139,6 @@                 (a == 0) ? (b = 1) : (b = 2);-            }''')+            }""")      def test_casts(self):-        self._assert_ctoc_correct(r'''+        self._assert_ctoc_correct(r"""             int main() {@@ -148,4 +146,4 @@                 int c = (int*) f;-            }''')-        self._assert_ctoc_correct(r'''+            }""")+        self._assert_ctoc_correct(r"""             int main() {@@ -154,9 +152,9 @@             }-        ''')+        """)      def test_initlist(self):-        self._assert_ctoc_correct('int arr[] = {1, 2, 3};')+        self._assert_ctoc_correct("int arr[] = {1, 2, 3};")      def test_exprs(self):-        self._assert_ctoc_correct('''+        self._assert_ctoc_correct("""             int main(void)@@ -168,3 +166,3 @@                 int e = --a;-            }''')+            }""") @@ -172,3 +170,3 @@         # note two minuses here-        self._assert_ctoc_correct(r'''+        self._assert_ctoc_correct(r"""             int main() {@@ -179,6 +177,6 @@                 return a;-            }''')+            }""")      def test_struct_decl(self):-        self._assert_ctoc_correct(r'''+        self._assert_ctoc_correct(r"""             typedef struct node_t {@@ -187,6 +185,6 @@             } node;-            ''')+            """)      def test_krstyle(self):-        self._assert_ctoc_correct(r'''+        self._assert_ctoc_correct(r"""             int main(argc, argv)@@ -197,6 +195,6 @@             }-        ''')+        """)      def test_switchcase(self):-        self._assert_ctoc_correct(r'''+        self._assert_ctoc_correct(r"""         int main() {@@ -216,6 +214,6 @@         }-        ''')+        """)      def test_nest_initializer_list(self):-        self._assert_ctoc_correct(r'''+        self._assert_ctoc_correct(r"""         int main()@@ -223,6 +221,6 @@            int i[1][1] = { { 1 } };-        }''')+        }""")      def test_nest_named_initializer(self):-        self._assert_ctoc_correct(r'''struct test+        self._assert_ctoc_correct(r"""struct test             {@@ -236,6 +234,6 @@             struct test test_var = {.i = 0, .test_i = {.k = 1}, .j = 2};-        ''')+        """)      def test_expr_list_in_initializer_list(self):-        self._assert_ctoc_correct(r'''+        self._assert_ctoc_correct(r"""         int main()@@ -243,11 +241,11 @@            int i[1] = { (1, 2) };-        }''')+        }""")      def test_issue36(self):-        self._assert_ctoc_correct(r'''+        self._assert_ctoc_correct(r"""             int main() {-            }''')+            }""")      def test_issue37(self):-        self._assert_ctoc_correct(r'''+        self._assert_ctoc_correct(r"""             int main(void)@@ -257,3 +255,3 @@               return 0;-            }''')+            }""") @@ -262,13 +260,13 @@         # (previous valid behavior, still working)-        self._assert_ctoc_correct(r'''+        self._assert_ctoc_correct(r"""             struct foo;-            ''')+            """)         # An empty body must be generated         # (added behavior)-        self._assert_ctoc_correct(r'''+        self._assert_ctoc_correct(r"""             struct foo {};-            ''')
… 369 more lines (truncated)
tests/test_c_lexer.py +372 lines
--- +++ @@ -3,5 +3,13 @@ import unittest--sys.path.insert(0, '..')-from pycparser.c_lexer import CLexer+from typing import Optional++sys.path.insert(0, "..")+from pycparser.c_lexer import CLexer, _Token+++def require_token(tok: Optional[_Token]) -> _Token:+    # In tests we know token() should produce a token here; this helper asserts+    # that and narrows Optional[_Token] to _Token, avoiding repeated casts/guards.+    assert tok is not None+    return tok @@ -17,6 +25,7 @@ class TestCLexerNoErrors(unittest.TestCase):-    """ Test lexing of strings that are not supposed to cause-        errors. Therefore, the error_func passed to the lexer-        raises an exception.+    """Test lexing of strings that are not supposed to cause+    errors. Therefore, the error_func passed to the lexer+    raises an exception.     """+     def error_func(self, msg, line, column):@@ -31,3 +40,3 @@     def type_lookup_func(self, typ):-        if typ.startswith('mytype'):+        if typ.startswith("mytype"):             return True@@ -37,5 +46,5 @@     def setUp(self):-        self.clex = CLexer(self.error_func, lambda: None, lambda: None,-                           self.type_lookup_func)-        self.clex.build(optimize=False)+        self.clex = CLexer(+            self.error_func, lambda: None, lambda: None, self.type_lookup_func+        ) @@ -46,91 +55,91 @@     def test_trivial_tokens(self):-        self.assertTokensTypes('1', ['INT_CONST_DEC'])-        self.assertTokensTypes('-', ['MINUS'])-        self.assertTokensTypes('volatile', ['VOLATILE'])-        self.assertTokensTypes('...', ['ELLIPSIS'])-        self.assertTokensTypes('++', ['PLUSPLUS'])-        self.assertTokensTypes('case int', ['CASE', 'INT'])-        self.assertTokensTypes('caseint', ['ID'])-        self.assertTokensTypes('$dollar cent$', ['ID', 'ID'])-        self.assertTokensTypes('i ^= 1;', ['ID', 'XOREQUAL', 'INT_CONST_DEC', 'SEMI'])+        self.assertTokensTypes("1", ["INT_CONST_DEC"])+        self.assertTokensTypes("-", ["MINUS"])+        self.assertTokensTypes("volatile", ["VOLATILE"])+        self.assertTokensTypes("...", ["ELLIPSIS"])+        self.assertTokensTypes("++", ["PLUSPLUS"])+        self.assertTokensTypes("case int", ["CASE", "INT"])+        self.assertTokensTypes("caseint", ["ID"])+        self.assertTokensTypes("$dollar cent$", ["ID", "ID"])+        self.assertTokensTypes("i ^= 1;", ["ID", "XOREQUAL", "INT_CONST_DEC", "SEMI"])      def test_id_typeid(self):-        self.assertTokensTypes('myt', ['ID'])-        self.assertTokensTypes('mytype', ['TYPEID'])-        self.assertTokensTypes('mytype6 var', ['TYPEID', 'ID'])+        self.assertTokensTypes("myt", ["ID"])+        self.assertTokensTypes("mytype", ["TYPEID"])+        self.assertTokensTypes("mytype6 var", ["TYPEID", "ID"])      def test_integer_constants(self):-        self.assertTokensTypes('12', ['INT_CONST_DEC'])-        self.assertTokensTypes('12u', ['INT_CONST_DEC'])-        self.assertTokensTypes('12l', ['INT_CONST_DEC'])-        self.assertTokensTypes('199872Ul', ['INT_CONST_DEC'])-        self.assertTokensTypes('199872lU', ['INT_CONST_DEC'])-        self.assertTokensTypes('199872LL', ['INT_CONST_DEC'])-        self.assertTokensTypes('199872ull', ['INT_CONST_DEC'])-        self.assertTokensTypes('199872llu', ['INT_CONST_DEC'])-        self.assertTokensTypes('1009843200000uLL', ['INT_CONST_DEC'])-        self.assertTokensTypes('1009843200000LLu', ['INT_CONST_DEC'])--        self.assertTokensTypes('077', ['INT_CONST_OCT'])-        self.assertTokensTypes('0123456L', ['INT_CONST_OCT'])--        self.assertTokensTypes('0xf7', ['INT_CONST_HEX'])-        self.assertTokensTypes('0b110', ['INT_CONST_BIN'])-        self.assertTokensTypes('0x01202AAbbf7Ul', ['INT_CONST_HEX'])-        self.assertTokensTypes("'12'", ['INT_CONST_CHAR'])-        self.assertTokensTypes("'123'", ['INT_CONST_CHAR'])-        self.assertTokensTypes("'1AB4'", ['INT_CONST_CHAR'])-        self.assertTokensTypes(r"'1A\n4'", ['INT_CONST_CHAR'])+        self.assertTokensTypes("12", ["INT_CONST_DEC"])+        self.assertTokensTypes("12u", ["INT_CONST_DEC"])+        self.assertTokensTypes("12l", ["INT_CONST_DEC"])+        self.assertTokensTypes("199872Ul", ["INT_CONST_DEC"])+        self.assertTokensTypes("199872lU", ["INT_CONST_DEC"])+        self.assertTokensTypes("199872LL", ["INT_CONST_DEC"])+        self.assertTokensTypes("199872ull", ["INT_CONST_DEC"])+        self.assertTokensTypes("199872llu", ["INT_CONST_DEC"])+        self.assertTokensTypes("1009843200000uLL", ["INT_CONST_DEC"])+        self.assertTokensTypes("1009843200000LLu", ["INT_CONST_DEC"])++        self.assertTokensTypes("077", ["INT_CONST_OCT"])+        self.assertTokensTypes("0123456L", ["INT_CONST_OCT"])++        self.assertTokensTypes("0xf7", ["INT_CONST_HEX"])+        self.assertTokensTypes("0b110", ["INT_CONST_BIN"])+        self.assertTokensTypes("0x01202AAbbf7Ul", ["INT_CONST_HEX"])+        self.assertTokensTypes("'12'", ["INT_CONST_CHAR"])+        self.assertTokensTypes("'123'", ["INT_CONST_CHAR"])+        self.assertTokensTypes("'1AB4'", ["INT_CONST_CHAR"])+        self.assertTokensTypes(r"'1A\n4'", ["INT_CONST_CHAR"])          # no 0 before x, so ID catches it-        self.assertTokensTypes('xf7', ['ID'])+        self.assertTokensTypes("xf7", ["ID"])          # - is MINUS, the rest a constnant-        self.assertTokensTypes('-1', ['MINUS', 'INT_CONST_DEC'])+        self.assertTokensTypes("-1", ["MINUS", "INT_CONST_DEC"])      def test_special_names(self):-        self.assertTokensTypes('sizeof offsetof', ['SIZEOF', 'OFFSETOF'])+        self.assertTokensTypes("sizeof offsetof", ["SIZEOF", "OFFSETOF"])      def test_new_keywords(self):-        self.assertTokensTypes('_Bool', ['_BOOL'])-        self.assertTokensTypes('_Atomic', ['_ATOMIC'])-        self.assertTokensTypes('_Alignas _Alignof', ['_ALIGNAS', '_ALIGNOF'])+        self.assertTokensTypes("_Bool", ["_BOOL"])+        self.assertTokensTypes("_Atomic", ["_ATOMIC"])+        self.assertTokensTypes("_Alignas _Alignof", ["_ALIGNAS", "_ALIGNOF"])      def test_floating_constants(self):-        self.assertTokensTypes('1.5f', ['FLOAT_CONST'])-        self.assertTokensTypes('01.5', ['FLOAT_CONST'])-        self.assertTokensTypes('.15L', ['FLOAT_CONST'])-        self.assertTokensTypes('0.', ['FLOAT_CONST'])+        self.assertTokensTypes("1.5f", ["FLOAT_CONST"])+        self.assertTokensTypes("01.5", ["FLOAT_CONST"])+        self.assertTokensTypes(".15L", ["FLOAT_CONST"])+        self.assertTokensTypes("0.", ["FLOAT_CONST"])          # but just a period is a period-        self.assertTokensTypes('.', ['PERIOD'])--        self.assertTokensTypes('3.3e-3', ['FLOAT_CONST'])-        self.assertTokensTypes('.7e25L', ['FLOAT_CONST'])-        self.assertTokensTypes('6.e+125f', ['FLOAT_CONST'])-        self.assertTokensTypes('666e666', ['FLOAT_CONST'])-        self.assertTokensTypes('00666e+3', ['FLOAT_CONST'])+        self.assertTokensTypes(".", ["PERIOD"])++        self.assertTokensTypes("3.3e-3", ["FLOAT_CONST"])+        self.assertTokensTypes(".7e25L", ["FLOAT_CONST"])+        self.assertTokensTypes("6.e+125f", ["FLOAT_CONST"])+        self.assertTokensTypes("666e666", ["FLOAT_CONST"])+        self.assertTokensTypes("00666e+3", ["FLOAT_CONST"])          # but this is a hex integer + 3-        self.assertTokensTypes('0x0666e+3', ['INT_CONST_HEX', 'PLUS', 'INT_CONST_DEC'])+        self.assertTokensTypes("0x0666e+3", ["INT_CONST_HEX", "PLUS", "INT_CONST_DEC"])      def test_hexadecimal_floating_constants(self):-        self.assertTokensTypes('0xDE.488641p0', ['HEX_FLOAT_CONST'])-        self.assertTokensTypes('0x.488641p0', ['HEX_FLOAT_CONST'])-        self.assertTokensTypes('0X12.P0', ['HEX_FLOAT_CONST'])+        self.assertTokensTypes("0xDE.488641p0", ["HEX_FLOAT_CONST"])+        self.assertTokensTypes("0x.488641p0", ["HEX_FLOAT_CONST"])+        self.assertTokensTypes("0X12.P0", ["HEX_FLOAT_CONST"])      def test_char_constants(self):-        self.assertTokensTypes(r"""'x'""", ['CHAR_CONST'])-        self.assertTokensTypes(r"""L'x'""", ['WCHAR_CONST'])-        self.assertTokensTypes(r"""u8'x'""", ['U8CHAR_CONST'])-        self.assertTokensTypes(r"""u'x'""", ['U16CHAR_CONST'])-        self.assertTokensTypes(r"""U'x'""", ['U32CHAR_CONST'])-        self.assertTokensTypes(r"""'\t'""", ['CHAR_CONST'])-        self.assertTokensTypes(r"""'\''""", ['CHAR_CONST'])-        self.assertTokensTypes(r"""'\?'""", ['CHAR_CONST'])-        self.assertTokensTypes(r"""'\0'""", ['CHAR_CONST'])-        self.assertTokensTypes(r"""'\012'""", ['CHAR_CONST'])-        self.assertTokensTypes(r"""'\x2f'""", ['CHAR_CONST'])-        self.assertTokensTypes(r"""'\x2f12'""", ['CHAR_CONST'])-        self.assertTokensTypes(r"""L'\xaf'""", ['WCHAR_CONST'])+        self.assertTokensTypes(r"""'x'""", ["CHAR_CONST"])+        self.assertTokensTypes(r"""L'x'""", ["WCHAR_CONST"])+        self.assertTokensTypes(r"""u8'x'""", ["U8CHAR_CONST"])+        self.assertTokensTypes(r"""u'x'""", ["U16CHAR_CONST"])+        self.assertTokensTypes(r"""U'x'""", ["U32CHAR_CONST"])+        self.assertTokensTypes(r"""'\t'""", ["CHAR_CONST"])+        self.assertTokensTypes(r"""'\''""", ["CHAR_CONST"])+        self.assertTokensTypes(r"""'\?'""", ["CHAR_CONST"])+        self.assertTokensTypes(r"""'\0'""", ["CHAR_CONST"])+        self.assertTokensTypes(r"""'\012'""", ["CHAR_CONST"])+        self.assertTokensTypes(r"""'\x2f'""", ["CHAR_CONST"])+        self.assertTokensTypes(r"""'\x2f12'""", ["CHAR_CONST"])+        self.assertTokensTypes(r"""L'\xaf'""", ["WCHAR_CONST"]) @@ -138,49 +147,42 @@         braces = []+         def on_lbrace():-            braces.append('{')+            braces.append("{")+         def on_rbrace():-            braces.append('}')-        clex = CLexer(self.error_func, on_lbrace, on_rbrace,-                      self.type_lookup_func)-        clex.build(optimize=False)-        clex.input('hello { there } } and again }}{')+            braces.append("}")++        clex = CLexer(self.error_func, on_lbrace, on_rbrace, self.type_lookup_func)+        clex.input("hello { there } } and again }}{")         token_list(clex)-        self.assertEqual(braces, ['{', '}', '}', '}', '}', '{'])+        self.assertEqual(braces, ["{", "}", "}", "}", "}", "{"])      def test_string_literal(self):-        self.assertTokensTypes('"a string"', ['STRING_LITERAL'])-        self.assertTokensTypes('L"ing"', ['WSTRING_LITERAL'])-        self.assertTokensTypes('u8"ing"', ['U8STRING_LITERAL'])-        self.assertTokensTypes('u"ing"', ['U16STRING_LITERAL'])-        self.assertTokensTypes('U"ing"', ['U32STRING_LITERAL'])-        self.assertTokensTypes(-            '"i am a string too \t"',-            ['STRING_LITERAL'])-        self.assertTokensTypes(-            r'''"esc\ape \"\'\? \0234 chars \rule"''',-            ['STRING_LITERAL'])-        self.assertTokensTypes(-            r'''"hello 'joe' wanna give it a \"go\"?"''',-            ['STRING_LITERAL'])+        self.assertTokensTypes('"a string"', ["STRING_LITERAL"])+        self.assertTokensTypes('L"ing"', ["WSTRING_LITERAL"])+        self.assertTokensTypes('u8"ing"', ["U8STRING_LITERAL"])+        self.assertTokensTypes('u"ing"', ["U16STRING_LITERAL"])+        self.assertTokensTypes('U"ing"', ["U32STRING_LITERAL"])+        self.assertTokensTypes('"i am a string too \t"', ["STRING_LITERAL"])+        self.assertTokensTypes(+            r'''"esc\ape \"\'\? \0234 chars \rule"''', ["STRING_LITERAL"]+        )+        self.assertTokensTypes(+            r'''"hello 'joe' wanna give it a \"go\"?"''', ["STRING_LITERAL"]
… 544 more lines (truncated)
pygments pypi
2.20.0 2mo ago nominal
no findings
latest 2.20.0 versions 68 maintainers 1
2.15.0
2.15.1
2.16.0
2.16.1
2.17.0
2.17.1
2.17.2
2.18.0
2.19.0
2.19.1
2.19.2
2.20.0
CLEAN
no findings — nominal
release diff 2.19.2 → 2.20.0
+29 added · -1 removed · ~420 modified
+358 more files not shown
doc/_static/demo-worker.js +7 lines
--- +++ @@ -9,3 +9,3 @@         {s: HtmlFormatter(style=s).get_style_defs('.demo-highlight') for s in STYLE_MAP}-    `).toJs();+    `).toJs({dict_converter: Object.fromEntries});     self.postMessage({loaded: {styles}})@@ -24,5 +24,8 @@ -            lexer = pygments.lexers.get_lexer_by_name(lexer_name)+            if hasattr(code, 'to_py'):+                code = code.to_py()             if type(code) == memoryview:                 code = bytes(code)++            lexer = pygments.lexers.get_lexer_by_name(lexer_name)             tokens = lexer.get_tokens(code)@@ -53,6 +56,2 @@         const lexer = self.pyodide.runPython(`-            import sys-            sys.setrecursionlimit(1000)-            # TODO: remove after upgrading to Pyodide 0.19-             import pygments.lexers@@ -60,2 +59,4 @@ +            if hasattr(code, 'to_py'):+                code = code.to_py()             if type(code) == memoryview:
doc/_static/demo.js +2 lines
--- +++ @@ -34,3 +34,3 @@         return;-    style.textContent = styles.get(styleSelect.value);+    style.textContent = styles[styleSelect.value];     updateCopyLink();@@ -94,3 +94,3 @@         loadingDiv.hidden = true;-        style.textContent = styles.get(styleSelect.value);+        style.textContent = styles[styleSelect.value];     } else if (msg.data.tokens) {
doc/conf.py +2 lines
--- +++ @@ -235,3 +235,4 @@ def pg_context(app, pagename, templatename, ctx, event_arg):-    ctx['demo_active'] = bool(os.environ.get('WEBSITE_BUILD'))+    # casting string to bool doesn't work, we'll use 0 to disable+    ctx['demo_active'] = os.environ.get('WEBSITE_BUILD')  != '0' 
doc/examples/example.py +3 lines
--- +++ @@ -1,2 +1,3 @@-from typing import Iterator+from collections.abc import Iterator+ @@ -12,2 +13,3 @@ + result = sum(Math.fib(42))
external/markdown-processor.py +1 lines
--- +++ @@ -23,3 +23,3 @@ -    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.+    :copyright: Copyright 2006-present by the Pygments team, see AUTHORS.     :license: BSD, see LICENSE for details.
external/moin-parser.py +1 lines
--- +++ @@ -32,3 +32,3 @@ -    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.+    :copyright: Copyright 2006-present by the Pygments team, see AUTHORS.     :license: BSD, see LICENSE for details.
pygments/__init__.py +2 lines
--- +++ @@ -23,3 +23,3 @@ -    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.+    :copyright: Copyright 2006-present by the Pygments team, see AUTHORS.     :license: BSD, see LICENSE for details.@@ -28,3 +28,3 @@ -__version__ = '2.19.2'+__version__ = '2.20.0' __docformat__ = 'restructuredtext'
pygments/__main__.py +1 lines
--- +++ @@ -6,3 +6,3 @@ -    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.+    :copyright: Copyright 2006-present by the Pygments team, see AUTHORS.     :license: BSD, see LICENSE for details.
pygments/cmdline.py +2 lines
--- +++ @@ -6,3 +6,3 @@ -    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.+    :copyright: Copyright 2006-present by the Pygments team, see AUTHORS.     :license: BSD, see LICENSE for details.@@ -187,3 +187,3 @@     if argns.V:-        print(f'Pygments version {__version__}, (c) 2006-2024 by Georg Brandl, Matthäus '+        print(f'Pygments version {__version__}, (c) 2006-present by Georg Brandl, Matthäus '               'Chajdas and contributors.')
pygments/console.py +1 lines
--- +++ @@ -6,3 +6,3 @@ -    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.+    :copyright: Copyright 2006-present by the Pygments team, see AUTHORS.     :license: BSD, see LICENSE for details.
pygments/filter.py +1 lines
--- +++ @@ -6,3 +6,3 @@ -    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.+    :copyright: Copyright 2006-present by the Pygments team, see AUTHORS.     :license: BSD, see LICENSE for details.
pygments/filters/__init__.py +10 lines
--- +++ @@ -7,3 +7,3 @@ -    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.+    :copyright: Copyright 2006-present by the Pygments team, see AUTHORS.     :license: BSD, see LICENSE for details.@@ -97,4 +97,6 @@ class SymbolFilter(Filter):-    """Convert mathematical symbols such as \\<longrightarrow> in Isabelle-    or \\longrightarrow in LaTeX into Unicode characters.+    """Convert mathematical symbols into Unicode characters.++    Examples are ``\\<longrightarrow>`` in Isabelle or+    ``\\longrightarrow`` in LaTeX. @@ -687,4 +689,5 @@ class KeywordCaseFilter(Filter):-    """Convert keywords to lowercase or uppercase or capitalize them, which-    means first letter uppercase, rest lowercase.+    """Convert keywords to lowercase or uppercase or capitalize them.++    This means first letter uppercase, rest lowercase. @@ -868,3 +871,3 @@ class GobbleFilter(Filter):-    """Gobbles source code lines (eats initial characters).+    """Gobble source code lines (eats initial characters). @@ -907,4 +910,3 @@ class TokenMergeFilter(Filter):-    """Merges consecutive tokens with the same token type in the output-    stream of a lexer.+    """Merge consecutive tokens with the same token type in the output stream. 
pygments/formatter.py +1 lines
--- +++ @@ -6,3 +6,3 @@ -    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.+    :copyright: Copyright 2006-present by the Pygments team, see AUTHORS.     :license: BSD, see LICENSE for details.
pygments/formatters/__init__.py +1 lines
--- +++ @@ -6,3 +6,3 @@ -    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.+    :copyright: Copyright 2006-present by the Pygments team, see AUTHORS.     :license: BSD, see LICENSE for details.
pygments/formatters/bbcode.py +1 lines
--- +++ @@ -6,3 +6,3 @@ -    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.+    :copyright: Copyright 2006-present by the Pygments team, see AUTHORS.     :license: BSD, see LICENSE for details.
pygments/formatters/groff.py +1 lines
--- +++ @@ -6,3 +6,3 @@ -    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.+    :copyright: Copyright 2006-present by the Pygments team, see AUTHORS.     :license: BSD, see LICENSE for details.
pygments/formatters/html.py +11 lines
--- +++ @@ -6,3 +6,3 @@ -    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.+    :copyright: Copyright 2006-present by the Pygments team, see AUTHORS.     :license: BSD, see LICENSE for details.@@ -19,2 +19,4 @@ from pygments.util import get_bool_opt, get_int_opt, get_list_opt++import html @@ -72,3 +74,3 @@ generated by Pygments <https://pygments.org/>-Copyright 2006-2025 by the Pygments team.+Copyright 2006-present by the Pygments team. Licensed under the BSD license, see LICENSE for details.@@ -83,3 +85,3 @@ generated by Pygments <https://pygments.org/>-Copyright 2006-2025 by the Pygments team.+Copyright 2006-present by the Pygments team. Licensed under the BSD license, see LICENSE for details.@@ -424,4 +426,4 @@         self.classprefix = options.get('classprefix', '')-        self.cssclass = self._decodeifneeded(options.get('cssclass', 'highlight'))-        self.cssstyles = self._decodeifneeded(options.get('cssstyles', ''))+        self.cssclass = html.escape(self._decodeifneeded(options.get('cssclass', 'highlight')))+        self.cssstyles = html.escape(self._decodeifneeded(options.get('cssstyles', '')))         self.prestyles = self._decodeifneeded(options.get('prestyles', ''))@@ -431,3 +433,3 @@         self.tagurlformat = self._decodeifneeded(options.get('tagurlformat', ''))-        self.filename = self._decodeifneeded(options.get('filename', ''))+        self.filename = html.escape(self._decodeifneeded(options.get('filename', '')))         self.wrapcode = get_bool_opt(options, 'wrapcode', False)@@ -454,5 +456,5 @@         self.nobackground = get_bool_opt(options, 'nobackground', False)-        self.lineseparator = options.get('lineseparator', '\n')-        self.lineanchors = options.get('lineanchors', '')-        self.linespans = options.get('linespans', '')+        self.lineseparator = html.escape(options.get('lineseparator', '\n'))+        self.lineanchors = html.escape(options.get('lineanchors', ''))+        self.linespans = html.escape(options.get('linespans', ''))         self.anchorlinenos = get_bool_opt(options, 'anchorlinenos', False)
pygments/formatters/img.py +1 lines
--- +++ @@ -6,3 +6,3 @@ -    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.+    :copyright: Copyright 2006-present by the Pygments team, see AUTHORS.     :license: BSD, see LICENSE for details.
pygments/formatters/irc.py +1 lines
--- +++ @@ -6,3 +6,3 @@ -    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.+    :copyright: Copyright 2006-present by the Pygments team, see AUTHORS.     :license: BSD, see LICENSE for details.@@ -93,3 +93,2 @@     return add + text + sub-    return '<'+add+'>'+text+'</'+sub+'>' 
pygments/formatters/latex.py +1 lines
--- +++ @@ -6,3 +6,3 @@ -    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.+    :copyright: Copyright 2006-present by the Pygments team, see AUTHORS.     :license: BSD, see LICENSE for details.
pygments/formatters/other.py +1 lines
--- +++ @@ -6,3 +6,3 @@ -    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.+    :copyright: Copyright 2006-present by the Pygments team, see AUTHORS.     :license: BSD, see LICENSE for details.
pygments/formatters/pangomarkup.py +1 lines
--- +++ @@ -6,3 +6,3 @@ -    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.+    :copyright: Copyright 2006-present by the Pygments team, see AUTHORS.     :license: BSD, see LICENSE for details.
pygments/formatters/rtf.py +1 lines
--- +++ @@ -6,3 +6,3 @@ -    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.+    :copyright: Copyright 2006-present by the Pygments team, see AUTHORS.     :license: BSD, see LICENSE for details.
pygments/formatters/svg.py +1 lines
--- +++ @@ -6,3 +6,3 @@ -    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.+    :copyright: Copyright 2006-present by the Pygments team, see AUTHORS.     :license: BSD, see LICENSE for details.
pygments/formatters/terminal.py +1 lines
--- +++ @@ -6,3 +6,3 @@ -    :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.+    :copyright: Copyright 2006-present by the Pygments team, see AUTHORS.     :license: BSD, see LICENSE for details.
python-dateutil pypi
2.9.0.post0 2y ago nominal
INSTALL-EXEC
latest 2.9.0.post0 versions 34 maintainers 1
2.6.0
2.6.1
2.7.0
2.7.1
2.7.2
2.7.3
2.7.4
2.7.5
2.8.0
2.8.1
2.8.2
2.9.0
INSTALL-EXEC
setup.py in sdist uses install-hook (runs at pip install)
warn · snapshot-derived
release diff 2.8.2 → 2.9.0
+43 added · -41 removed · ~20 modified
new files touching dangerous APIs: src/dateutil/zoneinfo/rebuild.py, tests/_common.py, tests/test_tz.py
+15 more files not shown
src/dateutil/zoneinfo/rebuild.py +75 lines · 1 flagged
--- +++ @@ -0,0 +1,75 @@+import logging+import os+import tempfile+import shutil+import json+from subprocess import check_call, check_output+from tarfile import TarFile++from dateutil.zoneinfo import METADATA_FN, ZONEFILENAME+++def rebuild(filename, tag=None, format="gz", zonegroups=[], metadata=None):+    """Rebuild the internal timezone info in dateutil/zoneinfo/zoneinfo*tar*++    filename is the timezone tarball from ``ftp.iana.org/tz``.++    """+    tmpdir = tempfile.mkdtemp()+    zonedir = os.path.join(tmpdir, "zoneinfo")+    moduledir = os.path.dirname(__file__)+    try:+        with TarFile.open(filename) as tf:+            for name in zonegroups:+                tf.extract(name, tmpdir)+            filepaths = [os.path.join(tmpdir, n) for n in zonegroups]++            _run_zic(zonedir, filepaths)++        # write metadata file+        with open(os.path.join(zonedir, METADATA_FN), 'w') as f:+            json.dump(metadata, f, indent=4, sort_keys=True)+        target = os.path.join(moduledir, ZONEFILENAME)+        with TarFile.open(target, "w:%s" % format) as tf:+            for entry in os.listdir(zonedir):+                entrypath = os.path.join(zonedir, entry)+                tf.add(entrypath, entry)+    finally:+        shutil.rmtree(tmpdir)+++def _run_zic(zonedir, filepaths):+    """Calls the ``zic`` compiler in a compatible way to get a "fat" binary.++    Recent versions of ``zic`` default to ``-b slim``, while older versions+    don't even have the ``-b`` option (but default to "fat" binaries). The+    current version of dateutil does not support Version 2+ TZif files, which+    causes problems when used in conjunction with "slim" binaries, so this+    function is used to ensure that we always get a "fat" binary.+    """++    try:+        help_text = check_output(["zic", "--help"])+    except OSError as e:+        _print_on_nosuchfile(e)+        raise++    if b"-b " in help_text:+        bloat_args = ["-b", "fat"]+    else:+        bloat_args = []++    check_call(["zic"] + bloat_args + ["-d", zonedir] + filepaths)+++def _print_on_nosuchfile(e):+    """Print helpful troubleshooting message++    e is an exception raised by subprocess.check_call()++    """+    if e.errno == 2:+        logging.error(+            "Could not find zic. Perhaps you need to install "+            "libc-bin or some other package that provides it, "+            "or it's not in your PATH?")
tests/_common.py +233 lines · 2 flagged
--- +++ @@ -0,0 +1,233 @@+from __future__ import unicode_literals+import os+import time+import subprocess+import warnings+import tempfile+import pickle++import pytest+++class PicklableMixin(object):+    def _get_nobj_bytes(self, obj, dump_kwargs, load_kwargs):+        """+        Pickle and unpickle an object using ``pickle.dumps`` / ``pickle.loads``+        """+        pkl = pickle.dumps(obj, **dump_kwargs)+        return pickle.loads(pkl, **load_kwargs)++    def _get_nobj_file(self, obj, dump_kwargs, load_kwargs):+        """+        Pickle and unpickle an object using ``pickle.dump`` / ``pickle.load`` on+        a temporary file.+        """+        with tempfile.TemporaryFile('w+b') as pkl:+            pickle.dump(obj, pkl, **dump_kwargs)+            pkl.seek(0)         # Reset the file to the beginning to read it+            nobj = pickle.load(pkl, **load_kwargs)++        return nobj++    def assertPicklable(self, obj, singleton=False, asfile=False,+                        dump_kwargs=None, load_kwargs=None):+        """+        Assert that an object can be pickled and unpickled. This assertion+        assumes that the desired behavior is that the unpickled object compares+        equal to the original object, but is not the same object.+        """+        get_nobj = self._get_nobj_file if asfile else self._get_nobj_bytes+        dump_kwargs = dump_kwargs or {}+        load_kwargs = load_kwargs or {}++        nobj = get_nobj(obj, dump_kwargs, load_kwargs)+        if not singleton:+            self.assertIsNot(obj, nobj)+        self.assertEqual(obj, nobj)+++class TZContextBase(object):+    """+    Base class for a context manager which allows changing of time zones.++    Subclasses may define a guard variable to either block or or allow time+    zone changes by redefining ``_guard_var_name`` and ``_guard_allows_change``.+    The default is that the guard variable must be affirmatively set.++    Subclasses must define ``get_current_tz`` and ``set_current_tz``.+    """+    _guard_var_name = "DATEUTIL_MAY_CHANGE_TZ"+    _guard_allows_change = True++    def __init__(self, tzval):+        self.tzval = tzval+        self._old_tz = None++    @classmethod+    def tz_change_allowed(cls):+        """+        Class method used to query whether or not this class allows time zone+        changes.+        """+        guard = bool(os.environ.get(cls._guard_var_name, False))++        # _guard_allows_change gives the "default" behavior - if True, the+        # guard is overcoming a block. If false, the guard is causing a block.+        # Whether tz_change is allowed is therefore the XNOR of the two.+        return guard == cls._guard_allows_change++    @classmethod+    def tz_change_disallowed_message(cls):+        """ Generate instructions on how to allow tz changes """+        msg = ('Changing time zone not allowed. Set {envar} to {gval} '+               'if you would like to allow this behavior')++        return msg.format(envar=cls._guard_var_name,+                          gval=cls._guard_allows_change)++    def __enter__(self):+        if not self.tz_change_allowed():+            msg = self.tz_change_disallowed_message()+            pytest.skip(msg)++            # If this is used outside of a test suite, we still want an error.+            raise ValueError(msg)  # pragma: no cover++        self._old_tz = self.get_current_tz()+        self.set_current_tz(self.tzval)++    def __exit__(self, type, value, traceback):+        if self._old_tz is not None:+            self.set_current_tz(self._old_tz)++        self._old_tz = None++    def get_current_tz(self):+        raise NotImplementedError++    def set_current_tz(self):+        raise NotImplementedError+++class TZEnvContext(TZContextBase):+    """+    Context manager that temporarily sets the `TZ` variable (for use on+    *nix-like systems). Because the effect is local to the shell anyway, this+    will apply *unless* a guard is set.++    If you do not want the TZ environment variable set, you may set the+    ``DATEUTIL_MAY_NOT_CHANGE_TZ_VAR`` variable to a truthy value.+    """+    _guard_var_name = "DATEUTIL_MAY_NOT_CHANGE_TZ_VAR"+    _guard_allows_change = False++    def get_current_tz(self):+        return os.environ.get('TZ', UnsetTz)++    def set_current_tz(self, tzval):+        if tzval is UnsetTz and 'TZ' in os.environ:+            del os.environ['TZ']+        else:+            os.environ['TZ'] = tzval++        time.tzset()+++class TZWinContext(TZContextBase):+    """+    Context manager for changing local time zone on Windows.++    Because the effect of this is system-wide and global, it may have+    unintended side effect. Set the ``DATEUTIL_MAY_CHANGE_TZ`` environment+    variable to a truthy value before using this context manager.+    """+    def get_current_tz(self):+        p = subprocess.Popen(['tzutil', '/g'], stdout=subprocess.PIPE)++        ctzname, err = p.communicate()+        ctzname = ctzname.decode()     # Popen returns++        if p.returncode:+            raise OSError('Failed to get current time zone: ' + err)++        return ctzname++    def set_current_tz(self, tzname):+        p = subprocess.Popen('tzutil /s "' + tzname + '"')++        out, err = p.communicate()++        if p.returncode:+            raise OSError('Failed to set current time zone: ' ++                          (err or 'Unknown error.'))+++###+# Utility classes+class NotAValueClass(object):+    """+    A class analogous to NaN that has operations defined for any type.+    """+    def _op(self, other):+        return self             # Operation with NotAValue returns NotAValue++    def _cmp(self, other):+        return False++    __add__ = __radd__ = _op+    __sub__ = __rsub__ = _op+    __mul__ = __rmul__ = _op+    __div__ = __rdiv__ = _op+    __truediv__ = __rtruediv__ = _op+    __floordiv__ = __rfloordiv__ = _op++    __lt__ = __rlt__ = _op+    __gt__ = __rgt__ = _op+    __eq__ = __req__ = _op+    __le__ = __rle__ = _op+    __ge__ = __rge__ = _op+++NotAValue = NotAValueClass()+++class ComparesEqualClass(object):+    """+    A class that is always equal to whatever you compare it to.+    """++    def __eq__(self, other):+        return True++    def __ne__(self, other):+        return False++    def __le__(self, other):+        return True++    def __ge__(self, other):+        return True++    def __lt__(self, other):+        return False++    def __gt__(self, other):+        return False++    __req__ = __eq__+    __rne__ = __ne__+    __rle__ = __le__+    __rge__ = __ge__+    __rlt__ = __lt__+    __rgt__ = __gt__+++ComparesEqual = ComparesEqualClass()+++class UnsetTzClass(object):+    """ Sentinel class for unset time zone variable """+    pass+++UnsetTz = UnsetTzClass()
tests/test_tz.py +2811 lines · 14 flagged
--- +++ @@ -0,0 +1,2811 @@+# -*- coding: utf-8 -*-+from __future__ import unicode_literals+from ._common import PicklableMixin+from ._common import TZEnvContext, TZWinContext+from ._common import ComparesEqual++from datetime import datetime, timedelta+from datetime import time as dt_time+from datetime import tzinfo+from six import PY2+from io import BytesIO, StringIO+import unittest++import sys+import base64+import copy+import gc+import weakref++from functools import partial++IS_WIN = sys.platform.startswith('win')++import pytest++# dateutil imports+from dateutil.relativedelta import relativedelta, SU, TH+from dateutil.parser import parse+from dateutil import tz as tz+from dateutil import zoneinfo++try:+    from dateutil import tzwin+except ImportError as e:+    if IS_WIN:+        raise e+    else:+        pass++MISSING_TARBALL = ("This test fails if you don't have the dateutil "+                   "timezone file installed. Please read the README")++TZFILE_EST5EDT = b"""+VFppZgAAAAAAAAAAAAAAAAAAAAAAAAAEAAAABAAAAAAAAADrAAAABAAAABCeph5wn7rrYKCGAHCh+ms1gomXicKOD6eCkaq5wpTWnYKZTyvCnFYlgqDOs8Kj+peCqE47wqt6H4KvzcPCsvmngrdNS8K6e+S+CvszTwsH4t4LGcUXCyZ0pgs3wzcLRHLGC1XBVwticOYLc793C4BvBguRvZcLnm0mC7BPXwu8a0+YLzk1/C9r9DgvsS58L+PsuDApJvwwW+U4MKEffDDT3bgxGRf8MUvWODGTXxwxw864MgtXnDI+Fdg+yg1AcMrYOWDLiPBw0iP0cNJg++DTdeTw1EDd4NVVxvDWIL/g1zWo8NgAoeDZFYrw2eCD4Nr+p3Db+wGXg3N6JcN2pgmDevmtw34lkYOCeTXDhaUZg4n4vcONJKGDkXhFw5Vcu4OZHLfDnNxDg6CcP8OkW+8uDqBvHw6vbU4Ovm0/Ds1rbg7ca18O6/02Dvr9Jw8J+1YPGPtHDyf5dg82+WcPRfeWD1T3hw9j9b+YPcvWnD4KHfg+Q88cPoIWeD6+Fjw++g74PzYOvD9yB3g/rgc8P+n/+AAl/7wAYfh4AJ34PADcP5g+BGD9cAVQ4GAGQN9wBzDCYAeNGXAJEKRgCa2U8ArwhmAL4IVwDNmi4A3AZ3AOuYTgD6mD8BCZZuAR+iWXwEnlI4BNpR/AUWSrgFUkp8BY5DOAXKQvwGCIpYBkI7fAaAgtgGvIKcBvh7WAc0exwHcHPYB6x+znAfobFgIHYA8CGBk2AiVeLwI2qv4CQ1xPAlSpHgJhWm8Ccqc+An/sNwKQpV4CnepXAq6jfgK76H+cCzTVGAtnmlwLrM2YC9+S3AwkxhgMWdn8DJy+mAzR0nwNFLcYDUnK/A2Mr5gNwcN8Dgb2uA45u/w+Ofu84DrG0fA7257gPK/ucD27gOA+j9BwP5ti4EBvsnBBhH9gQk+UcENkYWBEL3ZwRURDYEYPWHBH+JCVgR/h08EkEB2BJ2FbwSuPpYEu4OPBMzQXgTZga8E6s5+BPd/zwUIzJ4FFhGXBSbKvgU0D7cFRM+jeBVIN1wVixv4FcAv3BYFYxgWOChcFn1bmBawINwW9VQYFypn/BdtTJgXomB8F+VFGBgaWPwYX4w+4GJJRfBjXhLgZCkn8GU99OBmEkRwZx3W4GfyJnBo/bjgadIIcGrdmuBrsepwbMa3YG2RzHBupplg+b3GucHCGe2BxWsrwcmZdYHM6rPB0Rj9gdRqO8HYvW+B2+nDweA894HjaUvB57x/gero08HvPAeB8+o1Fwfa7j4H6DM3B/jsXgAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAB+AAEAAQABAgMBAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAB+AAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEA+AQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAB+AAEAAQABAAEAAQABAAEAAQABAAEAAf//x8ABAP//ubAABP//x8ABCP//x8ABDEVEVABFU1QARVdU+AEVQVAAAAAABAAAAAQ==+"""++EUROPE_HELSINKI = b"""+VFppZgAAAAAAAAAAAAAAAAAAAAAAAAAFAAAABQAAAAAAAAB1AAAABQAAAA2kc28Yy85RYMy/hdAV+I+uQFhPckBcDzZAX876QGOOvkBnToJAaw5GQG7y9EBysrhAdnJ8QHoyQEB98gRAgbHIQIVxjECJM+VBAjPEUQJCw2ECUcJxAmDBgQJwVDkCf1NJAo5SWQKdUWkCrFB5ArtPiQLKTpkC2U2pAuhMuQL3S8+kDBkrZAxXdkQMnK0EDM9uxA0UpYQNR2dEDYyeBA2/X8QOBuUkDjdYRA5+3aQOr1DEDvbWJA8pl+Q+Pbs6kD6GQZA/mxyQQGYjkEGEORBCRgWQQ2QbEEQl55BFQ/0QRgXJkEcj3xBH7uYQSQPBEEnOyBBK+46MQS66qEEzMv5BNjowQTqyhkE9ubhBQjIOQUVeKkFJsZZBTN2yQVExHkFUXTpBWLCmQVvcwkFgV+RhBY1xKQWfUoEFq29JBb1QoQXKAREF207BBef/MQX5TOEGBf1RBhfeqQYj+3EGNdzJBkH5kQZT2u+kGYItZBnHZCQZ+iXkGj9cpBpyHmQat1UkGuoW5BsxnEQbYg9kG6mUxBvaB+QcIY1EHFRPBByZhcQ+czEeEHRF+RB1EQAQdi8VkHbw4hB4DveQeNDEEHnu2ZB6sKYQe867kHyZwpB9rp2QfnmkkH+Of5AC+AQIDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQD+BAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAME+AwQAABdoAAAAACowAQQAABwgAAkAACowAQQAABwgAAlITVQARUVTVABFRVQAAAAAAQEAAAABAQ==+"""++NEW_YORK = b"""+VFppZgAAAAAAAAAAAAAAAAAAAAAAAAAEAAAABAAAABcAAADrAAAABAAAABCeph5wn7rrYKCGAHCh+ms1gomXicKOD6eCkaq5wpTWnYKZTyvCnFYlgqDOs8Kj+peCqE47wqt6H4KvzcPCsvmngrdNS8K6e+S+CvszTwsH4t4LGcUXCyZ0pgs3wzcLRHLGC1XBVwticOYLc793C4BvBguRvZcLnm0mC7BPXwu8a0+YLzk1/C9r9DgvsS58L+PsuDApJvwwW+U4MKEffDDT3bgxGRf8MUvWODGTXxwxw864MgtXnDI+Fdg+yg1AcMrYOWDLiPBw0iP0cNJg++DTdeTw1EDd4NVVxvDWIL/g1zWo8NgAoeDZFYrw2eCD4Nr+p3Db+wGXg3N6JcN2pgmDevmtw34lkYOCeTXDhaUZg4n4vcONJKGDkXhFw5Vcu4OZHLfDnNxDg6CcP8OkW+8uDqBvHw6vbU4Ovm0/Ds1rbg7ca18O6/02Dvr9Jw8J+1YPGPtHDyf5dg82+WcPRfeWD1T3hw9j9b+YPcvWnD4KHfg+Q88cPoIWeD6+Fjw++g74PzYOvD9yB3g/rgc8P+n/+AAl/7wAYfh4AJ34PADcP5g+BGD9cAVQ4GEGQN9yBzDCYgeNGXMJEKRjCa2U9ArwhmQL4IV1DNmi5Q3AZ3YOuYTmD6mD9xCZZucR+iWX4EnlI6BNpR/kUWSrpFUkp+RY5DOoXKQv6GCIpaxkI7fsaAgtsGvIKfBvh7Wwc0ex8HcHPbR6x+zn0fobFtIHYA/SGBk20iVeL+I2qv7iQ1xP4lSpHuJhWm/ycqc+8n/sOAKQpV8CnepYAq6jfxK76H+gSzTVHItnmmCLrM2cy9+S4MwkxhzMWdoBDJy+nQzR0oENFLcdTUnLAU2Mr51NwcOBjgb2vY45vAG+Ofu89jrG0gY72572PK/uhj27gPY+j9CGP5ti9kBvsoZBhH92Qk+UhkNkYXZEL3aHRURDd0XzqQdH+LV/3R9OLB0kNQfdJs20HSu0j90uciYdM1kB3TXxrh062IndPXE2HUJYEd1E8L4dSdeZ3UxwRh1RV+yHdU+/OHVjWqd1blEAdYHsb3WMTyB1n+qPdapNQHW96K91yEtgddvmz3XmSYB1+eTvdgTbSHYYdr+d2ItlodjZ013ZA14h2VHL3dl7VqHZycRd2fNPIdpBvN3aa0eh2rm1XdrljsHbM/x9212HQdur9P3+b1X/B3CPtfdxNeEHcm+X93MVwwd0T3n3dP7fh3Y4lnd23sGHeBh4d3i+o4d5+Fp3ep6Fh3vYPHd8+fmeHfbged35eSYd/mAB3AAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAB+AAEAAQABAgMBAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAB+AAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEA+AQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAB+AAEAAQABAAEAAQABAAEAAQABAAEAAf//x8ABAP//ubAABP//x8ABCP//x8ABDEVEVABFU1QARVdU+AEVQVAAEslgAAAAAAQWk7AEAAAACB4YfggAAAAMJZ1MDAAAABAtIhoQAAAAFDSsLhQAAAAYPDD8G+AAAABxDtcocAAAAIEs6mCAAAAAkVn8qJAAAACheA/goAAAALGWIxiwAAAAwdJeoMAAAADSHa5Q0A+AAAOJZ6djgAAAA8nf9EPAAAAECpQ9ZAAAAARLDIpEQAAABIuE1ySAAAAEzDnJBMAAAAUM7hIlAAA+ABU2jBAVAAAAFkO3G5YAAAAXAAAAAQAAAAE=+"""++TZICAL_EST5EDT = """+BEGIN:VTIMEZONE+TZID:US-Eastern+LAST-MODIFIED:19870101T000000Z+TZURL:http://zones.stds_r_us.net/tz/US-Eastern+BEGIN:STANDARD+DTSTART:19671029T020000+RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10+TZOFFSETFROM:-0400+TZOFFSETTO:-0500+TZNAME:EST+END:STANDARD+BEGIN:DAYLIGHT+DTSTART:19870405T020000+RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4+TZOFFSETFROM:-0500+TZOFFSETTO:-0400+TZNAME:EDT+END:DAYLIGHT+END:VTIMEZONE+"""++TZICAL_PST8PDT = """+BEGIN:VTIMEZONE+TZID:US-Pacific+LAST-MODIFIED:19870101T000000Z+BEGIN:STANDARD+DTSTART:19671029T020000+RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10+TZOFFSETFROM:-0700+TZOFFSETTO:-0800+TZNAME:PST+END:STANDARD+BEGIN:DAYLIGHT+DTSTART:19870405T020000+RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4+TZOFFSETFROM:-0800+TZOFFSETTO:-0700+TZNAME:PDT+END:DAYLIGHT+END:VTIMEZONE+"""++EST_TUPLE = ('EST', timedelta(hours=-5), timedelta(hours=0))+EDT_TUPLE = ('EDT', timedelta(hours=-4), timedelta(hours=1))++SUPPORTS_SUB_MINUTE_OFFSETS = sys.version_info >= (3, 6)+++###+# Helper functions+def get_timezone_tuple(dt):+    """Retrieve a (tzname, utcoffset, dst) tuple for a given DST"""+    return dt.tzname(), dt.utcoffset(), dt.dst()+++###+# Mix-ins+class context_passthrough(object):+    def __init__(*args, **kwargs):+        pass++    def __enter__(*args, **kwargs):+        pass++    def __exit__(*args, **kwargs):+        pass+++class TzFoldMixin(object):+    """ Mix-in class for testing ambiguous times """+    def gettz(self, tzname):+        raise NotImplementedError++    def _get_tzname(self, tzname):+        return tzname++    def _gettz_context(self, tzname):+        return context_passthrough()++    def testFoldPositiveUTCOffset(self):+        # Test that we can resolve ambiguous times+        tzname = self._get_tzname('Australia/Sydney')++        with self._gettz_context(tzname):+            SYD = self.gettz(tzname)++            t0_u = datetime(2012, 3, 31, 15, 30, tzinfo=tz.UTC)  # AEST+            t1_u = datetime(2012, 3, 31, 16, 30, tzinfo=tz.UTC)  # AEDT++            t0_syd0 = t0_u.astimezone(SYD)+            t1_syd1 = t1_u.astimezone(SYD)++            self.assertEqual(t0_syd0.replace(tzinfo=None),+                             datetime(2012, 4, 1, 2, 30))++            self.assertEqual(t1_syd1.replace(tzinfo=None),+                             datetime(2012, 4, 1, 2, 30))++            self.assertEqual(t0_syd0.utcoffset(), timedelta(hours=11))+            self.assertEqual(t1_syd1.utcoffset(), timedelta(hours=10))++    def testGapPositiveUTCOffset(self):+        # Test that we don't have a problem around gaps.+        tzname = self._get_tzname('Australia/Sydney')++        with self._gettz_context(tzname):+            SYD = self.gettz(tzname)++            t0_u = datetime(2012, 10, 6, 15, 30, tzinfo=tz.UTC)  # AEST+            t1_u = datetime(2012, 10, 6, 16, 30, tzinfo=tz.UTC)  # AEDT++            t0 = t0_u.astimezone(SYD)+            t1 = t1_u.astimezone(SYD)++            self.assertEqual(t0.replace(tzinfo=None),+                             datetime(2012, 10, 7, 1, 30))++            self.assertEqual(t1.replace(tzinfo=None),+                             datetime(2012, 10, 7, 3, 30))++            self.assertEqual(t0.utcoffset(), timedelta(hours=10))+            self.assertEqual(t1.utcoffset(), timedelta(hours=11))++    def testFoldNegativeUTCOffset(self):+            # Test that we can resolve ambiguous times+            tzname = self._get_tzname('America/Toronto')++            with self._gettz_context(tzname):+                TOR = self.gettz(tzname)++                t0_u = datetime(2011, 11, 6, 5, 30, tzinfo=tz.UTC)+                t1_u = datetime(2011, 11, 6, 6, 30, tzinfo=tz.UTC)++                t0_tor = t0_u.astimezone(TOR)
… 2564 more lines (truncated)
ci_tools/run_tz_master_env.sh +2 lines
--- +++ @@ -13,3 +13,3 @@ -REPO_TARBALL=${REPO_DIR}/dateutil/zoneinfo/dateutil-zoneinfo.tar.gz+REPO_TARBALL=${REPO_DIR}/src/dateutil/zoneinfo/dateutil-zoneinfo.tar.gz TMP_TARBALL=${TMP_DIR}/dateutil-zoneinfo.tar.gz@@ -95,3 +95,3 @@ # Run the tests-python -m pytest ${REPO_DIR}/dateutil/test $EXTRA_TEST_ARGS+python -m pytest ${REPO_DIR}/tests $EXTRA_TEST_ARGS 
pyproject.toml +18 lines
--- +++ @@ -48 +48,19 @@ +[tool.black]+line-length = 80++[tool.isort]+atomic=true+force_grid_wrap=0+include_trailing_comma=true+known_first_party = ["dateutil"]+known_third_party=[+    "pytest",+    "hypothesis",+    "six",+    "freezegun",+    "mock",+]+multi_line_output=3+use_parentheses=true+
setup.cfg +6 lines
--- +++ @@ -33,2 +33,5 @@ 	Programming Language :: Python :: 3.9+	Programming Language :: Python :: 3.10+	Programming Language :: Python :: 3.11+	Programming Language :: Python :: 3.12 	Topic :: Software Development :: Libraries@@ -39,9 +42,9 @@ install_requires = six >= 1.5+package_dir = +	=src python_requires = >=2.7, !=3.0.*, !=3.1.*, !=3.2.* packages = find:-test_suite = dateutil.test  [options.packages.find]-exclude = -	dateutil.test+where = src 
setup.py +1 lines
--- +++ @@ -50,3 +50,3 @@       use_scm_version={-          'write_to': 'dateutil/_version.py',+          'write_to': 'src/dateutil/_version.py',       },
src/dateutil/__init__.py +24 lines
--- +++ @@ -0,0 +1,24 @@+# -*- coding: utf-8 -*-+import sys++try:+    from ._version import version as __version__+except ImportError:+    __version__ = 'unknown'++__all__ = ['easter', 'parser', 'relativedelta', 'rrule', 'tz',+           'utils', 'zoneinfo']++def __getattr__(name):+    import importlib++    if name in __all__:+        return importlib.import_module("." + name, __name__)+    raise AttributeError(+        "module {!r} has not attribute {!r}".format(__name__, name)+    )+++def __dir__():+    # __dir__ should include all the lazy-importable modules as well.+    return [x for x in globals() if x not in sys.modules] + __all__
src/dateutil/_common.py +43 lines
--- +++ @@ -0,0 +1,43 @@+"""+Common code used in multiple modules.+"""+++class weekday(object):+    __slots__ = ["weekday", "n"]++    def __init__(self, weekday, n=None):+        self.weekday = weekday+        self.n = n++    def __call__(self, n):+        if n == self.n:+            return self+        else:+            return self.__class__(self.weekday, n)++    def __eq__(self, other):+        try:+            if self.weekday != other.weekday or self.n != other.n:+                return False+        except AttributeError:+            return False+        return True++    def __hash__(self):+        return hash((+          self.weekday,+          self.n,+        ))++    def __ne__(self, other):+        return not (self == other)++    def __repr__(self):+        s = ("MO", "TU", "WE", "TH", "FR", "SA", "SU")[self.weekday]+        if not self.n:+            return s+        else:+            return "%s(%+d)" % (s, self.n)++# vim:ts=4:sw=4:et
src/dateutil/_version.py +16 lines
--- +++ @@ -0,0 +1,16 @@+# file generated by setuptools_scm+# don't change, don't track in version control+TYPE_CHECKING = False+if TYPE_CHECKING:+    from typing import Tuple, Union+    VERSION_TUPLE = Tuple[Union[int, str], ...]+else:+    VERSION_TUPLE = object++version: str+__version__: str+__version_tuple__: VERSION_TUPLE+version_tuple: VERSION_TUPLE++__version__ = version = '2.9.0'+__version_tuple__ = version_tuple = (2, 9, 0)
src/dateutil/easter.py +89 lines
--- +++ @@ -0,0 +1,89 @@+# -*- coding: utf-8 -*-+"""+This module offers a generic Easter computing method for any given year, using+Western, Orthodox or Julian algorithms.+"""++import datetime++__all__ = ["easter", "EASTER_JULIAN", "EASTER_ORTHODOX", "EASTER_WESTERN"]++EASTER_JULIAN = 1+EASTER_ORTHODOX = 2+EASTER_WESTERN = 3+++def easter(year, method=EASTER_WESTERN):+    """+    This method was ported from the work done by GM Arts,+    on top of the algorithm by Claus Tondering, which was+    based in part on the algorithm of Ouding (1940), as+    quoted in "Explanatory Supplement to the Astronomical+    Almanac", P.  Kenneth Seidelmann, editor.++    This algorithm implements three different Easter+    calculation methods:++    1. Original calculation in Julian calendar, valid in+       dates after 326 AD+    2. Original method, with date converted to Gregorian+       calendar, valid in years 1583 to 4099+    3. Revised method, in Gregorian calendar, valid in+       years 1583 to 4099 as well++    These methods are represented by the constants:++    * ``EASTER_JULIAN   = 1``+    * ``EASTER_ORTHODOX = 2``+    * ``EASTER_WESTERN  = 3``++    The default method is method 3.++    More about the algorithm may be found at:++    `GM Arts: Easter Algorithms <http://www.gmarts.org/index.php?go=415>`_++    and++    `The Calendar FAQ: Easter <https://www.tondering.dk/claus/cal/easter.php>`_++    """++    if not (1 <= method <= 3):+        raise ValueError("invalid method")++    # g - Golden year - 1+    # c - Century+    # h - (23 - Epact) mod 30+    # i - Number of days from March 21 to Paschal Full Moon+    # j - Weekday for PFM (0=Sunday, etc)+    # p - Number of days from March 21 to Sunday on or before PFM+    #     (-6 to 28 methods 1 & 3, to 56 for method 2)+    # e - Extra days to add for method 2 (converting Julian+    #     date to Gregorian date)++    y = year+    g = y % 19+    e = 0+    if method < 3:+        # Old method+        i = (19*g + 15) % 30+        j = (y + y//4 + i) % 7+        if method == 2:+            # Extra dates to convert Julian to Gregorian date+            e = 10+            if y > 1600:+                e = e + y//100 - 16 - (y//100 - 16)//4+    else:+        # New method+        c = y//100+        h = (c - c//4 - (8*c + 13)//25 + 19*g + 15) % 30+        i = h - (h//28)*(1 - (h//28)*(29//(h + 1))*((21 - g)//11))+        j = (y + y//4 + i + 2 - c + c//4) % 7++    # p can be from -6 to 56 corresponding to dates 22 March to 23 May+    # (later dates apply to method 2, although 23 May never actually occurs)+    p = i - j + e+    d = 1 + (p + 27 + (p + 6)//40) % 31+    m = 3 + (p + 26)//30+    return datetime.date(int(y), int(m), int(d))
src/dateutil/parser/__init__.py +61 lines
--- +++ @@ -0,0 +1,61 @@+# -*- coding: utf-8 -*-+from ._parser import parse, parser, parserinfo, ParserError+from ._parser import DEFAULTPARSER, DEFAULTTZPARSER+from ._parser import UnknownTimezoneWarning++from ._parser import __doc__++from .isoparser import isoparser, isoparse++__all__ = ['parse', 'parser', 'parserinfo',+           'isoparse', 'isoparser',+           'ParserError',+           'UnknownTimezoneWarning']+++###+# Deprecate portions of the private interface so that downstream code that+# is improperly relying on it is given *some* notice.+++def __deprecated_private_func(f):+    from functools import wraps+    import warnings++    msg = ('{name} is a private function and may break without warning, '+           'it will be moved and or renamed in future versions.')+    msg = msg.format(name=f.__name__)++    @wraps(f)+    def deprecated_func(*args, **kwargs):+        warnings.warn(msg, DeprecationWarning)+        return f(*args, **kwargs)++    return deprecated_func++def __deprecate_private_class(c):+    import warnings++    msg = ('{name} is a private class and may break without warning, '+           'it will be moved and or renamed in future versions.')+    msg = msg.format(name=c.__name__)++    class private_class(c):+        __doc__ = c.__doc__++        def __init__(self, *args, **kwargs):+            warnings.warn(msg, DeprecationWarning)+            super(private_class, self).__init__(*args, **kwargs)++    private_class.__name__ = c.__name__++    return private_class+++from ._parser import _timelex, _resultbase+from ._parser import _tzparser, _parsetz++_timelex = __deprecate_private_class(_timelex)+_tzparser = __deprecate_private_class(_tzparser)+_resultbase = __deprecate_private_class(_resultbase)+_parsetz = __deprecated_private_func(_parsetz)
src/dateutil/parser/_parser.py +1613 lines
--- +++ @@ -0,0 +1,1613 @@+# -*- coding: utf-8 -*-+"""+This module offers a generic date/time string parser which is able to parse+most known formats to represent a date and/or time.++This module attempts to be forgiving with regards to unlikely input formats,+returning a datetime object even for dates which are ambiguous. If an element+of a date/time stamp is omitted, the following rules are applied:++- If AM or PM is left unspecified, a 24-hour clock is assumed, however, an hour+  on a 12-hour clock (``0 <= hour <= 12``) *must* be specified if AM or PM is+  specified.+- If a time zone is omitted, a timezone-naive datetime is returned.++If any other elements are missing, they are taken from the+:class:`datetime.datetime` object passed to the parameter ``default``. If this+results in a day number exceeding the valid number of days per month, the+value falls back to the end of the month.++Additional resources about date/time string formats can be found below:++- `A summary of the international standard date and time notation+  <https://www.cl.cam.ac.uk/~mgk25/iso-time.html>`_+- `W3C Date and Time Formats <https://www.w3.org/TR/NOTE-datetime>`_+- `Time Formats (Planetary Rings Node) <https://pds-rings.seti.org:443/tools/time_formats.html>`_+- `CPAN ParseDate module+  <https://metacpan.org/pod/release/MUIR/Time-modules-2013.0912/lib/Time/ParseDate.pm>`_+- `Java SimpleDateFormat Class+  <https://docs.oracle.com/javase/6/docs/api/java/text/SimpleDateFormat.html>`_+"""+from __future__ import unicode_literals++import datetime+import re+import string+import time+import warnings++from calendar import monthrange+from io import StringIO++import six+from six import integer_types, text_type++from decimal import Decimal++from warnings import warn++from .. import relativedelta+from .. import tz++__all__ = ["parse", "parserinfo", "ParserError"]+++# TODO: pandas.core.tools.datetimes imports this explicitly.  Might be worth+# making public and/or figuring out if there is something we can+# take off their plate.+class _timelex(object):+    # Fractional seconds are sometimes split by a comma+    _split_decimal = re.compile("([.,])")++    def __init__(self, instream):+        if isinstance(instream, (bytes, bytearray)):+            instream = instream.decode()++        if isinstance(instream, text_type):+            instream = StringIO(instream)+        elif getattr(instream, 'read', None) is None:+            raise TypeError('Parser must be a string or character stream, not '+                            '{itype}'.format(itype=instream.__class__.__name__))++        self.instream = instream+        self.charstack = []+        self.tokenstack = []+        self.eof = False++    def get_token(self):+        """+        This function breaks the time string into lexical units (tokens), which+        can be parsed by the parser. Lexical units are demarcated by changes in+        the character set, so any continuous string of letters is considered+        one unit, any continuous string of numbers is considered one unit.++        The main complication arises from the fact that dots ('.') can be used+        both as separators (e.g. "Sep.20.2009") or decimal points (e.g.+        "4:30:21.447"). As such, it is necessary to read the full context of+        any dot-separated strings before breaking it into tokens; as such, this+        function maintains a "token stack", for when the ambiguous context+        demands that multiple tokens be parsed at once.+        """+        if self.tokenstack:+            return self.tokenstack.pop(0)++        seenletters = False+        token = None+        state = None++        while not self.eof:+            # We only realize that we've reached the end of a token when we+            # find a character that's not part of the current token - since+            # that character may be part of the next token, it's stored in the+            # charstack.+            if self.charstack:+                nextchar = self.charstack.pop(0)+            else:+                nextchar = self.instream.read(1)+                while nextchar == '\x00':+                    nextchar = self.instream.read(1)++            if not nextchar:+                self.eof = True+                break+            elif not state:+                # First character of the token - determines if we're starting+                # to parse a word, a number or something else.+                token = nextchar+                if self.isword(nextchar):+                    state = 'a'+                elif self.isnum(nextchar):+                    state = '0'+                elif self.isspace(nextchar):+                    token = ' '+                    break  # emit token+                else:+                    break  # emit token+            elif state == 'a':+                # If we've already started reading a word, we keep reading+                # letters until we find something that's not part of a word.+                seenletters = True+                if self.isword(nextchar):+                    token += nextchar+                elif nextchar == '.':+                    token += nextchar+                    state = 'a.'+                else:+                    self.charstack.append(nextchar)+                    break  # emit token+            elif state == '0':+                # If we've already started reading a number, we keep reading+                # numbers until we find something that doesn't fit.+                if self.isnum(nextchar):+                    token += nextchar+                elif nextchar == '.' or (nextchar == ',' and len(token) >= 2):+                    token += nextchar+                    state = '0.'+                else:+                    self.charstack.append(nextchar)+                    break  # emit token+            elif state == 'a.':+                # If we've seen some letters and a dot separator, continue+                # parsing, and the tokens will be broken up later.+                seenletters = True+                if nextchar == '.' or self.isword(nextchar):+                    token += nextchar+                elif self.isnum(nextchar) and token[-1] == '.':+                    token += nextchar+                    state = '0.'+                else:+                    self.charstack.append(nextchar)+                    break  # emit token+            elif state == '0.':+                # If we've seen at least one dot separator, keep going, we'll+                # break up the tokens later.+                if nextchar == '.' or self.isnum(nextchar):+                    token += nextchar+                elif self.isword(nextchar) and token[-1] == '.':+                    token += nextchar+                    state = 'a.'+                else:+                    self.charstack.append(nextchar)+                    break  # emit token++        if (state in ('a.', '0.') and (seenletters or token.count('.') > 1 or+                                       token[-1] in '.,')):+            l = self._split_decimal.split(token)+            token = l[0]+            for tok in l[1:]:+                if tok:+                    self.tokenstack.append(tok)++        if state == '0.' and token.count('.') == 0:+            token = token.replace(',', '.')++        return token++    def __iter__(self):+        return self++    def __next__(self):+        token = self.get_token()+        if token is None:+            raise StopIteration++        return token++    def next(self):+        return self.__next__()  # Python 2.x support++    @classmethod+    def split(cls, s):+        return list(cls(s))++    @classmethod+    def isword(cls, nextchar):+        """ Whether or not the next character is part of a word """+        return nextchar.isalpha()++    @classmethod+    def isnum(cls, nextchar):+        """ Whether the next character is part of a number """+        return nextchar.isdigit()++    @classmethod+    def isspace(cls, nextchar):+        """ Whether the next character is whitespace """+        return nextchar.isspace()+++class _resultbase(object):++    def __init__(self):+        for attr in self.__slots__:+            setattr(self, attr, None)++    def _repr(self, classname):+        l = []+        for attr in self.__slots__:+            value = getattr(self, attr)+            if value is not None:+                l.append("%s=%s" % (attr, repr(value)))+        return "%s(%s)" % (classname, ", ".join(l))++    def __len__(self):+        return (sum(getattr(self, attr) is not None+                    for attr in self.__slots__))++    def __repr__(self):+        return self._repr(self.__class__.__name__)+++class parserinfo(object):+    """+    Class which handles what inputs are accepted. Subclass this to customize+    the language and acceptable values for each parameter.++    :param dayfirst:+        Whether to interpret the first value in an ambiguous 3-integer date
… 1366 more lines (truncated)
src/dateutil/parser/isoparser.py +416 lines
--- +++ @@ -0,0 +1,416 @@+# -*- coding: utf-8 -*-+"""+This module offers a parser for ISO-8601 strings++It is intended to support all valid date, time and datetime formats per the+ISO-8601 specification.++..versionadded:: 2.7.0+"""+from datetime import datetime, timedelta, time, date+import calendar+from dateutil import tz++from functools import wraps++import re+import six++__all__ = ["isoparse", "isoparser"]+++def _takes_ascii(f):+    @wraps(f)+    def func(self, str_in, *args, **kwargs):+        # If it's a stream, read the whole thing+        str_in = getattr(str_in, 'read', lambda: str_in)()++        # If it's unicode, turn it into bytes, since ISO-8601 only covers ASCII+        if isinstance(str_in, six.text_type):+            # ASCII is the same in UTF-8+            try:+                str_in = str_in.encode('ascii')+            except UnicodeEncodeError as e:+                msg = 'ISO-8601 strings should contain only ASCII characters'+                six.raise_from(ValueError(msg), e)++        return f(self, str_in, *args, **kwargs)++    return func+++class isoparser(object):+    def __init__(self, sep=None):+        """+        :param sep:+            A single character that separates date and time portions. If+            ``None``, the parser will accept any single character.+            For strict ISO-8601 adherence, pass ``'T'``.+        """+        if sep is not None:+            if (len(sep) != 1 or ord(sep) >= 128 or sep in '0123456789'):+                raise ValueError('Separator must be a single, non-numeric ' ++                                 'ASCII character')++            sep = sep.encode('ascii')++        self._sep = sep++    @_takes_ascii+    def isoparse(self, dt_str):+        """+        Parse an ISO-8601 datetime string into a :class:`datetime.datetime`.++        An ISO-8601 datetime string consists of a date portion, followed+        optionally by a time portion - the date and time portions are separated+        by a single character separator, which is ``T`` in the official+        standard. Incomplete date formats (such as ``YYYY-MM``) may *not* be+        combined with a time portion.++        Supported date formats are:++        Common:++        - ``YYYY``+        - ``YYYY-MM``+        - ``YYYY-MM-DD`` or ``YYYYMMDD``++        Uncommon:++        - ``YYYY-Www`` or ``YYYYWww`` - ISO week (day defaults to 0)+        - ``YYYY-Www-D`` or ``YYYYWwwD`` - ISO week and day++        The ISO week and day numbering follows the same logic as+        :func:`datetime.date.isocalendar`.++        Supported time formats are:++        - ``hh``+        - ``hh:mm`` or ``hhmm``+        - ``hh:mm:ss`` or ``hhmmss``+        - ``hh:mm:ss.ssssss`` (Up to 6 sub-second digits)++        Midnight is a special case for `hh`, as the standard supports both+        00:00 and 24:00 as a representation. The decimal separator can be+        either a dot or a comma.+++        .. caution::++            Support for fractional components other than seconds is part of the+            ISO-8601 standard, but is not currently implemented in this parser.++        Supported time zone offset formats are:++        - `Z` (UTC)+        - `±HH:MM`+        - `±HHMM`+        - `±HH`++        Offsets will be represented as :class:`dateutil.tz.tzoffset` objects,+        with the exception of UTC, which will be represented as+        :class:`dateutil.tz.tzutc`. Time zone offsets equivalent to UTC (such+        as `+00:00`) will also be represented as :class:`dateutil.tz.tzutc`.++        :param dt_str:+            A string or stream containing only an ISO-8601 datetime string++        :return:+            Returns a :class:`datetime.datetime` representing the string.+            Unspecified components default to their lowest value.++        .. warning::++            As of version 2.7.0, the strictness of the parser should not be+            considered a stable part of the contract. Any valid ISO-8601 string+            that parses correctly with the default settings will continue to+            parse correctly in future versions, but invalid strings that+            currently fail (e.g. ``2017-01-01T00:00+00:00:00``) are not+            guaranteed to continue failing in future versions if they encode+            a valid date.++        .. versionadded:: 2.7.0+        """+        components, pos = self._parse_isodate(dt_str)++        if len(dt_str) > pos:+            if self._sep is None or dt_str[pos:pos + 1] == self._sep:+                components += self._parse_isotime(dt_str[pos + 1:])+            else:+                raise ValueError('String contains unknown ISO components')++        if len(components) > 3 and components[3] == 24:+            components[3] = 0+            return datetime(*components) + timedelta(days=1)++        return datetime(*components)++    @_takes_ascii+    def parse_isodate(self, datestr):+        """+        Parse the date portion of an ISO string.++        :param datestr:+            The string portion of an ISO string, without a separator++        :return:+            Returns a :class:`datetime.date` object+        """+        components, pos = self._parse_isodate(datestr)+        if pos < len(datestr):+            raise ValueError('String contains unknown ISO ' ++                             'components: {!r}'.format(datestr.decode('ascii')))+        return date(*components)++    @_takes_ascii+    def parse_isotime(self, timestr):+        """+        Parse the time portion of an ISO string.++        :param timestr:+            The time portion of an ISO string, without a separator++        :return:+            Returns a :class:`datetime.time` object+        """+        components = self._parse_isotime(timestr)+        if components[0] == 24:+            components[0] = 0+        return time(*components)++    @_takes_ascii+    def parse_tzstr(self, tzstr, zero_as_utc=True):+        """+        Parse a valid ISO time zone string.++        See :func:`isoparser.isoparse` for details on supported formats.++        :param tzstr:+            A string representing an ISO time zone offset++        :param zero_as_utc:+            Whether to return :class:`dateutil.tz.tzutc` for zero-offset zones++        :return:+            Returns :class:`dateutil.tz.tzoffset` for offsets and+            :class:`dateutil.tz.tzutc` for ``Z`` and (if ``zero_as_utc`` is+            specified) offsets equivalent to UTC.+        """+        return self._parse_tzstr(tzstr, zero_as_utc=zero_as_utc)++    # Constants+    _DATE_SEP = b'-'+    _TIME_SEP = b':'+    _FRACTION_REGEX = re.compile(b'[\\.,]([0-9]+)')++    def _parse_isodate(self, dt_str):+        try:+            return self._parse_isodate_common(dt_str)+        except ValueError:+            return self._parse_isodate_uncommon(dt_str)++    def _parse_isodate_common(self, dt_str):+        len_str = len(dt_str)+        components = [1, 1, 1]++        if len_str < 4:+            raise ValueError('ISO string too short')++        # Year+        components[0] = int(dt_str[0:4])+        pos = 4+        if pos >= len_str:+            return components, pos++        has_sep = dt_str[pos:pos + 1] == self._DATE_SEP+        if has_sep:+            pos += 1++        # Month+        if len_str - pos < 2:+            raise ValueError('Invalid common month')++        components[1] = int(dt_str[pos:pos + 2])+        pos += 2++        if pos >= len_str:+            if has_sep:+                return components, pos+            else:+                raise ValueError('Invalid ISO format')++        if has_sep:+            if dt_str[pos:pos + 1] != self._DATE_SEP:+                raise ValueError('Invalid separator in ISO string')+            pos += 1++        # Day
… 169 more lines (truncated)
src/dateutil/relativedelta.py +599 lines
--- +++ @@ -0,0 +1,599 @@+# -*- coding: utf-8 -*-+import datetime+import calendar++import operator+from math import copysign++from six import integer_types+from warnings import warn++from ._common import weekday++MO, TU, WE, TH, FR, SA, SU = weekdays = tuple(weekday(x) for x in range(7))++__all__ = ["relativedelta", "MO", "TU", "WE", "TH", "FR", "SA", "SU"]+++class relativedelta(object):+    """+    The relativedelta type is designed to be applied to an existing datetime and+    can replace specific components of that datetime, or represents an interval+    of time.++    It is based on the specification of the excellent work done by M.-A. Lemburg+    in his+    `mx.DateTime <https://www.egenix.com/products/python/mxBase/mxDateTime/>`_ extension.+    However, notice that this type does *NOT* implement the same algorithm as+    his work. Do *NOT* expect it to behave like mx.DateTime's counterpart.++    There are two different ways to build a relativedelta instance. The+    first one is passing it two date/datetime classes::++        relativedelta(datetime1, datetime2)++    The second one is passing it any number of the following keyword arguments::++        relativedelta(arg1=x,arg2=y,arg3=z...)++        year, month, day, hour, minute, second, microsecond:+            Absolute information (argument is singular); adding or subtracting a+            relativedelta with absolute information does not perform an arithmetic+            operation, but rather REPLACES the corresponding value in the+            original datetime with the value(s) in relativedelta.++        years, months, weeks, days, hours, minutes, seconds, microseconds:+            Relative information, may be negative (argument is plural); adding+            or subtracting a relativedelta with relative information performs+            the corresponding arithmetic operation on the original datetime value+            with the information in the relativedelta.++        weekday:+            One of the weekday instances (MO, TU, etc) available in the+            relativedelta module. These instances may receive a parameter N,+            specifying the Nth weekday, which could be positive or negative+            (like MO(+1) or MO(-2)). Not specifying it is the same as specifying+            +1. You can also use an integer, where 0=MO. This argument is always+            relative e.g. if the calculated date is already Monday, using MO(1)+            or MO(-1) won't change the day. To effectively make it absolute, use+            it in combination with the day argument (e.g. day=1, MO(1) for first+            Monday of the month).++        leapdays:+            Will add given days to the date found, if year is a leap+            year, and the date found is post 28 of february.++        yearday, nlyearday:+            Set the yearday or the non-leap year day (jump leap days).+            These are converted to day/month/leapdays information.++    There are relative and absolute forms of the keyword+    arguments. The plural is relative, and the singular is+    absolute. For each argument in the order below, the absolute form+    is applied first (by setting each attribute to that value) and+    then the relative form (by adding the value to the attribute).++    The order of attributes considered when this relativedelta is+    added to a datetime is:++    1. Year+    2. Month+    3. Day+    4. Hours+    5. Minutes+    6. Seconds+    7. Microseconds++    Finally, weekday is applied, using the rule described above.++    For example++    >>> from datetime import datetime+    >>> from dateutil.relativedelta import relativedelta, MO+    >>> dt = datetime(2018, 4, 9, 13, 37, 0)+    >>> delta = relativedelta(hours=25, day=1, weekday=MO(1))+    >>> dt + delta+    datetime.datetime(2018, 4, 2, 14, 37)++    First, the day is set to 1 (the first of the month), then 25 hours+    are added, to get to the 2nd day and 14th hour, finally the+    weekday is applied, but since the 2nd is already a Monday there is+    no effect.++    """++    def __init__(self, dt1=None, dt2=None,+                 years=0, months=0, days=0, leapdays=0, weeks=0,+                 hours=0, minutes=0, seconds=0, microseconds=0,+                 year=None, month=None, day=None, weekday=None,+                 yearday=None, nlyearday=None,+                 hour=None, minute=None, second=None, microsecond=None):++        if dt1 and dt2:+            # datetime is a subclass of date. So both must be date+            if not (isinstance(dt1, datetime.date) and+                    isinstance(dt2, datetime.date)):+                raise TypeError("relativedelta only diffs datetime/date")++            # We allow two dates, or two datetimes, so we coerce them to be+            # of the same type+            if (isinstance(dt1, datetime.datetime) !=+                    isinstance(dt2, datetime.datetime)):+                if not isinstance(dt1, datetime.datetime):+                    dt1 = datetime.datetime.fromordinal(dt1.toordinal())+                elif not isinstance(dt2, datetime.datetime):+                    dt2 = datetime.datetime.fromordinal(dt2.toordinal())++            self.years = 0+            self.months = 0+            self.days = 0+            self.leapdays = 0+            self.hours = 0+            self.minutes = 0+            self.seconds = 0+            self.microseconds = 0+            self.year = None+            self.month = None+            self.day = None+            self.weekday = None+            self.hour = None+            self.minute = None+            self.second = None+            self.microsecond = None+            self._has_time = 0++            # Get year / month delta between the two+            months = (dt1.year - dt2.year) * 12 + (dt1.month - dt2.month)+            self._set_months(months)++            # Remove the year/month delta so the timedelta is just well-defined+            # time units (seconds, days and microseconds)+            dtm = self.__radd__(dt2)++            # If we've overshot our target, make an adjustment+            if dt1 < dt2:+                compare = operator.gt+                increment = 1+            else:+                compare = operator.lt+                increment = -1++            while compare(dt1, dtm):+                months += increment+                self._set_months(months)+                dtm = self.__radd__(dt2)++            # Get the timedelta between the "months-adjusted" date and dt1+            delta = dt1 - dtm+            self.seconds = delta.seconds + delta.days * 86400+            self.microseconds = delta.microseconds+        else:+            # Check for non-integer values in integer-only quantities+            if any(x is not None and x != int(x) for x in (years, months)):+                raise ValueError("Non-integer years and months are "+                                 "ambiguous and not currently supported.")++            # Relative information+            self.years = int(years)+            self.months = int(months)+            self.days = days + weeks * 7+            self.leapdays = leapdays+            self.hours = hours+            self.minutes = minutes+            self.seconds = seconds+            self.microseconds = microseconds++            # Absolute information+            self.year = year+            self.month = month+            self.day = day+            self.hour = hour+            self.minute = minute+            self.second = second+            self.microsecond = microsecond++            if any(x is not None and int(x) != x+                   for x in (year, month, day, hour,+                             minute, second, microsecond)):+                # For now we'll deprecate floats - later it'll be an error.+                warn("Non-integer value passed as absolute information. " ++                     "This is not a well-defined condition and will raise " ++                     "errors in future versions.", DeprecationWarning)++            if isinstance(weekday, integer_types):+                self.weekday = weekdays[weekday]+            else:+                self.weekday = weekday++            yday = 0+            if nlyearday:+                yday = nlyearday+            elif yearday:+                yday = yearday+                if yearday > 59:+                    self.leapdays = -1+            if yday:+                ydayidx = [31, 59, 90, 120, 151, 181, 212,+                           243, 273, 304, 334, 366]+                for idx, ydays in enumerate(ydayidx):+                    if yday <= ydays:+                        self.month = idx+1+                        if idx == 0:+                            self.day = yday+                        else:+                            self.day = yday-ydayidx[idx-1]+                        break+                else:+                    raise ValueError("invalid year day (%d)" % yday)++        self._fix()++    def _fix(self):+        if abs(self.microseconds) > 999999:+            s = _sign(self.microseconds)+            div, mod = divmod(self.microseconds * s, 1000000)+            self.microseconds = mod * s+            self.seconds += div * s+        if abs(self.seconds) > 59:+            s = _sign(self.seconds)+            div, mod = divmod(self.seconds * s, 60)+            self.seconds = mod * s+            self.minutes += div * s+        if abs(self.minutes) > 59:+            s = _sign(self.minutes)+            div, mod = divmod(self.minutes * s, 60)+            self.minutes = mod * s+            self.hours += div * s+        if abs(self.hours) > 23:
… 352 more lines (truncated)
src/dateutil/rrule.py +1737 lines
--- +++ @@ -0,0 +1,1737 @@+# -*- coding: utf-8 -*-+"""+The rrule module offers a small, complete, and very fast, implementation of+the recurrence rules documented in the+`iCalendar RFC <https://tools.ietf.org/html/rfc5545>`_,+including support for caching of results.+"""+import calendar+import datetime+import heapq+import itertools+import re+import sys+from functools import wraps+# For warning about deprecation of until and count+from warnings import warn++from six import advance_iterator, integer_types++from six.moves import _thread, range++from ._common import weekday as weekdaybase++try:+    from math import gcd+except ImportError:+    from fractions import gcd++__all__ = ["rrule", "rruleset", "rrulestr",+           "YEARLY", "MONTHLY", "WEEKLY", "DAILY",+           "HOURLY", "MINUTELY", "SECONDLY",+           "MO", "TU", "WE", "TH", "FR", "SA", "SU"]++# Every mask is 7 days longer to handle cross-year weekly periods.+M366MASK = tuple([1]*31+[2]*29+[3]*31+[4]*30+[5]*31+[6]*30 ++                 [7]*31+[8]*31+[9]*30+[10]*31+[11]*30+[12]*31+[1]*7)+M365MASK = list(M366MASK)+M29, M30, M31 = list(range(1, 30)), list(range(1, 31)), list(range(1, 32))+MDAY366MASK = tuple(M31+M29+M31+M30+M31+M30+M31+M31+M30+M31+M30+M31+M31[:7])+MDAY365MASK = list(MDAY366MASK)+M29, M30, M31 = list(range(-29, 0)), list(range(-30, 0)), list(range(-31, 0))+NMDAY366MASK = tuple(M31+M29+M31+M30+M31+M30+M31+M31+M30+M31+M30+M31+M31[:7])+NMDAY365MASK = list(NMDAY366MASK)+M366RANGE = (0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366)+M365RANGE = (0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365)+WDAYMASK = [0, 1, 2, 3, 4, 5, 6]*55+del M29, M30, M31, M365MASK[59], MDAY365MASK[59], NMDAY365MASK[31]+MDAY365MASK = tuple(MDAY365MASK)+M365MASK = tuple(M365MASK)++FREQNAMES = ['YEARLY', 'MONTHLY', 'WEEKLY', 'DAILY', 'HOURLY', 'MINUTELY', 'SECONDLY']++(YEARLY,+ MONTHLY,+ WEEKLY,+ DAILY,+ HOURLY,+ MINUTELY,+ SECONDLY) = list(range(7))++# Imported on demand.+easter = None+parser = None+++class weekday(weekdaybase):+    """+    This version of weekday does not allow n = 0.+    """+    def __init__(self, wkday, n=None):+        if n == 0:+            raise ValueError("Can't create weekday with n==0")++        super(weekday, self).__init__(wkday, n)+++MO, TU, WE, TH, FR, SA, SU = weekdays = tuple(weekday(x) for x in range(7))+++def _invalidates_cache(f):+    """+    Decorator for rruleset methods which may invalidate the+    cached length.+    """+    @wraps(f)+    def inner_func(self, *args, **kwargs):+        rv = f(self, *args, **kwargs)+        self._invalidate_cache()+        return rv++    return inner_func+++class rrulebase(object):+    def __init__(self, cache=False):+        if cache:+            self._cache = []+            self._cache_lock = _thread.allocate_lock()+            self._invalidate_cache()+        else:+            self._cache = None+            self._cache_complete = False+            self._len = None++    def __iter__(self):+        if self._cache_complete:+            return iter(self._cache)+        elif self._cache is None:+            return self._iter()+        else:+            return self._iter_cached()++    def _invalidate_cache(self):+        if self._cache is not None:+            self._cache = []+            self._cache_complete = False+            self._cache_gen = self._iter()++            if self._cache_lock.locked():+                self._cache_lock.release()++        self._len = None++    def _iter_cached(self):+        i = 0+        gen = self._cache_gen+        cache = self._cache+        acquire = self._cache_lock.acquire+        release = self._cache_lock.release+        while gen:+            if i == len(cache):+                acquire()+                if self._cache_complete:+                    break+                try:+                    for j in range(10):+                        cache.append(advance_iterator(gen))+                except StopIteration:+                    self._cache_gen = gen = None+                    self._cache_complete = True+                    break+                release()+            yield cache[i]+            i += 1+        while i < self._len:+            yield cache[i]+            i += 1++    def __getitem__(self, item):+        if self._cache_complete:+            return self._cache[item]+        elif isinstance(item, slice):+            if item.step and item.step < 0:+                return list(iter(self))[item]+            else:+                return list(itertools.islice(self,+                                             item.start or 0,+                                             item.stop or sys.maxsize,+                                             item.step or 1))+        elif item >= 0:+            gen = iter(self)+            try:+                for i in range(item+1):+                    res = advance_iterator(gen)+            except StopIteration:+                raise IndexError+            return res+        else:+            return list(iter(self))[item]++    def __contains__(self, item):+        if self._cache_complete:+            return item in self._cache+        else:+            for i in self:+                if i == item:+                    return True+                elif i > item:+                    return False+        return False++    # __len__() introduces a large performance penalty.+    def count(self):+        """ Returns the number of recurrences in this set. It will have go+            through the whole recurrence, if this hasn't been done before. """+        if self._len is None:+            for x in self:+                pass+        return self._len++    def before(self, dt, inc=False):+        """ Returns the last recurrence before the given datetime instance. The+            inc keyword defines what happens if dt is an occurrence. With+            inc=True, if dt itself is an occurrence, it will be returned. """+        if self._cache_complete:+            gen = self._cache+        else:+            gen = self+        last = None+        if inc:+            for i in gen:+                if i > dt:+                    break+                last = i+        else:+            for i in gen:+                if i >= dt:+                    break+                last = i+        return last++    def after(self, dt, inc=False):+        """ Returns the first recurrence after the given datetime instance. The+            inc keyword defines what happens if dt is an occurrence. With+            inc=True, if dt itself is an occurrence, it will be returned.  """+        if self._cache_complete:+            gen = self._cache+        else:+            gen = self+        if inc:+            for i in gen:+                if i >= dt:+                    return i+        else:+            for i in gen:+                if i > dt:+                    return i+        return None++    def xafter(self, dt, count=None, inc=False):+        """+        Generator which yields up to `count` recurrences after the given+        datetime instance, equivalent to `after`.++        :param dt:+            The datetime at which to start generating recurrences.++        :param count:+            The maximum number of recurrences to generate. If `None` (default),+            dates are generated until the recurrence rule is exhausted.++        :param inc:+            If `dt` is an instance of the rule and `inc` is `True`, it is+            included in the output.++        :yields: Yields a sequence of `datetime` objects.+        """
… 1490 more lines (truncated)
src/dateutil/tz/__init__.py +12 lines
--- +++ @@ -0,0 +1,12 @@+# -*- coding: utf-8 -*-+from .tz import *+from .tz import __doc__++__all__ = ["tzutc", "tzoffset", "tzlocal", "tzfile", "tzrange",+           "tzstr", "tzical", "tzwin", "tzwinlocal", "gettz",+           "enfold", "datetime_ambiguous", "datetime_exists",+           "resolve_imaginary", "UTC", "DeprecatedTzFormatWarning"]+++class DeprecatedTzFormatWarning(Warning):+    """Warning raised when time zones are parsed from deprecated formats."""
src/dateutil/tz/_common.py +419 lines
--- +++ @@ -0,0 +1,419 @@+from six import PY2++from functools import wraps++from datetime import datetime, timedelta, tzinfo+++ZERO = timedelta(0)++__all__ = ['tzname_in_python2', 'enfold']+++def tzname_in_python2(namefunc):+    """Change unicode output into bytestrings in Python 2++    tzname() API changed in Python 3. It used to return bytes, but was changed+    to unicode strings+    """+    if PY2:+        @wraps(namefunc)+        def adjust_encoding(*args, **kwargs):+            name = namefunc(*args, **kwargs)+            if name is not None:+                name = name.encode()++            return name++        return adjust_encoding+    else:+        return namefunc+++# The following is adapted from Alexander Belopolsky's tz library+# https://github.com/abalkin/tz+if hasattr(datetime, 'fold'):+    # This is the pre-python 3.6 fold situation+    def enfold(dt, fold=1):+        """+        Provides a unified interface for assigning the ``fold`` attribute to+        datetimes both before and after the implementation of PEP-495.++        :param fold:+            The value for the ``fold`` attribute in the returned datetime. This+            should be either 0 or 1.++        :return:+            Returns an object for which ``getattr(dt, 'fold', 0)`` returns+            ``fold`` for all versions of Python. In versions prior to+            Python 3.6, this is a ``_DatetimeWithFold`` object, which is a+            subclass of :py:class:`datetime.datetime` with the ``fold``+            attribute added, if ``fold`` is 1.++        .. versionadded:: 2.6.0+        """+        return dt.replace(fold=fold)++else:+    class _DatetimeWithFold(datetime):+        """+        This is a class designed to provide a PEP 495-compliant interface for+        Python versions before 3.6. It is used only for dates in a fold, so+        the ``fold`` attribute is fixed at ``1``.++        .. versionadded:: 2.6.0+        """+        __slots__ = ()++        def replace(self, *args, **kwargs):+            """+            Return a datetime with the same attributes, except for those+            attributes given new values by whichever keyword arguments are+            specified. Note that tzinfo=None can be specified to create a naive+            datetime from an aware datetime with no conversion of date and time+            data.++            This is reimplemented in ``_DatetimeWithFold`` because pypy3 will+            return a ``datetime.datetime`` even if ``fold`` is unchanged.+            """+            argnames = (+                'year', 'month', 'day', 'hour', 'minute', 'second',+                'microsecond', 'tzinfo'+            )++            for arg, argname in zip(args, argnames):+                if argname in kwargs:+                    raise TypeError('Duplicate argument: {}'.format(argname))++                kwargs[argname] = arg++            for argname in argnames:+                if argname not in kwargs:+                    kwargs[argname] = getattr(self, argname)++            dt_class = self.__class__ if kwargs.get('fold', 1) else datetime++            return dt_class(**kwargs)++        @property+        def fold(self):+            return 1++    def enfold(dt, fold=1):+        """+        Provides a unified interface for assigning the ``fold`` attribute to+        datetimes both before and after the implementation of PEP-495.++        :param fold:+            The value for the ``fold`` attribute in the returned datetime. This+            should be either 0 or 1.++        :return:+            Returns an object for which ``getattr(dt, 'fold', 0)`` returns+            ``fold`` for all versions of Python. In versions prior to+            Python 3.6, this is a ``_DatetimeWithFold`` object, which is a+            subclass of :py:class:`datetime.datetime` with the ``fold``+            attribute added, if ``fold`` is 1.++        .. versionadded:: 2.6.0+        """+        if getattr(dt, 'fold', 0) == fold:+            return dt++        args = dt.timetuple()[:6]+        args += (dt.microsecond, dt.tzinfo)++        if fold:+            return _DatetimeWithFold(*args)+        else:+            return datetime(*args)+++def _validate_fromutc_inputs(f):+    """+    The CPython version of ``fromutc`` checks that the input is a ``datetime``+    object and that ``self`` is attached as its ``tzinfo``.+    """+    @wraps(f)+    def fromutc(self, dt):+        if not isinstance(dt, datetime):+            raise TypeError("fromutc() requires a datetime argument")+        if dt.tzinfo is not self:+            raise ValueError("dt.tzinfo is not self")++        return f(self, dt)++    return fromutc+++class _tzinfo(tzinfo):+    """+    Base class for all ``dateutil`` ``tzinfo`` objects.+    """++    def is_ambiguous(self, dt):+        """+        Whether or not the "wall time" of a given datetime is ambiguous in this+        zone.++        :param dt:+            A :py:class:`datetime.datetime`, naive or time zone aware.+++        :return:+            Returns ``True`` if ambiguous, ``False`` otherwise.++        .. versionadded:: 2.6.0+        """++        dt = dt.replace(tzinfo=self)++        wall_0 = enfold(dt, fold=0)+        wall_1 = enfold(dt, fold=1)++        same_offset = wall_0.utcoffset() == wall_1.utcoffset()+        same_dt = wall_0.replace(tzinfo=None) == wall_1.replace(tzinfo=None)++        return same_dt and not same_offset++    def _fold_status(self, dt_utc, dt_wall):+        """+        Determine the fold status of a "wall" datetime, given a representation+        of the same datetime as a (naive) UTC datetime. This is calculated based+        on the assumption that ``dt.utcoffset() - dt.dst()`` is constant for all+        datetimes, and that this offset is the actual number of hours separating+        ``dt_utc`` and ``dt_wall``.++        :param dt_utc:+            Representation of the datetime as UTC++        :param dt_wall:+            Representation of the datetime as "wall time". This parameter must+            either have a `fold` attribute or have a fold-naive+            :class:`datetime.tzinfo` attached, otherwise the calculation may+            fail.+        """+        if self.is_ambiguous(dt_wall):+            delta_wall = dt_wall - dt_utc+            _fold = int(delta_wall == (dt_utc.utcoffset() - dt_utc.dst()))+        else:+            _fold = 0++        return _fold++    def _fold(self, dt):+        return getattr(dt, 'fold', 0)++    def _fromutc(self, dt):+        """+        Given a timezone-aware datetime in a given timezone, calculates a+        timezone-aware datetime in a new timezone.++        Since this is the one time that we *know* we have an unambiguous+        datetime object, we take this opportunity to determine whether the+        datetime is ambiguous and in a "fold" state (e.g. if it's the first+        occurrence, chronologically, of the ambiguous datetime).++        :param dt:+            A timezone-aware :class:`datetime.datetime` object.+        """++        # Re-implement the algorithm from Python's datetime.py+        dtoff = dt.utcoffset()+        if dtoff is None:+            raise ValueError("fromutc() requires a non-None utcoffset() "+                             "result")++        # The original datetime.py code assumes that `dst()` defaults to+        # zero during ambiguous times. PEP 495 inverts this presumption, so+        # for pre-PEP 495 versions of python, we need to tweak the algorithm.+        dtdst = dt.dst()+        if dtdst is None:+            raise ValueError("fromutc() requires a non-None dst() result")+        delta = dtoff - dtdst++        dt += delta+        # Set fold=1 so we can default to being in the fold for+        # ambiguous dates.+        dtdst = enfold(dt, fold=1).dst()+        if dtdst is None:+            raise ValueError("fromutc(): dt.dst gave inconsistent "+                             "results; cannot convert")+        return dt + dtdst++    @_validate_fromutc_inputs+    def fromutc(self, dt):+        """+        Given a timezone-aware datetime in a given timezone, calculates a
… 172 more lines (truncated)
src/dateutil/tz/_factories.py +80 lines
--- +++ @@ -0,0 +1,80 @@+from datetime import timedelta+import weakref+from collections import OrderedDict++from six.moves import _thread+++class _TzSingleton(type):+    def __init__(cls, *args, **kwargs):+        cls.__instance = None+        super(_TzSingleton, cls).__init__(*args, **kwargs)++    def __call__(cls):+        if cls.__instance is None:+            cls.__instance = super(_TzSingleton, cls).__call__()+        return cls.__instance+++class _TzFactory(type):+    def instance(cls, *args, **kwargs):+        """Alternate constructor that returns a fresh instance"""+        return type.__call__(cls, *args, **kwargs)+++class _TzOffsetFactory(_TzFactory):+    def __init__(cls, *args, **kwargs):+        cls.__instances = weakref.WeakValueDictionary()+        cls.__strong_cache = OrderedDict()+        cls.__strong_cache_size = 8++        cls._cache_lock = _thread.allocate_lock()++    def __call__(cls, name, offset):+        if isinstance(offset, timedelta):+            key = (name, offset.total_seconds())+        else:+            key = (name, offset)++        instance = cls.__instances.get(key, None)+        if instance is None:+            instance = cls.__instances.setdefault(key,+                                                  cls.instance(name, offset))++        # This lock may not be necessary in Python 3. See GH issue #901+        with cls._cache_lock:+            cls.__strong_cache[key] = cls.__strong_cache.pop(key, instance)++            # Remove an item if the strong cache is overpopulated+            if len(cls.__strong_cache) > cls.__strong_cache_size:+                cls.__strong_cache.popitem(last=False)++        return instance+++class _TzStrFactory(_TzFactory):+    def __init__(cls, *args, **kwargs):+        cls.__instances = weakref.WeakValueDictionary()+        cls.__strong_cache = OrderedDict()+        cls.__strong_cache_size = 8++        cls.__cache_lock = _thread.allocate_lock()++    def __call__(cls, s, posix_offset=False):+        key = (s, posix_offset)+        instance = cls.__instances.get(key, None)++        if instance is None:+            instance = cls.__instances.setdefault(key,+                cls.instance(s, posix_offset))++        # This lock may not be necessary in Python 3. See GH issue #901+        with cls.__cache_lock:+            cls.__strong_cache[key] = cls.__strong_cache.pop(key, instance)++            # Remove an item if the strong cache is overpopulated+            if len(cls.__strong_cache) > cls.__strong_cache_size:+                cls.__strong_cache.popitem(last=False)++        return instance+
src/dateutil/tz/tz.py +1849 lines
--- +++ @@ -0,0 +1,1849 @@+# -*- coding: utf-8 -*-+"""+This module offers timezone implementations subclassing the abstract+:py:class:`datetime.tzinfo` type. There are classes to handle tzfile format+files (usually are in :file:`/etc/localtime`, :file:`/usr/share/zoneinfo`,+etc), TZ environment string (in all known formats), given ranges (with help+from relative deltas), local machine timezone, fixed offset timezone, and UTC+timezone.+"""+import datetime+import struct+import time+import sys+import os+import bisect+import weakref+from collections import OrderedDict++import six+from six import string_types+from six.moves import _thread+from ._common import tzname_in_python2, _tzinfo+from ._common import tzrangebase, enfold+from ._common import _validate_fromutc_inputs++from ._factories import _TzSingleton, _TzOffsetFactory+from ._factories import _TzStrFactory+try:+    from .win import tzwin, tzwinlocal+except ImportError:+    tzwin = tzwinlocal = None++# For warning about rounding tzinfo+from warnings import warn++ZERO = datetime.timedelta(0)+EPOCH = datetime.datetime(1970, 1, 1, 0, 0)+EPOCHORDINAL = EPOCH.toordinal()++[email protected]_metaclass(_TzSingleton)+class tzutc(datetime.tzinfo):+    """+    This is a tzinfo object that represents the UTC time zone.++    **Examples:**++    .. doctest::++        >>> from datetime import *+        >>> from dateutil.tz import *++        >>> datetime.now()+        datetime.datetime(2003, 9, 27, 9, 40, 1, 521290)++        >>> datetime.now(tzutc())+        datetime.datetime(2003, 9, 27, 12, 40, 12, 156379, tzinfo=tzutc())++        >>> datetime.now(tzutc()).tzname()+        'UTC'++    .. versionchanged:: 2.7.0+        ``tzutc()`` is now a singleton, so the result of ``tzutc()`` will+        always return the same object.++        .. doctest::++            >>> from dateutil.tz import tzutc, UTC+            >>> tzutc() is tzutc()+            True+            >>> tzutc() is UTC+            True+    """+    def utcoffset(self, dt):+        return ZERO++    def dst(self, dt):+        return ZERO++    @tzname_in_python2+    def tzname(self, dt):+        return "UTC"++    def is_ambiguous(self, dt):+        """+        Whether or not the "wall time" of a given datetime is ambiguous in this+        zone.++        :param dt:+            A :py:class:`datetime.datetime`, naive or time zone aware.+++        :return:+            Returns ``True`` if ambiguous, ``False`` otherwise.++        .. versionadded:: 2.6.0+        """+        return False++    @_validate_fromutc_inputs+    def fromutc(self, dt):+        """+        Fast track version of fromutc() returns the original ``dt`` object for+        any valid :py:class:`datetime.datetime` object.+        """+        return dt++    def __eq__(self, other):+        if not isinstance(other, (tzutc, tzoffset)):+            return NotImplemented++        return (isinstance(other, tzutc) or+                (isinstance(other, tzoffset) and other._offset == ZERO))++    __hash__ = None++    def __ne__(self, other):+        return not (self == other)++    def __repr__(self):+        return "%s()" % self.__class__.__name__++    __reduce__ = object.__reduce__+++#: Convenience constant providing a :class:`tzutc()` instance+#:+#: .. versionadded:: 2.7.0+UTC = tzutc()++[email protected]_metaclass(_TzOffsetFactory)+class tzoffset(datetime.tzinfo):+    """+    A simple class for representing a fixed offset from UTC.++    :param name:+        The timezone name, to be returned when ``tzname()`` is called.+    :param offset:+        The time zone offset in seconds, or (since version 2.6.0, represented+        as a :py:class:`datetime.timedelta` object).+    """+    def __init__(self, name, offset):+        self._name = name++        try:+            # Allow a timedelta+            offset = offset.total_seconds()+        except (TypeError, AttributeError):+            pass++        self._offset = datetime.timedelta(seconds=_get_supported_offset(offset))++    def utcoffset(self, dt):+        return self._offset++    def dst(self, dt):+        return ZERO++    @tzname_in_python2+    def tzname(self, dt):+        return self._name++    @_validate_fromutc_inputs+    def fromutc(self, dt):+        return dt + self._offset++    def is_ambiguous(self, dt):+        """+        Whether or not the "wall time" of a given datetime is ambiguous in this+        zone.++        :param dt:+            A :py:class:`datetime.datetime`, naive or time zone aware.+        :return:+            Returns ``True`` if ambiguous, ``False`` otherwise.++        .. versionadded:: 2.6.0+        """+        return False++    def __eq__(self, other):+        if not isinstance(other, tzoffset):+            return NotImplemented++        return self._offset == other._offset++    __hash__ = None++    def __ne__(self, other):+        return not (self == other)++    def __repr__(self):+        return "%s(%s, %s)" % (self.__class__.__name__,+                               repr(self._name),+                               int(self._offset.total_seconds()))++    __reduce__ = object.__reduce__+++class tzlocal(_tzinfo):+    """+    A :class:`tzinfo` subclass built around the ``time`` timezone functions.+    """+    def __init__(self):+        super(tzlocal, self).__init__()++        self._std_offset = datetime.timedelta(seconds=-time.timezone)+        if time.daylight:+            self._dst_offset = datetime.timedelta(seconds=-time.altzone)+        else:+            self._dst_offset = self._std_offset++        self._dst_saved = self._dst_offset - self._std_offset+        self._hasdst = bool(self._dst_saved)+        self._tznames = tuple(time.tzname)++    def utcoffset(self, dt):+        if dt is None and self._hasdst:+            return None++        if self._isdst(dt):+            return self._dst_offset+        else:+            return self._std_offset++    def dst(self, dt):+        if dt is None and self._hasdst:+            return None++        if self._isdst(dt):+            return self._dst_offset - self._std_offset+        else:+            return ZERO++    @tzname_in_python2+    def tzname(self, dt):+        return self._tznames[self._isdst(dt)]++    def is_ambiguous(self, dt):+        """+        Whether or not the "wall time" of a given datetime is ambiguous in this+        zone.++        :param dt:+            A :py:class:`datetime.datetime`, naive or time zone aware.+
… 1602 more lines (truncated)
src/dateutil/tz/win.py +370 lines
--- +++ @@ -0,0 +1,370 @@+# -*- coding: utf-8 -*-+"""+This module provides an interface to the native time zone data on Windows,+including :py:class:`datetime.tzinfo` implementations.++Attempting to import this module on a non-Windows platform will raise an+:py:obj:`ImportError`.+"""+# This code was originally contributed by Jeffrey Harris.+import datetime+import struct++from six.moves import winreg+from six import text_type++try:+    import ctypes+    from ctypes import wintypes+except ValueError:+    # ValueError is raised on non-Windows systems for some horrible reason.+    raise ImportError("Running tzwin on non-Windows system")++from ._common import tzrangebase++__all__ = ["tzwin", "tzwinlocal", "tzres"]++ONEWEEK = datetime.timedelta(7)++TZKEYNAMENT = r"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones"+TZKEYNAME9X = r"SOFTWARE\Microsoft\Windows\CurrentVersion\Time Zones"+TZLOCALKEYNAME = r"SYSTEM\CurrentControlSet\Control\TimeZoneInformation"+++def _settzkeyname():+    handle = winreg.ConnectRegistry(None, winreg.HKEY_LOCAL_MACHINE)+    try:+        winreg.OpenKey(handle, TZKEYNAMENT).Close()+        TZKEYNAME = TZKEYNAMENT+    except WindowsError:+        TZKEYNAME = TZKEYNAME9X+    handle.Close()+    return TZKEYNAME+++TZKEYNAME = _settzkeyname()+++class tzres(object):+    """+    Class for accessing ``tzres.dll``, which contains timezone name related+    resources.++    .. versionadded:: 2.5.0+    """+    p_wchar = ctypes.POINTER(wintypes.WCHAR)        # Pointer to a wide char++    def __init__(self, tzres_loc='tzres.dll'):+        # Load the user32 DLL so we can load strings from tzres+        user32 = ctypes.WinDLL('user32')++        # Specify the LoadStringW function+        user32.LoadStringW.argtypes = (wintypes.HINSTANCE,+                                       wintypes.UINT,+                                       wintypes.LPWSTR,+                                       ctypes.c_int)++        self.LoadStringW = user32.LoadStringW+        self._tzres = ctypes.WinDLL(tzres_loc)+        self.tzres_loc = tzres_loc++    def load_name(self, offset):+        """+        Load a timezone name from a DLL offset (integer).++        >>> from dateutil.tzwin import tzres+        >>> tzr = tzres()+        >>> print(tzr.load_name(112))+        'Eastern Standard Time'++        :param offset:+            A positive integer value referring to a string from the tzres dll.++        .. note::++            Offsets found in the registry are generally of the form+            ``@tzres.dll,-114``. The offset in this case is 114, not -114.++        """+        resource = self.p_wchar()+        lpBuffer = ctypes.cast(ctypes.byref(resource), wintypes.LPWSTR)+        nchar = self.LoadStringW(self._tzres._handle, offset, lpBuffer, 0)+        return resource[:nchar]++    def name_from_string(self, tzname_str):+        """+        Parse strings as returned from the Windows registry into the time zone+        name as defined in the registry.++        >>> from dateutil.tzwin import tzres+        >>> tzr = tzres()+        >>> print(tzr.name_from_string('@tzres.dll,-251'))+        'Dateline Daylight Time'+        >>> print(tzr.name_from_string('Eastern Standard Time'))+        'Eastern Standard Time'++        :param tzname_str:+            A timezone name string as returned from a Windows registry key.++        :return:+            Returns the localized timezone string from tzres.dll if the string+            is of the form `@tzres.dll,-offset`, else returns the input string.+        """+        if not tzname_str.startswith('@'):+            return tzname_str++        name_splt = tzname_str.split(',-')+        try:+            offset = int(name_splt[1])+        except:+            raise ValueError("Malformed timezone string.")++        return self.load_name(offset)+++class tzwinbase(tzrangebase):+    """tzinfo class based on win32's timezones available in the registry."""+    def __init__(self):+        raise NotImplementedError('tzwinbase is an abstract base class')++    def __eq__(self, other):+        # Compare on all relevant dimensions, including name.+        if not isinstance(other, tzwinbase):+            return NotImplemented++        return  (self._std_offset == other._std_offset and+                 self._dst_offset == other._dst_offset and+                 self._stddayofweek == other._stddayofweek and+                 self._dstdayofweek == other._dstdayofweek and+                 self._stdweeknumber == other._stdweeknumber and+                 self._dstweeknumber == other._dstweeknumber and+                 self._stdhour == other._stdhour and+                 self._dsthour == other._dsthour and+                 self._stdminute == other._stdminute and+                 self._dstminute == other._dstminute and+                 self._std_abbr == other._std_abbr and+                 self._dst_abbr == other._dst_abbr)++    @staticmethod+    def list():+        """Return a list of all time zones known to the system."""+        with winreg.ConnectRegistry(None, winreg.HKEY_LOCAL_MACHINE) as handle:+            with winreg.OpenKey(handle, TZKEYNAME) as tzkey:+                result = [winreg.EnumKey(tzkey, i)+                          for i in range(winreg.QueryInfoKey(tzkey)[0])]+        return result++    def display(self):+        """+        Return the display name of the time zone.+        """+        return self._display++    def transitions(self, year):+        """+        For a given year, get the DST on and off transition times, expressed+        always on the standard time side. For zones with no transitions, this+        function returns ``None``.++        :param year:+            The year whose transitions you would like to query.++        :return:+            Returns a :class:`tuple` of :class:`datetime.datetime` objects,+            ``(dston, dstoff)`` for zones with an annual DST transition, or+            ``None`` for fixed offset zones.+        """++        if not self.hasdst:+            return None++        dston = picknthweekday(year, self._dstmonth, self._dstdayofweek,+                               self._dsthour, self._dstminute,+                               self._dstweeknumber)++        dstoff = picknthweekday(year, self._stdmonth, self._stddayofweek,+                                self._stdhour, self._stdminute,+                                self._stdweeknumber)++        # Ambiguous dates default to the STD side+        dstoff -= self._dst_base_offset++        return dston, dstoff++    def _get_hasdst(self):+        return self._dstmonth != 0++    @property+    def _dst_base_offset(self):+        return self._dst_base_offset_+++class tzwin(tzwinbase):+    """+    Time zone object created from the zone info in the Windows registry++    These are similar to :py:class:`dateutil.tz.tzrange` objects in that+    the time zone data is provided in the format of a single offset rule+    for either 0 or 2 time zone transitions per year.++    :param: name+        The name of a Windows time zone key, e.g. "Eastern Standard Time".+        The full list of keys can be retrieved with :func:`tzwin.list`.+    """++    def __init__(self, name):+        self._name = name++        with winreg.ConnectRegistry(None, winreg.HKEY_LOCAL_MACHINE) as handle:+            tzkeyname = text_type("{kn}\\{name}").format(kn=TZKEYNAME, name=name)+            with winreg.OpenKey(handle, tzkeyname) as tzkey:+                keydict = valuestodict(tzkey)++        self._std_abbr = keydict["Std"]+        self._dst_abbr = keydict["Dlt"]++        self._display = keydict["Display"]++        # See http://ww_winreg.jsiinc.com/SUBA/tip0300/rh0398.htm+        tup = struct.unpack("=3l16h", keydict["TZI"])+        stdoffset = -tup[0]-tup[1]          # Bias + StandardBias * -1+        dstoffset = stdoffset-tup[2]        # + DaylightBias * -1+        self._std_offset = datetime.timedelta(minutes=stdoffset)+        self._dst_offset = datetime.timedelta(minutes=dstoffset)++        # for the meaning see the win32 TIME_ZONE_INFORMATION structure docs+        # http://msdn.microsoft.com/en-us/library/windows/desktop/ms725481(v=vs.85).aspx+        (self._stdmonth,+         self._stddayofweek,   # Sunday = 0+         self._stdweeknumber,  # Last = 5+         self._stdhour,+         self._stdminute) = tup[4:9]++        (self._dstmonth,+         self._dstdayofweek,   # Sunday = 0+         self._dstweeknumber,  # Last = 5+         self._dsthour,+         self._dstminute) = tup[12:17]
… 123 more lines (truncated)
src/dateutil/tzwin.py +2 lines
--- +++ @@ -0,0 +1,2 @@+# tzwin has moved to dateutil.tz.win+from .tz.win import *
src/dateutil/utils.py +71 lines
--- +++ @@ -0,0 +1,71 @@+# -*- coding: utf-8 -*-+"""+This module offers general convenience and utility functions for dealing with+datetimes.++.. versionadded:: 2.7.0+"""+from __future__ import unicode_literals++from datetime import datetime, time+++def today(tzinfo=None):+    """+    Returns a :py:class:`datetime` representing the current day at midnight++    :param tzinfo:+        The time zone to attach (also used to determine the current day).++    :return:+        A :py:class:`datetime.datetime` object representing the current day+        at midnight.+    """++    dt = datetime.now(tzinfo)+    return datetime.combine(dt.date(), time(0, tzinfo=tzinfo))+++def default_tzinfo(dt, tzinfo):+    """+    Sets the ``tzinfo`` parameter on naive datetimes only++    This is useful for example when you are provided a datetime that may have+    either an implicit or explicit time zone, such as when parsing a time zone+    string.++    .. doctest::++        >>> from dateutil.tz import tzoffset+        >>> from dateutil.parser import parse+        >>> from dateutil.utils import default_tzinfo+        >>> dflt_tz = tzoffset("EST", -18000)+        >>> print(default_tzinfo(parse('2014-01-01 12:30 UTC'), dflt_tz))+        2014-01-01 12:30:00+00:00+        >>> print(default_tzinfo(parse('2014-01-01 12:30'), dflt_tz))+        2014-01-01 12:30:00-05:00++    :param dt:+        The datetime on which to replace the time zone++    :param tzinfo:+        The :py:class:`datetime.tzinfo` subclass instance to assign to+        ``dt`` if (and only if) it is naive.++    :return:+        Returns an aware :py:class:`datetime.datetime`.+    """+    if dt.tzinfo is not None:+        return dt+    else:+        return dt.replace(tzinfo=tzinfo)+++def within_delta(dt1, dt2, delta):+    """+    Useful for comparing two datetimes that may have a negligible difference+    to be considered equal.+    """+    delta = abs(delta)+    difference = dt1 - dt2+    return -delta <= difference <= delta
src/dateutil/zoneinfo/__init__.py +167 lines
--- +++ @@ -0,0 +1,167 @@+# -*- coding: utf-8 -*-+import warnings+import json++from tarfile import TarFile+from pkgutil import get_data+from io import BytesIO++from dateutil.tz import tzfile as _tzfile++__all__ = ["get_zonefile_instance", "gettz", "gettz_db_metadata"]++ZONEFILENAME = "dateutil-zoneinfo.tar.gz"+METADATA_FN = 'METADATA'+++class tzfile(_tzfile):+    def __reduce__(self):+        return (gettz, (self._filename,))+++def getzoneinfofile_stream():+    try:+        return BytesIO(get_data(__name__, ZONEFILENAME))+    except IOError as e:  # TODO  switch to FileNotFoundError?+        warnings.warn("I/O error({0}): {1}".format(e.errno, e.strerror))+        return None+++class ZoneInfoFile(object):+    def __init__(self, zonefile_stream=None):+        if zonefile_stream is not None:+            with TarFile.open(fileobj=zonefile_stream) as tf:+                self.zones = {zf.name: tzfile(tf.extractfile(zf), filename=zf.name)+                              for zf in tf.getmembers()+                              if zf.isfile() and zf.name != METADATA_FN}+                # deal with links: They'll point to their parent object. Less+                # waste of memory+                links = {zl.name: self.zones[zl.linkname]+                         for zl in tf.getmembers() if+                         zl.islnk() or zl.issym()}+                self.zones.update(links)+                try:+                    metadata_json = tf.extractfile(tf.getmember(METADATA_FN))+                    metadata_str = metadata_json.read().decode('UTF-8')+                    self.metadata = json.loads(metadata_str)+                except KeyError:+                    # no metadata in tar file+                    self.metadata = None+        else:+            self.zones = {}+            self.metadata = None++    def get(self, name, default=None):+        """+        Wrapper for :func:`ZoneInfoFile.zones.get`. This is a convenience method+        for retrieving zones from the zone dictionary.++        :param name:+            The name of the zone to retrieve. (Generally IANA zone names)++        :param default:+            The value to return in the event of a missing key.++        .. versionadded:: 2.6.0++        """+        return self.zones.get(name, default)+++# The current API has gettz as a module function, although in fact it taps into+# a stateful class. So as a workaround for now, without changing the API, we+# will create a new "global" class instance the first time a user requests a+# timezone. Ugly, but adheres to the api.+#+# TODO: Remove after deprecation period.+_CLASS_ZONE_INSTANCE = []+++def get_zonefile_instance(new_instance=False):+    """+    This is a convenience function which provides a :class:`ZoneInfoFile`+    instance using the data provided by the ``dateutil`` package. By default, it+    caches a single instance of the ZoneInfoFile object and returns that.++    :param new_instance:+        If ``True``, a new instance of :class:`ZoneInfoFile` is instantiated and+        used as the cached instance for the next call. Otherwise, new instances+        are created only as necessary.++    :return:+        Returns a :class:`ZoneInfoFile` object.++    .. versionadded:: 2.6+    """+    if new_instance:+        zif = None+    else:+        zif = getattr(get_zonefile_instance, '_cached_instance', None)++    if zif is None:+        zif = ZoneInfoFile(getzoneinfofile_stream())++        get_zonefile_instance._cached_instance = zif++    return zif+++def gettz(name):+    """+    This retrieves a time zone from the local zoneinfo tarball that is packaged+    with dateutil.++    :param name:+        An IANA-style time zone name, as found in the zoneinfo file.++    :return:+        Returns a :class:`dateutil.tz.tzfile` time zone object.++    .. warning::+        It is generally inadvisable to use this function, and it is only+        provided for API compatibility with earlier versions. This is *not*+        equivalent to ``dateutil.tz.gettz()``, which selects an appropriate+        time zone based on the inputs, favoring system zoneinfo. This is ONLY+        for accessing the dateutil-specific zoneinfo (which may be out of+        date compared to the system zoneinfo).++    .. deprecated:: 2.6+        If you need to use a specific zoneinfofile over the system zoneinfo,+        instantiate a :class:`dateutil.zoneinfo.ZoneInfoFile` object and call+        :func:`dateutil.zoneinfo.ZoneInfoFile.get(name)` instead.++        Use :func:`get_zonefile_instance` to retrieve an instance of the+        dateutil-provided zoneinfo.+    """+    warnings.warn("zoneinfo.gettz() will be removed in future versions, "+                  "to use the dateutil-provided zoneinfo files, instantiate a "+                  "ZoneInfoFile object and use ZoneInfoFile.zones.get() "+                  "instead. See the documentation for details.",+                  DeprecationWarning)++    if len(_CLASS_ZONE_INSTANCE) == 0:+        _CLASS_ZONE_INSTANCE.append(ZoneInfoFile(getzoneinfofile_stream()))+    return _CLASS_ZONE_INSTANCE[0].zones.get(name)+++def gettz_db_metadata():+    """ Get the zonefile metadata++    See `zonefile_metadata`_++    :returns:+        A dictionary with the database metadata++    .. deprecated:: 2.6+        See deprecation warning in :func:`zoneinfo.gettz`. To get metadata,+        query the attribute ``zoneinfo.ZoneInfoFile.metadata``.+    """+    warnings.warn("zoneinfo.gettz_db_metadata() will be removed in future "+                  "versions, to use the dateutil-provided zoneinfo files, "+                  "ZoneInfoFile object and query the 'metadata' attribute "+                  "instead. See the documentation for details.",+                  DeprecationWarning)++    if len(_CLASS_ZONE_INSTANCE) == 0:+        _CLASS_ZONE_INSTANCE.append(ZoneInfoFile(getzoneinfofile_stream()))+    return _CLASS_ZONE_INSTANCE[0].metadata
tests/__init__.py +0 lines
binary or empty diff
pyyaml pypi
6.0.3 8mo ago nominal
INSTALL-EXEC
latest 6.0.3 versions 40 maintainers 1
5.1
5.1.1
5.1.2
5.2
5.3
5.3.1
5.4
5.4.1
6.0
6.0.1
6.0.2
6.0.3
INSTALL-EXEC
setup.py in sdist uses install-hook (runs at pip install)
warn · snapshot-derived
release diff 6.0.2 → 6.0.3
+1 added · -1 removed · ~9 modified
lib/yaml/__init__.py +1 lines
--- +++ @@ -10,3 +10,3 @@ -__version__ = '6.0.2'+__version__ = '6.0.3' try:
packaging/build/libyaml.sh +15 lines
--- +++ @@ -3,2 +3,10 @@ set -eux++# build the requested version of libyaml locally+echo "::group::fetch libyaml ${LIBYAML_REF}"+git config --global advice.detachedHead false+git clone --branch "$LIBYAML_REF" "$LIBYAML_REPO" libyaml+pushd libyaml+git reset --hard "$LIBYAML_REF"+echo "::endgroup::" @@ -14,10 +22,10 @@ fi-echo "::endgroup::" -# build the requested version of libyaml locally-echo "::group::fetch libyaml ${LIBYAML_REF}"-git config --global advice.detachedHead false-git clone --branch "$LIBYAML_REF" "$LIBYAML_REPO" libyaml-pushd libyaml-git reset --hard "$LIBYAML_REF"+# hack to fix up locally musl1.2 libtool macros+if grep -m 1 alpine /etc/os-release; then+  if ! grep -E 'AC_CONFIG_MACRO_DIRS\(\[m4])' configure.ac; then+    echo 'AC_CONFIG_MACRO_DIRS([m4])' >> configure.ac+    ACLOCAL_PATH=/usr/local/share/libtool/ libtoolize+  fi+fi echo "::endgroup::"
pyproject.toml +0 lines
--- +++ @@ -3,3 +3,2 @@     "setuptools",  # FIXME: declare min/max setuptools versions?-    "wheel",     "Cython; python_version < '3.13'",
setup.py +2 lines
--- +++ @@ -2,3 +2,3 @@ NAME = 'PyYAML'-VERSION = '6.0.2'+VERSION = '6.0.3' DESCRIPTION = "YAML parser and emitter for Python"@@ -36,2 +36,3 @@     "Programming Language :: Python :: 3.13",+    "Programming Language :: Python :: 3.14",     "Programming Language :: Python :: Implementation :: CPython",
six pypi
1.17.0 1y ago nominal
BURST ×2
latest 1.17.0 versions 29 maintainers 1
1.7.2
1.7.3
1.8.0
1.9.0
1.10.0
1.11.0
1.12.0
1.13.0
1.14.0
1.15.0
1.16.0
1.17.0
BURST
2 releases in 28m: 1.6.0, 1.6.1
info · registry-verified · 2014-03-14 · 12y ago
BURST
2 releases in 18m: 1.7.1, 1.7.2
info · registry-verified · 2014-06-09 · 11y ago
release diff 1.16.0 → 1.17.0
+0 added · -0 removed · ~11 modified
six.py +10 lines · 3 flagged
--- +++ @@ -1,2 +1,2 @@-# Copyright (c) 2010-2020 Benjamin Peterson+# Copyright (c) 2010-2024 Benjamin Peterson #@@ -31,3 +31,3 @@ __author__ = "Benjamin Peterson <[email protected]>"-__version__ = "1.16.0"+__version__ = "1.17.0" @@ -265,3 +265,3 @@     MovedAttribute("StringIO", "StringIO", "io"),-    MovedAttribute("UserDict", "UserDict", "collections"),+    MovedAttribute("UserDict", "UserDict", "collections", "IterableUserDict", "UserDict"),     MovedAttribute("UserList", "UserList", "collections"),@@ -437,4 +437,2 @@     MovedAttribute("urlcleanup", "urllib", "urllib.request"),-    MovedAttribute("URLopener", "urllib", "urllib.request"),-    MovedAttribute("FancyURLopener", "urllib", "urllib.request"),     MovedAttribute("proxy_bypass", "urllib", "urllib.request"),@@ -443,2 +441,9 @@ ]+if sys.version_info[:2] < (3, 14):+    _urllib_request_moved_attributes.extend(+        [+            MovedAttribute("URLopener", "urllib", "urllib.request"),+            MovedAttribute("FancyURLopener", "urllib", "urllib.request"),+        ]+    ) for attr in _urllib_request_moved_attributes:
documentation/conf.py +1 lines
--- +++ @@ -35,3 +35,3 @@ project = u"six"-copyright = u"2010-2020, Benjamin Peterson"+copyright = u"2010-2024, Benjamin Peterson" 
setup.cfg +1 lines
--- +++ @@ -8,3 +8,3 @@ [metadata]-license_file = LICENSE+license_files = LICENSE @@ -12,9 +12,2 @@ minversion = 2.2.0-pep8ignore = -	documentation/*.py ALL-	test_six.py ALL-flakes-ignore = -	documentation/*.py ALL-	test_six.py ALL-	six.py UndefinedName 
setup.py +1 lines
--- +++ @@ -1,2 +1,2 @@-# Copyright (c) 2010-2020 Benjamin Peterson+# Copyright (c) 2010-2024 Benjamin Peterson #
test_six.py +17 lines
--- +++ @@ -1,2 +1,2 @@-# Copyright (c) 2010-2020 Benjamin Peterson+# Copyright (c) 2010-2024 Benjamin Peterson #@@ -115,2 +115,11 @@ +have_ndbm = True+try:+    import dbm+except ImportError:+    try:+        import dbm.ndbm+    except ImportError:+        have_ndbm = False+ @pytest.mark.parametrize("item_name",@@ -129,4 +138,8 @@                 pytest.skip("requires tkinter")-        if item_name.startswith("dbm_gnu") and not have_gdbm:+            if item_name == "tkinter_tix" and sys.version_info >= (3, 13):+                pytest.skip("tkinter.tix removed from Python 3.13")+        if item_name == "dbm_gnu" and not have_gdbm:             pytest.skip("requires gdbm")+        if item_name == "dbm_ndbm":+            pytest.skip("requires ndbm")         raise@@ -222,4 +235,4 @@     from six.moves import getoutput-    output = getoutput('echo "foo"')-    assert output == 'foo'+    output = getoutput('dir' if sys.platform.startswith('win') else 'echo foo')+    assert output != '' 
typing-extensions pypi
4.15.0 9mo ago nominal
critical-tier no findings
latest 4.15.0 versions 49 maintainers 1 critical-tier (snapshotted)
4.9.0
4.10.0
4.11.0
4.12.0
4.12.1
4.12.2
4.13.0
4.13.1
4.13.2
4.14.0
4.14.1
4.15.0
CLEAN
no findings — nominal
release diff 4.14.1 → 4.15.0
+0 added · -0 removed · ~6 modified
src/test_typing_extensions.py +100 lines · 2 flagged
--- +++ @@ -86,2 +86,3 @@     deprecated,+    disjoint_base,     evaluate_forward_ref,@@ -103,2 +104,3 @@     runtime_checkable,+    type_repr, )@@ -651,3 +653,3 @@         def h(x):-            return x+            return x  # pragma: no cover @@ -1209,3 +1211,7 @@ -    def test_illegal_parameters_do_not_raise_runtime_errors(self):+    def test_strange_parameters_are_allowed(self):+        # These are explicitly allowed by the typing spec+        Literal[Literal[1, 2], Literal[4, 5]]+        Literal[b"foo", "bar"]+         # Type checkers should reject these types, but we do not@@ -1213,5 +1219,3 @@         Literal[int]-        Literal[Literal[1, 2], Literal[4, 5]]         Literal[3j + 2, ..., ()]-        Literal[b"foo", "bar"]         Literal[{"foo": 3, "bar": 4}]@@ -1514,3 +1518,3 @@         yield-        return self.value+        return self.value  # pragma: no cover @@ -1522,3 +1526,3 @@     def __aiter__(self) -> AsyncIterator[T_a]:-        return self+        return self  # pragma: no cover @@ -2037,3 +2041,3 @@         def foo():-            yield 42+            yield 42  # pragma: no cover         g = foo()@@ -2095,3 +2099,3 @@         async def f():-            yield 42+            yield 42  # pragma: no cover         g = f()@@ -2214,3 +2218,3 @@         def manager():-            yield 42+            yield 42  # pragma: no cover @@ -2233,3 +2237,3 @@         def manager():-            yield 42+            yield 42  # pragma: no cover @@ -2612,3 +2616,3 @@             def ameth(self) -> int:-                return 26+                return 26  # pragma: no cover         with self.assertRaises(TypeError):@@ -3030,3 +3034,3 @@             def attr(self):-                return 42+                return 42  # pragma: no cover @@ -3034,3 +3038,3 @@             def __get__(self, obj, objtype=None):-                return 42+                return 42  # pragma: no cover @@ -3118,3 +3122,3 @@             def __dir__(self):-                return []+                return []  # pragma: no cover @@ -3122,3 +3126,3 @@             def __dir__(self):-                return ["x"]+                return ["x"]  # pragma: no cover @@ -3131,3 +3135,3 @@             def attr(self):-                raise AttributeError('no')+                raise AttributeError('no')  # pragma: no cover @@ -3135,3 +3139,3 @@             def __get__(self, obj, objtype=None):-                raise RuntimeError("NO")+                raise RuntimeError("NO")  # pragma: no cover @@ -3147,3 +3151,3 @@             def __getattr__(self, name):-                raise RuntimeError("wut")+                raise RuntimeError("wut")  # pragma: no cover @@ -3218,3 +3222,3 @@             def meth(self, arg):-                return 0+                return 0  # pragma: no cover         class Bad: pass@@ -3489,3 +3493,3 @@             def __subclasshook__(cls, other):-                return hasattr(other, 'x')+                return hasattr(other, 'x')  # pragma: no cover @@ -3575,3 +3579,3 @@             def bar(self, x: str) -> str:-                return x+                return x  # pragma: no cover         self.assertIsInstance(Test(), PSub)@@ -3763,5 +3767,5 @@             def __iter__(self):-                return []+                return []  # pragma: no cover             def close(self):-                return 0+                return 0  # pragma: no cover @@ -3783,3 +3787,3 @@             def __buffer__(self, flags: int) -> memoryview:-                return memoryview(b'')+                return memoryview(b'')  # pragma: no cover             def __release_buffer__(self, mv: memoryview) -> None:@@ -3809,3 +3813,3 @@             def __buffer__(self, flags: int) -> memoryview:-                return memoryview(b'')+                return memoryview(b'')  # pragma: no cover             def __release_buffer__(self, mv: memoryview) -> None:@@ -4093,3 +4097,3 @@             def square_norm(self) -> float:-                return self.x ** 2 + self.y ** 2+                return self.x ** 2 + self.y ** 2  # pragma: no cover @@ -4106,3 +4110,3 @@             def __get__(self, instance, type):-                raise RuntimeError("NO")+                raise RuntimeError("NO")  # pragma: no cover @@ -4153,3 +4157,3 @@             def read(self, n: int) -> bytes:-                return b""+                return b""  # pragma: no cover @@ -4157,3 +4161,3 @@             def readx(self, n: int) -> bytes:-                return b""+                return b""  # pragma: no cover @@ -4165,3 +4169,3 @@             def write(self, b: bytes) -> int:-                return 0+                return 0  # pragma: no cover @@ -4169,3 +4173,3 @@             def writex(self, b: bytes) -> int:-                return 0+                return 0  # pragma: no cover @@ -5957,3 +5961,3 @@             )-        except subprocess.CalledProcessError as exc:+        except subprocess.CalledProcessError as exc:  # pragma: no cover             print("stdout", exc.stdout, sep="\n")@@ -6322,3 +6326,3 @@             def return_tuple(self) -> StringTuple:-                return ("foo", "pep" + "675")+                return ("foo", "pep" + "675")  # pragma: no cover @@ -6373,3 +6377,3 @@             def return_tuple(self) -> TupleSelf:-                return (self, self)+                return (self, self)  # pragma: no cover @@ -6613,3 +6617,3 @@             def __call__(self, *args, **kwargs):-                return self.func(*args, **kwargs)+                return self.func(*args, **kwargs)  # pragma: no cover @@ -6667,2 +6671,14 @@         self.assertIs(True, Methods.cached.__final__)+++class DisjointBaseTests(BaseTestCase):+    def test_disjoint_base_unmodified(self):+        class C: ...+        self.assertIs(C, disjoint_base(C))++    def test_dunder_disjoint_base(self):+        @disjoint_base+        class C: ...++        self.assertIs(C.__disjoint_base__, True) @@ -6885,3 +6901,3 @@                                     shell=True)-        except subprocess.CalledProcessError:+        except subprocess.CalledProcessError:  # pragma: no cover             self.fail('Module does not compile with optimize=2 (-OO flag).')@@ -6975,3 +6991,3 @@                 def _fields(self):-                    return 'no chance for this'+                    return 'no chance for this'  # pragma: no cover @@ -6981,3 +6997,3 @@                 def _source(self):-                    return 'no chance for this as well'+                    return 'no chance for this as well'  # pragma: no cover @@ -7646,3 +7662,3 @@                 if other is typing_extensions.Protocol:-                    raise TypeError("I'm broken")+                    raise TypeError("I'm broken")  # pragma: no cover                 return False@@ -7772,3 +7788,3 @@             def __buffer__(self, flags: int) -> memoryview:-                return memoryview(b'')+                return memoryview(b'')  # pragma: no cover @@ -7787,3 +7803,3 @@             def __buffer__(self, flags: int) -> memoryview:-                return memoryview(b'')+                return memoryview(b'')  # pragma: no cover @@ -8368,2 +8384,40 @@ +class MyClass:+    def __repr__(self):+        return "my repr"+++class TestTypeRepr(BaseTestCase):+    def test_custom_types(self):++        class Nested:+            pass++        def nested():+            pass++        self.assertEqual(type_repr(MyClass), f"{__name__}.MyClass")+        self.assertEqual(+            type_repr(Nested),+            f"{__name__}.TestTypeRepr.test_custom_types.<locals>.Nested",+        )+        self.assertEqual(
… 39 more lines (truncated)
pyproject.toml +22 lines
--- +++ @@ -8,3 +8,3 @@ name = "typing_extensions"-version = "4.14.1"+version = "4.15.0" description = "Backported and Experimental Type Hints for Python 3.9+"@@ -93,6 +93,9 @@     "UP038",+    "UP045",  # X | None instead of Optional[X]     # Not relevant here-    "RUF012",-    "RUF022",-    "RUF023",+    "RUF012",  # Use ClassVar for mutables+    "RUF022",  # Unsorted __all__+    "RUF023",  # Unsorted __slots__+    "B903",  # Use dataclass / namedtuple+    "RUF031",  # parentheses for tuples in subscripts     # Ruff doesn't understand the globals() assignment; we test __all__@@ -111,2 +114,5 @@     "E701",+    # Harmful for tests if applied.+    "RUF036",  # None not at end of Union+    "RUF041",  # nested Literal ]@@ -116 +122,13 @@ known-first-party = ["typing_extensions", "_typed_dict_test_helper"]++[tool.coverage.report]+fail_under = 96+show_missing = true+# Omit files that are created in temporary directories during tests.+# If not explicitly omitted they will result in warnings in the report.+omit = ["inspect*", "ann*"]+ignore_errors = true+exclude_also = [+    # Exclude placeholder function and class bodies.+    '^\s*((async )?def|class) .*:\n\s*(pass|raise NotImplementedError)',+]
src/typing_extensions.py +91 lines
--- +++ @@ -16,2 +16,3 @@ +# Breakpoint: https://github.com/python/cpython/pull/119891 if sys.version_info >= (3, 14):@@ -72,2 +73,3 @@     'deprecated',+    'disjoint_base',     'Doc',@@ -102,2 +104,3 @@     'TYPE_CHECKING',+    'type_repr',     'Never',@@ -153,2 +156,3 @@ GenericMeta = type+# Breakpoint: https://github.com/python/cpython/pull/116129 _PEP_696_IMPLEMENTED = sys.version_info >= (3, 13, 0, "beta")@@ -170,2 +174,3 @@ +# Breakpoint: https://github.com/python/cpython/pull/27342 if sys.version_info >= (3, 10):@@ -191,2 +196,3 @@ +# Breakpoint: https://github.com/python/cpython/pull/31841 if sys.version_info >= (3, 11):@@ -279,2 +285,3 @@ +# Breakpoint: https://github.com/python/cpython/pull/30530 if sys.version_info >= (3, 11):@@ -317,2 +324,29 @@ +if hasattr(typing, "disjoint_base"):  # 3.15+    disjoint_base = typing.disjoint_base+else:+    def disjoint_base(cls):+        """This decorator marks a class as a disjoint base.++        Child classes of a disjoint base cannot inherit from other disjoint bases that are+        not parent classes of the disjoint base.++        For example:++            @disjoint_base+            class Disjoint1: pass++            @disjoint_base+            class Disjoint2: pass++            class Disjoint3(Disjoint1, Disjoint2): pass  # Type checker error++        Type checkers can use knowledge of disjoint bases to detect unreachable code+        and determine when two types can overlap.++        See PEP 800."""+        cls.__disjoint_base__ = True+        return cls++ def IntVar(name):@@ -322,2 +356,3 @@ # A Literal bug was fixed in 3.11.0, 3.10.1 and 3.9.8+# Breakpoint: https://github.com/python/cpython/pull/29334 if sys.version_info >= (3, 10, 1):@@ -482,2 +517,3 @@ +# Breakpoint: https://github.com/python/cpython/pull/118681 if sys.version_info >= (3, 13, 0, "beta"):@@ -592,2 +628,3 @@ # we want to backport this change to older Python versions.+# Breakpoint: https://github.com/python/cpython/pull/110683 if sys.version_info >= (3, 13):@@ -772,2 +809,3 @@ +# Breakpoint: https://github.com/python/cpython/pull/113401 if sys.version_info >= (3, 13):@@ -832,2 +870,3 @@ # Our version of runtime-checkable protocols is faster on Python <=3.11+# Breakpoint: https://github.com/python/cpython/pull/112717 if sys.version_info >= (3, 12):@@ -1161,2 +1200,3 @@ +            # Breakpoint: https://github.com/python/cpython/pull/119891             if sys.version_info >= (3, 14):@@ -1251,2 +1291,3 @@         if kwargs:+            # Breakpoint: https://github.com/python/cpython/pull/104891             if sys.version_info >= (3, 13):@@ -1460,2 +1501,3 @@         )+        # Breakpoint: https://github.com/python/cpython/pull/30304         if sys.version_info < (3, 11):@@ -1532,3 +1574,4 @@ # ParamSpecArgs and ParamSpecKwargs, so only Python 3.10's versions will do.-if sys.version_info[:2] >= (3, 10):+# Breakpoint: https://github.com/python/cpython/pull/25298+if sys.version_info >= (3, 10):     get_origin = typing.get_origin@@ -2098,2 +2141,3 @@ # 3.11+; Concatenate does not accept ellipsis in 3.10+# Breakpoint: https://github.com/python/cpython/pull/30969 if sys.version_info >= (3, 11):@@ -2434,3 +2478,5 @@ -if sys.version_info >= (3, 12):  # PEP 692 changed the repr of Unpack[]+# PEP 692 changed the repr of Unpack[]+# Breakpoint: https://github.com/python/cpython/pull/104048+if sys.version_info >= (3, 12):     Unpack = typing.Unpack@@ -2697,4 +2743,5 @@ +# dataclass_transform exists in 3.11 but lacks the frozen_default parameter+# Breakpoint: https://github.com/python/cpython/pull/99958 if sys.version_info >= (3, 12):  # 3.12+-    # dataclass_transform exists in 3.11 but lacks the frozen_default parameter     dataclass_transform = typing.dataclass_transform@@ -2829,2 +2876,3 @@ # Python 3.13.3+ contains a fix for the wrapped __new__+# Breakpoint: https://github.com/python/cpython/pull/132160 if sys.version_info >= (3, 13, 3):@@ -2958,2 +3006,3 @@                 if asyncio.coroutines.iscoroutinefunction(arg):+                    # Breakpoint: https://github.com/python/cpython/pull/99247                     if sys.version_info >= (3, 12):@@ -2971,2 +3020,3 @@ +# Breakpoint: https://github.com/python/cpython/pull/23702 if sys.version_info < (3, 10):@@ -3047,2 +3097,3 @@ +            # Breakpoint: https://github.com/python/cpython/pull/27515             things = "arguments" if sys.version_info >= (3, 10) else "parameters"@@ -3240,2 +3291,3 @@ # On 3.13, we deprecated kwargs-based NamedTuples+# Breakpoint: https://github.com/python/cpython/pull/105609 if sys.version_info >= (3, 13):@@ -3315,2 +3367,3 @@                             # as in "normal" classes seems most important here.+                            # Breakpoint: https://github.com/python/cpython/pull/95915                             if sys.version_info >= (3, 12):@@ -3463,2 +3516,3 @@ # The error message for subclassing instances of NewType was improved on 3.11++# Breakpoint: https://github.com/python/cpython/pull/30268 if sys.version_info >= (3, 11):@@ -3515,2 +3569,3 @@ +        # Breakpoint: https://github.com/python/cpython/pull/21515         if sys.version_info >= (3, 10):@@ -3526,2 +3581,3 @@ +# Breakpoint: https://github.com/python/cpython/pull/124795 if sys.version_info >= (3, 14):@@ -3530,2 +3586,3 @@ else:+    # Breakpoint: https://github.com/python/cpython/pull/103764     if sys.version_info >= (3, 12):@@ -3725,2 +3782,3 @@ +        # Breakpoint: https://github.com/python/cpython/pull/21515         if sys.version_info >= (3, 10):@@ -3837,5 +3895,7 @@ -if sys.version_info >= (3,14):+if sys.version_info >= (3, 14):     from annotationlib import Format, get_annotations else:+    # Available since Python 3.14.0a3+    # PR: https://github.com/python/cpython/pull/124415     class Format(enum.IntEnum):@@ -3846,2 +3906,4 @@ +    # Available since Python 3.14.0a1+    # PR: https://github.com/python/cpython/pull/119891     def get_annotations(obj, *, globals=None, locals=None, eval_str=False,@@ -4033,19 +4095,9 @@ -        # type parameters require some special handling,-        # as they exist in their own scope-        # but `eval()` does not have a dedicated parameter for that scope.-        # For classes, names in type parameter scopes should override-        # names in the global scope (which here are called `localns`!),-        # but should in turn be overridden by names in the class scope-        # (which here are called `globalns`!)+        # Type parameters exist in their own scope, which is logically+        # between the locals and the globals. We simulate this by adding+        # them to the globals.         if type_params is not None:             globals = dict(globals)-            locals = dict(locals)             for param in type_params:-                param_name = param.__name__-                if (-                    _FORWARD_REF_HAS_CLASS and not forward_ref.__forward_is_class__-                ) or param_name not in globals:-                    globals[param_name] = param-                    locals.pop(param_name, None)+                globals[param.__name__] = param @@ -4183,2 +4235,3 @@ +    # Breakpoint: https://github.com/python/cpython/pull/21515     if sys.version_info >= (3, 10):@@ -4192,2 +4245,22 @@         raise TypeError(f"Cannot pickle {type(self).__name__!r} object")+++if sys.version_info >= (3, 14, 0, "beta"):+    type_repr = annotationlib.type_repr+else:+    def type_repr(value):+        """Convert a Python value to a format suitable for use with the STRING format.++        This is intended as a helper for tools that support the STRING format but do+        not have access to the code that originally produced the annotations. It uses+        repr() for most objects.++        """+        if isinstance(value, (type, _types.FunctionType, _types.BuiltinFunctionType)):+            if value.__module__ == "builtins":+                return value.__qualname__+            return f"{value.__module__}.{value.__qualname__}"+        if value is ...:+            return "..."+        return repr(value) 

No packages match — nothing recent right now. Clear the filters to see the full watchlist.

alert feed
6d ago · @babel/core — BURST ACTIVE registry-verified
2 releases in 22m: 7.29.6, 7.29.7
11d ago · @types/react — BURST ACTIVE registry-verified
5 releases in 0m: 19.2.15, 18.3.29, 17.0.92, 16.14.70, 15.7.37
19d ago · @types/node — BURST ACTIVE registry-verified
3 releases in 0m: 24.12.4, 22.19.19, 20.19.41
23d ago · @types/node — BURST ACTIVE registry-verified
4 releases in 0m: 25.6.2, 24.12.3, 22.19.18, 20.19.40
25d ago · react-dom — BURST ACTIVE registry-verified
3 releases in 1m: 19.2.6, 19.1.7, 19.0.6
25d ago · react — BURST ACTIVE registry-verified
3 releases in 1m: 19.2.6, 19.1.7, 19.0.6
1mo ago · axios — BURST ACTIVE registry-verified
2 releases in 4m: 1.15.1, 0.31.1
1mo ago · react-dom — BURST historic registry-verified
3 releases in 1m: 19.2.5, 19.1.6, 19.0.5
1mo ago · react — BURST historic registry-verified
3 releases in 1m: 19.2.5, 19.1.6, 19.0.5
1mo ago · @types/node — BURST historic registry-verified
4 releases in 0m: 25.5.2, 24.12.2, 22.19.17, 20.19.39
1mo ago · @types/node — BURST historic registry-verified
4 releases in 0m: 25.5.1, 24.12.1, 22.19.16, 20.19.38
2mo ago · ts-jest — BURST historic registry-verified
3 releases in 49m: 29.4.7, 29.4.8, 29.4.9
2mo ago · axios — DELETION historic registry-verified
0.30.4 published then removed
2mo ago · axios — DELETION historic registry-verified
1.14.1 published then removed
2mo ago · axios — BURST historic registry-verified
2 releases in 39m: 1.14.1, 0.30.4
2mo ago · pydantic-core — YANK historic registry-verified
2.44.0 marked yanked (still downloadable)
2mo ago · pydantic-core — YANK historic registry-verified
2.43.0 marked yanked (still downloadable)
2mo ago · @types/node — BURST historic registry-verified
4 releases in 1m: 25.3.5, 24.11.2, 22.19.15, 20.19.37
2mo ago · @types/node — BURST historic registry-verified
4 releases in 1m: 25.3.4, 24.11.1, 22.19.14, 20.19.36
3mo ago · @types/node — BURST historic registry-verified
4 releases in 1m: 25.3.2, 24.10.15, 22.19.13, 20.19.35
3mo ago · @types/node — BURST historic registry-verified
4 releases in 1m: 25.3.1, 24.10.14, 22.19.12, 20.19.34
3mo ago · rollup — BURST historic registry-verified
2 releases in 34m: 2.80.0, 3.30.0
3mo ago · grpcio-status — YANK historic registry-verified
1.78.1 marked yanked (still downloadable)
3mo ago · @types/node — BURST historic registry-verified
3 releases in 0m: 25.2.3, 24.10.13, 22.19.11
3mo ago · setuptools — BURST historic registry-verified
2 releases in 56m: 75.3.4, 82.0.0
3mo ago · @types/node — BURST historic registry-verified
4 releases in 1m: 25.2.2, 24.10.12, 22.19.10, 20.19.33
3mo ago · @types/node — BURST historic registry-verified
4 releases in 0m: 25.2.1, 24.10.11, 22.19.9, 20.19.32
3mo ago · @types/react — BURST historic registry-verified
6 releases in 27m: 19.2.12, 18.3.28, 17.0.91, 16.14.69, 15.7.36, 19.2.13
3mo ago · @types/node — BURST historic registry-verified
3 releases in 0m: 24.10.10, 22.19.8, 20.19.31
4mo ago · react-dom — BURST historic registry-verified
3 releases in 2m: 19.2.4, 19.1.5, 19.0.4
4mo ago · react — BURST historic registry-verified
3 releases in 2m: 19.2.4, 19.1.5, 19.0.4
4mo ago · @types/node — BURST historic registry-verified
4 releases in 33m: 25.0.9, 24.10.9, 22.19.7, 20.19.30
4mo ago · @types/node — BURST historic registry-verified
4 releases in 1m: 25.0.8, 24.10.8, 22.19.6, 20.19.29
4mo ago · @types/node — BURST historic registry-verified
2 releases in 0m: 25.0.6, 24.10.7
4mo ago · @types/node — BURST historic registry-verified
7 releases in 43m: 25.0.4, 24.10.5, 22.19.4, 20.19.28, 25.0.5, 24.10.6, 22.19.5
5mo ago · numpy — YANK historic registry-verified
2.4.0 marked yanked (still downloadable)
5mo ago · @types/node — BURST historic registry-verified
4 releases in 0m: 25.0.2, 24.10.4, 22.19.3, 20.19.27
5mo ago · react-dom — BURST historic registry-verified
3 releases in 1m: 19.2.3, 19.1.4, 19.0.3
5mo ago · react — BURST historic registry-verified
3 releases in 1m: 19.2.3, 19.1.4, 19.0.3
5mo ago · react-dom — BURST historic registry-verified
3 releases in 3m: 19.2.2, 19.1.3, 19.0.2