Polished and Concise Version

  1. Regularization (Inverse Scaling)
    The SVM’s regularization parameter \(C\) controls the trade-off between error minimization and model simplicity:

    • High \(C\): Less regularization, leading to a model that closely fits the training data.
    • Low \(C\): More regularization, resulting in a simpler model that may underfit.
      An optimal value around 0.001 is suggested.
  2. Nonlinear SVMs
    Transition from Linear SVC to nonlinear SVC using various kernels. The SVC module in sklearn.svm employs the kernel trick for nonlinear transformations.

  3. Understanding SVC Parameters

    • kernel: Specifies the transformation type:
      • "linear": No transformation (similar to LinearSVC)
      • "poly": Polynomial kernel
      • "rbf": Radial Basis Function (commonly used for nonlinear classification)
      • "sigmoid": Sigmoid function
    • degree: Relevant only for the polynomial kernel; higher degrees capture more complexity but increase computation time.
    • gamma: Influences a single training example’s effect on the decision boundary:
      • "scale" (default): \(1 / (n\_features \times X.var())\)
      • "auto": \(1 / n\_features\)
        Lower values yield smoother decision boundaries.
    • probability: Enables probability estimates for classification but slows training.
    • decision_function_shape: Default is "ovr" (one-vs-rest), used for multi-class classification.
  4. Tuning the SVM Model
    Apply SVC to a digit dataset (likely sklearn.datasets.load_digits()) and experiment with different kernels and hyperparameters:

    • Compare rbf, poly, and linear kernels.
    • Test various values for \(C\), gamma, and degree.
    • Observe how training time increases with more complex kernels. ### 1. Conceptual Understanding

I use Support Vector Machines (SVMs) because they are powerful for classification, especially when the data isn’t perfectly separable. They work by finding the optimal decision boundary that maximizes the margin between classes.

The kernel trick allows me to transform data into higher dimensions without explicitly computing transformations, making it possible to classify non-linearly separable data efficiently.

For hyperparameter tuning:
- C (Regularization): A higher C minimizes misclassifications but risks overfitting; a lower C simplifies the model but may underfit.
- Gamma (RBF Kernel): Controls how much a single data point influences the decision boundary. A high gamma focuses on nearby points, while a low gamma considers more global patterns.
- Degree (Polynomial Kernel): Determines the complexity of the decision boundary. Higher degrees allow more flexibility but slow down computation and risk overfitting.

For a breakout group discussion, your professor would likely want to see a mix of conceptual understanding, experimentation, and critical analysis. Here’s how you can structure your contribution to impress them:


1. Conceptual Understanding

Answers

I use Support Vector Machines (SVMs) because they are powerful for classification, especially when the data isn’t perfectly separable. They work by finding the optimal decision boundary that maximizes the margin between classes.

The kernel trick allows me to transform data into higher dimensions without explicitly computing transformations, making it possible to classify non-linearly separable data efficiently.

For hyperparameter tuning:
- C (Regularization): A higher C minimizes misclassifications but risks overfitting; a lower C simplifies the model but may underfit.
- Gamma (RBF Kernel): Controls how much a single data point influences the decision boundary. A high gamma focuses on nearby points, while a low gamma considers more global patterns.
- Degree (Polynomial Kernel): Determines the complexity of the decision boundary. Higher degrees allow more flexibility but slow down computation and risk overfitting.


2. Experimental Setup & Visualization


3. Critical Thinking & Takeaways


Engage


group concept

explain the concepts, show key results, and ask insightful questions.

LS0tDQp0aXRsZTogIm1vZHVsZTljbGFzc2V4ZXJjaXNlYnJlYWtvdXRyb29tIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCg0KIyMjIFBvbGlzaGVkIGFuZCBDb25jaXNlIFZlcnNpb24NCg0KMS4gKipSZWd1bGFyaXphdGlvbiAoSW52ZXJzZSBTY2FsaW5nKSoqICANCiAgIFRoZSBTVk0ncyByZWd1bGFyaXphdGlvbiBwYXJhbWV0ZXIgXCggQyBcKSBjb250cm9scyB0aGUgdHJhZGUtb2ZmIGJldHdlZW4gZXJyb3IgbWluaW1pemF0aW9uIGFuZCBtb2RlbCBzaW1wbGljaXR5OiAgDQogICAtICoqSGlnaCBcKCBDIFwpKio6IExlc3MgcmVndWxhcml6YXRpb24sIGxlYWRpbmcgdG8gYSBtb2RlbCB0aGF0IGNsb3NlbHkgZml0cyB0aGUgdHJhaW5pbmcgZGF0YS4gIA0KICAgLSAqKkxvdyBcKCBDIFwpKio6IE1vcmUgcmVndWxhcml6YXRpb24sIHJlc3VsdGluZyBpbiBhIHNpbXBsZXIgbW9kZWwgdGhhdCBtYXkgdW5kZXJmaXQuICANCiAgIEFuIG9wdGltYWwgdmFsdWUgYXJvdW5kIDAuMDAxIGlzIHN1Z2dlc3RlZC4NCg0KMi4gKipOb25saW5lYXIgU1ZNcyoqICANCiAgIFRyYW5zaXRpb24gZnJvbSBMaW5lYXIgU1ZDIHRvIG5vbmxpbmVhciBTVkMgdXNpbmcgdmFyaW91cyBrZXJuZWxzLiBUaGUgYFNWQ2AgbW9kdWxlIGluIGBza2xlYXJuLnN2bWAgZW1wbG95cyB0aGUga2VybmVsIHRyaWNrIGZvciBub25saW5lYXIgdHJhbnNmb3JtYXRpb25zLg0KDQozLiAqKlVuZGVyc3RhbmRpbmcgU1ZDIFBhcmFtZXRlcnMqKiAgDQogICAtICoqa2VybmVsKio6IFNwZWNpZmllcyB0aGUgdHJhbnNmb3JtYXRpb24gdHlwZTogIA0KICAgICAtIGAibGluZWFyImA6IE5vIHRyYW5zZm9ybWF0aW9uIChzaW1pbGFyIHRvIExpbmVhclNWQykgIA0KICAgICAtIGAicG9seSJgOiBQb2x5bm9taWFsIGtlcm5lbCAgDQogICAgIC0gYCJyYmYiYDogUmFkaWFsIEJhc2lzIEZ1bmN0aW9uIChjb21tb25seSB1c2VkIGZvciBub25saW5lYXIgY2xhc3NpZmljYXRpb24pICANCiAgICAgLSBgInNpZ21vaWQiYDogU2lnbW9pZCBmdW5jdGlvbiAgDQogICAtICoqZGVncmVlKio6IFJlbGV2YW50IG9ubHkgZm9yIHRoZSBwb2x5bm9taWFsIGtlcm5lbDsgaGlnaGVyIGRlZ3JlZXMgY2FwdHVyZSBtb3JlIGNvbXBsZXhpdHkgYnV0IGluY3JlYXNlIGNvbXB1dGF0aW9uIHRpbWUuICANCiAgIC0gKipnYW1tYSoqOiBJbmZsdWVuY2VzIGEgc2luZ2xlIHRyYWluaW5nIGV4YW1wbGUncyBlZmZlY3Qgb24gdGhlIGRlY2lzaW9uIGJvdW5kYXJ5OiAgDQogICAgIC0gYCJzY2FsZSJgIChkZWZhdWx0KTogXCggMSAvIChuXF9mZWF0dXJlcyBcdGltZXMgWC52YXIoKSkgXCkgIA0KICAgICAtIGAiYXV0byJgOiBcKCAxIC8gblxfZmVhdHVyZXMgXCkgIA0KICAgICBMb3dlciB2YWx1ZXMgeWllbGQgc21vb3RoZXIgZGVjaXNpb24gYm91bmRhcmllcy4gIA0KICAgLSAqKnByb2JhYmlsaXR5Kio6IEVuYWJsZXMgcHJvYmFiaWxpdHkgZXN0aW1hdGVzIGZvciBjbGFzc2lmaWNhdGlvbiBidXQgc2xvd3MgdHJhaW5pbmcuICANCiAgIC0gKipkZWNpc2lvbl9mdW5jdGlvbl9zaGFwZSoqOiBEZWZhdWx0IGlzIGAib3ZyImAgKG9uZS12cy1yZXN0KSwgdXNlZCBmb3IgbXVsdGktY2xhc3MgY2xhc3NpZmljYXRpb24uDQoNCjQuICoqVHVuaW5nIHRoZSBTVk0gTW9kZWwqKiAgDQogICBBcHBseSBgU1ZDYCB0byBhIGRpZ2l0IGRhdGFzZXQgKGxpa2VseSBgc2tsZWFybi5kYXRhc2V0cy5sb2FkX2RpZ2l0cygpYCkgYW5kIGV4cGVyaW1lbnQgd2l0aCBkaWZmZXJlbnQga2VybmVscyBhbmQgaHlwZXJwYXJhbWV0ZXJzOiAgDQogICAtIENvbXBhcmUgYHJiZmAsIGBwb2x5YCwgYW5kIGBsaW5lYXJgIGtlcm5lbHMuICANCiAgIC0gVGVzdCB2YXJpb3VzIHZhbHVlcyBmb3IgXCggQyBcKSwgZ2FtbWEsIGFuZCBkZWdyZWUuICANCiAgIC0gT2JzZXJ2ZSBob3cgdHJhaW5pbmcgdGltZSBpbmNyZWFzZXMgd2l0aCBtb3JlIGNvbXBsZXgga2VybmVscy4NCiMjIyAqKjEuIENvbmNlcHR1YWwgVW5kZXJzdGFuZGluZyoqICANCg0KSSB1c2UgKipTdXBwb3J0IFZlY3RvciBNYWNoaW5lcyAoU1ZNcykqKiBiZWNhdXNlIHRoZXkgYXJlIHBvd2VyZnVsIGZvciBjbGFzc2lmaWNhdGlvbiwgZXNwZWNpYWxseSB3aGVuIHRoZSBkYXRhIGlzbid0IHBlcmZlY3RseSBzZXBhcmFibGUuIFRoZXkgd29yayBieSBmaW5kaW5nIHRoZSBvcHRpbWFsIGRlY2lzaW9uIGJvdW5kYXJ5IHRoYXQgbWF4aW1pemVzIHRoZSBtYXJnaW4gYmV0d2VlbiBjbGFzc2VzLiAgDQoNClRoZSAqKmtlcm5lbCB0cmljayoqIGFsbG93cyBtZSB0byB0cmFuc2Zvcm0gZGF0YSBpbnRvIGhpZ2hlciBkaW1lbnNpb25zIHdpdGhvdXQgZXhwbGljaXRseSBjb21wdXRpbmcgdHJhbnNmb3JtYXRpb25zLCBtYWtpbmcgaXQgcG9zc2libGUgdG8gY2xhc3NpZnkgbm9uLWxpbmVhcmx5IHNlcGFyYWJsZSBkYXRhIGVmZmljaWVudGx5LiAgDQoNCi0gKipMaW5lYXIgU1ZNKio6IFdvcmtzIGJlc3Qgd2hlbiBkYXRhIGlzIGxpbmVhcmx5IHNlcGFyYWJsZTsgZmFzdCBhbmQgaW50ZXJwcmV0YWJsZS4gIA0KLSAqKlBvbHlub21pYWwgU1ZNKio6IENhcHR1cmVzIGZlYXR1cmUgaW50ZXJhY3Rpb25zLCBidXQgdGhlIGRlZ3JlZSBtdXN0IGJlIHR1bmVkIGNhcmVmdWxseSB0byBhdm9pZCBvdmVyZml0dGluZy4gIA0KLSAqKlJCRiBTVk0qKjogQWRhcHRzIHdlbGwgdG8gY29tcGxleCBwYXR0ZXJucyBieSBtYXBwaW5nIGRhdGEgaW50byBhbiBpbmZpbml0ZS1kaW1lbnNpb25hbCBzcGFjZSwgbWFraW5nIGl0IGhpZ2hseSBmbGV4aWJsZS4gIA0KDQpGb3IgKipoeXBlcnBhcmFtZXRlciB0dW5pbmcqKjogIA0KLSAqKkMgKFJlZ3VsYXJpemF0aW9uKSoqOiBBIGhpZ2hlciBDIG1pbmltaXplcyBtaXNjbGFzc2lmaWNhdGlvbnMgYnV0IHJpc2tzIG92ZXJmaXR0aW5nOyBhIGxvd2VyIEMgc2ltcGxpZmllcyB0aGUgbW9kZWwgYnV0IG1heSB1bmRlcmZpdC4gIA0KLSAqKkdhbW1hIChSQkYgS2VybmVsKSoqOiBDb250cm9scyBob3cgbXVjaCBhIHNpbmdsZSBkYXRhIHBvaW50IGluZmx1ZW5jZXMgdGhlIGRlY2lzaW9uIGJvdW5kYXJ5LiBBIGhpZ2ggZ2FtbWEgZm9jdXNlcyBvbiBuZWFyYnkgcG9pbnRzLCB3aGlsZSBhIGxvdyBnYW1tYSBjb25zaWRlcnMgbW9yZSBnbG9iYWwgcGF0dGVybnMuICANCi0gKipEZWdyZWUgKFBvbHlub21pYWwgS2VybmVsKSoqOiBEZXRlcm1pbmVzIHRoZSBjb21wbGV4aXR5IG9mIHRoZSBkZWNpc2lvbiBib3VuZGFyeS4gSGlnaGVyIGRlZ3JlZXMgYWxsb3cgbW9yZSBmbGV4aWJpbGl0eSBidXQgc2xvdyBkb3duIGNvbXB1dGF0aW9uIGFuZCByaXNrIG92ZXJmaXR0aW5nLg0KDQoNCkZvciBhICoqYnJlYWtvdXQgZ3JvdXAgZGlzY3Vzc2lvbioqLCB5b3VyIHByb2Zlc3NvciB3b3VsZCBsaWtlbHkgd2FudCB0byBzZWUgYSBtaXggb2YgKipjb25jZXB0dWFsIHVuZGVyc3RhbmRpbmcsIGV4cGVyaW1lbnRhdGlvbiwgYW5kIGNyaXRpY2FsIGFuYWx5c2lzKiouIEhlcmXigJlzIGhvdyB5b3UgY2FuIHN0cnVjdHVyZSB5b3VyIGNvbnRyaWJ1dGlvbiB0byBpbXByZXNzIHRoZW06DQoNCi0tLQ0KDQojIyMgKioxLiBDb25jZXB0dWFsIFVuZGVyc3RhbmRpbmcqKg0KLSAqKkV4cGxhaW4gdGhlIFJvbGUgb2YgU1ZNIGFuZCBLZXJuZWxzKioNCiAgLSBXaHkgdXNlICoqU3VwcG9ydCBWZWN0b3IgTWFjaGluZXMgKFNWTXMpKio/DQogIC0gSG93IGRvZXMgdGhlICoqa2VybmVsIHRyaWNrKiogaGVscCBpbiBoaWdoZXItZGltZW5zaW9uYWwgZmVhdHVyZSBzcGFjZXM/DQogIC0gV2hhdCBpcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuICoqTGluZWFyIFNWTSwgUG9seW5vbWlhbCBTVk0sIGFuZCBSQkYgU1ZNKio/DQoNCg0KIyMjICoqQW5zd2VycyoqICANCg0KSSB1c2UgKipTdXBwb3J0IFZlY3RvciBNYWNoaW5lcyAoU1ZNcykqKiBiZWNhdXNlIHRoZXkgYXJlIHBvd2VyZnVsIGZvciBjbGFzc2lmaWNhdGlvbiwgZXNwZWNpYWxseSB3aGVuIHRoZSBkYXRhIGlzbid0IHBlcmZlY3RseSBzZXBhcmFibGUuIFRoZXkgd29yayBieSBmaW5kaW5nIHRoZSBvcHRpbWFsIGRlY2lzaW9uIGJvdW5kYXJ5IHRoYXQgbWF4aW1pemVzIHRoZSBtYXJnaW4gYmV0d2VlbiBjbGFzc2VzLiAgDQoNClRoZSAqKmtlcm5lbCB0cmljayoqIGFsbG93cyBtZSB0byB0cmFuc2Zvcm0gZGF0YSBpbnRvIGhpZ2hlciBkaW1lbnNpb25zIHdpdGhvdXQgZXhwbGljaXRseSBjb21wdXRpbmcgdHJhbnNmb3JtYXRpb25zLCBtYWtpbmcgaXQgcG9zc2libGUgdG8gY2xhc3NpZnkgbm9uLWxpbmVhcmx5IHNlcGFyYWJsZSBkYXRhIGVmZmljaWVudGx5LiAgDQoNCi0gKipMaW5lYXIgU1ZNKio6IFdvcmtzIGJlc3Qgd2hlbiBkYXRhIGlzIGxpbmVhcmx5IHNlcGFyYWJsZTsgZmFzdCBhbmQgaW50ZXJwcmV0YWJsZS4gIA0KLSAqKlBvbHlub21pYWwgU1ZNKio6IENhcHR1cmVzIGZlYXR1cmUgaW50ZXJhY3Rpb25zLCBidXQgdGhlIGRlZ3JlZSBtdXN0IGJlIHR1bmVkIGNhcmVmdWxseSB0byBhdm9pZCBvdmVyZml0dGluZy4gIA0KLSAqKlJCRiBTVk0qKjogQWRhcHRzIHdlbGwgdG8gY29tcGxleCBwYXR0ZXJucyBieSBtYXBwaW5nIGRhdGEgaW50byBhbiBpbmZpbml0ZS1kaW1lbnNpb25hbCBzcGFjZSwgbWFraW5nIGl0IGhpZ2hseSBmbGV4aWJsZS4gIA0KDQpGb3IgKipoeXBlcnBhcmFtZXRlciB0dW5pbmcqKjogIA0KLSAqKkMgKFJlZ3VsYXJpemF0aW9uKSoqOiBBIGhpZ2hlciBDIG1pbmltaXplcyBtaXNjbGFzc2lmaWNhdGlvbnMgYnV0IHJpc2tzIG92ZXJmaXR0aW5nOyBhIGxvd2VyIEMgc2ltcGxpZmllcyB0aGUgbW9kZWwgYnV0IG1heSB1bmRlcmZpdC4gIA0KLSAqKkdhbW1hIChSQkYgS2VybmVsKSoqOiBDb250cm9scyBob3cgbXVjaCBhIHNpbmdsZSBkYXRhIHBvaW50IGluZmx1ZW5jZXMgdGhlIGRlY2lzaW9uIGJvdW5kYXJ5LiBBIGhpZ2ggZ2FtbWEgZm9jdXNlcyBvbiBuZWFyYnkgcG9pbnRzLCB3aGlsZSBhIGxvdyBnYW1tYSBjb25zaWRlcnMgbW9yZSBnbG9iYWwgcGF0dGVybnMuICANCi0gKipEZWdyZWUgKFBvbHlub21pYWwgS2VybmVsKSoqOiBEZXRlcm1pbmVzIHRoZSBjb21wbGV4aXR5IG9mIHRoZSBkZWNpc2lvbiBib3VuZGFyeS4gSGlnaGVyIGRlZ3JlZXMgYWxsb3cgbW9yZSBmbGV4aWJpbGl0eSBidXQgc2xvdyBkb3duIGNvbXB1dGF0aW9uIGFuZCByaXNrIG92ZXJmaXR0aW5nLg0KDQotICoqUmVndWxhcml6YXRpb24gKEMpIGFuZCBIeXBlcnBhcmFtZXRlciBUdW5pbmcqKg0KICAtIEhvdyBkb2VzICoqQyoqIGltcGFjdCBkZWNpc2lvbiBib3VuZGFyaWVzPw0KICAtIFdoeSBkb2VzICoqZ2FtbWEqKiBpbiB0aGUgUkJGIGtlcm5lbCBhZmZlY3QgY2xhc3NpZmljYXRpb24gcGVyZm9ybWFuY2U/DQogIC0gSG93IGRvZXMgcG9seW5vbWlhbCAqKmRlZ3JlZSoqIGltcGFjdCBjb21wbGV4aXR5Pw0KDQotLS0NCg0KIyMjICoqMi4gRXhwZXJpbWVudGFsIFNldHVwICYgVmlzdWFsaXphdGlvbioqDQotICoqU2hvdyB0aGUgQWNjdXJhY3kgQ29tcGFyaXNvbnMqKg0KICAtIFByZXNlbnQgdGhlICoqYmFyIGNoYXJ0KiogdmlzdWFsaXphdGlvbiBvZiBrZXJuZWwgcGVyZm9ybWFuY2VzLg0KICAtIEV4cGxhaW4gd2h5IFJCRiBwZXJmb3JtZWQgYmVzdCwgd2hpbGUgbGluZWFyIHdhcyBzdGlsbCBjb21wZXRpdGl2ZS4NCg0KLSAqKkV4cGxhaW4gdGhlIFNjYWxpbmcgSW1wYWN0KioNCiAgLSBXaHkgZGlkIGZlYXR1cmUgc2NhbGluZyAqKihTdGFuZGFyZFNjYWxlcikqKiBkcmFzdGljYWxseSBpbXByb3ZlIFBvbHlub21pYWwgYW5kIFJCRiBwZXJmb3JtYW5jZT8NCiAgLSBXaGF0IGhhcHBlbnMgaWYgd2UgZG9u4oCZdCBzY2FsZT8NCg0KLSAqKkRlbW9uc3RyYXRlIEh5cGVycGFyYW1ldGVyIFR1bmluZyoqDQogIC0gU2hhcmUgaG93IHR3ZWFraW5nIGBkZWdyZWVgIGluIHBvbHlub21pYWwgYW5kIGBnYW1tYWAgaW4gUkJGIGFmZmVjdHMgcGVyZm9ybWFuY2UuDQogIC0gU2hvdyBhICoqZ3JpZCBzZWFyY2gqKiBleGFtcGxlIGlmIHBvc3NpYmxlLg0KDQotLS0NCg0KIyMjICoqMy4gQ3JpdGljYWwgVGhpbmtpbmcgJiBUYWtlYXdheXMqKg0KLSAqKldoeSBkaWQgUkJGIG91dHBlcmZvcm0gTGluZWFyIFNWTT8qKg0KICAtIFRoZSBkYXRhc2V0IGhhcyBzb21lICoqbm9uLWxpbmVhciByZWxhdGlvbnNoaXBzKiosIHdoaWNoIFJCRiBjYXB0dXJlcyBiZXR0ZXIuDQogIC0gQnV0ICoqTGluZWFyIFNWTSBpcyBuZWFybHkgYXMgZ29vZCoqLCBtZWFuaW5nIHRoZSBkYXRhc2V0IGlzICoqbW9zdGx5IGxpbmVhcmx5IHNlcGFyYWJsZSoqLg0KDQotICoqV2hlbiBXb3VsZCBFYWNoIEtlcm5lbCBCZSBVc2VmdWw/KioNCiAgLSAqKlVzZSBMaW5lYXIqKiB3aGVuIGRhdGEgaXMgd2VsbC1zZXBhcmF0ZWQgYW5kIHNwZWVkIGlzIGEgcHJpb3JpdHkuDQogIC0gKipVc2UgUG9seW5vbWlhbCoqIHdoZW4gaW50ZXJhY3Rpb25zIGV4aXN0LCBidXQgb25seSB1cCB0byBhIGxpbWl0ZWQgZGVncmVlLg0KICAtICoqVXNlIFJCRioqIHdoZW4gcmVsYXRpb25zaGlwcyBhcmUgY29tcGxleCBhbmQgcmVxdWlyZSBmbGV4aWJsZSBkZWNpc2lvbiBib3VuZGFyaWVzLg0KDQotICoqQ2hhbGxlbmdlcyAmIE5leHQgU3RlcHMqKg0KICAtIFdvdWxkIGFkZGluZyAqKm1vcmUgZmVhdHVyZXMqKiBtYWtlIFJCRiBldmVuIHN0cm9uZ2VyPw0KICAtIENvdWxkICoqZGltZW5zaW9uYWxpdHkgcmVkdWN0aW9uIChQQ0EpKiogaW1wcm92ZSBydW50aW1lIHdpdGhvdXQgbG9zaW5nIGFjY3VyYWN5Pw0KDQotLS0NCg0KIyMjICoqRW5nYWdlKioNCi0gKipQb3NlIE9wZW4tRW5kZWQgUXVlc3Rpb25zOioqDQogIC0gV2h5IGRvIHlvdSB0aGluayBQb2x5bm9taWFsIHdhcyBpbml0aWFsbHkgc28gYmFkIGJlZm9yZSB0dW5pbmc/DQogIC0gSWYgUkJGIGlzIHRoZSBiZXN0LCB3aHkgbm90IGFsd2F5cyB1c2UgaXQ/DQogIC0gV2hhdCB3b3VsZCBoYXBwZW4gaWYgd2UgYWRkZWQgbW9yZSBub2lzZSB0byB0aGUgZGF0YXNldD8NCg0KLSAqKkhhbmRzLU9uIEFjdGl2aXR5OioqDQogIC0gQXNzaWduIHNtYWxsIGdyb3VwcyB0byB0d2VhayBvbmUgaHlwZXJwYXJhbWV0ZXIgKGBDYCwgYGdhbW1hYCwgb3IgYGRlZ3JlZWApIGFuZCByZXBvcnQgYmFjay4NCiAgLSBDb21wYXJlIHJlc3VsdHMgbGl2ZS4NCg0KLS0tDQoNCiMjIyAqKmdyb3VwIGNvbmNlcHQqKg0KZXhwbGFpbiB0aGUgKipjb25jZXB0cyoqLCBzaG93ICoqa2V5IHJlc3VsdHMqKiwgYW5kIGFzayAqKmluc2lnaHRmdWwgcXVlc3Rpb25zKiouIA==