Skip to content
This repository has been archived by the owner on Jul 11, 2023. It is now read-only.

Commit

Permalink
Fixing typos in comments, variable names etc.
Browse files Browse the repository at this point in the history
Signed-off-by: Delyan Raychev <delyan.raychev@microsoft.com>
  • Loading branch information
draychev committed Jan 20, 2021
1 parent 8f85d4f commit 08f7152
Show file tree
Hide file tree
Showing 35 changed files with 51 additions and 50 deletions.
2 changes: 1 addition & 1 deletion ci/cmd/maestro/kubernetes_tools.go
Original file line number Diff line number Diff line change
Expand Up @@ -160,7 +160,7 @@ func SearchLogsForSuccess(kubeClient kubernetes.Interface, namespace string, pod
case time.Since(startedWaiting) >= totalWait:
result <- TestsTimedOut

// If we detect EOF before success - this must have bene a filure
// If we detect EOF before success - this must have been a failure
case err == io.EOF:
log.Error().Err(err).Msgf("EOF reading from pod %s/%s", namespace, podName)
result <- TestsFailed
Expand Down
2 changes: 1 addition & 1 deletion cmd/cli/install.go
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ Multiple control plane installations can exist within a cluster. Each
control plane is given a cluster-wide unqiue identifier called mesh name.
A mesh name can be passed in via the --mesh-name flag. By default, the
mesh-name name will be set to "osm." The mesh name must conform to same
guidlines as a valid Kubernetes label value. Must be 63 characters or
guidelines as a valid Kubernetes label value. Must be 63 characters or
less and must be empty or begin and end with an alphanumeric character
([a-z0-9A-Z]) with dashes (-), underscores (_), dots (.), and
alphanumerics between.
Expand Down
2 changes: 1 addition & 1 deletion cmd/cli/metrics.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ func newMetricsCmd(out io.Writer) *cobra.Command {
return cmd
}

// isMonitoredNamespace returns true if the Namepspace is correctly annotated for monitoring given a set of existing meshes
// isMonitoredNamespace returns true if the Namespace is correctly annotated for monitoring given a set of existing meshes
func isMonitoredNamespace(ns corev1.Namespace, meshList mapset.Set) (bool, error) {
// Check if the namespace has the resource monitor annotation
meshName, monitored := ns.Labels[constants.OSMKubeResourceMonitorAnnotation]
Expand Down
2 changes: 1 addition & 1 deletion cmd/osm-controller/osm-controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -417,7 +417,7 @@ func createControllerManagerForOSMResources(certManager certificate.Manager) err

// controller logic is implemented by reconciler
// Adding a reconciler for OSM's mutatingwehbookconfiguration
if err = (&reconciler.MutatingWebhookConfigrationReconciler{
if err = (&reconciler.MutatingWebhookConfigurationReconciler{
Client: mgr.GetClient(),
Scheme: mgr.GetScheme(),
OsmWebhook: fmt.Sprintf("osm-webhook-%s", meshName),
Expand Down
2 changes: 1 addition & 1 deletion cmd/osm-controller/validate_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ var _ = Describe("Test validateCertificateManagerOptions", func() {

})
})
Context("cert-manager osmCertificateManagerKind is passed in with valid caBundleSecretName and certmanagerIssureName", func() {
Context("cert-manager osmCertificateManagerKind is passed in with valid caBundleSecretName and certmanagerIssuerName", func() {
*osmCertificateManagerKind = certmanagerKind
caBundleSecretName = testCaBundleSecretName
*certmanagerIssuerName = "test-issuer"
Expand Down
2 changes: 1 addition & 1 deletion demo/cmd/common/const.go
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,6 @@ const (
// BookthiefExpectedResponseCodeEnvVar is the environment variable for Bookthief's expected HTTP response code
BookthiefExpectedResponseCodeEnvVar = "BOOKTHIEF_EXPECTED_RESPONSE_CODE"

// EnableEgressEnvVar is the envorinment variable to enable egress requests in the demo
// EnableEgressEnvVar is the environment variable to enable egress requests in the demo
EnableEgressEnvVar = "ENABLE_EGRESS"
)
4 changes: 2 additions & 2 deletions pkg/catalog/debugger.go
Original file line number Diff line number Diff line change
Expand Up @@ -63,11 +63,11 @@ func (mc *MeshCatalog) ListDisconnectedProxies() map[certificate.CommonName]time
func (mc *MeshCatalog) ListSMIPolicies() ([]*split.TrafficSplit, []service.WeightedService, []service.K8sServiceAccount, []*spec.HTTPRouteGroup, []*target.TrafficTarget) {
trafficSplits := mc.meshSpec.ListTrafficSplits()
splitServices := mc.meshSpec.ListTrafficSplitServices()
serviceAccouns := mc.meshSpec.ListServiceAccounts()
serviceAccounts := mc.meshSpec.ListServiceAccounts()
trafficSpecs := mc.meshSpec.ListHTTPTrafficSpecs()
trafficTargets := mc.meshSpec.ListTrafficTargets()

return trafficSplits, splitServices, serviceAccouns, trafficSpecs, trafficTargets
return trafficSplits, splitServices, serviceAccounts, trafficSpecs, trafficTargets
}

// ListMonitoredNamespaces returns all namespaces that the mesh is monitoring.
Expand Down
6 changes: 3 additions & 3 deletions pkg/catalog/dispatcher.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,19 +13,19 @@ const (
// maxBroadcastDeadlineTime is the max time we will delay a global proxy update
// if multiple events that would trigger it get coalesced over time.
maxBroadcastDeadlineTime = 15 * time.Second
// maxGraceDeadlineTime is the time we will wait for an additinal global proxy update
// maxGraceDeadlineTime is the time we will wait for an additional global proxy update
// trigger if we just received one.
maxGraceDeadlineTime = 3 * time.Second
)

// isDeltaUpdate assesses and returns if a pubsub mesasge contains an actual delta in config
// isDeltaUpdate assesses and returns if a pubsub message contains an actual delta in config
func isDeltaUpdate(psubMsg events.PubSubMessage) bool {
return !(strings.HasSuffix(psubMsg.AnnouncementType.String(), "updated") &&
reflect.DeepEqual(psubMsg.OldObj, psubMsg.NewObj))
}

func (mc *MeshCatalog) dispatcher() {
// This will be finely tunned in near future, we can instrument other modules
// This will be finely tuned in near future, we can instrument other modules
// to take ownership of certain events, and just notify dispatcher through
// ScheduleBroadcastUpdate announcement type
subChannel := events.GetPubSubInstance().Subscribe(
Expand Down
2 changes: 1 addition & 1 deletion pkg/catalog/ingress_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,7 @@ func newFakeMeshCatalog() *MeshCatalog {
// Create Bookstore apex Service
svc = tests.NewServiceFixture(tests.BookstoreApexService.Name, tests.BookstoreApexService.Namespace, nil)
if _, err := kubeClient.CoreV1().Services(tests.BookstoreApexService.Namespace).Create(context.TODO(), svc, metav1.CreateOptions{}); err != nil {
GinkgoT().Fatalf("Error creating new Bookstire Apex service", err.Error())
GinkgoT().Fatalf("Error creating new Bookstore Apex service", err.Error())
}

announcementsChan := make(chan announcements.Announcement)
Expand Down
6 changes: 3 additions & 3 deletions pkg/catalog/traffictarget.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ func (mc *MeshCatalog) ListAllowedOutboundServiceAccounts(downstream service.K8s
return mc.getAllowedDirectionalServiceAccounts(downstream, outbound)
}

// ListInboundTrafficTargetsWithRoutes returns a list traffic target objects componsed of its routes for the given destination service account
// ListInboundTrafficTargetsWithRoutes returns a list traffic target objects composed of its routes for the given destination service account
func (mc *MeshCatalog) ListInboundTrafficTargetsWithRoutes(upstream service.K8sServiceAccount) ([]trafficpolicy.TrafficTargetWithRoutes, error) {
var trafficTargets []trafficpolicy.TrafficTargetWithRoutes

Expand All @@ -49,13 +49,13 @@ func (mc *MeshCatalog) ListInboundTrafficTargetsWithRoutes(upstream service.K8sS

destinationIdentity := trafficTargetIdentityToServiceIdentity(t.Spec.Destination)

// Create a traffic target for this destination indentity
// Create a traffic target for this destination identity
trafficTarget := trafficpolicy.TrafficTargetWithRoutes{
Name: fmt.Sprintf("%s/%s", t.Namespace, t.Name),
Destination: destinationIdentity,
}

// Source identies for this traffic target
// Source identifies for this traffic target
var sourceIdentities []identity.ServiceIdentity
for _, source := range t.Spec.Sources {
srcIdentity := trafficTargetIdentityToServiceIdentity(source)
Expand Down
4 changes: 2 additions & 2 deletions pkg/catalog/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,7 @@ type MeshCataloger interface {
ListEndpointsForService(service.MeshService) ([]endpoint.Endpoint, error)

// GetResolvableServiceEndpoints returns the resolvable set of endpoint over which a service is accessible using its FQDN.
// These are the endpoint destinations we'd expect client applications sends the traffic towards to, when attemtpting to
// These are the endpoint destinations we'd expect client applications sends the traffic towards to, when attempting to
// reach a specific service.
// If no LB/virtual IPs are assigned to the service, GetResolvableServiceEndpoints will return ListEndpointsForService
GetResolvableServiceEndpoints(service.MeshService) ([]endpoint.Endpoint, error)
Expand Down Expand Up @@ -126,7 +126,7 @@ type MeshCataloger interface {
// actually exposed by the application binary, ie. 'spec.ports[].port' instead of 'spec.ports[].targetPort' for a Kubernetes service.
GetPortToProtocolMappingForService(service.MeshService) (map[uint32]string, error)

// ListInboundTrafficTargetsWithRoutes returns a list traffic target objects componsed of its routes for the given destination service account
// ListInboundTrafficTargetsWithRoutes returns a list traffic target objects composed of its routes for the given destination service account
ListInboundTrafficTargetsWithRoutes(service.K8sServiceAccount) ([]trafficpolicy.TrafficTargetWithRoutes, error)
}
type expectedProxy struct {
Expand Down
2 changes: 1 addition & 1 deletion pkg/catalog/xds_certificates.go
Original file line number Diff line number Diff line change
Expand Up @@ -143,7 +143,7 @@ func GetPodFromCertificate(cn certificate.CommonName, kubecontroller k8s.Control

// Ensure the Name encoded in the certificate matches that of the Pod
if pod.Spec.ServiceAccountName != cnMeta.ServiceAccount {
// Since we search for the pod in the namespace we obtain from the certificate -- these namespaces will always matech.
// Since we search for the pod in the namespace we obtain from the certificate -- these namespaces will always match.
log.Warn().Msgf("Pod %s/%s belongs to Name %q while the pod's cert was issued for Name %q", pod.Namespace, pod.Name, pod.Spec.ServiceAccountName, cnMeta.ServiceAccount)
return nil, errServiceAccountDoesNotMatchCertificate
}
Expand Down
2 changes: 1 addition & 1 deletion pkg/certificate/providers/certmanager/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ const (
// How many bits to use for the RSA key
rsaBits = 4096

// checkCertificateExpirationInterval is the interval to check wether a
// checkCertificateExpirationInterval is the interval to check weather a
// certificate is close to expiration and needs renewal.
checkCertificateExpirationInterval = 5 * time.Second
)
Expand Down
2 changes: 1 addition & 1 deletion pkg/configurator/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -124,7 +124,7 @@ func (c *Client) configMapListener() {

case announcements.ConfigMapDeleted:
// Ignore deletion. We expect config to be present
log.Info().Msgf("[%s] triggeing a global proxy broadcast",
log.Info().Msgf("[%s] triggering a global proxy broadcast",
psubMsg.AnnouncementType)
events.GetPubSubInstance().Publish(events.PubSubMessage{
AnnouncementType: announcements.ScheduleProxyBroadcast,
Expand Down
2 changes: 1 addition & 1 deletion pkg/configurator/validating_webhook_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -269,7 +269,7 @@ func TestValidateFields(t *testing.T) {
expRes *v1beta1.AdmissionResponse
}{
{
testName: "Accpet valid configMap update",
testName: "Accept valid configMap update",
configMap: corev1.ConfigMap{
Data: map[string]string{
"egress": "true",
Expand Down
4 changes: 2 additions & 2 deletions pkg/constants/constants.go
Original file line number Diff line number Diff line change
Expand Up @@ -125,7 +125,7 @@ const (
// DomainDelimiter is a delimiter used in representing domains
DomainDelimiter = "."

// EnvoyContainerName is the name used to identify the envoy sidecard container added on mesh-enabled deployments
// EnvoyContainerName is the name used to identify the envoy sidecar container added on mesh-enabled deployments
EnvoyContainerName = "envoy"

// InitContainerName is the name of the init container
Expand Down Expand Up @@ -153,7 +153,7 @@ const (
// PrometheusScrapeAnnotation is the annotation used to configure prometheus scraping
PrometheusScrapeAnnotation = "prometheus.io/scrape"

// PrometheusPortAnnotation is the anontation used to configure the port to scrape on
// PrometheusPortAnnotation is the annotation used to configure the port to scrape on
PrometheusPortAnnotation = "prometheus.io/port"

// PrometheusPathAnnotation is the annotation used to configure the path to scrape on
Expand Down
2 changes: 1 addition & 1 deletion pkg/debugger/debugger_config_listener.go
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ func (d *DebugConfig) StartDebugServerConfigListener() {
}
if !isDbgSrvEnabled && started {
if err := httpDebugServer.Stop(); err != nil {
log.Error().Err(err).Msgf("error stoping debug server")
log.Error().Err(err).Msgf("error stopping debug server")
} else {
started = false
}
Expand Down
2 changes: 1 addition & 1 deletion pkg/endpoint/providers/suite_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,5 +9,5 @@ import (

func TestEndpointProviders(t *testing.T) {
RegisterFailHandler(Fail)
RunSpecs(t, "EndpointProviers Test Suite")
RunSpecs(t, "EndpointProviders Test Suite")
}
2 changes: 1 addition & 1 deletion pkg/envoy/ads/response.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ const (
ADSUpdateStr = "ADS"
)

// Wrapper to create and send a discovert response to an envoy server
// Wrapper to create and send a discover response to an envoy server
func (s *Server) sendTypeResponse(tURI envoy.TypeURI,
proxy *envoy.Proxy, server *xds_discovery.AggregatedDiscoveryService_StreamAggregatedResourcesServer,
req *xds_discovery.DiscoveryRequest, cfg configurator.Configurator) error {
Expand Down
2 changes: 1 addition & 1 deletion pkg/envoy/cds/response_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -185,7 +185,7 @@ var _ = Describe("CDS Response", func() {
},
}

// Checking for the value by generating the same value the same way is reduntant
// Checking for the value by generating the same value the same way is redundant
// Nonetheless, as getUpstreamServiceCluster logic gets more complicated, this might just be ok to have
upstreamTLSProto, err := ptypes.MarshalAny(envoy.GetUpstreamTLSContext(proxyService, upstreamSvc))
Expect(err).ToNot(HaveOccurred())
Expand Down
2 changes: 1 addition & 1 deletion pkg/envoy/cla/cluster_load_assignment_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import (
)

var _ = Describe("Testing Cluster Load Assignment", func() {
Context("Testing NewClusterLoadAssignemnt", func() {
Context("Testing NewClusterLoadAssignment", func() {
It("Returns cluster load assignment", func() {

namespacedServices := []service.MeshService{
Expand Down
6 changes: 3 additions & 3 deletions pkg/envoy/lds/listener.go
Original file line number Diff line number Diff line change
Expand Up @@ -38,15 +38,15 @@ func (lb *listenerBuilder) newOutboundListener() (*xds_listener.Listener, error)
}

// Create filter chain for egress if egress is enabled
// This filterchain matches any traffic not filtered by allow rules, it will be treated as egress
// This filter chain matches any traffic not filtered by allow rules, it will be treated as egress
// traffic when enabled
if lb.cfg.IsEgressEnabled() {
egressFilterChgain, err := buildEgressFilterChain()
egressFilterChain, err := buildEgressFilterChain()
if err != nil {
log.Error().Err(err).Msgf("Error getting filter chain for Egress")
return nil, err
}
listener.DefaultFilterChain = egressFilterChgain
listener.DefaultFilterChain = egressFilterChain
}

if len(listener.FilterChains) == 0 && listener.DefaultFilterChain == nil {
Expand Down
2 changes: 1 addition & 1 deletion pkg/envoy/lds/listener_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ import (
)

// Tests TestGetFilterForService checks that a proper filter type is properly returned
// for given config parametres and service
// for given config parameters and service
func TestGetFilterForService(t *testing.T) {
assert := tassert.New(t)
mockCtrl := gomock.NewController(t)
Expand Down
2 changes: 1 addition & 1 deletion pkg/envoy/lds/response.go
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ func NewResponse(meshCatalog catalog.MeshCataloger, proxy *envoy.Proxy, _ *xds_d
}

if len(inboundListener.FilterChains) > 0 {
// Inbound filter chains can be empty if the there both ingress and in-mesh policies are not configued.
// Inbound filter chains can be empty if the there both ingress and in-mesh policies are not configured.
// Configuring a listener without a filter chain is an error.
if marshalledInbound, err := ptypes.MarshalAny(inboundListener); err != nil {
log.Error().Err(err).Msgf("Error marshalling inbound listener config for proxy %s", proxyServiceName)
Expand Down
2 changes: 1 addition & 1 deletion pkg/envoy/rds/response_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -214,7 +214,7 @@ var _ = Describe("RDS Response", func() {
// Create Bookstore apex Service
svc = tests.NewServiceFixture(tests.BookstoreApexService.Name, tests.BookstoreApexService.Namespace, nil)
if _, err := kubeClient.CoreV1().Services(tests.BookstoreApexService.Namespace).Create(context.TODO(), svc, metav1.CreateOptions{}); err != nil {
GinkgoT().Fatalf("Error creating new Bookstire Apex service: %s", err.Error())
GinkgoT().Fatalf("Error creating new Bookstore Apex service: %s", err.Error())
}

mockIngressMonitor.EXPECT().GetIngressResources(gomock.Any()).Return(nil, nil).AnyTimes()
Expand Down
2 changes: 1 addition & 1 deletion pkg/envoy/route/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ const (
httpHostHeader = "host"
)

//UpdateRouteConfiguration consrtucts the Envoy construct necessary for TrafficTarget implementation
//UpdateRouteConfiguration constructs the Envoy construct necessary for TrafficTarget implementation
func UpdateRouteConfiguration(domainRoutesMap map[string]map[string]trafficpolicy.RouteWeightedClusters, routeConfig *xds_route.RouteConfiguration, direction Direction) {
log.Trace().Msgf("[RDS] Updating Route Configuration")
var virtualHostPrefix string
Expand Down
2 changes: 1 addition & 1 deletion pkg/envoy/xdsutil.go
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,7 @@ func UnmarshalSDSCert(str string) (*SDSCert, error) {
return nil, errInvalidCertFormat
}

// Check valid namespace'd service name
// Check valid namespaced service name
svc, err := service.UnmarshalMeshService(slices[1])
if err != nil {
return nil, err
Expand Down
2 changes: 1 addition & 1 deletion pkg/httpserver/httpserver.go
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ func (s *HTTPServer) AddHandler(url string, handler http.Handler) {
s.httpServeMux.Handle(url, handler)
}

// AddHandlers covenience, multi-value AddHandler
// AddHandlers convenience, multi-value AddHandler
func (s *HTTPServer) AddHandlers(handlers map[string]http.Handler) {
for url, handler := range handlers {
s.AddHandler(url, handler)
Expand Down
2 changes: 1 addition & 1 deletion pkg/kubernetes/events/events.go
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ func eventWatcher(kubeClient kubernetes.Interface, namespace string) (watch.Inte
return watcher, nil
}

// Initialize intitializes an uninitialized EventRecorder object
// Initialize initializes an uninitialized EventRecorder object
func (e *EventRecorder) Initialize(object runtime.Object, kubeClient kubernetes.Interface, namespace string) error {
var err error
e.object = object
Expand Down
8 changes: 4 additions & 4 deletions pkg/reconciler/mutatingwebhook/reconcile.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,8 @@ import (

var log = logger.New("reconciler")

// MutatingWebhookConfigrationReconciler reconciles a MutatingWebhookConfiguration object
type MutatingWebhookConfigrationReconciler struct {
// MutatingWebhookConfigurationReconciler reconciles a MutatingWebhookConfiguration object
type MutatingWebhookConfigurationReconciler struct {
client.Client
Scheme *runtime.Scheme
OsmWebhook string
Expand All @@ -28,7 +28,7 @@ type MutatingWebhookConfigrationReconciler struct {
}

// Reconcile is the reconciliation method for OSM MutatingWebhookConfiguration.
func (r *MutatingWebhookConfigrationReconciler) Reconcile(req ctrl.Request) (ctrl.Result, error) {
func (r *MutatingWebhookConfigurationReconciler) Reconcile(req ctrl.Request) (ctrl.Result, error) {
// reconcile only for OSM mutatingWebhookConfiguration
if req.Name == r.OsmWebhook {
ctx := context.Background()
Expand Down Expand Up @@ -75,7 +75,7 @@ func (r *MutatingWebhookConfigrationReconciler) Reconcile(req ctrl.Request) (ctr
}

// SetupWithManager links the reconciler to the manager.
func (r *MutatingWebhookConfigrationReconciler) SetupWithManager(mgr ctrl.Manager) error {
func (r *MutatingWebhookConfigurationReconciler) SetupWithManager(mgr ctrl.Manager) error {
return ctrl.NewControllerManagedBy(mgr).
For(&v1beta1.MutatingWebhookConfiguration{}).
Complete(r)
Expand Down
2 changes: 1 addition & 1 deletion pkg/smi/client_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -465,7 +465,7 @@ var _ = Describe("When fetching BackpressurePolicy for the given MeshService", f
Expect(backpressure).To(BeNil())
})

It("should return the Backpresure policy for the given service", func() {
It("should return the Backpressure policy for the given service", func() {
bpChannel := events.GetPubSubInstance().Subscribe(announcements.BackpressureAdded,
announcements.BackpressureDeleted,
announcements.BackpressureUpdated)
Expand Down
2 changes: 1 addition & 1 deletion pkg/webhook/webhook.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ func GetAdmissionRequestBody(w http.ResponseWriter, req *http.Request) ([]byte,
return admissionRequestBody, nil
}

// AdmissionError wraps error as AdmisionResponse
// AdmissionError wraps error as AdmissionResponse
func AdmissionError(err error) *v1beta1.AdmissionResponse {
return &v1beta1.AdmissionResponse{
Result: &metav1.Status{
Expand Down
Loading

0 comments on commit 08f7152

Please sign in to comment.