Polished and Concise Version
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.
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.
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.
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.
- Linear SVM: Works best when data is linearly
separable; fast and interpretable.
- Polynomial SVM: Captures feature interactions, but
the degree must be tuned carefully to avoid overfitting.
- RBF SVM: Adapts well to complex patterns by mapping
data into an infinite-dimensional space, making it highly flexible.
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
- Explain the Role of SVM and Kernels
- Why use Support Vector Machines (SVMs)?
- How does the kernel trick help in
higher-dimensional feature spaces?
- What is the difference between Linear SVM, Polynomial SVM,
and RBF SVM?
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.
- Linear SVM: Works best when data is linearly
separable; fast and interpretable.
- Polynomial SVM: Captures feature interactions, but
the degree must be tuned carefully to avoid overfitting.
- RBF SVM: Adapts well to complex patterns by mapping
data into an infinite-dimensional space, making it highly flexible.
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.
- Regularization (C) and Hyperparameter Tuning
- How does C impact decision boundaries?
- Why does gamma in the RBF kernel affect
classification performance?
- How does polynomial degree impact complexity?
2. Experimental Setup & Visualization
- Show the Accuracy Comparisons
- Present the bar chart visualization of kernel
performances.
- Explain why RBF performed best, while linear was still
competitive.
- Explain the Scaling Impact
- Why did feature scaling (StandardScaler)
drastically improve Polynomial and RBF performance?
- What happens if we don’t scale?
- Demonstrate Hyperparameter Tuning
- Share how tweaking
degree
in polynomial and
gamma
in RBF affects performance.
- Show a grid search example if possible.
3. Critical Thinking & Takeaways
- Why did RBF outperform Linear SVM?
- The dataset has some non-linear relationships,
which RBF captures better.
- But Linear SVM is nearly as good, meaning the
dataset is mostly linearly separable.
- When Would Each Kernel Be Useful?
- Use Linear when data is well-separated and speed is
a priority.
- Use Polynomial when interactions exist, but only up
to a limited degree.
- Use RBF when relationships are complex and require
flexible decision boundaries.
- Challenges & Next Steps
- Would adding more features make RBF even
stronger?
- Could dimensionality reduction (PCA) improve
runtime without losing accuracy?
Engage
- Pose Open-Ended Questions:
- Why do you think Polynomial was initially so bad before tuning?
- If RBF is the best, why not always use it?
- What would happen if we added more noise to the dataset?
- Hands-On Activity:
- Assign small groups to tweak one hyperparameter (
C
,
gamma
, or degree
) and report back.
- Compare results live.
group concept
explain the concepts, show key
results, and ask insightful questions.
LS0tDQp0aXRsZTogIm1vZHVsZTljbGFzc2V4ZXJjaXNlYnJlYWtvdXRyb29tIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCg0KIyMjIFBvbGlzaGVkIGFuZCBDb25jaXNlIFZlcnNpb24NCg0KMS4gKipSZWd1bGFyaXphdGlvbiAoSW52ZXJzZSBTY2FsaW5nKSoqICANCiAgIFRoZSBTVk0ncyByZWd1bGFyaXphdGlvbiBwYXJhbWV0ZXIgXCggQyBcKSBjb250cm9scyB0aGUgdHJhZGUtb2ZmIGJldHdlZW4gZXJyb3IgbWluaW1pemF0aW9uIGFuZCBtb2RlbCBzaW1wbGljaXR5OiAgDQogICAtICoqSGlnaCBcKCBDIFwpKio6IExlc3MgcmVndWxhcml6YXRpb24sIGxlYWRpbmcgdG8gYSBtb2RlbCB0aGF0IGNsb3NlbHkgZml0cyB0aGUgdHJhaW5pbmcgZGF0YS4gIA0KICAgLSAqKkxvdyBcKCBDIFwpKio6IE1vcmUgcmVndWxhcml6YXRpb24sIHJlc3VsdGluZyBpbiBhIHNpbXBsZXIgbW9kZWwgdGhhdCBtYXkgdW5kZXJmaXQuICANCiAgIEFuIG9wdGltYWwgdmFsdWUgYXJvdW5kIDAuMDAxIGlzIHN1Z2dlc3RlZC4NCg0KMi4gKipOb25saW5lYXIgU1ZNcyoqICANCiAgIFRyYW5zaXRpb24gZnJvbSBMaW5lYXIgU1ZDIHRvIG5vbmxpbmVhciBTVkMgdXNpbmcgdmFyaW91cyBrZXJuZWxzLiBUaGUgYFNWQ2AgbW9kdWxlIGluIGBza2xlYXJuLnN2bWAgZW1wbG95cyB0aGUga2VybmVsIHRyaWNrIGZvciBub25saW5lYXIgdHJhbnNmb3JtYXRpb25zLg0KDQozLiAqKlVuZGVyc3RhbmRpbmcgU1ZDIFBhcmFtZXRlcnMqKiAgDQogICAtICoqa2VybmVsKio6IFNwZWNpZmllcyB0aGUgdHJhbnNmb3JtYXRpb24gdHlwZTogIA0KICAgICAtIGAibGluZWFyImA6IE5vIHRyYW5zZm9ybWF0aW9uIChzaW1pbGFyIHRvIExpbmVhclNWQykgIA0KICAgICAtIGAicG9seSJgOiBQb2x5bm9taWFsIGtlcm5lbCAgDQogICAgIC0gYCJyYmYiYDogUmFkaWFsIEJhc2lzIEZ1bmN0aW9uIChjb21tb25seSB1c2VkIGZvciBub25saW5lYXIgY2xhc3NpZmljYXRpb24pICANCiAgICAgLSBgInNpZ21vaWQiYDogU2lnbW9pZCBmdW5jdGlvbiAgDQogICAtICoqZGVncmVlKio6IFJlbGV2YW50IG9ubHkgZm9yIHRoZSBwb2x5bm9taWFsIGtlcm5lbDsgaGlnaGVyIGRlZ3JlZXMgY2FwdHVyZSBtb3JlIGNvbXBsZXhpdHkgYnV0IGluY3JlYXNlIGNvbXB1dGF0aW9uIHRpbWUuICANCiAgIC0gKipnYW1tYSoqOiBJbmZsdWVuY2VzIGEgc2luZ2xlIHRyYWluaW5nIGV4YW1wbGUncyBlZmZlY3Qgb24gdGhlIGRlY2lzaW9uIGJvdW5kYXJ5OiAgDQogICAgIC0gYCJzY2FsZSJgIChkZWZhdWx0KTogXCggMSAvIChuXF9mZWF0dXJlcyBcdGltZXMgWC52YXIoKSkgXCkgIA0KICAgICAtIGAiYXV0byJgOiBcKCAxIC8gblxfZmVhdHVyZXMgXCkgIA0KICAgICBMb3dlciB2YWx1ZXMgeWllbGQgc21vb3RoZXIgZGVjaXNpb24gYm91bmRhcmllcy4gIA0KICAgLSAqKnByb2JhYmlsaXR5Kio6IEVuYWJsZXMgcHJvYmFiaWxpdHkgZXN0aW1hdGVzIGZvciBjbGFzc2lmaWNhdGlvbiBidXQgc2xvd3MgdHJhaW5pbmcuICANCiAgIC0gKipkZWNpc2lvbl9mdW5jdGlvbl9zaGFwZSoqOiBEZWZhdWx0IGlzIGAib3ZyImAgKG9uZS12cy1yZXN0KSwgdXNlZCBmb3IgbXVsdGktY2xhc3MgY2xhc3NpZmljYXRpb24uDQoNCjQuICoqVHVuaW5nIHRoZSBTVk0gTW9kZWwqKiAgDQogICBBcHBseSBgU1ZDYCB0byBhIGRpZ2l0IGRhdGFzZXQgKGxpa2VseSBgc2tsZWFybi5kYXRhc2V0cy5sb2FkX2RpZ2l0cygpYCkgYW5kIGV4cGVyaW1lbnQgd2l0aCBkaWZmZXJlbnQga2VybmVscyBhbmQgaHlwZXJwYXJhbWV0ZXJzOiAgDQogICAtIENvbXBhcmUgYHJiZmAsIGBwb2x5YCwgYW5kIGBsaW5lYXJgIGtlcm5lbHMuICANCiAgIC0gVGVzdCB2YXJpb3VzIHZhbHVlcyBmb3IgXCggQyBcKSwgZ2FtbWEsIGFuZCBkZWdyZWUuICANCiAgIC0gT2JzZXJ2ZSBob3cgdHJhaW5pbmcgdGltZSBpbmNyZWFzZXMgd2l0aCBtb3JlIGNvbXBsZXgga2VybmVscy4NCiMjIyAqKjEuIENvbmNlcHR1YWwgVW5kZXJzdGFuZGluZyoqICANCg0KSSB1c2UgKipTdXBwb3J0IFZlY3RvciBNYWNoaW5lcyAoU1ZNcykqKiBiZWNhdXNlIHRoZXkgYXJlIHBvd2VyZnVsIGZvciBjbGFzc2lmaWNhdGlvbiwgZXNwZWNpYWxseSB3aGVuIHRoZSBkYXRhIGlzbid0IHBlcmZlY3RseSBzZXBhcmFibGUuIFRoZXkgd29yayBieSBmaW5kaW5nIHRoZSBvcHRpbWFsIGRlY2lzaW9uIGJvdW5kYXJ5IHRoYXQgbWF4aW1pemVzIHRoZSBtYXJnaW4gYmV0d2VlbiBjbGFzc2VzLiAgDQoNClRoZSAqKmtlcm5lbCB0cmljayoqIGFsbG93cyBtZSB0byB0cmFuc2Zvcm0gZGF0YSBpbnRvIGhpZ2hlciBkaW1lbnNpb25zIHdpdGhvdXQgZXhwbGljaXRseSBjb21wdXRpbmcgdHJhbnNmb3JtYXRpb25zLCBtYWtpbmcgaXQgcG9zc2libGUgdG8gY2xhc3NpZnkgbm9uLWxpbmVhcmx5IHNlcGFyYWJsZSBkYXRhIGVmZmljaWVudGx5LiAgDQoNCi0gKipMaW5lYXIgU1ZNKio6IFdvcmtzIGJlc3Qgd2hlbiBkYXRhIGlzIGxpbmVhcmx5IHNlcGFyYWJsZTsgZmFzdCBhbmQgaW50ZXJwcmV0YWJsZS4gIA0KLSAqKlBvbHlub21pYWwgU1ZNKio6IENhcHR1cmVzIGZlYXR1cmUgaW50ZXJhY3Rpb25zLCBidXQgdGhlIGRlZ3JlZSBtdXN0IGJlIHR1bmVkIGNhcmVmdWxseSB0byBhdm9pZCBvdmVyZml0dGluZy4gIA0KLSAqKlJCRiBTVk0qKjogQWRhcHRzIHdlbGwgdG8gY29tcGxleCBwYXR0ZXJucyBieSBtYXBwaW5nIGRhdGEgaW50byBhbiBpbmZpbml0ZS1kaW1lbnNpb25hbCBzcGFjZSwgbWFraW5nIGl0IGhpZ2hseSBmbGV4aWJsZS4gIA0KDQpGb3IgKipoeXBlcnBhcmFtZXRlciB0dW5pbmcqKjogIA0KLSAqKkMgKFJlZ3VsYXJpemF0aW9uKSoqOiBBIGhpZ2hlciBDIG1pbmltaXplcyBtaXNjbGFzc2lmaWNhdGlvbnMgYnV0IHJpc2tzIG92ZXJmaXR0aW5nOyBhIGxvd2VyIEMgc2ltcGxpZmllcyB0aGUgbW9kZWwgYnV0IG1heSB1bmRlcmZpdC4gIA0KLSAqKkdhbW1hIChSQkYgS2VybmVsKSoqOiBDb250cm9scyBob3cgbXVjaCBhIHNpbmdsZSBkYXRhIHBvaW50IGluZmx1ZW5jZXMgdGhlIGRlY2lzaW9uIGJvdW5kYXJ5LiBBIGhpZ2ggZ2FtbWEgZm9jdXNlcyBvbiBuZWFyYnkgcG9pbnRzLCB3aGlsZSBhIGxvdyBnYW1tYSBjb25zaWRlcnMgbW9yZSBnbG9iYWwgcGF0dGVybnMuICANCi0gKipEZWdyZWUgKFBvbHlub21pYWwgS2VybmVsKSoqOiBEZXRlcm1pbmVzIHRoZSBjb21wbGV4aXR5IG9mIHRoZSBkZWNpc2lvbiBib3VuZGFyeS4gSGlnaGVyIGRlZ3JlZXMgYWxsb3cgbW9yZSBmbGV4aWJpbGl0eSBidXQgc2xvdyBkb3duIGNvbXB1dGF0aW9uIGFuZCByaXNrIG92ZXJmaXR0aW5nLg0KDQoNCkZvciBhICoqYnJlYWtvdXQgZ3JvdXAgZGlzY3Vzc2lvbioqLCB5b3VyIHByb2Zlc3NvciB3b3VsZCBsaWtlbHkgd2FudCB0byBzZWUgYSBtaXggb2YgKipjb25jZXB0dWFsIHVuZGVyc3RhbmRpbmcsIGV4cGVyaW1lbnRhdGlvbiwgYW5kIGNyaXRpY2FsIGFuYWx5c2lzKiouIEhlcmXigJlzIGhvdyB5b3UgY2FuIHN0cnVjdHVyZSB5b3VyIGNvbnRyaWJ1dGlvbiB0byBpbXByZXNzIHRoZW06DQoNCi0tLQ0KDQojIyMgKioxLiBDb25jZXB0dWFsIFVuZGVyc3RhbmRpbmcqKg0KLSAqKkV4cGxhaW4gdGhlIFJvbGUgb2YgU1ZNIGFuZCBLZXJuZWxzKioNCiAgLSBXaHkgdXNlICoqU3VwcG9ydCBWZWN0b3IgTWFjaGluZXMgKFNWTXMpKio/DQogIC0gSG93IGRvZXMgdGhlICoqa2VybmVsIHRyaWNrKiogaGVscCBpbiBoaWdoZXItZGltZW5zaW9uYWwgZmVhdHVyZSBzcGFjZXM/DQogIC0gV2hhdCBpcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuICoqTGluZWFyIFNWTSwgUG9seW5vbWlhbCBTVk0sIGFuZCBSQkYgU1ZNKio/DQoNCg0KIyMjICoqQW5zd2VycyoqICANCg0KSSB1c2UgKipTdXBwb3J0IFZlY3RvciBNYWNoaW5lcyAoU1ZNcykqKiBiZWNhdXNlIHRoZXkgYXJlIHBvd2VyZnVsIGZvciBjbGFzc2lmaWNhdGlvbiwgZXNwZWNpYWxseSB3aGVuIHRoZSBkYXRhIGlzbid0IHBlcmZlY3RseSBzZXBhcmFibGUuIFRoZXkgd29yayBieSBmaW5kaW5nIHRoZSBvcHRpbWFsIGRlY2lzaW9uIGJvdW5kYXJ5IHRoYXQgbWF4aW1pemVzIHRoZSBtYXJnaW4gYmV0d2VlbiBjbGFzc2VzLiAgDQoNClRoZSAqKmtlcm5lbCB0cmljayoqIGFsbG93cyBtZSB0byB0cmFuc2Zvcm0gZGF0YSBpbnRvIGhpZ2hlciBkaW1lbnNpb25zIHdpdGhvdXQgZXhwbGljaXRseSBjb21wdXRpbmcgdHJhbnNmb3JtYXRpb25zLCBtYWtpbmcgaXQgcG9zc2libGUgdG8gY2xhc3NpZnkgbm9uLWxpbmVhcmx5IHNlcGFyYWJsZSBkYXRhIGVmZmljaWVudGx5LiAgDQoNCi0gKipMaW5lYXIgU1ZNKio6IFdvcmtzIGJlc3Qgd2hlbiBkYXRhIGlzIGxpbmVhcmx5IHNlcGFyYWJsZTsgZmFzdCBhbmQgaW50ZXJwcmV0YWJsZS4gIA0KLSAqKlBvbHlub21pYWwgU1ZNKio6IENhcHR1cmVzIGZlYXR1cmUgaW50ZXJhY3Rpb25zLCBidXQgdGhlIGRlZ3JlZSBtdXN0IGJlIHR1bmVkIGNhcmVmdWxseSB0byBhdm9pZCBvdmVyZml0dGluZy4gIA0KLSAqKlJCRiBTVk0qKjogQWRhcHRzIHdlbGwgdG8gY29tcGxleCBwYXR0ZXJucyBieSBtYXBwaW5nIGRhdGEgaW50byBhbiBpbmZpbml0ZS1kaW1lbnNpb25hbCBzcGFjZSwgbWFraW5nIGl0IGhpZ2hseSBmbGV4aWJsZS4gIA0KDQpGb3IgKipoeXBlcnBhcmFtZXRlciB0dW5pbmcqKjogIA0KLSAqKkMgKFJlZ3VsYXJpemF0aW9uKSoqOiBBIGhpZ2hlciBDIG1pbmltaXplcyBtaXNjbGFzc2lmaWNhdGlvbnMgYnV0IHJpc2tzIG92ZXJmaXR0aW5nOyBhIGxvd2VyIEMgc2ltcGxpZmllcyB0aGUgbW9kZWwgYnV0IG1heSB1bmRlcmZpdC4gIA0KLSAqKkdhbW1hIChSQkYgS2VybmVsKSoqOiBDb250cm9scyBob3cgbXVjaCBhIHNpbmdsZSBkYXRhIHBvaW50IGluZmx1ZW5jZXMgdGhlIGRlY2lzaW9uIGJvdW5kYXJ5LiBBIGhpZ2ggZ2FtbWEgZm9jdXNlcyBvbiBuZWFyYnkgcG9pbnRzLCB3aGlsZSBhIGxvdyBnYW1tYSBjb25zaWRlcnMgbW9yZSBnbG9iYWwgcGF0dGVybnMuICANCi0gKipEZWdyZWUgKFBvbHlub21pYWwgS2VybmVsKSoqOiBEZXRlcm1pbmVzIHRoZSBjb21wbGV4aXR5IG9mIHRoZSBkZWNpc2lvbiBib3VuZGFyeS4gSGlnaGVyIGRlZ3JlZXMgYWxsb3cgbW9yZSBmbGV4aWJpbGl0eSBidXQgc2xvdyBkb3duIGNvbXB1dGF0aW9uIGFuZCByaXNrIG92ZXJmaXR0aW5nLg0KDQotICoqUmVndWxhcml6YXRpb24gKEMpIGFuZCBIeXBlcnBhcmFtZXRlciBUdW5pbmcqKg0KICAtIEhvdyBkb2VzICoqQyoqIGltcGFjdCBkZWNpc2lvbiBib3VuZGFyaWVzPw0KICAtIFdoeSBkb2VzICoqZ2FtbWEqKiBpbiB0aGUgUkJGIGtlcm5lbCBhZmZlY3QgY2xhc3NpZmljYXRpb24gcGVyZm9ybWFuY2U/DQogIC0gSG93IGRvZXMgcG9seW5vbWlhbCAqKmRlZ3JlZSoqIGltcGFjdCBjb21wbGV4aXR5Pw0KDQotLS0NCg0KIyMjICoqMi4gRXhwZXJpbWVudGFsIFNldHVwICYgVmlzdWFsaXphdGlvbioqDQotICoqU2hvdyB0aGUgQWNjdXJhY3kgQ29tcGFyaXNvbnMqKg0KICAtIFByZXNlbnQgdGhlICoqYmFyIGNoYXJ0KiogdmlzdWFsaXphdGlvbiBvZiBrZXJuZWwgcGVyZm9ybWFuY2VzLg0KICAtIEV4cGxhaW4gd2h5IFJCRiBwZXJmb3JtZWQgYmVzdCwgd2hpbGUgbGluZWFyIHdhcyBzdGlsbCBjb21wZXRpdGl2ZS4NCg0KLSAqKkV4cGxhaW4gdGhlIFNjYWxpbmcgSW1wYWN0KioNCiAgLSBXaHkgZGlkIGZlYXR1cmUgc2NhbGluZyAqKihTdGFuZGFyZFNjYWxlcikqKiBkcmFzdGljYWxseSBpbXByb3ZlIFBvbHlub21pYWwgYW5kIFJCRiBwZXJmb3JtYW5jZT8NCiAgLSBXaGF0IGhhcHBlbnMgaWYgd2UgZG9u4oCZdCBzY2FsZT8NCg0KLSAqKkRlbW9uc3RyYXRlIEh5cGVycGFyYW1ldGVyIFR1bmluZyoqDQogIC0gU2hhcmUgaG93IHR3ZWFraW5nIGBkZWdyZWVgIGluIHBvbHlub21pYWwgYW5kIGBnYW1tYWAgaW4gUkJGIGFmZmVjdHMgcGVyZm9ybWFuY2UuDQogIC0gU2hvdyBhICoqZ3JpZCBzZWFyY2gqKiBleGFtcGxlIGlmIHBvc3NpYmxlLg0KDQotLS0NCg0KIyMjICoqMy4gQ3JpdGljYWwgVGhpbmtpbmcgJiBUYWtlYXdheXMqKg0KLSAqKldoeSBkaWQgUkJGIG91dHBlcmZvcm0gTGluZWFyIFNWTT8qKg0KICAtIFRoZSBkYXRhc2V0IGhhcyBzb21lICoqbm9uLWxpbmVhciByZWxhdGlvbnNoaXBzKiosIHdoaWNoIFJCRiBjYXB0dXJlcyBiZXR0ZXIuDQogIC0gQnV0ICoqTGluZWFyIFNWTSBpcyBuZWFybHkgYXMgZ29vZCoqLCBtZWFuaW5nIHRoZSBkYXRhc2V0IGlzICoqbW9zdGx5IGxpbmVhcmx5IHNlcGFyYWJsZSoqLg0KDQotICoqV2hlbiBXb3VsZCBFYWNoIEtlcm5lbCBCZSBVc2VmdWw/KioNCiAgLSAqKlVzZSBMaW5lYXIqKiB3aGVuIGRhdGEgaXMgd2VsbC1zZXBhcmF0ZWQgYW5kIHNwZWVkIGlzIGEgcHJpb3JpdHkuDQogIC0gKipVc2UgUG9seW5vbWlhbCoqIHdoZW4gaW50ZXJhY3Rpb25zIGV4aXN0LCBidXQgb25seSB1cCB0byBhIGxpbWl0ZWQgZGVncmVlLg0KICAtICoqVXNlIFJCRioqIHdoZW4gcmVsYXRpb25zaGlwcyBhcmUgY29tcGxleCBhbmQgcmVxdWlyZSBmbGV4aWJsZSBkZWNpc2lvbiBib3VuZGFyaWVzLg0KDQotICoqQ2hhbGxlbmdlcyAmIE5leHQgU3RlcHMqKg0KICAtIFdvdWxkIGFkZGluZyAqKm1vcmUgZmVhdHVyZXMqKiBtYWtlIFJCRiBldmVuIHN0cm9uZ2VyPw0KICAtIENvdWxkICoqZGltZW5zaW9uYWxpdHkgcmVkdWN0aW9uIChQQ0EpKiogaW1wcm92ZSBydW50aW1lIHdpdGhvdXQgbG9zaW5nIGFjY3VyYWN5Pw0KDQotLS0NCg0KIyMjICoqRW5nYWdlKioNCi0gKipQb3NlIE9wZW4tRW5kZWQgUXVlc3Rpb25zOioqDQogIC0gV2h5IGRvIHlvdSB0aGluayBQb2x5bm9taWFsIHdhcyBpbml0aWFsbHkgc28gYmFkIGJlZm9yZSB0dW5pbmc/DQogIC0gSWYgUkJGIGlzIHRoZSBiZXN0LCB3aHkgbm90IGFsd2F5cyB1c2UgaXQ/DQogIC0gV2hhdCB3b3VsZCBoYXBwZW4gaWYgd2UgYWRkZWQgbW9yZSBub2lzZSB0byB0aGUgZGF0YXNldD8NCg0KLSAqKkhhbmRzLU9uIEFjdGl2aXR5OioqDQogIC0gQXNzaWduIHNtYWxsIGdyb3VwcyB0byB0d2VhayBvbmUgaHlwZXJwYXJhbWV0ZXIgKGBDYCwgYGdhbW1hYCwgb3IgYGRlZ3JlZWApIGFuZCByZXBvcnQgYmFjay4NCiAgLSBDb21wYXJlIHJlc3VsdHMgbGl2ZS4NCg0KLS0tDQoNCiMjIyAqKmdyb3VwIGNvbmNlcHQqKg0KZXhwbGFpbiB0aGUgKipjb25jZXB0cyoqLCBzaG93ICoqa2V5IHJlc3VsdHMqKiwgYW5kIGFzayAqKmluc2lnaHRmdWwgcXVlc3Rpb25zKiouIA==